sillyspec 3.1.0 → 3.3.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.
@@ -56,6 +56,8 @@ $ARGUMENTS
56
56
  - **STATE.md:** 清除当前变更信息,历史记录追加归档完成
57
57
  - **Git 提交:** `git add .sillyspec/ && git commit -m "docs: archive sillyspec change <change-name>"`
58
58
 
59
+ **工作区模式下:** 如果变更属于某个子项目,cd 到子项目目录执行 git commit。工作区根目录无 git 则跳过。
60
+
59
61
  ### 最后说:
60
62
 
61
63
  > ✅ 变更 `<change-name>` 已归档到 `archive/YYYY-MM-DD-<change-name>/`。继续:`/sillyspec:brainstorm "新想法"`
@@ -53,7 +53,7 @@ $ARGUMENTS
53
53
  cat .sillyspec/config.yaml 2>/dev/null
54
54
  ```
55
55
 
56
- **工作区模式:** AskUserQuestion 选子项目,加载子项目上下文 + 共享规范 + 工作区概览,设计文档保存到子项目 `.sillyspec/changes/`。
56
+ **工作区模式:** AskUserQuestion 选子项目,**cd 到子项目目录执行**,加载子项目上下文 + 共享规范 + 工作区概览,设计文档保存到子项目 `.sillyspec/changes/`。git commit 在子项目目录执行。
57
57
 
58
58
  **单项目模式:**
59
59
  ```bash
@@ -29,7 +29,7 @@ $ARGUMENTS
29
29
  cat .sillyspec/config.yaml 2>/dev/null
30
30
  ```
31
31
 
32
- **工作区模式:** 根据计划 Task 标注确定子项目,额外加载共享规范 + CODEBASE-OVERVIEW.md,执行前 cd 到对应子项目目录。
32
+ **工作区模式:** 根据计划 Task 标注确定子项目,额外加载共享规范 + CODEBASE-OVERVIEW.md,**执行前必须 cd 到对应子项目目录**。所有代码修改、测试运行、git commit 都在子项目目录中执行。一个 Task 属于哪个子项目,就 cd 到哪个子项目。
33
33
 
34
34
  **单项目模式:**
35
35
  ```bash
@@ -84,17 +84,62 @@ grep -rn "public.*getById" --include="*.java" src/main/java/**/service/
84
84
  ```
85
85
  grep 不到 → 不许调用,先查清楚或报告给用户。
86
86
 
87
- ### 2. TDD
87
+ ### 2. TDD(强制执行,不可跳过)
88
88
 
89
+ #### 🔴 RED — 写失败测试
90
+
91
+ 先写测试文件,再写实现代码。写代码前测试必须先存在。
92
+
93
+ **写完测试后,立即运行确认失败:**
94
+
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
+ ```
105
+
106
+ 确认:
107
+ - 测试失败(不是编译错误)
108
+ - 失败原因是功能未实现(不是语法错误)
109
+
110
+ **测试直接通过?** 你在测试已有行为,重写测试。**测试编译报错?** 先修测试语法。
111
+
112
+ #### 🟢 GREEN — 写最少代码
113
+
114
+ 写刚好让测试通过的最少代码。不加额外功能。
115
+
116
+ **写完后立即运行确认通过:**
117
+
118
+ 先检查 local.yaml 是否有构建命令配置:
119
+ ```bash
120
+ cat .sillyspec/local.yaml 2>/dev/null 2>/dev/null
89
121
  ```
