@ifc-lite/cli 0.17.2 → 0.19.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.
Files changed (42) hide show
  1. package/dist/commands/layer-diff.d.ts +3 -0
  2. package/dist/commands/layer-diff.d.ts.map +1 -0
  3. package/dist/commands/layer-diff.js +46 -0
  4. package/dist/commands/layer-diff.js.map +1 -0
  5. package/dist/commands/layer-history.d.ts +61 -0
  6. package/dist/commands/layer-history.d.ts.map +1 -0
  7. package/dist/commands/layer-history.js +276 -0
  8. package/dist/commands/layer-history.js.map +1 -0
  9. package/dist/commands/layer-merge.d.ts +22 -0
  10. package/dist/commands/layer-merge.d.ts.map +1 -0
  11. package/dist/commands/layer-merge.js +138 -0
  12. package/dist/commands/layer-merge.js.map +1 -0
  13. package/dist/commands/layer-publish.d.ts +67 -0
  14. package/dist/commands/layer-publish.d.ts.map +1 -0
  15. package/dist/commands/layer-publish.js +305 -0
  16. package/dist/commands/layer-publish.js.map +1 -0
  17. package/dist/commands/layer-push.d.ts +22 -0
  18. package/dist/commands/layer-push.d.ts.map +1 -0
  19. package/dist/commands/layer-push.js +133 -0
  20. package/dist/commands/layer-push.js.map +1 -0
  21. package/dist/commands/layer-store.d.ts +66 -0
  22. package/dist/commands/layer-store.d.ts.map +1 -0
  23. package/dist/commands/layer-store.js +257 -0
  24. package/dist/commands/layer-store.js.map +1 -0
  25. package/dist/commands/layer-test-helpers.d.ts +10 -0
  26. package/dist/commands/layer-test-helpers.d.ts.map +1 -0
  27. package/dist/commands/layer-test-helpers.js +49 -0
  28. package/dist/commands/layer-test-helpers.js.map +1 -0
  29. package/dist/commands/layer.d.ts +2 -0
  30. package/dist/commands/layer.d.ts.map +1 -0
  31. package/dist/commands/layer.js +109 -0
  32. package/dist/commands/layer.js.map +1 -0
  33. package/dist/commands/mcp.d.ts.map +1 -1
  34. package/dist/commands/mcp.js +4 -1
  35. package/dist/commands/mcp.js.map +1 -1
  36. package/dist/commands/ref.d.ts +17 -0
  37. package/dist/commands/ref.d.ts.map +1 -0
  38. package/dist/commands/ref.js +173 -0
  39. package/dist/commands/ref.js.map +1 -0
  40. package/dist/index.js +15 -0
  41. package/dist/index.js.map +1 -1
  42. package/package.json +13 -11
