sillyspec 3.2.1 → 3.4.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.
@@ -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,347 +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
- ## 交互式引导流程
21
+ ## 交互式引导(参数为空时)
30
22
 
31
- ### Step 1: 检查工作区模式
23
+ ### 检查工作区 & 已有文档
32
24
 
33
25
  ```bash
34
- cat .sillyspec/config.yaml 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
35
29
  ```
36
30
 
37
- `projects` 字段工作区模式:选择全量扫描、选子项目扫描、或退出。子项目文档存到各自 `<子项目路径>/.sillyspec/codebase/`,最后生成 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`。
38
-
39
- ### Step 2: 检查已有文档
40
-
41
- ```bash
42
- ls .sillyspec/codebase/ 2>/dev/null
43
- ```
44
-
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`,用户可调整)。
53
-
54
- ### Step 6: 确认并开始
31
+ - 已有 3 建议升级深度扫描
32
+ - 已有 7 份 → 建议刷新或跳过
33
+ - 工作区 逐个扫描 / 选子项目 / 退出
55
34
 
56
- 汇总选择,用户确认后执行。
57
-
58
- ### 🚨 工作区扫描铁律(防止上下文爆炸)
59
-
60
- **工作区模式下,必须逐个子项目扫描并写入,禁止跨子项目累积上下文:**
61
-
62
- ```
63
- 子项目 A → 读取 → 写入文档 → 清理上下文
64
- 子项目 B → 读取 → 写入文档 → 清理上下文
65
- ...
66
- 最后 → 生成 CODEBASE-OVERVIEW.md
67
- ```
68
-
69
- - ✅ 每个子项目扫描完成后**立即写入** `.sillyspec/codebase/` 文件
70
- - ✅ 写入后**不再回头读**该子项目的源码
71
- - ❌ 禁止同时读取多个子项目的源码再一次性全部写入
72
- - ❌ 禁止在一个子项目扫描过程中去读另一个子项目的文件
73
-
74
- **CODEBASE-OVERVIEW.md** 只读各子项目已生成的 ARCHITECTURE.md + CONVENTIONS.md(不读源码),生成汇总。
35
+ ### 选择扫描模式、范围、排除目录、确认
36
+ 按原流程交互,确认后进入扫描。
75
37
 
76
38
  ---
77
39
 
78
- ## 快速扫描
79
-
80
- **只读入口和配置文件,不读源码。** 生成 3 份文档到 `mkdir -p .sillyspec/codebase`:
81
-
82
- 1. `ARCHITECTURE.md` — 架构 + 技术栈(合并原 STACK.md)
83
- 2. `STRUCTURE.md` — 目录结构
84
- 3. `PROJECT.md` — 项目概览
40
+ ## 构建环境探测(主代理执行)
85
41
 
86
- 扫描命令:
87
42
  ```bash
88
- # 配置文件
89
- 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
90
44
  find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null
91
- # 目录结构
92
- find . -type f -not -path "*/node_modules/*" -not -path "*/{dist,.git,vendor,build,__pycache__,.next,coverage,.nuxt,target}/*" | head -200
93
- # 最近提交
94
- git log --oneline -20
95
45
  ```
96
46
 
