specops 0.2.4 → 0.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/.opencode/agent/specops-codebase-mapper.md +764 -0
- package/.opencode/agent/specops-debugger.md +1246 -0
- package/.opencode/agent/specops-executor.md +469 -0
- package/.opencode/agent/specops-integration-checker.md +443 -0
- package/.opencode/agent/specops-phase-researcher.md +547 -0
- package/.opencode/agent/specops-plan-checker.md +690 -0
- package/.opencode/agent/specops-planner.md +575 -0
- package/.opencode/agent/specops-project-researcher.md +354 -0
- package/.opencode/agent/specops-research-synthesizer.md +239 -0
- package/.opencode/agent/specops-roadmapper.md +642 -0
- package/.opencode/agent/specops-work-verifier.md +573 -0
- package/.opencode/references/checkpoints.md +776 -0
- package/.opencode/references/continuation-format.md +249 -0
- package/.opencode/references/decimal-phase-calculation.md +65 -0
- package/.opencode/references/git-integration.md +248 -0
- package/.opencode/references/git-planning-commit.md +38 -0
- package/.opencode/references/model-profile-resolution.md +34 -0
- package/.opencode/references/model-profiles.md +92 -0
- package/.opencode/references/phase-argument-parsing.md +61 -0
- package/.opencode/references/planning-config.md +196 -0
- package/.opencode/references/questioning.md +145 -0
- package/.opencode/references/tdd.md +263 -0
- package/.opencode/references/ui-brand.md +160 -0
- package/.opencode/references/verification-patterns.md +612 -0
- package/.opencode/skills/demand-analysis/SKILL.md +142 -10
- package/.opencode/templates/DEBUG.md +164 -0
- package/.opencode/templates/UAT.md +180 -0
- package/.opencode/templates/VALIDATION.md +76 -0
- package/.opencode/templates/codebase/architecture.md +255 -0
- package/.opencode/templates/codebase/concerns.md +310 -0
- package/.opencode/templates/codebase/conventions.md +307 -0
- package/.opencode/templates/codebase/integrations.md +280 -0
- package/.opencode/templates/codebase/stack.md +186 -0
- package/.opencode/templates/codebase/structure.md +285 -0
- package/.opencode/templates/codebase/testing.md +480 -0
- package/.opencode/templates/context.md +221 -0
- package/.opencode/templates/continue-here.md +78 -0
- package/.opencode/templates/debug-subagent-prompt.md +91 -0
- package/.opencode/templates/discovery.md +147 -0
- package/.opencode/templates/milestone-archive.md +123 -0
- package/.opencode/templates/milestone.md +115 -0
- package/.opencode/templates/phase-prompt.md +333 -0
- package/.opencode/templates/planner-subagent-prompt.md +117 -0
- package/.opencode/templates/project.md +184 -0
- package/.opencode/templates/requirements.md +130 -0
- package/.opencode/templates/research-project/ARCHITECTURE.md +204 -0
- package/.opencode/templates/research-project/FEATURES.md +147 -0
- package/.opencode/templates/research-project/PITFALLS.md +200 -0
- package/.opencode/templates/research-project/STACK.md +120 -0
- package/.opencode/templates/research-project/SUMMARY.md +170 -0
- package/.opencode/templates/research.md +278 -0
- package/.opencode/templates/retrospective.md +54 -0
- package/.opencode/templates/roadmap.md +202 -0
- package/.opencode/templates/state.md +176 -0
- package/.opencode/templates/summary-complex.md +59 -0
- package/.opencode/templates/summary-minimal.md +41 -0
- package/.opencode/templates/summary-standard.md +48 -0
- package/.opencode/templates/summary.md +248 -0
- package/.opencode/templates/user-setup.md +311 -0
- package/.opencode/templates/verification-report.md +322 -0
- package/.opencode/workflows/add-phase.md +111 -0
- package/.opencode/workflows/add-tests.md +350 -0
- package/.opencode/workflows/add-todo.md +157 -0
- package/.opencode/workflows/audit-milestone.md +297 -0
- package/.opencode/workflows/check-todos.md +176 -0
- package/.opencode/workflows/cleanup.md +152 -0
- package/.opencode/workflows/complete-milestone.md +763 -0
- package/.opencode/workflows/diagnose-issues.md +219 -0
- package/.opencode/workflows/discovery-phase.md +288 -0
- package/.opencode/workflows/discuss-phase.md +542 -0
- package/.opencode/workflows/execute-phase.md +449 -0
- package/.opencode/workflows/execute-plan.md +447 -0
- package/.opencode/workflows/health.md +156 -0
- package/.opencode/workflows/help.md +489 -0
- package/.opencode/workflows/insert-phase.md +129 -0
- package/.opencode/workflows/list-phase-assumptions.md +178 -0
- package/.opencode/workflows/map-codebase.md +315 -0
- package/.opencode/workflows/new-milestone.md +382 -0
- package/.opencode/workflows/new-project.md +1116 -0
- package/.opencode/workflows/pause-work.md +122 -0
- package/.opencode/workflows/plan-milestone-gaps.md +274 -0
- package/.opencode/workflows/plan-phase.md +569 -0
- package/.opencode/workflows/progress.md +381 -0
- package/.opencode/workflows/quick.md +453 -0
- package/.opencode/workflows/remove-phase.md +154 -0
- package/.opencode/workflows/research-phase.md +73 -0
- package/.opencode/workflows/resume-project.md +304 -0
- package/.opencode/workflows/set-profile.md +80 -0
- package/.opencode/workflows/settings.md +213 -0
- package/.opencode/workflows/transition.md +544 -0
- package/.opencode/workflows/update.md +219 -0
- package/.opencode/workflows/verify-phase.md +242 -0
- package/.opencode/workflows/verify-work.md +569 -0
- package/commands/specops/add-phase.md +43 -0
- package/commands/specops/add-tests.md +41 -0
- package/commands/specops/add-todo.md +47 -0
- package/commands/specops/audit-milestone.md +36 -0
- package/commands/specops/check-todos.md +45 -0
- package/commands/specops/cleanup.md +18 -0
- package/commands/specops/complete-milestone.md +136 -0
- package/commands/specops/debug.md +167 -0
- package/commands/specops/discuss-phase.md +83 -0
- package/commands/specops/execute-phase.md +41 -0
- package/commands/specops/health.md +22 -0
- package/commands/specops/help.md +22 -0
- package/commands/specops/insert-phase.md +32 -0
- package/commands/specops/join-discord.md +18 -0
- package/commands/specops/list-phase-assumptions.md +46 -0
- package/commands/specops/map-codebase.md +71 -0
- package/commands/specops/new-milestone.md +44 -0
- package/commands/specops/new-project.md +42 -0
- package/commands/specops/pause-work.md +38 -0
- package/commands/specops/plan-milestone-gaps.md +34 -0
- package/commands/specops/plan-phase.md +45 -0
- package/commands/specops/progress.md +24 -0
- package/commands/specops/quick.md +41 -0
- package/commands/specops/reapply-patches.md +111 -0
- package/commands/specops/remove-phase.md +31 -0
- package/commands/specops/research-phase.md +189 -0
- package/commands/specops/resume-work.md +40 -0
- package/commands/specops/set-profile.md +34 -0
- package/commands/specops/settings.md +36 -0
- package/commands/specops/update.md +37 -0
- package/commands/specops/verify-work.md +38 -0
- package/dist/__e2e__/01-state-engine.e2e.test.js +1 -1
- package/dist/acceptance/lazyDetector.js +1 -1
- package/dist/acceptance/lazyDetector.test.js +1 -1
- package/dist/acceptance/reporter.js +1 -1
- package/dist/acceptance/reporter.test.js +1 -1
- package/dist/acceptance/runner.js +1 -1
- package/dist/acceptance/runner.test.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/context/index.js +1 -1
- package/dist/context/promptTemplate.js +1 -1
- package/dist/context/promptTemplate.test.js +1 -1
- package/dist/context/techContextLoader.js +1 -1
- package/dist/context/techContextLoader.test.js +1 -1
- package/dist/engine.js +1 -1
- package/dist/evolution/distiller.js +1 -1
- package/dist/evolution/index.js +1 -1
- package/dist/evolution/memoryGraph.js +1 -1
- package/dist/evolution/selector.js +1 -1
- package/dist/evolution/signals.js +1 -1
- package/dist/evolution/solidify.js +1 -1
- package/dist/evolution/store.js +1 -1
- package/dist/evolution/types.js +1 -1
- package/dist/init.d.ts +4 -3
- package/dist/init.js +1 -1
- package/dist/machines/agentMachine.js +1 -1
- package/dist/machines/agentMachine.test.js +1 -1
- package/dist/machines/supervisorMachine.js +1 -1
- package/dist/machines/supervisorMachine.test.js +1 -1
- package/dist/persistence/schema.js +1 -1
- package/dist/persistence/stateFile.js +1 -1
- package/dist/persistence/stateFile.test.js +1 -1
- package/dist/plugin-engine.js +1 -1
- package/dist/plugin.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/utils/id.js +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
通过 npm 检查 SpecOps 更新,显示已安装版本和最新版本之间的变更日志,获取用户确认,并执行清除缓存的全新安装。
|
|
3
|
+
</purpose>
|
|
4
|
+
|
|
5
|
+
<required_reading>
|
|
6
|
+
在开始之前,阅读调用提示的 execution_context 中引用的所有文件。
|
|
7
|
+
</required_reading>
|
|
8
|
+
|
|
9
|
+
<process>
|
|
10
|
+
|
|
11
|
+
<step name="get_installed_version">
|
|
12
|
+
通过检查本地和全局两个位置来检测 SpecOps 的安装方式,并验证安装完整性:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# 优先检查本地(仅在有效时优先)
|
|
16
|
+
# 路径在安装时模板化以确保运行时兼容性
|
|
17
|
+
LOCAL_VERSION_FILE="./.claude/specops/VERSION"
|
|
18
|
+
LOCAL_MARKER_FILE="./.claude/specops/workflows/update.md"
|
|
19
|
+
GLOBAL_VERSION_FILE="$HOME/.claude/specops/VERSION"
|
|
20
|
+
GLOBAL_MARKER_FILE="$HOME/.claude/specops/workflows/update.md"
|
|
21
|
+
|
|
22
|
+
if [ -f "$LOCAL_VERSION_FILE" ] && [ -f "$LOCAL_MARKER_FILE" ] && grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+' "$LOCAL_VERSION_FILE"; then
|
|
23
|
+
cat "$LOCAL_VERSION_FILE"
|
|
24
|
+
echo "LOCAL"
|
|
25
|
+
elif [ -f "$GLOBAL_VERSION_FILE" ] && [ -f "$GLOBAL_MARKER_FILE" ] && grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+' "$GLOBAL_VERSION_FILE"; then
|
|
26
|
+
cat "$GLOBAL_VERSION_FILE"
|
|
27
|
+
echo "GLOBAL"
|
|
28
|
+
else
|
|
29
|
+
echo "UNKNOWN"
|
|
30
|
+
fi
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
解析输出:
|
|
34
|
+
- 如果最后一行是"LOCAL":本地安装有效;已安装版本为第一行;使用 `--local`
|
|
35
|
+
- 如果最后一行是"GLOBAL":本地缺失/无效,全局安装有效;已安装版本为第一行;使用 `--global`
|
|
36
|
+
- 如果是"UNKNOWN":继续到安装步骤(视为版本 0.0.0)
|
|
37
|
+
|
|
38
|
+
**如果 VERSION 文件缺失:**
|
|
39
|
+
```
|
|
40
|
+
## SpecOps 更新
|
|
41
|
+
|
|
42
|
+
**已安装版本:** 未知
|
|
43
|
+
|
|
44
|
+
你的安装不包含版本追踪。
|
|
45
|
+
|
|
46
|
+
正在执行全新安装……
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
继续到安装步骤(比较时视为版本 0.0.0)。
|
|
50
|
+
</step>
|
|
51
|
+
|
|
52
|
+
<step name="check_latest_version">
|
|
53
|
+
从 npm 检查最新版本:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm view specops-cc version 2>/dev/null
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**如果 npm 检查失败:**
|
|
60
|
+
```
|
|
61
|
+
无法检查更新(离线或 npm 不可用)。
|
|
62
|
+
|
|
63
|
+
手动更新:`npx specops-cc --global`
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
退出。
|
|
67
|
+
</step>
|
|
68
|
+
|
|
69
|
+
<step name="compare_versions">
|
|
70
|
+
比较已安装版本和最新版本:
|
|
71
|
+
|
|
72
|
+
**如果已安装 == 最新:**
|
|
73
|
+
```
|
|
74
|
+
## SpecOps 更新
|
|
75
|
+
|
|
76
|
+
**已安装:** X.Y.Z
|
|
77
|
+
**最新:** X.Y.Z
|
|
78
|
+
|
|
79
|
+
你已经是最新版本。
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
退出。
|
|
83
|
+
|
|
84
|
+
**如果已安装 > 最新:**
|
|
85
|
+
```
|
|
86
|
+
## SpecOps 更新
|
|
87
|
+
|
|
88
|
+
**已安装:** X.Y.Z
|
|
89
|
+
**最新:** A.B.C
|
|
90
|
+
|
|
91
|
+
你的版本超前于最新发布版(开发版本?)。
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
退出。
|
|
95
|
+
</step>
|
|
96
|
+
|
|
97
|
+
<step name="show_changes_and_confirm">
|
|
98
|
+
**如果有可用更新**,在更新前获取并显示新内容:
|
|
99
|
+
|
|
100
|
+
1. 从 GitHub raw URL 获取变更日志
|
|
101
|
+
2. 提取已安装版本和最新版本之间的条目
|
|
102
|
+
3. 显示预览并请求确认:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
## SpecOps 有可用更新
|
|
106
|
+
|
|
107
|
+
**已安装:** 1.5.10
|
|
108
|
+
**最新:** 1.5.15
|
|
109
|
+
|
|
110
|
+
### 更新内容
|
|
111
|
+
────────────────────────────────────────────────────────────
|
|
112
|
+
|
|
113
|
+
## [1.5.15] - 2026-01-20
|
|
114
|
+
|
|
115
|
+
### 新增
|
|
116
|
+
- 功能 X
|
|
117
|
+
|
|
118
|
+
## [1.5.14] - 2026-01-18
|
|
119
|
+
|
|
120
|
+
### 修复
|
|
121
|
+
- Bug 修复 Y
|
|
122
|
+
|
|
123
|
+
────────────────────────────────────────────────────────────
|
|
124
|
+
|
|
125
|
+
⚠️ **注意:** 安装程序将对 SpecOps 文件夹执行全新安装:
|
|
126
|
+
- `commands/specops/` 将被清除并替换
|
|
127
|
+
- `specops/` 将被清除并替换
|
|
128
|
+
- `agents/specops-*` 文件将被替换
|
|
129
|
+
|
|
130
|
+
(路径相对于你的安装位置:全局为 `.opencode/`,本地为 `./.claude/`)
|
|
131
|
+
|
|
132
|
+
你在其他位置的自定义文件将被保留:
|
|
133
|
+
- 不在 `commands/specops/` 中的自定义命令 ✓
|
|
134
|
+
- 不以 `specops-` 为前缀的自定义 Agent ✓
|
|
135
|
+
- 自定义钩子 ✓
|
|
136
|
+
- 你的 CLAUDE.md 文件 ✓
|
|
137
|
+
|
|
138
|
+
如果你直接修改了任何 SpecOps 文件,它们将被自动备份到 `specops-local-patches/`,更新后可以使用 `/specops:reapply-patches` 重新应用。
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
使用 AskUserQuestion:
|
|
142
|
+
- 问题:"是否继续更新?"
|
|
143
|
+
- 选项:
|
|
144
|
+
- "是,立即更新"
|
|
145
|
+
- "否,取消"
|
|
146
|
+
|
|
147
|
+
**如果用户取消:** 退出。
|
|
148
|
+
</step>
|
|
149
|
+
|
|
150
|
+
<step name="run_update">
|
|
151
|
+
使用步骤 1 中检测到的安装类型运行更新:
|
|
152
|
+
|
|
153
|
+
**如果是本地安装:**
|
|
154
|
+
```bash
|
|
155
|
+
npx -y specops-cc@latest --local
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**如果是全局安装(或未知):**
|
|
159
|
+
```bash
|
|
160
|
+
npx -y specops-cc@latest --global
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
捕获输出。如果安装失败,显示错误并退出。
|
|
164
|
+
|
|
165
|
+
清除更新缓存,使状态栏指示器消失:
|
|
166
|
+
|
|
167
|
+
**如果是本地安装:**
|
|
168
|
+
```bash
|
|
169
|
+
rm -f ./.claude/cache/specops-update-check.json
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**如果是全局安装:**
|
|
173
|
+
```bash
|
|
174
|
+
rm -f .opencode/cache/specops-update-check.json
|
|
175
|
+
```
|
|
176
|
+
(路径在安装时模板化以确保运行时兼容性)
|
|
177
|
+
</step>
|
|
178
|
+
|
|
179
|
+
<step name="display_result">
|
|
180
|
+
格式化完成消息(变更日志已在确认步骤中显示):
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
╔═══════════════════════════════════════════════════════════╗
|
|
184
|
+
║ SpecOps 已更新:v1.5.10 → v1.5.15 ║
|
|
185
|
+
╚═══════════════════════════════════════════════════════════╝
|
|
186
|
+
|
|
187
|
+
⚠️ 请重启 Claude Code 以加载新命令。
|
|
188
|
+
|
|
189
|
+
[查看完整变更日志](https://github.com/glittercowboy/specops/blob/main/CHANGELOG.md)
|
|
190
|
+
```
|
|
191
|
+
</step>
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
<step name="check_local_patches">
|
|
195
|
+
更新完成后,检查安装程序是否检测到并备份了本地修改的文件:
|
|
196
|
+
|
|
197
|
+
检查配置目录中的 specops-local-patches/backup-meta.json。
|
|
198
|
+
|
|
199
|
+
**如果发现补丁:**
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
更新前已备份本地补丁。
|
|
203
|
+
运行 /specops:reapply-patches 将你的修改合并到新版本中。
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**如果没有补丁:** 正常继续。
|
|
207
|
+
</step>
|
|
208
|
+
</process>
|
|
209
|
+
|
|
210
|
+
<success_criteria>
|
|
211
|
+
- [ ] 已正确读取已安装版本
|
|
212
|
+
- [ ] 已通过 npm 检查最新版本
|
|
213
|
+
- [ ] 如果已是最新则跳过更新
|
|
214
|
+
- [ ] 在更新前获取并显示了变更日志
|
|
215
|
+
- [ ] 显示了全新安装警告
|
|
216
|
+
- [ ] 已获取用户确认
|
|
217
|
+
- [ ] 更新执行成功
|
|
218
|
+
- [ ] 显示了重启提醒
|
|
219
|
+
</success_criteria>
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
通过目标反推分析验证阶段目标的达成情况。检查代码库是否交付了阶段承诺的内容,而不仅仅是任务是否完成。
|
|
3
|
+
|
|
4
|
+
由 execute-phase.md 生成的验证子 Agent 执行。
|
|
5
|
+
</purpose>
|
|
6
|
+
|
|
7
|
+
<core_principle>
|
|
8
|
+
**任务完成 ≠ 目标达成**
|
|
9
|
+
|
|
10
|
+
一个"创建聊天组件"的任务可以在组件只是占位符时就标记为完成。任务完成了——但"可用的聊天界面"这个目标并未达成。
|
|
11
|
+
|
|
12
|
+
目标反推验证:
|
|
13
|
+
1. 目标达成需要哪些事实为真?
|
|
14
|
+
2. 这些事实成立需要哪些产物存在?
|
|
15
|
+
3. 这些产物正常运作需要哪些连接就位?
|
|
16
|
+
|
|
17
|
+
然后逐层对照实际代码库进行验证。
|
|
18
|
+
</core_principle>
|
|
19
|
+
|
|
20
|
+
<required_reading>
|
|
21
|
+
@.opencode/references/verification-patterns.md
|
|
22
|
+
@.opencode/templates/verification-report.md
|
|
23
|
+
</required_reading>
|
|
24
|
+
|
|
25
|
+
<process>
|
|
26
|
+
|
|
27
|
+
<step name="load_context" priority="first">
|
|
28
|
+
加载阶段操作上下文:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
INIT=$(node .opencode/bin/specops-tools.cjs init phase-op "${PHASE_ARG}")
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
从初始化 JSON 中提取:`phase_dir`、`phase_number`、`phase_name`、`has_plans`、`plan_count`。
|
|
35
|
+
|
|
36
|
+
然后加载阶段详情并列出计划/摘要:
|
|
37
|
+
```bash
|
|
38
|
+
node .opencode/bin/specops-tools.cjs roadmap get-phase "${phase_number}"
|
|
39
|
+
grep -E "^| ${phase_number}" .planning/REQUIREMENTS.md 2>/dev/null
|
|
40
|
+
ls "$phase_dir"/*-SUMMARY.md "$phase_dir"/*-PLAN.md 2>/dev/null
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
从 ROADMAP.md 提取**阶段目标**(要验证的成果,而非任务),以及从 REQUIREMENTS.md 提取**需求**(如果存在)。
|
|
44
|
+
</step>
|
|
45
|
+
|
|
46
|
+
<step name="establish_must_haves">
|
|
47
|
+
**方案 A:PLAN frontmatter 中的必要项**
|
|
48
|
+
|
|
49
|
+
使用 specops-tools 从每个 PLAN 中提取 must_haves:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
for plan in "$PHASE_DIR"/*-PLAN.md; do
|
|
53
|
+
MUST_HAVES=$(node .opencode/bin/specops-tools.cjs frontmatter get "$plan" --field must_haves)
|
|
54
|
+
echo "=== $plan ===" && echo "$MUST_HAVES"
|
|
55
|
+
done
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
返回 JSON:`{ truths: [...], artifacts: [...], key_links: [...] }`
|
|
59
|
+
|
|
60
|
+
汇总所有计划的 must_haves 用于阶段级验证。
|
|
61
|
+
|
|
62
|
+
**方案 B:使用 ROADMAP.md 中的成功标准**
|
|
63
|
+
|
|
64
|
+
如果 frontmatter 中没有 must_haves(MUST_HAVES 返回错误或为空),检查成功标准:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
PHASE_DATA=$(node .opencode/bin/specops-tools.cjs roadmap get-phase "${phase_number}" --raw)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
从 JSON 输出中解析 `success_criteria` 数组。如果非空:
|
|
71
|
+
1. 将每个成功标准直接用作**事实**(它们已经写成可观察、可测试的行为)
|
|
72
|
+
2. 推导**产物**(每个事实对应的具体文件路径)
|
|
73
|
+
3. 推导**关键连接**(桩代码容易隐藏的关键接线)
|
|
74
|
+
4. 在继续之前记录必要项
|
|
75
|
+
|
|
76
|
+
ROADMAP.md 中的成功标准是契约——当两者都存在时,它们优先于 PLAN 级别的 must_haves。
|
|
77
|
+
|
|
78
|
+
**方案 C:从阶段目标推导(兜底方案)**
|
|
79
|
+
|
|
80
|
+
如果 frontmatter 中没有 must_haves 且 ROADMAP 中没有成功标准:
|
|
81
|
+
1. 陈述 ROADMAP.md 中的目标
|
|
82
|
+
2. 推导**事实**(3-7 个可观察行为,每个可测试)
|
|
83
|
+
3. 推导**产物**(每个事实对应的具体文件路径)
|
|
84
|
+
4. 推导**关键连接**(桩代码容易隐藏的关键接线)
|
|
85
|
+
5. 在继续之前记录推导出的必要项
|
|
86
|
+
</step>
|
|
87
|
+
|
|
88
|
+
<step name="verify_truths">
|
|
89
|
+
对于每个可观察事实,判断代码库是否支持它。
|
|
90
|
+
|
|
91
|
+
**状态:** ✓ 已验证(所有支撑产物通过)| ✗ 失败(产物缺失/桩代码/未连接)| ? 不确定(需要人工)
|
|
92
|
+
|
|
93
|
+
对于每个事实:识别支撑产物 → 检查产物状态 → 检查连接 → 确定事实状态。
|
|
94
|
+
|
|
95
|
+
**示例:** 事实"用户可以看到已有消息"依赖于 Chat.tsx(渲染)、/api/chat GET(提供数据)、Message 模型(schema)。如果 Chat.tsx 是桩代码或 API 返回硬编码的 [] → 失败。如果全部存在、有实质内容且已连接 → 已验证。
|
|
96
|
+
</step>
|
|
97
|
+
|
|
98
|
+
<step name="verify_artifacts">
|
|
99
|
+
使用 specops-tools 对每个 PLAN 中的 must_haves 进行产物验证:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
for plan in "$PHASE_DIR"/*-PLAN.md; do
|
|
103
|
+
ARTIFACT_RESULT=$(node .opencode/bin/specops-tools.cjs verify artifacts "$plan")
|
|
104
|
+
echo "=== $plan ===" && echo "$ARTIFACT_RESULT"
|
|
105
|
+
done
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
解析 JSON 结果:`{ all_passed, passed, total, artifacts: [{path, exists, issues, passed}] }`
|
|
109
|
+
|
|
110
|
+
**从结果判断产物状态:**
|
|
111
|
+
- `exists=false` → 缺失
|
|
112
|
+
- `issues` 非空 → 桩代码(检查 issues 中的"Only N lines"或"Missing pattern")
|
|
113
|
+
- `passed=true` → 已验证(第 1-2 级通过)
|
|
114
|
+
|
|
115
|
+
**第 3 级 — 已连接(对通过第 1-2 级的产物进行手动检查):**
|
|
116
|
+
```bash
|
|
117
|
+
grep -r "import.*$artifact_name" src/ --include="*.ts" --include="*.tsx" # 已导入
|
|
118
|
+
grep -r "$artifact_name" src/ --include="*.ts" --include="*.tsx" | grep -v "import" # 已使用
|
|
119
|
+
```
|
|
120
|
+
已连接 = 已导入且已使用。孤立 = 存在但未导入/使用。
|
|
121
|
+
|
|
122
|
+
| 存在 | 有实质内容 | 已连接 | 状态 |
|
|
123
|
+
|------|-----------|--------|------|
|
|
124
|
+
| ✓ | ✓ | ✓ | ✓ 已验证 |
|
|
125
|
+
| ✓ | ✓ | ✗ | ⚠️ 孤立 |
|
|
126
|
+
| ✓ | ✗ | - | ✗ 桩代码 |
|
|
127
|
+
| ✗ | - | - | ✗ 缺失 |
|
|
128
|
+
</step>
|
|
129
|
+
|
|
130
|
+
<step name="verify_wiring">
|
|
131
|
+
使用 specops-tools 对每个 PLAN 中的 must_haves 进行关键连接验证:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
for plan in "$PHASE_DIR"/*-PLAN.md; do
|
|
135
|
+
LINKS_RESULT=$(node .opencode/bin/specops-tools.cjs verify key-links "$plan")
|
|
136
|
+
echo "=== $plan ===" && echo "$LINKS_RESULT"
|
|
137
|
+
done
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
解析 JSON 结果:`{ all_verified, verified, total, links: [{from, to, via, verified, detail}] }`
|
|
141
|
+
|
|
142
|
+
**从结果判断连接状态:**
|
|
143
|
+
- `verified=true` → 已连接
|
|
144
|
+
- `verified=false` 且 "not found" → 未连接
|
|
145
|
+
- `verified=false` 且 "Pattern not found" → 部分连接
|
|
146
|
+
|
|
147
|
+
**兜底模式(如果 must_haves 中没有 key_links):**
|
|
148
|
+
|
|
149
|
+
| 模式 | 检查 | 状态 |
|
|
150
|
+
|------|------|------|
|
|
151
|
+
| 组件 → API | fetch/axios 调用 API 路径,响应被使用(await/.then/setState) | 已连接 / 部分(调用但未使用响应)/ 未连接 |
|
|
152
|
+
| API → 数据库 | Prisma/DB 查询模型,结果通过 res.json() 返回 | 已连接 / 部分(查询但未返回)/ 未连接 |
|
|
153
|
+
| 表单 → 处理器 | onSubmit 有真实实现(fetch/axios/mutate/dispatch),不是 console.log/空函数 | 已连接 / 桩代码(仅 log/空)/ 未连接 |
|
|
154
|
+
| 状态 → 渲染 | useState 变量出现在 JSX 中(`{stateVar}` 或 `{stateVar.property}`) | 已连接 / 未连接 |
|
|
155
|
+
|
|
156
|
+
记录每个关键连接的状态和证据。
|
|
157
|
+
</step>
|
|
158
|
+
|
|
159
|
+
<step name="verify_requirements">
|
|
160
|
+
如果 REQUIREMENTS.md 存在:
|
|
161
|
+
```bash
|
|
162
|
+
grep -E "Phase ${PHASE_NUM}" .planning/REQUIREMENTS.md 2>/dev/null
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
对于每个需求:解析描述 → 识别支撑事实/产物 → 状态:✓ 已满足 / ✗ 被阻塞 / ? 需要人工。
|
|
166
|
+
</step>
|
|
167
|
+
|
|
168
|
+
<step name="scan_antipatterns">
|
|
169
|
+
从 SUMMARY.md 提取此阶段修改的文件,扫描每个文件:
|
|
170
|
+
|
|
171
|
+
| 模式 | 搜索 | 严重程度 |
|
|
172
|
+
|------|------|----------|
|
|
173
|
+
| TODO/FIXME/XXX/HACK | `grep -n -E "TODO\|FIXME\|XXX\|HACK"` | ⚠️ 警告 |
|
|
174
|
+
| 占位符内容 | `grep -n -iE "placeholder\|coming soon\|will be here"` | 🛑 阻塞 |
|
|
175
|
+
| 空返回 | `grep -n -E "return null\|return \{\}\|return \[\]\|=> \{\}"` | ⚠️ 警告 |
|
|
176
|
+
| 仅日志函数 | 只包含 console.log 的函数 | ⚠️ 警告 |
|
|
177
|
+
|
|
178
|
+
分类:🛑 阻塞(阻碍目标)| ⚠️ 警告(不完整)| ℹ️ 信息(值得注意)。
|
|
179
|
+
</step>
|
|
180
|
+
|
|
181
|
+
<step name="identify_human_verification">
|
|
182
|
+
**始终需要人工验证:** 视觉外观、用户流程完整性、实时行为(WebSocket/SSE)、外部服务集成、性能体验、错误消息清晰度。
|
|
183
|
+
|
|
184
|
+
**不确定时需要人工:** grep 无法追踪的复杂连接、依赖动态状态的行为、边界情况。
|
|
185
|
+
|
|
186
|
+
每项格式为:测试名称 → 操作步骤 → 预期结果 → 为什么无法程序化验证。
|
|
187
|
+
</step>
|
|
188
|
+
|
|
189
|
+
<step name="determine_status">
|
|
190
|
+
**passed:** 所有事实已验证,所有产物通过第 1-3 级,所有关键连接已连接,无阻塞反模式。
|
|
191
|
+
|
|
192
|
+
**gaps_found:** 任何事实失败、产物缺失/桩代码、关键连接未连接、或发现阻塞项。
|
|
193
|
+
|
|
194
|
+
**human_needed:** 所有自动检查通过但仍有需要人工验证的项目。
|
|
195
|
+
|
|
196
|
+
**评分:** `已验证事实数 / 总事实数`
|
|
197
|
+
</step>
|
|
198
|
+
|
|
199
|
+
<step name="generate_fix_plans">
|
|
200
|
+
如果 gaps_found:
|
|
201
|
+
|
|
202
|
+
1. **聚类相关缺口:** API 桩代码 + 组件未连接 → "连接前端到后端"。多个缺失 → "完成核心实现"。仅连接问题 → "连接现有组件"。
|
|
203
|
+
|
|
204
|
+
2. **为每个聚类生成计划:** 目标、2-3 个任务(每个包含文件/操作/验证)、重新验证步骤。保持聚焦:每个计划单一关注点。
|
|
205
|
+
|
|
206
|
+
3. **按依赖排序:** 修复缺失 → 修复桩代码 → 修复连接 → 验证。
|
|
207
|
+
</step>
|
|
208
|
+
|
|
209
|
+
<step name="create_report">
|
|
210
|
+
```bash
|
|
211
|
+
REPORT_PATH="$PHASE_DIR/${PHASE_NUM}-VERIFICATION.md"
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
填充模板各部分:frontmatter(阶段/时间戳/状态/评分)、目标达成情况、产物表格、连接表格、需求覆盖、反模式、人工验证项、缺口摘要、修复计划(如果 gaps_found)、元数据。
|
|
215
|
+
|
|
216
|
+
参见 .opencode/templates/verification-report.md 获取完整模板。
|
|
217
|
+
</step>
|
|
218
|
+
|
|
219
|
+
<step name="return_to_orchestrator">
|
|
220
|
+
返回状态(`passed` | `gaps_found` | `human_needed`)、评分(N/M 必要项)、报告路径。
|
|
221
|
+
|
|
222
|
+
如果 gaps_found:列出缺口 + 推荐的修复计划名称。
|
|
223
|
+
如果 human_needed:列出需要人工测试的项目。
|
|
224
|
+
|
|
225
|
+
编排器路由:`passed` → 更新路线图 | `gaps_found` → 创建/执行修复,重新验证 | `human_needed` → 展示给用户。
|
|
226
|
+
</step>
|
|
227
|
+
|
|
228
|
+
</process>
|
|
229
|
+
|
|
230
|
+
<success_criteria>
|
|
231
|
+
- [ ] 已建立必要项(来自 frontmatter 或推导)
|
|
232
|
+
- [ ] 所有事实已验证并附带状态和证据
|
|
233
|
+
- [ ] 所有产物已在三个级别全部检查
|
|
234
|
+
- [ ] 所有关键连接已验证
|
|
235
|
+
- [ ] 已评估需求覆盖(如适用)
|
|
236
|
+
- [ ] 已扫描反模式并分类
|
|
237
|
+
- [ ] 已识别需要人工验证的项目
|
|
238
|
+
- [ ] 已确定总体状态
|
|
239
|
+
- [ ] 已生成修复计划(如果 gaps_found)
|
|
240
|
+
- [ ] 已创建包含完整报告的 VERIFICATION.md
|
|
241
|
+
- [ ] 已将结果返回给编排器
|
|
242
|
+
</success_criteria>
|