pm-csv 2026.8.10 → 2026.8.28

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 CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.8.28 - 2026-08-28
4
+
5
+ ### Added
6
+
7
+ - Enforce exact all-source 100/100/100 coverage ([pm-csv-oqmm](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/features/pm-csv-oqmm.toon))
8
+
9
+ ### Fixed
10
+
11
+ - Changelog scripts consume bounded tracker output and erase release history ([pm-csv-zmcb](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-zmcb.toon))
12
+ - Adopt the canonical certified complete-list reader ([pm-csv-t4cc](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-t4cc.toon))
13
+ - Resume reader comment falsely permits empty map on list-all failure ([pm-csv-u254](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-u254.toon))
14
+ - Post-apply close conflict retains applied transaction markers ([pm-csv-zv31](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-zv31.toon))
15
+ - loadAppliedByTransaction comment describes unsafe pre-fix marker ordering ([pm-csv-21ik](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-21ik.toon))
16
+ - Failed atomic create compensation erases orphan reconciliation markers ([pm-csv-qebc](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-qebc.toon))
17
+ - Atomic aggregate failure receipt overstates rollback certainty ([pm-csv-5si5](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-5si5.toon))
18
+ - Dry-run upserts misreport existing keys as creates ([pm-csv-njaq](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-njaq.toon))
19
+ - Latest published manifest fails pm 2026.8.20 strict health ([pm-csv-0aal](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-0aal.toon))
20
+
21
+ ### Security
22
+
23
+ - The identity gate deadlocks the one remediation its own failure message prescribes ([pm-csv-om24](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-om24.toon))
24
+
25
+ ### Other
26
+
27
+ - Enable GitHub CodeQL code scanning ([pm-csv-pam9](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/chores/pm-csv-pam9.toon))
28
+ - Alert on daily release failure and require merge drivers in CI ([pm-csv-76gz](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/chores/pm-csv-76gz.toon))
29
+
30
+ ## 2026.8.16 - 2026-08-16
31
+
32
+ ### Fixed
33
+
34
+ - A truncated list-all answer is consumed as if it were complete ([pm-csv-mua3](https://github.com/unbraind/pm-csv/blob/main/.agents/pm/issues/pm-csv-mua3.toon))
35
+
3
36
  ## 2026.8.10 - 2026-08-10
4
37
 
5
38
  ### Fixed
package/README.md CHANGED
@@ -4,6 +4,9 @@ CSV importer and exporter for [pm-cli](https://github.com/unbraind/pm-cli).
4
4
 
5
5
  Import pm items from a CSV file, export them back out, or wire up a programmatic `csv-import` importer — all with zero external runtime dependencies.
6
6
 
7
+ The extension requires pm CLI 2026.8.20 or newer. Its development and release
8
+ gates are pinned to pm CLI/SDK 2026.8.21 so host behavior stays reproducible.
9
+
7
10
  ---
8
11
 
9
12
  ## Installation
@@ -42,7 +45,7 @@ pm csv import legacy.csv --encoding latin1 # non-UTF-8 source
42
45
  pm csv import sprint12.csv --source 'jira-export-2026-06'
43
46
  pm csv import vendor.csv --strict # fail before writing on bad row data
44
47
  pm csv import items.csv --dry-run
45
- pm csv import tasks.csv --atomic # all-or-nothing import (pm-cli >= 2026.7.19)
48
+ pm csv import tasks.csv --atomic # writer-locked, crash-recoverable import
46
49
  ```
47
50
 
48
51
  **Flags**
@@ -60,7 +63,7 @@ pm csv import tasks.csv --atomic # all-or-nothing import (pm-cli >= 2026.7.19)
60
63
  | `--priority <n>` | integer | — | Import **only** rows whose integer priority equals this value |
61
64
  | `--strict` | boolean | false | Abort before writing if validation finds missing titles, unknown statuses, invalid/out-of-range priorities, or duplicate mapped columns |
62
65
  | `--dry-run` | boolean | false | Preview what would be imported without writing any data |
63
- | `--atomic` | boolean | false | Import all creates atomically under one workspace writer-locked, crash-recoverable transaction (pm-cli >= 2026.7.19). On failure every applied create is compensated (closed); interrupted runs resume. Incompatible with `--stream` |
66
+ | `--atomic` | boolean | false | Use one writer-locked, crash-recoverable transaction. On failure, attempt best-effort create compensation; pre-existing item updates are intentionally not reverted. Inspect and reconcile any marked orphan before retrying. Incompatible with `--stream` |
64
67
 
65
68
  #### Strict import gate
66
69
 
@@ -71,22 +74,26 @@ strict mode the importer runs the same parser as `pm csv validate` before any
71
74
  write, then aborts on row-level data issues or duplicate mapped columns so a bad
72
75
  file cannot partially mutate the pm store.
73
76
 
74
- #### Atomic, all-or-nothing import (`--atomic`)
77
+ #### Atomic, crash-recoverable import (`--atomic`)
75
78
 
76
79
  By default, `csv import` creates items one row at a time. If a row fails
77
80
  mid-import, the rows already written stay in the tracker — a partial,
78
81
  non-atomic state — and concurrent agents can interleave writes. `--atomic`
79
82
  (requires pm-cli **>= 2026.7.19**) wraps the whole row set in a single
80
- `commitWorkspaceTransaction` primitive: all creates are committed under one
81
- workspace writer-locked, crash-recoverable journal, or none are.
82
-
83
- - **All-or-nothing:** if any row's `pm create` fails, every already-applied
84
- create is compensated (closed with `reason "atomic csv import rolled back"`),
85
- the transaction is rolled back, and the command exits non-zero with a clear
86
- message. No committed (open) items from the import remain in the tracker.
83
+ `commitWorkspaceTransaction` primitive: mutations are serialized under one
84
+ workspace writer lock and recorded in a crash-recoverable journal.
85
+
86
+ - **Failure compensation:** if any row fails, the coordinator attempts
87
+ reverse-order, best-effort compensation for creates by closing them with
88
+ reason `atomic csv import rolled back`, rolls back the transaction journal,
89
+ and exits non-zero with a reconciliation warning. A failed close deliberately
90
+ retains both transaction markers so an operator can inspect and reconcile the
91
+ open orphan by transaction id before retrying. Pre-existing item updates are
92
+ intentionally not reverted because arbitrary prior state is not captured.
87
93
  - **Crash-recoverable / resumable:** the transaction id is stable and derivable
88
- from the absolute file path (`csv-import-<sha1(absPath)>`), so re-running the
89
- same `--atomic` import against the same file resumes from the durable journal.
94
+ from the resolved file path and parsed content fingerprint, so re-running the
95
+ same unchanged `--atomic` import resumes from the durable journal while edited
96
+ content receives a fresh transaction id.
90
97
  Resume/compensation matching is **per-row-precise**: every item this
91
98
  transaction writes is stamped with a per-row ownership marker
92
99
  `csv-txrow:<transactionId>#<rowIndex>` (plus a batch-level
@@ -105,17 +112,18 @@ workspace writer-locked, crash-recoverable journal, or none are.
105
112
  - **Parity:** `--atomic` shells out to the same `pm create` the non-atomic path
106
113
  uses; without `--atomic`, import output and exit codes are unchanged.
107
114
  - **Incompatible with `--stream`:** an unbounded stream cannot be committed as
108
- one all-or-nothing transaction, so `--atomic --stream` fails fast with a usage
115
+ one bounded transaction, so `--atomic --stream` fails fast with a usage
109
116
  error.
110
117
  - **Compensation uses `close`, not `delete`**, to avoid the known history-
111
118
  resurrection issue, so compensated items remain in the tracker as closed
112
119
  items rather than being erased. For `--key` upsert rows that update
113
120
  pre-existing items, the update is applied within the transaction but is not
114
121
  reverted on failure (an arbitrary update cannot be safely undone without
115
- capturing prior state); all-or-nothing compensation applies to creates.
122
+ capturing prior state). Compensation is best-effort and reports remaining
123
+ work for operator reconciliation.
116
124
 
117
125
  ```bash
118
- pm csv import tasks.csv --atomic # all-or-nothing; resumes if interrupted
126
+ pm csv import tasks.csv --atomic # resumes an unchanged interrupted import
119
127
  pm csv import tasks.csv --atomic --source q2 # provenance still recorded
120
128
  ```
121
129
 
@@ -176,6 +184,15 @@ the effective mapped headers.
176
184
 
177
185
  Export all pm items (or a filtered subset) to CSV. Without `--output` the CSV is returned in the command result object.
178
186
 
187
+ Every export, upsert index, and atomic-resume scan reads the whole tracker with
188
+ canonical `pm list --all`, strict source reads, full metadata, and explicitly
189
+ unbounded row and token controls. The public pm SDK certifies source status,
190
+ filter scope, pagination, projection, counts, and item identity before pm-csv
191
+ uses a row. pm-csv additionally rejects missing or contradictory omission,
192
+ read-output, and unreadable-item receipts tracked in pm-cli issue 1078. A
193
+ partial or unverifiable workspace therefore fails closed instead of exporting
194
+ missing rows, creating duplicate upserts, or reapplying an atomic import.
195
+
179
196
  ```
180
197
  pm csv export
181
198
  pm csv export --output items.csv
@@ -348,6 +365,11 @@ no-op without breaking any other behavior.
348
365
 
349
366
  ## Building
350
367
 
368
+ `npm run accept:packed` packs the real artifact and exercises strict CSV import
369
+ plus complete CSV export in fresh npm/npx and Bun/bunx projects on the pinned
370
+ development host, and in npm/npx on the declared minimum host. It is mandatory
371
+ inside `npm run release:check`.
372
+
351
373
  ```bash
352
374
  npm install
353
375
  npm run build # runs tsc → dist/
package/dist/index.d.ts CHANGED
@@ -1,5 +1,17 @@
1
1
  import type { ExtensionApi } from "@unbrained/pm-cli/sdk/authoring";
2
2
  import { type SpawnSyncReturns } from "node:child_process";
3
+ import type { WorkspaceTransactionStep, WorkspaceTransactionCommitResult } from "@unbrained/pm-cli/sdk";
4
+ /**
5
+ * Error carrying a semantic process exit code, thrown by every failure path
6
+ * the command runtime must turn into a clean nonzero exit (including the
7
+ * complete-list refusals). Exported so regression tests can assert the
8
+ * typed failure instead of matching on message text alone.
9
+ */
10
+ export declare class CommandError extends Error {
11
+ /** Numeric exit code the runtime propagates to the shell. */
12
+ exitCode: number;
13
+ constructor(message: string, exitCode?: number);
14
+ }
3
15
  type ItemStatus = "open" | "in_progress" | "blocked" | "closed" | "canceled" | "draft";
4
16
  interface PmItem {
5
17
  id: string;
@@ -110,6 +122,59 @@ declare function resolveDelimiter(raw: string | undefined): string;
110
122
  * three causes can be regression-tested directly with synthetic results.
111
123
  */
112
124
  export declare function describePmNullStatus(result: SpawnSyncReturns<string>, label: string): string;
125
+ /**
126
+ * Refuse an incomplete canonical `pm list --all` envelope instead of consuming it.
127
+ *
128
+ * Reading `.items` without consulting the envelope's completeness receipt is
129
+ * how this package once shipped a 10-row CSV export from a 682-item workspace
130
+ * (pm 2026.8.14 defaulted the deprecated list-all alias to a truncated answer;
131
+ * verified on this
132
+ * host), saw none of the applied rows on an atomic-import resume scan, and
133
+ * missed upsert keys - each reporting success. Any one of four independent
134
+ * signals means the rows in `items` are NOT the whole workspace, so this
135
+ * throws (never returns a partial list, never logs and continues) naming the
136
+ * signal that tripped plus the `count`/`total` figures:
137
+ *
138
+ * - `truncated === true` - the row list was cut short (output budget, limit);
139
+ * - `has_more === true` - rows exist past the returned cursor boundary;
140
+ * - `completeness.status !== "complete"` - items/directories were unreadable
141
+ * ("partial") or the corpus was never scanned ("unchecked"); a missing
142
+ * receipt also trips this, because an unverifiable answer is not complete;
143
+ * - `omission_receipt.has_omissions === true` - field groups were dropped from
144
+ * the projection, so rows are present but degraded.
145
+ *
146
+ * Thrown errors are {@link CommandError} so the command runtime turns them
147
+ * into a clean nonzero exit. Paging is deliberately NOT attempted: every
148
+ * consumer here (CSV export, resume scan, key index) needs the WHOLE
149
+ * workspace, so refusing loudly is simpler and safer than a paging loop that
150
+ * could itself silently drop rows.
151
+ *
152
+ * Shared source, filter, pagination, projection, count, and identity rules come
153
+ * from the public SDK. A narrow package supplement rejects the missing or
154
+ * contradictory omission, read-output, and unreadable-counter evidence
155
+ * reproduced in pm-cli issue 1078. The returned rows are therefore safe for
156
+ * mutation planning, resume reconciliation, and CSV export.
157
+ *
158
+ * @param envelope - Parsed canonical complete-list JSON output.
159
+ * @returns Every certified full item row.
160
+ * @throws {@link CommandError} naming every tripped signal and the counts.
161
+ */
162
+ export declare function assertListAllComplete(envelope: unknown): PmItem[];
163
+ /** Minimal spawn options the seam forwards to `spawnSync`. */
164
+ export interface PmSpawnOptions {
165
+ /** Decoding requested for the child's captured output. */
166
+ encoding: "utf-8";
167
+ /** Read-buffer cap for the child's stdout. */
168
+ maxBuffer: number;
169
+ }
170
+ /**
171
+ * Injectable seam over the `pm` shell-out every complete-list reader uses.
172
+ *
173
+ * A parameter defaulting to the real `spawnPm`, so production callers are
174
+ * unchanged while tests substitute a canned envelope - captured from the real
175
+ * CLI and mutated - instead of mocking `child_process`.
176
+ */
177
+ export type PmSpawn = (args: string[], options: PmSpawnOptions) => SpawnSyncReturns<string>;
113
178
  /**
114
179
  * Normalize a dedup key value for stable matching. pm lower-cases tags on
115
180
  * storage, so a `csv-key:` tag written from "Fix Bug" comes back as
@@ -131,6 +196,8 @@ declare function encodeKeyTagValue(value: string): string;
131
196
  * @returns The decoded value, or `value` itself when it cannot be decoded.
132
197
  */
133
198
  declare function decodeKeyTagValue(value: string): string;
199
+ /** Normalize JavaScript's open-ended thrown-value channel for operator errors. */
200
+ declare function errorMessage(error: unknown): string;
134
201
  /**
135
202
  * Parse a `--map csvHeader=field` spec (repeatable / comma-joined) into a
136
203
  * lookup from a normalized CSV header name to the canonical pm field name.
@@ -198,6 +265,51 @@ declare function stringifyTags(tags: string[] | undefined): string;
198
265
  * BufferEncoding. Accepts utf-8/utf8, utf16le, latin1. Throws USAGE otherwise.
199
266
  */
200
267
  declare function resolveEncoding(raw: string | undefined): SupportedEncoding;
268
+ interface CsvImportOptions {
269
+ delimiter: string;
270
+ dryRun: boolean;
271
+ fieldMap: Record<string, string>;
272
+ /** Auto-map well-known third-party headers (summary->title, owner->assignee, ...). */
273
+ autoMap?: boolean;
274
+ /** Canonical pm field whose value is the dedup key (e.g. "title" or "id"). */
275
+ keyField?: string;
276
+ /** File text encoding to decode the source with (default utf-8). */
277
+ encoding?: SupportedEncoding;
278
+ /** Optional provenance label recorded on imported items via the csv_source field. */
279
+ source?: string;
280
+ /** Row-level filter: only rows matching every set criterion are imported. */
281
+ filter?: ImportRowFilter;
282
+ /** The CSV file has no header row; map columns positionally to IMPORT_COLUMNS. */
283
+ skipHeaders?: boolean;
284
+ /** Stream the file row-by-row instead of loading it fully into memory. */
285
+ stream?: boolean;
286
+ /**
287
+ * Import under one workspace writer-locked, crash-recoverable transaction
288
+ * (pm-cli >= 2026.7.19 `commitWorkspaceTransaction`). On failure the
289
+ * coordinator attempts reverse-order, best-effort create compensation;
290
+ * pre-existing item updates are intentionally not reverted. An interrupted
291
+ * run resumes from the durable journal, while a failed compensation remains
292
+ * transaction-marked so an operator can inspect and reconcile it before a
293
+ * retry. Incompatible with `--stream` (an unbounded stream cannot be one
294
+ * transaction).
295
+ */
296
+ atomic?: boolean;
297
+ /**
298
+ * Bound commit coordinator for the atomic path. Bound by the command path
299
+ * and importer capability from the host-injected `ctx.sdk`, so a copied
300
+ * extension never tries to resolve the host package through its own module
301
+ * tree. Atomic import refuses when an incompatible host omits this primitive.
302
+ */
303
+ commitTransaction?: (options: {
304
+ transactionId: string;
305
+ author: string;
306
+ steps: readonly WorkspaceTransactionStep[];
307
+ lockTtlSeconds?: number;
308
+ lockWaitMs?: number;
309
+ }) => Promise<WorkspaceTransactionCommitResult>;
310
+ /** Author attributed to the atomic transaction journal (defaults to `pm-csv`). */
311
+ atomicAuthor?: string;
312
+ }
201
313
  /**
202
314
  * Row-level import filter. Mirrors the `csv export` filter semantics exactly:
203
315
  * - `status` matches the row's *normalized* SDK status (so `done` matches
@@ -212,6 +324,19 @@ interface ImportRowFilter {
212
324
  type?: string;
213
325
  priority?: number;
214
326
  }
327
+ interface ImportResult {
328
+ imported: number;
329
+ updated: number;
330
+ skipped: number;
331
+ /** Subset of `skipped` attributable to a row not matching the import filter. */
332
+ filtered: number;
333
+ /** Auto-applied alias mappings when `--auto-map` is enabled. */
334
+ autoMappings: AutoFieldMapping[];
335
+ errors: string[];
336
+ previews: Record<string, unknown>[];
337
+ /** Helpful warnings about unknown --map targets or missing source headers. */
338
+ fieldMapWarnings: string[];
339
+ }
215
340
  interface ParsedRow {
216
341
  title: string;
217
342
  status: ItemStatus;
@@ -242,6 +367,28 @@ declare function parseImportFilter(statusRaw: string | undefined, typeRaw: strin
242
367
  * Unset criteria are wildcards. Exposed for unit testing.
243
368
  */
244
369
  declare function rowMatchesFilter(row: ParsedRow, filter: ImportRowFilter | undefined): boolean;
370
+ /**
371
+ * List existing items once and build a lookup from csv-key provenance value to
372
+ * item id, for idempotent upsert. The complete-list answer must be COMPLETE — a
373
+ * truncated answer silently missing keys would turn upserts into duplicate
374
+ * creates — so the envelope's receipt is checked before any key is read.
375
+ */
376
+ declare function loadKeyIndex(pmRoot: string, spawn?: PmSpawn): Map<string, string>;
377
+ /**
378
+ * Import CSV rows into a pm tracker as items.
379
+ *
380
+ * Rejects rather than throws when `--atomic` is combined with `--stream`: the
381
+ * two are genuinely incompatible, because a bounded transaction plan needs the
382
+ * whole row set in hand and a stream is unbounded. Returning a rejected promise
383
+ * keeps the failure on the same channel as the rest of the async path.
384
+ *
385
+ * @param pmRoot - Tracker root passed through to the pm CLI.
386
+ * @param filePath - CSV file to read.
387
+ * @param opts - Import behaviour, including the atomic and stream modes.
388
+ * @returns The import outcome; rejects with a {@link CommandError} on a usage
389
+ * conflict or an unreadable file.
390
+ */
391
+ declare function importCSV(pmRoot: string, filePath: string, opts: CsvImportOptions): Promise<ImportResult>;
245
392
  /**
246
393
  * Public helper: the atomic transaction id that `pm csv import <file> --atomic`
247
394
  * derives for the given file and options (reads and parses the file exactly as
@@ -271,14 +418,17 @@ export declare function atomicTransactionId(filePath: string, opts?: {
271
418
  * whose CSV `status` is `closed`/`canceled` is legitimately imported as a
272
419
  * closed item (upsertCreate/upsertUpdate apply the row's status, routing
273
420
  * terminal transitions through `pm close --reason`), so it must
274
- * still be recognized on resume and never re-imported. Conversely a rolled-back
275
- * create must NOT be recognized: `compensateCreate()` therefore STRIPS the
276
- * `csv-tx`/`csv-txrow` markers before closing the item, so a compensated
277
- * tombstone carries no marker and a post-rollback retry re-imports its row.
278
- * (This is why matching by marker-presence is correct for both a
279
- * legitimately-closed applied row and a rolled-back one; see compensateCreate.)
280
- */
281
- declare function loadAppliedByTransaction(pmRoot: string, transactionId: string): {
421
+ * still be recognized on resume and never re-imported. Conversely a
422
+ * successfully compensated create must NOT be recognized:
423
+ * `compensateCreate()` removes the markers only after closure succeeds or the
424
+ * item is already confirmed closed, so a compensated
425
+ * tombstone carries no marker and a post-rollback retry re-imports its row. If
426
+ * closure fails, both markers remain and make the orphan discoverable for
427
+ * reconciliation. (This is why matching by marker-presence is correct for both
428
+ * a legitimately-closed applied row and a rolled-back one; see
429
+ * compensateCreate.)
430
+ */
431
+ declare function loadAppliedByTransaction(pmRoot: string, transactionId: string, spawn?: PmSpawn): {
282
432
  byRowIndex: Map<number, string>;
283
433
  };
284
434
  /**
@@ -298,20 +448,21 @@ declare function loadAppliedByTransaction(pmRoot: string, transactionId: string)
298
448
  * non-zero exit (item truly absent, or a failed lookup such as the
299
449
  * `fake-get-fail` regression) still returns `undefined` unchanged.
300
450
  */
301
- declare function itemStatus(pmRoot: string, id: string): ItemStatus | undefined;
451
+ declare function itemStatus(pmRoot: string, id: string, spawn?: PmSpawn): ItemStatus | undefined;
302
452
  /**
303
- * Idempotently undo one row's create. First STRIPS this transaction's ownership
304
- * markers (`markers`) from the item, then closes it via `pm close` (NOT delete,
305
- * to avoid the known history-resurrection issue) when it is still open.
453
+ * Idempotently undo one row's create. First closes a still-open item via
454
+ * `pm close` (NOT delete, to avoid the known history-resurrection issue), then
455
+ * strips this transaction's ownership markers (`markers`) only after the item
456
+ * is confirmed closed.
306
457
  *
307
- * Stripping the markers is what makes marker-presence a correct "applied"
308
- * signal: a rolled-back row no longer carries a marker, so a post-rollback
309
- * retry re-imports it, while a *successfully* imported row (even one whose CSV
310
- * status is `closed`/`canceled`) keeps its marker and is resumed idempotently.
311
- * The strip runs whether the item is open or already closed (a closed-status
312
- * create being rolled back must also lose its marker); the close only runs for
313
- * a still-open item. Every step tolerates a missing item / absent tag, so a
314
- * repeated compensation (e.g. after a crash mid-compensation) is a safe no-op.
458
+ * Stripping the markers after closure makes marker-presence a correct
459
+ * reconciliation signal: a compensated row no longer carries a marker, so a
460
+ * post-rollback retry re-imports it, while a *successfully* imported row (even
461
+ * one whose CSV status is `closed`/`canceled`) keeps its marker and is resumed
462
+ * idempotently. If the close fails, the markers deliberately remain so the open
463
+ * orphan can be found by transaction id and reconciled before retrying. The
464
+ * strip also runs for an item that was already closed; every step tolerates a
465
+ * missing item / absent tag, so repeated compensation is a safe no-op.
315
466
  *
316
467
  * The status lookup itself is also tolerated: if `itemStatus` throws (a stdout
317
468
  * overrun or a signal kill on the `pm get`), the throw is caught and this row's
@@ -322,6 +473,14 @@ declare function itemStatus(pmRoot: string, id: string): ItemStatus | undefined;
322
473
  * and leaving every later applied create un-compensated.
323
474
  */
324
475
  declare function compensateCreate(pmRoot: string, id: string, markers?: readonly string[], reason?: string): void;
476
+ interface CsvValidateOptions {
477
+ delimiter: string;
478
+ fieldMap: Record<string, string>;
479
+ encoding?: SupportedEncoding;
480
+ autoMap?: boolean;
481
+ /** The CSV file has no header row; map columns positionally to IMPORT_COLUMNS. */
482
+ skipHeaders?: boolean;
483
+ }
325
484
  interface CsvValidateReport {
326
485
  ok: boolean;
327
486
  rowCount: number;
@@ -338,6 +497,12 @@ interface CsvValidateReport {
338
497
  fieldMapWarnings: string[];
339
498
  issues: string[];
340
499
  }
500
+ /**
501
+ * Parse a CSV and report data-quality issues without writing anything.
502
+ * Pure function over file contents — exposed for unit testing via the
503
+ * lower-level {@link validateParsedCSV} helper below.
504
+ */
505
+ declare function validateCSV(filePath: string, opts: CsvValidateOptions): CsvValidateReport;
341
506
  /**
342
507
  * Core validation logic over already-parsed headers + rows. Pure and
343
508
  * side-effect-free so it can be unit tested directly.
@@ -356,6 +521,29 @@ declare function validateParsedCSV(rawHeaders: string[], dataRows: string[][], f
356
521
  * the import proceed.
357
522
  */
358
523
  declare function strictValidationIssues(report: CsvValidateReport): string[];
524
+ interface CsvExportOptions {
525
+ statusFilter?: string;
526
+ typeFilter?: string;
527
+ delimiter: string;
528
+ /**
529
+ * Ordered columns to emit. Built-in columns are keys of {@link PmItem};
530
+ * discovered custom fields (see {@link discoverCustomFields}) are arbitrary
531
+ * string keys read straight off the item JSON, hence the widened type.
532
+ */
533
+ columns: string[];
534
+ /**
535
+ * Optional column-header → item-property remap, used when a discovered custom
536
+ * field's display key differs from the metadata key its value is stored under.
537
+ * Columns absent from the map are read by their own name.
538
+ */
539
+ columnSource?: Record<string, string>;
540
+ /** Omit the header row. */
541
+ noHeader?: boolean;
542
+ /** Use CRLF line endings (RFC-4180 / Excel-friendly). */
543
+ crlf?: boolean;
544
+ /** Excel-friendly output: forces CRLF and prepends a UTF-8 BOM. */
545
+ excel?: boolean;
546
+ }
359
547
  /**
360
548
  * A custom (workspace-registered) item field discovered from the runtime
361
549
  * schema. `key` is the human-facing column name; `metadataKey` is the property
@@ -397,13 +585,48 @@ declare function discoverCustomFields(pmRoot: string): DiscoveredField[];
397
585
  * @throws CommandError naming every unrecognised column and listing the valid ones.
398
586
  */
399
587
  declare function selectExportColumns(spec: string | undefined, extraValid?: ReadonlyArray<string>): string[];
588
+ /**
589
+ * Read every item from a tracker and render the CSV export body.
590
+ *
591
+ * Shells out to canonical `pm list --all --json --include-body` with an explicit
592
+ * `maxBuffer`, because a stdout overrun kills the child with a null status and
593
+ * an EMPTY stderr — which would otherwise surface as an unexplained
594
+ * "pm list --all failed" rather than as the size problem it is.
595
+ *
596
+ * Status and type filters are applied after the read, not pushed into the
597
+ * query. Each item's `csv_source` is then derived from its internal source tag
598
+ * via {@link decodeKeyTagValue}, so a re-export carries the provenance of the
599
+ * file the row originally came from.
600
+ *
601
+ * The envelope's completeness receipt is verified by
602
+ * {@link assertListAllComplete} before any row is rendered: a truncated,
603
+ * paged, partially-read or field-omitted answer refuses instead of exporting a
604
+ * silent subset (the 2026.8.14 truncated-default regression shipped a 10-row
605
+ * export of a 682-item workspace as success).
606
+ *
607
+ * @param pmRoot - Tracker root to export.
608
+ * @param opts - Column selection, per-column property remap, and status/type filters.
609
+ * @param spawn - Injectable shell-out seam (tests substitute a canned real
610
+ * envelope); defaults to the real `spawnPm`.
611
+ * @returns The rendered CSV text, the exported row count, and the line ending used.
612
+ * @throws CommandError when the pm read fails or the answer is incomplete,
613
+ * naming the buffer overrun or the tripped completeness signal.
614
+ */
615
+ declare function buildCsvExport(pmRoot: string, opts: CsvExportOptions, spawn?: PmSpawn): {
616
+ csvText: string;
617
+ count: number;
618
+ eol: "\n" | "\r\n";
619
+ };
400
620
  declare const _default: {
401
621
  name: string;
402
622
  version: string;
403
623
  activate(api: ExtensionApi): void;
404
624
  };
405
625
  export default _default;
406
- export { parseCSV, serializeCSV, serializeField, stripBOM, resolveDelimiter, parseFieldMap, resolveImportFieldMap, applyFieldMap, normalizeStatus, parseTags, stringifyTags, encodeKeyTagValue, decodeKeyTagValue, normalizeKeyValue, selectExportColumns, resolveEncoding, validateParsedCSV, strictValidationIssues, parseImportFilter, rowMatchesFilter, discoverCustomFields, EXPORT_COLUMNS, IMPORT_COLUMNS, StreamingCSVParser, streamCSVFile, levenshtein, suggestClosest, validateFieldMapTargets, checkMapSourcesPresent, };
626
+ export { parseCSV, serializeCSV, serializeField, stripBOM, resolveDelimiter, parseFieldMap, resolveImportFieldMap, applyFieldMap, normalizeStatus, parseTags, stringifyTags, encodeKeyTagValue, decodeKeyTagValue, errorMessage, normalizeKeyValue, selectExportColumns, resolveEncoding, validateParsedCSV, validateCSV, strictValidationIssues, parseImportFilter, rowMatchesFilter, discoverCustomFields, EXPORT_COLUMNS, IMPORT_COLUMNS, StreamingCSVParser, streamCSVFile, levenshtein, suggestClosest, validateFieldMapTargets, checkMapSourcesPresent, };
407
627
  export { loadAppliedByTransaction, itemStatus, compensateCreate };
628
+ export { loadKeyIndex, buildCsvExport };
629
+ export { importCSV };
630
+ export type { CsvExportOptions, CsvImportOptions };
408
631
  export type { ParsedRow, ImportRowFilter, DiscoveredField, AutoFieldMapping };
409
632
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}