sillyspec 2.4.3 → 2.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.
- package/.claude/commands/sillyspec/archive.md +16 -52
- package/.claude/commands/sillyspec/brainstorm.md +90 -381
- package/.claude/commands/sillyspec/continue.md +19 -34
- package/.claude/commands/sillyspec/execute.md +54 -178
- package/.claude/commands/sillyspec/explore.md +17 -67
- package/.claude/commands/sillyspec/export.md +10 -44
- package/.claude/commands/sillyspec/init.md +22 -129
- package/.claude/commands/sillyspec/plan.md +36 -192
- package/.claude/commands/sillyspec/propose.md +36 -191
- package/.claude/commands/sillyspec/quick.md +13 -53
- package/.claude/commands/sillyspec/resume.md +25 -78
- package/.claude/commands/sillyspec/scan.md +102 -530
- package/.claude/commands/sillyspec/status.md +15 -100
- package/.claude/commands/sillyspec/verify.md +22 -91
- package/.claude/commands/sillyspec/workspace.md +24 -89
- package/.sillyspec/config.yaml +13 -0
- package/package.json +7 -2
- package/src/index.js +2 -2
- package/src/init.js +232 -63
- package/templates/archive.md +17 -52
- package/templates/brainstorm.md +83 -478
- package/templates/continue.md +20 -30
- package/templates/execute.md +54 -173
- package/templates/explore.md +17 -63
- package/templates/export.md +10 -39
- package/templates/init.md +22 -122
- package/templates/plan.md +36 -187
- package/templates/propose.md +36 -186
- package/templates/quick.md +13 -48
- package/templates/resume.md +26 -76
- package/templates/scan.md +102 -510
- package/templates/status.md +16 -96
- package/templates/verify.md +22 -86
- package/templates/workspace.md +24 -90
|
@@ -1,672 +1,244 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
argument-hint: "[可选:指定区域,如 'api' 或 'auth'] [--deep 深度扫描]"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
你现在是 SillySpec 的代码库扫描器。
|
|
8
|
-
|
|
9
|
-
## 参数处理
|
|
10
|
-
|
|
11
|
-
解析 `$ARGUMENTS`:
|
|
12
|
-
- 空白或未提供 → **交互式引导模式**(逐步询问)
|
|
13
|
-
- 包含具体内容 → **快速模式**,直接执行,跳过询问
|
|
14
|
-
- 含 `--deep` → 深度扫描
|
|
15
|
-
- 其他内容 → 当作扫描区域(快速扫描该区域)
|
|
16
|
-
|
|
17
|
-
**以下流程只在交互式引导模式下执行。如果用户传了参数,跳到对应的 Step。**
|
|
18
|
-
|
|
19
|
-
---
|
|
1
|
+
## 交互规范
|
|
2
|
+
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
20
3
|
|
|
21
|
-
##
|
|
4
|
+
## 核心约束(必须遵守)
|
|
5
|
+
- ❌ 修改任何代码
|
|
6
|
+
- ❌ 编造文件路径或代码模式(必须包含真实路径)
|
|
7
|
+
- ❌ 一次性输出所有步骤(交互模式每步等用户回复)
|
|
8
|
+
- ❌ 跳过状态检查,自行推断项目阶段
|
|
9
|
+
- ❌ 跳过 Schema/框架隐形规则/实体继承扫描
|
|
10
|
+
- ❌ 生成文档到非 `.sillyspec/codebase/` 目录
|
|
22
11
|
|
|
23
|
-
|
|
12
|
+
## 状态检查(必须先执行)
|
|
24
13
|
|
|
25
14
|
```bash
|
|
26
15
|
sillyspec status --json
|
|
27
16
|
```
|
|
28
17
|
|
|
29
|
-
|
|
18
|
+
- `phase: "init"` 或无 phase → 继续
|
|
19
|
+
- `phase: "scan:quick_done"` → 建议深度扫描
|
|
20
|
+
- `phase: "scan:resume"` → `sillyspec check --json` 获取缺失文档,断点续扫
|
|
21
|
+
- 其他 phase → 不需要扫描,提示 CLI 建议的下一步
|
|
30
22
|
|
|
31
|
-
|
|
32
|
-
- `phase: "scan:resume"` → 深度扫描中断过,调用 `sillyspec check --json` 获取缺失文档列表
|
|
33
|
-
- `phase` 是其他值 → 不需要扫描,提示用户 CLI 建议的下一步命令
|
|
23
|
+
## 参数处理
|
|
34
24
|
|
|
35
|
-
|
|
25
|
+
`$ARGUMENTS` 为空 → **交互式引导模式**;有内容 → **快速模式**(含 `--deep` 则深度扫描,否则快速扫描该区域)。快速模式跳到对应 Step。
|
|
36
26
|
|
|
37
27
|
---
|
|
38
28
|
|
|
39
29
|
## 交互式引导流程
|
|
40
30
|
|
|
41
|
-
### Step
|
|
31
|
+
### Step 1: 检查工作区模式
|
|
42
32
|
|
|
43
33
|
```bash
|
|
44
34
|
cat .sillyspec/config.yaml 2>/dev/null
|
|
45
35
|
```
|
|
46
36
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
询问用户:
|
|
50
|
-
```
|
|
51
|
-
检测到工作区模式,请选择扫描范围:
|
|
52
|
-
1) 全部子项目(逐个扫描后生成汇总)
|
|
53
|
-
2) 指定某个子项目
|
|
54
|
-
3) 取消
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
根据选择:
|
|
58
|
-
- 选 1 → 逐个扫描,最后生成 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`
|
|
59
|
-
- 选 2 → 列出子项目让用户选,只扫选中的
|
|
60
|
-
- 选 3 → 退出
|
|
37
|
+
有 `projects` 字段 → 工作区模式:选择全量扫描、选子项目扫描、或退出。子项目文档存到各自 `<子项目路径>/.sillyspec/codebase/`,最后生成 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`。
|
|
61
38
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
### Step 1: 检查已有文档
|
|
39
|
+
### Step 2: 检查已有文档
|
|
65
40
|
|
|
66
41
|
```bash
|
|
67
42
|
ls .sillyspec/codebase/ 2>/dev/null
|
|
68
|
-
wc -l .sillyspec/codebase/*.md 2>/dev/null
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
根据已有文档情况智能提示:
|
|
72
|
-
|
|
73
|
-
**没有任何文档:**
|
|
74
|
-
→ 不提示,直接进入 Step 2 选择扫描模式。
|
|
75
|
-
|
|
76
|
-
**已有 3 份(STACK + STRUCTURE + PROJECT):**
|
|
77
|
-
```
|
|
78
|
-
检测到上次的快速扫描结果。
|
|
79
|
-
→ 输入 1 升级为完整扫描(补充 4 份文档)
|
|
80
|
-
→ 输入 2 重新快速扫描(覆盖现有文档)
|
|
81
|
-
→ 输入 3 跳过,直接开始开发
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
**已有 7 份完整文档:**
|
|
85
|
-
先检查距上次扫描过了多久:
|
|
86
|
-
```bash
|
|
87
|
-
git log -1 --format="%ci" .sillyspec/codebase/ 2>/dev/null
|
|
88
|
-
git log --oneline --since="上次扫描时间" | wc -l
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
```
|
|
92
|
-
上次扫描距今 X 天,期间有 Y 个新提交。
|
|
93
|
-
→ 输入 1 刷新(重新扫描全部)
|
|
94
|
-
→ 输入 2 跳过,直接开始开发
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
**用户选跳过** → 输出"可以开始开发了。建议下一步:`/sillyspec:brainstorm '你的需求'`"然后结束。
|
|
98
|
-
|
|
99
|
-
### Step 2: 选择扫描模式
|
|
100
|
-
|
|
101
|
-
```
|
|
102
|
-
请选择扫描模式:
|
|
103
|
-
|
|
104
|
-
1. 快速扫描 ⚡
|
|
105
|
-
读取配置文件和目录结构,约 30 秒
|
|
106
|
-
生成 3 份文档:技术栈 + 目录结构 + 项目概览
|
|
107
|
-
|
|
108
|
-
2. 深度扫描 🔍
|
|
109
|
-
读取全部源代码并分析,约 2-3 分钟
|
|
110
|
-
生成 7 份文档:技术栈 + 架构 + 目录结构 + 编码约定 + 集成 + 测试 + 技术债务
|
|
111
|
-
|
|
112
|
-
3. 取消
|
|
113
43
|
```
|
|
114
44
|
|
|
115
|
-
|
|
45
|
+
- 无文档 → 直接选扫描模式
|
|
46
|
+
- 3 份(快扫完成)→ 升级完整扫描 / 重新快扫 / 跳过
|
|
47
|
+
- 7 份(深扫完成)→ 检查距上次扫描时间和新提交数,建议刷新或跳过
|
|
48
|
+
- 用户选跳过 → 提示 `/sillyspec:brainstorm '你的需求'` 并结束
|
|
116
49
|
|
|
117
|
-
### Step 3:
|
|
50
|
+
### Step 3-5: 扫描模式、范围、排除目录
|
|
118
51
|
|
|
119
|
-
|
|
120
|
-
扫描范围:(留空则扫描整个项目)
|
|
121
|
-
|
|
122
|
-
提示:可以输入目录名或模块名,如:
|
|
123
|
-
- api
|
|
124
|
-
- src/auth
|
|
125
|
-
- frontend
|
|
126
|
-
- 多个区域用空格分隔:api auth
|
|
127
|
-
```
|
|
52
|
+
AskUserQuestion 依次确认:快速⚡/深度🔍、扫描范围(留空全量)、排除目录。
|
|
128
53
|
|
|
129
|
-
|
|
130
|
-
有输入 → 只扫描指定区域
|
|
54
|
+
### Step 6: 确认并开始
|
|
131
55
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
```
|
|
135
|
-
以下目录将被排除(不扫描):
|
|
136
|
-
node_modules dist .git vendor build __pycache__
|
|
137
|
-
.next coverage .nuxt target
|
|
138
|
-
|
|
139
|
-
是否需要添加额外的排除目录?(留空跳过)
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
如果用户输入了额外目录 → 追加到排除列表。
|
|
143
|
-
|
|
144
|
-
### Step 5: 显示扫描计划并确认
|
|
145
|
-
|
|
146
|
-
把以上选择汇总,让用户最后确认:
|
|
147
|
-
|
|
148
|
-
```
|
|
149
|
-
扫描计划确认:
|
|
150
|
-
模式:深度扫描
|
|
151
|
-
范围:整个项目
|
|
152
|
-
排除:node_modules, dist, .git, vendor, build, __pycache__, .next, coverage, .nuxt, target
|
|
153
|
-
|
|
154
|
-
开始扫描?(输入 y 确认,或修改以上选项)
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
用户确认 → 执行扫描。用户想改 → 回到对应步骤。
|
|
56
|
+
汇总选择,用户确认后执行。
|
|
158
57
|
|
|
159
58
|
---
|
|
160
59
|
|
|
161
60
|
## 快速扫描
|
|
162
61
|
|
|
163
|
-
|
|
62
|
+
**只读入口和配置文件,不读源码。** 生成 3 份文档到 `mkdir -p .sillyspec/codebase`:
|
|
164
63
|
|
|
64
|
+
1. `STACK.md` — 技术栈
|
|
65
|
+
2. `STRUCTURE.md` — 目录结构
|
|
66
|
+
3. `PROJECT.md` — 项目概览
|
|
67
|
+
|
|
68
|
+
扫描命令:
|
|
165
69
|
```bash
|
|
166
|
-
#
|
|
167
|
-
cat package.json 2>/dev/null
|
|
168
|
-
cat tsconfig.json 2>/dev/null
|
|
169
|
-
cat requirements.txt 2>/dev/null
|
|
170
|
-
cat Cargo.toml 2>/dev/null
|
|
171
|
-
cat go.mod 2>/dev/null
|
|
172
|
-
cat pom.xml 2>/dev/null
|
|
173
|
-
cat build.gradle 2>/dev/null
|
|
70
|
+
# 配置文件
|
|
71
|
+
cat package.json tsconfig.json requirements.txt Cargo.toml go.mod pom.xml build.gradle 2>/dev/null
|
|
174
72
|
find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
find . -type f -not -path "*/node_modules/*" -not -path "*/dist/*" -not -path "*/.git/*" -not -path "*/vendor/*" -not -path "*/build/*" -not -path "*/__pycache__/*" -not -path "*/.next/*" -not -path "*/coverage/*" -not -path "*/.nuxt/*" -not -path "*/target/*" | head -200
|
|
178
|
-
|
|
73
|
+
# 目录结构
|
|
74
|
+
find . -type f -not -path "*/node_modules/*" -not -path "*/{dist,.git,vendor,build,__pycache__,.next,coverage,.nuxt,target}/*" | head -200
|
|
179
75
|
# 最近提交
|
|
180
76
|
git log --oneline -20
|
|
181
77
|
```
|
|
182
78
|
|
|
183
|
-
## 🚨
|
|
79
|
+
## 🚨 三项强制扫描(快速和深度都必须执行)
|
|
184
80
|
|
|
185
|
-
|
|
81
|
+
### A. 数据库 Schema 扫描
|
|
186
82
|
|
|
187
|
-
|
|
83
|
+
**目的:** 防止后续阶段编造表名和字段名。
|
|
188
84
|
|
|
189
85
|
```bash
|
|
190
|
-
find . \( -name "schema.prisma" -o -name "*.model.ts" -o -name "*.entity.ts" \
|
|
191
|
-
-
|
|
192
|
-
-o -name "*.sql" -o -name "migration*" \
|
|
193
|
-
\) \
|
|
194
|
-
-not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/dist/*" \
|
|
195
|
-
-not -path "*/build/*" -not -path "*/vendor/*" | head -30
|
|
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
|
|
196
88
|
```
|
|
197
89
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
| 框架 | 识别文件 |
|
|
201
|
-
|---|---|
|
|
202
|
-
| Prisma | `prisma/schema.prisma` |
|
|
203
|
-
| SQLAlchemy / Django | `**/models.py` |
|
|
204
|
-
| TypeORM | `**/*.entity.ts` |
|
|
205
|
-
| Mongoose | `**/*.model.ts`(检查 mongoose schema) |
|
|
206
|
-
| Java JPA / Hibernate | `**/entity/*.java`、`**/model/*.java`(含 `@Entity` / `@Table` 注解的类) |
|
|
207
|
-
| MyBatis | `**/*Mapper.xml`(提取 `resultMap` 和表名) |
|
|
208
|
-
| Go GORM | `**/models.go`、`**/model.go` |
|
|
209
|
-
| Drizzle | `**/schema.ts` |
|
|
210
|
-
| 原始 SQL | `**/migrations/*.sql` |
|
|
211
|
-
|
|
212
|
-
### 第二步:生成 Schema 摘要
|
|
213
|
-
|
|
214
|
-
**只记录表名 + 说明 + 字段数量,不展开字段细节。** 写入 ARCHITECTURE.md:
|
|
90
|
+
**写入 ARCHITECTURE.md(只记摘要,不展开字段):**
|
|
215
91
|
|
|
216
92
|
```markdown
|
|
217
93
|
## 数据模型(摘要)
|
|
218
|
-
|
|
219
94
|
| 表名 | 说明 | 字段数 | 来源文件 |
|
|
220
95
|
|---|---|---|---|
|
|
221
96
|
| users | 用户表 | 12 | `src/entity/User.java` |
|
|
222
|
-
| roles | 角色表 | 5 | `src/entity/Role.java` |
|
|
223
|
-
| orders | 订单表 | 18 | `prisma/schema.prisma` |
|
|
224
97
|
|
|
225
98
|
### 关系
|
|
226
|
-
- users 1:N roles
|
|
227
99
|
- users 1:N orders
|
|
228
100
|
```
|
|
229
101
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
### 第三步:在后续命令中按需深挖
|
|
233
|
-
|
|
234
|
-
**brainstorm/propose/plan 阶段,根据当前需求只读取相关表的详细 schema。**
|
|
235
|
-
|
|
236
|
-
执行规则:
|
|
237
|
-
1. 先读 ARCHITECTURE.md 的 Schema 摘要,确定涉及哪些表
|
|
238
|
-
2. 只读取相关表的源文件(`cat src/entity/User.java`)
|
|
239
|
-
3. 没涉及的表不要读,节省上下文
|
|
240
|
-
4. 如果摘要中没有但需要新表 → 必须在 propose 的 design.md 中声明
|
|
102
|
+
无数据库 → 写"本项目无数据库"。**铁律:所有阶段引用的表名必须来自此摘要,或 design.md 中声明的新增表。**
|
|
241
103
|
|
|
242
|
-
|
|
104
|
+
### B. 框架隐形规则扫描
|
|
243
105
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
**无论快速还是深度模式,必须执行。** 防止 AI 生成 SQL/代码时违反项目框架的自动处理机制。
|
|
247
|
-
|
|
248
|
-
### 为什么需要这一步
|
|
249
|
-
|
|
250
|
-
很多项目有"隐形规则"——某些字段由框架自动处理,SQL 里不需要写;某些拦截器会自动注入条件,手动写反而会冲突。这些规则不在 schema 里,AI 扫不到就会犯错。
|
|
251
|
-
|
|
252
|
-
**典型踩坑:**
|
|
253
|
-
- MyBatis 多租户插件自动注入 tenant_id → SQL 里再写就重复了
|
|
254
|
-
- JPA @CreatedDate 自动填充 create_time → INSERT 里再写就冲突了
|
|
255
|
-
- 逻辑删除拦截器把 DELETE 改成 UPDATE → AI 直接写 DELETE FROM 就错了
|
|
256
|
-
|
|
257
|
-
### 扫描步骤
|
|
106
|
+
**目的:** 防止 AI 生成的 SQL/代码违反框架自动处理机制(如自动注入字段、逻辑删除拦截器)。
|
|
258
107
|
|
|
259
108
|
```bash
|
|
260
|
-
#
|
|
261
|
-
find . \( -name "*Interceptor*.java" -o -name "*Plugin*.java" \
|
|
262
|
-
-o -name "
|
|
263
|
-
-
|
|
264
|
-
|
|
265
|
-
#
|
|
266
|
-
find . \( -name "*Auditor*.java" -o -name "*EventListener*.java" \
|
|
267
|
-
-o -name "persistence.xml" -o -name "application*.yml" -o -name "application*.yaml" \) \
|
|
268
|
-
-not -path "*/node_modules/*" -not -path "*/.git/*" | head -20
|
|
269
|
-
|
|
270
|
-
# 3. Django 配置(中间件、模型 Meta)
|
|
271
|
-
find . -name "settings.py" -not -path "*/node_modules/*" | head -5
|
|
272
|
-
find . -name "models.py" -not -path "*/node_modules/*" | head -10
|
|
273
|
-
|
|
274
|
-
# 4. SQLAlchemy 事件监听
|
|
275
|
-
find . \( -name "*event*.py" -o -name "*listener*.py" -o -name "*mixin*.py" \) \
|
|
276
|
-
-not -path "*/node_modules/*" -not -path "*/.git/*" | head -10
|
|
277
|
-
|
|
278
|
-
# 5. Prisma 中间件 / 扩展
|
|
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 中间件和回调
|
|
279
115
|
cat prisma/schema.prisma 2>/dev/null | grep -i "middleware\|plugin\|previewFeatures"
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
find . -name "*.ts" -not -path "*/node_modules/*" | xargs grep -l "EventSubscriber\|@BeforeInsert\|@AfterUpdate\|@DeleteDateColumn" 2>/dev/null | head -10
|
|
286
|
-
|
|
287
|
-
# 8. Rails / Active Record 回调
|
|
288
|
-
find . -name "*.rb" -not -path "*/vendor/*" | xargs grep -l "before_save\|before_create\|acts_as_paranoid\|acts_as_tenant" 2>/dev/null | head -10
|
|
289
|
-
|
|
290
|
-
# 9. Laravel / Eloquent 作用域和 trait
|
|
291
|
-
find . \( -name "*Scope*.php" -o -name "boot*.php" -o -name "ServiceProvider.php" \) \
|
|
292
|
-
-not -path "*/vendor/*" | head -10
|
|
293
|
-
|
|
294
|
-
# 10. 通用逻辑删除 / 审计字段检测
|
|
295
|
-
find . \( -name "*.java" -o -name "*.py" -o -name "*.go" -o -name "*.ts" \
|
|
296
|
-
-o -name "*.php" -o -name "*.rb" \) \
|
|
297
|
-
-not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/vendor/*" \
|
|
298
|
-
-not -path "*/dist/*" -not -path "*/build/*" \
|
|
299
|
-
| xargs grep -li "is_deleted\|deleted_at\|soft_delete\|paranoid\|tenant_id\|tenantId" 2>/dev/null | head -20
|
|
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
|
|
300
121
|
```
|
|
301
122
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
**创建或追加到 `.sillyspec/codebase/CONVENTIONS.md`,添加"框架隐形规则"章节。**
|
|
305
|
-
|
|
306
|
-
格式:
|
|
123
|
+
**写入 CONVENTIONS.md:**
|
|
307
124
|
|
|
308
125
|
```markdown
|
|
309
126
|
## 框架隐形规则
|
|
310
|
-
|
|
311
127
|
### 自动注入字段(SQL 中不要手动写)
|
|
312
|
-
|
|
313
128
|
| 字段 | 来源 | 说明 |
|
|
314
129
|
|---|---|---|
|
|
315
|
-
| tenant_id | MyBatis 多租户拦截器 TenantLineInnerInterceptor | 自动注入租户过滤条件,SQL 不需要 WHERE tenant_id=? |
|
|
316
|
-
| is_deleted | 逻辑删除拦截器 | DELETE 自动改为 UPDATE xxx SET is_deleted=1 |
|
|
317
130
|
|
|
318
131
|
### 自动填充字段(INSERT/UPDATE 不需要手动赋值)
|
|
319
|
-
|
|
320
132
|
| 字段 | 来源 | 说明 |
|
|
321
133
|
|---|---|---|
|
|
322
|
-
| create_time | JPA @CreatedDate / MyBatis-Plus MetaObjectHandler | INSERT 时自动填充 |
|
|
323
|
-
| update_time | JPA @LastModifiedDate / MyBatis-Plus MetaObjectHandler | INSERT 和 UPDATE 时自动填充 |
|
|
324
|
-
| create_by | MetaObjectHandler | 从 SecurityContext 获取当前用户 |
|
|
325
|
-
|
|
326
|
-
### 查询增强(框架自动追加条件)
|
|
327
|
-
|
|
328
|
-
| 规则 | 说明 |
|
|
329
|
-
|---|---|
|
|
330
|
-
| 数据权限过滤 | 某些表自动追加 WHERE 条件,SQL 中不需要手动加 |
|
|
331
|
-
| 软删除过滤 | 查询自动排除 is_deleted=1 的数据,SQL 不需要 WHERE is_deleted=0 |
|
|
332
134
|
|
|
333
135
|
### DELETE 行为
|
|
334
|
-
|
|
335
|
-
- 不要写 `DELETE FROM` → 使用 `UPDATE xxx SET is_deleted = 1 WHERE id = ?`
|
|
136
|
+
- 不要写 `DELETE FROM` → 使用逻辑删除(如 UPDATE xxx SET is_deleted=1)
|
|
336
137
|
```
|
|
337
138
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
**铁律:后续阶段生成 SQL 或数据操作代码时,必须遵守这些规则。违反 = 生成的代码会报错或产生数据错误。**
|
|
341
|
-
|
|
342
|
-
## 🚨 实体继承规范扫描(必须执行)
|
|
139
|
+
无发现 → 写"未发现框架级别的自动处理配置"。**铁律:后续阶段生成 SQL/数据操作代码必须遵守这些规则。**
|
|
343
140
|
|
|
344
|
-
|
|
141
|
+
### C. 实体继承规范扫描
|
|
345
142
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
很多项目用实体基类(BaseModel、BaseEntity、BasePO 等)定义通用字段(审计字段、逻辑删除、多租户等)。子类继承基类后,ORM 框架会自动查询这些字段。如果新建表的 DDL 漏掉了这些列,SQL 就会报错。
|
|
349
|
-
|
|
350
|
-
**典型踩坑:**
|
|
351
|
-
- 实体类继承了 BaseModel,有 remarks、dept_id 字段
|
|
352
|
-
- AI 生成建表 SQL 时只写了业务字段,漏了通用字段
|
|
353
|
-
- MyBatis-Plus 自动 SELECT 包含 remarks → Unknown column
|
|
354
|
-
|
|
355
|
-
### 扫描步骤
|
|
143
|
+
**目的:** 防止新建表时漏掉基类通用字段,导致 ORM 查询报 Unknown column。
|
|
356
144
|
|
|
357
145
|
```bash
|
|
358
|
-
# 1. Java: 查找实体基类(BaseModel / BaseEntity / BasePO)
|
|
359
146
|
find . \( -name "Base*.java" -o -name "Abstract*.java" \) \
|
|
360
|
-
-path "*/entity/*" -o -path "*/model/*" -o -path "*/po/*"
|
|
361
|
-
-not -path "*/node_modules
|
|
362
|
-
|
|
363
|
-
# 2. Java: 查找 @MappedSuperclass 注解的类
|
|
364
|
-
find . -name "*.java" -not -path "*/node_modules/*" -not -path "*/.git/*" \
|
|
365
|
-
| xargs grep -l "@MappedSuperclass" 2>/dev/null | head -10
|
|
366
|
-
|
|
367
|
-
# 3. Java: 查看子类继承关系
|
|
368
|
-
grep -rn "extends Base" --include="*.java" \
|
|
369
|
-
-not -path "*/node_modules/*" -not -path "*/.git/*" | head -20
|
|
370
|
-
|
|
371
|
-
# 4. Python / Django: 查找 Abstract 模型
|
|
372
|
-
find . -name "models.py" -not -path "*/node_modules/*" | xargs grep -l "class.*Abstract\|class.*Base" 2>/dev/null | head -10
|
|
373
|
-
|
|
374
|
-
# 5. Go: 查找嵌入的 BaseModel struct
|
|
375
|
-
find . -name "*.go" -not -path "*/vendor/*" | xargs grep -l "type.*struct" | xargs grep -l "BaseModel\|BaseEntity" 2>/dev/null | head -10
|
|
376
|
-
|
|
377
|
-
# 6. TypeORM: 查找 @Entity 基类的子类
|
|
378
|
-
find . -name "*.entity.ts" -not -path "*/node_modules/*" | xargs grep -l "extends\|@ChildEntity" 2>/dev/null | head -10
|
|
379
|
-
|
|
380
|
-
# 7. Prisma: 查找 model 共用字段(通过 generator 或注释)
|
|
381
|
-
cat prisma/schema.prisma 2>/dev/null
|
|
382
|
-
|
|
383
|
-
# 8. Rails: 查找 ApplicationRecord concern
|
|
384
|
-
find . -name "*.rb" -not -path "*/vendor/*" | xargs grep -l "include.*Concern\|include.*Module" 2>/dev/null | head -10
|
|
385
|
-
|
|
386
|
-
# 9. Laravel: 查找 Model trait
|
|
387
|
-
find . -name "*.php" -path "*/Models/*" -not -path "*/vendor/*" | head -10
|
|
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
|
|
388
150
|
```
|
|
389
151
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
在"框架隐形规则"章节后追加:
|
|
152
|
+
**追加到 CONVENTIONS.md:**
|
|
393
153
|
|
|
394
154
|
```markdown
|
|
395
155
|
## 实体继承规范
|
|
396
|
-
|
|
397
156
|
### 基类通用字段(新建表必须包含)
|
|
398
|
-
|
|
399
|
-
以下字段来自基类 BaseModel,所有子类实体自动继承,DDL 必须包含:
|
|
400
|
-
|
|
401
157
|
| 字段 | 类型 | 说明 |
|
|
402
158
|
|---|---|---|
|
|
403
|
-
|
|
404
|
-
| remarks | VARCHAR(500) | 备注 |
|
|
405
|
-
| dept_id | BIGINT | 部门ID |
|
|
406
|
-
| create_time | DATETIME | 创建时间 |
|
|
407
|
-
| update_time | DATETIME | 更新时间 |
|
|
408
|
-
| create_by | VARCHAR(64) | 创建人 |
|
|
409
|
-
| update_by | VARCHAR(64) | 更新人 |
|
|
410
|
-
| is_deleted | TINYINT(1) | 逻辑删除 |
|
|
411
|
-
|
|
412
|
-
### 铁律
|
|
413
|
-
- 新建表的 DDL 必须包含基类的所有字段,不能只写业务字段
|
|
414
|
-
- ORM 自动查询基类字段,数据库缺少这些列会报 Unknown column
|
|
415
|
-
- 如果基类有变更(新增通用字段),需要同步更新所有子表的 DDL
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
**注意:** 上表是示例,实际字段必须从扫描到的基类源码中提取,不要编造。
|
|
419
|
-
|
|
420
|
-
**如果项目没有实体基类** → 写"本项目没有实体基类,所有字段在各自实体中定义"。
|
|
421
|
-
|
|
422
|
-
**铁律:后续阶段新建表或修改表结构时,必须包含基类的所有通用字段。**
|
|
423
|
-
|
|
424
|
-
---
|
|
425
|
-
|
|
426
|
-
**快速扫描生成 3 份文档:**
|
|
159
|
+
(从扫描到的基类源码中提取,不编造)
|
|
427
160
|
|
|
428
|
-
|
|
161
|
+
### 铁律:新建表 DDL 必须包含基类所有字段
|
|
162
|
+
```
|
|
429
163
|
|
|
430
|
-
|
|
431
|
-
**2. `.sillyspec/codebase/STRUCTURE.md`** — 目录结构
|
|
432
|
-
**3. `.sillyspec/codebase/PROJECT.md`** — 项目概览
|
|
164
|
+
无基类 → 写"本项目没有实体基类"。
|
|
433
165
|
|
|
434
166
|
---
|
|
435
167
|
|
|
436
168
|
## 深度扫描
|
|
437
169
|
|
|
438
|
-
### Step 0:
|
|
439
|
-
|
|
440
|
-
**深度扫描前,必须先运行预处理脚本。** 这是零 token 的 shell 操作:
|
|
170
|
+
### Step 0: 预处理脚本
|
|
441
171
|
|
|
442
172
|
```bash
|
|
443
|
-
bash scripts/scan-preprocess.sh [扫描区域]
|
|
173
|
+
bash scripts/scan-preprocess.sh [扫描区域] 2>/dev/null
|
|
444
174
|
```
|
|
445
175
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
**预处理脚本会自动完成:**
|
|
449
|
-
- 统计源文件数量和大小
|
|
450
|
-
- 估算扫描耗时(按文件数量动态计算,不是写死的 3 分钟)
|
|
451
|
-
- 提取配置文件内容(package.json、pom.xml 等)
|
|
452
|
-
- 提取目录结构树
|
|
453
|
-
- 提取 import/依赖关系(按语言分别分析)
|
|
454
|
-
- 提取类名/函数名/注解(Java @Entity、@Controller 等)
|
|
455
|
-
- 检测数据库 Schema 文件位置
|
|
456
|
-
- 检测框架和 ORM
|
|
457
|
-
- 检测框架配置文件(拦截器、审计、基类等)
|
|
176
|
+
不存在则跳过。脚本输出 `.sillyspec/codebase/SCAN-RAW.md`(文件统计、配置、结构、import、类名/注解、Schema 位置)。
|
|
458
177
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
**脚本输出示例:**
|
|
462
|
-
```
|
|
463
|
-
📊 文件统计:
|
|
464
|
-
Java: 280
|
|
465
|
-
Vue: 180
|
|
466
|
-
配置文件: 3
|
|
467
|
-
────────────────
|
|
468
|
-
源文件总计: 460 个
|
|
469
|
-
源码总大小: 3200KB
|
|
470
|
-
预计耗时: 约 5-8 分钟
|
|
471
|
-
上下文风险: 中
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
### Step 1: 断点续扫检查
|
|
475
|
-
|
|
476
|
-
**检查已生成的文档,跳过已完成的:**
|
|
178
|
+
### Step 1: 断点续扫
|
|
477
179
|
|
|
478
180
|
```bash
|
|
479
181
|
for f in STACK ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS; do
|
|
480
|
-
|
|
481
|
-
echo "✅ ${f}.md 已存在,跳过"
|
|
482
|
-
else
|
|
483
|
-
echo "⬜ ${f}.md 待生成"
|
|
484
|
-
fi
|
|
182
|
+
[ -f ".sillyspec/codebase/${f}.md" ] && echo "✅ ${f}" || echo "⬜ ${f}"
|
|
485
183
|
done
|
|
486
184
|
```
|
|
487
185
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
将检查结果展示给用户:
|
|
491
|
-
```
|
|
492
|
-
📊 扫描进度检查:
|
|
493
|
-
✅ STACK.md 已存在
|
|
494
|
-
✅ ARCHITECTURE.md 已存在
|
|
495
|
-
✅ STRUCTURE.md 已存在
|
|
496
|
-
⬜ CONVENTIONS.md 待生成 ← 从这里继续
|
|
497
|
-
⬜ INTEGRATIONS.md 待生成
|
|
498
|
-
⬜ TESTING.md 待生成
|
|
499
|
-
⬜ CONCERNS.md 待生成
|
|
500
|
-
|
|
501
|
-
继续生成剩余 4 份文档。
|
|
502
|
-
```
|
|
186
|
+
只生成缺失的文档,展示进度后继续。
|
|
503
187
|
|
|
504
188
|
### Step 2: 基于 SCAN-RAW.md 分析
|
|
505
189
|
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
```bash
|
|
509
|
-
cat .sillyspec/codebase/SCAN-RAW.md
|
|
510
|
-
```
|
|
511
|
-
|
|
512
|
-
基于 SCAN-RAW.md 中的结构化信息,**只按需深挖**相关文件:
|
|
513
|
-
|
|
514
|
-
1. **架构分析** → 如果 SCAN-RAW.md 标注了 460 个文件,不要全部读。读核心入口文件 + 目录结构推断架构
|
|
515
|
-
2. **编码约定** → 如果 SCAN-RAW.md 有 import 分析,基于高频 import 推断约定。必要时抽样读 3-5 个文件确认
|
|
516
|
-
3. **集成分析** → 读 SCAN-RAW.md 中的配置文件内容,不需要重新读原始文件
|
|
517
|
-
4. **数据库 Schema** → 读 SCAN-RAW.md 中标注的 schema 文件位置,只读相关文件
|
|
518
|
-
|
|
519
|
-
**铁律:每份文档写完立即保存。** 不要攒在一起最后统一写。这样即使中断,已生成的文档不会丢失。
|
|
190
|
+
**不直接读原始源码。** 读 SCAN-RAW.md,按需深挖相关文件。
|
|
520
191
|
|
|
521
|
-
|
|
192
|
+
按顺序生成 7 份文档(写完立即保存,中断不丢失):
|
|
522
193
|
|
|
523
|
-
1.
|
|
524
|
-
2.
|
|
525
|
-
3.
|
|
526
|
-
4.
|
|
527
|
-
5.
|
|
528
|
-
6.
|
|
529
|
-
7.
|
|
530
|
-
8. `.sillyspec/codebase/CONCERNS.md` — 技术债务和风险
|
|
194
|
+
1. `STACK.md` — 技术栈
|
|
195
|
+
2. `ARCHITECTURE.md` — 架构(含数据模型摘要)
|
|
196
|
+
3. `STRUCTURE.md` — 目录结构
|
|
197
|
+
4. `CONVENTIONS.md` — 编码约定(含框架隐形规则、实体继承规范)
|
|
198
|
+
5. `INTEGRATIONS.md` — 集成
|
|
199
|
+
6. `TESTING.md` — 测试现状
|
|
200
|
+
7. `CONCERNS.md` — 技术债务和风险
|
|
531
201
|
|
|
532
202
|
同时更新 `.sillyspec/PROJECT.md`。
|
|
533
203
|
|
|
534
204
|
---
|
|
535
205
|
|
|
536
|
-
##
|
|
537
|
-
|
|
538
|
-
### 快速扫描完成后
|
|
539
|
-
|
|
540
|
-
**用 CLI 验证结果:**
|
|
206
|
+
## 完成后
|
|
541
207
|
|
|
542
208
|
```bash
|
|
543
209
|
sillyspec status --json
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
展示给用户:
|
|
547
|
-
> ✅ 快速扫描完成!
|
|
548
|
-
>
|
|
549
|
-
> 生成文档到 `.sillyspec/codebase/`:
|
|
550
|
-
> - STACK.md — 技术栈
|
|
551
|
-
> - STRUCTURE.md — 目录结构
|
|
552
|
-
> - PROJECT.md — 项目概览
|
|
553
|
-
|
|
554
|
-
**下一步由 CLI 决定:**
|
|
555
|
-
|
|
556
|
-
```bash
|
|
557
210
|
sillyspec next
|
|
558
211
|
```
|
|
559
212
|
|
|
560
|
-
将 CLI
|
|
561
|
-
|
|
562
|
-
### 深度扫描完成后
|
|
563
|
-
|
|
564
|
-
**用 CLI 验证结果:**
|
|
565
|
-
|
|
566
|
-
```bash
|
|
567
|
-
sillyspec status --json
|
|
568
|
-
```
|
|
569
|
-
|
|
570
|
-
CLI 应返回 `phase: "brainstorm"`。如果返回其他阶段,说明有文档缺失,需要补全。
|
|
571
|
-
|
|
572
|
-
展示给用户:
|
|
573
|
-
> ✅ 深度扫描完成!
|
|
574
|
-
>
|
|
575
|
-
> 生成 7 份文档到 `.sillyspec/codebase/`:
|
|
576
|
-
> - STACK.md — 技术栈
|
|
577
|
-
> - ARCHITECTURE.md — 架构(含数据模型摘要)
|
|
578
|
-
> - STRUCTURE.md — 目录结构
|
|
579
|
-
> - CONVENTIONS.md — 代码约定
|
|
580
|
-
> - INTEGRATIONS.md — 集成
|
|
581
|
-
> - TESTING.md — 测试现状
|
|
582
|
-
> - CONCERNS.md — 技术债务和风险
|
|
213
|
+
将 CLI 返回的命令推荐给用户。工作区扫描完成后额外提示生成 `.sillyspec/workspace/CODEBASE-OVERVIEW.md`。
|
|
583
214
|
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
```bash
|
|
587
|
-
sillyspec next
|
|
588
|
-
```
|
|
589
|
-
|
|
590
|
-
将 CLI 返回的命令推荐给用户。
|
|
591
|
-
|
|
592
|
-
### 工作区扫描完成后
|
|
593
|
-
|
|
594
|
-
> ✅ 工作区扫描完成!
|
|
595
|
-
>
|
|
596
|
-
> - 子项目 frontend:`frontend/.sillyspec/codebase/`(快扫,3 份文档)
|
|
597
|
-
> - 子项目 backend:`backend/.sillyspec/codebase/`(深扫,7 份文档)
|
|
598
|
-
> - 工作区概览:`.sillyspec/workspace/CODEBASE-OVERVIEW.md`
|
|
599
|
-
>
|
|
600
|
-
> 建议下一步:`/sillyspec:brainstorm '你的需求'`
|
|
601
|
-
|
|
602
|
-
---
|
|
603
|
-
|
|
604
|
-
## Step 6: Git 提交
|
|
215
|
+
### Git 提交
|
|
605
216
|
|
|
606
217
|
```bash
|
|
607
218
|
git add .sillyspec/
|
|
608
219
|
git commit -m "chore: sillyspec scan - codebase mapped"
|
|
609
220
|
```
|
|
610
221
|
|
|
611
|
-
|
|
222
|
+
### 路径校验 + 自检门控
|
|
612
223
|
|
|
613
|
-
|
|
614
|
-
- 文档必须包含真实文件路径(用反引号格式)
|
|
615
|
-
- 有具体代码模式就列出来(不要写模糊的描述)
|
|
616
|
-
- 如果项目为空 → 告知用户使用 `/sillyspec:init` 初始化新项目
|
|
617
|
-
- **交互模式下,每一步都要等用户回复再继续,不要一次性全部输出**
|
|
618
|
-
|
|
619
|
-
### 路径校验(写入后立即检查)
|
|
620
|
-
|
|
621
|
-
**每份文档写完后,必须用脚本验证路径正确。这是防止 AI 把文件写错目录的硬约束。**
|
|
224
|
+
**路径校验:** 每份文档写完后检查必须在 `.sillyspec/codebase/` 下,误放则自动修正:
|
|
622
225
|
|
|
623
226
|
```bash
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
if [ -f ".sillyspec/codebase/${f}.md" ]; then
|
|
627
|
-
echo "✅ .sillyspec/codebase/${f}.md"
|
|
628
|
-
elif [ -f "${f}.md" ] || [ -f ".sillyspec/${f}.md" ] || [ -f "codebase/${f}.md" ]; then
|
|
629
|
-
echo "❌ ${f}.md 路径错误!必须在 .sillyspec/codebase/ 下"
|
|
630
|
-
# 自动修正:移动到正确位置
|
|
631
|
-
mkdir -p .sillyspec/codebase
|
|
632
|
-
if [ -f "${f}.md" ]; then mv "${f}.md" ".sillyspec/codebase/${f}.md" && echo " 已修正: ${f}.md → .sillyspec/codebase/${f}.md"; fi
|
|
633
|
-
if [ -f ".sillyspec/${f}.md" ]; then mv ".sillyspec/${f}.md" ".sillyspec/codebase/${f}.md" && echo " 已修正: .sillyspec/${f}.md → .sillyspec/codebase/${f}.md"; fi
|
|
634
|
-
if [ -f "codebase/${f}.md" ]; then mv "codebase/${f}.md" ".sillyspec/codebase/${f}.md" && echo " 已修正: codebase/${f}.md → .sillyspec/codebase/${f}.md"; fi
|
|
635
|
-
fi
|
|
636
|
-
done
|
|
637
|
-
|
|
638
|
-
# 额外检查:扫描整个项目,找出误放的文档
|
|
639
|
-
for f in $(find . -maxdepth 2 -name "ARCHITECTURE.md" -o -name "STACK.md" -o -name "STRUCTURE.md" -o -name "CONVENTIONS.md" -o -name "INTEGRATIONS.md" -o -name "TESTING.md" -o -name "CONCERNS.md" -o -name "PROJECT.md" | grep -v ".sillyspec/codebase/"); do
|
|
640
|
-
if [ -f "$f" ]; then
|
|
641
|
-
echo "❌ 发现误放文件: $f(应该在 .sillyspec/codebase/ 下)"
|
|
642
|
-
mkdir -p .sillyspec/codebase
|
|
643
|
-
name=$(basename "$f")
|
|
644
|
-
mv "$f" ".sillyspec/codebase/${name}"
|
|
645
|
-
echo " 已自动修正: $f → .sillyspec/codebase/${name}"
|
|
646
|
-
fi
|
|
227
|
+
for f in $(find . -maxdepth 2 -name "{ARCHITECTURE,STACK,STRUCTURE,CONVENTIONS,INTEGRATIONS,TESTING,CONCERNS,PROJECT,SCAN-RAW}.md" ! -path "./.sillyspec/codebase/*"); do
|
|
228
|
+
[ -f "$f" ] && mkdir -p .sillyspec/codebase && mv "$f" ".sillyspec/codebase/$(basename $f)"
|
|
647
229
|
done
|
|
648
230
|
```
|
|
649
231
|
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
- [ ]
|
|
655
|
-
- [ ]
|
|
656
|
-
- [ ]
|
|
657
|
-
- [ ]
|
|
658
|
-
- [ ]
|
|
659
|
-
- [ ] TESTING.md 是否描述了测试状况?(深度扫描)
|
|
660
|
-
- [ ] CONCERNS.md 是否列出了技术债务?(深度扫描)
|
|
661
|
-
- [ ] PROJECT.md 是否生成?
|
|
662
|
-
|
|
663
|
-
### 脚本校验(硬验证)
|
|
664
|
-
|
|
665
|
-
Hard Gate 自检通过后,运行校验脚本:
|
|
232
|
+
**自检门控:**
|
|
233
|
+
- [ ] STACK.md 含主要语言和框架?
|
|
234
|
+
- [ ] ARCHITECTURE.md 描述了整体架构?
|
|
235
|
+
- [ ] STRUCTURE.md 含目录结构?
|
|
236
|
+
- [ ] CONVENTIONS.md 含编码约定?(深扫)
|
|
237
|
+
- [ ] INTEGRATIONS.md 列出外部依赖?(深扫)
|
|
238
|
+
- [ ] TESTING.md 描述测试状况?(深扫)
|
|
239
|
+
- [ ] CONCERNS.md 列出技术债务?(深扫)
|
|
240
|
+
- [ ] PROJECT.md 已生成?
|
|
666
241
|
|
|
667
242
|
```bash
|
|
668
|
-
bash scripts/validate-scan.sh .sillyspec/codebase
|
|
243
|
+
bash scripts/validate-scan.sh .sillyspec/codebase 2>/dev/null
|
|
669
244
|
```
|
|
670
|
-
|
|
671
|
-
- 脚本返回 0 → 自检通过,继续
|
|
672
|
-
- 脚本返回非 0 → 根据错误提示修正文档,重新运行脚本
|