90
- 🔴 RED → 写测试,运行确认失败
91
- 🟢 GREEN → 写最少代码让测试通过
92
- 🔵 REFACTOR → 清理,保持测试通过
122
+
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
93
127
  ```
94
128
 
95
- TDD 中间步骤(RED→GREEN→REFACTOR)连续执行,不需要每步等用户确认。
129
+ 确认:
130
+ - 测试通过
131
+ - 其他已有测试没有因此失败
132
+ - 无编译错误、无 warnings
133
+
134
+ **编译不通过或测试失败?** 修代码,不是改测试。**其他测试被破坏?** 立即修复。
135
+
136
+ #### 🔵 REFACTOR — 清理
96
137
 
97
- **测试文件必须保留**,随代码一起 commit。违反 TDD → 删代码重来。
138
+ 在测试全绿的前提下清理:提取重复、改善命名、简化逻辑。重构后重新运行测试确认仍然通过。
139
+
140
+ **TDD 中间步骤(RED→GREEN→REFACTOR)连续执行,不需要每步等用户确认。但每一步都必须运行测试命令并确认结果,不可省略。**
141
+
142
+ **测试文件必须保留**,随代码一起 commit。违反 TDD(先写代码后补测试)→ 删代码重来。
98
143
 
99
144
  **可跳过 TDD(不需要确认):** 纯配置(YAML/properties)、纯数据(SQL seed)、纯文档(README/注释)。
100
145
 
@@ -104,8 +149,17 @@ TDD 中间步骤(RED→GREEN→REFACTOR)连续执行,不需要每步等用
104
149
 
105
150
  ### 4. Git commit
106
151
 
152
+ **先确认当前在 git 仓库中:**
153
+ ```bash
154
+ git rev-parse --is-inside-work-tree 2>/dev/null
155
+ ```
156
+
157
+ 如果不在 git 仓库中,提示用户当前目录没有 git 管理,跳过 commit 或让用户指定仓库路径。
158
+
107
159
  `git add -A` → 生成 commit message → **根据用户选择的确认频率决定是否立即确认或批量确认**。
108
160
 
161
+ **工作区模式下,每个子项目的 commit 独立执行,不要跨子项目 commit。**
162
+
109
163
  ---
110
164
 
111
165
  ## 偏差处理
@@ -33,7 +33,7 @@ $ARGUMENTS
33
33
  - 纯配置/数据/文档可跳过 TDD
34
34
  - 其他情况一律走 TDD
35
35
  6. **运行相关测试:** `pnpm test 2>/dev/null || npm test 2>/dev/null || pytest 2>/dev/null`
36
- 7. **Git commit:** 展示 commit message 给用户确认后提交
36
+ 7. **Git commit:** 展示 commit message 给用户确认后提交。**工作区模式下,确认当前在正确的子项目目录中执行 commit。**
37
37
  8. **记录:**
38
38
  - **有 `--change`:** 在 `.sillyspec/changes/<变更名>/tasks.md` 追加 task 并勾选 `[x]`
39
39
  - **无 `--change`:** 记录到 `.sillyspec/quicklog/QUICKLOG.md`(见下方规则)
@@ -0,0 +1,46 @@
1
+ ## 交互规范
2
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
3
+
4
+ > 本模板由 `/sillyspec:scan --quick` 触发。如需完整深度扫描,使用 `/sillyspec:scan`。
5
+
6
+ ## 核心约束(必须遵守)
7
+ - ❌ 修改任何代码
8
+ - ❌ 编造文件路径或代码模式(必须包含真实路径)
9
+ - ❌ 读源码文件(快扫只读配置和目录)
10
+
11
+ ## 快速扫描流程
12
+
13
+ ### Step 1: 检查工作区模式
14
+
15
+ ```bash
16
+ cat .sillyspec/config.yaml 2>/dev/null
17
+ ```
18
+
19
+ 有 `projects` 字段 → 工作区模式:逐个子项目快扫。
20
+
21
+ ### Step 2: 读配置文件
22
+
23
+ ```bash
24
+ cat package.json tsconfig.json requirements.txt Cargo.toml go.mod pom.xml build.gradle 2>/dev/null
25
+ find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null
26
+ ```
27
+
28
+ ### Step 3: 生成文档
29
+
30
+ `mkdir -p .sillyspec/codebase`,生成 3 份文档:
31
+
32
+ 1. **ARCHITECTURE.md** — 架构 + 技术栈(合并原 STACK.md)
33
+ 2. **STRUCTURE.md** — 目录结构(`find . -type f | head -200`)
34
+ 3. **PROJECT.md** — 项目概览
35
+
36
+ ### Step 4: Git 提交
37
+
38
+ ```bash
39
+ git add .sillyspec/ && git commit -m "chore: sillyspec quick scan"
40
+ ```
41
+
42
+ 工作区模式在每个子项目分别提交。
43
+
44
+ ### 完成
45
+
46
+ 提示用户:快扫只提取基础信息。如需完整代码规范(框架规则、实体继承、代码风格),执行 `/sillyspec:scan` 进行深度扫描。
@@ -1,258 +1,135 @@
1
1
  ## 交互规范
2
2
  **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
3
3
 
4
- ## 核心约束(必须遵守)
5
- - ❌ 修改任何代码
6
- - ❌ 编造文件路径或代码模式(必须包含真实路径)
7
- - ❌ 一次性输出所有步骤(交互模式每步等用户回复)
8
- - ❌ 跳过状态检查,自行推断项目阶段
9
- - ❌ 跳过 Schema/框架隐形规则/实体继承扫描
10
- - ❌ 生成文档到非 `.sillyspec/codebase/` 目录
4
+ 你现在是 SillySpec 代码库扫描器(编排器)。**你不读源码,只编排子代理或串行执行。**
11
5
 
12
- ## 状态检查(必须先执行)
6
+ ## 参数处理
7
+ - 空白 → 交互式引导(逐步询问)
8
+ - `--deep` → 直接深度扫描
9
+ - 其他 → 快速扫描该区域
10
+
11
+ ## 流程控制(必须先执行)
13
12
 
14
13
  ```bash
