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.
- package/CHANGELOG.md +439 -0
- package/LICENSE +21 -0
- package/README.md +431 -0
- package/dist/api/board-child-finder.d.ts +95 -0
- package/dist/api/board-child-finder.d.ts.map +1 -0
- package/dist/api/board-child-finder.js +89 -0
- package/dist/api/board-child-finder.js.map +1 -0
- package/dist/api/board-metadata.d.ts +162 -0
- package/dist/api/board-metadata.d.ts.map +1 -0
- package/dist/api/board-metadata.js +238 -0
- package/dist/api/board-metadata.js.map +1 -0
- package/dist/api/board-mutation-invalidation.d.ts +153 -0
- package/dist/api/board-mutation-invalidation.d.ts.map +1 -0
- package/dist/api/board-mutation-invalidation.js +136 -0
- package/dist/api/board-mutation-invalidation.js.map +1 -0
- package/dist/api/board-mutation-result.d.ts +97 -0
- package/dist/api/board-mutation-result.d.ts.map +1 -0
- package/dist/api/board-mutation-result.js +99 -0
- package/dist/api/board-mutation-result.js.map +1 -0
- package/dist/api/board-projection.d.ts +68 -0
- package/dist/api/board-projection.d.ts.map +1 -0
- package/dist/api/board-projection.js +79 -0
- package/dist/api/board-projection.js.map +1 -0
- package/dist/api/cache.d.ts +150 -0
- package/dist/api/cache.d.ts.map +1 -0
- package/dist/api/cache.js +418 -0
- package/dist/api/cache.js.map +1 -0
- package/dist/api/client.d.ts +162 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +205 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/column-mapping.d.ts +68 -0
- package/dist/api/column-mapping.d.ts.map +1 -0
- package/dist/api/column-mapping.js +117 -0
- package/dist/api/column-mapping.js.map +1 -0
- package/dist/api/column-mutation-result.d.ts +136 -0
- package/dist/api/column-mutation-result.d.ts.map +1 -0
- package/dist/api/column-mutation-result.js +130 -0
- package/dist/api/column-mutation-result.js.map +1 -0
- package/dist/api/column-types.d.ts +215 -0
- package/dist/api/column-types.d.ts.map +1 -0
- package/dist/api/column-types.js +195 -0
- package/dist/api/column-types.js.map +1 -0
- package/dist/api/column-values.d.ts +446 -0
- package/dist/api/column-values.d.ts.map +1 -0
- package/dist/api/column-values.js +795 -0
- package/dist/api/column-values.js.map +1 -0
- package/dist/api/columns.d.ts +205 -0
- package/dist/api/columns.d.ts.map +1 -0
- package/dist/api/columns.js +343 -0
- package/dist/api/columns.js.map +1 -0
- package/dist/api/complexity.d.ts +90 -0
- package/dist/api/complexity.d.ts.map +1 -0
- package/dist/api/complexity.js +194 -0
- package/dist/api/complexity.js.map +1 -0
- package/dist/api/dates.d.ts +150 -0
- package/dist/api/dates.d.ts.map +1 -0
- package/dist/api/dates.js +490 -0
- package/dist/api/dates.js.map +1 -0
- package/dist/api/destructive-gate.d.ts +107 -0
- package/dist/api/destructive-gate.d.ts.map +1 -0
- package/dist/api/destructive-gate.js +19 -0
- package/dist/api/destructive-gate.js.map +1 -0
- package/dist/api/dry-run.d.ts +338 -0
- package/dist/api/dry-run.d.ts.map +1 -0
- package/dist/api/dry-run.js +607 -0
- package/dist/api/dry-run.js.map +1 -0
- package/dist/api/emails.d.ts +60 -0
- package/dist/api/emails.d.ts.map +1 -0
- package/dist/api/emails.js +113 -0
- package/dist/api/emails.js.map +1 -0
- package/dist/api/errors.d.ts +82 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +434 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/filters.d.ts +198 -0
- package/dist/api/filters.d.ts.map +1 -0
- package/dist/api/filters.js +328 -0
- package/dist/api/filters.js.map +1 -0
- package/dist/api/group-color.d.ts +33 -0
- package/dist/api/group-color.d.ts.map +1 -0
- package/dist/api/group-color.js +80 -0
- package/dist/api/group-color.js.map +1 -0
- package/dist/api/group-mutation-result.d.ts +150 -0
- package/dist/api/group-mutation-result.d.ts.map +1 -0
- package/dist/api/group-mutation-result.js +141 -0
- package/dist/api/group-mutation-result.js.map +1 -0
- package/dist/api/iso-country-codes.d.ts +45 -0
- package/dist/api/iso-country-codes.d.ts.map +1 -0
- package/dist/api/iso-country-codes.js +71 -0
- package/dist/api/iso-country-codes.js.map +1 -0
- package/dist/api/item-board-lookup.d.ts +86 -0
- package/dist/api/item-board-lookup.d.ts.map +1 -0
- package/dist/api/item-board-lookup.js +140 -0
- package/dist/api/item-board-lookup.js.map +1 -0
- package/dist/api/item-helpers.d.ts +133 -0
- package/dist/api/item-helpers.d.ts.map +1 -0
- package/dist/api/item-helpers.js +139 -0
- package/dist/api/item-helpers.js.map +1 -0
- package/dist/api/item-mutation-result.d.ts +60 -0
- package/dist/api/item-mutation-result.d.ts.map +1 -0
- package/dist/api/item-mutation-result.js +63 -0
- package/dist/api/item-mutation-result.js.map +1 -0
- package/dist/api/item-projection.d.ts +165 -0
- package/dist/api/item-projection.d.ts.map +1 -0
- package/dist/api/item-projection.js +235 -0
- package/dist/api/item-projection.js.map +1 -0
- package/dist/api/item-source-read.d.ts +45 -0
- package/dist/api/item-source-read.d.ts.map +1 -0
- package/dist/api/item-source-read.js +57 -0
- package/dist/api/item-source-read.js.map +1 -0
- package/dist/api/items-page-walker.d.ts +126 -0
- package/dist/api/items-page-walker.d.ts.map +1 -0
- package/dist/api/items-page-walker.js +256 -0
- package/dist/api/items-page-walker.js.map +1 -0
- package/dist/api/links.d.ts +70 -0
- package/dist/api/links.d.ts.map +1 -0
- package/dist/api/links.js +128 -0
- package/dist/api/links.js.map +1 -0
- package/dist/api/me-token.d.ts +52 -0
- package/dist/api/me-token.d.ts.map +1 -0
- package/dist/api/me-token.js +55 -0
- package/dist/api/me-token.js.map +1 -0
- package/dist/api/pagination.d.ts +201 -0
- package/dist/api/pagination.d.ts.map +1 -0
- package/dist/api/pagination.js +223 -0
- package/dist/api/pagination.js.map +1 -0
- package/dist/api/partial-success-mutation.d.ts +28 -0
- package/dist/api/partial-success-mutation.d.ts.map +1 -0
- package/dist/api/partial-success-mutation.js +68 -0
- package/dist/api/partial-success-mutation.js.map +1 -0
- package/dist/api/people.d.ts +182 -0
- package/dist/api/people.d.ts.map +1 -0
- package/dist/api/people.js +260 -0
- package/dist/api/people.js.map +1 -0
- package/dist/api/phones.d.ts +74 -0
- package/dist/api/phones.d.ts.map +1 -0
- package/dist/api/phones.js +167 -0
- package/dist/api/phones.js.map +1 -0
- package/dist/api/raw-document.d.ts +53 -0
- package/dist/api/raw-document.d.ts.map +1 -0
- package/dist/api/raw-document.js +177 -0
- package/dist/api/raw-document.js.map +1 -0
- package/dist/api/raw-write.d.ts +127 -0
- package/dist/api/raw-write.d.ts.map +1 -0
- package/dist/api/raw-write.js +233 -0
- package/dist/api/raw-write.js.map +1 -0
- package/dist/api/resolution-context.d.ts +32 -0
- package/dist/api/resolution-context.d.ts.map +1 -0
- package/dist/api/resolution-context.js +42 -0
- package/dist/api/resolution-context.js.map +1 -0
- package/dist/api/resolution-pass.d.ts +163 -0
- package/dist/api/resolution-pass.d.ts.map +1 -0
- package/dist/api/resolution-pass.js +254 -0
- package/dist/api/resolution-pass.js.map +1 -0
- package/dist/api/resolve-client.d.ts +69 -0
- package/dist/api/resolve-client.d.ts.map +1 -0
- package/dist/api/resolve-client.js +70 -0
- package/dist/api/resolve-client.js.map +1 -0
- package/dist/api/resolver-error-fold.d.ts +176 -0
- package/dist/api/resolver-error-fold.d.ts.map +1 -0
- package/dist/api/resolver-error-fold.js +230 -0
- package/dist/api/resolver-error-fold.js.map +1 -0
- package/dist/api/resolvers.d.ts +131 -0
- package/dist/api/resolvers.d.ts.map +1 -0
- package/dist/api/resolvers.js +262 -0
- package/dist/api/resolvers.js.map +1 -0
- package/dist/api/response-root.d.ts +65 -0
- package/dist/api/response-root.d.ts.map +1 -0
- package/dist/api/response-root.js +61 -0
- package/dist/api/response-root.js.map +1 -0
- package/dist/api/retry.d.ts +112 -0
- package/dist/api/retry.d.ts.map +1 -0
- package/dist/api/retry.js +181 -0
- package/dist/api/retry.js.map +1 -0
- package/dist/api/set-expression.d.ts +23 -0
- package/dist/api/set-expression.d.ts.map +1 -0
- package/dist/api/set-expression.js +31 -0
- package/dist/api/set-expression.js.map +1 -0
- package/dist/api/sort.d.ts +59 -0
- package/dist/api/sort.d.ts.map +1 -0
- package/dist/api/sort.js +73 -0
- package/dist/api/sort.js.map +1 -0
- package/dist/api/source-aggregator.d.ts +94 -0
- package/dist/api/source-aggregator.d.ts.map +1 -0
- package/dist/api/source-aggregator.js +111 -0
- package/dist/api/source-aggregator.js.map +1 -0
- package/dist/api/transport.d.ts +58 -0
- package/dist/api/transport.d.ts.map +1 -0
- package/dist/api/transport.js +190 -0
- package/dist/api/transport.js.map +1 -0
- package/dist/api/update-mutation-result.d.ts +133 -0
- package/dist/api/update-mutation-result.d.ts.map +1 -0
- package/dist/api/update-mutation-result.js +145 -0
- package/dist/api/update-mutation-result.js.map +1 -0
- package/dist/api/users-fan-out-mutation.d.ts +124 -0
- package/dist/api/users-fan-out-mutation.d.ts.map +1 -0
- package/dist/api/users-fan-out-mutation.js +331 -0
- package/dist/api/users-fan-out-mutation.js.map +1 -0
- package/dist/api/walk-pages.d.ts +91 -0
- package/dist/api/walk-pages.d.ts.map +1 -0
- package/dist/api/walk-pages.js +84 -0
- package/dist/api/walk-pages.js.map +1 -0
- package/dist/api/workspace-projection.d.ts +64 -0
- package/dist/api/workspace-projection.d.ts.map +1 -0
- package/dist/api/workspace-projection.js +83 -0
- package/dist/api/workspace-projection.js.map +1 -0
- package/dist/cli/envelope-out.d.ts +128 -0
- package/dist/cli/envelope-out.d.ts.map +1 -0
- package/dist/cli/envelope-out.js +146 -0
- package/dist/cli/envelope-out.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +27 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/program.d.ts +29 -0
- package/dist/cli/program.d.ts.map +1 -0
- package/dist/cli/program.js +109 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/run.d.ts +108 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +105 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/commands/account/client-helper.d.ts +37 -0
- package/dist/commands/account/client-helper.d.ts.map +1 -0
- package/dist/commands/account/client-helper.js +55 -0
- package/dist/commands/account/client-helper.js.map +1 -0
- package/dist/commands/account/complexity.d.ts +29 -0
- package/dist/commands/account/complexity.d.ts.map +1 -0
- package/dist/commands/account/complexity.js +70 -0
- package/dist/commands/account/complexity.js.map +1 -0
- package/dist/commands/account/info.d.ts +36 -0
- package/dist/commands/account/info.d.ts.map +1 -0
- package/dist/commands/account/info.js +74 -0
- package/dist/commands/account/info.js.map +1 -0
- package/dist/commands/account/version.d.ts +44 -0
- package/dist/commands/account/version.d.ts.map +1 -0
- package/dist/commands/account/version.js +98 -0
- package/dist/commands/account/version.js.map +1 -0
- package/dist/commands/account/whoami.d.ts +34 -0
- package/dist/commands/account/whoami.d.ts.map +1 -0
- package/dist/commands/account/whoami.js +77 -0
- package/dist/commands/account/whoami.js.map +1 -0
- package/dist/commands/board/add-users.d.ts +60 -0
- package/dist/commands/board/add-users.d.ts.map +1 -0
- package/dist/commands/board/add-users.js +133 -0
- package/dist/commands/board/add-users.js.map +1 -0
- package/dist/commands/board/archive.d.ts +64 -0
- package/dist/commands/board/archive.d.ts.map +1 -0
- package/dist/commands/board/archive.js +226 -0
- package/dist/commands/board/archive.js.map +1 -0
- package/dist/commands/board/column-create.d.ts +146 -0
- package/dist/commands/board/column-create.d.ts.map +1 -0
- package/dist/commands/board/column-create.js +564 -0
- package/dist/commands/board/column-create.js.map +1 -0
- package/dist/commands/board/column-delete.d.ts +76 -0
- package/dist/commands/board/column-delete.d.ts.map +1 -0
- package/dist/commands/board/column-delete.js +224 -0
- package/dist/commands/board/column-delete.js.map +1 -0
- package/dist/commands/board/column-update.d.ts +92 -0
- package/dist/commands/board/column-update.d.ts.map +1 -0
- package/dist/commands/board/column-update.js +364 -0
- package/dist/commands/board/column-update.js.map +1 -0
- package/dist/commands/board/columns.d.ts +30 -0
- package/dist/commands/board/columns.d.ts.map +1 -0
- package/dist/commands/board/columns.js +102 -0
- package/dist/commands/board/columns.js.map +1 -0
- package/dist/commands/board/create.d.ts +67 -0
- package/dist/commands/board/create.d.ts.map +1 -0
- package/dist/commands/board/create.js +226 -0
- package/dist/commands/board/create.js.map +1 -0
- package/dist/commands/board/delete.d.ts +60 -0
- package/dist/commands/board/delete.d.ts.map +1 -0
- package/dist/commands/board/delete.js +192 -0
- package/dist/commands/board/delete.js.map +1 -0
- package/dist/commands/board/describe.d.ts +68 -0
- package/dist/commands/board/describe.d.ts.map +1 -0
- package/dist/commands/board/describe.js +241 -0
- package/dist/commands/board/describe.js.map +1 -0
- package/dist/commands/board/doctor.d.ts +108 -0
- package/dist/commands/board/doctor.d.ts.map +1 -0
- package/dist/commands/board/doctor.js +417 -0
- package/dist/commands/board/doctor.js.map +1 -0
- package/dist/commands/board/duplicate.d.ts +85 -0
- package/dist/commands/board/duplicate.d.ts.map +1 -0
- package/dist/commands/board/duplicate.js +281 -0
- package/dist/commands/board/duplicate.js.map +1 -0
- package/dist/commands/board/find.d.ts +47 -0
- package/dist/commands/board/find.d.ts.map +1 -0
- package/dist/commands/board/find.js +153 -0
- package/dist/commands/board/find.js.map +1 -0
- package/dist/commands/board/get.d.ts +41 -0
- package/dist/commands/board/get.d.ts.map +1 -0
- package/dist/commands/board/get.js +66 -0
- package/dist/commands/board/get.js.map +1 -0
- package/dist/commands/board/group-archive.d.ts +83 -0
- package/dist/commands/board/group-archive.d.ts.map +1 -0
- package/dist/commands/board/group-archive.js +264 -0
- package/dist/commands/board/group-archive.js.map +1 -0
- package/dist/commands/board/group-create.d.ts +118 -0
- package/dist/commands/board/group-create.d.ts.map +1 -0
- package/dist/commands/board/group-create.js +239 -0
- package/dist/commands/board/group-create.js.map +1 -0
- package/dist/commands/board/group-delete.d.ts +79 -0
- package/dist/commands/board/group-delete.d.ts.map +1 -0
- package/dist/commands/board/group-delete.js +222 -0
- package/dist/commands/board/group-delete.js.map +1 -0
- package/dist/commands/board/group-duplicate.d.ts +70 -0
- package/dist/commands/board/group-duplicate.d.ts.map +1 -0
- package/dist/commands/board/group-duplicate.js +219 -0
- package/dist/commands/board/group-duplicate.js.map +1 -0
- package/dist/commands/board/group-update.d.ts +145 -0
- package/dist/commands/board/group-update.d.ts.map +1 -0
- package/dist/commands/board/group-update.js +341 -0
- package/dist/commands/board/group-update.js.map +1 -0
- package/dist/commands/board/groups.d.ts +28 -0
- package/dist/commands/board/groups.d.ts.map +1 -0
- package/dist/commands/board/groups.js +85 -0
- package/dist/commands/board/groups.js.map +1 -0
- package/dist/commands/board/list.d.ts +39 -0
- package/dist/commands/board/list.d.ts.map +1 -0
- package/dist/commands/board/list.js +135 -0
- package/dist/commands/board/list.js.map +1 -0
- package/dist/commands/board/subscribers.d.ts +24 -0
- package/dist/commands/board/subscribers.d.ts.map +1 -0
- package/dist/commands/board/subscribers.js +89 -0
- package/dist/commands/board/subscribers.js.map +1 -0
- package/dist/commands/board/update.d.ts +82 -0
- package/dist/commands/board/update.d.ts.map +1 -0
- package/dist/commands/board/update.js +328 -0
- package/dist/commands/board/update.js.map +1 -0
- package/dist/commands/cache/clear.d.ts +34 -0
- package/dist/commands/cache/clear.d.ts.map +1 -0
- package/dist/commands/cache/clear.js +113 -0
- package/dist/commands/cache/clear.js.map +1 -0
- package/dist/commands/cache/list.d.ts +50 -0
- package/dist/commands/cache/list.d.ts.map +1 -0
- package/dist/commands/cache/list.js +77 -0
- package/dist/commands/cache/list.js.map +1 -0
- package/dist/commands/cache/stats.d.ts +22 -0
- package/dist/commands/cache/stats.d.ts.map +1 -0
- package/dist/commands/cache/stats.js +56 -0
- package/dist/commands/cache/stats.js.map +1 -0
- package/dist/commands/config/path.d.ts +22 -0
- package/dist/commands/config/path.d.ts.map +1 -0
- package/dist/commands/config/path.js +74 -0
- package/dist/commands/config/path.js.map +1 -0
- package/dist/commands/config/show.d.ts +61 -0
- package/dist/commands/config/show.d.ts.map +1 -0
- package/dist/commands/config/show.js +137 -0
- package/dist/commands/config/show.js.map +1 -0
- package/dist/commands/emit.d.ts +156 -0
- package/dist/commands/emit.d.ts.map +1 -0
- package/dist/commands/emit.js +212 -0
- package/dist/commands/emit.js.map +1 -0
- package/dist/commands/index.d.ts +5 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +195 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/item/archive.d.ts +81 -0
- package/dist/commands/item/archive.d.ts.map +1 -0
- package/dist/commands/item/archive.js +187 -0
- package/dist/commands/item/archive.js.map +1 -0
- package/dist/commands/item/clear.d.ts +140 -0
- package/dist/commands/item/clear.d.ts.map +1 -0
- package/dist/commands/item/clear.js +748 -0
- package/dist/commands/item/clear.js.map +1 -0
- package/dist/commands/item/create.d.ts +77 -0
- package/dist/commands/item/create.d.ts.map +1 -0
- package/dist/commands/item/create.js +802 -0
- package/dist/commands/item/create.js.map +1 -0
- package/dist/commands/item/delete.d.ts +82 -0
- package/dist/commands/item/delete.d.ts.map +1 -0
- package/dist/commands/item/delete.js +179 -0
- package/dist/commands/item/delete.js.map +1 -0
- package/dist/commands/item/duplicate.d.ts +117 -0
- package/dist/commands/item/duplicate.d.ts.map +1 -0
- package/dist/commands/item/duplicate.js +238 -0
- package/dist/commands/item/duplicate.js.map +1 -0
- package/dist/commands/item/find.d.ts +55 -0
- package/dist/commands/item/find.d.ts.map +1 -0
- package/dist/commands/item/find.js +231 -0
- package/dist/commands/item/find.js.map +1 -0
- package/dist/commands/item/get.d.ts +47 -0
- package/dist/commands/item/get.d.ts.map +1 -0
- package/dist/commands/item/get.js +66 -0
- package/dist/commands/item/get.js.map +1 -0
- package/dist/commands/item/list.d.ts +73 -0
- package/dist/commands/item/list.d.ts.map +1 -0
- package/dist/commands/item/list.js +284 -0
- package/dist/commands/item/list.js.map +1 -0
- package/dist/commands/item/move.d.ts +181 -0
- package/dist/commands/item/move.d.ts.map +1 -0
- package/dist/commands/item/move.js +560 -0
- package/dist/commands/item/move.js.map +1 -0
- package/dist/commands/item/search.d.ts +67 -0
- package/dist/commands/item/search.d.ts.map +1 -0
- package/dist/commands/item/search.js +322 -0
- package/dist/commands/item/search.js.map +1 -0
- package/dist/commands/item/set.d.ts +88 -0
- package/dist/commands/item/set.d.ts.map +1 -0
- package/dist/commands/item/set.js +387 -0
- package/dist/commands/item/set.js.map +1 -0
- package/dist/commands/item/subitems.d.ts +50 -0
- package/dist/commands/item/subitems.d.ts.map +1 -0
- package/dist/commands/item/subitems.js +86 -0
- package/dist/commands/item/subitems.js.map +1 -0
- package/dist/commands/item/update.d.ts +99 -0
- package/dist/commands/item/update.d.ts.map +1 -0
- package/dist/commands/item/update.js +884 -0
- package/dist/commands/item/update.js.map +1 -0
- package/dist/commands/item/upsert.d.ts +105 -0
- package/dist/commands/item/upsert.d.ts.map +1 -0
- package/dist/commands/item/upsert.js +998 -0
- package/dist/commands/item/upsert.js.map +1 -0
- package/dist/commands/parse-argv.d.ts +20 -0
- package/dist/commands/parse-argv.d.ts.map +1 -0
- package/dist/commands/parse-argv.js +40 -0
- package/dist/commands/parse-argv.js.map +1 -0
- package/dist/commands/raw/index.d.ts +23 -0
- package/dist/commands/raw/index.d.ts.map +1 -0
- package/dist/commands/raw/index.js +416 -0
- package/dist/commands/raw/index.js.map +1 -0
- package/dist/commands/run-by-id-lookup.d.ts +72 -0
- package/dist/commands/run-by-id-lookup.d.ts.map +1 -0
- package/dist/commands/run-by-id-lookup.js +58 -0
- package/dist/commands/run-by-id-lookup.js.map +1 -0
- package/dist/commands/schema/index.d.ts +104 -0
- package/dist/commands/schema/index.d.ts.map +1 -0
- package/dist/commands/schema/index.js +183 -0
- package/dist/commands/schema/index.js.map +1 -0
- package/dist/commands/types.d.ts +66 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +15 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/update/body-source.d.ts +38 -0
- package/dist/commands/update/body-source.d.ts.map +1 -0
- package/dist/commands/update/body-source.js +80 -0
- package/dist/commands/update/body-source.js.map +1 -0
- package/dist/commands/update/clear-all.d.ts +67 -0
- package/dist/commands/update/clear-all.d.ts.map +1 -0
- package/dist/commands/update/clear-all.js +281 -0
- package/dist/commands/update/clear-all.js.map +1 -0
- package/dist/commands/update/create.d.ts +51 -0
- package/dist/commands/update/create.d.ts.map +1 -0
- package/dist/commands/update/create.js +167 -0
- package/dist/commands/update/create.js.map +1 -0
- package/dist/commands/update/delete.d.ts +53 -0
- package/dist/commands/update/delete.d.ts.map +1 -0
- package/dist/commands/update/delete.js +148 -0
- package/dist/commands/update/delete.js.map +1 -0
- package/dist/commands/update/edit.d.ts +37 -0
- package/dist/commands/update/edit.d.ts.map +1 -0
- package/dist/commands/update/edit.js +129 -0
- package/dist/commands/update/edit.js.map +1 -0
- package/dist/commands/update/get.d.ts +37 -0
- package/dist/commands/update/get.d.ts.map +1 -0
- package/dist/commands/update/get.js +92 -0
- package/dist/commands/update/get.js.map +1 -0
- package/dist/commands/update/like.d.ts +17 -0
- package/dist/commands/update/like.d.ts.map +1 -0
- package/dist/commands/update/like.js +23 -0
- package/dist/commands/update/like.js.map +1 -0
- package/dist/commands/update/list.d.ts +58 -0
- package/dist/commands/update/list.d.ts.map +1 -0
- package/dist/commands/update/list.js +322 -0
- package/dist/commands/update/list.js.map +1 -0
- package/dist/commands/update/pin.d.ts +17 -0
- package/dist/commands/update/pin.d.ts.map +1 -0
- package/dist/commands/update/pin.js +23 -0
- package/dist/commands/update/pin.js.map +1 -0
- package/dist/commands/update/reply.d.ts +47 -0
- package/dist/commands/update/reply.d.ts.map +1 -0
- package/dist/commands/update/reply.js +149 -0
- package/dist/commands/update/reply.js.map +1 -0
- package/dist/commands/update/toggle.d.ts +70 -0
- package/dist/commands/update/toggle.d.ts.map +1 -0
- package/dist/commands/update/toggle.js +118 -0
- package/dist/commands/update/toggle.js.map +1 -0
- package/dist/commands/update/unlike.d.ts +17 -0
- package/dist/commands/update/unlike.d.ts.map +1 -0
- package/dist/commands/update/unlike.js +22 -0
- package/dist/commands/update/unlike.js.map +1 -0
- package/dist/commands/update/unpin.d.ts +17 -0
- package/dist/commands/update/unpin.d.ts.map +1 -0
- package/dist/commands/update/unpin.js +21 -0
- package/dist/commands/update/unpin.js.map +1 -0
- package/dist/commands/user/get.d.ts +31 -0
- package/dist/commands/user/get.d.ts.map +1 -0
- package/dist/commands/user/get.js +81 -0
- package/dist/commands/user/get.js.map +1 -0
- package/dist/commands/user/list.d.ts +61 -0
- package/dist/commands/user/list.d.ts.map +1 -0
- package/dist/commands/user/list.js +148 -0
- package/dist/commands/user/list.js.map +1 -0
- package/dist/commands/user/me.d.ts +17 -0
- package/dist/commands/user/me.d.ts.map +1 -0
- package/dist/commands/user/me.js +49 -0
- package/dist/commands/user/me.js.map +1 -0
- package/dist/commands/workspace/add-users.d.ts +76 -0
- package/dist/commands/workspace/add-users.d.ts.map +1 -0
- package/dist/commands/workspace/add-users.js +154 -0
- package/dist/commands/workspace/add-users.js.map +1 -0
- package/dist/commands/workspace/create.d.ts +59 -0
- package/dist/commands/workspace/create.d.ts.map +1 -0
- package/dist/commands/workspace/create.js +163 -0
- package/dist/commands/workspace/create.js.map +1 -0
- package/dist/commands/workspace/delete.d.ts +67 -0
- package/dist/commands/workspace/delete.d.ts.map +1 -0
- package/dist/commands/workspace/delete.js +182 -0
- package/dist/commands/workspace/delete.js.map +1 -0
- package/dist/commands/workspace/folders.d.ts +40 -0
- package/dist/commands/workspace/folders.d.ts.map +1 -0
- package/dist/commands/workspace/folders.js +124 -0
- package/dist/commands/workspace/folders.js.map +1 -0
- package/dist/commands/workspace/get.d.ts +35 -0
- package/dist/commands/workspace/get.d.ts.map +1 -0
- package/dist/commands/workspace/get.js +62 -0
- package/dist/commands/workspace/get.js.map +1 -0
- package/dist/commands/workspace/list.d.ts +57 -0
- package/dist/commands/workspace/list.d.ts.map +1 -0
- package/dist/commands/workspace/list.js +125 -0
- package/dist/commands/workspace/list.js.map +1 -0
- package/dist/commands/workspace/remove-users.d.ts +47 -0
- package/dist/commands/workspace/remove-users.d.ts.map +1 -0
- package/dist/commands/workspace/remove-users.js +122 -0
- package/dist/commands/workspace/remove-users.js.map +1 -0
- package/dist/commands/workspace/update.d.ts +68 -0
- package/dist/commands/workspace/update.d.ts.map +1 -0
- package/dist/commands/workspace/update.js +237 -0
- package/dist/commands/workspace/update.js.map +1 -0
- package/dist/config/load.d.ts +33 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +81 -0
- package/dist/config/load.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/types/global-flags.d.ts +69 -0
- package/dist/types/global-flags.d.ts.map +1 -0
- package/dist/types/global-flags.js +170 -0
- package/dist/types/global-flags.js.map +1 -0
- package/dist/types/ids.d.ts +38 -0
- package/dist/types/ids.d.ts.map +1 -0
- package/dist/types/ids.js +51 -0
- package/dist/types/ids.js.map +1 -0
- package/dist/types/json.d.ts +60 -0
- package/dist/types/json.d.ts.map +1 -0
- package/dist/types/json.js +33 -0
- package/dist/types/json.js.map +1 -0
- package/dist/utils/errors.d.ts +121 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +264 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/output/envelope.d.ts +140 -0
- package/dist/utils/output/envelope.d.ts.map +1 -0
- package/dist/utils/output/envelope.js +120 -0
- package/dist/utils/output/envelope.js.map +1 -0
- package/dist/utils/output/json.d.ts +10 -0
- package/dist/utils/output/json.d.ts.map +1 -0
- package/dist/utils/output/json.js +12 -0
- package/dist/utils/output/json.js.map +1 -0
- package/dist/utils/output/ndjson.d.ts +92 -0
- package/dist/utils/output/ndjson.d.ts.map +1 -0
- package/dist/utils/output/ndjson.js +33 -0
- package/dist/utils/output/ndjson.js.map +1 -0
- package/dist/utils/output/select.d.ts +22 -0
- package/dist/utils/output/select.d.ts.map +1 -0
- package/dist/utils/output/select.js +47 -0
- package/dist/utils/output/select.js.map +1 -0
- package/dist/utils/output/table.d.ts +32 -0
- package/dist/utils/output/table.d.ts.map +1 -0
- package/dist/utils/output/table.js +133 -0
- package/dist/utils/output/table.js.map +1 -0
- package/dist/utils/output/text.d.ts +5 -0
- package/dist/utils/output/text.d.ts.map +1 -0
- package/dist/utils/output/text.js +32 -0
- package/dist/utils/output/text.js.map +1 -0
- package/dist/utils/parse-boundary.d.ts +53 -0
- package/dist/utils/parse-boundary.d.ts.map +1 -0
- package/dist/utils/parse-boundary.js +62 -0
- package/dist/utils/parse-boundary.js.map +1 -0
- package/dist/utils/redact.d.ts +54 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +154 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/request-id.d.ts +17 -0
- package/dist/utils/request-id.d.ts.map +1 -0
- package/dist/utils/request-id.js +26 -0
- package/dist/utils/request-id.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|