@zhuan-ai/zhuanspec 2.16.0 → 2.16.2
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/dist/cli/index.js +17 -0
- package/dist/commands/progress.d.ts +12 -0
- package/dist/commands/progress.js +43 -2
- package/dist/core/corrections/select-candidates.d.ts +58 -0
- package/dist/core/corrections/select-candidates.js +357 -0
- package/dist/core/hooks/collect-knowledge.js +14 -5
- package/dist/core/hooks/post-archive.js +25 -13
- package/dist/core/hooks/record-progress.d.ts +1 -0
- package/dist/core/hooks/record-progress.js +16 -0
- package/dist/core/hooks/summarize.js +18 -19
- package/dist/core/init.d.ts +5 -0
- package/dist/core/init.js +165 -7
- package/dist/core/templates/agents-template.d.ts +1 -1
- package/dist/core/templates/agents-template.js +6 -21
- package/dist/core/templates/slash-command-templates.js +72 -46
- package/dist/utils/phase-utils.js +5 -0
- package/package.json +22 -20
|
@@ -2,9 +2,9 @@ const baseGuardrails = `**约束条件**
|
|
|
2
2
|
- **语言要求**:必须使用中文回答所有问题和输出所有内容(All responses MUST be in Chinese)。
|
|
3
3
|
- 优先采用简单、最小化的实现,仅在请求或明确需要时添加复杂性。
|
|
4
4
|
- 将更改严格限制在请求的结果范围内。
|
|
5
|
-
-
|
|
5
|
+
- **工作区边界(强制)**:查找文档、检索工程代码、执行 grep/glob/ls 时,范围必须限定在当前 ZhuanSpec 工作区内。禁止使用 \`../**\`、上级目录绝对路径或手动拼接到工作区外路径。Glob 返回相对路径时,必须以本次工具调用的 \`path\` 参数作为基准拼接绝对路径,不得误解为当前目录或上级目录。
|
|
6
6
|
- **知识库参考**:开始任何阶段前,先检查 \`zhuanspec/knowledge/\` 目录。使用 \`rg "[关键词]" zhuanspec/knowledge/\` 搜索相关陷阱和最佳实践,避免重复踩坑。阅读 \`zhuanspec/knowledge/index.md\` 了解项目级知识摘要。
|
|
7
|
-
-
|
|
7
|
+
- **工程代码检索顺序**:凡是需要检索工程代码、配置类、数据模型类或关键实现位置时,必须先调用 \`@skill:load-project-knowledge\` 进行渐进式加载,使用返回的 search_priority 限定检索范围,按优先路径定位代码。仅当 Skill 无匹配结果时,才回退到 \`grep/glob/ls\`。
|
|
8
8
|
- 如果需要额外的 ZhuanSpec 约定或澄清,请参考 \`zhuanspec/AGENTS.md\`(位于 \`zhuanspec/\` 目录内 - 如果看不到,请运行 \`ls zhuanspec\` 或 \`zhuanspec update\`)。`;
|
|
9
9
|
const proposalGuardrails = `${baseGuardrails}\n- **强制澄清要求**:在创建任何提案文件之前,必须首先分析用户请求,识别所有不确定或模糊的方面(范围、技术选择、优先级、验收标准等)。如果发现任何模糊之处,必须停止并使用**选项式交互**(如 \`AskQuestion\` 工具)提问,获得明确答复后才能继续。严禁在不确定的情况下自行推测、假设或创建提案。严禁要求用户手动输入大段文字来回答澄清问题。
|
|
10
10
|
- 识别任何模糊或歧义的细节,使用带预设选项的选择题在编辑文件之前询问必要的后续问题。
|
|
@@ -66,13 +66,7 @@ const proposalSteps = `**步骤**
|
|
|
66
66
|
* 获取:matched_services(涉及的服务列表)、search_priority(检索优先路径)、architecture_constraints(架构约束)
|
|
67
67
|
* 使用:后续代码定位使用 search_priority 限定范围,方案设计检查 architecture_constraints
|
|
68
68
|
- 审查 \`zhuanspec/project.md\`,运行 \`zhuanspec list\` 和 \`zhuanspec list --specs\`
|
|
69
|
-
-
|
|
70
|
-
* 若存在,先阅读对应服务目录下的 \`[service]/.llm-wiki/index.md\`
|
|
71
|
-
* \`llmwiki query -e --token <token> "[关键词]"\` 中的 \`<token>\` 必须来自对应服务的 \`[service]/.llm-wiki/index.md\`
|
|
72
|
-
* 功能/实现定位优先使用 \`llmwiki query -e --token <token> "[关键词]"\`
|
|
73
|
-
* 每次执行 \`llmwiki query\` 后,必须判断查询结果是否与当前请求诉求匹配,并将关键词、服务、匹配/不匹配结论、简要原因记录到对应服务的 \`[service]/.llm-wiki/result.log\`
|
|
74
|
-
* 配置类、数据模型类、配置项归属优先使用 \`llmwiki knowledge points "[关键词]"\`
|
|
75
|
-
- 检查相关代码或文档时,优先使用 llmwiki 的结果缩小范围;仅当对应服务的 \`.llm-wiki/\` 不存在、llmwiki 无结果、结果与当前请求诉求不匹配、或结果明显偏差时,才通过 \`rg\`/\`ls\`/\`glob\` 兜底;注意任何需要澄清的空白。
|
|
69
|
+
- **工程代码检索**:使用 \`@skill:load-project-knowledge\` 返回的 search_priority 限定检索范围,按优先路径定位代码;仅当 Skill 无匹配结果时,才通过 \`rg\`/\`ls\`/\`glob\` 兆底。
|
|
76
70
|
- **TechDesign 目录识别**:
|
|
77
71
|
* 扫描 changes/ 目录下的所有变更
|
|
78
72
|
* 检查每个变更的 metrics/progress.json 的 phase 字段
|
|
@@ -428,7 +422,7 @@ const proposalSteps = `**步骤**
|
|
|
428
422
|
const proposalReferences = `**参考**
|
|
429
423
|
- 当验证失败时,使用 \`zhuanspec show <id> --json --deltas-only\` 或 \`zhuanspec show <spec> --type spec\` 检查详细信息。
|
|
430
424
|
- 在编写新要求之前,使用 \`rg -n "Requirement:|Scenario:" zhuanspec/specs\` 搜索现有要求。
|
|
431
|
-
-
|
|
425
|
+
- 探索代码库时,先调用 \`@skill:load-project-knowledge\` 进行渐进式加载,使用返回的 search_priority 限定检索范围,按优先路径定位代码。仅当 Skill 无匹配结果时,再使用 \`rg <keyword>\`、\`ls\` 或直接文件读取。`;
|
|
432
426
|
const applySteps = `**步骤**
|
|
433
427
|
将这些步骤作为待办事项跟踪,逐一完成。
|
|
434
428
|
1. **检查知识库并确认 Phase**:
|
|
@@ -699,12 +693,15 @@ const archiveSteps = `**前置检查**:
|
|
|
699
693
|
- \`progress.phaseDurations\` 必须关闭 review 段并开启 archive 段
|
|
700
694
|
2. 通过运行 \`zhuanspec list\`(或 \`zhuanspec show <id>\`)验证变更 ID,如果变更缺失、已归档或尚未准备好归档,则停止。
|
|
701
695
|
3. **验证 Review 门禁**:确认上述五个结果文件存在且全部通过(含轨道 4 的 \`closure-check-result.json\`)。
|
|
702
|
-
4.
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
7. **知识沉淀(手动补充)**:调用 \`@skill:zhuanspec:knowledge\` skill 从本次会话记忆中补充知识。
|
|
696
|
+
4. **知识沉淀(手动补充,必须前置)**:调用 \`@skill:zhuanspec:knowledge\` skill(模式 A)从本次会话记忆中补充知识。
|
|
697
|
+
- 🔴 **红线(顺序不可调整)**:本步骤**必须**在执行 \`zhuanspec archive <id>\` 之前完成。\`zhuanspec archive\` 命令内部会按顺序执行 \`postArchiveHook\`(自动结构化提取) → \`pushArchiveResultToRemote\`(一次性同步 specs / archive / knowledge 三目录到远端);如果把手动沉淀放在 archive 命令之后,新写入的 knowledge 文件**仅落本地**,不会被推送到远端模板仓库,团队其他成员将看不到。
|
|
698
|
+
- 🔴 **禁止 AI 自行决定沉淀内容**:必须严格按 zhuanspec:knowledge skill 模式 A 步骤 4 执行——先列候选清单,再调用 \`askUserQuestion\` 让用户多选确认,再写入。禁止默认全沉淀,禁止跳过询问。
|
|
706
699
|
- CLI 已自动从变更目录提取结构化知识(design.md/proposal.md/tasks.md 中的决策、注意事项等)
|
|
707
700
|
- AI 需从会话记忆补充无法自动提取的内容(如对话中发现的隐式约定、调试陷阱等)
|
|
701
|
+
- 用户选择「跳过本次沉淀」时,本步骤可不写入任何文件,但仍需经过显式确认环节,禁止默认跳过。
|
|
702
|
+
5. 运行 \`zhuanspec archive <id> --yes\`,以便 CLI 移动变更并应用规范更新,无需提示(仅对仅工具类工作使用 \`--skip-specs\`)。**该命令将自动 push specs / archive / knowledge 三目录到远端**,因此必须在步骤 4 完成知识沉淀后才执行。
|
|
703
|
+
6. 审查命令输出以确认目标规范已更新,并且变更已进入 \`changes/archive/\`,且 "推送到远端" 段输出 \`✅ 已推送归档结果到远端\`(如使用 \`--skip-specs\` 则跳过推送)。
|
|
704
|
+
7. 使用 \`zhuanspec validate --strict\` 进行验证,如果看起来有问题,使用 \`zhuanspec show <id>\` 进行检查。
|
|
708
705
|
8. **会话分析**:调用 \`@skill:session-analytics\` skill 分析本次会话的指标数据(工具调用、Token消耗、时长等)。
|
|
709
706
|
9. **输出反馈链接**:告知用户填写使用反馈:
|
|
710
707
|
📋 https://doc.weixin.qq.com/forms/AJ4AfQfgAAwACwAAwaVABsCNqDXIKn8sf`;
|
|
@@ -712,8 +709,8 @@ const archiveReferences = `**参考**
|
|
|
712
709
|
- 在归档之前使用 \`zhuanspec list\` 确认变更 ID。
|
|
713
710
|
- 使用 \`zhuanspec list --specs\` 检查刷新的规范,并在移交之前解决任何验证问题。
|
|
714
711
|
- 知识提取分工:
|
|
715
|
-
- **CLI
|
|
716
|
-
- **AI
|
|
712
|
+
- **CLI 自动**(archive 命令内):归档时从变更目录(proposal.md/tasks.md/design.md/specs/*.md)正则提取结构化知识,写入本地 \`zhuanspec/knowledge/\`,随后由同一条 archive 命令一并 push 到远端
|
|
713
|
+
- **AI 手动**(archive 命令前):调用 \`zhuanspec:knowledge\` skill 从会话记忆补充隐式约定、调试发现等。**必须在 \`zhuanspec archive\` 命令之前**调用,否则补充内容仅落本地、不会进入远端推送
|
|
717
714
|
- 会话分析 (\`session-analytics\`):记录本次会话的效率指标,用于改进工作流。`;
|
|
718
715
|
const designGuardrails = `${baseGuardrails}\n- **独立设计阶段**:techDesign 命令用于在 proposal 之前生成技术设计请求文档,不依赖变更提案。设计文档可作为后续提案的输入。
|
|
719
716
|
- **需求澄清优先**:在生成设计请求前,必须确认需求来源(大神页面、需求描述文本等)。
|
|
@@ -868,26 +865,33 @@ const reviewGuardrails = `${baseGuardrails}\n- **门禁审查阶段**:review
|
|
|
868
865
|
const reviewSteps = `**步骤**
|
|
869
866
|
0. **⚠️ 纠偏沉淀优先检查(Phase 切换前强制执行)**:
|
|
870
867
|
- **计数源(两级 fallback,新→旧)**:
|
|
871
|
-
- Level 1:读 \`zhuanspec/changes/<change-id>/metrics/user_inputs.json\`,筛选 \`correctionSignal.kind === 'hard' && postBaseline === true
|
|
868
|
+
- Level 1:读 \`zhuanspec/changes/<change-id>/metrics/user_inputs.json\`,筛选 \`correctionSignal.kind === 'hard' && postBaseline === true\` 的条目作为纠偏明细
|
|
872
869
|
- Level 2:\`user_inputs.json\` 存在但条目缺 \`correctionSignal\` → 按 \`inputs[*].summary\` 关键词扫描推断
|
|
873
870
|
- **同时读** \`zhuanspec/changes/<change-id>/metrics/progress.json\`,检查:
|
|
874
871
|
- 上述任一 Level 得到的纠偏条目数 N 是否 > 0
|
|
875
872
|
- \`askedPitfallSaved\` 字段是否为 \`true\`
|
|
876
873
|
- **如果满足条件(N > 0 且 askedPitfallSaved !== true)**:
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
874
|
+
1. **先生成决策清单(必须)**:运行
|
|
875
|
+
\`\`\`bash
|
|
876
|
+
zhuanspec progress list-corrections <change-id>
|
|
877
|
+
\`\`\`
|
|
878
|
+
CLI 会完成:读 user_inputs.json → 过滤 trivial 确认词(如“是的/好的/ok”)→ 去重(完全重复 + 子串包含)→ 启发式分类 → 写到 \`zhuanspec/changes/<change-id>/review/pending-corrections.md\`。并在 stdout 输出 **合计 / 有效 / 过滤** 三个计数。
|
|
879
|
+
2. **调用 \`AskUserQuestion\`(三选项,禁止默认)**:
|
|
880
|
+
\`\`\`
|
|
881
|
+
header: "踩坑沉淀"
|
|
882
|
+
question: "本轮有 M 条有效纠偏候选(已过滤 trivial / 去重,详见 review/pending-corrections.md),请选择沉淀范围:"
|
|
883
|
+
选项 1:"全部沉淀"
|
|
884
|
+
选项 2:"选择性沉淀(请回复编号清单,例如 1,3,5)"
|
|
885
|
+
选项 3:"跳过"
|
|
886
|
+
\`\`\`
|
|
887
|
+
🔴 **红线**:禁止跳过本次询问;禁止仅根据最近 N 条摘要就起心动念、绕过清单文件。
|
|
888
|
+
3. **用户选择 "全部沉淀" 或 "选择性沉淀"**:
|
|
889
|
+
- 必须调用 \`@skill:zhuanspec:knowledge --mode=correction --correction <change-id>\`(或 \`/zhuanspec:knowledge\` 交互模式 B)来完成沉淀。
|
|
890
|
+
- 选择性沉淀时,把用户回复的编号清单以 \`--include <编号串>\` 形式透传给 skill(例:\`--include 1,3,5\`),或在 skill 交互中照实转述编号。skill 必须以 \`pending-corrections.md\` 作为商定范围的单一源,禁止从会话记忆里“发挥”额外条目。
|
|
891
|
+
- skill 完成后会自动运行 \`zhuanspec progress resolve-correction <change-id> --mark-pitfall-saved\`。
|
|
892
|
+
🔴 **红线**:禁止主 agent 自行使用 Write/Edit 创建 \`zhuanspec/knowledge/\` 下的任何文件;禁止自行判定分类或文件名格式;禁止新建 \`decisions/\` 或三类目录以外的分类。
|
|
893
|
+
4. **用户选择 "跳过"**:运行 \`zhuanspec progress resolve-correction <change-id> --mark-pitfall-saved\` 标记已处理,不写入任何知识文件。
|
|
894
|
+
- **如果不满足条件(无纠偏或已沉淀)**:直接进入下一步。
|
|
891
895
|
|
|
892
896
|
1. **切换 Phase 到 review(第一步,必须立即执行)**:
|
|
893
897
|
- 如果此提示已包含特定的变更 ID,请使用该值;否则运行 \`zhuanspec list\` 显示活跃变更并询问用户要审查哪个
|
|
@@ -1061,12 +1065,34 @@ const knowledgeSteps = `**步骤**
|
|
|
1061
1065
|
3. **搜索**:
|
|
1062
1066
|
- \`rg "<关键词>" zhuanspec/knowledge/\`
|
|
1063
1067
|
- 结合 \`index.md\` 关键词段快速锁定
|
|
1064
|
-
4.
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
+
4. **从会话添加(强制:先列候选 → 用户确认 → 再写入)**:
|
|
1069
|
+
|
|
1070
|
+
🔴 **红线**:禁止 AI 自行判断 "哪些内容值得沉淀" 后直接 Write/Edit。必须严格走完 4.1 → 4.2 → 4.3 → 4.4 四个子步骤,缺一不可。
|
|
1071
|
+
|
|
1072
|
+
**4.1 列候选清单(不写入任何文件)**:
|
|
1073
|
+
基于本次会话记忆,按【分类决策树】先列出所有 "待沉淀候选条目",每条必须包含:
|
|
1074
|
+
- 序号(1、 2、 3 …)
|
|
1075
|
+
- 候选标题(≤ 30 字)
|
|
1076
|
+
- 命中分类(\`troubleshooting\` / \`best-practices\` / \`implicit-conventions\`)
|
|
1077
|
+
- 一句话理由(来自会话哪段对话 / 哪个修复 / 哪条纠偏)
|
|
1078
|
+
- 拟用文件名(\`<YYYYMMDD>-<kebab-slug>.md\`)
|
|
1079
|
+
- 重复检查结果:先对主关键词执行 \`rg "<主关键词>" zhuanspec/knowledge/<category>/\`,命中需展示对应文件路径与拟采取动作(追加章节 vs 新建文件)
|
|
1080
|
+
|
|
1081
|
+
**4.2 调用 \`askUserQuestion\` 让用户决策(必须多选,禁止默认)**:
|
|
1082
|
+
- 选项 A:全部沉淀
|
|
1083
|
+
- 选项 B:选择性沉淀(用户回复编号清单,例如 \`1,3,5\`)
|
|
1084
|
+
- 选项 C:跳过本次沉淀
|
|
1085
|
+
- 🔴 **红线**:禁止「默认全沉淀」,禁止「跳过此询问」,禁止「合并多条后一次性写入」。askUserQuestion 未调用前不得启动任何 Write/Edit/MultiEdit 操作。
|
|
1086
|
+
|
|
1087
|
+
**4.3 按用户决策写入**:
|
|
1088
|
+
- 用户未选中的条目一律不写入,不生成任何文件
|
|
1089
|
+
- 命中重复的:在已有文件追加 \`## 追加:<日期>\` 章节,不新建文件
|
|
1090
|
+
- 新条目:新建 \`zhuanspec/knowledge/<category>/<YYYYMMDD>-<kebab-slug>.md\`,严格套用上面的 Front Matter 模板
|
|
1068
1091
|
- **同步更新** \`zhuanspec/knowledge/index.md\`:在对应分区(\`## Troubleshooting\` / \`## Best Practices\` / \`## Implicit Conventions\`)追加一行 \`- [<标题>](<category>/<文件名>) — <关键词摘要>\`
|
|
1069
1092
|
|
|
1093
|
+
**4.4 输出摘要**:
|
|
1094
|
+
列出本轮新建 / 追加 / 被跳过的候选编号与路径,供用户复核。
|
|
1095
|
+
|
|
1070
1096
|
---
|
|
1071
1097
|
|
|
1072
1098
|
## 模式 B:纠偏沉淀(Apply 阶段收尾 / Review 步骤 0 / PostToolUse 触发)
|
|
@@ -1075,15 +1101,14 @@ const knowledgeSteps = `**步骤**
|
|
|
1075
1101
|
- 优先使用入参 \`--correction <change-id>\`
|
|
1076
1102
|
- 否则读取 \`zhuanspec/changes/*/metrics/progress.json\`,定位 \`corrections.length > 0 && askedPitfallSaved !== true\` 的 change-id
|
|
1077
1103
|
- 同时存在多个时,调用 \`askUserQuestion\` 让用户二选一,严禁随意选择
|
|
1078
|
-
2.
|
|
1079
|
-
-
|
|
1080
|
-
-
|
|
1081
|
-
|
|
1082
|
-
3
|
|
1083
|
-
-
|
|
1084
|
-
-
|
|
1085
|
-
|
|
1086
|
-
4. **逐条分类**:对每条 correction 走上面的「分类决策树」,得到 \`<category>\`。
|
|
1104
|
+
2. **以 pending-corrections.md 为起点(商定范围的唯一源)**:
|
|
1105
|
+
- 检查文件是否存在:\`zhuanspec/changes/<change-id>/review/pending-corrections.md\`。不存在则运行 \`zhuanspec progress list-corrections <change-id>\` 生成(CLI 已含 trivial 过滤 + 去重)。
|
|
1106
|
+
- 清单已明确标出:有效候选编号 / 拟分类 / 拟用文件名 / 已过滤明细(trivial / 过短 / 重复 / 子串包含)。**模式 B 只从这份清单里取候选**,禁止从会话记忆里“发挥”额外条目。
|
|
1107
|
+
3. **范围决策(跟随 review 步骤 0 的三选项)**:
|
|
1108
|
+
- 接收入参 \`--include <编号串>\`(如 \`--include 1,3,5\`)表示选择性沉淀;未传则默认 = 全部有效候选。
|
|
1109
|
+
- 若未提供且不是从 review 步骤 0 / Stop hook 走进来,调 \`askUserQuestion\` 让用户三选一:\`全部沉淀 / 选择性沉淀(回复编号串) / 跳过\`。
|
|
1110
|
+
- 选择“跳过”时,直接跳到步骤 7 只做 resolve-correction --mark-pitfall-saved,不写入任何文件。
|
|
1111
|
+
4. **逐条分类**:对选中的每条候选走上面的「分类决策树」,可参考清单里的「拟分类」作为起点,但决策树优先级更高。
|
|
1087
1112
|
5. **去重扫描**:对每条(含其关键词)先执行 \`rg "<主关键词>" zhuanspec/knowledge/<category>/\`:
|
|
1088
1113
|
- 命中相似条目 → 在已有文件追加 \`## 追加:<日期> — <change-id>\` 章节
|
|
1089
1114
|
- 未命中 → 新建 \`zhuanspec/knowledge/<category>/<YYYYMMDD>-<kebab-slug>.md\`
|
|
@@ -1092,10 +1117,10 @@ const knowledgeSteps = `**步骤**
|
|
|
1092
1117
|
- \`**来源变更**\` 字段固定写 \`<change-id>\`
|
|
1093
1118
|
- \`## 背景\` / \`## 问题 / 经验\` / \`## 解决方案 / 建议\` 必须基于 user_inputs.json 的 fullPrompt / summary 与当次会话上下文还原,**禁止编造**
|
|
1094
1119
|
- 同步更新 \`zhuanspec/knowledge/index.md\` 对应分区
|
|
1095
|
-
7. **标记已处理(强制收尾,无论步骤 3
|
|
1120
|
+
7. **标记已处理(强制收尾,无论步骤 3 用户选什么)**:
|
|
1096
1121
|
- 运行 \`zhuanspec progress resolve-correction <change-id> --mark-pitfall-saved\`
|
|
1097
1122
|
- 确认 \`progress.json.askedPitfallSaved === true\`,避免下次 Stop hook 重复询问
|
|
1098
|
-
8. **输出摘要**:列出本轮新建 /
|
|
1123
|
+
8. **输出摘要**:列出本轮新建 / 追加 / 被跳过的知识文件路径 + index.md 更新行;报告 \`<change-id>\` 的纠偏沉淀已完成。
|
|
1099
1124
|
|
|
1100
1125
|
---
|
|
1101
1126
|
|
|
@@ -1103,6 +1128,7 @@ const knowledgeSteps = `**步骤**
|
|
|
1103
1128
|
- 所有写入 knowledge 目录的动作只能经本 skill 完成;禁止主 agent 或其他流程自行 Write。
|
|
1104
1129
|
- 只能写入三类目录之一,禁止新建 decisions/。
|
|
1105
1130
|
- 文件名、Front Matter、index.md 更新三者缺一不可。
|
|
1131
|
+
- **模式 A 写入前必须走完「列候选(4.1) + askUserQuestion 多选确认(4.2)」双步骤**;禁止 AI 自行判断「哪些内容值得沉淀」后直接写入,禁止默认全沉淀,禁止跳过询问环节。
|
|
1106
1132
|
- 模式 B 必须以 \`resolve-correction --mark-pitfall-saved\` 收尾。`;
|
|
1107
1133
|
const knowledgeReferences = `**参考**
|
|
1108
1134
|
- 参考样例(格式基准):项目 \`zhuanspec/knowledge/best-practices/oms-call-pattern.md\`、\`zhuanspec/knowledge/troubleshooting/20260506-apply-pitfalls.md\`、\`zhuanspec/knowledge/implicit-conventions/outbound-cis-inventory-lock.md\`
|
|
@@ -79,6 +79,7 @@ export async function setPhase(changeDir, phase) {
|
|
|
79
79
|
phaseDurations: [{
|
|
80
80
|
phase,
|
|
81
81
|
startedAt: timestamp,
|
|
82
|
+
lastUpdatedAt: timestamp,
|
|
82
83
|
durationMs: 0,
|
|
83
84
|
taskCount: 0,
|
|
84
85
|
completedTaskCount: 0,
|
|
@@ -114,6 +115,7 @@ export async function setPhase(changeDir, phase) {
|
|
|
114
115
|
phaseDurations: [{
|
|
115
116
|
phase,
|
|
116
117
|
startedAt: timestamp,
|
|
118
|
+
lastUpdatedAt: timestamp,
|
|
117
119
|
durationMs: 0,
|
|
118
120
|
taskCount: 0,
|
|
119
121
|
completedTaskCount: 0,
|
|
@@ -129,6 +131,7 @@ export async function setPhase(changeDir, phase) {
|
|
|
129
131
|
progress.phaseDurations.push({
|
|
130
132
|
phase,
|
|
131
133
|
startedAt: timestamp,
|
|
134
|
+
lastUpdatedAt: timestamp,
|
|
132
135
|
durationMs: 0,
|
|
133
136
|
taskCount: 0,
|
|
134
137
|
completedTaskCount: 0,
|
|
@@ -145,6 +148,7 @@ export async function setPhase(changeDir, phase) {
|
|
|
145
148
|
const prevPhaseDuration = progress.phaseDurations.find(pd => pd.phase === previousPhase && !pd.endedAt);
|
|
146
149
|
if (prevPhaseDuration) {
|
|
147
150
|
prevPhaseDuration.endedAt = timestamp;
|
|
151
|
+
prevPhaseDuration.lastUpdatedAt = timestamp;
|
|
148
152
|
const startTime = new Date(prevPhaseDuration.startedAt).getTime();
|
|
149
153
|
const endTime = new Date(timestamp).getTime();
|
|
150
154
|
prevPhaseDuration.durationMs = endTime > startTime ? endTime - startTime : 0;
|
|
@@ -153,6 +157,7 @@ export async function setPhase(changeDir, phase) {
|
|
|
153
157
|
progress.phaseDurations.push({
|
|
154
158
|
phase,
|
|
155
159
|
startedAt: timestamp,
|
|
160
|
+
lastUpdatedAt: timestamp,
|
|
156
161
|
durationMs: 0,
|
|
157
162
|
taskCount: 0,
|
|
158
163
|
completedTaskCount: 0,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhuan-ai/zhuanspec",
|
|
3
|
-
"version": "2.16.
|
|
3
|
+
"version": "2.16.2",
|
|
4
4
|
"description": "AI-native system for spec-driven development",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"zhuanspec",
|
|
@@ -39,6 +39,26 @@
|
|
|
39
39
|
"!dist/**/__tests__",
|
|
40
40
|
"!dist/**/*.map"
|
|
41
41
|
],
|
|
42
|
+
"scripts": {
|
|
43
|
+
"lint": "eslint src/",
|
|
44
|
+
"build": "node build.js",
|
|
45
|
+
"dev": "tsc --watch",
|
|
46
|
+
"dev:cli": "pnpm build && node bin/zhuanspec.js",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"test:watch": "vitest",
|
|
49
|
+
"test:ui": "vitest --ui",
|
|
50
|
+
"test:coverage": "vitest --coverage",
|
|
51
|
+
"test:postinstall": "node scripts/postinstall.js",
|
|
52
|
+
"prepare": "npm run build",
|
|
53
|
+
"prepublishOnly": "npm run build",
|
|
54
|
+
"postinstall": "node scripts/postinstall.js",
|
|
55
|
+
"check:pack-version": "node scripts/pack-version-check.mjs",
|
|
56
|
+
"diagnose:cursor": "node scripts/diagnose-cursor-commands.js",
|
|
57
|
+
"release": "pnpm run release:ci",
|
|
58
|
+
"release:ci": "pnpm run check:pack-version && pnpm exec changeset publish",
|
|
59
|
+
"release:local": "pnpm exec changeset version && pnpm run check:pack-version && pnpm exec changeset publish",
|
|
60
|
+
"changeset": "changeset"
|
|
61
|
+
},
|
|
42
62
|
"engines": {
|
|
43
63
|
"node": ">=20.19.0"
|
|
44
64
|
},
|
|
@@ -60,23 +80,5 @@
|
|
|
60
80
|
"ora": "^8.2.0",
|
|
61
81
|
"yaml": "^2.8.2",
|
|
62
82
|
"zod": "^4.0.17"
|
|
63
|
-
},
|
|
64
|
-
"scripts": {
|
|
65
|
-
"lint": "eslint src/",
|
|
66
|
-
"build": "node build.js",
|
|
67
|
-
"dev": "tsc --watch",
|
|
68
|
-
"dev:cli": "pnpm build && node bin/zhuanspec.js",
|
|
69
|
-
"test": "vitest run",
|
|
70
|
-
"test:watch": "vitest",
|
|
71
|
-
"test:ui": "vitest --ui",
|
|
72
|
-
"test:coverage": "vitest --coverage",
|
|
73
|
-
"test:postinstall": "node scripts/postinstall.js",
|
|
74
|
-
"postinstall": "node scripts/postinstall.js",
|
|
75
|
-
"check:pack-version": "node scripts/pack-version-check.mjs",
|
|
76
|
-
"diagnose:cursor": "node scripts/diagnose-cursor-commands.js",
|
|
77
|
-
"release": "pnpm run release:ci",
|
|
78
|
-
"release:ci": "pnpm run check:pack-version && pnpm exec changeset publish",
|
|
79
|
-
"release:local": "pnpm exec changeset version && pnpm run check:pack-version && pnpm exec changeset publish",
|
|
80
|
-
"changeset": "changeset"
|
|
81
83
|
}
|
|
82
|
-
}
|
|
84
|
+
}
|