sillyspec 3.5.1 → 3.6.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sillyspec",
3
- "version": "3.5.1",
3
+ "version": "3.6.0",
4
4
  "description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
5
5
  "type": "module",
6
6
  "bin": {
package/src/init.js CHANGED
@@ -22,6 +22,7 @@ const DESCRIPTIONS = {
22
22
  execute: '波次执行 — 子代理并行 + 强制 TDD + 两阶段审查',
23
23
  verify: '验证实现 — 对照规范检查 + 测试套件',
24
24
  archive: '归档变更 — 规范沉淀,可追溯',
25
+ commit: '智能提交 — 自动收集变更信息,生成 commit message',
25
26
  status: '查看项目进度和状态',
26
27
  continue: '自动判断并执行下一步',
27
28
  state: '查看当前工作状态 — 显示 STATE.md 内容',
@@ -41,6 +42,7 @@ const ARG_HINTS = {
41
42
  execute: '[任务编号或 \'all\']',
42
43
  verify: '[可选:指定验证范围]',
43
44
  archive: '[变更名]',
45
+ commit: '[可选:自定义 commit message]',
44
46
  status: '',
45
47
  continue: '',
46
48
  state: '[可选备注]',
@@ -54,9 +54,11 @@ $ARGUMENTS
54
54
  - **tasks.md:** 确保所有 checkbox 都已勾选 `[x]`
55
55
  - **ROADMAP.md**(如存在):标记对应 Phase 已完成
56
56
  - **STATE.md:** 清除当前变更信息,历史记录追加归档完成(含精确到秒的时间戳)
57
- - **Git 提交:** `git add .sillyspec/ && git commit -m "docs: archive sillyspec change <change-name>"`
57
+ - **Git 暂存:** `git add .sillyspec/`
58
58
 
59
- **工作区模式下:** 如果变更属于某个子项目,cd 到子项目目录执行 git commit。工作区根目录无 git 则跳过。
59
+ **工作区模式下:** 如果变更属于某个子项目,cd 到子项目目录执行 git add。工作区根目录无 git 则跳过。
60
+
61
+ 💡 归档产出已暂存。准备好后用 `/sillyspec:commit` 提交。
60
62
 
61
63
  ### 最后说:
62
64
 
@@ -53,7 +53,7 @@ $ARGUMENTS
53
53
  cat .sillyspec/config.yaml 2>/dev/null
54
54
  ```
55
55
 
56
- **工作区模式:** AskUserQuestion 选子项目,**cd 到子项目目录执行**,加载子项目上下文 + 共享规范 + 工作区概览,设计文档保存到子项目 `.sillyspec/changes/`。git commit 在子项目目录执行。
56
+ **工作区模式:** AskUserQuestion 选子项目,**cd 到子项目目录执行**,加载子项目上下文 + 共享规范 + 工作区概览,设计文档保存到子项目 `.sillyspec/changes/`。修改在子项目目录中暂存。
57
57
 
58
58
  **单项目模式:**
59
59
  ```bash
@@ -100,9 +100,10 @@ mkdir -p .sillyspec/changes/<变更名>/stages
100
100
 
101
101
  ```bash
102
102
  git add .sillyspec/changes/<变更名>/MASTER.md
103
- git commit -m "docs: master change plan for <变更名>"
104
103
  ```
105
104
 
105
+ 💡 大模块计划已暂存。准备好后用 `/sillyspec:commit` 提交。
106
+
106
107
  提示用户:`/sillyspec:brainstorm <变更名>/stage-1`
107
108
 
108
109
  **子阶段 brainstorm:** 读取 MASTER.md + 前序阶段经验 + 对应原型,设计文档保存到 `.sillyspec/changes/<变更名>/stages/<stage-N>/`。
@@ -0,0 +1,121 @@
1
+ ## 交互规范
2
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
3
+
4
+ ## 用法
5
+ - `/sillyspec:commit` — 智能提交:自动收集变更信息,生成 commit message
6
+ - `/sillyspec:commit "自定义 message"` — 使用指定 message 直接提交
7
+
8
+ ## 任务
9
+ $ARGUMENTS
10
+
11
+ ---
12
+
13
+ ## 流程
14
+
15
+ ### 1. 检查是否有未提交的修改
16
+
17
+ ```bash
18
+ git diff --quiet 2>/dev/null; UNSTAGED=$?
19
+ git diff --cached --quiet 2>/dev/null; STAGED=$?
20
+ ```
21
+
22
+ 两者都为 0(无修改)→ 提示"没有需要提交的修改",结束。
23
+
24
+ ### 2. 暂存所有修改
25
+
26
+ ```bash
27
+ git add -A
28
+ ```
29
+
30
+ ### 3. 收集变更语义信息
31
+
32
+ ```bash
33
+ # 上次 commit 时间
34
+ LAST_COMMIT_TIME=$(git log -1 --format=%ci 2>/dev/null)
35
+
36
+ # 修改的文件列表
37
+ git diff --cached --stat
38
+ ```
39
+
40
+ 从以下来源收集语义信息(筛选时间戳 > LAST_COMMIT_TIME 的条目):
41
+
42
+ **来源 A — QUICKLOG(quick 产生的修改):**
43
+ ```bash
44
+ USER=$(git config user.name 2>/dev/null || echo "default")
45
+ cat .sillyspec/quicklog/QUICKLOG-${USER}.md 2>/dev/null
46
+ ```
47
+
48
+ **来源 B — tasks.md(execute 产生的修改):**
49
+ ```bash
50
+ LATEST=$(ls -d .sillyspec/changes/*/ 2>/dev/null | grep -v archive | tail -1)
51
+ cat "$LATEST/tasks.md" 2>/dev/null
52
+ ```
53
+ 筛选时间戳 > LAST_COMMIT_TIME 的已勾选 task。
54
+
55
+ **来源 C — 阶段产出(scan/brainstorm/propose/plan/archive 等):**
56
+ 检查 `.sillyspec/` 下新增或修改的文件,根据路径识别来源阶段:
57
+ - `codebase/*.md` → scan 产出
58
+ - `changes/<name>/proposal.md` → propose 产出
59
+ - `changes/<name>/design.md` 或 `tasks.md` → plan 产出
60
+ - `changes/archive/` → archive 产出
61
+ - `specs/*.md` → brainstorm 产出
62
+ - `knowledge/*.md` → 知识库更新
63
+
64
+ ### 4. 自动生成 commit message
65
+
66
+ 按 conventional commits 格式,根据来源生成 message:
67
+
68
+ | 来源 | type | 示例 |
69
+ |---|---|---|
70
+ | 只有 quick 条目 | fix/refactor | `fix: 手机号校验修复(含正则修正)` |
71
+ | 只有 execute 条目 | feat | `feat(user): 用户模块 task 1~3` |
72
+ | 只有阶段产出 | docs | `docs: sillyspec scan 完成` |
73
+ | 混合来源 | 取最主要的 type | body 里列出所有条目 |
74
+ | 无匹配来源 | — | 展示 diff stat,让用户自己写 |
75
+
76
+ **如果 $ARGUMENTS 非空**,直接使用用户指定的 message,跳过自动生成。
77
+
78
+ **多条 quick 合并规则:**
79
+ - 2 条以内 → 逐条列出
80
+ - 3 条以上 → 摘要 + body 详情
81
+
82
+ ### 5. 展示确认
83
+
84
+ 用 AskUserQuestion 展示:
85
+
86
+ ```
87
+ 📝 建议的 commit message:
88
+ fix: 手机号校验修复(含正则修正)
89
+
90
+ 📁 修改文件(N 个):
91
+ src/UserService.java (+15 -3)
92
+ src/PhoneValidator.java (+28 -0)
93
+
94
+ 选择:确认提交 / 编辑 message / 取消
95
+ ```
96
+
97
+ 用户选择编辑 → 让用户输入新 message → 再次确认。
98
+
99
+ ### 6. 执行提交
100
+
101
+ ```bash
102
+ git commit -m "{确认后的 message}"
103
+ ```
104
+
105
+ 提交成功后展示 commit hash + 文件数 + 行数统计。
106
+
107
+ ## 工作区模式
108
+
109
+ ```bash
110
+ cat .sillyspec/config.yaml 2>/dev/null
111
+ ```
112
+
113
+ 有子项目配置时:
114
+ - 检查修改的文件分别属于哪个子项目
115
+ - 修改集中在一个子项目 → 在该子项目目录中 commit
116
+ - 修改跨多个子项目 → 用 AskUserQuestion 让用户选择:分开提交(每个子项目一个 commit)/ 合并提交
117
+
118
+ ## 绝对规则
119
+ - ❌ 不要自动提交,必须展示 message 让用户确认
120
+ - ❌ 不要丢弃用户的修改
121
+ - ✅ $ARGUMENTS 非空时可跳过确认直接提交
@@ -34,7 +34,7 @@ $ARGUMENTS
34
34
  cat .sillyspec/config.yaml 2>/dev/null
35
35
  ```
36
36
 
37
- **工作区模式:** 根据计划 Task 标注确定子项目,额外加载共享规范 + CODEBASE-OVERVIEW.md。所有代码修改、测试运行、git commit 都在子项目目录中执行。
37
+ **工作区模式:** 根据计划 Task 标注确定子项目,额外加载共享规范 + CODEBASE-OVERVIEW.md。所有代码修改、测试运行在子项目目录中执行。
38
38
 
39
39
  **加载以下文件(主代理读取,后续注入子代理):**
40
40
  ```bash
@@ -45,6 +45,13 @@ cat .sillyspec/codebase/{CONVENTIONS,ARCHITECTURE}.md 2>/dev/null
45
45
  cat .sillyspec/local.yaml 2>/dev/null
46
46
  ```
47
47
 
48
+ **知识库查询(强制步骤):**
49
+ 主代理在 dispatch 每个子代理前,必须执行:
50
+ ```bash
51
+ cat .sillyspec/knowledge/INDEX.md 2>/dev/null
52
+ ```
53
+ 根据当前 task 描述中的关键词(技术名词、模块名、文件路径等)匹配 INDEX.md 条目。命中时读取对应 knowledge 文件,将内容注入子代理 prompt 的「相关知识」段。未命中则跳过,不注入空段。
54
+
48
55
  如果 `$ARGUMENTS` 指定范围(如 `wave-1`、`task-3`),只执行对应部分。
49
56
 
50
57
  ---
@@ -91,6 +98,9 @@ cat .sillyspec/local.yaml 2>/dev/null
91
98
  ## 工作目录
92
99
  {子项目目录路径,工作区模式需要 cd 到此目录}
93
100
 
101
+ ## 相关知识(如有)
102
+ {主代理从 knowledge/ 中按任务关键词匹配到的内容,未命中则删除此段}
103
+
94
104
  ## 铁律(必须遵守)
95
105
  1. **先读后写:** 先 cat 要修改的文件和参考文件,确认风格和方法签名后再写
96
106
  2. **grep 确认:** 调用已有方法前必须 grep 确认存在,grep 不到 → 报告 BLOCKED
@@ -98,7 +108,7 @@ cat .sillyspec/local.yaml 2>/dev/null
98
108
  4. **不自行补全:** 发现缺失接口/方法,不自己写,报告 BLOCKED
99
109
  5. **TDD 不跳步:** 按任务步骤逐步执行,每步必须运行测试命令并确认结果
100
110
  6. **测试直接通过 = 测了已有行为,重写测试**
101
- 7. **commit:** 完成后在工作目录执行 git add -A && git commit
111
+ 7. **暂存:** 完成后在工作目录执行 git add -A(不要 commit,由用户通过 /sillyspec:commit 统一提交)
102
112
  8. **不修改计划外的文件**,如必须修改则在报告中说明
103
113
 
104
114
  ## 完成后报告(严格按此格式)
@@ -108,6 +118,7 @@ cat .sillyspec/local.yaml 2>/dev/null
108
118
  - **测试结果:** {通过/失败/跳过及原因}
109
119
  - **Commit:** {hash 或 "无"}
110
120
  - **问题:** {BLOCKED 原因 / DONE_WITH_CONCERNS 描述 / 无}
121
+ - **发现的坑:** {执行过程中发现的项目特有规律/陷阱/约定,如无则写"无"。示例:"XxxMapper.selectPage() 第一个参数必须是 IPage 对象,传 null 会 NPE 而非返回全部"}
111
122
  ```
112
123
 
113
124
  ### 子代理结果处理
@@ -121,10 +132,28 @@ cat .sillyspec/local.yaml 2>/dev/null
121
132
  - 跳过(勾选并标注 SKIPPED)
122
133
  - 停止(暂停执行,用户处理后继续)
123
134
 
135
+ **知识库写入:** 如果子代理报告中「发现的坑」不为"无",主代理将内容追加到 `.sillyspec/knowledge/uncategorized.md`,格式:
136
+ ```markdown
137
+ ### [待确认] {简短标题}
138
+ > 来源:{变更名} / {task 编号} | {时间戳}
139
+
140
+ {坑的具体描述}
141
+ ```
142
+
124
143
  ---
125
144
 
126
145
  ## 完成后
127
146
 
147
+ **知识库审阅:** 检查是否有待确认的知识条目:
148
+ ```bash
149
+ grep -c '^\### \[待确认\]' .sillyspec/knowledge/uncategorized.md 2>/dev/null
150
+ ```
151
+ 如果有待确认条目,提示用户:
152
+ > 📚 本轮执行发现了 N 条新知识,请审阅:`cat .sillyspec/knowledge/uncategorized.md`
153
+ > 确认后请将 `[待确认]` 改为 `[已确认]`,并可归类到 knowledge/ 下的专题文件中更新 INDEX.md。
154
+
155
+ 💡 所有修改已暂存。准备好后用 `/sillyspec:commit` 提交。
156
+
128
157
  所有任务完成后,用 AskUserQuestion 询问用户下一步:
129
158
  1. **验证** — 执行 `/sillyspec:verify` 全面验证
130
159
  2. **归档** — 跳过 verify,执行 `/sillyspec:archive`
package/templates/init.md CHANGED
@@ -49,9 +49,11 @@ ls -la
49
49
  ### Step 6: Git 初始化
50
50
 
51
51
  ```bash
52
- git init && git add . && git commit -m "chore: sillyspec init - project initialized"
52
+ git init && git add .
53
53
  ```
54
54
 
55
+ 💡 项目已初始化并暂存。准备好后用 `/sillyspec:commit` 提交。
56
+
55
57
  ### 最后说:
56
58
 
57
59
  > ✅ 项目初始化完成!
@@ -21,18 +21,23 @@ $ARGUMENTS
21
21
  1. **解析参数:** 检查是否携带 `--change <变更名>`,确定记录方式
22
22
  2. **理解任务:** 模糊则问一个问题确认
23
23
  3. **加载上下文:** `cat .sillyspec/codebase/{CONVENTIONS,ARCHITECTURE}.md 2>/dev/null`
24
- 4. **先读后写:** 调用已有方法前 `cat` 源文件确认签名,`grep` 确认方法存在
25
- 5. **TDD 执行:**
24
+ 4. **知识库查询(强制步骤):**
25
+ ```bash
26
+ cat .sillyspec/knowledge/INDEX.md 2>/dev/null
27
+ ```
28
+ 根据当前任务描述中的关键词匹配 INDEX.md 条目,命中时 `cat` 对应知识文件,将内容纳入后续开发考量。未命中则跳过。
29
+ 5. **先读后写:** 调用已有方法前 `cat` 源文件确认签名,`grep` 确认方法存在
30
+ 6. **TDD 执行:**
26
31
  ```
27
32
  🔴 RED → 先写测试,运行确认失败
28
33
  🟢 GREEN → 写最少代码让测试通过
29
34
  🔵 REFACTOR → 清理,保持测试通过
30
- COMMIT → git 提交(测试文件必须包含在提交中)
35
+ STAGE → git add 暂存(测试文件必须包含在暂存中)
31
36
  ```
32
37
  测试文件必须保留在项目中,不能删除。违反 TDD → 删掉代码从测试重新开始。
33
38
  - 纯配置/数据/文档可跳过 TDD
34
39
  - 其他情况一律走 TDD
35
- 6. **运行测试:** 先检查 local.yaml 构建命令配置:
40
+ 7. **运行测试:** 先检查 local.yaml 构建命令配置:
36
41
  ```bash
37
42
  cat .sillyspec/local.yaml 2>/dev/null
38
43
  ```
@@ -40,17 +45,30 @@ cat .sillyspec/local.yaml 2>/dev/null
40
45
  ```bash
41
46
  mvn test -pl <模块> -Dtest=<测试类> 2>/dev/null || ./gradlew test --tests <测试类> 2>/dev/null || pnpm test 2>/dev/null || npm test 2>/dev/null || pytest <测试文件> 2>/dev/null
42
47
  ```
43
- 7. **Git commit:** 展示 commit message 给用户确认后提交。**工作区模式下,确认当前在正确的子项目目录中执行 commit。**
44
- 8. **记录:**
48
+ 8. **Git 暂存:** `git add -A`。**不要 commit**,由用户通过 `/sillyspec:commit` 统一提交。**工作区模式下,确认当前在正确的子项目目录中执行暂存。**
49
+ 9. **记录:**
45
50
  - **有 `--change`:** 在 `.sillyspec/changes/<变更名>/tasks.md` 追加 task 并勾选,**记录精确到秒的时间戳**:
46
51
 
47
52
  ```
48
53
  - [x] [YYYY-MM-DD HH:MM:SS] 任务描述
49
54
  ```
50
55
  - **无 `--change`:** 记录到 `.sillyspec/quicklog/QUICKLOG-<git用户名>.md`(见下方规则)
51
- 9. **检查复杂度:** 任务比预期复杂 → 建议用完整流程
56
+ 10. **检查复杂度:** 任务比预期复杂 → 建议用完整流程
57
+
58
+ 11. **记录发现的坑:** 执行过程中如果发现项目特有的规律、陷阱或约定(如"某方法参数顺序容易搞反"、"某表有隐藏软删除字段"),追加到 `.sillyspec/knowledge/uncategorized.md`,格式:
59
+
60
+ ```markdown
61
+ ### [待确认] {简短标题}
62
+ > 来源:quick / {时间戳}
63
+
64
+ {坑的具体描述}
65
+ ```
66
+
67
+ **工作区模式下:** 只影响当前子项目 → 写入当前子项目 `.sillyspec/knowledge/uncategorized.md`;影响多个子项目 → 写入工作区根目录 `.sillyspec/knowledge/uncategorized.md`。
52
68
 
53
- 10. **记录发现的坑:** 执行过程中如果发现项目特有的规律、陷阱或约定(如"某方法参数顺序容易搞反"、"某表有隐藏软删除字段"),追加到 CONVENTIONS.md 的「注意事项」章节。**工作区模式下:** 只影响当前子项目 → 写入当前子项目 `.sillyspec/codebase/CONVENTIONS.md`;影响多个子项目 → 写入 `.sillyspec/shared/CONVENTIONS.md`(共享规范,所有子项目可见)。
69
+ 12. **知识库审阅提示:** 如果本次执行向 knowledge/ 写入了新条目,提示用户:
70
+ > 📚 本次 quick 发现了新知识,请审阅:`cat .sillyspec/knowledge/uncategorized.md`
71
+ > 确认后请将 `[待确认]` 改为 `[已确认]`,并可归类到 knowledge/ 下的专题文件中更新 INDEX.md。
54
72
 
55
73
  ### QUICKLOG 规则
56
74
 
@@ -67,7 +85,6 @@ LOG_FILE=".sillyspec/quicklog/QUICKLOG-${USER}.md"
67
85
  ```markdown
68
86
  ## YYYY-MM-DD HH:MM:SS | fix: 任务描述
69
87
  - 文件:`修改的文件列表`
70
- - commit:`commit hash`
71
88
  - 关联归档:`相关的已归档变更名`(如有)
72
89
  ```
73
90
 
@@ -34,13 +34,15 @@ find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "
34
34
  3. **CONVENTIONS.md** — 空骨架文件,含章节标题(注意事项、代码风格等),供后续 quick/execute 追加
35
35
  4. **PROJECT.md** — 项目概览
36
36
 
37
- ### Step 4: Git 提交
37
+ ### Step 4: 暂存修改
38
38
 
39
39
  ```bash
40
- git add .sillyspec/ && git commit -m "chore: sillyspec quick scan"
40
+ git add .sillyspec/
41
41
  ```
42
42
 
43
- 工作区模式在每个子项目分别提交。
43
+ 工作区模式在每个子项目分别暂存。
44
+
45
+ 💡 扫描产出已暂存。准备好后用 `/sillyspec:commit` 提交。
44
46
 
45
47
  ### 完成
46
48
 
package/templates/scan.md CHANGED
@@ -112,15 +112,40 @@ for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS PROJEC
112
112
  [ -f ".sillyspec/codebase/${f}.md" ] && echo "✅ ${f}.md"
113
113
  done
114
114
 
115
+ # 生成知识库骨架
116
+ mkdir -p .sillyspec/knowledge
117
+ if [ ! -f ".sillyspec/knowledge/INDEX.md" ]; then
118
+ cat > .sillyspec/knowledge/INDEX.md << 'EOF'
119
+ # Knowledge Index
120
+
121
+ > 子代理任务开始前查询此文件,按关键词匹配,只读命中的知识文件。
122
+ > execute/quick 执行中发现的坑自动追加到 uncategorized.md,经用户确认后归类到对应文件。
123
+
124
+ <!-- 格式:关键词1|关键词2|关键词3 → 文件路径 -->
125
+ <!-- 示例:mybatis-plus|分页|Page → pagination.md -->
126
+ <!-- 示例:跨域|CORS|preflight → cors.md -->
127
+ EOF
128
+ fi
129
+ if [ ! -f ".sillyspec/knowledge/uncategorized.md" ]; then
130
+ cat > .sillyspec/knowledge/uncategorized.md << 'EOF'
131
+ # 未分类知识
132
+
133
+ > execute/quick 执行中发现的坑暂存于此,用户审阅后归类到对应文件并更新 INDEX.md。
134
+
135
+ EOF
136
+ fi
137
+
115
138
  # 验证 CLI
116
139
  sillyspec status --json # 应返回 phase: "brainstorm"
117
140
  sillyspec next # 推荐给用户
118
141
 
119
- # 清理 + 提交
142
+ # 清理
120
143
  rm -f .sillyspec/codebase/_env-detect.md
121
- git add .sillyspec/ && git commit -m "chore: sillyspec scan - codebase mapped"
144
+ git add .sillyspec/
122
145
  ```
123
146
 
147
+ 💡 扫描产出已暂存。准备好后用 `/sillyspec:commit` 提交。
148
+
124
149
  ### 自检门控
125
150
  - [ ] ARCHITECTURE.md:技术栈 + Schema 摘要?
126
151
  - [ ] CONVENTIONS.md:隐形规则 + 代码风格?