15
14
  sillyspec status --json
16
15
  ```
17
16
 
18
- - `phase: "init"` 或无 phase → 继续
19
- - `phase: "scan:quick_done"` → 建议深度扫描
20
- - `phase: "scan:resume"` → `sillyspec check --json` 获取缺失文档,断点续扫
21
- - 其他 phase → 不需要扫描,提示 CLI 建议的下一步
22
-
23
- ## 参数处理
24
-
25
- `$ARGUMENTS` 为空 → **交互式引导模式**;有内容 → **快速模式**(含 `--deep` 则深度扫描,否则快速扫描该区域)。快速模式跳到对应 Step。
17
+ `init` phase → 以 CLI 返回为准决定下一步。
26
18
 
27
19
  ---
28
20
 
29
- ## 交互式引导流程
30
-
31
- ### Step 1: 检查工作区模式
32
-
33
- ```bash
34
- cat .sillyspec/config.yaml 2>/dev/null
35
- ```
36
-
37
- 有 `projects` 字段 → 工作区模式:选择全量扫描、选子项目扫描、或退出。子项目文档存到各自 `<子项目路径>/.sillyspec/codebase/`,最后生成 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`。
21
+ ## 交互式引导(参数为空时)
38
22
 
39
- ### Step 2: 检查已有文档
23
+ ### 检查工作区 & 已有文档
40
24
 
41
25
  ```bash
42
- ls .sillyspec/codebase/ 2>/dev/null
26
+ cat .sillyspec/config.yaml 2>/dev/null # 有 projects → 工作区模式
27
+ ls .sillyspec/codebase/ 2>/dev/null # 检查已有文档
28
+ wc -l .sillyspec/codebase/*.md 2>/dev/null
43
29
  ```
44
30
 
45
- - 无文档直接选扫描模式
46
- - 3 份(快扫完成)→ 升级完整扫描 / 重新快扫 / 跳过
47
- - 7 份(深扫完成)→ 检查距上次扫描时间和新提交数,建议刷新或跳过
48
- - 用户选跳过 → 提示 `/sillyspec:brainstorm '你的需求'` 并结束
49
-
50
- ### Step 3-5: 扫描模式、范围、排除目录
51
-
52
- AskUserQuestion 依次确认:快速⚡/深度🔍、扫描范围(留空全量)、排除目录(默认选中 `node_modules`、`.git`、`dist`、`build`、`vendor`、`target`、`__pycache__`、`.next`、`coverage`、`.nuxt`,用户可调整)。
31
+ - 已有 3 份 建议升级深度扫描
32
+ - 已有 7 建议刷新或跳过
33
+ - 工作区 逐个扫描 / 选子项目 / 退出
53
34
 
54
- ### Step 6: 确认并开始
55
-
56
- 汇总选择,用户确认后执行。
35
+ ### 选择扫描模式、范围、排除目录、确认
36
+ 按原流程交互,确认后进入扫描。
57
37
 
58
38
  ---
59
39
 
60
- ## 快速扫描
61
-
62
- **只读入口和配置文件,不读源码。** 生成 3 份文档到 `mkdir -p .sillyspec/codebase`:
40
+ ## 构建环境探测(主代理执行)
63
41
 
