monday-cli 0.4.0 → 0.6.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 (154) hide show
  1. package/CHANGELOG.md +645 -0
  2. package/README.md +173 -34
  3. package/dist/api/column-types.d.ts +48 -17
  4. package/dist/api/column-types.d.ts.map +1 -1
  5. package/dist/api/column-types.js +25 -9
  6. package/dist/api/column-types.js.map +1 -1
  7. package/dist/api/column-values.d.ts +17 -9
  8. package/dist/api/column-values.d.ts.map +1 -1
  9. package/dist/api/column-values.js +33 -18
  10. package/dist/api/column-values.js.map +1 -1
  11. package/dist/api/documents.d.ts +1136 -3
  12. package/dist/api/documents.d.ts.map +1 -1
  13. package/dist/api/documents.js +1828 -3
  14. package/dist/api/documents.js.map +1 -1
  15. package/dist/api/file-column-set.d.ts +507 -0
  16. package/dist/api/file-column-set.d.ts.map +1 -0
  17. package/dist/api/file-column-set.js +510 -0
  18. package/dist/api/file-column-set.js.map +1 -0
  19. package/dist/api/raw-write.d.ts +27 -16
  20. package/dist/api/raw-write.d.ts.map +1 -1
  21. package/dist/api/raw-write.js +40 -24
  22. package/dist/api/raw-write.js.map +1 -1
  23. package/dist/api/resolver-error-fold.d.ts +25 -0
  24. package/dist/api/resolver-error-fold.d.ts.map +1 -1
  25. package/dist/api/resolver-error-fold.js +56 -0
  26. package/dist/api/resolver-error-fold.js.map +1 -1
  27. package/dist/api/teams.d.ts +657 -0
  28. package/dist/api/teams.d.ts.map +1 -0
  29. package/dist/api/teams.js +880 -0
  30. package/dist/api/teams.js.map +1 -0
  31. package/dist/commands/board/column-create.d.ts +8 -3
  32. package/dist/commands/board/column-create.d.ts.map +1 -1
  33. package/dist/commands/board/column-create.js +16 -8
  34. package/dist/commands/board/column-create.js.map +1 -1
  35. package/dist/commands/doc/append-markdown.d.ts +117 -0
  36. package/dist/commands/doc/append-markdown.d.ts.map +1 -0
  37. package/dist/commands/doc/append-markdown.js +253 -0
  38. package/dist/commands/doc/append-markdown.js.map +1 -0
  39. package/dist/commands/doc/block-create.d.ts +114 -0
  40. package/dist/commands/doc/block-create.d.ts.map +1 -0
  41. package/dist/commands/doc/block-create.js +206 -0
  42. package/dist/commands/doc/block-create.js.map +1 -0
  43. package/dist/commands/doc/block-delete.d.ts +72 -0
  44. package/dist/commands/doc/block-delete.d.ts.map +1 -0
  45. package/dist/commands/doc/block-delete.js +161 -0
  46. package/dist/commands/doc/block-delete.js.map +1 -0
  47. package/dist/commands/doc/block-update.d.ts +75 -0
  48. package/dist/commands/doc/block-update.d.ts.map +1 -0
  49. package/dist/commands/doc/block-update.js +162 -0
  50. package/dist/commands/doc/block-update.js.map +1 -0
  51. package/dist/commands/doc/create-in-workspace.d.ts +76 -0
  52. package/dist/commands/doc/create-in-workspace.d.ts.map +1 -0
  53. package/dist/commands/doc/create-in-workspace.js +164 -0
  54. package/dist/commands/doc/create-in-workspace.js.map +1 -0
  55. package/dist/commands/doc/create-on-column.d.ts +71 -0
  56. package/dist/commands/doc/create-on-column.d.ts.map +1 -0
  57. package/dist/commands/doc/create-on-column.js +146 -0
  58. package/dist/commands/doc/create-on-column.js.map +1 -0
  59. package/dist/commands/doc/delete.d.ts +68 -0
  60. package/dist/commands/doc/delete.d.ts.map +1 -0
  61. package/dist/commands/doc/delete.js +146 -0
  62. package/dist/commands/doc/delete.js.map +1 -0
  63. package/dist/commands/doc/duplicate.d.ts +101 -0
  64. package/dist/commands/doc/duplicate.d.ts.map +1 -0
  65. package/dist/commands/doc/duplicate.js +191 -0
  66. package/dist/commands/doc/duplicate.js.map +1 -0
  67. package/dist/commands/doc/import-html.d.ts +125 -0
  68. package/dist/commands/doc/import-html.d.ts.map +1 -0
  69. package/dist/commands/doc/import-html.js +273 -0
  70. package/dist/commands/doc/import-html.js.map +1 -0
  71. package/dist/commands/doc/list.d.ts +6 -3
  72. package/dist/commands/doc/list.d.ts.map +1 -1
  73. package/dist/commands/doc/list.js +17 -48
  74. package/dist/commands/doc/list.js.map +1 -1
  75. package/dist/commands/doc/rename.d.ts +60 -0
  76. package/dist/commands/doc/rename.d.ts.map +1 -0
  77. package/dist/commands/doc/rename.js +135 -0
  78. package/dist/commands/doc/rename.js.map +1 -0
  79. package/dist/commands/index.d.ts.map +1 -1
  80. package/dist/commands/index.js +116 -0
  81. package/dist/commands/index.js.map +1 -1
  82. package/dist/commands/item/create.d.ts.map +1 -1
  83. package/dist/commands/item/create.js +131 -33
  84. package/dist/commands/item/create.js.map +1 -1
  85. package/dist/commands/item/set.d.ts +33 -3
  86. package/dist/commands/item/set.d.ts.map +1 -1
  87. package/dist/commands/item/set.js +193 -15
  88. package/dist/commands/item/set.js.map +1 -1
  89. package/dist/commands/item/update.d.ts +34 -3
  90. package/dist/commands/item/update.d.ts.map +1 -1
  91. package/dist/commands/item/update.js +346 -67
  92. package/dist/commands/item/update.js.map +1 -1
  93. package/dist/commands/item/upload.d.ts.map +1 -1
  94. package/dist/commands/item/upload.js +16 -69
  95. package/dist/commands/item/upload.js.map +1 -1
  96. package/dist/commands/update/create.d.ts.map +1 -1
  97. package/dist/commands/update/create.js +6 -4
  98. package/dist/commands/update/create.js.map +1 -1
  99. package/dist/commands/update/edit.d.ts +4 -2
  100. package/dist/commands/update/edit.d.ts.map +1 -1
  101. package/dist/commands/update/edit.js +10 -6
  102. package/dist/commands/update/edit.js.map +1 -1
  103. package/dist/commands/update/reply.d.ts +4 -2
  104. package/dist/commands/update/reply.d.ts.map +1 -1
  105. package/dist/commands/update/reply.js +10 -6
  106. package/dist/commands/update/reply.js.map +1 -1
  107. package/dist/commands/update/upload.d.ts.map +1 -1
  108. package/dist/commands/update/upload.js +9 -59
  109. package/dist/commands/update/upload.js.map +1 -1
  110. package/dist/commands/user/_team-membership.d.ts +10 -0
  111. package/dist/commands/user/_team-membership.d.ts.map +1 -0
  112. package/dist/commands/user/_team-membership.js +88 -0
  113. package/dist/commands/user/_team-membership.js.map +1 -0
  114. package/dist/commands/user/team-add-members.d.ts +81 -0
  115. package/dist/commands/user/team-add-members.d.ts.map +1 -0
  116. package/dist/commands/user/team-add-members.js +186 -0
  117. package/dist/commands/user/team-add-members.js.map +1 -0
  118. package/dist/commands/user/team-create.d.ts +82 -0
  119. package/dist/commands/user/team-create.d.ts.map +1 -0
  120. package/dist/commands/user/team-create.js +206 -0
  121. package/dist/commands/user/team-create.js.map +1 -0
  122. package/dist/commands/user/team-delete.d.ts +56 -0
  123. package/dist/commands/user/team-delete.d.ts.map +1 -0
  124. package/dist/commands/user/team-delete.js +137 -0
  125. package/dist/commands/user/team-delete.js.map +1 -0
  126. package/dist/commands/user/team-get.d.ts +41 -0
  127. package/dist/commands/user/team-get.d.ts.map +1 -0
  128. package/dist/commands/user/team-get.js +87 -0
  129. package/dist/commands/user/team-get.js.map +1 -0
  130. package/dist/commands/user/team-list.d.ts +39 -0
  131. package/dist/commands/user/team-list.d.ts.map +1 -0
  132. package/dist/commands/user/team-list.js +90 -0
  133. package/dist/commands/user/team-list.js.map +1 -0
  134. package/dist/commands/user/team-remove-members.d.ts +71 -0
  135. package/dist/commands/user/team-remove-members.d.ts.map +1 -0
  136. package/dist/commands/user/team-remove-members.js +176 -0
  137. package/dist/commands/user/team-remove-members.js.map +1 -0
  138. package/dist/types/ids.d.ts +6 -0
  139. package/dist/types/ids.d.ts.map +1 -1
  140. package/dist/types/ids.js +46 -5
  141. package/dist/types/ids.js.map +1 -1
  142. package/dist/utils/file-source.d.ts +93 -0
  143. package/dist/utils/file-source.d.ts.map +1 -0
  144. package/dist/utils/file-source.js +140 -0
  145. package/dist/utils/file-source.js.map +1 -0
  146. package/dist/utils/parse-brand-list.d.ts +95 -0
  147. package/dist/utils/parse-brand-list.d.ts.map +1 -0
  148. package/dist/utils/parse-brand-list.js +96 -0
  149. package/dist/utils/parse-brand-list.js.map +1 -0
  150. package/dist/utils/source-content.d.ts +93 -0
  151. package/dist/utils/source-content.d.ts.map +1 -0
  152. package/dist/utils/source-content.js +120 -0
  153. package/dist/utils/source-content.js.map +1 -0
  154. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,651 @@ 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.6.0] - 2026-05-18 — Files-shaped friendly `--set` writes (M38)
