soloforge 1.4.6 → 1.4.8

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 (57) hide show
  1. package/README.md +44 -4
  2. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/tools.js +129 -10
  4. package/dist/adapters/claude_code/tools.js.map +1 -1
  5. package/dist/bin/soloforge.d.ts.map +1 -1
  6. package/dist/bin/soloforge.js +3 -2
  7. package/dist/bin/soloforge.js.map +1 -1
  8. package/dist/engine/change_coordinator.d.ts.map +1 -1
  9. package/dist/engine/change_coordinator.js +2 -1
  10. package/dist/engine/change_coordinator.js.map +1 -1
  11. package/dist/engine/core_engineering_principles.d.ts.map +1 -1
  12. package/dist/engine/core_engineering_principles.js +2 -1
  13. package/dist/engine/core_engineering_principles.js.map +1 -1
  14. package/dist/engine/enforcement_guard.d.ts.map +1 -1
  15. package/dist/engine/enforcement_guard.js +2 -1
  16. package/dist/engine/enforcement_guard.js.map +1 -1
  17. package/dist/engine/extension_platform_contracts.d.ts +6 -0
  18. package/dist/engine/extension_platform_contracts.d.ts.map +1 -1
  19. package/dist/engine/extension_platform_contracts.js.map +1 -1
  20. package/dist/engine/impact_analyzer.d.ts.map +1 -1
  21. package/dist/engine/impact_analyzer.js +5 -23
  22. package/dist/engine/impact_analyzer.js.map +1 -1
  23. package/dist/engine/intent_expander.d.ts.map +1 -1
  24. package/dist/engine/intent_expander.js +9 -46
  25. package/dist/engine/intent_expander.js.map +1 -1
  26. package/dist/engine/onboarding.d.ts.map +1 -1
  27. package/dist/engine/onboarding.js +2 -1
  28. package/dist/engine/onboarding.js.map +1 -1
  29. package/dist/engine/path_scope_utils.d.ts +21 -0
  30. package/dist/engine/path_scope_utils.d.ts.map +1 -0
  31. package/dist/engine/path_scope_utils.js +126 -0
  32. package/dist/engine/path_scope_utils.js.map +1 -0
  33. package/dist/engine/plan_proposal_gate.d.ts.map +1 -1
  34. package/dist/engine/plan_proposal_gate.js +2 -1
  35. package/dist/engine/plan_proposal_gate.js.map +1 -1
  36. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  37. package/dist/engine/release_readiness_gate.js +15 -0
  38. package/dist/engine/release_readiness_gate.js.map +1 -1
  39. package/dist/engine/scope_controller.d.ts.map +1 -1
  40. package/dist/engine/scope_controller.js +5 -7
  41. package/dist/engine/scope_controller.js.map +1 -1
  42. package/dist/engine/scope_lease.d.ts.map +1 -1
  43. package/dist/engine/scope_lease.js +2 -2
  44. package/dist/engine/scope_lease.js.map +1 -1
  45. package/dist/engine/scope_resolver.d.ts +11 -0
  46. package/dist/engine/scope_resolver.d.ts.map +1 -0
  47. package/dist/engine/scope_resolver.js +526 -0
  48. package/dist/engine/scope_resolver.js.map +1 -0
  49. package/dist/engine/workspace_lease.d.ts.map +1 -1
  50. package/dist/engine/workspace_lease.js +6 -5
  51. package/dist/engine/workspace_lease.js.map +1 -1
  52. package/dist/knowledge/index_manager.d.ts.map +1 -1
  53. package/dist/knowledge/index_manager.js +2 -1
  54. package/dist/knowledge/index_manager.js.map +1 -1
  55. package/dist/types.d.ts +45 -0
  56. package/dist/types.d.ts.map +1 -1
  57. package/package.json +1 -1
package/README.md CHANGED
@@ -67,6 +67,8 @@ soloforge init --adapter all # 同时生成所有适配器配置
67
67
 
