soloforge 1.3.2 → 1.3.3

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 (84) hide show
  1. package/README.md +5 -0
  2. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/tools.js +287 -1
  4. package/dist/adapters/claude_code/tools.js.map +1 -1
  5. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  6. package/dist/adapters/shared/workflow_template.js +2 -1
  7. package/dist/adapters/shared/workflow_template.js.map +1 -1
  8. package/dist/bin/soloforge.d.ts.map +1 -1
  9. package/dist/bin/soloforge.js +231 -1
  10. package/dist/bin/soloforge.js.map +1 -1
  11. package/dist/engine/asset_manifest.d.ts.map +1 -1
  12. package/dist/engine/asset_manifest.js +13 -0
  13. package/dist/engine/asset_manifest.js.map +1 -1
  14. package/dist/engine/backend_implementation_contract.d.ts +51 -0
  15. package/dist/engine/backend_implementation_contract.d.ts.map +1 -0
  16. package/dist/engine/backend_implementation_contract.js +142 -0
  17. package/dist/engine/backend_implementation_contract.js.map +1 -0
  18. package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
  19. package/dist/engine/consumable_asset_registry.js +133 -0
  20. package/dist/engine/consumable_asset_registry.js.map +1 -1
  21. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
  22. package/dist/engine/dual_layer_mechanism_registry.js +124 -0
  23. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
  24. package/dist/engine/explicit_asset_registry.d.ts.map +1 -1
  25. package/dist/engine/explicit_asset_registry.js +204 -0
  26. package/dist/engine/explicit_asset_registry.js.map +1 -1
  27. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  28. package/dist/engine/implementation_roadmap_registry.js +68 -2
  29. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  30. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
  31. package/dist/engine/mechanism_contract_registry.js +68 -0
  32. package/dist/engine/mechanism_contract_registry.js.map +1 -1
  33. package/dist/engine/next_action_planner.d.ts +19 -0
  34. package/dist/engine/next_action_planner.d.ts.map +1 -0
  35. package/dist/engine/next_action_planner.js +453 -0
  36. package/dist/engine/next_action_planner.js.map +1 -0
  37. package/dist/engine/ood_solid_contract.d.ts +51 -0
  38. package/dist/engine/ood_solid_contract.d.ts.map +1 -0
  39. package/dist/engine/ood_solid_contract.js +115 -0
  40. package/dist/engine/ood_solid_contract.js.map +1 -0
  41. package/dist/engine/project_stage_detector.d.ts +17 -0
  42. package/dist/engine/project_stage_detector.d.ts.map +1 -0
  43. package/dist/engine/project_stage_detector.js +185 -0
  44. package/dist/engine/project_stage_detector.js.map +1 -0
  45. package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
  46. package/dist/engine/release_issue_scenario_registry.js +14 -1
  47. package/dist/engine/release_issue_scenario_registry.js.map +1 -1
  48. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  49. package/dist/engine/release_readiness_gate.js +149 -3
  50. package/dist/engine/release_readiness_gate.js.map +1 -1
  51. package/dist/engine/stale_current_task_detector.d.ts +30 -0
  52. package/dist/engine/stale_current_task_detector.d.ts.map +1 -0
  53. package/dist/engine/stale_current_task_detector.js +168 -0
  54. package/dist/engine/stale_current_task_detector.js.map +1 -0
  55. package/dist/engine/task_stage_detector.d.ts +19 -0
  56. package/dist/engine/task_stage_detector.d.ts.map +1 -0
  57. package/dist/engine/task_stage_detector.js +201 -0
  58. package/dist/engine/task_stage_detector.js.map +1 -0
  59. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
  60. package/dist/engine/tool_invocation_contract_registry.js +10 -0
  61. package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
  62. package/dist/engine/workflow_navigation_contract.d.ts +115 -0
  63. package/dist/engine/workflow_navigation_contract.d.ts.map +1 -0
  64. package/dist/engine/workflow_navigation_contract.js +39 -0
  65. package/dist/engine/workflow_navigation_contract.js.map +1 -0
  66. package/dist/types.d.ts +8 -0
  67. package/dist/types.d.ts.map +1 -1
  68. package/package.json +1 -1
  69. 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
  70. 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
  71. package/templates/knowledge/procedures/OOD/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +50 -0
  72. 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
  73. 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
  74. 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
  75. 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
  76. package/templates/knowledge/rules/OOD/344/270/216SOLID/350/256/276/350/256/241/350/247/204/345/210/231.md +62 -0
  77. 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
  78. 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
  79. 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
  80. 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
  81. 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
  82. 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
  83. package/templates/patterns/SOLID/350/256/276/350/256/241/350/247/204/350/214/203.md +39 -0
  84. 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