64
- 1. `ARCHITECTURE.md` — 架构 + 技术栈(合并原 STACK.md)
65
- 2. `STRUCTURE.md` — 目录结构
66
- 3. `PROJECT.md` — 项目概览
67
-
68
- 扫描命令:
69
42
  ```bash
70
- # 配置文件
71
- cat package.json tsconfig.json requirements.txt Cargo.toml go.mod pom.xml build.gradle 2>/dev/null
43
+ cat package.json pom.xml build.gradle go.mod Cargo.toml requirements.txt pyproject.toml Gemfile composer.json 2>/dev/null
72
44
  find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null
73
- # 目录结构
74
- find . -type f -not -path "*/node_modules/*" -not -path "*/{dist,.git,vendor,build,__pycache__,.next,coverage,.nuxt,target}/*" | head -200
75
- # 最近提交
76
- git log --oneline -20
77
45
  ```
78
46
 
79
- ## 🚨 三项强制扫描(快速和深度都必须执行)
80
-
81
- ### A. 数据库 Schema 扫描
82
-
83
- **目的:** 防止后续阶段编造表名和字段名。
84
-
85
- ```bash
86
- find . \( -name "schema.prisma" -o -name "*.model.ts" -o -name "*.entity.ts" -o -name "models.py" -o -name "models.go" -o -name "*.sql" -o -name "migration*" -o -name "*.entity.java" -o -name "*Mapper.xml" -o -name "schema.ts" \) \
87
- -not -path "*/node_modules/*" -not -path "*/{.git,dist,build,vendor}/*" | head -30
88
- ```
89
-
90
- **写入 ARCHITECTURE.md(只记摘要,不展开字段):**
91
-
92
- ```markdown
93
- ## 数据模型(摘要)
94
- | 表名 | 说明 | 字段数 | 来源文件 |
95
- |---|---|---|---|
96
- | users | 用户表 | 12 | `src/entity/User.java` |
97
-
98
- ### 关系
99
- - users 1:N orders
100
- ```
101
-
102
- 无数据库 → 写"本项目无数据库"。**铁律:所有阶段引用的表名必须来自此摘要,或 design.md 中声明的新增表。**
103
-
104
- ### B. 框架隐形规则扫描
105
-
106
- **目的:** 防止 AI 生成的 SQL/代码违反框架自动处理机制(如自动注入字段、逻辑删除拦截器)。
107
-
108
- ```bash
109
- # 通用检测:拦截器、审计、中间件、逻辑删除、多租户
110
- find . \( -name "*Interceptor*.java" -o -name "*Plugin*.java" -o -name "*Auditor*.java" \
111
- -o -name "*EventListener*.java" -o -name "mybatis-config.xml" -o -name "settings.py" \
112
- -o -name "*event*.py" -o -name "*listener*.py" -o -name "*mixin*.py" \) \
113
- -not -path "*/node_modules/*" -not -path "*/{.git,dist,build,vendor}/*" | head -20
114
- # 框架特定:Prisma/GORM/TypeORM/Rails/Laravel 中间件和回调
115
- cat prisma/schema.prisma 2>/dev/null | grep -i "middleware\|plugin\|previewFeatures"
116
- find . \( -name "*.go" -o -name "*.ts" -o -name "*.rb" -o -name "*.php" \) \
117
- -not -path "*/{node_modules,vendor}/*" | xargs grep -l "Callback\|Plugin\|EventSubscriber\|BeforeInsert\|acts_as_paranoid\|acts_as_tenant" 2>/dev/null | head -10
118
- # 逻辑删除/多租户字段
119
- find . \( -name "*.java" -o -name "*.py" -o -name "*.go" -o -name "*.ts" -o -name "*.php" \) \
120
- -not -path "*/{node_modules,.git,vendor,dist,build}/*" | xargs grep -li "is_deleted\|deleted_at\|soft_delete\|tenant_id" 2>/dev/null | head -20
121
- ```
122
-
123
- **写入 CONVENTIONS.md:**
124
-
125
- ```markdown
126
- ## 框架隐形规则
127
- ### 自动注入字段(SQL 中不要手动写)
128
- | 字段 | 来源 | 说明 |
129
- |---|---|---|
130
-
131
- ### 自动填充字段(INSERT/UPDATE 不需要手动赋值)
132
- | 字段 | 来源 | 说明 |
133
- |---|---|---|
134
-
135
- ### DELETE 行为
136
- - 不要写 `DELETE FROM` → 使用逻辑删除(如 UPDATE xxx SET is_deleted=1)
137
- ```
138
-
139
- 无发现 → 写"未发现框架级别的自动处理配置"。**铁律:后续阶段生成 SQL/数据操作代码必须遵守这些规则。**
140
-
141
- ### C. 实体继承规范扫描
142
-
143
- **目的:** 防止新建表时漏掉基类通用字段,导致 ORM 查询报 Unknown column。
144
-
145
- ```bash
146
- find . \( -name "Base*.java" -o -name "Abstract*.java" \) \
147
- \( -path "*/entity/*" -o -path "*/model/*" -o -path "*/po/*" \) \
148
- -not -path "*/{node_modules,.git}/*" | head -20
149
- find . -name "*.java" -not -path "*/{node_modules,.git}/*" | xargs grep -l "@MappedSuperclass" 2>/dev/null | head -10
150
- ```
151
-
152
- **追加到 CONVENTIONS.md:**
153
-
154
- ```markdown
155
- ## 实体继承规范
156
- ### 基类通用字段(新建表必须包含)
157
- | 字段 | 类型 | 说明 |
158
- |---|---|---|
159
- (从扫描到的基类源码中提取,不编造)
160
-
161
- ### 铁律:新建表 DDL 必须包含基类所有字段
162
- ```
163
-
164
- 无基类 → 写"本项目没有实体基类"。
165
-
166
- ### D. 代码风格深度提取
167
-
168
- 读取 2-3 个典型的 Controller、Service、ServiceImpl、Entity 源文件,提取具体风格(从源码提取,禁止编造):
169
-
170
- 1. **注解风格**:Controller 用 `@RestController` 还是 `@Controller`?方法用什么映射注解?参数校验方式?
171
- 2. **返回值约定**:统一返回 `Result<T>` / `ResponseEntity<T>` / 其他?
172
- 3. **异常处理**:用什么异常类?有没有全局异常处理器?
173
- 4. **Service 层约定**:实现类命名、是否继承基类、基类通用方法、事务注解用法
174
- 5. **实体/POJO 风格**:是否继承基类、Lombok 用法、ID 生成策略、`@TableId`
175
- 6. **Mapper/DAO 风格**:XML Mapper 还是注解?有没有通用 Mapper 基类?
176
-
177
- 将以上信息写入 CONVENTIONS.md「代码风格」章节。非 Java 项目参考同等概念提取。前端-only 项目写"不适用"。
47
+ 结果保存到 `.sillyspec/codebase/_env-detect.md`(临时文件,扫描完删除)。
178
48
 
