星期日, 5月 31, 2026

Codex 與 Claude Code statusline 設定小記

Codex 與 Claude Code statusline 設定小記



環境:

  • macOS 26.5
  • Codex CLI 0.135.0
  • Claude Code 2.1.149

最近在整理 AI coding tool 的使用環境,發現底部那條 statusline 其實很值得設定一下。平常一直切 repo、切模型、跑長任務,如果沒有一眼看到 context 或 quota 狀態,很容易做到一半才發現快滿了,或是突然被中斷 Orz ....

這篇記一下目前我自己的 Codex 與 Claude Code statusline 設定。兩者概念有點不一樣, Codex 目前是用內建欄位組合;Claude Code 則是把 JSON 丟給 shell script,再把 script 印出的內容顯示出來。


Claude Code 官方文件 

  • https://code.claude.com/docs/en/statusline

Codex 官方文件
  • https://developers.openai.com/codex/cli/slash-commands



Codex 的 status_line

Codex 的設定檔在這裡:

~/.codex/config.toml

我目前放在 [tui] 裡,讓底部狀態列顯示模型、context、額度和目前目錄:

[tui]
status_line = [
  "model-with-reasoning",
  "context-remaining",
  "five-hour-limit",
  "weekly-limit",
  "current-dir",
]


這組欄位對我來說剛好。

  • model-with-reasoning 可以確認現在是不是用預期的模型和 reasoning effort
  • context-remaining 看長任務還剩多少空間
  • five-hour-limitweekly-limit 看額度壓力
  • current-dir 則是避免自己在錯的專案裡下指令


我的 Codex 前面也有模型設定,整體看起來像這樣:

model = "gpt-5.5"
model_reasoning_effort = "medium"
personality = "pragmatic"

[tui]
status_line = [
  "model-with-reasoning",
  "context-remaining",
  "five-hour-limit",
  "weekly-limit",
  "current-dir",
]

改完後可以用下面指令確認版本,順便重開 Codex 看底部是否出現新欄位:

codex --version


Claude Code 的 statusLine

Claude Code 這邊比較自由。設定檔在:

~/.claude/settings.json
~/.claude/statusline-command.sh


也可以直接在 Claude Code 裡用 /statusline 讓它幫忙產生,或是直接呼叫 ai 幫你設定 :)

{
  "theme": "auto",
  "verbose": true,
  "statusLine": {
    "type": "command",
    "command": "bash /Users/max/.claude/statusline-command.sh"
  }
}

重點是 statusLine.command。Claude Code 會執行這個 command,並把目前 session 的 JSON 從 stdin 傳進去。script 只要讀 stdin,最後印出一行文字就好。

我的 script 目前顯示 

  • model
  • context 使用率
  • 上一輪 token 數
  • 有資料時顯示 5-hour limit:


內容如下

#!/bin/sh
input=$(cat)

model=$(echo "$input" | jq -r '.model.display_name // "Unknown"')

used_pct=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
if [ -n "$used_pct" ]; then
  ctx=$(printf "%.0f%%" "$used_pct")
else
  ctx="ctx:--"
fi

in_tok=$(echo "$input" | jq -r '.context_window.current_usage.input_tokens // empty')
out_tok=$(echo "$input" | jq -r '.context_window.current_usage.output_tokens // empty')
if [ -n "$in_tok" ] && [ -n "$out_tok" ]; then
  total=$(( in_tok + out_tok ))
  if [ "$total" -ge 1000 ]; then
    tok_display=$(awk "BEGIN { printf \"%.1fk\", $total/1000 }")
  else
    tok_display="${total}"
  fi
  cost_part="tokens:${tok_display}"
else
  cost_part="tokens:--"
fi

後面再把 5-hour limit 接上去:

five_h_pct=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
five_h_reset=$(echo "$input" | jq -r '.rate_limits.five_hour.resets_at // empty')
if [ -n "$five_h_pct" ]; then
  five_h_pct_display=$(printf "%.0f%%" "$five_h_pct")
  if [ -n "$five_h_reset" ]; then
    five_h_reset_display=$(date -r "$five_h_reset" "+%H:%M" 2>/dev/null || date -d "@$five_h_reset" "+%H:%M" 2>/dev/null || echo "?")
  else
    five_h_reset_display="?"
  fi
  five_h_part="5h:${five_h_pct_display}(↺${five_h_reset_display})"
else
  five_h_part=""
fi

if [ -n "$five_h_part" ]; then
  printf "%s | ctx:%s | %s | %s" "$model" "$ctx" "$cost_part" "$five_h_part"
else
  printf "%s | ctx:%s | %s" "$model" "$ctx" "$cost_part"
fi

script 建好後記得給執行權限:

chmod +x ~/.claude/statusline-command.sh