@@ -0,0 +1,3 @@
1
+ export { diffLayerStacks, diffStackStates as diffStates, type ModifiedEntity, type StackDiff as LayerDiffResult, } from '@ifc-lite/merge';
2
+ export declare function layerDiffCommand(args: string[]): Promise<void>;
3
+ //# sourceMappingURL=layer-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-diff.d.ts","sourceRoot":"","sources":["../../src/commands/layer-diff.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,eAAe,EACf,eAAe,IAAI,UAAU,EAC7B,KAAK,cAAc,EACnB,KAAK,SAAS,IAAI,eAAe,GAClC,MAAM,iBAAiB,CAAC;AAEzB,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCpE"}
@@ -0,0 +1,46 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * `ifc-lite layer diff` — compare two composed states. Each side resolves
6
+ * to an ordered layer list (a ref's stack, a stored layer, or an .ifcx
7
+ * file). The diff itself is the shared contract in `@ifc-lite/merge`
8
+ * (state-diff.ts): CLI, MCP, and the review UI emit the identical JSON.
9
+ */
10
+ import { diffLayerStacks } from '@ifc-lite/merge';
11
+ import { getFlag, hasFlag, printJson } from '../output.js';
12
+ import { resolveSide, storeFromArgs } from './layer-store.js';
13
+ // Re-exported under the historical CLI names for existing imports.
14
+ export { diffLayerStacks, diffStackStates as diffStates, } from '@ifc-lite/merge';
15
+ export async function layerDiffCommand(args) {
16
+ const store = storeFromArgs(args);
17
+ const target = args[0];
18
+ if (!target || target.startsWith('-')) {
19
+ throw new Error('Usage: ifc-lite layer diff <layer-id|ref|file.ifcx> [--against <layer-id|ref|file.ifcx>] [--components] [--json]');
20
+ }
21
+ const againstSpec = getFlag(args, '--against');
22
+ const to = resolveSide(store, target);
23
+ const from = againstSpec
24
+ ? resolveSide(store, againstSpec)
25
+ : { kind: 'ref', layers: [], label: '(empty)' };
26
+ const result = diffLayerStacks(from.layers, to.layers);
27
+ if (hasFlag(args, '--json')) {
28
+ printJson(result);
29
+ return;
30
+ }
31
+ process.stdout.write(`diff ${from.label} → ${to.label}\n`);
32
+ process.stdout.write(`${result.added.length} added, ${result.deleted.length} deleted, ${result.modified.length} modified\n`);
33
+ for (const path of result.added)
34
+ process.stdout.write(` A ${path}\n`);
35
+ for (const path of result.deleted)
36
+ process.stdout.write(` D ${path}\n`);
37
+ const showComponents = hasFlag(args, '--components');
38
+ for (const entry of result.modified) {
39
+ process.stdout.write(` M ${entry.path}\n`);
40
+ if (showComponents) {
41
+ for (const key of entry.components)
42
+ process.stdout.write(` ~ ${key}\n`);
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=layer-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-diff.js","sourceRoot":"","sources":["../../src/commands/layer-diff.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE9D,mEAAmE;AACnE,OAAO,EACL,eAAe,EACf,eAAe,IAAI,UAAU,GAG9B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc;IACnD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,kHAAkH,CACnH,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE/C,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,WAAW;QACtB,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QACjC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAEvD,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,MAAM,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,MAAM,CAAC,QAAQ,CAAC,MAAM,aAAa,CACvG,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IACvE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IACzE,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACrD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QAC5C,IAAI,cAAc,EAAE,CAAC;YACnB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { AuthorKind, IfcxFile } from '@ifc-lite/ifcx';
2
+ import { type MergeConflict } from '@ifc-lite/merge';
3
+ import { type LayerStore } from './layer-store.js';
4
+ import { type DerivedScopeOp } from './layer-publish.js';
5
+ export interface LogEntry {
6
+ id: string;
7
+ shortId: string;
8
+ hasManifest: boolean;
9
+ authorKind?: AuthorKind;
10
+ principal?: string;
11
+ created?: string;
12
+ intent?: string;
13
+ }
14
+ /** Provenance log of a ref's layers, newest first. */
15
+ export declare function logRef(store: LayerStore, refName: string): LogEntry[];
16
+ export declare function layerLogCommand(args: string[]): Promise<void>;
17
+ /** Bake a ref's stack into one tombstone-free flat document. */
18
+ export declare function bakeRef(store: LayerStore, refName: string): IfcxFile;
19
+ export declare function layerBakeCommand(args: string[]): Promise<void>;
20
+ export type RevertOutcome = {
21
+ status: 'conflicts';
22
+ conflicts: MergeConflict[];
23
+ } | {
24
+ status: 'reverted';
25
+ revertLayerId: string;
26
+ refLayers: string[];
27
+ };
28
+ /**
29
+ * Publish an inverse-op layer for `layerId` and append it to the ref.
30
+ *
31
+ * Reverting a non-tip layer is a three-way plan, not a blind inverse:
32
+ * ancestor = the stack through the target layer, theirs = the stack with
33
+ * the target undone, ours = the ref's current state. Components later
34
+ * layers also touched surface as conflicts instead of being silently
35
+ * restored to their pre-target values (`--resolve ours|theirs` decides
36
+ * them in bulk).
37
+ */
38
+ export declare function revertInRef(store: LayerStore, layerId: string, refName: string, options?: {
39
+ principal?: string;
40
+ created?: string;
41
+ resolve?: 'ours' | 'theirs';
42
+ }): RevertOutcome;
43
+ export declare function layerRevertCommand(args: string[]): Promise<void>;
44
+ export type RebaseOutcome = {
45
+ status: 'conflicts';
46
+ conflicts: MergeConflict[];
47
+ } | {
48
+ status: 'rebased';
49
+ layerId: string;
50
+ file: IfcxFile;
51
+ /** Carried claims re-verified against the rebased writes (07 §7.2). */
52
+ scopeVerified: boolean;
53
+ violations: DerivedScopeOp[];
54
+ };
55
+ /** Re-plan a candidate onto a ref's current stack and publish the result. */
56
+ export declare function rebaseLayerOnto(store: LayerStore, layerId: string, ontoRef: string, options?: {
57
+ principal?: string;
58
+ created?: string;
59
+ }): RebaseOutcome;
60
+ export declare function layerRebaseCommand(args: string[]): Promise<void>;
61
+ //# sourceMappingURL=layer-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-history.d.ts","sourceRoot":"","sources":["../../src/commands/layer-history.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAS3D,OAAO,EAKL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAUL,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAM5F,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAgBrE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBnE;AAMD,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAMpE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAcpE;AAMD,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,aAAa,EAAE,CAAA;CAAE,GACnD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEvE;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAO,GAClF,aAAa,CAoDf;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CtE;AAMD,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,aAAa,EAAE,CAAA;CAAE,GACnD;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,uEAAuE;IACvE,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAEN,6EAA6E;AAC7E,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,aAAa,CAkDf;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCtE"}
@@ -0,0 +1,276 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * `ifc-lite layer log|bake|revert|rebase` — history-shaped operations on
6
+ * the local layer store: provenance log (newest first), tombstone-free
7
+ * bake for foreign tools, append-only revert layers, and rebase as a
8
+ * re-planned three-way (no operational transform).
9
+ */
10
+ import { writeFileSync } from 'node:fs';
11
+ import { bakeLayers, computeLayerId, computeStackHash, createProvenanceManifest, getProvenance, setProvenance, } from '@ifc-lite/ifcx';
12
+ import { applyResolutions, opsToNodes, planRebase, planThreeWayMerge, } from '@ifc-lite/merge';
13
+ import { getFlag, hasFlag, printJson } from '../output.js';
14
+ import { defaultPrincipal, loadLayer, loadRefLayers, requireRef, resolveLayerId, setRef, shortId, storeFromArgs, storeLayer, } from './layer-store.js';
15
+ import { resolveAncestor } from './layer-merge.js';
16
+ import { deriveScopeOps, verifyScopeClaims } from './layer-publish.js';
17
+ /** Provenance log of a ref's layers, newest first. */
18
+ export function logRef(store, refName) {
19
+ const ids = requireRef(store, refName).layers;
20
+ const entries = [];
21
+ for (let i = ids.length - 1; i >= 0; i--) {
22
+ const id = ids[i];
23
+ const manifest = getProvenance(loadLayer(store, id));
24
+ const entry = { id, shortId: shortId(id), hasManifest: manifest !== undefined };
25
+ if (manifest) {
26
+ entry.authorKind = manifest.author.kind;
27
+ entry.principal = manifest.author.principal;
28
+ entry.created = manifest.created;
29
+ entry.intent = manifest.intent;
30
+ }
31
+ entries.push(entry);
32
+ }
33
+ return entries;
34
+ }
35
+ export async function layerLogCommand(args) {
36
+ const refName = args[0];
37
+ if (!refName || refName.startsWith('-')) {
38
+ throw new Error('Usage: ifc-lite layer log <ref> [--json]');
39
+ }
40
+ const entries = logRef(storeFromArgs(args), refName);
41
+ if (hasFlag(args, '--json')) {
42
+ printJson(entries);
43
+ return;
44
+ }
45
+ if (entries.length === 0) {
46
+ process.stderr.write(`Ref ${refName} has no layers.\n`);
47
+ return;
48
+ }
49
+ for (const entry of entries) {
50
+ if (!entry.hasManifest) {
51
+ process.stdout.write(`${entry.shortId} (no manifest)\n`);
52
+ continue;
53
+ }
54
+ process.stdout.write(`${entry.shortId} ${entry.authorKind}:${entry.principal} ${entry.created} ${entry.intent}\n`);
55
+ }
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // bake
59
+ // ---------------------------------------------------------------------------
60
+ /** Bake a ref's stack into one tombstone-free flat document. */
61
+ export function bakeRef(store, refName) {
62
+ const layers = loadRefLayers(store, refName);
63
+ if (layers.length === 0) {
64
+ throw new Error(`Ref ${refName} has no layers to bake`);
65
+ }
66
+ return bakeLayers(layers);
67
+ }
68
+ export async function layerBakeCommand(args) {
69
+ const refName = args[0];
70
+ const outPath = getFlag(args, '-o') ?? getFlag(args, '--out');
71
+ if (!refName || refName.startsWith('-') || !outPath) {
72
+ throw new Error('Usage: ifc-lite layer bake <ref> -o <out.ifcx> [--json]');
73
+ }
74
+ const store = storeFromArgs(args);
75
+ const baked = bakeRef(store, refName);
76
+ writeFileSync(outPath, `${JSON.stringify(baked, null, 2)}\n`, 'utf-8');
77
+ if (hasFlag(args, '--json')) {
78
+ printJson({ ref: refName, out: outPath, nodes: baked.data.length });
79
+ }
80
+ else {
81
+ process.stderr.write(`Baked ${refName} (${baked.data.length} node(s)) → ${outPath}\n`);
82
+ }
83
+ }
84
+ /**
85
+ * Publish an inverse-op layer for `layerId` and append it to the ref.
86
+ *
87
+ * Reverting a non-tip layer is a three-way plan, not a blind inverse:
88
+ * ancestor = the stack through the target layer, theirs = the stack with
89
+ * the target undone, ours = the ref's current state. Components later
90
+ * layers also touched surface as conflicts instead of being silently
91
+ * restored to their pre-target values (`--resolve ours|theirs` decides
92
+ * them in bulk).
93
+ */
94
+ export function revertInRef(store, layerId, refName, options = {}) {
95
+ const id = resolveLayerId(store, layerId);
96
+ const entry = requireRef(store, refName);
97
+ const idx = entry.layers.indexOf(id);
98
+ if (idx === -1) {
99
+ throw new Error(`Layer ${id} is not part of ref ${refName}`);
100
+ }
101
+ const before = entry.layers.slice(0, idx).map((lid) => loadLayer(store, lid));
102
+ const through = entry.layers.slice(0, idx + 1).map((lid) => loadLayer(store, lid));
103
+ const current = loadRefLayers(store, refName);
104
+ // A→T is the inverse of the target layer; A→O is everything later
105
+ // layers changed. The matrix folds disjoint edits and flags overlaps.
106
+ const plan = planThreeWayMerge({ ancestor: through, ours: current, theirs: before });
107
+ const resolutions = options.resolve
108
+ ? plan.conflicts.map((conflict) => {
109
+ const resolution = { path: conflict.path, choice: options.resolve };
110
+ if (conflict.componentKey !== undefined)
111
+ resolution.componentKey = conflict.componentKey;
112
+ return resolution;
113
+ })
114
+ : [];
115
+ const applied = applyResolutions(plan, resolutions);
116
+ if (applied.unresolved.length > 0) {
117
+ return { status: 'conflicts', conflicts: applied.unresolved };
118
+ }
119
+ const manifest = createProvenanceManifest({
120
+ author: { kind: 'human', principal: options.principal ?? defaultPrincipal() },
121
+ intent: `Revert layer ${id}`,
122
+ base: { kind: 'stack', id: computeStackHash(entry.layers) },
123
+ created: options.created,
124
+ parents: [id],
125
+ });
126
+ const target = loadLayer(store, id);
127
+ const bare = {
128
+ header: {
129
+ id: '',
130
+ ifcxVersion: target.header.ifcxVersion,
131
+ dataVersion: target.header.dataVersion,
132
+ author: manifest.author.principal,
133
+ timestamp: manifest.created,
134
+ },
135
+ imports: [],
136
+ schemas: {},
137
+ data: opsToNodes([...plan.autoOps, ...applied.ops]),
138
+ };
139
+ const withManifest = setProvenance(bare, manifest);
140
+ const revertLayerId = computeLayerId(withManifest);
141
+ storeLayer(store, { ...withManifest, header: { ...withManifest.header, id: revertLayerId } });
142
+ const refLayers = [...entry.layers, revertLayerId];
143
+ setRef(store, refName, { ...entry, layers: refLayers });
144
+ return { status: 'reverted', revertLayerId, refLayers };
145
+ }
146
+ export async function layerRevertCommand(args) {
147
+ const layerId = args[0];
148
+ const refName = getFlag(args, '--in');
149
+ if (!layerId || layerId.startsWith('-') || !refName) {
150
+ throw new Error('Usage: ifc-lite layer revert <layer-id> --in <ref> [--resolve ours|theirs] [--json]');
151
+ }
152
+ const store = storeFromArgs(args);
153
+ const options = {};
154
+ const principal = getFlag(args, '--principal');
155
+ if (principal !== undefined)
156
+ options.principal = principal;
157
+ const resolve = getFlag(args, '--resolve');
158
+ if (resolve !== undefined) {
159
+ if (resolve !== 'ours' && resolve !== 'theirs') {
160
+ throw new Error('--resolve must be ours or theirs');
161
+ }
162
+ options.resolve = resolve;
163
+ }
164
+ const result = revertInRef(store, layerId, refName, options);
165
+ const json = hasFlag(args, '--json');
166
+ if (result.status === 'conflicts') {
167
+ if (json)
168
+ printJson({ status: 'conflicts', conflicts: result.conflicts });
169
+ else {
170
+ process.stderr.write(`${result.conflicts.length} conflict(s): later layers touched components this revert would restore.\n`);
171
+ for (const c of result.conflicts) {
172
+ const component = c.componentKey ? ` ${c.componentKey}` : '';
173
+ process.stderr.write(` [${c.kind}] ${c.path}${component}\n`);
174
+ }
175
+ process.stderr.write('Re-run with --resolve ours|theirs to decide them in bulk.\n');
176
+ }
177
+ process.exit(2);
178
+ return;
179
+ }
180
+ if (json) {
181
+ printJson({ status: 'reverted', revertLayer: result.revertLayerId, ref: refName, layers: result.refLayers });
182
+ }
183
+ else {
184
+ process.stdout.write(`${result.revertLayerId}\n`);
185
+ process.stderr.write(`Reverted ${shortId(layerId)} in ${refName}\n`);
186
+ }
187
+ }
188
+ /** Re-plan a candidate onto a ref's current stack and publish the result. */
189
+ export function rebaseLayerOnto(store, layerId, ontoRef, options = {}) {
190
+ const candidateId = resolveLayerId(store, layerId);
191
+ const candidate = loadLayer(store, candidateId);
192
+ const manifest = getProvenance(candidate);
193
+ const entry = requireRef(store, ontoRef);
194
+ const oldBase = resolveAncestor(store, entry.layers, manifest?.base ?? null);
195
+ if (!oldBase.matched) {
196
+ process.stderr.write('Warning: candidate base is unknown or not a prefix of the target ref — rebasing from an empty base\n');
197
+ }
198
+ const newBase = loadRefLayers(store, ontoRef);
199
+ const { plan, applied } = planRebase({ candidate, oldBase: oldBase.layers, newBase });
200
+ if (applied.unresolved.length > 0) {
201
+ return { status: 'conflicts', conflicts: applied.unresolved };
202
+ }
203
+ const manifestOut = createProvenanceManifest({
204
+ author: manifest?.author ?? { kind: 'human', principal: options.principal ?? defaultPrincipal() },
205
+ intent: `${manifest?.intent ?? `Rebase ${candidateId}`} (rebased)`,
206
+ base: { kind: 'stack', id: computeStackHash(entry.layers) },
207
+ created: options.created,
208
+ parents: [candidateId],
209
+ scope_claim: manifest?.scope_claim ?? [],
210
+ });
211
+ const bare = {
212
+ header: {
213
+ id: '',
214
+ ifcxVersion: candidate.header.ifcxVersion,
215
+ dataVersion: candidate.header.dataVersion,
216
+ author: manifestOut.author.principal,
217
+ timestamp: manifestOut.created,
218
+ },
219
+ imports: [],
220
+ schemas: {},
221
+ data: opsToNodes([...plan.autoOps, ...applied.ops]),
222
+ };
223
+ // Carried claims must be re-verified against the rebased writes and the
224
+ // new base — rebasing can change which entities the ops touch, so a
225
+ // claim that covered the original delta may no longer cover this one.
226
+ // Mismatch is flagged, never silently accepted (07 §7.2).
227
+ const scopeOps = deriveScopeOps(bare, newBase);
228
+ const { verified, violations } = verifyScopeClaims(manifestOut.scope_claim, scopeOps);
229
+ const withManifest = setProvenance(bare, manifestOut);
230
+ const newId = computeLayerId(withManifest);
231
+ const file = { ...withManifest, header: { ...withManifest.header, id: newId } };
232
+ storeLayer(store, file);
233
+ return { status: 'rebased', layerId: newId, file, scopeVerified: verified, violations };
234
+ }
235
+ export async function layerRebaseCommand(args) {
236
+ const layerId = args[0];
237
+ const ontoRef = getFlag(args, '--onto');
238
+ if (!layerId || layerId.startsWith('-') || !ontoRef) {
239
+ throw new Error('Usage: ifc-lite layer rebase <layer-id> --onto <ref> [--json]');
240
+ }
241
+ const store = storeFromArgs(args);
242
+ const options = {};
243
+ const principal = getFlag(args, '--principal');
244
+ if (principal !== undefined)
245
+ options.principal = principal;
246
+ const outcome = rebaseLayerOnto(store, layerId, ontoRef, options);
247
+ const json = hasFlag(args, '--json');
248
+ if (outcome.status === 'conflicts') {
249
+ if (json)
250
+ printJson({ status: 'conflicts', conflicts: outcome.conflicts });
251
+ else {
252
+ process.stderr.write(`${outcome.conflicts.length} conflict(s) rebasing onto ${ontoRef}:\n`);
253
+ for (const c of outcome.conflicts) {
254
+ const component = c.componentKey ? ` ${c.componentKey}` : '';
255
+ process.stderr.write(` [${c.kind}] ${c.path}${component}\n`);
256
+ }
257
+ }
258
+ process.exit(2);
259
+ return;
260
+ }
261
+ if (!outcome.scopeVerified) {
262
+ process.stderr.write('Warning: scope claim mismatch — rebased ops outside the declared claims:\n');
263
+ for (const op of outcome.violations) {
264
+ const type = op.ifcType ? ` (${op.ifcType})` : '';
265
+ process.stderr.write(` ${op.path}: ${op.capability}${type}\n`);
266
+ }
267
+ }
268
+ if (json) {
269
+ printJson({ status: 'rebased', id: outcome.layerId, scope_verified: outcome.scopeVerified });
270
+ }
271
+ else {
272
+ process.stdout.write(`${outcome.layerId}\n`);
273
+ process.stderr.write(`Rebased ${shortId(layerId)} onto ${ontoRef}\n`);
274
+ }
275
+ }
276
+ //# sourceMappingURL=layer-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-history.js","sourceRoot":"","sources":["../../src/commands/layer-history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `ifc-lite layer merge <layer-id> --into <ref>` — CLI transport for the
3
+ * shared merge flow in `@ifc-lite/merge` (ref-flow.ts): fast-forward,
4
+ * three-way planning with explicit conflicts, blanket resolutions
5
+ * (--resolve ours|theirs), and ref-policy enforcement. The registry route
6
+ * runs the identical flow server-side.
7
+ *
8
+ * Exit codes (09 §9.3): 0 clean, 2 conflicts, 3 policy failure,
9
+ * 5 unrelated base.
10
+ */
11
+ import type { ProvenanceBase } from '@ifc-lite/ifcx';
12
+ import { type AncestorResolution, type LayerRefStore, type MergeInit, type MergeOutcome } from '@ifc-lite/merge';
13
+ import { type LayerStore } from './layer-store.js';
14
+ export { checkRefPolicy, type MergeInit, type MergeOutcome, type Waiver } from '@ifc-lite/merge';
15
+ /** The shared flow's store surface, backed by the local `.ifc-lite/` store. */
16
+ export declare function refStoreFor(store: LayerStore): LayerRefStore;
17
+ /** CLI entry to the shared merge flow; defaults the resolver principal. */
18
+ export declare function mergeIntoRef(store: LayerStore, init: MergeInit): MergeOutcome;
19
+ /** CLI-signature wrapper kept for the history (revert/rebase) commands. */
20
+ export declare function resolveAncestor(store: LayerStore, refLayerIds: readonly string[], base: ProvenanceBase | null | undefined): AncestorResolution;
21
+ export declare function layerMergeCommand(args: string[]): Promise<void>;
22
+ //# sourceMappingURL=layer-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-merge.d.ts","sourceRoot":"","sources":["../../src/commands/layer-merge.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAElB,KAAK,SAAS,EACd,KAAK,YAAY,EAElB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EASL,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEjG,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,CAQ5D;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,YAAY,CAK7E;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GACtC,kBAAkB,CAEpB;AAuBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FrE"}
@@ -0,0 +1,138 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { mergeIntoRef as mergeIntoRefShared, resolveAncestor as resolveAncestorShared, } from '@ifc-lite/merge';
5
+ import { getAllFlags, getFlag, hasFlag, printJson } from '../output.js';
6
+ import { defaultPrincipal, getRef, loadLayer, resolveLayerId, setRef, shortId, storeFromArgs, storeLayer, } from './layer-store.js';
7
+ export { checkRefPolicy } from '@ifc-lite/merge';
8
+ /** The shared flow's store surface, backed by the local `.ifc-lite/` store. */
9
+ export function refStoreFor(store) {
10
+ return {
11
+ loadLayer: (id) => loadLayer(store, id),
12
+ storeLayer: (file) => storeLayer(store, file),
13
+ getRef: (name) => getRef(store, name),
14
+ setRef: (name, entry) => setRef(store, name, entry),
15
+ resolveLayerId: (idOrPrefix) => resolveLayerId(store, idOrPrefix),
16
+ };
17
+ }
18
+ /** CLI entry to the shared merge flow; defaults the resolver principal. */
19
+ export function mergeIntoRef(store, init) {
20
+ return mergeIntoRefShared(refStoreFor(store), {
21
+ ...init,
22
+ principal: init.principal ?? defaultPrincipal(),
23
+ });
24
+ }
25
+ /** CLI-signature wrapper kept for the history (revert/rebase) commands. */
26
+ export function resolveAncestor(store, refLayerIds, base) {
27
+ return resolveAncestorShared({ loadLayer: (id) => loadLayer(store, id) }, refLayerIds, base);
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // command
31
+ // ---------------------------------------------------------------------------
32
+ function parseWaivers(args) {
33
+ const specs = getAllFlags(args, '--waive');
34
+ const reasons = getAllFlags(args, '--reason');
35
+ if (specs.length !== reasons.length) {
36
+ throw new Error('Each --waive <spec> requires a matching --reason "<text>"');
37
+ }
38
+ return specs.map((spec, i) => ({ spec, reason: reasons[i] }));
39
+ }
40
+ function printConflicts(conflicts) {
41
+ process.stderr.write(`${conflicts.length} conflict(s):\n`);
42
+ for (const c of conflicts) {
43
+ const component = c.componentKey ? ` ${c.componentKey}` : '';
44
+ process.stderr.write(` [${c.kind}] ${c.path}${component}\n`);
45
+ }
46
+ }
47
+ export async function layerMergeCommand(args) {
48
+ const candidateId = args[0];
49
+ const into = getFlag(args, '--into');
50
+ if (!candidateId || candidateId.startsWith('-') || !into) {
51
+ throw new Error('Usage: ifc-lite layer merge <layer-id> --into <ref> [--preview] [--resolve ours|theirs] [--waive <spec> --reason "<text>"]... [--approved-by <principal>] [--allow-unrelated] [--json]');
52
+ }
53
+ const resolveFlag = getFlag(args, '--resolve');
54
+ if (resolveFlag !== undefined && resolveFlag !== 'ours' && resolveFlag !== 'theirs') {
55
+ throw new Error(`--resolve must be "ours" or "theirs", got "${resolveFlag}"`);
56
+ }
57
+ const store = storeFromArgs(args);
58
+ const init = {
59
+ candidateId,
60
+ into,
61
+ preview: hasFlag(args, '--preview'),
62
+ waivers: parseWaivers(args),
63
+ allowUnrelated: hasFlag(args, '--allow-unrelated'),
64
+ };
65
+ if (resolveFlag !== undefined)
66
+ init.resolve = resolveFlag;
67
+ const approvedBy = getFlag(args, '--approved-by');
68
+ if (approvedBy !== undefined)
69
+ init.approvedBy = approvedBy;
70
+ const principal = getFlag(args, '--principal');
71
+ if (principal !== undefined)
72
+ init.principal = principal;
73
+ const outcome = mergeIntoRef(store, init);
74
+ const json = hasFlag(args, '--json');
75
+ if (outcome.status !== 'policy-failure' &&
76
+ outcome.status !== 'unrelated-base' &&
77
+ outcome.status !== 'fast-forward' &&
78
+ !outcome.ancestorMatched) {
79
+ process.stderr.write('Warning: candidate base is unknown or not a prefix of the target ref — using an empty ancestor\n');
80
+ }
81
+ switch (outcome.status) {
82
+ case 'fast-forward':
83
+ if (json)
84
+ printJson({ status: outcome.status, ref: into, layers: outcome.refLayers });
85
+ else
86
+ process.stdout.write(`Fast-forwarded ${into} to ${shortId(candidateId)}\n`);
87
+ return;
88
+ case 'preview':
89
+ if (json)
90
+ printJson(outcome.plan);
91
+ else {
92
+ process.stdout.write(`plan: ${outcome.plan.autoOps.length} auto op(s), ${outcome.plan.conflicts.length} conflict(s)\n`);
93
+ if (outcome.plan.conflicts.length > 0)
94
+ printConflicts(outcome.plan.conflicts);
95
+ }
96
+ if (outcome.plan.conflicts.length > 0)
97
+ process.exit(2);
98
+ return;
99
+ case 'conflicts':
100
+ if (json)
101
+ printJson({ status: outcome.status, conflicts: outcome.conflicts });
102
+ else
103
+ printConflicts(outcome.conflicts);
104
+ process.exit(2);
105
+ return;
106
+ case 'policy-failure':
107
+ if (json)
108
+ printJson({ status: outcome.status, reason: outcome.reason });
109
+ else
110
+ process.stderr.write(`Policy failure: ${outcome.reason}\n`);
111
+ process.exit(3);
112
+ return;
113
+ case 'unrelated-base':
114
+ if (json)
115
+ printJson({ status: outcome.status, declaredBase: outcome.declaredBase });
116
+ else {
117
+ process.stderr.write(`Candidate declares base ${outcome.declaredBase.kind} ${outcome.declaredBase.id} which matches nothing on ${into} — ` +
118
+ 'it was authored against a different history. Re-run with --allow-unrelated to merge against an empty ancestor (every candidate op will read as new).\n');
119
+ }
120
+ process.exit(5);
121
+ return;
122
+ case 'merged':
123
+ if (json) {
124
+ printJson({
125
+ status: outcome.status,
126
+ mergeLayer: outcome.mergeLayerId,
127
+ ref: into,
128
+ layers: outcome.refLayers,
129
+ });
130
+ }
131
+ else {
132
+ process.stdout.write(`${outcome.mergeLayerId}\n`);
133
+ process.stderr.write(`Merged ${shortId(candidateId)} into ${into}\n`);
134
+ }
135
+ return;
136
+ }
137
+ }
138
+ //# sourceMappingURL=layer-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-merge.js","sourceRoot":"","sources":["../../src/commands/layer-merge.ts"],"names":[],"mappings":"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"}