soloforge 1.3.2 → 1.3.4

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.
Files changed (124) hide show
  1. package/README.md +14 -0
  2. package/dist/adapters/claude_code/server.js +1 -1
  3. package/dist/adapters/claude_code/server.js.map +1 -1
  4. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  5. package/dist/adapters/claude_code/tools.js +385 -15
  6. package/dist/adapters/claude_code/tools.js.map +1 -1
  7. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  8. package/dist/adapters/shared/workflow_template.js +3 -2
  9. package/dist/adapters/shared/workflow_template.js.map +1 -1
  10. package/dist/bin/soloforge.d.ts.map +1 -1
  11. package/dist/bin/soloforge.js +296 -1
  12. package/dist/bin/soloforge.js.map +1 -1
  13. package/dist/engine/asset_manifest.d.ts.map +1 -1
  14. package/dist/engine/asset_manifest.js +24 -0
  15. package/dist/engine/asset_manifest.js.map +1 -1
  16. package/dist/engine/backend_implementation_contract.d.ts +51 -0
  17. package/dist/engine/backend_implementation_contract.d.ts.map +1 -0
  18. package/dist/engine/backend_implementation_contract.js +142 -0
  19. package/dist/engine/backend_implementation_contract.js.map +1 -0
  20. package/dist/engine/code_maintainability_observability_contract.d.ts +74 -0
  21. package/dist/engine/code_maintainability_observability_contract.d.ts.map +1 -0
  22. package/dist/engine/code_maintainability_observability_contract.js +473 -0
  23. package/dist/engine/code_maintainability_observability_contract.js.map +1 -0
  24. package/dist/engine/config_write_boundary.d.ts +29 -0
  25. package/dist/engine/config_write_boundary.d.ts.map +1 -0
  26. package/dist/engine/config_write_boundary.js +69 -0
  27. package/dist/engine/config_write_boundary.js.map +1 -0
  28. package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
  29. package/dist/engine/consumable_asset_registry.js +182 -1
  30. package/dist/engine/consumable_asset_registry.js.map +1 -1
  31. package/dist/engine/diagnostic_registry.d.ts +12 -0
  32. package/dist/engine/diagnostic_registry.d.ts.map +1 -1
  33. package/dist/engine/diagnostic_registry.js +62 -0
  34. package/dist/engine/diagnostic_registry.js.map +1 -1
  35. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
  36. package/dist/engine/dual_layer_mechanism_registry.js +318 -1
  37. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
  38. package/dist/engine/explicit_asset_registry.d.ts.map +1 -1
  39. package/dist/engine/explicit_asset_registry.js +338 -0
  40. package/dist/engine/explicit_asset_registry.js.map +1 -1
  41. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  42. package/dist/engine/implementation_roadmap_registry.js +112 -2
  43. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  44. package/dist/engine/knowledge_governance_gate.d.ts +38 -0
  45. package/dist/engine/knowledge_governance_gate.d.ts.map +1 -0
  46. package/dist/engine/knowledge_governance_gate.js +123 -0
  47. package/dist/engine/knowledge_governance_gate.js.map +1 -0
  48. package/dist/engine/log_governance.d.ts +25 -0
  49. package/dist/engine/log_governance.d.ts.map +1 -0
  50. package/dist/engine/log_governance.js +76 -0
  51. package/dist/engine/log_governance.js.map +1 -0
  52. package/dist/engine/mechanism_contract_registry.d.ts +1 -0
  53. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
  54. package/dist/engine/mechanism_contract_registry.js +172 -0
  55. package/dist/engine/mechanism_contract_registry.js.map +1 -1
  56. package/dist/engine/mechanism_health_check.d.ts +23 -0
  57. package/dist/engine/mechanism_health_check.d.ts.map +1 -0
  58. package/dist/engine/mechanism_health_check.js +140 -0
  59. package/dist/engine/mechanism_health_check.js.map +1 -0
  60. package/dist/engine/next_action_planner.d.ts +19 -0
  61. package/dist/engine/next_action_planner.d.ts.map +1 -0
  62. package/dist/engine/next_action_planner.js +453 -0
  63. package/dist/engine/next_action_planner.js.map +1 -0
  64. package/dist/engine/observability.js +1 -1
  65. package/dist/engine/observability.js.map +1 -1
  66. package/dist/engine/ood_solid_contract.d.ts +51 -0
  67. package/dist/engine/ood_solid_contract.d.ts.map +1 -0
  68. package/dist/engine/ood_solid_contract.js +115 -0
  69. package/dist/engine/ood_solid_contract.js.map +1 -0
  70. package/dist/engine/project_stage_detector.d.ts +17 -0
  71. package/dist/engine/project_stage_detector.d.ts.map +1 -0
  72. package/dist/engine/project_stage_detector.js +185 -0
  73. package/dist/engine/project_stage_detector.js.map +1 -0
  74. package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
  75. package/dist/engine/release_issue_scenario_registry.js +230 -1
  76. package/dist/engine/release_issue_scenario_registry.js.map +1 -1
  77. package/dist/engine/release_readiness_gate.d.ts +3 -0
  78. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  79. package/dist/engine/release_readiness_gate.js +407 -9
  80. package/dist/engine/release_readiness_gate.js.map +1 -1
  81. package/dist/engine/stale_current_task_detector.d.ts +30 -0
  82. package/dist/engine/stale_current_task_detector.d.ts.map +1 -0
  83. package/dist/engine/stale_current_task_detector.js +168 -0
  84. package/dist/engine/stale_current_task_detector.js.map +1 -0
  85. package/dist/engine/task_stage_detector.d.ts +19 -0
  86. package/dist/engine/task_stage_detector.d.ts.map +1 -0
  87. package/dist/engine/task_stage_detector.js +201 -0
  88. package/dist/engine/task_stage_detector.js.map +1 -0
  89. package/dist/engine/team_awareness.js +6 -6
  90. package/dist/engine/team_awareness.js.map +1 -1
  91. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
  92. package/dist/engine/tool_invocation_contract_registry.js +10 -0
  93. package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
  94. package/dist/engine/workflow_navigation_contract.d.ts +115 -0
  95. package/dist/engine/workflow_navigation_contract.d.ts.map +1 -0
  96. package/dist/engine/workflow_navigation_contract.js +39 -0
  97. package/dist/engine/workflow_navigation_contract.js.map +1 -0
  98. package/dist/types.d.ts +12 -0
  99. package/dist/types.d.ts.map +1 -1
  100. package/package.json +1 -1
  101. package/templates/knowledge/acceptance_templates/OOD/350/256/276/350/256/241/346/221/230/350/246/201/346/250/241/347/211/210.md +60 -0
  102. package/templates/knowledge/acceptance_templates//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/351/252/214/346/224/266/346/250/241/346/235/277.md +78 -0
  103. package/templates/knowledge/acceptance_templates//345/220/216/347/253/257/345/256/236/347/216/260/351/252/214/346/224/266/346/270/205/345/215/225.md +46 -0
  104. package/templates/knowledge/procedures/OOD/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +50 -0
  105. package/templates/knowledge/procedures//345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201/345/257/274/350/210/252.md +100 -0
  106. package/templates/knowledge/procedures//345/220/216/347/253/257/346/216/245/345/217/243/345/256/236/347/216/260/345/267/245/344/275/234/346/265/201.md +50 -0
  107. package/templates/knowledge/review//344/273/243/347/240/201/345/217/257/347/273/264/346/212/244/346/200/247/344/270/216/345/217/257/350/247/202/346/265/213/346/200/247/345/256/241/346/237/245.md +81 -0
  108. package/templates/knowledge/review_rules/SOLID/344/273/243/347/240/201/345/256/241/346/237/245/350/247/204/345/210/231.md +40 -0
  109. package/templates/knowledge/review_rules//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/345/256/241/346/237/245/350/247/204/345/210/231.md +38 -0
  110. package/templates/knowledge/rules/OOD/344/270/216SOLID/350/256/276/350/256/241/350/247/204/345/210/231.md +62 -0
  111. package/templates/knowledge/rules//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/345/245/221/347/272/246/350/247/204/345/210/231.md +121 -0
  112. package/templates/knowledge/rules//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/345/245/221/347/272/246/350/247/204/345/210/231.md +55 -0
  113. package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/345/257/274/350/210/252/345/245/221/347/272/246/350/247/204/345/210/231.md +113 -0
  114. package/templates/knowledge/rules//346/225/217/346/204/237/344/277/241/346/201/257/346/227/245/345/277/227/350/247/204/345/210/231.md +69 -0
  115. package/templates/knowledge/rules//346/227/245/345/277/227/346/262/273/347/220/206/350/247/204/345/210/231.md +49 -0
  116. package/templates/knowledge/rules//346/234/272/345/210/266/350/207/252/346/262/273/347/220/206/350/247/204/345/210/231.md +48 -0
  117. package/templates/knowledge/rules//346/240/207/345/207/206/350/265/204/344/272/247/350/246/206/347/233/226/350/247/204/345/210/231.md +43 -0
  118. package/templates/knowledge/rules//346/250/241/346/235/277/350/265/204/344/272/247/345/217/257/350/247/201/346/200/247/350/247/204/345/210/231.md +44 -0
  119. package/templates/knowledge/rules//347/237/245/350/257/206/346/262/273/347/220/206/350/247/204/345/210/231.md +50 -0
  120. package/templates/knowledge/rules//351/200/232/347/224/250/345/206/263/347/255/226/347/240/224/350/256/250/350/247/204/345/210/231.md +47 -0
  121. package/templates/knowledge/rules//351/205/215/347/275/256/350/220/275/347/233/230/350/276/271/347/225/214/350/247/204/345/210/231.md +47 -0
  122. package/templates/knowledge/rules//351/252/214/346/224/266/346/250/241/346/235/277/350/276/223/345/207/272/345/245/221/347/272/246/350/247/204/345/210/231.md +46 -0
  123. package/templates/patterns/SOLID/350/256/276/350/256/241/350/247/204/350/214/203.md +39 -0
  124. package/templates/patterns//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/350/247/204/350/214/203.md +39 -0