最後看一下相關檔案位置,之後要備份或搬到新機器比較不會忘記:

~/.codex/
├── config.toml
└── version.json

~/.claude/
├── settings.json
├── settings.local.json
└── statusline-command.sh


小結一下:

  • Codex 的 statusline 比較像「選內建資訊欄位」
  • Claude Code 的 statusline 比較像「自己寫一個小 renderer」。
兩個都不難,但設定完之後,在長時間 coding session 裡真的比較安心。


又前進一步 ~ enjoy it


Reference

  • https://code.claude.com/docs/en/statusline
  • https://developers.openai.com/codex/cli/slash-commands

星期六, 5月 30, 2026

OpenSpec 安裝與工作流程小記

OpenSpec 安裝與工作流程小記



環境:
  • macOS 26.5
  • Node.js v26.0.0
  • OpenSpec 1.3.1

最近在研究 AI 與 SDD (Spec Driven Development),注意到 OpenSpec 這個工具,先把想做什麼寫清楚,再讓 AI 動手。今天來記錄安裝與第一次跑完整流程的過程。

GitHub https://github.com/Fission-AI/OpenSpec


安裝

# 全域安裝
npm install -g @fission-ai/openspec@latest

# 確認版本
openspec --version
# 1.3.1

在專案初始化

進到專案目錄執行 init,它會問你用哪個 AI 工具(選 Claude Code):

openspec init

安裝完確認一下結構,commands 跟 skills 都裝到 .claude/ 下,不影響版控(因為 .claude/ 在 .gitignore 裡):

.claude/
├── commands/opsx/
│   ├── apply.md
│   ├── archive.md
│   ├── explore.md
│   └── propose.md
└── skills/
    ├── openspec-apply-change
    ├── openspec-archive-change
    ├── openspec-explore
    └── openspec-propose

openspec/
├── changes/
│   └── archive/
└── specs/

openspec/ 下的三個目錄都是空的,git 不追蹤空目錄,所以 git status 完全乾淨。


工作流程:propose → apply → archive

OpenSpec 的核心是三個 slash command:

  • /opsx:propose 規劃
  • /opsx:apply 實作
  • /opsx:archive 歸檔

以這次新增器材摘要功能為例:


Step 1:/opsx:propose

輸入想做什麼,AI 自動在 openspec/changes/<name>/ 建立四份文件:

openspec/changes/admin-machines/
├── proposal.md    # 做什麼、為什麼做
├── design.md      # 技術決策、風險評估
├── specs/
│   └── machine-summary/
│       └── spec.md  # 需求規格與 scenario
└── tasks.md       # 逐一打勾的實作清單

可以在這裡修改內容,確認設計沒問題再繼續。


Step 2:/opsx:apply

AI 讀入四份文件,按 tasks.md 的清單逐一實作,每完成一項就打勾。這次四個 task 全跑完,最後一項是依照 qa-spec.md 補寫 QA 腳本並執行通過。

  • 這邊會列出相關的工項給使用者確認,如果有跟需求不符合的部分可以請 AI 加上工項
  • 預設執行工項不會進行 QA,建議可以將 QA 加入工項,或是引入自己的參照

Step 3:/opsx:archive

實作完畢後歸檔,把 change 資料夾移到 archive/,同時把 specs/ 下的規格同步至主規格庫 openspec/specs/:

openspec/
├── changes/
│   └── archive/
│       └── 2026-05-30-admin-machines/  # 歸檔的 change
└── specs/
    └── machine-summary/
        └── spec.md  # 長期維護的規格

沒有進行中的功能時,changes/ 下只剩 archive/。清爽。


操作了一下沒有太多違和感,如果平常就有使用規範的話,我覺得使用 OpenSpec 最大的好處應該是會保留清楚的 spec 與功能歷史紀錄。



又前進一步 ~ enjoy it

Reference

星期一, 4月 06, 2026

Gemini CLI 多帳戶設定小記

Gemini CLI 多帳戶設定小記



OS: macOS 26.3.1

Gemini CLI: 0.36.0


今天來實作 gemini cli 多帳號設定

  • 因自己有 AI Pro 訂閱, 公司有自己的 GCP 帳號

  • google 在 2026/3/25 限制非訂閱帳戶使用 Gemini Pro 模型, 我使用的環境又會牽扯 不同的 GCP 專案, 故今天花時間整理如何進行多帳號設定與分離


要如何達成呢?

核心觀念:雙重環境隔離

要達成完美的帳戶切換,建議同時操作以下兩組環境變數:

GEMINI_CLI_HOME (Gemini 專屬)