179
49
  ---
180
50
 
181
51
  ## 深度扫描
182
52
 
183
- ### Step 0: 预处理脚本
184
-
185
- ```bash
186
- bash scripts/scan-preprocess.sh [扫描区域] 2>/dev/null
187
- ```
188
-
189
- 不存在则跳过。脚本输出 `.sillyspec/codebase/SCAN-RAW.md`(文件统计、配置、结构、import、类名/注解、Schema 位置)。
53
+ `mkdir -p .sillyspec/codebase`
190
54
 
191
- ### Step 1: 断点续扫
55
+ ### 断点续扫
192
56
 
193
57
  ```bash
194
- for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS; do
195
- [ -f ".sillyspec/codebase/${f}.md" ] || [ -f ".sillyspec/codebase/details/${f}.md" ] && echo "✅ ${f}" || echo "⬜ ${f}"
58
+ for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS PROJECT; do
59
+ [ -f ".sillyspec/codebase/${f}.md" ] && echo "✅ ${f}.md" || echo "⬜ ${f}.md"
196
60
  done
197
61
  ```
198
62
 
199
- 只生成缺失的文档,展示进度后继续。
200
-
201
- ### Step 2: 基于 SCAN-RAW.md 分析
63
+ 只生成缺失的文档。
202
64
 
203
- **不直接读原始源码。** 读 SCAN-RAW.md,按需深挖相关文件。
65
+ ### 检测子代理可用性
66
+ 检查是否有 Task/Spawn 工具。有 → 子代理模式,无 → 串行模式。
204
67
 
