monday-cli 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +665 -0
  2. package/README.md +209 -35
  3. package/dist/api/column-types.d.ts +81 -19
  4. package/dist/api/column-types.d.ts.map +1 -1
  5. package/dist/api/column-types.js +44 -11
  6. package/dist/api/column-types.js.map +1 -1
  7. package/dist/api/column-values.d.ts +22 -10
  8. package/dist/api/column-values.d.ts.map +1 -1
  9. package/dist/api/column-values.js +50 -20
  10. package/dist/api/column-values.js.map +1 -1
  11. package/dist/api/file-column-set.d.ts +613 -0
  12. package/dist/api/file-column-set.d.ts.map +1 -0
  13. package/dist/api/file-column-set.js +568 -0
  14. package/dist/api/file-column-set.js.map +1 -0
  15. package/dist/api/raw-write.d.ts +38 -17
  16. package/dist/api/raw-write.d.ts.map +1 -1
  17. package/dist/api/raw-write.js +62 -25
  18. package/dist/api/raw-write.js.map +1 -1
  19. package/dist/api/resolver-error-fold.d.ts +25 -0
  20. package/dist/api/resolver-error-fold.d.ts.map +1 -1
  21. package/dist/api/resolver-error-fold.js +56 -0
  22. package/dist/api/resolver-error-fold.js.map +1 -1
  23. package/dist/commands/board/column-create.d.ts +13 -3
  24. package/dist/commands/board/column-create.d.ts.map +1 -1
  25. package/dist/commands/board/column-create.js +27 -8
  26. package/dist/commands/board/column-create.js.map +1 -1
  27. package/dist/commands/item/create.d.ts +24 -8
  28. package/dist/commands/item/create.d.ts.map +1 -1
  29. package/dist/commands/item/create.js +601 -44
  30. package/dist/commands/item/create.js.map +1 -1
  31. package/dist/commands/item/set.d.ts +33 -3
  32. package/dist/commands/item/set.d.ts.map +1 -1
  33. package/dist/commands/item/set.js +193 -15
  34. package/dist/commands/item/set.js.map +1 -1
  35. package/dist/commands/item/update.d.ts +203 -3
  36. package/dist/commands/item/update.d.ts.map +1 -1
  37. package/dist/commands/item/update.js +1015 -68
  38. package/dist/commands/item/update.js.map +1 -1
  39. package/dist/commands/item/upload.d.ts.map +1 -1
  40. package/dist/commands/item/upload.js +16 -69
  41. package/dist/commands/item/upload.js.map +1 -1
  42. package/dist/commands/update/upload.d.ts.map +1 -1
  43. package/dist/commands/update/upload.js +9 -59
  44. package/dist/commands/update/upload.js.map +1 -1
  45. package/dist/utils/file-source.d.ts +93 -0
  46. package/dist/utils/file-source.d.ts.map +1 -0
  47. package/dist/utils/file-source.js +140 -0
  48. package/dist/utils/file-source.js.map +1 -0
  49. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,671 @@ 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.0] - 2026-05-20 — Bulk + create-time file `--set` carve-out folds (M42 + M43)