決定了所有 Gemini CLI 本身 的資料存放位置。

  • 預設路徑$HOME (CLI 會自動在其下建立或尋找 .gemini/ 目錄)

  • 目錄結構:包含:

    • .gemini/settings.json: 存放全域偏好設定。

    • .gemini/.env: 存放該 Profile 專用的 API KeyGCP 專案 ID

    • .gemini/tmp/: 存放所有的 對話紀錄 (Sessions)

CLOUDSDK_CONFIG (GCP 認證專屬)

決定了 Google Cloud SDK (gcloud) 的配置目錄與憑證存放位置。

  • 預設路徑~/.config/gcloud/

  • 目錄結構:包含:

    • application_default_credentials.json: 獨立的 ADC 檔案。

    • configurations/: 獨立的專案設定。



那就讓我們開始吧 


編輯 環境設定檔, ( 環境是 macOS 使用 zsh, 所以修改 ~/.zshrc )

加入以下設定


% vi   ~/.zshrc


# --- Gemini CLI 多帳戶隔離配置 ---

# CLOUDSDK_CONFIG (GCP 認證專屬)

# 決定了 **Google Cloud SDK** (`gcloud`) 的配置目錄。

# **預設路徑**:`~/.config/gcloud/` (macOS/Linux)

# GEMINI_CLI_HOME (Gemini 專屬)

# 決定了所有 **Gemini CLI 本身** 的資料存放位置。

# **預設路徑**:`$HOME` (CLI 會自動在其下建立或尋找 `.gemini/` 目錄)


# 1. 個人開發帳戶 (Dev: 預設環境)

alias env-personal='export CLOUDSDK_CONFIG="$HOME/.config/gcloud"; export GEMINI_CLI_HOME="$HOME"; mkdir -p "$CLOUDSDK_CONFIG" "$GEMINI_CLI_HOME/.gemini"; touch "$GEMINI_CLI_HOME/.gemini/.env"; echo "已載入 Gemini/gcloud 個人環境"; echo "提醒:請確保 $GEMINI_CLI_HOME/.gemini/.env 已正確設定個人 API Key 與 Project ID"'


# 2. 臨時測試環境 (Stage: 實驗性質)

alias env-test='export CLOUDSDK_CONFIG="$HOME/.gcloud-test"; export GEMINI_CLI_HOME="$HOME/.gemini-test"; mkdir -p "$CLOUDSDK_CONFIG" "$GEMINI_CLI_HOME/.gemini"; touch "$GEMINI_CLI_HOME/.gemini/.env"; echo "已載入 Gemini/gcloud 測試環境"; echo "提醒:請確保 $GEMINI_CLI_HOME/.gemini/.env 已正確設定測試用 API Key 與 Project ID"'


# 3. 公司工作帳戶 (Prod: 正式環境)

alias env-work='export CLOUDSDK_CONFIG="$HOME/.gcloud-work"; export GEMINI_CLI_HOME="$HOME/.gemini-work"; mkdir -p "$CLOUDSDK_CONFIG" "$GEMINI_CLI_HOME/.gemini"; touch "$GEMINI_CLI_HOME/.gemini/.env"; echo "已載入 Gemini/gcloud 公司環境"; echo "提醒:請確保 $GEMINI_CLI_HOME/.gemini/.env 已正確設定公司 API Key 與 Project ID"'


  • alias 皆為一行, 設定 CLOUDSDK_CONFIG 變數, GEMINI_CLI_HOME 變數, 建立相關目錄, 建立環境 .env 檔案與提醒



開啟一個新的終端機

開始前檢查環境相關設定


% echo  $CLOUDSDK_CONFIG


% echo  $GEMINI_CLI_HOME


% set  |  grep  CLI       

CLICOLOR=1


% env |  grep  CLOUD


% ls  -al  $HOME | grep gemini

drwxr-xr-x  19 max   staff    608  4月  6 14:07 .gemini


% ls  -al  $HOME/.gemini  |  grep  env


% ls  -al  $HOME  |  grep  gcloud


  • 預設 $CLOUDSDK_CONFIG 與 GEMINI_CLI_HOME 沒有設定

  • 如果有看到有 GOOGLE_CLOUD_PROJECT 或是 GOOGLE_CLOUD_LOCATION 這樣的全域變數設定記得要移動到 環境的 .evn 檔案內


執行 env-personal


% env-personal


已載入 Gemini/gcloud 個人環境

提醒:請確保 /Users/max/.gemini/.env 已正確設定個人 API Key 與 Project ID


再次觀察資訊


% echo  $CLOUDSDK_CONFIG          

/Users/max/.config/gcloud


% echo  $GEMINI_CLI_HOME          

/Users/max

% set  |  grep CLI

CLICOLOR=1

GEMINI_CLI_HOME=/Users/max


% env |  grep  CLOUD

