sillyspec 3.7.29 → 3.7.31

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.
@@ -8,10 +8,9 @@ description: 项目自检 — 检查 CLI、配置、构建环境和外部依赖
8
8
  **在执行任何检查之前,先确认 SillySpec CLI 是否可用:**
9
9
 
10
10
  1. 运行 `sillyspec --version`
11
- 2. 如果失败,运行 `npx sillyspec --version`
12
- 3. 如果都失败:
13
- - 输出:❌ SillySpec CLI 未安装,后续检查无法执行
14
- - 给出安装命令:`npm install -g sillyspec`(生产环境)或 `npx sillyspec`(临时使用)
11
+ 2. 如果失败:
12
+ - 输出:❌ SillySpec CLI 未安装
13
+ - 给出安装命令:`npm install -g sillyspec`
15
14
  - 停止,不要继续后续步骤
16
15
 
17
16
  ## 执行
@@ -148,7 +148,6 @@ ls -la
148
148
  ```bash
149
149
  git init
150
150
  git add .
151
- git commit -m "chore: sillyspec init - project initialized"
152
151
  ```
153
152
 
154
153
  ### 最后说:
package/fix-input.js ADDED
@@ -0,0 +1,15 @@
1
+ const fs = require('fs');
2
+ const p = 'src/run.js';
3
+ let c = fs.readFileSync(p, 'utf8');
4
+
5
+ const old = `- 输出:${outputText}\n\``;
6
+ const rep = `${inputText ? `- 输入:${inputText}\n` : ''}- 输出:${outputText}\n\``;
7
+
8
+ const count = c.split(old).length - 1;
9
+ console.log(`Found ${count} occurrences`);
10
+
11
+ if (count > 0) {
12
+ c = c.replaceAll(old, rep);
13
+ fs.writeFileSync(p, c);
14
+ console.log('Replaced');
15
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sillyspec",
3
- "version": "3.7.29",
3
+ "version": "3.7.31",
4
4
  "description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
5
5
  "icon": "logo.jpg",
6
6
  "homepage": "https://sillyspec.ppdmq.top/",
package/src/progress.js CHANGED
@@ -17,12 +17,11 @@ const PROGRESS_FILE = 'progress.json';
17
17
  const BACKUP_FILE = 'progress.json.bak';
18
18
 
19
19
  const CURRENT_VERSION = 2;
20
- const VALID_STAGES = ['brainstorm', 'propose', 'plan', 'execute', 'verify', 'scan', 'quick', 'archive', 'status', 'doctor'];
20
+ const VALID_STAGES = ['brainstorm', 'plan', 'execute', 'verify', 'scan', 'quick', 'archive', 'status', 'doctor'];
21
21
  const VALID_STATUSES = ['pending', 'in-progress', 'completed', 'failed', 'blocked'];
22
22
 
23
23
  const STAGE_LABELS = {
24
24
  brainstorm: '🧠 需求探索',
25
- propose: '📋 方案设计',
26
25
  plan: '📐 实现计划',
27
26
  execute: '⚡ 波次执行',
28
27
  verify: '🔍 验证确认',
package/src/run.js CHANGED
@@ -106,11 +106,13 @@ function outputStep(stageName, stepIndex, steps, cwd) {
106
106
  console.log(`\n### ⚠️ 铁律`)
107
107
  console.log('- 只做本步骤描述的操作,不得自行扩展或跳过')
108
108
  console.log('- 不要回头修改已完成的步骤')
109
+ console.log('- 不要使用 npx 命令,直接使用 sillyspec(已全局安装)')
110
+ console.log('- 不要编造不存在的 CLI 子命令')
109
111
  console.log('- 完成后立即执行 --done 命令,不得跳过')
110
112
  console.log('- 生成的文件头部必须包含 author(git 用户名)和 created_at(精确到秒)')
111
113
  console.log('- 执行构建/测试前必须先读 local.yaml,优先使用其中配置的命令、路径和环境变量;未配置时才使用默认值')
112
114
  console.log(`\n### 完成后执行`)
113
- console.log(`sillyspec run ${stageName} --done --output "你的摘要"`)
115
+ console.log(`sillyspec run ${stageName} --done --input "用户原始需求/反馈" --output "你的摘要"`)
114
116
  }
115
117
 
116
118
  /**
@@ -139,6 +141,13 @@ export async function runCommand(args, cwd) {
139
141
  outputText = flags[outputIdx + 1]
140
142
  }
141
143
 
144
+ // 解析 --input
145
+ let inputText = null
146
+ const inputIdx = flags.indexOf('--input')
147
+ if (inputIdx !== -1 && flags[inputIdx + 1]) {
148
+ inputText = flags[inputIdx + 1]
149
+ }
150
+
142
151
  // 解析 --change <name>
143
152
  let changeName = null
144
153
  const changeIdx = flags.indexOf('--change')
@@ -193,7 +202,7 @@ export async function runCommand(args, cwd) {
193
202
 
194
203
  // --done
195
204
  if (isDone) {
196
- return await completeStep(pm, progress, stageName, cwd, outputText)
205
+ return await completeStep(pm, progress, stageName, cwd, outputText, inputText)
197
206
  }
198
207
 
199
208
  // 默认:输出当前步骤
@@ -267,7 +276,7 @@ function validateMetadata(cwd, stageName) {
267
276
  }
268
277
  }
269
278
 
270
- async function completeStep(pm, progress, stageName, cwd, outputText) {
279
+ async function completeStep(pm, progress, stageName, cwd, outputText, inputText = null) {
271
280
  const stageData = progress.stages[stageName]
272
281
  if (!stageData || !stageData.steps) {
273
282
  console.error(`❌ 阶段 ${stageName} 未初始化`)
@@ -323,7 +332,7 @@ async function completeStep(pm, progress, stageName, cwd, outputText) {
323
332
  // Append to user-inputs.md
324
333
  if (outputText) {
325
334
  const inputsPath = join(cwd, '.sillyspec', '.runtime', 'user-inputs.md')
326
- const entry = `\n## ${new Date().toLocaleString('zh-CN',{hour12:false})} | ${stageName}: ${steps[currentIdx].name}\n- 输出:${outputText}\n`
335
+ const entry = `\n## ${new Date().toLocaleString('zh-CN',{hour12:false})} | ${stageName}: ${steps[currentIdx].name}\n${inputText ? "- 输入:" + inputText + "\n" : ""}- 输出:${outputText}\n`
327
336
  appendFileSync(inputsPath, entry)
328
337
  }
329
338
 
@@ -345,7 +354,7 @@ async function completeStep(pm, progress, stageName, cwd, outputText) {
345
354
  // Append to user-inputs.md
346
355
  if (outputText) {
347
356
  const inputsPath = join(cwd, '.sillyspec', '.runtime', 'user-inputs.md')
348
- const entry = `\n## ${new Date().toLocaleString('zh-CN',{hour12:false})} | ${stageName}: ${steps[currentIdx].name}\n- 输出:${outputText}\n`
357
+ const entry = `\n## ${new Date().toLocaleString('zh-CN',{hour12:false})} | ${stageName}: ${steps[currentIdx].name}\n${inputText ? "- 输入:" + inputText + "\n" : ""}- 输出:${outputText}\n`
349
358
  appendFileSync(inputsPath, entry)
350
359
  }
351
360
 
@@ -35,7 +35,7 @@ export const definition = {
35
35
  },
36
36
  {
37
37
  name: '更新路线图和提交',
38
- prompt: `更新路线图并 Git 提交。
38
+ prompt: `更新路线图并暂存变更。
39
39
 
40
40
  ### 操作
41
41
  1. 如果 \`.sillyspec/ROADMAP.md\` 存在,标记对应 Phase 为已完成
@@ -164,8 +164,9 @@ export const definition = {
164
164
  prompt: `撰写 design 文档并进行 AI 自审。
165
165
 
166
166
  ### 操作
167
- 1. 将确认的设计写入 \`.sillyspec/changes/<变更名>/design.md\`
168
- 2. 自审检查:
167
+ 1. 确认变更目录存在:\`mkdir -p .sillyspec/changes/<变更名>\`(Windows 用 \`mkdir .sillyspec\\changes\\<变更名>\` 或 PowerShell \`New-Item -ItemType Directory -Force -Path .sillyspec/changes/<变更名>\`)
168
+ 2. 将确认的设计写入 \`.sillyspec/changes/<变更名>/design.md\`
169
+ 3. 自审检查:
169
170
  - 需求覆盖:是否完整覆盖 Step 6 确认的需求
170
171
  - 约束一致性:是否与 CONVENTIONS.md、ARCHITECTURE.md 一致
171
172
  - 真实性:表名/字段名来自真实 schema 或标注"新增"
@@ -184,25 +185,30 @@ design.md 文件路径 + 自审结果
184
185
  optional: false
185
186
  },
186
187
  {
187
- name: '用户确认并输出技术方案',
188
- prompt: `用户确认设计方案,生成最终技术方案。
188
+ name: '用户确认并生成规范文件',
189
+ prompt: `用户确认设计方案,生成规范文件。
189
190
 
190
191
  ### 操作
191
192
  1. 展示 design.md 摘要给用户
192
193
  2. 请用户选择:✅ 确认 / ✏️ 修改 / ❌ 推翻重来
193
- 3. 确认后:
194
- - 将技术方案写入 \`.sillyspec/changes/<变更名>/design.md\`
195
- - 包含:架构决策、文件变更清单、数据模型、API 设计、代码风格参照
196
- - Git 提交
194
+ 3. 确认后,在 \`.sillyspec/changes/<变更名>/\` 下生成所有规范文件:
195
+ - **design.md**:架构决策、文件变更清单、数据模型、API 设计、代码风格参照
196
+ - **proposal.md**:动机、变更范围、不在范围内、成功标准
197
+ - **requirements.md**:功能需求、用户场景(Given/When/Then 格式)、非功能需求
198
+ - **tasks.md**:任务列表(只列名称和对应文件路径,细节在 plan 阶段展开)
199
+ - \`git add .sillyspec/\` — **不要 commit**
197
200
 
198
201
  ### 输出
199
- 最终 design.md 路径 + Git commit hash
202
+ 所有规范文件路径
200
203
 
201
204
  ### 注意
202
205
  - 必须等待用户明确确认
203
206
  - 禁止在确认前推进到后续阶段
204
- - 推翻重来回到 Step 6`,
205
- outputHint: '最终 design.md 路径 + commit hash',
207
+ - 禁止自动 commit
208
+ - 推翻重来回到 Step 6
209
+ - 表名/字段名必须来自真实 schema 或标注"新增"
210
+ - tasks.md 只列任务名,细节在 plan 阶段展开`,
211
+ outputHint: '规范文件路径',
206
212
  optional: false
207
213
  }
208
214
  ]
@@ -281,7 +281,7 @@ timeout 5 which docker 2>/dev/null && echo "✅ Docker 可用" || echo "ℹ️ D
281
281
  根据问题类型给出具体可操作的修复命令:
282
282
 
283
283
  **常见问题及修复:**
284
- - CLI 未安装 → \`npm install -g sillyspec\` 或 \`npx sillyspec\`
284
+ - CLI 未安装 → \`npm install -g sillyspec\`
285
285
  - 缺少 local.yaml → \`sillyspec init\` 重新生成,或手动创建
286
286
  - local.yaml 缺少 build/test → 补充对应命令
287
287
  - 缺少 STACK.md → \`sillyspec run scan\` 重新扫描
@@ -93,7 +93,7 @@ const fixedSuffix = [
93
93
  - 验证 → sillyspec run verify
94
94
  - 归档 → /sillyspec:archive
95
95
  - 继续开发
96
- 2. 提示 git 提交
96
+ 2. 提示 git add 暂存变更
97
97
 
98
98
  ### 输出
99
99
  用户选择 + 下一步命令
@@ -112,23 +112,51 @@ function parseWavesFromPlan(planContent) {
112
112
  const waves = []
113
113
  const lines = planContent.split('\n')
114
114
  let currentWave = null
115
+ let currentTask = null
115
116
 
116
117
  for (const line of lines) {
117
118
  const waveMatch = line.match(/^#+\s*Wave\s+(\d+)/i)
118
119
  if (waveMatch) {
119
120
  currentWave = { index: parseInt(waveMatch[1]), tasks: [] }
121
+ currentTask = null
120
122
  waves.push(currentWave)
121
123
  continue
122
124
  }
123
125
 
124
- if (currentWave) {
125
- const taskMatch = line.match(/^[-*]\s*\[[ x]\]\s*(.+)/)
126
- if (taskMatch) {
127
- const fileMatch = taskMatch[1].match(/\(([^)]+)\)/)
128
- currentWave.tasks.push({
129
- name: taskMatch[1].replace(/\([^)]+\)/, '').trim(),
130
- file: fileMatch ? fileMatch[1] : '未知'
131
- })
126
+ if (!currentWave) continue
127
+
128
+ const taskMatch = line.match(/^[-*]\s*\[[ x]\]\s*(.+)/)
129
+ if (taskMatch) {
130
+ currentTask = {
131
+ name: taskMatch[1].trim(),
132
+ file: '',
133
+ steps: '',
134
+ reference: ''
135
+ }
136
+ // 兼容旧格式:任务名后跟 (文件路径)
137
+ const fileMatch = taskMatch[1].match(/\(([^)]+)\)$/)
138
+ if (fileMatch) {
139
+ currentTask.file = fileMatch[1]
140
+ currentTask.name = taskMatch[1].replace(/\([^)]+\)$/, '').trim()
141
+ }
142
+ currentWave.tasks.push(currentTask)
143
+ continue
144
+ }
145
+
146
+ // 解析子行信息(修改/参考/步骤)
147
+ if (currentTask) {
148
+ const modMatch = line.match(/^\s+-\s*修改:\s*(.+)/)
149
+ if (modMatch) { currentTask.file = modMatch[1].trim(); continue }
150
+
151
+ const refMatch = line.match(/^\s+-\s*参考:\s*(.+)/)
152
+ if (refMatch) { currentTask.reference = refMatch[1].trim(); continue }
153
+
154
+ const stepMatch = line.match(/^\s+-\s*步骤:/)
155
+ if (stepMatch) { currentTask.steps = line.replace(/^\s+-\s*步骤:\s*/, '').trim(); continue }
156
+
157
+ // 步骤续行(数字开头的子步骤)
158
+ if (currentTask.steps && line.match(/^\s+\d+\./)) {
159
+ currentTask.steps += '\n' + line.trim()
132
160
  }