68
68
  `config.yaml` 是可选文件。没有它时,SoloForge 会根据 `package.json`、`pom.xml`、`go.mod` 等文件在运行时推断项目类型;只有高置信度或你手动确认时,才会把配置写入 `.soloforge/config.yaml`。
69
69
 
70
+ 配置里的 scope、仓库路径和产物路径都按项目相对路径理解和存储,适配 Windows、macOS、Linux 时不要手写宿主机绝对路径。
71
+
70
72
  ## 生成文件
71
73
 
72
74
  | 位置 | 用途 |
@@ -78,7 +80,45 @@ soloforge init --adapter all # 同时生成所有适配器配置
78
80
  | `.codex/config.toml` / `.codex/hooks.json` / `AGENTS.md` | Codex App 配置 |
79
81
  | `.trae/mcp.json` / `.trae/rules/project_rules.md` | Trae IDE 配置 |
80
82
 
81
- SoloForge 不会覆盖已有知识文件。重新运行 `soloforge init` 可刷新适配器配置。
83
+ SoloForge 不会覆盖已有知识文件。旧项目补齐新模板或适配器时,优先使用 `sync-templates` 和 `sync-adapters`,不要把 `init` 当作升级命令。
84
+
85
+ ## 更新与旧项目同步
86
+
87
+ 用户升级已发布的全局 CLI:
88
+
89
+ ```bash
90
+ npm update -g soloforge
91
+ # 或强制安装最新发布版
92
+ npm install -g soloforge@latest
93
+
94
+ soloforge --version
95
+ ```
96
+
97
+ 旧项目补齐新增模板、规则或适配器文件:
98
+
99
+ ```bash
100
+ cd /path/to/my-project
101
+
102
+ soloforge sync-templates
103
+ soloforge sync-adapters
104
+
105
+ soloforge sync-templates --apply --confirm
106
+ soloforge sync-adapters --apply --confirm
107
+
108
+ soloforge doctor
109
+ soloforge audit-design-artifacts
110
+ ```
111
+
112
+ 如果你只是升级 CLI,不需要重新 `init` 旧项目。`soloforge init` 只用于新项目首次接入,或者项目里根本还没有 `.soloforge/`。
113
+
114
+ 存量设计产物需要升级到当前标准时,单独使用设计产物升级命令:
115
+
116
+ ```bash
117
+ soloforge upgrade-design-artifacts
118
+ soloforge upgrade-design-artifacts --apply --confirm
119
+ ```
120
+
121
+ 只有新项目首次接入 SoloForge 时才运行 `soloforge init`。已经有 `.soloforge/` 的旧项目,优先用同步和审计命令;如果只是 AI 工具配置缺失,可按 `doctor` 输出的恢复命令处理。
82
122
 
83
123
  ## 日常命令
84
124
 
@@ -272,13 +312,13 @@ soloforge doctor
272
312
 
273
313
  如果 doctor 报告 MCP 配置缺失、hook 漂移、旧任务指针或恢复路径问题,先按输出的恢复命令处理。SoloForge 不建议手动删除 `.soloforge/state`;需要恢复陈旧任务时应使用受控命令或 MCP 工具。
274
314
 
275
- ### 想重新生成配置
315
+ ### 想补齐或修复配置
276
316
 
277
317
  ```bash
278
- soloforge init
318
+ soloforge doctor
279
319
  ```
280
320
 
281
- 该命令会刷新适配器配置,不会覆盖已有 `.soloforge/config.yaml` 和知识文件。
321
+ 先按 `doctor` 输出的恢复命令处理。旧项目需要补齐新增模板或适配器文件时,使用 `sync-templates` / `sync-adapters`;新项目首次接入时才运行 `soloforge init`。
282
322
 
283
323
  如果 `status` 提示 `version` 数字/字符串、`scope` 字符串/数组或 `config.evidence.json` 过期,这属于机械配置问题,不需要逐字段人工确认:
