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.
- package/README.md +44 -4
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +129 -10
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +3 -2
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/change_coordinator.d.ts.map +1 -1
- package/dist/engine/change_coordinator.js +2 -1
- package/dist/engine/change_coordinator.js.map +1 -1
- package/dist/engine/core_engineering_principles.d.ts.map +1 -1
- package/dist/engine/core_engineering_principles.js +2 -1
- package/dist/engine/core_engineering_principles.js.map +1 -1
- package/dist/engine/enforcement_guard.d.ts.map +1 -1
- package/dist/engine/enforcement_guard.js +2 -1
- package/dist/engine/enforcement_guard.js.map +1 -1
- package/dist/engine/extension_platform_contracts.d.ts +6 -0
- package/dist/engine/extension_platform_contracts.d.ts.map +1 -1
- package/dist/engine/extension_platform_contracts.js.map +1 -1
- package/dist/engine/impact_analyzer.d.ts.map +1 -1
- package/dist/engine/impact_analyzer.js +5 -23
- package/dist/engine/impact_analyzer.js.map +1 -1
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +9 -46
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/onboarding.d.ts.map +1 -1
- package/dist/engine/onboarding.js +2 -1
- package/dist/engine/onboarding.js.map +1 -1
- package/dist/engine/path_scope_utils.d.ts +21 -0
- package/dist/engine/path_scope_utils.d.ts.map +1 -0
- package/dist/engine/path_scope_utils.js +126 -0
- package/dist/engine/path_scope_utils.js.map +1 -0
- package/dist/engine/plan_proposal_gate.d.ts.map +1 -1
- package/dist/engine/plan_proposal_gate.js +2 -1
- package/dist/engine/plan_proposal_gate.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +15 -0
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/scope_controller.d.ts.map +1 -1
- package/dist/engine/scope_controller.js +5 -7
- package/dist/engine/scope_controller.js.map +1 -1
- package/dist/engine/scope_lease.d.ts.map +1 -1
- package/dist/engine/scope_lease.js +2 -2
- package/dist/engine/scope_lease.js.map +1 -1
- package/dist/engine/scope_resolver.d.ts +11 -0
- package/dist/engine/scope_resolver.d.ts.map +1 -0
- package/dist/engine/scope_resolver.js +526 -0
- package/dist/engine/scope_resolver.js.map +1 -0
- package/dist/engine/workspace_lease.d.ts.map +1 -1
- package/dist/engine/workspace_lease.js +6 -5
- package/dist/engine/workspace_lease.js.map +1 -1
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +2 -1
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -1
- 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
|
|
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
|
|
318
|
+
soloforge doctor
|
|
279
319
|
```
|
|
280
320
|
|
|
281
|
-
|
|
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":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAkB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|