monday-cli 0.2.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 (596) hide show
  1. package/CHANGELOG.md +439 -0
  2. package/LICENSE +21 -0
  3. package/README.md +431 -0
  4. package/dist/api/board-child-finder.d.ts +95 -0
  5. package/dist/api/board-child-finder.d.ts.map +1 -0
  6. package/dist/api/board-child-finder.js +89 -0
  7. package/dist/api/board-child-finder.js.map +1 -0
  8. package/dist/api/board-metadata.d.ts +162 -0
  9. package/dist/api/board-metadata.d.ts.map +1 -0
  10. package/dist/api/board-metadata.js +238 -0
  11. package/dist/api/board-metadata.js.map +1 -0
  12. package/dist/api/board-mutation-invalidation.d.ts +153 -0
  13. package/dist/api/board-mutation-invalidation.d.ts.map +1 -0
  14. package/dist/api/board-mutation-invalidation.js +136 -0
  15. package/dist/api/board-mutation-invalidation.js.map +1 -0
  16. package/dist/api/board-mutation-result.d.ts +97 -0
  17. package/dist/api/board-mutation-result.d.ts.map +1 -0
  18. package/dist/api/board-mutation-result.js +99 -0
  19. package/dist/api/board-mutation-result.js.map +1 -0
  20. package/dist/api/board-projection.d.ts +68 -0
  21. package/dist/api/board-projection.d.ts.map +1 -0
  22. package/dist/api/board-projection.js +79 -0
  23. package/dist/api/board-projection.js.map +1 -0
  24. package/dist/api/cache.d.ts +150 -0
  25. package/dist/api/cache.d.ts.map +1 -0
  26. package/dist/api/cache.js +418 -0
  27. package/dist/api/cache.js.map +1 -0
  28. package/dist/api/client.d.ts +162 -0
  29. package/dist/api/client.d.ts.map +1 -0
  30. package/dist/api/client.js +205 -0
  31. package/dist/api/client.js.map +1 -0
  32. package/dist/api/column-mapping.d.ts +68 -0
  33. package/dist/api/column-mapping.d.ts.map +1 -0
  34. package/dist/api/column-mapping.js +117 -0
  35. package/dist/api/column-mapping.js.map +1 -0
  36. package/dist/api/column-mutation-result.d.ts +136 -0
  37. package/dist/api/column-mutation-result.d.ts.map +1 -0
  38. package/dist/api/column-mutation-result.js +130 -0
  39. package/dist/api/column-mutation-result.js.map +1 -0
  40. package/dist/api/column-types.d.ts +215 -0
  41. package/dist/api/column-types.d.ts.map +1 -0
  42. package/dist/api/column-types.js +195 -0
  43. package/dist/api/column-types.js.map +1 -0
  44. package/dist/api/column-values.d.ts +446 -0
  45. package/dist/api/column-values.d.ts.map +1 -0
  46. package/dist/api/column-values.js +795 -0
  47. package/dist/api/column-values.js.map +1 -0
  48. package/dist/api/columns.d.ts +205 -0
  49. package/dist/api/columns.d.ts.map +1 -0
  50. package/dist/api/columns.js +343 -0
  51. package/dist/api/columns.js.map +1 -0
  52. package/dist/api/complexity.d.ts +90 -0
  53. package/dist/api/complexity.d.ts.map +1 -0
  54. package/dist/api/complexity.js +194 -0
  55. package/dist/api/complexity.js.map +1 -0
  56. package/dist/api/dates.d.ts +150 -0
  57. package/dist/api/dates.d.ts.map +1 -0
  58. package/dist/api/dates.js +490 -0
  59. package/dist/api/dates.js.map +1 -0
  60. package/dist/api/destructive-gate.d.ts +107 -0
  61. package/dist/api/destructive-gate.d.ts.map +1 -0
  62. package/dist/api/destructive-gate.js +19 -0
  63. package/dist/api/destructive-gate.js.map +1 -0
  64. package/dist/api/dry-run.d.ts +338 -0
  65. package/dist/api/dry-run.d.ts.map +1 -0
  66. package/dist/api/dry-run.js +607 -0
  67. package/dist/api/dry-run.js.map +1 -0
  68. package/dist/api/emails.d.ts +60 -0
  69. package/dist/api/emails.d.ts.map +1 -0
  70. package/dist/api/emails.js +113 -0
  71. package/dist/api/emails.js.map +1 -0
  72. package/dist/api/errors.d.ts +82 -0
  73. package/dist/api/errors.d.ts.map +1 -0
  74. package/dist/api/errors.js +434 -0
  75. package/dist/api/errors.js.map +1 -0
  76. package/dist/api/filters.d.ts +198 -0
  77. package/dist/api/filters.d.ts.map +1 -0
  78. package/dist/api/filters.js +328 -0
  79. package/dist/api/filters.js.map +1 -0
  80. package/dist/api/group-color.d.ts +33 -0
  81. package/dist/api/group-color.d.ts.map +1 -0
  82. package/dist/api/group-color.js +80 -0
  83. package/dist/api/group-color.js.map +1 -0
  84. package/dist/api/group-mutation-result.d.ts +150 -0
  85. package/dist/api/group-mutation-result.d.ts.map +1 -0
  86. package/dist/api/group-mutation-result.js +141 -0
  87. package/dist/api/group-mutation-result.js.map +1 -0
  88. package/dist/api/iso-country-codes.d.ts +45 -0
  89. package/dist/api/iso-country-codes.d.ts.map +1 -0
  90. package/dist/api/iso-country-codes.js +71 -0
  91. package/dist/api/iso-country-codes.js.map +1 -0
  92. package/dist/api/item-board-lookup.d.ts +86 -0
  93. package/dist/api/item-board-lookup.d.ts.map +1 -0
  94. package/dist/api/item-board-lookup.js +140 -0
  95. package/dist/api/item-board-lookup.js.map +1 -0
  96. package/dist/api/item-helpers.d.ts +133 -0
  97. package/dist/api/item-helpers.d.ts.map +1 -0
  98. package/dist/api/item-helpers.js +139 -0
  99. package/dist/api/item-helpers.js.map +1 -0
  100. package/dist/api/item-mutation-result.d.ts +60 -0
  101. package/dist/api/item-mutation-result.d.ts.map +1 -0
  102. package/dist/api/item-mutation-result.js +63 -0
  103. package/dist/api/item-mutation-result.js.map +1 -0
  104. package/dist/api/item-projection.d.ts +165 -0
  105. package/dist/api/item-projection.d.ts.map +1 -0
  106. package/dist/api/item-projection.js +235 -0
  107. package/dist/api/item-projection.js.map +1 -0
  108. package/dist/api/item-source-read.d.ts +45 -0
  109. package/dist/api/item-source-read.d.ts.map +1 -0
  110. package/dist/api/item-source-read.js +57 -0
  111. package/dist/api/item-source-read.js.map +1 -0
  112. package/dist/api/items-page-walker.d.ts +126 -0
  113. package/dist/api/items-page-walker.d.ts.map +1 -0
  114. package/dist/api/items-page-walker.js +256 -0
  115. package/dist/api/items-page-walker.js.map +1 -0
  116. package/dist/api/links.d.ts +70 -0
  117. package/dist/api/links.d.ts.map +1 -0
  118. package/dist/api/links.js +128 -0
  119. package/dist/api/links.js.map +1 -0
  120. package/dist/api/me-token.d.ts +52 -0
  121. package/dist/api/me-token.d.ts.map +1 -0
  122. package/dist/api/me-token.js +55 -0
  123. package/dist/api/me-token.js.map +1 -0
  124. package/dist/api/pagination.d.ts +201 -0
  125. package/dist/api/pagination.d.ts.map +1 -0
  126. package/dist/api/pagination.js +223 -0
  127. package/dist/api/pagination.js.map +1 -0
  128. package/dist/api/partial-success-mutation.d.ts +28 -0
  129. package/dist/api/partial-success-mutation.d.ts.map +1 -0
  130. package/dist/api/partial-success-mutation.js +68 -0
  131. package/dist/api/partial-success-mutation.js.map +1 -0
  132. package/dist/api/people.d.ts +182 -0
  133. package/dist/api/people.d.ts.map +1 -0
  134. package/dist/api/people.js +260 -0
  135. package/dist/api/people.js.map +1 -0
  136. package/dist/api/phones.d.ts +74 -0
  137. package/dist/api/phones.d.ts.map +1 -0
  138. package/dist/api/phones.js +167 -0
  139. package/dist/api/phones.js.map +1 -0
  140. package/dist/api/raw-document.d.ts +53 -0
  141. package/dist/api/raw-document.d.ts.map +1 -0
  142. package/dist/api/raw-document.js +177 -0
  143. package/dist/api/raw-document.js.map +1 -0
  144. package/dist/api/raw-write.d.ts +127 -0
  145. package/dist/api/raw-write.d.ts.map +1 -0
  146. package/dist/api/raw-write.js +233 -0
  147. package/dist/api/raw-write.js.map +1 -0
  148. package/dist/api/resolution-context.d.ts +32 -0
  149. package/dist/api/resolution-context.d.ts.map +1 -0
  150. package/dist/api/resolution-context.js +42 -0
  151. package/dist/api/resolution-context.js.map +1 -0
  152. package/dist/api/resolution-pass.d.ts +163 -0
  153. package/dist/api/resolution-pass.d.ts.map +1 -0
  154. package/dist/api/resolution-pass.js +254 -0
  155. package/dist/api/resolution-pass.js.map +1 -0
  156. package/dist/api/resolve-client.d.ts +69 -0
  157. package/dist/api/resolve-client.d.ts.map +1 -0
  158. package/dist/api/resolve-client.js +70 -0
  159. package/dist/api/resolve-client.js.map +1 -0
  160. package/dist/api/resolver-error-fold.d.ts +176 -0
  161. package/dist/api/resolver-error-fold.d.ts.map +1 -0
  162. package/dist/api/resolver-error-fold.js +230 -0
  163. package/dist/api/resolver-error-fold.js.map +1 -0
  164. package/dist/api/resolvers.d.ts +131 -0
  165. package/dist/api/resolvers.d.ts.map +1 -0
  166. package/dist/api/resolvers.js +262 -0
  167. package/dist/api/resolvers.js.map +1 -0
  168. package/dist/api/response-root.d.ts +65 -0
  169. package/dist/api/response-root.d.ts.map +1 -0
  170. package/dist/api/response-root.js +61 -0
  171. package/dist/api/response-root.js.map +1 -0
  172. package/dist/api/retry.d.ts +112 -0
  173. package/dist/api/retry.d.ts.map +1 -0
  174. package/dist/api/retry.js +181 -0
  175. package/dist/api/retry.js.map +1 -0
  176. package/dist/api/set-expression.d.ts +23 -0
  177. package/dist/api/set-expression.d.ts.map +1 -0
  178. package/dist/api/set-expression.js +31 -0
  179. package/dist/api/set-expression.js.map +1 -0
  180. package/dist/api/sort.d.ts +59 -0
  181. package/dist/api/sort.d.ts.map +1 -0
  182. package/dist/api/sort.js +73 -0
  183. package/dist/api/sort.js.map +1 -0
  184. package/dist/api/source-aggregator.d.ts +94 -0
  185. package/dist/api/source-aggregator.d.ts.map +1 -0
  186. package/dist/api/source-aggregator.js +111 -0
  187. package/dist/api/source-aggregator.js.map +1 -0
  188. package/dist/api/transport.d.ts +58 -0
  189. package/dist/api/transport.d.ts.map +1 -0
  190. package/dist/api/transport.js +190 -0
  191. package/dist/api/transport.js.map +1 -0
  192. package/dist/api/update-mutation-result.d.ts +133 -0
  193. package/dist/api/update-mutation-result.d.ts.map +1 -0
  194. package/dist/api/update-mutation-result.js +145 -0
  195. package/dist/api/update-mutation-result.js.map +1 -0
  196. package/dist/api/users-fan-out-mutation.d.ts +124 -0
  197. package/dist/api/users-fan-out-mutation.d.ts.map +1 -0
  198. package/dist/api/users-fan-out-mutation.js +331 -0
  199. package/dist/api/users-fan-out-mutation.js.map +1 -0
  200. package/dist/api/walk-pages.d.ts +91 -0
  201. package/dist/api/walk-pages.d.ts.map +1 -0
  202. package/dist/api/walk-pages.js +84 -0
  203. package/dist/api/walk-pages.js.map +1 -0
  204. package/dist/api/workspace-projection.d.ts +64 -0
  205. package/dist/api/workspace-projection.d.ts.map +1 -0
  206. package/dist/api/workspace-projection.js +83 -0
  207. package/dist/api/workspace-projection.js.map +1 -0
  208. package/dist/cli/envelope-out.d.ts +128 -0
  209. package/dist/cli/envelope-out.d.ts.map +1 -0
  210. package/dist/cli/envelope-out.js +146 -0
  211. package/dist/cli/envelope-out.js.map +1 -0
  212. package/dist/cli/index.d.ts +3 -0
  213. package/dist/cli/index.d.ts.map +1 -0
  214. package/dist/cli/index.js +27 -0
  215. package/dist/cli/index.js.map +1 -0
  216. package/dist/cli/program.d.ts +29 -0
  217. package/dist/cli/program.d.ts.map +1 -0
  218. package/dist/cli/program.js +109 -0
  219. package/dist/cli/program.js.map +1 -0
  220. package/dist/cli/run.d.ts +108 -0
  221. package/dist/cli/run.d.ts.map +1 -0
  222. package/dist/cli/run.js +105 -0
  223. package/dist/cli/run.js.map +1 -0
  224. package/dist/commands/account/client-helper.d.ts +37 -0
  225. package/dist/commands/account/client-helper.d.ts.map +1 -0
  226. package/dist/commands/account/client-helper.js +55 -0
  227. package/dist/commands/account/client-helper.js.map +1 -0
  228. package/dist/commands/account/complexity.d.ts +29 -0
  229. package/dist/commands/account/complexity.d.ts.map +1 -0
  230. package/dist/commands/account/complexity.js +70 -0
  231. package/dist/commands/account/complexity.js.map +1 -0
  232. package/dist/commands/account/info.d.ts +36 -0
  233. package/dist/commands/account/info.d.ts.map +1 -0
  234. package/dist/commands/account/info.js +74 -0
  235. package/dist/commands/account/info.js.map +1 -0
  236. package/dist/commands/account/version.d.ts +44 -0
  237. package/dist/commands/account/version.d.ts.map +1 -0
  238. package/dist/commands/account/version.js +98 -0
  239. package/dist/commands/account/version.js.map +1 -0
  240. package/dist/commands/account/whoami.d.ts +34 -0
  241. package/dist/commands/account/whoami.d.ts.map +1 -0
  242. package/dist/commands/account/whoami.js +77 -0
  243. package/dist/commands/account/whoami.js.map +1 -0
  244. package/dist/commands/board/add-users.d.ts +60 -0
  245. package/dist/commands/board/add-users.d.ts.map +1 -0
  246. package/dist/commands/board/add-users.js +133 -0
  247. package/dist/commands/board/add-users.js.map +1 -0
  248. package/dist/commands/board/archive.d.ts +64 -0
  249. package/dist/commands/board/archive.d.ts.map +1 -0
  250. package/dist/commands/board/archive.js +226 -0
  251. package/dist/commands/board/archive.js.map +1 -0
  252. package/dist/commands/board/column-create.d.ts +146 -0
  253. package/dist/commands/board/column-create.d.ts.map +1 -0
  254. package/dist/commands/board/column-create.js +564 -0
  255. package/dist/commands/board/column-create.js.map +1 -0
  256. package/dist/commands/board/column-delete.d.ts +76 -0
  257. package/dist/commands/board/column-delete.d.ts.map +1 -0
  258. package/dist/commands/board/column-delete.js +224 -0
  259. package/dist/commands/board/column-delete.js.map +1 -0
  260. package/dist/commands/board/column-update.d.ts +92 -0
  261. package/dist/commands/board/column-update.d.ts.map +1 -0
  262. package/dist/commands/board/column-update.js +364 -0
  263. package/dist/commands/board/column-update.js.map +1 -0
  264. package/dist/commands/board/columns.d.ts +30 -0
  265. package/dist/commands/board/columns.d.ts.map +1 -0
  266. package/dist/commands/board/columns.js +102 -0
  267. package/dist/commands/board/columns.js.map +1 -0
  268. package/dist/commands/board/create.d.ts +67 -0
  269. package/dist/commands/board/create.d.ts.map +1 -0
  270. package/dist/commands/board/create.js +226 -0
  271. package/dist/commands/board/create.js.map +1 -0
  272. package/dist/commands/board/delete.d.ts +60 -0
  273. package/dist/commands/board/delete.d.ts.map +1 -0
  274. package/dist/commands/board/delete.js +192 -0
  275. package/dist/commands/board/delete.js.map +1 -0
  276. package/dist/commands/board/describe.d.ts +68 -0
  277. package/dist/commands/board/describe.d.ts.map +1 -0
  278. package/dist/commands/board/describe.js +241 -0
  279. package/dist/commands/board/describe.js.map +1 -0
  280. package/dist/commands/board/doctor.d.ts +108 -0
  281. package/dist/commands/board/doctor.d.ts.map +1 -0
  282. package/dist/commands/board/doctor.js +417 -0
  283. package/dist/commands/board/doctor.js.map +1 -0
  284. package/dist/commands/board/duplicate.d.ts +85 -0
  285. package/dist/commands/board/duplicate.d.ts.map +1 -0
  286. package/dist/commands/board/duplicate.js +281 -0
  287. package/dist/commands/board/duplicate.js.map +1 -0
  288. package/dist/commands/board/find.d.ts +47 -0
  289. package/dist/commands/board/find.d.ts.map +1 -0
  290. package/dist/commands/board/find.js +153 -0
  291. package/dist/commands/board/find.js.map +1 -0
  292. package/dist/commands/board/get.d.ts +41 -0
  293. package/dist/commands/board/get.d.ts.map +1 -0
  294. package/dist/commands/board/get.js +66 -0
  295. package/dist/commands/board/get.js.map +1 -0
  296. package/dist/commands/board/group-archive.d.ts +83 -0
  297. package/dist/commands/board/group-archive.d.ts.map +1 -0
  298. package/dist/commands/board/group-archive.js +264 -0
  299. package/dist/commands/board/group-archive.js.map +1 -0
  300. package/dist/commands/board/group-create.d.ts +118 -0
  301. package/dist/commands/board/group-create.d.ts.map +1 -0
  302. package/dist/commands/board/group-create.js +239 -0
  303. package/dist/commands/board/group-create.js.map +1 -0
  304. package/dist/commands/board/group-delete.d.ts +79 -0
  305. package/dist/commands/board/group-delete.d.ts.map +1 -0
  306. package/dist/commands/board/group-delete.js +222 -0
  307. package/dist/commands/board/group-delete.js.map +1 -0
  308. package/dist/commands/board/group-duplicate.d.ts +70 -0
  309. package/dist/commands/board/group-duplicate.d.ts.map +1 -0
  310. package/dist/commands/board/group-duplicate.js +219 -0
  311. package/dist/commands/board/group-duplicate.js.map +1 -0
  312. package/dist/commands/board/group-update.d.ts +145 -0
  313. package/dist/commands/board/group-update.d.ts.map +1 -0
  314. package/dist/commands/board/group-update.js +341 -0
  315. package/dist/commands/board/group-update.js.map +1 -0
  316. package/dist/commands/board/groups.d.ts +28 -0
  317. package/dist/commands/board/groups.d.ts.map +1 -0
  318. package/dist/commands/board/groups.js +85 -0
  319. package/dist/commands/board/groups.js.map +1 -0
  320. package/dist/commands/board/list.d.ts +39 -0
  321. package/dist/commands/board/list.d.ts.map +1 -0
  322. package/dist/commands/board/list.js +135 -0
  323. package/dist/commands/board/list.js.map +1 -0
  324. package/dist/commands/board/subscribers.d.ts +24 -0
  325. package/dist/commands/board/subscribers.d.ts.map +1 -0
  326. package/dist/commands/board/subscribers.js +89 -0
  327. package/dist/commands/board/subscribers.js.map +1 -0
  328. package/dist/commands/board/update.d.ts +82 -0
  329. package/dist/commands/board/update.d.ts.map +1 -0
  330. package/dist/commands/board/update.js +328 -0
  331. package/dist/commands/board/update.js.map +1 -0
  332. package/dist/commands/cache/clear.d.ts +34 -0
  333. package/dist/commands/cache/clear.d.ts.map +1 -0
  334. package/dist/commands/cache/clear.js +113 -0
  335. package/dist/commands/cache/clear.js.map +1 -0
  336. package/dist/commands/cache/list.d.ts +50 -0
  337. package/dist/commands/cache/list.d.ts.map +1 -0
  338. package/dist/commands/cache/list.js +77 -0
  339. package/dist/commands/cache/list.js.map +1 -0
  340. package/dist/commands/cache/stats.d.ts +22 -0
  341. package/dist/commands/cache/stats.d.ts.map +1 -0
  342. package/dist/commands/cache/stats.js +56 -0
  343. package/dist/commands/cache/stats.js.map +1 -0
  344. package/dist/commands/config/path.d.ts +22 -0
  345. package/dist/commands/config/path.d.ts.map +1 -0
  346. package/dist/commands/config/path.js +74 -0
  347. package/dist/commands/config/path.js.map +1 -0
  348. package/dist/commands/config/show.d.ts +61 -0
  349. package/dist/commands/config/show.d.ts.map +1 -0
  350. package/dist/commands/config/show.js +137 -0
  351. package/dist/commands/config/show.js.map +1 -0
  352. package/dist/commands/emit.d.ts +156 -0
  353. package/dist/commands/emit.d.ts.map +1 -0
  354. package/dist/commands/emit.js +212 -0
  355. package/dist/commands/emit.js.map +1 -0
  356. package/dist/commands/index.d.ts +5 -0
  357. package/dist/commands/index.d.ts.map +1 -0
  358. package/dist/commands/index.js +195 -0
  359. package/dist/commands/index.js.map +1 -0
  360. package/dist/commands/item/archive.d.ts +81 -0
  361. package/dist/commands/item/archive.d.ts.map +1 -0
  362. package/dist/commands/item/archive.js +187 -0
  363. package/dist/commands/item/archive.js.map +1 -0
  364. package/dist/commands/item/clear.d.ts +140 -0
  365. package/dist/commands/item/clear.d.ts.map +1 -0
  366. package/dist/commands/item/clear.js +748 -0
  367. package/dist/commands/item/clear.js.map +1 -0
  368. package/dist/commands/item/create.d.ts +77 -0
  369. package/dist/commands/item/create.d.ts.map +1 -0
  370. package/dist/commands/item/create.js +802 -0
  371. package/dist/commands/item/create.js.map +1 -0
  372. package/dist/commands/item/delete.d.ts +82 -0
  373. package/dist/commands/item/delete.d.ts.map +1 -0
  374. package/dist/commands/item/delete.js +179 -0
  375. package/dist/commands/item/delete.js.map +1 -0
  376. package/dist/commands/item/duplicate.d.ts +117 -0
  377. package/dist/commands/item/duplicate.d.ts.map +1 -0
  378. package/dist/commands/item/duplicate.js +238 -0
  379. package/dist/commands/item/duplicate.js.map +1 -0
  380. package/dist/commands/item/find.d.ts +55 -0
  381. package/dist/commands/item/find.d.ts.map +1 -0
  382. package/dist/commands/item/find.js +231 -0
  383. package/dist/commands/item/find.js.map +1 -0
  384. package/dist/commands/item/get.d.ts +47 -0
  385. package/dist/commands/item/get.d.ts.map +1 -0
  386. package/dist/commands/item/get.js +66 -0
  387. package/dist/commands/item/get.js.map +1 -0
  388. package/dist/commands/item/list.d.ts +73 -0
  389. package/dist/commands/item/list.d.ts.map +1 -0
  390. package/dist/commands/item/list.js +284 -0
  391. package/dist/commands/item/list.js.map +1 -0
  392. package/dist/commands/item/move.d.ts +181 -0
  393. package/dist/commands/item/move.d.ts.map +1 -0
  394. package/dist/commands/item/move.js +560 -0
  395. package/dist/commands/item/move.js.map +1 -0
  396. package/dist/commands/item/search.d.ts +67 -0
  397. package/dist/commands/item/search.d.ts.map +1 -0
  398. package/dist/commands/item/search.js +322 -0
  399. package/dist/commands/item/search.js.map +1 -0
  400. package/dist/commands/item/set.d.ts +88 -0
  401. package/dist/commands/item/set.d.ts.map +1 -0
  402. package/dist/commands/item/set.js +387 -0
  403. package/dist/commands/item/set.js.map +1 -0
  404. package/dist/commands/item/subitems.d.ts +50 -0
  405. package/dist/commands/item/subitems.d.ts.map +1 -0
  406. package/dist/commands/item/subitems.js +86 -0
  407. package/dist/commands/item/subitems.js.map +1 -0
  408. package/dist/commands/item/update.d.ts +99 -0
  409. package/dist/commands/item/update.d.ts.map +1 -0
  410. package/dist/commands/item/update.js +884 -0
  411. package/dist/commands/item/update.js.map +1 -0
  412. package/dist/commands/item/upsert.d.ts +105 -0
  413. package/dist/commands/item/upsert.d.ts.map +1 -0
  414. package/dist/commands/item/upsert.js +998 -0
  415. package/dist/commands/item/upsert.js.map +1 -0
  416. package/dist/commands/parse-argv.d.ts +20 -0
  417. package/dist/commands/parse-argv.d.ts.map +1 -0
  418. package/dist/commands/parse-argv.js +40 -0
  419. package/dist/commands/parse-argv.js.map +1 -0
  420. package/dist/commands/raw/index.d.ts +23 -0
  421. package/dist/commands/raw/index.d.ts.map +1 -0
  422. package/dist/commands/raw/index.js +416 -0
  423. package/dist/commands/raw/index.js.map +1 -0
  424. package/dist/commands/run-by-id-lookup.d.ts +72 -0
  425. package/dist/commands/run-by-id-lookup.d.ts.map +1 -0
  426. package/dist/commands/run-by-id-lookup.js +58 -0
  427. package/dist/commands/run-by-id-lookup.js.map +1 -0
  428. package/dist/commands/schema/index.d.ts +104 -0
  429. package/dist/commands/schema/index.d.ts.map +1 -0
  430. package/dist/commands/schema/index.js +183 -0
  431. package/dist/commands/schema/index.js.map +1 -0
  432. package/dist/commands/types.d.ts +66 -0
  433. package/dist/commands/types.d.ts.map +1 -0
  434. package/dist/commands/types.js +15 -0
  435. package/dist/commands/types.js.map +1 -0
  436. package/dist/commands/update/body-source.d.ts +38 -0
  437. package/dist/commands/update/body-source.d.ts.map +1 -0
  438. package/dist/commands/update/body-source.js +80 -0
  439. package/dist/commands/update/body-source.js.map +1 -0
  440. package/dist/commands/update/clear-all.d.ts +67 -0
  441. package/dist/commands/update/clear-all.d.ts.map +1 -0
  442. package/dist/commands/update/clear-all.js +281 -0
  443. package/dist/commands/update/clear-all.js.map +1 -0
  444. package/dist/commands/update/create.d.ts +51 -0
  445. package/dist/commands/update/create.d.ts.map +1 -0
  446. package/dist/commands/update/create.js +167 -0
  447. package/dist/commands/update/create.js.map +1 -0
  448. package/dist/commands/update/delete.d.ts +53 -0
  449. package/dist/commands/update/delete.d.ts.map +1 -0
  450. package/dist/commands/update/delete.js +148 -0
  451. package/dist/commands/update/delete.js.map +1 -0
  452. package/dist/commands/update/edit.d.ts +37 -0
  453. package/dist/commands/update/edit.d.ts.map +1 -0
  454. package/dist/commands/update/edit.js +129 -0
  455. package/dist/commands/update/edit.js.map +1 -0
  456. package/dist/commands/update/get.d.ts +37 -0
  457. package/dist/commands/update/get.d.ts.map +1 -0
  458. package/dist/commands/update/get.js +92 -0
  459. package/dist/commands/update/get.js.map +1 -0
  460. package/dist/commands/update/like.d.ts +17 -0
  461. package/dist/commands/update/like.d.ts.map +1 -0
  462. package/dist/commands/update/like.js +23 -0
  463. package/dist/commands/update/like.js.map +1 -0
  464. package/dist/commands/update/list.d.ts +58 -0
  465. package/dist/commands/update/list.d.ts.map +1 -0
  466. package/dist/commands/update/list.js +322 -0
  467. package/dist/commands/update/list.js.map +1 -0
  468. package/dist/commands/update/pin.d.ts +17 -0
  469. package/dist/commands/update/pin.d.ts.map +1 -0
  470. package/dist/commands/update/pin.js +23 -0
  471. package/dist/commands/update/pin.js.map +1 -0
  472. package/dist/commands/update/reply.d.ts +47 -0
  473. package/dist/commands/update/reply.d.ts.map +1 -0
  474. package/dist/commands/update/reply.js +149 -0
  475. package/dist/commands/update/reply.js.map +1 -0
  476. package/dist/commands/update/toggle.d.ts +70 -0
  477. package/dist/commands/update/toggle.d.ts.map +1 -0
  478. package/dist/commands/update/toggle.js +118 -0
  479. package/dist/commands/update/toggle.js.map +1 -0
  480. package/dist/commands/update/unlike.d.ts +17 -0
  481. package/dist/commands/update/unlike.d.ts.map +1 -0
  482. package/dist/commands/update/unlike.js +22 -0
  483. package/dist/commands/update/unlike.js.map +1 -0
  484. package/dist/commands/update/unpin.d.ts +17 -0
  485. package/dist/commands/update/unpin.d.ts.map +1 -0
  486. package/dist/commands/update/unpin.js +21 -0
  487. package/dist/commands/update/unpin.js.map +1 -0
  488. package/dist/commands/user/get.d.ts +31 -0
  489. package/dist/commands/user/get.d.ts.map +1 -0
  490. package/dist/commands/user/get.js +81 -0
  491. package/dist/commands/user/get.js.map +1 -0
  492. package/dist/commands/user/list.d.ts +61 -0
  493. package/dist/commands/user/list.d.ts.map +1 -0
  494. package/dist/commands/user/list.js +148 -0
  495. package/dist/commands/user/list.js.map +1 -0
  496. package/dist/commands/user/me.d.ts +17 -0
  497. package/dist/commands/user/me.d.ts.map +1 -0
  498. package/dist/commands/user/me.js +49 -0
  499. package/dist/commands/user/me.js.map +1 -0
  500. package/dist/commands/workspace/add-users.d.ts +76 -0
  501. package/dist/commands/workspace/add-users.d.ts.map +1 -0
  502. package/dist/commands/workspace/add-users.js +154 -0
  503. package/dist/commands/workspace/add-users.js.map +1 -0
  504. package/dist/commands/workspace/create.d.ts +59 -0
  505. package/dist/commands/workspace/create.d.ts.map +1 -0
  506. package/dist/commands/workspace/create.js +163 -0
  507. package/dist/commands/workspace/create.js.map +1 -0
  508. package/dist/commands/workspace/delete.d.ts +67 -0
  509. package/dist/commands/workspace/delete.d.ts.map +1 -0
  510. package/dist/commands/workspace/delete.js +182 -0
  511. package/dist/commands/workspace/delete.js.map +1 -0
  512. package/dist/commands/workspace/folders.d.ts +40 -0
  513. package/dist/commands/workspace/folders.d.ts.map +1 -0
  514. package/dist/commands/workspace/folders.js +124 -0
  515. package/dist/commands/workspace/folders.js.map +1 -0
  516. package/dist/commands/workspace/get.d.ts +35 -0
  517. package/dist/commands/workspace/get.d.ts.map +1 -0
  518. package/dist/commands/workspace/get.js +62 -0
  519. package/dist/commands/workspace/get.js.map +1 -0
  520. package/dist/commands/workspace/list.d.ts +57 -0
  521. package/dist/commands/workspace/list.d.ts.map +1 -0
  522. package/dist/commands/workspace/list.js +125 -0
  523. package/dist/commands/workspace/list.js.map +1 -0
  524. package/dist/commands/workspace/remove-users.d.ts +47 -0
  525. package/dist/commands/workspace/remove-users.d.ts.map +1 -0
  526. package/dist/commands/workspace/remove-users.js +122 -0
  527. package/dist/commands/workspace/remove-users.js.map +1 -0
  528. package/dist/commands/workspace/update.d.ts +68 -0
  529. package/dist/commands/workspace/update.d.ts.map +1 -0
  530. package/dist/commands/workspace/update.js +237 -0
  531. package/dist/commands/workspace/update.js.map +1 -0
  532. package/dist/config/load.d.ts +33 -0
  533. package/dist/config/load.d.ts.map +1 -0
  534. package/dist/config/load.js +81 -0
  535. package/dist/config/load.js.map +1 -0
  536. package/dist/index.d.ts +3 -0
  537. package/dist/index.d.ts.map +1 -0
  538. package/dist/index.js +4 -0
  539. package/dist/index.js.map +1 -0
  540. package/dist/types/global-flags.d.ts +69 -0
  541. package/dist/types/global-flags.d.ts.map +1 -0
  542. package/dist/types/global-flags.js +170 -0
  543. package/dist/types/global-flags.js.map +1 -0
  544. package/dist/types/ids.d.ts +38 -0
  545. package/dist/types/ids.d.ts.map +1 -0
  546. package/dist/types/ids.js +51 -0
  547. package/dist/types/ids.js.map +1 -0
  548. package/dist/types/json.d.ts +60 -0
  549. package/dist/types/json.d.ts.map +1 -0
  550. package/dist/types/json.js +33 -0
  551. package/dist/types/json.js.map +1 -0
  552. package/dist/utils/errors.d.ts +121 -0
  553. package/dist/utils/errors.d.ts.map +1 -0
  554. package/dist/utils/errors.js +264 -0
  555. package/dist/utils/errors.js.map +1 -0
  556. package/dist/utils/logger.d.ts +39 -0
  557. package/dist/utils/logger.d.ts.map +1 -0
  558. package/dist/utils/logger.js +49 -0
  559. package/dist/utils/logger.js.map +1 -0
  560. package/dist/utils/output/envelope.d.ts +140 -0
  561. package/dist/utils/output/envelope.d.ts.map +1 -0
  562. package/dist/utils/output/envelope.js +120 -0
  563. package/dist/utils/output/envelope.js.map +1 -0
  564. package/dist/utils/output/json.d.ts +10 -0
  565. package/dist/utils/output/json.d.ts.map +1 -0
  566. package/dist/utils/output/json.js +12 -0
  567. package/dist/utils/output/json.js.map +1 -0
  568. package/dist/utils/output/ndjson.d.ts +92 -0
  569. package/dist/utils/output/ndjson.d.ts.map +1 -0
  570. package/dist/utils/output/ndjson.js +33 -0
  571. package/dist/utils/output/ndjson.js.map +1 -0
  572. package/dist/utils/output/select.d.ts +22 -0
  573. package/dist/utils/output/select.d.ts.map +1 -0
  574. package/dist/utils/output/select.js +47 -0
  575. package/dist/utils/output/select.js.map +1 -0
  576. package/dist/utils/output/table.d.ts +32 -0
  577. package/dist/utils/output/table.d.ts.map +1 -0
  578. package/dist/utils/output/table.js +133 -0
  579. package/dist/utils/output/table.js.map +1 -0
  580. package/dist/utils/output/text.d.ts +5 -0
  581. package/dist/utils/output/text.d.ts.map +1 -0
  582. package/dist/utils/output/text.js +32 -0
  583. package/dist/utils/output/text.js.map +1 -0
  584. package/dist/utils/parse-boundary.d.ts +53 -0
  585. package/dist/utils/parse-boundary.d.ts.map +1 -0
  586. package/dist/utils/parse-boundary.js +62 -0
  587. package/dist/utils/parse-boundary.js.map +1 -0
  588. package/dist/utils/redact.d.ts +54 -0
  589. package/dist/utils/redact.d.ts.map +1 -0
  590. package/dist/utils/redact.js +154 -0
  591. package/dist/utils/redact.js.map +1 -0
  592. package/dist/utils/request-id.d.ts +17 -0
  593. package/dist/utils/request-id.d.ts.map +1 -0
  594. package/dist/utils/request-id.js +26 -0
  595. package/dist/utils/request-id.js.map +1 -0
  596. package/package.json +87 -0
