monday-cli 0.3.0 → 0.5.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 +719 -0
- package/README.md +208 -36
- package/dist/api/assets.d.ts +326 -0
- package/dist/api/assets.d.ts.map +1 -0
- package/dist/api/assets.js +519 -0
- package/dist/api/assets.js.map +1 -0
- package/dist/api/column-types.d.ts +13 -7
- package/dist/api/column-types.d.ts.map +1 -1
- package/dist/api/column-types.js +7 -3
- package/dist/api/column-types.js.map +1 -1
- package/dist/api/column-values.d.ts +8 -1
- package/dist/api/column-values.d.ts.map +1 -1
- package/dist/api/column-values.js +16 -6
- package/dist/api/column-values.js.map +1 -1
- package/dist/api/documents.d.ts +1652 -0
- package/dist/api/documents.d.ts.map +1 -0
- package/dist/api/documents.js +2411 -0
- package/dist/api/documents.js.map +1 -0
- package/dist/api/item-watch.d.ts +263 -0
- package/dist/api/item-watch.d.ts.map +1 -0
- package/dist/api/item-watch.js +709 -0
- package/dist/api/item-watch.js.map +1 -0
- package/dist/api/multipart-transport.d.ts +223 -0
- package/dist/api/multipart-transport.d.ts.map +1 -0
- package/dist/api/multipart-transport.js +274 -0
- package/dist/api/multipart-transport.js.map +1 -0
- package/dist/api/parallel-dispatch.d.ts +155 -0
- package/dist/api/parallel-dispatch.d.ts.map +1 -0
- package/dist/api/parallel-dispatch.js +243 -0
- package/dist/api/parallel-dispatch.js.map +1 -0
- package/dist/api/partial-success-bulk.d.ts +118 -60
- package/dist/api/partial-success-bulk.d.ts.map +1 -1
- package/dist/api/partial-success-bulk.js +137 -79
- package/dist/api/partial-success-bulk.js.map +1 -1
- package/dist/api/partial-success-mutation.d.ts +13 -1
- package/dist/api/partial-success-mutation.d.ts.map +1 -1
- package/dist/api/partial-success-mutation.js +5 -1
- package/dist/api/partial-success-mutation.js.map +1 -1
- package/dist/api/raw-write.d.ts +13 -4
- package/dist/api/raw-write.d.ts.map +1 -1
- package/dist/api/raw-write.js +22 -11
- package/dist/api/raw-write.js.map +1 -1
- package/dist/api/resolve-client.d.ts +11 -0
- package/dist/api/resolve-client.d.ts.map +1 -1
- package/dist/api/resolve-client.js +9 -1
- package/dist/api/resolve-client.js.map +1 -1
- package/dist/api/teams.d.ts +657 -0
- package/dist/api/teams.d.ts.map +1 -0
- package/dist/api/teams.js +880 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/cli/run.d.ts +20 -0
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +1 -0
- package/dist/cli/run.js.map +1 -1
- package/dist/commands/board/column-create.d.ts +6 -5
- package/dist/commands/board/column-create.d.ts.map +1 -1
- package/dist/commands/board/column-create.js +9 -6
- package/dist/commands/board/column-create.js.map +1 -1
- package/dist/commands/completion.d.ts +188 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +418 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/doc/append-markdown.d.ts +117 -0
- package/dist/commands/doc/append-markdown.d.ts.map +1 -0
- package/dist/commands/doc/append-markdown.js +253 -0
- package/dist/commands/doc/append-markdown.js.map +1 -0
- package/dist/commands/doc/block-create.d.ts +114 -0
- package/dist/commands/doc/block-create.d.ts.map +1 -0
- package/dist/commands/doc/block-create.js +206 -0
- package/dist/commands/doc/block-create.js.map +1 -0
- package/dist/commands/doc/block-delete.d.ts +72 -0
- package/dist/commands/doc/block-delete.d.ts.map +1 -0
- package/dist/commands/doc/block-delete.js +161 -0
- package/dist/commands/doc/block-delete.js.map +1 -0
- package/dist/commands/doc/block-update.d.ts +75 -0
- package/dist/commands/doc/block-update.d.ts.map +1 -0
- package/dist/commands/doc/block-update.js +162 -0
- package/dist/commands/doc/block-update.js.map +1 -0
- package/dist/commands/doc/create-in-workspace.d.ts +76 -0
- package/dist/commands/doc/create-in-workspace.d.ts.map +1 -0
- package/dist/commands/doc/create-in-workspace.js +164 -0
- package/dist/commands/doc/create-in-workspace.js.map +1 -0
- package/dist/commands/doc/create-on-column.d.ts +71 -0
- package/dist/commands/doc/create-on-column.d.ts.map +1 -0
- package/dist/commands/doc/create-on-column.js +146 -0
- package/dist/commands/doc/create-on-column.js.map +1 -0
- package/dist/commands/doc/delete.d.ts +68 -0
- package/dist/commands/doc/delete.d.ts.map +1 -0
- package/dist/commands/doc/delete.js +146 -0
- package/dist/commands/doc/delete.js.map +1 -0
- package/dist/commands/doc/duplicate.d.ts +101 -0
- package/dist/commands/doc/duplicate.d.ts.map +1 -0
- package/dist/commands/doc/duplicate.js +191 -0
- package/dist/commands/doc/duplicate.js.map +1 -0
- package/dist/commands/doc/get.d.ts +46 -0
- package/dist/commands/doc/get.d.ts.map +1 -0
- package/dist/commands/doc/get.js +95 -0
- package/dist/commands/doc/get.js.map +1 -0
- package/dist/commands/doc/import-html.d.ts +125 -0
- package/dist/commands/doc/import-html.d.ts.map +1 -0
- package/dist/commands/doc/import-html.js +273 -0
- package/dist/commands/doc/import-html.js.map +1 -0
- package/dist/commands/doc/list.d.ts +86 -0
- package/dist/commands/doc/list.d.ts.map +1 -0
- package/dist/commands/doc/list.js +217 -0
- package/dist/commands/doc/list.js.map +1 -0
- package/dist/commands/doc/rename.d.ts +60 -0
- package/dist/commands/doc/rename.d.ts.map +1 -0
- package/dist/commands/doc/rename.js +135 -0
- package/dist/commands/doc/rename.js.map +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +162 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/item/create.js +2 -2
- package/dist/commands/item/update.d.ts +1 -0
- package/dist/commands/item/update.d.ts.map +1 -1
- package/dist/commands/item/update.js +61 -0
- package/dist/commands/item/update.js.map +1 -1
- package/dist/commands/item/upload.d.ts +108 -0
- package/dist/commands/item/upload.d.ts.map +1 -0
- package/dist/commands/item/upload.js +370 -0
- package/dist/commands/item/upload.js.map +1 -0
- package/dist/commands/item/watch.d.ts +90 -0
- package/dist/commands/item/watch.d.ts.map +1 -0
- package/dist/commands/item/watch.js +342 -0
- package/dist/commands/item/watch.js.map +1 -0
- package/dist/commands/update/create.d.ts.map +1 -1
- package/dist/commands/update/create.js +6 -4
- package/dist/commands/update/create.js.map +1 -1
- package/dist/commands/update/edit.d.ts +4 -2
- package/dist/commands/update/edit.d.ts.map +1 -1
- package/dist/commands/update/edit.js +10 -6
- package/dist/commands/update/edit.js.map +1 -1
- package/dist/commands/update/reply.d.ts +4 -2
- package/dist/commands/update/reply.d.ts.map +1 -1
- package/dist/commands/update/reply.js +10 -6
- package/dist/commands/update/reply.js.map +1 -1
- package/dist/commands/update/upload.d.ts +69 -0
- package/dist/commands/update/upload.d.ts.map +1 -0
- package/dist/commands/update/upload.js +235 -0
- package/dist/commands/update/upload.js.map +1 -0
- package/dist/commands/user/_team-membership.d.ts +10 -0
- package/dist/commands/user/_team-membership.d.ts.map +1 -0
- package/dist/commands/user/_team-membership.js +88 -0
- package/dist/commands/user/_team-membership.js.map +1 -0
- package/dist/commands/user/team-add-members.d.ts +81 -0
- package/dist/commands/user/team-add-members.d.ts.map +1 -0
- package/dist/commands/user/team-add-members.js +186 -0
- package/dist/commands/user/team-add-members.js.map +1 -0
- package/dist/commands/user/team-create.d.ts +82 -0
- package/dist/commands/user/team-create.d.ts.map +1 -0
- package/dist/commands/user/team-create.js +206 -0
- package/dist/commands/user/team-create.js.map +1 -0
- package/dist/commands/user/team-delete.d.ts +56 -0
- package/dist/commands/user/team-delete.d.ts.map +1 -0
- package/dist/commands/user/team-delete.js +137 -0
- package/dist/commands/user/team-delete.js.map +1 -0
- package/dist/commands/user/team-get.d.ts +41 -0
- package/dist/commands/user/team-get.d.ts.map +1 -0
- package/dist/commands/user/team-get.js +87 -0
- package/dist/commands/user/team-get.js.map +1 -0
- package/dist/commands/user/team-list.d.ts +39 -0
- package/dist/commands/user/team-list.d.ts.map +1 -0
- package/dist/commands/user/team-list.js +90 -0
- package/dist/commands/user/team-list.js.map +1 -0
- package/dist/commands/user/team-remove-members.d.ts +71 -0
- package/dist/commands/user/team-remove-members.d.ts.map +1 -0
- package/dist/commands/user/team-remove-members.js +176 -0
- package/dist/commands/user/team-remove-members.js.map +1 -0
- package/dist/types/ids.d.ts +8 -0
- package/dist/types/ids.d.ts.map +1 -1
- package/dist/types/ids.js +53 -5
- package/dist/types/ids.js.map +1 -1
- package/dist/utils/mime.d.ts +24 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +64 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/output/envelope.d.ts +30 -0
- package/dist/utils/output/envelope.d.ts.map +1 -1
- package/dist/utils/output/envelope.js +26 -0
- package/dist/utils/output/envelope.js.map +1 -1
- package/dist/utils/output/ndjson.d.ts +25 -0
- package/dist/utils/output/ndjson.d.ts.map +1 -1
- package/dist/utils/output/ndjson.js +12 -0
- package/dist/utils/output/ndjson.js.map +1 -1
- package/dist/utils/parse-brand-list.d.ts +95 -0
- package/dist/utils/parse-brand-list.d.ts.map +1 -0
- package/dist/utils/parse-brand-list.js +96 -0
- package/dist/utils/parse-brand-list.js.map +1 -0
- package/dist/utils/signal.d.ts +42 -0
- package/dist/utils/signal.d.ts.map +1 -0
- package/dist/utils/signal.js +45 -0
- package/dist/utils/signal.js.map +1 -0
- package/dist/utils/source-content.d.ts +93 -0
- package/dist/utils/source-content.d.ts.map +1 -0
- package/dist/utils/source-content.js +120 -0
- package/dist/utils/source-content.js.map +1 -0
- package/package.json +1 -1
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
* the parent update.
|
|
10
10
|
*
|
|
11
11
|
* **Body sources** (mutually exclusive — same shape as `update
|
|
12
|
-
* create`'s plumbing, lifted into `
|
|
13
|
-
*
|
|
12
|
+
* create`'s plumbing, lifted into the universal `readSourceContent`
|
|
13
|
+
* helper at `src/utils/source-content.ts` per R-v0.5-NEW-18 at
|
|
14
|
+
* v0.5-M37 IMPL kickoff; the M13-specific `readUpdateBody` shape
|
|
15
|
+
* lived at `src/commands/update/body-source.ts` until the lift):
|
|
14
16
|
* - `--body <md>` — inline markdown.
|
|
15
17
|
* - `--body-file <path>` — read from disk.
|
|
16
18
|
* - `--body-file -` — read from stdin.
|
|
@@ -27,7 +29,7 @@ import { resolveClient } from '../../api/resolve-client.js';
|
|
|
27
29
|
import { UpdateIdSchema } from '../../types/ids.js';
|
|
28
30
|
import { parseArgv } from '../parse-argv.js';
|
|
29
31
|
import { unwrapOrThrow } from '../../utils/parse-boundary.js';
|
|
30
|
-
import {
|
|
32
|
+
import { readSourceContent } from '../../utils/source-content.js';
|
|
31
33
|
import { projectMutationUpdate, UPDATE_FIELDS_FRAGMENT, updateProjectionSchema, } from '../../api/update-mutation-result.js';
|
|
32
34
|
import { assertResponseFieldPresent } from '../../api/response-root.js';
|
|
33
35
|
const CREATE_REPLY_MUTATION = `
|
|
@@ -80,10 +82,12 @@ export const updateReplyCommand = {
|
|
|
80
82
|
...opts,
|
|
81
83
|
});
|
|
82
84
|
const { client, globalFlags, apiVersion, toEmit } = resolveClient(ctx, program.opts());
|
|
83
|
-
const body = await
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
const body = await readSourceContent({
|
|
86
|
+
inline: parsed.body,
|
|
87
|
+
file: globalFlags.bodyFile,
|
|
86
88
|
stdin: ctx.stdin,
|
|
89
|
+
inlineFlagName: '--body',
|
|
90
|
+
fileFlagName: '--body-file',
|
|
87
91
|
verbHint: 'monday update reply requires either --body <md> or ' +
|
|
88
92
|
'--body-file <path>. Use --body-file - to read from stdin.',
|
|
89
93
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reply.js","sourceRoot":"","sources":["../../../src/commands/update/reply.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reply.js","sourceRoot":"","sources":["../../../src/commands/update/reply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `monday update upload <uid> <file>` — attach a file to an Update
|
|
3
|
+
* (comment) via Monday's `add_file_to_update` mutation
|
|
4
|
+
* (cli-design.md §4.3 + §6.4 asset-upload sub-section + §13 v0.4
|
|
5
|
+
* entry; v0.4-plan.md §3 M31).
|
|
6
|
+
*
|
|
7
|
+
* **Wire shape.** Single multipart/form-data round-trip via
|
|
8
|
+
* {@link addFileToUpdate} against `mutation AddFileToUpdate` with
|
|
9
|
+
* `operationName: 'AddFileToUpdate'` (R-NEW-37 W2 audit-point).
|
|
10
|
+
* Same `MultipartTransport` seam as `item upload`; no column-id
|
|
11
|
+
* involved (Updates carry attachments via `Update.assets` directly,
|
|
12
|
+
* not via column values).
|
|
13
|
+
*
|
|
14
|
+
* **Argv shape.** Two positional args:
|
|
15
|
+
*
|
|
16
|
+
* - `<uid>` — numeric update ID; brand-validated via
|
|
17
|
+
* {@link UpdateIdSchema}.
|
|
18
|
+
* - `<file>` — local file path (same constraints as
|
|
19
|
+
* `monday item upload`: regular readable file; stdin not
|
|
20
|
+
* supported at v0.4-M31).
|
|
21
|
+
*
|
|
22
|
+
* **No column-type validation needed.** Updates accept any file
|
|
23
|
+
* type Monday supports — no column-shape gating like
|
|
24
|
+
* `item upload`'s `file`-only check. Server-side validation handles
|
|
25
|
+
* the rest (size cap, filename sanity, virus scan).
|
|
26
|
+
*
|
|
27
|
+
* **Local file failures + size handling — same `details.reason`
|
|
28
|
+
* discrimination as `item upload`.** Three values:
|
|
29
|
+
* - `'file_not_readable'` — ENOENT / EACCES / path is a
|
|
30
|
+
* directory; fires at IMPL via `fs.stat()` pre-check.
|
|
31
|
+
* - `'file_empty'` — zero-byte file; fires via `fs.stat()`.
|
|
32
|
+
* - `'file_too_large'` — Monday's server-side size-cap
|
|
33
|
+
* rejection rewrap; carries `details.file_size_bytes`
|
|
34
|
+
* from the local `fs.stat()` measurement at upload
|
|
35
|
+
* time (NOT a Monday error-payload field — Monday's
|
|
36
|
+
* wire rejection may not surface a size; the CLI
|
|
37
|
+
* threads the locally-measured size into the details
|
|
38
|
+
* slot for a stable agent-keyed envelope).
|
|
39
|
+
* No CLI-side hardcoded size pre-check; Monday's per-file cap
|
|
40
|
+
* is plan-tier-dependent and not exposed via the schema.
|
|
41
|
+
*
|
|
42
|
+
* **`--dry-run` shape** per §6.4 asset-upload variant — emits
|
|
43
|
+
* `{operation: 'add_file_to_update', update_id, file_path,
|
|
44
|
+
* filename, file_size_bytes}` with `meta.source: 'none'`. No wire
|
|
45
|
+
* call fires.
|
|
46
|
+
*
|
|
47
|
+
* **Idempotency: NO** — re-running uploads a second copy. Agents
|
|
48
|
+
* needing register-once dedupe on `Update.assets` reads.
|
|
49
|
+
*
|
|
50
|
+
* **Cache invalidation.** N/A — Updates aren't part of the §8
|
|
51
|
+
* cache scope (board-metadata-only); the upload changes the
|
|
52
|
+
* Update's asset collection but nothing the cache tracks.
|
|
53
|
+
*
|
|
54
|
+
* **Status: runtime body shipped at v0.4-M31 IMPL** — mirrors
|
|
55
|
+
* `item upload` minus the column-resolution + cache-invalidation
|
|
56
|
+
* legs (Updates aren't part of the §8 cache scope; no per-column
|
|
57
|
+
* type check needed because Updates accept any file type Monday
|
|
58
|
+
* supports).
|
|
59
|
+
*/
|
|
60
|
+
import { z } from 'zod';
|
|
61
|
+
import { type CommandModule } from '../types.js';
|
|
62
|
+
import { type UpdateUploadOutput } from '../../api/assets.js';
|
|
63
|
+
declare const inputSchema: z.ZodObject<{
|
|
64
|
+
updateId: z.core.$ZodBranded<z.ZodString, "UpdateId", "out">;
|
|
65
|
+
file: z.ZodString;
|
|
66
|
+
}, z.core.$strict>;
|
|
67
|
+
export declare const updateUploadCommand: CommandModule<z.infer<typeof inputSchema>, UpdateUploadOutput>;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/commands/update/upload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,qBAAqB,CAAC;AAM7B,QAAA,MAAM,WAAW;;;kBAcN,CAAC;AAEZ,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAC7C,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,EAC3B,kBAAkB,CAuLnB,CAAC"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `monday update upload <uid> <file>` — attach a file to an Update
|
|
3
|
+
* (comment) via Monday's `add_file_to_update` mutation
|
|
4
|
+
* (cli-design.md §4.3 + §6.4 asset-upload sub-section + §13 v0.4
|
|
5
|
+
* entry; v0.4-plan.md §3 M31).
|
|
6
|
+
*
|
|
7
|
+
* **Wire shape.** Single multipart/form-data round-trip via
|
|
8
|
+
* {@link addFileToUpdate} against `mutation AddFileToUpdate` with
|
|
9
|
+
* `operationName: 'AddFileToUpdate'` (R-NEW-37 W2 audit-point).
|
|
10
|
+
* Same `MultipartTransport` seam as `item upload`; no column-id
|
|
11
|
+
* involved (Updates carry attachments via `Update.assets` directly,
|
|
12
|
+
* not via column values).
|
|
13
|
+
*
|
|
14
|
+
* **Argv shape.** Two positional args:
|
|
15
|
+
*
|
|
16
|
+
* - `<uid>` — numeric update ID; brand-validated via
|
|
17
|
+
* {@link UpdateIdSchema}.
|
|
18
|
+
* - `<file>` — local file path (same constraints as
|
|
19
|
+
* `monday item upload`: regular readable file; stdin not
|
|
20
|
+
* supported at v0.4-M31).
|
|
21
|
+
*
|
|
22
|
+
* **No column-type validation needed.** Updates accept any file
|
|
23
|
+
* type Monday supports — no column-shape gating like
|
|
24
|
+
* `item upload`'s `file`-only check. Server-side validation handles
|
|
25
|
+
* the rest (size cap, filename sanity, virus scan).
|
|
26
|
+
*
|
|
27
|
+
* **Local file failures + size handling — same `details.reason`
|
|
28
|
+
* discrimination as `item upload`.** Three values:
|
|
29
|
+
* - `'file_not_readable'` — ENOENT / EACCES / path is a
|
|
30
|
+
* directory; fires at IMPL via `fs.stat()` pre-check.
|
|
31
|
+
* - `'file_empty'` — zero-byte file; fires via `fs.stat()`.
|
|
32
|
+
* - `'file_too_large'` — Monday's server-side size-cap
|
|
33
|
+
* rejection rewrap; carries `details.file_size_bytes`
|
|
34
|
+
* from the local `fs.stat()` measurement at upload
|
|
35
|
+
* time (NOT a Monday error-payload field — Monday's
|
|
36
|
+
* wire rejection may not surface a size; the CLI
|
|
37
|
+
* threads the locally-measured size into the details
|
|
38
|
+
* slot for a stable agent-keyed envelope).
|
|
39
|
+
* No CLI-side hardcoded size pre-check; Monday's per-file cap
|
|
40
|
+
* is plan-tier-dependent and not exposed via the schema.
|
|
41
|
+
*
|
|
42
|
+
* **`--dry-run` shape** per §6.4 asset-upload variant — emits
|
|
43
|
+
* `{operation: 'add_file_to_update', update_id, file_path,
|
|
44
|
+
* filename, file_size_bytes}` with `meta.source: 'none'`. No wire
|
|
45
|
+
* call fires.
|
|
46
|
+
*
|
|
47
|
+
* **Idempotency: NO** — re-running uploads a second copy. Agents
|
|
48
|
+
* needing register-once dedupe on `Update.assets` reads.
|
|
49
|
+
*
|
|
50
|
+
* **Cache invalidation.** N/A — Updates aren't part of the §8
|
|
51
|
+
* cache scope (board-metadata-only); the upload changes the
|
|
52
|
+
* Update's asset collection but nothing the cache tracks.
|
|
53
|
+
*
|
|
54
|
+
* **Status: runtime body shipped at v0.4-M31 IMPL** — mirrors
|
|
55
|
+
* `item upload` minus the column-resolution + cache-invalidation
|
|
56
|
+
* legs (Updates aren't part of the §8 cache scope; no per-column
|
|
57
|
+
* type check needed because Updates accept any file type Monday
|
|
58
|
+
* supports).
|
|
59
|
+
*/
|
|
60
|
+
import { z } from 'zod';
|
|
61
|
+
import { stat as fsStat, access as fsAccess, readFile } from 'node:fs/promises';
|
|
62
|
+
import { constants as fsConstants } from 'node:fs';
|
|
63
|
+
import { resolve as resolvePath, basename } from 'node:path';
|
|
64
|
+
import { ensureSubcommand } from '../types.js';
|
|
65
|
+
import { parseArgv } from '../parse-argv.js';
|
|
66
|
+
import { UpdateIdSchema } from '../../types/ids.js';
|
|
67
|
+
import { updateUploadOutputSchema, addFileToUpdate, } from '../../api/assets.js';
|
|
68
|
+
import { resolveClient } from '../../api/resolve-client.js';
|
|
69
|
+
import { UsageError, asError, errorCode } from '../../utils/errors.js';
|
|
70
|
+
import { sniffContentType } from '../../utils/mime.js';
|
|
71
|
+
import { emitMutation, emitDryRun } from '../emit.js';
|
|
72
|
+
const inputSchema = z
|
|
73
|
+
.object({
|
|
74
|
+
updateId: UpdateIdSchema,
|
|
75
|
+
file: z
|
|
76
|
+
.string()
|
|
77
|
+
.min(1, {
|
|
78
|
+
message: '<file> must be a non-empty local file path; stdin (`-`) is not supported in v0.4-M31 (a future contract extension may add stdin support once a `--filename <name>` companion flag is pinned).',
|
|
79
|
+
})
|
|
80
|
+
.refine((p) => p !== '-', {
|
|
81
|
+
message: '<file> cannot be `-` — stdin upload is not supported in v0.4-M31. Pass a local file path resolved relative to cwd. A future contract extension may add stdin support once a `--filename <name>` companion flag is pinned.',
|
|
82
|
+
}),
|
|
83
|
+
})
|
|
84
|
+
.strict();
|
|
85
|
+
export const updateUploadCommand = {
|
|
86
|
+
name: 'update.upload',
|
|
87
|
+
summary: 'Attach a file to an Update (comment) via add_file_to_update',
|
|
88
|
+
examples: [
|
|
89
|
+
'monday update upload 98765 ./screenshot.png',
|
|
90
|
+
'monday update upload 98765 ./report.pdf --dry-run',
|
|
91
|
+
],
|
|
92
|
+
idempotent: false,
|
|
93
|
+
inputSchema,
|
|
94
|
+
outputSchema: updateUploadOutputSchema,
|
|
95
|
+
attach: (program, ctx) => {
|
|
96
|
+
const noun = ensureSubcommand(program, 'update', 'Update (comment) commands (cli-design §4.3 UPDATE)');
|
|
97
|
+
noun
|
|
98
|
+
.command('upload <updateId> <file>')
|
|
99
|
+
.description(updateUploadCommand.summary)
|
|
100
|
+
.addHelpText('after', [
|
|
101
|
+
'',
|
|
102
|
+
'Examples:',
|
|
103
|
+
...updateUploadCommand.examples.map((e) => ` ${e}`),
|
|
104
|
+
'',
|
|
105
|
+
'Notes:',
|
|
106
|
+
' - Uploads cross the wire as multipart/form-data (different transport from JSON-only verbs).',
|
|
107
|
+
' - File path is resolved relative to the cwd; stdin (`-`) is not supported in this release.',
|
|
108
|
+
' - Re-running with the same args creates a second Asset; `add_file_to_update` is not idempotent.',
|
|
109
|
+
'',
|
|
110
|
+
].join('\n'))
|
|
111
|
+
.action(async (updateIdArg, fileArg) => {
|
|
112
|
+
const parsed = parseArgv(updateUploadCommand.inputSchema, {
|
|
113
|
+
updateId: updateIdArg,
|
|
114
|
+
file: fileArg,
|
|
115
|
+
});
|
|
116
|
+
// Same fs.stat() + fs.access(R_OK) pre-check shape as
|
|
117
|
+
// `item upload` (round-1 P2-2 fix). Pre-resolveClient so a
|
|
118
|
+
// missing/unreadable-file error surfaces as usage_error
|
|
119
|
+
// (exit 1) before any token check.
|
|
120
|
+
const filePath = resolvePath(process.cwd(), parsed.file);
|
|
121
|
+
const filename = basename(filePath);
|
|
122
|
+
let fileSizeBytes;
|
|
123
|
+
try {
|
|
124
|
+
const stats = await fsStat(filePath);
|
|
125
|
+
if (!stats.isFile()) {
|
|
126
|
+
throw new UsageError(`<file> ${JSON.stringify(parsed.file)} is not a regular file ` +
|
|
127
|
+
`(resolved to ${JSON.stringify(filePath)}).`, {
|
|
128
|
+
details: {
|
|
129
|
+
reason: 'file_not_readable',
|
|
130
|
+
file_path: filePath,
|
|
131
|
+
hint: 'pass a path to a regular readable file; directories ' +
|
|
132
|
+
'and special files (sockets, devices) are rejected.',
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
await fsAccess(filePath, fsConstants.R_OK);
|
|
137
|
+
fileSizeBytes = stats.size;
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
if (err instanceof UsageError) {
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
const code = errorCode(err);
|
|
144
|
+
throw new UsageError(`<file> ${JSON.stringify(parsed.file)} cannot be read ` +
|
|
145
|
+
`(resolved to ${JSON.stringify(filePath)}): ` +
|
|
146
|
+
`${asError(err).message}.`, {
|
|
147
|
+
cause: err,
|
|
148
|
+
details: {
|
|
149
|
+
reason: 'file_not_readable',
|
|
150
|
+
file_path: filePath,
|
|
151
|
+
...(code === undefined ? {} : { errno_code: code }),
|
|
152
|
+
hint: 'check that the path exists, is readable by the current ' +
|
|
153
|
+
'user, and isn\'t a directory.',
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (fileSizeBytes === 0) {
|
|
158
|
+
throw new UsageError(`<file> ${JSON.stringify(parsed.file)} is empty (0 bytes); ` +
|
|
159
|
+
`Monday rejects empty uploads server-side.`, {
|
|
160
|
+
details: {
|
|
161
|
+
reason: 'file_empty',
|
|
162
|
+
file_path: filePath,
|
|
163
|
+
filename,
|
|
164
|
+
file_size_bytes: 0,
|
|
165
|
+
hint: 'Monday returns FILE_SIZE_LIMIT_EXCEEDED on empty ' +
|
|
166
|
+
'uploads. Provide a non-empty file or remove the upload ' +
|
|
167
|
+
'call.',
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const { client, globalFlags, apiVersion, multipart, toEmit } = resolveClient(ctx, program.opts());
|
|
172
|
+
if (globalFlags.dryRun) {
|
|
173
|
+
// D5 closure mirror — dry-run is fs.stat()-backed; no
|
|
174
|
+
// wire mutation; no file bytes loaded. `update upload`
|
|
175
|
+
// dry-run carries `update_id` instead of `item_id` +
|
|
176
|
+
// `column_id`; otherwise structurally identical to the
|
|
177
|
+
// `item upload` dry-run shape. `file_path` is the
|
|
178
|
+
// argv-derived path per cli-design §6.4 sample (round-2
|
|
179
|
+
// P3-2 fix; mirrors `item upload`).
|
|
180
|
+
emitDryRun({
|
|
181
|
+
ctx,
|
|
182
|
+
programOpts: program.opts(),
|
|
183
|
+
plannedChanges: [
|
|
184
|
+
{
|
|
185
|
+
operation: 'add_file_to_update',
|
|
186
|
+
update_id: parsed.updateId,
|
|
187
|
+
file_path: parsed.file,
|
|
188
|
+
filename,
|
|
189
|
+
file_size_bytes: fileSizeBytes,
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
source: 'none',
|
|
193
|
+
cacheAgeSeconds: null,
|
|
194
|
+
apiVersion,
|
|
195
|
+
});
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const bytes = await readFile(filePath);
|
|
199
|
+
const file = new Blob([bytes], { type: sniffContentType(filename) });
|
|
200
|
+
const result = await addFileToUpdate({
|
|
201
|
+
client,
|
|
202
|
+
multipart,
|
|
203
|
+
updateId: parsed.updateId,
|
|
204
|
+
file,
|
|
205
|
+
filename,
|
|
206
|
+
signal: ctx.signal,
|
|
207
|
+
retries: globalFlags.retry,
|
|
208
|
+
});
|
|
209
|
+
// No cache invalidation per D6 — Updates aren't part of the
|
|
210
|
+
// §8 cache scope (which covers board metadata only).
|
|
211
|
+
const data = {
|
|
212
|
+
operation: 'add_file_to_update',
|
|
213
|
+
update_id: parsed.updateId,
|
|
214
|
+
filename,
|
|
215
|
+
file_size_bytes: fileSizeBytes,
|
|
216
|
+
asset: result.asset,
|
|
217
|
+
};
|
|
218
|
+
emitMutation({
|
|
219
|
+
ctx,
|
|
220
|
+
data,
|
|
221
|
+
schema: updateUploadCommand.outputSchema,
|
|
222
|
+
programOpts: program.opts(),
|
|
223
|
+
...toEmit({
|
|
224
|
+
data: result.asset,
|
|
225
|
+
complexity: result.complexity,
|
|
226
|
+
stats: { attempts: 1, totalBackoffMs: 0 },
|
|
227
|
+
}),
|
|
228
|
+
source: 'live',
|
|
229
|
+
cacheAgeSeconds: null,
|
|
230
|
+
complexity: result.complexity,
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/commands/update/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TeamMembershipResult, TeamUser } from '../../api/teams.js';
|
|
2
|
+
export interface ProjectMembershipResultsInputs {
|
|
3
|
+
readonly inputUserIds: readonly string[];
|
|
4
|
+
readonly failedUsers: readonly TeamUser[];
|
|
5
|
+
readonly successfulUsers: readonly TeamUser[];
|
|
6
|
+
readonly operation: 'add_users_to_team' | 'remove_users_from_team';
|
|
7
|
+
readonly teamId: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const projectMembershipResults: (inputs: ProjectMembershipResultsInputs) => readonly TeamMembershipResult[];
|
|
10
|
+
//# sourceMappingURL=_team-membership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_team-membership.d.ts","sourceRoot":"","sources":["../../../src/commands/user/_team-membership.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EACV,oBAAoB,EACpB,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,wBAAwB,CAAC;IACnE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAgBD,eAAO,MAAM,wBAAwB,GACnC,QAAQ,8BAA8B,KACrC,SAAS,oBAAoB,EA2C/B,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared partial-success projection helper for the two team-
|
|
3
|
+
* membership verbs (`monday user team-add-members` +
|
|
4
|
+
* `monday user team-remove-members`).
|
|
5
|
+
*
|
|
6
|
+
* Both verbs receive a wire `ChangeTeamMembershipsResult` shape
|
|
7
|
+
* (`failed_users: [User!]` + `successful_users: [User!]`) and
|
|
8
|
+
* must project to the universal §6.1 partial-success envelope's
|
|
9
|
+
* `results: [{user_id, ok, ...}]` shape with input order
|
|
10
|
+
* preserved. The two action bodies' projection logic is
|
|
11
|
+
* byte-identical modulo the `operation` literal — lifting at
|
|
12
|
+
* IMPL kickoff keeps both call sites at one helper invocation +
|
|
13
|
+
* pins the input-order + bucket-lookup discipline in one place.
|
|
14
|
+
*
|
|
15
|
+
* **Wire-vs-CLI semantics asymmetry.** Monday's `failed_users[]`
|
|
16
|
+
* carries the User object but no per-user reason on the wire;
|
|
17
|
+
* the projection emits a generic `membership_failed` error code.
|
|
18
|
+
* See `teamMembershipResultSchema` JSDoc in `src/api/teams.ts`
|
|
19
|
+
* for the canonical asymmetry note + `docs/architecture.md`
|
|
20
|
+
* cross-link (R-NEW-41 4th consumer trigger).
|
|
21
|
+
*
|
|
22
|
+
* **Input-order discipline.** Result order mirrors the input
|
|
23
|
+
* `--users <id,...>` order; for each input user_id the helper
|
|
24
|
+
* looks up in the failed set first (preserving wire's explicit
|
|
25
|
+
* failure flag) then the successful map. An input user_id
|
|
26
|
+
* missing from BOTH buckets surfaces `internal_error` —
|
|
27
|
+
* Monday's wire is expected to return every input user in one
|
|
28
|
+
* bucket, and a missing user indicates a wire-shape regression
|
|
29
|
+
* worth surfacing loudly rather than silently dropping a record.
|
|
30
|
+
*
|
|
31
|
+
* **Single-file scope.** The `_` prefix mirrors the M26b
|
|
32
|
+
* `dev/_shared.ts` cadence — module-private helpers shared
|
|
33
|
+
* across sibling commands but never exported beyond the
|
|
34
|
+
* containing namespace.
|
|
35
|
+
*/
|
|
36
|
+
import { ApiError } from '../../utils/errors.js';
|
|
37
|
+
/**
|
|
38
|
+
* Generic per-user failure message used when Monday's wire
|
|
39
|
+
* surfaces a user in `failed_users[]` without a per-user reason
|
|
40
|
+
* (the wire's `ChangeTeamMembershipsResult` carries no error /
|
|
41
|
+
* reason / message slot — round-2 probe verified 2 fields only).
|
|
42
|
+
* Surfacing a uniform message keeps agent recovery flows
|
|
43
|
+
* predictable; agents key off `error.code === 'membership_failed'`
|
|
44
|
+
* to retry or surface to the user.
|
|
45
|
+
*/
|
|
46
|
+
const FAILED_MEMBERSHIP_MESSAGE = 'Monday rejected this user for team membership change ' +
|
|
47
|
+
'(no per-user reason on the wire — see `docs/architecture.md` ' +
|
|
48
|
+
'Wire-vs-CLI semantics documentation conventions).';
|
|
49
|
+
export const projectMembershipResults = (inputs) => {
|
|
50
|
+
const failedById = new Map();
|
|
51
|
+
for (const user of inputs.failedUsers) {
|
|
52
|
+
failedById.set(user.id, user);
|
|
53
|
+
}
|
|
54
|
+
const successfulById = new Map();
|
|
55
|
+
for (const user of inputs.successfulUsers) {
|
|
56
|
+
successfulById.set(user.id, user);
|
|
57
|
+
}
|
|
58
|
+
return inputs.inputUserIds.map((userId) => {
|
|
59
|
+
if (failedById.has(userId)) {
|
|
60
|
+
return {
|
|
61
|
+
user_id: userId,
|
|
62
|
+
ok: false,
|
|
63
|
+
error: {
|
|
64
|
+
code: 'membership_failed',
|
|
65
|
+
message: FAILED_MEMBERSHIP_MESSAGE,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const successful = successfulById.get(userId);
|
|
70
|
+
if (successful !== undefined) {
|
|
71
|
+
return {
|
|
72
|
+
user_id: userId,
|
|
73
|
+
ok: true,
|
|
74
|
+
user: successful,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
throw new ApiError('internal_error', `Monday's ${inputs.operation} response omitted user ${userId} from both failed_users and successful_users (wire-shape regression).`, {
|
|
78
|
+
details: {
|
|
79
|
+
team_id: inputs.teamId,
|
|
80
|
+
user_id: userId,
|
|
81
|
+
operation: inputs.operation,
|
|
82
|
+
hint: 'wire shape regression — re-probe ' +
|
|
83
|
+
'`ChangeTeamMembershipsResult` to confirm bucket semantics',
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=_team-membership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_team-membership.js","sourceRoot":"","sources":["../../../src/commands/user/_team-membership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAcjD;;;;;;;;GAQG;AACH,MAAM,yBAAyB,GAC7B,uDAAuD;IACvD,+DAA+D;IAC/D,mDAAmD,CAAC;AAEtD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,MAAsC,EACL,EAAE;IACnC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACtC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAoB,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC1C,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAwB,EAAE;QAC9D,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,MAAM;gBACf,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,yBAAyB;iBACnC;aACF,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,MAAM;gBACf,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,UAAU;aACjB,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,gBAAgB,EAChB,YAAY,MAAM,CAAC,SAAS,0BAA0B,MAAM,uEAAuE,EACnI;YACE,OAAO,EAAE;gBACP,OAAO,EAAE,MAAM,CAAC,MAAM;gBACtB,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,IAAI,EACF,mCAAmC;oBACnC,2DAA2D;aAC9D;SACF,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `monday user team-add-members <tid> --users <id,...>
|
|
3
|
+
* [--dry-run]` — add one or more users to a team (`cli-design.md`
|
|
4
|
+
* §4.3 USER section + §13 v0.5 entry; `v0.5-plan.md` §3 M34).
|
|
5
|
+
*
|
|
6
|
+
* **Wire shape.** Single `add_users_to_team(team_id, user_ids)`
|
|
7
|
+
* round-trip via {@link addUsersToTeam} against `mutation
|
|
8
|
+
* AddUsersToTeam` with `operationName: 'AddUsersToTeam'`
|
|
9
|
+
* (R-NEW-37 W2 audit-point). Monday returns
|
|
10
|
+
* `ChangeTeamMembershipsResult { failed_users: [User!],
|
|
11
|
+
* successful_users: [User!] }` — a wire-level partial-success
|
|
12
|
+
* envelope. The action body wraps this into the §6.1
|
|
13
|
+
* universal partial-success shape `data: { operation:
|
|
14
|
+
* "add_users_to_team", team_id, results: [{ok, user_id, ...}]
|
|
15
|
+
* }` at the verb boundary (D5 closure).
|
|
16
|
+
*
|
|
17
|
+
* **Argv shape.**
|
|
18
|
+
*
|
|
19
|
+
* - `<teamId>` — positional `TeamId`. Required, brand-
|
|
20
|
+
* validated at parse boundary.
|
|
21
|
+
* - `--users <id,...>` — required, comma-separated numeric
|
|
22
|
+
* user IDs (maps to wire `user_ids: [ID!]!`). Each entry
|
|
23
|
+
* brand-validated via {@link UserIdSchema} through the
|
|
24
|
+
* lifted {@link parseBrandedListArg} helper (R-NEW-70
|
|
25
|
+
* consumer #3 post-lift).
|
|
26
|
+
*
|
|
27
|
+
* **Output envelope.** Per cli-design §6.1 universal partial-
|
|
28
|
+
* success shape — emits one `ok: true` envelope with
|
|
29
|
+
* `data: { operation: "add_users_to_team", team_id, results:
|
|
30
|
+
* [{user_id, ok, user?, error?}] }`. The wire's
|
|
31
|
+
* `failed_users[]` projects to `{ok: false, user_id, error:
|
|
32
|
+
* {code: "membership_failed", message: <generic>}}` records;
|
|
33
|
+
* the wire's `successful_users[]` projects to `{ok: true,
|
|
34
|
+
* user_id, user: {id, name, email}}` records. Result order
|
|
35
|
+
* mirrors the input `--users <id,...>` order (input ID echoed
|
|
36
|
+
* into `user_id` for correlation; wire User object hydrated
|
|
37
|
+
* into `user` slot when successful).
|
|
38
|
+
*
|
|
39
|
+
* **Wire-vs-CLI semantics asymmetry.** See
|
|
40
|
+
* `teamMembershipResultSchema` JSDoc in `src/api/teams.ts` for
|
|
41
|
+
* the canonical note + cross-link to `docs/architecture.md`'s
|
|
42
|
+
* "Wire-vs-CLI semantics documentation conventions" section
|
|
43
|
+
* (R-NEW-41 4th consumer trigger).
|
|
44
|
+
*
|
|
45
|
+
* **Dry-run shape** per cli-design §6.4 mutation-dry-run
|
|
46
|
+
* variant. SINGLE planned operation entry `{operation:
|
|
47
|
+
* 'add_users_to_team', team_id, user_ids: [...]}` with
|
|
48
|
+
* `user_ids` echoing the input argv order — Monday's wire
|
|
49
|
+
* is a single-shot bulk call (`add_users_to_team(team_id,
|
|
50
|
+
* user_ids: [ID!]!)`), NOT a per-user fan-out like
|
|
51
|
+
* `monday workspace add-users` (which dispatches sequentially
|
|
52
|
+
* one wire call per user). No preflight read fires; argv-
|
|
53
|
+
* derived. `meta.source: 'none'`.
|
|
54
|
+
*
|
|
55
|
+
* **Idempotent: yes** — Monday is no-op on a re-add (the
|
|
56
|
+
* user already being in the team surfaces as `successful_
|
|
57
|
+
* users[]` regardless). Same idempotency story as
|
|
58
|
+
* `workspace add-users`.
|
|
59
|
+
*
|
|
60
|
+
* **Admin-permission-sensitive.** Non-admin callers surface
|
|
61
|
+
* `forbidden` (mapped from Monday's PERMISSION_DENIED
|
|
62
|
+
* extension).
|
|
63
|
+
*
|
|
64
|
+
* **Runtime body landed at v0.5-M34 IMPL.** Argv + `--users`
|
|
65
|
+
* parse run BEFORE `resolveClient` (usage-error-before-config-
|
|
66
|
+
* error precedence). Dry-run path emits the minimal planned
|
|
67
|
+
* shape; live path dispatches {@link addUsersToTeam} and
|
|
68
|
+
* projects `failed_users[]` / `successful_users[]` into the
|
|
69
|
+
* universal §6.1 partial-success envelope via
|
|
70
|
+
* {@link projectMembershipResults} (input order preserved).
|
|
71
|
+
*/
|
|
72
|
+
import { z } from 'zod';
|
|
73
|
+
import { type CommandModule } from '../types.js';
|
|
74
|
+
import { type TeamAddMembersOutput } from '../../api/teams.js';
|
|
75
|
+
declare const inputSchema: z.ZodObject<{
|
|
76
|
+
teamId: z.core.$ZodBranded<z.ZodString, "TeamId", "out">;
|
|
77
|
+
users: z.ZodString;
|
|
78
|
+
}, z.core.$strict>;
|
|
79
|
+
export declare const teamAddMembersCommand: CommandModule<z.infer<typeof inputSchema>, TeamAddMembersOutput>;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=team-add-members.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-add-members.d.ts","sourceRoot":"","sources":["../../../src/commands/user/team-add-members.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAMnE,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAG5B,QAAA,MAAM,WAAW;;;kBAKN,CAAC;AAEZ,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAC/C,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,EAC3B,oBAAoB,CAiHrB,CAAC"}
|