iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0

昨天提到了 Antigravity CLI 在完成 Google OAuth 登入後,相關憑證會被存放在家目錄的 ~/.gemini/ 底下。今天我們就順著這條路,繼續往下看一下 ~/.gemini 目錄裡面還有哪些內容。


一、最上層有啥?

進到 ~/.gemini 後列出結構,最上層的內容其實相當單純:

~/.gemini/
├── jetski-standalone-oauth-token # Google OAuth 的登入憑證
├── config/                       # 全域設定與擴充功能(Plugins、Skills)
└── antigravity-cli/              # CLI 運行的主要目錄
  1. jetski-standalone-oauth-token:
    這是昨天提到的 OAuth Token 檔案,實際 cat 出來就會看到標準 Oauth Token 的內容,例如:access_token、refresh_token 跟 expiry 等等。每次啟動 agy 就會直接讀取憑證連線,不需要每次都再重新跑授權流程。(jetski 是 Google 內部使用的 AI Coding 開發工具,聽說的)
  2. config/:
    存放跨專案共用的全域設定,例如安裝在本機的自訂 Skills、Plugins 等。
  3. antigravity-cli/:
    這裡是整個終端 Agent 最主要的核心資料,每次對話的歷史、日誌與快照都會落在這裡。

二、快速看一下 config 裡面有什麼?

進到 ~/.gemini/config/,這裡主要是放一些跨專案共用的全域設定,長這樣:

~/.gemini/config/
├── AGENTS.md         # 全域 Context File
├── config.json       # CLI 功能偏好與 Plugin 開關狀態
├── mcp_config.json   # 全域 MCP 工具伺服器設定
└── plugins/          # 本機安裝的全域擴充外掛目錄

其中 plugins/ 是用來管理外掛的地方。在 Antigravity CLI 裡,Plugin 可以把多種能力(規則、技能、外部工具)打包成組合包。要定義一個最基本的 Plugin,最少需要兩樣東西:

  1. 獨立的資料夾(放在 plugins/<plugin-name>/)。
  2. 資料夾內的一份宣告清單 plugin.json

我們可以寫一份只有 plugin.json 的 Plugin,然後透過 agy plugin validate 指令來看這個 Plugin 是不是一個合法的 Plugin:

// ~/.gemini/config/plugins/minimal-plugin/plugin.json
{
  "name": "minimal-plugin",
  "version": "1.0.0",
  "description": "A minimal plugin containing only plugin.json"
}

https://ithelp.ithome.com.tw/upload/images/20261001/20183607VbyPkAEOQl.png

可以看到,即使其他元件全部略過(skipped)只有一個 plugin.json,系統依然判定為合法的 Plugin。Plugin 可以自己寫,或是請 Antigravity CLI 幫你寫一個 Plugin ,例如:我請 Antigravity CLI 幫我寫了一個 watch 的 Plugin,看完就會知道現在幾點:

{
  "name": "watch",
  "version": "1.0.0",
  "description": "A timekeeper plugin that reports the current date, time, and timezone"
}

除了宣告 plugin.json 之外,目錄底下也可以附加各種擴充內容。例如最常見的 skills/(SOP 手冊)與 rules/(憲法):

plugins/watch/
├── plugin.json
├── rules/
│   └── AGENTS.md          # 常駐規則:agy 啟動時自動注入 Prompt,強制約束行為
└── skills/
    └── current-time/
        └── SKILL.md       # 技能手冊:平時僅載入索引,實際觸發時才動態加載執行手冊

寫好目錄結構後,可以用官方的校驗指令確認是否符合規範:

https://ithelp.ithome.com.tw/upload/images/20261001/20183607t6CLVzfG9K.png

接著透過 agy plugin enable watch 啟用外掛。執行後,系統就會自動更新 ~/.gemini/config/config.json。這時候實際 cat 出來會發現裡面多出了 plugins 的開關設定:

{
  ...
  "plugins": {
    "watch": {
      "enabled": true
    }
  },
  ...
}

這時候只要在終端機問它時間,它就會回報時間。因為 agy 本身其實就可以知道現在時間,所以我請它在有用 skill 時要特別說明它是透過這個 skill 來查詢時間的。以下是 enable 與 disable 這個 Plugin 的結果:

https://ithelp.ithome.com.tw/upload/images/20261001/20183607WT9Dc6HMj6.png


