sillyspec 3.9.0 → 3.10.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/skills/sillyspec-archive/SKILL.md +17 -0
- package/.claude/skills/sillyspec-auto/SKILL.md +78 -0
- package/.claude/skills/sillyspec-brainstorm/SKILL.md +17 -0
- package/{templates/commit.md → .claude/skills/sillyspec-commit/SKILL.md} +32 -47
- package/.claude/skills/sillyspec-continue/SKILL.md +45 -0
- package/.claude/skills/sillyspec-doctor/SKILL.md +27 -0
- package/.claude/skills/sillyspec-execute/SKILL.md +17 -0
- package/.claude/skills/sillyspec-explore/SKILL.md +105 -0
- package/.claude/skills/sillyspec-export/SKILL.md +53 -0
- package/.claude/skills/sillyspec-init/SKILL.md +170 -0
- package/.claude/skills/sillyspec-plan/SKILL.md +17 -0
- package/.claude/skills/sillyspec-propose/SKILL.md +17 -0
- package/.claude/skills/sillyspec-quick/SKILL.md +17 -0
- package/.claude/skills/sillyspec-resume/SKILL.md +111 -0
- package/.claude/skills/sillyspec-scan/SKILL.md +17 -0
- package/.claude/skills/sillyspec-state/SKILL.md +54 -0
- package/.claude/skills/sillyspec-status/SKILL.md +17 -0
- package/.claude/skills/sillyspec-verify/SKILL.md +17 -0
- package/.claude/skills/sillyspec-workspace/SKILL.md +149 -0
- package/README.md +19 -11
- package/SKILL.md +15 -10
- package/package.json +7 -9
- package/packages/dashboard/dist/assets/index-BcM2J-hv.css +1 -0
- package/packages/dashboard/dist/assets/index-DpLHK4jv.js +7446 -0
- package/packages/dashboard/dist/index.html +16 -16
- package/packages/dashboard/dist/prototype-dashboard.html +836 -0
- package/packages/dashboard/dist/prototype-overview.html +256 -0
- package/packages/dashboard/package-lock.json +226 -6
- package/packages/dashboard/package.json +8 -5
- package/packages/dashboard/public/logo.jpg +0 -0
- package/packages/dashboard/public/prototype-dashboard.html +836 -0
- package/packages/dashboard/public/prototype-overview.html +256 -0
- package/packages/dashboard/server/executor.js +1 -1
- package/packages/dashboard/server/index.js +341 -113
- package/packages/dashboard/server/parser.js +442 -30
- package/packages/dashboard/server/watcher.js +214 -134
- package/packages/dashboard/src/App.vue +475 -71
- package/packages/dashboard/src/components/ActionBar.vue +36 -43
- package/packages/dashboard/src/components/CommandPalette.vue +45 -66
- package/packages/dashboard/src/components/DetailPanel.vue +68 -53
- package/packages/dashboard/src/components/DocPreview.vue +257 -0
- package/packages/dashboard/src/components/DocTree.vue +114 -0
- package/packages/dashboard/src/components/HResizeHandle.vue +48 -0
- package/packages/dashboard/src/components/LogStream.vue +13 -33
- package/packages/dashboard/src/components/PipelineStage.vue +8 -8
- package/packages/dashboard/src/components/PipelineView.vue +99 -45
- package/packages/dashboard/src/components/ProjectCard.vue +187 -0
- package/packages/dashboard/src/components/ProjectList.vue +103 -45
- package/packages/dashboard/src/components/ProjectOverview.vue +152 -0
- package/packages/dashboard/src/components/StageBadge.vue +13 -13
- package/packages/dashboard/src/components/StepCard.vue +15 -15
- package/packages/dashboard/src/components/VResizeHandle.vue +61 -0
- package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -0
- package/packages/dashboard/src/components/detail/GitDetail.vue +61 -0
- package/packages/dashboard/src/components/detail/TechDetail.vue +43 -0
- package/packages/dashboard/src/composables/useDashboard.js +48 -6
- package/packages/dashboard/src/composables/useKeyboard.js +6 -4
- package/packages/dashboard/src/composables/useLayout.js +131 -0
- package/packages/dashboard/src/main.js +4 -1
- package/packages/dashboard/src/style.css +17 -17
- package/src/index.js +141 -22
- package/src/init.js +93 -231
- package/src/migrate.js +117 -0
- package/src/progress.js +460 -0
- package/src/run.js +635 -0
- package/src/setup.js +2 -72
- package/src/stages/archive.js +54 -0
- package/src/stages/brainstorm.js +264 -0
- package/src/stages/doctor.js +303 -0
- package/src/stages/execute.js +287 -0
- package/src/stages/explore.js +34 -0
- package/src/stages/index.js +28 -0
- package/src/stages/plan.js +354 -0
- package/src/stages/propose.js +115 -0
- package/src/stages/quick.js +64 -0
- package/src/stages/scan.js +141 -0
- package/src/stages/status.js +65 -0
- package/src/stages/verify.js +135 -0
- package/.sillyspec/changes/dashboard/design.md +0 -219
- package/.sillyspec/plans/2026-04-05-dashboard.md +0 -737
- package/.sillyspec/specs/2026-04-05-dashboard-design.md +0 -206
- package/dist/steps/brainstorm/01-load-context.md +0 -30
- package/dist/steps/brainstorm/02-reuse-check.md +0 -6
- package/dist/steps/brainstorm/03-prototype-analysis.md +0 -11
- package/dist/steps/brainstorm/04-module-split.md +0 -23
- package/dist/steps/brainstorm/05-dialog-explore.md +0 -8
- package/dist/steps/brainstorm/06-propose-approaches.md +0 -3
- package/dist/steps/brainstorm/07-present-design.md +0 -3
- package/dist/steps/brainstorm/08-write-design.md +0 -21
- package/dist/steps/brainstorm/09-self-review.md +0 -15
- package/dist/steps/brainstorm/10-user-confirm.md +0 -3
- package/dist/steps/brainstorm/11-output-spec.md +0 -7
- package/dist/steps/brainstorm/manifest.yaml +0 -26
- package/dist/steps/execute/01-load-context.md +0 -41
- package/dist/steps/execute/02-scan-conventions.md +0 -47
- package/dist/steps/execute/03-skill-mcp.md +0 -19
- package/dist/steps/execute/04-assign-task.md +0 -22
- package/dist/steps/execute/04b-prompt-template.md +0 -54
- package/dist/steps/execute/05-write-test.md +0 -7
- package/dist/steps/execute/06-write-code.md +0 -8
- package/dist/steps/execute/07-run-test.md +0 -26
- package/dist/steps/execute/08-fix-issues.md +0 -28
- package/dist/steps/execute/09-next-task.md +0 -33
- package/dist/steps/execute/manifest.yaml +0 -28
- package/dist/steps/plan/01-load-context.md +0 -22
- package/dist/steps/plan/02-anchor-confirm.md +0 -1
- package/dist/steps/plan/03-expand-tasks.md +0 -33
- package/dist/steps/plan/04-mark-order.md +0 -15
- package/dist/steps/plan/05-e2e-planning.md +0 -17
- package/dist/steps/plan/06-self-check.md +0 -16
- package/dist/steps/plan/07-save.md +0 -1
- package/dist/steps/plan/manifest.yaml +0 -18
- package/dist/steps/scan/01-env-detect.md +0 -51
- package/dist/steps/scan/02-tech-stack.md +0 -16
- package/dist/steps/scan/03-conventions.md +0 -16
- package/dist/steps/scan/04-structure.md +0 -19
- package/dist/steps/scan/05-quality.md +0 -18
- package/dist/steps/scan/06-complete.md +0 -49
- package/dist/steps/scan/manifest.yaml +0 -16
- package/dist/steps/verify/01-load-specs.md +0 -28
- package/dist/steps/verify/02-check-tasks.md +0 -1
- package/dist/steps/verify/03-check-design.md +0 -6
- package/dist/steps/verify/04-run-tests.md +0 -7
- package/dist/steps/verify/05-e2e-tests.md +0 -27
- package/dist/steps/verify/05b-e2e-fix.md +0 -33
- package/dist/steps/verify/06-code-quality.md +0 -25
- package/dist/steps/verify/07-lint-check.md +0 -27
- package/dist/steps/verify/08-output-report.md +0 -14
- package/dist/steps/verify/manifest.yaml +0 -22
- package/docs/.vitepress/config.mts +0 -45
- package/docs/.vitepress/dist/404.html +0 -25
- package/docs/.vitepress/dist/assets/app.YytxICdd.js +0 -1
- package/docs/.vitepress/dist/assets/chunks/framework.Czhw_PXq.js +0 -19
- package/docs/.vitepress/dist/assets/chunks/theme.DusTRZQk.js +0 -1
- package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.js +0 -1
- package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.lean.js +0 -1
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.js +0 -15
- package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.lean.js +0 -1
- package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.js +0 -4
- package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.lean.js +0 -1
- package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.js +0 -1
- package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.lean.js +0 -1
- package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.js +0 -4
- package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.lean.js +0 -1
- package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.js +0 -5
- package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.lean.js +0 -1
- package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.js +0 -28
- package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.lean.js +0 -1
- package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.js +0 -30
- package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.lean.js +0 -1
- package/docs/.vitepress/dist/assets/style.DFTx90Kk.css +0 -1
- package/docs/.vitepress/dist/hashmap.json +0 -1
- package/docs/.vitepress/dist/index.html +0 -28
- package/docs/.vitepress/dist/sillyspec/commands.html +0 -42
- package/docs/.vitepress/dist/sillyspec/dashboard.html +0 -31
- package/docs/.vitepress/dist/sillyspec/file-io.html +0 -28
- package/docs/.vitepress/dist/sillyspec/getting-started.html +0 -31
- package/docs/.vitepress/dist/sillyspec/install.html +0 -32
- package/docs/.vitepress/dist/sillyspec/lifecycle.html +0 -55
- package/docs/.vitepress/dist/sillyspec/structure.html +0 -57
- package/docs/.vitepress/dist/vp-icons.css +0 -1
- package/docs/index.md +0 -34
- package/docs/sillyspec/commands.md +0 -218
- package/docs/sillyspec/dashboard.md +0 -51
- package/docs/sillyspec/file-io.md +0 -34
- package/docs/sillyspec/getting-started.md +0 -61
- package/docs/sillyspec/install.md +0 -51
- package/docs/sillyspec/lifecycle.md +0 -146
- package/docs/sillyspec/structure.md +0 -62
- package/packages/dashboard/dist/assets/index-Bh-GPjKY.css +0 -1
- package/packages/dashboard/dist/assets/index-CrCn5Gg6.js +0 -17
- package/src/step.js +0 -543
- package/templates/archive.md +0 -120
- package/templates/brainstorm.md +0 -170
- package/templates/continue.md +0 -32
- package/templates/execute.md +0 -304
- package/templates/explore.md +0 -59
- package/templates/export.md +0 -21
- package/templates/init.md +0 -61
- package/templates/plan.md +0 -146
- package/templates/quick.md +0 -135
- package/templates/scan-quick.md +0 -49
- package/templates/scan.md +0 -156
- package/templates/skills/playwright-e2e/SKILL.md +0 -340
- package/templates/status.md +0 -75
- package/templates/verify.md +0 -236
- package/templates/workspace-sync.md +0 -99
- package/templates/workspace.md +0 -70
- /package/{docs/.vitepress/dist/logo.jpg → logo.jpg} +0 -0
- /package/{docs/.vitepress → packages/dashboard}/dist/favicon.jpg +0 -0
- /package/{docs/public → packages/dashboard/dist}/logo.jpg +0 -0
- /package/{docs → packages/dashboard}/public/favicon.jpg +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'fs'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
|
|
4
|
+
export const definition = {
|
|
5
|
+
name: 'plan',
|
|
6
|
+
title: '实现计划',
|
|
7
|
+
description: '编写实现计划 — 按 Wave 分组,每个任务独立文档',
|
|
8
|
+
steps: null // 动态生成
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// 固定前缀步骤
|
|
12
|
+
export const fixedPrefix = [
|
|
13
|
+
{
|
|
14
|
+
name: '状态检查',
|
|
15
|
+
prompt: `检查当前状态,确认可以执行 plan。
|
|
16
|
+
|
|
17
|
+
### 操作
|
|
18
|
+
1. 运行 \`sillyspec progress show\`
|
|
19
|
+
2. 确认 currentStage 为 "plan"
|
|
20
|
+
|
|
21
|
+
### 输出
|
|
22
|
+
当前状态摘要`,
|
|
23
|
+
outputHint: '状态摘要',
|
|
24
|
+
optional: false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: '加载上下文',
|
|
28
|
+
prompt: `加载所有规范文件和代码库上下文。
|
|
29
|
+
|
|
30
|
+
### 操作
|
|
31
|
+
1. 读取 CODEBASE-OVERVIEW.md + 各子项目上下文
|
|
32
|
+
2. 读取 proposal.md、design.md、requirements.md、tasks.md
|
|
33
|
+
3. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
|
|
34
|
+
4. 读取 local.yaml 获取构建/测试命令
|
|
35
|
+
|
|
36
|
+
### 输出
|
|
37
|
+
已加载的文件清单`,
|
|
38
|
+
outputHint: '文件清单',
|
|
39
|
+
optional: false
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: '锚定确认',
|
|
43
|
+
prompt: `确认已读取的文件。
|
|
44
|
+
|
|
45
|
+
### 操作
|
|
46
|
+
列出已读取的文件,标注存在/不存在。
|
|
47
|
+
|
|
48
|
+
### 输出
|
|
49
|
+
文件加载确认清单`,
|
|
50
|
+
outputHint: '文件确认清单',
|
|
51
|
+
optional: false
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: '展开任务并分组',
|
|
55
|
+
prompt: `把 tasks.md 每个 checkbox 展开为任务描述,按 Wave 分组,产出 plan.md 总览。
|
|
56
|
+
|
|
57
|
+
### plan.md 格式(轻量总览,PM 视角)
|
|
58
|
+
\`\`\`markdown
|
|
59
|
+
# 实现计划
|
|
60
|
+
|
|
61
|
+
## Wave 1(并行,无依赖)
|
|
62
|
+
- [ ] task-01: 添加用户创建接口
|
|
63
|
+
- [ ] task-02: 添加角色创建接口
|
|
64
|
+
|
|
65
|
+
## Wave 2(依赖 Wave 1)
|
|
66
|
+
- [ ] task-03: 用户创建接口联调
|
|
67
|
+
|
|
68
|
+
## 全局验收标准
|
|
69
|
+
- [ ] 所有单元测试通过
|
|
70
|
+
\`\`\`
|
|
71
|
+
|
|
72
|
+
### 关键规则
|
|
73
|
+
- plan.md 只放任务列表 + Wave 划分 + 全局验收标准,**不放实现细节**
|
|
74
|
+
- 实现细节写到后续的 tasks/task-NN.md 中
|
|
75
|
+
- 每个任务编号格式:task-01、task-02 ...
|
|
76
|
+
|
|
77
|
+
### 批量模式指引
|
|
78
|
+
如果 design.md 或需求中包含批量特征(关键词:批量/模板/引擎/N个相似),按以下原则规划:
|
|
79
|
+
❌ 不要列出每个实例作为独立任务
|
|
80
|
+
❌ 不要在文档中嵌入数据
|
|
81
|
+
✅ 设计通用架构,Wave 1 聚焦架构
|
|
82
|
+
✅ 数据转换用脚本完成,单独一个 Wave
|
|
83
|
+
✅ 总任务数控制在 10 个以内
|
|
84
|
+
|
|
85
|
+
### 操作
|
|
86
|
+
1. 读取 tasks.md 获取任务列表
|
|
87
|
+
2. 读取 design.md 获取文件变更清单
|
|
88
|
+
3. 逐个展开为任务描述
|
|
89
|
+
4. 分析依赖关系,按 Wave 分组
|
|
90
|
+
5. 保存到 \`.sillyspec/changes/<变更名>/plan.md\`
|
|
91
|
+
|
|
92
|
+
### 输出
|
|
93
|
+
plan.md 总览内容`,
|
|
94
|
+
outputHint: 'plan.md 总览',
|
|
95
|
+
optional: false
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: '自检总览',
|
|
99
|
+
prompt: `自检 plan.md 总览质量。
|
|
100
|
+
|
|
101
|
+
### 操作
|
|
102
|
+
检查以下各项:
|
|
103
|
+
- [ ] 每个 task 有编号(task-01、task-02 ...)
|
|
104
|
+
- [ ] 每个 task 有 checkbox
|
|
105
|
+
- [ ] 已标注 Wave 分组和依赖关系
|
|
106
|
+
- [ ] 有全局验收标准
|
|
107
|
+
- [ ] 没有实现细节(接口定义、代码示例等不应该在 plan.md 里)
|
|
108
|
+
- [ ] plan.md 与 design.md 的文件变更清单一致
|
|
109
|
+
|
|
110
|
+
### 输出
|
|
111
|
+
自检通过/不通过`,
|
|
112
|
+
outputHint: '自检结果',
|
|
113
|
+
optional: false
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
// 固定后缀步骤
|
|
118
|
+
export const fixedSuffix = [
|
|
119
|
+
{
|
|
120
|
+
name: '审查一致性',
|
|
121
|
+
prompt: `审查所有 task-N.md 的一致性。
|
|
122
|
+
|
|
123
|
+
### 操作
|
|
124
|
+
1. 读取所有 tasks/task-NN.md
|
|
125
|
+
2. 检查:
|
|
126
|
+
- 文件路径有没有冲突(两个任务改同一个文件)
|
|
127
|
+
- 依赖关系和 plan.md 的 Wave 分组是否一致
|
|
128
|
+
- 验收标准和 plan.md 的全局标准是否矛盾
|
|
129
|
+
- 接口定义是否自洽
|
|
130
|
+
3. 发现问题 → 列出问题清单,暂停等用户决定是否修复
|
|
131
|
+
|
|
132
|
+
### 输出
|
|
133
|
+
一致性审查结果`,
|
|
134
|
+
outputHint: '审查结果',
|
|
135
|
+
optional: false
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: '保存并更新进度',
|
|
139
|
+
prompt: `确认所有文件已保存,更新进度。
|
|
140
|
+
|
|
141
|
+
### 操作
|
|
142
|
+
1. 确认 plan.md 和所有 tasks/task-NN.md 已存在
|
|
143
|
+
2. \`git add .sillyspec/\` — **不要 commit**
|
|
144
|
+
|
|
145
|
+
### 输出
|
|
146
|
+
文件列表 + 下一步命令`,
|
|
147
|
+
outputHint: '文件列表',
|
|
148
|
+
optional: false
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* 解析 plan.md 获取任务数量
|
|
154
|
+
*/
|
|
155
|
+
function parseTaskCount(planContent) {
|
|
156
|
+
if (!planContent || typeof planContent !== 'string') return 0
|
|
157
|
+
const matches = planContent.match(/^[-*]\s*\[[ x]\]\s*task-\d+/gm)
|
|
158
|
+
return matches ? matches.length : 0
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* 生成单个任务的蓝图写作 prompt
|
|
163
|
+
*/
|
|
164
|
+
function buildTaskPrompt(taskNum, taskName, changeDir) {
|
|
165
|
+
return `编写任务蓝图 tasks/task-${String(taskNum).padStart(2, '0')}.md
|
|
166
|
+
|
|
167
|
+
### 任务
|
|
168
|
+
${taskName}
|
|
169
|
+
|
|
170
|
+
### 文件路径
|
|
171
|
+
\`.sillyspec/changes/<变更名>/tasks/task-${String(taskNum).padStart(2, '0')}.md\`
|
|
172
|
+
|
|
173
|
+
### 格式要求(必须严格遵守)
|
|
174
|
+
\`\`\`markdown
|
|
175
|
+
# task-${String(taskNum).padStart(2, '0')}: ${taskName}
|
|
176
|
+
|
|
177
|
+
## 修改文件
|
|
178
|
+
- 具体文件路径列表
|
|
179
|
+
|
|
180
|
+
## 实现要求
|
|
181
|
+
1. 具体做什么,写清楚
|
|
182
|
+
2. ...
|
|
183
|
+
|
|
184
|
+
## 接口定义
|
|
185
|
+
(代码类任务必填,写方法签名、数据结构)
|
|
186
|
+
|
|
187
|
+
## 边界处理
|
|
188
|
+
- 异常场景列表
|
|
189
|
+
|
|
190
|
+
## 参考
|
|
191
|
+
- 已有代码可参考的模式
|
|
192
|
+
- 相关的 CONVENTIONS.md 条目
|
|
193
|
+
|
|
194
|
+
## TDD 步骤
|
|
195
|
+
1. 写测试 ...
|
|
196
|
+
2. 运行 <test-cmd> 确认失败
|
|
197
|
+
3. 写代码 ...
|
|
198
|
+
4. 运行 <test-cmd> 确认通过
|
|
199
|
+
(纯配置/文档类任务简化为:1. 实现 2. 验证)
|
|
200
|
+
|
|
201
|
+
## 验收标准
|
|
202
|
+
- [ ] 具体可测试的验收条件
|
|
203
|
+
\`\`\`
|
|
204
|
+
|
|
205
|
+
### 关键规则
|
|
206
|
+
- task-N.md 必须独立完整,execute 子代理只读这一个文件就能干活
|
|
207
|
+
- 不要依赖其他 task-N.md 的内容
|
|
208
|
+
- 接口定义写到"搬砖工照着做"的程度
|
|
209
|
+
- 写完后保存到文件
|
|
210
|
+
|
|
211
|
+
### 操作
|
|
212
|
+
1. 读取 design.md 和 plan.md 了解上下文
|
|
213
|
+
2. 读取相关源文件了解现有代码
|
|
214
|
+
3. 编写任务蓝图
|
|
215
|
+
4. 保存到 tasks/task-${String(taskNum).padStart(2, '0')}.md
|
|
216
|
+
|
|
217
|
+
### 输出
|
|
218
|
+
任务蓝图内容摘要`
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 构建任务蓝图协调器步骤(单步,子代理并行写蓝图)
|
|
223
|
+
*/
|
|
224
|
+
export function buildCoordinatorStep(changeDir, taskNames) {
|
|
225
|
+
const taskList = taskNames.map((name, i) => {
|
|
226
|
+
const num = String(i + 1).padStart(2, '0')
|
|
227
|
+
return `- task-${num}: ${name}`
|
|
228
|
+
}).join('\n')
|
|
229
|
+
|
|
230
|
+
const subagentPrompts = taskNames.map((name, i) => {
|
|
231
|
+
const num = String(i + 1).padStart(2, '0')
|
|
232
|
+
return `\`\`\`
|
|
233
|
+
任务编号:task-${num}
|
|
234
|
+
任务名称:${name}
|
|
235
|
+
文件路径:${changeDir}/tasks/task-${num}.md
|
|
236
|
+
|
|
237
|
+
操作:
|
|
238
|
+
1. 读取 ${changeDir}/design.md 和 ${changeDir}/plan.md 了解上下文
|
|
239
|
+
2. 读取相关源文件了解现有代码
|
|
240
|
+
3. 按以下格式编写任务蓝图并保存到 ${changeDir}/tasks/task-${num}.md:
|
|
241
|
+
|
|
242
|
+
# task-${num}: ${name}
|
|
243
|
+
|
|
244
|
+
## 修改文件
|
|
245
|
+
- 文件路径列表
|
|
246
|
+
|
|
247
|
+
## 实现要求
|
|
248
|
+
1. 具体做什么
|
|
249
|
+
|
|
250
|
+
## 接口定义
|
|
251
|
+
(代码类任务必填)
|
|
252
|
+
|
|
253
|
+
## 边界处理
|
|
254
|
+
- 异常场景
|
|
255
|
+
|
|
256
|
+
## 参考
|
|
257
|
+
- 可参考的模式
|
|
258
|
+
|
|
259
|
+
## TDD 步骤
|
|
260
|
+
1. 写测试 → 2. 确认失败 → 3. 写代码 → 4. 确认通过
|
|
261
|
+
|
|
262
|
+
## 验收标准
|
|
263
|
+
- [ ] 具体可测试的条件
|
|
264
|
+
|
|
265
|
+
关键规则:
|
|
266
|
+
- 必须独立完整,execute 子代理只读这一个文件就能干活
|
|
267
|
+
- 不要依赖其他 task-N.md 的内容
|
|
268
|
+
- 接口定义写到"搬砖工照着做"的程度
|
|
269
|
+
- 写完后用 Write tool 保存到文件
|
|
270
|
+
\`\`\``
|
|
271
|
+
}).join('\n\n')
|
|
272
|
+
|
|
273
|
+
return {
|
|
274
|
+
name: '生成任务蓝图(子代理并行)',
|
|
275
|
+
prompt: `为 plan.md 中的每个任务生成独立蓝图文件。
|
|
276
|
+
|
|
277
|
+
## 任务清单
|
|
278
|
+
${taskList}
|
|
279
|
+
|
|
280
|
+
## 执行方式(必须严格遵守)
|
|
281
|
+
|
|
282
|
+
**你必须使用 Agent tool 启动子代理来写每个蓝图,不要自己写。**
|
|
283
|
+
|
|
284
|
+
1. 确认 \`${changeDir}/tasks/\` 目录存在(不存在则创建)
|
|
285
|
+
2. 为每个任务启动一个独立子代理(Agent tool),可并行启动多个
|
|
286
|
+
3. 每个子代理使用对应的 prompt(见下方模板)
|
|
287
|
+
4. 等待所有子代理完成
|
|
288
|
+
5. 验证每个 task-N.md 文件已生成且非空
|
|
289
|
+
|
|
290
|
+
### 子代理 prompt 模板
|
|
291
|
+
为每个任务使用以下 prompt 启动子代理:
|
|
292
|
+
|
|
293
|
+
${subagentPrompts}
|
|
294
|
+
|
|
295
|
+
## 验收
|
|
296
|
+
- 每个 task-N.md 文件存在且非空
|
|
297
|
+
- 包含所有必要章节:修改文件、实现要求、接口定义、边界处理、TDD 步骤、验收标准`,
|
|
298
|
+
outputHint: '蓝图生成结果',
|
|
299
|
+
optional: false
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* 从 plan.md 解析任务名列表
|
|
305
|
+
*/
|
|
306
|
+
function parseTaskNames(planContent) {
|
|
307
|
+
const names = []
|
|
308
|
+
const lines = planContent.split('\n')
|
|
309
|
+
for (const line of lines) {
|
|
310
|
+
const m = line.match(/^[-*]\s*\[[ x]\]\s*task-\d+:\s*(.+)/i)
|
|
311
|
+
if (m) names.push(m[1].trim())
|
|
312
|
+
}
|
|
313
|
+
return names
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* 动态构建 plan 步骤列表
|
|
318
|
+
* @param {string|null} changeDir - 变更目录路径
|
|
319
|
+
* @param {string|null} planContent - plan.md 内容(可选,用于解析任务数)
|
|
320
|
+
* @returns {Array} 步骤列表
|
|
321
|
+
*/
|
|
322
|
+
export function buildPlanSteps(changeDir = null, planContent = null) {
|
|
323
|
+
let taskCount = 0
|
|
324
|
+
|
|
325
|
+
// 尝试从 plan.md 解析任务数
|
|
326
|
+
if (planContent) {
|
|
327
|
+
taskCount = parseTaskCount(planContent)
|
|
328
|
+
} else if (changeDir) {
|
|
329
|
+
const planFile = path.join(changeDir, 'plan.md')
|
|
330
|
+
if (existsSync(planFile)) {
|
|
331
|
+
taskCount = parseTaskCount(readFileSync(planFile, 'utf8'))
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// 没有任务数则用固定步骤(兼容旧流程)
|
|
336
|
+
if (taskCount === 0) {
|
|
337
|
+
return [...fixedPrefix, ...fixedSuffix]
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// 解析任务名
|
|
341
|
+
let taskNames = []
|
|
342
|
+
if (planContent) {
|
|
343
|
+
taskNames = parseTaskNames(planContent)
|
|
344
|
+
} else if (changeDir) {
|
|
345
|
+
const planFile = path.join(changeDir, 'plan.md')
|
|
346
|
+
if (existsSync(planFile)) {
|
|
347
|
+
taskNames = parseTaskNames(readFileSync(planFile, 'utf8'))
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// 生成单个协调器步骤(子代理并行写蓝图)
|
|
352
|
+
const coordinatorStep = buildCoordinatorStep(changeDir, taskNames)
|
|
353
|
+
return [...fixedPrefix, coordinatorStep, ...fixedSuffix]
|
|
354
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
export const definition = {
|
|
2
|
+
name: 'propose',
|
|
3
|
+
title: '方案设计',
|
|
4
|
+
description: '生成结构化规范 — proposal + design + tasks',
|
|
5
|
+
steps: [
|
|
6
|
+
{
|
|
7
|
+
name: '状态检查',
|
|
8
|
+
prompt: `检查当前状态,确认可以执行 propose。
|
|
9
|
+
|
|
10
|
+
### 操作
|
|
11
|
+
1. 运行 \`sillyspec progress show\`
|
|
12
|
+
2. 确认 currentStage 为 "propose"
|
|
13
|
+
3. 如果没有设计文档 → 提示先运行 brainstorm
|
|
14
|
+
|
|
15
|
+
### 输出
|
|
16
|
+
当前状态摘要`,
|
|
17
|
+
outputHint: '状态摘要',
|
|
18
|
+
optional: false
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: '加载上下文',
|
|
22
|
+
prompt: `加载所有相关规范和代码库上下文。
|
|
23
|
+
|
|
24
|
+
### 操作
|
|
25
|
+
1. 加载 CODEBASE-OVERVIEW.md 和子项目上下文
|
|
26
|
+
2. 读取最新设计文档、需求文档、代码库约定
|
|
27
|
+
3. 如果是子阶段变更,读取 MASTER.md 和前序阶段设计
|
|
28
|
+
|
|
29
|
+
### 输出
|
|
30
|
+
已加载的文件列表`,
|
|
31
|
+
outputHint: '文件列表',
|
|
32
|
+
optional: false
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: '锚定确认',
|
|
36
|
+
prompt: `确认已读取的文件。
|
|
37
|
+
|
|
38
|
+
### 操作
|
|
39
|
+
1. 列出已读取的文件,标注存在/不存在
|
|
40
|
+
2. 格式:\`[x] 文件名 — 说明\` 或 \`[ ] 文件名 — 不存在(正常)\`
|
|
41
|
+
|
|
42
|
+
### 输出
|
|
43
|
+
文件加载确认清单
|
|
44
|
+
|
|
45
|
+
### 注意
|
|
46
|
+
- 文件不存在不是错误,正常标注即可`,
|
|
47
|
+
outputHint: '文件确认清单',
|
|
48
|
+
optional: false
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: '探索现有代码',
|
|
52
|
+
prompt: `理解相关模块的当前实现,识别影响范围。
|
|
53
|
+
|
|
54
|
+
### 操作
|
|
55
|
+
1. 根据设计文档中的文件变更清单,读取相关源码
|
|
56
|
+
2. 识别现有接口、方法签名、数据结构
|
|
57
|
+
3. 记录可能受影响的模块
|
|
58
|
+
|
|
59
|
+
### 输出
|
|
60
|
+
影响范围分析(涉及模块、需修改的文件、风险点)`,
|
|
61
|
+
outputHint: '影响范围分析',
|
|
62
|
+
optional: false
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: '生成规范文件',
|
|
66
|
+
prompt: `在 \`.sillyspec/changes/<变更名>/\` 下生成四个文件。
|
|
67
|
+
|
|
68
|
+
### 操作
|
|
69
|
+
1. 生成 proposal.md:动机、变更范围、不在范围内、成功标准
|
|
70
|
+
2. 生成 requirements.md:功能需求、用户场景(Given/When/Then)、非功能需求
|
|
71
|
+
3. 生成 design.md:架构决策、文件变更清单、数据模型、API 设计、代码风格参照
|
|
72
|
+
4. 生成 tasks.md:任务列表(只列名称,不展开步骤)
|
|
73
|
+
|
|
74
|
+
### 输出
|
|
75
|
+
四个文件路径
|
|
76
|
+
|
|
77
|
+
### 注意
|
|
78
|
+
- 表名/字段名必须来自真实 schema 或标注"新增"
|
|
79
|
+
- 用户场景必须用 Given/When/Then 格式
|
|
80
|
+
- tasks.md 只列任务名,细节在 plan 阶段展开`,
|
|
81
|
+
outputHint: '四个文件路径',
|
|
82
|
+
optional: false
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: '自检门控',
|
|
86
|
+
prompt: `自检生成的规范文件。
|
|
87
|
+
|
|
88
|
+
### 操作
|
|
89
|
+
检查以下各项:
|
|
90
|
+
- [ ] proposal.md 有动机、变更范围、不在范围内、成功标准
|
|
91
|
+
- [ ] design.md 有文件变更清单表格
|
|
92
|
+
- [ ] requirements.md 有 Given/When/Then 用户场景
|
|
93
|
+
- [ ] tasks.md 每个 task 有文件路径
|
|
94
|
+
|
|
95
|
+
任何不通过 → 修正后重新检查。
|
|
96
|
+
|
|
97
|
+
### 输出
|
|
98
|
+
自检通过/不通过`,
|
|
99
|
+
outputHint: '自检结果',
|
|
100
|
+
optional: false
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: '展示并更新进度',
|
|
104
|
+
prompt: `展示规范给用户,更新进度。
|
|
105
|
+
|
|
106
|
+
### 操作
|
|
107
|
+
1. 展示 proposal.md 和 design.md 摘要
|
|
108
|
+
|
|
109
|
+
### 输出
|
|
110
|
+
展示结果 + 下一步命令`,
|
|
111
|
+
outputHint: '展示结果',
|
|
112
|
+
optional: false
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export const definition = {
|
|
2
|
+
name: 'quick',
|
|
3
|
+
title: '快速任务',
|
|
4
|
+
description: '跳过完整流程,直接做',
|
|
5
|
+
auxiliary: true,
|
|
6
|
+
steps: [
|
|
7
|
+
{
|
|
8
|
+
name: '理解任务',
|
|
9
|
+
prompt: `解析任务参数,加载项目上下文。
|
|
10
|
+
|
|
11
|
+
### 操作
|
|
12
|
+
1. 检查是否携带 \`--change <变更名>\`,确定记录方式
|
|
13
|
+
2. 理解任务:模糊则问一个问题确认
|
|
14
|
+
3. 加载项目信息:\`cat .sillyspec/projects/*.yaml 2>/dev/null\`(了解项目结构和技术栈)
|
|
15
|
+
4. 加载上下文:\`cat .sillyspec/docs/<project>/scan/CONVENTIONS.md 2>/dev/null\`
|
|
16
|
+
5. 加载本地配置:\`cat .sillyspec/local.yaml 2>/dev/null\`(构建命令、测试命令、环境变量等)
|
|
17
|
+
6. 如有 \`--change\`,加载设计文档:\`cat .sillyspec/changes/<变更名>/design.md 2>/dev/null\`(理解设计意图)
|
|
18
|
+
7. 如有需要,查询知识库:\`cat .sillyspec/knowledge/INDEX.md 2>/dev/null\`
|
|
19
|
+
|
|
20
|
+
### 输出
|
|
21
|
+
任务理解 + 上下文摘要`,
|
|
22
|
+
outputHint: '任务理解',
|
|
23
|
+
optional: false
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: '实现并验证',
|
|
27
|
+
prompt: `实现任务。
|
|
28
|
+
|
|
29
|
+
### 操作
|
|
30
|
+
1. 先读后写:调用已有方法前 \`cat\` 源文件确认签名,\`grep\` 确认方法存在
|
|
31
|
+
2. 写代码完成任务
|
|
32
|
+
3. 如涉及逻辑变更,建议写单元测试验证(不强制,纯配置/文档/小改动可跳过)
|
|
33
|
+
4. **不要编译!** 除非用户明确要求或改动量很大
|
|
34
|
+
|
|
35
|
+
### 输出
|
|
36
|
+
实现摘要 + 修改文件列表
|
|
37
|
+
|
|
38
|
+
### 铁律
|
|
39
|
+
- 不要修改无关文件
|
|
40
|
+
- 不要编造不存在的 CLI 子命令
|
|
41
|
+
- **Reverse Sync**:如果发现 Bug 是 design.md 遗漏导致的,先修 design.md 再修代码`,
|
|
42
|
+
outputHint: '实现摘要',
|
|
43
|
+
optional: false
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: '暂存和记录',
|
|
47
|
+
prompt: `Git 暂存并记录任务。
|
|
48
|
+
|
|
49
|
+
### 操作
|
|
50
|
+
1. \`git add -A\` — **不要 commit**,由用户通过统一提交
|
|
51
|
+
2. 记录:
|
|
52
|
+
- 有 \`--change\`:在 \`.sillyspec/changes/<变更名>/tasks.md\` 追加 task 并勾选,记录精确到秒的时间戳
|
|
53
|
+
- 无 \`--change\`:记录到 \`.sillyspec/quicklog/QUICKLOG-<git用户名>.md\`(按 git 用户名隔离)
|
|
54
|
+
3. QUICKLOG 轮转:超过 500 行则重命名为 \`QUICKLOG-<USER>-YYYY-MM-DD.md\`
|
|
55
|
+
4. 如果发现项目特有的坑,追加到 \`.sillyspec/knowledge/uncategorized.md\`
|
|
56
|
+
5. 任务比预期复杂 → 建议用完整流程
|
|
57
|
+
|
|
58
|
+
### 输出
|
|
59
|
+
暂存确认 + 记录路径`,
|
|
60
|
+
outputHint: '暂存和记录确认',
|
|
61
|
+
optional: false
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
export const definition = {
|
|
2
|
+
name: 'scan',
|
|
3
|
+
title: '代码扫描',
|
|
4
|
+
description: '分析项目结构、约定和架构',
|
|
5
|
+
auxiliary: true,
|
|
6
|
+
steps: [
|
|
7
|
+
{
|
|
8
|
+
name: '检查已有扫描文档和子项目列表',
|
|
9
|
+
prompt: `检查已有扫描文档和子项目列表。
|
|
10
|
+
|
|
11
|
+
### 操作
|
|
12
|
+
1. \`ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .\` — 检查已有文档
|
|
13
|
+
1. \`ls .sillyspec/docs/*/scan/ 2>/dev/null\` — 检查已有文档
|
|
14
|
+
2. \`wc -l .sillyspec/docs/*/scan/*.md 2>/dev/null\` — 文档行数
|
|
15
|
+
3. 已有 3 份 → 建议升级深度扫描;已有 7 份 → 建议刷新或跳过
|
|
16
|
+
5. 显示子项目列表供选择扫描范围
|
|
17
|
+
|
|
18
|
+
### 输出
|
|
19
|
+
已有文档状态 + 扫描建议`,
|
|
20
|
+
outputHint: '工作区和文档状态',
|
|
21
|
+
optional: false
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: '构建环境探测',
|
|
25
|
+
prompt: `探测项目的构建环境和依赖。
|
|
26
|
+
|
|
27
|
+
### 操作
|
|
28
|
+
1. \`cat package.json pom.xml build.gradle go.mod Cargo.toml requirements.txt pyproject.toml Gemfile composer.json 2>/dev/null\`
|
|
29
|
+
2. \`find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null\`
|
|
30
|
+
3. 结果保存到 \`.sillyspec/docs/<project>/scan/_env-detect.md\`(临时文件,扫描完删除)
|
|
31
|
+
|
|
32
|
+
### 输出
|
|
33
|
+
环境探测结果摘要`,
|
|
34
|
+
outputHint: '环境探测摘要',
|
|
35
|
+
optional: false
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: '断点续扫检测',
|
|
39
|
+
prompt: `检测已有扫描文档,只生成缺失的。
|
|
40
|
+
|
|
41
|
+
### 操作
|
|
42
|
+
1. \`PROJECT=$(python3 -c "import sys,json; print(json.load(open('.sillyspec/.runtime/progress.json')).get('project',''))" 2>/dev/null || basename "$(pwd)")\`
|
|
43
|
+
2. 检查 7 份文档是否存在:ARCHITECTURE、STRUCTURE、CONVENTIONS、INTEGRATIONS、TESTING、CONCERNS、PROJECT
|
|
44
|
+
3. 列出已有 ✅ 和缺失 ⬜
|
|
45
|
+
4. 只生成缺失的文档
|
|
46
|
+
|
|
47
|
+
### 输出
|
|
48
|
+
已有/缺失文档列表`,
|
|
49
|
+
outputHint: '断点续扫状态',
|
|
50
|
+
optional: false
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: '深度扫描 — 技术架构',
|
|
54
|
+
prompt: `扫描技术栈 + 数据库 Schema + 架构模式。参考 _env-detect.md。
|
|
55
|
+
|
|
56
|
+
### 操作
|
|
57
|
+
1. 用 grep/rg 搜索(\`@Entity\`、\`schema.prisma\`、\`models.py\` 等),**禁止读源码全文**
|
|
58
|
+
2. Schema 只记表名+说明+字段数
|
|
59
|
+
3. 写入 \`.sillyspec/docs/<project>/scan/ARCHITECTURE.md\`
|
|
60
|
+
4. 包含 \`## 技术栈\` \`## 架构概览\` \`## 数据模型(摘要)\`
|
|
61
|
+
|
|
62
|
+
### 输出
|
|
63
|
+
ARCHITECTURE.md 路径
|
|
64
|
+
|
|
65
|
+
### 注意
|
|
66
|
+
- 路径用反引号,不编造`,
|
|
67
|
+
outputHint: 'ARCHITECTURE.md 路径',
|
|
68
|
+
optional: false
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: '深度扫描 — 代码约定',
|
|
72
|
+
prompt: `扫描框架隐形规则 + 实体继承 + 代码风格。参考 _env-detect.md。
|
|
73
|
+
|
|
74
|
+
### 操作
|
|
75
|
+
1. 用 grep 搜索拦截器/插件/逻辑删除/基类/审计字段,**禁止读源码全文**
|
|
76
|
+
2. 根据检测到的语言/框架自行决定搜索什么模式
|
|
77
|
+
3. 提取 3-5 个典型示例
|
|
78
|
+
4. 写入 \`.sillyspec/docs/<project>/scan/CONVENTIONS.md\`
|
|
79
|
+
5. 包含 \`## 框架隐形规则\` \`## 实体继承规范\` \`## 代码风格\`
|
|
80
|
+
|
|
81
|
+
### 输出
|
|
82
|
+
CONVENTIONS.md 路径
|
|
83
|
+
|
|
84
|
+
### 注意
|
|
85
|
+
- 路径用反引号,不编造`,
|
|
86
|
+
outputHint: 'CONVENTIONS.md 路径',
|
|
87
|
+
optional: false
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: '深度扫描 — 目录结构和集成',
|
|
91
|
+
prompt: `扫描目录结构 + 外部集成。参考 _env-detect.md。
|
|
92
|
+
|
|
93
|
+
### 操作
|
|
94
|
+
1. 用 find/ls/tree 和 grep,**禁止读源码全文**
|
|
95
|
+
2. 搜索 API 调用、MQ 配置、缓存、第三方 SDK
|
|
96
|
+
3. 写入 \`.sillyspec/docs/<project>/scan/STRUCTURE.md\`(目录树+模块说明)
|
|
97
|
+
4. 写入 \`.sillyspec/docs/<project>/scan/INTEGRATIONS.md\`(按类型分组)
|
|
98
|
+
|
|
99
|
+
### 输出
|
|
100
|
+
STRUCTURE.md 和 INTEGRATIONS.md 路径
|
|
101
|
+
|
|
102
|
+
### 注意
|
|
103
|
+
- 路径用反引号,不编造`,
|
|
104
|
+
outputHint: 'STRUCTURE.md + INTEGRATIONS.md 路径',
|
|
105
|
+
optional: false
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: '深度扫描 — 测试和债务',
|
|
109
|
+
prompt: `扫描测试现状 + 技术债务 + 项目概览。参考 _env-detect.md。
|
|
110
|
+
|
|
111
|
+
### 操作
|
|
112
|
+
1. 用 grep 搜索测试文件、TODO/FIXME、过时依赖,**禁止读源码全文**
|
|
113
|
+
2. 写入 \`.sillyspec/docs/<project>/scan/TESTING.md\`(测试结构)
|
|
114
|
+
3. 写入 \`.sillyspec/docs/<project>/scan/CONCERNS.md\`(按严重程度分组)
|
|
115
|
+
4. 写入 \`.sillyspec/docs/<project>/scan/PROJECT.md\`(项目信息)
|
|
116
|
+
|
|
117
|
+
### 输出
|
|
118
|
+
TESTING.md、CONCERNS.md、PROJECT.md 路径`,
|
|
119
|
+
outputHint: '三份文档路径',
|
|
120
|
+
optional: false
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: '自检和提交',
|
|
124
|
+
prompt: `验证扫描完整性,清理并提交。
|
|
125
|
+
|
|
126
|
+
### 操作
|
|
127
|
+
1. 检查 7 份文档是否全部生成
|
|
128
|
+
2. 自检门控:ARCHITECTURE(技术栈+Schema摘要)、CONVENTIONS(隐形规则+代码风格)、STRUCTURE(目录结构)、INTEGRATIONS(外部依赖)、TESTING(测试现状)、CONCERNS(技术债务)、PROJECT(项目概览)
|
|
129
|
+
3. 清理:\`rm -f .sillyspec/docs/<project>/scan/_env-detect.md\`
|
|
130
|
+
4. \`git add .\` — **不要 commit**,由用户通过统一提交工具处理
|
|
131
|
+
|
|
132
|
+
### 输出
|
|
133
|
+
扫描完整性报告
|
|
134
|
+
|
|
135
|
+
### 注意
|
|
136
|
+
- ❌ 修改代码 / 编造路径 / 读源码全文`,
|
|
137
|
+
outputHint: '自检报告',
|
|
138
|
+
optional: false
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
}
|