205
- 按顺序生成文档(写完立即保存,中断不丢失):
68
+ ---
206
69
 
207
- 1. `ARCHITECTURE.md` — 架构 + 技术栈 + 数据模型摘要(合并原 STACK.md)
208
- 2. `CONVENTIONS.md` — 编码约定(含框架隐形规则、实体继承规范)
209
- 3. `codebase/details/STRUCTURE.md` — 目录结构(深扫详情)
210
- 4. `codebase/details/INTEGRATIONS.md` — 集成(深扫详情)
211
- 5. `codebase/details/TESTING.md` — 测试现状(深扫详情)
212
- 6. `codebase/details/CONCERNS.md` — 技术债务和风险(深扫详情)
70
+ ### 子代理模式(4 个并行)
213
71
 
214
- 同时更新 `.sillyspec/PROJECT.md`。
72
+ #### Agent 1: tech → ARCHITECTURE.md
73
+ 扫描技术栈 + 数据库 Schema + 架构模式。参考 `_env-detect.md`。
74
+ 用 grep/rg 搜索(`@Entity`、`schema.prisma`、`models.py` 等),**禁止读源码全文**。
75
+ Schema 只记表名+说明+字段数。含 `## 技术栈` `## 架构概览` `## 数据模型(摘要)`。路径用反引号,不编造。
215
76
 
216
- > **注意:** `SCAN-RAW.md` 是临时文件,扫描完成后可删除。
77
+ #### Agent 2: conventions → CONVENTIONS.md
78
+ 扫描框架隐形规则 + 实体继承 + 代码风格。参考 `_env-detect.md`。
79
+ 用 grep 搜索拦截器/插件/逻辑删除/基类/审计字段,**禁止读源码全文**。
80
+ 根据检测到的语言/框架自行决定搜索什么模式,提取 3-5 个典型示例。
81
+ 含 `## 框架隐形规则` `## 实体继承规范` `## 代码风格`。路径用反引号,不编造。
217
82
 
218
- ---
83
+ #### Agent 3: structure → STRUCTURE.md + INTEGRATIONS.md
84
+ 扫描目录结构 + 外部集成。参考 `_env-detect.md`。
85
+ 用 find/ls/tree 和 grep,**禁止读源码全文**。
86
+ 搜索 API 调用、MQ 配置、缓存、第三方 SDK。STRUCTURE.md 含目录树+模块说明。INTEGRATIONS.md 按类型分组。路径用反引号,不编造。
219
87
 
220
- ## 完成后
88
+ #### Agent 4: quality → TESTING.md + CONCERNS.md + PROJECT.md
89
+ 扫描测试现状 + 技术债务 + 项目概览。参考 `_env-detect.md`。
90
+ 用 grep 搜索测试文件、TODO/FIXME、过时依赖,**禁止读源码全文**。
91
+ TESTING.md 含测试结构。CONCERNS.md 按严重程度分组。PROJECT.md 含项目信息。路径用反引号,不编造。
221
92
 
222
- ```bash
223
- sillyspec status --json
224
- sillyspec next
225
- ```
93
+ ---
226
94
 
227
- CLI 返回的命令推荐给用户。工作区扫描完成后额外提示生成 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`。
95
+ ### 串行模式(降级)
96
+ 无子代理时,按 tech → conventions → structure → quality 顺序执行。
97
+ 每个 area 完成后**立即写文件**,下一个 area 开始前清除源码上下文。
228
98
 
229
- ### Git 提交
99
+ ---
230
100
 
231
- ```bash
232
- git add .sillyspec/
233
- git commit -m "chore: sillyspec scan - codebase mapped"
234
- ```
101
+ ## 工作区模式
102
+ 对每个子项目:cd 环境探测 → 扫描 → cd 回工作区。
103
+ 全部完成后汇总 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`(只读各子项目的 ARCHITECTURE.md + CONVENTIONS.md)。
235
104
 
236
- ### 路径校验 + 自检门控
105
+ ---
237
106
 
238
- **路径校验:** 每份文档写完后检查必须在 `.sillyspec/codebase/` 下,误放则自动修正:
107
+ ## 扫描完成
239
108
 
