sillyspec 3.7.30 → 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.
- package/fix-input.js +15 -0
- package/package.json +1 -1
- package/src/progress.js +1 -2
- package/src/run.js +12 -5
- package/src/stages/archive.js +1 -1
- package/src/stages/brainstorm.js +14 -9
- package/src/stages/execute.js +52 -15
- package/src/stages/index.js +1 -1
- package/src/stages/plan.js +80 -37
- package/src/stages/scan.js +2 -2
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
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', '
|
|
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
|
@@ -112,7 +112,7 @@ function outputStep(stageName, stepIndex, steps, cwd) {
|
|
|
112
112
|
console.log('- 生成的文件头部必须包含 author(git 用户名)和 created_at(精确到秒)')
|
|
113
113
|
console.log('- 执行构建/测试前必须先读 local.yaml,优先使用其中配置的命令、路径和环境变量;未配置时才使用默认值')
|
|
114
114
|
console.log(`\n### 完成后执行`)
|
|
115
|
-
console.log(`sillyspec run ${stageName} --done --output "你的摘要"`)
|
|
115
|
+
console.log(`sillyspec run ${stageName} --done --input "用户原始需求/反馈" --output "你的摘要"`)
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/**
|
|
@@ -141,6 +141,13 @@ export async function runCommand(args, cwd) {
|
|
|
141
141
|
outputText = flags[outputIdx + 1]
|
|
142
142
|
}
|
|
143
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
|
+
|
|
144
151
|
// 解析 --change <name>
|
|
145
152
|
let changeName = null
|
|
146
153
|
const changeIdx = flags.indexOf('--change')
|
|
@@ -195,7 +202,7 @@ export async function runCommand(args, cwd) {
|
|
|
195
202
|
|
|
196
203
|
// --done
|
|
197
204
|
if (isDone) {
|
|
198
|
-
return await completeStep(pm, progress, stageName, cwd, outputText)
|
|
205
|
+
return await completeStep(pm, progress, stageName, cwd, outputText, inputText)
|
|
199
206
|
}
|
|
200
207
|
|
|
201
208
|
// 默认:输出当前步骤
|
|
@@ -269,7 +276,7 @@ function validateMetadata(cwd, stageName) {
|
|
|
269
276
|
}
|
|
270
277
|
}
|
|
271
278
|
|
|
272
|
-
async function completeStep(pm, progress, stageName, cwd, outputText) {
|
|
279
|
+
async function completeStep(pm, progress, stageName, cwd, outputText, inputText = null) {
|
|
273
280
|
const stageData = progress.stages[stageName]
|
|
274
281
|
if (!stageData || !stageData.steps) {
|
|
275
282
|
console.error(`❌ 阶段 ${stageName} 未初始化`)
|
|
@@ -325,7 +332,7 @@ async function completeStep(pm, progress, stageName, cwd, outputText) {
|
|
|
325
332
|
// Append to user-inputs.md
|
|
326
333
|
if (outputText) {
|
|
327
334
|
const inputsPath = join(cwd, '.sillyspec', '.runtime', 'user-inputs.md')
|
|
328
|
-
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`
|
|
329
336
|
appendFileSync(inputsPath, entry)
|
|
330
337
|
}
|
|
331
338
|
|
|
@@ -347,7 +354,7 @@ async function completeStep(pm, progress, stageName, cwd, outputText) {
|
|
|
347
354
|
// Append to user-inputs.md
|
|
348
355
|
if (outputText) {
|
|
349
356
|
const inputsPath = join(cwd, '.sillyspec', '.runtime', 'user-inputs.md')
|
|
350
|
-
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`
|
|
351
358
|
appendFileSync(inputsPath, entry)
|
|
352
359
|
}
|
|
353
360
|
|
package/src/stages/archive.js
CHANGED
package/src/stages/brainstorm.js
CHANGED
|
@@ -185,25 +185,30 @@ design.md 文件路径 + 自审结果
|
|
|
185
185
|
optional: false
|
|
186
186
|
},
|
|
187
187
|
{
|
|
188
|
-
name: '
|
|
189
|
-
prompt:
|
|
188
|
+
name: '用户确认并生成规范文件',
|
|
189
|
+
prompt: `用户确认设计方案,生成规范文件。
|
|
190
190
|
|
|
191
191
|
### 操作
|
|
192
192
|
1. 展示 design.md 摘要给用户
|
|
193
193
|
2. 请用户选择:✅ 确认 / ✏️ 修改 / ❌ 推翻重来
|
|
194
|
-
3.
|
|
195
|
-
-
|
|
196
|
-
-
|
|
197
|
-
-
|
|
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**
|
|
198
200
|
|
|
199
201
|
### 输出
|
|
200
|
-
|
|
202
|
+
所有规范文件路径
|
|
201
203
|
|
|
202
204
|
### 注意
|
|
203
205
|
- 必须等待用户明确确认
|
|
204
206
|
- 禁止在确认前推进到后续阶段
|
|
205
|
-
-
|
|
206
|
-
|
|
207
|
+
- 禁止自动 commit
|
|
208
|
+
- 推翻重来回到 Step 6
|
|
209
|
+
- 表名/字段名必须来自真实 schema 或标注"新增"
|
|
210
|
+
- tasks.md 只列任务名,细节在 plan 阶段展开`,
|
|
211
|
+
outputHint: '规范文件路径',
|
|
207
212
|
optional: false
|
|
208
213
|
}
|
|
209
214
|
]
|
package/src/stages/execute.js
CHANGED
|
@@ -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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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 =>
|
|
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.
|
|
153
|
-
|
|
154
|
-
|
|
186
|
+
3. **不要频繁编译!** 编译很慢,只在以下情况运行:
|
|
187
|
+
- 写了大量代码后需要验证语法正确性
|
|
188
|
+
- 最后一个 Wave 完成后做一次全量编译验证
|
|
189
|
+
- 用户明确要求编译时
|
|
190
|
+
4. 单个任务完成后只跑**对应模块的单元测试**(TDD 绿灯确认),不要跑全量编译
|
|
191
|
+
5. 每个任务完成后:
|
|
155
192
|
- 勾选 tasks.md 中对应 checkbox
|
|
156
193
|
- 记录改动文件和测试结果
|
|
157
|
-
|
|
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
|
/**
|
package/src/stages/index.js
CHANGED
|
@@ -23,7 +23,7 @@ export const stageRegistry = {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
// 流程阶段顺序,用于 getNextStage
|
|
26
|
-
const stageOrder = ['brainstorm', '
|
|
26
|
+
const stageOrder = ['brainstorm', 'plan', 'execute', 'verify']
|
|
27
27
|
|
|
28
28
|
export function getNextStage(currentStage) {
|
|
29
29
|
const index = stageOrder.indexOf(currentStage)
|
package/src/stages/plan.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const definition = {
|
|
2
2
|
name: 'plan',
|
|
3
3
|
title: '实现计划',
|
|
4
|
-
description: '编写实现计划 —
|
|
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、
|
|
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
|
|
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
|
-
|
|
115
|
+
### 操作
|
|
116
|
+
1. 读取 tasks.md 获取任务列表
|
|
117
|
+
2. 读取 design.md 获取文件变更清单
|
|
118
|
+
3. 逐个展开为详细任务描述
|
|
119
|
+
4. 分析依赖关系,按 Wave 分组
|
|
120
|
+
5. 每个任务独立 \`git add\` 暂存,不 commit
|
|
80
121
|
|
|
81
|
-
###
|
|
82
|
-
Wave
|
|
83
|
-
|
|
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
|
-
- [ ]
|
|
133
|
+
- [ ] 每个 task 有 \`- [ ]\` checkbox
|
|
134
|
+
- [ ] 每个 task 有精确文件路径
|
|
135
|
+
- [ ] 代码类 task 有 TDD 步骤(写测试→确认失败→写代码→确认通过)
|
|
136
|
+
- [ ] 配置/文档类 task 步骤简化为(实现→验证)
|
|
137
|
+
- [ ] 已标注 Wave 分组和依赖关系
|
|
97
138
|
- [ ] plan 与 design.md 的文件变更清单一致
|
|
139
|
+
- [ ] 没有写精确方法签名和代码示例
|
|
98
140
|
|
|
99
141
|
### 输出
|
|
100
142
|
自检通过/不通过`,
|
|
@@ -108,6 +150,7 @@ Wave 3(依赖 Wave 2):Task 4`,
|
|
|
108
150
|
### 操作
|
|
109
151
|
1. 确认变更目录存在:\`mkdir -p .sillyspec/changes/<变更名>\`
|
|
110
152
|
2. 保存到 \`.sillyspec/changes/<变更名>/plan.md\`
|
|
153
|
+
3. \`git add .sillyspec/\` — **不要 commit**
|
|
111
154
|
|
|
112
155
|
### 输出
|
|
113
156
|
计划文件路径 + 下一步命令`,
|
package/src/stages/scan.js
CHANGED
|
@@ -130,11 +130,11 @@ TESTING.md、CONCERNS.md、PROJECT.md 路径`,
|
|
|
130
130
|
4. \`git add .\` — **不要 commit**,由用户通过统一提交工具处理
|
|
131
131
|
|
|
132
132
|
### 输出
|
|
133
|
-
扫描完整性报告
|
|
133
|
+
扫描完整性报告
|
|
134
134
|
|
|
135
135
|
### 注意
|
|
136
136
|
- ❌ 修改代码 / 编造路径 / 读源码全文`,
|
|
137
|
-
outputHint: '自检报告
|
|
137
|
+
outputHint: '自检报告',
|
|
138
138
|
optional: false
|
|
139
139
|
}
|
|
140
140
|
]
|