@@ -1 +1 @@
1
- {"version":3,"file":"workflow_template.d.ts","sourceRoot":"","sources":["../../../src/adapters/shared/workflow_template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA2CpD;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBzE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAQtD;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG;IAC5D,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAiCA;AASD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY9D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAsBnE"}
1
+ {"version":3,"file":"workflow_template.d.ts","sourceRoot":"","sources":["../../../src/adapters/shared/workflow_template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA4CpD;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBzE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAQtD;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG;IAC5D,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAiCA;AASD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY9D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAsBnE"}
@@ -31,7 +31,8 @@ const WORKFLOW_STEPS = [
31
31
  { title: "### 步骤 1: 分类", rule_ids: ["wf-classify-first"] },
32
32
  { title: "### 步骤 1.5: 入口裁决", rule_ids: ["wf-routing-gate", "wf-strategy-no-route"] },
33
33
  { title: "### 步骤 1.6: 多阶段拆解", rule_ids: ["wf-multi-stage-loop"] },
34
- { title: "### 步骤 2: 执行", rule_ids: ["wf-dispatch-by-route", "wf-command-contract", "wf-tool-contract", "wf-architecture-workshop-first", "wf-design-artifact-pack", "wf-standard-asset-contract", "wf-template-asset-visibility"] },
34
+ { title: "### 步骤 2: 执行", rule_ids: ["wf-dispatch-by-route", "wf-command-contract", "wf-tool-contract", "wf-architecture-workshop-first", "wf-design-artifact-pack", "wf-standard-asset-contract", "wf-template-asset-visibility", "wf-code-observability"] },
35
+ { title: "### 步骤 2.5: 导航", rule_ids: ["wf-navigation-contract"] },
35
36
  { title: "### 步骤 3: 验证", rule_ids: ["wf-verify-after-change", "wf-evidence-grounding"] },
36
37
  { title: "### 步骤 4: 学习", rule_ids: ["wf-learn-after-verify"] },
37
38
  { title: "### 步骤 5: 汇报", rule_ids: ["wf-no-auto-capability-change"] },
@@ -108,7 +109,7 @@ export function validateWorkflowRuleSources(rootDir) {
108
109
  };
109
110
  }
110
111
  /** 当前嵌入的权威规则校验和 — 由 `npm run update-workflow-checksum` 更新。 */
111
- const EMBEDDED_CHECKSUM = "a875189c510913ff";
112
+ const EMBEDDED_CHECKSUM = "96160c0b6c30ae6e";
112
113
  function getEmbeddedChecksum() {
113
114
  return EMBEDDED_CHECKSUM;
114
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workflow_template.js","sourceRoot":"","sources":["../../../src/adapters/shared/workflow_template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow_template.js","sourceRoot":"","sources":["../../../src/adapters/shared/workflow_template.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"soloforge.d.ts","sourceRoot":"","sources":["../../src/bin/soloforge.ts"],"names":[],"mappings":";AA6yBA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC"}
1
+ {"version":3,"file":"soloforge.d.ts","sourceRoot":"","sources":["../../src/bin/soloforge.ts"],"names":[],"mappings":";AAwzBA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC"}
@@ -135,6 +135,12 @@ async function main() {
135
135
  case "status":
136
136
  await cmdStatus();
137
137
  break;
138
+ case "next":
139
+ await cmdNext();
140
+ break;
141
+ case "stage":
142
+ await cmdStage();
143
+ break;
138
144
  case "cleanup":
139
145
  await cmdCleanup();
140
146
  break;
@@ -173,6 +179,11 @@ async function main() {
173
179
  config confirm <field> <value> 确认配置字段(写入 config + evidence)
174
180
  config unset <field> 移除确认配置
175
181
  status 显示当前项目的 SoloForge 状态
182
+ next 查询下一步操作和可执行工作包(默认只读)
183
+ next --json 纯 JSON 输出(无日志污染)
184
+ next --write-snapshot 将导航快照写入 .soloforge/navigation-snapshot.json
185
+ stage 显示当前项目阶段和任务阶段
186
+ stage --explain 详细解释当前阶段(判断依据、必要条件、下一阶段)
176
187
  cleanup 清理过期任务和 evidence(默认 dry-run,--apply 执行实际清理)
177
188
  `);
178
189
  }
@@ -884,6 +895,27 @@ async function cmdValidate() {
884
895
  for (const w of evidenceWarnings) {
885
896
  userInfo(`⚠️ evidence: ${w}`);
886
897
  }
898
+ // 知识治理统一入口:生命周期、语义、文档与语言策略的轻量主链路消费
899
+ try {
900
+ const { runKnowledgeGovernanceCheck } = await import("../engine/knowledge_governance_gate.js");
901
+ const kgReport = runKnowledgeGovernanceCheck({
902
+ project_language: "zh",
903
+ contents: [{ id: "cli-validate", domain: "user_feedback", content: "SoloForge 校验输出保持中文语义优先" }],
904
+ });
905
+ if (kgReport.hard_fail_count > 0) {
906
+ userInfo(`❌ 知识治理: ${kgReport.hard_fail_count} hard_fail`);
907
+ for (const f of kgReport.findings.filter((f) => f.severity === "hard_fail")) {
908
+ userInfo(` - [${f.kind}] ${f.message_zh}`);
909
+ }
910
+ hasHardFail = true;
911
+ }
912
+ else {
913
+ userInfo(`✅ 知识治理检查: ${kgReport.warning_count} warning, 0 hard_fail`);
914
+ }
915
+ }
916
+ catch (e) {
917
+ userInfo(` ⚠ 知识治理检查异常: ${e instanceof Error ? e.message : String(e)}`);
918
+ }
887
919
  // 检查知识文件
888
920
  const knowledgeDir = getProjectKnowledgeDir(config);
889
921
  if (fss.existsSync(knowledgeDir)) {
@@ -1046,6 +1078,18 @@ async function cmdValidate() {
1046
1078
  hasHardFail = true;
1047
1079
  }
1048
1080
  } // 双层机制检查结束
1081
+ try {
1082
+ const { planNextAction } = await import("../engine/next_action_planner.js");
1083
+ const navigation = await planNextAction(projectPath);
1084
+ userInfo(` 阶段: ${navigation.project_stage}${navigation.task_stage ? ` / ${navigation.task_stage}` : ""}`);
1085
+ if (navigation.blocking_reasons.length > 0) {
1086
+ userInfo(` 导航阻断: ${navigation.blocking_reasons.join("; ")}`);
1087
+ }
1088
+ userInfo(` 下一步: ${navigation.work_package?.goal_zh ?? navigation.recommended_prompt_zh}`);
1089
+ }
1090
+ catch (e) {
1091
+ userInfo(` ⚠ 导航摘要异常: ${e instanceof Error ? e.message : String(e)}`);
1092
+ }
1049
1093
  if (hasHardFail) {
1050
1094
  userError("❌ validate 失败: 配置优先级存在 hard_fail");
1051
1095
  process.exit(1);
@@ -1123,6 +1167,22 @@ async function cmdValidateMechanisms() {
1123
1167
  userError(`❌ 模板审计异常: ${e.message}`);
1124
1168
  process.exit(1);
1125
1169
  }
1170
+ try {
1171
+ const { runFullHealthCheck } = await import("../engine/mechanism_health_check.js");
1172
+ const health = runFullHealthCheck(projectPath);
1173
+ if (health.hard_fail_count > 0) {
1174
+ userInfo(`\n❌ 机制运行时健康度: ${health.hard_fail_count} hard_fail`);
1175
+ for (const f of health.findings.filter((f) => f.severity === "hard_fail")) {
1176
+ userInfo(` - [${f.kind}] ${f.target}: ${f.message_zh}`);
1177
+ }
1178
+ process.exit(1);
1179
+ }
1180
+ userInfo(`\n📊 机制运行时健康度: ${health.warning_count} warning, 0 hard_fail`);
1181
+ }
1182
+ catch (e) {
1183
+ userError(`❌ 机制运行时健康度检查异常: ${e.message}`);
1184
+ process.exit(1);
1185
+ }
1126
1186
  }
1127
1187
  catch (e) {
1128
1188
  userError(`❌ validate-mechanisms 失败: ${e.message}`);
@@ -1467,6 +1527,19 @@ async function cmdSyncTemplates() {
1467
1527
  const projectPath = process.cwd();
1468
1528
  const packageRoot = path.resolve(import.meta.dirname, "..", "..");
1469
1529
  const sourceDir = args.find((a) => a.startsWith("--source="))?.slice("--source=".length) ?? path.join(packageRoot, "templates");
1530
+ if (apply) {
1531
+ const { classifyConfigContext, validateWriteBoundary } = await import("../engine/config_write_boundary.js");
1532
+ const writeContext = classifyConfigContext(projectPath, { confirmed: confirm });
1533
+ const violations = validateWriteBoundary(writeContext, [
1534
+ path.join(projectPath, ".soloforge", "template-manifest.json"),
1535
+ path.join(projectPath, ".soloforge", "knowledge"),
1536
+ ]);
1537
+ if (violations.length > 0) {
1538
+ for (const v of violations)
1539
+ userError(`❌ 模板同步写入边界阻断: ${v.target_path} — ${v.reason_zh}`);
1540
+ process.exit(1);
1541
+ }
1542
+ }
1470
1543
  // 读取当前包版本
1471
1544
  let packageVersion = "0.0.0";
1472
1545
  try {
@@ -1521,6 +1594,21 @@ async function cmdSyncTemplates() {
1521
1594
  }
1522
1595
  }
1523
1596
  const safeCheck = validateSyncSafety(assets);
1597
+ try {
1598
+ const { runKnowledgeGovernanceCheck } = await import("../engine/knowledge_governance_gate.js");
1599
+ const kgReport = runKnowledgeGovernanceCheck({
1600
+ project_language: "zh",
1601
+ contents: sourceManifest.slice(0, 12).map((e) => ({ id: e.asset_id, domain: "governance_contracts", content: e.target_path })),
1602
+ });
1603
+ if (kgReport.hard_fail_count > 0 && apply) {
1604
+ userError(`❌ 知识治理阻断模板同步: ${kgReport.hard_fail_count} hard_fail`);
1605
+ process.exit(1);
1606
+ }
1607
+ }
1608
+ catch (e) {
1609
+ if (!isJson)
1610
+ userInfo(` ⚠ 知识治理同步检查异常: ${e instanceof Error ? e.message : String(e)}`);
1611
+ }
1524
1612
  const syncResult = executeSync({ dry_run: !apply, apply, confirm, project_path: projectPath, source_path: sourceDir }, assets, sourceManifest);
1525
1613
  // apply 模式:真实文件复制
1526
1614
  if (apply && confirm && syncResult.success && syncResult.backup_path) {
@@ -1975,8 +2063,8 @@ async function cmdValidateNewIssue() {
1975
2063
  async function cmdStatus() {
1976
2064
  debug("CLI", "执行 cmdStatus");
1977
2065
  const projectPath = resolveProjectPath();
1978
- userInfo(`SoloForge 状态: ${projectPath}`);
1979
2066
  const { config, source } = await resolveProjectConfig(projectPath);
2067
+ userInfo(`SoloForge 状态: ${projectPath}`);
1980
2068
  userInfo(` 配置来源: ${source === "config_file" ? "config.yaml" : "自动推断"}`);
1981
2069
  userInfo(` 产品: ${config.product_profile}`);
1982
2070
  userInfo(` 后端: ${config.tech_stack.backend.framework || "未配置"}`);
@@ -2029,6 +2117,19 @@ async function cmdStatus() {
2029
2117
  else {
2030
2118
  userInfo(" 知识: 未初始化");
2031
2119
  }
2120
+ // 导航摘要(消费同一规划模块,包含阻断项和下一步)
2121
+ try {
2122
+ const { planNextAction } = await import("../engine/next_action_planner.js");
2123
+ const navigation = await planNextAction(projectPath);
2124
+ userInfo(` 阶段: ${navigation.project_stage}${navigation.task_stage ? ` / ${navigation.task_stage}` : ""}`);
2125
+ if (navigation.blocking_reasons.length > 0) {
2126
+ userInfo(` 导航阻断: ${navigation.blocking_reasons.join("; ")}`);
2127
+ }
2128
+ userInfo(` 下一步: ${navigation.work_package?.goal_zh ?? navigation.recommended_prompt_zh}`);
2129
+ }
2130
+ catch (e) {
2131
+ userInfo(` ⚠ 导航摘要异常: ${e instanceof Error ? e.message : String(e)}`);
2132
+ }
2032
2133
  }
2033
2134
  async function interactiveConfig(projectPath) {
2034
2135
  debug("CLI", "执行 interactiveConfig");
@@ -2091,6 +2192,200 @@ function cmdVersion() {
2091
2192
  userInfo("SoloForge v" + pkg.version);
2092
2193
  }
2093
2194
  }
2195
+ async function cmdNext() {
2196
+ debug("CLI", "执行 cmdNext");
2197
+ const projectPath = resolveProjectPath();
2198
+ const isJson = args.includes("--json");
2199
+ const writeSnapshot = args.includes("--write-snapshot");
2200
+ const { planNextAction } = await import("../engine/next_action_planner.js");
2201
+ const plan = await planNextAction(projectPath);
2202
+ if (isJson) {
2203
+ // JSON 模式: 纯 JSON 到 stdout,无日志污染
2204
+ const wp = plan.work_package;
2205
+ const output = {
2206
+ project_stage: plan.project_stage,
2207
+ task_stage: plan.task_stage,
2208
+ confidence: plan.confidence,
2209
+ stage_evidence: plan.stage_evidence,
2210
+ blocking_reasons: plan.blocking_reasons,
2211
+ recommended_commands: plan.recommended_commands,
2212
+ recommended_prompt: plan.recommended_prompt_zh,
2213
+ disallowed_next_actions: plan.disallowed_actions.map((da) => ({
2214
+ rule_id: da.rule_id,
2215
+ blocked_actions: da.blocked_actions,
2216
+ reason_zh: da.reason_zh,
2217
+ })),
2218
+ work_package: wp ? {
2219
+ id: wp.id,
2220
+ goal: wp.goal_zh,
2221
+ input_files: wp.input_files,
2222
+ must_read: wp.must_read,
2223
+ forbidden_changes: wp.forbidden_changes,
2224
+ expected_outputs: wp.expected_outputs,
2225
+ acceptance_commands: wp.acceptance_commands,
2226
+ user_confirmation_points: wp.user_confirmation_points,
2227
+ rollback_or_fallback: wp.rollback_or_fallback,
2228
+ } : null,
2229
+ };
2230
+ process.stdout.write(JSON.stringify(output, null, 2) + "\n");
2231
+ }
2232
+ else {
2233
+ // 人类可读输出
2234
+ userInfo(`\n项目阶段: ${plan.project_stage}`);
2235
+ if (plan.task_stage) {
2236
+ userInfo(`任务阶段: ${plan.task_stage}`);
2237
+ }
2238
+ else {
2239
+ userInfo("任务阶段: 无活跃任务");
2240
+ }
2241
+ userInfo(`置信度: ${plan.confidence}`);
2242
+ if (plan.stage_evidence.length > 0) {
2243
+ userInfo(`\n判断依据:`);
2244
+ for (const ev of plan.stage_evidence) {
2245
+ userInfo(` - ${ev}`);
2246
+ }
2247
+ }
2248
+ // 陈旧任务
2249
+ if (plan.stale_task?.is_stale) {
2250
+ userInfo(`\n⚠️ 检测到陈旧任务: ${plan.stale_task.reason_zh}`);
2251
+ userInfo(` 任务 ID: ${plan.stale_task.task_id}`);
2252
+ userInfo(` 建议操作: ${plan.stale_task.suggested_resolutions.join(" / ")}`);
2253
+ userInfo(` ⚠️ 不要绕过 SoloForge 状态直接操作`);
2254
+ }
2255
+ // 阻断项
2256
+ if (plan.blocking_reasons.length > 0) {
2257
+ userInfo(`\n阻断项:`);
2258
+ for (const r of plan.blocking_reasons) {
2259
+ userInfo(` - ${r}`);
2260
+ }
2261
+ }
2262
+ // 工作包
2263
+ if (plan.work_package) {
2264
+ const wp = plan.work_package;
2265
+ userInfo(`\n下一步: ${wp.goal_zh}`);
2266
+ userInfo(` 描述: ${wp.description_zh}`);
2267
+ if (wp.tool_name) {
2268
+ userInfo(` 工具: ${wp.tool_name}`);
2269
+ }
2270
+ if (wp.must_read.length > 0) {
2271
+ userInfo(` 必读文件:`);
2272
+ for (const f of wp.must_read)
2273
+ userInfo(` - ${f}`);
2274
+ }
2275
+ if (wp.forbidden_changes.length > 0) {
2276
+ userInfo(` 禁止操作:`);
2277
+ for (const f of wp.forbidden_changes)
2278
+ userInfo(` - ${f}`);
2279
+ }
2280
+ if (wp.expected_outputs.length > 0) {
2281
+ userInfo(` 预期产出:`);
2282
+ for (const e of wp.expected_outputs)
2283
+ userInfo(` - ${e}`);
2284
+ }
2285
+ if (wp.acceptance_commands.length > 0) {
2286
+ userInfo(` 验收命令:`);
2287
+ for (const c of wp.acceptance_commands)
2288
+ userInfo(` - ${c}`);
2289
+ }
2290
+ if (wp.user_confirmation_points.length > 0) {
2291
+ userInfo(` 需用户确认:`);
2292
+ for (const u of wp.user_confirmation_points)
2293
+ userInfo(` - ${u}`);
2294
+ }
2295
+ if (wp.rollback_or_fallback.length > 0) {
2296
+ userInfo(` 失败回退:`);
2297
+ for (const r of wp.rollback_or_fallback)
2298
+ userInfo(` - ${r}`);
2299
+ }
2300
+ }
2301
+ // 推荐命令
2302
+ if (plan.recommended_commands.length > 0) {
2303
+ userInfo(`\n推荐命令:`);
2304
+ for (const c of plan.recommended_commands) {
2305
+ userInfo(` ${c}`);
2306
+ }
2307
+ }
2308
+ // 禁止动作
2309
+ if (plan.disallowed_actions.length > 0) {
2310
+ userInfo(`\n禁止动作:`);
2311
+ for (const da of plan.disallowed_actions) {
2312
+ userInfo(` [${da.rule_id}] ${da.blocked_actions.join(", ")}: ${da.reason_zh}`);
2313
+ }
2314
+ }
2315
+ // 推荐给 AI 的指令
2316
+ userInfo(`\n推荐指令: ${plan.recommended_prompt_zh}`);
2317
+ }
2318
+ // 写入快照(只在显式 --write-snapshot 时)
2319
+ if (writeSnapshot) {
2320
+ const snapshotPath = path.join(projectPath, ".soloforge", "navigation-snapshot.json");
2321
+ const snapshot = {
2322
+ plan_id: plan.plan_id,
2323
+ generated_at: plan.generated_at,
2324
+ project_stage: plan.project_stage,
2325
+ task_stage: plan.task_stage,
2326
+ current_task_id: plan.current_task_id,
2327
+ work_package: plan.work_package,
2328
+ };
2329
+ fss.mkdirSync(path.join(projectPath, ".soloforge"), { recursive: true });
2330
+ fss.writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2));
2331
+ if (!isJson) {
2332
+ userInfo(`\n导航快照已写入: ${snapshotPath}`);
2333
+ }
2334
+ }
2335
+ }
2336
+ async function cmdStage() {
2337
+ debug("CLI", "执行 cmdStage");
2338
+ const projectPath = resolveProjectPath();
2339
+ const explain = args.includes("--explain");
2340
+ const isJson = args.includes("--json");
2341
+ const { detectProjectStage, explainProjectStage } = await import("../engine/project_stage_detector.js");
2342
+ const { detectTaskStage, explainTaskStage } = await import("../engine/task_stage_detector.js");
2343
+ const projectStage = await detectProjectStage(projectPath);
2344
+ // 加载当前任务
2345
+ let taskStage = null;
2346
+ let taskId = null;
2347
+ try {
2348
+ const { TaskContextManager } = await import("../engine/task_context.js");
2349
+ const stateDir = path.join(projectPath, ".soloforge", "state");
2350
+ if (fss.existsSync(stateDir)) {
2351
+ const manager = new TaskContextManager(stateDir);
2352
+ const ctx = await manager.getCurrentTask();
2353
+ if (ctx) {
2354
+ taskStage = detectTaskStage(ctx);
2355
+ taskId = ctx.task_id;
2356
+ }
2357
+ }
2358
+ }
2359
+ catch { }
2360
+ if (isJson) {
2361
+ const projExplanation = explainProjectStage(projectStage);
2362
+ process.stdout.write(JSON.stringify({
2363
+ project: projExplanation,
2364
+ task: taskStage ? explainTaskStage(taskStage) : null,
2365
+ task_id: taskId,
2366
+ }, null, 2) + "\n");
2367
+ return;
2368
+ }
2369
+ userInfo(`\n项目阶段: ${projectStage}`);
2370
+ if (explain) {
2371
+ const projExplanation = explainProjectStage(projectStage);
2372
+ userInfo(` ${projExplanation.description_zh}`);
2373
+ userInfo(` 必要条件: ${projExplanation.required_evidence.join(", ") || "无"}`);
2374
+ userInfo(` 下一步可能: ${projExplanation.next_possible_stages.join(", ")}`);
2375
+ }
2376
+ if (taskStage) {
2377
+ userInfo(`\n任务阶段: ${taskStage} (${taskId ?? "unknown"})`);
2378
+ if (explain) {
2379
+ const taskExplanation = explainTaskStage(taskStage);
2380
+ userInfo(` ${taskExplanation.description_zh}`);
2381
+ userInfo(` 必要条件: ${taskExplanation.required_evidence.join(", ")}`);
2382
+ userInfo(` 下一步可能: ${taskExplanation.next_possible_stages.join(", ")}`);
2383
+ }
2384
+ }
2385
+ else {
2386
+ userInfo("\n当前无活跃任务");
2387
+ }
2388
+ }
2094
2389
  async function cmdCleanup() {
2095
2390
  debug("CLI", "执行 cmdCleanup");
2096
2391
  const dryRun = !args.includes("--apply");