240
109
  ```bash
241
- for f in $(find . -maxdepth 2 -name "{ARCHITECTURE,STRUCTURE,CONVENTIONS,INTEGRATIONS,TESTING,CONCERNS,PROJECT,SCAN-RAW}.md" ! -path "./.sillyspec/codebase/*" ! -path "./.sillyspec/codebase/details/*"); do
242
- [ -f "$f" ] && mkdir -p .sillyspec/codebase && mv "$f" ".sillyspec/codebase/$(basename $f)"
110
+ # 路径校验
111
+ for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS PROJECT; do
112
+ [ -f ".sillyspec/codebase/${f}.md" ] && echo "✅ ${f}.md"
243
113
  done
244
- ```
245
114
 
246
- **自检门控:**
247
- - [ ] ARCHITECTURE.md 含主要语言、框架和整体架构?
248
- - [ ] ARCHITECTURE.md 含数据模型摘要?(深扫)
249
- - [ ] STRUCTURE.md 含目录结构?(深扫,位于 details/)
250
- - [ ] CONVENTIONS.md 含编码约定?(深扫)
251
- - [ ] INTEGRATIONS.md 列出外部依赖?(深扫,位于 details/)
252
- - [ ] TESTING.md 描述测试状况?(深扫,位于 details/)
253
- - [ ] CONCERNS.md 列出技术债务?(深扫,位于 details/)
254
- - [ ] PROJECT.md 已生成?
115
+ # 验证 CLI
116
+ sillyspec status --json # 应返回 phase: "brainstorm"
117
+ sillyspec next # 推荐给用户
255
118
 
256
- ```bash
257
- bash scripts/validate-scan.sh .sillyspec/codebase 2>/dev/null
119
+ # 清理 + 提交
120
+ rm -f .sillyspec/codebase/_env-detect.md
121
+ git add .sillyspec/ && git commit -m "chore: sillyspec scan - codebase mapped"
258
122
  ```
123
+
124
+ ### 自检门控
125
+ - [ ] ARCHITECTURE.md:技术栈 + Schema 摘要?
126
+ - [ ] CONVENTIONS.md:隐形规则 + 代码风格?
127
+ - [ ] STRUCTURE.md:目录结构?
128
+ - [ ] INTEGRATIONS.md:外部依赖?
129
+ - [ ] TESTING.md:测试现状?
130
+ - [ ] CONCERNS.md:技术债务?
131
+ - [ ] PROJECT.md:项目概览?
132
+
133
+ ## 绝对规则
134
+ - ❌ 修改代码 / 编造路径 / 主代理读源码全文
135
+ - ✅ 交互模式每步等用户 / 文档只写 `.sillyspec/codebase/`
@@ -1,8 +1,3 @@
1
- ---
2
- description: 查看项目进度和状态
3
- argument-hint: ""
4
- ---
5
-
6
1
  ## 交互规范
7
2
  **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
8
3
 
@@ -19,7 +14,42 @@ argument-hint: ""
19
14
  cat .sillyspec/config.yaml 2>/dev/null
20
15
  ```
21
16
 
22
- **工作区模式:** 读取 config.yaml 子项目列表,对每个子项目检查 PROJECT.md、codebase 文档数、进行中变更、归档数。检查共享规范和工作区概览。输出汇总后结束,不执行单项目流程。
17
+ **工作区模式:** 读取 config.yaml 子项目列表,对每个子项目检查 PROJECT.md、codebase 文档数、进行中变更、归档数。**同时检查工作区根目录 `.sillyspec/changes/` 下的未归档变更。** 检查共享规范和工作区概览。输出汇总后结束,不执行单项目流程。
18
+
19
+ 工作区变更检查命令:
20
+ ```bash
21
+ # 工作区根目录的变更
22
+ ls .sillyspec/changes/ 2>/dev/null | grep -v archive
23
+ ls .sillyspec/changes/archive/ 2>/dev/null | wc -l
24
+
25
+ # 每个子项目的变更
26
+ for proj in $(cat .sillyspec/config.yaml | grep -oP 'path:\s*\K.*'); do
27
+ echo "=== $(basename $proj) changes ==="
28
+ ls "$proj/.sillyspec/changes/" 2>/dev/null | grep -v archive
29
+ ls "$proj/.sillyspec/changes/archive/" 2>/dev/null | wc -l
30
+ done
31
+ ```
32
+
33
+ **汇总输出格式:**
34
+ ```
35
+ 📊 SillySpec 状态
36
+ 📋 工作区模式 — N 个子项目
37
+
38
+ 工作区变更:
39
+ 🔄 进行中:sec-bonus-penalty(tasks: 3/5)
40
+ ✅ 已归档:1 个
41
+
42
+ 主项目(工作区根目录):
43
+ 📂 代码库文档:— (主项目通常无独立代码)
44
+ 🔄 进行中:N 个变更
45
+ ✅ 已归档:N 个变更
46
+
47
+ ┌───────────────────┬────────────┬────────────┬────────┬────────┐
48
+ │ 子项目 │ PROJECT.md │ 代码库文档 │ 进行中 │ 已归档 │
49
+ ├───────────────────┼────────────┼────────────┼────────┼────────┤
50
+ │ back-service │ ✗ │ 7 份 │ 1 │ 0 │
51
+ └───────────────────┴────────────┴────────────┴────────┴────────┘
52
+ ```
23
53
 
24
54
  **单项目模式:** 继续 Step 2。
25
55
 
@@ -11,11 +11,27 @@
11
11
  ## 状态检查(必须先执行)
12
12
 
13
13
  ```bash
