sillyspec 3.4.0 → 3.5.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.
@@ -53,7 +53,7 @@ $ARGUMENTS
53
53
 
54
54
  - **tasks.md:** 确保所有 checkbox 都已勾选 `[x]`
55
55
  - **ROADMAP.md**(如存在):标记对应 Phase 已完成
56
- - **STATE.md:** 清除当前变更信息,历史记录追加归档完成
56
+ - **STATE.md:** 清除当前变更信息,历史记录追加归档完成(含精确到秒的时间戳)
57
57
  - **Git 提交:** `git add .sillyspec/ && git commit -m "docs: archive sillyspec change <change-name>"`
58
58
 
59
59
  **工作区模式下:** 如果变更属于某个子项目,cd 到子项目目录执行 git commit。工作区根目录无 git 则跳过。
@@ -58,7 +58,7 @@ cat .sillyspec/config.yaml 2>/dev/null
58
58
  **单项目模式:**
59
59
  ```bash
60
60
  cat .sillyspec/{PROJECT,REQUIREMENTS,ROADMAP}.md 2>/dev/null
61
- cat .sillyspec/codebase/{STRUCTURE,CONVENTIONS}.md 2>/dev/null
61
+ cat .sillyspec/codebase/{STRUCTURE,CONVENTIONS,ARCHITECTURE}.md 2>/dev/null
62
62
  ls .sillyspec/changes/ 2>/dev/null | grep -v archive
63
63
  ls .sillyspec/knowledge/ 2>/dev/null
64
64
  ```
@@ -1,8 +1,3 @@
1
- ---
2
- description: 自动判断并执行下一步
3
- argument-hint: ""
4
- ---
5
-
6
1
  ## 核心约束(必须遵守)
7
2
  - ❌ 跳过自动判断,直接执行某个阶段
8
3
 
@@ -10,7 +5,14 @@ argument-hint: ""
10
5
 
11
6
  ## 判断逻辑
12
7
 
13
- 按顺序检查,第一个未完成的就执行:
8
+ **先检查是否工作区模式:**
9
+ ```bash
10
+ cat .sillyspec/config.yaml 2>/dev/null | grep -q "projects"
11
+ ```
12
+
13
+ **工作区模式:** 同时检查根目录和每个子项目,列出所有未完成的工作,让用户选择继续哪个。
14
+
15
+ **单项目模式:** 按顺序检查,第一个未完成的就执行:
14
16
 
15
17
  ```
16
18
  1. 有进行中的变更?
@@ -6,17 +6,22 @@
6
6
  - ❌ 跳步执行(不允许跳过 plan 直接 execute)
7
7
  - ❌ 先写代码后补测试
8
8
  - ❌ 编造不存在的方法/注解/路径/类/字段
9
- - ❌ 自行补全缺失的接口/方法(应报告给用户)
9
+ - ❌ 自行补全缺失的接口/方法(应报告 BLOCKED)
10
10
  - ❌ 意外修改了计划外的文件却不报告
11
11
 
12
12
  ## 状态检查(必须先执行)
13
13
 
14
14
  ```bash
15
- sillyspec status --json
15
+ cat .sillyspec/STATE.md 2>/dev/null
16
16
  ```
17
17
 
18
- - `phase: "execute"` 继续
19
- - 其他 phase → 提示用户 `sillyspec next`
18
+ STATE.md 且 phase execute → 继续。无 STATE.md 或 phase 不对 → 检查是否有未完成的 tasks.md:
19
+
20
+ ```bash
21
+ ls .sillyspec/changes/*/tasks.md 2>/dev/null | xargs grep -l '\- \[ \]' 2>/dev/null
22
+ ```
23
+
24
+ 有未完成的 tasks.md → 继续。没有 → 提示 `/sillyspec:continue`。
20
25
 
21
26
  ## 执行范围
22
27
  $ARGUMENTS
@@ -29,143 +34,95 @@ $ARGUMENTS
29
34
  cat .sillyspec/config.yaml 2>/dev/null
30
35
  ```
31
36
 
32
- **工作区模式:** 根据计划 Task 标注确定子项目,额外加载共享规范 + CODEBASE-OVERVIEW.md,**执行前必须 cd 到对应子项目目录**。所有代码修改、测试运行、git commit 都在子项目目录中执行。一个 Task 属于哪个子项目,就 cd 到哪个子项目。
37
+ **工作区模式:** 根据计划 Task 标注确定子项目,额外加载共享规范 + CODEBASE-OVERVIEW.md。所有代码修改、测试运行、git commit 都在子项目目录中执行。
33
38
 
34
- **单项目模式:**
39
+ **加载以下文件(主代理读取,后续注入子代理):**
35
40
  ```bash
36
41
  PLAN=$(ls -t .sillyspec/changes/*/tasks.md 2>/dev/null | head -1); cat "$PLAN"
