shiftblame 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -26,6 +26,14 @@ model: sonnet
26
26
  4. **等待主管回報**:不假設完成,等主管明確回報結果後才向老闆彙報
27
27
  5. **問題協調**:主管回報問題時,秘書負責跨部門或部門內協調,不讓主管自行解決
28
28
 
29
+ ## 生命週期自動化
30
+
31
+ - **專案初始化**:首次派工前自動執行 `Skill("blame-init")`(偵測 `.shiftblame/` 不存在或結構過時時觸發)
32
+ - **開發結束**:所有部門回報完成後,依序自動執行:
33
+ 1. `Skill("blame-reflect")` — 聚合鍋紀錄,提煉常識與認知
34
+ 2. `Skill("repo-reflect")` — 聚合部門文件,合併舊紀錄至 REPO.md
35
+ 3. `Skill("update-readme")` — 同步 README.md 為最新狀態
36
+
29
37
  ## 主管回報格式
30
38
  每個部門主管完成後,必須向秘書回報以下資訊:
31
39
 
@@ -52,17 +60,23 @@ model: sonnet
52
60
  待處理:<需老闆裁示的事項,無則寫「無」>
53
61
  ```
54
62
 
55
- ## 可調用 Skill
56
- - `Skill("blame-init")`:初始化推鍋環境(`.shiftblame/` 不存在或結構過時時自動呼叫)
57
- - `Skill("blame-reflect")`:聚合各部門鍋紀錄,提煉常識與認知
58
- - `Skill("repo-reflect")`:聚合各 repo 的部門文件(STM),將舊紀錄合併至 REPO.md,每部門保留最新 N 筆
59
- - `Skill("update-readme")`:掃描專案現狀,同步更新 README.md
60
-
61
- ## 文件聚合
62
- 完成後呼叫 `Skill("repo-reflect")` 執行文件聚合:
63
- - 掃描各部門目錄
64
- - 每個目錄保留最新 3 筆 STM,其餘聚合至 REPO.md
65
- - 即使少於 3 筆仍聚合(原檔保留不刪)
63
+ ## 標準開發路徑
64
+
65
+ 全新功能:`PRD → QA → DEV → QC`
66
+
67
+ 秘書可依實際需求動態調整步驟(例如加入 SEC / MIS)。
68
+
69
+ ## Worktree 機制
70
+
71
+ 派工時建立 worktree 隔離環境:
72
+
73
+ - **共享目錄**:`~/.worktree/<repo>/`
74
+ - **分支路徑**:`~/.worktree/<repo>/<slug>/`(`<slug>` 為任務簡稱)
75
+ - **repo 內 symlink**:`.worktree/<slug>` → `~/.worktree/<repo>/<slug>/`
76
+
77
+ 秘書派工時傳達 worktree 路徑給主管,主管再傳達給工程師。
78
+
79
+ **每次派工前檢查**:確認 repo 的 `.gitignore` 包含 `.worktree/`,避免 worktree symlink 被誤 commit。
66
80
 
67
81
  ## 犯錯處理
68
82
  在 `~/.shiftblame/blame/SECRETARY/BLAME.md` 附加新條目(Read → 檔頭插入 → Write 回去):
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: 推鍋入口。老闆說話就觸發秘書 Agent。涵蓋所有需求、指令、提問、指示。
2
+ description: 推鍋入口。每個 session 顯式呼叫 /secretary 進入秘書模式。
3
3
  allowed-tools: Agent
4
4
  ---
5
5
 
package/README.md CHANGED
@@ -10,7 +10,6 @@ _一套明確責任歸屬的 Agents 開發框架_
10
10
  [![Claude Code](https://img.shields.io/badge/Claude%20Code-compatible-8a2be2.svg)](https://claude.com/claude-code)
11
11
  [![Agents](https://img.shields.io/badge/agents-25-blue.svg)](#資源供給機制)
12
12
  [![Skills](https://img.shields.io/badge/skills-4-9cf.svg)](#skills)
13
- [![Hook](https://img.shields.io/badge/hook-auto_route-green.svg)](#自動路由)
14
13
  [![Language](https://img.shields.io/badge/lang-繁體中文-red.svg)](#)
15
14
 
16
15
  > _「這不是我的鍋。」_
@@ -25,8 +24,6 @@ _一套明確責任歸屬的 Agents 開發框架_
25
24
 
26
25
  還沒想清楚?秘書也能幫你**釐清方向**——用結構化問答收斂需求,確認後再推鍋。
27
26
 
28
- **自動路由**:老闆說話就自動觸發秘書,不需要手動輸入 `/secretary`。
29
-
30
27
  ---
31
28
 
32
29
  ## 資源供給機制
@@ -124,7 +121,7 @@ _一套明確責任歸屬的 Agents 開發框架_
124
121
  | 環境 / 工具問題 | MIS |
125
122
  | CI/CD / 自動化調整 | MIS |
126
123
 
127
- 全新功能的典型路徑:`PRD → MIS(環境) → QA → DEV → QC → SEC(安全) → MIS(合併+部署)`,但秘書可依實際需求動態跳過或新增步驟。
124
+ 全新功能的標準開發路徑:`PRD → QA → DEV → QC`,秘書可依實際需求動態調整步驟。
128
125
 
129
126
  ### 檔案結構
130
127
 
@@ -185,17 +182,9 @@ npm install shiftblame
185
182
 
186
183
  ## 使用
187
184
 
188
- ### 自動路由
189
-
190
- 安裝後老闆說的每一句話都會**自動路由到秘書**,不需要手動輸入 `/secretary`。
191
-
192
- Hook 腳本位於 `.claude/hooks/user-prompt-submit.py`,透過 `UserPromptSubmit` 事件攔截所有使用者輸入:
193
-
194
- - **任務 / 需求 / 指令** → 自動注入 `systemMessage` 提醒路由到 SECRETARY agent
195
- - **Meta 操作**(`/help`、`/clear`、`/fast` 等)→ 直接放行
196
- - **已含 `/secretary`** → 直接放行
185
+ ### 顯式呼叫
197
186
 
198
- 也可手動呼叫:
187
+ 每個 session 開始時,使用 `/secretary` 進入秘書模式:
199
188
 
200
189
  ```