14
- sillyspec status --json
14
+ cat .sillyspec/STATE.md 2>/dev/null
15
15
  ```
16
16
 
17
- - `phase: "verify"` → ✅ 继续
18
- - 其他 phase → 提示 `sillyspec next`
17
+ 检查当前阶段。如果没有 STATE.md,检查是否有未归档变更:
18
+
19
+ ```bash
20
+ ls .sillyspec/changes/ 2>/dev/null | grep -v archive
21
+ ```
22
+
23
+ 无 STATE.md 且无未归档变更 → 提示用户先完成 execute 或用 `/sillyspec:status` 查看状态。
24
+
25
+ ---
26
+
27
+ ## 工作区模式处理
28
+
29
+ 如果 `.sillyspec/config.yaml` 包含 `projects` 字段:
30
+
31
+ 1. 检查工作区根目录 `.sillyspec/changes/` 下的未归档变更
32
+ 2. 检查每个子项目 `<子项目路径>/.sillyspec/changes/` 下的未归档变更
33
+ 3. 列出所有未归档变更,让用户选择要验证哪个
34
+ 4. 根据 $ARGUMENTS 或用户选择,cd 到对应目录执行验证
19
35
 
20
36
  ---
21
37
 
@@ -24,8 +40,13 @@ sillyspec status --json
24
40
  ### 1. 加载规范
25
41
 
26
42
  ```bash
27
- LATEST=$(ls -d .sillyspec/changes/*/ | grep -v archive | tail -1)
28
- cat "$LATEST"/{design,tasks}.md 2>/dev/null
43
+ # 确定变更目录
44
+ if [ -n "$ARGUMENTS" ]; then
45
+ CHANGE_DIR=".sillyspec/changes/$ARGUMENTS"
46
+ else
47
+ CHANGE_DIR=$(ls -d .sillyspec/changes/*/ 2>/dev/null | grep -v archive | tail -1)
48
+ fi
49
+ cat "$CHANGE_DIR"/{design,tasks}.md 2>/dev/null
29
50
  ```
30
51
 
31
52
  锚定确认实际存在的文件。
@@ -61,14 +82,6 @@ grep -r "TODO\|FIXME\|HACK\|XXX" src/ lib/ app/ --include="*.ts" --include="*.ts
61
82
  ## 结论:✅ PASS / ⚠️ PASS WITH NOTES / ❌ FAIL
62
83
  ```
63
84
 
64
- ```bash
65
- bash scripts/validate-all.sh 2>/dev/null
66
- ```
67
-
68
85
  ### 7. 完成
69
86
 
70
- ```bash
71
- sillyspec status --json && sillyspec next
72
- ```
73
-
74
- 更新 `.sillyspec/STATE.md`:阶段改为 `verify ✅` 或 `verify ⚠️`。
87
+ 更新 `.sillyspec/STATE.md`(如存在):阶段改为 `verify ✅` 或 `verify ⚠️`。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sillyspec",
3
- "version": "3.1.0",
3
+ "version": "3.3.0",
4
4
  "description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
5
5
  "type": "module",
6
6
  "bin": {