CLOUDSDK_CONFIG=/Users/max/.config/gcloud


% ls  -al  $HOME |  grep  gemini     

drwxr-xr-x  20 max   staff    640  4月  6 14:36 .gemini


% ls  -al  $HOME/.gemini  |  grep  env

-rw-r--r--   1 max  staff     0  4月  6 14:36 .env


% ls  -al  $HOME |  grep  gcloud


  • 這邊可以觀察到相關的變數已經設定, 另外也建立了 ~/.gemini/.env 檔案


接下來編輯 ~/.gemini/.env 檔案將相關變數填入


% vi   ~/.gemini/.env


# 認證與身分 (必填)

# ==== Google login 相關 ====

GOOGLE_CLOUD_PROJECT="your-project-id"

# ====  Vertex AI 相關 ====

# gemini cli 因為要使用 vertex ai 模式還要多設定 GOOGLE_CLOUD_LOCATION, gemini 3 可能要設定為global

GOOGLE_CLOUD_LOCATION="global"


# 影像生成 (選填)

# ==== nano banana 相關 ====

# The following Nano Banana models are supported:

#

# gemini-3.1-flash-image-preview (Nano Banana 2 - default)

# gemini-3-pro-image-preview (Nano Banana Pro)

# gemini-2.5-flash-image (Nano Banana v1)

NANOBANANA_MODEL="gemini-3.1-flash-image-preview"

NANOBANANA_API_KEY="YOUR_API_KEY"


# ==== Gemini API Key 相關 ====

#

GEMINI_API_KEY="YOUR_API_KEY"


# 擴充功能設定 (選填)

# ==== Bigquery-data-analytics 相關 ====

# 使用 bigquery-data-analytics Gemini CLI Extension 所需之變數

BIGQUERY_PROJECT="your-billing-project"


  • 這邊請依照自己的需求填入相關變數


接下來開一個新的終端機, 啟動 gemini

詢問雲端專案ID, 看看是否載入正確



到這邊, 個人的開發環境己經設定完成, 接下來要來設定個人測試環境

  • 個人測試環境有可能是另外一個 gmail 帳號, 以不同的訂閱或是驗證方式來執行


執行 env-test 來初始化環境


% env-test


已載入 Gemini/gcloud 測試環境

提醒:請確保 /Users/max/.gemini-test/.gemini/.env 已正確設定測試用 API Key 與 Project ID


觀察資訊


% echo  $CLOUDSDK_CONFIG      

/Users/max/.gcloud-test


% echo  $GEMINI_CLI_HOME      

/Users/max/.gemini-test


% set  |  grep  CLI                 

CLICOLOR=1

GEMINI_CLI_HOME=/Users/max/.gemini-test


% env  |  grep CLOUD           

CLOUDSDK_CONFIG=/Users/max/.gcloud-test


% ls  -al  $HOME |  grep  gemini     

drwxr-xr-x  20 max   staff    640  4月  6 15:00 .gemini

drwxr-xr-x   3 max   staff     96  4月  6 15:21 .gemini-test


% ls -al $HOME | grep gcloud     

drwxr-xr-x   2 max   staff     64  4月  6 15:21 .gcloud-test


  • 這邊可以觀察到變數有新增, 以及建立應有的目錄


接下來進行 gcp 認證 初始化 (測試帳號)


% gcloud  auth  login


開啟瀏覽器進行登入與授權

觀察資訊


% ls  ~/.gcloud-test 


access_tokens.db   config_sentinel    credentials.db     gce                logs

active_config      configurations     default_configs.db legacy_credentials


接下來設定 ADC


% gcloud  auth  application-default login


開啟瀏覽器進行登入與授權


設定 ADC 配額專案 (Quota Project)


% gcloud  auth  application-default  set-quota-project  YOUR_PROJECT_ID


Credentials saved to file: [/Users/max/.gcloud-test/application_default_credentials.json]



接下來設定預設專案

% gcloud  config  set  project  YOUR_PROJECT_ID


Updated property [core/project].


觀察資訊


% gcloud  config  list


在還沒有編輯 .env 環境變數前, 先觀察相關資訊



觀察使用的 gmail 帳號

% gcloud  auth  list


觀察 GEMINI 目錄

% echo  $GEMINI_CLI_HOME

/Users/max/.gemini-test


啟動 gemini


因為是初次啟動, 會詢問驗證方式



選擇登入方式


這個時候可以跟 gemini 進行對話



這個是新的測試環境, 可以觀察到之前的 MCP 都沒有載入, 也因為是使用 Google login 驗證, 使用的模型也受到限制



  • 上方為測試環境, 下方為個人開發環境



這樣終於完成多環境隔離, 又前進一步


~ enjoy it


References

  • 跟 gemini 一起討論