11
+
12
+ The "friendly file `--set` reaches every callShape" milestone —
13
+ v0.6-M38's single-item friendly file-column writer gains the two
14
+ carve-outs deferred at M38: bulk `monday item update --where ...
15
+ --set <file-col>=<path>` per-item multipart fan-out (M42, closes
16
+ D5) and create-time `monday item create --set <file-col>=<path>`
17
+ two-leg dispatch under the §5.8 orphan-warn atomicity envelope
18
+ (M43, closes D6). The friendly file-`--set` form now reaches
19
+ every CLI callShape (`item set` / `item update <iid>` / `item
20
+ update --where` / `item create`). **No breaking changes vs
21
+ `0.6.0` — every v0.7 surface is additive.** Built incrementally
22
+ across M42 + M43.
23
+
24
+ **Pivot note 2026-05-20.** The originally-planned API `2026-04`
25
+ pin (M39) + `monday item set-description` (M40) + `monday doc
26
+ block-create-bulk <did>` (M41) cluster was **DEFERRED** to a
27
+ future release pending `@mondaydotcomorg/api` SDK 15.x publishing
28
+ with `CURRENT_VERSION = '2026-04'` natively. M39's string-literal
29
+ override path was explored then abandoned after M40's empirical
30
+ probe revealed paid-tier feature gating + opaque
31
+ `INTERNAL_SERVER_ERROR { service: 'docs-api' }` on free-tier
32
+ accounts at every payload size — not worth the override-
33
+ maintenance overhead for a single user-blocked verb. Re-attempt
34
+ expected at v0.8 if Monday's SDK cadence holds (≈2 months between
35
+ major SDK bumps per the 13.0.0 / 14.0.0 / 15.0.0 trajectory) AND
36
+ a paid-tier sandbox is available for the M40 wire probe.
37
+
38
+ ### Breaking changes vs `0.6.0`
39
+
40
+ **None.** Every command, error code, envelope key, and warning
41
+ shape shipped in v0.6.0 is preserved byte-for-byte. v0.7 only adds.
42
+
43
+ ### Surface
44
+
45
+ **117 commands shipped (unchanged from v0.6).** M42 + M43 extend
46
+ two existing verbs (`monday item update` bulk dispatch leg +
47
+ `monday item create` action body) with new file-column dispatch
48
+ branches rather than introducing new noun namespaces or verbs.
49
+ The friendly translator (`translateColumnValueAsync`) stays
50
+ JSON-output-shaped for the 13 existing writable types; file-
51
+ column dispatch routes through v0.6-M38's
52
+ `executeFileColumnSet` sibling module (the new bulk + create-
53
+ time paths consume the M38 helper rather than duplicating it).
54
+
55
+ **Bulk file `--set` (M42) — `monday item update --where ...
56
+ --set <file-col>=<path>`.** Per-item multipart fan-out across
57
+ the `--where`-resolved item-id set, dispatched through the
58
+ existing v0.4-M30 `dispatchParallel` over a shared
59
+ `MultipartTransport` (per D1 closure — no new transport seam;
60
+ the parallel-multipart cross-product of M30's bulk-concurrency
61
+ + M31's multipart wire was already pinned). New helper
62
+ `runItemUpdateBulkFileDispatch` (in `src/commands/item/
63
+ update.ts`) mirrors M25's partial-success shape with `asset`
64
+ slot replacing `item` slot (per D2 closure):
65
+ `data.results[i].asset: { id, name, ... }` on success;
66
+ `data.results[i].error: { code, message }` under
67
+ `--continue-on-error`. Aggregate `data.summary` extends M25's
68
+ `partialSuccessBulkUpdateDataSchema` with three new slots
69
+ (`column_id` / `filename` / `file_size_bytes`) echoing the
70
+ dispatched file alongside `matched_count` / `applied_count` /
71
+ `failed_count` / `board_id`. New `data.operation:
72
+ 'item_update_bulk_file_set'` literal discriminator (distinct
73
+ from M25's `'item_update'`) so agents branch uniformly on
74
+ `data.operation`. `--concurrency 1..32` (default 1) opts into
75
+ bounded parallel dispatch per the v0.4-M30 range; `--continue-
76
+ on-error` partitions per-item wire failures into the partial-
77
+ success envelope while leaving whole-call-abort semantics for
78
+ the upfront local file pre-check (per D3 closure —
79
+ `precheckLocalFile` fires ONCE upfront per cli-design §5.8 "pre-
80
+ checks MUST fire BEFORE any wire round-trip" before the dispatch
81
+ loop, since the bulk shape has ONE file path shared across N
82
+ matched items).
83
+
84
+ **Create-time file `--set` (M43) — `monday item create --set
85
+ <file-col>=<path>`.** Two-leg dispatch routes through the new
86
+ `runItemCreateFileDispatch` helper (in `src/commands/item/
87
+ create.ts`): leg-1 `create_item` bundles the non-file
88
+ `column_values` atomically into the wire call; leg-2
89
+ `add_file_to_column` attaches the file to the newly-created
90
+ item. Pair is non-atomic by construction (Monday has no single-
91
+ wire create-item-with-file mutation at API `2026-01`). The atomicity
92
+ envelope shape closed at D1 to **(b) orphan-warn** rather than
93
+ (a) automatic rollback — the pre-flight rollback-viability probe
94
+ could not run empirically (the token lacked `create_item`
95
+ permission in token-created sandbox workspaces + existing-board
96
+ attempts were correctly blocked by harness modify-shared-state
97
+ guards), so defaulting to orphan-warn preserves the agent's
98
+ recovery handle without introducing a destructive `delete_item`
99
+ cleanup leg whose own failure mode is unaccounted for. Leg-2
100
+ failure surfaces `internal_error` with `details.reason:
101
+ 'create_then_file_upload_partial_failure'` + `details.
102
+ created_item_id` echoing leg-1's orphan + `details.column_id`
103
+ (the resolved file-column ID) + `details.cause` (the M31 wire-
104
+ failure JSON projection) + `details.hint` directing agents to
105
+ retry leg-2 alone (`monday item set <iid> <file-col>=<path>`)
106
+ OR rollback (`monday item delete <iid> --yes`). `--dry-run`
107
+ emits two `planned_changes` entries per D2 closure
108
+ (`operation: 'create_item'` / `'create_subitem'` with bundled
109
+ non-file `column_values`, then `operation:
110
+ 'add_file_to_column'` with the file pre-check echo); the leg-2
111
+ entry carries no `item_id` slot because the item doesn't exist
112
+ at dry-run time. **D6 mixed-set mutex SUPPRESSED on
113
+ `'item_create'`** per the asymmetry closure — `create_item`
114
+ natively bundles non-file `column_values` atomically into leg-
115
+ 1, so a multi-`--set` mix of file + non-file entries is
116
+ legitimate at create time (unlike single-item / bulk
117
+ callShapes where Monday's `change_multiple_column_values`
118
+ doesn't accept files). The universal multi-file mutex still
119
+ applies — 2+ file entries reject with `usage_error.details.
120
+ reason: 'multi_file_set_unsupported'`.
121
+
122
+ **Mutex rules at v0.7 (universal across all four callShapes
123
+ post-M42 + M43).**
124
+
125
+ - **Exactly ONE file `--set <file-col>=<path>` per call** across
126
+ every callShape (`'item_set'` / `'item_update_single'` /
127
+ `'item_update_bulk'` / `'item_create'`). 2+ file entries
128
+ reject with `usage_error.details.reason:
129
+ 'multi_file_set_unsupported'`.
130
+ - **Mixing a file `--set` with any value `--set` / `--set-raw`
131
+ / `--name`** rejects with `usage_error.details.reason:
132
+ 'mixed_file_and_value_sets'` on `'item_set'` /
133
+ `'item_update_single'` / `'item_update_bulk'`. **SUPPRESSED**
134
+ on `'item_create'` per D6 asymmetry — `create_item` bundles
135
+ non-file `column_values` atomically into leg-1, so the mix
136
+ is legitimate at create time.
137
+
138
+ Enforcement fires at the column-resolution boundary (parse-time
139
+ can't know — the column type only resolves after board metadata
140
+ loads); rejection happens BEFORE any multipart bytes get
141
+ constructed.
142
+
143
+ **`--set-raw <file-col>=<json>` STAYS REJECTED at v0.7
144
+ (unchanged from v0.6-M38 D3 — PERMANENT, not deferred).**
145
+ Monday's wire has no JSON shape for `change_column_value` on
146
+ file columns; the rejection at `src/api/raw-write.ts:
147
+ translateRawColumnValue` carries `details.hint` pointing at
148
+ the friendly `--set` form (now universal across callShapes per
149
+ M42 + M43) AND the v0.4-M31 verb-shaped `monday item upload`.
150
+
151
+ ### Output contract additions
152
+
153
+ **No new stable error codes — registry stays at 29.** Per D3
154
+ closure on M42 + D3 closure on M43, every v0.7 rejection routes
155
+ through existing codes (`usage_error` / `unsupported_column_
156
+ type` / `not_found` / `validation_failed` / `internal_error`)
157
+ with `details.reason` literal-string discriminators. **One new
158
+ discriminator literal lands at v0.7:** M43's
159
+ `'create_then_file_upload_partial_failure'` (M43 leg-2 partial-
160
+ failure orphan-warn envelope) joins the existing M38-era
161
+ discriminators (`mixed_file_and_value_sets` /
162
+ `multi_file_set_unsupported` / `file_set_on_bulk_unsupported` /
163
+ `file_set_on_create_unsupported`) under the R-v0.6-NEW-2
164
+ discriminated-union per-status-detail pattern.
165
+
166
+ **R-v0.6-NEW-2 graduates at the 5-consumer threshold post-M43.**
167
+ The discriminator pattern (4 supporting instances at v0.6 close)
168
+ crossed the threshold with M43's new discriminator literal as
169
+ the 5th. Graduation lifts the pattern from "watch-item" to
170
+ "ratified design idiom" — future milestones touching the
171
+ `details.reason` per-status-detail surface inherit the pattern
172
+ without further filing.
173
+
174
+ **New aggregate envelope slots for M42 bulk file dispatch.**
175
+ `data.summary.{column_id, filename, file_size_bytes}` extend
176
+ M25's `partialSuccessBulkUpdateDataSchema` with file-dispatch
177
+ echo slots so agents reading the success envelope see which
178
+ file was dispatched + where. `column_id` echoes the resolved
179
+ file-column ID; `filename` echoes the basename; `file_size_
180
+ bytes` echoes the `fs.stat()` size in bytes (no file bytes are
181
+ loaded into memory at envelope-time — the size is captured
182
+ pre-dispatch in the `precheckLocalFile` step).
183
+
184
+ **New M43 orphan-warn envelope on `data.operation:
185
+ 'item_create'` leg-2 failure.** Beyond the existing M38-era
186
+ `add_file_to_column` failure envelope, M43 leg-2 failure
187
+ surfaces a 5-slot details bag: `reason` (literal
188
+ `'create_then_file_upload_partial_failure'`) + `created_item_
189
+ id` (the orphaned leg-1 item ID) + `column_id` (the resolved
190
+ file-column ID) + `cause` (the M31 wire-failure JSON
191
+ projection) + `hint` (the recovery-path English string).
192
+
193
+ **No new envelope keys, no new warning shapes** outside the M42
194
+ `data.summary` extension above. M42 + M43 reuse the M31
195
+ multipart wire's success envelope shape + the post-success
196
+ eager-invalidation contract (`invalidateBoard(boardId)` fires
197
+ single-leg on multipart success across all 4 callShapes).
198
+
199
+ ### Upgrade notes
200
+
201
+ - **`unsupported_column_type` `deferred_to: "v0.6"` for the
202
+ files-shaped category on bulk + create paths is DROPPED.**
203
+ v0.7-M42 picks up the bulk path (per-item multipart fan-out
204
+ under `--concurrency` / `--continue-on-error`); v0.7-M43
205
+ picks up the create-time path (two-leg dispatch under §5.8
206
+ orphan-warn). The rejection row at `src/api/column-values.ts`
207
+ (the files-shaped row of the friendly translator) no longer
208
+ fires on `item create` or `item update --where` — those paths
209
+ now dispatch to the appropriate helper BEFORE the translator
210
+ row fires. The v0.6-M38 literals `'file_set_on_bulk_
211
+ unsupported'` and `'file_set_on_create_unsupported'` STAY
212
+ RESERVED in docstrings + regression-guarded by integration
213
+ tests; the runtime path no longer surfaces them. Agents that
214
+ branched on either literal will instead receive the success
215
+ envelopes documented above OR a leg-2 failure under M43's
216
+ orphan-warn shape.
217
+ - **`--set-raw <file-col>=<json>` STAYS REJECTED (unchanged
218
+ from v0.6-M38 D3, PERMANENT).** Monday's wire has no JSON
219
+ shape for files-shaped `change_column_value`. The rejection
220
+ hint at `src/api/raw-write.ts` names BOTH the friendly `--set`
221
+ form (now universal across callShapes) AND the v0.4-M31
222
+ `monday item upload` verb.
223
+ - **Multi-level subitem creation slips from `"v0.7"` →
224
+ `"v0.8"`.** Originally slipped from v0.3 → v0.4 → v0.5 → v0.6
225
+ → v0.7 across four prior release-preps. v0.7 didn't pick it
226
+ up (v0.7 pivoted away from API `2026-04` at 2026-05-20 so
227
+ the data-model probe gate moves to v0.8's planned `2026-07`
228
+ pin; Monday's `sub_items_board` still carries no `subtasks`
229
+ column at API `2026-01`). The `error.code: "usage_error"` +
230
+ `details.hierarchy_type: "multi_level"` keys are unchanged;
231
+ only the `deferred_to` literal flipped.
232
+ - **Cross-board `item move` value-overrides slips from `"v0.7"`
233
+ → `"v0.8"`.** Slipped across v0.3-M11 → v0.4 → v0.5 → v0.6
234
+ → v0.7 → v0.8 release-preps. Monday's `ColumnMappingInput`
235
+ still carries no value slot; the cross-leg partial-failure
236
+ envelope question stays open.
237
+ - **Cross-board resumable cursor slips from `"v0.7"` →
238
+ `"v0.8"`.** Slot remains for the per-board cursor-lifetime
239
+ under-aggregation design issue. The `cross_board_truncated`
240
+ warning's `details.hint` continues to recommend narrowing via
241
+ `--workspace` / `--favorites` / `--max-boards`.
242
+ - **Multi-file `--set` per call (v0.6-M38 D2) and file-`--set`
243
+ stdin support (v0.6-M38 D7) remain v0.7.x / future
244
+ candidates.** M42 pinned the per-item file-dispatch envelope;
245
+ multi-file would now revisit with M42's shape as the per-
246
+ item baseline.
247
+ - **`monday auth login` placeholder-guard unchanged.** The verb
248
+ is still registered and still surfaces `usage_error.details.
249
+ reason: oauth_unregistered` pointing at `MONDAY_API_TOKEN`
250
+ (unchanged from v0.6.0). The OAuth deferral revisits in
251
+ v0.7.x / v0.8 contingent on user demand.
252
+ - **Stable error-code registry stays at 29.** Existing codes'
253
+ shapes are unchanged across v0.6 → v0.7.
254
+
255
+ ### Internals worth highlighting
256
+
257
+ - **R-v0.6-NEW-1 graduates at the 5-consumer threshold post-
258
+ M43.** The `file-source.ts` two-export module (`precheck
259
+ LocalFile` + `buildBlobFromPath`) added at v0.6-M38 IMPL
260
+ kickoff (`3c2a9b0`, ahead-of-feat 3-consumer lift) scaled to
261
+ 5 consumers post-v0.7: M31 `item upload` + M31 `update
262
+ upload` + M38 single-item `executeFileColumnSet` + M42 bulk
263
+ `runItemUpdateBulkFileDispatch` + M43 create-time
264
+ `runItemCreateFileDispatch`. Helper internal shape unchanged
265
+ across all 5 consumers — graduation earned.
266
+ - **R-v0.6-NEW-2 graduates at the 5-consumer threshold post-
267
+ M43.** The `details.reason` discriminated-union per-status-
268
+ detail pattern (4 supporting instances at v0.6 close —
269
+ `mixed_file_and_value_sets` / `multi_file_set_unsupported` /
270
+ `file_set_on_create_unsupported` / `file_set_on_bulk_
271
+ unsupported`) crossed the threshold with M43's new
272
+ `create_then_file_upload_partial_failure` literal as the 5th.
273
+ - **R-NEW-82 graduated at the 5th-consecutive consumer.** The
274
+ release-prep cross-doc grep for stale `deferred_to:
275
+ "v<currently-releasing-version>"` slots fired and caught
276
+ one stale site (multi-level subitem `--parent` rejection —
277
+ slipped to `"v0.8"`) plus one ToC drift (v0.7-M42 + v0.7-M43
278
+ friendly file `--set` annotations missing from `docs/output-
279
+ shapes.md`'s `item (mutations)` row). Mirrors v0.3-M28 (1st)
280
+ / v0.4 (2nd) / v0.5 (3rd) / v0.6 (4th) / v0.7 (5th) release-
281
+ prep ratifications.
282
+ - **R-NEW-84 graduated discipline applied.** The v0.7 release-
283
+ prep cluster ships zero production `src/**/*.ts` semantic
284
+ changes (only the literal `'v0.7'` → `'v0.8'` flip in the
285
+ multi-level subitem rejection slot); gates carry verification
286
+ per the R-NEW-84 carve-out (skip Codex review on mechanical /
287
+ process-only clusters).
288
+ - **R-v0.7-NEW-4 (Pre-IMPL contract-term checklist) graduated
289
+ at v0.7-M42 IMPL R7 + refined at R8.** The discipline lives
290
+ in `.claude/rules/workflow.md` as a permanent rule. v0.7-M43
291
+ IMPL inherited the checklist + extended it with a "round-
292
+ agnostic framing" sub-rule at R3, and converged in 4 fix-up
293
+ rounds vs M42's 8 — graduation earned its keep.
294
+ - **R-NEW-76 graduated** from "stub-anchored ordering invariant"
295
+ to "wire-dispatch-anchored ordering invariant" at v0.7-M43
296
+ IMPL — post-IMPL the c8 boundary is gone but the `parseArgv`-
297
+ BEFORE-dispatch ordering itself stays load-bearing (argv-
298
+ level failures surface as `usage_error`, not
299
+ `internal_error`).
300
+ - **M42 IMPL converged in 8 fix-up rounds.** R1 closed the
301
+ behavioral surface (`foldAndRemap` + `SourceAggregator` +
302
+ fail-fast partial-success invalidate); R2-R8 were W9-prose-
303
+ only (no behavioral findings, asymptotic prose convergence
304
+ pattern that motivated the R-v0.7-NEW-4 graduation).
305
+ - **M43 IMPL converged in 4 fix-up rounds.** R1 closed the
306
+ behavioral surface; R2-R3 trailing W9 prose drift; R4
307
+ CONVERGED with zero findings. M43 inherited R-v0.7-NEW-4
308
+ from M42's graduation, short-circuiting the W9 cycle from
309
+ M42's 8 rounds down to 4.
310
+ - **Audit-fix folded into version-bump per security.md "high
311
+ = merge blocker" interpretation.** v0.6 release-prep
312
+ established the inline audit-fix precedent at version-bump;
313
+ v0.7 release-prep applied it: `npm audit` flagged
314
+ `brace-expansion@5.0.2` (moderate severity —
315
+ GHSA-jxxr-4gwj-5jf2 large-numeric-range DoS-protection
316
+ defeat); `npm audit fix` cleanly resolved via the lockfile
317
+ to `5.0.5+` (non-breaking transitive through eslint's
318
+ minimatch chain). `npm audit` reports `0 vulnerabilities`
319
+ post-fix.
320
+ - **Two-AI review** ran for v0.7-M42 pre-flight + IMPL, v0.7-
321
+ M43 pre-flight + IMPL. M42 IMPL converged in 8 fix-up rounds
322
+ (1 behavioral + 7 W9 prose); M43 IMPL converged in 4 (1
323
+ behavioral + 2 W9 + 1 zero-finding CONVERGED). The v0.7
324
+ release-prep cluster skipped Codex per R-NEW-84. Cumulative
325
+ Codex breakdowns live in the per-milestone post-mortems in
326
+ [`docs/v0.7-plan.md`](./docs/v0.7-plan.md) §3.
327
+
328
+ ### Tests + quality gates
329
+
330
+ - **4124 unit/integration + E2E tests** at v0.7.0 (+1 skipped;
331
+ was 4100 + 1 at v0.6.0; +24 net for M42 + M43 — ~15 new tests
332
+ for M42 covering bulk fan-out + `--concurrency` interaction +
333
+ partial-success projection + `data.summary` echo, ~9 net for
334
+ M43 covering two-leg happy path top-level + subitem + D6
335
+ mixed-set asymmetry + dry-run two-`planned_changes` + D1
336
+ orphan-warn envelope + leg-1 failure with/without remap +
337
+ translation reject + atomicity-before-wire ENOENT +
338
+ regression-guards across all 4 emit surfaces). All green on
339
+ Node 22 + 24.
340
+ - **Coverage at 98.79 / 95.65 / 99.16 / 99.08** (statements /
341
+ branches / functions / lines) against the floor 95 / 95.45 /
342
+ 95 / 95. Branches margin **0.20pp** at v0.7.0 (was 1.01pp at
343
+ v0.6.0; the 0.81pp drop reflects new conditional-spread arms
344
+ across M42 + M43's leg-1 / leg-2 catch arms — defensive non-
345
+ CliError re-throws + cause-details / metaSource unreachable
346
+ arms c8-ignored per testing.md preferred form). Floor unchanged
347
+ across v0.6.0 → v0.7.0.
348
+ - **Envelope-snapshot suite** — refresh probe ran clean at v0.7
349
+ release-prep (zero diff vs M43 IMPL close); per-milestone
350
+ close-docs sweeps refreshed snapshots in lockstep at M42 IMPL
351
+ close + M43 IMPL close.
352
+ - **Five test layers held**: unit, integration (in-process
353
+ `FixtureTransport` + `MultipartFixtureTransport`), E2E
354
+ (subprocess against fixture server), envelope-shape snapshot
355
+ suite, published-tarball E2E.
356
+ - **Audit-fix folded into release-prep.** `npm audit` flagged a
357
+ transitive `brace-expansion@5.0.2` (moderate severity); `npm
358
+ audit fix` cleanly resolved to `5.0.5+`. `npm audit` reports
359
+ `0 vulnerabilities` post-fix.
360
+
361
+ ### Documentation
362
+
363
+ - **[`docs/v0.7-plan.md`](./docs/v0.7-plan.md)** new — the v0.7
364
+ active plan with M42 + M43 milestones, decisions log (per-
365
+ milestone D1-D6), R-class register (R-v0.7-NEW-1 through
366
+ R-v0.7-NEW-5), per-milestone post-mortems (§3), 2026-05-20
367
+ pivot note pinning M39 / M40 / M41 as DEFERRED.
368
+ - **[`docs/cli-design.md`](./docs/cli-design.md)** §4.3
369
+ `monday item update` + `monday item create` rows annotated
370
+ with the M42 bulk + M43 create-time file-column dispatch
371
+ shapes; §5.3 "File-column dispatch leg" subsection extended
372
+ with the bulk fan-out (M42) + two-leg orphan-warn (M43)
373
+ branches; §5.8 atomicity discipline extended with the M43
374
+ two-leg orphan-warn envelope shape.
375
+ - **[`docs/output-shapes.md`](./docs/output-shapes.md)** —
376
+ `item update --where ... --set <file-col>=<path>` section at
377
+ line 2399 (M42 bulk file dispatch); `item create --set <file-
378
+ col>=<path>` integrated into the existing `item create`
379
+ section at line 2524 (M43 two-leg dispatch + orphan-warn
380
+ envelope); ToC row for `item (mutations)` updated to
381
+ enumerate the friendly file `--set v0.6-M38 single + v0.7-M42
382
+ bulk` annotation on `update` + `(friendly file --set v0.7-M43)`
383
+ annotation on `create` (caught at v0.7 release-prep ToC audit
384
+ as a v0.7-M42 + v0.7-M43 close-docs gap — 5th consecutive
385
+ R-NEW-82 graduated-discipline ratification).
386
+ - **README.md** quickstart expanded with v0.7 examples (step 13
387
+ extended to demonstrate M42 bulk file dispatch under
388
+ `--concurrency` / `--continue-on-error` + M43 create-time
389
+ file `--set` with mixed-set asymmetry). Scope section reshaped
390
+ around v0.7.0 / v0.6.0 / v0.5.0 / v0.4.0 / v0.3.0 / v0.2.0 /
391
+ v0.1.0 per-version layout. New "What v0.7 added (M42 + M43)"
392
+ per-milestone bullet block. v0.8 (next) block enumerates
393
+ carry-forward backlog + the v0.7-deferred M39 / M40 / M41
394
+ cluster pending SDK 15.x native `2026-04`.
395
+
396
+ [0.7.0]: https://github.com/Firer/monday-cli/releases/tag/v0.7.0
397
+
398
+ ## [0.6.0] - 2026-05-18 — Files-shaped friendly `--set` writes (M38)
399
+
400
+ The "agents can write to files-shaped columns inline" milestone —
401
+ v0.4-M31's `monday item upload` verb-shaped multipart wire surface
402
+ gains the friendly translator-boundary inline form
403
+ (`monday item set <iid> <file-col>=<path>` + `monday item update
404
+ <iid> --set <file-col>=<path>`), closing the v0.4 → v0.5 → v0.6
405
+ carry-over of the inline form across two prior release-preps.
406
+ Single-item paths only at M38; bulk + create + multi-file +
407
+ stdin paths reject with `details.reason` discriminators (defer
408
+ to v0.6.x carve-outs). **No breaking changes vs `0.5.0` — every
409
+ v0.6 surface is additive.** Built as a single feature milestone
410
+ (M38).
411
+
412
+ ### Breaking changes vs `0.5.0`
413
+
414
+ **None.** Every command, error code, envelope key, and warning
415
+ shape shipped in v0.5.0 is preserved byte-for-byte. v0.6 only adds.
416
+
417
+ ### Surface
418
+
419
+ **117 commands shipped (unchanged from v0.5).** M38 extends two
420
+ existing verbs (`monday item set` + `monday item update`) with a
421
+ new dispatch leg rather than introducing new noun namespaces or
422
+ verbs. The friendly translator stays JSON-output-shaped for the 13
423
+ existing writable types; file-column dispatch routes through a
424
+ new sibling module (`src/api/file-column-set.ts`) that handles the
425
+ multipart leg.
426
+
427
+ **Files-shaped friendly `--set` (M38) — `monday item set <iid>
428
+ <file-col>=<path>` + `monday item update <iid> --set <file-col>=
429
+ <path>`.** Sibling-branch dispatch at the column-resolution
430
+ boundary (per D1 closure): after column metadata loads, if
431
+ `column.type === 'file'` AND single-`--set` AND no other writes,
432
+ route to `executeFileColumnSet` (the new multipart-wire fetcher);
433
+ otherwise route to the standard translator + `executeItemMutation`
434
+ path. The translator (`translateColumnValueAsync`) stays
435
+ JSON-output-shaped for the 13 existing writable types — no
436
+ breaking shape change on any existing dispatch path. Routes
437
+ into v0.4-M31's `add_file_to_column` multipart wire verbatim
438
+ (no new transport surface; `dispatchMultipart` consumer count
439
+ goes 1 → 2; `ResolvedClient.multipart` consumer count goes
440
+ 1 → 2).
441
+
442
+ **Mutex rules at M38 (per D2 closure).** Exactly ONE file
443
+ `--set <file-col>=<path>` per call, no other `--set` /
444
+ `--set-raw` / `--name` flags allowed:
445
+
446
+ - File `--set` + ANY value `--set` / `--set-raw` / `--name` →
447
+ `usage_error` carrying `details.reason:
448
+ 'mixed_file_and_value_sets'` + a hint pointing agents at
449
+ running the file `--set` alone and applying value writes /
450
+ rename in a separate call.
451
+ - 2+ file `--set` entries → `usage_error` carrying
452
+ `details.reason: 'multi_file_set_unsupported'` (defers to
453
+ v0.6.x; the bulk-file-set milestone will address multi-file
454
+ dispatch).
455
+
456
+ Enforcement fires at the column-resolution boundary (parse-time
457
+ can't know — the column type only resolves after board metadata
458
+ loads); rejection happens BEFORE any multipart bytes get
459
+ constructed.
460
+
461
+ **Bulk + create paths REJECT at M38 (per D5 / D6 closures).**
462
+ The two paths that don't ship friendly file-set dispatch at M38
463
+ surface dedicated rejection reasons:
464
+
465
+ - `monday item update --board <bid> (--where <c>=<v>... |
466
+ --filter-json <json>) --set <file-col>=<path>` →
467
+ `usage_error.details.reason:
468
+ 'file_set_on_bulk_unsupported'`. Per-item file dispatch +
469
+ `--continue-on-error` partial-success envelope + `--concurrency`
470
+ shared-transport semantics each carry additional design
471
+ dimensions worth their own milestone; defers to v0.6.x.
472
+ - `monday item create --board <bid> --name <n> --set <file-col>=
473
+ <path>` → `usage_error.details.reason:
474
+ 'file_set_on_create_unsupported'`. File upload at create time
475
+ would require non-atomic post-create `add_file_to_column`
476
+ (breaks §5.8 state safety) or a Monday wire mutation accepting
477
+ multipart parts inside `create_item.column_values` (no such
478
+ mutation at API `2026-01`); defers to v0.6.x.
479
+
480
+ **`--set-raw <file-col>=<json>` STAYS REJECTED at M38 (per D3
481
+ closure — PERMANENT, not deferred).** Monday's wire has no JSON
482
+ shape for `change_column_value` on file columns — `add_file_to_
483
+ column` is the only file-write wire surface and it's multipart-
484
+ only. The `--set-raw` escape-hatch contract ("user supplies the
485
+ JSON `change_column_value` accepts") doesn't compose with
486
+ multipart. The existing rejection at `src/api/raw-write.ts:
487
+ translateRawColumnValue` stays unchanged. The rejection now
488
+ carries `details.hint` pointing at BOTH the M38 friendly
489
+ `--set` form AND the M31 verb-shaped `monday item upload` —
490
+ agents have two write paths reaching the same multipart wire
491
+ and key off the hint rather than the (absent) `deferred_to`
492
+ slot.
493
+
494
+ **Dry-run envelope shape (per D4 closure).** Mirrors M31 `item
495
+ upload --dry-run` envelope verbatim:
496
+ `planned_changes: [{operation: 'add_file_to_column', item_id,
497
+ column_id, file_path, filename, file_size_bytes}]` (size from
498
+ `fs.stat()`; no file bytes loaded into memory). `meta.source:
499
+ 'none'`. The `file_path` slot echoes the argv-derived path; the
500
+ `column_id` slot echoes the RESOLVED column ID (not the argv
501
+ token).
502
+
503
+ ### Output contract additions
504
+
505
+ **No new stable error codes — registry stays at 29.** Per D8
506
+ closure, M38 routes every rejection through existing codes
507
+ (`usage_error` / `unsupported_column_type` / `not_found` /
508
+ `validation_failed`) with `details.reason` literal-string
509
+ discriminators. The four M38-specific reasons
510
+ (`mixed_file_and_value_sets` / `multi_file_set_unsupported` /
511
+ `file_set_on_bulk_unsupported` / `file_set_on_create_unsupported`)
512
+ join the existing R-NEW-31 discriminated-union per-status-detail
513
+ pattern.
514
+
515
+ **No new envelope keys, no new warning shapes.** M38 reuses the
516
+ M31 multipart wire's success envelope shape (single `item` slot
517
+ projecting the post-mutation board snapshot) and the same
518
+ post-success eager-invalidation contract (`invalidateBoard(boardId)`
519
+ fires single-leg on multipart success).
520
+
521
+ ### Upgrade notes
522
+
523
+ - **`unsupported_column_type` `deferred_to: "v0.6"` is DROPPED
524
+ for the files-shaped category at the friendly `--set` form.**
525
+ v0.6-M38 picks the inline write path up. The rejection row at
526
+ `src/api/column-values.ts` (the files-shaped row of the
527
+ friendly translator) now fires ONLY on the `item create` +
528
+ `item update --where` bulk paths per D5 / D6 closures — with
529
+ `details.reason: 'file_set_on_create_unsupported'` /
530
+ `'file_set_on_bulk_unsupported'`. The single-item `item set` +
531
+ `item update` paths dispatch to the new sibling module BEFORE
532
+ the translator's files-shaped row fires. No more
533
+ `deferred_to: "v0.6"` slot on the friendly-form path —
534
+ agents see successful single-item uploads end-to-end.
535
+ - **`unsupported_column_type` for `--set-raw <file-col>=<json>`
536
+ STAYS REJECTED.** Permanent rejection per D3 — Monday's
537
+ wire has no JSON shape for files-shaped `change_column_value`.
538
+ The rejection hint at `src/api/raw-write.ts` now names BOTH
539
+ the M38 friendly form AND the M31 verb-shaped `monday item
540
+ upload` as alternative write paths; agents construct retries
541
+ from either entry point.
542
+ - **Multi-level subitem creation slips from `"v0.6"` →
543
+ `"v0.7"`.** Originally slipped from v0.3 → v0.4 → v0.5 → v0.6
544
+ across three prior release-preps. v0.6 didn't pick it up —
545
+ Monday's `sub_items_board` still carries no `subtasks` column
546
+ at API `2026-01`, so depth-2 subitems still have no data-model
547
+ home. Single-level subitems (`item create --parent <iid>`
548
+ against classic boards) continue to work byte-identically.
549
+ The `error.code: "usage_error"` + `details.hierarchy_type:
550
+ "multi_level"` keys are unchanged; only the `deferred_to`
551
+ literal flipped.
552
+ - **Cross-board `item move` value-overrides slip from `"v0.6"`
553
+ → `"v0.7"`.** Slipped across v0.3-M11 → v0.4 → v0.5 → v0.6
554
+ → v0.7 release-preps. Monday's `ColumnMappingInput` still
555
+ carries no value slot; the cross-leg partial-failure envelope
556
+ question stays open. Agents needing overrides continue to fire
557
+ `monday item set <iid> <target>=<value>` post-move.
558
+ - **Cross-board resumable cursor slips from `"v0.6"` →
559
+ `"v0.7"`.** The `cross_board_truncated` warning's
560
+ `details.hint` continues to recommend narrowing via
561
+ `--workspace` / `--favorites` / `--max-boards`; v0.7 may pick
562
+ the resumable surface up if per-board cursor-lifetime under
563
+ aggregation gets a clean design.
564
+ - **Stable error-code registry stays at 29.** Existing codes'
565
+ shapes are unchanged across v0.5 → v0.6.
566
+ - **`monday auth login` placeholder-guard unchanged.** The verb
567
+ is still registered and still surfaces `usage_error.details.
568
+ reason: oauth_unregistered` pointing at `MONDAY_API_TOKEN`
569
+ (unchanged from v0.5.0). The OAuth deferral revisits in
570
+ v0.6.x / v0.7 contingent on user demand.
571
+
572
+ ### Internals worth highlighting
573
+
574
+ - **R-class refactor shipped during v0.6.** R-v0.6-NEW-1
575
+ (`file-source.ts` two-export module: `precheckLocalFile`
576
+ fs.stat + fs.access(R_OK) + non-empty + size capture +
577
+ `usage_error.details.reason: 'file_not_readable' |
578
+ 'file_empty'`; `buildBlobFromPath` readFile + sniffContent
579
+ Type + Blob construction) shipped ahead-of-feat at v0.6-M38
580
+ IMPL kickoff (`3c2a9b0`) — 3 consumers post-lift (M31
581
+ `monday item upload` action body + M31 `monday update upload`
582
+ action body + M38's `executeFileColumnSet` runtime body).
583
+ 10 direct unit tests pin the helper's branch matrix. Mirrors
584
+ R-NEW-29's M25 ahead-of-feat cadence + R-NEW-70's M34
585
+ cadence.
586
+ - **R-NEW-82 4th consecutive consumer ratified at v0.6
587
+ release-prep.** The release-prep cross-doc grep for stale
588
+ `deferred_to: "v0.6"` slots fired and caught one stale site
589
+ (multi-level subitem `--parent` rejection — slipped to
590
+ `"v0.7"`) plus one ToC drift (v0.6-M38 friendly file `--set`
591
+ annotation missing from `docs/output-shapes.md`'s `item
592
+ (mutations)` row). Mirrors v0.3-M28 (1st) / v0.4 (2nd) /
593
+ v0.5 (3rd) / v0.6 (4th) release-prep ratifications.
594
+ - **R-NEW-84 graduated discipline applied.** The v0.6
595
+ release-prep cluster ships zero production `src/**/*.ts`
596
+ semantic changes (only the literal `'v0.6'` → `'v0.7'` flip
597
+ in the multi-level subitem rejection slot); gates carry
598
+ verification per the R-NEW-84 carve-out (skip Codex review
599
+ on mechanical / process-only clusters).
600
+ - **`details.reason` discriminator pattern (R-v0.6-NEW-2) at
601
+ 4 supporting instances post-M38** (`mixed_file_and_value_sets`
602
+ / `multi_file_set_unsupported` / `file_set_on_create_
603
+ unsupported` / `file_set_on_bulk_unsupported`). Below the 5th-
604
+ consumer graduation threshold; tracked as a watch-item for the
605
+ first v0.6.x lift that adds a 5th `details.reason` literal-
606
+ string discriminator on the file-set surface (bulk file-set
607
+ carve-out is the natural site).
608
+ - **Two-AI review** (cli-design pre-flight + implementation
609
+ review) ran for M38 pre-flight + IMPL. **M38 IMPL converged
610
+ in 4 fix-up rounds** (0 P1 / 3 P2 / 11 P3 cumulative across
611
+ rounds 1–4 — at the median 3-4 IMPL round count per the
612
+ v0.5 IMPL precedent). The v0.6 release-prep cluster skipped
613
+ Codex per R-NEW-84. Cumulative finding count + per-round
614
+ Codex breakdown lives in the per-milestone post-mortem in
615
+ [`docs/v0.6-plan.md`](./docs/v0.6-plan.md) §11.
616
+
617
+ ### Tests + quality gates
618
+
619
+ - **4100 unit/integration + E2E tests** at v0.6.0 (+1 skipped;
620
+ was 4054+1 at v0.5.0; ~46 new tests for M38 — `file-source`
621
+ helper unit branch matrix, `file-column-set` action-body
622
+ branches, integration cassette pins on single-item friendly
623
+ paths + the four `details.reason`-discriminated rejection
624
+ paths, envelope-snapshot pins on the M38 surfaces). All green
625
+ on Node 22 + 24.
626
+ - **Coverage at 99.26 / 96.46 / 99.31 / 99.52** (statements /
627
+ branches / functions / lines) against the floor 95 / 95.45 /
628
+ 95 / 95. Branches margin **1.01pp** at v0.6.0 (was 1.00pp at
629
+ v0.5.0; +0.01pp). Floor unchanged across v0.5.0 → v0.6.0.
630
+ - **Envelope-snapshot suite** — refresh probe ran clean at
631
+ v0.6 release-prep (zero diff vs M38 IMPL close); per-
632
+ milestone close-docs sweep refreshed snapshots in lockstep at
633
+ M38 IMPL close.
634
+ - **Five test layers held**: unit, integration (in-process
635
+ `FixtureTransport` + `MultipartFixtureTransport`), E2E
636
+ (subprocess against fixture server), envelope-shape snapshot
637
+ suite, published-tarball E2E.
638
+ - **Audit-fix folded into release-prep.** `npm audit` flagged a
639
+ transitive `fast-uri@3.1.0` (high severity); `npm audit fix`
640
+ cleanly resolved to `3.1.2` (non-breaking — `ajv@8.20.0`'s
641
+ `^3.0.1` constraint satisfies 3.1.x). `npm audit` reports
642
+ `0 vulnerabilities` post-fix.
643
+
644
+ ### Documentation
645
+
646
+ - **[`docs/v0.6-plan.md`](./docs/v0.6-plan.md)** new — the v0.6
647
+ active plan with M38 milestone, decisions log (D1-D8),
648
+ R-class register (R-v0.6-NEW-1 through R-v0.6-NEW-11),
649
+ per-milestone post-mortem (§11 + §22).
650
+ - **[`docs/cli-design.md`](./docs/cli-design.md)** §4.3
651
+ `monday item set` + `monday item update` rows annotated with
652
+ the M38 file-column dispatch shape + mutex rules; §5.3
653
+ "File-column dispatch leg" subsection added explaining the
654
+ sibling-branch routing + the four `details.reason`
655
+ discriminators; §13 v0.5 entry's v0.6 deferral list closed
656
+ out + the v0.7 frame pinned (multi-level subitems + cross-
657
+ board move value-overrides + cross-board resumable cursor +
658
+ profile-scoped argument defaults).
659
+ - **[`docs/output-shapes.md`](./docs/output-shapes.md)** —
660
+ `item set` + `item update` sections gained M38 file-column
661
+ dispatch subsections at lines 2100, 2151, 2243; ToC row
662
+ for `item (mutations)` updated to enumerate the friendly
663
+ file `--set v0.6-M38` annotation on `set` + `update`
664
+ (caught at v0.6 release-prep ToC audit as a v0.6-M38
665
+ close-docs gap — 4th consecutive R-NEW-82 graduated-
666
+ discipline ratification).
667
+ - **README.md** quickstart expanded with v0.6 example (step 13
668
+ demonstrating M38 friendly file `--set` on item set + item
669
+ update + dry-run). Scope section reshaped around v0.6.0 /
670
+ v0.5.0 / v0.4.0 / v0.3.0 / v0.2.0 / v0.1.0 per-version
671
+ layout.
672
+
673
+ [0.6.0]: https://github.com/Firer/monday-cli/releases/tag/v0.6.0
674
+
10
675
  ## [0.5.0] - 2026-05-17 — Team writers + full Monday workdocs CRUD mutation surface
11
676
 
12
677
  The "agents can write to teams + drive the full workdocs surface"