@@ -0,0 +1,490 @@
1
+ /**
2
+ * Pure date-resolution helpers for the `date` column-value
3
+ * translator (`cli-design.md` §5.3 step 3 + the
4
+ * "Relative dates and timezone" subsection).
5
+ *
6
+ * Two surfaces:
7
+ *
8
+ * - `parseDateInput` — accepts every input shape `cli-design.md`
9
+ * §5.3 step 3 enumerates: ISO date (`YYYY-MM-DD`), ISO date+time
10
+ * (`YYYY-MM-DDTHH:MM[:SS]`), and the relative-token set
11
+ * (`today`, `tomorrow`, `+Nd`, `-Nw`, `+Nh`). Returns the
12
+ * Monday wire payload (`{date}` or `{date, time}`) plus the
13
+ * `resolvedFrom` echo `cli-design.md` §6.4 puts on the
14
+ * dry-run envelope.
15
+ * - `formatNowInTimezone` — used internally to format an
16
+ * instant in an IANA timezone for the `resolvedFrom.now`
17
+ * echo. Exported because the dry-run engine (M5a follow-up)
18
+ * will need the same shape for non-date columns' `now`
19
+ * timestamp.
20
+ *
21
+ * **Why a separate module.** column-values.ts owns translator
22
+ * *dispatch* — the switch over WritableColumnType, the
23
+ * mutation-selection helper, and the ApiError builder. The date
24
+ * translator's machinery is ~150 LOC of regex + Intl
25
+ * gymnastics with no dispatch concerns. Splitting keeps
26
+ * column-values.ts at one screen of dispatch logic and the date
27
+ * machinery isolated for unit testing.
28
+ *
29
+ * **No external dep.** Uses only `Intl.DateTimeFormat` for tz
30
+ * formatting + `Date` arithmetic. The CLI rules forbid pulling
31
+ * in luxon / date-fns / dayjs for stdlib-doable work; Node 22
32
+ * ships full ICU and `longOffset` tz formatting, which covers
33
+ * everything `cli-design.md` §5.3 needs.
34
+ */
35
+ import { UsageError } from '../utils/errors.js';
36
+ /**
37
+ * Parses a `date` column input per cli-design §5.3 step 3.
38
+ *
39
+ * Accepted inputs:
40
+ * - **ISO date** `YYYY-MM-DD` → `{date}` payload, no
41
+ * resolution echo.
42
+ * - **ISO date+time** `YYYY-MM-DDTHH:MM` or
43
+ * `YYYY-MM-DDTHH:MM:SS` → `{date, time}` payload, no
44
+ * resolution echo. Seconds default to `:00`.
45
+ * - **Relative tokens**:
46
+ * - `today` → today's date in `ctx.timezone`.
47
+ * - `tomorrow` → today + 1 day in `ctx.timezone`.
48
+ * - `+Nd` / `-Nd` (days), `+Nw` / `-Nw` (weeks) →
49
+ * date-only output, calendar arithmetic in `ctx.timezone`.
50
+ * - `+Nh` / `-Nh` (hours) → date+time output, instant
51
+ * arithmetic (UTC offset preserved across DST per
52
+ * industry standard — `+24h` from a GMT instant lands
53
+ * at the same UTC instant +24h, which may shift the
54
+ * wall-clock time by an hour on a DST boundary day).
55
+ *
56
+ * Throws `usage_error` with a structured `details` shape for
57
+ * unrecognised input. The error message lists the supported
58
+ * forms so an agent's debug log shows the right shape to
59
+ * paste-and-edit.
60
+ *
61
+ * @param raw - The raw user-supplied value (post-`--set`
62
+ * parsing).
63
+ * @param columnId - Column ID for error messages.
64
+ * @param ctx - Resolution context. Defaults to system clock +
65
+ * system tz when omitted; M5b's command layer plumbs the
66
+ * `MONDAY_TIMEZONE` env override.
67
+ */
68
+ export const parseDateInput = (raw, columnId, ctx = {}) => {
69
+ const trimmed = raw.trim();
70
+ if (trimmed.length === 0) {
71
+ throw unrecognisedDateInputError(columnId, raw);
72
+ }
73
+ // Try the explicit shapes first — they're cheaper and more
74
+ // common for agent-driven workflows that already have an
75
+ // absolute due date in hand.
76
+ const isoDate = parseIsoDate(trimmed);
77
+ if (isoDate !== null) {
78
+ return { payload: { date: isoDate }, resolvedFrom: null };
79
+ }
80
+ const isoDateTime = parseIsoDateTime(trimmed);
81
+ if (isoDateTime !== null) {
82
+ return { payload: isoDateTime, resolvedFrom: null };
83
+ }
84
+ // Lower-case relative tokens — `Today`, `TOMORROW`, `+3D`
85
+ // all resolve identically. Case-fold here, not in the input
86
+ // (the resolvedFrom echo carries `raw` verbatim so the
87
+ // dry-run output shows what the agent typed).
88
+ const relative = parseRelative(trimmed.toLowerCase(), raw, columnId, ctx);
89
+ if (relative !== null) {
90
+ return relative;
91
+ }
92
+ throw unrecognisedDateInputError(columnId, raw);
93
+ };
94
+ /**
95
+ * Validates `YYYY-MM-DD` and returns the literal string when
96
+ * it represents a real calendar date. Returns `null` when the
97
+ * shape doesn't match or the date is impossible (e.g.
98
+ * `2026-02-30`, `2026-13-01`).
99
+ */
100
+ const parseIsoDate = (raw) => {
101
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/u.exec(raw);
102
+ if (match === null)
103
+ return null;
104
+ const [, yStr, mStr, dStr] = match;
105
+ // The regex captures fix the array shape, but TS's regex
106
+ // typings don't narrow the tuple — the explicit guard keeps
107
+ // noUncheckedIndexedAccess happy without an `as const` cast.
108
+ /* c8 ignore next 3 — defensive: regex captures three groups,
109
+ so all three are always defined post-match. */
110
+ if (yStr === undefined || mStr === undefined || dStr === undefined) {
111
+ return null;
112
+ }
113
+ const y = Number(yStr);
114
+ const m = Number(mStr);
115
+ const d = Number(dStr);
116
+ if (!isCalendarDate(y, m, d))
117
+ return null;
118
+ return `${yStr}-${mStr}-${dStr}`;
119
+ };
120
+ /**
121
+ * Validates `YYYY-MM-DDTHH:MM` or `YYYY-MM-DDTHH:MM:SS` and
122
+ * returns the date+time payload (with `time` always
123
+ * `HH:MM:SS`, seconds defaulting to `:00` when omitted).
124
+ * Returns `null` when the shape or values are invalid.
125
+ *
126
+ * Does NOT accept a `Z` or offset suffix — the contract per
127
+ * cli-design §5.3 line 725 is the literal local time the
128
+ * column should display, not a UTC instant. An agent that
129
+ * needs UTC submits `2026-04-29T14:30:00` after converting.
130
+ */
131
+ const parseIsoDateTime = (raw) => {
132
+ const match = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/u.exec(raw);
133
+ if (match === null)
134
+ return null;
135
+ const [, yStr, mStr, dStr, hStr, minStr, secStr] = match;
136
+ /* c8 ignore next 5 — defensive: required regex groups are
137
+ always defined post-match. The optional seconds group
138
+ (`secStr`) genuinely can be undefined and is handled below. */
139
+ if (yStr === undefined || mStr === undefined || dStr === undefined ||
140
+ hStr === undefined || minStr === undefined) {
141
+ return null;
142
+ }
143
+ const y = Number(yStr);
144
+ const m = Number(mStr);
145
+ const d = Number(dStr);
146
+ const h = Number(hStr);
147
+ const min = Number(minStr);
148
+ const s = secStr === undefined ? 0 : Number(secStr);
149
+ if (!isCalendarDate(y, m, d))
150
+ return null;
151
+ if (h < 0 || h > 23 || min < 0 || min > 59 || s < 0 || s > 59)
152
+ return null;
153
+ const sec = secStr ?? '00';
154
+ return {
155
+ date: `${yStr}-${mStr}-${dStr}`,
156
+ time: `${hStr}:${minStr}:${sec}`,
157
+ };
158
+ };
159
+ /**
160
+ * Validates that a year/month/day triple represents a real
161
+ * calendar date. Catches `2026-02-30`, `2026-13-01`,
162
+ * `2026-04-31`. Round-trips through `setUTCFullYear` — `Date.UTC`
163
+ * alone maps two-digit years 0-99 onto 1900-1999, so a literal
164
+ * `0001-01-01` would land at `1901-01-01` and round-trip past
165
+ * the equality check incorrectly. `setUTCFullYear` accepts the
166
+ * literal year so pre-1900 inputs validate honestly. The
167
+ * translator's contract is "produce the documented wire shape,
168
+ * let Monday reject" — Monday rejects ancient dates as
169
+ * `validation_failed` and the CLI shouldn't pre-empt that
170
+ * decision with a silent local conversion. Codex review pass-1
171
+ * finding F2.
172
+ */
173
+ const isCalendarDate = (y, m, d) => {
174
+ if (m < 1 || m > 12 || d < 1 || d > 31)
175
+ return false;
176
+ const dt = new Date(0);
177
+ dt.setUTCFullYear(y, m - 1, d);
178
+ return (dt.getUTCFullYear() === y &&
179
+ dt.getUTCMonth() === m - 1 &&
180
+ dt.getUTCDate() === d);
181
+ };
182
+ /**
183
+ * Resolves a relative token (`today`, `tomorrow`, `+3d`,
184
+ * `-1w`, `+2h`) against the resolution context. Returns
185
+ * `null` when the input doesn't match any relative token shape
186
+ * (the caller falls through to the unrecognised-input error).
187
+ *
188
+ * @param normalised - The lowercased input (`+3d`, `today`).
189
+ * @param verbatim - The original input — preserved in
190
+ * `resolvedFrom.input` so the dry-run output shows what the
191
+ * agent typed, not the lowercased form.
192
+ * @param columnId - Column ID, threaded through to
193
+ * `outOfRangeRelativeOffsetError` so out-of-bound errors
194
+ * carry `column_id` in details (Codex review pass-2 finding).
195
+ */
196
+ const parseRelative = (normalised, verbatim, columnId, ctx) => {
197
+ const now = (ctx.now ?? defaultNow)();
198
+ const timezone = ctx.timezone ?? defaultTimezone();
199
+ // Word forms first — the exact-match path is faster and
200
+ // the regex below would also match `to3d` (it doesn't, but
201
+ // the assertion is loud).
202
+ if (normalised === 'today') {
203
+ return resolveDateOnly(now, 0, timezone, verbatim);
204
+ }
205
+ if (normalised === 'tomorrow') {
206
+ return resolveDateOnly(now, 1, timezone, verbatim);
207
+ }
208
+ // +Nd / -Nd / +Nw / -Nw — date-only output (calendar
209
+ // arithmetic in tz, no time component).
210
+ const dayWeek = /^([+-])(\d+)([dw])$/u.exec(normalised);
211
+ if (dayWeek !== null) {
212
+ const [, signStr, amountStr, unit] = dayWeek;
213
+ /* c8 ignore next 3 — required regex groups always defined. */
214
+ if (signStr === undefined || amountStr === undefined || unit === undefined) {
215
+ return null;
216
+ }
217
+ const amount = Number(amountStr);
218
+ if (!Number.isSafeInteger(amount))
219
+ return null;
220
+ const days = amount * (unit === 'w' ? 7 : 1);
221
+ if (days > MAX_RELATIVE_DAYS) {
222
+ throw outOfRangeRelativeOffsetError(columnId, verbatim, 'days', days, MAX_RELATIVE_DAYS);
223
+ }
224
+ const signed = signStr === '-' ? -days : days;
225
+ return resolveDateOnly(now, signed, timezone, verbatim);
226
+ }
227
+ // +Nh / -Nh — date+time output (instant arithmetic, UTC
228
+ // offset preserved). cli-design line 763 lists `+2h`
229
+ // explicitly; minutes/seconds aren't in the v0.1 grammar.
230
+ const hour = /^([+-])(\d+)h$/u.exec(normalised);
231
+ if (hour !== null) {
232
+ const [, signStr, amountStr] = hour;
233
+ /* c8 ignore next 3 — required regex groups always defined. */
234
+ if (signStr === undefined || amountStr === undefined)
235
+ return null;
236
+ const amount = Number(amountStr);
237
+ if (!Number.isSafeInteger(amount))
238
+ return null;
239
+ if (amount > MAX_RELATIVE_HOURS) {
240
+ throw outOfRangeRelativeOffsetError(columnId, verbatim, 'hours', amount, MAX_RELATIVE_HOURS);
241
+ }
242
+ const signedHours = signStr === '-' ? -amount : amount;
243
+ return resolveDateTime(now, signedHours, timezone, verbatim);
244
+ }
245
+ return null;
246
+ };
247
+ /**
248
+ * Maximum magnitude for a `+Nd` / `-Nd` / `+Nw` / `-Nw`
249
+ * relative offset, expressed in days. ~100 years covers every
250
+ * reasonable agent use case (project deadlines, retention
251
+ * windows, compliance dates) and stays well inside JavaScript's
252
+ * Date range (±100M days from epoch). Beyond this bound the
253
+ * date math would silently wrap into nonsense (`+99999999d`
254
+ * produced `{date:"0NaN-NaN-NaN"}` pre-fix). Codex review
255
+ * pass-1 finding F1.
256
+ */
257
+ const MAX_RELATIVE_DAYS = 36_500;
258
+ /**
259
+ * Maximum magnitude for a `+Nh` / `-Nh` relative offset, in
260
+ * hours. ~100 years matches MAX_RELATIVE_DAYS so the two
261
+ * grammars have a consistent bound; beyond this the
262
+ * `now.getTime() + offset` math could land outside Date range
263
+ * and throw RangeError instead of the typed UsageError the
264
+ * translator's contract promises.
265
+ */
266
+ const MAX_RELATIVE_HOURS = 876_000;
267
+ /**
268
+ * Builds the `usage_error` for a relative offset that fits in
269
+ * the safe-integer range but exceeds the translator's max
270
+ * magnitude bound. Carries the column_id + the literal input +
271
+ * the unit + the actual / max magnitudes so an agent's debug
272
+ * log shows what to clamp to without consulting Monday's
273
+ * docs. The `column_id` field matches the shape of every
274
+ * other date `usage_error` so an agent that handles one
275
+ * details payload handles them all (Codex review pass-2
276
+ * finding).
277
+ */
278
+ const outOfRangeRelativeOffsetError = (columnId, input, unit, amount, maxAmount) => new UsageError(`Date column "${columnId}" relative offset "${input}" resolves to ` +
279
+ `${amount.toString()} ${unit}, which exceeds the translator's ` +
280
+ `maximum magnitude of ${maxAmount.toString()} ${unit} (~100 ` +
281
+ `years). Use an explicit ISO date instead, or --set-raw ` +
282
+ `<col>=<json> with the literal Monday wire shape.`, {
283
+ details: {
284
+ column_id: columnId,
285
+ column_type: 'date',
286
+ raw_input: input,
287
+ unit,
288
+ amount,
289
+ max_amount: maxAmount,
290
+ hint: `example: --set ${columnId}=2126-04-29 (explicit ISO)`,
291
+ },
292
+ });
293
+ /**
294
+ * Resolves a date-only relative offset (today, tomorrow, +Nd,
295
+ * +Nw). Calendar arithmetic in the user's tz: extract today's
296
+ * y/m/d in tz, add `dayOffset` days via UTC component math,
297
+ * format as `YYYY-MM-DD`.
298
+ *
299
+ * Why this is correct across DST: we're producing a *calendar
300
+ * date*, not a UTC instant. The user's tz determines what
301
+ * "today" means; once we have y/m/d as integers, adding 1 day
302
+ * is a pure calendar operation that doesn't care about DST
303
+ * (Date.UTC component math handles month rollovers, leap
304
+ * years, and the absent ambiguity correctly).
305
+ */
306
+ const resolveDateOnly = (now, dayOffset, timezone, input) => {
307
+ const today = formatYmdInTimezone(now, timezone);
308
+ const offsetMs = Date.UTC(today.year, today.month - 1, today.day + dayOffset);
309
+ const target = new Date(offsetMs);
310
+ const y = target.getUTCFullYear();
311
+ const m = String(target.getUTCMonth() + 1).padStart(2, '0');
312
+ const d = String(target.getUTCDate()).padStart(2, '0');
313
+ return {
314
+ payload: { date: `${String(y).padStart(4, '0')}-${m}-${d}` },
315
+ resolvedFrom: {
316
+ input,
317
+ timezone,
318
+ now: formatNowInTimezone(now, timezone),
319
+ },
320
+ };
321
+ };
322
+ /**
323
+ * Resolves an hour-granularity relative offset (+Nh, -Nh).
324
+ * Instant arithmetic — N hours in absolute time — then
325
+ * format the result in the user's tz to extract date + time.
326
+ * Across a DST boundary this means `+24h` from a GMT instant
327
+ * may shift the wall-clock hour by 1 (industry standard;
328
+ * matches luxon / date-fns-tz / Temporal `Instant.add`
329
+ * semantics).
330
+ */
331
+ const resolveDateTime = (now, hourOffset, timezone, input) => {
332
+ const targetMs = now.getTime() + hourOffset * 3_600_000;
333
+ const target = new Date(targetMs);
334
+ const parts = formatYmdHmsInTimezone(target, timezone);
335
+ const date = `${String(parts.year).padStart(4, '0')}-${pad2(parts.month)}-${pad2(parts.day)}`;
336
+ const time = `${pad2(parts.hour)}:${pad2(parts.minute)}:${pad2(parts.second)}`;
337
+ return {
338
+ payload: { date, time },
339
+ resolvedFrom: {
340
+ input,
341
+ timezone,
342
+ now: formatNowInTimezone(now, timezone),
343
+ },
344
+ };
345
+ };
346
+ const pad2 = (n) => String(n).padStart(2, '0');
347
+ /**
348
+ * Extracts year/month/day for an instant in an IANA timezone
349
+ * via Intl.DateTimeFormat. Returns numbers (not strings) so
350
+ * caller can do component arithmetic without parseInt clutter.
351
+ *
352
+ * Intl reports `hour: '24'` for midnight in some locales; we
353
+ * use 'en-US' explicitly + `hourCycle: 'h23'` (downstream)
354
+ * to get 0-23, which avoids the bug. For the date-only
355
+ * extraction here, hour isn't read — but the formatter is
356
+ * shared with formatYmdHmsInTimezone, which does.
357
+ */
358
+ const formatYmdInTimezone = (instant, timezone) => {
359
+ const parts = formatYmdHmsInTimezone(instant, timezone);
360
+ return { year: parts.year, month: parts.month, day: parts.day };
361
+ };
362
+ const formatYmdHmsInTimezone = (instant, timezone) => {
363
+ const fmt = new Intl.DateTimeFormat('en-US', {
364
+ timeZone: timezone,
365
+ hourCycle: 'h23',
366
+ year: 'numeric',
367
+ month: '2-digit',
368
+ day: '2-digit',
369
+ hour: '2-digit',
370
+ minute: '2-digit',
371
+ second: '2-digit',
372
+ });
373
+ const parts = fmt.formatToParts(instant);
374
+ const get = (type) => {
375
+ const part = parts.find((p) => p.type === type);
376
+ /* c8 ignore next 7 — defensive: every type the formatter
377
+ was configured to emit is always present in the output;
378
+ this guard exists for noUncheckedIndexedAccess narrowing. */
379
+ if (part === undefined) {
380
+ throw new Error(`Intl.DateTimeFormat did not emit expected part "${type}" for tz "${timezone}"`);
381
+ }
382
+ return Number(part.value);
383
+ };
384
+ return {
385
+ year: get('year'),
386
+ month: get('month'),
387
+ day: get('day'),
388
+ hour: get('hour'),
389
+ minute: get('minute'),
390
+ second: get('second'),
391
+ };
392
+ };
393
+ /**
394
+ * Formats an instant as a local-time ISO string with UTC
395
+ * offset, e.g. `2026-04-25T14:00:00+01:00`. cli-design §5.3
396
+ * line 786 sample pins this exact shape.
397
+ *
398
+ * Uses Intl's `longOffset` token (Node 22+ ICU full data) for
399
+ * the offset suffix; falls back to `+00:00` if the runtime's
400
+ * Intl reports an unparseable form. Exported for the dry-run
401
+ * engine which uses the same formatter for non-date columns'
402
+ * `now` echo.
403
+ */
404
+ export const formatNowInTimezone = (instant, timezone) => {
405
+ const parts = formatYmdHmsInTimezone(instant, timezone);
406
+ const ymd = `${String(parts.year).padStart(4, '0')}-${pad2(parts.month)}-${pad2(parts.day)}`;
407
+ const hms = `${pad2(parts.hour)}:${pad2(parts.minute)}:${pad2(parts.second)}`;
408
+ const offset = utcOffsetForTimezone(instant, timezone);
409
+ return `${ymd}T${hms}${offset}`;
410
+ };
411
+ /**
412
+ * Returns the UTC offset of an instant in an IANA timezone as
413
+ * `±HH:MM`. Uses Intl's `longOffset` form (e.g. `GMT+01:00`)
414
+ * and trims the `GMT` prefix; the literal `GMT` (offset 0)
415
+ * comes back as plain `GMT` and is mapped to `+00:00` for
416
+ * stable formatting.
417
+ */
418
+ const utcOffsetForTimezone = (instant, timezone) => {
419
+ const fmt = new Intl.DateTimeFormat('en-US', {
420
+ timeZone: timezone,
421
+ timeZoneName: 'longOffset',
422
+ });
423
+ const parts = fmt.formatToParts(instant);
424
+ const tzName = parts.find((p) => p.type === 'timeZoneName')?.value;
425
+ /* c8 ignore next 4 — defensive: every modern Node runtime
426
+ emits a timeZoneName part when the option is set; the
427
+ fallback exists so a future ICU regression doesn't
428
+ produce a malformed envelope. */
429
+ if (tzName === undefined)
430
+ return '+00:00';
431
+ if (tzName === 'GMT')
432
+ return '+00:00';
433
+ // longOffset form is `GMT+HH:MM` or `GMT-HH:MM`.
434
+ const match = /^GMT([+-])(\d{2}):(\d{2})$/u.exec(tzName);
435
+ /* c8 ignore next 2 — defensive: longOffset emits this exact
436
+ shape on Node 22+ ICU; fallback handles ICU edge cases. */
437
+ if (match === null)
438
+ return '+00:00';
439
+ // Captures are guaranteed defined post-match for this regex
440
+ // (no optional groups). The non-null assertions satisfy
441
+ // noUncheckedIndexedAccess without adding `?? '...'` defaults
442
+ // that would inflate branch count for unreachable cases.
443
+ const sign = match[1];
444
+ const hh = match[2];
445
+ const mm = match[3];
446
+ /* c8 ignore next 4 — defensive: regex captures all three
447
+ groups by construction. The guard exists for type-narrowing
448
+ under noUncheckedIndexedAccess; it cannot fire at runtime. */
449
+ if (sign === undefined || hh === undefined || mm === undefined) {
450
+ return '+00:00';
451
+ }
452
+ return `${sign}${hh}:${mm}`;
453
+ };
454
+ const defaultNow = () => new Date();
455
+ /**
456
+ * System default IANA timezone via Intl.DateTimeFormat. Falls
457
+ * back to `UTC` if the runtime's Intl returns an empty string
458
+ * (extremely rare on modern Node, but the contract is
459
+ * "default to system tz" — UTC is the sane fallback when
460
+ * "system tz" is genuinely unknown).
461
+ */
462
+ const defaultTimezone = () => {
463
+ const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
464
+ /* c8 ignore next 2 — defensive fallback when Intl returns an
465
+ empty string. Full-ICU Node 22 always populates the
466
+ timeZone field; the fallback keeps the contract "default
467
+ to a real tz, never throw on resolution". */
468
+ if (tz.length === 0)
469
+ return 'UTC';
470
+ return tz;
471
+ };
472
+ /**
473
+ * Builds the `usage_error` for inputs that don't match any of
474
+ * the cli-design §5.3 step 3 forms. The hint enumerates the
475
+ * full grammar so an agent's debug log shows every supported
476
+ * form without consulting docs.
477
+ */
478
+ const unrecognisedDateInputError = (columnId, raw) => new UsageError(`Date column "${columnId}" got input "${raw}" that does not match ` +
479
+ `any supported form. Supported: ` +
480
+ `ISO date "YYYY-MM-DD", ISO date+time "YYYY-MM-DDTHH:MM[:SS]", ` +
481
+ `or a relative token (today, tomorrow, +Nd, -Nw, +Nh).`, {
482
+ details: {
483
+ column_id: columnId,
484
+ column_type: 'date',
485
+ raw_input: raw,
486
+ hint: 'examples: --set due=2026-05-01, --set due=2026-05-01T14:30, ' +
487
+ '--set due=tomorrow, --set due=+3d, --set due=+2h',
488
+ },
489
+ });
490
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.js","sourceRoot":"","sources":["../../src/api/dates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAyEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,GAAW,EACX,QAAgB,EAChB,MAA6B,EAAE,EACd,EAAE;IACnB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,0BAA0B,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,2DAA2D;IAC3D,yDAAyD;IACzD,6BAA6B;IAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IACD,0DAA0D;IAC1D,4DAA4D;IAC5D,uDAAuD;IACvD,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC1E,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,0BAA0B,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,YAAY,GAAG,CAAC,GAAW,EAAiB,EAAE;IAClD,MAAM,KAAK,GAAG,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IACnC,yDAAyD;IACzD,4DAA4D;IAC5D,6DAA6D;IAC7D;qDACiD;IACjD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACnC,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAsB,EAAE;IAC3D,MAAM,KAAK,GAAG,yDAAyD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IACzD;;qEAEiE;IACjE,IACE,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;QAC9D,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAC1C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IAC3E,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC;IAC3B,OAAO;QACL,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;QAC/B,IAAI,EAAE,GAAG,IAAI,IAAI,MAAM,IAAI,GAAG,EAAE;KACjC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAW,EAAE;IAClE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IACrD,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,OAAO,CACL,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC;QAC1B,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CACtB,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,aAAa,GAAG,CACpB,UAAkB,EAClB,QAAgB,EAChB,QAAgB,EAChB,GAA0B,EACF,EAAE;IAC1B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,eAAe,EAAE,CAAC;IAEnD,wDAAwD;IACxD,2DAA2D;IAC3D,0BAA0B;IAC1B,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IACD,qDAAqD;IACrD,wCAAwC;IACxC,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC;QAC7C,8DAA8D;QAC9D,IAAI,OAAO,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,IAAI,GAAG,iBAAiB,EAAE,CAAC;YAC7B,MAAM,6BAA6B,CACjC,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,iBAAiB,CAClB,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,OAAO,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IACD,wDAAwD;IACxD,qDAAqD;IACrD,0DAA0D;IAC1D,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;QACpC,8DAA8D;QAC9D,IAAI,OAAO,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,MAAM,GAAG,kBAAkB,EAAE,CAAC;YAChC,MAAM,6BAA6B,CACjC,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,MAAM,EACN,kBAAkB,CACnB,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACvD,OAAO,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,MAAM,6BAA6B,GAAG,CACpC,QAAgB,EAChB,KAAa,EACb,IAAsB,EACtB,MAAc,EACd,SAAiB,EACL,EAAE,CACd,IAAI,UAAU,CACZ,gBAAgB,QAAQ,sBAAsB,KAAK,gBAAgB;IACjE,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,IAAI,mCAAmC;IAC/D,wBAAwB,SAAS,CAAC,QAAQ,EAAE,IAAI,IAAI,SAAS;IAC7D,yDAAyD;IACzD,kDAAkD,EACpD;IACE,OAAO,EAAE;QACP,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,MAAM;QACnB,SAAS,EAAE,KAAK;QAChB,IAAI;QACJ,MAAM;QACN,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,kBAAkB,QAAQ,4BAA4B;KAC7D;CACF,CACF,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,MAAM,eAAe,GAAG,CACtB,GAAS,EACT,SAAiB,EACjB,QAAgB,EAChB,KAAa,EACI,EAAE;IACnB,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5D,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO;QACL,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;QAC5D,YAAY,EAAE;YACZ,KAAK;YACL,QAAQ;YACR,GAAG,EAAE,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC;SACxC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,eAAe,GAAG,CACtB,GAAS,EACT,UAAkB,EAClB,QAAgB,EAChB,KAAa,EACI,EAAE;IACnB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9F,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IAC/E,OAAO;QACL,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;QACvB,YAAY,EAAE;YACZ,KAAK;YACL,QAAQ;YACR,GAAG,EAAE,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC;SACxC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAE/D;;;;;;;;;;GAUG;AACH,MAAM,mBAAmB,GAAG,CAC1B,OAAa,EACb,QAAgB,EAC8B,EAAE;IAChD,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAC7B,OAAa,EACb,QAAgB,EAQhB,EAAE;IACF,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC3C,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,IAAkC,EAAU,EAAE;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChD;;uEAE+D;QAC/D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,mDAAmD,IAAI,aAAa,QAAQ,GAAG,CAChF,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;IACF,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC;QACjB,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC;QACnB,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;QACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC;QACjB,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC;KACtB,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAa,EAAE,QAAgB,EAAU,EAAE;IAC7E,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxD,MAAM,GAAG,GACP,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACnF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IAC9E,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,GAAG,GAAG,IAAI,GAAG,GAAG,MAAM,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAG,CAAC,OAAa,EAAE,QAAgB,EAAU,EAAE;IACvE,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC3C,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,YAAY;KAC3B,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,KAAK,CAAC;IACnE;;;uCAGmC;IACnC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC1C,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC;IACtC,iDAAiD;IACjD,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD;iEAC6D;IAC7D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACpC,4DAA4D;IAC5D,wDAAwD;IACxD,8DAA8D;IAC9D,yDAAyD;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB;;oEAEgE;IAChE,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC/D,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,GAAS,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,GAAW,EAAE;IACnC,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IAC5D;;;mDAG+C;IAC/C,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,0BAA0B,GAAG,CACjC,QAAgB,EAChB,GAAW,EACC,EAAE,CACd,IAAI,UAAU,CACZ,gBAAgB,QAAQ,gBAAgB,GAAG,wBAAwB;IACjE,iCAAiC;IACjC,gEAAgE;IAChE,uDAAuD,EACzD;IACE,OAAO,EAAE;QACP,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,MAAM;QACnB,SAAS,EAAE,GAAG;QACd,IAAI,EACF,8DAA8D;YAC9D,kDAAkD;KACrD;CACF,CACF,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Destructive-verb confirmation gate (`v0.2-plan.md` §20 R29).
3
+ *
4
+ * Five sites pre-lift duplicated the same `parseGlobalFlags + if
5
+ * (!dryRun && !yes) throw ConfirmationRequiredError` block:
6
+ *
7
+ * - `src/commands/item/archive.ts` (M10)
8
+ * - `src/commands/item/delete.ts` (M10)
9
+ * - `src/commands/update/delete.ts` (M13)
10
+ * - `src/commands/update/clear-all.ts` (M13)
11
+ * - `src/commands/workspace/delete.ts` (M14)
12
+ *
13
+ * Each block was ~17 lines, diverging only in the verb name, the
14
+ * target id (`item_id` / `update_id` / `workspace_id`), the action
15
+ * phrase ("archive the item" / "delete every update on the item"),
16
+ * and the verb-specific hint text. M14's workspace delete arrived
17
+ * as the 5th consumer; the lift fired per the §20 trigger
18
+ * (≥3 sites diverging only in parameters).
19
+ *
20
+ * **Load-bearing invariant** (Codex M10 round-1 P2): the gate must
21
+ * fire BEFORE `resolveClient` so that a missing
22
+ * `MONDAY_API_TOKEN` doesn't mask `confirmation_required` as
23
+ * `config_error`. Agents key off `error.code` and the destructive-
24
+ * gate signal must be unconditional. The helper preserves this
25
+ * by taking `globalFlags` as already-parsed — callers MUST run
26
+ * `parseGlobalFlags(program.opts(), ctx.env)` (a synchronous
27
+ * argv-only operation) before invoking the gate, NOT `resolveClient`
28
+ * (which can throw `config_error` on a missing token). Passing
29
+ * already-parsed flags rather than re-parsing them inside the
30
+ * helper makes the ordering trap visible at the call site.
31
+ *
32
+ * Pure refactor — every existing test passes byte-identical pre-
33
+ * lift vs post-lift. Message templates are reproduced verbatim
34
+ * from the inline blocks. cli-design §6.5 documents the per-code
35
+ * `details` schema; this helper produces the canonical shape:
36
+ * `{<detailKey>: target, hint}`.
37
+ */
38
+ import type { GlobalFlags } from '../types/global-flags.js';
39
+ export interface EnforceDestructiveGateInputs {
40
+ /**
41
+ * Already-parsed global flags. Forces the call site to invoke
42
+ * `parseGlobalFlags` BEFORE `resolveClient` so the gate-before-
43
+ * resolveClient ordering invariant (M10 round-1 P2) is visible
44
+ * in the type signature itself, not buried in helper-internal
45
+ * code.
46
+ */
47
+ readonly globalFlags: GlobalFlags;
48
+ /**
49
+ * CLI verb name as it appears in the user's invocation, e.g.
50
+ * `'item archive'` / `'workspace delete'` / `'update clear-all'`.
51
+ * Used verbatim in the leading `monday <verb> <target>` portion
52
+ * of the error message.
53
+ */
54
+ readonly verb: string;
55
+ /**
56
+ * The target resource id (or other identifier). Appears
57
+ * verbatim in the message after `monday <verb>` AND lands in
58
+ * `details.<detailKey>` so agents can extract it
59
+ * programmatically.
60
+ */
61
+ readonly target: string;
62
+ /**
63
+ * Snake_case detail key matching the resource (`item_id`,
64
+ * `update_id`, `workspace_id`). cli-design §6.5 pins the
65
+ * per-code shape; agents read `error.details.<detailKey>` to
66
+ * extract the target id without re-parsing argv.
67
+ */
68
+ readonly detailKey: string;
69
+ /**
70
+ * Optional extra `details.*` fields merged into the
71
+ * `confirmation_required` envelope alongside `[detailKey]: target`
72
+ * + `hint`. Used by verbs whose wire signature is two-tuple — M16
73
+ * `board column-delete` echoes `{board_id, column_id, hint}` per
74
+ * cli-design §6.5 single-target shape (the wire signature carries
75
+ * both ids); M17 `board group-archive` / `group-delete` will use
76
+ * the same shape. `[detailKey]: target` always wins on key
77
+ * collision (extraDetails is merged FIRST).
78
+ */
79
+ readonly extraDetails?: Readonly<Record<string, unknown>>;
80
+ /**
81
+ * The action phrase that follows `would` in the message body.
82
+ * Verb-specific:
83
+ * - `'archive the item'` (item archive)
84
+ * - `'delete the item'` (item delete)
85
+ * - `'delete the update'` (update delete)
86
+ * - `'delete every update on the item'` (update clear-all)
87
+ * - `'delete the workspace'` (workspace delete)
88
+ */
89
+ readonly action: string;
90
+ /**
91
+ * Verb-specific hint included in `details.hint`. Explains the
92
+ * reversibility window (Monday's 30-day trash for items /
93
+ * updates / workspaces) and any verb-specific recovery story
94
+ * (recreate via `monday workspace create`, etc.).
95
+ */
96
+ readonly hint: string;
97
+ /**
98
+ * Optional override for the "or --dry-run to preview." trailing
99
+ * suffix. Only `update clear-all` uses this — its preview
100
+ * behaviour ("the would-delete IDs") differs enough from the
101
+ * single-target verbs to warrant explicit phrasing. Default:
102
+ * `'or --dry-run to preview.'`.
103
+ */
104
+ readonly previewSuffix?: string;
105
+ }
106
+ export declare const enforceDestructiveGate: (inputs: EnforceDestructiveGateInputs) => void;
107
+ //# sourceMappingURL=destructive-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destructive-gate.d.ts","sourceRoot":"","sources":["../../src/api/destructive-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,MAAM,WAAW,4BAA4B;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;OASG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAID,eAAO,MAAM,sBAAsB,GACjC,QAAQ,4BAA4B,KACnC,IAiBF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { ConfirmationRequiredError } from '../utils/errors.js';
2
+ const DEFAULT_PREVIEW_SUFFIX = 'or --dry-run to preview.';
3
+ export const enforceDestructiveGate = (inputs) => {
4
+ if (inputs.globalFlags.dryRun || inputs.globalFlags.yes)
5
+ return;
6
+ const previewSuffix = inputs.previewSuffix ?? DEFAULT_PREVIEW_SUFFIX;
7
+ // `extraDetails` lands FIRST so the canonical `[detailKey]: target`
8
+ // + `hint` always win on key collision. Two-tuple verbs (M16
9
+ // column-delete, M17 group-archive / group-delete) populate
10
+ // extraDetails with the secondary id (board_id paired with
11
+ // column_id / group_id) per cli-design §6.5 single-target shape.
12
+ const details = {
13
+ ...(inputs.extraDetails ?? {}),
14
+ [inputs.detailKey]: inputs.target,
15
+ hint: inputs.hint,
16
+ };
17
+ throw new ConfirmationRequiredError(`monday ${inputs.verb} ${inputs.target} would ${inputs.action}. Re-run with --yes to confirm, ${previewSuffix}`, { details });
18
+ };
19
+ //# sourceMappingURL=destructive-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destructive-gate.js","sourceRoot":"","sources":["../../src/api/destructive-gate.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAsE/D,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAE1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,MAAoC,EAC9B,EAAE;IACR,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG;QAAE,OAAO;IAChE,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACrE,oEAAoE;IACpE,6DAA6D;IAC7D,4DAA4D;IAC5D,2DAA2D;IAC3D,iEAAiE;IACjE,MAAM,OAAO,GAAG;QACd,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QAC9B,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM;QACjC,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;IACF,MAAM,IAAI,yBAAyB,CACjC,UAAU,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,MAAM,mCAAmC,aAAa,EAAE,EAC/G,EAAE,OAAO,EAAE,CACZ,CAAC;AACJ,CAAC,CAAC"}