97
- ## 🚨 四项强制扫描(快速和深度都必须执行)
98
-
99
- ### A. 构建环境探测(IDE vs 终端差异修复)
100
-
101
- **目的:** 解决 IDEA 有私服配置但终端跑不了 `mvn test` / `npm test` 的问题。
102
-
103
- **探测步骤:**
104
-
105
- ```bash
106
- # 检测项目使用的构建工具
107
- ls pom.xml build.gradle package.json requirements.txt go.mod Cargo.toml pyproject.toml 2>/dev/null
108
- # 检测是否有 wrapper
109
- ls mvnw gradlew package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null
110
- # 检测是否有 IDEA 特殊配置
111
- grep -r "mavenHome\|settings\.xml\|gradleHome\|nodeInterpreter" .idea/workspace.xml 2>/dev/null | head -5
112
- # 检测是否有本地配置文件
113
- cat .mvn/maven.config 2>/dev/null
114
- cat .mvn/jvm.config 2>/dev/null
115
- cat .npmrc 2>/dev/null
116
- cat pip.conf .pip/pip.conf ~/.pip/pip.conf 2>/dev/null
117
- cat ~/.gradle/gradle.properties 2>/dev/null
118
- ```
119
-
120
- **AskUserQuestion 询问用户:**
121
-
122
- > "检测到本项目使用 [Maven/Gradle/npm/pip/Go],终端执行构建命令时是否需要特殊配置?"
123
- > 选项:
124
- > - 不需要,默认配置就能跑
125
- > - 需要指定配置文件(如 Maven 的 settings.xml)→ 让用户输入路径
126
- > - 需要额外参数(如私服地址、代理等)→ 让用户输入
127
- > - 不确定,先试试默认命令
128
-
129
- **如果用户选择了需要配置,测试默认命令是否能跑通:**
130
-
131
- ```bash
132
- # Maven
133
- mvn test -s <用户提供的路径> --fail-at-end 2>&1 | tail -5
134
- # Gradle
135
- ./gradlew test 2>&1 | tail -5 || gradle test 2>&1 | tail -5
136
- # npm
137
- npm test 2>&1 | tail -5 || pnpm test 2>&1 | tail -5
138
- # pip
139
- pip install -e . 2>&1 | tail -5 && pytest --collect-only 2>&1 | tail -5
140
- # Go
141
- go test ./... 2>&1 | tail -5
142
- ```
143
-
144
- **写入 `.sillyspec/local.yaml`(本地记忆文件,不提交到 git):**
145
-
146
- 此文件存储每个开发者独立的本地配置。如果文件已存在则追加,已有字段则跳过:
147
-
148
- ```yaml
149
- # .sillyspec/local.yaml — 本地记忆文件(已在 .gitignore 中,不提交)
150
- # 每个开发者独立配置,clone 后重新 scan 即可生成
151
-
152
- build:
153
- tool: maven
154
- test_cmd: 'mvn test -s "D:/software/maven/conf/settings.xml"'
155
- compile_cmd: 'mvn compile -s "D:/software/maven/conf/settings.xml"'
156
- single_test_cmd: 'mvn test -s "D:/software/maven/conf/settings.xml" -pl {module} -Dtest={test_class}'
157
- ```
158
-
159
- **铁律:后续 execute / verify 阶段执行构建或测试命令时,必须先读取 `.sillyspec/local.yaml` 中的 build 配置,使用记录的命令执行。如果 local.yaml 不存在或无 build 配置,使用默认命令。**
160
-
161
- 无构建工具 → 跳过此步骤。
162
-
163
- ### B. 数据库 Schema 扫描
164
-
165
- **目的:** 防止后续阶段编造表名和字段名。
166
-
167
- ```bash
168
- 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" \) \
169
- -not -path "*/node_modules/*" -not -path "*/{.git,dist,build,vendor}/*" | head -30
170
- ```
171
-
172
- **写入 ARCHITECTURE.md(只记摘要,不展开字段):**
173
-
174
- ```markdown
175
- ## 数据模型(摘要)
176
- | 表名 | 说明 | 字段数 | 来源文件 |
177
- |---|---|---|---|
178
- | users | 用户表 | 12 | `src/entity/User.java` |
179
-
180
- ### 关系
181
- - users 1:N orders
182
- ```
183
-
184
- 无数据库 → 写"本项目无数据库"。**铁律:所有阶段引用的表名必须来自此摘要,或 design.md 中声明的新增表。**
185
-
186
- ### C. 框架隐形规则扫描
187
-
188
- **目的:** 防止 AI 生成的 SQL/代码违反框架自动处理机制(如自动注入字段、逻辑删除拦截器)。
189
-
190
- ```bash
191
- # 通用检测:拦截器、审计、中间件、逻辑删除、多租户
192
- find . \( -name "*Interceptor*.java" -o -name "*Plugin*.java" -o -name "*Auditor*.java" \
193
- -o -name "*EventListener*.java" -o -name "mybatis-config.xml" -o -name "settings.py" \
194
- -o -name "*event*.py" -o -name "*listener*.py" -o -name "*mixin*.py" \) \
195
- -not -path "*/node_modules/*" -not -path "*/{.git,dist,build,vendor}/*" | head -20
196
- # 框架特定:Prisma/GORM/TypeORM/Rails/Laravel 中间件和回调
197
- cat prisma/schema.prisma 2>/dev/null | grep -i "middleware\|plugin\|previewFeatures"
198
- find . \( -name "*.go" -o -name "*.ts" -o -name "*.rb" -o -name "*.php" \) \
199
- -not -path "*/{node_modules,vendor}/*" | xargs grep -l "Callback\|Plugin\|EventSubscriber\|BeforeInsert\|acts_as_paranoid\|acts_as_tenant" 2>/dev/null | head -10
200
- # 逻辑删除/多租户字段
201
- find . \( -name "*.java" -o -name "*.py" -o -name "*.go" -o -name "*.ts" -o -name "*.php" \) \
202
- -not -path "*/{node_modules,.git,vendor,dist,build}/*" | xargs grep -li "is_deleted\|deleted_at\|soft_delete\|tenant_id" 2>/dev/null | head -20
203
- ```
204
-
205
- **写入 CONVENTIONS.md:**
206
-
207
- ```markdown
208
- ## 框架隐形规则
209
- ### 自动注入字段(SQL 中不要手动写)
210
- | 字段 | 来源 | 说明 |
211
- |---|---|---|
212
-
213
- ### 自动填充字段(INSERT/UPDATE 不需要手动赋值)
214
- | 字段 | 来源 | 说明 |
215
- |---|---|---|
216
-
217
- ### DELETE 行为
218
- - 不要写 `DELETE FROM` → 使用逻辑删除(如 UPDATE xxx SET is_deleted=1)
219
- ```
220
-
221
- 无发现 → 写"未发现框架级别的自动处理配置"。**铁律:后续阶段生成 SQL/数据操作代码必须遵守这些规则。**
222
-
223
- ### D. 实体继承规范扫描
224
-
225
- **目的:** 防止新建表时漏掉基类通用字段,导致 ORM 查询报 Unknown column。
226
-
227
- ```bash
228
- find . \( -name "Base*.java" -o -name "Abstract*.java" \) \
229
- \( -path "*/entity/*" -o -path "*/model/*" -o -path "*/po/*" \) \
230
- -not -path "*/{node_modules,.git}/*" | head -20
231
- find . -name "*.java" -not -path "*/{node_modules,.git}/*" | xargs grep -l "@MappedSuperclass" 2>/dev/null | head -10
232
- ```
233
-
234
- **追加到 CONVENTIONS.md:**
235
-
236
- ```markdown
237
- ## 实体继承规范
238
- ### 基类通用字段(新建表必须包含)
239
- | 字段 | 类型 | 说明 |
240
- |---|---|---|
241
- (从扫描到的基类源码中提取,不编造)
242
-
243
- ### 铁律:新建表 DDL 必须包含基类所有字段
244
- ```
245
-
246
- 无基类 → 写"本项目没有实体基类"。
247
-
248
- ### E. 代码风格深度提取
249
-
250
- 读取 2-3 个典型的 Controller、Service、ServiceImpl、Entity 源文件,提取具体风格(从源码提取,禁止编造):
251
-
252
- 1. **注解风格**:Controller 用 `@RestController` 还是 `@Controller`?方法用什么映射注解?参数校验方式?
253
- 2. **返回值约定**:统一返回 `Result<T>` / `ResponseEntity<T>` / 其他?
254
- 3. **异常处理**:用什么异常类?有没有全局异常处理器?
255
- 4. **Service 层约定**:实现类命名、是否继承基类、基类通用方法、事务注解用法
256
- 5. **实体/POJO 风格**:是否继承基类、Lombok 用法、ID 生成策略、`@TableId`
257
- 6. **Mapper/DAO 风格**:XML Mapper 还是注解?有没有通用 Mapper 基类?
258
-
259
- 将以上信息写入 CONVENTIONS.md「代码风格」章节。非 Java 项目参考同等概念提取。前端-only 项目写"不适用"。
47
+ 结果保存到 `.sillyspec/codebase/_env-detect.md`(临时文件,扫描完删除)。
260
48
 
261
49
  ---
262
50
 
263
51
  ## 深度扫描
264
52
 
265
- ### Step 0: 预处理脚本
266
-
267
- ```bash
268
- bash scripts/scan-preprocess.sh [扫描区域] 2>/dev/null
269
- ```
270
-
271
- 不存在则跳过。脚本输出 `.sillyspec/codebase/SCAN-RAW.md`(文件统计、配置、结构、import、类名/注解、Schema 位置)。
53
+ `mkdir -p .sillyspec/codebase`
272
54
 
273
- ### Step 1: 断点续扫
55
+ ### 断点续扫
274
56
 
275
57
  ```bash
276
- for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS; do
277
- [ -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"
278
60
  done
279
61
  ```
280
62
 