37
42
  LATEST=$(ls -d .sillyspec/changes/*/ | grep -v archive | tail -1)
38
43
  cat "$LATEST"/{tasks,design}.md 2>/dev/null
39
- cat .sillyspec/codebase/CONVENTIONS.md 2>/dev/null
44
+ cat .sillyspec/codebase/{CONVENTIONS,ARCHITECTURE}.md 2>/dev/null
45
+ cat .sillyspec/local.yaml 2>/dev/null
40
46
  ```
41
47
 
42
- 确认实际存在的文件,不存在的标注跳过。如果 `$ARGUMENTS` 指定范围(如 `wave-1`、`task-3`),只执行对应部分。
48
+ 如果 `$ARGUMENTS` 指定范围(如 `wave-1`、`task-3`),只执行对应部分。
43
49
 
44
50
  ---
45
51
 
46
- ## 执行策略
52
+ ## 确认频率
47
53
 
48
54
  用 AskUserQuestion 询问用户选择:
49
-
50
- **1. 执行模式:**
51
- - 串行执行当前会话逐任务执行,适合简单变更
52
- - 子代理并行 — 每个 Task 启动独立子代理,适合多任务独立变更
53
-
54
- **2. 确认频率:**
55
- - 每个任务确认 — 每完成一个 task 展示结果,等用户确认后继续
56
- - 每 N 个任务确认 — 每完成 N 个 task 汇总展示,用户一次性确认
57
- - AI 自主判断 — AI 在遇到歧义、风险、计划外变更时才询问,其余自动推进
58
- - 全自动 — 全部自动执行,不在中途打断用户
59
-
60
- 选择子代理模式时:
61
- 1. 按计划的 Wave 分组
62
- 2. 每个 Task 启动独立子代理(不继承主 session 历史)
63
- 3. 子代理上下文:任务描述 + 相关约定 + 要修改文件和被调用类的源码
55
+ - **每个 Wave 确认** — 每个 Wave 完成后展示结果,等用户确认后继续下一 Wave
56
+ - **AI 自主判断** — AI 在遇到 BLOCKED 或计划外变更时才询问,其余自动推进
57
+ - **全自动**全部自动执行,不在中途打断用户
64
58
 
65
59
  ---
66
60
 
67
- ## 每个任务的执行流程
68
-
69
- ### 1. 先读后写
70
-
71
- 写代码前,读取相关源文件确认风格和方法签名:
72
-
73
- ```bash
74
- # 读取 CONVENTIONS
75
- cat .sillyspec/codebase/{CONVENTIONS,ARCHITECTURE}.md 2>/dev/null
76
- # 读取要修改的文件和同模块参考文件
77
- cat <要修改的文件路径>
78
- cat <参考文件路径>
79
- ```
80
-
81
- **调用已有方法前,grep 确认存在:**
82
- ```bash
83
- grep -rn "public.*getById" --include="*.java" src/main/java/**/service/
84
- ```
85
- grep 不到 → 不许调用,先查清楚或报告给用户。
86
-
87
- ### 2. TDD(强制执行,不可跳过)
88
-
89
- #### 🔴 RED — 写失败测试
90
-
91
- 先写测试文件,再写实现代码。写代码前测试必须先存在。
92
-
93
- **写完测试后,立即运行确认失败:**
61
+ ## 子代理执行(强制模式)
94
62
 
95
- 先检查 local.yaml 是否有构建命令配置:
96
- ```bash
97
- cat .sillyspec/local.yaml 2>/dev/null 2>/dev/null
98
- ```
99
-
100
- 如果有,使用 local.yaml 中的命令(含 `-s` 等参数);否则使用默认命令:
101
-
102
- ```bash
103
- mvn test -pl <模块> -Dtest=<测试类> 2>/dev/null || ./gradlew test --tests <测试类> 2>/dev/null || npm test -- --testPathPattern=<测试文件> 2>/dev/null || pytest <测试文件> 2>/dev/null
104
- ```
63
+ **所有任务通过子代理执行,主代理负责调度和记录。**
105
64
 
106
- 确认:
107
- - 测试失败(不是编译错误)
108
- - 失败原因是功能未实现(不是语法错误)
65
+ ### 执行流程
109
66
 
110
- **测试直接通过?** 你在测试已有行为,重写测试。**测试编译报错?** 先修测试语法。
67
+ 1. 解析 tasks.md,按 Wave 分组
68
+ 2. 同一 Wave 内的任务**并行启动**子代理,不同 Wave **串行等待**
69
+ 3. 每个 Wave 完成后,根据用户选择的确认频率决定是否暂停
70
+ 4. 子代理返回结果后,主代理勾选 tasks.md、更新 STATE.md
111
71
 
112
- #### 🟢 GREEN — 写最少代码
72
+ ### 子代理 Prompt 模板
113
73
 
114
- 写刚好让测试通过的最少代码。不加额外功能。
74
+ 主代理在 dispatch 子代理前,必须准备以下 prompt(所有内容**内联**,不让子代理自己读文件):
115
75
 
116
- **写完后立即运行确认通过:**
117
-
118
- 先检查 local.yaml 是否有构建命令配置:
119
- ```bash
120
- cat .sillyspec/local.yaml 2>/dev/null 2>/dev/null
121
76
  ```
77
+ 你正在执行任务:
122
78
 
123
- 如果有,使用 local.yaml 中的命令;否则使用默认命令:
124
-
125
- ```bash
126
- mvn test -pl <模块> -Dtest=<测试类> 2>/dev/null || ./gradlew test --tests <测试类> 2>/dev/null || npm test -- --testPathPattern=<测试文件> 2>/dev/null || pytest <测试文件> 2>/dev/null
127
- ```
79
+ ## 任务描述
80
+ {tasks.md 中当前 task 的完整内容,包括步骤字段}
128
81
 
129
- 确认:
130
- - 测试通过
131
- - 其他已有测试没有因此失败
132
- - 无编译错误、无 warnings
82
+ ## 项目约定
83
+ {CONVENTIONS.md 全文}
133
84
 
134
- **编译不通过或测试失败?** 修代码,不是改测试。**其他测试被破坏?** 立即修复。
85
+ ## 项目架构
86
+ {ARCHITECTURE.md 全文}
135
87
 
136
- #### 🔵 REFACTOR — 清理
88
+ ## 构建命令
89
+ {local.yaml 中的 build 命令,如无则给默认命令}
137
90
 
138
- 在测试全绿的前提下清理:提取重复、改善命名、简化逻辑。重构后重新运行测试确认仍然通过。
91
+ ## 工作目录
92
+ {子项目目录路径,工作区模式需要 cd 到此目录}
139
93
 
140
- **TDD 中间步骤(RED→GREEN→REFACTOR)连续执行,不需要每步等用户确认。但每一步都必须运行测试命令并确认结果,不可省略。**
94
+ ## 铁律(必须遵守)
95
+ 1. **先读后写:** 先 cat 要修改的文件和参考文件,确认风格和方法签名后再写
96
+ 2. **grep 确认:** 调用已有方法前必须 grep 确认存在,grep 不到 → 报告 BLOCKED
97
+ 3. **不编造:** 不编造不存在的方法/注解/类/字段
98
+ 4. **不自行补全:** 发现缺失接口/方法,不自己写,报告 BLOCKED
99
+ 5. **TDD 不跳步:** 按任务步骤逐步执行,每步必须运行测试命令并确认结果
100
+ 6. **测试直接通过 = 测了已有行为,重写测试**
101
+ 7. **commit:** 完成后在工作目录执行 git add -A && git commit
102
+ 8. **不修改计划外的文件**,如必须修改则在报告中说明
141
103
 
142
- **测试文件必须保留**,随代码一起 commit。违反 TDD(先写代码后补测试)→ 删代码重来。
104
+ ## 完成后报告(严格按此格式)
143
105
 
144
- **可跳过 TDD(不需要确认):** 纯配置(YAML/properties)、纯数据(SQL seed)、纯文档(README/注释)。
145
-
146
- ### 3. 勾选 tasks
147
-
148
- 完成后在 `.sillyspec/changes/<变更名>/tasks.md` 勾选对应 checkbox:`- [x] [YYYY-MM-DD HH:MM:SS] 任务描述`
149
-
150
- ### 4. Git commit
151
-
152
- **先确认当前在 git 仓库中:**
153
- ```bash
154
- git rev-parse --is-inside-work-tree 2>/dev/null
106
+ - **Status:** DONE / DONE_WITH_CONCERNS / BLOCKED
107
+ - **改动文件:** {列表}
108
+ - **测试结果:** {通过/失败/跳过及原因}
109
+ - **Commit:** {hash 或 "无"}
110
+ - **问题:** {BLOCKED 原因 / DONE_WITH_CONCERNS 描述 / 无}
155
111
  ```
156
112
 
157
- 如果不在 git 仓库中,提示用户当前目录没有 git 管理,跳过 commit 或让用户指定仓库路径。
113
+ ### 子代理结果处理
158
114
 
159
- `git add -A` → 生成 commit message → **根据用户选择的确认频率决定是否立即确认或批量确认**。
115
+ 子代理返回后,主代理:
160
116
 
161
- **工作区模式下,每个子项目的 commit 独立执行,不要跨子项目 commit。**
117
+ 1. **DONE** 勾选 tasks.md,记录精确到秒的时间戳
118
+ 2. **DONE_WITH_CONCERNS** → 勾选 tasks.md,记录问题到报告
119
+ 3. **BLOCKED** → 不勾选,报告给用户,AskUserQuestion 三选一:
120
+ - 重试(重新 dispatch 同一任务)
121
+ - 跳过(勾选并标注 SKIPPED)
122
+ - 停止(暂停执行,用户处理后继续)
162
123
 
163
124
  ---
164
125
 
165
- ## 偏差处理
166
-
167
- 遇到问题:**停 → 报告 → 等人工确认。** 代码缺失、方法不存在、计划外变更 → 先读已有代码,再问用户。
168
-
169
126
  ## 完成后
170
127
 
171
128
  所有任务完成后,用 AskUserQuestion 询问用户下一步:
@@ -173,8 +130,4 @@ git rev-parse --is-inside-work-tree 2>/dev/null
173
130
  2. **归档** — 跳过 verify,执行 `/sillyspec:archive`
174
131
  3. **继续开发** — 不结束当前阶段
175
132
 
176
- ```bash
177
- sillyspec status --json && sillyspec next
178
- ```
179
-
180
- 更新 `.sillyspec/STATE.md`:阶段改为 `execute ✅` 或 `execute 🔄 (X/M)`,历史记录追加执行结果。
133
+ 更新 `.sillyspec/STATE.md`:阶段改为 `execute ✅` 或 `execute 🔄 (X/M)`,历史记录追加执行结果(含精确到秒的时间戳)。
@@ -1,14 +1,3 @@
1
- ---
2
- description: 导出成功方案为可复用模板
3
- argument-hint: "<change-name> [--to <path>]"
4
- ---
5
-
6
- ## 核心约束(必须遵守)
7
- - ❌ 修改任何文件(只读)
8
-
9
- ## 参数解析
10
- `$ARGUMENTS`:变更名 + 可选 `--to` 输出路径(默认 `~/.sillyspec/templates/<change-name>/`)
11
-
12
1
  ## 核心约束(必须遵守)
13
2
  - ❌ 修改任何文件(只读)
14
3
 
@@ -19,7 +8,9 @@ argument-hint: "<change-name> [--to <path>]"
19
8
 
20
9
  ## 流程
21
10
 
22
- 1. **读取变更文件:** `cat .sillyspec/changes/$ARGUMENTS/{design}.md 2>/dev/null`。不存在则报错。
11
+ 1. **读取变更文件:**
12
+ - 先检查根目录:`cat .sillyspec/changes/$ARGUMENTS/{design}.md 2>/dev/null`
13
+ - 根目录没有 → 检查子项目:遍历 config.yaml 中的子项目路径,查找 `$ARGUMENTS`
23
14
  2. **清理为通用模板:** 移除项目特定信息,保留通用设计方案,添加 `notes.md` 使用建议。
24
15
  3. **导出:** `mkdir -p ~/.sillyspec/templates/<change-name>` 并复制文件。
25
16
  4. **确认:** 展示摘要和模板路径。
@@ -41,7 +41,33 @@ cat .sillyspec/REQUIREMENTS.md 2>/dev/null
41
41
 
42
42
  ### 2. 逐任务展开
43
43
 
44
- 把 tasks.md 每个 checkbox 展开为任务描述,按 Wave 分组组织。工作区模式下每个 Task 标注所属项目。
44
+ 把 tasks.md 每个 checkbox **保留 `- [ ]` 格式**并展开为任务描述,按 Wave 分组组织。工作区模式下每个 Task 标注所属项目。
45
+
46
+ **输出格式要求(必须严格遵守):**
47
+
48
+ ```markdown
49
+ ### Wave 1(并行,无依赖)
50
+ - [ ] 添加用户创建接口
51
+ - 修改: `UserController.java`、`UserService.java`
52
+ - 参考: `RoleController.createRole`
53
+ - 步骤:
54
+ 1. 写测试 UserControllerTest.testCreateUser
55
+ 2. 运行测试确认失败
56
+ 3. 写 UserController.createUser
57
+ 4. 运行测试确认通过
58
+
59
+ - [ ] 添加角色创建接口
60
+ - ...
61
+ ```
62
+
63
+ **每个 Task 必须保留 `- [ ]` checkbox,这是 execute 阶段勾选完成状态的依据。** 禁止写成纯文本列表。
64
+
65
+ **每个 Task 必须包含「步骤」字段,列出 TDD 执行顺序:**
66
+ - 1. 写测试 → 2. 运行确认失败 → 3. 写代码 → 4. 运行确认通过
67
+
68
+ **纯配置/数据/文档类任务可跳过 TDD,步骤简化为:1. 实现 → 2. 验证**
69
+
70
+ **注意:不需要写精确方法签名和代码示例。** 方法签名和代码风格由 execute 阶段先读后写确认。plan 专注"做什么"和"执行顺序"。
45
71
 
46
72
  **每个 Task 包含:**
47
73
  - 精确文件路径(修改哪个文件)
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## 用法
10
10
 
11
- - `/sillyspec:quick "修复用户创建接口漏了手机号校验"` — 独立记录到 QUICKLOG.md
11
+ - `/sillyspec:quick "修复用户创建接口漏了手机号校验"` — 独立记录到按用户名隔离的 QUICKLOG
12
12
  - `/sillyspec:quick --change user-module "修复用户创建接口漏了手机号校验"` — 追加到 user-module 变更的 tasks.md
13
13
 
14
14
  ## 任务
@@ -32,18 +32,38 @@ $ARGUMENTS
32
32
  测试文件必须保留在项目中,不能删除。违反 TDD → 删掉代码从测试重新开始。
33
33
  - 纯配置/数据/文档可跳过 TDD
34
34
  - 其他情况一律走 TDD
35
- 6. **运行相关测试:** `pnpm test 2>/dev/null || npm test 2>/dev/null || pytest 2>/dev/null`
35
+ 6. **运行测试:** 先检查 local.yaml 构建命令配置:
36
+ ```bash
37
+ cat .sillyspec/local.yaml 2>/dev/null
38
+ ```
39
+ 如果有则使用 local.yaml 中的命令;否则使用默认命令:
40
+ ```bash
41
+ 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
+ ```
36
43
  7. **Git commit:** 展示 commit message 给用户确认后提交。**工作区模式下,确认当前在正确的子项目目录中执行 commit。**
37
44
  8. **记录:**
38
- - **有 `--change`:** 在 `.sillyspec/changes/<变更名>/tasks.md` 追加 task 并勾选 `[x]`
39
- - **无 `--change`:** 记录到 `.sillyspec/quicklog/QUICKLOG.md`(见下方规则)
45
+ - **有 `--change`:** 在 `.sillyspec/changes/<变更名>/tasks.md` 追加 task 并勾选,**记录精确到秒的时间戳**:
46
+
47
+ ```
48
+ - [x] [YYYY-MM-DD HH:MM:SS] 任务描述
49
+ ```
50
+ - **无 `--change`:** 记录到 `.sillyspec/quicklog/QUICKLOG-<git用户名>.md`(见下方规则)
40
51
  9. **检查复杂度:** 任务比预期复杂 → 建议用完整流程
41
52
 
42
- ### QUICKLOG.md 规则
53
+ 10. **记录发现的坑:** 执行过程中如果发现项目特有的规律、陷阱或约定(如"某方法参数顺序容易搞反"、"某表有隐藏软删除字段"),追加到 CONVENTIONS.md 的「注意事项」章节。**工作区模式下:** 只影响当前子项目 → 写入当前子项目 `.sillyspec/codebase/CONVENTIONS.md`;影响多个子项目 → 写入 `.sillyspec/shared/CONVENTIONS.md`(共享规范,所有子项目可见)。
54
+
55
+ ### QUICKLOG 规则
56
+
57
+ **按 git 用户名隔离,避免多人同时操作冲突:**
58
+
59
+ ```bash
60
+ USER=$(git config user.name 2>/dev/null || echo "default")
61
+ LOG_FILE=".sillyspec/quicklog/QUICKLOG-${USER}.md"
62
+ ```
43
63
 
44
- 文件路径:`.sillyspec/quicklog/QUICKLOG.md`
64
+ 文件路径:`$LOG_FILE`
45
65
 
46
- **追加记录格式:**
66
+ **追加记录格式(时间精确到秒):**
47
67
  ```markdown
48
68
  ## YYYY-MM-DD HH:MM:SS | fix: 任务描述
49
69
  - 文件:`修改的文件列表`
@@ -52,5 +72,5 @@ $ARGUMENTS
52
72
  ```
53
73
 
54
74
  **文件轮转:** 追加前检查文件大小,超过 500 行则:
55
- 1. 将当前 `QUICKLOG.md` 重命名为 `QUICKLOG-YYYY-MM-DD.md`
56
- 2. 创建新的空 `QUICKLOG.md`
75
+ 1. 将当前文件重命名为 `QUICKLOG-${USER}-YYYY-MM-DD.md`
76
+ 2. 创建新的空 `QUICKLOG-${USER}.md`
@@ -17,12 +17,19 @@ cat .sillyspec/STATE.md 2>/dev/null
17
17
 
18
18
  **有 STATE.md:** 提取并展示当前变更、阶段、进度、下一步命令、阶段进度表、关键决策。AskUserQuestion:直接继续 / 查看更多细节。
19
19
 
20
- **无 STATE.md:** 自动探测:
20
+ **无 STATE.md:** 自动探测(工作区模式下同时检查子项目):
21
21
 
22
22
  ```bash
23
+ cat .sillyspec/config.yaml 2>/dev/null # 检查是否工作区模式
23
24
  ls .sillyspec/changes/*/MASTER.md 2>/dev/null
24
25
  ls -d .sillyspec/changes/*/ | grep -v archive | grep -v stages | tail -1 2>/dev/null
25
26
  ls .sillyspec/codebase/*.md .sillyspec/codebase/details/*.md .sillyspec/changes/*/tasks.md .sillyspec/{REQUIREMENTS,ROADMAP}.md 2>/dev/null
27
+ # 工作区模式:检查每个子项目的状态
28
+ for proj in $(cat .sillyspec/config.yaml | grep -oP 'path:\s*\K.*'); do
29
+ echo "=== $(basename $proj) ==="
30
+ cat "$proj/.sillyspec/STATE.md" 2>/dev/null
31
+ ls "$proj/.sillyspec/changes/" 2>/dev/null | grep -v archive
32
+ done
26
33
  ```
27
34
 
28
35
  **探测结果推断:**
@@ -27,11 +27,12 @@ find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "
27
27
 
28
28
  ### Step 3: 生成文档
29
29
 
30
- `mkdir -p .sillyspec/codebase`,生成 3 份文档:
30
+ `mkdir -p .sillyspec/codebase`,生成 4 份文档:
31
31
 
32
32
  1. **ARCHITECTURE.md** — 架构 + 技术栈(合并原 STACK.md)
33
33
  2. **STRUCTURE.md** — 目录结构(`find . -type f | head -200`)
34
- 3. **PROJECT.md** — 项目概览
34
+ 3. **CONVENTIONS.md** — 空骨架文件,含章节标题(注意事项、代码风格等),供后续 quick/execute 追加
35
+ 4. **PROJECT.md** — 项目概览
35
36
 
36
37
  ### Step 4: Git 提交
37
38
 
@@ -84,4 +84,4 @@ grep -r "TODO\|FIXME\|HACK\|XXX" src/ lib/ app/ --include="*.ts" --include="*.ts
84
84
 
85
85
  ### 7. 完成
86
86
 
87
- 更新 `.sillyspec/STATE.md`(如存在):阶段改为 `verify ✅` 或 `verify ⚠️`。
87
+ 更新 `.sillyspec/STATE.md`(如存在):阶段改为 `verify ✅` 或 `verify ⚠️`,记录精确到秒的时间戳。
@@ -25,6 +25,15 @@ cat .sillyspec/config.yaml 2>/dev/null
25
25
 
26
26
  - 无参数 / `status` → 显示状态
27
27
  - `add` → 添加子项目
28
+
29
+ **添加流程:**
30
+ 1. AskUserQuestion 询问子项目名称、目录路径、角色描述
31
+ 2. **自动检测 git 远程地址:**
32
+ ```bash
33
+ git -C <path> remote get-url origin 2>/dev/null
34
+ ```
35
+ 检测到则写入 repo 字段,检测不到则留空
36
+ 3. 更新 config.yaml,追加子项目配置
28
37
  - `remove` → 移除子项目
29
38
  - `sync` → 同步子项目(clone 缺失的,检查冲突)
30
39
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sillyspec",
3
- "version": "3.4.0",
3
+ "version": "3.5.0",
4
4
  "description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
5
5
  "type": "module",
6
6
  "bin": {
@@ -53,7 +53,7 @@ $ARGUMENTS
53
53
 
54
54
  - **tasks.md:** 确保所有 checkbox 都已勾选 `[x]`
55
55
  - **ROADMAP.md**(如存在):标记对应 Phase 已完成
56
- - **STATE.md:** 清除当前变更信息,历史记录追加归档完成
56
+ - **STATE.md:** 清除当前变更信息,历史记录追加归档完成(含精确到秒的时间戳)
57
57
  - **Git 提交:** `git add .sillyspec/ && git commit -m "docs: archive sillyspec change <change-name>"`
58
58
 
59
59
  **工作区模式下:** 如果变更属于某个子项目,cd 到子项目目录执行 git commit。工作区根目录无 git 则跳过。
@@ -58,7 +58,7 @@ cat .sillyspec/config.yaml 2>/dev/null
58
58
  **单项目模式:**
59
59
  ```bash
60
60
  cat .sillyspec/{PROJECT,REQUIREMENTS,ROADMAP}.md 2>/dev/null
61
- cat .sillyspec/codebase/{STRUCTURE,CONVENTIONS}.md 2>/dev/null
61
+ cat .sillyspec/codebase/{STRUCTURE,CONVENTIONS,ARCHITECTURE}.md 2>/dev/null
62
62
  ls .sillyspec/changes/ 2>/dev/null | grep -v archive
63
63
  ls .sillyspec/knowledge/ 2>/dev/null
64
64
  ```
@@ -5,7 +5,14 @@
5
5
 
6
6
  ## 判断逻辑
7
7
 
8
- 按顺序检查,第一个未完成的就执行:
8
+ **先检查是否工作区模式:**
9
+ ```bash
10
+ cat .sillyspec/config.yaml 2>/dev/null | grep -q "projects"
11
+ ```
12
+
13
+ **工作区模式:** 同时检查根目录和每个子项目,列出所有未完成的工作,让用户选择继续哪个。
14
+
15
+ **单项目模式:** 按顺序检查,第一个未完成的就执行:
9
16
 
10
17
  ```
11
18
  1. 有进行中的变更?
@@ -6,17 +6,22 @@
6
6
  - ❌ 跳步执行(不允许跳过 plan 直接 execute)
7
7
  - ❌ 先写代码后补测试
8
8
  - ❌ 编造不存在的方法/注解/路径/类/字段
9
- - ❌ 自行补全缺失的接口/方法(应报告给用户)
9
+ - ❌ 自行补全缺失的接口/方法(应报告 BLOCKED)
10
10
  - ❌ 意外修改了计划外的文件却不报告
11
11
 
12
12
  ## 状态检查(必须先执行)
13
13
 
14
14
  ```bash
15
- sillyspec status --json
15
+ cat .sillyspec/STATE.md 2>/dev/null
16
16
  ```
17
17
 
18
- - `phase: "execute"` 继续
19
- - 其他 phase → 提示用户 `sillyspec next`
18
+ STATE.md 且 phase execute → 继续。无 STATE.md 或 phase 不对 → 检查是否有未完成的 tasks.md:
19
+
20
+ ```bash
21
+ ls .sillyspec/changes/*/tasks.md 2>/dev/null | xargs grep -l '\- \[ \]' 2>/dev/null
22
+ ```
23
+
24
+ 有未完成的 tasks.md → 继续。没有 → 提示 `/sillyspec:continue`。
20
25
 
21
26
  ## 执行范围
22
27
  $ARGUMENTS
@@ -29,143 +34,95 @@ $ARGUMENTS
29
34
  cat .sillyspec/config.yaml 2>/dev/null
30
35
  ```
31
36
 
32
- **工作区模式:** 根据计划 Task 标注确定子项目,额外加载共享规范 + CODEBASE-OVERVIEW.md,**执行前必须 cd 到对应子项目目录**。所有代码修改、测试运行、git commit 都在子项目目录中执行。一个 Task 属于哪个子项目,就 cd 到哪个子项目。
37
+ **工作区模式:** 根据计划 Task 标注确定子项目,额外加载共享规范 + CODEBASE-OVERVIEW.md。所有代码修改、测试运行、git commit 都在子项目目录中执行。
33
38
 
34
- **单项目模式:**
39
+ **加载以下文件(主代理读取,后续注入子代理):**
35
40
  ```bash
36
41
  PLAN=$(ls -t .sillyspec/changes/*/tasks.md 2>/dev/null | head -1); cat "$PLAN"
37
42
  LATEST=$(ls -d .sillyspec/changes/*/ | grep -v archive | tail -1)
38
43
  cat "$LATEST"/{tasks,design}.md 2>/dev/null
39
- cat .sillyspec/codebase/CONVENTIONS.md 2>/dev/null
44
+ cat .sillyspec/codebase/{CONVENTIONS,ARCHITECTURE}.md 2>/dev/null
45
+ cat .sillyspec/local.yaml 2>/dev/null
40
46
  ```
41
47
 
42
- 确认实际存在的文件,不存在的标注跳过。如果 `$ARGUMENTS` 指定范围(如 `wave-1`、`task-3`),只执行对应部分。
48
+ 如果 `$ARGUMENTS` 指定范围(如 `wave-1`、`task-3`),只执行对应部分。
43
49
 
44
50
  ---
45
51
 
46
- ## 执行策略
52
+ ## 确认频率
47
53
 
48
54
  用 AskUserQuestion 询问用户选择:
49
-
50
- **1. 执行模式:**
51
- - 串行执行当前会话逐任务执行,适合简单变更
52
- - 子代理并行 — 每个 Task 启动独立子代理,适合多任务独立变更
53
-
54
- **2. 确认频率:**
55
- - 每个任务确认 — 每完成一个 task 展示结果,等用户确认后继续
56
- - 每 N 个任务确认 — 每完成 N 个 task 汇总展示,用户一次性确认
57
- - AI 自主判断 — AI 在遇到歧义、风险、计划外变更时才询问,其余自动推进
58
- - 全自动 — 全部自动执行,不在中途打断用户
59
-
60
- 选择子代理模式时:
61
- 1. 按计划的 Wave 分组
62
- 2. 每个 Task 启动独立子代理(不继承主 session 历史)
63
- 3. 子代理上下文:任务描述 + 相关约定 + 要修改文件和被调用类的源码
55
+ - **每个 Wave 确认** — 每个 Wave 完成后展示结果,等用户确认后继续下一 Wave
56
+ - **AI 自主判断** — AI 在遇到 BLOCKED 或计划外变更时才询问,其余自动推进
57
+ - **全自动**全部自动执行,不在中途打断用户
64
58
 
65
59
  ---
66
60
 
67
- ## 每个任务的执行流程
68
-
69
- ### 1. 先读后写
70
-
71
- 写代码前,读取相关源文件确认风格和方法签名:
72
-
73
- ```bash
74
- # 读取 CONVENTIONS
75
- cat .sillyspec/codebase/{CONVENTIONS,ARCHITECTURE}.md 2>/dev/null
76
- # 读取要修改的文件和同模块参考文件
77
- cat <要修改的文件路径>
78
- cat <参考文件路径>
79
- ```
80
-
81
- **调用已有方法前,grep 确认存在:**
82
- ```bash
83
- grep -rn "public.*getById" --include="*.java" src/main/java/**/service/
84
- ```
85
- grep 不到 → 不许调用,先查清楚或报告给用户。
86
-
87
- ### 2. TDD(强制执行,不可跳过)
88
-
89
- #### 🔴 RED — 写失败测试
90
-
91
- 先写测试文件,再写实现代码。写代码前测试必须先存在。
92
-
93
- **写完测试后,立即运行确认失败:**
61
+ ## 子代理执行(强制模式)
94
62
 
95
- 先检查 local.yaml 是否有构建命令配置:
96
- ```bash
97
- cat .sillyspec/local.yaml 2>/dev/null 2>/dev/null
98
- ```
99
-
100
- 如果有,使用 local.yaml 中的命令(含 `-s` 等参数);否则使用默认命令:
101
-
102
- ```bash
103
- mvn test -pl <模块> -Dtest=<测试类> 2>/dev/null || ./gradlew test --tests <测试类> 2>/dev/null || npm test -- --testPathPattern=<测试文件> 2>/dev/null || pytest <测试文件> 2>/dev/null
104
- ```
63
+ **所有任务通过子代理执行,主代理负责调度和记录。**
105
64
 
106
- 确认:
107
- - 测试失败(不是编译错误)
108
- - 失败原因是功能未实现(不是语法错误)
65
+ ### 执行流程
109
66
 
110
- **测试直接通过?** 你在测试已有行为,重写测试。**测试编译报错?** 先修测试语法。
67
+ 1. 解析 tasks.md,按 Wave 分组
68
+ 2. 同一 Wave 内的任务**并行启动**子代理,不同 Wave **串行等待**
69
+ 3. 每个 Wave 完成后,根据用户选择的确认频率决定是否暂停
70
+ 4. 子代理返回结果后,主代理勾选 tasks.md、更新 STATE.md
111
71
 
112
- #### 🟢 GREEN — 写最少代码
72
+ ### 子代理 Prompt 模板
113
73
 
114
- 写刚好让测试通过的最少代码。不加额外功能。
74
+ 主代理在 dispatch 子代理前,必须准备以下 prompt(所有内容**内联**,不让子代理自己读文件):
115
75
 
116
- **写完后立即运行确认通过:**
117
-
118
- 先检查 local.yaml 是否有构建命令配置:
119
- ```bash
120
- cat .sillyspec/local.yaml 2>/dev/null 2>/dev/null
121
76
  ```
77
+ 你正在执行任务:
122
78
 
123
- 如果有,使用 local.yaml 中的命令;否则使用默认命令:
124
-
125
- ```bash
126
- mvn test -pl <模块> -Dtest=<测试类> 2>/dev/null || ./gradlew test --tests <测试类> 2>/dev/null || npm test -- --testPathPattern=<测试文件> 2>/dev/null || pytest <测试文件> 2>/dev/null
127
- ```
79
+ ## 任务描述
80
+ {tasks.md 中当前 task 的完整内容,包括步骤字段}
128
81
 
129
- 确认:
130
- - 测试通过
131
- - 其他已有测试没有因此失败
132
- - 无编译错误、无 warnings
82
+ ## 项目约定
83
+ {CONVENTIONS.md 全文}
133
84
 
134
- **编译不通过或测试失败?** 修代码,不是改测试。**其他测试被破坏?** 立即修复。
85
+ ## 项目架构
86
+ {ARCHITECTURE.md 全文}
135
87
 
136
- #### 🔵 REFACTOR — 清理
88
+ ## 构建命令
89
+ {local.yaml 中的 build 命令,如无则给默认命令}
137
90
 
138
- 在测试全绿的前提下清理:提取重复、改善命名、简化逻辑。重构后重新运行测试确认仍然通过。
91
+ ## 工作目录
92
+ {子项目目录路径,工作区模式需要 cd 到此目录}
139
93
 
140
- **TDD 中间步骤(RED→GREEN→REFACTOR)连续执行,不需要每步等用户确认。但每一步都必须运行测试命令并确认结果,不可省略。**
94
+ ## 铁律(必须遵守)
95
+ 1. **先读后写:** 先 cat 要修改的文件和参考文件,确认风格和方法签名后再写
96
+ 2. **grep 确认:** 调用已有方法前必须 grep 确认存在,grep 不到 → 报告 BLOCKED
97
+ 3. **不编造:** 不编造不存在的方法/注解/类/字段
98
+ 4. **不自行补全:** 发现缺失接口/方法,不自己写,报告 BLOCKED
99
+ 5. **TDD 不跳步:** 按任务步骤逐步执行,每步必须运行测试命令并确认结果
100
+ 6. **测试直接通过 = 测了已有行为,重写测试**
101
+ 7. **commit:** 完成后在工作目录执行 git add -A && git commit
102
+ 8. **不修改计划外的文件**,如必须修改则在报告中说明
141
103
 
142
- **测试文件必须保留**,随代码一起 commit。违反 TDD(先写代码后补测试)→ 删代码重来。
104
+ ## 完成后报告(严格按此格式)
143
105
 
144
- **可跳过 TDD(不需要确认):** 纯配置(YAML/properties)、纯数据(SQL seed)、纯文档(README/注释)。
145
-
146
- ### 3. 勾选 tasks
147
-
148
- 完成后在 `.sillyspec/changes/<变更名>/tasks.md` 勾选对应 checkbox:`- [x] [YYYY-MM-DD HH:MM:SS] 任务描述`
149
-
150
- ### 4. Git commit
151
-
152
- **先确认当前在 git 仓库中:**
153
- ```bash
154
- git rev-parse --is-inside-work-tree 2>/dev/null
106
+ - **Status:** DONE / DONE_WITH_CONCERNS / BLOCKED
107
+ - **改动文件:** {列表}
108
+ - **测试结果:** {通过/失败/跳过及原因}
109
+ - **Commit:** {hash 或 "无"}
110
+ - **问题:** {BLOCKED 原因 / DONE_WITH_CONCERNS 描述 / 无}
155
111
  ```
156
112
 
157
- 如果不在 git 仓库中,提示用户当前目录没有 git 管理,跳过 commit 或让用户指定仓库路径。
113
+ ### 子代理结果处理
158
114
 
159
- `git add -A` → 生成 commit message → **根据用户选择的确认频率决定是否立即确认或批量确认**。
115
+ 子代理返回后,主代理:
160
116
 
161
- **工作区模式下,每个子项目的 commit 独立执行,不要跨子项目 commit。**
117
+ 1. **DONE** 勾选 tasks.md,记录精确到秒的时间戳
118
+ 2. **DONE_WITH_CONCERNS** → 勾选 tasks.md,记录问题到报告
119
+ 3. **BLOCKED** → 不勾选,报告给用户,AskUserQuestion 三选一:
120
+ - 重试(重新 dispatch 同一任务)
121
+ - 跳过(勾选并标注 SKIPPED)
122
+ - 停止(暂停执行,用户处理后继续)
162
123
 
163
124
  ---
164
125
 
165
- ## 偏差处理
166
-
167
- 遇到问题:**停 → 报告 → 等人工确认。** 代码缺失、方法不存在、计划外变更 → 先读已有代码,再问用户。
168
-
169
126
  ## 完成后
170
127
 
171
128
  所有任务完成后,用 AskUserQuestion 询问用户下一步:
@@ -173,8 +130,4 @@ git rev-parse --is-inside-work-tree 2>/dev/null
173
130
  2. **归档** — 跳过 verify,执行 `/sillyspec:archive`
174
131
  3. **继续开发** — 不结束当前阶段
175
132
 
176
- ```bash
177
- sillyspec status --json && sillyspec next
178
- ```
179
-
180
- 更新 `.sillyspec/STATE.md`:阶段改为 `execute ✅` 或 `execute 🔄 (X/M)`,历史记录追加执行结果。
133
+ 更新 `.sillyspec/STATE.md`:阶段改为 `execute ✅` 或 `execute 🔄 (X/M)`,历史记录追加执行结果(含精确到秒的时间戳)。
@@ -8,7 +8,9 @@
8
8
 
9
9
  ## 流程
10
10
 
11
- 1. **读取变更文件:** `cat .sillyspec/changes/$ARGUMENTS/{design}.md 2>/dev/null`。不存在则报错。
11
+ 1. **读取变更文件:**
12
+ - 先检查根目录:`cat .sillyspec/changes/$ARGUMENTS/{design}.md 2>/dev/null`
13
+ - 根目录没有 → 检查子项目:遍历 config.yaml 中的子项目路径,查找 `$ARGUMENTS`
12
14
  2. **清理为通用模板:** 移除项目特定信息,保留通用设计方案,添加 `notes.md` 使用建议。
13
15
  3. **导出:** `mkdir -p ~/.sillyspec/templates/<change-name>` 并复制文件。
14
16
  4. **确认:** 展示摘要和模板路径。
package/templates/plan.md CHANGED
@@ -41,7 +41,33 @@ cat .sillyspec/REQUIREMENTS.md 2>/dev/null
41
41
 
42
42
  ### 2. 逐任务展开
43
43
 
44
- 把 tasks.md 每个 checkbox 展开为任务描述,按 Wave 分组组织。工作区模式下每个 Task 标注所属项目。
44
+ 把 tasks.md 每个 checkbox **保留 `- [ ]` 格式**并展开为任务描述,按 Wave 分组组织。工作区模式下每个 Task 标注所属项目。
45
+
46
+ **输出格式要求(必须严格遵守):**
47
+
48
+ ```markdown
49
+ ### Wave 1(并行,无依赖)
50
+ - [ ] 添加用户创建接口
51
+ - 修改: `UserController.java`、`UserService.java`
52
+ - 参考: `RoleController.createRole`
53
+ - 步骤:
54
+ 1. 写测试 UserControllerTest.testCreateUser
55
+ 2. 运行测试确认失败
56
+ 3. 写 UserController.createUser
57
+ 4. 运行测试确认通过
58
+
59
+ - [ ] 添加角色创建接口
60
+ - ...
61
+ ```
62
+
63
+ **每个 Task 必须保留 `- [ ]` checkbox,这是 execute 阶段勾选完成状态的依据。** 禁止写成纯文本列表。
64
+
65
+ **每个 Task 必须包含「步骤」字段,列出 TDD 执行顺序:**
66
+ - 1. 写测试 → 2. 运行确认失败 → 3. 写代码 → 4. 运行确认通过
67
+
68
+ **纯配置/数据/文档类任务可跳过 TDD,步骤简化为:1. 实现 → 2. 验证**
69
+
70
+ **注意:不需要写精确方法签名和代码示例。** 方法签名和代码风格由 execute 阶段先读后写确认。plan 专注"做什么"和"执行顺序"。
45
71
 
46
72
  **每个 Task 包含:**
47
73
  - 精确文件路径(修改哪个文件)
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## 用法
10
10
 
11
- - `/sillyspec:quick "修复用户创建接口漏了手机号校验"` — 独立记录到 QUICKLOG.md
11
+ - `/sillyspec:quick "修复用户创建接口漏了手机号校验"` — 独立记录到按用户名隔离的 QUICKLOG
12
12
  - `/sillyspec:quick --change user-module "修复用户创建接口漏了手机号校验"` — 追加到 user-module 变更的 tasks.md
13
13
 
14
14
  ## 任务
@@ -32,18 +32,38 @@ $ARGUMENTS
32
32
  测试文件必须保留在项目中,不能删除。违反 TDD → 删掉代码从测试重新开始。
33
33
  - 纯配置/数据/文档可跳过 TDD
34
34
  - 其他情况一律走 TDD
35
- 6. **运行相关测试:** `pnpm test 2>/dev/null || npm test 2>/dev/null || pytest 2>/dev/null`
35
+ 6. **运行测试:** 先检查 local.yaml 构建命令配置:
36
+ ```bash
37
+ cat .sillyspec/local.yaml 2>/dev/null
38
+ ```
39
+ 如果有则使用 local.yaml 中的命令;否则使用默认命令:
40
+ ```bash
41
+ 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
+ ```
36
43
  7. **Git commit:** 展示 commit message 给用户确认后提交。**工作区模式下,确认当前在正确的子项目目录中执行 commit。**
37
44
  8. **记录:**
38
- - **有 `--change`:** 在 `.sillyspec/changes/<变更名>/tasks.md` 追加 task 并勾选 `[x]`
39
- - **无 `--change`:** 记录到 `.sillyspec/quicklog/QUICKLOG.md`(见下方规则)
45
+ - **有 `--change`:** 在 `.sillyspec/changes/<变更名>/tasks.md` 追加 task 并勾选,**记录精确到秒的时间戳**:
46
+
47
+ ```
48
+ - [x] [YYYY-MM-DD HH:MM:SS] 任务描述
49
+ ```
50
+ - **无 `--change`:** 记录到 `.sillyspec/quicklog/QUICKLOG-<git用户名>.md`(见下方规则)
40
51
  9. **检查复杂度:** 任务比预期复杂 → 建议用完整流程
41
52
 
42
- ### QUICKLOG.md 规则
53
+ 10. **记录发现的坑:** 执行过程中如果发现项目特有的规律、陷阱或约定(如"某方法参数顺序容易搞反"、"某表有隐藏软删除字段"),追加到 CONVENTIONS.md 的「注意事项」章节。**工作区模式下:** 只影响当前子项目 → 写入当前子项目 `.sillyspec/codebase/CONVENTIONS.md`;影响多个子项目 → 写入 `.sillyspec/shared/CONVENTIONS.md`(共享规范,所有子项目可见)。
54
+
55
+ ### QUICKLOG 规则
56
+
57
+ **按 git 用户名隔离,避免多人同时操作冲突:**
58
+
59
+ ```bash
60
+ USER=$(git config user.name 2>/dev/null || echo "default")
61
+ LOG_FILE=".sillyspec/quicklog/QUICKLOG-${USER}.md"
62
+ ```
43
63
 
44
- 文件路径:`.sillyspec/quicklog/QUICKLOG.md`
64
+ 文件路径:`$LOG_FILE`
45
65
 
46
- **追加记录格式:**
66
+ **追加记录格式(时间精确到秒):**
47
67
  ```markdown
48
68
  ## YYYY-MM-DD HH:MM:SS | fix: 任务描述
49
69
  - 文件:`修改的文件列表`
@@ -52,5 +72,5 @@ $ARGUMENTS
52
72
  ```
53
73
 
54
74
  **文件轮转:** 追加前检查文件大小,超过 500 行则:
55
- 1. 将当前 `QUICKLOG.md` 重命名为 `QUICKLOG-YYYY-MM-DD.md`
56
- 2. 创建新的空 `QUICKLOG.md`
75
+ 1. 将当前文件重命名为 `QUICKLOG-${USER}-YYYY-MM-DD.md`
76
+ 2. 创建新的空 `QUICKLOG-${USER}.md`
@@ -17,12 +17,19 @@ cat .sillyspec/STATE.md 2>/dev/null
17
17
 
18
18
  **有 STATE.md:** 提取并展示当前变更、阶段、进度、下一步命令、阶段进度表、关键决策。AskUserQuestion:直接继续 / 查看更多细节。
19
19
 
20
- **无 STATE.md:** 自动探测:
20
+ **无 STATE.md:** 自动探测(工作区模式下同时检查子项目):
21
21
 
22
22
  ```bash
23
+ cat .sillyspec/config.yaml 2>/dev/null # 检查是否工作区模式
23
24
  ls .sillyspec/changes/*/MASTER.md 2>/dev/null
24
25
  ls -d .sillyspec/changes/*/ | grep -v archive | grep -v stages | tail -1 2>/dev/null
25
26
  ls .sillyspec/codebase/*.md .sillyspec/codebase/details/*.md .sillyspec/changes/*/tasks.md .sillyspec/{REQUIREMENTS,ROADMAP}.md 2>/dev/null
27
+ # 工作区模式:检查每个子项目的状态
28
+ for proj in $(cat .sillyspec/config.yaml | grep -oP 'path:\s*\K.*'); do
29
+ echo "=== $(basename $proj) ==="
30
+ cat "$proj/.sillyspec/STATE.md" 2>/dev/null
31
+ ls "$proj/.sillyspec/changes/" 2>/dev/null | grep -v archive
32
+ done
26
33
  ```
27
34
 
28
35
  **探测结果推断:**
@@ -27,11 +27,12 @@ find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "
27
27
 
28
28
  ### Step 3: 生成文档
29
29
 
30
- `mkdir -p .sillyspec/codebase`,生成 3 份文档:
30
+ `mkdir -p .sillyspec/codebase`,生成 4 份文档:
31
31
 
32
32
  1. **ARCHITECTURE.md** — 架构 + 技术栈(合并原 STACK.md)
33
33
  2. **STRUCTURE.md** — 目录结构(`find . -type f | head -200`)
34
- 3. **PROJECT.md** — 项目概览
34
+ 3. **CONVENTIONS.md** — 空骨架文件,含章节标题(注意事项、代码风格等),供后续 quick/execute 追加
35
+ 4. **PROJECT.md** — 项目概览
35
36
 
36
37
  ### Step 4: Git 提交
37
38
 
@@ -84,4 +84,4 @@ grep -r "TODO\|FIXME\|HACK\|XXX" src/ lib/ app/ --include="*.ts" --include="*.ts
84
84
 
85
85
  ### 7. 完成
86
86
 
87
- 更新 `.sillyspec/STATE.md`(如存在):阶段改为 `verify ✅` 或 `verify ⚠️`。
87
+ 更新 `.sillyspec/STATE.md`(如存在):阶段改为 `verify ✅` 或 `verify ⚠️`,记录精确到秒的时间戳。
@@ -25,6 +25,15 @@ cat .sillyspec/config.yaml 2>/dev/null
25
25
 
26
26
  - 无参数 / `status` → 显示状态
27
27
  - `add` → 添加子项目
28
+
29
+ **添加流程:**
30
+ 1. AskUserQuestion 询问子项目名称、目录路径、角色描述
31
+ 2. **自动检测 git 远程地址:**
32
+ ```bash
33
+ git -C <path> remote get-url origin 2>/dev/null
34
+ ```
35
+ 检测到则写入 repo 字段,检测不到则留空
36
+ 3. 更新 config.yaml,追加子项目配置
28
37
  - `remove` → 移除子项目
29
38
  - `sync` → 同步子项目(clone 缺失的,检查冲突)
30
39