sillyspec 3.24.0 → 3.24.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sillyspec",
3
- "version": "3.24.0",
3
+ "version": "3.24.1",
4
4
  "description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
5
5
  "icon": "logo.jpg",
6
6
  "homepage": "https://sillyspec.ppdmq.top/",
@@ -56,6 +56,20 @@ export function validateChangeExists(specBase, stageName, changeName) {
56
56
  if (!changeName || !STAGES_REQUIRE_EXISTING_CHANGE.has(stageName)) return null
57
57
  if (/^quick-[0-9a-f]{8}$/.test(changeName)) return null
58
58
  if (existsSync(join(specBase, 'changes', changeName))) return null
59
+
60
+ // archive 特例:step4 --confirm 已把变更从 changes/<name>/ 移到 changes/archive/<date>-<name>/。
61
+ // step5(更新路线图/提交)--change <name> 不应因 changes/<name>/ 已移走而被前置校验误拦。
62
+ // 精确匹配归档目录名(YYYY-MM-DD-<changeName>),避免后缀子串误匹配(auth ≠ deep-auth)。
63
+ if (stageName === 'archive') {
64
+ const archiveRoot = join(specBase, 'changes', 'archive')
65
+ if (existsSync(archiveRoot)) {
66
+ const archived = readdirSync(archiveRoot).find(d => {
67
+ const m = d.match(/^\d{4}-\d{2}-\d{2}-(.+)$/)
68
+ return m && m[1] === changeName
69
+ })
70
+ if (archived) return null
71
+ }
72
+ }
59
73
  return {
60
74
  changeName,
61
75
  specBase,
@@ -30,14 +30,14 @@ export const definition = {
30
30
 
31
31
  ### 操作
32
32
  1. 读取 CODEBASE-OVERVIEW.md + 共享规范 + 子项目上下文
33
- 2. 加载项目信息:\`cat .sillyspec/projects/*.yaml 2>/dev/null\`
34
- 3. 加载本地配置:\`cat .sillyspec/local.yaml 2>/dev/null\`
35
- 4. 棕地项目:读取 .sillyspec/docs/<project>/scan/ 下的 STRUCTURE.md、CONVENTIONS.md、ARCHITECTURE.md
36
- 5. **加载模块索引**:读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(如存在)
33
+ 2. 加载项目信息:\`cat {SPEC_ROOT}/projects/*.yaml 2>/dev/null\`
34
+ 3. 加载本地配置:\`cat {SPEC_ROOT}/local.yaml 2>/dev/null\`
35
+ 4. 棕地项目:读取 {SPEC_ROOT}/docs/<project>/scan/ 下的 STRUCTURE.md、CONVENTIONS.md、ARCHITECTURE.md
36
+ 5. **加载模块索引**:读取 \`{SPEC_ROOT}/docs/<project>/modules/_module-map.yaml\`(如存在)
37
37
  - 这一步是高频操作,_module-map.yaml 回答"哪个文件属于哪个模块、模块之间怎么依赖"
38
38
  - 用 tags/aliases 字段做需求关键词→模块的粗匹配
39
39
  - 用 entrypoints 字段快速了解模块对外能力
40
- 6. 查看进行中的变更:\`ls .sillyspec/changes/ | grep -v archive\`
40
+ 6. 查看进行中的变更:\`ls {SPEC_ROOT}/changes/ | grep -v archive\`
41
41
  - 有相关同名变更 → 提示用户,避免重复
42
42
  7. 检查全局模板:\`ls ~/.sillyspec/templates/\`
43
43
  - 有匹配模板 → 询问是否基于模板
@@ -132,9 +132,9 @@ export const definition = {
132
132
  - 代码冲突:用户描述与现有代码/scan/module 文档不一致
133
133
 
134
134
  **能通过代码或文档确认的不要问用户,先读取**:
135
- - \`.sillyspec/docs/<project>/scan/ARCHITECTURE.md\`
136
- - \`.sillyspec/docs/<project>/scan/CONVENTIONS.md\`
137
- - \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
135
+ - \`{SPEC_ROOT}/docs/<project>/scan/ARCHITECTURE.md\`
136
+ - \`{SPEC_ROOT}/docs/<project>/scan/CONVENTIONS.md\`
137
+ - \`{SPEC_ROOT}/docs/<project>/modules/_module-map.yaml\`
138
138
  - 相关源码文件
139
139
 
140
140
  **给每个未解决歧义分级**:
@@ -228,7 +228,7 @@ export const definition = {
228
228
  - 适合:有 UI 组件/布局/交互流程/状态转换/架构图
229
229
  - 不适合:纯后端逻辑/配置修改/无可视化意义
230
230
  如果适合,生成一个独立的 HTML 文件(内联 CSS + JS),保存到:
231
- \`.sillyspec/changes/<change-name>/prototype-<名称>.html\`
231
+ \`{SPEC_ROOT}/changes/<change-name>/prototype-<名称>.html\`
232
232
  - 单文件,浏览器直接打开
233
233
  - 展示关键布局结构和交互流程
234
234
  - 不需要完整功能,重点是让用户确认设计方向
@@ -309,16 +309,16 @@ design.md 第一行标题必须用中文:# 设计文档(Design)— <变更
309
309
  12. **自审**(AI 对自身设计的校验)
310
310
 
311
311
  ### 操作
312
- 1. 确认变更目录存在:\`mkdir -p .sillyspec/changes/<change-name>\`(Windows 用 \`mkdir .sillyspec\\changes\\<变更名>\` 或 PowerShell \`New-Item -ItemType Directory -Force -Path .sillyspec/changes/<change-name>\`)
312
+ 1. 确认变更目录存在:\`mkdir -p {SPEC_ROOT}/changes/<change-name>\`(Windows 用 \`mkdir {SPEC_ROOT}/changes\\<变更名>\` 或 PowerShell \`New-Item -ItemType Directory -Force -Path {SPEC_ROOT}/changes/<change-name>\`)
313
313
  - 变更名格式必须为 \`YYYY-MM-DD-<简短描述>\`(如 \`2026-05-13-user-auth\`)
314
- 2. 将确认的设计写入 \`.sillyspec/changes/<change-name>/design.md\`
315
- 3. 如果对话探索或方案讨论产生了实现相关决策,写入 \`.sillyspec/changes/<change-name>/decisions.md\`:
314
+ 2. 将确认的设计写入 \`{SPEC_ROOT}/changes/<change-name>/design.md\`
315
+ 3. 如果对话探索或方案讨论产生了实现相关决策,写入 \`{SPEC_ROOT}/changes/<change-name>/decisions.md\`:
316
316
  - decisions.md 是本次变更的决策台账,不是长期术语表
317
317
  - 只记录有实现/验收影响的决策,闲聊和低风险偏好不记录
318
318
  - 每条记录必须有稳定版本 ID:D-001@v1、D-002@v1 ...
319
319
  - 若后续 Design Grill 修正该决策,新记录使用 D-001@v2,并写明 supersedes: D-001@v1
320
320
  - 每条记录必须包含:type、status、source、question、answer、normalized_requirement、impacts、evidence、priority
321
- - 长期术语只在 archive/scan 时再提升到 \`.sillyspec/docs/<project>/glossary.md\`
321
+ - 长期术语只在 archive/scan 时再提升到 \`{SPEC_ROOT}/docs/<project>/glossary.md\`
322
322
  4. 格式自检(只查章节齐全;语义一致性/可行性/YAGNI 不在本步查,交给下一步 Design Grill 独立审查):
323
323
  - design.md 含全部必填章节(背景/设计目标/非目标/总体方案/文件变更清单/接口定义/风险登记)
324
324
  - 如存在 decisions.md,design.md 是否引用所有当前版本 D-xxx@vN
@@ -358,12 +358,12 @@ tier: {REVIEW_TIER}({REVIEW_TIER_REASON})
358
358
  3. 即使跳过,也要输出"Design Grill skipped"和原因,不能静默跳过。
359
359
 
360
360
  ### 输入材料
361
- 1. 必须读取完整 \`.sillyspec/changes/<change-name>/design.md\`
361
+ 1. 必须读取完整 \`{SPEC_ROOT}/changes/<change-name>/design.md\`
362
362
  2. 读取 proposal.md、requirements.md、tasks.md、decisions.md(如存在)
363
363
  3. 读取 scan/module docs:
364
- - \`.sillyspec/docs/<project>/scan/ARCHITECTURE.md\`
365
- - \`.sillyspec/docs/<project>/scan/CONVENTIONS.md\`
366
- - \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
364
+ - \`{SPEC_ROOT}/docs/<project>/scan/ARCHITECTURE.md\`
365
+ - \`{SPEC_ROOT}/docs/<project>/scan/CONVENTIONS.md\`
366
+ - \`{SPEC_ROOT}/docs/<project>/modules/_module-map.yaml\`
367
367
  - 命中的模块文档
368
368
  4. 按 design.md 文件变更清单读取相关源码、测试、配置、schema 或样例数据;矛盾经常藏在设计与外部约束交叉处,素材宁可多读,不要只读摘要。
369
369
 
@@ -453,9 +453,9 @@ status: passed | needs-user-input | blocked | skipped
453
453
  1. 展示 design.md 摘要 + **规模评估结果(small/large + 一句依据)** 给用户
454
454
  2. 暂停等待用户选择:✅ 确认 / ✏️ 修改 / ❌ 推翻重来
455
455
  3. 确认后,**按规模生成规范文件**:
456
- - **scale=large**:在 \`.sillyspec/changes/<change-name>/\` 下生成完整四件套(design.md / decisions.md 可选 / proposal.md / requirements.md / tasks.md),实现路径 → \`sillyspec run plan --change <变更名>\`
456
+ - **scale=large**:在 \`{SPEC_ROOT}/changes/<change-name>/\` 下生成完整四件套(design.md / decisions.md 可选 / proposal.md / requirements.md / tasks.md),实现路径 → \`sillyspec run plan --change <变更名>\`
457
457
  - **scale=small**:只生成/补全 design.md(proposal/requirements/tasks 对 quick 无用,不生成),实现路径 → \`sillyspec run quick --linked-changes <变更名>\`
458
- - 两种规模都执行 \`git add .sillyspec/\` — 暂存规范文件(不要 commit)
458
+ - 两种规模都执行 \`git add .sillyspec/\` — 暂存规范文件(不要 commit,由用户通过统一提交工具处理)。**平台模式跳过 git add**(specRoot 不在 sourceRoot 的 git repo 内)
459
459
 
460
460
  所有规范文件头部必须包含 YAML frontmatter:
461
461
  \`\`\`yaml
@@ -538,13 +538,13 @@ Then 期望结果
538
538
  ### 后续变更包处理
539
539
  如果 MASTER.md 中规划了后续变更包(拆分后的子阶段),**必须同时为每个后续包创建独立变更目录**:
540
540
  1. 读取 MASTER.md 中的变更包列表(包名 + 边界描述)
541
- 2. 为每个后续包创建目录:\`mkdir -p .sillyspec/changes/<后续包名>\`
541
+ 2. 为每个后续包创建目录:\`mkdir -p {SPEC_ROOT}/changes/<后续包名>\`
542
542
  3. 每个目录生成骨架文件:
543
543
  - \`proposal.md\`:从 MASTER.md 中提取该包的动机和边界
544
544
  - \`design.md\`:从 MASTER.md 中提取该包的职责描述(标记为「待设计 - 本包 design 在该包进入 brainstorm 时完善」)
545
545
  - \`requirements.md\`:从 MASTER.md 中提取该包的需求范围(标记为「待完善」)
546
546
  - \`tasks.md\`:创建空任务列表,标记为「待 plan 阶段展开」
547
- 4. \`git add .sillyspec/\` — 暂存所有新增文件(不要 commit)
547
+ 4. \`git add .sillyspec/\` — 暂存所有新增文件(不要 commit,由用户通过统一提交工具处理)。**平台模式跳过 git add**(specRoot 不在 sourceRoot 的 git repo 内)
548
548
  5. 后续变更包的骨架文件同样必须包含 \`author: <git-user>\` 和 \`created_at: <now-datetime>\`
549
549
 
550
550
  ### 铁律 — 必须等待用户最终确认
@@ -94,7 +94,7 @@ const stepClassify = {
94
94
  - 如果发现 superseded 决策,只引用最新版本,不引用旧版本
95
95
  5. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
96
96
  6. 读取 local.yaml 获取构建/测试命令
97
- 7. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过)
97
+ 7. 读取 \`{SPEC_ROOT}/docs/<project>/modules/_module-map.yaml\`(不存在则跳过)
98
98
  - 根据 design.md 的文件变更清单匹配模块
99
99
  - 读取匹配到的模块文档
100
100
  - 利用模块依赖关系辅助分析(depends_on / used_by)
@@ -314,7 +314,7 @@ full 计划的约束:
314
314
  2. 读取 design.md 获取文件变更清单
315
315
  3. 读取上一步的 plan_level 分类结果
316
316
  4. 按对应级别模板生成内容
317
- 5. 保存到变更目录下的 plan.md(路径格式:\`.sillyspec/changes/<change-name>/plan.md\`,其中 <change-name> 是变更目录名,直接使用,不加子目录。正确路径示例:\`.sillyspec/changes/2026-05-28-agent-log-streaming/plan.md\`)
317
+ 5. 保存到变更目录下的 plan.md(路径格式:\`{SPEC_ROOT}/changes/<change-name>/plan.md\`,其中 <change-name> 是变更目录名,直接使用,不加子目录。正确路径示例:\`{SPEC_ROOT}/changes/2026-05-28-agent-log-streaming/plan.md\`)
318
318
  **plan_level 为 none 时生成最小 plan.md(占位),不生成完整蓝图。**
319
319
 
320
320
  ---