soloforge 1.2.1 → 1.2.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.
- package/README.md +78 -18
- package/dist/adapters/claude_code/server.d.ts.map +1 -1
- package/dist/adapters/claude_code/server.js +2 -25
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts +8 -13
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +508 -87
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/codex/codex_rules.d.ts.map +1 -1
- package/dist/adapters/codex/codex_rules.js +23 -1
- package/dist/adapters/codex/codex_rules.js.map +1 -1
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
- package/dist/adapters/shared/workflow_template.js +25 -0
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/bin/soloforge.js +169 -18
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/audit_pool.d.ts +36 -0
- package/dist/engine/audit_pool.d.ts.map +1 -0
- package/dist/engine/audit_pool.js +83 -0
- package/dist/engine/audit_pool.js.map +1 -0
- package/dist/engine/audit_sampler.d.ts +15 -0
- package/dist/engine/audit_sampler.d.ts.map +1 -0
- package/dist/engine/audit_sampler.js +26 -0
- package/dist/engine/audit_sampler.js.map +1 -0
- package/dist/engine/audit_verifier.d.ts +1 -1
- package/dist/engine/audit_verifier.js +1 -1
- package/dist/engine/audit_verifier.js.map +1 -1
- package/dist/engine/capability_action_advisor.d.ts +24 -0
- package/dist/engine/capability_action_advisor.d.ts.map +1 -0
- package/dist/engine/capability_action_advisor.js +147 -0
- package/dist/engine/capability_action_advisor.js.map +1 -0
- package/dist/engine/capability_registry.d.ts +58 -0
- package/dist/engine/capability_registry.d.ts.map +1 -0
- package/dist/engine/capability_registry.js +625 -0
- package/dist/engine/capability_registry.js.map +1 -0
- package/dist/engine/capability_state_store.d.ts +50 -0
- package/dist/engine/capability_state_store.d.ts.map +1 -0
- package/dist/engine/capability_state_store.js +123 -0
- package/dist/engine/capability_state_store.js.map +1 -0
- package/dist/engine/cognitive_anchor.d.ts +59 -0
- package/dist/engine/cognitive_anchor.d.ts.map +1 -0
- package/dist/engine/cognitive_anchor.js +68 -0
- package/dist/engine/cognitive_anchor.js.map +1 -0
- package/dist/engine/conflict_gate.d.ts +36 -0
- package/dist/engine/conflict_gate.d.ts.map +1 -0
- package/dist/engine/conflict_gate.js +73 -0
- package/dist/engine/conflict_gate.js.map +1 -0
- package/dist/engine/decision_contract.d.ts +29 -0
- package/dist/engine/decision_contract.d.ts.map +1 -0
- package/dist/engine/decision_contract.js +41 -0
- package/dist/engine/decision_contract.js.map +1 -0
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +83 -0
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/developer_sovereignty.d.ts +62 -0
- package/dist/engine/developer_sovereignty.d.ts.map +1 -0
- package/dist/engine/developer_sovereignty.js +134 -0
- package/dist/engine/developer_sovereignty.js.map +1 -0
- package/dist/engine/diff_ownership.d.ts +74 -0
- package/dist/engine/diff_ownership.d.ts.map +1 -0
- package/dist/engine/diff_ownership.js +143 -0
- package/dist/engine/diff_ownership.js.map +1 -0
- package/dist/engine/diff_ownership_store.d.ts +76 -0
- package/dist/engine/diff_ownership_store.d.ts.map +1 -0
- package/dist/engine/diff_ownership_store.js +264 -0
- package/dist/engine/diff_ownership_store.js.map +1 -0
- package/dist/engine/escape_report.d.ts +45 -0
- package/dist/engine/escape_report.d.ts.map +1 -0
- package/dist/engine/escape_report.js +97 -0
- package/dist/engine/escape_report.js.map +1 -0
- package/dist/engine/exploration.d.ts +54 -0
- package/dist/engine/exploration.d.ts.map +1 -1
- package/dist/engine/exploration.js +138 -0
- package/dist/engine/exploration.js.map +1 -1
- package/dist/engine/governance_report.d.ts +36 -0
- package/dist/engine/governance_report.d.ts.map +1 -0
- package/dist/engine/governance_report.js +79 -0
- package/dist/engine/governance_report.js.map +1 -0
- package/dist/engine/java_quality_guard.d.ts +52 -0
- package/dist/engine/java_quality_guard.d.ts.map +1 -0
- package/dist/engine/java_quality_guard.js +237 -0
- package/dist/engine/java_quality_guard.js.map +1 -0
- package/dist/engine/job_manager.d.ts +76 -0
- package/dist/engine/job_manager.d.ts.map +1 -0
- package/dist/engine/job_manager.js +225 -0
- package/dist/engine/job_manager.js.map +1 -0
- package/dist/engine/knowledge_config_loader.d.ts +1 -1
- package/dist/engine/knowledge_config_loader.js +1 -1
- package/dist/engine/knowledge_sovereignty.d.ts +61 -0
- package/dist/engine/knowledge_sovereignty.d.ts.map +1 -0
- package/dist/engine/knowledge_sovereignty.js +190 -0
- package/dist/engine/knowledge_sovereignty.js.map +1 -0
- package/dist/engine/llm_gateway.js +2 -2
- package/dist/engine/llm_gateway.js.map +1 -1
- package/dist/engine/mutation_audit.d.ts +43 -0
- package/dist/engine/mutation_audit.d.ts.map +1 -0
- package/dist/engine/mutation_audit.js +118 -0
- package/dist/engine/mutation_audit.js.map +1 -0
- package/dist/engine/policy_drift_detector.d.ts +46 -0
- package/dist/engine/policy_drift_detector.d.ts.map +1 -0
- package/dist/engine/policy_drift_detector.js +181 -0
- package/dist/engine/policy_drift_detector.js.map +1 -0
- package/dist/engine/regression_matrix.d.ts +102 -0
- package/dist/engine/regression_matrix.d.ts.map +1 -0
- package/dist/engine/regression_matrix.js +380 -0
- package/dist/engine/regression_matrix.js.map +1 -0
- package/dist/engine/risk_sampler.d.ts +37 -0
- package/dist/engine/risk_sampler.d.ts.map +1 -0
- package/dist/engine/risk_sampler.js +69 -0
- package/dist/engine/risk_sampler.js.map +1 -0
- package/dist/engine/runtime_safety.d.ts +80 -0
- package/dist/engine/runtime_safety.d.ts.map +1 -0
- package/dist/engine/runtime_safety.js +195 -0
- package/dist/engine/runtime_safety.js.map +1 -0
- package/dist/engine/scope_lease.d.ts +45 -0
- package/dist/engine/scope_lease.d.ts.map +1 -0
- package/dist/engine/scope_lease.js +122 -0
- package/dist/engine/scope_lease.js.map +1 -0
- package/dist/engine/semantic_evidence.d.ts +23 -0
- package/dist/engine/semantic_evidence.d.ts.map +1 -0
- package/dist/engine/semantic_evidence.js +81 -0
- package/dist/engine/semantic_evidence.js.map +1 -0
- package/dist/engine/task_context.d.ts +16 -0
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +59 -1
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/test_quality.js +2 -2
- package/dist/engine/test_quality.js.map +1 -1
- package/dist/engine/verifier.d.ts.map +1 -1
- package/dist/engine/verifier.js +113 -20
- package/dist/engine/verifier.js.map +1 -1
- package/dist/engine/workspace_resumer.d.ts +43 -0
- package/dist/engine/workspace_resumer.d.ts.map +1 -1
- package/dist/engine/workspace_resumer.js +119 -4
- package/dist/engine/workspace_resumer.js.map +1 -1
- package/dist/engine/zero_config_init.d.ts +87 -0
- package/dist/engine/zero_config_init.d.ts.map +1 -0
- package/dist/engine/zero_config_init.js +427 -0
- package/dist/engine/zero_config_init.js.map +1 -0
- package/dist/knowledge/index_manager.d.ts +19 -0
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +31 -0
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/knowledge/writer.d.ts.map +1 -1
- package/dist/knowledge/writer.js +1 -0
- package/dist/knowledge/writer.js.map +1 -1
- package/dist/types.d.ts +61 -85
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/templates/knowledge/domain//345/256/241/350/256/241/346/227/245/345/277/227.md +6 -7
- package/templates/knowledge/domain//345/257/274/345/205/245/345/257/274/345/207/272/350/247/204/345/210/231.md +3 -3
- package/templates/knowledge/domain//351/200/232/347/224/250/346/234/272/346/242/260/346/235/241/346/254/276.md +24 -14
- package/templates/knowledge/patterns/core/Diff/345/275/222/345/261/236/350/277/275/350/270/252.md +47 -0
- package/templates/knowledge/patterns/core/Java/350/264/250/351/207/217/351/227/250/347/246/201.md +46 -0
- package/templates/knowledge/patterns/core/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md +46 -0
- package/templates/knowledge/patterns/core//344/273/273/345/212/241/344/270/212/344/270/213/346/226/207/347/224/237/345/221/275/345/221/250/346/234/237.md +47 -0
- package/templates/knowledge/patterns/core//344/273/273/345/212/241/347/256/241/347/220/206/345/231/250.md +47 -0
- package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/344/270/216/345/257/206/351/222/245/346/213/246/346/210/252.md +46 -0
- package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/347/247/237/347/272/246.md +47 -0
- package/templates/knowledge/patterns/core//345/206/262/347/252/201/351/227/250/347/246/201.md +47 -0
- package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +52 -0
- package/templates/knowledge/patterns/core/{mutation_audit.md → /345/217/230/345/274/202/345/256/241/350/256/241.md} +20 -0
- package/templates/knowledge/patterns/core//345/233/236/345/275/222/347/237/251/351/230/265.md +46 -0
- package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/344/272/222/346/226/245/351/224/201.md +44 -0
- package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/345/224/244/351/206/222.md +46 -0
- package/templates/knowledge/patterns/core//345/271/266/345/217/221/351/224/201.md +49 -0
- package/templates/knowledge/patterns/core/{developer_constitution.md → /345/274/200/345/217/221/350/200/205/345/256/252/346/263/225.md} +20 -0
- package/templates/knowledge/patterns/core//346/225/217/346/204/237/344/277/241/346/201/257/346/211/253/346/217/217.md +45 -0
- package/templates/knowledge/patterns/core//346/262/273/347/220/206/350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +48 -0
- package/templates/knowledge/patterns/core/{streaming_protocol.md → /346/265/201/345/274/217/345/277/203/350/267/263.md} +20 -0
- package/templates/knowledge/patterns/core/{authority.md → /347/237/245/350/257/206/344/270/273/346/235/203.md} +20 -0
- package/templates/knowledge/patterns/core//350/257/255/344/271/211/350/257/201/346/215/256.md +47 -0
- package/templates/knowledge/patterns/core//350/277/220/350/241/214/345/256/211/345/205/250/345/214/205.md +50 -0
- package/templates/knowledge/patterns/core//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226.md +47 -0
- package/templates/knowledge/patterns/core//351/252/214/350/257/201/345/221/275/344/273/244/347/224/237/346/210/220.md +46 -0
- package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +1 -1
- package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/347/250/213.md +1 -1
- package/templates/knowledge/review_rules//345/271/266/345/217/221/345/256/241/346/237/245/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/review_rules//346/200/247/350/203/275/345/256/241/346/237/245/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/review_rules//346/216/245/345/217/243/345/245/221/347/272/246/345/256/241/346/237/245/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/review_rules//346/236/266/346/236/204/345/256/241/346/237/245/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/review_rules//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/patterns/core/concurrency_lock.md +0 -36
- package/templates/knowledge/patterns/core/decision_gateway.md +0 -33
- /package/templates/knowledge/checklists/{session_recovery.md → /344/274/232/350/257/235/346/201/242/345/244/215.md"} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/engine/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/engine/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Developer Sovereignty — 交付前 raw diff 展示、证据链、回滚路径、否决入口。
|
|
3
|
+
* R11 advisory: 不 hard block,提供信息供开发者决策。
|
|
4
|
+
*
|
|
5
|
+
* 职责:
|
|
6
|
+
* - preDeliveryReview: 交付前预览(raw diff + 风险摘要 + 证据链 + 回滚命令)
|
|
7
|
+
* - vetoDelivery: 开发者否决入口
|
|
8
|
+
*/
|
|
9
|
+
import type { TaskContext, RequirementPoint } from "../types.js";
|
|
10
|
+
import type { GitOperations } from "./git_deps.js";
|
|
11
|
+
export interface PreDeliveryReview {
|
|
12
|
+
task_id: string;
|
|
13
|
+
/** raw diff 摘要(变更文件列表 + 行数统计) */
|
|
14
|
+
diff_summary: {
|
|
15
|
+
changed_files: string[];
|
|
16
|
+
additions: number;
|
|
17
|
+
deletions: number;
|
|
18
|
+
file_details: Array<{
|
|
19
|
+
file_path: string;
|
|
20
|
+
additions: number;
|
|
21
|
+
deletions: number;
|
|
22
|
+
}>;
|
|
23
|
+
};
|
|
24
|
+
/** 风险摘要 */
|
|
25
|
+
risk_summary: {
|
|
26
|
+
risk_level: "low" | "medium" | "high";
|
|
27
|
+
factors: string[];
|
|
28
|
+
advisory: string;
|
|
29
|
+
};
|
|
30
|
+
/** 证据链(requirement → change → test → evidence) */
|
|
31
|
+
evidence_chain: {
|
|
32
|
+
requirements: RequirementPoint[];
|
|
33
|
+
coverage_summary: string;
|
|
34
|
+
uncovered_points: string[];
|
|
35
|
+
} | null;
|
|
36
|
+
/** 回滚命令 */
|
|
37
|
+
rollback_command: string;
|
|
38
|
+
/** 是否可以交付 */
|
|
39
|
+
can_deliver: boolean;
|
|
40
|
+
/** 阻断原因(can_deliver=false 时) */
|
|
41
|
+
delivery_blockers: string[];
|
|
42
|
+
/** advisory 信息 */
|
|
43
|
+
advisory: string;
|
|
44
|
+
}
|
|
45
|
+
export interface VetoResult {
|
|
46
|
+
vetoed: boolean;
|
|
47
|
+
task_id: string;
|
|
48
|
+
reason: string;
|
|
49
|
+
timestamp: string;
|
|
50
|
+
advisory: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 交付前预览 — 收集 raw diff、风险摘要、证据链、回滚命令。
|
|
54
|
+
* 使用 git_deps.GitOperations 获取真实 diff 统计和 commit/branch 信息。
|
|
55
|
+
*/
|
|
56
|
+
export declare function preDeliveryReview(taskContext: TaskContext, gitOps: GitOperations, projectPath: string): Promise<PreDeliveryReview>;
|
|
57
|
+
/**
|
|
58
|
+
* 否决交付 — 开发者行使否决权。
|
|
59
|
+
* 返回 VetoResult 记录否决事件,不修改任何状态。
|
|
60
|
+
*/
|
|
61
|
+
export declare function vetoDelivery(taskId: string, reason: string): VetoResult;
|
|
62
|
+
//# sourceMappingURL=developer_sovereignty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer_sovereignty.d.ts","sourceRoot":"","sources":["../../src/engine/developer_sovereignty.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EAEX,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,YAAY,EAAE;QACZ,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAClF,CAAC;IACF,WAAW;IACX,YAAY,EAAE;QACZ,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,kDAAkD;IAClD,cAAc,EAAE;QACd,YAAY,EAAE,gBAAgB,EAAE,CAAC;QACjC,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,EAAE,CAAC;KAC5B,GAAG,IAAI,CAAC;IACT,WAAW;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,gCAAgC;IAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAiH5B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,UAAU,CAQZ"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Developer Sovereignty — 交付前 raw diff 展示、证据链、回滚路径、否决入口。
|
|
3
|
+
* R11 advisory: 不 hard block,提供信息供开发者决策。
|
|
4
|
+
*
|
|
5
|
+
* 职责:
|
|
6
|
+
* - preDeliveryReview: 交付前预览(raw diff + 风险摘要 + 证据链 + 回滚命令)
|
|
7
|
+
* - vetoDelivery: 开发者否决入口
|
|
8
|
+
*/
|
|
9
|
+
import { buildDeliveryEvidenceChain } from "./semantic_evidence.js";
|
|
10
|
+
/**
|
|
11
|
+
* 交付前预览 — 收集 raw diff、风险摘要、证据链、回滚命令。
|
|
12
|
+
* 使用 git_deps.GitOperations 获取真实 diff 统计和 commit/branch 信息。
|
|
13
|
+
*/
|
|
14
|
+
export async function preDeliveryReview(taskContext, gitOps, projectPath) {
|
|
15
|
+
const changedFiles = taskContext.execution?.changed_files ?? [];
|
|
16
|
+
const attemptCount = taskContext.execution?.attempt_count ?? 0;
|
|
17
|
+
const failureCount = taskContext.execution?.failure_history?.length ?? 0;
|
|
18
|
+
const risk = taskContext.classification?.risk ?? "low";
|
|
19
|
+
// Diff summary — merge unstaged + cached diffs per file
|
|
20
|
+
const [unstaged, staged] = await Promise.all([
|
|
21
|
+
gitOps.getDiff(projectPath, { cached: false }),
|
|
22
|
+
gitOps.getDiff(projectPath, { cached: true }),
|
|
23
|
+
]);
|
|
24
|
+
const diffFiles = new Set(changedFiles);
|
|
25
|
+
// Merge by file: sum additions/deletions from both sources
|
|
26
|
+
const merged = new Map();
|
|
27
|
+
for (const h of [...unstaged, ...staged]) {
|
|
28
|
+
if (!diffFiles.has(h.file))
|
|
29
|
+
continue;
|
|
30
|
+
const existing = merged.get(h.file);
|
|
31
|
+
if (existing) {
|
|
32
|
+
existing.additions += h.additions;
|
|
33
|
+
existing.deletions += h.deletions;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
merged.set(h.file, { file_path: h.file, additions: h.additions, deletions: h.deletions });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// For changed files not in any diff output, add zero-count entries
|
|
40
|
+
for (const f of changedFiles) {
|
|
41
|
+
if (!merged.has(f)) {
|
|
42
|
+
merged.set(f, { file_path: f, additions: 0, deletions: 0 });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const fileDetails = [...merged.values()];
|
|
46
|
+
const totalAdditions = fileDetails.reduce((s, d) => s + d.additions, 0);
|
|
47
|
+
const totalDeletions = fileDetails.reduce((s, d) => s + d.deletions, 0);
|
|
48
|
+
const diffSummary = {
|
|
49
|
+
changed_files: changedFiles,
|
|
50
|
+
additions: totalAdditions,
|
|
51
|
+
deletions: totalDeletions,
|
|
52
|
+
file_details: fileDetails,
|
|
53
|
+
};
|
|
54
|
+
// Risk summary
|
|
55
|
+
const riskFactors = [];
|
|
56
|
+
if (risk === "high")
|
|
57
|
+
riskFactors.push(`任务风险: ${risk}`);
|
|
58
|
+
if (attemptCount > 1)
|
|
59
|
+
riskFactors.push(`多次尝试: ${attemptCount} 次`);
|
|
60
|
+
if (failureCount > 0)
|
|
61
|
+
riskFactors.push(`历史失败: ${failureCount} 次`);
|
|
62
|
+
if (changedFiles.length > 10)
|
|
63
|
+
riskFactors.push(`变更文件多: ${changedFiles.length} 个`);
|
|
64
|
+
const riskLevel = riskFactors.length === 0 ? "low" : riskFactors.length <= 2 ? "medium" : "high";
|
|
65
|
+
// Evidence chain
|
|
66
|
+
const chain = buildDeliveryEvidenceChain(taskContext);
|
|
67
|
+
const evidenceChain = chain
|
|
68
|
+
? {
|
|
69
|
+
requirements: chain.requirement_points,
|
|
70
|
+
coverage_summary: chain.completeness.advisory,
|
|
71
|
+
uncovered_points: chain.completeness.uncovered_points,
|
|
72
|
+
}
|
|
73
|
+
: null;
|
|
74
|
+
// Rollback command — bound to real commit hash and branch
|
|
75
|
+
let commitHash = "HEAD";
|
|
76
|
+
let branch = "HEAD";
|
|
77
|
+
try {
|
|
78
|
+
commitHash = await gitOps.getHeadCommitHash(projectPath);
|
|
79
|
+
}
|
|
80
|
+
catch { /* use default */ }
|
|
81
|
+
try {
|
|
82
|
+
branch = await gitOps.getCurrentBranch(projectPath);
|
|
83
|
+
}
|
|
84
|
+
catch { /* use default */ }
|
|
85
|
+
const rollbackCommand = `git revert ${commitHash} --no-edit`;
|
|
86
|
+
// can_deliver advisory logic: advisory blockers, not hard block
|
|
87
|
+
const deliveryBlockers = [];
|
|
88
|
+
if (riskLevel === "high") {
|
|
89
|
+
deliveryBlockers.push("advisory: high risk — recommend manual review before delivery");
|
|
90
|
+
}
|
|
91
|
+
if (evidenceChain && evidenceChain.uncovered_points.length > 0) {
|
|
92
|
+
deliveryBlockers.push(`advisory: ${evidenceChain.uncovered_points.length} uncovered requirement point(s)`);
|
|
93
|
+
}
|
|
94
|
+
const hasVerification = taskContext.verification?.summary != null;
|
|
95
|
+
if (!hasVerification && changedFiles.length > 0) {
|
|
96
|
+
deliveryBlockers.push("advisory: no verification results — recommend running tests before delivery");
|
|
97
|
+
}
|
|
98
|
+
// can_deliver is always true (advisory, not hard block), but blockers inform the developer
|
|
99
|
+
const canDeliver = true;
|
|
100
|
+
return {
|
|
101
|
+
task_id: taskContext.task_id,
|
|
102
|
+
diff_summary: diffSummary,
|
|
103
|
+
risk_summary: {
|
|
104
|
+
risk_level: riskLevel,
|
|
105
|
+
factors: riskFactors,
|
|
106
|
+
advisory: riskLevel === "high"
|
|
107
|
+
? "advisory: high risk delivery, recommend manual review before proceeding"
|
|
108
|
+
: riskLevel === "medium"
|
|
109
|
+
? "advisory: moderate risk, review changes before delivery"
|
|
110
|
+
: "low risk, safe to proceed",
|
|
111
|
+
},
|
|
112
|
+
evidence_chain: evidenceChain,
|
|
113
|
+
rollback_command: rollbackCommand,
|
|
114
|
+
can_deliver: canDeliver,
|
|
115
|
+
delivery_blockers: deliveryBlockers,
|
|
116
|
+
advisory: deliveryBlockers.length > 0
|
|
117
|
+
? deliveryBlockers.join("; ")
|
|
118
|
+
: "review the diff and evidence chain before confirming delivery",
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 否决交付 — 开发者行使否决权。
|
|
123
|
+
* 返回 VetoResult 记录否决事件,不修改任何状态。
|
|
124
|
+
*/
|
|
125
|
+
export function vetoDelivery(taskId, reason) {
|
|
126
|
+
return {
|
|
127
|
+
vetoed: true,
|
|
128
|
+
task_id: taskId,
|
|
129
|
+
reason,
|
|
130
|
+
timestamp: new Date().toISOString(),
|
|
131
|
+
advisory: "delivery vetoed by developer — no code changes were committed or pushed",
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=developer_sovereignty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer_sovereignty.js","sourceRoot":"","sources":["../../src/engine/developer_sovereignty.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff Ownership — 追踪文件变更归属,支持写前 CAS 校验。
|
|
3
|
+
* CAP-011 实验性: 只做状态模型和 CAS 校验,不替换现有写入流程,不新增 hard block。
|
|
4
|
+
*
|
|
5
|
+
* Diff 归属分类:
|
|
6
|
+
* - baseline: 任务开始前已存在的工作区变更
|
|
7
|
+
* - task_owned: 本任务通过合法写入产生的变更
|
|
8
|
+
* - human_external: 任务期间人类或其他进程的修改
|
|
9
|
+
* - unknown: 无法归因的变更,保守处理
|
|
10
|
+
*
|
|
11
|
+
* CAS (Compare-And-Swap) 校验:
|
|
12
|
+
* - 写前比较目标文件当前 hash 与上次记录的 hash
|
|
13
|
+
* - 不一致 → 校验失败,返回冲突信息
|
|
14
|
+
* - 一致或文件不存在 → 校验通过
|
|
15
|
+
*/
|
|
16
|
+
export type DiffOwnership = "baseline" | "task_owned" | "human_external" | "unknown";
|
|
17
|
+
export interface FileSnapshot {
|
|
18
|
+
/** 文件绝对路径 */
|
|
19
|
+
file_path: string;
|
|
20
|
+
/** SHA-256 hex of file content at snapshot time; null if file did not exist */
|
|
21
|
+
content_hash: string | null;
|
|
22
|
+
/** 归属分类 */
|
|
23
|
+
ownership: DiffOwnership;
|
|
24
|
+
/** 哪个任务写的(task_owned 时非空) */
|
|
25
|
+
task_id: string | null;
|
|
26
|
+
/** 快照时间 ISO */
|
|
27
|
+
captured_at: string;
|
|
28
|
+
}
|
|
29
|
+
export interface CasCheckResult {
|
|
30
|
+
file_path: string;
|
|
31
|
+
/** true = 文件内容与预期一致,可以写入 */
|
|
32
|
+
cas_ok: boolean;
|
|
33
|
+
/** 当前文件 hash(null 表示文件不存在) */
|
|
34
|
+
current_hash: string | null;
|
|
35
|
+
/** 预期的文件 hash(null 表示预期文件不存在) */
|
|
36
|
+
expected_hash: string | null;
|
|
37
|
+
/** 冲突描述 */
|
|
38
|
+
conflict_reason: string | null;
|
|
39
|
+
/** 根据冲突推断的归属 */
|
|
40
|
+
inferred_ownership: DiffOwnership;
|
|
41
|
+
}
|
|
42
|
+
export interface DiffOwnershipState {
|
|
43
|
+
/** 哪个任务持有这个状态 */
|
|
44
|
+
task_id: string;
|
|
45
|
+
/** 快照录时间 */
|
|
46
|
+
baseline_captured_at: string;
|
|
47
|
+
/** baseline 快照 */
|
|
48
|
+
file_snapshots: FileSnapshot[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 捕获一组文件的 baseline 快照。
|
|
52
|
+
* 文件不存在时 content_hash=null,ownership=baseline。
|
|
53
|
+
*/
|
|
54
|
+
export declare function captureBaseline(filePaths: string[], taskId: string, now?: Date): FileSnapshot[];
|
|
55
|
+
/**
|
|
56
|
+
* 写前 CAS 校验: 比较文件当前 hash 与期望 hash。
|
|
57
|
+
* - expected=null 且文件不存在 → ok(新文件)
|
|
58
|
+
* - expected=hash 且文件当前 hash 一致 → ok
|
|
59
|
+
* - 不一致 → 校验失败,推断归属
|
|
60
|
+
*/
|
|
61
|
+
export declare function casCheck(filePath: string, expectedHash: string | null, taskId: string, snapshots: FileSnapshot[]): CasCheckResult;
|
|
62
|
+
/**
|
|
63
|
+
* 记录一次任务写入,返回新的 snapshot。
|
|
64
|
+
*/
|
|
65
|
+
export declare function recordTaskWrite(filePath: string, taskId: string, now?: Date): FileSnapshot;
|
|
66
|
+
/**
|
|
67
|
+
* 根据文件路径查找最新快照(反向遍历,兼容 ES2022)。
|
|
68
|
+
*/
|
|
69
|
+
export declare function findLatestSnapshot(filePath: string, snapshots: readonly FileSnapshot[]): FileSnapshot | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* 统计各归属的文件数。
|
|
72
|
+
*/
|
|
73
|
+
export declare function summarizeOwnership(snapshots: readonly FileSnapshot[]): Record<DiffOwnership, number>;
|
|
74
|
+
//# sourceMappingURL=diff_ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff_ownership.d.ts","sourceRoot":"","sources":["../../src/engine/diff_ownership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,YAAY,GACZ,gBAAgB,GAChB,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW;IACX,SAAS,EAAE,aAAa,CAAC;IACzB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iCAAiC;IACjC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW;IACX,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB;IAChB,kBAAkB,EAAE,aAAa,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY;IACZ,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB;IAClB,cAAc,EAAE,YAAY,EAAE,CAAC;CAChC;AAeD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,IAAI,GACT,YAAY,EAAE,CAShB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY,EAAE,GACxB,cAAc,CAwDhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,IAAI,GACT,YAAY,CAQd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,YAAY,EAAE,GACjC,YAAY,GAAG,SAAS,CAM1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,YAAY,EAAE,GACjC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAW/B"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff Ownership — 追踪文件变更归属,支持写前 CAS 校验。
|
|
3
|
+
* CAP-011 实验性: 只做状态模型和 CAS 校验,不替换现有写入流程,不新增 hard block。
|
|
4
|
+
*
|
|
5
|
+
* Diff 归属分类:
|
|
6
|
+
* - baseline: 任务开始前已存在的工作区变更
|
|
7
|
+
* - task_owned: 本任务通过合法写入产生的变更
|
|
8
|
+
* - human_external: 任务期间人类或其他进程的修改
|
|
9
|
+
* - unknown: 无法归因的变更,保守处理
|
|
10
|
+
*
|
|
11
|
+
* CAS (Compare-And-Swap) 校验:
|
|
12
|
+
* - 写前比较目标文件当前 hash 与上次记录的 hash
|
|
13
|
+
* - 不一致 → 校验失败,返回冲突信息
|
|
14
|
+
* - 一致或文件不存在 → 校验通过
|
|
15
|
+
*/
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { createHash } from "node:crypto";
|
|
19
|
+
function sha256Hex(content) {
|
|
20
|
+
return createHash("sha256").update(content).digest("hex");
|
|
21
|
+
}
|
|
22
|
+
function hashFile(filePath) {
|
|
23
|
+
try {
|
|
24
|
+
const content = fs.readFileSync(filePath);
|
|
25
|
+
return sha256Hex(content);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 捕获一组文件的 baseline 快照。
|
|
33
|
+
* 文件不存在时 content_hash=null,ownership=baseline。
|
|
34
|
+
*/
|
|
35
|
+
export function captureBaseline(filePaths, taskId, now) {
|
|
36
|
+
const ts = (now ?? new Date()).toISOString();
|
|
37
|
+
return filePaths.map((fp) => ({
|
|
38
|
+
file_path: path.resolve(fp),
|
|
39
|
+
content_hash: hashFile(fp),
|
|
40
|
+
ownership: "baseline",
|
|
41
|
+
task_id: null,
|
|
42
|
+
captured_at: ts,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 写前 CAS 校验: 比较文件当前 hash 与期望 hash。
|
|
47
|
+
* - expected=null 且文件不存在 → ok(新文件)
|
|
48
|
+
* - expected=hash 且文件当前 hash 一致 → ok
|
|
49
|
+
* - 不一致 → 校验失败,推断归属
|
|
50
|
+
*/
|
|
51
|
+
export function casCheck(filePath, expectedHash, taskId, snapshots) {
|
|
52
|
+
const resolved = path.resolve(filePath);
|
|
53
|
+
const currentHash = hashFile(resolved);
|
|
54
|
+
// 文件不存在 + 预期不存在 → ok, ownership 取最新 snapshot
|
|
55
|
+
if (expectedHash === null && currentHash === null) {
|
|
56
|
+
const snap = findLatestSnapshot(filePath, snapshots);
|
|
57
|
+
return {
|
|
58
|
+
file_path: resolved,
|
|
59
|
+
cas_ok: true,
|
|
60
|
+
current_hash: null,
|
|
61
|
+
expected_hash: null,
|
|
62
|
+
conflict_reason: null,
|
|
63
|
+
inferred_ownership: snap?.ownership ?? "baseline",
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// hash 一致 → ok, ownership 取最新匹配 snapshot 的归属
|
|
67
|
+
if (expectedHash === currentHash) {
|
|
68
|
+
const snap = findLatestSnapshot(filePath, snapshots);
|
|
69
|
+
return {
|
|
70
|
+
file_path: resolved,
|
|
71
|
+
cas_ok: true,
|
|
72
|
+
current_hash: currentHash,
|
|
73
|
+
expected_hash: expectedHash,
|
|
74
|
+
conflict_reason: null,
|
|
75
|
+
inferred_ownership: snap?.ownership ?? "baseline",
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// 不一致 → 判断归属(取最近一次快照)
|
|
79
|
+
const snap = findLatestSnapshot(filePath, snapshots);
|
|
80
|
+
let ownership = "unknown";
|
|
81
|
+
let reason;
|
|
82
|
+
if (snap && snap.ownership === "baseline" && snap.content_hash !== currentHash) {
|
|
83
|
+
// 文件在 baseline 之后被修改过,但不是本任务改的
|
|
84
|
+
ownership = "human_external";
|
|
85
|
+
reason = `file changed since baseline (expected ${expectedHash?.substring(0, 12) ?? "null"}, got ${currentHash?.substring(0, 12) ?? "null"})`;
|
|
86
|
+
}
|
|
87
|
+
else if (snap && snap.ownership === "task_owned") {
|
|
88
|
+
// 本任务之前改过,但又变了(可能是外部并发修改)
|
|
89
|
+
ownership = "human_external";
|
|
90
|
+
reason = `task-owned file modified externally (expected ${expectedHash?.substring(0, 12) ?? "null"}, got ${currentHash?.substring(0, 12) ?? "null"})`;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
ownership = "unknown";
|
|
94
|
+
reason = `unexpected file state (expected ${expectedHash?.substring(0, 12) ?? "null"}, got ${currentHash?.substring(0, 12) ?? "null"})`;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
file_path: resolved,
|
|
98
|
+
cas_ok: false,
|
|
99
|
+
current_hash: currentHash,
|
|
100
|
+
expected_hash: expectedHash,
|
|
101
|
+
conflict_reason: reason,
|
|
102
|
+
inferred_ownership: ownership,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 记录一次任务写入,返回新的 snapshot。
|
|
107
|
+
*/
|
|
108
|
+
export function recordTaskWrite(filePath, taskId, now) {
|
|
109
|
+
return {
|
|
110
|
+
file_path: path.resolve(filePath),
|
|
111
|
+
content_hash: hashFile(filePath),
|
|
112
|
+
ownership: "task_owned",
|
|
113
|
+
task_id: taskId,
|
|
114
|
+
captured_at: (now ?? new Date()).toISOString(),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 根据文件路径查找最新快照(反向遍历,兼容 ES2022)。
|
|
119
|
+
*/
|
|
120
|
+
export function findLatestSnapshot(filePath, snapshots) {
|
|
121
|
+
const resolved = path.resolve(filePath);
|
|
122
|
+
for (let i = snapshots.length - 1; i >= 0; i--) {
|
|
123
|
+
if (snapshots[i].file_path === resolved)
|
|
124
|
+
return snapshots[i];
|
|
125
|
+
}
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 统计各归属的文件数。
|
|
130
|
+
*/
|
|
131
|
+
export function summarizeOwnership(snapshots) {
|
|
132
|
+
const counts = {
|
|
133
|
+
baseline: 0,
|
|
134
|
+
task_owned: 0,
|
|
135
|
+
human_external: 0,
|
|
136
|
+
unknown: 0,
|
|
137
|
+
};
|
|
138
|
+
for (const s of snapshots) {
|
|
139
|
+
counts[s.ownership]++;
|
|
140
|
+
}
|
|
141
|
+
return counts;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=diff_ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff_ownership.js","sourceRoot":"","sources":["../../src/engine/diff_ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff Ownership Store — 持久化文件归属快照,绑定 stateDir。
|
|
3
|
+
* CAP-011 实验性: 只做 advisory 冲突报告,不 hard block。
|
|
4
|
+
*
|
|
5
|
+
* 存储: JSON 文件,原子写入,路径绑定 stateDir。
|
|
6
|
+
* 每个 task_id 下的快照按时间顺序追加。
|
|
7
|
+
*/
|
|
8
|
+
import { type FileSnapshot, type CasCheckResult, type DiffOwnership } from "./diff_ownership.js";
|
|
9
|
+
export interface ConflictReport {
|
|
10
|
+
file_path: string;
|
|
11
|
+
expected_hash: string | null;
|
|
12
|
+
current_hash: string | null;
|
|
13
|
+
inferred_ownership: DiffOwnership;
|
|
14
|
+
severity: "advisory";
|
|
15
|
+
message: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ScopeBaselineResult {
|
|
18
|
+
snapshots: FileSnapshot[];
|
|
19
|
+
advisory_summary: string | null;
|
|
20
|
+
total_files_found: number;
|
|
21
|
+
files_excluded: number;
|
|
22
|
+
files_captured: number;
|
|
23
|
+
exceeded_limit: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface TaskSnapshotState {
|
|
26
|
+
task_id: string;
|
|
27
|
+
baseline_captured_at: string | null;
|
|
28
|
+
snapshots: FileSnapshot[];
|
|
29
|
+
}
|
|
30
|
+
export declare class DiffOwnershipStore {
|
|
31
|
+
private filePath;
|
|
32
|
+
private states;
|
|
33
|
+
private loaded;
|
|
34
|
+
constructor(stateDir: string);
|
|
35
|
+
private ensureLoaded;
|
|
36
|
+
private persist;
|
|
37
|
+
/**
|
|
38
|
+
* Capture baseline for a task. Call once when task starts executing.
|
|
39
|
+
*/
|
|
40
|
+
captureBaseline(taskId: string, filePaths: string[]): FileSnapshot[];
|
|
41
|
+
/**
|
|
42
|
+
* Capture baseline from scope paths, expanding directories into their existing files.
|
|
43
|
+
* Applies exclusion rules and size limits. Returns advisory summary if exceeded.
|
|
44
|
+
* Does NOT hard block — caller receives the summary and decides.
|
|
45
|
+
*/
|
|
46
|
+
captureBaselineFromScope(taskId: string, scopePaths: string[], options?: {
|
|
47
|
+
maxFiles?: number;
|
|
48
|
+
maxTotalBytes?: number;
|
|
49
|
+
}): ScopeBaselineResult;
|
|
50
|
+
/**
|
|
51
|
+
* Record a task-owned write for a file.
|
|
52
|
+
*/
|
|
53
|
+
recordWrite(taskId: string, filePath: string): FileSnapshot;
|
|
54
|
+
/**
|
|
55
|
+
* Run CAS check before writing. Returns advisory conflict report if check fails.
|
|
56
|
+
* Does NOT block the write — caller decides what to do.
|
|
57
|
+
*/
|
|
58
|
+
preWriteCheck(taskId: string, filePath: string): {
|
|
59
|
+
cas: CasCheckResult;
|
|
60
|
+
conflict: ConflictReport | null;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Get all snapshots for a task.
|
|
64
|
+
*/
|
|
65
|
+
getSnapshots(taskId: string): FileSnapshot[];
|
|
66
|
+
/**
|
|
67
|
+
* Get ownership summary for a task.
|
|
68
|
+
*/
|
|
69
|
+
getOwnershipSummary(taskId: string): Record<DiffOwnership, number>;
|
|
70
|
+
/**
|
|
71
|
+
* Clean up state for a completed/failed task.
|
|
72
|
+
*/
|
|
73
|
+
clearTask(taskId: string): void;
|
|
74
|
+
clear(): void;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=diff_ownership_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff_ownership_store.d.ts","sourceRoot":"","sources":["../../src/engine/diff_ownership_store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kBAAkB,EAAE,aAAa,CAAC;IAClC,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAmCD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,MAAM;IAO5B,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,OAAO;IAOf;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE;IAcpE;;;;OAIG;IACH,wBAAwB,CACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACtD,mBAAmB;IA8EtB;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY;IAa3D;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf;QAAE,GAAG,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;KAAE;IA0B3D;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE;IAM5C;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC;IAIlE;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM/B,KAAK,IAAI,IAAI;CAKd"}
|