281
- 只生成缺失的文档,展示进度后继续。
63
+ 只生成缺失的文档。
64
+
65
+ ### 检测子代理可用性
66
+ 检查是否有 Task/Spawn 工具。有 → 子代理模式,无 → 串行模式。
282
67
 
283
- ### Step 2: 基于 SCAN-RAW.md 分析
68
+ ---
284
69
 
285
- **不直接读原始源码。** SCAN-RAW.md,按需深挖相关文件。
70
+ ### 子代理模式(4 个并行)
286
71
 
287
- 按顺序生成文档(写完立即保存,中断不丢失):
72
+ #### Agent 1: tech → ARCHITECTURE.md
73
+ 扫描技术栈 + 数据库 Schema + 架构模式。参考 `_env-detect.md`。
74
+ 用 grep/rg 搜索(`@Entity`、`schema.prisma`、`models.py` 等),**禁止读源码全文**。
75
+ Schema 只记表名+说明+字段数。含 `## 技术栈` `## 架构概览` `## 数据模型(摘要)`。路径用反引号,不编造。
288
76
 
289
- 1. `ARCHITECTURE.md` 架构 + 技术栈 + 数据模型摘要(合并原 STACK.md
290
- 2. `CONVENTIONS.md` — 编码约定(含框架隐形规则、实体继承规范)
291
- 3. `codebase/details/STRUCTURE.md` — 目录结构(深扫详情)
292
- 4. `codebase/details/INTEGRATIONS.md` — 集成(深扫详情)
293
- 5. `codebase/details/TESTING.md` 测试现状(深扫详情)
294
- 6. `codebase/details/CONCERNS.md` — 技术债务和风险(深扫详情)
77
+ #### Agent 2: conventions CONVENTIONS.md
78
+ 扫描框架隐形规则 + 实体继承 + 代码风格。参考 `_env-detect.md`。
79
+ grep 搜索拦截器/插件/逻辑删除/基类/审计字段,**禁止读源码全文**。
80
+ 根据检测到的语言/框架自行决定搜索什么模式,提取 3-5 个典型示例。
81
+ `## 框架隐形规则` `## 实体继承规范` `## 代码风格`。路径用反引号,不编造。
295
82
 
296
- 同时更新 `.sillyspec/PROJECT.md`。
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 按类型分组。路径用反引号,不编造。
297
87
 
298
- > **注意:** `SCAN-RAW.md` 是临时文件,扫描完成后可删除。
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 含项目信息。路径用反引号,不编造。
299
92
 
300
93
  ---
301
94
 
302
- ## 完成后
95
+ ### 串行模式(降级)
96
+ 无子代理时,按 tech → conventions → structure → quality 顺序执行。
97
+ 每个 area 完成后**立即写文件**,下一个 area 开始前清除源码上下文。
303
98
 
304
- ```bash
305
- sillyspec status --json
306
- sillyspec next
307
- ```
99
+ ---
308
100
 
309
- CLI 返回的命令推荐给用户。工作区扫描完成后额外提示生成 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`。
101
+ ## 工作区模式
102
+ 对每个子项目:cd → 环境探测 → 扫描 → cd 回工作区。
103
+ 全部完成后汇总 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`(只读各子项目的 ARCHITECTURE.md + CONVENTIONS.md)。
310
104
 
311
- ### Git 提交
105
+ ---
312
106
 
313
- **单项目模式:**
314
- ```bash
315
- git add .sillyspec/ && git commit -m "chore: sillyspec scan - codebase mapped"
316
- ```
107
+ ## 扫描完成
317
108
 
318
- **工作区模式:** 在每个子项目目录分别 commit(主工作区无 git 则跳过):
319
109
  ```bash
320
- for proj in $(cat .sillyspec/config.yaml | grep -oP 'path:\s*\K.*'); do
321
- cd "$proj" && git add .sillyspec/ 2>/dev/null && git commit -m "chore: sillyspec scan - codebase mapped" && cd - > /dev/null
110
+ # 路径校验
111
+ for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS PROJECT; do
112
+ [ -f ".sillyspec/codebase/${f}.md" ] && echo "✅ ${f}.md"
322
113
  done
323
- ```
324
114
 
325
- ### 路径校验 + 自检门控
115
+ # 验证 CLI
116
+ sillyspec status --json # 应返回 phase: "brainstorm"
117
+ sillyspec next # 推荐给用户
326
118
 
327
- **路径校验:** 每份文档写完后检查必须在 `.sillyspec/codebase/` 下,误放则自动修正:
328
-
329
- ```bash
330
- 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
331
- [ -f "$f" ] && mkdir -p .sillyspec/codebase && mv "$f" ".sillyspec/codebase/$(basename $f)"
332
- done
119
+ # 清理 + 提交
120
+ rm -f .sillyspec/codebase/_env-detect.md
121
+ git add .sillyspec/ && git commit -m "chore: sillyspec scan - codebase mapped"
333
122
  ```
334
123
 
335
- **自检门控:**
336
- - [ ] ARCHITECTURE.md 含主要语言、框架和整体架构?
337
- - [ ] ARCHITECTURE.md 含数据模型摘要?(深扫)
338
- - [ ] STRUCTURE.md 含目录结构?(深扫,位于 details/)
339
- - [ ] CONVENTIONS.md 含编码约定?(深扫)
340
- - [ ] INTEGRATIONS.md 列出外部依赖?(深扫,位于 details/)
341
- - [ ] TESTING.md 描述测试状况?(深扫,位于 details/)
342
- - [ ] CONCERNS.md 列出技术债务?(深扫,位于 details/)
343
- - [ ] PROJECT.md 已生成?
124
+ ### 自检门控
125
+ - [ ] ARCHITECTURE.md:技术栈 + Schema 摘要?
126
+ - [ ] CONVENTIONS.md:隐形规则 + 代码风格?
127
+ - [ ] STRUCTURE.md:目录结构?
128
+ - [ ] INTEGRATIONS.md:外部依赖?
129
+ - [ ] TESTING.md:测试现状?
130
+ - [ ] CONCERNS.md:技术债务?
131
+ - [ ] PROJECT.md:项目概览?
344
132
 
345
- ```bash
346
- bash scripts/validate-scan.sh .sillyspec/codebase 2>/dev/null
347
- ```
133
+ ## 绝对规则
134
+ - ❌ 修改代码 / 编造路径 / 主代理读源码全文
135
+ - ✅ 交互模式每步等用户 / 文档只写 `.sillyspec/codebase/`
@@ -39,6 +39,11 @@ done
39
39
  🔄 进行中:sec-bonus-penalty(tasks: 3/5)
40
40
  ✅ 已归档:1 个
41
41
 
42
+ 主项目(工作区根目录):
43
+ 📂 代码库文档:— (主项目通常无独立代码)
44
+ 🔄 进行中:N 个变更
45
+ ✅ 已归档:N 个变更
46
+
42
47
  ┌───────────────────┬────────────┬────────────┬────────┬────────┐
43
48
  │ 子项目 │ PROJECT.md │ 代码库文档 │ 进行中 │ 已归档 │
44
49
  ├───────────────────┼────────────┼────────────┼────────┼────────┤
@@ -0,0 +1,89 @@
1
+ ## 交互规范
2
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
3
+
4
+ ## 核心约束(必须遵守)
5
+ - ❌ 修改子项目的代码
6
+ - ❌ 删除已有文件(clone 前必须确认)
7
+ - ❌ 跳过冲突检查直接覆盖
8
+
9
+ ## 流程
10
+
11
+ ### Step 1: 读取配置
12
+
13
+ ```bash
14
+ cat .sillyspec/config.yaml 2>/dev/null
15
+ ```
16
+
17
+ 无 config.yaml → 提示先执行 `/sillyspec:workspace` 初始化工作区。
18
+
19
+ ### Step 2: 逐个子项目检查
20
+
21
+ 对 config.yaml 中每个子项目,按顺序执行:
22
+
23
+ ```bash
24
+ # 检查目录是否存在
25
+ ls -d <path> 2>/dev/null && echo "EXISTS" || echo "MISSING"
26
+ ```
27
+
28
+ #### 情况 A:目录不存在
29
+
30
+ ```bash
31
+ # 检查是否有 repo 配置
32
+ grep "repo:" .sillyspec/config.yaml | grep -A 1 "<name>"
33
+ ```
34
+
35
+ - **有 repo** → AskUserQuestion:"子项目 `<name>` 不存在,是否从 `<repo>` clone 到 `<path>`?"
36
+ - 用户确认 → `git clone <repo> <path>` → ✅ 成功
37
+ - clone 失败 → ❌ 报错,提示用户手动 clone
38
+ - **无 repo** → ⚠️ 提示用户:"子项目 `<name>` 不存在且无 repo 配置,请手动放置到 `<path>`"
39
+
40
+ #### 情况 B:目录已存在
41
+
42
+ ```bash
43
+ # 检查是否是 git 仓库
44
+ git -C <path> rev-parse --is-inside-work-tree 2>/dev/null
45
+
46
+ # 如果是,检查 remote 是否匹配
47
+ git -C <path> remote get-url origin 2>/dev/null
48
+ ```
49
+
50
+ - **不是 git 仓库** → AskUserQuestion:"目录 `<path>` 存在但不是 git 仓库,可能和其他项目冲突。"
51
+ - 跳过此子项目
52
+ - 让用户指定正确路径
53
+ - **是 git 仓库,remote 匹配 repo** → ✅ 跳过,状态正常
54
+ - **是 git 仓库,remote 不匹配 repo** → ⚠️ AskUserQuestion:
55
+ - "目录 `<path>` 是 git 仓库但 remote 不匹配(期望 `<repo>`,实际 `<actual>`)。可能是不同项目。"
56
+ - 跳过 / 用户确认覆盖
57
+
58
+ #### 情况 C:路径冲突
59
+
60
+ 检查两个子项目的 path 是否指向同一目录或互相包含:
61
+
62
+ ```bash
63
+ # 将相对路径转为绝对路径后比较
64
+ realpath <path1>
65
+ realpath <path2>
66
+ ```
67
+
68
+ 冲突 → ❌ 报错:"子项目 A 和 B 的路径冲突,请修改 config.yaml"
69
+
70
+ ### Step 3: 汇总报告
71
+
72
+ ```
73
+ 📊 工作区同步结果
74
+
75
+ ┌───────────────────┬──────────┬────────────────────────────────────┐
76
+ │ 子项目 │ 状态 │ 说明 │
77
+ ├───────────────────┼──────────┼────────────────────────────────────┤
78
+ │ back-service │ ✅ 正常 │ 目录存在,git remote 匹配 │
79
+ │ sub-grid-security │ 🔄 已克隆 │ 从 https://... clone 成功 │
80
+ │ frontend │ ⚠️ 缺失 │ 无 repo 配置,请手动放置 │
81
+ └───────────────────┴──────────┴────────────────────────────────────┘
82
+ ```
83
+
84
+ 全部正常 → 提示 `/sillyspec:brainstorm '你的需求'` 继续。
85
+ 有异常 → 提示用户处理后再 sync。
86
+
87
+ ### Step 4: 更新 config.yaml
88
+
89
+ 如果 clone 过程中实际 remote 和 config.yaml 中的 repo 不一致,更新 repo 字段为实际值。
@@ -1,19 +1,3 @@
1
- ---
2
- description: 工作区管理 — 初始化、管理多项目工作区,查看子项目状态
3
- argument-hint: "[可选:add/remove/status/info]"
4
- ---
5
-
6
- ## 交互规范
7
- **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
8
-
9
- ## 核心约束(必须遵守)
10
- - ❌ 修改子项目目录下的任何文件
11
- - ❌ 写非法 YAML
12
- - ❌ 使用绝对路径(必须是相对路径)
13
-
14
- ## 用户指令
15
- $ARGUMENTS
16
-
17
1
  ## 交互规范
18
2
  **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
19
3
 
@@ -42,7 +26,7 @@ cat .sillyspec/config.yaml 2>/dev/null
42
26
  - 无参数 / `status` → 显示状态
43
27
  - `add` → 添加子项目
44
28
  - `remove` → 移除子项目
45
- - `info <name>` 子项目详情
29
+ - `sync`同步子项目(clone 缺失的,检查冲突)
46
30
 
47
31
  ### Step 3: 执行操作
48
32
 
@@ -68,6 +52,7 @@ projects:
68
52
  <name>:
69
53
  path: <relative-path>
70
54
  role: <description>
55
+ repo: <git-remote-url> # 可选,git remote get-url origin
71
56
  shared:
72
57
  - <filename.md>
73
58
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sillyspec",
3
- "version": "3.2.1",
3
+ "version": "3.4.0",
4
4
  "description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
5
5
  "type": "module",
6
6
  "bin": {
package/src/init.js CHANGED
@@ -281,7 +281,7 @@ async function doInstall(projectDir, tools, isWorkspace, subprojects = []) {
281
281
  let projectsYaml = '';
282
282
  if (subprojects.length > 0) {
283
283
  projectsYaml = subprojects.map(p =>
284
- ` ${p.name}:\n path: ${p.path}\n role: ${p.role || p.name}`
284
+ ` ${p.name}:\n path: ${p.path}\n role: ${p.role || p.name}${p.repo ? `\n repo: ${p.repo}` : ''}`
285
285
  ).join('\n');
286
286
  }
287
287
 
@@ -462,10 +462,19 @@ export async function cmdInit(projectDir, options = {}) {
462
462
  default: '',
463
463
  });
464
464
 
465
+ // 检测 git 远程地址
466
+ let repo = '';
467
+ try {
468
+ const { execSync } = require('child_process');
469
+ const absPath = resolve(projectDir, subPath.trim() || `./${name.trim()}`);
470
+ repo = execSync('git remote get-url origin', { cwd: absPath, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
471
+ } catch {}
472
+
465
473
  subprojects.push({
466
474
  name: name.trim(),
467
475
  path: subPath.trim() || `./${name.trim()}`,
468
476
  role: role.trim(),
477
+ repo,
469
478
  });
470
479
 
471
480
  // 从建议中移除已添加的
@@ -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` 进行深度扫描。
package/templates/scan.md CHANGED
@@ -1,347 +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
- ## 交互式引导流程
21
+ ## 交互式引导(参数为空时)
30
22
 
31
- ### Step 1: 检查工作区模式
23
+ ### 检查工作区 & 已有文档
32
24
 
33
25
  ```bash
34
- cat .sillyspec/config.yaml 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
35
29
  ```
36
30
 
37
- `projects` 字段工作区模式:选择全量扫描、选子项目扫描、或退出。子项目文档存到各自 `<子项目路径>/.sillyspec/codebase/`,最后生成 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`。
38
-
39
- ### Step 2: 检查已有文档
40
-
41
- ```bash
42
- ls .sillyspec/codebase/ 2>/dev/null
43
- ```
44
-
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`,用户可调整)。
53
-
54
- ### Step 6: 确认并开始
31
+ - 已有 3 建议升级深度扫描
32
+ - 已有 7 份 → 建议刷新或跳过
33
+ - 工作区 逐个扫描 / 选子项目 / 退出
55
34
 
56
- 汇总选择,用户确认后执行。
57
-
58
- ### 🚨 工作区扫描铁律(防止上下文爆炸)
59
-
60
- **工作区模式下,必须逐个子项目扫描并写入,禁止跨子项目累积上下文:**
61
-
62
- ```
63
- 子项目 A → 读取 → 写入文档 → 清理上下文
64
- 子项目 B → 读取 → 写入文档 → 清理上下文
65
- ...
66
- 最后 → 生成 CODEBASE-OVERVIEW.md
67
- ```
68
-
69
- - ✅ 每个子项目扫描完成后**立即写入** `.sillyspec/codebase/` 文件
70
- - ✅ 写入后**不再回头读**该子项目的源码
71
- - ❌ 禁止同时读取多个子项目的源码再一次性全部写入
72
- - ❌ 禁止在一个子项目扫描过程中去读另一个子项目的文件
73
-
74
- **CODEBASE-OVERVIEW.md** 只读各子项目已生成的 ARCHITECTURE.md + CONVENTIONS.md(不读源码),生成汇总。
35
+ ### 选择扫描模式、范围、排除目录、确认
36
+ 按原流程交互,确认后进入扫描。
75
37
 
76
38
  ---
77
39
 
78
- ## 快速扫描
79
-
80
- **只读入口和配置文件,不读源码。** 生成 3 份文档到 `mkdir -p .sillyspec/codebase`:
81
-
82
- 1. `ARCHITECTURE.md` — 架构 + 技术栈(合并原 STACK.md)
83
- 2. `STRUCTURE.md` — 目录结构
84
- 3. `PROJECT.md` — 项目概览
40
+ ## 构建环境探测(主代理执行)
85
41
 
86
- 扫描命令:
87
42
  ```bash
88
- # 配置文件
89
- 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
90
44
  find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null
91
- # 目录结构
92
- find . -type f -not -path "*/node_modules/*" -not -path "*/{dist,.git,vendor,build,__pycache__,.next,coverage,.nuxt,target}/*" | head -200
93
- # 最近提交
94
- git log --oneline -20
95
45
  ```
96
46
 
97
- ## 🚨 四项强制扫描(快速和深度都必须执行)
98
-
99
- ### A. 构建环境探测(IDE vs 终端差异修复)
100
-
101
- **目的:** 解决 IDEA 有私服配置但终端跑不了 `mvn test` / `npm test` 的问题。
102
-
103
- **探测步骤:**
104
-
105
- ```bash
106
- # 检测项目使用的构建工具
107
- ls pom.xml build.gradle package.json requirements.txt go.mod Cargo.toml pyproject.toml 2>/dev/null
108
- # 检测是否有 wrapper
109
- ls mvnw gradlew package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null
110
- # 检测是否有 IDEA 特殊配置
111
- grep -r "mavenHome\|settings\.xml\|gradleHome\|nodeInterpreter" .idea/workspace.xml 2>/dev/null | head -5
112
- # 检测是否有本地配置文件
113
- cat .mvn/maven.config 2>/dev/null
114
- cat .mvn/jvm.config 2>/dev/null
115
- cat .npmrc 2>/dev/null
116
- cat pip.conf .pip/pip.conf ~/.pip/pip.conf 2>/dev/null
117
- cat ~/.gradle/gradle.properties 2>/dev/null
118
- ```
119
-
120
- **AskUserQuestion 询问用户:**
121
-
122
- > "检测到本项目使用 [Maven/Gradle/npm/pip/Go],终端执行构建命令时是否需要特殊配置?"
123
- > 选项:
124
- > - 不需要,默认配置就能跑
125
- > - 需要指定配置文件(如 Maven 的 settings.xml)→ 让用户输入路径
126
- > - 需要额外参数(如私服地址、代理等)→ 让用户输入
127
- > - 不确定,先试试默认命令
128
-
129
- **如果用户选择了需要配置,测试默认命令是否能跑通:**
130
-
131
- ```bash
132
- # Maven
133
- mvn test -s <用户提供的路径> --fail-at-end 2>&1 | tail -5
134
- # Gradle
135
- ./gradlew test 2>&1 | tail -5 || gradle test 2>&1 | tail -5
136
- # npm
137
- npm test 2>&1 | tail -5 || pnpm test 2>&1 | tail -5
138
- # pip
139
- pip install -e . 2>&1 | tail -5 && pytest --collect-only 2>&1 | tail -5
140
- # Go
141
- go test ./... 2>&1 | tail -5
142
- ```
143
-
144
- **写入 `.sillyspec/local.yaml`(本地记忆文件,不提交到 git):**
145
-
146
- 此文件存储每个开发者独立的本地配置。如果文件已存在则追加,已有字段则跳过:
147
-
148
- ```yaml
149
- # .sillyspec/local.yaml — 本地记忆文件(已在 .gitignore 中,不提交)
150
- # 每个开发者独立配置,clone 后重新 scan 即可生成
151
-
152
- build:
153
- tool: maven
154
- test_cmd: 'mvn test -s "D:/software/maven/conf/settings.xml"'
155
- compile_cmd: 'mvn compile -s "D:/software/maven/conf/settings.xml"'
156
- single_test_cmd: 'mvn test -s "D:/software/maven/conf/settings.xml" -pl {module} -Dtest={test_class}'
157
- ```
158
-
159
- **铁律:后续 execute / verify 阶段执行构建或测试命令时,必须先读取 `.sillyspec/local.yaml` 中的 build 配置,使用记录的命令执行。如果 local.yaml 不存在或无 build 配置,使用默认命令。**
160
-
161
- 无构建工具 → 跳过此步骤。
162
-
163
- ### B. 数据库 Schema 扫描
164
-
165
- **目的:** 防止后续阶段编造表名和字段名。
166
-
167
- ```bash
168
- 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" \) \
169
- -not -path "*/node_modules/*" -not -path "*/{.git,dist,build,vendor}/*" | head -30
170
- ```
171
-
172
- **写入 ARCHITECTURE.md(只记摘要,不展开字段):**
173
-
174
- ```markdown
175
- ## 数据模型(摘要)
176
- | 表名 | 说明 | 字段数 | 来源文件 |
177
- |---|---|---|---|
178
- | users | 用户表 | 12 | `src/entity/User.java` |
179
-
180
- ### 关系
181
- - users 1:N orders
182
- ```
183
-
184
- 无数据库 → 写"本项目无数据库"。**铁律:所有阶段引用的表名必须来自此摘要,或 design.md 中声明的新增表。**
185
-
186
- ### C. 框架隐形规则扫描
187
-
188
- **目的:** 防止 AI 生成的 SQL/代码违反框架自动处理机制(如自动注入字段、逻辑删除拦截器)。
189
-
190
- ```bash
191
- # 通用检测:拦截器、审计、中间件、逻辑删除、多租户
192
- find . \( -name "*Interceptor*.java" -o -name "*Plugin*.java" -o -name "*Auditor*.java" \
193
- -o -name "*EventListener*.java" -o -name "mybatis-config.xml" -o -name "settings.py" \
194
- -o -name "*event*.py" -o -name "*listener*.py" -o -name "*mixin*.py" \) \
195
- -not -path "*/node_modules/*" -not -path "*/{.git,dist,build,vendor}/*" | head -20
196
- # 框架特定:Prisma/GORM/TypeORM/Rails/Laravel 中间件和回调
197
- cat prisma/schema.prisma 2>/dev/null | grep -i "middleware\|plugin\|previewFeatures"
198
- find . \( -name "*.go" -o -name "*.ts" -o -name "*.rb" -o -name "*.php" \) \
199
- -not -path "*/{node_modules,vendor}/*" | xargs grep -l "Callback\|Plugin\|EventSubscriber\|BeforeInsert\|acts_as_paranoid\|acts_as_tenant" 2>/dev/null | head -10
200
- # 逻辑删除/多租户字段
201
- find . \( -name "*.java" -o -name "*.py" -o -name "*.go" -o -name "*.ts" -o -name "*.php" \) \
202
- -not -path "*/{node_modules,.git,vendor,dist,build}/*" | xargs grep -li "is_deleted\|deleted_at\|soft_delete\|tenant_id" 2>/dev/null | head -20
203
- ```
204
-
205
- **写入 CONVENTIONS.md:**
206
-
207
- ```markdown
208
- ## 框架隐形规则
209
- ### 自动注入字段(SQL 中不要手动写)
210
- | 字段 | 来源 | 说明 |
211
- |---|---|---|
212
-
213
- ### 自动填充字段(INSERT/UPDATE 不需要手动赋值)
214
- | 字段 | 来源 | 说明 |
215
- |---|---|---|
216
-
217
- ### DELETE 行为
218
- - 不要写 `DELETE FROM` → 使用逻辑删除(如 UPDATE xxx SET is_deleted=1)
219
- ```
220
-
221
- 无发现 → 写"未发现框架级别的自动处理配置"。**铁律:后续阶段生成 SQL/数据操作代码必须遵守这些规则。**
222
-
223
- ### D. 实体继承规范扫描
224
-
225
- **目的:** 防止新建表时漏掉基类通用字段,导致 ORM 查询报 Unknown column。
226
-
227
- ```bash
228
- find . \( -name "Base*.java" -o -name "Abstract*.java" \) \
229
- \( -path "*/entity/*" -o -path "*/model/*" -o -path "*/po/*" \) \
230
- -not -path "*/{node_modules,.git}/*" | head -20
231
- find . -name "*.java" -not -path "*/{node_modules,.git}/*" | xargs grep -l "@MappedSuperclass" 2>/dev/null | head -10
232
- ```
233
-
234
- **追加到 CONVENTIONS.md:**
235
-
236
- ```markdown
237
- ## 实体继承规范
238
- ### 基类通用字段(新建表必须包含)
239
- | 字段 | 类型 | 说明 |
240
- |---|---|---|
241
- (从扫描到的基类源码中提取,不编造)
242
-
243
- ### 铁律:新建表 DDL 必须包含基类所有字段
244
- ```
245
-
246
- 无基类 → 写"本项目没有实体基类"。
247
-
248
- ### E. 代码风格深度提取
249
-
250
- 读取 2-3 个典型的 Controller、Service、ServiceImpl、Entity 源文件,提取具体风格(从源码提取,禁止编造):
251
-
252
- 1. **注解风格**:Controller 用 `@RestController` 还是 `@Controller`?方法用什么映射注解?参数校验方式?
253
- 2. **返回值约定**:统一返回 `Result<T>` / `ResponseEntity<T>` / 其他?
254
- 3. **异常处理**:用什么异常类?有没有全局异常处理器?
255
- 4. **Service 层约定**:实现类命名、是否继承基类、基类通用方法、事务注解用法
256
- 5. **实体/POJO 风格**:是否继承基类、Lombok 用法、ID 生成策略、`@TableId`
257
- 6. **Mapper/DAO 风格**:XML Mapper 还是注解?有没有通用 Mapper 基类?
258
-
259
- 将以上信息写入 CONVENTIONS.md「代码风格」章节。非 Java 项目参考同等概念提取。前端-only 项目写"不适用"。
47
+ 结果保存到 `.sillyspec/codebase/_env-detect.md`(临时文件,扫描完删除)。
260
48
 
261
49
  ---
262
50
 
263
51
  ## 深度扫描
264
52
 
265
- ### Step 0: 预处理脚本
266
-
267
- ```bash
268
- bash scripts/scan-preprocess.sh [扫描区域] 2>/dev/null
269
- ```
270
-
271
- 不存在则跳过。脚本输出 `.sillyspec/codebase/SCAN-RAW.md`(文件统计、配置、结构、import、类名/注解、Schema 位置)。
53
+ `mkdir -p .sillyspec/codebase`
272
54
 
273
- ### Step 1: 断点续扫
55
+ ### 断点续扫
274
56
 
275
57
  ```bash
276
- for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS; do
277
- [ -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"
278
60
  done
279
61
  ```
280
62
 
281
- 只生成缺失的文档,展示进度后继续。
63
+ 只生成缺失的文档。
64
+
65
+ ### 检测子代理可用性
66
+ 检查是否有 Task/Spawn 工具。有 → 子代理模式,无 → 串行模式。
282
67
 
283
- ### Step 2: 基于 SCAN-RAW.md 分析
68
+ ---
284
69
 
285
- **不直接读原始源码。** SCAN-RAW.md,按需深挖相关文件。
70
+ ### 子代理模式(4 个并行)
286
71
 
287
- 按顺序生成文档(写完立即保存,中断不丢失):
72
+ #### Agent 1: tech → ARCHITECTURE.md
73
+ 扫描技术栈 + 数据库 Schema + 架构模式。参考 `_env-detect.md`。
74
+ 用 grep/rg 搜索(`@Entity`、`schema.prisma`、`models.py` 等),**禁止读源码全文**。
75
+ Schema 只记表名+说明+字段数。含 `## 技术栈` `## 架构概览` `## 数据模型(摘要)`。路径用反引号,不编造。
288
76
 
289
- 1. `ARCHITECTURE.md` 架构 + 技术栈 + 数据模型摘要(合并原 STACK.md
290
- 2. `CONVENTIONS.md` — 编码约定(含框架隐形规则、实体继承规范)
291
- 3. `codebase/details/STRUCTURE.md` — 目录结构(深扫详情)
292
- 4. `codebase/details/INTEGRATIONS.md` — 集成(深扫详情)
293
- 5. `codebase/details/TESTING.md` 测试现状(深扫详情)
294
- 6. `codebase/details/CONCERNS.md` — 技术债务和风险(深扫详情)
77
+ #### Agent 2: conventions CONVENTIONS.md
78
+ 扫描框架隐形规则 + 实体继承 + 代码风格。参考 `_env-detect.md`。
79
+ grep 搜索拦截器/插件/逻辑删除/基类/审计字段,**禁止读源码全文**。
80
+ 根据检测到的语言/框架自行决定搜索什么模式,提取 3-5 个典型示例。
81
+ `## 框架隐形规则` `## 实体继承规范` `## 代码风格`。路径用反引号,不编造。
295
82
 
296
- 同时更新 `.sillyspec/PROJECT.md`。
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 按类型分组。路径用反引号,不编造。
297
87
 
298
- > **注意:** `SCAN-RAW.md` 是临时文件,扫描完成后可删除。
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 含项目信息。路径用反引号,不编造。
299
92
 
300
93
  ---
301
94
 
302
- ## 完成后
95
+ ### 串行模式(降级)
96
+ 无子代理时,按 tech → conventions → structure → quality 顺序执行。
97
+ 每个 area 完成后**立即写文件**,下一个 area 开始前清除源码上下文。
303
98
 
304
- ```bash
305
- sillyspec status --json
306
- sillyspec next
307
- ```
99
+ ---
308
100
 
309
- CLI 返回的命令推荐给用户。工作区扫描完成后额外提示生成 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`。
101
+ ## 工作区模式
102
+ 对每个子项目:cd → 环境探测 → 扫描 → cd 回工作区。
103
+ 全部完成后汇总 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`(只读各子项目的 ARCHITECTURE.md + CONVENTIONS.md)。
310
104
 
311
- ### Git 提交
105
+ ---
312
106
 
313
- **单项目模式:**
314
- ```bash
315
- git add .sillyspec/ && git commit -m "chore: sillyspec scan - codebase mapped"
316
- ```
107
+ ## 扫描完成
317
108
 
318
- **工作区模式:** 在每个子项目目录分别 commit(主工作区无 git 则跳过):
319
109
  ```bash
320
- for proj in $(cat .sillyspec/config.yaml | grep -oP 'path:\s*\K.*'); do
321
- cd "$proj" && git add .sillyspec/ 2>/dev/null && git commit -m "chore: sillyspec scan - codebase mapped" && cd - > /dev/null
110
+ # 路径校验
111
+ for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS PROJECT; do
112
+ [ -f ".sillyspec/codebase/${f}.md" ] && echo "✅ ${f}.md"
322
113
  done
323
- ```
324
114
 
325
- ### 路径校验 + 自检门控
115
+ # 验证 CLI
116
+ sillyspec status --json # 应返回 phase: "brainstorm"
117
+ sillyspec next # 推荐给用户
326
118
 
327
- **路径校验:** 每份文档写完后检查必须在 `.sillyspec/codebase/` 下,误放则自动修正:
328
-
329
- ```bash
330
- 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
331
- [ -f "$f" ] && mkdir -p .sillyspec/codebase && mv "$f" ".sillyspec/codebase/$(basename $f)"
332
- done
119
+ # 清理 + 提交
120
+ rm -f .sillyspec/codebase/_env-detect.md
121
+ git add .sillyspec/ && git commit -m "chore: sillyspec scan - codebase mapped"
333
122
  ```
334
123
 
335
- **自检门控:**
336
- - [ ] ARCHITECTURE.md 含主要语言、框架和整体架构?
337
- - [ ] ARCHITECTURE.md 含数据模型摘要?(深扫)
338
- - [ ] STRUCTURE.md 含目录结构?(深扫,位于 details/)
339
- - [ ] CONVENTIONS.md 含编码约定?(深扫)
340
- - [ ] INTEGRATIONS.md 列出外部依赖?(深扫,位于 details/)
341
- - [ ] TESTING.md 描述测试状况?(深扫,位于 details/)
342
- - [ ] CONCERNS.md 列出技术债务?(深扫,位于 details/)
343
- - [ ] PROJECT.md 已生成?
124
+ ### 自检门控
125
+ - [ ] ARCHITECTURE.md:技术栈 + Schema 摘要?
126
+ - [ ] CONVENTIONS.md:隐形规则 + 代码风格?
127
+ - [ ] STRUCTURE.md:目录结构?
128
+ - [ ] INTEGRATIONS.md:外部依赖?
129
+ - [ ] TESTING.md:测试现状?
130
+ - [ ] CONCERNS.md:技术债务?
131
+ - [ ] PROJECT.md:项目概览?
344
132
 
345
- ```bash
346
- bash scripts/validate-scan.sh .sillyspec/codebase 2>/dev/null
347
- ```
133
+ ## 绝对规则
134
+ - ❌ 修改代码 / 编造路径 / 主代理读源码全文
135
+ - ✅ 交互模式每步等用户 / 文档只写 `.sillyspec/codebase/`
@@ -39,6 +39,11 @@ done
39
39
  🔄 进行中:sec-bonus-penalty(tasks: 3/5)
40
40
  ✅ 已归档:1 个
41
41
 
42
+ 主项目(工作区根目录):
43
+ 📂 代码库文档:— (主项目通常无独立代码)
44
+ 🔄 进行中:N 个变更
45
+ ✅ 已归档:N 个变更
46
+
42
47
  ┌───────────────────┬────────────┬────────────┬────────┬────────┐
43
48
  │ 子项目 │ PROJECT.md │ 代码库文档 │ 进行中 │ 已归档 │
44
49
  ├───────────────────┼────────────┼────────────┼────────┼────────┤
@@ -0,0 +1,89 @@
1
+ ## 交互规范
2
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
3
+
4
+ ## 核心约束(必须遵守)
5
+ - ❌ 修改子项目的代码
6
+ - ❌ 删除已有文件(clone 前必须确认)
7
+ - ❌ 跳过冲突检查直接覆盖
8
+
9
+ ## 流程
10
+
11
+ ### Step 1: 读取配置
12
+
13
+ ```bash
14
+ cat .sillyspec/config.yaml 2>/dev/null
15
+ ```
16
+
17
+ 无 config.yaml → 提示先执行 `/sillyspec:workspace` 初始化工作区。
18
+
19
+ ### Step 2: 逐个子项目检查
20
+
21
+ 对 config.yaml 中每个子项目,按顺序执行:
22
+
23
+ ```bash
24
+ # 检查目录是否存在
25
+ ls -d <path> 2>/dev/null && echo "EXISTS" || echo "MISSING"
26
+ ```
27
+
28
+ #### 情况 A:目录不存在
29
+
30
+ ```bash
31
+ # 检查是否有 repo 配置
32
+ grep "repo:" .sillyspec/config.yaml | grep -A 1 "<name>"
33
+ ```
34
+
35
+ - **有 repo** → AskUserQuestion:"子项目 `<name>` 不存在,是否从 `<repo>` clone 到 `<path>`?"
36
+ - 用户确认 → `git clone <repo> <path>` → ✅ 成功
37
+ - clone 失败 → ❌ 报错,提示用户手动 clone
38
+ - **无 repo** → ⚠️ 提示用户:"子项目 `<name>` 不存在且无 repo 配置,请手动放置到 `<path>`"
39
+
40
+ #### 情况 B:目录已存在
41
+
42
+ ```bash
43
+ # 检查是否是 git 仓库
44
+ git -C <path> rev-parse --is-inside-work-tree 2>/dev/null
45
+
46
+ # 如果是,检查 remote 是否匹配
47
+ git -C <path> remote get-url origin 2>/dev/null
48
+ ```
49
+
50
+ - **不是 git 仓库** → AskUserQuestion:"目录 `<path>` 存在但不是 git 仓库,可能和其他项目冲突。"
51
+ - 跳过此子项目
52
+ - 让用户指定正确路径
53
+ - **是 git 仓库,remote 匹配 repo** → ✅ 跳过,状态正常
54
+ - **是 git 仓库,remote 不匹配 repo** → ⚠️ AskUserQuestion:
55
+ - "目录 `<path>` 是 git 仓库但 remote 不匹配(期望 `<repo>`,实际 `<actual>`)。可能是不同项目。"
56
+ - 跳过 / 用户确认覆盖
57
+
58
+ #### 情况 C:路径冲突
59
+
60
+ 检查两个子项目的 path 是否指向同一目录或互相包含:
61
+
62
+ ```bash
63
+ # 将相对路径转为绝对路径后比较
64
+ realpath <path1>
65
+ realpath <path2>
66
+ ```
67
+
68
+ 冲突 → ❌ 报错:"子项目 A 和 B 的路径冲突,请修改 config.yaml"
69
+
70
+ ### Step 3: 汇总报告
71
+
72
+ ```
73
+ 📊 工作区同步结果
74
+
75
+ ┌───────────────────┬──────────┬────────────────────────────────────┐
76
+ │ 子项目 │ 状态 │ 说明 │
77
+ ├───────────────────┼──────────┼────────────────────────────────────┤
78
+ │ back-service │ ✅ 正常 │ 目录存在,git remote 匹配 │
79
+ │ sub-grid-security │ 🔄 已克隆 │ 从 https://... clone 成功 │
80
+ │ frontend │ ⚠️ 缺失 │ 无 repo 配置,请手动放置 │
81
+ └───────────────────┴──────────┴────────────────────────────────────┘
82
+ ```
83
+
84
+ 全部正常 → 提示 `/sillyspec:brainstorm '你的需求'` 继续。
85
+ 有异常 → 提示用户处理后再 sync。
86
+
87
+ ### Step 4: 更新 config.yaml
88
+
89
+ 如果 clone 过程中实际 remote 和 config.yaml 中的 repo 不一致,更新 repo 字段为实际值。
@@ -26,7 +26,7 @@ cat .sillyspec/config.yaml 2>/dev/null
26
26
  - 无参数 / `status` → 显示状态
27
27
  - `add` → 添加子项目
28
28
  - `remove` → 移除子项目
29
- - `info <name>` 子项目详情
29
+ - `sync`同步子项目(clone 缺失的,检查冲突)
30
30
 
31
31
  ### Step 3: 执行操作
32
32
 
@@ -52,6 +52,7 @@ projects:
52
52
  <name>:
53
53
  path: <relative-path>
54
54
  role: <description>
55
+ repo: <git-remote-url> # 可选,git remote get-url origin
55
56
  shared:
56
57
  - <filename.md>
57
58
  ```