pm-csv 2026.10.22 → 2026.10.23
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 +21 -0
- package/README.md +43 -0
- package/dist/atomic-update.d.ts +3 -2
- package/dist/atomic-update.d.ts.map +1 -1
- package/dist/atomic-update.js +10 -4
- package/dist/atomic-update.js.map +1 -1
- package/dist/edit-refusal.d.ts +21 -0
- package/dist/edit-refusal.d.ts.map +1 -0
- package/dist/edit-refusal.js +21 -0
- package/dist/edit-refusal.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +105 -2
- package/dist/index.js.map +1 -1
- package/dist/lease-guard.d.ts +14 -0
- package/dist/lease-guard.d.ts.map +1 -0
- package/dist/lease-guard.js +25 -0
- package/dist/lease-guard.js.map +1 -0
- package/dist/lineage.d.ts +72 -0
- package/dist/lineage.d.ts.map +1 -0
- package/dist/lineage.js +137 -0
- package/dist/lineage.js.map +1 -0
- package/dist/roundtrip.d.ts +54 -0
- package/dist/roundtrip.d.ts.map +1 -0
- package/dist/roundtrip.js +255 -0
- package/dist/roundtrip.js.map +1 -0
- package/docs/row-lineage-validation.md +49 -0
- package/docs/row-lineage.md +87 -0
- package/docs/spreadsheet-roundtrip.md +146 -0
- package/docs/spreadsheet-validation.md +47 -0
- package/manifest.json +1 -1
- package/package.json +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026.10.23 - 2026-10-23
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- Enable the gated GitHub issue sync ([pm-csv-j60x](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/chores/pm-csv-j60x.toon))
|
|
8
|
+
- Adopt pm-github 2026.10.16: default-branch-safe gated sync and daily gated closeout PRs ([pm-csv-5o9h](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/chores/pm-csv-5o9h.toon))
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Development README names TypeScript 5 while the manifest pins TypeScript 7 ([pm-csv-bqyu](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-bqyu.toon))
|
|
13
|
+
- Harden the release merge wait against mergeStateStatus deadlock ([pm-csv-7izf](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-7izf.toon))
|
|
14
|
+
- The changelog gate stamps an untagged version with the current date, so its verdict flips every midnight with no commit ([pm-csv-bv81](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-bv81.toon))
|
|
15
|
+
- Keep toolchain acceptance aligned with built-in merge drivers and shipped history ([pm-csv-9y0w](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-9y0w.toon))
|
|
16
|
+
- Make legacy CSV importer accept file input and native flags ([pm-csv-76cu](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-76cu.toon))
|
|
17
|
+
- The release job authenticated with a stored npm token that expired, so publishing stopped while every other gate stayed green ([pm-csv-65ev](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-65ev.toon))
|
|
18
|
+
- A release run bumped and committed a new version every night while publishing was impossible, because the only externally-failable step runs last ([pm-csv-545f](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-545f.toon))
|
|
19
|
+
|
|
20
|
+
### Other
|
|
21
|
+
|
|
22
|
+
- Certify pm-csv with pm CLI and SDK 2026.9.28 ([pm-csv-3044](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/chores/pm-csv-3044.toon))
|
|
23
|
+
|
|
3
24
|
## 2026.10.22 - 2026-10-22
|
|
4
25
|
|
|
5
26
|
### Fixed
|
package/README.md
CHANGED
|
@@ -454,3 +454,46 @@ itself lists each affected stream in its output; `pm history --verify <id>` spot
|
|
|
454
454
|
content, so `reconcile` only re-greens the hash chain (no data loss) — see the authoritative
|
|
455
455
|
[pm-cli merge-safety guide](https://github.com/unbraind/pm-cli/blob/main/docs/MERGE_SAFETY.md). The
|
|
456
456
|
older blunt `pm history-repair --all` remains available as a lower-level primitive.
|
|
457
|
+
|
|
458
|
+
## Conflict-aware spreadsheet round trips
|
|
459
|
+
|
|
460
|
+
Use `pm csv checkout --output planning.csv` to export an editable table with
|
|
461
|
+
explicit item/revision/field digests and a baseline JSON file. Edit scalar cells,
|
|
462
|
+
then run `pm csv apply planning.csv --dry-run --json` followed by
|
|
463
|
+
`pm csv apply planning.csv --json`. Apply compares baseline, spreadsheet and
|
|
464
|
+
current tracker values, refuses conflicting changes before application, and
|
|
465
|
+
preserves changes to unedited fields. Identical retries write no item/history
|
|
466
|
+
records, including for terminal keyed items.
|
|
467
|
+
|
|
468
|
+
See the [protocol and CLI/typed SDK example](docs/spreadsheet-roundtrip.md) for
|
|
469
|
+
editable fields, read-only status, bounded refusals, concurrency and recovery
|
|
470
|
+
boundaries. This edit-session protocol reuses the existing SDK coordinator and
|
|
471
|
+
CSV compensation; legacy keyed import remains a separate command.
|
|
472
|
+
|
|
473
|
+
Apply and compensation callbacks refuse with `csv_lease_expired` when their
|
|
474
|
+
monotonic elapsed time reaches the effective item TTL minus a safety margin
|
|
475
|
+
(ten percent, capped at one second). Re-run apply; another writer may have
|
|
476
|
+
changed the item. Checkout and compensation snapshot reads use the same budget.
|
|
477
|
+
The real SDK/CLI takeover regressions now pass in the release suite.
|
|
478
|
+
|
|
479
|
+
This callback deadline is a mitigation. The host must still atomically fence
|
|
480
|
+
persistence after callback return; arbitrary delays there can exhaust the
|
|
481
|
+
remaining lease. That root fix belongs upstream in
|
|
482
|
+
[pm-cli issue 1549](https://github.com/unbraind/pm-cli/issues/1549).
|
|
483
|
+
|
|
484
|
+
## Without git
|
|
485
|
+
|
|
486
|
+
CSV import, export, validation, lineage bundles, checkout and three-way application work in a plain
|
|
487
|
+
tracker initialized with `pm init`. None requires a Git repository. GitHub sync
|
|
488
|
+
and Git-derived changelog provenance are separate host/tooling features.
|
|
489
|
+
|
|
490
|
+
## Cell lineage and rejected-row bundles
|
|
491
|
+
|
|
492
|
+
Use `pm csv bundle input.csv --columns title,priority --output import-bundle`
|
|
493
|
+
to import with a portable cell manifest and a minimal correction/retry CSV.
|
|
494
|
+
Only explicitly permitted fields leave the source. Correct the rejected file
|
|
495
|
+
and import it into a fresh bundle: successful rows are excluded, and stable
|
|
496
|
+
keys make unchanged retries idempotent. The compact TOON/JSON receipt reports
|
|
497
|
+
counts; artifacts include SHA-256 checksums. See the [protocol and worked
|
|
498
|
+
example](docs/row-lineage.md) for the typed SDK, mapping revisions, refusals,
|
|
499
|
+
privacy policy and recovery behavior.
|
package/dist/atomic-update.d.ts
CHANGED
|
@@ -27,8 +27,9 @@ export declare function captureUpdateCompensation(pmRoot: string, id: string, ma
|
|
|
27
27
|
export type CompensationPhase = "canonical_restored" | "representation_written" | "compensation_recorded";
|
|
28
28
|
/**
|
|
29
29
|
* Restore the captured document through an append-only SDK mutation. History
|
|
30
|
-
* verification and writer detection occur
|
|
31
|
-
*
|
|
30
|
+
* verification and writer detection occur inside the item lock. Callback and
|
|
31
|
+
* representation deadlines refuse exhausted leases; atomic persistence fencing
|
|
32
|
+
* still belongs to the host SDK. Refuse any intervening
|
|
32
33
|
* history outside this batch, including edits to unrelated fields. A durable
|
|
33
34
|
* compensation message makes a crash after restoration safe to replay.
|
|
34
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-update.d.ts","sourceRoot":"","sources":["../atomic-update.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,kCAAkC,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"atomic-update.d.ts","sourceRoot":"","sources":["../atomic-update.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,kCAAkC,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAK7H,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,mFAAmF;AACnF,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;GAMlE;AAED,8EAA8E;AAC9E,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAE1F;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAC5D,OAAO,CAAC,kCAAkC,CAAC,CAY7C;AAOD;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GACzD,OAAO,CAAC,6BAA6B,CAAC,CAkBxC;AAED,gFAAgF;AAChF,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,GAAG,wBAAwB,GAAG,uBAAuB,CAAC;AAiB1G;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC1D,IAAI,EAAE,6BAA6B,GAAG,SAAS,EAC/C,OAAO,GAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAY,GACrE,OAAO,CAAC,IAAI,CAAC,CAqEf;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAW5G"}
|
package/dist/atomic-update.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { acquireLock, appendHistoryEntry, createHistoryEntry, getHistoryPath, nowIso, parseItemDocument, splitFrontMatter, writeFileAtomic, locateItem, mutateItem, readHistoryEntries, readLocatedItem, readSettings, resolveItemTypeRegistry, verifyHistoryEntries, } from "@unbrained/pm-cli/sdk";
|
|
2
2
|
import { decode, encode } from "@toon-format/toon";
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
|
+
import { assertEditLease, guardEditMutation } from "./lease-guard.js";
|
|
4
5
|
/** Version of CSV prior-document compensation; also bound into every step id. */
|
|
5
6
|
export const UPDATE_COMPENSATION_VERSION = 2;
|
|
6
7
|
/** Read authoritative item state, including absent fields and every collection. */
|
|
@@ -49,12 +50,14 @@ function journalHash(value) {
|
|
|
49
50
|
export async function captureUpdateCompensation(pmRoot, id, marker, author) {
|
|
50
51
|
const settings = await readSettings(pmRoot);
|
|
51
52
|
const release = await acquireLock(pmRoot, id, settings.locks.ttl_seconds, author, false, false, settings.locks.wait_ms);
|
|
53
|
+
const startedAt = performance.now();
|
|
52
54
|
try {
|
|
53
55
|
const { document, raw, located } = await readUpdateSnapshot(pmRoot, id);
|
|
54
56
|
const history = await readHistoryEntries(getHistoryPath(pmRoot, id), id);
|
|
55
57
|
if (!verifyHistoryEntries(history, document).ok) {
|
|
56
58
|
throw new Error(`Atomic update item ${id} has unverified history; reconcile before retrying.`);
|
|
57
59
|
}
|
|
60
|
+
assertEditLease(performance.now() - startedAt, settings.locks.ttl_seconds);
|
|
58
61
|
return {
|
|
59
62
|
version: UPDATE_COMPENSATION_VERSION, id, marker,
|
|
60
63
|
prior: JSON.stringify(document), raw, format: located.item_format, historyLength: history.length, historyHash: journalHash(history),
|
|
@@ -85,8 +88,9 @@ function parsePriorDocument(raw, id) {
|
|
|
85
88
|
}
|
|
86
89
|
/**
|
|
87
90
|
* Restore the captured document through an append-only SDK mutation. History
|
|
88
|
-
* verification and writer detection occur
|
|
89
|
-
*
|
|
91
|
+
* verification and writer detection occur inside the item lock. Callback and
|
|
92
|
+
* representation deadlines refuse exhausted leases; atomic persistence fencing
|
|
93
|
+
* still belongs to the host SDK. Refuse any intervening
|
|
90
94
|
* history outside this batch, including edits to unrelated fields. A durable
|
|
91
95
|
* compensation message makes a crash after restoration safe to replay.
|
|
92
96
|
*/
|
|
@@ -108,7 +112,7 @@ export async function compensateUpdate(pmRoot, id, marker, author, data, onPhase
|
|
|
108
112
|
await mutateItem({
|
|
109
113
|
pmRoot, settings, id, op: "restore", author, message: restoreMessage,
|
|
110
114
|
skipNoop: true,
|
|
111
|
-
async
|
|
115
|
+
mutate: guardEditMutation(settings.locks.ttl_seconds, async (document) => {
|
|
112
116
|
const history = await readHistoryEntries(getHistoryPath(pmRoot, id), id);
|
|
113
117
|
if (!verifyHistoryEntries(history, document).ok
|
|
114
118
|
|| journalHash(history.slice(0, historyLength)) !== historyHash
|
|
@@ -132,7 +136,7 @@ export async function compensateUpdate(pmRoot, id, marker, author, data, onPhase
|
|
|
132
136
|
document.metadata = structuredClone(prior.metadata);
|
|
133
137
|
document.body = prior.body;
|
|
134
138
|
return { changedFields };
|
|
135
|
-
},
|
|
139
|
+
}),
|
|
136
140
|
});
|
|
137
141
|
if (completed)
|
|
138
142
|
return;
|
|
@@ -141,6 +145,7 @@ export async function compensateUpdate(pmRoot, id, marker, author, data, onPhase
|
|
|
141
145
|
// prior representation in a second, guarded, resumable phase. It has exactly
|
|
142
146
|
// the same canonical hash as the SDK restore, so the derived index is valid.
|
|
143
147
|
const release = await acquireLock(pmRoot, id, settings.locks.ttl_seconds, author, false, false, settings.locks.wait_ms);
|
|
148
|
+
const representationStartedAt = performance.now();
|
|
144
149
|
try {
|
|
145
150
|
const current = await readUpdateSnapshot(pmRoot, id);
|
|
146
151
|
const history = await readHistoryEntries(getHistoryPath(pmRoot, id), id);
|
|
@@ -150,6 +155,7 @@ export async function compensateUpdate(pmRoot, id, marker, author, data, onPhase
|
|
|
150
155
|
|| !verifyHistoryEntries(history, represented).ok) {
|
|
151
156
|
throw new Error(`Atomic update item ${id} changed during representation restoration; refusing compensation.`);
|
|
152
157
|
}
|
|
158
|
+
assertEditLease(performance.now() - representationStartedAt, settings.locks.ttl_seconds);
|
|
153
159
|
await writeFileAtomic(current.located.itemPath, contents);
|
|
154
160
|
await onPhase("representation_written");
|
|
155
161
|
await appendHistoryEntry(getHistoryPath(pmRoot, id), createHistoryEntry({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-update.js","sourceRoot":"","sources":["../atomic-update.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAC7K,eAAe,EAAE,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,GAC7E,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"atomic-update.js","sourceRoot":"","sources":["../atomic-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PmCliError } from "@unbrained/pm-cli/sdk";
|
|
2
|
+
/** Compact diagnostics never echo potentially large/private cell contents. */
|
|
3
|
+
export interface EditConflict {
|
|
4
|
+
id: string;
|
|
5
|
+
fields: string[];
|
|
6
|
+
}
|
|
7
|
+
/** Stable refusal taxonomy shared by SDK callers and command errors. */
|
|
8
|
+
export type EditRefusalCode = "csv_session_invalid" | "csv_edit_invalid" | "csv_edit_conflict" | "csv_edit_apply_failed" | "csv_lease_expired";
|
|
9
|
+
/** Typed refusal with an actionable remedy and at most twenty conflict keys. */
|
|
10
|
+
export declare class EditRefusal extends PmCliError {
|
|
11
|
+
/** Stable machine-readable refusal category. */
|
|
12
|
+
readonly code: EditRefusalCode;
|
|
13
|
+
/** Next action needed before retrying. */
|
|
14
|
+
readonly remedy: string;
|
|
15
|
+
/** First twenty item/field conflicts, without cell contents. */
|
|
16
|
+
readonly conflicts: EditConflict[];
|
|
17
|
+
/** Full conflict count before the diagnostic ceiling. */
|
|
18
|
+
readonly conflictCount: number;
|
|
19
|
+
constructor(code: EditRefusalCode, remedy: string, conflicts?: EditConflict[]);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=edit-refusal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-refusal.d.ts","sourceRoot":"","sources":["../edit-refusal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AACD,wEAAwE;AACxE,MAAM,MAAM,eAAe,GAAG,qBAAqB,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,mBAAmB,CAAC;AAC/I,gFAAgF;AAChF,qBAAa,WAAY,SAAQ,UAAU;IACzC,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC;IACnC,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,YAAY,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,YAAY,EAAO,EAQhF;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PmCliError } from "@unbrained/pm-cli/sdk";
|
|
2
|
+
/** Typed refusal with an actionable remedy and at most twenty conflict keys. */
|
|
3
|
+
export class EditRefusal extends PmCliError {
|
|
4
|
+
/** Stable machine-readable refusal category. */
|
|
5
|
+
code;
|
|
6
|
+
/** Next action needed before retrying. */
|
|
7
|
+
remedy;
|
|
8
|
+
/** First twenty item/field conflicts, without cell contents. */
|
|
9
|
+
conflicts;
|
|
10
|
+
/** Full conflict count before the diagnostic ceiling. */
|
|
11
|
+
conflictCount;
|
|
12
|
+
constructor(code, remedy, conflicts = []) {
|
|
13
|
+
const bounded = conflicts.slice(0, 20);
|
|
14
|
+
super(`${code}: ${remedy}${bounded.length ? `; conflicts=${JSON.stringify(bounded)}; total=${conflicts.length}` : ""}`, 2, { code, required: remedy, nextSteps: [remedy] });
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.remedy = remedy;
|
|
17
|
+
this.conflicts = bounded;
|
|
18
|
+
this.conflictCount = conflicts.length;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=edit-refusal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-refusal.js","sourceRoot":"","sources":["../edit-refusal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AASnD,gFAAgF;AAChF,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC,gDAAgD;IACvC,IAAI,CAAkB;IAC/B,0CAA0C;IACjC,MAAM,CAAS;IACxB,gEAAgE;IACvD,SAAS,CAAiB;IACnC,yDAAyD;IAChD,aAAa,CAAS;IAC/B,YAAY,IAAqB,EAAE,MAAc,EAAE,SAAS,GAAmB,EAAE;QAC/E,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,KAAK,CAAC,GAAG,IAAI,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EACvH,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC;IACxC,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -632,4 +632,8 @@ export { loadKeyIndex, buildCsvExport };
|
|
|
632
632
|
export { importCSV };
|
|
633
633
|
export type { CsvExportOptions, CsvImportOptions };
|
|
634
634
|
export type { ParsedRow, ImportRowFilter, DiscoveredField, AutoFieldMapping };
|
|
635
|
+
export { applyEditSession, exportEditSession, parseEditSession, editSessionHeader, EDIT_FIELDS, EditRefusal } from "./roundtrip.ts";
|
|
636
|
+
export type { EditSession, EditSessionRow, EditField, EditReceipt, EditConflict, EditRefusalCode } from "./roundtrip.ts";
|
|
637
|
+
export { importLineage, writeLineageBundle, lineageDigest, LINEAGE_FIELDS, LineageRefusal } from "./lineage.ts";
|
|
638
|
+
export type { LineageField, LineageOptions, CellLineage, RowLineage, LineageManifest, LineageBundle } from "./lineage.ts";
|
|
635
639
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,YAAY,EAAmB,MAAM,iCAAiC,CAAC;AAGxG,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, createReadStream } from "node:fs";
|
|
1
|
+
import { readFileSync, writeFileSync, createReadStream, mkdirSync } from "node:fs";
|
|
2
2
|
import { basename, resolve } from "node:path";
|
|
3
3
|
import { spawnSync } from "node:child_process";
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
5
5
|
import { certifyCompleteListResult, inspectCompleteListResult, runWorkspaceTransactionGc } from "@unbrained/pm-cli/sdk";
|
|
6
|
+
import { importLineage, writeLineageBundle, LineageRefusal } from "./lineage.js";
|
|
7
|
+
import { applyEditSession, exportEditSession, EditRefusal } from "./roundtrip.js";
|
|
6
8
|
import { captureUpdateCompensation, compensateUpdate, inspectUpdate, UPDATE_COMPENSATION_VERSION } from "./atomic-update.js";
|
|
7
9
|
// ---------------------------------------------------------------------------
|
|
8
10
|
// Error contract
|
|
@@ -2323,7 +2325,7 @@ function prepareCsvExport(pmRoot, rawOptions) {
|
|
|
2323
2325
|
}
|
|
2324
2326
|
export default {
|
|
2325
2327
|
name: "pm-csv",
|
|
2326
|
-
version: "2026.10.
|
|
2328
|
+
version: "2026.10.23",
|
|
2327
2329
|
activate(api) {
|
|
2328
2330
|
// -----------------------------------------------------------------------
|
|
2329
2331
|
// Schema: register an optional `csv_source` provenance field so imported
|
|
@@ -2335,6 +2337,105 @@ export default {
|
|
|
2335
2337
|
api.registerItemFields([
|
|
2336
2338
|
{ name: "csv_source", type: "string", optional: true },
|
|
2337
2339
|
]);
|
|
2340
|
+
api.registerCommand({
|
|
2341
|
+
name: "csv bundle",
|
|
2342
|
+
description: "Import with portable cell lineage and a minimal rejected-row retry CSV (maximum 1000 rows).",
|
|
2343
|
+
arguments: [{ name: "file", required: true, description: "UTF-8 CSV input" }],
|
|
2344
|
+
flags: [
|
|
2345
|
+
{ long: "--output", value_name: "directory", description: "New private bundle directory" },
|
|
2346
|
+
{ long: "--columns", value_name: "fields", description: "Explicit permitted import and diagnostic fields, including title" },
|
|
2347
|
+
{ long: "--map", value_name: "mapping", description: "Source=target pairs, for example Summary=title" },
|
|
2348
|
+
],
|
|
2349
|
+
async run(ctx) {
|
|
2350
|
+
const output = ctx.options["output"];
|
|
2351
|
+
const columns = ctx.options["columns"];
|
|
2352
|
+
if (!output || !columns || !ctx.args[0])
|
|
2353
|
+
throw new LineageRefusal("csv_lineage_invalid", "Provide input.csv --output new-bundle --columns title,priority; only explicitly selected fields can be imported or exported.");
|
|
2354
|
+
let table;
|
|
2355
|
+
try {
|
|
2356
|
+
table = parseCSV(stripBOM(readFileSync(ctx.args[0], "utf8")));
|
|
2357
|
+
mkdirSync(output, { mode: 0o700 });
|
|
2358
|
+
}
|
|
2359
|
+
catch {
|
|
2360
|
+
throw new LineageRefusal("csv_bundle_io", "Provide readable UTF-8 input and a new writable output directory; existing bundles are preserved.");
|
|
2361
|
+
}
|
|
2362
|
+
let fieldMap;
|
|
2363
|
+
try {
|
|
2364
|
+
const parsed = parseFieldMap(ctx.options["map"]);
|
|
2365
|
+
fieldMap = Object.fromEntries(Object.entries(parsed).map(([header, field]) => [
|
|
2366
|
+
table[0]?.find(source => source.trim().toLowerCase() === header) ?? header, field,
|
|
2367
|
+
]));
|
|
2368
|
+
}
|
|
2369
|
+
catch {
|
|
2370
|
+
throw new LineageRefusal("csv_lineage_invalid", "Use --map Source=title,Rank=priority; map only permitted fields.");
|
|
2371
|
+
}
|
|
2372
|
+
const bundle = await importLineage(ctx.pm_root, table, {
|
|
2373
|
+
columns: columns.split(",").map(field => field.trim()),
|
|
2374
|
+
fieldMap,
|
|
2375
|
+
author: ctx.global["author"] ?? "pm-csv",
|
|
2376
|
+
});
|
|
2377
|
+
writeLineageBundle(output, bundle);
|
|
2378
|
+
return bundle.receipt;
|
|
2379
|
+
},
|
|
2380
|
+
});
|
|
2381
|
+
api.registerCommand({
|
|
2382
|
+
name: "csv checkout",
|
|
2383
|
+
description: "Export a conflict-aware CSV edit session and immutable baseline JSON (maximum 1000 items).",
|
|
2384
|
+
flags: [
|
|
2385
|
+
{ long: "--output", value_name: "file", description: "New CSV filename; baseline uses <file>.session.json" },
|
|
2386
|
+
{ long: "--ids", value_name: "ids", description: "Comma-separated canonical item IDs (default: complete tracker)" },
|
|
2387
|
+
],
|
|
2388
|
+
async run(ctx) {
|
|
2389
|
+
const output = ctx.options["output"];
|
|
2390
|
+
if (!output)
|
|
2391
|
+
throw new EditRefusal("csv_edit_invalid", "Provide --output items.csv; retain items.csv.session.json alongside the CSV.");
|
|
2392
|
+
const selection = ctx.options["ids"];
|
|
2393
|
+
const ids = selection ? selection.split(",").map(id => id.trim())
|
|
2394
|
+
: parseCSV(buildCsvExport(ctx.pm_root, { delimiter: ",", columns: ["id"] }).csvText).slice(1).map(row => row[0]);
|
|
2395
|
+
const { session, table } = await exportEditSession(ctx.pm_root, ids);
|
|
2396
|
+
// Exclusive creation prevents accidental replacement of an earlier edit session.
|
|
2397
|
+
try {
|
|
2398
|
+
writeFileSync(`${output}.session.json`, JSON.stringify(session), { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
2399
|
+
writeFileSync(output, serializeCSV(table, ",") + "\n", { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
2400
|
+
}
|
|
2401
|
+
catch (error) {
|
|
2402
|
+
const refusal = new EditRefusal("csv_edit_invalid", "Use new writable checkout filenames. Existing files were preserved; an incomplete new baseline may remain if CSV creation failed.");
|
|
2403
|
+
refusal.cause = error;
|
|
2404
|
+
throw refusal;
|
|
2405
|
+
}
|
|
2406
|
+
return { exported: session.rows.length, session: session.digest };
|
|
2407
|
+
},
|
|
2408
|
+
});
|
|
2409
|
+
api.registerCommand({
|
|
2410
|
+
name: "csv apply",
|
|
2411
|
+
description: "Apply an edited checkout as a three-way patch; conflicts refuse before application.",
|
|
2412
|
+
arguments: [{ name: "file", required: true, description: "Edited checkout CSV" }],
|
|
2413
|
+
flags: [
|
|
2414
|
+
{ long: "--session", value_name: "file", description: "Baseline JSON (default: <file>.session.json)" },
|
|
2415
|
+
{ long: "--dry-run", description: "Read-only conflict check and compact patch counts" },
|
|
2416
|
+
],
|
|
2417
|
+
async run(ctx) {
|
|
2418
|
+
const file = ctx.args[0];
|
|
2419
|
+
if (!file)
|
|
2420
|
+
throw new EditRefusal("csv_edit_invalid", "Provide the edited CSV filename.");
|
|
2421
|
+
const baseline = ctx.options["session"] ?? `${file}.session.json`;
|
|
2422
|
+
let session;
|
|
2423
|
+
let text;
|
|
2424
|
+
try {
|
|
2425
|
+
session = JSON.parse(readFileSync(baseline, "utf8"));
|
|
2426
|
+
text = stripBOM(readFileSync(file, "utf8"));
|
|
2427
|
+
}
|
|
2428
|
+
catch (error) {
|
|
2429
|
+
const refusal = new EditRefusal("csv_session_invalid", "Provide a readable CSV and the unchanged checkout session JSON.");
|
|
2430
|
+
refusal.cause = error;
|
|
2431
|
+
throw refusal;
|
|
2432
|
+
}
|
|
2433
|
+
return { ...await applyEditSession(ctx.pm_root, session, parseCSV(text), {
|
|
2434
|
+
author: ctx.global["author"] ?? "pm-csv",
|
|
2435
|
+
dryRun: readBoolOption(ctx.options, "dry-run", "dryRun"),
|
|
2436
|
+
}) };
|
|
2437
|
+
},
|
|
2438
|
+
});
|
|
2338
2439
|
// -----------------------------------------------------------------------
|
|
2339
2440
|
// Command: pm csv import <file>
|
|
2340
2441
|
// -----------------------------------------------------------------------
|
|
@@ -2615,4 +2716,6 @@ export { loadAppliedByTransaction, itemStatus, compensateCreate };
|
|
|
2615
2716
|
// ONLY for those tests; production callers keep using the command paths.
|
|
2616
2717
|
export { loadKeyIndex, buildCsvExport };
|
|
2617
2718
|
export { importCSV };
|
|
2719
|
+
export { applyEditSession, exportEditSession, parseEditSession, editSessionHeader, EDIT_FIELDS, EditRefusal } from "./roundtrip.js";
|
|
2720
|
+
export { importLineage, writeLineageBundle, lineageDigest, LINEAGE_FIELDS, LineageRefusal } from "./lineage.js";
|
|
2618
2721
|
//# sourceMappingURL=index.js.map
|