monday-cli 0.6.0 → 0.7.1

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 (54) hide show
  1. package/CHANGELOG.md +438 -0
  2. package/README.md +165 -52
  3. package/dist/api/board-metadata.d.ts +7 -4
  4. package/dist/api/board-metadata.d.ts.map +1 -1
  5. package/dist/api/board-metadata.js +21 -6
  6. package/dist/api/board-metadata.js.map +1 -1
  7. package/dist/api/column-types.d.ts +61 -28
  8. package/dist/api/column-types.d.ts.map +1 -1
  9. package/dist/api/column-types.js +32 -13
  10. package/dist/api/column-types.js.map +1 -1
  11. package/dist/api/column-values.d.ts +22 -17
  12. package/dist/api/column-values.d.ts.map +1 -1
  13. package/dist/api/column-values.js +50 -34
  14. package/dist/api/column-values.js.map +1 -1
  15. package/dist/api/file-column-set.d.ts +164 -58
  16. package/dist/api/file-column-set.d.ts.map +1 -1
  17. package/dist/api/file-column-set.js +168 -110
  18. package/dist/api/file-column-set.js.map +1 -1
  19. package/dist/api/raw-write.d.ts +29 -18
  20. package/dist/api/raw-write.d.ts.map +1 -1
  21. package/dist/api/raw-write.js +48 -26
  22. package/dist/api/raw-write.js.map +1 -1
  23. package/dist/commands/board/column-create.d.ts +11 -6
  24. package/dist/commands/board/column-create.d.ts.map +1 -1
  25. package/dist/commands/board/column-create.js +23 -12
  26. package/dist/commands/board/column-create.js.map +1 -1
  27. package/dist/commands/board/describe.d.ts +5 -3
  28. package/dist/commands/board/describe.d.ts.map +1 -1
  29. package/dist/commands/board/describe.js +12 -4
  30. package/dist/commands/board/describe.js.map +1 -1
  31. package/dist/commands/emit.d.ts.map +1 -1
  32. package/dist/commands/emit.js +19 -16
  33. package/dist/commands/emit.js.map +1 -1
  34. package/dist/commands/item/create.d.ts +24 -8
  35. package/dist/commands/item/create.d.ts.map +1 -1
  36. package/dist/commands/item/create.js +494 -35
  37. package/dist/commands/item/create.js.map +1 -1
  38. package/dist/commands/item/update.d.ts +175 -6
  39. package/dist/commands/item/update.d.ts.map +1 -1
  40. package/dist/commands/item/update.js +697 -29
  41. package/dist/commands/item/update.js.map +1 -1
  42. package/dist/utils/output/select.d.ts +22 -0
  43. package/dist/utils/output/select.d.ts.map +1 -1
  44. package/dist/utils/output/select.js +30 -0
  45. package/dist/utils/output/select.js.map +1 -1
  46. package/dist/utils/output/table.d.ts +9 -0
  47. package/dist/utils/output/table.d.ts.map +1 -1
  48. package/dist/utils/output/table.js +13 -3
  49. package/dist/utils/output/table.js.map +1 -1
  50. package/package.json +1 -1
  51. package/dist/commands/update/body-source.d.ts +0 -38
  52. package/dist/commands/update/body-source.d.ts.map +0 -1
  53. package/dist/commands/update/body-source.js +0 -80
  54. package/dist/commands/update/body-source.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,444 @@ output envelope (`{ ok, data, meta, ... }`) and 29 stable error
7
7
  codes are part of the public contract — the SemVer rules in
8
8
  [`docs/cli-design.md`](./docs/cli-design.md) §6 govern bumps.
9
9
 
