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.
- package/README.md +14 -0
- package/dist/adapters/claude_code/server.js +1 -1
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +385 -15
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
- package/dist/adapters/shared/workflow_template.js +3 -2
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +296 -1
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/asset_manifest.d.ts.map +1 -1
- package/dist/engine/asset_manifest.js +24 -0
- package/dist/engine/asset_manifest.js.map +1 -1
- package/dist/engine/backend_implementation_contract.d.ts +51 -0
- package/dist/engine/backend_implementation_contract.d.ts.map +1 -0
- package/dist/engine/backend_implementation_contract.js +142 -0
- package/dist/engine/backend_implementation_contract.js.map +1 -0
- package/dist/engine/code_maintainability_observability_contract.d.ts +74 -0
- package/dist/engine/code_maintainability_observability_contract.d.ts.map +1 -0
- package/dist/engine/code_maintainability_observability_contract.js +473 -0
- package/dist/engine/code_maintainability_observability_contract.js.map +1 -0
- package/dist/engine/config_write_boundary.d.ts +29 -0
- package/dist/engine/config_write_boundary.d.ts.map +1 -0
- package/dist/engine/config_write_boundary.js +69 -0
- package/dist/engine/config_write_boundary.js.map +1 -0
- package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
- package/dist/engine/consumable_asset_registry.js +182 -1
- package/dist/engine/consumable_asset_registry.js.map +1 -1
- package/dist/engine/diagnostic_registry.d.ts +12 -0
- package/dist/engine/diagnostic_registry.d.ts.map +1 -1
- package/dist/engine/diagnostic_registry.js +62 -0
- package/dist/engine/diagnostic_registry.js.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.js +318 -1
- package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
- package/dist/engine/explicit_asset_registry.d.ts.map +1 -1
- package/dist/engine/explicit_asset_registry.js +338 -0
- package/dist/engine/explicit_asset_registry.js.map +1 -1
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
- package/dist/engine/implementation_roadmap_registry.js +112 -2
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/knowledge_governance_gate.d.ts +38 -0
- package/dist/engine/knowledge_governance_gate.d.ts.map +1 -0
- package/dist/engine/knowledge_governance_gate.js +123 -0
- package/dist/engine/knowledge_governance_gate.js.map +1 -0
- package/dist/engine/log_governance.d.ts +25 -0
- package/dist/engine/log_governance.d.ts.map +1 -0
- package/dist/engine/log_governance.js +76 -0
- package/dist/engine/log_governance.js.map +1 -0
- package/dist/engine/mechanism_contract_registry.d.ts +1 -0
- package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
- package/dist/engine/mechanism_contract_registry.js +172 -0
- package/dist/engine/mechanism_contract_registry.js.map +1 -1
- package/dist/engine/mechanism_health_check.d.ts +23 -0
- package/dist/engine/mechanism_health_check.d.ts.map +1 -0
- package/dist/engine/mechanism_health_check.js +140 -0
- package/dist/engine/mechanism_health_check.js.map +1 -0
- package/dist/engine/next_action_planner.d.ts +19 -0
- package/dist/engine/next_action_planner.d.ts.map +1 -0
- package/dist/engine/next_action_planner.js +453 -0
- package/dist/engine/next_action_planner.js.map +1 -0
- package/dist/engine/observability.js +1 -1
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/ood_solid_contract.d.ts +51 -0
- package/dist/engine/ood_solid_contract.d.ts.map +1 -0
- package/dist/engine/ood_solid_contract.js +115 -0
- package/dist/engine/ood_solid_contract.js.map +1 -0
- package/dist/engine/project_stage_detector.d.ts +17 -0
- package/dist/engine/project_stage_detector.d.ts.map +1 -0
- package/dist/engine/project_stage_detector.js +185 -0
- package/dist/engine/project_stage_detector.js.map +1 -0
- package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
- package/dist/engine/release_issue_scenario_registry.js +230 -1
- package/dist/engine/release_issue_scenario_registry.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts +3 -0
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +407 -9
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/stale_current_task_detector.d.ts +30 -0
- package/dist/engine/stale_current_task_detector.d.ts.map +1 -0
- package/dist/engine/stale_current_task_detector.js +168 -0
- package/dist/engine/stale_current_task_detector.js.map +1 -0
- package/dist/engine/task_stage_detector.d.ts +19 -0
- package/dist/engine/task_stage_detector.d.ts.map +1 -0
- package/dist/engine/task_stage_detector.js +201 -0
- package/dist/engine/task_stage_detector.js.map +1 -0
- package/dist/engine/team_awareness.js +6 -6
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.js +10 -0
- package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
- package/dist/engine/workflow_navigation_contract.d.ts +115 -0
- package/dist/engine/workflow_navigation_contract.d.ts.map +1 -0
- package/dist/engine/workflow_navigation_contract.js +39 -0
- package/dist/engine/workflow_navigation_contract.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- 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
- 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
- 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
- package/templates/knowledge/procedures/OOD/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +50 -0
- 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
- 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
- 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
- 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
- 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
- package/templates/knowledge/rules/OOD/344/270/216SOLID/350/256/276/350/256/241/350/247/204/345/210/231.md +62 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/templates/patterns/SOLID/350/256/276/350/256/241/350/247/204/350/214/203.md +39 -0
- 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;
|
|
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 = "
|
|
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":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,MAAM,eAAe,GAAG,oCAAoC,CAAC;AAE7D,gCAAgC;AAChC,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,IAAI,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;IAC1E,IAAI,CAAC,IAAI;QAAE,OAAO,yBAAyB,MAAM,0BAA0B,CAAC;IAC5E,OAAO,yBAAyB,IAAI,CAAC,OAAO,cAAc,IAAI,CAAC,YAAY,gBAAgB,IAAI,CAAC,kBAAkB,aAAa,IAAI,CAAC,YAAY,OAAO,CAAC;AAC1J,CAAC;AAED,wCAAwC;AACxC,SAAS,UAAU,CAAC,MAAc;IAChC,MAAM,IAAI,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,EAAE,gBAAgB,IAAI,EAAE,CAAC;IAC1C,IAAI,IAAI;QAAE,OAAO,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC;IACnC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wCAAwC;AACxC,SAAS,WAAW,CAAC,OAAiB;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,8BAA8B;AAC9B,MAAM,cAAc,GAAiD;IACnE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,0BAA0B,EAAE,wBAAwB,EAAE,oBAAoB,CAAC,EAAE;IACrG,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,mBAAmB,CAAC,EAAE;IAC1D,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,EAAE;IACpF,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC,qBAAqB,CAAC,EAAE;IACjE,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,sBAAsB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,gCAAgC,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,8BAA8B,CAAC,EAAE;
|
|
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":";
|
|
1
|
+
{"version":3,"file":"soloforge.d.ts","sourceRoot":"","sources":["../../src/bin/soloforge.ts"],"names":[],"mappings":";AAwzBA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC"}
|
package/dist/bin/soloforge.js
CHANGED
|
@@ -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");
|