kibi-cli 2.2.0 → 2.4.0
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/dist/cli-json-command.d.ts.map +1 -1
- package/dist/cli-json-command.js +2 -2
- package/dist/cli-operation-loader.d.ts.map +1 -1
- package/dist/cli-operation-loader.js +3 -0
- package/dist/cli-operation-metadata.d.ts +5 -1
- package/dist/cli-operation-metadata.d.ts.map +1 -1
- package/dist/cli-operation-metadata.js +6 -1
- package/dist/cli-register-maintenance.d.ts.map +1 -1
- package/dist/cli-register-maintenance.js +7 -0
- package/dist/cli-register-reporting.d.ts.map +1 -1
- package/dist/cli-register-reporting.js +4 -0
- package/dist/commands/check-diff.d.ts +5 -0
- package/dist/commands/check-diff.d.ts.map +1 -0
- package/dist/commands/check-diff.js +62 -0
- package/dist/commands/check-generated.d.ts.map +1 -1
- package/dist/commands/check-generated.js +41 -18
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +210 -73
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +63 -29
- package/dist/commands/github-init.d.ts.map +1 -1
- package/dist/commands/github-init.js +9 -2
- package/dist/commands/merge-driver.d.ts +31 -0
- package/dist/commands/merge-driver.d.ts.map +1 -0
- package/dist/commands/merge-driver.js +268 -0
- package/dist/commands/sync/manifest.d.ts.map +1 -1
- package/dist/commands/sync/manifest.js +3 -1
- package/dist/engine.d.ts +15 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +252 -52
- package/dist/extractors/symbols-coordinator.d.ts +7 -0
- package/dist/extractors/symbols-coordinator.d.ts.map +1 -1
- package/dist/extractors/symbols-coordinator.js +75 -39
- package/dist/operations/bootstrap/candidates.js +1 -1
- package/dist/operations/bootstrap/discovery.js +1 -1
- package/dist/operations/bootstrap/generate.d.ts.map +1 -1
- package/dist/operations/bootstrap/generate.js +21 -5
- package/dist/operations/bootstrap/guidance-actions.d.ts.map +1 -1
- package/dist/operations/bootstrap/guidance-actions.js +3 -0
- package/dist/operations/bootstrap/guidance.d.ts.map +1 -1
- package/dist/operations/bootstrap/guidance.js +7 -1
- package/dist/operations/bootstrap/intent-claims.d.ts +17 -0
- package/dist/operations/bootstrap/intent-claims.d.ts.map +1 -0
- package/dist/operations/bootstrap/intent-claims.js +95 -0
- package/dist/operations/bootstrap/presentation.d.ts +2 -0
- package/dist/operations/bootstrap/presentation.d.ts.map +1 -1
- package/dist/operations/bootstrap/presentation.js +60 -1
- package/dist/operations/bootstrap/types.d.ts +28 -0
- package/dist/operations/bootstrap/types.d.ts.map +1 -1
- package/dist/operations/bootstrap/types.js +16 -0
- package/dist/operations/modeling/predicate-inference-1.js +1 -1
- package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
- package/dist/operations/mutation/source-authoring.js +175 -53
- package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-refresh.js +4 -1
- package/dist/operations/mutation/upsert.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.js +5 -7
- package/dist/operations/planning/apply-plan.d.ts.map +1 -1
- package/dist/operations/planning/apply-plan.js +5 -9
- package/dist/operations/proof/ingest-proof.d.ts.map +1 -1
- package/dist/operations/proof/ingest-proof.js +1 -0
- package/dist/operations/semantic-advisor/analysis-receipt.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analysis-receipt.js +7 -1
- package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analyze-prose.js +26 -4
- package/dist/operations/semantic-advisor/clauses.d.ts +1 -0
- package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/clauses.js +7 -1
- package/dist/performance-trace.d.ts +17 -0
- package/dist/performance-trace.d.ts.map +1 -0
- package/dist/performance-trace.js +134 -0
- package/dist/plugins/approved-source-analyzers.d.ts +13 -0
- package/dist/plugins/approved-source-analyzers.d.ts.map +1 -0
- package/dist/plugins/approved-source-analyzers.generated.d.ts +71 -0
- package/dist/plugins/approved-source-analyzers.generated.d.ts.map +1 -0
- package/dist/plugins/approved-source-analyzers.generated.js +77 -0
- package/dist/plugins/approved-source-analyzers.js +3 -0
- package/dist/plugins/maintenance-source-analysis.d.ts +14 -0
- package/dist/plugins/maintenance-source-analysis.d.ts.map +1 -0
- package/dist/plugins/maintenance-source-analysis.js +191 -0
- package/dist/plugins/registry.d.ts +2 -1
- package/dist/plugins/registry.d.ts.map +1 -1
- package/dist/plugins/registry.js +6 -1
- package/dist/plugins/source-analysis-service.d.ts +36 -1
- package/dist/plugins/source-analysis-service.d.ts.map +1 -1
- package/dist/plugins/source-analysis-service.js +184 -27
- package/dist/plugins/source-change-analysis.d.ts +15 -0
- package/dist/plugins/source-change-analysis.d.ts.map +1 -0
- package/dist/plugins/source-change-analysis.js +54 -0
- package/dist/plugins/source-classification.d.ts +41 -0
- package/dist/plugins/source-classification.d.ts.map +1 -0
- package/dist/plugins/source-classification.js +490 -0
- package/dist/prolog/swipl-resolver.d.ts +88 -0
- package/dist/prolog/swipl-resolver.d.ts.map +1 -0
- package/dist/prolog/swipl-resolver.js +446 -0
- package/dist/prolog.d.ts +15 -1
- package/dist/prolog.d.ts.map +1 -1
- package/dist/prolog.js +67 -6
- package/dist/public/diagnostic-usage.d.ts +14 -0
- package/dist/public/diagnostic-usage.d.ts.map +1 -1
- package/dist/public/diagnostic-usage.js +55 -1
- package/dist/public/impact/analyzer.d.ts.map +1 -1
- package/dist/public/impact/analyzer.js +56 -5
- package/dist/public/impact/diagnostics.d.ts.map +1 -1
- package/dist/public/impact/diagnostics.js +3 -1
- package/dist/public/impact/manifest.d.ts.map +1 -1
- package/dist/public/impact/manifest.js +15 -1
- package/dist/public/impact/source-changes.d.ts.map +1 -1
- package/dist/public/impact/source-changes.js +35 -27
- package/dist/public/impact/types.d.ts +2 -0
- package/dist/public/impact/types.d.ts.map +1 -1
- package/dist/public/operations/catalog.d.ts +117 -1
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/catalog.js +2 -0
- package/dist/public/operations/contracts.d.ts.map +1 -1
- package/dist/public/operations/contracts.js +309 -8
- package/dist/public/operations/impact-review-preparation.d.ts +14 -0
- package/dist/public/operations/impact-review-preparation.d.ts.map +1 -0
- package/dist/public/operations/impact-review-preparation.js +379 -0
- package/dist/public/operations/index.d.ts +2 -0
- package/dist/public/operations/index.d.ts.map +1 -1
- package/dist/public/operations/index.js +2 -0
- package/dist/public/operations/node-ports.d.ts.map +1 -1
- package/dist/public/operations/node-ports.js +1 -35
- package/dist/public/operations/proof-receipt-projection.d.ts +5 -0
- package/dist/public/operations/proof-receipt-projection.d.ts.map +1 -0
- package/dist/public/operations/proof-receipt-projection.js +36 -0
- package/dist/public/operations/specs/bootstrap.d.ts +73 -1
- package/dist/public/operations/specs/bootstrap.d.ts.map +1 -1
- package/dist/public/operations/specs/bootstrap.js +66 -1
- package/dist/public/operations/specs/impact-review-preparation.d.ts +47 -0
- package/dist/public/operations/specs/impact-review-preparation.d.ts.map +1 -0
- package/dist/public/operations/specs/impact-review-preparation.js +43 -0
- package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
- package/dist/public/operations/symbol-repair-plan.js +3 -1
- package/dist/public/operations/types.d.ts +1 -1
- package/dist/public/operations/types.d.ts.map +1 -1
- package/dist/public/skills/kibi-bootstrap/SKILL.md +47 -11
- package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +6 -1
- package/dist/public/skills/kibi-usage/SKILL.md +14 -0
- package/dist/public/skills/kibi-usage/resources/operation-access.md +5 -0
- package/dist/public/telemetry-acceptance.d.ts +8 -0
- package/dist/public/telemetry-acceptance.d.ts.map +1 -1
- package/dist/public/telemetry-acceptance.js +10 -0
- package/dist/traceability/analysis-gate.d.ts +39 -0
- package/dist/traceability/analysis-gate.d.ts.map +1 -0
- package/dist/traceability/analysis-gate.js +51 -0
- package/dist/traceability/git-change-snapshot.d.ts +27 -0
- package/dist/traceability/git-change-snapshot.d.ts.map +1 -0
- package/dist/traceability/git-change-snapshot.js +411 -0
- package/dist/traceability/git-staged.d.ts +5 -1
- package/dist/traceability/git-staged.d.ts.map +1 -1
- package/dist/traceability/git-staged.js +16 -11
- package/dist/traceability/impact-evaluator.d.ts +54 -0
- package/dist/traceability/impact-evaluator.d.ts.map +1 -0
- package/dist/traceability/impact-evaluator.js +270 -0
- package/dist/traceability/impact-git-tree.d.ts +12 -0
- package/dist/traceability/impact-git-tree.d.ts.map +1 -0
- package/dist/traceability/impact-git-tree.js +46 -0
- package/dist/traceability/impact-knowledge.d.ts +16 -0
- package/dist/traceability/impact-knowledge.d.ts.map +1 -0
- package/dist/traceability/impact-knowledge.js +165 -0
- package/dist/traceability/impact-policy.d.ts +15 -0
- package/dist/traceability/impact-policy.d.ts.map +1 -0
- package/dist/traceability/impact-policy.js +48 -0
- package/dist/traceability/impact-policy.v1.schema.json +48 -0
- package/dist/traceability/impact-pr-diff.d.ts +5 -0
- package/dist/traceability/impact-pr-diff.d.ts.map +1 -0
- package/dist/traceability/impact-pr-diff.js +83 -0
- package/dist/traceability/impact-record-validation.d.ts +9 -0
- package/dist/traceability/impact-record-validation.d.ts.map +1 -0
- package/dist/traceability/impact-record-validation.js +113 -0
- package/dist/traceability/impact-review.d.ts +148 -0
- package/dist/traceability/impact-review.d.ts.map +1 -0
- package/dist/traceability/impact-review.js +494 -0
- package/dist/traceability/impact-review.schema.json +365 -0
- package/dist/traceability/impact-side-evidence.d.ts +13 -0
- package/dist/traceability/impact-side-evidence.d.ts.map +1 -0
- package/dist/traceability/impact-side-evidence.js +240 -0
- package/dist/traceability/reviewed-coordinate-refresh.d.ts +10 -0
- package/dist/traceability/reviewed-coordinate-refresh.d.ts.map +1 -0
- package/dist/traceability/reviewed-coordinate-refresh.js +49 -0
- package/dist/traceability/snapshot-knowledge.d.ts +4 -0
- package/dist/traceability/snapshot-knowledge.d.ts.map +1 -0
- package/dist/traceability/snapshot-knowledge.js +98 -0
- package/dist/traceability/staged-file-coverage.d.ts +23 -0
- package/dist/traceability/staged-file-coverage.d.ts.map +1 -1
- package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
- package/dist/traceability/staged-impact-contract.js +2 -16
- package/dist/traceability/staged-symbols-manifest.d.ts +4 -0
- package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
- package/dist/traceability/staged-symbols-manifest.js +17 -6
- package/dist/traceability/symbol-extract.d.ts +3 -5
- package/dist/traceability/symbol-extract.d.ts.map +1 -1
- package/dist/traceability/symbol-extract.js +49 -34
- package/dist/traceability/temp-kb.d.ts +1 -1
- package/dist/traceability/temp-kb.d.ts.map +1 -1
- package/dist/traceability/temp-kb.js +49 -13
- package/dist/traceability/trusted-pr-event.d.ts +13 -0
- package/dist/traceability/trusted-pr-event.d.ts.map +1 -0
- package/dist/traceability/trusted-pr-event.js +105 -0
- package/dist/utils/canonical-path.d.ts +3 -0
- package/dist/utils/canonical-path.d.ts.map +1 -0
- package/dist/utils/canonical-path.js +33 -0
- package/package.json +14 -5
- package/src/public/diagnostic-usage.ts +59 -1
- package/src/public/impact/analyzer.ts +88 -5
- package/src/public/impact/diagnostics.ts +7 -5
- package/src/public/impact/manifest.ts +14 -1
- package/src/public/impact/source-changes.ts +39 -34
- package/src/public/impact/types.ts +5 -0
- package/src/public/operations/catalog.ts +2 -0
- package/src/public/operations/contracts.ts +385 -9
- package/src/public/operations/impact-review-preparation.ts +548 -0
- package/src/public/operations/index.ts +2 -0
- package/src/public/operations/node-ports.ts +1 -39
- package/src/public/operations/proof-receipt-projection.ts +39 -0
- package/src/public/operations/specs/bootstrap.ts +78 -4
- package/src/public/operations/specs/impact-review-preparation.ts +46 -0
- package/src/public/operations/symbol-repair-plan.ts +3 -1
- package/src/public/operations/types.ts +1 -0
- package/src/public/skills/kibi-bootstrap/SKILL.md +47 -11
- package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +6 -1
- package/src/public/skills/kibi-usage/SKILL.md +14 -0
- package/src/public/skills/kibi-usage/resources/operation-access.md +5 -0
- package/src/public/telemetry-acceptance.ts +9 -0
- package/src/traceability/impact-policy.v1.schema.json +48 -0
- package/src/traceability/impact-review.schema.json +365 -0
- package/templates/github/kibi-badge.yml +0 -4
- package/templates/github/kibi-report.yml +0 -4
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { isMap, isSeq, parseDocument } from "yaml";
|
|
4
|
+
/**
|
|
5
|
+
* Same serialization options as authored manifest writes, so a merge that
|
|
6
|
+
* changes nothing reproduces the input bytes and edits never refold rows.
|
|
7
|
+
*/
|
|
8
|
+
const AUTHORED_YAML_OPTIONS = { lineWidth: 0 };
|
|
9
|
+
/**
|
|
10
|
+
* Top-level lists Kibi keeps keyed by `id`: `.kb/symbols.yaml` and the
|
|
11
|
+
* `.kb/relationships/*.yaml` shards.
|
|
12
|
+
*/
|
|
13
|
+
const ID_KEYED_LISTS = ["symbols", "relationships"];
|
|
14
|
+
/** Record fields whose values are sets: concurrent additions union instead of conflicting. */
|
|
15
|
+
const SET_FIELDS = new Set(["relationships", "links"]);
|
|
16
|
+
function canonical(value) {
|
|
17
|
+
if (Array.isArray(value))
|
|
18
|
+
return `[${value.map(canonical).join(",")}]`;
|
|
19
|
+
if (value && typeof value === "object") {
|
|
20
|
+
const entries = Object.entries(value)
|
|
21
|
+
.filter(([, entry]) => entry !== undefined)
|
|
22
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));
|
|
23
|
+
return `{${entries
|
|
24
|
+
.map(([key, entry]) => `${JSON.stringify(key)}:${canonical(entry)}`)
|
|
25
|
+
.join(",")}}`;
|
|
26
|
+
}
|
|
27
|
+
return JSON.stringify(value) ?? "undefined";
|
|
28
|
+
}
|
|
29
|
+
function same(left, right) {
|
|
30
|
+
return canonical(left) === canonical(right);
|
|
31
|
+
}
|
|
32
|
+
function parseManifest(label, content, conflicts) {
|
|
33
|
+
const doc = parseDocument(content);
|
|
34
|
+
if (doc.errors.length > 0) {
|
|
35
|
+
conflicts.push(`${label}: not valid YAML (${doc.errors[0]?.message})`);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const top = doc.toJS() ?? {};
|
|
39
|
+
if (typeof top !== "object" || Array.isArray(top)) {
|
|
40
|
+
conflicts.push(`${label}: top level is not a mapping`);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const listKeys = ID_KEYED_LISTS.filter((key) => key in top);
|
|
44
|
+
if (listKeys.length > 1) {
|
|
45
|
+
conflicts.push(`${label}: holds both ${listKeys.join(" and ")}`);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const listKey = listKeys[0];
|
|
49
|
+
const rest = { ...top };
|
|
50
|
+
if (listKey)
|
|
51
|
+
delete rest[listKey];
|
|
52
|
+
const records = new Map();
|
|
53
|
+
const order = [];
|
|
54
|
+
const seq = listKey ? doc.get(listKey, true) : undefined;
|
|
55
|
+
if (seq === undefined || seq === null) {
|
|
56
|
+
return { doc, listKey, records, order, rest };
|
|
57
|
+
}
|
|
58
|
+
if (!isSeq(seq)) {
|
|
59
|
+
conflicts.push(`${label}: ${listKey} is not a list`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
for (const item of seq.items) {
|
|
63
|
+
const id = isMap(item) ? item.get("id") : undefined;
|
|
64
|
+
if (!isMap(item) || typeof id !== "string" || !id) {
|
|
65
|
+
conflicts.push(`${label}: ${listKey} entry without a string id`);
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
if (records.has(id)) {
|
|
69
|
+
conflicts.push(`${label}: duplicate id ${id}`);
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
records.set(id, { node: item, value: item.toJS(doc) });
|
|
73
|
+
order.push(id);
|
|
74
|
+
}
|
|
75
|
+
return { doc, listKey, records, order, rest };
|
|
76
|
+
}
|
|
77
|
+
/** Three-way merge of a set-valued field: keep ours, drop their removals, add their additions. */
|
|
78
|
+
function mergeSet(base, ours, theirs) {
|
|
79
|
+
const list = (value) => (Array.isArray(value) ? value : []);
|
|
80
|
+
const baseKeys = new Set(list(base).map(canonical));
|
|
81
|
+
const theirKeys = new Set(list(theirs).map(canonical));
|
|
82
|
+
const merged = list(ours).filter((entry) => {
|
|
83
|
+
const key = canonical(entry);
|
|
84
|
+
return !(baseKeys.has(key) && !theirKeys.has(key));
|
|
85
|
+
});
|
|
86
|
+
const mergedKeys = new Set(merged.map(canonical));
|
|
87
|
+
for (const entry of list(theirs)) {
|
|
88
|
+
const key = canonical(entry);
|
|
89
|
+
if (baseKeys.has(key) || mergedKeys.has(key))
|
|
90
|
+
continue;
|
|
91
|
+
merged.push(entry);
|
|
92
|
+
mergedKeys.add(key);
|
|
93
|
+
}
|
|
94
|
+
return merged;
|
|
95
|
+
}
|
|
96
|
+
function mergeRecord(id, base, ours, theirs, conflicts) {
|
|
97
|
+
const merged = {};
|
|
98
|
+
const keys = [
|
|
99
|
+
...Object.keys(ours),
|
|
100
|
+
...Object.keys(theirs).filter((key) => !(key in ours)),
|
|
101
|
+
];
|
|
102
|
+
for (const key of keys) {
|
|
103
|
+
const baseValue = base?.[key];
|
|
104
|
+
const ourValue = ours[key];
|
|
105
|
+
const theirValue = theirs[key];
|
|
106
|
+
let value;
|
|
107
|
+
if (same(ourValue, theirValue) || same(theirValue, baseValue)) {
|
|
108
|
+
value = ourValue;
|
|
109
|
+
}
|
|
110
|
+
else if (same(ourValue, baseValue)) {
|
|
111
|
+
value = theirValue;
|
|
112
|
+
}
|
|
113
|
+
else if (SET_FIELDS.has(key) &&
|
|
114
|
+
[baseValue, ourValue, theirValue].every((entry) => entry === undefined || Array.isArray(entry))) {
|
|
115
|
+
value = mergeSet(baseValue, ourValue, theirValue);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
conflicts.push(`${id}: both sides changed ${key}`);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (value !== undefined)
|
|
122
|
+
merged[key] = value;
|
|
123
|
+
}
|
|
124
|
+
return merged;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Three-way merge of an id-keyed Kibi manifest (`.kb/symbols.yaml` or a
|
|
128
|
+
* `.kb/relationships/*.yaml` shard).
|
|
129
|
+
*
|
|
130
|
+
* Both sides usually append new records at the end of the list, which Git
|
|
131
|
+
* reports as a conflict although the additions are independent. This merge
|
|
132
|
+
* keeps every record either side added, applies edits made on only one
|
|
133
|
+
* side, honors a deletion made on one side when the other left the record
|
|
134
|
+
* unchanged, and unions concurrent relationship and link additions on one
|
|
135
|
+
* symbol. Anything else both sides changed differently is a real conflict
|
|
136
|
+
* and is reported rather than guessed.
|
|
137
|
+
*/
|
|
138
|
+
// implements REQ-cli-kb-merge-driver
|
|
139
|
+
export function mergeKbManifests(baseContent, oursContent, theirsContent) {
|
|
140
|
+
const conflicts = [];
|
|
141
|
+
const base = parseManifest("base", baseContent, conflicts);
|
|
142
|
+
const ours = parseManifest("ours", oursContent, conflicts);
|
|
143
|
+
const theirs = parseManifest("theirs", theirsContent, conflicts);
|
|
144
|
+
if (!base || !ours || !theirs)
|
|
145
|
+
return { status: "conflict", conflicts };
|
|
146
|
+
const listKeys = new Set([base.listKey, ours.listKey, theirs.listKey].filter(Boolean));
|
|
147
|
+
if (listKeys.size > 1) {
|
|
148
|
+
return {
|
|
149
|
+
status: "conflict",
|
|
150
|
+
conflicts: [`sides hold different lists: ${[...listKeys].join(", ")}`],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const listKey = ours.listKey ?? theirs.listKey;
|
|
154
|
+
if (!same(ours.rest, theirs.rest) && !same(theirs.rest, base.rest)) {
|
|
155
|
+
if (!same(ours.rest, base.rest)) {
|
|
156
|
+
return {
|
|
157
|
+
status: "conflict",
|
|
158
|
+
conflicts: ["both sides changed top-level manifest fields"],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
for (const key of Object.keys(ours.rest)) {
|
|
162
|
+
if (!(key in theirs.rest))
|
|
163
|
+
ours.doc.delete(key);
|
|
164
|
+
}
|
|
165
|
+
for (const [key, value] of Object.entries(theirs.rest)) {
|
|
166
|
+
ours.doc.set(key, value);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (!listKey) {
|
|
170
|
+
return {
|
|
171
|
+
status: "merged",
|
|
172
|
+
content: ours.doc.toString(AUTHORED_YAML_OPTIONS),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const items = [];
|
|
176
|
+
for (const id of ours.order) {
|
|
177
|
+
const ourRecord = ours.records.get(id);
|
|
178
|
+
if (!ourRecord)
|
|
179
|
+
continue;
|
|
180
|
+
const baseRecord = base.records.get(id);
|
|
181
|
+
const theirRecord = theirs.records.get(id);
|
|
182
|
+
if (!theirRecord) {
|
|
183
|
+
if (!baseRecord)
|
|
184
|
+
items.push(ourRecord.node);
|
|
185
|
+
else if (!same(ourRecord.value, baseRecord.value)) {
|
|
186
|
+
conflicts.push(`${id}: changed on ours but deleted on theirs`);
|
|
187
|
+
}
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (same(ourRecord.value, theirRecord.value) ||
|
|
191
|
+
(baseRecord && same(theirRecord.value, baseRecord.value))) {
|
|
192
|
+
items.push(ourRecord.node);
|
|
193
|
+
}
|
|
194
|
+
else if (baseRecord && same(ourRecord.value, baseRecord.value)) {
|
|
195
|
+
items.push(theirRecord.node.clone());
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
const merged = mergeRecord(id, baseRecord?.value, ourRecord.value, theirRecord.value, conflicts);
|
|
199
|
+
items.push(ours.doc.createNode(merged));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
for (const id of theirs.order) {
|
|
203
|
+
if (ours.records.has(id))
|
|
204
|
+
continue;
|
|
205
|
+
const theirRecord = theirs.records.get(id);
|
|
206
|
+
if (!theirRecord)
|
|
207
|
+
continue;
|
|
208
|
+
const baseRecord = base.records.get(id);
|
|
209
|
+
if (!baseRecord)
|
|
210
|
+
items.push(theirRecord.node.clone());
|
|
211
|
+
else if (!same(theirRecord.value, baseRecord.value)) {
|
|
212
|
+
conflicts.push(`${id}: deleted on ours but changed on theirs`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (conflicts.length > 0)
|
|
216
|
+
return { status: "conflict", conflicts };
|
|
217
|
+
const seq = ours.doc.get(listKey, true);
|
|
218
|
+
if (isSeq(seq))
|
|
219
|
+
seq.items = items;
|
|
220
|
+
else
|
|
221
|
+
ours.doc.set(listKey, ours.doc.createNode(items));
|
|
222
|
+
return {
|
|
223
|
+
status: "merged",
|
|
224
|
+
content: ours.doc.toString(AUTHORED_YAML_OPTIONS),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
function readOptional(filePath) {
|
|
228
|
+
try {
|
|
229
|
+
return readFileSync(filePath, "utf8");
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
if (error.code === "ENOENT")
|
|
233
|
+
return "";
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Git merge driver entry point: `kibi merge-driver %O %A %B`.
|
|
239
|
+
*
|
|
240
|
+
* Writes the merged manifest to the current (`%A`) file and exits 0. On a
|
|
241
|
+
* real conflict it prints each one and falls back to Git's textual merge so
|
|
242
|
+
* the file carries ordinary conflict markers, then exits 1 so Git keeps the
|
|
243
|
+
* path unmerged.
|
|
244
|
+
*/
|
|
245
|
+
// implements REQ-cli-kb-merge-driver
|
|
246
|
+
export async function mergeDriverCommand(basePath, currentPath, otherPath) {
|
|
247
|
+
const result = mergeKbManifests(readOptional(basePath), readFileSync(currentPath, "utf8"), readFileSync(otherPath, "utf8"));
|
|
248
|
+
if (result.status === "merged") {
|
|
249
|
+
writeFileSync(currentPath, result.content);
|
|
250
|
+
return { exitCode: 0 };
|
|
251
|
+
}
|
|
252
|
+
for (const conflict of result.conflicts) {
|
|
253
|
+
console.error(`kibi merge-driver: ${conflict}`);
|
|
254
|
+
}
|
|
255
|
+
spawnSync("git", [
|
|
256
|
+
"merge-file",
|
|
257
|
+
"-L",
|
|
258
|
+
"ours",
|
|
259
|
+
"-L",
|
|
260
|
+
"base",
|
|
261
|
+
"-L",
|
|
262
|
+
"theirs",
|
|
263
|
+
currentPath,
|
|
264
|
+
basePath,
|
|
265
|
+
otherPath,
|
|
266
|
+
], { stdio: "inherit" });
|
|
267
|
+
return { exitCode: 1 };
|
|
268
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/manifest.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAML,uBAAuB,EACxB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,mBAAmB,EACxB,uBAAuB,EACxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,0BAA0B,EAG3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,UAAU,YAAY;IACpB,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,2BAA2B,EAAE,OAAO,2BAA2B,CAAC;CACjE;AAkBD,eAAO,MAAM,8BAA8B,QAc1C,CAAC;AAaF;;;;;;;;;GASG;AACH,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAG7E;AAoHD,wBAAsB,0BAA0B,CAE9C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/manifest.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAML,uBAAuB,EACxB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,mBAAmB,EACxB,uBAAuB,EACxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,0BAA0B,EAG3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,UAAU,YAAY;IACpB,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,2BAA2B,EAAE,OAAO,2BAA2B,CAAC;CACjE;AAkBD,eAAO,MAAM,8BAA8B,QAc1C,CAAC;AAaF;;;;;;;;;GASG;AACH,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAG7E;AAoHD,wBAAsB,0BAA0B,CAE9C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CA0Mf;AAED,wBAAgB,0BAA0B,CAExC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAOT;AAED,wBAAgB,8BAA8B,CAE5C,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC3B,OAAO,CAUT"}
|
|
@@ -192,7 +192,9 @@ manifestPath, workspaceRoot, deps) {
|
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
|
-
const enriched = await resolved.enrichSymbolCoordinates(before, workspaceRoot
|
|
195
|
+
const enriched = await resolved.enrichSymbolCoordinates(before, workspaceRoot, shouldRefreshCoordinates
|
|
196
|
+
? { allowPythonDecoratorCoordinates: true }
|
|
197
|
+
: undefined);
|
|
196
198
|
// Publish the generated coordinate artifact when explicitly requested.
|
|
197
199
|
// Parse and I/O failures are fatal so sync never advances cache state on a
|
|
198
200
|
// partially published compiler dependency. Symbols without extractable
|
package/dist/engine.d.ts
CHANGED
|
@@ -6,6 +6,12 @@ export type { EngineAttachmentIdentity, EngineCommandV1, EngineRequest, } from "
|
|
|
6
6
|
export declare const ENGINE_PROTOCOL_VERSION = 1;
|
|
7
7
|
export declare const ENGINE_IDLE_TIMEOUT_MS: number;
|
|
8
8
|
export declare const ENGINE_PACKAGE_VERSIONS: string;
|
|
9
|
+
/**
|
|
10
|
+
* Identity of the SWI-Prolog this process would launch (`<bin>@<version>`).
|
|
11
|
+
* The daemon and every client compare it; a daemon running a different
|
|
12
|
+
* resolved Prolog is replaced, never reused.
|
|
13
|
+
*/
|
|
14
|
+
export declare function engineSwiplIdentity(): string;
|
|
9
15
|
export declare function requestEngineSignalShutdown(shutdown: () => unknown): () => void;
|
|
10
16
|
export declare function readJournalGeneration(branchPath: string): string;
|
|
11
17
|
export declare function readEngineAttachmentIdentity(branchPath: string): EngineAttachmentIdentity | null;
|
|
@@ -83,6 +89,14 @@ export declare class EngineClient {
|
|
|
83
89
|
invalidateCache(): void;
|
|
84
90
|
isRunning(): boolean;
|
|
85
91
|
private readAttachedIdentity;
|
|
92
|
+
private daemonRuntimeMatches;
|
|
93
|
+
/**
|
|
94
|
+
* A live daemon keeps the SWI-Prolog it was started with. When this client
|
|
95
|
+
* resolves a different executable or version (KIBI_SWIPL changed, the
|
|
96
|
+
* bundled package was upgraded, a pre-handshake daemon), the daemon is
|
|
97
|
+
* stopped and replaced; it is never reused.
|
|
98
|
+
*/
|
|
99
|
+
private reconcileRuntime;
|
|
86
100
|
private reconcileAttachment;
|
|
87
101
|
private shutdownConnectedDaemon;
|
|
88
102
|
getPid(): number;
|
|
@@ -112,7 +126,7 @@ export declare class EngineSession {
|
|
|
112
126
|
*/
|
|
113
127
|
ensureLive(): Promise<boolean>;
|
|
114
128
|
}
|
|
115
|
-
export declare function runEngineDaemon(
|
|
129
|
+
export declare function runEngineDaemon(requestedOptions: {
|
|
116
130
|
readonly workspaceRoot: string;
|
|
117
131
|
readonly branch: string;
|
|
118
132
|
readonly socketPath: string;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|