昨天提到了 Antigravity CLI 在完成 Google OAuth 登入後,相關憑證會被存放在家目錄的 ~/.gemini/ 底下。今天我們就順著這條路,繼續往下看一下 ~/.gemini 目錄裡面還有哪些內容。
進到 ~/.gemini 後列出結構,最上層的內容其實相當單純:
~/.gemini/
├── jetski-standalone-oauth-token # Google OAuth 的登入憑證
├── config/ # 全域設定與擴充功能(Plugins、Skills)
└── antigravity-cli/ # CLI 運行的主要目錄
jetski-standalone-oauth-token:cat 出來就會看到標準 Oauth Token 的內容,例如:access_token、refresh_token 跟 expiry 等等。每次啟動 agy 就會直接讀取憑證連線,不需要每次都再重新跑授權流程。(jetski 是 Google 內部使用的 AI Coding 開發工具,聽說的)config/:antigravity-cli/:config 裡面有什麼?進到 ~/.gemini/config/,這裡主要是放一些跨專案共用的全域設定,長這樣:
~/.gemini/config/
├── AGENTS.md # 全域 Context File
├── config.json # CLI 功能偏好與 Plugin 開關狀態
├── mcp_config.json # 全域 MCP 工具伺服器設定
└── plugins/ # 本機安裝的全域擴充外掛目錄
其中 plugins/ 是用來管理外掛的地方。在 Antigravity CLI 裡,Plugin 可以把多種能力(規則、技能、外部工具)打包成組合包。要定義一個最基本的 Plugin,最少需要兩樣東西:
plugins/<plugin-name>/)。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"
}

可以看到,即使其他元件全部略過(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 # 技能手冊:平時僅載入索引,實際觸發時才動態加載執行手冊
寫好目錄結構後,可以用官方的校驗指令確認是否符合規範:

接著透過 agy plugin enable watch 啟用外掛。執行後,系統就會自動更新 ~/.gemini/config/config.json。這時候實際 cat 出來會發現裡面多出了 plugins 的開關設定:
{
...
"plugins": {
"watch": {
"enabled": true
}
},
...
}
這時候只要在終端機問它時間,它就會回報時間。因為 agy 本身其實就可以知道現在時間,所以我請它在有用 skill 時要特別說明它是透過這個 skill 來查詢時間的。以下是 enable 與 disable 這個 Plugin 的結果:

antigravity-cli/ 裡面有什麼?進到 ~/.gemini/antigravity-cli/,會發現裡面的檔案與子目錄明顯豐富許多,這裡存放所有跟對話內容相關的資訊:
~/.gemini/antigravity-cli/
├── settings.json # CLI 的全域設定檔
├── history.jsonl # 所有輸入的 Prompt 歷史指令
├── conversation_summaries.db # 所有會話的摘要索引資料庫(SQLite)
├── log/ # 系統執行時的詳細除錯日誌
├── bin/ # 輔助執行檔與內部依賴
├── cache/ # 本機暫存目錄
├── brain/ # 各會話的上下文快照、文字日誌與工件
└── conversations/ # 各會話的完整 SQLite 資料庫
挑出幾個與日常使用相關的:
settings.json:
CLI 的設定檔,裡面記錄了包含預設使用的模型、權限規則等偏好設定以及 API Key、Trust Workspace 等等。
history.jsonl:
記錄所有輸入的 prompt 歷史紀錄,每一行都是使用者曾經送給 Agent 的 Prompt。包含在什麼 session(conversationId)、下了什麼 prompt(display)以及時間點(timestamp),所以這裡是不分 session 的。
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;"

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>/。conversations/<UUID>.db。為什麼同時有文字日誌(Log)與 SQLite 資料庫?
兩種的使用情境與目的不太一樣:
brain/裡的transcript.jsonl(給外部追蹤的文字日誌):
jsonl(JSON Lines)是一種非常適合 append-only 的純文字格式。Agent 每執行完一個步驟(Step),只要往檔案尾端追加一行 JSON 即可完成紀錄。這種格式的優勢在於:
- 可讀性高:可以直接用
cat、tail -f或是文字編輯器打開,一眼看清楚剛才的對話與思考過程。- 處理容易:不需要依賴特定資料庫驅動,任何程式語言都能以逐行讀取的方式處理即時日誌。
conversations/裡的<UUID>.db(給系統使用的結構化資料庫):
這是一個正規的 SQLite 資料庫。裡面切分了多張資料表,專門用來維護整個會話的狀態機跳轉、交易關聯、以及較龐大的資料欄位。如果需要精確查詢特定 Step、關聯狀態,或是做複雜的欄位檢索,透過 SQLite 的 SQL 語法會比解析一整份長文本有效率得多。
大概就醬,明天繼續 ~