284
324
 
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import { normalizePathCandidate } from "../../engine/input_material_extractor.js
7
7
  import { archiveStaleCurrentPointer, detectStaleCurrentTask } from "../../engine/stale_current_task_detector.js";
8
8
  import { verifyArtifact } from "../../engine/artifact_contract_registry.js";
9
9
  import { verifyRouteDecisionContract } from "../../engine/route_decision_contract_verifier.js";
10
+ import { isSameOrDescendantPath } from "../../engine/path_scope_utils.js";
10
11
  import { findToolInvocationContractByName, createToolTrace, validateToolInvocation, hasWriteSideEffect, } from "../../engine/tool_invocation_contract_registry.js";
11
12
  import { TOOL_DIAGNOSTIC_CODES } from "../../engine/diagnostic_registry.js";
12
13
  function createLazy(loader) {
@@ -127,6 +128,12 @@ const ExpandSchema = {
127
128
  input_material_confirmations: z.array(z.string()).optional().describe("已确认安全的输入材料路径列表"),
128
129
  architecture_decision_workshop: z.unknown().optional().describe("架构设计前已讨论并确认的六域决策记录"),
129
130
  decision_workshop: z.unknown().optional().describe("通用决策研讨合同(技术选型/数据迁移/安全策略/部署/重构/第三方集成等)"),
131
+ technology_decision_contract: z.unknown().optional().describe("技术决策主权契约,含选项、推荐、证据、回滚计划和 human_gate_evidence"),
132
+ technology_decision_record: z.unknown().optional().describe("技术决策执行记录,记录已批准/已实现等显式决策状态"),
133
+ detail_discipline_contract: z.unknown().optional().describe("细节纪律契约,声明必须覆盖的边界、失败路径、回滚和证据维度"),
134
+ provided_details: z.unknown().optional().describe("细节纪律已提供证据,按 required_dimensions 映射为字符串数组"),
135
+ first_principles_frame: z.unknown().optional().describe("高影响任务的第一性原理框架"),
136
+ brainstorm_session: z.unknown().optional().describe("不确定项/方案选择的脑暴与方案探索会话"),
130
137
  design_artifact_pack: z.unknown().optional().describe("设计产物包路径映射或已复验状态"),
131
138
  ood_solid_summary: z.unknown().optional().describe("复杂编码任务的 OOD/SOLID 设计摘要"),
132
139
  backend_implementation_work_package: z.unknown().optional().describe("后端接口实现的工程工作包"),
@@ -1462,11 +1469,71 @@ export async function registerTools(server, deps) {
1462
1469
  if (existingDecisionWorkshop.error) {
1463
1470
  return { result: { error: existingDecisionWorkshop.error, status: "invalid_input" } };
1464
1471
  }
1472
+ const existingTechnologyDecisionContract = parseContractObject(ctx.technology_decision_contract, "technology_decision_contract");
1473
+ if (existingTechnologyDecisionContract.error) {
1474
+ return { result: { error: existingTechnologyDecisionContract.error, status: "invalid_input" } };
1475
+ }
1476
+ const existingTechnologyDecisionRecord = parseContractObject(ctx.technology_decision_record, "technology_decision_record");
1477
+ if (existingTechnologyDecisionRecord.error) {
1478
+ return { result: { error: existingTechnologyDecisionRecord.error, status: "invalid_input" } };
1479
+ }
1480
+ const existingDetailContract = parseContractObject(ctx.detail_discipline_contract, "detail_discipline_contract");
1481
+ if (existingDetailContract.error) {
1482
+ return { result: { error: existingDetailContract.error, status: "invalid_input" } };
1483
+ }
1484
+ const existingProvidedDetails = parseContractObject(ctx.provided_details, "provided_details");
1485
+ if (existingProvidedDetails.error) {
1486
+ return { result: { error: existingProvidedDetails.error, status: "invalid_input" } };
1487
+ }
1488
+ const existingFirstPrinciplesFrame = parseContractObject(ctx.first_principles_frame, "first_principles_frame");
1489
+ if (existingFirstPrinciplesFrame.error) {
1490
+ return { result: { error: existingFirstPrinciplesFrame.error, status: "invalid_input" } };
1491
+ }
1492
+ const existingBrainstormSession = parseContractObject(ctx.brainstorm_session, "brainstorm_session");
1493
+ if (existingBrainstormSession.error) {
1494
+ return { result: { error: existingBrainstormSession.error, status: "invalid_input" } };
1495
+ }
1496
+ const existingDesignArtifactPack = parseContractObject(ctx.design_artifact_pack, "design_artifact_pack");
1497
+ if (existingDesignArtifactPack.error) {
1498
+ return { result: { error: existingDesignArtifactPack.error, status: "invalid_input" } };
1499
+ }
1500
+ const existingOodSolidSummary = parseContractObject(ctx.ood_solid_summary, "ood_solid_summary");
1501
+ if (existingOodSolidSummary.error) {
1502
+ return { result: { error: existingOodSolidSummary.error, status: "invalid_input" } };
1503
+ }
1504
+ const existingBackendImplementationWorkPackage = parseContractObject(ctx.backend_implementation_work_package, "backend_implementation_work_package");
1505
+ if (existingBackendImplementationWorkPackage.error) {
1506
+ return { result: { error: existingBackendImplementationWorkPackage.error, status: "invalid_input" } };
1507
+ }
1508
+ const existingCodeObservabilityWorkPackage = parseContractObject(ctx.code_observability_work_package, "code_observability_work_package");
1509
+ if (existingCodeObservabilityWorkPackage.error) {
1510
+ return { result: { error: existingCodeObservabilityWorkPackage.error, status: "invalid_input" } };
1511
+ }
1465
1512
  if (existingArchitectureWorkshop.value)
1466
1513
  ctx.architecture_decision_workshop = existingArchitectureWorkshop.value;
1467
1514
  if (existingDecisionWorkshop.value) {
1468
1515
  ctx.decision_workshop = (await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(existingDecisionWorkshop.value, args.task_id) ?? existingDecisionWorkshop.value;
1469
1516
  }
1517
+ if (existingTechnologyDecisionContract.value)
1518
+ ctx.technology_decision_contract = existingTechnologyDecisionContract.value;
1519
+ if (existingTechnologyDecisionRecord.value)
1520
+ ctx.technology_decision_record = existingTechnologyDecisionRecord.value;
1521
+ if (existingDetailContract.value)
1522
+ ctx.detail_discipline_contract = existingDetailContract.value;
1523
+ if (existingProvidedDetails.value)
1524
+ ctx.provided_details = existingProvidedDetails.value;
1525
+ if (existingFirstPrinciplesFrame.value)
1526
+ ctx.first_principles_frame = existingFirstPrinciplesFrame.value;
1527
+ if (existingBrainstormSession.value)
1528
+ ctx.brainstorm_session = existingBrainstormSession.value;
1529
+ if (existingDesignArtifactPack.value)
1530
+ ctx.design_artifact_pack = existingDesignArtifactPack.value;
1531
+ if (existingOodSolidSummary.value)
1532
+ ctx.ood_solid_summary = existingOodSolidSummary.value;
1533
+ if (existingBackendImplementationWorkPackage.value)
1534
+ ctx.backend_implementation_work_package = existingBackendImplementationWorkPackage.value;
1535
+ if (existingCodeObservabilityWorkPackage.value)
1536
+ ctx.code_observability_work_package = existingCodeObservabilityWorkPackage.value;
1470
1537
  if (args.architecture_decision_workshop) {
1471
1538
  const parsed = parseContractObject(args.architecture_decision_workshop, "architecture_decision_workshop");
1472
1539
  if (parsed.error)
@@ -1479,19 +1546,71 @@ export async function registerTools(server, deps) {
1479
1546
  return { result: { error: parsed.error, status: "invalid_input" } };
1480
1547
  ctx.decision_workshop = (await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(parsed.value, args.task_id) ?? parsed.value;
1481
1548
  }
1549
+ if (args.technology_decision_contract) {
1550
+ const parsed = parseContractObject(args.technology_decision_contract, "technology_decision_contract");
1551
+ if (parsed.error)
1552
+ return { result: { error: parsed.error, status: "invalid_input" } };
1553
+ ctx.technology_decision_contract = parsed.value;
1554
+ }
1555
+ if (args.technology_decision_record) {
1556
+ const parsed = parseContractObject(args.technology_decision_record, "technology_decision_record");
1557
+ if (parsed.error)
1558
+ return { result: { error: parsed.error, status: "invalid_input" } };
1559
+ ctx.technology_decision_record = parsed.value;
1560
+ }
1561
+ if (args.detail_discipline_contract) {
1562
+ const parsed = parseContractObject(args.detail_discipline_contract, "detail_discipline_contract");
1563
+ if (parsed.error)
1564
+ return { result: { error: parsed.error, status: "invalid_input" } };
1565
+ ctx.detail_discipline_contract = parsed.value;
1566
+ }
1567
+ if (args.provided_details) {
1568
+ const parsed = parseContractObject(args.provided_details, "provided_details");
1569
+ if (parsed.error)
1570
+ return { result: { error: parsed.error, status: "invalid_input" } };
1571
+ ctx.provided_details = parsed.value;
1572
+ }
1573
+ if (args.first_principles_frame) {
1574
+ const parsed = parseContractObject(args.first_principles_frame, "first_principles_frame");
1575
+ if (parsed.error)
1576
+ return { result: { error: parsed.error, status: "invalid_input" } };
1577
+ ctx.first_principles_frame = parsed.value;
1578
+ }
1579
+ if (args.brainstorm_session) {
1580
+ const parsed = parseContractObject(args.brainstorm_session, "brainstorm_session");
1581
+ if (parsed.error)
1582
+ return { result: { error: parsed.error, status: "invalid_input" } };
1583
+ ctx.brainstorm_session = parsed.value;
1584
+ }
1482
1585
  if (args.design_artifact_pack) {
1483
- ctx.design_artifact_pack = args.design_artifact_pack;
1586
+ const parsed = parseContractObject(args.design_artifact_pack, "design_artifact_pack");
1587
+ if (parsed.error)
1588
+ return { result: { error: parsed.error, status: "invalid_input" } };
1589
+ ctx.design_artifact_pack = parsed.value;
1484
1590
  }
1485
1591
  if (args.ood_solid_summary) {
1486
- ctx.ood_solid_summary = args.ood_solid_summary;
1592
+ const parsed = parseContractObject(args.ood_solid_summary, "ood_solid_summary");
1593
+ if (parsed.error)
1594
+ return { result: { error: parsed.error, status: "invalid_input" } };
1595
+ ctx.ood_solid_summary = parsed.value;
1487
1596
  }
1488
1597
  if (args.backend_implementation_work_package) {
1489
- ctx.backend_implementation_work_package = args.backend_implementation_work_package;
1598
+ const parsed = parseContractObject(args.backend_implementation_work_package, "backend_implementation_work_package");
1599
+ if (parsed.error)
1600
+ return { result: { error: parsed.error, status: "invalid_input" } };
1601
+ ctx.backend_implementation_work_package = parsed.value;
1490
1602
  }
1491
1603
  if (args.code_observability_work_package) {
1492
- ctx.code_observability_work_package = args.code_observability_work_package;
1604
+ const parsed = parseContractObject(args.code_observability_work_package, "code_observability_work_package");
1605
+ if (parsed.error)
1606
+ return { result: { error: parsed.error, status: "invalid_input" } };
1607
+ ctx.code_observability_work_package = parsed.value;
1493
1608
  }
1494
- if (args.architecture_decision_workshop || args.decision_workshop || args.design_artifact_pack
1609
+ if (args.architecture_decision_workshop || args.decision_workshop
1610
+ || args.technology_decision_contract || args.technology_decision_record
1611
+ || args.detail_discipline_contract || args.provided_details
1612
+ || args.first_principles_frame || args.brainstorm_session
1613
+ || args.design_artifact_pack
1495
1614
  || args.ood_solid_summary || args.backend_implementation_work_package || args.code_observability_work_package) {
1496
1615
  await taskContext.save(ctx);
1497
1616
  }
@@ -1582,7 +1701,7 @@ export async function registerTools(server, deps) {
1582
1701
  .map((materialPath) => path.resolve(projectRoot, normalizePathCandidate(materialPath))));
1583
1702
  const confirmedProjectSourcePaths = (args.input_material_confirmations ?? [])
1584
1703
  .map((materialPath) => path.resolve(projectRoot, normalizePathCandidate(materialPath)))
1585
- .filter((absolutePath) => absolutePath === projectRoot || absolutePath.startsWith(`${projectRoot}${path.sep}`))
1704
+ .filter((absolutePath) => isSameOrDescendantPath(absolutePath, projectRoot, { caseSensitive: false }))
1586
1705
  .filter((absolutePath) => referencedMaterialPaths.has(absolutePath))
1587
1706
  .filter((absolutePath) => {
1588
1707
  try {
@@ -1648,7 +1767,7 @@ export async function registerTools(server, deps) {
1648
1767
  });
1649
1768
  }
1650
1769
  }
1651
- const tdc = ctx?.technology_decision_contract;
1770
+ const tdc = ctx.technology_decision_contract;
1652
1771
  if (tdc?.human_gate_evidence) {
1653
1772
  evg.registry.register({
1654
1773
  source_type: "user_confirmation",
@@ -2083,7 +2202,7 @@ export async function registerTools(server, deps) {
2083
2202
  }
2084
2203
  }
2085
2204
  // 技术决策契约含 human_gate_evidence → 注册为 user_confirmation(真实项目证据)
2086
- const _tdc = ctx?.technology_decision_contract;
2205
+ const _tdc = ctx.technology_decision_contract;
2087
2206
  if (_tdc?.human_gate_evidence) {
2088
2207
  _evg.registry.register({
2089
2208
  source_type: "user_confirmation",
@@ -2236,7 +2355,7 @@ export async function registerTools(server, deps) {
2236
2355
  for (const changedFile of implementationFiles) {
2237
2356
  const absoluteFile = path.resolve(projectPath, changedFile);
2238
2357
  try {
2239
- if (absoluteFile.startsWith(`${path.resolve(projectPath)}${path.sep}`) && fss.statSync(absoluteFile).isFile()) {
2358
+ if (isSameOrDescendantPath(absoluteFile, path.resolve(projectPath), { caseSensitive: false }) && fss.statSync(absoluteFile).isFile()) {
2240
2359
  implementationContents[changedFile] = fss.readFileSync(absoluteFile, "utf-8");
2241
2360
  }
2242
2361
  }
@@ -3163,7 +3282,7 @@ export async function registerTools(server, deps) {
3163
3282
  continue;
3164
3283
  const absoluteFile = path.resolve(projectPath, changedFile);
3165
3284
  try {
3166
- if (absoluteFile.startsWith(`${path.resolve(projectPath)}${path.sep}`) && fss.statSync(absoluteFile).isFile()) {
3285
+ if (isSameOrDescendantPath(absoluteFile, path.resolve(projectPath), { caseSensitive: false }) && fss.statSync(absoluteFile).isFile()) {
3167
3286
  contractContents[changedFile] = fss.readFileSync(absoluteFile, "utf-8");
3168
3287
  }
3169
3288
  }