sillyspec 3.10.5 → 3.10.7

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.
@@ -3,6 +3,10 @@ name: sillyspec:archive
3
3
  description: 归档变更 — 规范沉淀,可追溯
4
4
  ---
5
5
 
6
+ ## 多变更说明
7
+
8
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
9
+
6
10
  ## 执行
7
11
 
8
12
  **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
@@ -3,6 +3,10 @@ name: sillyspec:brainstorm
3
3
  description: 需求探索 — 结构化头脑风暴,含技术方案输出(创建性工作前必用)
4
4
  ---
5
5
 
6
+ ## 多变更说明
7
+
8
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
9
+
6
10
  ## 执行
7
11
 
8
12
  **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
@@ -13,6 +13,10 @@ description: 项目自检 — 检查 CLI、配置、构建环境和外部依赖
13
13
  - 给出安装命令:`npm install -g sillyspec`
14
14
  - 停止,不要继续后续步骤
15
15
 
16
+ ## 多变更说明
17
+
18
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
19
+
16
20
  ## 执行
17
21
 
18
22
  **CLI 可用后,使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
@@ -3,6 +3,10 @@ name: sillyspec:execute
3
3
  description: 波次执行 — 子代理并行 + 强制 TDD + 两阶段审查
4
4
  ---
5
5
 
6
+ ## 多变更说明
7
+
8
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
9
+
6
10
  ## 执行
7
11
 
8
12
  **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
@@ -17,6 +17,10 @@ description: 自由思考模式 — 讨论、画图、调研,不写代码
17
17
  ## 话题
18
18
  $ARGUMENTS
19
19
 
20
+ ## 多变更说明
21
+
22
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
23
+
20
24
  ## 执行
21
25
 
22
26
  **你必须先使用 exec 工具(shell)执行以下命令读取统一 CLI prompt:**
@@ -3,6 +3,10 @@ name: sillyspec:plan
3
3
  description: 编写实现计划 — 2-5 分钟粒度,精确到文件路径和代码
4
4
  ---
5
5
 
6
+ ## 多变更说明
7
+
8
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
9
+
6
10
  ## 执行
7
11
 
8
12
  **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
@@ -3,6 +3,10 @@ name: sillyspec:propose
3
3
  description: 生成结构化规范 — proposal + design + tasks
4
4
  ---
5
5
 
6
+ ## 多变更说明
7
+
8
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
9
+
6
10
  ## 执行
7
11
 
8
12
  **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
@@ -3,6 +3,10 @@ name: sillyspec:quick
3
3
  description: 快速任务 — 跳过完整流程,直接做
4
4
  ---
5
5
 
6
+ ## 多变更说明
7
+
8
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
9
+
6
10
  ## 执行
7
11
 
8
12
  **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
@@ -3,6 +3,10 @@ name: sillyspec:scan
3
3
  description: 代码扫描 — 分析项目结构、约定和架构
4
4
  ---
5
5
 
6
+ ## 多变更说明
7
+
8
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
9
+
6
10
  ## 执行
7
11
 
8
12
  **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
@@ -3,6 +3,10 @@ name: sillyspec:status
3
3
  description: 查看项目进度和状态
4
4
  ---
5
5
 
6
+ ## 多变更说明
7
+
8
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
9
+
6
10
  ## 执行
7
11
 
8
12
  **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
@@ -3,6 +3,10 @@ name: sillyspec:verify
3
3
  description: 验证实现 — 对照规范检查 + 测试套件
4
4
  ---
5
5
 
6
+ ## 多变更说明
7
+
8
+ 如果项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录),所有 `sillyspec run` 命令需要加 `--change <变更名>`。只有一个变更时可省略(CLI 自动检测)。
9
+
6
10
  ## 执行
7
11
 
8
12
  **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sillyspec",
3
- "version": "3.10.5",
3
+ "version": "3.10.7",
4
4
  "description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
5
5
  "icon": "logo.jpg",
6
6
  "homepage": "https://sillyspec.ppdmq.top/",