10
+ ## [0.7.1] - 2026-05-20 — Live-API hotfix: `is_leaf` schema drift + non-TTY table colour
11
+
12
+ Emergency patch. `0.7.0` shipped two defects that only surface
13
+ against the **live** Monday API (the test suite mocks the network
14
+ boundary, so all 4124 tests stayed green). No new commands, no
15
+ contract changes — strictly bug fixes. **No breaking changes vs
16
+ `0.7.0`.**
17
+
18
+ ### Fixed
19
+
20
+ - **`is_leaf` field removed from the board-metadata query (critical).**
21
+ Monday removed `is_leaf` from the `Board` type at API `2026-01`
22
+ (confirmed by introspection — `hierarchy_type` is still valid).
23
+ The shared `BOARD_METADATA_QUERY` still selected it, so Monday
24
+ rejected the whole query with `validation_failed` ("Cannot query
25
+ field \"is_leaf\" on type \"Board\""). Because that query backs
26
+ `loadBoardMetadata` → the column-name resolver, this broke **every
27
+ board-metadata path**: `board describe` / `columns` / `groups` /
28
+ `doctor`, `item list` / `search`, and **all `--set` / `--set-raw`
29
+ column writes** on `item create` / `update` / `set` (the column-
30
+ value path prequeries board metadata). Against live `2026-01` the
31
+ CLI was effectively read-by-ID + bare-create only. The query no
32
+ longer selects `is_leaf`; the `board describe` output **preserves
33
+ the `is_leaf` key as `null`** (non-breaking per §6.1 — removing the
34
+ key is deferred to the next major).
35
+ - **Table output no longer leaks ANSI colour into pipes.** `cli-table3`
36
+ colours its borders grey unconditionally, so `--output table`
37
+ forced through a pipe emitted `^[[90m`/`^[[39m` around every box
38
+ character. Colour is now gated on stdout TTY-ness and honours
39
+ `NO_COLOR` / `FORCE_COLOR` / `--no-color` (`cli.md` "Respect
40
+ NO_COLOR"). The non-TTY default was already JSON, so this only
41
+ affected explicitly-forced piped tables.
42
+
43
+ ### Internal
44
+
45
+ - Added a `RUN_LIVE_TESTS`-gated e2e smoke test
46
+ (`tests/e2e/live-schema-drift.test.ts`) that runs the exact
47
+ production `BOARD_METADATA_QUERY` against the live API and asserts
48
+ no GraphQL errors — catches the `is_leaf` class of field drift
49
+ before release. Skipped in normal CI; run via
50
+ `RUN_LIVE_TESTS=1 MONDAY_API_TOKEN=... npm run test:e2e`.
51
+
52
+ ### Known limitations (unchanged, not regressions)
53
+
54
+ - `monday board column-create --type board_relation --settings` still
55
+ rejects `boardIds` / `boardId` / `allowMultipleItems` — a deliberate
56
+ M19 limitation (Monday has no documented `create_column.defaults`
57
+ shape for linked boards), not a regression. Adding writable
58
+ Connect-Boards settings is a v0.8 feature pending a wire probe.
59
+
60
+ ## [0.7.0] - 2026-05-20 — Bulk + create-time file `--set` carve-out folds (M42 + M43)
61
+
62
+ The "friendly file `--set` reaches every callShape" milestone —
63
+ v0.6-M38's single-item friendly file-column writer gains the two
64
+ carve-outs deferred at M38: bulk `monday item update --where ...
65
+ --set <file-col>=<path>` per-item multipart fan-out (M42, closes
66
+ D5) and create-time `monday item create --set <file-col>=<path>`
67
+ two-leg dispatch under the §5.8 orphan-warn atomicity envelope
68
+ (M43, closes D6). The friendly file-`--set` form now reaches
69
+ every CLI callShape (`item set` / `item update <iid>` / `item
70
+ update --where` / `item create`). **No breaking changes vs
71
+ `0.6.0` — every v0.7 surface is additive.** Built incrementally
72
+ across M42 + M43.
73
+
74
+ **Pivot note 2026-05-20.** The originally-planned API `2026-04`
75
+ pin (M39) + `monday item set-description` (M40) + `monday doc
76
+ block-create-bulk <did>` (M41) cluster was **DEFERRED** to a
77
+ future release pending `@mondaydotcomorg/api` SDK 15.x publishing
78
+ with `CURRENT_VERSION = '2026-04'` natively. M39's string-literal
79
+ override path was explored then abandoned after M40's empirical
80
+ probe revealed paid-tier feature gating + opaque
81
+ `INTERNAL_SERVER_ERROR { service: 'docs-api' }` on free-tier
82
+ accounts at every payload size — not worth the override-
83
+ maintenance overhead for a single user-blocked verb. Re-attempt
84
+ expected at v0.8 if Monday's SDK cadence holds (≈2 months between
85
+ major SDK bumps per the 13.0.0 / 14.0.0 / 15.0.0 trajectory) AND
86
+ a paid-tier sandbox is available for the M40 wire probe.
87
+
88
+ ### Breaking changes vs `0.6.0`
89
+
90
+ **None.** Every command, error code, envelope key, and warning
91
+ shape shipped in v0.6.0 is preserved byte-for-byte. v0.7 only adds.
92
+
93
+ ### Surface
94
+
95
+ **117 commands shipped (unchanged from v0.6).** M42 + M43 extend
96
+ two existing verbs (`monday item update` bulk dispatch leg +
97
+ `monday item create` action body) with new file-column dispatch
98
+ branches rather than introducing new noun namespaces or verbs.
99
+ The friendly translator (`translateColumnValueAsync`) stays
100
+ JSON-output-shaped for the 13 existing writable types; file-
101
+ column dispatch routes through v0.6-M38's
102
+ `executeFileColumnSet` sibling module (the new bulk + create-
103
+ time paths consume the M38 helper rather than duplicating it).
104
+
105
+ **Bulk file `--set` (M42) — `monday item update --where ...
106
+ --set <file-col>=<path>`.** Per-item multipart fan-out across
107
+ the `--where`-resolved item-id set, dispatched through the
108
+ existing v0.4-M30 `dispatchParallel` over a shared
109
+ `MultipartTransport` (per D1 closure — no new transport seam;
110
+ the parallel-multipart cross-product of M30's bulk-concurrency
111
+ + M31's multipart wire was already pinned). New helper
112
+ `runItemUpdateBulkFileDispatch` (in `src/commands/item/
113
+ update.ts`) mirrors M25's partial-success shape with `asset`
114
+ slot replacing `item` slot (per D2 closure):
115
+ `data.results[i].asset: { id, name, ... }` on success;
116
+ `data.results[i].error: { code, message }` under
117
+ `--continue-on-error`. Aggregate `data.summary` extends M25's
118
+ `partialSuccessBulkUpdateDataSchema` with three new slots
119
+ (`column_id` / `filename` / `file_size_bytes`) echoing the
120
+ dispatched file alongside `matched_count` / `applied_count` /
121
+ `failed_count` / `board_id`. New `data.operation:
122
+ 'item_update_bulk_file_set'` literal discriminator (distinct
123
+ from M25's `'item_update'`) so agents branch uniformly on
124
+ `data.operation`. `--concurrency 1..32` (default 1) opts into
125
+ bounded parallel dispatch per the v0.4-M30 range; `--continue-
126
+ on-error` partitions per-item wire failures into the partial-
127
+ success envelope while leaving whole-call-abort semantics for
128
+ the upfront local file pre-check (per D3 closure —
129
+ `precheckLocalFile` fires ONCE upfront per cli-design §5.8 "pre-
130
+ checks MUST fire BEFORE any wire round-trip" before the dispatch
131
+ loop, since the bulk shape has ONE file path shared across N
132
+ matched items).
133
+
134
+ **Create-time file `--set` (M43) — `monday item create --set
135
+ <file-col>=<path>`.** Two-leg dispatch routes through the new
136
+ `runItemCreateFileDispatch` helper (in `src/commands/item/
137
+ create.ts`): leg-1 `create_item` bundles the non-file
138
+ `column_values` atomically into the wire call; leg-2
139
+ `add_file_to_column` attaches the file to the newly-created
140
+ item. Pair is non-atomic by construction (Monday has no single-
141
+ wire create-item-with-file mutation at API `2026-01`). The atomicity
142
+ envelope shape closed at D1 to **(b) orphan-warn** rather than
143
+ (a) automatic rollback — the pre-flight rollback-viability probe
144
+ could not run empirically (the token lacked `create_item`
145
+ permission in token-created sandbox workspaces + existing-board
146
+ attempts were correctly blocked by harness modify-shared-state
147
+ guards), so defaulting to orphan-warn preserves the agent's
148
+ recovery handle without introducing a destructive `delete_item`
149
+ cleanup leg whose own failure mode is unaccounted for. Leg-2
150
+ failure surfaces `internal_error` with `details.reason:
151
+ 'create_then_file_upload_partial_failure'` + `details.
152
+ created_item_id` echoing leg-1's orphan + `details.column_id`
153
+ (the resolved file-column ID) + `details.cause` (the M31 wire-
154
+ failure JSON projection) + `details.hint` directing agents to
155
+ retry leg-2 alone (`monday item set <iid> <file-col>=<path>`)
156
+ OR rollback (`monday item delete <iid> --yes`). `--dry-run`
157
+ emits two `planned_changes` entries per D2 closure
158
+ (`operation: 'create_item'` / `'create_subitem'` with bundled
159
+ non-file `column_values`, then `operation:
160
+ 'add_file_to_column'` with the file pre-check echo); the leg-2
161
+ entry carries no `item_id` slot because the item doesn't exist
162
+ at dry-run time. **D6 mixed-set mutex SUPPRESSED on
163
+ `'item_create'`** per the asymmetry closure — `create_item`
164
+ natively bundles non-file `column_values` atomically into leg-
165
+ 1, so a multi-`--set` mix of file + non-file entries is
166
+ legitimate at create time (unlike single-item / bulk
167
+ callShapes where Monday's `change_multiple_column_values`
168
+ doesn't accept files). The universal multi-file mutex still
169
+ applies — 2+ file entries reject with `usage_error.details.
170
+ reason: 'multi_file_set_unsupported'`.
171
+
172
+ **Mutex rules at v0.7 (universal across all four callShapes
173
+ post-M42 + M43).**
174
+
175
+ - **Exactly ONE file `--set <file-col>=<path>` per call** across
176
+ every callShape (`'item_set'` / `'item_update_single'` /
177
+ `'item_update_bulk'` / `'item_create'`). 2+ file entries
178
+ reject with `usage_error.details.reason:
179
+ 'multi_file_set_unsupported'`.
180
+ - **Mixing a file `--set` with any value `--set` / `--set-raw`
181
+ / `--name`** rejects with `usage_error.details.reason:
182
+ 'mixed_file_and_value_sets'` on `'item_set'` /
183
+ `'item_update_single'` / `'item_update_bulk'`. **SUPPRESSED**
184
+ on `'item_create'` per D6 asymmetry — `create_item` bundles
185
+ non-file `column_values` atomically into leg-1, so the mix
186
+ is legitimate at create time.
187
+
188
+ Enforcement fires at the column-resolution boundary (parse-time
189
+ can't know — the column type only resolves after board metadata
190
+ loads); rejection happens BEFORE any multipart bytes get
191
+ constructed.
192
+
193
+ **`--set-raw <file-col>=<json>` STAYS REJECTED at v0.7
194
+ (unchanged from v0.6-M38 D3 — PERMANENT, not deferred).**
195
+ Monday's wire has no JSON shape for `change_column_value` on
196
+ file columns; the rejection at `src/api/raw-write.ts:
197
+ translateRawColumnValue` carries `details.hint` pointing at
198
+ the friendly `--set` form (now universal across callShapes per
199
+ M42 + M43) AND the v0.4-M31 verb-shaped `monday item upload`.
200
+
201
+ ### Output contract additions
202
+
203
+ **No new stable error codes — registry stays at 29.** Per D3
204
+ closure on M42 + D3 closure on M43, every v0.7 rejection routes
205
+ through existing codes (`usage_error` / `unsupported_column_
206
+ type` / `not_found` / `validation_failed` / `internal_error`)
207
+ with `details.reason` literal-string discriminators. **One new
208
+ discriminator literal lands at v0.7:** M43's
209
+ `'create_then_file_upload_partial_failure'` (M43 leg-2 partial-
210
+ failure orphan-warn envelope) joins the existing M38-era
211
+ discriminators (`mixed_file_and_value_sets` /
212
+ `multi_file_set_unsupported` / `file_set_on_bulk_unsupported` /
213
+ `file_set_on_create_unsupported`) under the R-v0.6-NEW-2
214
+ discriminated-union per-status-detail pattern.
215
+
216
+ **R-v0.6-NEW-2 graduates at the 5-consumer threshold post-M43.**
217
+ The discriminator pattern (4 supporting instances at v0.6 close)
218
+ crossed the threshold with M43's new discriminator literal as
219
+ the 5th. Graduation lifts the pattern from "watch-item" to
220
+ "ratified design idiom" — future milestones touching the
221
+ `details.reason` per-status-detail surface inherit the pattern
222
+ without further filing.
223
+
224
+ **New aggregate envelope slots for M42 bulk file dispatch.**
225
+ `data.summary.{column_id, filename, file_size_bytes}` extend
226
+ M25's `partialSuccessBulkUpdateDataSchema` with file-dispatch
227
+ echo slots so agents reading the success envelope see which
228
+ file was dispatched + where. `column_id` echoes the resolved
229
+ file-column ID; `filename` echoes the basename; `file_size_
230
+ bytes` echoes the `fs.stat()` size in bytes (no file bytes are
231
+ loaded into memory at envelope-time — the size is captured
232
+ pre-dispatch in the `precheckLocalFile` step).
233
+
234
+ **New M43 orphan-warn envelope on `data.operation:
235
+ 'item_create'` leg-2 failure.** Beyond the existing M38-era
236
+ `add_file_to_column` failure envelope, M43 leg-2 failure
237
+ surfaces a 5-slot details bag: `reason` (literal
238
+ `'create_then_file_upload_partial_failure'`) + `created_item_
239
+ id` (the orphaned leg-1 item ID) + `column_id` (the resolved
240
+ file-column ID) + `cause` (the M31 wire-failure JSON
241
+ projection) + `hint` (the recovery-path English string).
242
+
243
+ **No new envelope keys, no new warning shapes** outside the M42
244
+ `data.summary` extension above. M42 + M43 reuse the M31
245
+ multipart wire's success envelope shape + the post-success
246
+ eager-invalidation contract (`invalidateBoard(boardId)` fires
247
+ single-leg on multipart success across all 4 callShapes).
248
+
249
+ ### Upgrade notes
250
+
251
+ - **`unsupported_column_type` `deferred_to: "v0.6"` for the
252
+ files-shaped category on bulk + create paths is DROPPED.**
253
+ v0.7-M42 picks up the bulk path (per-item multipart fan-out
254
+ under `--concurrency` / `--continue-on-error`); v0.7-M43
255
+ picks up the create-time path (two-leg dispatch under §5.8
256
+ orphan-warn). The rejection row at `src/api/column-values.ts`
257
+ (the files-shaped row of the friendly translator) no longer
258
+ fires on `item create` or `item update --where` — those paths
259
+ now dispatch to the appropriate helper BEFORE the translator
260
+ row fires. The v0.6-M38 literals `'file_set_on_bulk_
261
+ unsupported'` and `'file_set_on_create_unsupported'` STAY
262
+ RESERVED in docstrings + regression-guarded by integration
263
+ tests; the runtime path no longer surfaces them. Agents that
264
+ branched on either literal will instead receive the success
265
+ envelopes documented above OR a leg-2 failure under M43's
266
+ orphan-warn shape.
267
+ - **`--set-raw <file-col>=<json>` STAYS REJECTED (unchanged
268
+ from v0.6-M38 D3, PERMANENT).** Monday's wire has no JSON
269
+ shape for files-shaped `change_column_value`. The rejection
270
+ hint at `src/api/raw-write.ts` names BOTH the friendly `--set`
271
+ form (now universal across callShapes) AND the v0.4-M31
272
+ `monday item upload` verb.
273
+ - **Multi-level subitem creation slips from `"v0.7"` →
274
+ `"v0.8"`.** Originally slipped from v0.3 → v0.4 → v0.5 → v0.6
275
+ → v0.7 across four prior release-preps. v0.7 didn't pick it
276
+ up (v0.7 pivoted away from API `2026-04` at 2026-05-20 so
277
+ the data-model probe gate moves to v0.8's planned `2026-07`
278
+ pin; Monday's `sub_items_board` still carries no `subtasks`
279
+ column at API `2026-01`). The `error.code: "usage_error"` +
280
+ `details.hierarchy_type: "multi_level"` keys are unchanged;
281
+ only the `deferred_to` literal flipped.
282
+ - **Cross-board `item move` value-overrides slips from `"v0.7"`
283
+ → `"v0.8"`.** Slipped across v0.3-M11 → v0.4 → v0.5 → v0.6
284
+ → v0.7 → v0.8 release-preps. Monday's `ColumnMappingInput`
285
+ still carries no value slot; the cross-leg partial-failure
286
+ envelope question stays open.
287
+ - **Cross-board resumable cursor slips from `"v0.7"` →
288
+ `"v0.8"`.** Slot remains for the per-board cursor-lifetime
289
+ under-aggregation design issue. The `cross_board_truncated`
290
+ warning's `details.hint` continues to recommend narrowing via
291
+ `--workspace` / `--favorites` / `--max-boards`.
292
+ - **Multi-file `--set` per call (v0.6-M38 D2) and file-`--set`
293
+ stdin support (v0.6-M38 D7) remain v0.7.x / future
294
+ candidates.** M42 pinned the per-item file-dispatch envelope;
295
+ multi-file would now revisit with M42's shape as the per-
296
+ item baseline.
297
+ - **`monday auth login` placeholder-guard unchanged.** The verb
298
+ is still registered and still surfaces `usage_error.details.
299
+ reason: oauth_unregistered` pointing at `MONDAY_API_TOKEN`
300
+ (unchanged from v0.6.0). The OAuth deferral revisits in
301
+ v0.7.x / v0.8 contingent on user demand.
302
+ - **Stable error-code registry stays at 29.** Existing codes'
303
+ shapes are unchanged across v0.6 → v0.7.
304
+
305
+ ### Internals worth highlighting
306
+
307
+ - **R-v0.6-NEW-1 graduates at the 5-consumer threshold post-
308
+ M43.** The `file-source.ts` two-export module (`precheck
309
+ LocalFile` + `buildBlobFromPath`) added at v0.6-M38 IMPL
310
+ kickoff (`3c2a9b0`, ahead-of-feat 3-consumer lift) scaled to
311
+ 5 consumers post-v0.7: M31 `item upload` + M31 `update
312
+ upload` + M38 single-item `executeFileColumnSet` + M42 bulk
313
+ `runItemUpdateBulkFileDispatch` + M43 create-time
314
+ `runItemCreateFileDispatch`. Helper internal shape unchanged
315
+ across all 5 consumers — graduation earned.
316
+ - **R-v0.6-NEW-2 graduates at the 5-consumer threshold post-
317
+ M43.** The `details.reason` discriminated-union per-status-
318
+ detail pattern (4 supporting instances at v0.6 close —
319
+ `mixed_file_and_value_sets` / `multi_file_set_unsupported` /
320
+ `file_set_on_create_unsupported` / `file_set_on_bulk_
321
+ unsupported`) crossed the threshold with M43's new
322
+ `create_then_file_upload_partial_failure` literal as the 5th.
323
+ - **R-NEW-82 graduated at the 5th-consecutive consumer.** The
324
+ release-prep cross-doc grep for stale `deferred_to:
325
+ "v<currently-releasing-version>"` slots fired and caught
326
+ one stale site (multi-level subitem `--parent` rejection —
327
+ slipped to `"v0.8"`) plus one ToC drift (v0.7-M42 + v0.7-M43
328
+ friendly file `--set` annotations missing from `docs/output-
329
+ shapes.md`'s `item (mutations)` row). Mirrors v0.3-M28 (1st)
330
+ / v0.4 (2nd) / v0.5 (3rd) / v0.6 (4th) / v0.7 (5th) release-
331
+ prep ratifications.
332
+ - **R-NEW-84 graduated discipline applied.** The v0.7 release-
333
+ prep cluster ships zero production `src/**/*.ts` semantic
334
+ changes (only the literal `'v0.7'` → `'v0.8'` flip in the
335
+ multi-level subitem rejection slot); gates carry verification
336
+ per the R-NEW-84 carve-out (skip Codex review on mechanical /
337
+ process-only clusters).
338
+ - **R-v0.7-NEW-4 (Pre-IMPL contract-term checklist) graduated
339
+ at v0.7-M42 IMPL R7 + refined at R8.** The discipline lives
340
+ in `.claude/rules/workflow.md` as a permanent rule. v0.7-M43
341
+ IMPL inherited the checklist + extended it with a "round-
342
+ agnostic framing" sub-rule at R3, and converged in 4 fix-up
343
+ rounds vs M42's 8 — graduation earned its keep.
344
+ - **R-NEW-76 graduated** from "stub-anchored ordering invariant"
345
+ to "wire-dispatch-anchored ordering invariant" at v0.7-M43
346
+ IMPL — post-IMPL the c8 boundary is gone but the `parseArgv`-
347
+ BEFORE-dispatch ordering itself stays load-bearing (argv-
348
+ level failures surface as `usage_error`, not
349
+ `internal_error`).
350
+ - **M42 IMPL converged in 8 fix-up rounds.** R1 closed the
351
+ behavioral surface (`foldAndRemap` + `SourceAggregator` +
352
+ fail-fast partial-success invalidate); R2-R8 were W9-prose-
353
+ only (no behavioral findings, asymptotic prose convergence
354
+ pattern that motivated the R-v0.7-NEW-4 graduation).
355
+ - **M43 IMPL converged in 4 fix-up rounds.** R1 closed the
356
+ behavioral surface; R2-R3 trailing W9 prose drift; R4
357
+ CONVERGED with zero findings. M43 inherited R-v0.7-NEW-4
358
+ from M42's graduation, short-circuiting the W9 cycle from
359
+ M42's 8 rounds down to 4.
360
+ - **Audit-fix folded into version-bump per security.md "high
361
+ = merge blocker" interpretation.** v0.6 release-prep
362
+ established the inline audit-fix precedent at version-bump;
363
+ v0.7 release-prep applied it: `npm audit` flagged
364
+ `brace-expansion@5.0.2` (moderate severity —
365
+ GHSA-jxxr-4gwj-5jf2 large-numeric-range DoS-protection
366
+ defeat); `npm audit fix` cleanly resolved via the lockfile
367
+ to `5.0.5+` (non-breaking transitive through eslint's
368
+ minimatch chain). `npm audit` reports `0 vulnerabilities`
369
+ post-fix.
370
+ - **Two-AI review** ran for v0.7-M42 pre-flight + IMPL, v0.7-
371
+ M43 pre-flight + IMPL. M42 IMPL converged in 8 fix-up rounds
372
+ (1 behavioral + 7 W9 prose); M43 IMPL converged in 4 (1
373
+ behavioral + 2 W9 + 1 zero-finding CONVERGED). The v0.7
374
+ release-prep cluster skipped Codex per R-NEW-84. Cumulative
375
+ Codex breakdowns live in the per-milestone post-mortems in
376
+ [`docs/v0.7-plan.md`](./docs/v0.7-plan.md) §3.
377
+
378
+ ### Tests + quality gates
379
+
380
+ - **4124 unit/integration + E2E tests** at v0.7.0 (+1 skipped;
381
+ was 4100 + 1 at v0.6.0; +24 net for M42 + M43 — ~15 new tests
382
+ for M42 covering bulk fan-out + `--concurrency` interaction +
383
+ partial-success projection + `data.summary` echo, ~9 net for
384
+ M43 covering two-leg happy path top-level + subitem + D6
385
+ mixed-set asymmetry + dry-run two-`planned_changes` + D1
386
+ orphan-warn envelope + leg-1 failure with/without remap +
387
+ translation reject + atomicity-before-wire ENOENT +
388
+ regression-guards across all 4 emit surfaces). All green on
389
+ Node 22 + 24.
390
+ - **Coverage at 98.79 / 95.65 / 99.16 / 99.08** (statements /
391
+ branches / functions / lines) against the floor 95 / 95.45 /
392
+ 95 / 95. Branches margin **0.20pp** at v0.7.0 (was 1.01pp at
393
+ v0.6.0; the 0.81pp drop reflects new conditional-spread arms
394
+ across M42 + M43's leg-1 / leg-2 catch arms — defensive non-
395
+ CliError re-throws + cause-details / metaSource unreachable
396
+ arms c8-ignored per testing.md preferred form). Floor unchanged
397
+ across v0.6.0 → v0.7.0.
398
+ - **Envelope-snapshot suite** — refresh probe ran clean at v0.7
399
+ release-prep (zero diff vs M43 IMPL close); per-milestone
400
+ close-docs sweeps refreshed snapshots in lockstep at M42 IMPL
401
+ close + M43 IMPL close.
402
+ - **Five test layers held**: unit, integration (in-process
403
+ `FixtureTransport` + `MultipartFixtureTransport`), E2E
404
+ (subprocess against fixture server), envelope-shape snapshot
405
+ suite, published-tarball E2E.
406
+ - **Audit-fix folded into release-prep.** `npm audit` flagged a
407
+ transitive `brace-expansion@5.0.2` (moderate severity); `npm
408
+ audit fix` cleanly resolved to `5.0.5+`. `npm audit` reports
409
+ `0 vulnerabilities` post-fix.
410
+
411
+ ### Documentation
412
+
413
+ - **[`docs/v0.7-plan.md`](./docs/v0.7-plan.md)** new — the v0.7
414
+ active plan with M42 + M43 milestones, decisions log (per-
415
+ milestone D1-D6), R-class register (R-v0.7-NEW-1 through
416
+ R-v0.7-NEW-5), per-milestone post-mortems (§3), 2026-05-20
417
+ pivot note pinning M39 / M40 / M41 as DEFERRED.
418
+ - **[`docs/cli-design.md`](./docs/cli-design.md)** §4.3
419
+ `monday item update` + `monday item create` rows annotated
420
+ with the M42 bulk + M43 create-time file-column dispatch
421
+ shapes; §5.3 "File-column dispatch leg" subsection extended
422
+ with the bulk fan-out (M42) + two-leg orphan-warn (M43)
423
+ branches; §5.8 atomicity discipline extended with the M43
424
+ two-leg orphan-warn envelope shape.
425
+ - **[`docs/output-shapes.md`](./docs/output-shapes.md)** —
426
+ `item update --where ... --set <file-col>=<path>` section at
427
+ line 2399 (M42 bulk file dispatch); `item create --set <file-
428
+ col>=<path>` integrated into the existing `item create`
429
+ section at line 2524 (M43 two-leg dispatch + orphan-warn
430
+ envelope); ToC row for `item (mutations)` updated to
431
+ enumerate the friendly file `--set v0.6-M38 single + v0.7-M42
432
+ bulk` annotation on `update` + `(friendly file --set v0.7-M43)`
433
+ annotation on `create` (caught at v0.7 release-prep ToC audit
434
+ as a v0.7-M42 + v0.7-M43 close-docs gap — 5th consecutive
435
+ R-NEW-82 graduated-discipline ratification).
436
+ - **README.md** quickstart expanded with v0.7 examples (step 13
437
+ extended to demonstrate M42 bulk file dispatch under
438
+ `--concurrency` / `--continue-on-error` + M43 create-time
439
+ file `--set` with mixed-set asymmetry). Scope section reshaped
440
+ around v0.7.0 / v0.6.0 / v0.5.0 / v0.4.0 / v0.3.0 / v0.2.0 /
441
+ v0.1.0 per-version layout. New "What v0.7 added (M42 + M43)"
442
+ per-milestone bullet block. v0.8 (next) block enumerates
443
+ carry-forward backlog + the v0.7-deferred M39 / M40 / M41
444
+ cluster pending SDK 15.x native `2026-04`.
445
+
446
+ [0.7.0]: https://github.com/Firer/monday-cli/releases/tag/v0.7.0
447
+
10
448
  ## [0.6.0] - 2026-05-18 — Files-shaped friendly `--set` writes (M38)
11
449
 
12
450
  The "agents can write to files-shaped columns inline" milestone —