@@ -1136,13 +1136,13 @@ async function checkBatchIssueFormatConsistency(rootDir, hardFail, _info) {
1136
1136
  hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", "loadBatchIssueDetails 导出未找到", ["scripts/batch_issue_details.mjs"], "构建系统", "共享解析脚本导出不正确", "修复脚本");
1137
1137
  return;
1138
1138
  }
1139
- const expectedCounts = { 1: 19, 2: 12, 3: 9, 4: 13, 5: 6, 6: 4 };
1139
+ const expectedCounts = { 1: 19, 2: 12, 3: 9, 4: 13, 5: 6, 6: 5, 7: 2 };
1140
1140
  const requiredPerProblemSections = [
1141
1141
  "问题背景", "用户反馈 / 触发场景", "根因分析", "解决方案", "方案细节",
1142
1142
  "硬规则", "非目标", "影响范围", "落地文件", "验收标准", "回归风险",
1143
1143
  "与其他问题的关联", "发布门禁要求",
1144
1144
  ];
1145
- for (let batch = 1; batch <= 6; batch++) {
1145
+ for (let batch = 1; batch <= 7; batch++) {
1146
1146
  const details = loadBatchIssueDetails(batch, rootDir);
1147
1147
  if (!details.loaded) {
1148
1148
  hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} 问题集未加载: ${details.error}`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 只检查文档存在,不验证是否可解析", "第 3 步统一格式");
@@ -1508,6 +1508,144 @@ function checkDependencyAudit(rootDir, hardFail, _info) {
1508
1508
  hardFail("DEPENDENCY_AUDIT", "漏洞扫描报告格式无效", ["package.json"], "依赖健康", "旧 gate 不验证报告格式", "删除 .soloforge/advisory-report.json 并重新运行 npm run audit-deps");
1509
1509
  }
1510
1510
  }
1511
+ // ── 16. 工作流导航契约行为验证(问题六十五) ──
1512
+ async function checkWorkflowNavigationBehavior(rootDir, hardFail, _info) {
1513
+ // 1. 编译产物存在性
1514
+ const navPath = path.join(rootDir, "dist", "engine", "next_action_planner.js");
1515
+ if (!fs.existsSync(navPath)) {
1516
+ hardFail("NAVIGATION_MODULE_MISSING", "problem-65: next_action_planner.js 未编译到 dist/", ["src/engine/next_action_planner.ts"], "problem-65", "发布门禁不检查问题-65 导航机制是否存在", "实现 next_action_planner 并编译");
1517
+ return;
1518
+ }
1519
+ // 2. 核心导出存在性
1520
+ let nav;
1521
+ try {
1522
+ nav = await import(navPath);
1523
+ }
1524
+ catch (e) {
1525
+ hardFail("NAVIGATION_IMPORT_ERROR", `problem-65: next_action_planner 导入失败: ${e.message}`, ["src/engine/next_action_planner.ts"], "problem-65", "导航模块存在但不可导入", "修复导入错误");
1526
+ return;
1527
+ }
1528
+ if (typeof nav.planNextAction !== "function") {
1529
+ hardFail("NAVIGATION_EXPORT_MISSING", "problem-65: next_action_planner 未导出 planNextAction 函数", ["src/engine/next_action_planner.ts"], "problem-65", "导航模块缺少核心导出", "添加 planNextAction 导出");
1530
+ }
1531
+ if (typeof nav.computeDisallowedActions !== "function") {
1532
+ hardFail("NAVIGATION_DISALLOWED_MISSING", "problem-65: next_action_planner 未导出 computeDisallowedActions 函数", ["src/engine/next_action_planner.ts"], "problem-65", "禁止动作规则计算函数缺失", "添加 computeDisallowedActions 导出");
1533
+ }
1534
+ // 3. 行为验证: 未初始化项目应返回 uninitialized
1535
+ const tmpDir = path.join(rootDir, ".soloforge-gate-nav-test-" + Date.now());
1536
+ try {
1537
+ fs.mkdirSync(tmpDir, { recursive: true });
1538
+ const plan = await nav.planNextAction(tmpDir);
1539
+ if (plan.project_stage !== "uninitialized") {
1540
+ hardFail("NAVIGATION_BEHAVIOR_UNINIT", `problem-65: 未初始化项目的阶段应为 uninitialized,实际为 ${plan.project_stage}`, ["src/engine/project_stage_detector.ts"], "problem-65", "导航未正确检测未初始化项目", "修复 detectProjectStage 逻辑");
1541
+ }
1542
+ if (!plan.work_package || plan.work_package.action !== "sf_init") {
1543
+ hardFail("NAVIGATION_BEHAVIOR_INIT_WP", `problem-65: 未初始化项目的工作包应为 sf_init,实际为 ${plan.work_package?.action ?? "null"}`, ["src/engine/next_action_planner.ts"], "problem-65", "导航工作包未正确推荐初始化", "修复 computeWorkPackage 逻辑");
1544
+ }
1545
+ }
1546
+ catch (e) {
1547
+ hardFail("NAVIGATION_BEHAVIOR_ERROR", `problem-65: 行为级检查执行失败: ${e.message}`, ["src/engine/next_action_planner.ts"], "problem-65", "导航机制行为检查不可执行", "修复导航机制代码");
1548
+ }
1549
+ finally {
1550
+ try {
1551
+ fs.rmSync(tmpDir, { recursive: true });
1552
+ }
1553
+ catch { }
1554
+ }
1555
+ // 4. 知识文件存在性
1556
+ const rulePath = path.join(rootDir, "templates", "knowledge", "rules", "工作流导航契约规则.md");
1557
+ if (!fs.existsSync(rulePath)) {
1558
+ hardFail("NAVIGATION_RULE_MISSING", "problem-65: 缺少知识规则文件 工作流导航契约规则.md", ["templates/knowledge/rules/工作流导航契约规则.md"], "problem-65", "导航知识规则缺失", "创建知识规则文件");
1559
+ }
1560
+ const procedurePath = path.join(rootDir, "templates", "knowledge", "procedures", "全生命周期工作流导航.md");
1561
+ if (!fs.existsSync(procedurePath)) {
1562
+ hardFail("NAVIGATION_PROCEDURE_MISSING", "problem-65: 缺少知识流程文件 全生命周期工作流导航.md", ["templates/knowledge/procedures/全生命周期工作流导航.md"], "problem-65", "导航知识流程缺失", "创建知识流程文件");
1563
+ }
1564
+ // 5. CLI 命令存在性
1565
+ const cliDist = fs.readFileSync(path.join(rootDir, "dist", "bin", "soloforge.js"), "utf-8");
1566
+ if (!cliDist.includes('case "next"') && !cliDist.includes("cmdNext")) {
1567
+ hardFail("NAVIGATION_CLI_MISSING", "problem-65: CLI 缺少 next 命令入口", ["src/bin/soloforge.ts"], "problem-65", "CLI 无 next 命令", "添加 case 'next' dispatch");
1568
+ }
1569
+ if (!cliDist.includes('case "stage"') && !cliDist.includes("cmdStage")) {
1570
+ hardFail("NAVIGATION_CLI_STAGE_MISSING", "problem-65: CLI 缺少 stage 命令入口", ["src/bin/soloforge.ts"], "problem-65", "CLI 无 stage 命令", "添加 case 'stage' dispatch");
1571
+ }
1572
+ _info(" problem-65 工作流导航行为验证完成");
1573
+ }
1574
+ // ── 17. 实现工程契约行为验证(问题六十六/六十七) ──
1575
+ async function checkImplementationContractBehavior(rootDir, hardFail, _info) {
1576
+ const oodPath = path.join(rootDir, "dist", "engine", "ood_solid_contract.js");
1577
+ const backendPath = path.join(rootDir, "dist", "engine", "backend_implementation_contract.js");
1578
+ if (!fs.existsSync(oodPath) || !fs.existsSync(backendPath)) {
1579
+ hardFail("IMPLEMENTATION_CONTRACT_MODULE_MISSING", "problem-66/67: OOD/SOLID 或后端工程契约未编译到 dist/", ["src/engine/ood_solid_contract.ts", "src/engine/backend_implementation_contract.ts"], "problem-66/problem-67", "仅登记问题而未验证运行时模块", "实现并编译两个工程契约模块");
1580
+ return;
1581
+ }
1582
+ try {
1583
+ const ood = await import(oodPath);
1584
+ const backend = await import(backendPath);
1585
+ const blockedOod = ood.evaluateOodDesignGate({
1586
+ task_id: "gate-ood",
1587
+ intent: "实现订单领域服务状态流转策略",
1588
+ route: "code_change",
1589
+ });
1590
+ if (blockedOod.allowed || blockedOod.status !== "blocked") {
1591
+ hardFail("OOD_SUMMARY_FALSE_PASS", "problem-66: 复杂业务编码缺少 OOD 摘要仍被放行", ["src/engine/ood_solid_contract.ts"], "problem-66", "文件存在不能证明编码前门禁有效", "修复 evaluateOodDesignGate 的缺摘要阻断");
1592
+ }
1593
+ const lowRisk = ood.evaluateOodDesignGate({
1594
+ task_id: "gate-ood-low",
1595
+ intent: "修复 README 文案错别字",
1596
+ route: "code_change",
1597
+ });
1598
+ if (!lowRisk.allowed || lowRisk.status !== "not_applicable") {
1599
+ hardFail("OOD_LOW_RISK_OVERBLOCK", "problem-66: 低风险文案任务被 OOD 门禁误阻断", ["src/engine/ood_solid_contract.ts"], "problem-66", "门禁不能以流程重量替代适用性判断", "修复低风险跳过判断");
1600
+ }
1601
+ const solidFindings = ood.reviewSolidCode({
1602
+ "src/OrderController.ts": "class OrderController { save(){ return this.repository.save(this.calculate()); } }",
1603
+ });
1604
+ if (!ood.hasBlockingSolidFindings(solidFindings)) {
1605
+ hardFail("SOLID_REVIEW_FALSE_PASS", "problem-66: Controller 职责膨胀没有产生阻断 finding", ["src/engine/ood_solid_contract.ts"], "problem-66", "必须用真实代码内容验证审查能力", "修复 SRP 阻断识别");
1606
+ }
1607
+ const blockedBackend = backend.evaluateBackendImplementationGate({
1608
+ task_id: "gate-backend",
1609
+ intent: "实现后端 API 支付接口",
1610
+ route: "code_change",
1611
+ });
1612
+ if (blockedBackend.allowed || blockedBackend.status !== "blocked") {
1613
+ hardFail("BACKEND_WORK_PACKAGE_FALSE_PASS", "problem-67: 后端实现缺少工程工作包仍被放行", ["src/engine/backend_implementation_contract.ts"], "problem-67", "文件存在不能证明编码前门禁有效", "修复 evaluateBackendImplementationGate");
1614
+ }
1615
+ const backendFindings = backend.reviewBackendImplementationFiles({
1616
+ "src/PaymentController.java": "@PostMapping(\"/pay\") @Transactional public PaymentEntity pay(@RequestBody PaymentEntity value) { webClient.post(); return value; }",
1617
+ });
1618
+ if (!backend.hasBlockingBackendFindings(backendFindings)) {
1619
+ hardFail("BACKEND_REVIEW_FALSE_PASS", "problem-67: 实体暴露或事务内外调没有产生阻断 finding", ["src/engine/backend_implementation_contract.ts"], "problem-67", "必须用真实代码内容验证后端审查能力", "修复后端工程 finding 检测");
1620
+ }
1621
+ if (backend.requiresBackendImplementationContract("实现简单 GET 详情只读接口", "code_change")) {
1622
+ hardFail("BACKEND_LOW_RISK_OVERBLOCK", "problem-67: 简单只读接口被完整后端工程工作包误阻断", ["src/engine/backend_implementation_contract.ts"], "problem-67", "后端契约必须具备适用性边界", "修复低风险只读任务跳过逻辑");
1623
+ }
1624
+ const alignmentFindings = backend.verifyBackendArtifactAlignment({
1625
+ apiDocumentText: "GET /api/payments/{id}",
1626
+ openapiText: "paths:\n /api/orders/{id}:",
1627
+ migrationText: "create table payment(id bigint);",
1628
+ });
1629
+ if (!backend.hasBlockingBackendFindings(alignmentFindings)) {
1630
+ hardFail("BACKEND_API_OPENAPI_DRIFT_FALSE_PASS", "problem-67: Markdown API 与 OpenAPI endpoint 漂移未阻断", ["src/engine/backend_implementation_contract.ts"], "problem-67", "契约对齐必须由行为检查证明", "修复 API/OpenAPI 漂移检测");
1631
+ }
1632
+ }
1633
+ catch (e) {
1634
+ hardFail("IMPLEMENTATION_CONTRACT_EXECUTION_ERROR", `problem-66/67: 实现工程行为检查执行失败: ${e.message}`, ["src/engine/ood_solid_contract.ts", "src/engine/backend_implementation_contract.ts"], "problem-66/problem-67", "契约模块必须可运行并返回确定结果", "修复运行时异常");
1635
+ }
1636
+ const toolsText = safeRead(path.join(rootDir, "src", "adapters", "claude_code", "tools.ts")) ?? "";
1637
+ const requiredHooks = [
1638
+ "lazyOodSolid", "lazyBackendImplementation", "evaluateOodDesignGate",
1639
+ "evaluateBackendImplementationGate", "reviewSolidCode",
1640
+ "reviewBackendImplementationFiles", "hasBlockingSolidFindings", "hasBlockingBackendFindings",
1641
+ ];
1642
+ for (const hook of requiredHooks) {
1643
+ if (!toolsText.includes(hook)) {
1644
+ hardFail("IMPLEMENTATION_CONTRACT_MAINPATH_MISSING", `problem-66/67: MCP 主链路缺少真实消费点 ${hook}`, ["src/adapters/claude_code/tools.ts"], "problem-66/problem-67", "只实现引擎函数不能证明用户路径受约束", "接入 sf_expand/sf_review/sf_verify/sf_deliver");
1645
+ }
1646
+ }
1647
+ _info(" problem-66/67 实现工程契约行为验证完成");
1648
+ }
1511
1649
  // ── 15. 发布问题全局合同 ──
1512
1650
  async function checkReleaseIssueDesignPath(rootDir, hardFail, _info) {
1513
1651
  const toolsText = safeRead(path.join(rootDir, "src", "adapters", "claude_code", "tools.ts")) ?? "";
@@ -2165,10 +2303,18 @@ export async function runReleaseReadinessGate(rootDir) {
2165
2303
  beginPhase("依赖漏洞扫描");
2166
2304
  checkDependencyAudit(rootDir, hardFail, _info);
2167
2305
  endPhase("依赖漏洞扫描");
2168
- // 15: 发布问题全局合同(问题六十一至六十四)
2306
+ // 15: 发布问题全局合同(问题六十一至六十五)
2169
2307
  beginPhase("发布问题全局合同");
2170
2308
  await checkReleaseIssueDesignPath(rootDir, hardFail, _info);
2171
2309
  endPhase("发布问题全局合同");
2310
+ // 16: 工作流导航契约行为验证(问题六十五)
2311
+ beginPhase("工作流导航契约行为验证");
2312
+ await checkWorkflowNavigationBehavior(rootDir, hardFail, _info);
2313
+ endPhase("工作流导航契约行为验证");
2314
+ // 17: OOD/SOLID 与后端实现工程契约行为验证(问题六十六/六十七)
2315
+ beginPhase("实现工程契约行为验证");
2316
+ await checkImplementationContractBehavior(rootDir, hardFail, _info);
2317
+ endPhase("实现工程契约行为验证");
2172
2318
  // 恢复 console.error 和日志器
2173
2319
  console.error = origConsoleError;
2174
2320
  resetLogger();