11
+
12
+ The "agents can write to files-shaped columns inline" milestone —
13
+ v0.4-M31's `monday item upload` verb-shaped multipart wire surface
14
+ gains the friendly translator-boundary inline form
15
+ (`monday item set <iid> <file-col>=<path>` + `monday item update
16
+ <iid> --set <file-col>=<path>`), closing the v0.4 → v0.5 → v0.6
17
+ carry-over of the inline form across two prior release-preps.
18
+ Single-item paths only at M38; bulk + create + multi-file +
19
+ stdin paths reject with `details.reason` discriminators (defer
20
+ to v0.6.x carve-outs). **No breaking changes vs `0.5.0` — every
21
+ v0.6 surface is additive.** Built as a single feature milestone
22
+ (M38).
23
+
24
+ ### Breaking changes vs `0.5.0`
25
+
26
+ **None.** Every command, error code, envelope key, and warning
27
+ shape shipped in v0.5.0 is preserved byte-for-byte. v0.6 only adds.
28
+
29
+ ### Surface
30
+
31
+ **117 commands shipped (unchanged from v0.5).** M38 extends two
32
+ existing verbs (`monday item set` + `monday item update`) with a
33
+ new dispatch leg rather than introducing new noun namespaces or
34
+ verbs. The friendly translator stays JSON-output-shaped for the 13
35
+ existing writable types; file-column dispatch routes through a
36
+ new sibling module (`src/api/file-column-set.ts`) that handles the
37
+ multipart leg.
38
+
39
+ **Files-shaped friendly `--set` (M38) — `monday item set <iid>
40
+ <file-col>=<path>` + `monday item update <iid> --set <file-col>=
41
+ <path>`.** Sibling-branch dispatch at the column-resolution
42
+ boundary (per D1 closure): after column metadata loads, if
43
+ `column.type === 'file'` AND single-`--set` AND no other writes,
44
+ route to `executeFileColumnSet` (the new multipart-wire fetcher);
45
+ otherwise route to the standard translator + `executeItemMutation`
46
+ path. The translator (`translateColumnValueAsync`) stays
47
+ JSON-output-shaped for the 13 existing writable types — no
48
+ breaking shape change on any existing dispatch path. Routes
49
+ into v0.4-M31's `add_file_to_column` multipart wire verbatim
50
+ (no new transport surface; `dispatchMultipart` consumer count
51
+ goes 1 → 2; `ResolvedClient.multipart` consumer count goes
52
+ 1 → 2).
53
+
54
+ **Mutex rules at M38 (per D2 closure).** Exactly ONE file
55
+ `--set <file-col>=<path>` per call, no other `--set` /
56
+ `--set-raw` / `--name` flags allowed:
57
+
58
+ - File `--set` + ANY value `--set` / `--set-raw` / `--name` →
59
+ `usage_error` carrying `details.reason:
60
+ 'mixed_file_and_value_sets'` + a hint pointing agents at
61
+ running the file `--set` alone and applying value writes /
62
+ rename in a separate call.
63
+ - 2+ file `--set` entries → `usage_error` carrying
64
+ `details.reason: 'multi_file_set_unsupported'` (defers to
65
+ v0.6.x; the bulk-file-set milestone will address multi-file
66
+ dispatch).
67
+
68
+ Enforcement fires at the column-resolution boundary (parse-time
69
+ can't know — the column type only resolves after board metadata
70
+ loads); rejection happens BEFORE any multipart bytes get
71
+ constructed.
72
+
73
+ **Bulk + create paths REJECT at M38 (per D5 / D6 closures).**
74
+ The two paths that don't ship friendly file-set dispatch at M38
75
+ surface dedicated rejection reasons:
76
+
77
+ - `monday item update --board <bid> (--where <c>=<v>... |
78
+ --filter-json <json>) --set <file-col>=<path>` →
79
+ `usage_error.details.reason:
80
+ 'file_set_on_bulk_unsupported'`. Per-item file dispatch +
81
+ `--continue-on-error` partial-success envelope + `--concurrency`
82
+ shared-transport semantics each carry additional design
83
+ dimensions worth their own milestone; defers to v0.6.x.
84
+ - `monday item create --board <bid> --name <n> --set <file-col>=
85
+ <path>` → `usage_error.details.reason:
86
+ 'file_set_on_create_unsupported'`. File upload at create time
87
+ would require non-atomic post-create `add_file_to_column`
88
+ (breaks §5.8 state safety) or a Monday wire mutation accepting
89
+ multipart parts inside `create_item.column_values` (no such
90
+ mutation at API `2026-01`); defers to v0.6.x.
91
+
92
+ **`--set-raw <file-col>=<json>` STAYS REJECTED at M38 (per D3
93
+ closure — PERMANENT, not deferred).** Monday's wire has no JSON
94
+ shape for `change_column_value` on file columns — `add_file_to_
95
+ column` is the only file-write wire surface and it's multipart-
96
+ only. The `--set-raw` escape-hatch contract ("user supplies the
97
+ JSON `change_column_value` accepts") doesn't compose with
98
+ multipart. The existing rejection at `src/api/raw-write.ts:
99
+ translateRawColumnValue` stays unchanged. The rejection now
100
+ carries `details.hint` pointing at BOTH the M38 friendly
101
+ `--set` form AND the M31 verb-shaped `monday item upload` —
102
+ agents have two write paths reaching the same multipart wire
103
+ and key off the hint rather than the (absent) `deferred_to`
104
+ slot.
105
+
106
+ **Dry-run envelope shape (per D4 closure).** Mirrors M31 `item
107
+ upload --dry-run` envelope verbatim:
108
+ `planned_changes: [{operation: 'add_file_to_column', item_id,
109
+ column_id, file_path, filename, file_size_bytes}]` (size from
110
+ `fs.stat()`; no file bytes loaded into memory). `meta.source:
111
+ 'none'`. The `file_path` slot echoes the argv-derived path; the
112
+ `column_id` slot echoes the RESOLVED column ID (not the argv
113
+ token).
114
+
115
+ ### Output contract additions
116
+
117
+ **No new stable error codes — registry stays at 29.** Per D8
118
+ closure, M38 routes every rejection through existing codes
119
+ (`usage_error` / `unsupported_column_type` / `not_found` /
120
+ `validation_failed`) with `details.reason` literal-string
121
+ discriminators. The four M38-specific reasons
122
+ (`mixed_file_and_value_sets` / `multi_file_set_unsupported` /
123
+ `file_set_on_bulk_unsupported` / `file_set_on_create_unsupported`)
124
+ join the existing R-NEW-31 discriminated-union per-status-detail
125
+ pattern.
126
+
127
+ **No new envelope keys, no new warning shapes.** M38 reuses the
128
+ M31 multipart wire's success envelope shape (single `item` slot
129
+ projecting the post-mutation board snapshot) and the same
130
+ post-success eager-invalidation contract (`invalidateBoard(boardId)`
131
+ fires single-leg on multipart success).
132
+
133
+ ### Upgrade notes
134
+
135
+ - **`unsupported_column_type` `deferred_to: "v0.6"` is DROPPED
136
+ for the files-shaped category at the friendly `--set` form.**
137
+ v0.6-M38 picks the inline write path up. The rejection row at
138
+ `src/api/column-values.ts` (the files-shaped row of the
139
+ friendly translator) now fires ONLY on the `item create` +
140
+ `item update --where` bulk paths per D5 / D6 closures — with
141
+ `details.reason: 'file_set_on_create_unsupported'` /
142
+ `'file_set_on_bulk_unsupported'`. The single-item `item set` +
143
+ `item update` paths dispatch to the new sibling module BEFORE
144
+ the translator's files-shaped row fires. No more
145
+ `deferred_to: "v0.6"` slot on the friendly-form path —
146
+ agents see successful single-item uploads end-to-end.
147
+ - **`unsupported_column_type` for `--set-raw <file-col>=<json>`
148
+ STAYS REJECTED.** Permanent rejection per D3 — Monday's
149
+ wire has no JSON shape for files-shaped `change_column_value`.
150
+ The rejection hint at `src/api/raw-write.ts` now names BOTH
151
+ the M38 friendly form AND the M31 verb-shaped `monday item
152
+ upload` as alternative write paths; agents construct retries
153
+ from either entry point.
154
+ - **Multi-level subitem creation slips from `"v0.6"` →
155
+ `"v0.7"`.** Originally slipped from v0.3 → v0.4 → v0.5 → v0.6
156
+ across three prior release-preps. v0.6 didn't pick it up —
157
+ Monday's `sub_items_board` still carries no `subtasks` column
158
+ at API `2026-01`, so depth-2 subitems still have no data-model
159
+ home. Single-level subitems (`item create --parent <iid>`
160
+ against classic boards) continue to work byte-identically.
161
+ The `error.code: "usage_error"` + `details.hierarchy_type:
162
+ "multi_level"` keys are unchanged; only the `deferred_to`
163
+ literal flipped.
164
+ - **Cross-board `item move` value-overrides slip from `"v0.6"`
165
+ → `"v0.7"`.** Slipped across v0.3-M11 → v0.4 → v0.5 → v0.6
166
+ → v0.7 release-preps. Monday's `ColumnMappingInput` still
167
+ carries no value slot; the cross-leg partial-failure envelope
168
+ question stays open. Agents needing overrides continue to fire
169
+ `monday item set <iid> <target>=<value>` post-move.
170
+ - **Cross-board resumable cursor slips from `"v0.6"` →
171
+ `"v0.7"`.** The `cross_board_truncated` warning's
172
+ `details.hint` continues to recommend narrowing via
173
+ `--workspace` / `--favorites` / `--max-boards`; v0.7 may pick
174
+ the resumable surface up if per-board cursor-lifetime under
175
+ aggregation gets a clean design.
176
+ - **Stable error-code registry stays at 29.** Existing codes'
177
+ shapes are unchanged across v0.5 → v0.6.
178
+ - **`monday auth login` placeholder-guard unchanged.** The verb
179
+ is still registered and still surfaces `usage_error.details.
180
+ reason: oauth_unregistered` pointing at `MONDAY_API_TOKEN`
181
+ (unchanged from v0.5.0). The OAuth deferral revisits in
182
+ v0.6.x / v0.7 contingent on user demand.
183
+
184
+ ### Internals worth highlighting
185
+
186
+ - **R-class refactor shipped during v0.6.** R-v0.6-NEW-1
187
+ (`file-source.ts` two-export module: `precheckLocalFile`
188
+ fs.stat + fs.access(R_OK) + non-empty + size capture +
189
+ `usage_error.details.reason: 'file_not_readable' |
190
+ 'file_empty'`; `buildBlobFromPath` readFile + sniffContent
191
+ Type + Blob construction) shipped ahead-of-feat at v0.6-M38
192
+ IMPL kickoff (`3c2a9b0`) — 3 consumers post-lift (M31
193
+ `monday item upload` action body + M31 `monday update upload`
194
+ action body + M38's `executeFileColumnSet` runtime body).
195
+ 10 direct unit tests pin the helper's branch matrix. Mirrors
196
+ R-NEW-29's M25 ahead-of-feat cadence + R-NEW-70's M34
197
+ cadence.
198
+ - **R-NEW-82 4th consecutive consumer ratified at v0.6
199
+ release-prep.** The release-prep cross-doc grep for stale
200
+ `deferred_to: "v0.6"` slots fired and caught one stale site
201
+ (multi-level subitem `--parent` rejection — slipped to
202
+ `"v0.7"`) plus one ToC drift (v0.6-M38 friendly file `--set`
203
+ annotation missing from `docs/output-shapes.md`'s `item
204
+ (mutations)` row). Mirrors v0.3-M28 (1st) / v0.4 (2nd) /
205
+ v0.5 (3rd) / v0.6 (4th) release-prep ratifications.
206
+ - **R-NEW-84 graduated discipline applied.** The v0.6
207
+ release-prep cluster ships zero production `src/**/*.ts`
208
+ semantic changes (only the literal `'v0.6'` → `'v0.7'` flip
209
+ in the multi-level subitem rejection slot); gates carry
210
+ verification per the R-NEW-84 carve-out (skip Codex review
211
+ on mechanical / process-only clusters).
212
+ - **`details.reason` discriminator pattern (R-v0.6-NEW-2) at
213
+ 4 supporting instances post-M38** (`mixed_file_and_value_sets`
214
+ / `multi_file_set_unsupported` / `file_set_on_create_
215
+ unsupported` / `file_set_on_bulk_unsupported`). Below the 5th-
216
+ consumer graduation threshold; tracked as a watch-item for the
217
+ first v0.6.x lift that adds a 5th `details.reason` literal-
218
+ string discriminator on the file-set surface (bulk file-set
219
+ carve-out is the natural site).
220
+ - **Two-AI review** (cli-design pre-flight + implementation
221
+ review) ran for M38 pre-flight + IMPL. **M38 IMPL converged
222
+ in 4 fix-up rounds** (0 P1 / 3 P2 / 11 P3 cumulative across
223
+ rounds 1–4 — at the median 3-4 IMPL round count per the
224
+ v0.5 IMPL precedent). The v0.6 release-prep cluster skipped
225
+ Codex per R-NEW-84. Cumulative finding count + per-round
226
+ Codex breakdown lives in the per-milestone post-mortem in
227
+ [`docs/v0.6-plan.md`](./docs/v0.6-plan.md) §11.
228
+
229
+ ### Tests + quality gates
230
+
231
+ - **4100 unit/integration + E2E tests** at v0.6.0 (+1 skipped;
232
+ was 4054+1 at v0.5.0; ~46 new tests for M38 — `file-source`
233
+ helper unit branch matrix, `file-column-set` action-body
234
+ branches, integration cassette pins on single-item friendly
235
+ paths + the four `details.reason`-discriminated rejection
236
+ paths, envelope-snapshot pins on the M38 surfaces). All green
237
+ on Node 22 + 24.
238
+ - **Coverage at 99.26 / 96.46 / 99.31 / 99.52** (statements /
239
+ branches / functions / lines) against the floor 95 / 95.45 /
240
+ 95 / 95. Branches margin **1.01pp** at v0.6.0 (was 1.00pp at
241
+ v0.5.0; +0.01pp). Floor unchanged across v0.5.0 → v0.6.0.
242
+ - **Envelope-snapshot suite** — refresh probe ran clean at
243
+ v0.6 release-prep (zero diff vs M38 IMPL close); per-
244
+ milestone close-docs sweep refreshed snapshots in lockstep at
245
+ M38 IMPL close.
246
+ - **Five test layers held**: unit, integration (in-process
247
+ `FixtureTransport` + `MultipartFixtureTransport`), E2E
248
+ (subprocess against fixture server), envelope-shape snapshot
249
+ suite, published-tarball E2E.
250
+ - **Audit-fix folded into release-prep.** `npm audit` flagged a
251
+ transitive `fast-uri@3.1.0` (high severity); `npm audit fix`
252
+ cleanly resolved to `3.1.2` (non-breaking — `ajv@8.20.0`'s
253
+ `^3.0.1` constraint satisfies 3.1.x). `npm audit` reports
254
+ `0 vulnerabilities` post-fix.
255
+
256
+ ### Documentation
257
+
258
+ - **[`docs/v0.6-plan.md`](./docs/v0.6-plan.md)** new — the v0.6
259
+ active plan with M38 milestone, decisions log (D1-D8),
260
+ R-class register (R-v0.6-NEW-1 through R-v0.6-NEW-11),
261
+ per-milestone post-mortem (§11 + §22).
262
+ - **[`docs/cli-design.md`](./docs/cli-design.md)** §4.3
263
+ `monday item set` + `monday item update` rows annotated with
264
+ the M38 file-column dispatch shape + mutex rules; §5.3
265
+ "File-column dispatch leg" subsection added explaining the
266
+ sibling-branch routing + the four `details.reason`
267
+ discriminators; §13 v0.5 entry's v0.6 deferral list closed
268
+ out + the v0.7 frame pinned (multi-level subitems + cross-
269
+ board move value-overrides + cross-board resumable cursor +
270
+ profile-scoped argument defaults).
271
+ - **[`docs/output-shapes.md`](./docs/output-shapes.md)** —
272
+ `item set` + `item update` sections gained M38 file-column
273
+ dispatch subsections at lines 2100, 2151, 2243; ToC row
274
+ for `item (mutations)` updated to enumerate the friendly
275
+ file `--set v0.6-M38` annotation on `set` + `update`
276
+ (caught at v0.6 release-prep ToC audit as a v0.6-M38
277
+ close-docs gap — 4th consecutive R-NEW-82 graduated-
278
+ discipline ratification).
279
+ - **README.md** quickstart expanded with v0.6 example (step 13
280
+ demonstrating M38 friendly file `--set` on item set + item
281
+ update + dry-run). Scope section reshaped around v0.6.0 /
282
+ v0.5.0 / v0.4.0 / v0.3.0 / v0.2.0 / v0.1.0 per-version
283
+ layout.
284
+
285
+ [0.6.0]: https://github.com/Firer/monday-cli/releases/tag/v0.6.0
286
+
287
+ ## [0.5.0] - 2026-05-17 — Team writers + full Monday workdocs CRUD mutation surface
288
+
289
+ The "agents can write to teams + drive the full workdocs surface"
290
+ milestone — v0.4's read-only workdocs + asset-upload foundation
291
+ gains the six team-writer verbs deferred at the post-v0.4-M33
292
+ candidate-selection session and the full Monday workdocs CRUD
293
+ mutation surface deferred at v0.4-M32 D8 closure (10 new doc-
294
+ namespace verbs across doc-level + doc-block + doc-content-import
295
+ clusters). **16 new CLI verbs across 9 wire mutations.** **No
296
+ breaking changes vs `0.4.0` — every v0.5 surface is additive.**
297
+ Built incrementally across M34–M37.
298
+
299
+ ### Breaking changes vs `0.4.0`
300
+
301
+ **None.** Every command, error code, envelope key, and warning
302
+ shape shipped in v0.4.0 is preserved byte-for-byte. v0.5 only adds.
303
+
304
+ ### Surface
305
+
306
+ **~117 commands shipped (was ~101 in v0.4).** 16 new verbs.
307
+ The new noun namespaces are extensions of existing ones — no new
308
+ top-level noun lands at v0.5 (team writers extend `monday user`;
309
+ doc-level + doc-block + doc-content-import extend `monday doc`).
310
+
311
+ **Team writers (M34) — `monday user team-list/get/create/delete/
312
+ add-members/remove-members`.** Six new verbs closing the v0.4-M33
313
+ candidate-selection deferral. The two read verbs (`team-list` /
314
+ `team-get`) project Monday's `Team` shape (`id`, `name`, `picture_url`,
315
+ `users[]`, `owners[]`). The four mutations:
316
+
317
+ - `team-create --name <n> [--users <id>,...] [--guest-team]
318
+ [--allow-empty] [--dry-run]` — backed by `create_team`.
319
+ `--users` resolves to Monday `UserId` list at the parse boundary
320
+ via the new lifted `parseBrandedListArg<T>(raw, brandSchema,
321
+ options)` helper (R-NEW-70 shipped ahead-of-feat at M34
322
+ pre-flight — 4 consumers post-lift).
323
+ - `team-delete <tid> --yes [--dry-run]` — backed by `delete_team`.
324
+ The destructive verb in the cluster; `--yes` gate fires BEFORE
325
+ `resolveClient` per the M10 round-1 P2 invariant.
326
+ - `team-add-members <tid> --users <id>,... [--dry-run]` +
327
+ `team-remove-members <tid> --users <id>,...` — backed by
328
+ `change_team_memberships`. Monday's mutation returns
329
+ `failed_users` + `successful_users` lists (asymmetric — failed
330
+ users carry a User object but no per-user failure reason, so
331
+ the CLI surfaces a generic `membership_failed` message per
332
+ failed record). The new shared `_team-membership.ts:
333
+ projectMembershipResults` helper projects to the universal
334
+ §6.1 `data.results: [{user_id, ok, ...}]` shape with input-
335
+ order preserved + failed-bucket-priority discipline + an
336
+ `internal_error` surface for input users that land in neither
337
+ bucket (wire-shape regression defensive). Lifted at IMPL
338
+ kickoff as a 2-consumer inline lift mirroring M26b's
339
+ `_shared.ts:requireDevBoard` cadence.
340
+
341
+ `team-list` ships flat (Monday's `teams(...)` has no pagination
342
+ on the wire); the two-read-without-pagination shape mirrors
343
+ `monday user list`. The four mutations all surface `--dry-run`
344
+ for planned-change envelopes.
345
+
346
+ **Doc-level CRUD (M35) — `monday doc create-in-workspace/
347
+ create-on-column/rename/delete/duplicate`.** Five verbs, four
348
+ wire mutations (both create variants share `create_doc` per D7's
349
+ mutually-exclusive `board` vs `workspace` split):
350
+
351
+ - `create-in-workspace --workspace <wid> --name <n> [--folder
352
+ <fid>] [--kind public|private|share]` — creates a workspace-
353
+ level doc. Brand: new `DocFolderIdSchema` joins
354
+ `src/types/ids.ts` as the 11th numeric brand.
355
+ - `create-on-column --item <iid> --column <cid>` — creates a
356
+ column-level doc against an existing file-shaped column.
357
+ - `rename <did> --name <n>` — `update_doc_name`.
358
+ - `delete <did> --yes [--dry-run]` — `delete_doc`. Destructive
359
+ gate fires BEFORE `resolveClient` per the M10 invariant.
360
+ - `duplicate <did> [--with-updates] [--dry-run]` — `duplicate_doc`
361
+ (D8 closure dropped `--name <n>` because the wire side has no
362
+ rename slot on duplicate). `--with-updates` copies the source
363
+ doc's comments to the duplicate; new `extractDuplicateDocId`
364
+ helper defensively unwraps the opaque-JSON new-doc-id across
365
+ bare-string / number / record-with-`id` / `doc_id` /
366
+ `new_doc_id` shapes per D9 closure (Monday's `duplicate_doc`
367
+ returns a flat `{ doc_id, success: true }` projection with
368
+ `success` pinned literal-`true` because failure surfaces via
369
+ GraphQL `errors[]` upstream, NOT via a wire-side success flag).
370
+ `--dry-run` previews the planned change envelope without firing
371
+ the wire.
372
+
373
+ D7 / D8 / D9 closures pinned at pre-flight: D7 two CLI verbs over
374
+ one with placement choosers (mirrors v0.4-M31's `monday item
375
+ upload` / `monday update upload` split for the same multipart
376
+ wire path). D8 drops `--name <n>` from duplicate. D9 opaque-JSON
377
+ returns project to flat `{ doc_id, success: true }` per §6.1
378
+ single-record envelope.
379
+
380
+ **Doc-block CRUD (M36) — `monday doc block-create/block-update/
381
+ block-delete`.** Three verbs / three wire mutations. `--type
382
+ <DocBlockContentType>` takes one of 16 enum values (`normal_text`
383
+ / `large_title` / `medium_title` / `small_title` / `quote` /
384
+ `bulleted_list` / `numbered_list` / `check_list` / `code` /
385
+ `divider` / `image` / `video` / `file` / `table` / `layout` /
386
+ `column`) per D10 closure (unknown values reject at the parse
387
+ boundary with `usage_error.details.issues[]` carrying `{path:
388
+ 'type', message}`). `--content <json>` parses via the M27-lifted
389
+ `parseJsonArg` helper (4th + 5th consumers of the helper).
390
+ `block-create` accepts optional `--after <bid>` / `--parent <bid>`
391
+ positioning slots; `block-update` updates the named block's
392
+ content payload; `block-delete --yes` deletes the named block.
393
+ Per-type content payload shapes documented in `docs/output-
394
+ shapes.md` "Per-block content shapes" reference table — 7
395
+ cassette-pinned variants + 9 TBD / inferred variants awaiting
396
+ follow-up cassettes per D11 closure (per-variant payload-shape
397
+ deferral to IMPL cassettes — R-v0.5-NEW-15 watch-item supporting
398
+ instance 2 of 3 ahead of graduation).
399
+
400
+ `DocBlockIdSchema` brand uses `slugIdSchema` (non-empty-string
401
+ base; same shape as `ColumnId` / `GroupId`) because Monday's
402
+ `DocumentBlock.id` is wire `String!`, NOT `ID!` — load-bearing
403
+ distinction from `DocId`'s numeric brand. Snake_case wire arg
404
+ names (`doc_id` / `block_id` / `after_block_id` / `parent_block_id`)
405
+ — Monday's standard cadence, not a new R-NEW-41 supporting site.
406
+
407
+ **Doc-content import (M37) — `monday doc import-html/append-
408
+ markdown`.** Two verbs / two wire mutations. Bulk doc-content
409
+ import in a single wire round-trip (no per-block loop):
410
+
411
+ - `import-html --workspace <wid> (--html <file|-> | --html-string
412
+ <s>) [--folder <fid>] [--kind public|private|share] [--title
413
+ <t>]` — creates a new doc from an HTML payload.
414
+ - `append-markdown <did> (--markdown <file|-> | --markdown-string
415
+ <s>) [--after <bid>]` — appends blocks to an existing doc from
416
+ a markdown payload.
417
+
418
+ Both surface mutex argv sources (file / stdin / inline string)
419
+ backed by the new generic `readSourceContent` helper at
420
+ `src/utils/source-content.ts` (R-v0.5-NEW-18 lifted ahead-of-
421
+ feat at M37 IMPL — widens M13's `readUpdateBody` to parameterise
422
+ on `inlineFlagName` / `fileFlagName` / `verbHint?` / `maxBytes?` /
423
+ `trimTrailingWhitespace?`; 5 consumers post-lift: 3 M13 update
424
+ verbs + 2 M37 doc verbs). 20 unit tests pin the helper's branch
425
+ matrix.
426
+
427
+ D12 closure pins the custom-OBJECT projection (5 branches):
428
+ success → flat envelope; `success: false + populated error` →
429
+ `validation_failed`; `success: false + empty/null error` →
430
+ `internal_error` (wire-regression hint); `success: true +
431
+ missing payload` → `internal_error` (probe descriptions promise
432
+ non-null); EMPTY `block_ids: []` on success → success WITH empty
433
+ array. D13 empirical-probe ran at M37 pre-flight kickoff
434
+ (`scripts/probe/v0.5-m37-size-limits.ts`, 2026-05-17, API
435
+ `2026-01`) + pinned the wire-side rejection threshold between
436
+ 250KB-OK and 500KB-rejected on both surfaces — rejection shape
437
+ is generic `INTERNAL_SERVER_ERROR` (NOT the documented
438
+ `{success: false, error}` envelope path), so the CLI pre-empts
439
+ at parse boundary via `MAX_DOC_IMPORT_PAYLOAD_BYTES = 256_000`
440
+ on the `.refine()` for inline `--html-string` / `--markdown-
441
+ string`.
442
+
443
+ ### Output contract additions
444
+
445
+ **No new stable error codes — registry stays at 29.** Every v0.5
446
+ milestone closed the new-error-code question NEGATIVE: M34
447
+ team mutations route per-user partial-success failures through
448
+ the generic `membership_failed` message (envelope-level per-record
449
+ discriminator, not a top-level code); M35 / M36 / M37 route
450
+ deletes through the existing `not_found`, validation failures
451
+ through the existing `validation_failed`, wire-shape regressions
452
+ through the existing `internal_error`, and parse-boundary
453
+ rejections through the existing `usage_error`.
454
+
455
+ **New per-record partial-success projection** (M34 —
456
+ `team-add-members` + `team-remove-members`). The
457
+ `change_team_memberships` wire mutation returns asymmetric
458
+ `failed_users` + `successful_users` lists; the shared
459
+ `_team-membership.ts:projectMembershipResults` helper projects
460
+ to the universal §6.1 `data.results: [{user_id, ok, ...}]`
461
+ shape with input-order preserved + failed-bucket-priority
462
+ discipline + an `internal_error` surface for input users that
463
+ land in neither bucket (wire-shape regression defensive).
464
+ Mirrors M13's `update clear-all` partial-success cadence but
465
+ with the wire-side asymmetry pinned in the projection.
466
+
467
+ **New custom-OBJECT 5-branch projection** (M37 — `import-html`
468
+ + `append-markdown`). Monday's two new mutations return a
469
+ custom `{success: bool, error?: string}` shape (NOT the
470
+ standard OBJECT-with-id pattern). The CLI projects through the
471
+ 5-branch dispatch pinned at D12 closure (success → flat
472
+ envelope; `success: false + populated error` →
473
+ `validation_failed`; `success: false + empty error` →
474
+ `internal_error` wire-regression hint; `success: true + missing
475
+ payload` → `internal_error`; EMPTY `block_ids: []` on success →
476
+ success WITH empty array). The projection is per-fetcher (no
477
+ shared helper at 2 consumers; R-v0.5-NEW-17 watch-item tracks
478
+ the OBJECT-shape null-payload guard pattern at 9 consumers
479
+ across M34/M35/M36 mutation fetchers but stays UNFILED today
480
+ per the per-consumer divergence rationale).
481
+
482
+ ### Upgrade notes
483
+
484
+ - **`unsupported_column_type` `deferred_to: "v0.5"` slips to
485
+ `"v0.6"`** for the files-shaped category (`file` column type
486
+ via `--set` / `--set-raw`). Originally slipped from v0.4 →
487
+ v0.5 at v0.4 release-prep; v0.5 didn't pick up the friendly /
488
+ raw forms either (the translator boundary still doesn't
489
+ dispatch into the multipart wire). Slipped from v0.5 → v0.6
490
+ at v0.5 release-prep. `monday item upload` (v0.4-M31)
491
+ continues to be the verb-shaped alternative path agents
492
+ should use today; the hint pointing at `monday item upload`
493
+ is unchanged. **The hint is the load-bearing routing surface
494
+ — agents key off the hint, not the `deferred_to` value.**
495
+ - **Multi-level subitem creation slips from `"v0.5"` → `"v0.6"`.**
496
+ Originally slipped from v0.3 → v0.4 → v0.5 across two prior
497
+ release-preps. v0.5 didn't pick it up — Monday's
498
+ `sub_items_board` still carries no `subtasks` column at API
499
+ `2026-01`, so depth-2 subitems still have no data-model home.
500
+ Single-level subitems (`item create --parent <iid>` against
501
+ classic boards) continue to work byte-identically. The
502
+ `error.code: "usage_error"` + `details.hierarchy_type:
503
+ "multi_level"` keys are unchanged.
504
+ - **Cross-board `item move` value-overrides slip from `"v0.5"`
505
+ → `"v0.6"`.** Originally v0.3-M11-targeted, slipped to v0.4
506
+ at v0.3-M28 audit, slipped to v0.5 at v0.4 release-prep,
507
+ slipped to v0.6 at v0.5 release-prep. Monday's
508
+ `ColumnMappingInput` still carries no value slot; supporting
509
+ it would need a non-atomic post-move `change_multiple_column_
510
+ values` with cross-leg partial-failure envelope shapes that
511
+ have no precedent at v0.5 close. Agents needing overrides
512
+ continue to fire `monday item set <iid> <target>=<value>`
513
+ post-move.
514
+ - **Cross-board resumable cursor slips from `"v0.5"` →
515
+ `"v0.6"`.** The `cross_board_truncated` warning's
516
+ `details.hint` continues to recommend narrowing via
517
+ `--workspace` / `--favorites` / `--max-boards`; v0.6 may pick
518
+ the resumable surface up if per-board cursor-lifetime under
519
+ aggregation gets a clean design.
520
+ - **Stable error-code registry stays at 29.** Existing codes'
521
+ shapes are unchanged across v0.4 → v0.5.
522
+ - **Snake_case wire arg names on M36 doc-block surfaces**
523
+ (`doc_id` / `block_id` / `after_block_id` / `parent_block_id`).
524
+ Monday's standard cadence — NOT a new R-NEW-41 supporting
525
+ site. M37 camelCase wire arg names (`workspaceId` / `folderId`
526
+ / `docId` / `afterBlockId`) ARE a 5th R-NEW-41 supporting
527
+ site for the wire-vs-CLI semantics asymmetry section in
528
+ `docs/architecture.md`.
529
+ - **`monday auth login` placeholder-guard unchanged.** The verb
530
+ is still registered and still surfaces `usage_error.details.
531
+ reason: oauth_unregistered` pointing at `MONDAY_API_TOKEN`
532
+ (unchanged from v0.4.0). The OAuth deferral revisits in
533
+ v0.5.x / v0.6 contingent on user demand.
534
+
535
+ ### Internals worth highlighting
536
+
537
+ - **R-class refactors shipped during v0.5.** R-NEW-70
538
+ (`parseBrandedListArg<T>`) shipped ahead-of-feat at v0.5-M34
539
+ pre-flight close (`17c1a54`) — 4 consumers post-lift (doc/list
540
+ `--workspace` + team-create `--users` + team-add-members
541
+ `--users` + team-remove-members `--users`). 18 unit tests pin
542
+ the helper's branch matrix. R-v0.5-NEW-18 (`readSourceContent`)
543
+ shipped at M37 IMPL kickoff (`c431d96`) — widens M13's
544
+ `readUpdateBody` to parameterise on inline / file flag names +
545
+ optional size cap / trim-whitespace; 5 consumers post-lift
546
+ (3 M13 update verbs + 2 M37 doc verbs).
547
+ - **R-class disciplines graduated during v0.5.** R-v0.5-NEW-11
548
+ (per-fetcher null-payload contract decision discipline derived
549
+ from probe-description return-shape promises) graduated at
550
+ M37 pre-flight close (3rd supporting instance — to a permanent
551
+ Codex pre-flight template W{N} audit-point). R-v0.5-NEW-15
552
+ (pre-flight per-variant payload-shape deferral to IMPL
553
+ cassettes) graduated at M37 pre-flight close (3rd supporting
554
+ instance — to a permanent Codex pre-flight template W{N}
555
+ audit-point). R-v0.5-NEW-19 (post-fix-up cross-doc grep
556
+ extension to `src/commands/index.ts` module-import block prose)
557
+ graduated at M37 IMPL close (2nd supporting instance — folded
558
+ into the CLAUDE.md R-NEW-72 "Workflow rules" entry as the
559
+ fourth search path alongside `src/api/*.ts` + `src/commands/
560
+ **/*.ts` + `docs/*.md`). R-v0.5-NEW-9 (round-N parallel-
561
+ fetcher fix-up test parity discipline) graduated at the
562
+ post-M37-close audit (2nd supporting instance — to a
563
+ permanent IMPL-review / pre-flight template W{N} audit-point).
564
+ - **Noun-stem matching for R-NEW-72 grep patterns** ratified at
565
+ v0.5-M37 IMPL rounds 3-5 — use `\b<noun>\b` regex matching
566
+ rather than literal-substring matching to catch all
567
+ inflections in a single pass. Lesson folded into CLAUDE.md
568
+ R-NEW-72 entry: enumerate sibling-site noun-stems before
569
+ grepping; use regex word-boundary matching to catch all
570
+ inflections (e.g., `cassette` / `cassette pin` / `cassette
571
+ pinned` / `cassette pins` collapse under `\bcassette\b`).
572
+ - **Empirical probes** ratified across the v0.5 surface
573
+ introducing novel wire shapes: M34 `change_team_memberships`
574
+ asymmetric bucket containers (probe round-2 surfaced the
575
+ outer-LIST nullability + the missing per-user failure reason
576
+ pinned at IMPL round-1 P2-1); M35 opaque-JSON `duplicate_doc`
577
+ return-shape variance probe (pinned the defensive 5-shape
578
+ unwrap in `extractDuplicateDocId`); M37 `MAX_DOC_IMPORT_
579
+ PAYLOAD_BYTES` size-limit probe at M37 pre-flight (pinned
580
+ the wire-side rejection threshold between 250KB-OK and
581
+ 500KB-rejected on both surfaces). R-NEW-37 W2 (operation-
582
+ name parity) safely-by-construction across all v0.5
583
+ fetchers — verified clean at every Codex IMPL round.
584
+ - **Two-AI review** (cli-design pre-flight + implementation
585
+ review) ran for every v0.5 milestone M34–M37 + skipped on
586
+ the v0.5 release-prep cluster per the **R-NEW-84 carve-out**
587
+ graduated at v0.5-M34 pre-flight (skip Codex review on
588
+ mechanical / process-only / test-side housekeeping clusters
589
+ with zero production `src/**/*.ts` changes). M34 IMPL
590
+ converged in 3 rounds; M35 IMPL converged in 6 rounds (one
591
+ round above the OBJECT-return precedent — driven by the
592
+ opaque-JSON cassette-prose sweep surfacing incrementally as
593
+ the post-fix-up R-NEW-72 grep pattern broadened);
594
+ M36 IMPL converged in 2 rounds (at the LOWER bound of the
595
+ precedent); M37 IMPL converged in 5 rounds (~1 round above
596
+ M36's clean cadence, driven by the custom-OBJECT shape's
597
+ prose surface). The cumulative finding count + per-milestone
598
+ Codex-round breakdown lives in the per-milestone post-
599
+ mortems in [`docs/v0.5-plan.md`](./docs/v0.5-plan.md)
600
+ §11–§14.
601
+
602
+ ### Tests + quality gates
603
+
604
+ - **4054 unit/integration + E2E tests** at v0.5.0 (+1 skipped;
605
+ was 3634+1 at v0.4.0; ~420 new tests across M34–M37). All
606
+ green on Node 22 + 24.
607
+ - **Coverage at 99.29 / 96.45 / 99.45 / 99.55** (statements /
608
+ branches / functions / lines) against the floor 95 / 95.45 /
609
+ 95 / 95. Branches margin **1.00pp** at v0.5.0 (was 0.88pp at
610
+ v0.4.0; +0.12pp recovery — the v0.5 surface's runtime-body
611
+ branches integration-test-cover the c8-ignored stub drops at
612
+ IMPL close cleanly, first v0.5 IMPL milestone (M37) to cross
613
+ the 1.00pp branches margin threshold; the release-prep
614
+ cluster adds no production branches). Floor unchanged across
615
+ v0.4.0 → v0.5.0.
616
+ - **Envelope-snapshot suite** — no refresh needed at release-
617
+ prep; per-milestone close-docs sweeps refreshed snapshots in
618
+ lockstep at each IMPL close (M34 +12 snapshots, M35 +11,
619
+ M36 +6, M37 +0 net — describe-block widening swap only).
620
+ - **Five test layers held**: unit, integration (in-process
621
+ `FixtureTransport` + `MultipartFixtureTransport`), E2E
622
+ (subprocess against fixture server), envelope-shape snapshot
623
+ suite, published-tarball E2E.
624
+
625
+ ### Documentation
626
+
627
+ - **[`docs/v0.5-plan.md`](./docs/v0.5-plan.md)** new — the v0.5
628
+ active plan with M34–M37 milestones, decisions log
629
+ (D1-D13), R-class register (R-v0.5-NEW-1 through
630
+ R-v0.5-NEW-22), per-milestone post-mortems (§11–§14 + §22).
631
+ - **[`docs/cli-design.md`](./docs/cli-design.md)** §4.3 grew
632
+ 16 new verb entries (6 USER team-* rows + 10 DOC rows for
633
+ M35/M36/M37); §13 v0.4 entry's v0.5 deferral list closed
634
+ out + the v0.6 frame pinned (files-shaped friendly + multi-
635
+ level subitems + cross-board move value-overrides + cross-
636
+ board resumable cursor).
637
+ - **[`docs/output-shapes.md`](./docs/output-shapes.md)** —
638
+ M35/M36/M37 verb sections snapshot-backed; M34 team-writer
639
+ sections deferred to v0.5.x as a documentation backfill
640
+ (caught at v0.5 release-prep ToC audit as a v0.5-M34
641
+ close-docs gap; ToC row updated to enumerate the team-*
642
+ verbs, a minimal cross-pointer section landed under
643
+ `### user me` pointing agents at `cli-design.md` §4.3 +
644
+ the per-verb integration tests + envelope-snapshot
645
+ regression suite that pin the team-writer contract surface
646
+ today).
647
+ - **README.md** quickstart expanded with v0.5 examples
648
+ (workdocs CRUD steps demonstrating M35/M36/M37 verbs;
649
+ team-writer steps demonstrating M34). Scope section
650
+ reshaped around v0.5.0 / v0.4.0 / v0.3.0 / v0.2.0 / v0.1.0
651
+ per-version layout.
652
+
653
+ [0.5.0]: https://github.com/Firer/monday-cli/releases/tag/v0.5.0
654
+
10
655
  ## [0.4.0] - 2026-05-14 — Operational features: long-poll watch, parallel bulk, asset upload, workdocs reads, shell completion
11
656
 
12
657
  The "agents can drive long-running workflows + multipart wire +