201
190
  /secretary 幫我做一個 Markdown 轉 HTML 的 CLI
@@ -253,7 +242,7 @@ Hook 腳本位於 `.claude/hooks/user-prompt-submit.py`,透過 `UserPromptSubm
253
242
  3. 每個部門啟動前先用人話告訴你「派哪個部門、做什麼」,你回 OK 才繼續
254
243
  4. 部門主管自行分配工程師、執行後回報「誰做了什麼 / 問題 / 解決方式 / 結果」
255
244
  5. 秘書收齊回報後對照原話,呈報「完全達成 X / 部分達成 Y / 未達成 Z」
256
- 6. 完成後呼叫 `repo-reflect` 執行文件聚合
245
+ 6. 完成後依序自動執行 `blame-reflect` → `repo-reflect` → `update-readme`
257
246
 
258
247
  你在過程中只需要:
259
248
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shiftblame",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "推鍋",
5
5
  "scripts": {
6
6
  "postinstall": "node scripts/postinstall.js",
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env python3
2
- """UserPromptSubmit hook: 老闆說話就路由到秘書。"""
3
- import json
4
- import sys
5
-
6
- # 這些是 meta 操作 / Claude Code 自身功能,不需要路由到秘書
7
- SKIP_PATTERNS = [
8
- "/help", "/clear", "/compact", "/model", "/fast",
9
- "/hooks", "/cost", "/status", "/doctor", "/logout",
10
- "/init", "/plans", "/tasks", "/memory", "/loop",
11
- "/schedule", "/review", "/simplify",
12
- "keybinding", "按鍵", "快捷鍵",
13
- "Claude Code", "claude code",
14
- ]
15
-
16
- def main():
17
- data = json.load(sys.stdin)
18
- user_input = data.get("user_prompt", "")
19
- session_id = data.get("session_id", "")
20
-
21
- # 空 input 不處理
22
- if not user_input.strip():
23
- print(json.dumps({"continue": True}))
24
- return
25
-
26
- # 檢查是否為 meta 操作
27
- for pattern in SKIP_PATTERNS:
28
- if pattern.lower() in user_input.lower():
29
- print(json.dumps({"continue": True}))
30
- return
31
-
32
- # 檢查是否已經是 /secretary 命令
33
- if user_input.strip().startswith("/secretary"):
34
- print(json.dumps({"continue": True}))
35
- return
36
-
37
- # 檢查是否為純粹的 git 操作(查看狀態、看 log 等)
38
- git_only = user_input.strip().startswith(("git ", "!git "))
39
- if git_only and len(user_input.strip()) < 80:
40
- print(json.dumps({"continue": True}))
41
- return
42
-
43
- # 其他所有訊息 → 路由到秘書
44
- print(json.dumps({
45
- "systemMessage": "此訊息應透過 SECRETARY agent 路由。請使用 Skill(\"secretary\") 或 Agent(subagent_type=\"SECRETARY\") 啟動秘書,將老闆原話作為 prompt 傳入。不要自己直接處理。",
46
- "continue": True
47
- }))
48
-
49
- if __name__ == "__main__":
50
- main()