pm-csv 2026.10.26 → 2026.10.30
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/CHANGELOG.md +64 -36
- package/README.md +95 -2
- package/dist/admission.d.ts +93 -0
- package/dist/admission.d.ts.map +1 -0
- package/dist/admission.js +362 -0
- package/dist/admission.js.map +1 -0
- package/dist/atomic-update.d.ts.map +1 -1
- package/dist/atomic-update.js +16 -14
- package/dist/atomic-update.js.map +1 -1
- package/dist/edit-refusal.d.ts +1 -1
- package/dist/edit-refusal.d.ts.map +1 -1
- package/dist/index.d.ts +46 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +364 -117
- package/dist/index.js.map +1 -1
- package/dist/join-plans.d.ts +110 -0
- package/dist/join-plans.d.ts.map +1 -0
- package/dist/join-plans.js +557 -0
- package/dist/join-plans.js.map +1 -0
- package/dist/lineage.d.ts +3 -6
- package/dist/lineage.d.ts.map +1 -1
- package/dist/lineage.js +32 -11
- package/dist/lineage.js.map +1 -1
- package/dist/mutation-intent.d.ts +57 -0
- package/dist/mutation-intent.d.ts.map +1 -0
- package/dist/mutation-intent.js +145 -0
- package/dist/mutation-intent.js.map +1 -0
- package/dist/roundtrip.d.ts +2 -8
- package/dist/roundtrip.d.ts.map +1 -1
- package/dist/roundtrip.js +78 -24
- package/dist/roundtrip.js.map +1 -1
- package/dist/settings-snapshot.d.ts +37 -0
- package/dist/settings-snapshot.d.ts.map +1 -0
- package/dist/settings-snapshot.js +128 -0
- package/dist/settings-snapshot.js.map +1 -0
- package/dist/table-schema.d.ts +10 -7
- package/dist/table-schema.d.ts.map +1 -1
- package/dist/table-schema.js +36 -12
- package/dist/table-schema.js.map +1 -1
- package/docs/import-admission.md +199 -0
- package/docs/join-plans.md +201 -0
- package/docs/join-validation.md +240 -0
- package/docs/spreadsheet-roundtrip.md +17 -2
- package/manifest.json +1 -1
- package/package.json +10 -6
package/dist/lineage.d.ts
CHANGED
|
@@ -6,10 +6,10 @@ export type LineageField = typeof LINEAGE_FIELDS[number];
|
|
|
6
6
|
/** Stable actionable refusals never contain source values or filesystem paths. */
|
|
7
7
|
export declare class LineageRefusal extends PmCliError {
|
|
8
8
|
/** Stable machine-readable category. */
|
|
9
|
-
readonly code: "csv_lineage_invalid" | "csv_bundle_io";
|
|
9
|
+
readonly code: "csv_lineage_invalid" | "csv_bundle_io" | "csv_lineage_settings_changed";
|
|
10
10
|
/** Action required before retry. */
|
|
11
11
|
readonly remedy: string;
|
|
12
|
-
constructor(code: "csv_lineage_invalid" | "csv_bundle_io", remedy: string);
|
|
12
|
+
constructor(code: "csv_lineage_invalid" | "csv_bundle_io" | "csv_lineage_settings_changed", remedy: string);
|
|
13
13
|
}
|
|
14
14
|
/** Caller explicitly authorizes the fields allowed in both import and diagnostics. */
|
|
15
15
|
export interface LineageOptions {
|
|
@@ -62,10 +62,7 @@ export interface LineageBundle {
|
|
|
62
62
|
}
|
|
63
63
|
/** Versioned SHA-256 over JSON values; artifacts specify this canonicalization. */
|
|
64
64
|
export declare function lineageDigest(value: unknown): string;
|
|
65
|
-
/**
|
|
66
|
-
* Rejected artifacts contain only allowed columns plus a stable retry key. Replaying
|
|
67
|
-
* corrected rejects cannot apply successful source rows because those rows are absent.
|
|
68
|
-
*/
|
|
65
|
+
/** Keep all lineage rows and replay comparisons on one settings revision. */
|
|
69
66
|
export declare function importLineage(pmRoot: string, table: string[][], options: LineageOptions): Promise<LineageBundle>;
|
|
70
67
|
/** Publish only new artifacts; exact-byte checksums complement parsed-content digests. */
|
|
71
68
|
export declare function writeLineageBundle(output: string, bundle: LineageBundle): void;
|
package/dist/lineage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lineage.d.ts","sourceRoot":"","sources":["../lineage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuC,UAAU,
|
|
1
|
+
{"version":3,"file":"lineage.d.ts","sourceRoot":"","sources":["../lineage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuC,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMxF,iGAAiG;AACjG,eAAO,MAAM,cAAc,YAAI,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AAChI,+DAA+D;AAC/D,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AACzD,kFAAkF;AAClF,qBAAa,cAAe,SAAQ,UAAU;IAC5C,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,eAAe,GAAG,8BAA8B,CAAC;IACxF,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,YAAY,IAAI,EAAE,qBAAqB,GAAG,eAAe,GAAG,8BAA8B,EAAE,MAAM,EAAE,MAAM,EAIzG;CACF;AACD,sFAAsF;AACtF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,gGAAgG;AAChG,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AACD,8FAA8F;AAC9F,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,aAAa,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;IAC9D,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AACD,+FAA+F;AAC/F,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnE,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC;IACrB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACnG;AACD,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AA+FD,6EAA6E;AAC7E,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAStH;AAOD,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAc9E"}
|
package/dist/lineage.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { writeFileSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
|
-
import { create, locateItem, normalizeItemId, PmCliError
|
|
4
|
+
import { create, locateItem, normalizeItemId, PmCliError } from "@unbrained/pm-cli/sdk";
|
|
5
|
+
import { pinCreateDefaults, readPinnedSettings as readSettings, rethrowSettingsChange, verifySettings, withSettings, withSettingsFence } from "./settings-snapshot.js";
|
|
6
|
+
import { buildMutationIntent, matchesMutationScope } from "./mutation-intent.js";
|
|
5
7
|
import { serializeCSV } from "./index.js";
|
|
6
8
|
import { readUpdateDocument } from "./atomic-update.js";
|
|
7
9
|
/** Deliberately bounded import/diagnostic field surface; other columns never leave the input. */
|
|
@@ -44,18 +46,17 @@ function planMapping(table, options) {
|
|
|
44
46
|
return mapping;
|
|
45
47
|
}
|
|
46
48
|
/** Recover a committed native create by its stable key, including a crash before artifact export. */
|
|
47
|
-
async function existingRow(pmRoot, id, marker) {
|
|
49
|
+
async function existingRow(pmRoot, id, marker, intent) {
|
|
48
50
|
if (!await locateItem(pmRoot, id))
|
|
49
51
|
return undefined;
|
|
50
52
|
const document = await readUpdateDocument(pmRoot, id);
|
|
51
|
-
return document.metadata.tags?.includes(marker) ? "replayed" : "identity_conflict";
|
|
53
|
+
return document.metadata.tags?.includes(marker) && matchesMutationScope(document, intent, await readSettings(pmRoot)) ? "replayed" : "identity_conflict";
|
|
52
54
|
}
|
|
53
55
|
/** Import bounded rows with native SDK validation/history/locking and stable explicit IDs.
|
|
54
56
|
* Rejected artifacts contain only allowed columns plus a stable retry key. Replaying
|
|
55
57
|
* corrected rejects cannot apply successful source rows because those rows are absent.
|
|
56
58
|
*/
|
|
57
|
-
|
|
58
|
-
const mapping = planMapping(table, options);
|
|
59
|
+
async function importLineageInternal(pmRoot, table, options, mapping) {
|
|
59
60
|
const sourceDigest = lineageDigest(table);
|
|
60
61
|
const mappingRevision = lineageDigest([1, mapping]);
|
|
61
62
|
const keyColumn = table[0].indexOf("_csv_key");
|
|
@@ -68,24 +69,28 @@ export async function importLineage(pmRoot, table, options) {
|
|
|
68
69
|
const rejected = [["_csv_key", ...mapping.map(cell => cell.field)]];
|
|
69
70
|
for (const [index, row] of table.slice(1).entries()) {
|
|
70
71
|
const key = keys[index];
|
|
71
|
-
const values = Object.fromEntries([...mapping].sort((left, right) => left.field.localeCompare(right.field)).map(cell => [cell.field, (row[cell.column - 1] ?? "").trim()]));
|
|
72
|
+
const values = Object.assign(Object.create(null), Object.fromEntries([...mapping].sort((left, right) => left.field.localeCompare(right.field)).map(cell => [cell.field, (row[cell.column - 1] ?? "").trim()])));
|
|
72
73
|
const marker = `csv-lineage:${lineageDigest([key, values])}`;
|
|
73
74
|
const id = normalizeItemId(`csv-${key}`, settings.id_prefix);
|
|
75
|
+
const intent = buildMutationIntent(pinCreateDefaults({ ...Object.fromEntries(Object.entries(values).filter(([, value]) => value !== "")), id,
|
|
76
|
+
tags: [values.tags, marker].filter(Boolean).join(",") }, settings));
|
|
74
77
|
const record = { row: index + 2, key, outcome: "rejected", cells: [] };
|
|
75
78
|
rows.push(record);
|
|
76
79
|
if (row.length !== table[0].length || !values.title || (values.priority && !/^[0-4]$/.test(values.priority))) {
|
|
77
80
|
record.code = "invalid_row";
|
|
78
81
|
}
|
|
79
82
|
else {
|
|
80
|
-
let outcome = await existingRow(pmRoot, id, marker);
|
|
83
|
+
let outcome = await existingRow(pmRoot, id, marker, intent);
|
|
81
84
|
if (!outcome) {
|
|
82
85
|
try {
|
|
83
|
-
await
|
|
86
|
+
await withSettingsFence(pmRoot, () => create(intent, { pmRoot, author: options.author ?? "pm-csv" }));
|
|
84
87
|
record.outcome = "imported";
|
|
85
88
|
}
|
|
86
|
-
catch {
|
|
89
|
+
catch (error) {
|
|
90
|
+
rethrowSettingsChange(error, lineageSettingsChanged);
|
|
91
|
+
await verifySettings(pmRoot);
|
|
87
92
|
// A racing writer may have won the same native create; inspect durable state.
|
|
88
|
-
outcome = await existingRow(pmRoot, id, marker);
|
|
93
|
+
outcome = await existingRow(pmRoot, id, marker, intent);
|
|
89
94
|
record.code = outcome ? undefined : "create_refused";
|
|
90
95
|
}
|
|
91
96
|
}
|
|
@@ -111,12 +116,28 @@ export async function importLineage(pmRoot, table, options) {
|
|
|
111
116
|
identity_conflict: "This key already belongs to different imported values. Restore the unchanged rejected artifact or use pm update for intentional changes.",
|
|
112
117
|
}, rejectedDigest: lineageDigest(rejected) };
|
|
113
118
|
const manifest = { ...base, digest: lineageDigest(base) };
|
|
119
|
+
await verifySettings(pmRoot);
|
|
114
120
|
return { manifest, rejected, receipt: { rows: rows.length,
|
|
115
121
|
imported: rows.filter(row => row.outcome === "imported").length,
|
|
116
122
|
replayed: rows.filter(row => row.outcome === "replayed").length,
|
|
117
123
|
rejected: rejected.length - 1, manifest: manifest.digest,
|
|
118
124
|
} };
|
|
119
125
|
}
|
|
126
|
+
/** Keep all lineage rows and replay comparisons on one settings revision. */
|
|
127
|
+
export async function importLineage(pmRoot, table, options) {
|
|
128
|
+
pmRoot = resolve(pmRoot);
|
|
129
|
+
if (!Array.isArray(table) || Array.from(table).some(row => !Array.isArray(row) || Array.from(row).some(cell => typeof cell !== "string")) || !options || !Array.isArray(options.columns)) {
|
|
130
|
+
throw new LineageRefusal("csv_lineage_invalid", "Provide dense CSV string rows and explicitly allowed columns.");
|
|
131
|
+
}
|
|
132
|
+
const capturedTable = table.map(row => [...row]);
|
|
133
|
+
const capturedOptions = { ...options, columns: [...options.columns], fieldMap: options.fieldMap === undefined ? undefined : { ...options.fieldMap } };
|
|
134
|
+
const mapping = planMapping(capturedTable, capturedOptions);
|
|
135
|
+
return withSettings(pmRoot, lineageSettingsChanged, () => importLineageInternal(pmRoot, capturedTable, capturedOptions, mapping));
|
|
136
|
+
}
|
|
137
|
+
/** Keep lineage configuration drift within its documented refusal family. */
|
|
138
|
+
function lineageSettingsChanged() {
|
|
139
|
+
return new LineageRefusal("csv_lineage_settings_changed", "Settings changed during import. Inspect current rows and retry unchanged stable keys against current settings.");
|
|
140
|
+
}
|
|
120
141
|
/** Publish only new artifacts; exact-byte checksums complement parsed-content digests. */
|
|
121
142
|
export function writeLineageBundle(output, bundle) {
|
|
122
143
|
const rejectedCsv = serializeCSV(bundle.rejected, ",") + "\n";
|
package/dist/lineage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lineage.js","sourceRoot":"","sources":["../lineage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"lineage.js","sourceRoot":"","sources":["../lineage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as nativeSdk from "@unbrained/pm-cli/sdk";
|
|
2
|
+
import type { create, mutateItem, ItemDocument, readSettings } from "@unbrained/pm-cli/sdk";
|
|
3
|
+
/** Native create/update options accepted by the shared explicit-scope builder. */
|
|
4
|
+
type MutationOptions = NonNullable<Parameters<typeof create>[0]>;
|
|
5
|
+
/**
|
|
6
|
+
* Validate a whole saved identity vector before any lease or mutation. SDK writes
|
|
7
|
+
* normalize local IDs; raw-distinct aliases must never become separate steps for
|
|
8
|
+
* one native item. Saved artifacts require canonical spellings rather than
|
|
9
|
+
* silently changing reviewed identities, digests or ownership markers.
|
|
10
|
+
*/
|
|
11
|
+
export declare function assertCanonicalMutationIds(ids: readonly string[], prefix: string, refuse: () => Error): void;
|
|
12
|
+
/**
|
|
13
|
+
* Freeze relationship/scope intent before native mutation. Creates explicitly unset
|
|
14
|
+
* absent scalars and clear absent links. Patches preserve unselected fields; an
|
|
15
|
+
* explicitly present empty/undefined scalar clears it. Neither mode reads focus,
|
|
16
|
+
* templates, working directories or other ambient session state. Native `none`/`null`
|
|
17
|
+
* scope-clear aliases become explicit unsets; snapshot mode preserves already
|
|
18
|
+
* stored strings literally instead of interpreting command-input aliases.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildMutationIntent(options: MutationOptions, mode?: "create" | "patch" | "snapshot"): MutationOptions;
|
|
21
|
+
/** Render only scope/link flags from the same builder for legacy CLI mutations. */
|
|
22
|
+
export declare function mutationScopeArguments(options: MutationOptions, mode: "create" | "patch"): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Scope raw SDK patches/restores from the document read under the native item
|
|
25
|
+
* lock. Explicit selected scalars go through the same builder; untouched native
|
|
26
|
+
* link arrays remain the exact current/restore document, with no ambient lookup.
|
|
27
|
+
*/
|
|
28
|
+
export declare function explicitDocumentMutation(mutate: Parameters<typeof mutateItem>[0]["mutate"]): Parameters<typeof mutateItem>[0]["mutate"];
|
|
29
|
+
/** Read the caller-authored ownership marker without the SDK explicit-unset audit suffix. */
|
|
30
|
+
export declare function mutationMessageBase(message: string | undefined): string | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Use the host's relationship normalizer, falling back to its local-ID normalizer
|
|
33
|
+
* on older hosts whose dependency writes use local-ID normalization.
|
|
34
|
+
*/
|
|
35
|
+
export declare function normalizeMutationReference(reference: string, prefix: string, normalizers?: {
|
|
36
|
+
normalizeItemId: typeof nativeSdk.normalizeItemId;
|
|
37
|
+
normalizeItemReference?: (reference: string, prefix: string) => string;
|
|
38
|
+
}): string;
|
|
39
|
+
/** Match parent storage on the selected host: legacy SDKs only trimmed parents. */
|
|
40
|
+
export declare function normalizeMutationParent(reference: string, prefix: string, normalizers?: {
|
|
41
|
+
normalizeParentReferenceValue: typeof nativeSdk.normalizeParentReferenceValue;
|
|
42
|
+
normalizeItemReference?: (reference: string, prefix: string) => string;
|
|
43
|
+
}): string;
|
|
44
|
+
/**
|
|
45
|
+
* Normalize command scope with the same public field normalizers used by native
|
|
46
|
+
* create/update before comparing it with stored state. Document canonicalization
|
|
47
|
+
* alone cannot resolve local ID prefixes or parent placeholder syntax. Provider
|
|
48
|
+
* locators retain their native case; snapshots never pass through this function.
|
|
49
|
+
*/
|
|
50
|
+
export declare function normalizeMutationInput(options: MutationOptions, settings: Awaited<ReturnType<typeof readSettings>>, mode?: "create" | "patch"): MutationOptions;
|
|
51
|
+
/** Compare reviewed scope with current native state using SDK canonicalization, never session defaults. */
|
|
52
|
+
export declare function matchesMutationScope(document: ItemDocument, options: MutationOptions, settings: Awaited<ReturnType<typeof readSettings>>, edges?: readonly {
|
|
53
|
+
id: string;
|
|
54
|
+
kind: string;
|
|
55
|
+
}[], mode?: "create" | "patch"): boolean;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=mutation-intent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-intent.d.ts","sourceRoot":"","sources":["../mutation-intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE5F,kFAAkF;AAClF,KAAK,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjE;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,GAAG,IAAI,CAG5G;AAeD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,GAAE,QAAQ,GAAG,OAAO,GAAG,UAAqB,GAAG,eAAe,CAkB/H;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,EAAE,CASnG;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAUvI;AAED,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEnF;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE;IACzF,eAAe,EAAE,OAAO,SAAS,CAAC,eAAe,CAAC;IAClD,sBAAsB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5D,GAAG,MAAM,CAErB;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE;IACtF,6BAA6B,EAAE,OAAO,SAAS,CAAC,6BAA6B,CAAC;IAC9E,sBAAsB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5D,GAAG,MAAM,CAGrB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,EAAE,IAAI,GAAE,QAAQ,GAAG,OAAkB,GAAG,eAAe,CAOzK;AAED,2GAA2G;AAC3G,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,IAAI,GAAE,QAAQ,GAAG,OAAkB,GAAG,OAAO,CAYxO"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as nativeSdk from "@unbrained/pm-cli/sdk";
|
|
2
|
+
import { canonicalDocument, validateSprintOrReleaseValue } from "@unbrained/pm-cli/sdk";
|
|
3
|
+
/**
|
|
4
|
+
* Validate a whole saved identity vector before any lease or mutation. SDK writes
|
|
5
|
+
* normalize local IDs; raw-distinct aliases must never become separate steps for
|
|
6
|
+
* one native item. Saved artifacts require canonical spellings rather than
|
|
7
|
+
* silently changing reviewed identities, digests or ownership markers.
|
|
8
|
+
*/
|
|
9
|
+
export function assertCanonicalMutationIds(ids, prefix, refuse) {
|
|
10
|
+
const normalized = Array.from(ids, id => typeof id === "string" ? nativeSdk.normalizeItemId(id, prefix) : undefined);
|
|
11
|
+
if (new Set(normalized).size !== ids.length || normalized.some((id, index) => id === undefined || id !== ids[index]))
|
|
12
|
+
throw refuse();
|
|
13
|
+
}
|
|
14
|
+
/** Scope scalars have native option spellings and SDK unset metadata names. */
|
|
15
|
+
const SCALARS = [
|
|
16
|
+
["parent", "parent"], ["assignee", "assignee"], ["sprint", "sprint"], ["release", "release"],
|
|
17
|
+
["blockedBy", "blocked_by"], ["reviewer", "reviewer"], ["goal", "goal"], ["objective", "objective"],
|
|
18
|
+
];
|
|
19
|
+
/** Linked resources must not acquire template defaults when a create omits them. */
|
|
20
|
+
const LINKS = [["dep", "clearDeps", "--dep", "--clear-deps"], ["file", "clearFiles", "--file", "--clear-files"],
|
|
21
|
+
["doc", "clearDocs", "--doc", "--clear-docs"], ["test", "clearTests", "--test", "--clear-tests"]];
|
|
22
|
+
/** Recognize native command clear aliases without interpreting persisted snapshot values. */
|
|
23
|
+
function isScopeClearAlias(value) {
|
|
24
|
+
return ["none", "null"].includes(value.trim().toLowerCase());
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Freeze relationship/scope intent before native mutation. Creates explicitly unset
|
|
28
|
+
* absent scalars and clear absent links. Patches preserve unselected fields; an
|
|
29
|
+
* explicitly present empty/undefined scalar clears it. Neither mode reads focus,
|
|
30
|
+
* templates, working directories or other ambient session state. Native `none`/`null`
|
|
31
|
+
* scope-clear aliases become explicit unsets; snapshot mode preserves already
|
|
32
|
+
* stored strings literally instead of interpreting command-input aliases.
|
|
33
|
+
*/
|
|
34
|
+
export function buildMutationIntent(options, mode = "create") {
|
|
35
|
+
const result = Object.assign(Object.create(null), options);
|
|
36
|
+
const unset = new Set(Object.hasOwn(options, "unset") ? options.unset : undefined);
|
|
37
|
+
for (const [option, field] of SCALARS) {
|
|
38
|
+
if (mode !== "create" && !Object.hasOwn(options, option))
|
|
39
|
+
continue;
|
|
40
|
+
const value = Object.hasOwn(options, option) ? options[option] : undefined;
|
|
41
|
+
const present = mode === "snapshot" ? value !== undefined : Boolean(value?.trim()) &&
|
|
42
|
+
!isScopeClearAlias(value);
|
|
43
|
+
if (present)
|
|
44
|
+
unset.delete(field);
|
|
45
|
+
else {
|
|
46
|
+
delete result[option];
|
|
47
|
+
unset.add(field);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
for (const [option, clear] of LINKS) {
|
|
51
|
+
if (mode !== "create" && !Object.hasOwn(options, option))
|
|
52
|
+
continue;
|
|
53
|
+
if (Object.hasOwn(options, option) && options[option]?.length && (mode === "snapshot" || !options[option].every(isScopeClearAlias)))
|
|
54
|
+
result[clear] = false;
|
|
55
|
+
else {
|
|
56
|
+
delete result[option];
|
|
57
|
+
result[clear] = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
result.unset = [...unset];
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
/** Render only scope/link flags from the same builder for legacy CLI mutations. */
|
|
64
|
+
export function mutationScopeArguments(options, mode) {
|
|
65
|
+
const intent = buildMutationIntent(options, mode), args = [];
|
|
66
|
+
for (const [option, field] of SCALARS)
|
|
67
|
+
if (intent[option] !== undefined)
|
|
68
|
+
args.push(`--${field.replaceAll("_", "-")}`, intent[option]);
|
|
69
|
+
for (const field of intent.unset)
|
|
70
|
+
args.push("--unset", field);
|
|
71
|
+
for (const [option, clear, flag, clearFlag] of LINKS) {
|
|
72
|
+
for (const value of intent[option] ?? [])
|
|
73
|
+
args.push(flag, value);
|
|
74
|
+
if (intent[clear])
|
|
75
|
+
args.push(clearFlag);
|
|
76
|
+
}
|
|
77
|
+
return args;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Scope raw SDK patches/restores from the document read under the native item
|
|
81
|
+
* lock. Explicit selected scalars go through the same builder; untouched native
|
|
82
|
+
* link arrays remain the exact current/restore document, with no ambient lookup.
|
|
83
|
+
*/
|
|
84
|
+
export function explicitDocumentMutation(mutate) {
|
|
85
|
+
return async (document) => {
|
|
86
|
+
const result = await mutate(document);
|
|
87
|
+
const intent = buildMutationIntent(Object.fromEntries(SCALARS.map(([option, field]) => [option, document.metadata[field]])), "snapshot");
|
|
88
|
+
for (const [option, field] of SCALARS) {
|
|
89
|
+
if (intent[option] === undefined)
|
|
90
|
+
delete document.metadata[field];
|
|
91
|
+
else
|
|
92
|
+
document.metadata[field] = intent[option];
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Read the caller-authored ownership marker without the SDK explicit-unset audit suffix. */
|
|
98
|
+
export function mutationMessageBase(message) {
|
|
99
|
+
return message?.split(" | explicit_unset=", 1)[0];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Use the host's relationship normalizer, falling back to its local-ID normalizer
|
|
103
|
+
* on older hosts whose dependency writes use local-ID normalization.
|
|
104
|
+
*/
|
|
105
|
+
export function normalizeMutationReference(reference, prefix, normalizers = nativeSdk) {
|
|
106
|
+
return (normalizers.normalizeItemReference ?? normalizers.normalizeItemId)(reference, prefix);
|
|
107
|
+
}
|
|
108
|
+
/** Match parent storage on the selected host: legacy SDKs only trimmed parents. */
|
|
109
|
+
export function normalizeMutationParent(reference, prefix, normalizers = nativeSdk) {
|
|
110
|
+
const parent = normalizers.normalizeParentReferenceValue(reference);
|
|
111
|
+
return normalizers.normalizeItemReference?.(parent, prefix) ?? parent;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Normalize command scope with the same public field normalizers used by native
|
|
115
|
+
* create/update before comparing it with stored state. Document canonicalization
|
|
116
|
+
* alone cannot resolve local ID prefixes or parent placeholder syntax. Provider
|
|
117
|
+
* locators retain their native case; snapshots never pass through this function.
|
|
118
|
+
*/
|
|
119
|
+
export function normalizeMutationInput(options, settings, mode = "create") {
|
|
120
|
+
const intent = buildMutationIntent(options, mode);
|
|
121
|
+
if (intent.parent !== undefined)
|
|
122
|
+
intent.parent = normalizeMutationParent(intent.parent, settings.id_prefix);
|
|
123
|
+
for (const field of ["sprint", "release"]) {
|
|
124
|
+
if (intent[field] !== undefined)
|
|
125
|
+
intent[field] = validateSprintOrReleaseValue(field, intent[field], settings.validation.sprint_release_format).value;
|
|
126
|
+
}
|
|
127
|
+
return intent;
|
|
128
|
+
}
|
|
129
|
+
/** Compare reviewed scope with current native state using SDK canonicalization, never session defaults. */
|
|
130
|
+
export function matchesMutationScope(document, options, settings, edges, mode = "create") {
|
|
131
|
+
const intent = normalizeMutationInput(options, settings, mode);
|
|
132
|
+
const expected = canonicalDocument({ metadata: { ...document.metadata,
|
|
133
|
+
...Object.fromEntries(SCALARS.map(([option, field]) => [field, mode === "patch" && !Object.hasOwn(options, option) ? document.metadata[field] : intent[option]])),
|
|
134
|
+
}, body: document.body }, { schema: settings.schema });
|
|
135
|
+
if (SCALARS.some(([, field]) => document.metadata[field] !== expected.metadata[field]))
|
|
136
|
+
return false;
|
|
137
|
+
if ((intent.clearFiles && document.metadata.files?.length) || (intent.clearDocs && document.metadata.docs?.length) ||
|
|
138
|
+
(intent.clearTests && document.metadata.tests?.length))
|
|
139
|
+
return false;
|
|
140
|
+
const actualEdges = (document.metadata.dependencies ?? []).map(e => JSON.stringify([e.id, e.kind])).sort();
|
|
141
|
+
const expectedEdges = edges === undefined && mode === "patch" && !intent.clearDeps ? actualEdges
|
|
142
|
+
: (edges ?? []).map(e => JSON.stringify([normalizeMutationReference(e.id, settings.id_prefix), e.kind])).sort();
|
|
143
|
+
return JSON.stringify(actualEdges) === JSON.stringify(expectedEdges);
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=mutation-intent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-intent.js","sourceRoot":"","sources":["../mutation-intent.ts"],"names":[],"mappings":"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"}
|
package/dist/roundtrip.d.ts
CHANGED
|
@@ -32,20 +32,14 @@ export interface EditReceipt {
|
|
|
32
32
|
}
|
|
33
33
|
/** Fixed schema makes altered/missing/duplicate metadata columns fail closed. */
|
|
34
34
|
export declare function editSessionHeader(): string[];
|
|
35
|
-
/** Export
|
|
35
|
+
/** Export one internally consistent settings/schema view across all selected items. */
|
|
36
36
|
export declare function exportEditSession(pmRoot: string, ids: readonly string[]): Promise<{
|
|
37
37
|
session: EditSession;
|
|
38
38
|
table: string[][];
|
|
39
39
|
}>;
|
|
40
40
|
/** Validate an untrusted sidecar structurally as well as by its content digest. */
|
|
41
41
|
export declare function parseEditSession(input: unknown): EditSession;
|
|
42
|
-
/**
|
|
43
|
-
* Three-way patch using stable item keys, field-level conflict checks and the existing SDK
|
|
44
|
-
* transaction/CSV compensation. Preflight refusals create no transaction or
|
|
45
|
-
* item/history writes. Field checks run under each native item lease; protection
|
|
46
|
-
* after lease expiry needs host write fencing. Prior rows are compensated on
|
|
47
|
-
* ordinary failure, which explicitly requires reconciliation.
|
|
48
|
-
*/
|
|
42
|
+
/** Bind each edit attempt, including comparisons and compensation, to stable settings. */
|
|
49
43
|
export declare function applyEditSession(pmRoot: string, input: unknown, table: string[][], options: {
|
|
50
44
|
author: string;
|
|
51
45
|
dryRun?: boolean;
|
package/dist/roundtrip.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roundtrip.d.ts","sourceRoot":"","sources":["../roundtrip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"roundtrip.d.ts","sourceRoot":"","sources":["../roundtrip.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iCAAiC,EAAsD,MAAM,uBAAuB,CAAC;AAMnI,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGvE,qFAAqF;AACrF,eAAO,MAAM,WAAW,YAAI,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AACnG,4DAA4D;AAC5D,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AACnD,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;CACpC;AACD,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,0EAA0E;AAC1E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgDD,iFAAiF;AACjF,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AA6BD,uFAAuF;AACvF,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAA;CAAE,CAAC,CAIpI;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAe5D;AA2KD,0FAA0F;AAC1F,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,iCAAiC,CAAC,cAAc,CAAC,CAAA;CAAE,GACjK,OAAO,CAAC,WAAW,CAAC,CAOtB"}
|