133
161
  }
134
162
  }
@@ -140,7 +168,13 @@ function parseWavesFromPlan(planContent) {
140
168
  * 为 Wave 生成 prompt
141
169
  */
142
170
  function buildWavePrompt(wave, waveIndex) {
143
- const taskList = wave.tasks.map(t => `- [ ] ${t.name} (${t.file})`).join('\n')
171
+ const taskList = wave.tasks.map(t => {
172
+ let s = `- [ ] ${t.name}`
173
+ if (t.file) s += ` (${t.file})`
174
+ if (t.reference) s += `\n 参考: ${t.reference}`
175
+ if (t.steps) s += `\n 步骤: ${t.steps}`
176
+ return s
177
+ }).join('\n')
144
178
  return `## Wave ${waveIndex}: 执行以下任务
145
179
 
146
180
  ### 本 Wave 任务
@@ -149,15 +183,18 @@ ${taskList}
149
183
  ### 执行要求
150
184
  1. 按任务顺序执行,同一 Wave 内任务可并行
151
185
  2. 铁律:先读后写、grep 确认方法存在、不编造、TDD
152
- 3. 读取 \`.sillyspec/local.yaml\` 获取构建和测试命令
153
- 4. 编译/测试仅限变更涉及的模块(使用 \`-pl\`、\`--filter\` 或指定路径)
154
- 3. 每个任务完成后:
186
+ 3. **不要频繁编译!** 编译很慢,只在以下情况运行:
187
+ - 写了大量代码后需要验证语法正确性
188
+ - 最后一个 Wave 完成后做一次全量编译验证
189
+ - 用户明确要求编译时
190
+ 4. 单个任务完成后只跑**对应模块的单元测试**(TDD 绿灯确认),不要跑全量编译
191
+ 5. 每个任务完成后:
155
192
  - 勾选 tasks.md 中对应 checkbox
156
193
  - 记录改动文件和测试结果
157
- 4. 遇到 BLOCKED → 记录原因,选择:重试/跳过/停止
194
+ 6. 遇到 BLOCKED → 记录原因,选择:重试/跳过/停止
158
195
 
159
196
  ### 完成后
160
- 运行 sillyspec run execute --done --output "Wave ${waveIndex} 结果摘要"`
197
+ 运行 sillyspec run execute --done --input "用户原始反馈" --output "Wave ${waveIndex} 结果摘要"`
161
198
  }
162
199
 
163
200
  /**
@@ -23,7 +23,7 @@ export const stageRegistry = {
23
23
  }
24
24
 
25
25
  // 流程阶段顺序,用于 getNextStage
26
- const stageOrder = ['brainstorm', 'propose', 'plan', 'execute', 'verify']
26
+ const stageOrder = ['brainstorm', 'plan', 'execute', 'verify']
27
27
 
28
28
  export function getNextStage(currentStage) {
29
29
  const index = stageOrder.indexOf(currentStage)
@@ -1,7 +1,7 @@
1
1
  export const definition = {
2
2
  name: 'plan',
3
3
  title: '实现计划',
4
- description: '编写实现计划 — 2-5 分钟粒度,精确到文件路径和代码',
4
+ description: '编写实现计划 — Wave 分组,TDD 步骤,精确到文件路径',
5
5
  steps: [
6
6
  {
7
7
  name: '状态检查',
@@ -22,8 +22,9 @@ export const definition = {
22
22
 
23
23
  ### 操作
24
24
  1. 读取 CODEBASE-OVERVIEW.md + 各子项目上下文
25
- 2. 读取 proposal.md、design.md、tasks.md、requirements.md
25
+ 2. 读取 proposal.md、design.md、requirements.md
26
26
  3. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
27
+ 4. 读取 local.yaml 获取构建/测试命令
27
28
 
28
29
  ### 输出
29
30
  已加载的文件清单`,
@@ -43,46 +44,84 @@ export const definition = {
43
44
  optional: false
44
45
  },
45
46
  {
46
- name: '逐任务展开',
47
- prompt: `把 tasks.md 中每个 checkbox 展开为详细步骤。
47
+ name: '展开任务并分组',
48
+ prompt: `把 tasks.md 每个 checkbox 展开为任务描述,按 Wave 分组组织。
48
49
 
49
- ### 操作
50
- 对每个 Task:
51
- 1. 标注精确文件路径(新建/修改/测试)
52
- 2. 每个步骤 2-5 分钟可完成
53
- 3. 包含完整可运行的代码示例
54
- 4. 包含验证命令和预期输出
55
- 5. 频繁 commit,每个任务独立提交
56
- 6. 引用已有代码的方法签名(从 CONVENTIONS.md 或源码获取)
50
+ ### 输出格式要求(必须严格遵守)
57
51
 
58
- ### 输出
59
- 展开后的详细计划
60
-
61
- ### 注意
62
- - 假设执行者是熟练开发者但对你项目零上下文
63
- - 不要写"添加验证逻辑"这种模糊描述
64
- - 要写"在 UserController.java 添加方法:public Result<UserVO> createUser(...)"
65
- - 调用已有方法前必须 grep 确认存在`,
66
- outputHint: '详细计划',
67
- optional: false
68
- },
69
- {
70
- name: '标注执行顺序',
71
- prompt: `按依赖关系分组,标注执行顺序。
52
+ 每个 Task 必须保留 \`- [ ]\` checkbox,这是 execute 阶段勾选完成状态的依据。禁止写成纯文本列表。
72
53
 
73
- ### 操作
54
+ 每个 Task 必须包含「步骤」字段,列出 TDD 执行顺序:
55
+ 1. 写测试 → 2. 运行确认失败 → 3. 写代码 → 4. 运行确认通过
56
+
57
+ 纯配置/数据/文档类任务可跳过 TDD,步骤简化为:1. 实现 → 2. 验证
58
+
59
+ 注意:不需要写精确方法签名和代码示例。方法签名和代码风格由 execute 阶段先读后写确认。plan 专注"做什么"和"执行顺序"。
60
+
61
+ ### 示例
62
+
63
+ \`\`\`markdown
64
+ ### Wave 1(并行,无依赖)
65
+
66
+ - [ ] 添加用户创建接口
67
+ - 修改: \`UserController.java\`、\`UserService.java\`
68
+ - 参考: \`RoleController.createRole\`
69
+ - 步骤:
70
+ 1. 写测试 UserControllerTest.testCreateUser
71
+ 2. 运行 <test-cmd> 确认失败
72
+ 3. 写 UserController.createUser
73
+ 4. 运行 <test-cmd> 确认通过
74
+
75
+ - [ ] 添加角色创建接口
76
+ - 修改: \`RoleController.java\`
77
+ - 步骤:
78
+ 1. 写测试 RoleControllerTest.testCreateRole
79
+ 2. 运行 <test-cmd> 确认失败
80
+ 3. 写 RoleController.createRole
81
+ 4. 运行 <test-cmd> 确认通过
82
+
83
+ ### Wave 2(依赖 Wave 1)
84
+
85
+ - [ ] 用户创建接口联调
86
+ - 修改: \`UserController.java\`
87
+ - 依赖: Wave 1 的用户创建接口 + 角色创建接口
88
+ - 步骤:
89
+ 1. 写集成测试 UserControllerTest.testCreateUserIntegration
90
+ 2. 运行 <test-cmd> 确认失败
91
+ 3. 补充联调逻辑
92
+ 4. 运行 <test-cmd> 确认通过
93
+
94
+ ### Wave 3(纯配置)
95
+
96
+ - [ ] 配置用户创建接口路由
97
+ - 修改: \`application.yml\`
98
+ - 步骤:
99
+ 1. 实现路由配置
100
+ 2. 验证: 运行 <test-cmd> 确认通过
101
+ \`\`\`
102
+
103
+ ### 每个 Task 必须包含
104
+ - 精确文件路径(修改哪个文件)
105
+ - 任务描述(做什么,一两句话说清楚)
106
+ - 涉及已有类调用时,标注参考文件(如"参考 \`RoleController.createRole\`")
107
+ - 依赖关系(无依赖可省略)
108
+
109
+ ### 分组规则
74
110
  1. 分析 Task 间依赖
75
111
  2. 无依赖的 Task 归入同一 Wave(可并行)
76
112
  3. 有依赖的 Task 按顺序排列
113
+ 4. Wave 编号从 1 开始
77
114
 
78
- ### 输出
79
- Wave 分组列表 + 依赖说明
115
+ ### 操作
116
+ 1. 读取 tasks.md 获取任务列表
117
+ 2. 读取 design.md 获取文件变更清单
118
+ 3. 逐个展开为详细任务描述
119
+ 4. 分析依赖关系,按 Wave 分组
120
+ 5. 每个任务独立 \`git add\` 暂存,不 commit
80
121
 
81
- ### 示例
82
- Wave 1(并行):Task 1 + Task 2
83
- Wave 2(依赖 Wave 1):Task 3
84
- Wave 3(依赖 Wave 2):Task 4`,
85
- outputHint: 'Wave 分组和依赖关系',
122
+ ### 输出
123
+ Wave 分组的完整计划`,
124
+ outputHint: 'Wave 分组计划',
86
125
  optional: false
87
126
  },
88
127
  {
@@ -91,10 +130,13 @@ Wave 3(依赖 Wave 2):Task 4`,
91
130
 
92
131
  ### 操作
93
132
  检查以下各项:
94
- - [ ] 每个 task 有具体文件路径
95
- - [ ] 每个 task 有验证命令和预期输出
96
- - [ ] 已标注 Wave 和执行顺序
133
+ - [ ] 每个 task 有 \`- [ ]\` checkbox
134
+ - [ ] 每个 task 有精确文件路径
135
+ - [ ] 代码类 task 有 TDD 步骤(写测试→确认失败→写代码→确认通过)
136
+ - [ ] 配置/文档类 task 步骤简化为(实现→验证)
137
+ - [ ] 已标注 Wave 分组和依赖关系
97
138
  - [ ] plan 与 design.md 的文件变更清单一致
139
+ - [ ] 没有写精确方法签名和代码示例
98
140
 
99
141
  ### 输出
100
142
  自检通过/不通过`,
@@ -106,7 +148,9 @@ Wave 3(依赖 Wave 2):Task 4`,
106
148
  prompt: `保存计划文件,更新进度。
107
149
 
108
150
  ### 操作
109
- 1. 保存到 \`.sillyspec/changes/<变更名>/plan.md\`
151
+ 1. 确认变更目录存在:\`mkdir -p .sillyspec/changes/<变更名>\`
152
+ 2. 保存到 \`.sillyspec/changes/<变更名>/plan.md\`
153
+ 3. \`git add .sillyspec/\` — **不要 commit**
110
154
 
111
155
  ### 输出
112
156
  计划文件路径 + 下一步命令`,
@@ -130,11 +130,11 @@ TESTING.md、CONCERNS.md、PROJECT.md 路径`,
130
130
  4. \`git add .\` — **不要 commit**,由用户通过统一提交工具处理
131
131
 
132
132
  ### 输出
133
- 扫描完整性报告 + commit hash
133
+ 扫描完整性报告
134
134
 
135
135
  ### 注意
136
136
  - ❌ 修改代码 / 编造路径 / 读源码全文`,
137
- outputHint: '自检报告 + commit hash',
137
+ outputHint: '自检报告',
138
138
  optional: false
139
139
  }
140
140
  ]