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.
- package/.claude/agents/SECRETARY.md +25 -11
- package/.claude/commands/secretary.md +1 -1
- package/README.md +4 -15
- package/package.json +1 -1
- package/.claude/hooks/user-prompt-submit.py +0 -50
|
@@ -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
|
-
##
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
##
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
-
|
|
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 回去):
|
package/README.md
CHANGED
|
@@ -10,7 +10,6 @@ _一套明確責任歸屬的 Agents 開發框架_
|
|
|
10
10
|
[](https://claude.com/claude-code)
|
|
11
11
|
[](#資源供給機制)
|
|
12
12
|
[](#skills)
|
|
13
|
-
[](#自動路由)
|
|
14
13
|
[](#)
|
|
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
|
-
|
|
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.
|
|
245
|
+
6. 完成後依序自動執行 `blame-reflect` → `repo-reflect` → `update-readme`
|
|
257
246
|
|
|
258
247
|
你在過程中只需要:
|
|
259
248
|
|
package/package.json
CHANGED
|
@@ -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()
|