package/src/index.js CHANGED
@@ -136,9 +136,13 @@ async function main() {
136
136
  break;
137
137
  case 'progress': {
138
138
  const pm = new ProgressManager();
139
+ pm._migrateIfNeeded(dir);
139
140
  const subCommand = filteredArgs[1];
140
141
  const stageIdx = filteredArgs.indexOf('--stage');
141
142
  const stage = stageIdx >= 0 && filteredArgs[stageIdx + 1] ? filteredArgs[stageIdx + 1] : null;
143
+ // 解析 --change 参数
144
+ const progChangeIdx = args.indexOf('--change');
145
+ const progChangeName = progChangeIdx >= 0 && args[progChangeIdx + 1] ? args[progChangeIdx + 1] : null;
142
146
 
143
147
  switch (subCommand) {
144
148
  case 'init':
@@ -146,49 +150,48 @@ async function main() {
146
150
  break;
147
151
  case 'status':
148
152
  case 'show':
149
- pm.show(dir);
153
+ pm.show(dir, progChangeName);
150
154
  break;
151
155
  case 'validate':
152
- await pm.validate(dir);
156
+ await pm.validate(dir, progChangeName);
153
157
  break;
154
158
  case 'reset':
155
- pm.reset(dir, stage);
159
+ pm.reset(dir, stage, progChangeName);
156
160
  break;
157
161
  case 'set-stage': {
158
162
  const setStageName = filteredArgs[2];
159
- if (!setStageName) { console.log('❌ 用法: sillyspec progress set-stage <stage>'); break; }
160
- pm.setStage(dir, setStageName);
163
+ if (!setStageName) { console.log('❌ 用法: sillyspec progress set-stage <stage> [--change <name>]'); break; }
164
+ pm.setStage(dir, setStageName, progChangeName);
161
165
  break;
162
166
  }
163
167
  case 'add-step': {
164
168
  const addStepStage = filteredArgs[2];
165
169
  const addStepName = filteredArgs[3];
166
- if (!addStepStage || !addStepName) { console.log('❌ 用法: sillyspec progress add-step <stage> <step-name>'); break; }
167
- pm.addStep(dir, addStepStage, addStepName);
170
+ if (!addStepStage || !addStepName) { console.log('❌ 用法: sillyspec progress add-step <stage> <step-name> [--change <name>]'); break; }
171
+ pm.addStep(dir, addStepStage, addStepName, progChangeName);
168
172
  break;
169
173
  }
170
174
  case 'update-step': {
171
175
  const updStepStage = filteredArgs[2];
172
176
  const updStepName = filteredArgs[3];
173
- if (!updStepStage || !updStepName) { console.log('❌ 用法: sillyspec progress update-step <stage> <step-name> --status <status> [--output <text>]'); break; }
174
- // Parse --status and --output from args
177
+ if (!updStepStage || !updStepName) { console.log('❌ 用法: sillyspec progress update-step <stage> <step-name> --status <status> [--output <text>] [--change <name>]'); break; }
175
178
  let updStatus = null, updOutput = undefined;
176
179
  for (let ai = 0; ai < args.length; ai++) {
177
180
  if (args[ai] === '--status' && args[ai + 1]) { updStatus = args[ai + 1]; ai++; }
178
181
  if (args[ai] === '--output' && args[ai + 1]) { updOutput = args[ai + 1]; ai++; }
179
182
  }
180
- pm.updateStep(dir, updStepStage, updStepName, { status: updStatus, output: updOutput });
183
+ pm.updateStep(dir, updStepStage, updStepName, { status: updStatus, output: updOutput }, progChangeName);
181
184
  break;
182
185
  }
183
186
  case 'complete-stage': {
184
187
  const compStageName = filteredArgs[2];
185
188
  if (!compStageName) { console.log('❌ 用法: sillyspec progress complete-stage <stage>'); break; }
186
- pm.completeStage(dir, compStageName);
189
+ pm.completeStage(dir, compStageName, progChangeName);
187
190
  break;
188
191
  }
189
192
  case 'batch': {
190
193
  if (filteredArgs.includes('--status')) {
191
- const bp = pm.readBatchProgress(dir);
194
+ const bp = pm.readBatchProgress(dir, progChangeName);
192
195
  if (!bp) { console.log('📭 无批量进度数据'); break; }
193
196
  const line = pm._renderBatchProgress(bp);
194
197
  console.log(line || '📭 无批量进度数据');
@@ -207,7 +210,7 @@ async function main() {
207
210
  console.log(' sillyspec progress batch --status');
208
211
  break;
209
212
  }
210
- pm.updateBatchProgress(dir, batchData);
213
+ pm.updateBatchProgress(dir, batchData, progChangeName);
211
214
  console.log('✅ 批量进度已更新');
212
215
  }
213
216
  break;
package/src/init.js CHANGED
@@ -56,7 +56,7 @@ const INJECTION_CONTENT = `## SillySpec — 规范驱动开发
56
56
  - 遵循 \`.sillyspec/docs/<project>/scan/CONVENTIONS.md\` 中的代码风格
57
57
 
58
58
  ### 工作流程
59
- - 读取 \`.sillyspec/.runtime/progress.json\` 确认当前阶段(使用 \`sillyspec progress show\`)
59
+ - 读取当前变更的 progress.json 确认当前阶段(使用 \`sillyspec progress show\`)
60
60
  - 各阶段产出文件位于 \`.sillyspec/changes/<变更名>/\` 下
61
61
  `;
62
62
 
@@ -141,18 +141,15 @@ async function doInstall(projectDir, tools, subprojects = []) {
141
141
  writeFileSync(uncatPath, `# 未分类知识\n\n> execute/quick 执行中发现的坑暂存于此,用户审阅后归类到对应文件并更新 INDEX.md。\n`);
142
142
  }
143
143
 
144
- // 创建 .sillyspec/.runtime/ 目录结构
144
+ // 创建 .sillyspec/.runtime/ 目录结构(全局状态)
145
145
  const runtimeDir = join(projectDir, '.sillyspec', '.runtime');
146
146
  for (const sub of ['artifacts', 'history', 'logs', 'templates']) {
147
147
  mkdirSync(join(runtimeDir, sub), { recursive: true });
148
148
  }
149
149
 
150
- // 创建初始 progress.json
151
- const progressPath = join(runtimeDir, 'progress.json');
152
- if (!existsSync(progressPath)) {
153
- const pm = new ProgressManager();
154
- pm.init(projectDir);
155
- }
150
+ // 创建全局状态文件
151
+ const pm = new ProgressManager();
152
+ pm.init(projectDir);
156
153
 
157
154
  // 创建初始 user-inputs.md
158
155
  const inputsPath = join(runtimeDir, 'user-inputs.md');