homunculus-code 0.1.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/CONTRIBUTING.md +56 -0
- package/LICENSE +21 -0
- package/README.md +443 -0
- package/bin/init.js +317 -0
- package/commands/eval-skill.md +48 -0
- package/commands/evolve.md +67 -0
- package/commands/improve-skill.md +50 -0
- package/core/evaluate-session.js +173 -0
- package/core/observe.sh +51 -0
- package/core/prune-instincts.js +159 -0
- package/docs/nightly-agent.md +130 -0
- package/examples/reference/README.md +47 -0
- package/examples/reference/architecture.yaml +886 -0
- package/examples/reference/evolved-agents/assistant-explorer.md +86 -0
- package/examples/reference/evolved-agents/shell-debugger.md +108 -0
- package/examples/reference/evolved-agents/tdd-runner.md +112 -0
- package/examples/reference/evolved-evals/api-system-diagnosis.eval.yaml +125 -0
- package/examples/reference/evolved-evals/assistant-system-management.eval.yaml +123 -0
- package/examples/reference/evolved-evals/claude-code-reference.eval.yaml +394 -0
- package/examples/reference/evolved-evals/development-verification-patterns.eval.yaml +117 -0
- package/examples/reference/evolved-evals/multi-agent-design-patterns.eval.yaml +151 -0
- package/examples/reference/evolved-evals/shell-automation-patterns.eval.yaml +209 -0
- package/examples/reference/evolved-evals/tdd-workflow.eval.yaml +191 -0
- package/examples/reference/evolved-evals/workflows.eval.yaml +148 -0
- package/examples/reference/evolved-skills/api-system-diagnosis.md +234 -0
- package/examples/reference/evolved-skills/assistant-system-management.md +199 -0
- package/examples/reference/evolved-skills/development-verification-patterns.md +243 -0
- package/examples/reference/evolved-skills/multi-agent-design-patterns.md +259 -0
- package/examples/reference/evolved-skills/shell-automation-patterns.md +347 -0
- package/examples/reference/evolved-skills/tdd-workflow.md +272 -0
- package/examples/reference/evolved-skills/workflows.md +237 -0
- package/package.json +25 -0
- package/templates/CLAUDE.md.template +36 -0
- package/templates/architecture.template.yaml +41 -0
- package/templates/rules/evolution-system.md +29 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Skill: API System Diagnosis Workflow
|
|
2
|
+
|
|
3
|
+
**Version:** 1.1
|
|
4
|
+
**Evolved from:** 9 instincts (api-endpoint-code-change-verification-cycle, api-filter-mismatch-diagnosis-cycle, api-parameter-ignored-diagnosis-cycle, api-then-user-observation-verification, api-first-ui-bug-diagnosis-workflow, multi-layer-data-diagnosis-workflow, grep-first-cross-layer-api-diagnosis, cross-layer-decision-verification-pattern, cross-system-state-sync-verification-workflow)
|
|
5
|
+
**Confidence threshold:** 0.75–0.85
|
|
6
|
+
**Created:** 2026-03-19
|
|
7
|
+
**Use when:** UI 顯示異常、API 返回非預期值、參數被忽略、Filter 不符、跨層 bug、服務未載入新代碼
|
|
8
|
+
|
|
9
|
+
## 目的
|
|
10
|
+
|
|
11
|
+
系統化診斷 API / 後端 / 前端 跨層問題的通用工作流。適用於:UI 顯示異常、API 返回非預期結果、參數被忽略、Filter 不符、服務未載入新代碼等場景。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 核心原則
|
|
16
|
+
|
|
17
|
+
1. **Grep 優先**:問題在哪層?先搜尋代碼,再實驗。
|
|
18
|
+
2. **由內而外**:API 層 → 業務邏輯層 → 前端渲染層,逐層確認。
|
|
19
|
+
3. **縮小範圍**:每層用 curl/jq 確認數據後,再進入下一層。
|
|
20
|
+
4. **服務重啟後才驗證**:Node.js 修改 server.js 後,舊進程仍在跑,必須重啟。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Phase 1:根因定位(Grep 優先)
|
|
25
|
+
|
|
26
|
+
### 1a. 定位處理函數
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# 找 API 端點處理器
|
|
30
|
+
grep -n "app\.\(get\|post\|put\|delete\).*endpoint" server.js
|
|
31
|
+
|
|
32
|
+
# 找 filter / selector 邏輯
|
|
33
|
+
grep -n "filter\|select\|map\|find" src/component.js
|
|
34
|
+
|
|
35
|
+
# 追蹤跨文件調用鏈
|
|
36
|
+
grep -rn "functionName" .
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 1b. 識別問題層
|
|
40
|
+
|
|
41
|
+
| 症狀 | 懷疑層 | 驗證方式 |
|
|
42
|
+
|------|--------|---------|
|
|
43
|
+
| UI 顯示異常 | 前端 render | curl API 比對 JSON |
|
|
44
|
+
| Filter 結果不符 | Filter 邏輯 | 印出 filter 條件 + raw data |
|
|
45
|
+
| 參數未生效 | 後端讀取 | curl 帶 body 測試 |
|
|
46
|
+
| 功能在舊進程 | 服務未重啟 | 重啟後 re-test |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Phase 2:層級驗證流程
|
|
51
|
+
|
|
52
|
+
### 2a. API 層(最先驗證)
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# 驗證數據源是否乾淨
|
|
56
|
+
curl -s http://localhost:3000/api/endpoint | jq '{field1, field2, count: (.items | length)}'
|
|
57
|
+
|
|
58
|
+
# 確認欄位值格式(注意 "done" vs "completed" 這類 typo)
|
|
59
|
+
curl -s http://localhost:3000/api/tasks | jq '.[0] | keys'
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**紅旗**:
|
|
63
|
+
- 欄位值格式不符預期("done" vs "completed")
|
|
64
|
+
- 陣列長度不符
|
|
65
|
+
- 歷史污染數據存在(舊 prefix 如 `qrr*`)
|
|
66
|
+
|
|
67
|
+
### 2b. 業務邏輯層(參數處理)
|
|
68
|
+
|
|
69
|
+
當 API 參數沒有被正確應用時:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# 1. 確認前端確實傳了參數
|
|
73
|
+
grep -n "fetch\|axios\|curl" src/api-client.js | grep endpoint
|
|
74
|
+
|
|
75
|
+
# 2. 確認後端讀取了參數
|
|
76
|
+
grep -n "body\.\|req\.body\|query\." server.js | grep param_name
|
|
77
|
+
|
|
78
|
+
# 3. 確認後端寫入了 state
|
|
79
|
+
grep -n "state\[.param_name.\]\|\.param_name =" server.js
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**常見 bug**:
|
|
83
|
+
- `body.param` 讀對了,但 `state.param` 沒有寫入
|
|
84
|
+
- filter 條件用了硬編碼值(`=== "pending"`),沒有讀 config
|
|
85
|
+
|
|
86
|
+
### 2c. 前端渲染層(UI 異常)
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# 定位 filter/hide/skip 邏輯
|
|
90
|
+
grep -n "filter\|display.*none\|hidden\|skip" static/app.js
|
|
91
|
+
|
|
92
|
+
# 確認 selector 對應的 class/id
|
|
93
|
+
grep -n "querySelector\|getElementById\|\.class" static/app.js
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**當 API 數據正確但 UI 仍顯示異常**(常見 field name mismatch):
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Step 1:確認 API 返回的欄位名稱與值
|
|
100
|
+
curl -s http://localhost:3000/api/endpoint | jq '.[0] | {status, type, done}'
|
|
101
|
+
|
|
102
|
+
# Step 2:grep 前端 filter 比較用的字串,找命名不一致
|
|
103
|
+
grep -n '"done"\|"completed"\|"finished"\|===.*status\|\.status' static/app.js
|
|
104
|
+
|
|
105
|
+
# Step 3:確認 filter 邏輯用的欄位名是否與 API 一致
|
|
106
|
+
# 例:API 返回 status: "done",但前端 filter 判斷 status === "completed" → mismatch
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**常見 mismatch 類型**:
|
|
110
|
+
- 值不一致:API `"done"` vs 前端 filter `"completed"`
|
|
111
|
+
- 欄位名不一致:API `forge_cost` vs 前端讀取 `forgeCost`(camelCase 轉換遺漏)
|
|
112
|
+
- 型別不一致:API 返回數字 `0` vs 前端比較字串 `"0"`
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Phase 3:服務重啟驗證循環(Node.js)
|
|
117
|
+
|
|
118
|
+
修改 `server.js` 後,舊進程繼續執行舊代碼。
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# 步驟 1:找目標進程
|
|
122
|
+
ps aux | grep "node.*server"
|
|
123
|
+
|
|
124
|
+
# 步驟 2:重啟
|
|
125
|
+
kill <PID> && sleep 1 && cd ~/assistant/quest-board && node server.js &
|
|
126
|
+
|
|
127
|
+
# 步驟 3:健康確認
|
|
128
|
+
curl -s http://localhost:3000/health
|
|
129
|
+
|
|
130
|
+
# 步驟 4:新功能驗證
|
|
131
|
+
curl -s -X POST http://localhost:3000/api/new-endpoint \
|
|
132
|
+
-H "Content-Type: application/json" \
|
|
133
|
+
-d '{"key":"value"}' | jq
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**注意**:
|
|
137
|
+
- 用 grep 只殺目標進程(避免殺掉其他 Node)
|
|
138
|
+
- `sleep 1` 給進程時間釋放 port
|
|
139
|
+
- 先驗證 `/health`,確認服務恢復後再測新端點
|
|
140
|
+
|
|
141
|
+
### 3b. 服務正常但端點仍 404(路由層診斷)
|
|
142
|
+
|
|
143
|
+
/health 正常但新端點仍返回 404 時,進程問題已排除,應 grep 確認路由定義:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# 確認端點路徑(完整路徑 + HTTP method)
|
|
147
|
+
grep -n "app\.\(get\|post\|put\|delete\)\s*['\"].*new-endpoint" server.js
|
|
148
|
+
|
|
149
|
+
# 確認 middleware 順序(靜態 handler 是否在 route 前攔截)
|
|
150
|
+
grep -n "app\.use\|express\.static\|router" server.js | head -20
|
|
151
|
+
|
|
152
|
+
# 確認 body parser 已載入(POST body 讀取需要)
|
|
153
|
+
grep -n "express\.json\|bodyParser" server.js
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
常見原因:
|
|
157
|
+
- 路徑拼寫錯誤(`/api/test` vs `/api/tests`)
|
|
158
|
+
- HTTP method 不符(GET 卻 POST)
|
|
159
|
+
- 靜態檔案 handler 攔截了請求
|
|
160
|
+
- body parser middleware 未載入(`req.body` 為 undefined)
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Phase 4:分層驗證決策
|
|
165
|
+
|
|
166
|
+
修改涉及多層時,逐層問:「這層真的需要修改嗎?」
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
修改觸發點(API endpoint)
|
|
170
|
+
↓
|
|
171
|
+
是否影響業務邏輯層?(State update / filter logic)
|
|
172
|
+
↓
|
|
173
|
+
是否影響前端渲染?(HTML template / JS selector)
|
|
174
|
+
↓
|
|
175
|
+
是否影響其他系統?(heartbeat / session-start)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**不要假設**多層都需要改,逐層 grep 確認後再決定。
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Phase 5:跨系統狀態同步驗證
|
|
183
|
+
|
|
184
|
+
修改待辦/狀態系統後的驗證清單:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
# API 層
|
|
188
|
+
curl -s http://localhost:3000/api/state | jq '.tasks[] | select(.id == "TARGET_ID")'
|
|
189
|
+
|
|
190
|
+
# Session context(session-start 載入)
|
|
191
|
+
cat ~/assistant/sessions/*.json | jq '.summary'
|
|
192
|
+
|
|
193
|
+
# Heartbeat 健康檢查
|
|
194
|
+
curl -s http://localhost:3000/api/health | jq
|
|
195
|
+
|
|
196
|
+
# 相依工具
|
|
197
|
+
grep -rn "state\.tasks\|forge_cost" ~/assistant/scripts/
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Phase 6:分層驗證策略(API → 用戶觀察)
|
|
203
|
+
|
|
204
|
+
當自動化工具鏈有限制時:
|
|
205
|
+
|
|
206
|
+
1. **自動化層**(優先):curl API,驗證 JSON 數據
|
|
207
|
+
2. **用戶觀察層**(補充):在說明中加入「請確認 UI 是否顯示 X」
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# 自動化驗證
|
|
211
|
+
curl -s http://localhost:3000/api/forge | jq '{count: (.tasks | length), suggested: [.tasks[] | select(.status=="suggested")] | length}'
|
|
212
|
+
|
|
213
|
+
# 用戶確認點(當 curl 無法覆蓋 UI 渲染時)
|
|
214
|
+
echo "⚠️ 請在瀏覽器確認:ticket Y 應該不顯示在列表中"
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 常見 Anti-Patterns
|
|
220
|
+
|
|
221
|
+
- ❌ 直接看前端代碼猜問題,不先 curl API 驗證數據
|
|
222
|
+
- ❌ 修改 server.js 後,不重啟直接測試(看到舊行為誤以為 bug 未修)
|
|
223
|
+
- ❌ 假設多層都需要修改(逐層驗證才能確定)
|
|
224
|
+
- ❌ Filter 結果不符時只看 UI,不比對 API raw data
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 觸發場景
|
|
229
|
+
|
|
230
|
+
- UI 顯示異常:某元素應隱藏但仍出現、計數不符、區塊消失
|
|
231
|
+
- API 返回非預期:欄位值錯誤、陣列長度錯、歷史污染
|
|
232
|
+
- 功能修改無效:修改了代碼但行為未改變(服務重啟問題)
|
|
233
|
+
- 跨層 bug:前端正確但 API 出問題,或反之
|
|
234
|
+
- 多系統修改:API + heartbeat + session 同時涉及
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# Skill: Assistant System Management
|
|
2
|
+
|
|
3
|
+
**Version:** 1.2
|
|
4
|
+
**Icon:** shield-1
|
|
5
|
+
**Abbr:** Sys Mgmt
|
|
6
|
+
**Evolved from:**
|
|
7
|
+
- `dual-layer-evolution-architecture.md` (0.85)
|
|
8
|
+
- `assistant-quality-system-2026.md` (0.85)
|
|
9
|
+
- `todo-management-fast-path-2026.md` (0.90)
|
|
10
|
+
**Evolved:** 2026-03-10 night agent (v1.0)
|
|
11
|
+
**Use when:** 操作助理系統:收割/archive instinct、演化 skill、夜間 agent 任務資格判斷、Quest Board / Forge 操作、系統健康檢查
|
|
12
|
+
|
|
13
|
+
## 用途
|
|
14
|
+
|
|
15
|
+
管理和維護 J-Assistant 自身的系統健康。適用於:
|
|
16
|
+
- 設計新的助理子系統
|
|
17
|
+
- 確保操作品質
|
|
18
|
+
- 管理待辦任務
|
|
19
|
+
- 規劃演化策略
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 模式 1:雙層自動演化架構
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Layer 1(每 session): evaluate-session.js
|
|
27
|
+
observations.jsonl → 信心評估 → instinct/personal/ (conf > 0.7)
|
|
28
|
+
↓
|
|
29
|
+
Layer 2(每晚): heartbeat → night agent
|
|
30
|
+
instincts → 聚合 → evolved/skills/ → eval → improve
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 關鍵設計原則
|
|
34
|
+
1. **無人工介入**:信心 > 0.7 自動觸發,不需用戶確認
|
|
35
|
+
2. **避免重複**:生成前 grep 現有 instinct 內容
|
|
36
|
+
3. **持久化追蹤**:JSONL 記錄,jq 原子更新
|
|
37
|
+
4. **分層設計**:日常輕量,夜間深度
|
|
38
|
+
5. **Silent 操作**:Layer 1 的 instinct 捕捉和 git commit **不在主對話中輸出**,避免干擾用戶工作流
|
|
39
|
+
|
|
40
|
+
### Instinct 聚合判斷標準(夜間演化)
|
|
41
|
+
聚合為 skill 的條件:
|
|
42
|
+
- 2+ 個 instinct 有**相似觸發條件**(keyword overlap > 50%)
|
|
43
|
+
- 信心分數都 >= 0.75
|
|
44
|
+
- 合併後能形成連貫的指引(不只是清單)
|
|
45
|
+
|
|
46
|
+
**不聚合的情況**:主題雖相關但指引不同(保持獨立 instinct)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 模式 2:品質門禁系統
|
|
51
|
+
|
|
52
|
+
在重要操作前驗證系統品質,防止積累技術債。
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# /quality-gate [commit|deploy|infra|instinct|all]
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 通用檢查清單
|
|
59
|
+
| 檢查 | 方法 | 失敗處理 |
|
|
60
|
+
|------|------|---------|
|
|
61
|
+
| JSON 完整性 | `jq empty data/*.json` | ❌ 阻止 |
|
|
62
|
+
| Shell 語法 | `zsh -n scripts/*.sh` | ❌ 阻止 |
|
|
63
|
+
| 未提交演化 | `git diff homunculus/` | ⚠️ 提醒 |
|
|
64
|
+
| Instinct 格式 | grep confidence、created | ⚠️ 提醒 |
|
|
65
|
+
|
|
66
|
+
### 操作特定檢查
|
|
67
|
+
- **commit**: 確認 staging 不含 credentials
|
|
68
|
+
- **infra**: 確認 plist 不在 staging 中
|
|
69
|
+
- **instinct**: 確認 confidence 欄位存在且 0-1
|
|
70
|
+
|
|
71
|
+
### 狀態符號
|
|
72
|
+
- ✅ 通過 — 繼續執行
|
|
73
|
+
- ⚠️ 警告 — 可選擇繼續
|
|
74
|
+
- ❌ 失敗 — 建議停止
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 模式 3:系統健康審計
|
|
79
|
+
|
|
80
|
+
定期或按需掃描系統健康度。
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# /harness-audit [--full|--hooks|--instincts|--skills|--heartbeat]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 審計維度
|
|
87
|
+
|
|
88
|
+
**Hooks 健康**
|
|
89
|
+
- 所有 `.sh` 腳本語法正確(`zsh -n`)
|
|
90
|
+
- 必要腳本齊全:session-start/end、evaluate-session、observe、pre-compact、suggest-compact、auto-commit、profile
|
|
91
|
+
- `hook-profile-config.json` 格式正確
|
|
92
|
+
- Heartbeat 最後執行 < 2h
|
|
93
|
+
|
|
94
|
+
**Instinct 健康**
|
|
95
|
+
- 數量趨勢(是否在增長)
|
|
96
|
+
- 超過 90 天未更新的(可能過時)
|
|
97
|
+
- 重複主題(名稱相似度)
|
|
98
|
+
- 格式完整性(name/trigger/action/confidence/created)
|
|
99
|
+
|
|
100
|
+
**Skill 健康**
|
|
101
|
+
- Eval 覆蓋率(有 eval spec 的比例)
|
|
102
|
+
- 最新 pass rate(目標 > 80%)
|
|
103
|
+
- 超過 30 天未更新且有失敗 eval
|
|
104
|
+
|
|
105
|
+
**Heartbeat 健康**
|
|
106
|
+
- 最後執行時間
|
|
107
|
+
- Log 大小正常
|
|
108
|
+
- Checks 全部語法正確
|
|
109
|
+
- Todo 積壓情況
|
|
110
|
+
|
|
111
|
+
### 評分標準
|
|
112
|
+
- 🟢 正常:無 ❌,最多 2 個 ⚠️
|
|
113
|
+
- 🟡 注意:1+ 個 ⚠️ 但無 ❌
|
|
114
|
+
- 🔴 異常:任何 ❌
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 模式 4:待辦任務快速管理
|
|
119
|
+
|
|
120
|
+
**單一資料來源**:`quest-board/data/state.json` 的 `.tasks[]`
|
|
121
|
+
|
|
122
|
+
### Reminder 分類
|
|
123
|
+
|
|
124
|
+
| 類型 | 判斷 | 用途 |
|
|
125
|
+
|------|------|------|
|
|
126
|
+
| Quest | 無 `forge_cost` | 生活任務,賺 XP + Gold |
|
|
127
|
+
| Forge | 有 `forge_cost` | 系統任務,花 Gold + 加 Stat |
|
|
128
|
+
|
|
129
|
+
### 存取方式
|
|
130
|
+
|
|
131
|
+
| 場景 | 方法 |
|
|
132
|
+
|------|------|
|
|
133
|
+
| Session 開始自動摘要 | session-start.js 讀 state.json 注入 |
|
|
134
|
+
| 快速查詢 | `/todo` slash command |
|
|
135
|
+
| 新增 Quest | `/todo add <描述>` |
|
|
136
|
+
| 新增 Forge | `/todo forge <描述>` |
|
|
137
|
+
| 標記完成 | `/todo done <keyword>` |
|
|
138
|
+
| Night Agent 完成 | Forge: `/api/forge/complete`,Quest: `/api/quest/complete` |
|
|
139
|
+
|
|
140
|
+
### Session Start 注入格式
|
|
141
|
+
```
|
|
142
|
+
📌 待辦任務(共 N 項,用 /todo 管理):
|
|
143
|
+
🔴 高優先(N 項):
|
|
144
|
+
• title — notes(前 60 字元)
|
|
145
|
+
📌 一般(N 項):title1、title2
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 模式 5:Night Agent 任務閉環
|
|
151
|
+
|
|
152
|
+
### 任務資格篩選(P0 必查)
|
|
153
|
+
|
|
154
|
+
⚠️ **Night Agent 只能完成符合以下條件之一的任務**:
|
|
155
|
+
- `priority == "high"` — 用戶標記高優先
|
|
156
|
+
- `delegate_to == "night"` — 用戶明確委派夜間執行
|
|
157
|
+
|
|
158
|
+
**不符合條件的 pending 任務絕對不完成**,即使:
|
|
159
|
+
- 任務標題含「研究」或看起來適合夜間執行
|
|
160
|
+
- 任務有 `forge_cost`(有沒有 forge_cost 不影響資格)
|
|
161
|
+
- 任務是關於系統改進的
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
# 查詢符合條件的任務
|
|
165
|
+
curl -s http://localhost:3000/api/state | jq '
|
|
166
|
+
.tasks[]
|
|
167
|
+
| select(.status == "pending")
|
|
168
|
+
| select(.priority == "high" or .delegate_to == "night")
|
|
169
|
+
| {id, title, priority, delegate_to, forge_cost}'
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Night Agent 執行高優先任務後,必須:
|
|
173
|
+
1. 透過 server API 完成任務(觸發 forge mechanics)
|
|
174
|
+
2. 記錄成果到 night-report.md
|
|
175
|
+
3. 新 instinct/skill 自動 git commit
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# 透過 API 完成(確保 forge mechanics 正確執行)
|
|
179
|
+
# Forge 任務(有 forge_cost)
|
|
180
|
+
curl -s -X POST http://localhost:3000/api/forge/complete \
|
|
181
|
+
-H "Content-Type: application/json" \
|
|
182
|
+
-d "{\"id\":\"$ID\"}"
|
|
183
|
+
# Quest 任務(無 forge_cost)
|
|
184
|
+
curl -s -X POST http://localhost:3000/api/quest/complete \
|
|
185
|
+
-H "Content-Type: application/json" \
|
|
186
|
+
-d "{\"id\":\"$ID\"}"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 快速參考
|
|
192
|
+
|
|
193
|
+
| 操作 | 命令 |
|
|
194
|
+
|------|------|
|
|
195
|
+
| 品質檢查 | `/quality-gate [類型]` |
|
|
196
|
+
| 系統審計 | `/harness-audit [--部分]` |
|
|
197
|
+
| 查看待辦 | `/todo` |
|
|
198
|
+
| 系統健康 | `/health` |
|
|
199
|
+
| 查看 instinct | `/instinct-status` |
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# Skill: development-verification-patterns
|
|
2
|
+
**Version:** 1.1
|
|
3
|
+
**Icon:** cross
|
|
4
|
+
**Abbr:** Dev Check
|
|
5
|
+
**Evolved from:** cross-file-feature-removal-workflow, isolated-dependency-removal-verification, multi-file-syntax-prevalidation-loop, local-dev-cycle-restart-verify, api-endpoint-code-change-verification-cycle, cross-system-state-sync-verification-workflow
|
|
6
|
+
**Created:** 2026-03-14
|
|
7
|
+
**Use when:** 提交前驗證、多檔語法預檢、prod/test 依賴區分、服務啟動失敗診斷、重構安全性確認
|
|
8
|
+
|
|
9
|
+
## 概述
|
|
10
|
+
|
|
11
|
+
開發過程中三類驗證模式:
|
|
12
|
+
1. **語法預檢**:改完先驗語法,再做後續步驟
|
|
13
|
+
2. **功能移除清理**:跨檔案移除 + 孤立依賴檢查
|
|
14
|
+
3. **服務重啟驗證**:Node/shell 服務修改後的重啟 + 端點確認
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Pattern 1:多檔案語法預檢迴圈
|
|
19
|
+
|
|
20
|
+
**觸發**:修改 2+ 個相關檔案後,即將部署或重啟服務前。
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Node.js
|
|
24
|
+
node -c <file>.js
|
|
25
|
+
|
|
26
|
+
# Bash/Zsh
|
|
27
|
+
zsh -n <file>.sh
|
|
28
|
+
|
|
29
|
+
# JSON
|
|
30
|
+
jq empty <file>.json
|
|
31
|
+
|
|
32
|
+
# 批次預檢(改完立即跑)
|
|
33
|
+
node -c server.js && node -c web/app.js && zsh -n heartbeat.sh && echo "✅ All OK"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**原則**:
|
|
37
|
+
- 語法檢查只驗語法,不驗邏輯
|
|
38
|
+
- 全部通過後才重啟或部署
|
|
39
|
+
- 有錯立即修正 → 重新檢查,不跳過
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Pattern 2:跨檔案功能移除 + 孤立依賴清理
|
|
44
|
+
|
|
45
|
+
**觸發**:需要完整移除跨多檔案的功能(endpoint + UI + 業務邏輯 + 依賴)。
|
|
46
|
+
|
|
47
|
+
### 步驟
|
|
48
|
+
1. **識別範圍**
|
|
49
|
+
```bash
|
|
50
|
+
grep -r "feature-name" .
|
|
51
|
+
```
|
|
52
|
+
2. **分層移除**(按依賴順序)
|
|
53
|
+
- UI/表現層(HTML、CSS、前端事件)
|
|
54
|
+
- 業務邏輯層(app 程式碼)
|
|
55
|
+
- API 層(後端 endpoint)
|
|
56
|
+
- 設定層(shell script)
|
|
57
|
+
3. **孤立依賴檢查**:每個被移除功能的 import/require,grep 確認是否還有其他使用者
|
|
58
|
+
```bash
|
|
59
|
+
grep -r "module-name" . --include="*.js" # 排除 node_modules
|
|
60
|
+
```
|
|
61
|
+
- 只在 **production 代碼**中無引用 → 移除 production import(**test 檔不算**)
|
|
62
|
+
- Test 檔中仍有引用 → 移除 production import,並同步更新/刪除該測試
|
|
63
|
+
- Production + test 以外的代碼也有引用 → 保留 import
|
|
64
|
+
- **Production vs Test 判斷**:`src/`、`*.js`(非 `*.test.js`)= production;`tests/`、`*.test.js`、`*.spec.js` = test
|
|
65
|
+
4. **語法驗證**(Pattern 1)
|
|
66
|
+
5. **成果審核**
|
|
67
|
+
```bash
|
|
68
|
+
git diff # 確認無孤立程式碼殘留
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**典型範例**(移除 weather 功能):
|
|
72
|
+
```
|
|
73
|
+
Grep "weather" → 找到 index.html/app.js/server.js/refresh.sh
|
|
74
|
+
移除順序:HTML chip → app.js 事件 → server.js endpoint → refresh.sh 邏輯
|
|
75
|
+
Grep "https" → 確認只有 weather 用 → 移除 require('https')
|
|
76
|
+
node -c server.js && zsh -n refresh.sh ✅
|
|
77
|
+
git diff 確認
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Pattern 3:服務重啟 + 端點驗證迴圈
|
|
83
|
+
|
|
84
|
+
**觸發**:修改 Node.js/Express server.js 後(新增端點、修改邏輯),需要載入新代碼。
|
|
85
|
+
|
|
86
|
+
### 步驟
|
|
87
|
+
```bash
|
|
88
|
+
# 1. 找現有進程
|
|
89
|
+
ps aux | grep "node.*server.js" | grep -v grep
|
|
90
|
+
|
|
91
|
+
# 2. 重啟(只殺目標,避免誤殺)
|
|
92
|
+
kill <PID> && sleep 1 && cd ~/assistant/quest-board && node server.js &
|
|
93
|
+
|
|
94
|
+
# 3. 驗證服務回復
|
|
95
|
+
curl -s http://localhost:3000/status # 或 /health
|
|
96
|
+
|
|
97
|
+
# 4. 測試新端點
|
|
98
|
+
curl -s -X POST http://localhost:3000/<endpoint> \
|
|
99
|
+
-H "Content-Type: application/json" \
|
|
100
|
+
-d '{"key":"value"}' | jq
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**注意**:
|
|
104
|
+
- 使用 `grep -v grep` 避免 grep 自己出現在結果中
|
|
105
|
+
- `sleep 1` 確保進程完全關閉後再啟動
|
|
106
|
+
- 先測健康端點,再測新功能端點
|
|
107
|
+
- 後台啟動用 `&`,若有 launchctl 管理則改用 launchctl
|
|
108
|
+
|
|
109
|
+
### 3b. 服務啟動失敗診斷(node -c 通過但 /health 返回 Connection refused)
|
|
110
|
+
|
|
111
|
+
`node -c` 只驗語法,不驗 runtime。啟動後若 `/health` 失敗:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# 步驟 1:等幾秒再重試(race condition)
|
|
115
|
+
sleep 2 && curl -s http://localhost:3000/health
|
|
116
|
+
|
|
117
|
+
# 步驟 2:確認進程是否存在
|
|
118
|
+
ps aux | grep "node.*server.js" | grep -v grep
|
|
119
|
+
# → 進程存在但無回應:port 衝突、未完全啟動,再等
|
|
120
|
+
# → 進程不存在:啟動時 crash 了
|
|
121
|
+
|
|
122
|
+
# 步驟 3:前景執行看 stderr(進程不存在時)
|
|
123
|
+
cd ~/assistant/quest-board && node server.js
|
|
124
|
+
# 看完整錯誤訊息(不加 & 讓 stderr 顯示在 terminal)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**常見 runtime 失敗原因**:
|
|
128
|
+
- 缺少環境變數(`process.env.X` is undefined,配合 `|| throw` 立即崩潰)
|
|
129
|
+
- port 已被佔用(`EADDRINUSE :3000`)
|
|
130
|
+
- `require()` 路徑錯誤(找不到模組)
|
|
131
|
+
- JSON.parse 失敗(state.json 損毀)
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Pattern 4:Quest Board 系統整合驗證
|
|
136
|
+
|
|
137
|
+
**觸發**:修改 server.js API、session-start.js 或 state.json 相關邏輯後。
|
|
138
|
+
|
|
139
|
+
### 端對端驗證清單
|
|
140
|
+
```bash
|
|
141
|
+
# --- Habit API(每日習慣,ephemeral in today.habits)---
|
|
142
|
+
# 完成習慣
|
|
143
|
+
curl -s -X POST http://localhost:3000/api/habit/complete \
|
|
144
|
+
-H "Content-Type: application/json" \
|
|
145
|
+
-d '{"questId":"q1"}' | jq
|
|
146
|
+
|
|
147
|
+
# 復原習慣
|
|
148
|
+
curl -s -X POST http://localhost:3000/api/habit/undo \
|
|
149
|
+
-H "Content-Type: application/json" \
|
|
150
|
+
-d '{"questId":"q1"}' | jq
|
|
151
|
+
|
|
152
|
+
# --- Quest API(持久任務,無 forge_cost)---
|
|
153
|
+
# 新增任務
|
|
154
|
+
curl -s -X POST http://localhost:3000/api/quest/add \
|
|
155
|
+
-H "Content-Type: application/json" \
|
|
156
|
+
-d '{"title":"test-quest"}' | jq
|
|
157
|
+
|
|
158
|
+
# 完成任務
|
|
159
|
+
curl -s -X POST http://localhost:3000/api/quest/complete \
|
|
160
|
+
-H "Content-Type: application/json" \
|
|
161
|
+
-d '{"id":"rN"}' | jq
|
|
162
|
+
|
|
163
|
+
# 復原任務
|
|
164
|
+
curl -s -X POST http://localhost:3000/api/quest/undo \
|
|
165
|
+
-H "Content-Type: application/json" \
|
|
166
|
+
-d '{"id":"rN"}' | jq
|
|
167
|
+
|
|
168
|
+
# 刪除任務
|
|
169
|
+
curl -s -X POST http://localhost:3000/api/quest/delete \
|
|
170
|
+
-H "Content-Type: application/json" \
|
|
171
|
+
-d '{"id":"rN"}' | jq
|
|
172
|
+
|
|
173
|
+
# --- Forge API(系統升級任務,有 forge_cost)---
|
|
174
|
+
# 新增 Forge
|
|
175
|
+
curl -s -X POST http://localhost:3000/api/forge/add \
|
|
176
|
+
-H "Content-Type: application/json" \
|
|
177
|
+
-d '{"title":"test-forge","forge_cost":3,"stat":"int"}' | jq
|
|
178
|
+
|
|
179
|
+
# 完成 Forge
|
|
180
|
+
curl -s -X POST http://localhost:3000/api/forge/complete \
|
|
181
|
+
-H "Content-Type: application/json" \
|
|
182
|
+
-d '{"id":"rN"}' | jq
|
|
183
|
+
|
|
184
|
+
# 驗證 state 更新
|
|
185
|
+
jq '.player | {gold, xp, level, stats}' ~/assistant/quest-board/data/state.json
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**驗證點**:
|
|
189
|
+
- Habit 完成:+XP、+gold、skill XP;全完成 bonus +agi
|
|
190
|
+
- Quest 完成:+XP、+gold
|
|
191
|
+
- Forge 完成:-gold(forge_cost)、+stat
|
|
192
|
+
- Undo:扣回 XP/gold,狀態回 pending
|
|
193
|
+
- Server 重啟後 state 保持不變(持久化確認)
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Pattern 5:AC-to-Test 自動驗證迴圈
|
|
200
|
+
|
|
201
|
+
**觸發**:Forge 任務有 `[testable]` AC,需要自動化驗證。
|
|
202
|
+
|
|
203
|
+
### 流程
|
|
204
|
+
|
|
205
|
+
1. `/forge-dev define-ac` 時標記 `[testable]` / `[manual]`
|
|
206
|
+
2. `/forge-dev gen-tests` spawn `tdd-runner` subagent:
|
|
207
|
+
- 讀 `[testable]` AC → 生成 `quest-board/tests/<id>.test.js`
|
|
208
|
+
- 跑一次確認 **RED**(全失敗)
|
|
209
|
+
3. `/forge-dev start` 進入紅綠迴圈:
|
|
210
|
+
- 實作 → `node --test tests/<id>.test.js` → 修到全綠
|
|
211
|
+
4. `/forge-dev review` 自動跑測試 + 手動驗證 `[manual]` AC
|
|
212
|
+
|
|
213
|
+
### 與其他 Pattern 搭配
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
gen-tests(RED)→ 實作(GREEN)→ Pattern 1(語法預檢)→ Pattern 3(服務重啟)→ review
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### 測試執行
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# 單一任務測試
|
|
223
|
+
node --test quest-board/tests/<id>.test.js
|
|
224
|
+
|
|
225
|
+
# 所有測試(序列執行,避免 state 衝突)
|
|
226
|
+
node --test --concurrency=1 quest-board/tests/*.test.js
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**詳細 pattern 和 anti-pattern 見 `tdd-workflow` skill。**
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 選擇指引
|
|
234
|
+
|
|
235
|
+
| 情境 | 使用 Pattern |
|
|
236
|
+
|------|-------------|
|
|
237
|
+
| 改了幾個檔案,即將重啟服務 | Pattern 1(語法預檢)|
|
|
238
|
+
| 移除某個功能 | Pattern 2(跨檔案移除)|
|
|
239
|
+
| 改了 server.js 想測新 endpoint | Pattern 3(服務重啟驗證)|
|
|
240
|
+
| 改了 Quest Board 邏輯 | Pattern 4(整合驗證)|
|
|
241
|
+
| Forge 任務有 testable AC | Pattern 5(AC-to-Test 迴圈)|
|
|
242
|
+
| 移除功能後涉及服務重啟 | Pattern 2 → Pattern 1 → Pattern 3 |
|
|
243
|
+
| 新功能完整流程 | Pattern 5 → Pattern 1 → Pattern 3 → Pattern 4 |
|