Skip to content

feat: v2.1.0 — 21 項安全修復 + ECC 擴充 + 模型選擇決策樹#6

Open
AlvinBian wants to merge 93 commits into
masterfrom
release/v2.1.0
Open

feat: v2.1.0 — 21 項安全修復 + ECC 擴充 + 模型選擇決策樹#6
AlvinBian wants to merge 93 commits into
masterfrom
release/v2.1.0

Conversation

@AlvinBian
Copy link
Copy Markdown
Owner

Summary

  • 21 項安全/穩定性修復:原子寫入、GraphQL injection 防護、shell injection 修復、session race condition、並行優化等
  • 16 個新 ECC 資源:6 agents + 7 commands + 3 rules,config-classifier 改動態掃描
  • 模型選擇決策樹:tool-selection.md 新增 6 節點自主路由(Haiku/Sonnet/Opus)+ 自動升級規則

安全修復亮點

修復 說明
GraphQL injection branch/filePath 白名單驗證(github.mjs
Shell injection source .env → grep+cut;spawn 改陣列形式
原子寫入 session / saveToCache / translations 均改 tmp+renameSync
Race condition patchSession 串行化寫入佇列,消除 read-modify-write 競態

新增 ECC

Agentsarchitecture-reviewer / build-error-resolver / database-reviewer / load-tester / tdd-guide / typescript-reviewer

Commandsaside / context-budget / multi-plan / plan / prompt-optimize / quality-gate / verify

Rulesdatabase-conventions / observability / typescript-conventions

模型決策樹

Q1 批次/高頻? → Haiku
Q2 分類/計數? → Haiku
Q3 架構/不可逆? → Opus
Q4 3+ 模組上下文? → Opus
Q5 非直覺多次失敗? → Opus
Q6 重大技術選型? → Opus
DEFAULT → Sonnet

Test plan

  • pnpm run setup 完整跑通,確認 ECC 同步正常
  • 確認新 agents/commands/rules 正確部署到 ~/.claude/
  • 確認 session 寫入無 race condition(連續快速操作)
  • 確認 Slack hook 在無 .env 時不崩潰

🤖 Generated with Claude Code

AlvinBian and others added 30 commits March 30, 2026 20:14
新功能:
- Gmail 5-Tier Filter 引導式設定(clasp + Apps Script)
- pnpm run status 配置健康度檢查
- chief-of-staff agent 加入配置庫
- 版本號從 package.json 動態讀取,不再硬編碼

代碼審查修復(10 agent 並行掃描發現):
- fix: phase-adjust adjustSlack 呼叫不存在的 runSlackSetup → setupSlackNotify
- fix: phase-adjust adjustClaudeMd 呼叫不存在的 generateAndDeployClaudeMd
- fix: phase-adjust adjustClaude skillIds/session 參數順序錯誤
- fix: slack-notify 重複 env key copy-paste bug(SLACK_DM_CHANNEL)
- fix: env.mjs parseInt('0') || fallback 返回 fallback 而非 0
- fix: config-status division by zero → NaN%
- fix: phase-complete plan.repos 未加 null guard 導致 crash
- fix: phase-analyze task.output += undefined 產生 "undefined..." 字串
- fix: session updateSessionProgress 首次安裝 no-op
- fix: slack-setup printf shell injection → execFileSync
- fix: bin/status cmdMissing/agentMissing 邏輯使用錯誤的 filter
- fix: config-status walk() 缺少 per-directory try/catch
- refactor: 移除 GLOBAL_* re-export shim(per no-backward-compat 規則)
- chore: 清理舊版文檔,docs/ 只保留 scaffold-plan.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
偵測 "Apps Script API" 錯誤 → 自動 open 設定 URL →
等用戶開啟後重試,最多 2 次。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. fix: execFileSync stdio 設定錯誤導致 API 未啟用重試失效
2. fix: .gs addLabelIds 用字串而非真實 label ID → 改用 createLabelsIfNeeded 回傳的 ID map
3. fix: addLabelIds filter(Boolean) 防止 undefined label ID
4. feat: 部署完成後自動 open Apps Script 編輯器
5. fix: Gmail 結果立即 patchSession 防止中斷遺失
6. chore: 移除 rules 中無效的 markRead 屬性

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
repos/techStacks 未定義時顯示 0 而非 ?,更清楚。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
有 session scriptId → 直接複用更新腳本
沒有 → 自動建新專案
移除手動選擇步驟,減少一步互動

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- remove: keybindings.json 部署(避免快捷鍵衝突)
  - phase-execute 移除 keybindings subtask
  - phase-adjust adjustGlobalSettings 移除 keybindings
  - setup.mjs hints 移除 keybindings 字樣
- fix: 重入選單 "? repos" → ?? 0
- fix: Gmail clasp 檢查改用 p.log.info 替代瞬間 spinner
- fix: Gmail 建立/推送失敗訊息加入錯誤原因

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. fix: 移除所有無效的 markRead: true(Gmail API 不支援此欄位)
2. fix: Tier 0 GitLab/CI 補上 github/noise label(之前只有前兩條有)
3. fix: Tier 1 全部補上 auto/skip label(之前建了 label 沒用)
4. fix: Tier 2 補上 auto/info label(之前建了沒用)
5. feat: 新增 Tier 3 — Calendar invites 加 auto/meeting label
   (之前完全缺少 Tier 3,4 個 label 只用了 1 個)

現在 4 個自訂 label 全部被正確使用:
- github/noise: Tier 0(4 rules)
- auto/skip: Tier 1(5 rules)
- auto/info: Tier 2(2 rules)
- auto/meeting: Tier 3(1 rule)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
之前 detectLegacyInstallation 跑在重入選單之前,
justUpgraded=true 導致「查看/調整配置」永遠被跳過。

改為:重入選單先顯示 → 用戶選「重新安裝」或「調整設定」
時才執行舊配置偵測清理。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
查看/調整配置:
- 完整展開 Claude commands/agents/rules/hooks/settings 數量及名稱
- 展開 zsh 模組安裝狀態
- 展開 Slack 模式及頻道
- 展開 Gmail Script ID 及設定時間
- 展開 CLAUDE.md repo 數量
- 展開 AI 模型設定
- 健康度進度條
- 調整選項 hint 顯示即時狀態

flow 修復:
- fix: analyzeCache.plan 裁剪改用 cloneDeep 避免 BACK 後資料被永久清空
- refactor: adjust action dispatch 改用 map 精簡

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- clasp create/push 改用 async _exec() 替代 execFileSync
  讓 spinner 動畫能正常旋轉,不再卡住
- API 未啟用重試前加 "正在重試..." 提示
- push 也改 async,體驗一致

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Slack/Gmail 設定前加 p.log.step 標題
- 設定完成後顯示匯總(Slack ✔ DM / Gmail ✔ Script ID)
- 清楚分隔外部服務設定與 Phase loop 倉庫選擇

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
每個 Tier 都列出:觸發條件 → 執行動作
附帶 filters 查看連結和 script 編輯連結

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 新增 applyToExisting() — 搜尋所有現有郵件,按 5-Tier 規則批量套用 label
- 新增 setupAndApply() — 建立 filter + 追溯(推薦入口)
- 重構 rules 抽成 buildRules() 共用
- 新增 buildSearchQuery() 把 filter criteria 轉為 Gmail 搜尋語法
- setup 引導文字改為推薦 setupAndApply

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
策略改為:
- Tier 0-3:留收件匣 + 加對應 label 辨識(不歸檔、不移除)
- Tier 4:加 IMPORTANT + STARRED 讓重要郵件突出
- 所有郵件都不會從收件匣消失,不會錯過任何郵件

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 新增 action/required label(紅底白字),Tier 4 郵件同時加上
- Gmail 左側欄點 action/required 可獨立查看所有重要郵件
- setup 引導加上切換「優先收件匣」說明(重要郵件自動置頂)
- 摘要更新反映新策略

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rhino 已棄用,必須聲明 V8 runtime 才能執行。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
透過 Gmail MCP 分析 alvin.bian@kkday.com 實際郵件分佈:

- Tier 0/1: 加 removeLabelIds: ["IMPORTANT"]
  Gmail 自動把 GitHub 通知標為 IMPORTANT,需要矯正
- Tier 2: 新增 it@kkday.com(系統轉發信)、figma.com(設計稿通知)
  新增 [HR Announcement] [人力資源處公告] subject 匹配
- Tier 4: 新增 hr@kkday.com / people@kkday.com / payroll@kkday.com 寄件人匹配
  新增 Payroll / Bonus / 年終 / 晉升 / promotion 等關鍵字
- Figma 從 Tier 1 移到 Tier 2(ready for dev 需要關注)
- Notion/Sentry 拆出 Figma 後獨立(多為行銷郵件)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. fix(phase-adjust): adjustClaude/adjustZsh step 缺少 script 屬性 → 必 crash
2. fix(gmail): setupAllFilters 先 deleteAllFilters 避免重複 filter
3. fix(gmail): label 移除不合法自訂顏色,改用 Gmail 預設
4. fix(gmail): batchModify/deleteAllFilters 加 try/catch 防 quota 中斷
5. fix(gmail): clasp create 搜尋 stdout+stderr 取 script URL
6. fix(phase-execute): plan.ecc/projects/zshModules/targets null guard

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- fix(constants): package.json 讀取加 try/catch 防止模組載入崩潰
- fix(session): saveSession 加 try/catch(best-effort,不中斷安裝)
- fix(doctor): has()/ver() 改用 execFileSync 消除 shell injection

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
BACK 傳播(4 CRITICAL → 已修):
- common.mjs: selectItems 檢查 BACK 並回傳
- install-claude.mjs: selectItems/selectHooks/rules smartSelect 後檢查 BACK
- install-modules.mjs: smartSelect 後檢查 BACK

Shell injection(CRITICAL → 已修):
- github.mjs: ghSync 改用 execFileSync + args array

env.mjs(HIGH → 已修):
- _loaded 移到解析完成後才設為 true
- 引號匹配改為成對檢查

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
問題:zsh/install.sh 直接 cp 覆蓋 ~/.zshrc,導致用戶個人環境變數
(JENKINS_USER、JAVA_HOME、Flutter PATH、alias 等)全部遺失。

修復:
1. zsh/zshrc 末尾加 `_safe_source "$HOME/.zshrc.local"`
   → 個人設定放 ~/.zshrc.local,永遠不被 ab-dotfiles 覆蓋
2. zsh/install.sh 覆蓋前自動從舊 .zshrc 提取 export/alias/PATH
   → 寫入 ~/.zshrc.local,並提示遷移了幾行

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
風險審計後修復:
1. ~/.ripgreprc — 改為只在不存在時建立,已有則保留
2. auto-update.sh — 同步加入 .zshrc.local 遷移邏輯
   (之前只有 install.sh 有,auto-update 仍會覆蓋)

已確認安全(無需修改):
- ~/.claude/commands/agents/rules — manifest MD5 追蹤 + .bak
- ~/.claude/settings.json — smart merge(只加不刪)
- ~/.claude/hooks.json — smart merge(只添加新 hook)
- ~/.zsh/modules/*.zsh — diff 比較,無變更跳過
- ~/.zshrc — backup + .zshrc.local 遷移(上一 commit)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
phase-execute 備份步驟擴充:
- 新增 keybindings.json 備份
- 新增 .zshrc.local 備份(個人設定不丟)
- 新增 .ripgreprc 備份

backup-original 擴充:
- 首次使用備份增加 .zshrc.local 和 .ripgreprc

restore.mjs 加固:
- fs.statSync 加 try/catch 防止中斷

完整保護鏈:
  首次使用 → ~/.ab-dotfiles-original/(完整快照)
  每次 setup → dist/backup/YYYY-MM-DD/(增量快照)
  突發還原 → pnpm run restore(選擇版本還原)
  完全回滾 → pnpm run restore-original(恢復到安裝前)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. 主流程 — setup 所有分支(quick/reinstall/adjust/status/fresh)
2. phaseExecute 8 步安裝流程
3. 配置保護鏈(備份 → 覆蓋策略 → 還原)
4. Gmail 5-Tier Filter 設定流程
5. 功能選擇 multiselect 結構
6. 角色分類系統

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 從 docs/flowcharts.md 提取 6 張 Mermaid 圖表
- 渲染為 dark theme 互動式 HTML(Mermaid.js CDN)
- 自動開啟瀏覽器查看
- 頂部 sticky 導航欄快速跳轉
- 無需安裝額外 npm 依賴

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
docs/flows/ 目錄結構:
  setup-main.mmd      — 主流程(入口分支)
  setup-status.mmd    — 查看/調整配置子流程
  phase-plan.mmd      — 計畫確認 + detailConfirm
  phase-execute.mmd   — 8 步安裝流程
  config-protection.mmd — 配置保護鏈
  gmail-setup.mmd     — Gmail 5-Tier 設定
  repo-select.mmd     — 倉庫選擇流程(新增)
  role-system.mmd     — 角色分類系統
  feature-map.mmd     — 功能選擇結構圖

每個 .mmd 有 frontmatter(title/description/links)
bin/flow.mjs 掃描 *.mmd 生成帶側邊欄 + 跨圖跳轉的 HTML
刪除舊的 docs/flowcharts.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
所有 9 張 .mmd 重寫:
- 節點可點擊跳轉到相關流程圖(Mermaid click 語法)
- classDef 色彩分類:決策=黃/操作=藍/成功=綠/錯誤=紅/資料=灰
- 每個步驟都有詳細描述,不只是標題
- subgraph 分組更清晰
- Gmail 5-Tier 效果直接在圖中展示
- 配置保護鏈三層結構一目了然

flow.mjs 加 securityLevel: 'loose' 啟用 click 跳轉

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- p.select 改為 p.multiselect,可同時選 AlvinBian + kkday-it
- 合併所有選中組織的倉庫列表
- session.org 改為 array 儲存多個組織
- 下次重入自動多選上次的組織
- API 失敗不 exit,改為跳過該組織繼續

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Mermaid v11 語法修復:
- 移除所有 backtick markdown ["`...`"]
- 移除所有 trapezoid [/"..."/]
- 多行標籤改用 <br/>
- 移除 emoji(渲染不穩定)
- 保留 click 跳轉和 classDef 色彩

拖動縮放(純 JS,零依賴):
- 滑鼠拖動移動流程圖
- 滾輪縮放(0.3x ~ 3x)
- 每張圖右上角 +/−/重置 按鈕
- overflow: hidden 防止溢出

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AlvinBian and others added 30 commits March 31, 2026 14:42
- plan.zshModules 加 ?. guard(防 exitOnError:false 後 undefined)
- hooks.json 驗證加 has('slack') guard(未裝 Slack 不應報缺失)
- settings.json 驗證加 has('claude')||has('slack') guard

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
選了多個組織後倉庫按 org 分組排列:
  AlvinBian/ab-dotfiles
  AlvinBian/ab-flash
  kkday-it/kkday-b2c-web
  kkday-it/kkday-member-ci

多組織時 label 加 org/ 前綴(dim 色)方便區分
單組織時不加前綴(跟之前一樣)
組內按貢獻度排序

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- preview log 改為分級格式:1. OrgName → 1.1 repo 2% · commits
- 實際 multiselect 改用 p.groupMultiselect,org 為 group header
  點擊 group header 可全選/取消該組所有 repo
- prompts.mjs 新增 groupedMultiselectWithAll()
- smartSelect 新增 groups 參數,有分組時走 grouped 路徑
- 單 org 時維持原本平鋪邏輯不變

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 多 org 時:每個 org 各自獨立一輪 multiselectWithAll,不合併
- 移除所有 1.1/2.1 序號,只顯示 repo 名稱
- preview log 維持 org 分組顯示(AlvinBian → repos),但無編號
- 移除 smartSelect 的 groups 參數(groupMultiselect 不再使用)
- 單一 org 維持原 smartSelect 流程不變

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 快速上手訊息改為分類完整版:Commands / Agents / Rules / ZSH / 整合設定 / 維護
- 移除 Ctrl 快捷鍵那行(已不適用)
- 加入 Gmail 分級過濾設定引導 → docs/gmail-filters.md
- 加入 Slack 通知頻道設定提示 → .env SLACK_NOTIFY_CHANNEL
- 修正備註:Slack 通知優先 channel,無設定才 DM
- 加入 CLAUDE.md(專案開發指引)進版本控制

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Repos 清單從平鋪改為 per-org 分組:
  AlvinBian
    ⭐ ab-dotfiles
  kkday-it
    ⭐ kkday-b2c-web
    🔄 kkday-web-docker

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- deploy-project.mjs:deployProjectClaudeMd 同時寫入 ~/.claude/projects/ 和 repo 根目錄
- phase-execute.mjs:顯示 repo 根目錄寫入結果
- setup.mjs:角色分配按組織分組顯示(同 phase-plan.mjs)
- 刪除 CLAUDE_WEB_JS_LIB.md(殘留測試產出)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
OPT-04: phaseAnalyze — Repos AI pipeline 與 fd/Spotlight 路徑偵測
  並行執行(互不依賴),省 2-10s

OPT-09: phaseExecute — Groups 1+2(~/.claude/)與 Group 3 ZSH(~/.zsh/)
  寫入不同目錄,並行執行,驗證 Group 4 仍在最後

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 新增 context-management rule:Plan Mode 時機、context 警戒線、/compact 策略
- 新增 agent-orchestration rule:Agent 編排模式、平行執行、能力邊界
- 新增 dependency-auditor agent:依賴健康檢查、漏洞偵測、升級建議
- 新增 accessibility agent:WCAG 2.1 審查、aria、鍵盤導航
- 新增 /adr command:架構決策記錄生成
- 新增 /runbook command:維運手冊生成
- 強化 UserPromptSubmit hook:關鍵詞偵測自動提示工具
- 修復 slack-dispatch.sh:per-repo 頻道優先、~/.claude/.env fallback
- 修復 hooks.json Stop prompt:純 JSON 輸出,移除 task-check 誤判
- 修復 repo-detect.mjs:git stderr 不再漏印到終端
- 修復 slack-setup.mjs:DM 模式不問 User ID,channel 模式不問 User ID
- 新增 tool-selection rule:完整 agent/command/skill 決策樹
- 新增 security-baseline / api-conventions / error-handling rules
- 新增 architect / data-analyst agents
- 新增 api-design / changelog / db-migration / incident / onboarding commands
- 統一 Slack 環境變數:SLACK_NOTIFY_USER_ID 獨立儲存,settings.json 注入

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- .env.template:新增完整 Slack 配置區段(SLACK_NOTIFY_MODE / SLACK_NOTIFY_CHANNEL / CLAUDE_SLACK_MIN_SESSION_SECS),從掃描區段移至獨立區段
- slack-setup.mjs:移除 SLACK_WORKSPACE_URL 讀取、hyperlink 終端連結、channelUrl 回傳
- setup.mjs:移除 SLACK_WORKSPACE_URL 寫入和 hyperlink 顯示
- phase-execute.mjs:移除 SLACK_WORKSPACE_URL 同步到 ~/.claude/.env 和 settings.json
- 保留 upgrade.mjs / setup.mjs 中的 SLACK_WORKSPACE_URL 清理(向下兼容舊 .env)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v2.0.x 從未使用 SLACK_WEBHOOK_URL 和 SLACK_WORKSPACE_URL,
不需要向下兼容 v1.x,移除相關清理邏輯。

保留 SLACK_DM_CHANNEL 清理(v2.0.x 使用過)。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
以 /^SLACK_[A-Z_]+=/ 和 /^CLAUDE_SLACK_[A-Z_]+=/ 通用匹配取代寫死的變數名列表。
無論從哪個舊版本升級,所有過時的 Slack 變數都會被自動清除後重寫。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. fix: CLAUDE_SLACK_MIN_SESSION_SECS 清理後回寫,防止用戶自訂值被丟棄
   - setup.mjs: 清理後從 env() 讀取原值重寫(預設 300)
   - phase-execute.mjs: 從 repo .env 讀取後同步到 ~/.claude/.env
2. docs: README.md Slack 示例對齊 .env.template(mode 預設 off,補 MIN_SESSION_SECS)
3. refactor: config-status.mjs 移除 env.slackMode 重複欄位(無消費者,slack.mode 已覆蓋)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
安全修復:
- doctor.mjs: 3 處 execSync 模板字串改為 execFileSync('bash', ['-c', ...])
- flow.mjs: exec 模板字串改為 execFileSync('open', [path])

keybindings 死代碼清理(v2.1.0 不再部署 keybindings.json):
- deploy-global.mjs: 移除 deployKeybindings() 函式
- auto-plan.mjs: 移除 KEYBINDING_PRESETS 及 export
- phase-execute.mjs: 移除 keybindings.json 備份任務
- phase-plan.mjs: 移除 hasKeybindings 偵測
- upgrade.mjs: 更新註釋(保留備份+清理邏輯供舊版升級用)
- 刪除 claude/keybindings-template.json 殘留檔案

README.md:
- .env 示例完全對齊 .env.template(移除 AI_ECC_MODEL/AI_PROFILE_MODEL/GH_CONCURRENCY 等過時變數)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
新增 lib/core/usage-scanner.mjs:
- 掃描 ~/.claude/projects/ 下 JSONL session 日誌
- 提取 /command 和 @agent 使用頻率(只統計 human 訊息)
- 收集 12 個維度的完整配置狀態

重寫 bin/status.mjs(+792 行):
終端互動模式:
- 總覽:健康度、Commands/Agents/Rules/Hooks/ZSH/Slack/AI/CLAUDE.md/Plugins/備份
- 查看詳情:展開任意分類,Commands/Agents 顯示使用次數+來源+最近使用
- 管理配置:Commands/Agents(刪除/從 ECC 新增)、Rules(啟用/停用/刪除/新增)、
  Hooks(事件開關)、ZSH(安裝/卸載)、Permissions(增刪)、CLAUDE.md(刪除)

HTML Dashboard(--report):
- 12 個區塊:總覽環形圖、Commands 表格、Agents 表格、Rules、Hooks、
  ZSH+Slack+AI、Sessions 7 天趨勢、Permissions 審計、CLAUDE.md、
  Plugins、備份磁碟、環境變數健康檢查
- Chart.js 圖表 + Tailwind 深色主題
- 底部管理面板:勾選未使用項目 → 生成 shell 刪除腳本 → 複製執行

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. fix: envHealth 過濾條件缺少括號,CLAUDE_SLACK_ 開頭變數被無條件跳過
2. refactor: 7 處 process.cwd() 改為 import.meta.url 推算的 REPO_ROOT,
   避免從非項目根目錄運行時路徑錯誤

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
指令整合:
- package.json: 新增 report 快捷指令,移除 restore-original / backup-original
- restore.mjs: 合併 restore-original 功能(互動選單新增「完全還原」選項)
- doctor: 修正 import 路徑 lib/doctor.mjs → lib/detect/doctor.mjs

安全修復:
- report.mjs: exec() 改為 execFileSync(),消除 shell injection
- slack-setup.mjs: exec() 改為 execFileSync()
- descriptions.mjs: process.cwd() 改為 REPO_ROOT(import.meta.url 推算)

文檔同步更新:
- README.md: 指令表更新(status 配置管理中心、report HTML Dashboard、restore 含完全還原)
- README.md: 目錄結構更新、還原指令引用更新
- phase-complete.mjs: 快速上手指南新增 report 指令
- uninstall.mjs / setup.mjs: restore-original 引用改為 restore → 完全還原

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
交互體驗(5 項):
- Detail/Manage 子菜單加入循環,不再每次操作回主選單
- 管理操作後自動重新掃描數據,顯示最新狀態
- 新增「重新掃描」選項
- Slack 和 AI 獨立詳情入口
- 主選單動態更新數據

數據準確性(3 項):
- @agent 統計只計算已安裝的 agent 名(過濾 @babel/@storybook 誤判)
- Session 路徑顯示改用檔案系統驗證的智慧解碼(非硬編碼用戶名)
- HTML 管理面板 JS 換行符修復(\\n → \n)

安全性(2 項):
- Hooks 管理從 _disabled_ 前綴改為直接移除(避免 Claude Code 報錯)
- dirSize 改用 du -sk 命令(避免 215MB 遞迴遍歷)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
修復管理操作後數據不刷新的問題:
- 所有 return 統一為 return false(取消/返回)或 return changed(結束)
- Rules toggle/delete/add、ZSH 安裝/卸載、Permissions 增刪、
  CLAUDE.md 刪除、Hooks 移除全部加上 changed = true
- 操作後主選單自動重新掃描顯示最新數據

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## 安全與穩定性修復(21 項)
- fix(github): GraphQL injection 防護 — branch/filePath 白名單驗證
- fix(session): 原子寫入(tmp + renameSync)+ 消除 read-modify-write race condition
- fix(source-sync): saveToCache 原子替換 + base64 空白字元剝除
- fix(deploy): lazy HOME getter,避免模組載入時環境變數未就緒
- fix(hooks): slack-dispatch.sh 使用 grep+cut 取代 source .env,防止 shell injection
- fix(build-plugin): spawn 改陣列形式,消除 shell injection
- fix(progress): cmd.trim().split 防止空字串成為 spawn 第一參數
- fix(claude-cli): _cliWarnEmitted 靜默降級 flag + 一次性 stderr 警告
- fix(pipeline): translations 背景寫入改 read-merge-write 原子操作
- fix(phase-execute): ECC type split 使用 eccTypeMap 正確分流 commands/agents/rules
- fix(phase-execute): JSON.parse 模板讀取加 try-catch
- fix(phase-plan): cloneDeep 前後保存/還原 Map 引用,防止 lodash 破壞 Map
- fix(session): patchSession/updateSessionProgress 改 async,串行化寫入佇列
- fix(phase-adjust): 補齊 5 處 await patchSession

## 效能優化
- perf(repo-detect): detectFallback 改 Promise.allSettled 並行,batch size 5
- perf(source-sync): fetchAllSources 改 Promise.all 並行執行
- perf(skill-detect): _registryCache 模組層快取,避免重複掃描

## ECC 擴充
- feat(agents): 新增 architecture-reviewer / build-error-resolver / database-reviewer
            load-tester / tdd-guide / typescript-reviewer(6 個新 agent)
- feat(commands): 新增 aside / context-budget / multi-plan / plan
               prompt-optimize / quality-gate / verify(7 個新 command)
- feat(rules): 新增 database-conventions / observability / typescript-conventions(3 個新 rule)
- feat(config): config-classifier 改動態掃描 claude/ 目錄,靜態清單為 fallback

## 模型選擇
- feat(rules): tool-selection.md 新增 6 節點自主決策樹(Haiku/Sonnet/Opus 自動路由)
            + Sonnet→Opus 自動升級規則 + 各 agent 建議模型對照

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. fix(deploy-global): settings.json env 從「整體覆蓋」改為「逐 key 合併」
   之前:if (!existing.env) merged.env = template.env
   → 用戶已有 env(如 Slack 變數)時,template 新增的 key 永遠不會被加入
   之後:merged.env = { ...template.env, ...(existing.env || {}) }
   → template 的新 key 被加入,用戶已有的值不被覆蓋

2. fix(setup+phase-execute): .env 清理後去除連續空行
   SLACK_ 前綴匹配清理後可能留下多個連續空行,加 .replace(/\n{3,}/g, '\n\n')

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
問題:官方安裝器裝到 ~/.local/bin/claude,但舊版 .zshrc 缺少
[[ -d "$HOME/.local/bin" ]] && export PATH="$HOME/.local/bin:$PATH"
導致終端 'claude not found'。

修復:
1. doctor.mjs: 安裝優先級改為 curl 官方安裝器 → npm fallback
   安裝後自動把 ~/.local/bin 加入 process.env.PATH
2. setup.mjs: 結束前檢查 ~/.zshrc 是否缺少 .local/bin PATH,
   提示用戶重裝 ZSH 模組或手動加入
3. zsh/zshrc 模板已有 .local/bin(本次直接覆蓋用戶 ~/.zshrc 修復)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
安裝嘗試順序:
1. curl -fsSL https://claude.ai/install.sh | sh(官方安裝器,推薦)
2. brew install claude-code(Homebrew)
3. pnpm add -g @anthropic-ai/claude-code(pnpm 全局)

逐一嘗試直到成功,每步自動檢測 ~/.local/bin 加入 PATH。
README 安裝說明同步更新。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
包含:Token 優化、安全加固、代碼重構、交互完善、文檔補全
參考:Claude Code 源碼分析 + 5-agent 審查結果 + 3 個外部最佳實踐倉庫

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant