v0.7.0 — Bulk + create-time file --set carve-out folds (M42 + M43)
The "friendly file --set reaches every callShape" milestone — v0.6-M38's single-item friendly file-column writer gains the two carve-outs deferred at M38: bulk monday item update --where ... --set <file-col>=<path> per-item multipart fan-out (M42, closes D5) and create-time monday item create --set <file-col>=<path> two-leg dispatch under the §5.8 orphan-warn atomicity envelope (M43, closes D6). The friendly file---set form now reaches every CLI callShape (item set / item update <iid> / item update --where / item create). No breaking changes vs 0.6.0 — every v0.7 surface is additive. Built incrementally across M42 + M43.
Pivot 2026-05-20: the originally-planned API 2026-04 pin bump (M39) + monday item set-description (M40) + monday doc block-create-bulk (M41) cluster DEFERRED to a future release pending @mondaydotcomorg/api SDK 15.x publishing with CURRENT_VERSION = '2026-04' natively + a paid-tier sandbox for the M40 wire probe (M40's empirical probe revealed paid-tier gating + opaque INTERNAL_SERVER_ERROR { service: 'docs-api' } on free-tier accounts). Re-attempt expected at v0.8 if Monday's SDK cadence holds.
Breaking changes vs 0.6.0
None. Every command, error code, envelope key, and warning shape shipped in v0.6.0 is preserved byte-for-byte. v0.7 only adds.
Surface
117 commands shipped (unchanged from v0.6). M42 + M43 extend two existing verbs (monday item update bulk dispatch leg + monday item create action body) with new file-column dispatch branches rather than introducing new noun namespaces or verbs.
M42 — monday item update --where ... --set <file-col>=<path>
Per-item multipart fan-out across the --where-resolved item-id set, dispatched through the existing v0.4-M30 dispatchParallel over a shared MultipartTransport. --concurrency 1..32 (default 1) opts into bounded parallel dispatch per the v0.4-M30 range; --continue-on-error partitions per-item wire failures into the M25 partial-success envelope while leaving whole-call-abort semantics for the upfront local file pre-check (per cli-design §5.8). New aggregate data.summary slots (column_id / filename / file_size_bytes) echo the dispatched file. New data.operation: 'item_update_bulk_file_set' discriminator. Reuses M31's multipart wire verbatim + v0.6-M38's executeFileColumnSet runtime body — no new wire op.
M43 — monday item create --set <file-col>=<path>
Two-leg dispatch via the new runItemCreateFileDispatch helper: leg-1 create_item bundles the non-file column_values atomically into the wire call; leg-2 add_file_to_column attaches the file to the newly-created item. Pair is non-atomic by construction — leg-2 failure surfaces internal_error with details.reason: 'create_then_file_upload_partial_failure' + details.created_item_id (the orphaned leg-1 item ID) + details.column_id + details.cause (M31 wire-failure projection) + details.hint directing agents to retry leg-2 alone (monday item set <iid> <file-col>=<path>) OR rollback (monday item delete <iid> --yes). --dry-run emits two planned_changes entries (create_item + add_file_to_column); leg-2 carries no item_id slot because the item doesn't exist at dry-run time.
Universal mutex rules at v0.7 (across all 4 callShapes)
- Exactly ONE file
--set <file-col>=<path>per call across every callShape. 2+ file entries reject withusage_error.details.reason: 'multi_file_set_unsupported'. - Mixing a file
--setwith any value--set/--set-raw/--namerejects withusage_error.details.reason: 'mixed_file_and_value_sets'on'item_set'/'item_update_single'/'item_update_bulk'. SUPPRESSED on'item_create'per the D6 asymmetry —create_itembundles non-filecolumn_valuesatomically into leg-1, so the mix is legitimate at create time.
--set-raw <file-col>=<json> STAYS REJECTED at v0.7 (unchanged from v0.6-M38 D3 — PERMANENT)
Monday's wire has no JSON shape for change_column_value on file columns. The rejection hint names BOTH the friendly --set form (now universal across callShapes) AND the v0.4-M31 verb-shaped monday item upload.
Upgrade notes
unsupported_column_typedeferred_to: "v0.6"DROPPED for the files-shaped category on bulk + create paths. v0.7-M42 picks up the bulk path; v0.7-M43 picks up the create-time path. The pre-v0.7 literals'file_set_on_bulk_unsupported'and'file_set_on_create_unsupported'stay RESERVED in docstrings + regression-guarded; the runtime path no longer surfaces them.--set-raw <file-col>=<json>stays REJECTED (PERMANENT — nodeferred_toslot).- Multi-level subitem creation slips from
"v0.7"→"v0.8"(4th consecutive slip; v0.7 pivoted away from API2026-04at 2026-05-20 so the data-model probe gate moves to v0.8's planned2026-07pin). - Cross-board
item movevalue-overrides + cross-board resumable cursor slip"v0.7"→"v0.8"(Monday'sColumnMappingInputstill carries no value slot). - Stable error-code registry stays at 29. One new
details.reasondiscriminator:'create_then_file_upload_partial_failure'(M43 orphan-warn envelope) — graduates R-v0.6-NEW-2's discriminated-union per-status-detail pattern at the 5-consumer threshold.
Tests + quality gates
- 4124 unit/integration + E2E tests at v0.7.0 (+1 skipped; was 4100 + 1 at v0.6.0; +24 net for M42 + M43).
- Coverage at 98.79 / 95.65 / 99.16 / 99.08 (statements / branches / functions / lines) against the floor 95 / 95.45 / 95 / 95. Branches margin 0.20pp at v0.7.0 (was 1.01pp at v0.6.0; the 0.81pp drop reflects new conditional-spread arms across M42 + M43 IMPL paths, c8-ignored per testing.md preferred form).
- Audit-fix folded into release-prep (2nd-consecutive consumer per the v0.6 precedent).
npm auditflagged transitivebrace-expansion@5.0.2(moderate severity — GHSA-jxxr-4gwj-5jf2);npm audit fixcleanly resolved to5.0.5+.npm auditreports0 vulnerabilitiespost-fix.
Full release notes in CHANGELOG.md.