5.5 KiB
Fox CLI — 與 Fox 後端互動的命令列工具
專案狀態:M0–M2 已實作(M1:HTTP client、設定讀取、
tokens verify/auth status;M2:tokens create/list/revoke、公開的novels get)|日期:2026-09-04
fox 是一個命令列工具,讓人與 AI agent 不經過前端,直接與 Fox 後端 API 互動:查詢/建立/編輯作品、管理 access token 等。目標是「一句命令拿到機器可解析的結果」,方便腳本、CI 與 agent 排程使用。
一、設計原則
- 非互動優先:所有命令不跳 prompt,參數與環境變數給齊即可執行。缺少必要參數直接報錯(非零 exit code),適合 AI agent 與 cron。
- 機器可讀輸出:資料命令預設輸出 JSON(stdout 僅印 JSON,其餘訊息一律走 stderr);人用格式之後再以
--pretty提供。 - 穩定的 exit code:
0成功;1執行失敗(後端 4xx/5xx、網路錯誤);用法錯誤(缺參數、未知子命令)同樣回非零,訊息在 stderr。 - 冪等意識:文件會標明各命令是否幂等(如
tokens revoke冪等、novels create會因 slug 重複而失敗),供 agent 重試決策。 - Secret 不落檔:token 只從環境變數或本機設定檔讀取(見下),絕不寫進 commit/issue/PR。
二、授權(access token)
後端的 access token(fpat_ 前綴)是 CLI 的主要憑證:
- 建立:先在 Fox 網頁端以帳號建立,或由管理員以
POST /access-tokens建立;原始值只在建立時顯示一次。 - 讀取優先順序:
- 環境變數
FOX_API_TOKEN(推薦,適合 agent/CI) --token <value>參數(注意:會留在 shell 歷史,僅供本機快速測試)- 本機設定檔
~/.config/fox/cli.json({"apiUrl": "...", "token": "..."},權限應設 600)
- 環境變數
- 使用方式:每個請求帶
Authorization: Bearer <token>;先用fox tokens verify確認有效(過期/撤銷會回 401)。
後端 API 位址由 FOX_API_URL(或設定檔 apiUrl)指定,本機開發預設 http://localhost:3000。
三、命令規劃(對應後端端點)
| 命令 | 後端端點 | 說明 |
|---|---|---|
fox auth status |
GET /auth/status |
查詢登入/SSO 設定(公開) |
fox tokens verify |
GET /access-tokens/verify |
驗證手中 token 是否有效 |
fox tokens create --name <名稱> [--expires-at <ISO8601>] |
POST /access-tokens |
建立新 token(回傳只出現一次的原始值) |
fox tokens list |
GET /access-tokens |
列出 token(不含 hash/原始值) |
fox tokens revoke <id> |
DELETE /access-tokens/:id |
撤銷 token(冪等) |
fox novels get <slug> |
GET /novels/:slug |
查單一作品(公開) |
fox novels list |
GET /novels |
列出自己的作品(需授權,見下) |
fox novels create --title <書名> [--slug <slug>] [--synopsis <簡介>] |
POST /novels |
建立作品(需授權,見下) |
fox novels update <slug> [--title ...] [--slug ...] [--synopsis ...] |
PATCH /novels/:slug |
更新作品(需授權,見下) |
授權(issue #16 已補齊):受保護端點(
novels list/create/update、auth me)的AuthGuard現在同時接受Authorization: Bearer <access token>與瀏覽器 session(cookie);Bearer 優先。access token 需綁定帳號(POST /access-tokens帶accountId,或由管理員建立時指定),未綁帳號的系統 token 只能用於tokens verify。CLI 待 M3 補齊novels list/create/update命令。
四、AI agent 使用指引
- 每個命令都有
--help;未知命令回非零 exit code。 - 輸出為單一 JSON 物件,可直接
jq解析;錯誤時 stderr 有人類可讀訊息,stdout 不印半成品。 - agent 拿到 token 的建議流程:由人透過加密渠道交付(組織公開金鑰加密,見
alterminal/agents的 AGENTS.md 2.3),存入環境變數或設定檔,不寫入任何儲存庫內容。
五、技術棧與開發計畫
- 實作語言:Node.js(≥22)+ TypeScript,與
frontend/backend同語言。 - 加入 workspace:實作開始時把
cli加進根pnpm-workspace.yaml並建立package.json(目前僅目錄與說明,先不動 workspace 設定)。
里程碑:
- M0:子項目目錄+README(完成)。
- M1:HTTP client、設定讀取、
tokens verify/auth status(完成,見src/http.ts、src/config.ts)。 - M2:
tokens create/list/revoke、公開的novels get(完成)。 - M3:
novels list/create/update(視後端授權進度)、--pretty、錯誤處理打磨。
開發
使用者安裝與設定說明見 docs/cli-install.md。
pnpm install # 倉庫根目錄
pnpm --filter fox-cli build
pnpm --filter fox-cli start <子命令> # 例如 auth status;不要加 "--"(pnpm 9 會把它當參數)
結構:src/cli.ts(進入點與分發)、src/command.ts(參數解析與註冊表)、
src/config.ts(設定讀取)、src/http.ts(fetch 封裝)、src/commands.ts(各命令實作)、
src/errors.ts(錯誤與 exit code)。
exit code:0 成功;1 執行失敗(後端 4xx/5xx、網路錯誤);2 用法錯誤。
tokens revoke 成功時輸出 {"ok": true, "id": <id>}(後端回 204 無內容)。
維護說明
- 後端端點異動時,同步更新第三節對應表。
- 命令列介面(參數、輸出欄位)保持向下相容;破壞性變更須在 README 註明版本。