三、快速看一下主目錄:antigravity-cli/ 裡面有什麼?

進到 ~/.gemini/antigravity-cli/,會發現裡面的檔案與子目錄明顯豐富許多,這裡存放所有跟對話內容相關的資訊:

~/.gemini/antigravity-cli/
├── settings.json                 # CLI 的全域設定檔
├── history.jsonl                 # 所有輸入的 Prompt 歷史指令
├── conversation_summaries.db     # 所有會話的摘要索引資料庫(SQLite)
├── log/                          # 系統執行時的詳細除錯日誌
├── bin/                          # 輔助執行檔與內部依賴
├── cache/                        # 本機暫存目錄
├── brain/                        # 各會話的上下文快照、文字日誌與工件
└── conversations/                # 各會話的完整 SQLite 資料庫

挑出幾個與日常使用相關的:

  1. settings.json:
    CLI 的設定檔,裡面記錄了包含預設使用的模型、權限規則等偏好設定以及 API Key、Trust Workspace 等等。

  2. history.jsonl:
    記錄所有輸入的 prompt 歷史紀錄,每一行都是使用者曾經送給 Agent 的 Prompt。包含在什麼 session(conversationId)、下了什麼 prompt(display)以及時間點(timestamp),所以這裡是不分 session 的。

  3. conversation_summaries.db:
    一個獨立的 SQLite 資料庫。它記錄了所有開啟過的會話 UUID、建立時間、最後更新時間與簡短摘要等等。也是我們下 /resume 要選擇 session 時會看到的所有 session 的資訊,可以透過下 SQL Query 來看裡面的內容:

    sqlite3 -box ~/.gemini/antigravity-cli/conversation_summaries.db \
      "SELECT conversation_id, title, step_count, last_modified_time \
       FROM conversation_summaries \
       ORDER BY last_modified_time DESC LIMIT 3;"
    

https://ithelp.ithome.com.tw/upload/images/20261001/20183607WJzJWiKhQE.png

  1. log/ 與 cli.log:
    存放 agy 運行時的除錯紀錄,排查工具連線問題時最常翻閱的地方。

四、對話與記憶:brain/ 與 conversations/

brain/ 與 conversations/ 是較關鍵的兩個目錄。它們包含每一次我們與 Agent 互動時留下的全部足跡。稍微觀察一下裡面的檔案結構:

~/.gemini/antigravity-cli/
├── brain/
│   └── <Session-UUID>/
│       └── .system_generated/
│           └── logs/
│               ├── transcript.jsonl         # 輕量級的會話步驟摘要
│               └── transcript_full.jsonl    # 包含完整 Prompt 與工具輸入輸出的全文日誌
└── conversations/
    └── <Session-UUID>.db                    # 該會話專屬的完整 SQLite 資料庫

當我們每開一場新的 Session,系統就會產生一組 Session 專屬的 UUID,並同時在兩個目錄底下各建立一份對應的儲存結構:

  • 以純文字檔案為主的 brain/<UUID>/。
  • 以關聯式資料庫 SQLite 為主的 conversations/<UUID>.db。

為什麼同時有文字日誌(Log)與 SQLite 資料庫?
兩種的使用情境與目的不太一樣:

  1. brain/ 裡的 transcript.jsonl(給外部追蹤的文字日誌):
    jsonl(JSON Lines)是一種非常適合 append-only 的純文字格式。Agent 每執行完一個步驟(Step),只要往檔案尾端追加一行 JSON 即可完成紀錄。這種格式的優勢在於:

    • 可讀性高:可以直接用 cat、tail -f 或是文字編輯器打開,一眼看清楚剛才的對話與思考過程。
    • 處理容易:不需要依賴特定資料庫驅動,任何程式語言都能以逐行讀取的方式處理即時日誌。
  2. conversations/ 裡的 <UUID>.db(給系統使用的結構化資料庫):
    這是一個正規的 SQLite 資料庫。裡面切分了多張資料表,專門用來維護整個會話的狀態機跳轉、交易關聯、以及較龐大的資料欄位。如果需要精確查詢特定 Step、關聯狀態,或是做複雜的欄位檢索,透過 SQLite 的 SQL 語法會比解析一整份長文本有效率得多。


大概就醬,明天繼續 ~


上一篇
Google 的心靈判官:Antigravity CLI
系列文
在贏家書寫歷史之前:我所看見的 AI,與一位工程師共舞著 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言