sillyspec 3.27.2 → 3.27.5
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-execute/SKILL.md +8 -0
- package/.claude/skills/sillyspec-quick/SKILL.md +2 -1
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-archive/SKILL.md +87 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-auto/SKILL.md +93 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-commit/SKILL.md +67 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-continue/SKILL.md +47 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-execute/SKILL.md +214 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-explore/SKILL.md +102 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-export/SKILL.md +57 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-init/SKILL.md +177 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-plan/SKILL.md +156 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-quick/SKILL.md +116 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-resume/SKILL.md +70 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-scan/SKILL.md +79 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-state/SKILL.md +64 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-status/SKILL.md +54 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-verify/SKILL.md +87 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
- package/.claude/worktrees/sillyspec-data-model-research/.gitattributes +2 -0
- package/.claude/worktrees/sillyspec-data-model-research/.husky/pre-push +20 -0
- package/.claude/worktrees/sillyspec-data-model-research/README.md +203 -0
- package/.claude/worktrees/sillyspec-data-model-research/SKILL.md +91 -0
- package/.claude/worktrees/sillyspec-data-model-research/bin/sillyspec.js +2 -0
- package/.claude/worktrees/sillyspec-data-model-research/logo.jpg +0 -0
- package/.claude/worktrees/sillyspec-data-model-research/package-lock.json +977 -0
- package/.claude/worktrees/sillyspec-data-model-research/package.json +39 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/favicon.jpg +0 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/index.html +16 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/logo.jpg +0 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/prototype-dashboard.html +836 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/prototype-overview.html +256 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/package.json +25 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/executor.js +95 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/index.js +679 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/parser.js +526 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/watcher.js +357 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/agent-session-log.js +803 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/change-list.js +290 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/change-risk-profile.js +270 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/check-primitives.js +65 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/classify-change.js +109 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/commit-suggest.js +202 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/config-cat.js +88 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/config-schema.js +328 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/constants.js +97 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/contract-matrix.js +480 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/datetime.js +20 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/db-engine.js +55 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/db.js +381 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/decision-distill.js +517 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/backends/local-agent.js +155 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/backends/sillyhub-mcp.js +245 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/probe.js +246 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/strategy.js +121 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/docs-check.js +825 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/docs-debt.js +393 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/docs-gate.js +107 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/doctor-diagnostics.js +1099 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/endpoint-extractor.js +420 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/foreign-declared.js +78 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/fs-atomic.js +73 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/git-helper.js +150 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/hooks/claude-pre-tool-use.cjs +130 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/hooks/worktree-guard.js +892 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/index.js +2798 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/init.js +626 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/knowledge-match.js +231 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/local-detect.js +128 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/local-register.js +104 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/machine-interface.js +543 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/migrate.js +127 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/module-impact.js +166 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/module-resolve.js +222 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/modules.js +580 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/change-registry.js +336 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/consistency-doctor.js +355 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/shared.js +36 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/stage-machine.js +594 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/step-store.js +265 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/progress.js +1304 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/quick-recommend.js +115 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/quicklog.js +852 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/review-tier.js +77 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/command.js +1595 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/complete-handlers.js +1552 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/complete.js +1259 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/concurrent-detect.js +156 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/gates.js +1084 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/multi-repo-context.js +208 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/next.js +128 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/prompt.js +843 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/quick-audit.js +186 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/scan-profile.js +269 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/shared.js +1562 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run/stage.js +584 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/run.js +23 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/scan-diff.js +388 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/scan-postcheck.js +512 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/scan-staleness.js +95 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/setup.js +414 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/sillyhub-mcp/client.js +597 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/sillyhub-mcp/config.js +62 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/spec-dir-typo.js +50 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/spec-sync.js +358 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract-engine.js +171 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract-spec.js +550 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract.js +889 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-review.js +597 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/archive.js +199 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/brainstorm-auto.js +236 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/brainstorm.js +617 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/cmd-existence.js +145 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/doctor.js +540 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/execute.js +1275 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/explore.js +43 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/index.js +29 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/knowledge.js +514 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/plan-postcheck.js +1344 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/plan.js +650 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/quick.js +167 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/scan.js +608 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/status.js +64 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/verify.js +246 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/sync.js +1470 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/task-review.js +1498 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/taskcard.js +210 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/verify-postcheck.js +1718 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/verify-probes.js +277 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/version.js +19 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/workflow.js +600 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/workspace.js +125 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/worktree-apply.js +1446 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/worktree-deps.js +576 -0
- package/.claude/worktrees/sillyspec-data-model-research/src/worktree.js +1715 -0
- package/.claude/worktrees/sillyspec-data-model-research/templates/claude-instruction.md +23 -0
- package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/taskcard-rules.md +28 -0
- package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/testcase-design.md +12 -0
- package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/verify-probes.md +32 -0
- package/.claude/worktrees/sillyspec-data-model-research/templates/workflows/archive-impact.yaml +79 -0
- package/.claude/worktrees/sillyspec-data-model-research/templates/workflows/scan-docs.yaml +132 -0
- package/eval/README.md +86 -0
- package/eval/eval.config.json +28 -0
- package/eval/lib/adapters/cli.mjs +63 -0
- package/eval/lib/adapters/dryrun.mjs +27 -0
- package/eval/lib/config.mjs +82 -0
- package/eval/lib/db.mjs +76 -0
- package/eval/lib/report.mjs +120 -0
- package/eval/lib/runner.mjs +157 -0
- package/eval/lib/tasks.mjs +73 -0
- package/eval/lib/util.mjs +107 -0
- package/eval/lib/workdir.mjs +30 -0
- package/eval/run.mjs +83 -0
- package/eval/tasks/001-slugify/files/package.json +6 -0
- package/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
- package/eval/tasks/001-slugify/task.json +6 -0
- package/eval/tasks/001-slugify/verify.mjs +28 -0
- package/eval/tasks/002-each-day/files/package.json +6 -0
- package/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
- package/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
- package/eval/tasks/002-each-day/task.json +6 -0
- package/eval/tasks/002-each-day/verify.mjs +31 -0
- package/eval/tasks/003-word-report/files/data/notes.txt +5 -0
- package/eval/tasks/003-word-report/files/package.json +6 -0
- package/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
- package/eval/tasks/003-word-report/task.json +6 -0
- package/eval/tasks/003-word-report/verify.mjs +38 -0
- package/package.json +4 -2
- package/src/agent-session-log.js +45 -5
- package/src/change-risk-profile.js +83 -14
- package/src/config-schema.js +18 -3
- package/src/contract-matrix.js +90 -29
- package/src/datetime.js +20 -0
- package/src/decision-distill.js +517 -0
- package/src/dispatch/backends/local-agent.js +4 -4
- package/src/docs-check.js +227 -0
- package/src/docs-debt.js +187 -24
- package/src/doctor-diagnostics.js +102 -2
- package/src/foreign-declared.js +78 -0
- package/src/index.js +89 -9
- package/src/init.js +9 -7
- package/src/knowledge-match.js +107 -6
- package/src/local-register.js +7 -1
- package/src/module-resolve.js +12 -1
- package/src/modules.js +2 -1
- package/src/plan-adopt-waves.js +126 -0
- package/src/quicklog.js +50 -4
- package/src/run/command.js +122 -43
- package/src/run/complete-handlers.js +48 -19
- package/src/run/complete.js +5 -2
- package/src/run/gates.js +87 -22
- package/src/run/prompt.js +84 -42
- package/src/run/quick-audit.js +11 -0
- package/src/run/shared.js +152 -10
- package/src/run.js +2 -2
- package/src/scan-postcheck.js +30 -17
- package/src/stage-contract-spec.js +2 -1
- package/src/stage-contract.js +68 -4
- package/src/stages/archive.js +53 -12
- package/src/stages/brainstorm-auto.js +7 -0
- package/src/stages/brainstorm.js +11 -0
- package/src/stages/doctor.js +157 -1
- package/src/stages/execute.js +32 -6
- package/src/stages/plan-postcheck.js +76 -17
- package/src/stages/plan.js +1 -0
- package/src/stages/quick.js +6 -1
- package/src/stages/verify.js +31 -14
- package/src/sync.js +41 -3
- package/src/task-review.js +2 -2
- package/src/taskcard-placeholders.js +21 -0
- package/src/taskcard.js +10 -1
- package/src/verify-postcheck.js +315 -13
- package/src/verify-probes.js +46 -4
- package/src/worktree-apply.js +184 -7
- package/src/worktree-deps.js +57 -0
- package/src/worktree.js +201 -58
- package/templates/prompts/taskcard-rules.md +1 -0
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
export const definition = {
|
|
2
|
+
name: 'scan',
|
|
3
|
+
title: '代码扫描',
|
|
4
|
+
description: '分析项目结构、约定和架构',
|
|
5
|
+
auxiliary: true,
|
|
6
|
+
steps: [
|
|
7
|
+
{
|
|
8
|
+
name: '探测项目结构并建议子项目',
|
|
9
|
+
prompt: `扫描项目顶层目录结构,自动发现可能的子项目,**需用户确认后才创建 projects 配置**。
|
|
10
|
+
|
|
11
|
+
### 操作
|
|
12
|
+
1. 列出项目顶层目录:\`ls -d */ 2>/dev/null | grep -v node_modules | grep -v '.git' | grep -v '.sillyspec'\`
|
|
13
|
+
2. 对每个顶层目录,快速判断是否为独立项目(检查 package.json / pom.xml / build.gradle / pyproject.toml / go.mod 等构建文件)
|
|
14
|
+
3. 对每个疑似独立项目,检测技术栈:\`cat <dir>/package.json 2>/dev/null | head -5\` 或类似
|
|
15
|
+
4. 对比 \`{PROJECTS_ROOT}/\` 已有配置,找出未注册的子项目
|
|
16
|
+
|
|
17
|
+
### 判断标准(满足任一即为子项目)
|
|
18
|
+
- 有独立的构建文件(package.json, pom.xml, build.gradle, pyproject.toml 等)
|
|
19
|
+
- 有独立的源码目录结构(src/, app/, lib/ 等)
|
|
20
|
+
- 有独立的测试目录(test/, tests/, __tests__/ 等)
|
|
21
|
+
- 不是 .git / node_modules / .sillyspec / dist / build 等工具目录
|
|
22
|
+
|
|
23
|
+
### 输出格式
|
|
24
|
+
列出发现的可能子项目列表,每个含:
|
|
25
|
+
- 目录名
|
|
26
|
+
- 技术栈(如 Next.js + TypeScript、FastAPI + Python)
|
|
27
|
+
- 是否已注册到 projects/
|
|
28
|
+
- 建议:注册 / 跳过
|
|
29
|
+
|
|
30
|
+
### ⛔ 红线
|
|
31
|
+
- **不要自动创建 projects 配置文件**,只列出建议供用户确认
|
|
32
|
+
- **不要修改任何文件**,只做探测和报告
|
|
33
|
+
|
|
34
|
+
### 输出
|
|
35
|
+
子项目建议列表(含技术栈和注册状态)`,
|
|
36
|
+
outputHint: '子项目建议列表',
|
|
37
|
+
optional: false
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: '构建扫描项目列表',
|
|
41
|
+
conditionalWait: true,
|
|
42
|
+
waitReason: '等待用户确认扫描项目列表',
|
|
43
|
+
waitOptions: ['全部重新扫描', '只补缺失', '跳过'],
|
|
44
|
+
prompt: `确定本次要扫描的项目列表。
|
|
45
|
+
|
|
46
|
+
### 操作
|
|
47
|
+
1. \`ls {PROJECTS_ROOT}/*.yaml 2>/dev/null\` — 列出所有已注册项目
|
|
48
|
+
2. 对每个项目,检查已有的 scan 文档状态:\`ls {DOCS_ROOT}/scan/*.md 2>/dev/null\`
|
|
49
|
+
3. 按以下格式展示:
|
|
50
|
+
|
|
51
|
+
\`\`\`
|
|
52
|
+
扫描项目列表:
|
|
53
|
+
1. sillyspec(主项目)— scan 文档:0/7 已存在
|
|
54
|
+
2. dashboard(子项目)— scan 文档:0/7 已存在
|
|
55
|
+
\`\`\`
|
|
56
|
+
|
|
57
|
+
4. **如果存在歧义(多项目且无法自动判定),必须暂停等待用户**:
|
|
58
|
+
- 选择要扫描的项目(默认全部)
|
|
59
|
+
- 每个项目的扫描策略:**重新扫描(全部覆盖)** / **只补扫描缺失的文档** / **跳过**
|
|
60
|
+
- 调用:\`sillyspec run scan --wait --reason "等待用户确认扫描项目列表" --options "全部重新扫描,只补缺失,跳过" --output "项目列表和策略建议"\`
|
|
61
|
+
5. **如果只有单一项目且已明确,正常完成即可,不需要等待。**
|
|
62
|
+
|
|
63
|
+
### ⛔ 重要
|
|
64
|
+
- **不要自行决定跳过**,有歧义时暂停等用户选择后再继续
|
|
65
|
+
- 最终确定的项目列表将用于后续所有步骤
|
|
66
|
+
- **后续每个需要生成文档的步骤,都必须对列表中的每个项目分别执行**
|
|
67
|
+
|
|
68
|
+
### 输出格式规范
|
|
69
|
+
--output 必须使用以下结构化格式之一(CLI 只解析这些格式,**不要输出自由文本列表**):
|
|
70
|
+
|
|
71
|
+
**格式 A:scan_projects YAML block**
|
|
72
|
+
在 --output 中输出:
|
|
73
|
+
scan_projects:
|
|
74
|
+
- id: backend
|
|
75
|
+
- id: frontend
|
|
76
|
+
- id: daemon
|
|
77
|
+
|
|
78
|
+
**格式 B:BEGIN_PROJECT_LIST 标记块**
|
|
79
|
+
在 --output 中输出:
|
|
80
|
+
BEGIN_PROJECT_LIST
|
|
81
|
+
- backend
|
|
82
|
+
- frontend
|
|
83
|
+
- daemon
|
|
84
|
+
END_PROJECT_LIST
|
|
85
|
+
|
|
86
|
+
如果不需要解析项目列表(如单项目已明确),--output 写普通摘要即可。`,
|
|
87
|
+
outputHint: '结构化项目列表(YAML block 或 BEGIN_PROJECT_LIST)',
|
|
88
|
+
optional: false
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: '构建环境探测',
|
|
92
|
+
perProject: true,
|
|
93
|
+
prompt: `探测当前项目的构建环境和依赖。
|
|
94
|
+
|
|
95
|
+
### 操作
|
|
96
|
+
对扫描列表中的每个项目重复以下操作:
|
|
97
|
+
1. 进入项目目录(子项目用其 path,如 \`packages/dashboard/\`)
|
|
98
|
+
2. \`cat package.json pom.xml build.gradle go.mod Cargo.toml requirements.txt pyproject.toml Gemfile composer.json 2>/dev/null\`
|
|
99
|
+
3. \`find <project-dir> -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null\`
|
|
100
|
+
4. 结果保存到 \`{DOCS_ROOT}/scan/_env-detect.md\`(临时文件,扫描完删除)
|
|
101
|
+
|
|
102
|
+
### 输出
|
|
103
|
+
每个项目的环境探测结果摘要`,
|
|
104
|
+
outputHint: '环境探测摘要',
|
|
105
|
+
optional: false
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: '断点续扫检测',
|
|
109
|
+
perProject: true,
|
|
110
|
+
prompt: `检测当前项目已有扫描文档,列出缺失的。
|
|
111
|
+
|
|
112
|
+
### 操作
|
|
113
|
+
对扫描列表中的每个项目分别执行:
|
|
114
|
+
1. 检查 7 份文档是否存在:ARCHITECTURE、STRUCTURE、CONVENTIONS、INTEGRATIONS、TESTING、CONCERNS、PROJECT
|
|
115
|
+
路径:\`{DOCS_ROOT}/scan/<DOC>.md\`
|
|
116
|
+
2. 列出已有 ✅ 和缺失 ⬜
|
|
117
|
+
|
|
118
|
+
### 输出
|
|
119
|
+
每个项目的已有/缺失文档列表`,
|
|
120
|
+
outputHint: '断点续扫状态',
|
|
121
|
+
optional: false
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: '深度扫描 — 7 份文档(子代理并行)',
|
|
125
|
+
perProject: true,
|
|
126
|
+
prompt: `按照 \`{WORKFLOWS_ROOT}/scan-docs.yaml\` 中定义的角色和检查规则,使用子代理并行生成当前项目的 7 份扫描文档。
|
|
127
|
+
|
|
128
|
+
**你必须使用子代理执行,不要自己写文档。**
|
|
129
|
+
**对扫描列表中的每个项目分别执行以下流程。**
|
|
130
|
+
|
|
131
|
+
### 操作
|
|
132
|
+
1. 读取 \`{WORKFLOWS_ROOT}/scan-docs.yaml\`,了解角色定义、输出要求和检查规则
|
|
133
|
+
2. 对每个项目(扫描列表中标记为需生成/覆盖的项目):
|
|
134
|
+
a. 将 \`<project>\` 替换为实际项目名,得到该项目的目标文件路径
|
|
135
|
+
b. 为每个角色启动独立子代理(可并行),每个子代理负责 1-2 份文档
|
|
136
|
+
c. 子代理的搜索范围限定在该项目目录内(子项目如 \`packages/dashboard/\`,不要搜索主项目源码)
|
|
137
|
+
d. 子代理直接用 grep/rg 搜索源码并写入文件,结果不回传到你的上下文
|
|
138
|
+
e. 等待该项目所有子代理完成后,验证文件是否生成且非空
|
|
139
|
+
f. 该项目完成后,继续下一个项目
|
|
140
|
+
3. 所有项目完成后,运行以下命令检查产物:
|
|
141
|
+
\`sillyspec workflow check scan-docs --project <project>\`(CLI 子命令,任意项目根可用)
|
|
142
|
+
对每个项目分别执行(将 \`<project>\` 替换为实际项目名)
|
|
143
|
+
4. 如果检查报告有失败项,按报告中的角色和文件重试失败的部分
|
|
144
|
+
|
|
145
|
+
### 覆盖保护
|
|
146
|
+
- **scan_depth: quick 的浅层文档允许覆盖升级**:读取旧 frontmatter 时,若旧文档含 scan_depth: quick(由 --quick 快速接入生成的浅层版本),即使其 source_commit 与当前 HEAD 一致、updated_at 未变,也允许覆盖重写——深度扫描的目的就是把它升级为完整文档。
|
|
147
|
+
- 生成每份 scan 文档时,frontmatter 必须包含:
|
|
148
|
+
\`\`\`yaml
|
|
149
|
+
---
|
|
150
|
+
author: <git 用户名(git config user.name 的输出,如 qinyi)>
|
|
151
|
+
created_at: <精确到秒的时间,如 2026-07-27 10:30:00>
|
|
152
|
+
source_commit: <git-head-short>
|
|
153
|
+
updated_at: <now-iso-datetime>
|
|
154
|
+
generator: sillyspec-scan
|
|
155
|
+
---
|
|
156
|
+
\`\`\`
|
|
157
|
+
(\`<git-head-short>\` / \`<now-iso-datetime>\` 两占位符由 CLI 注入 prompt 时自动替换为当前 HEAD 短哈希与时间——照 prompt 里已替换的真实值抄写,勿自跑 git rev-parse;漏 header 事后 \`sillyspec scan-fix-headers\` 一键补 author/created_at)
|
|
158
|
+
- 覆盖已有 scan 文档前先读取旧 frontmatter;如果旧文档的 \`source_commit\` 与当前 HEAD 不一致,或旧文档 \`updated_at\` 晚于本次 scan 开始时间,不要覆盖。
|
|
159
|
+
- 如果用户明确传入 \`--force-rescan\`,允许覆盖,但仍需写入新的 \`source_commit\` 和 \`updated_at\`。
|
|
160
|
+
|
|
161
|
+
### 子代理上下文注入
|
|
162
|
+
启动每个子代理前,将以下信息拼入子代理 prompt:
|
|
163
|
+
- 项目名(直接用实际项目名)
|
|
164
|
+
- 目标文件路径(从 workflow YAML 中 \`<project>\` 替换后的路径)
|
|
165
|
+
- 检查要求(从 workflow YAML 中该角色的 checks)
|
|
166
|
+
- 断点续扫步骤列出的缺失文档列表
|
|
167
|
+
- 环境探测结果摘要(如有 _env-detect.md,直接贴入)
|
|
168
|
+
- **⚠️ 必须强调:子代理必须用 write 工具将文件写入磁盘**
|
|
169
|
+
- **文件标题用中文**(sillyhub 平台解析识别用):frontmatter 必须在文件最前(第 1 行 --- 起),frontmatter 结束的 --- 之后空一行,再写 # 中文名(English)作为标题。严禁把 # 标题放到 frontmatter 之前(否则 frontmatter 不在头部、「检查产物完整性」步的 frontmatter 检查会报缺 author/created_at)。各文档标准标题格式:
|
|
170
|
+
- STRUCTURE.md = # 目录结构(Structure)
|
|
171
|
+
- CONVENTIONS.md = # 代码约定(Conventions)
|
|
172
|
+
- ARCHITECTURE.md = # 架构(Architecture)
|
|
173
|
+
- TESTING.md = # 测试(Testing)
|
|
174
|
+
- CONCERNS.md = # 关注点(Concerns)
|
|
175
|
+
- INTEGRATIONS.md = # 集成(Integrations)
|
|
176
|
+
- PROJECT.md = # 项目(Project)
|
|
177
|
+
|
|
178
|
+
### 完成后
|
|
179
|
+
列出每个项目的 7 份文档状态:
|
|
180
|
+
- ✅ ARCHITECTURE.md / ❌ 缺失
|
|
181
|
+
- ✅ CONVENTIONS.md / ❌ 缺失
|
|
182
|
+
- ...`,
|
|
183
|
+
outputHint: '7 份文档生成状态(含 workflow 检查报告)',
|
|
184
|
+
optional: false
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: '生成本地配置',
|
|
188
|
+
prompt: `自动生成 local.yaml 本地配置文件。
|
|
189
|
+
|
|
190
|
+
### 操作
|
|
191
|
+
1. 检查 {SPEC_ROOT}/local.yaml 是否已存在,已存在则跳过(提示"local.yaml 已存在,跳过生成")
|
|
192
|
+
2. 调用 \`sillyspec local detect\` 命令生成 local.yaml(该命令封装了纯 fs 项目类型嗅探:package.json→nodejs / pom.xml→maven / build.gradle→gradle / Makefile→make / 否则 generic,对应默认 commands)。**不要自行嗅探 package.json/pom.xml/build.gradle 等文件**——探测逻辑唯一归属 local-detect.js,本步骤只负责调用命令并报告结果。
|
|
193
|
+
3. 该命令内部已处理:确保目录存在(mkdir -p)、已存在则跳过、原子写入(先写 tmp 再 rename)。
|
|
194
|
+
4. 报告生成的 project.type 与 local.yaml 路径。
|
|
195
|
+
5. **detect 只生成 \`project.type\` / \`commands.{build,test,lint}\`(存在性核验驱动)/ \`test_strategy\` 骨架**,以下策略字段由你(agent)按项目实际情况补充——能在 package.json / lockfile / 构建文件 / CI 配置 / README 中找到依据就填,不确定留空或注释:
|
|
196
|
+
- \`commands.install\`:依赖安装命令(如 \`npm install\` / \`pnpm install\` / \`yarn\`)
|
|
197
|
+
- \`env\`:构建/测试所需环境变量键值(仅从 README / CI 配置 / .env.example 能确证的)
|
|
198
|
+
- \`test_strategy\`:detect 未注入时按项目实际补(full=全量 / module=只测变更模块 / skip=跳过测试)
|
|
199
|
+
- \`modules\`:模块路径根(module_paths,如 \`src/\` / \`packages/\`)
|
|
200
|
+
- \`known_failures\`:已知失败/不稳定测试清单(仅从 CI 历史 / 测试注释能确证的)
|
|
201
|
+
|
|
202
|
+
### platform / dispatch / mcp 段检查(FR-08,可选补充)
|
|
203
|
+
detect 不写这三段,由你按项目是否接入 sillyhub 平台决定是否补:
|
|
204
|
+
- **platform 段缺失**(要接入 sillyhub 平台)→ 运行 \`sillyspec platform connect <url> <token>\` 自动写入(推荐)
|
|
205
|
+
- **dispatch 段调参缺失**(启用 sillyhub 派发且需调优)→ 手填示例 \`probe_ttl_ms\` / \`poll_interval_ms\` / \`worker_timeout_ms\`(仅在你确知调优值时填,否则留默认)
|
|
206
|
+
- **mcp 段缺失**(dispatch worker 走 MCP 协议连 sillyhub)→ 优先 \`sillyspec platform connect\`(同源假设,platform+mcp 同写);不同源则手填 \`mcp.url\` / \`mcp.token\`,或设环境变量 \`SILLYHUB_MCP_URL\` / \`SILLYHUB_MCP_TOKEN\`(不入盘)
|
|
207
|
+
|
|
208
|
+
### ⛔ 铁律(R-04,防编造)
|
|
209
|
+
只写能从 package.json / lockfile / 构建文件 / CI 配置 / README 中确证的事实。不确定的字段一律留空或写注释占位,**绝不编造命令、路径或凭据**。commands 键的存在性已由 detect 核验,不要重复核验。
|
|
210
|
+
|
|
211
|
+
### 输出格式参考(detect 自动产出骨架 + agent 补充策略字段)
|
|
212
|
+
\`\`\`yaml
|
|
213
|
+
# SillySpec 本地配置(自动生成,可手动修改)
|
|
214
|
+
project:
|
|
215
|
+
type: nodejs # nodejs/maven/gradle/make/generic
|
|
216
|
+
|
|
217
|
+
# commands 键存在性由 detect 核验 package.json scripts 驱动:
|
|
218
|
+
# 有 scripts.build 才写 build,有 scripts.test 才写 test,有 scripts.lint 才写 lint
|
|
219
|
+
# (仅 test/lint 无 build 的项目,build 键不写)
|
|
220
|
+
commands:
|
|
221
|
+
build: "npm run build" # 仅 scripts.build 存在时由 detect 写入
|
|
222
|
+
test: "npm test"
|
|
223
|
+
lint: "npm run lint"
|
|
224
|
+
# install: "npm install" # ← agent 补:依赖安装命令
|
|
225
|
+
|
|
226
|
+
# 测试策略:full=全量测试, module=只测变更模块, skip=跳过测试
|
|
227
|
+
test_strategy: module
|
|
228
|
+
|
|
229
|
+
# ↓ 以下为 agent 按项目实际补充的策略字段(不确定留空或注释)
|
|
230
|
+
# env: # ← agent 补:构建/测试所需环境变量
|
|
231
|
+
# NODE_ENV: test
|
|
232
|
+
# modules: # ← agent 补:模块路径根(module_paths)
|
|
233
|
+
# - src/
|
|
234
|
+
# known_failures: # ← agent 补:已知失败/不稳定测试
|
|
235
|
+
# - "test/flaky.test.mjs"
|
|
236
|
+
|
|
237
|
+
# ↓ 外部连接段(接入 sillyhub 平台时补,detect 不写)
|
|
238
|
+
# platform: # ← sillyspec platform connect <url> <token> 写入
|
|
239
|
+
# url: ...
|
|
240
|
+
# token: ...
|
|
241
|
+
# mcp: # ← platform connect 同源写入 或 手填 或 env(SILLYHUB_MCP_URL/TOKEN)
|
|
242
|
+
# url: ...
|
|
243
|
+
# token: ...
|
|
244
|
+
# dispatch: # ← agent 按需调参(确知调优值才填)
|
|
245
|
+
# probe_ttl_ms: 30000
|
|
246
|
+
# poll_interval_ms: 2000
|
|
247
|
+
# worker_timeout_ms: 60000
|
|
248
|
+
\`\`\`
|
|
249
|
+
|
|
250
|
+
### 输出
|
|
251
|
+
local.yaml 生成结果(已存在/已生成 + project.type + agent 补充的策略字段摘要)`,
|
|
252
|
+
outputHint: 'local.yaml 生成状态',
|
|
253
|
+
optional: false
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
name: '生成模块映射',
|
|
257
|
+
perProject: true,
|
|
258
|
+
prompt: `生成当前项目的模块索引文件 \`_module-map.yaml\`。
|
|
259
|
+
|
|
260
|
+
### ⚠️ 重要:这个文件是唯一的结构化索引源
|
|
261
|
+
所有结构化事实(paths/tags/entrypoints/depends_on/used_by)只维护在这个文件里。
|
|
262
|
+
模块卡片(modules/*.md)只负责人类语义说明,不重复索引信息。
|
|
263
|
+
|
|
264
|
+
### 操作
|
|
265
|
+
对扫描列表中的每个项目分别执行:
|
|
266
|
+
1. 检查 \`{DOCS_ROOT}/modules/_module-map.yaml\` 是否已存在,已存在则跳过
|
|
267
|
+
2. 分析项目源码目录结构,识别模块划分:
|
|
268
|
+
- 用 \`find . -maxdepth 3 -type d -not -path "*/node_modules/*" -not -path "*/.git/*"\` 查看目录结构
|
|
269
|
+
- 每个有明确职责的独立目录识别为一个模块
|
|
270
|
+
- 路径用 glob 模式
|
|
271
|
+
3. 用 grep/rg 分析每个模块:
|
|
272
|
+
- \`main_symbols\`:模块导出的主要函数/类/常量(grep export / module.exports / def / class)
|
|
273
|
+
- \`entrypoints\`:对外 API 端点或命令入口(grep route / router / @Controller / @GetMapping 等)
|
|
274
|
+
- \`tags\`:模块相关关键词标签
|
|
275
|
+
- \`aliases\`:模块的别名(其他开发者可能怎么称呼这个模块)
|
|
276
|
+
4. 分析跨模块依赖关系:
|
|
277
|
+
- 用 grep import/require 分析模块间的引用链
|
|
278
|
+
- 填充 depends_on(本模块依赖谁)和 used_by(谁依赖本模块)
|
|
279
|
+
5. 生成 \`{DOCS_ROOT}/modules/_module-map.yaml\`
|
|
280
|
+
6. 如果 modules/ 目录不存在,先创建
|
|
281
|
+
7. 原子写入(先写 tmp 文件再 rename)
|
|
282
|
+
|
|
283
|
+
### YAML 格式
|
|
284
|
+
\`\`\`yaml
|
|
285
|
+
schema_version: 2
|
|
286
|
+
project: <project-name>
|
|
287
|
+
source_commit: <git-head-short>
|
|
288
|
+
generated_at: <now-datetime>
|
|
289
|
+
generator: sillyspec-scan
|
|
290
|
+
|
|
291
|
+
modules:
|
|
292
|
+
<module-id>:
|
|
293
|
+
status: active
|
|
294
|
+
doc: modules/<module-id>.md
|
|
295
|
+
paths:
|
|
296
|
+
- <glob-pattern>
|
|
297
|
+
tags:
|
|
298
|
+
- <tag1>
|
|
299
|
+
- <tag2>
|
|
300
|
+
aliases:
|
|
301
|
+
- <alias1>
|
|
302
|
+
entrypoints:
|
|
303
|
+
- <exported-symbol-or-api-endpoint>
|
|
304
|
+
main_symbols:
|
|
305
|
+
- <exported-class-or-function>
|
|
306
|
+
depends_on:
|
|
307
|
+
- <other-module-id>
|
|
308
|
+
used_by:
|
|
309
|
+
- <other-module-id>
|
|
310
|
+
needs_review: false
|
|
311
|
+
concerns: []
|
|
312
|
+
review_reasons: []
|
|
313
|
+
\`\`\`
|
|
314
|
+
|
|
315
|
+
### 示例
|
|
316
|
+
\`\`\`yaml
|
|
317
|
+
schema_version: 2
|
|
318
|
+
project: multi-agent-platform
|
|
319
|
+
source_commit: abc1234
|
|
320
|
+
generated_at: 2026-06-02 22:00:00
|
|
321
|
+
generator: sillyspec-scan
|
|
322
|
+
|
|
323
|
+
modules:
|
|
324
|
+
auth-service:
|
|
325
|
+
status: active
|
|
326
|
+
doc: modules/auth-service.md
|
|
327
|
+
paths:
|
|
328
|
+
- src/modules/auth/**
|
|
329
|
+
- src/middleware/auth.js
|
|
330
|
+
tags:
|
|
331
|
+
- auth
|
|
332
|
+
- jwt
|
|
333
|
+
- rbac
|
|
334
|
+
- middleware
|
|
335
|
+
aliases:
|
|
336
|
+
- login
|
|
337
|
+
- token
|
|
338
|
+
- authentication
|
|
339
|
+
entrypoints:
|
|
340
|
+
- authenticate
|
|
341
|
+
- authorize
|
|
342
|
+
- signToken
|
|
343
|
+
- refreshToken
|
|
344
|
+
main_symbols:
|
|
345
|
+
- AuthService
|
|
346
|
+
- AuthController
|
|
347
|
+
- hashPassword
|
|
348
|
+
- verifyPassword
|
|
349
|
+
depends_on:
|
|
350
|
+
- users
|
|
351
|
+
- redis
|
|
352
|
+
used_by:
|
|
353
|
+
- api-routes
|
|
354
|
+
- admin-routes
|
|
355
|
+
needs_review: false
|
|
356
|
+
concerns: []
|
|
357
|
+
review_reasons: []
|
|
358
|
+
\`\`\`
|
|
359
|
+
|
|
360
|
+
### 关键规则
|
|
361
|
+
- module-id 用 kebab-case(如 auth-service)
|
|
362
|
+
- depends_on / used_by 引用其他模块的 module-id
|
|
363
|
+
- tags 和 aliases 用于 brainstorm 阶段的需求→模块匹配,尽量覆盖开发者可能用的词
|
|
364
|
+
- entrypoints 和 main_symbols 用于 execute 阶段快速定位源码
|
|
365
|
+
- 不要编造无法从源码 grep 到的符号
|
|
366
|
+
- 如果无法确定依赖关系,depends_on/used_by 留空列表,不要猜
|
|
367
|
+
|
|
368
|
+
### 输出
|
|
369
|
+
_module-map.yaml 生成结果(已存在/已生成/模块列表)`,
|
|
370
|
+
outputHint: '_module-map.yaml 生成状态',
|
|
371
|
+
optional: true
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
name: '生成模块卡片文档',
|
|
375
|
+
perProject: true,
|
|
376
|
+
conditionalWait: true,
|
|
377
|
+
waitReason: '检测到已有模块文档覆盖风险',
|
|
378
|
+
waitOptions: ['只生成缺失', '全部重新生成', '跳过'],
|
|
379
|
+
prompt: `根据当前项目的 \`_module-map.yaml\` 生成模块卡片文档。
|
|
380
|
+
|
|
381
|
+
### ⚠️ 重要:模块卡片只负责人类语义说明
|
|
382
|
+
结构化索引(paths/tags/entrypoints/depends_on/used_by)已经在 _module-map.yaml 里维护。
|
|
383
|
+
卡片里不要重复这些信息,只写 _module-map.yaml 无法表达的语义内容。
|
|
384
|
+
|
|
385
|
+
### 操作
|
|
386
|
+
对扫描列表中的每个项目分别执行:
|
|
387
|
+
1. 读取 \`{DOCS_ROOT}/modules/_module-map.yaml\`,获取模块列表和路径
|
|
388
|
+
2. 检查 \`{DOCS_ROOT}/modules/\` 下已有的模块文档(<module>.md)
|
|
389
|
+
3. 列出每个模块的状态:已有文档 / 缺失
|
|
390
|
+
4. **如果有覆盖风险(已有模块文档会被覆盖),必须暂停等待用户**:
|
|
391
|
+
- 展示模块列表及现有文档状态
|
|
392
|
+
- 明确提供选项:**为缺失模块生成初始文档** / **全部重新生成(覆盖已有)** / **跳过**
|
|
393
|
+
- 调用:\`sillyspec run scan --wait --reason "检测到已有模块文档覆盖风险" --options "只生成缺失,全部重新生成,跳过" --output "受影响模块列表"\`
|
|
394
|
+
5. **如果没有覆盖风险(全部都是缺失模块),正常完成即可,不需要等待。**
|
|
395
|
+
|
|
396
|
+
### 生成方法(子代理并行,只针对用户选中的模块)
|
|
397
|
+
**你必须为每个模块启动独立子代理执行,不要自己写文档。**
|
|
398
|
+
|
|
399
|
+
每个子代理的 prompt(**主 agent 启动前必须拼入**):
|
|
400
|
+
- 模块名和路径(从 _module-map.yaml 读取)
|
|
401
|
+
- 环境探测结果摘要(构建工具、语言框架)
|
|
402
|
+
- scan 文档关键信息摘要(ARCHITECTURE.md 的技术栈、CONVENTIONS.md 的代码风格要点,如已生成)
|
|
403
|
+
\`\`\`
|
|
404
|
+
模块名:<module-id>
|
|
405
|
+
模块路径:<glob patterns>
|
|
406
|
+
目标文件:{DOCS_ROOT}/modules/<module-id>.md
|
|
407
|
+
|
|
408
|
+
操作:
|
|
409
|
+
1. 用 grep/rg 搜索模块路径范围内的源码(禁止读源码全文)
|
|
410
|
+
2. 提取:模块职责、对外接口、关键逻辑、注意事项
|
|
411
|
+
3. 按以下模板写入目标文件:
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
schema_version: 1
|
|
415
|
+
doc_type: module-card
|
|
416
|
+
module_id: <module-id>
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
# <中文名>(<module-id>)
|
|
420
|
+
|
|
421
|
+
## 定位
|
|
422
|
+
(负责什么,不负责什么 — 明确边界)
|
|
423
|
+
|
|
424
|
+
## 契约摘要
|
|
425
|
+
(核心能力列表,具体导出符号以 _module-map.yaml 的 entrypoints/main_symbols 为准)
|
|
426
|
+
|
|
427
|
+
## 关键逻辑
|
|
428
|
+
(最核心的流程摘要,用 text 伪代码,不超过 3-5 行)
|
|
429
|
+
|
|
430
|
+
## 注意事项
|
|
431
|
+
(维护提醒、已知限制、修改时需同步检查的模块)
|
|
432
|
+
|
|
433
|
+
## 人工备注
|
|
434
|
+
|
|
435
|
+
<!-- MANUAL_NOTES_START -->
|
|
436
|
+
|
|
437
|
+
<!-- MANUAL_NOTES_END -->
|
|
438
|
+
|
|
439
|
+
规则:
|
|
440
|
+
- 不要编造接口或依赖,只写 grep/rg 能搜到的
|
|
441
|
+
- 一级标题格式 \`# <中文名>(<module-id>)\`:中文名从模块职责提炼 2-8 字(如 认证与令牌、变更中心),括号内保留 module-id 原样——sillyhub 平台解析识别用
|
|
442
|
+
- 目标长度:500-1000 字 / 80-150 行
|
|
443
|
+
- 如果模块特别复杂(状态机、多角色交互、复杂领域规则),可以在 modules/details/ 下生成扩展文档(如 details/<module-id>-flow.md),agent 默认不读
|
|
444
|
+
- 不要重复 _module-map.yaml 中的索引信息
|
|
445
|
+
- 不要写设计决策表、完整依赖表、变更索引长表
|
|
446
|
+
- 人工备注区域保持空标记,留给用户填写
|
|
447
|
+
\`\`\`
|
|
448
|
+
|
|
449
|
+
等待所有子代理完成,验证文件是否生成且非空。
|
|
450
|
+
|
|
451
|
+
### 输出
|
|
452
|
+
已生成的模块文档路径列表`,
|
|
453
|
+
outputHint: '模块文档生成状态',
|
|
454
|
+
optional: true
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
name: '生成业务流程和术语表(可选)',
|
|
458
|
+
perProject: true,
|
|
459
|
+
prompt: `根据当前项目的模块依赖关系和源码,生成跨模块业务流程文档和术语表。
|
|
460
|
+
|
|
461
|
+
⚠️ 这一步是可选的。如果项目模块简单、流程不明显,可以跳过。
|
|
462
|
+
|
|
463
|
+
### flows/ 目录
|
|
464
|
+
目标目录:\`{DOCS_ROOT}/flows/\`
|
|
465
|
+
|
|
466
|
+
根据 _module-map.yaml 中的模块依赖关系,识别跨模块业务流程:
|
|
467
|
+
1. 读取 \`_module-map.yaml\`,分析 used_by 链条
|
|
468
|
+
2. 用 grep/rg 搜索路由定义、API 端点、事件处理
|
|
469
|
+
3. 识别跨模块的完整业务流程(如登录→下单→支付)
|
|
470
|
+
4. 每个流程生成一个文件:\`flows/<flow-name>.md\`
|
|
471
|
+
|
|
472
|
+
文件格式:
|
|
473
|
+
\`\`\`markdown
|
|
474
|
+
# <flow-name>
|
|
475
|
+
|
|
476
|
+
## 目标
|
|
477
|
+
(一句话描述这个流程的业务目的)
|
|
478
|
+
|
|
479
|
+
## 参与模块
|
|
480
|
+
- module-a:做什么
|
|
481
|
+
- module-b:做什么
|
|
482
|
+
|
|
483
|
+
## 流程摘要
|
|
484
|
+
\`\`\`text
|
|
485
|
+
step1 → step2 → step3
|
|
486
|
+
\`\`\`
|
|
487
|
+
|
|
488
|
+
## 失败回滚
|
|
489
|
+
| 失败点 | 处理 |
|
|
490
|
+
|---|---|
|
|
491
|
+
\`\`\`
|
|
492
|
+
|
|
493
|
+
### glossary.md
|
|
494
|
+
目标文件:\`{DOCS_ROOT}/glossary.md\`
|
|
495
|
+
|
|
496
|
+
提取项目专有术语:
|
|
497
|
+
1. 用 grep 搜索 TODO/FIXME 注释中的术语定义
|
|
498
|
+
2. 从数据库表注释提取
|
|
499
|
+
3. 从 README 和文档中提取定义段落
|
|
500
|
+
|
|
501
|
+
文件格式:
|
|
502
|
+
\`\`\`markdown
|
|
503
|
+
# 术语表(Glossary)
|
|
504
|
+
|
|
505
|
+
## Session
|
|
506
|
+
在本项目中,session 指...(项目内特殊含义)
|
|
507
|
+
|
|
508
|
+
## Order
|
|
509
|
+
订单主实体,代表...(业务定义)
|
|
510
|
+
\`\`\`
|
|
511
|
+
|
|
512
|
+
### 操作
|
|
513
|
+
1. 分析模块依赖关系,识别可能的业务流程
|
|
514
|
+
2. 如果发现 2+ 个跨模块流程,生成 flows/ 文档
|
|
515
|
+
3. 提取术语生成 glossary.md
|
|
516
|
+
4. 如果没有明显的流程或术语,跳过此步
|
|
517
|
+
|
|
518
|
+
### 输出
|
|
519
|
+
生成的文件路径列表(或"已跳过")`,
|
|
520
|
+
outputHint: '流程和术语表生成状态',
|
|
521
|
+
optional: true
|
|
522
|
+
},
|
|
523
|
+
{
|
|
524
|
+
name: 'Extract Project Knowledge',
|
|
525
|
+
perProject: true,
|
|
526
|
+
prompt: `从本次 scan 产物中提取长期有效、跨变更复用的项目知识,写入知识库。
|
|
527
|
+
|
|
528
|
+
### 知识分类
|
|
529
|
+
| 文件 | 内容 |
|
|
530
|
+
|------|------|
|
|
531
|
+
| conventions.md | 项目约定:目录规范、命名规范、提交规范、测试规范 |
|
|
532
|
+
| patterns.md | 可复用模式:鉴权方式、错误处理方式、模块组织方式 |
|
|
533
|
+
| known-issues.md | 已知坑:不可直接改的模块、历史兼容问题、代理限制 |
|
|
534
|
+
| uncategorized.md | 不确定分类、需要人工确认的知识 |
|
|
535
|
+
|
|
536
|
+
INDEX.md 维护索引,格式(每行:关键词1|关键词2 → [条目名](文件#锚点);关键词用于 execute 阶段命中匹配,必须给出能区分该知识的词):
|
|
537
|
+
\`\`\`markdown
|
|
538
|
+
# 知识索引(Knowledge Index)
|
|
539
|
+
|
|
540
|
+
## 约定(Conventions)
|
|
541
|
+
- ESM|module|import → [ESM Only](conventions.md#esm-only)
|
|
542
|
+
\`\`\`
|
|
543
|
+
|
|
544
|
+
### ⛔ 硬规则(必须遵守)
|
|
545
|
+
1. **只写未来变更会反复用到的知识** — 不要把 scan 报告摘要塞进知识库
|
|
546
|
+
2. **不要重复 knowledge 文件中已有的内容** — 读取现有文件,追加新条目,不覆盖
|
|
547
|
+
3. **不确定分类或不确定长期有效 → uncategorized.md** — 宁可不确定也不要放错
|
|
548
|
+
4. **每个正式分类条目必须更新 INDEX.md** — 添加对应分类下的链接
|
|
549
|
+
5. **每个条目用 markdown 锚点格式** — 文件内用 \`## 标题\`,INDEX 用 \`[#标题]\` 或 \`(文件名#标题)\`
|
|
550
|
+
6. **knowledge 文件标题用中文**(sillyhub 平台解析识别用):conventions.md 第一行 # 项目约定(Conventions)、patterns.md = # 复用模式(Patterns)、known-issues.md = # 已知问题(Known Issues)、uncategorized.md = # 未分类知识(Uncategorized)、INDEX.md 见模板(知识索引)
|
|
551
|
+
|
|
552
|
+
### 操作
|
|
553
|
+
1. 读取现有 knowledge 文件:\`{KNOWLEDGE_ROOT}/INDEX.md\`、\`{KNOWLEDGE_ROOT}/conventions.md\` 等
|
|
554
|
+
2. 遍历 scan 产物(\`{DOCS_ROOT}/scan/*.md\`、\`{DOCS_ROOT}/modules/*.md\`),识别可复用知识
|
|
555
|
+
3. 将新知识按分类写入对应文件(追加模式,不覆盖已有内容)
|
|
556
|
+
4. 更新 INDEX.md 索引
|
|
557
|
+
5. 如果确实没有新知识可提取(已有文件已覆盖),输出"无新知识"而非创建空条目
|
|
558
|
+
|
|
559
|
+
### 输出
|
|
560
|
+
新增知识条目数量 + 分类分布(或"无新知识")`,
|
|
561
|
+
outputHint: '知识条目数量',
|
|
562
|
+
optional: false
|
|
563
|
+
},
|
|
564
|
+
{
|
|
565
|
+
name: '自检和提交',
|
|
566
|
+
perProject: true,
|
|
567
|
+
prompt: `验证当前项目的扫描完整性,清理并提交。
|
|
568
|
+
|
|
569
|
+
### 操作
|
|
570
|
+
对扫描列表中的每个项目分别执行:
|
|
571
|
+
1. 检查 7 份 scan 文档是否全部生成(\`{DOCS_ROOT}/scan/\`)
|
|
572
|
+
2. 检查模块文档状态(\`{DOCS_ROOT}/modules/\`)
|
|
573
|
+
3. 自检门控:ARCHITECTURE(技术栈+Schema摘要)、CONVENTIONS(隐形规则+代码风格)、STRUCTURE(目录结构)、INTEGRATIONS(外部依赖)、TESTING(测试现状)、CONCERNS(技术债务)、PROJECT(项目概览)
|
|
574
|
+
4. 检查 flows/ 和 glossary.md 是否已生成(如有)
|
|
575
|
+
5. 清理:\`rm -f {DOCS_ROOT}/scan/_env-detect.md\`
|
|
576
|
+
6. 如果非平台模式:\`git add {DOCS_ROOT}/ {KNOWLEDGE_ROOT}/\` — 暂存本次扫描产物(scan 文档 / 模块文档 / flows / glossary / knowledge;勿用 .sillyspec/ 整目录——会裹挟 changes/ 下其他活跃变更;不要 commit,由用户通过统一提交工具处理)。如果平台模式:跳过 git add(specRoot 不在 sourceRoot 的 git repo 内)。
|
|
577
|
+
|
|
578
|
+
### ⛔ 路径合规检查(平台模式下必须执行)
|
|
579
|
+
7. 确认所有文档都写入 \`{DOCS_ROOT}/\`(spec-root 下),**而非源码目录下的 .sillyspec/**
|
|
580
|
+
8. 检查是否出现 tool_use_error 或 API Error 未恢复
|
|
581
|
+
9. 检查 7 份文档 header 是否包含 author 和 created_at
|
|
582
|
+
10. 复查 detect 核验结果——commands 键已由 detect 核验 scripts 存在性,agent 无需重复核验或标 unavailable,仅确认 local.yaml 与 detect 产出一致
|
|
583
|
+
|
|
584
|
+
### ⛔ API 错误处理
|
|
585
|
+
- 遇到 API Error 529(服务过载)或 rate_limit 时,**停止当前操作并报告**,不要自动重试
|
|
586
|
+
- 遇到 tool_use_error 时,记录错误信息并跳过该文件/操作,继续处理下一项
|
|
587
|
+
- 如果连续 3 次操作失败,输出失败摘要并停止
|
|
588
|
+
|
|
589
|
+
### ⛔ 最终状态判定
|
|
590
|
+
如果出现以下**任意**情况,最终状态**不能**写"全部通过",只能写 \`completed_with_warnings\` 或 \`failed_post_check\`:
|
|
591
|
+
- 源码目录下存在 docs(路径合规检查失败)
|
|
592
|
+
- source_commit 为 null
|
|
593
|
+
- Write 工具出现过失败
|
|
594
|
+
- API Error 529 或 rate_limit
|
|
595
|
+
- fallback / retry / skipped validation
|
|
596
|
+
- 文档引用不存在的文件或模块
|
|
597
|
+
- 文档内容包含 .sillyspec/ 等工具目录的扫描结果
|
|
598
|
+
|
|
599
|
+
### 输出
|
|
600
|
+
每个项目的扫描完整性报告(必须包含路径合规检查结果和最终状态)
|
|
601
|
+
|
|
602
|
+
### 注意
|
|
603
|
+
- ❌ 修改代码 / 编造路径 / 读源码全文`,
|
|
604
|
+
outputHint: '自检报告',
|
|
605
|
+
optional: false
|
|
606
|
+
}
|
|
607
|
+
]
|
|
608
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export const definition = {
|
|
2
|
+
name: 'status',
|
|
3
|
+
title: '项目快照',
|
|
4
|
+
description: '项目级只读快照(非流程推进)。查「下一步该做什么/当前阶段进度」请用 sillyspec progress show,勿混淆。',
|
|
5
|
+
auxiliary: true,
|
|
6
|
+
steps: [
|
|
7
|
+
{
|
|
8
|
+
name: '项目基础信息',
|
|
9
|
+
prompt: `收集项目基础信息。
|
|
10
|
+
|
|
11
|
+
### 操作
|
|
12
|
+
1. \`cat .sillyspec/docs/*/scan/PROJECT.md 2>/dev/null | head -20 || echo "未初始化"\`
|
|
13
|
+
2. 获取 project 名
|
|
14
|
+
3. \`ls .sillyspec/docs/<project>/scan/ 2>/dev/null | head -10\`
|
|
15
|
+
4. \`cat .sillyspec/REQUIREMENTS.md 2>/dev/null | head -20\`
|
|
16
|
+
5. \`cat .sillyspec/ROADMAP.md 2>/dev/null\`
|
|
17
|
+
|
|
18
|
+
### 输出
|
|
19
|
+
项目基础信息摘要`,
|
|
20
|
+
outputHint: '项目基础信息',
|
|
21
|
+
optional: false
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: '变更状态',
|
|
25
|
+
prompt: `检查进行中的变更和归档历史。
|
|
26
|
+
|
|
27
|
+
### 操作
|
|
28
|
+
1. \`ls .sillyspec/changes/ 2>/dev/null | grep -v archive\`
|
|
29
|
+
2. 对每个进行中的变更:检查 proposal.md ✅/❌、design.md ✅/❌、requirements.md ✅/❌、tasks.md — X/Y 完成
|
|
30
|
+
3. \`ls .sillyspec/changes/archive/ 2>/dev/null | wc -l\`
|
|
31
|
+
|
|
32
|
+
### 输出
|
|
33
|
+
变更状态列表`,
|
|
34
|
+
outputHint: '变更状态',
|
|
35
|
+
optional: false
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: '输出状态报告',
|
|
39
|
+
prompt: `生成完整状态报告。
|
|
40
|
+
|
|
41
|
+
### 输出格式:
|
|
42
|
+
\`\`\`
|
|
43
|
+
📊 SillySpec 状态
|
|
44
|
+
|
|
45
|
+
📋 项目:xxx(已初始化 / 未初始化)
|
|
46
|
+
📂 代码库:已扫描(7 份文档)/ 未扫描
|
|
47
|
+
|
|
48
|
+
🔄 进行中:N 个变更
|
|
49
|
+
- [change-1] Phase 3 (Execute) — tasks 5/8
|
|
50
|
+
|
|
51
|
+
✅ 已归档:N 个变更
|
|
52
|
+
📝 设计文档:N 份
|
|
53
|
+
📝 实现计划:N 份
|
|
54
|
+
|
|
55
|
+
💡 下一步:/sillyspec:continue
|
|
56
|
+
\`\`\`
|
|
57
|
+
|
|
58
|
+
### 注意
|
|
59
|
+
- 不修改任何文件`,
|
|
60
|
+
outputHint: '状态报告',
|
|
61
|
+
optional: false
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|