sillyspec 3.32.10 → 3.33.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-brainstorm/SKILL.md +114 -114
- package/.claude/skills/sillyspec-execute/SKILL.md +222 -222
- package/.claude/skills/sillyspec-explore/SKILL.md +107 -107
- package/.claude/skills/sillyspec-plan/SKILL.md +156 -156
- package/.github/workflows/ci.yml +58 -0
- package/.husky/pre-push +7 -6
- package/eval/eval.config.json +3 -3
- package/eval/lib/config.mjs +6 -3
- package/eval/lib/util.mjs +16 -3
- package/eval/lib/workdir.mjs +4 -1
- package/eval/results/eval.db +0 -0
- package/eval/results/logs/2026-10-15T12-37-22-986Z-004-phase-stats-armA/prompt.txt +10 -0
- package/eval/results/logs/2026-10-15T12-37-22-986Z-004-phase-stats-armA/stderr.txt +0 -0
- package/eval/results/logs/2026-10-15T12-37-22-986Z-004-phase-stats-armA/stdout.txt +1 -0
- package/eval/results/logs/2026-10-15T12-45-37-124Z-004-phase-stats-armB/prompt.txt +10 -0
- package/eval/results/logs/2026-10-15T12-45-37-124Z-004-phase-stats-armB/stderr.txt +0 -0
- package/eval/results/logs/2026-10-15T12-45-37-124Z-004-phase-stats-armB/stdout.txt +1 -0
- package/eval/results/logs/2026-10-15T12-56-19-259Z-004-phase-stats-armA/prompt.txt +10 -0
- package/eval/results/logs/2026-10-15T12-56-19-259Z-004-phase-stats-armA/stderr.txt +0 -0
- package/eval/results/logs/2026-10-15T12-56-19-259Z-004-phase-stats-armA/stdout.txt +1 -0
- package/eval/results/logs/2026-10-15T13-00-05-625Z-004-phase-stats-armB/prompt.txt +10 -0
- package/eval/results/logs/2026-10-15T13-04-51-003Z-004-phase-stats-armA/prompt.txt +10 -0
- package/eval/results/logs/2026-10-15T13-04-51-003Z-004-phase-stats-armA/stderr.txt +0 -0
- package/eval/results/logs/2026-10-15T13-04-51-003Z-004-phase-stats-armA/stdout.txt +1 -0
- package/eval/results/logs/2026-10-15T13-06-25-271Z-004-phase-stats-armB/prompt.txt +10 -0
- package/eval/results/logs/2026-10-15T13-06-25-271Z-004-phase-stats-armB/stderr.txt +0 -0
- package/eval/results/logs/2026-10-15T13-06-25-271Z-004-phase-stats-armB/stdout.txt +1 -0
- package/eval/results/logs/2026-10-15T13-24-38-308Z-004-phase-stats-armB/prompt.txt +10 -0
- package/eval/results/logs/2026-10-15T13-24-38-308Z-004-phase-stats-armB/stderr.txt +0 -0
- package/eval/results/logs/2026-10-15T13-24-38-308Z-004-phase-stats-armB/stdout.txt +1 -0
- package/eval/results/logs/2026-10-15T14-50-01-950Z-005-orders-export-armA/prompt.txt +8 -0
- package/eval/results/logs/2026-10-15T14-50-01-950Z-005-orders-export-armA/stderr.txt +0 -0
- package/eval/results/logs/2026-10-15T14-50-01-950Z-005-orders-export-armA/stdout.txt +1 -0
- package/eval/results/logs/2026-10-15T14-51-56-316Z-005-orders-export-armB/prompt.txt +8 -0
- package/eval/results/logs/2026-10-15T14-51-56-316Z-005-orders-export-armB/stderr.txt +0 -0
- package/eval/results/logs/2026-10-15T14-51-56-316Z-005-orders-export-armB/stdout.txt +1 -0
- package/eval/results/workdirs/001-slugify__armA/package.json +6 -0
- package/eval/results/workdirs/001-slugify__armA/src/slugify.mjs +26 -0
- package/eval/results/workdirs/001-slugify__armB/package.json +6 -0
- package/eval/results/workdirs/001-slugify__armB/src/slugify.mjs +26 -0
- package/eval/results/workdirs/002-each-day__armA/package.json +6 -0
- package/eval/results/workdirs/002-each-day__armA/src/dates.mjs +30 -0
- package/eval/results/workdirs/002-each-day__armB/DRY_RUN_WRONG_ANSWER.mjs +1 -0
- package/eval/results/workdirs/002-each-day__armB/package.json +6 -0
- package/eval/results/workdirs/002-each-day__armB/src/dates.mjs +4 -0
- package/eval/results/workdirs/003-word-report__armA/bin/report.mjs +36 -0
- package/eval/results/workdirs/003-word-report__armA/data/notes.txt +5 -0
- package/eval/results/workdirs/003-word-report__armA/package.json +6 -0
- package/eval/results/workdirs/003-word-report__armB/bin/report.mjs +36 -0
- package/eval/results/workdirs/003-word-report__armB/data/notes.txt +5 -0
- package/eval/results/workdirs/003-word-report__armB/package.json +6 -0
- package/eval/results/workdirs/004-phase-stats__armA/data/events.log +16 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/flow.md +44 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-archive.md +27 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-brainstorm.md +34 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-execute.md +30 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-plan.md +28 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-verify.md +30 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/status.md +28 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-archive/SKILL.md +87 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-auto/SKILL.md +54 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-commit/SKILL.md +67 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-continue/SKILL.md +17 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-execute/SKILL.md +222 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-explore/SKILL.md +107 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-export/SKILL.md +57 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-flow/SKILL.md +62 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-init/SKILL.md +177 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-knowledge/SKILL.md +40 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-plan/SKILL.md +156 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-propose/SKILL.md +16 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-quick/SKILL.md +116 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-resume/SKILL.md +21 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-scan/SKILL.md +79 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-state/SKILL.md +25 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-status/SKILL.md +54 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-verify/SKILL.md +87 -0
- package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-workspace/SKILL.md +33 -0
- package/eval/results/workdirs/004-phase-stats__armB/AGENTS.md +45 -0
- package/eval/results/workdirs/004-phase-stats__armB/CLAUDE.md +3 -0
- package/eval/results/workdirs/004-phase-stats__armB/data/events.log +16 -0
- package/eval/results/workdirs/run-001-slugify__armA/package.json +6 -0
- package/eval/results/workdirs/run-001-slugify__armA/src/slugify.mjs +26 -0
- package/eval/results/workdirs/run-001-slugify__armB/package.json +6 -0
- package/eval/results/workdirs/run-001-slugify__armB/src/slugify.mjs +26 -0
- package/eval/results/workdirs/run-002-each-day__armA/package.json +6 -0
- package/eval/results/workdirs/run-002-each-day__armA/src/dates.mjs +30 -0
- package/eval/results/workdirs/run-002-each-day__armB/DRY_RUN_WRONG_ANSWER.mjs +1 -0
- package/eval/results/workdirs/run-002-each-day__armB/package.json +6 -0
- package/eval/results/workdirs/run-002-each-day__armB/src/dates.mjs +4 -0
- package/eval/results/workdirs/run-003-word-report__armA/bin/report.mjs +36 -0
- package/eval/results/workdirs/run-003-word-report__armA/data/notes.txt +5 -0
- package/eval/results/workdirs/run-003-word-report__armA/package.json +6 -0
- package/eval/results/workdirs/run-003-word-report__armB/bin/report.mjs +36 -0
- package/eval/results/workdirs/run-003-word-report__armB/data/notes.txt +5 -0
- package/eval/results/workdirs/run-003-word-report__armB/package.json +6 -0
- package/eval/results/workdirs/run-004-phase-stats__armA/bin/phase-stats.mjs +37 -0
- package/eval/results/workdirs/run-004-phase-stats__armA/data/events.log +16 -0
- package/eval/results/workdirs/run-004-phase-stats__armB/DRY_RUN_WRONG_ANSWER.mjs +1 -0
- package/eval/results/workdirs/run-004-phase-stats__armB/data/events.log +16 -0
- package/eval/results/workdirs/run-005-orders-export__armA/bin/export-orders.mjs +57 -0
- package/eval/results/workdirs/run-005-orders-export__armA/data/.gitattributes +1 -0
- package/eval/results/workdirs/run-005-orders-export__armA/data/orders.csv +9 -0
- package/eval/results/workdirs/run-005-orders-export__armA/out/summary.json +1 -0
- package/eval/results/workdirs/run-005-orders-export__armB/bin/export-orders.mjs +57 -0
- package/eval/results/workdirs/run-005-orders-export__armB/data/.gitattributes +1 -0
- package/eval/results/workdirs/run-005-orders-export__armB/data/orders.csv +9 -0
- package/eval/results/workdirs/run-005-orders-export__armB/out/summary.json +1 -0
- package/eval/tasks/004-phase-stats/files/data/events.log +16 -0
- package/eval/tasks/004-phase-stats/solution/bin/phase-stats.mjs +37 -0
- package/eval/tasks/004-phase-stats/task.json +6 -0
- package/eval/tasks/004-phase-stats/verify.mjs +38 -0
- package/eval/tasks/005-orders-export/files/data/.gitattributes +1 -0
- package/eval/tasks/005-orders-export/files/data/orders.csv +9 -0
- package/eval/tasks/005-orders-export/solution/bin/export-orders.mjs +57 -0
- package/eval/tasks/005-orders-export/task.json +6 -0
- package/eval/tasks/005-orders-export/verify.mjs +28 -0
- package/package.json +1 -1
- package/quicklog/tmp-fix-review.mjs +21 -0
- package/src/ceremony-tier.js +2 -1
- package/src/decision-distill.js +29 -3
- package/src/decision-redomain.js +148 -0
- package/src/design-facts.js +3 -3
- package/src/docs-debt.js +3 -3
- package/src/flow-parity.js +10 -2
- package/src/flow.js +1 -1
- package/src/forensics.js +236 -0
- package/src/fr-index.js +2 -1
- package/src/index.js +34 -1
- package/src/knowledge-graph.js +3 -4
- package/src/module-impact.js +2 -5
- package/src/modules.js +31 -0
- package/src/run/gates.js +7 -14
- package/src/run/lint-ownership.js +37 -0
- package/src/run/prompt.js +40 -25
- package/src/run/verify-quality-scan.js +10 -1
- package/src/spec-sync.js +81 -2
- package/src/stage-review.js +2 -1
- package/src/stages/brainstorm.js +71 -20
- package/src/stages/plan-postcheck.js +13 -2
- package/src/stages/plan.js +19 -0
- package/src/test-bindings.js +32 -3
- package/src/ui-visual.js +119 -4
- package/src/verify-postcheck.js +117 -17
- package/src/worktree-apply.js +26 -2
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:export
|
|
3
|
+
description: 导出成功方案为可复用模板
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## CLI 边界(重要)
|
|
9
|
+
|
|
10
|
+
sillyspec CLI **没有 `export` 顶层命令**。本 skill 通过直接复制变更文件到 `~/.sillyspec/templates/<change-name>/` 生成可复用模板,是纯文件操作。**不要编造 `sillyspec export ...` 子命令。**
|
|
11
|
+
|
|
12
|
+
你现在是 SillySpec 的模板导出器。
|
|
13
|
+
|
|
14
|
+
## 参数解析
|
|
15
|
+
|
|
16
|
+
解析 `$ARGUMENTS`:
|
|
17
|
+
- 第一个参数为变更名(如 `user-auth`)
|
|
18
|
+
- `--to` 指定输出路径(默认 `~/.sillyspec/templates/<change-name>/`)
|
|
19
|
+
|
|
20
|
+
## 流程
|
|
21
|
+
|
|
22
|
+
### 1. 读取变更文件
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
CHANGE_DIR=".sillyspec/changes/$ARGUMENTS"
|
|
26
|
+
cat "$CHANGE_DIR/proposal.md"
|
|
27
|
+
cat "$CHANGE_DIR/design.md"
|
|
28
|
+
cat "$CHANGE_DIR/specs/requirements.md" 2>/dev/null
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
如果变更不存在 → 告诉用户"变更不存在,请确认变更名"
|
|
32
|
+
|
|
33
|
+
### 2. 清理为通用模板
|
|
34
|
+
|
|
35
|
+
读取文件后,进行清理:
|
|
36
|
+
- 移除项目特定的信息(具体类名、路径、端口号)
|
|
37
|
+
- 保留通用的设计方案、架构决策、需求场景
|
|
38
|
+
- 添加一个 `notes.md`,记录使用建议和适配要点
|
|
39
|
+
|
|
40
|
+
### 3. 导出到模板目录
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
mkdir -p ~/.sillyspec/templates/<change-name>
|
|
44
|
+
cp 清理后的文件到该目录
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 4. 确认
|
|
48
|
+
|
|
49
|
+
展示导出内容摘要,告知模板路径。
|
|
50
|
+
|
|
51
|
+
### 最后说:
|
|
52
|
+
|
|
53
|
+
> ✅ 方案已导出到 `~/.sillyspec/templates/<change-name>/`
|
|
54
|
+
>
|
|
55
|
+
> 其他项目使用:`/sillyspec:brainstorm "你的想法"` → AI 会自动发现并建议复用此模板
|
|
56
|
+
>
|
|
57
|
+
> 手动查看:`ls ~/.sillyspec/templates/<change-name>/`
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:flow
|
|
3
|
+
description: 轻量变更(默认快道)——需求明确的小/中改动两步收口。适合用户说"直接改、快速修、顺手调整、改个文案、修个小 bug、更新一个文件、需求很明确、开干吧、把这个改了"。2 次协议调用:flow start → 直接干活(改代码写测试)→ flow done(实测门+测试绑定+patch 留档)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 何时使用
|
|
7
|
+
|
|
8
|
+
- 需求已含决策:改什么、成功标准说得清(能列 1-3 条可验证标准)
|
|
9
|
+
- 用户说"直接改 / 快速修 / 顺手调整 / 修个小 bug / 需求很明确 / 开干"
|
|
10
|
+
- 代码已先写好需要收尾(倒推 B 模式):`--input` 如实登记已做改动+成功标准,不回头补流程装样子
|
|
11
|
+
- 需求不清晰 → CLI 会在 flow start 处拦下给两选一(头脑风暴预段 / 确认输入已含决策);或直接先走 `/sillyspec:brainstorm`,完成后 `flow start` 收编续跑(design 以头脑风暴版为准)
|
|
12
|
+
- 大改动(跨模块取舍 / 需要 Wave 计划编排 / 设计期人机对抗)→ 不走本 skill,走完整五阶段流程
|
|
13
|
+
|
|
14
|
+
## 两步协议
|
|
15
|
+
|
|
16
|
+
### ① flow start(立项 + 锁基线)
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
sillyspec flow start --change <变更名> --input "<一句中文概括(首行即变更标题);随后动机与背景
|
|
20
|
+
|
|
21
|
+
成功标准:
|
|
22
|
+
- <可验证标准>"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`--input` 过门格式(清晰度门按此提取,缺「成功标准」条目会被拦下):引号内换行合法,上方命令即完整可照抄实例。
|
|
26
|
+
|
|
27
|
+
变更标题(面板显示用):总结一句中文概括,≤50 字、建议 ~20 字——`--input` 首行写这句即成标题(缺省取首行推导),或显式 `--title "<标题>"` 指定(重入 start 可改)。
|
|
28
|
+
|
|
29
|
+
示例:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
登录限流计数在窗口翻转时被误清,触发误封
|
|
33
|
+
成功标准:
|
|
34
|
+
- INCR 计数在窗口边界不再误清
|
|
35
|
+
- 新增单测覆盖窗口翻转边界,npm test 全绿
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### ② 直接干活
|
|
39
|
+
|
|
40
|
+
改代码、写测试。治理工件(proposal/requirements/design)CLI 机器起草,你只需要:
|
|
41
|
+
|
|
42
|
+
- 填 design.md 四节 AGENT 槽(做法概述/接口契约/边界并发四问/风险与死路)——每节至少一行,写「不适用:<理由>」也算答,空槽 flow done 拒收
|
|
43
|
+
- 变更目录若已有收割生成的 decisions.md(frontmatter `author: flow-machine-draft`),它是底稿不是终稿:槽4 作答含「放弃方案」的,收口前把每个放弃方案拆成独立 rejected 条目(问题=决策专属问句、否决理由=放弃理由、复潮条件=重提前提),风险与对策留在主条目——rejected 条目才走蒸馏防复潮通道,埋在散文里的否决理由进不了通道;无实质放弃方案则不动
|
|
44
|
+
- 干活以 tasks.md 为进度源:做一件 → 勾一格(`- [ ]` → `- [x]`)→ 继续下一条,勿攒一把勾(勾选是收口哨兵的证据面——逐 task 核提交 token/review.json);`flow status --change <名>` 为自愿查看/恢复面(②阶段给下一任务指针与进度,非协议必需——D-007)
|
|
45
|
+
- 交付代码用显式 pathspec 提交(`git commit -m "..." -- 文件1 文件2`;patch 冻结面=baseline..HEAD 提交面,未提交的代码不进审计件)
|
|
46
|
+
|
|
47
|
+
### ③ flow done(收口)
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
sillyspec flow done --change <变更名>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
CLI 亲自实测(测试面按变更动态推断——本变更测试 ∪ FR 关联回归 ∪ import 依赖,runner 自项目结构推断;lint 走 `local.yaml` 的 `commands.lint`;实测失败中断于对应子步、断点续,修好重跑即可);按危险证据定档独立评审;patch 留档变更级归档。
|
|
54
|
+
|
|
55
|
+
## 边界
|
|
56
|
+
|
|
57
|
+
- 中断恢复:进度已落盘,`sillyspec flow status --change <名>` 随时查看,重跑续接(自愿查看/恢复面——②阶段给下一个未勾任务与进度)
|
|
58
|
+
- 轻量→完整转道是用户决策:征得用户同意后带 `--upgrade-thick` 重启;轻量变更实测失败自动升厚
|
|
59
|
+
- 流程状态、断点要求、收尾动作以 CLI 输出为准,不要自行编造或跳过
|
|
60
|
+
|
|
61
|
+
## 用户指令
|
|
62
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:init
|
|
3
|
+
description: 绿地项目初始化 — 深度提问、调研、需求文档、路线图
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 交互规范
|
|
7
|
+
|
|
8
|
+
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
9
|
+
|
|
10
|
+
不要用编号列表让用户手动输入数字。
|
|
11
|
+
如果需要自由输入,在 AskUserQuestion 的选项中加入"Other(自定义输入)"。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 两个 init 的区别(重要)
|
|
16
|
+
|
|
17
|
+
- **`sillyspec init`(CLI 命令)** — 安装命令模板/MCP 工具到项目(零交互,自动检测工具)。用法:`sillyspec init [--tool <名>] [--interactive] [--dir <path>] [--spec-dir <path>]`
|
|
18
|
+
- **`/sillyspec:init`(本 skill)** — 绿地项目的需求文档生成流程(深度提问 → REQUIREMENTS.md → ROADMAP.md → PROJECT.md),不写代码、不装依赖
|
|
19
|
+
|
|
20
|
+
两者用途不同、不冲突:可先用本 skill 搞清需求,再用 CLI `sillyspec init` 装工具。
|
|
21
|
+
|
|
22
|
+
你现在是 SillySpec 的项目初始化器。
|
|
23
|
+
|
|
24
|
+
## 用户输入
|
|
25
|
+
$ARGUMENTS
|
|
26
|
+
|
|
27
|
+
## 核心流程
|
|
28
|
+
|
|
29
|
+
这是一个从零开始创建新项目的完整流程。你的目标是:**在开始写任何代码之前,把需求彻底搞清楚。**
|
|
30
|
+
|
|
31
|
+
### Step 1: 检查工作区模式
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
如果 projects/ 目录存在且包含 .yaml 文件 → 工作区模式:
|
|
38
|
+
1. 列出所有子项目(读取 projects/*.yaml):
|
|
39
|
+
检测到工作区模式,请选择要初始化的子项目:
|
|
40
|
+
> 1. frontend — 前端 - Vue3 + TypeScript
|
|
41
|
+
> 2. backend — 后端 - Node.js + PostgreSQL
|
|
42
|
+
> 3. 新建子项目(先运行 /sillyspec:workspace add)
|
|
43
|
+
2. 用户选择后,**切换到该子项目目录**执行后续所有步骤
|
|
44
|
+
3. 后续步骤中的所有文件路径相对于子项目目录
|
|
45
|
+
|
|
46
|
+
否则 → 单项目模式,继续。
|
|
47
|
+
|
|
48
|
+
### Step 2: 检查项目状态
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
ls -la
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
如果目录已经有代码/配置文件 → 提示用 `/sillyspec:scan` 代替。
|
|
55
|
+
如果是空目录 → 继续。
|
|
56
|
+
|
|
57
|
+
### Step 3: 深度提问
|
|
58
|
+
|
|
59
|
+
**一次只问一个问题**,按以下顺序探索:
|
|
60
|
+
|
|
61
|
+
1. **项目本质** — 这个项目要解决什么问题?给谁用?
|
|
62
|
+
2. **核心功能** — 用户能做的最重要的事情是什么?
|
|
63
|
+
3. **技术偏好** — 有偏好的语言/框架吗?还是让我建议?
|
|
64
|
+
4. **非功能需求** — 性能要求?安全要求?离线支持?多语言?
|
|
65
|
+
5. **设计偏好** — 有参考产品吗?喜欢什么风格?
|
|
66
|
+
6. **约束** — 预算?时间?团队规模?
|
|
67
|
+
7. **不在范围内** — 明确什么不做
|
|
68
|
+
|
|
69
|
+
### Step 4: 技术选型(如需要)
|
|
70
|
+
|
|
71
|
+
如果用户没有明确偏好,基于项目需求推荐 2-3 套技术栈,列出优劣:
|
|
72
|
+
- 语言 + 框架 + 数据库 + 部署方案
|
|
73
|
+
- 给出推荐和理由
|
|
74
|
+
|
|
75
|
+
### Step 5: 可选调研
|
|
76
|
+
|
|
77
|
+
如果用户同意,对关键技术选型做快速调研:
|
|
78
|
+
- 选定框架的当前版本和生态状态
|
|
79
|
+
- 已知的坑和替代方案
|
|
80
|
+
- 依赖的第三方服务的稳定性
|
|
81
|
+
|
|
82
|
+
### Step 6: 生成需求文档
|
|
83
|
+
|
|
84
|
+
保存到 `.sillyspec/REQUIREMENTS.md`:
|
|
85
|
+
|
|
86
|
+
```markdown
|
|
87
|
+
# 需求文档
|
|
88
|
+
|
|
89
|
+
## 项目概述
|
|
90
|
+
[一句话描述]
|
|
91
|
+
|
|
92
|
+
## 目标用户
|
|
93
|
+
[谁在用、在什么场景下用]
|
|
94
|
+
|
|
95
|
+
## 功能需求
|
|
96
|
+
### P0 — 必须有
|
|
97
|
+
- [ ] 需求 1
|
|
98
|
+
- [ ] 需求 2
|
|
99
|
+
|
|
100
|
+
### P1 — 应该有
|
|
101
|
+
- [ ] 需求 3
|
|
102
|
+
|
|
103
|
+
### P2 — 有了更好
|
|
104
|
+
- [ ] 需求 4
|
|
105
|
+
|
|
106
|
+
## 非功能需求
|
|
107
|
+
- 性能:xxx
|
|
108
|
+
- 安全:xxx
|
|
109
|
+
- 部署:xxx
|
|
110
|
+
|
|
111
|
+
## 不在范围内
|
|
112
|
+
- xxx
|
|
113
|
+
- xxx
|
|
114
|
+
|
|
115
|
+
## 技术选型
|
|
116
|
+
| 层 | 选择 | 理由 |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| 前端 | React + TypeScript | xxx |
|
|
119
|
+
| 后端 | xxx | xxx |
|
|
120
|
+
| 数据库 | xxx | xxx |
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Step 7: 生成路线图:
|
|
124
|
+
|
|
125
|
+
```markdown
|
|
126
|
+
# 项目路线图
|
|
127
|
+
|
|
128
|
+
## Phase 1: 基础骨架
|
|
129
|
+
- 目标:可运行的最小版本
|
|
130
|
+
- 交付物:项目结构 + 基础配置 + 首个可运行页面/接口
|
|
131
|
+
|
|
132
|
+
## Phase 2: 核心功能
|
|
133
|
+
- 目标:P0 功能全部可用
|
|
134
|
+
- 交付物:xxx
|
|
135
|
+
|
|
136
|
+
## Phase 3: 完善
|
|
137
|
+
- 目标:P1 + 测试 + 打磨
|
|
138
|
+
- 交付物:xxx
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Step 8: 生成 PROJECT.md
|
|
142
|
+
|
|
143
|
+
保存到 `.sillyspec/PROJECT.md`:
|
|
144
|
+
|
|
145
|
+
```markdown
|
|
146
|
+
# PROJECT.md
|
|
147
|
+
|
|
148
|
+
## 项目名:xxx
|
|
149
|
+
## 一句话:xxx
|
|
150
|
+
## 状态:已初始化,等待规划
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Step 9: Git 初始化
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
git init
|
|
157
|
+
git add .
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 最后说:
|
|
161
|
+
|
|
162
|
+
> ✅ 项目初始化完成!
|
|
163
|
+
>
|
|
164
|
+
> 生成文件:
|
|
165
|
+
> - `.sillyspec/PROJECT.md` — 项目概述
|
|
166
|
+
> - `.sillyspec/REQUIREMENTS.md` — 需求文档
|
|
167
|
+
> - `.sillyspec/ROADMAP.md` — 路线图
|
|
168
|
+
>
|
|
169
|
+
> 下一步:
|
|
170
|
+
> - 开始第一个功能:`/sillyspec:brainstorm "Phase 1: xxx"`
|
|
171
|
+
> - 或修改需求:直接告诉我改什么
|
|
172
|
+
|
|
173
|
+
## 绝对规则
|
|
174
|
+
- 不写任何实现代码
|
|
175
|
+
- 不安装任何依赖
|
|
176
|
+
- 提问阶段一次一个问题
|
|
177
|
+
- 需求必须具体,不能模糊(❌"好用" → ✅"首屏加载 < 2 秒")
|
package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-knowledge/SKILL.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:knowledge
|
|
3
|
+
description: Agent-safe knowledge base commands for SillySpec repositories. Search, inspect, validate, refresh, and propose knowledge entries.
|
|
4
|
+
argument-hint: "search --query \"<text>\" --limit N | inspect --id \"<id>\" | validate | refresh | propose --title \"<title>\" --category <name>"
|
|
5
|
+
version: "3.19.2"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 何时使用此技能
|
|
9
|
+
|
|
10
|
+
任务可能依赖项目既有知识(known issues / patterns / scan 结论 / `.sillyspec/knowledge`)时。**实现前先 search,避免重复踩坑。**
|
|
11
|
+
|
|
12
|
+
## 命令速查
|
|
13
|
+
|
|
14
|
+
所有命令输出均为 stdout 纯 JSON(`ok` 顶层字段 + 失败 `code` 错误码),以实际输出为准——参数细节跑 `sillyspec knowledge <子命令>` 无参可见用法,勿背示例。
|
|
15
|
+
|
|
16
|
+
| 命令 | 用途 | 关键参数 |
|
|
17
|
+
|---|---|---|
|
|
18
|
+
| `sillyspec knowledge search --query "<任务关键词>" --limit 5` | 任务前搜知识库(与 execute 阶段同款匹配引擎) | `--query` 必填 |
|
|
19
|
+
| `sillyspec knowledge inspect --id "<id>"` | 读命中条目全文 | id 形如 `patterns` / `known-issues/xxx` / `generated/xxx` |
|
|
20
|
+
| `sillyspec knowledge validate` | commit/archive 前校验健康度 | errors(broken_reference/empty_file 等)须先修复 |
|
|
21
|
+
| `sillyspec knowledge refresh` | scan/archive 后从 scan 文档刷新自动知识 | 仅写 `generated/`,不碰 manual/ |
|
|
22
|
+
| `sillyspec knowledge propose --title "..." --category <分类> --body "..."` | 提议新知识 | 仅写 `proposed/` 供人工审核;`--from` 标来源 |
|
|
23
|
+
|
|
24
|
+
zone 语义:`manual`(人工维护,可直接信任)/ `generated`(自动提取,需人工审核)/ `proposed`(待审,未合并)。
|
|
25
|
+
|
|
26
|
+
## Agent 使用指南
|
|
27
|
+
|
|
28
|
+
1. **任务前必查**:实现/改代码/排错前 `search` → 命中则 `inspect` → 遵循其中约定与避坑建议。
|
|
29
|
+
2. **发现新知识**:可复用模式或新坑用 `propose` 提议,不直接编辑 manual/。
|
|
30
|
+
3. **提交前校验**:commit/archive 前 `validate`,有 errors 先修复。
|
|
31
|
+
4. **扫描后刷新**:scan 完成后 `refresh`,`generated/` 中有用的条目待人工合并。
|
|
32
|
+
|
|
33
|
+
## 禁止事项
|
|
34
|
+
|
|
35
|
+
- ❌ 不要直接编辑 `manual/` 或 `generated/`——新知识走 `propose`,自动知识走 `refresh`
|
|
36
|
+
- ❌ 不要用 `grep`/`cat` 直接读知识文件——用 `search`/`inspect`(同款匹配引擎,索引语义一致)
|
|
37
|
+
- ❌ 不要自动审核合并 `proposed/` 条目——提议供人工审核,仅用户明确要求才合并
|
|
38
|
+
|
|
39
|
+
## 用户指令
|
|
40
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:plan
|
|
3
|
+
description: 用于把 design 拆解为可执行的实现计划。适合用户说"拆任务、做计划、排 wave、规划实现步骤"。产出 plan.md(Wave 分组 + 任务 ID 引用 + 依赖关系)+ tasks.md 任务清单(唯一真相,plan 阶段展开写回)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 何时使用
|
|
7
|
+
|
|
8
|
+
- 用户说"拆任务、做计划、排 wave、规划实现步骤"
|
|
9
|
+
- 把 brainstorm 的 design.md 拆成可执行的 Wave + Task
|
|
10
|
+
- 产出:`plan.md`(Wave 分组 + 任务 ID 引用行 + 依赖关系)+ `tasks.md` 任务清单展开写回(唯一真相)+ `tasks/task-NN.md` 任务蓝图
|
|
11
|
+
|
|
12
|
+
## 多变更说明
|
|
13
|
+
|
|
14
|
+
项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录)时,所有 `sillyspec run` 命令需加 `--change <变更名>` 指定操作目标;只有一个变更时可省略(CLI 自动检测)。
|
|
15
|
+
|
|
16
|
+
## 步骤生命周期(所有阶段通用)
|
|
17
|
+
|
|
18
|
+
> `sillyspec plan` 是 `sillyspec run plan` 的顶层别名,两者等价。
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
sillyspec run plan # 输出当前步骤 prompt
|
|
22
|
+
sillyspec run plan --done --output "摘要" # 完成当前步骤(--input "用户原话" 记录输入)
|
|
23
|
+
sillyspec run plan --status # 查看阶段进度
|
|
24
|
+
sillyspec run plan --skip # 跳过可选步骤
|
|
25
|
+
sillyspec run plan --reset # 重置阶段(从头开始)
|
|
26
|
+
sillyspec run plan --reopen --from-step N # 重新打开已完成阶段修订(N=序号或名称)
|
|
27
|
+
sillyspec run plan --wait --reason "..." --options "A,B" # 暂停等用户决策
|
|
28
|
+
sillyspec run plan --continue --answer "..." # 恢复等待中的步骤
|
|
29
|
+
sillyspec run plan --done --answer "..." --output "..." # 一步完成 wait+done
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 通用参数(所有阶段适用)
|
|
33
|
+
|
|
34
|
+
| 参数 | 说明 |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `--change <名>` | 指定变更名(多活跃变更必填,单变更可省略自动检测) |
|
|
37
|
+
| `--spec-dir <path>` | 指定规范目录(默认 `<项目>/.sillyspec`) |
|
|
38
|
+
| `--non-interactive` | CI/脚本下禁用交互式 prompt |
|
|
39
|
+
| `--interactive` | 强制交互(即便 stdin 非 TTY) |
|
|
40
|
+
| `--skip-approval` | 跳过阶段转换/审批检查(不能跳产物校验 gate——review.json/文档产物硬校验仍在) |
|
|
41
|
+
|
|
42
|
+
## plan 特有
|
|
43
|
+
|
|
44
|
+
### 动态步骤
|
|
45
|
+
|
|
46
|
+
plan 的步骤是动态的:`generate_plan`(生成分级计划)→ `review_plan`(审查计划,按规模分级:tier=self 当前 agent 自审 / tier=independent 启动独立审查子代理产出 stage review.json,避免生成+自审同一次输出的偏差)→ CLI 从 `tasks.md` 注册表解析出 task 自动插入"任务蓝图协调器"步骤(per-task;plan.md 只提供 Wave 引用分组)。这是正常行为,不要手动添加。
|
|
47
|
+
|
|
48
|
+
### Stage Review Gate(plan 的 design review.json)
|
|
49
|
+
|
|
50
|
+
`review_plan` 步骤在 `tier=independent` 时产出一个 stage 级 `review.json`,CLI `Stage Review Gate` 硬校验其 schema 与 `docHash` 真实性。
|
|
51
|
+
|
|
52
|
+
- 路径:`.sillyspec/.runtime/stage-reviews/plan-<run-id>/review.json`——**目录名 = `plan-` + marker 值原样**(run-id 本身已带 `review-` 前缀:marker 值 `review-2026-10-15-001431` → 目录 `plan-review-2026-10-15-001431`。勿再拼一层 review-,也勿拿 marker 值当完整目录名)。目录可能不存在需手建;run-id 由该步 `--done` prompt 输出指定;marker 文件 `.runtime/current-stage-review-run-id-plan-<变更名>`。
|
|
53
|
+
- **run-id / marker 由 CLI 自动生成注入**(review step prompt 渲染时 echo 完整目录路径 + 写 marker;撞 gate 报缺 review.json 时 gate 也 echo 完整路径 + 写 marker)。直接用 CLI 给的路径写 review.json,**勿手算 run-id、勿手写 marker**。卡住时用 `sillyspec register-stage-review --change <名> --stage plan` 一步生成。
|
|
54
|
+
- 字段(`schemaVersion:1`,`reviewType=plan` —— plan 阶段主审查文档是 `plan.md`;execute 阶段才是 `acceptance`):
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"schemaVersion": 1,
|
|
59
|
+
"reviewType": "plan",
|
|
60
|
+
"reviewedFiles": ["changes/<变更名>/plan.md"], // [0] 为主文档
|
|
61
|
+
"docHash": "<sha256(reviewedFiles[0] 文件内容,hex)>",
|
|
62
|
+
"specVerdict": "pass", // pass | fail | cannot_verify
|
|
63
|
+
"qualityVerdict": "pass", // pass | fail | cannot_verify
|
|
64
|
+
"checklist": [ // 扁平数组,逐条对照 plan 章节/Wave 结构/task 完整性核验
|
|
65
|
+
{ "item": "Wave 分级合理", "result": "pass", "note": "..." } // result: pass | gap | fail
|
|
66
|
+
],
|
|
67
|
+
"requiredEvidence": [], // cannot_verify 时必填非空
|
|
68
|
+
"reviewerNotes": "..."
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
- `docHash` = `sha256(主审查文档内容)`(hex)—— plan 主文档是 `plan.md`(`reviewedFiles[0]`)。CLI 重算 sha256 比对,不符判伪造(fail-closed)。docHash 可先占位(如 "TODO");改 plan.md 后勿手算 sha256——跑 `sillyspec register-stage-review --change <变更名> --stage plan --refresh-hash` 一键重算代填(verdict 保留;多阶段联动加 --all)。忘跑也不会被拦:gate 检测到「仅 docHash 失配」时自动机械重算放行(verdict 保留 + 审计行留痕);schema/verdict 错误照常 fail-closed。`tier=self`(≤3 文件)降级为当前 agent 自审。
|
|
73
|
+
- 运行时 CLI 会把精确 schema 表 + 完整 JSON 示例 + docHash 算法注入到该步 prompt,以你实际收到的注入版契约为权威逐字模板。
|
|
74
|
+
|
|
75
|
+
### 契约门控(阻断完成)
|
|
76
|
+
|
|
77
|
+
- **plan 启动前**:CLI 校验 `design.md` 是否满足 plan 契约(缺文件变更清单/风险登记/自审章节会阻断)。若失败需先 `sillyspec run brainstorm --reopen --from-step N` 修订设计。
|
|
78
|
+
- **plan 完成时**:CLI 校验 `tasks.md`(任务注册表)× `plan.md`(Wave ID 引用)是否满足 execute 契约(引用存在性/覆盖恰一次/编号连续/旧格式拦)。失败会阻断完成,提示修复后重新 `--done`。
|
|
79
|
+
|
|
80
|
+
### 生产接线路径检查
|
|
81
|
+
|
|
82
|
+
plan 完成校验会检查:design 提到入口文件(cli.ts/main.ts/server.ts 等)但 task 的 allowed_paths 不含该文件 → 报 error。若确实不需要改入口,在 design.md 明示理由。
|
|
83
|
+
|
|
84
|
+
## 跨仓 task 卡片协议(一个 change 改多个仓库)
|
|
85
|
+
|
|
86
|
+
单个 change 的 task 可以分散到主仓 + 多个跨仓仓实现(典型场景:dogfood 自指、monorepo 多包仓、共享库 + 调用方联合改造)。**单仓 change 不需要任何跨仓配置**(所有 task 不写 `repo:` 即走原流程,零回归)。
|
|
87
|
+
|
|
88
|
+
### 跨仓 task 卡片字段
|
|
89
|
+
|
|
90
|
+
在 `tasks/task-NN.md` frontmatter 加:
|
|
91
|
+
|
|
92
|
+
- `repo: <key>`(可选,缺省='main'=主仓 task):task 所属仓的 key。key 必须在 `.sillyspec/local.yaml` `repos:` 段注册(`main` 隐式=主仓不用注册)。跨仓 change 缺注册 → execute 启动 fail-closed 阻断。
|
|
93
|
+
- `allowed_paths`:跨仓 task 时指**相对跨仓仓根**的路径(非主仓根)。例如跨仓 task 改 `sillyspec` 仓的 `src/foo.js`,allowed_paths 写 `src/foo.js`(相对 sillyspec 仓根),不是 `../sillyspec/src/foo.js`。
|
|
94
|
+
- `base_commit` / `head_commit`:**不要手写**——CLI 在 execute 派发/回收时自动落盘双锡点(锁 base/head 防 diff 漂移),plan 阶段不写。
|
|
95
|
+
|
|
96
|
+
### local.yaml `repos:` 段(跨仓注册表)
|
|
97
|
+
|
|
98
|
+
> 📍 `local.yaml` 恒在 `.sillyspec/local.yaml`——项目根目录**没有**这个文件,别去那里找或新建(hook 会拦)。worktree 内该文件不随 checkout 出现,读配置直接跑 `sillyspec config cat`(自动定位到主仓真实配置);可用键清单见 `sillyspec config schema`。
|
|
99
|
+
|
|
100
|
+
跨仓 change 的每个 repo key 都要注册(execute 启动 fail-closed 校验)。**用命令注册,勿手编 YAML**:
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
sillyspec local register-repo <key> <跨仓仓根路径>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
(外科手术式写入,只动 `repos:` 段,其余内容保留;execute 启动报缺注册时,报错文案里就带这条命令。)手写格式参考:
|
|
107
|
+
|
|
108
|
+
```yaml
|
|
109
|
+
repos:
|
|
110
|
+
shared-lib: ../shared-lib
|
|
111
|
+
tool-repo: C:/path/to/your/tool-repo
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
key = task 卡 `repo:` 引用名,value = 跨仓仓绝对路径(或相对主仓根的路径)。`main` 不用注册。
|
|
115
|
+
|
|
116
|
+
### design.md 文件变更清单按仓分段
|
|
117
|
+
|
|
118
|
+
跨仓 change 的 `## 文件变更清单` 段须按仓分段,段头格式 `## <repo> 仓变更`(主仓段头可省略或写 `## main 仓变更`):
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
## 文件变更清单
|
|
122
|
+
|
|
123
|
+
### sillyspec 仓变更
|
|
124
|
+
| 操作 | 文件路径 | 说明 |
|
|
125
|
+
|---|---|---|
|
|
126
|
+
| 修改 | src/task-review.js | 跨仓 task 改的文件 |
|
|
127
|
+
|
|
128
|
+
### main 仓变更
|
|
129
|
+
| 操作 | 文件路径 | 说明 |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| 修改 | src/index.js | 主仓 task 改的文件 |
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
plan 完成校验会按仓分段对账:跨仓仓路径相对跨仓仓根校验 task allowed_paths 覆盖,主仓路径相对主仓根校验。跨仓 task 与主仓 task 同名物理路径分属不同 repo 不判冲突。
|
|
135
|
+
|
|
136
|
+
### Wave 划分
|
|
137
|
+
|
|
138
|
+
同 Wave 内允许混合主仓 + 跨仓 task(execute 按 per-task workdir 派发,不强制同 Wave 同 repo)。共享文件的 task 仍须分到不同 Wave(同 Wave 共享文件会被强制并行,子代理互相覆盖)。
|
|
139
|
+
|
|
140
|
+
## 阶段流转
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
brainstorm → plan → execute
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
plan 完成后(plan.md 通过 execute 契约校验),运行 `sillyspec run execute --change <变更名>` 开始实现。
|
|
147
|
+
|
|
148
|
+
## 铁律
|
|
149
|
+
|
|
150
|
+
- **必须用 exec 工具(shell)执行 CLI,不要自己编造流程**
|
|
151
|
+
- 只做当前步骤 prompt 描述的操作,不跳过、不自行扩展
|
|
152
|
+
- tasks.md 是任务清单唯一真相(checkbox 注册表,plan 阶段展开写回——保留 ql-xxx 等非 task-XX 行);plan.md Wave 段只写纯 ID 引用行(`- task-XX`),不重抄任务名
|
|
153
|
+
- 完成后立即 `--done`,不跳过
|
|
154
|
+
|
|
155
|
+
## 用户指令
|
|
156
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:propose
|
|
3
|
+
description: 已废弃重定向 — 生成结构化规范四件套请直接走 brainstorm。适合用户说"生成规范、补全四件套、propose"——一律转用 /sillyspec:brainstorm。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## propose 阶段已废弃(重定向到 brainstorm)
|
|
7
|
+
|
|
8
|
+
`propose` 阶段已从 CLI 移除(`src/stages/propose.js` 标注 @deprecated 且未注册进 stageRegistry)——**`sillyspec run propose` 不存在**(报「未知阶段: propose」)。本 skill 只保留触发词重定向,没有任何 propose 专属流程,勿尝试执行任何 `run propose` 命令。
|
|
9
|
+
|
|
10
|
+
用户说"生成规范 / 补全四件套 / propose"时,**直接执行 `/sillyspec:brainstorm`**:
|
|
11
|
+
|
|
12
|
+
- brainstorm 产出同一套四件套(`proposal.md` + `design.md` + `requirements.md` + `tasks.md`),且含需求澄清与 Design Grill 审查
|
|
13
|
+
- 「已有零散设计只需补全」与「新需求从零设计」在 brainstorm 内同流程处理——若用户明确要求跳过澄清,在对话探索步骤直接说明「需求已明确」尽早推进即可
|
|
14
|
+
|
|
15
|
+
## 用户指令
|
|
16
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:quick
|
|
3
|
+
description: 用于明确、低风险、范围很小的直接任务。适合用户说"直接改、快速修、顺手调整、改个文案、修个小 bug、更新一个文件、不要完整流程"。跳过 brainstorm/plan,但仍按 sillyspec quick 流程执行。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 何时使用
|
|
7
|
+
|
|
8
|
+
- 明确、低风险、范围小的直接修改:改文案、修小 bug、更新单个文件
|
|
9
|
+
- 用户说"直接改、快速修、顺手调整、不要完整流程"
|
|
10
|
+
- brainstorm 判定 `scale=small` 的变更:带 design.md 进 quick(`sillyspec run quick --linked-changes <变更名>`),design 当背景
|
|
11
|
+
- 跳过 brainstorm/plan,但仍走 quick 的 3 步流程(理解任务 → 实现 → 自检提交)
|
|
12
|
+
|
|
13
|
+
## 多变更说明(quick 特殊,务必注意)
|
|
14
|
+
|
|
15
|
+
quick 阶段的 `--change` 语义是「关联变更」**且会触发步骤重置**,**不要用 `--change` 来指定关联变更**。多活跃变更时改用:
|
|
16
|
+
|
|
17
|
+
- `--linked-changes none`:不关联,仅记 QUICKLOG(CLI 启动时写入)
|
|
18
|
+
- `--linked-changes a,b`:显式关联到变更 a、b
|
|
19
|
+
- `--non-interactive`:CI/脚本环境,默认不关联(避免交互 prompt 崩溃)
|
|
20
|
+
|
|
21
|
+
首次 `sillyspec run quick` 选定的关联会持久化到 `.runtime/quick-sessions/<quick-session-id>/guard.json`(每个 quick 会话独立,多会话并发不互覆盖),后续 `--done` 自动复用,**不会重复弹交互 prompt**。
|
|
22
|
+
|
|
23
|
+
## 步骤生命周期(所有阶段通用)
|
|
24
|
+
|
|
25
|
+
> `sillyspec quick` 是 `sillyspec run quick` 的顶层别名,两者等价。
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
sillyspec run quick # 输出当前步骤 prompt(首次会记录 baseline)
|
|
29
|
+
sillyspec run quick --done --output "摘要" # 完成当前步骤
|
|
30
|
+
sillyspec run quick --status # 查看阶段进度
|
|
31
|
+
sillyspec run quick --skip # 跳过可选步骤
|
|
32
|
+
sillyspec run quick --reset # 重置阶段(从头开始)
|
|
33
|
+
sillyspec run quick --reopen --from-step N # 重新打开已完成阶段修订(N=序号或名称)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 已有进行中会话的恢复(sessionId)
|
|
37
|
+
|
|
38
|
+
`sillyspec run quick` / `run quick --done` / `--status` **不带 `--change` 时,是启动一个新 quick 会话**(CLI 分配新 `quick-<hash>` + 新 ql-ID,QUICKLOG 追加「进行中」条目),不是恢复正在进行的旧会话。多会话并发或中断恢复时,必须带上启动时 CLI 打印的 sessionId:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
sillyspec run quick --change quick-<hash> # 恢复查看该会话当前 step prompt
|
|
42
|
+
sillyspec run quick --done --change quick-<hash> --output "…" # 完成该会话步骤
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- 这里的 `--change quick-<hash>` 是「恢复到该 CLI 生成的 session」,与下方 `--linked-changes` 的关联业务变更语义不同:想关联真实业务变更才用 `--linked-changes`。
|
|
46
|
+
- 误启动的空壳会话:`sillyspec run quick --cancel --change quick-<hash>` 一键取消(QUICKLOG 条目翻「已取消」+ tasks.md 挂载行移除 + 会话目录清理 + db 行注销;已完成/已勾选的拒绝取消)。
|
|
47
|
+
|
|
48
|
+
## 通用参数(所有阶段适用)
|
|
49
|
+
|
|
50
|
+
| 参数 | 说明 |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `--spec-dir <path>` | 指定规范目录(默认 `<项目>/.sillyspec`) |
|
|
53
|
+
| `--input "<一句话任务描述>"` | 通用参数,**quick 启动时强烈建议带**:作为 QUICKLOG 条目标题,条目从第一分钟即语义可读。不带则落「(quick 任务)」占位标题——平台「快速修复」列表默认隐藏进行中的占位条目,语义标题要到最终 `--done` 才回填(关联变更有 proposal/design 标题时可自动提取,免传) |
|
|
54
|
+
| `--non-interactive` | CI/脚本下禁用交互式 prompt |
|
|
55
|
+
| `--interactive` | 强制交互(即便 stdin 非 TTY) |
|
|
56
|
+
| `--skip-approval` | 跳过阶段转换/审批检查(不能跳产物校验 gate——review.json/文档产物硬校验仍在) |
|
|
57
|
+
|
|
58
|
+
## quick 特有参数
|
|
59
|
+
|
|
60
|
+
| 参数 | 说明 |
|
|
61
|
+
|---|---|
|
|
62
|
+
| `--linked-changes none\|a,b` | **显式关联变更(取代 `--change`,推荐)**。none=不关联,a,b=关联列表 |
|
|
63
|
+
| `--files a.js,b.js` | 显式声明本次允许修改的文件(边界保护 + 声明即归属:多 agent 并发仓防他者窗口文件混入 QUICKLOG 文件行,未声明窗口文件进「审计:」行追溯;**他向亦然**——其他 active 会话已声明的文件在你的 `--done` 审计中自动剔除归该会话,不再误拦、无需 `--force-baseline`)。**中途可追加**:发现要改声明外文件(如新写的测试)时,带新增文件恢复会话即并入边界(追加不替换)——`sillyspec run quick --files <新增> --change <sessionId>`;不带 `--files` 恢复则边界原样保留 |
|
|
64
|
+
| `--file-notes "p::注 \|\| p::注"` | quick `--done` 用:QUICKLOG「文件:」行落盘为多行带括注 bullet(省事后手改文件行)。格式 `path::括注`,`\|\|` 分隔多条;**只随 step3 --done 同命令传**(CLI 短进程,step1/step2 传无效,不带到 step3) |
|
|
65
|
+
| `--allow-new` | 允许新增文件(默认禁止,防意外创建) |
|
|
66
|
+
| `--allow-delete` | 允许删除文件(默认 fail-closed,删除是破坏性操作;确认删除带此 flag 显式解锁) |
|
|
67
|
+
| `--force-baseline` | 允许覆盖 baseline 受保护文件 / 压制 `.sillyspec/` 危险判定(危险,慎用) |
|
|
68
|
+
| `--confirm` | ⚠️ 仅打印变更概览,**不解锁 blocked**(blocked 仍 exit 1)。真正解锁用 `--force-baseline`/`--allow-new`/`--allow-delete` |
|
|
69
|
+
|
|
70
|
+
## 审计与并发变更(`--done` 边界审计)
|
|
71
|
+
|
|
72
|
+
`--done` 收尾时对比 step1 baseline 与当前 `git status`,拦「危险文件 / 新增文件 / 覆盖 baseline」。要点:
|
|
73
|
+
|
|
74
|
+
- **并发其他会话的 `.sillyspec/changes/<非关联变更>/` 不再被本 quick 拦截**。quick 自己没有 `changes/` 目录,该路径下非关联内容视为并发会话的工作,整体放行(确定性审计无法区分「并发工作」与「本 quick 偷建变更」,后者这类意图软判定留给 sillyhub)。
|
|
75
|
+
- **其他 active 会话已声明的文件自动豁免(`--files` 的他向语义)**。多 agent 并发时,并行 quick 会话 `--files` 显式声明的文件(如它的 `daemon/router.py`)出现在你的窗口内(它在你启动后改的、不在你的 baseline)——`--done` 审计自动剔除归该会话边界管,不再判危险 BLOCK、无需 `--force-baseline`。放行可见:输出 🔗 软警告逐文件列归属会话;若确系你的改动,恢复会话时 `--files` 追加声明;超 7 天未收尾的僵尸会话声明自动失效(`sillyspec run quick --cancel --change <他者会话ID>` 清理)。豁免只认他者**显式声明**——未声明的他者文件照旧走各门判定(漏声明的补 `--files`,危险文件仍需 `--force-baseline`)。
|
|
76
|
+
- **关联变更的文件仍走审计**:reverse-sync 改自己关联变更的 `design.md` 会被拦,需 `--force-baseline` 显式确认。
|
|
77
|
+
- **baseline 折叠目录前缀匹配**:step1 启动时整片 `changes/` 未跟踪会被 git 折叠成 `?? .sillyspec/changes/`(带尾斜杠 token);审计时若该目录下文件被并发会话跟踪而展开成文件级路径,按尾斜杠 token 前缀放行其下所有文件,不误判。
|
|
78
|
+
- **同文件并发 warn(advisory,不阻断)**:step1 启动时若你的某个 `allowedFile` 已在他者脏文件列表里(他者也改了这文件),--done 时 CLI 会比对当前内容 hash 与启动时录入的 hash——不一致(你也改了它)即判「同文件并发」并 warn:整文件 pathspec 提交会夹带他者 hunk。warn 给出分离指引(`git add -p <file>` 交互选你自己的 hunk,或 `git diff <file> > mine.patch` 编辑后 `git apply --cached mine.patch` 再 commit)。这**不阻断** --done(你可能有意整文件提交),看 warn 后自行决定是否分离。
|
|
79
|
+
- **`--confirm` ≠ 解锁**:它只打印概览。blocked 时真正解锁的是 `--force-baseline`(压制 `.sillyspec/` 危险判定 + baseline 覆盖)/`--allow-new`(放行新增)/`--allow-delete`(放行删除,删除是破坏性操作默认 fail-closed,须显式 opt-in),三者可在 step1 或 `--done` 传,都生效。
|
|
80
|
+
|
|
81
|
+
## 典型用法
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# 推荐启动:带一句话语义标题(QUICKLOG/平台快速修复列表进行中即可见可读)
|
|
85
|
+
sillyspec run quick --input "修复登录限流 INCR 计数误清" --linked-changes none --files src/auth.ts
|
|
86
|
+
|
|
87
|
+
# 单变更项目,直接开始
|
|
88
|
+
sillyspec run quick
|
|
89
|
+
|
|
90
|
+
# 多变更项目,显式不关联
|
|
91
|
+
sillyspec run quick --linked-changes none
|
|
92
|
+
|
|
93
|
+
# 多变更项目,关联到指定变更
|
|
94
|
+
sillyspec run quick --linked-changes 2026-07-03-add-login
|
|
95
|
+
|
|
96
|
+
# CI/脚本(非交互,避免 prompt 崩溃)
|
|
97
|
+
sillyspec run quick --non-interactive
|
|
98
|
+
sillyspec run quick --done --linked-changes none --output "修复手机号校验"
|
|
99
|
+
|
|
100
|
+
# 限定修改文件范围
|
|
101
|
+
sillyspec run quick --files src/phone.ts,src/phone.test.ts
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 铁律
|
|
105
|
+
|
|
106
|
+
- **必须用 exec 工具(shell)执行 CLI,不要自己编造流程**
|
|
107
|
+
- quick 直接在主工作区改代码(不创建 worktree),范围必须小且明确
|
|
108
|
+
- 完成后立即 `--done`,不跳过
|
|
109
|
+
- QUICKLOG 记录的**骨架由 CLI 接管**:启动时 CLI 自动分配 ql-ID 并在 `.sillyspec/quicklog/QUICKLOG-<user>.md` 写「进行中」条目(含关联变更 tasks.md),`--done` 时 CLI 自动翻「已完成」+ 勾选 task + 回填文件路径。ql-ID 分配/状态/task 你无需手写,只需用注入的 `<quicklog-id>` 在模块文档变更索引引用
|
|
110
|
+
- **QUICKLOG 落盘已结构化(`--done` 后按需核对,多数无需手改)**:CLI 已落盘结构化条目——标题从 `--output` 的「需求:」自动提取、正文四字段自动分行、文件行用 `--file-notes` 时为多行带括注。`--done` 后只需核对:标题弱才改(禁留 `(quick 任务)` 占位);没用 `--file-notes` 时文件行是单行、可事后补括注(参照同文件早期丰富条目);正文 `需求:`/`根因:`/`方案:`/`结果:` 四段按需充实(禁只留一段「结果:」)。一条 quick = 一条独立 ql,不追加到旧条目
|
|
111
|
+
- **收尾顺序(模块文档在 `--done` 前,QUICKLOG 在 `--done` 后,别记混)**:① 命中模块→改模块文档→`git add`;② `sillyspec run quick --done --change <id> --output "四字段" [--file-notes "..."]`(CLI 自动翻完成 + 勾 task + 落盘 QUICKLOG 标题/文件/正文;若 `--linked-changes` 关联的真实变更其 tasks.md 已全部勾选**且该变更未进入完整流程**(进度库阶段停在 brainstorm 及之前),CLI 会自动将其归档到 `changes/archive/`;已走到 plan/execute/verify/archive 的变更不自动归档(tasks.md 全勾不等于流程收尾),须走原流程收尾);③ 核对 QUICKLOG 标题(CLI 已从「需求:」提取并截断,写成短标题则无需改)→若改了再 `git add`
|
|
112
|
+
- **最后一步 `--done` 必须给全四字段**(逐项一句话):🔧 **推荐四参数形式**(CLI 自动合成结构化模板,无格式事故面):`--done --change <id> --req "一句语义化短标题" --cause "为什么改" --solution "怎么改的" --result "验证结果"`。兼容旧形式 `--output "需求:… 根因:… 方案:… 结果:…"`(手拼须懂截断规则、禁嵌套全角冒号,缺字段被拒 exit 1)。这是 QUICKLOG「结果:」归档的唯一来源。**`--req` 写一句语义化短标题**(写「改了什么」,如「登录限流修复——INCR 计数误清」)——CLI 把它提取为 QUICKLOG 条目标题,截到首个标点、超 80 字截断;写完整需求长句会被截成语义不完整的状语前半段,需求背景放 `--cause`/`--solution`。前两个 step 的 `--output` 是中间摘要,不用此模板
|
|
113
|
+
- **禁止**在没有运行 CLI 的情况下自行决定流程
|
|
114
|
+
|
|
115
|
+
## 用户指令
|
|
116
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:resume
|
|
3
|
+
description: 恢复工作 — 从中断处继续
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 交互规范
|
|
7
|
+
|
|
8
|
+
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项传入。** 不要用编号列表让用户手动输入数字。需要自由输入时在选项中加入"Other(自定义输入)"。
|
|
9
|
+
|
|
10
|
+
## 流程
|
|
11
|
+
|
|
12
|
+
1. **读进度**:跑 `sillyspec progress show`。
|
|
13
|
+
2. **有活跃变更**:把当前状态(变更/阶段/步骤)转述给用户,用 AskUserQuestion 问「直接继续执行下一步 / 查看更多细节」。
|
|
14
|
+
3. **无活跃变更**:跑 `sillyspec next`——CLI 已内置全套探测(文件存在性 → 推断阶段 → 建议命令 + 依据),按输出转述并执行建议命令。勿自行 ls/cat 重算(输出与实际不符时才手工核对)。
|
|
15
|
+
|
|
16
|
+
## 关键原则
|
|
17
|
+
|
|
18
|
+
- 进度存 SQLite(`.sillyspec/.runtime/sillyspec.db`),随 `sillyspec run <stage> --done` 自动更新,不需要手动保存、不需要从中途状态"恢复文件"——直接续跑即可。
|
|
19
|
+
|
|
20
|
+
## 用户指令
|
|
21
|
+
$ARGUMENTS
|