@cargo-ai/cli 1.0.72 → 1.0.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +21 -0
  2. package/build/commands/ai/agent.js +2 -2
  3. package/build/commands/ai/chat.js +1 -1
  4. package/build/commands/ai/document.js +1 -1
  5. package/build/commands/ai/memory.js +3 -3
  6. package/build/commands/ai/message.js +2 -2
  7. package/build/commands/ai/release.d.ts.map +1 -1
  8. package/build/commands/ai/release.js +3 -3
  9. package/build/commands/ai/vote.d.ts.map +1 -1
  10. package/build/commands/ai/vote.js +1 -1
  11. package/build/commands/auth/email.d.ts +24 -0
  12. package/build/commands/auth/email.d.ts.map +1 -1
  13. package/build/commands/auth/email.js +27 -14
  14. package/build/commands/auth/index.d.ts.map +1 -1
  15. package/build/commands/auth/index.js +9 -3
  16. package/build/commands/auth/workspace.d.ts.map +1 -1
  17. package/build/commands/auth/workspace.js +99 -26
  18. package/build/commands/billing/subscription.d.ts.map +1 -1
  19. package/build/commands/billing/subscription.js +3 -3
  20. package/build/commands/billing/usage.d.ts.map +1 -1
  21. package/build/commands/billing/usage.js +1 -1
  22. package/build/commands/connection/action.d.ts.map +1 -1
  23. package/build/commands/connection/action.js +1 -1
  24. package/build/commands/connection/connector.d.ts.map +1 -1
  25. package/build/commands/connection/connector.js +145 -22
  26. package/build/commands/connection/integration.d.ts.map +1 -1
  27. package/build/commands/connection/integration.js +1 -1
  28. package/build/commands/content/library.js +1 -1
  29. package/build/commands/context/runtime.js +1 -1
  30. package/build/commands/expression/recipe.d.ts.map +1 -1
  31. package/build/commands/expression/recipe.js +9 -9
  32. package/build/commands/mailboxManagement/event.js +1 -1
  33. package/build/commands/mailboxManagement/mailbox.d.ts.map +1 -1
  34. package/build/commands/mailboxManagement/mailbox.js +3 -3
  35. package/build/commands/mailboxManagement/message.js +1 -1
  36. package/build/commands/mailboxManagement/suppression.js +1 -1
  37. package/build/commands/mailboxManagement/thread.js +1 -1
  38. package/build/commands/observability/alert.js +2 -2
  39. package/build/commands/orchestration/action.d.ts.map +1 -1
  40. package/build/commands/orchestration/action.js +18 -63
  41. package/build/commands/orchestration/batch.js +7 -7
  42. package/build/commands/orchestration/node.js +2 -2
  43. package/build/commands/orchestration/play.d.ts.map +1 -1
  44. package/build/commands/orchestration/play.js +9 -9
  45. package/build/commands/orchestration/record.d.ts.map +1 -1
  46. package/build/commands/orchestration/record.js +10 -10
  47. package/build/commands/orchestration/release.js +1 -1
  48. package/build/commands/orchestration/run.d.ts.map +1 -1
  49. package/build/commands/orchestration/run.js +14 -14
  50. package/build/commands/orchestration/span.d.ts.map +1 -1
  51. package/build/commands/orchestration/span.js +4 -4
  52. package/build/commands/orchestration/tool.js +2 -2
  53. package/build/commands/orchestration/trace.d.ts.map +1 -1
  54. package/build/commands/orchestration/trace.js +2 -2
  55. package/build/commands/revenueOrganization/capacity.d.ts.map +1 -1
  56. package/build/commands/revenueOrganization/capacity.js +2 -2
  57. package/build/commands/revenueOrganization/territory.js +2 -2
  58. package/build/commands/segmentation/change.d.ts.map +1 -1
  59. package/build/commands/segmentation/change.js +4 -4
  60. package/build/commands/segmentation/record.js +1 -1
  61. package/build/commands/segmentation/segment.js +2 -2
  62. package/build/commands/start/brief.d.ts +107 -0
  63. package/build/commands/start/brief.d.ts.map +1 -0
  64. package/build/commands/start/brief.js +222 -0
  65. package/build/commands/start/index.d.ts +44 -0
  66. package/build/commands/start/index.d.ts.map +1 -0
  67. package/build/commands/start/index.js +431 -0
  68. package/build/commands/start/state.d.ts +50 -0
  69. package/build/commands/start/state.d.ts.map +1 -0
  70. package/build/commands/start/state.js +101 -0
  71. package/build/commands/storage/query.js +1 -1
  72. package/build/commands/storage/record.js +2 -2
  73. package/build/commands/storage/run.js +2 -2
  74. package/build/commands/systemOfRecordIntegration/log.js +1 -1
  75. package/build/commands/systemOfRecordIntegration/systemOfRecord.js +1 -1
  76. package/build/commands/version.js +1 -1
  77. package/build/commands/workspaceManagement/folder.d.ts.map +1 -1
  78. package/build/commands/workspaceManagement/folder.js +1 -1
  79. package/build/commands/workspaceManagement/role.d.ts.map +1 -1
  80. package/build/commands/workspaceManagement/role.js +2 -2
  81. package/build/commands/workspaceManagement/session.js +1 -1
  82. package/build/commands/workspaceManagement/user.d.ts.map +1 -1
  83. package/build/commands/workspaceManagement/user.js +2 -2
  84. package/build/commands/workspaceManagement/workspaces.js +1 -1
  85. package/build/config.d.ts +1 -0
  86. package/build/config.d.ts.map +1 -1
  87. package/build/config.js +1 -0
  88. package/build/index.js +50 -6
  89. package/build/paletteLayout.d.ts +16 -0
  90. package/build/paletteLayout.d.ts.map +1 -0
  91. package/build/paletteLayout.js +131 -0
  92. package/build/setupIssues.d.ts +4 -16
  93. package/build/setupIssues.d.ts.map +1 -1
  94. package/build/setupIssues.js +3 -52
  95. package/build/utils/booleanOption.d.ts.map +1 -1
  96. package/build/utils/booleanOption.js +5 -4
  97. package/package.json +3 -3
  98. package/build/commands/orchestration/costTable.d.ts +0 -121
  99. package/build/commands/orchestration/costTable.d.ts.map +0 -1
  100. package/build/commands/orchestration/costTable.js +0 -363
@@ -1,5 +1,8 @@
1
+ import { awaitBrowserStep, buildCliConnectorCreateUrl, buildCliConnectorEditUrl, isCodingAgent, openBrowser, resolveUserUuid, shouldWaitForPerson, } from "@cargo-ai/cdk/cli";
2
+ import { getConfig } from "../../config.js";
1
3
  import { parseBooleanOption } from "../../utils/booleanOption.js";
2
- import { handleApiCall, outputJson, parseJson } from "../runHandler.js";
4
+ import { openPromptInput } from "../../utils/prompt.js";
5
+ import { colors, ExitCodes, failWith, handleApiCall, info, outputJson, parseJson, } from "../runHandler.js";
3
6
  export function registerConnectorCommands(parent, getApi) {
4
7
  const connector = parent
5
8
  .command("connector")
@@ -46,7 +49,7 @@ export function registerConnectorCommands(parent, getApi) {
46
49
  .requiredOption("--slug <slug>", "Field slug to autocomplete (string, required)")
47
50
  .requiredOption("--params <json>", "Autocomplete parameters (JSON object, required)")
48
51
  .option("--value <value>", "Search value to filter results (string)")
49
- .option("--refresh [value]", "Refresh cached results (true/false, defaults to true when passed bare)", parseBooleanOption)
52
+ .option("--refresh [true|false]", "Refresh cached results (defaults to true when passed bare)", parseBooleanOption)
50
53
  .option("--variables <json>", "Additional variables (JSON object)")
51
54
  .action(async (opts) => {
52
55
  const api = getApi();
@@ -79,39 +82,70 @@ export function registerConnectorCommands(parent, getApi) {
79
82
  });
80
83
  connector
81
84
  .command("create")
82
- .description("Create a connector")
83
- .requiredOption("--name <name>", "Connector name (string, required)")
84
- .requiredOption("--slug <slug>", "Connector slug identifier (string, required)")
85
+ .description("Create a connector. Without --config, opens the hosted form in a browser and waits.")
86
+ .option("--name <name>", "Connector name (string, required with --config)")
87
+ .option("--slug <slug>", "Connector slug identifier (string, required with --config)")
85
88
  .requiredOption("--integration-slug <slug>", "Integration slug to connect to (string, required)")
86
- .option("--config <json>", "Connector configuration (JSON object, shape depends on integration)")
89
+ .option("--config <json>", "Connector configuration (JSON object, shape depends on integration). Skips the browser.")
87
90
  .option("--rate-limit <json>", 'Rate limit configuration (JSON object). Shape: {"maxRequests": integer, "windowMs": integer}')
88
91
  .option("--cache-ttl-milliseconds <n>", "Cache TTL in milliseconds (integer)")
89
92
  .addHelpText("after", `
90
93
  Examples:
91
- $ cargo-ai connection connector create --name "HubSpot" --slug hubspot-main --integration-slug hubspot
94
+ # Open the hosted form, wait, then write connectors/hubspot.ts and bind it
95
+ $ cargo-ai connection connector create --integration-slug hubspot
96
+
97
+ # Fully non-interactive — no browser
92
98
  $ cargo-ai connection connector create --name "HubSpot" --slug hubspot-main --integration-slug hubspot \\
93
- --rate-limit '{"maxRequests":100,"windowMs":60000}' --cache-ttl-milliseconds 300000`)
99
+ --config '{"method":"privateApp","accessToken":"pat-..."}'
100
+ $ cargo-ai connection connector create --name "HubSpot" --slug hubspot-main --integration-slug hubspot \\
101
+ --config '{...}' --rate-limit '{"maxRequests":100,"windowMs":60000}' --cache-ttl-milliseconds 300000`)
94
102
  .action(async (opts) => {
95
103
  const api = getApi();
96
- const result = await handleApiCall(() => api.connection.connector.create({
97
- name: opts.name,
98
- slug: opts.slug,
99
- integrationSlug: opts.integrationSlug,
100
- config: opts.config !== undefined
101
- ? parseJson(opts.config, "--config")
102
- : undefined,
103
- rateLimit: opts.rateLimit !== undefined
104
+ // `--config` keeps the original, fully scriptable behaviour.
105
+ if (opts.config !== undefined) {
106
+ const rateLimit = opts.rateLimit !== undefined
104
107
  ? parseJson(opts.rateLimit, "--rate-limit")
105
- : undefined,
106
- cacheTtlMilliseconds: opts.cacheTtlMilliseconds !== undefined
108
+ : undefined;
109
+ const cacheTtlMilliseconds = opts.cacheTtlMilliseconds !== undefined
107
110
  ? parseInt(opts.cacheTtlMilliseconds, 10)
108
- : undefined,
109
- }));
110
- outputJson(result);
111
+ : undefined;
112
+ const name = opts.name;
113
+ const slug = opts.slug;
114
+ if (name === undefined || slug === undefined) {
115
+ failWith("--name and --slug are required when --config is passed.", { code: ExitCodes.InvalidUsage });
116
+ return;
117
+ }
118
+ const config = parseJson(opts.config, "--config");
119
+ const result = await handleApiCall(() => api.connection.connector.create({
120
+ name,
121
+ slug,
122
+ integrationSlug: opts.integrationSlug,
123
+ config,
124
+ rateLimit,
125
+ cacheTtlMilliseconds,
126
+ }));
127
+ outputJson(result);
128
+ return;
129
+ }
130
+ const ignored = [
131
+ opts.name === undefined ? undefined : "--name",
132
+ opts.slug === undefined ? undefined : "--slug",
133
+ opts.rateLimit === undefined ? undefined : "--rate-limit",
134
+ opts.cacheTtlMilliseconds === undefined
135
+ ? undefined
136
+ : "--cache-ttl-milliseconds",
137
+ ].filter((flag) => flag !== undefined);
138
+ // The hosted form asks for all of these itself, so accepting them here
139
+ // and dropping them would silently produce a connector the caller did
140
+ // not describe.
141
+ if (ignored.length > 0) {
142
+ failWith(`${ignored.join(", ")} only applies with --config — the browser form asks for it.`, { code: ExitCodes.InvalidUsage });
143
+ }
144
+ await runCreateHandoff({ api, integrationSlug: opts.integrationSlug });
111
145
  });
112
146
  connector
113
147
  .command("update")
114
- .description("Update a connector")
148
+ .description("Update a connector. With no field flags, opens the hosted form in a browser (use it to re-authorize).")
115
149
  .requiredOption("--uuid <uuid>", "Connector UUID")
116
150
  .option("--name <name>", "Connector name")
117
151
  .option("--config <json>", "Configuration (JSON object)")
@@ -119,6 +153,19 @@ Examples:
119
153
  .option("--cache-ttl-milliseconds <n>", "Cache TTL in milliseconds")
120
154
  .action(async (opts) => {
121
155
  const api = getApi();
156
+ // No field to change means "let me edit it in the form" — the only way
157
+ // to re-run an OAuth flow for an existing connector.
158
+ const hasFieldFlag = opts.name !== undefined ||
159
+ opts.config !== undefined ||
160
+ opts.rateLimit !== undefined ||
161
+ opts.cacheTtlMilliseconds !== undefined;
162
+ if (hasFieldFlag === false) {
163
+ // Re-auth changes credentials, not the binding: the CDK file already
164
+ // exists and binds by slug, so there is nothing to write and nothing
165
+ // to wait for. Open the form and get out of the way.
166
+ openConnectorEditForm(opts.uuid);
167
+ return;
168
+ }
122
169
  const result = await handleApiCall(() => api.connection.connector.update({
123
170
  uuid: opts.uuid,
124
171
  name: opts.name,
@@ -144,3 +191,79 @@ Examples:
144
191
  outputJson(result);
145
192
  });
146
193
  }
194
+ /**
195
+ * Send the user to the connectors page, wait for them to confirm, then report
196
+ * the connector they made.
197
+ *
198
+ * Imperative only: it creates a connector and prints it. Writing
199
+ * `connectors/<slug>.ts` and binding cargo.state.json is
200
+ * `cargo-ai cdk add connector/<integration>`, so running this inside a repo
201
+ * never touches the repo.
202
+ */
203
+ async function runCreateHandoff(input) {
204
+ const { api, integrationSlug } = input;
205
+ const url = buildCliConnectorCreateUrl({
206
+ ...resolveAppContext(),
207
+ integrationSlug,
208
+ });
209
+ // Nothing can drive a browser for an agent: hand back the URL and where to
210
+ // look once a human has clicked through. `openPromptInput` still finds
211
+ // `/dev/tty` when stdin is piped; `shouldWaitForPerson` additionally
212
+ // refuses coding agents, whose stdin often looks like a TTY.
213
+ if (shouldWaitForPerson({
214
+ isCodingAgent: isCodingAgent(),
215
+ isCi: process.env["CI"] === "true",
216
+ hasPromptInput: openPromptInput() !== undefined,
217
+ }) === false) {
218
+ outputJson({
219
+ ok: true,
220
+ status: "actionRequired",
221
+ action: "openBrowser",
222
+ integrationSlug,
223
+ url,
224
+ reason: "Creating this connector needs the hosted form, which cannot be driven headlessly.",
225
+ next: `cargo-ai connection connector list --integration-slug ${integrationSlug}`,
226
+ });
227
+ return;
228
+ }
229
+ const [before, userUuid] = await Promise.all([
230
+ handleApiCall(() => api.connection.connector.list({ integrationSlug })),
231
+ resolveUserUuid(api),
232
+ ]);
233
+ const connector = await awaitBrowserStep({
234
+ api,
235
+ url,
236
+ integrationSlug,
237
+ before: before.connectors,
238
+ userUuid,
239
+ });
240
+ if (connector === undefined) {
241
+ return;
242
+ }
243
+ outputJson({ ok: true, status: "connected", connector });
244
+ }
245
+ /** Open this connector's edit form so the user can re-run its auth flow. */
246
+ function openConnectorEditForm(connectorUuid) {
247
+ const url = buildCliConnectorEditUrl({
248
+ ...resolveAppContext(),
249
+ connectorUuid,
250
+ });
251
+ info(["", "Re-authorize the connector here:", ` ${colors.cyan(url)}`, ""].join("\n"));
252
+ openBrowser(url);
253
+ outputJson({
254
+ ok: true,
255
+ status: "actionRequired",
256
+ action: "openBrowser",
257
+ url,
258
+ });
259
+ }
260
+ /** The workspace to act in; the app URL is configuration, not a guess. */
261
+ function resolveAppContext() {
262
+ const { appUrl, workspaceUuid } = getConfig();
263
+ if (workspaceUuid === undefined) {
264
+ return failWith("No workspace selected. Run 'cargo-ai login' first.", {
265
+ code: ExitCodes.NotAuthenticated,
266
+ });
267
+ }
268
+ return { appUrl, workspaceUuid };
269
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/commands/connection/integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAoGN"}
1
+ {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/commands/connection/integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAuGN"}
@@ -6,7 +6,7 @@ export function registerIntegrationCommands(parent, getApi) {
6
6
  integration
7
7
  .command("list")
8
8
  .description("List all integrations")
9
- .option("--category <category>", "Filter by category (string)")
9
+ .option("--category <engagement|marketing|sales|finance|analytics|freeform|success|support|enrichment|storage|custom>", "Filter by category")
10
10
  .option("--slugs <list>", "Filter by integration slugs (comma-separated strings)")
11
11
  .option("--search <search>", "Search by name, case-insensitive (string)")
12
12
  .option("--has-actions <bool>", 'Filter by presence of actions (string: "true" or "false")')
@@ -7,7 +7,7 @@ export function registerLibraryCommands(parent, getApi) {
7
7
  .command("list")
8
8
  .description("List workspace libraries")
9
9
  .option("--connector-uuid <uuid>", "Filter by connector UUID")
10
- .option("--kind <kind>", "Filter by kind (native or connector)")
10
+ .option("--kind <native|connector>", "Filter by kind")
11
11
  .action(async (opts) => {
12
12
  const api = getApi();
13
13
  const kind = opts.kind === "connector" || opts.kind === "native"
@@ -51,7 +51,7 @@ export function registerRuntimeCommands(parent, getApi) {
51
51
  .requiredOption("--path <path>", "Path to the file")
52
52
  .requiredOption("--old-string <old>", "Exact substring to replace (must occur once unless --replace-all is set)")
53
53
  .requiredOption("--new-string <new>", "Replacement string (may be empty to delete the match). Must differ from --old-string.")
54
- .option("--replace-all [value]", "Replace every occurrence of --old-string instead of requiring a single match", parseBooleanOption)
54
+ .option("--replace-all [true|false]", "Replace every occurrence of --old-string instead of requiring a single match", parseBooleanOption)
55
55
  .option("--commit-message <message>", "Commit message override")
56
56
  .action(async (opts) => {
57
57
  const api = getApi();
@@ -1 +1 @@
1
- {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/commands/expression/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAIxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAwKN"}
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/commands/expression/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAIxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAgLN"}
@@ -5,9 +5,9 @@ export function registerRecipeCommands(parent, getApi) {
5
5
  recipe
6
6
  .command("list")
7
7
  .description("List recipes")
8
- .option("--tab <tab>", "Tab filter (all, user, workspace, favorites)")
9
- .option("--ui-types <types>", "UI types (comma-separated: js, ai)")
10
- .option("--categories <cats>", "Categories (comma-separated)")
8
+ .option("--tab <all|user|workspace|favorites>", "Tab filter")
9
+ .option("--ui-types <js,ai>", "UI types")
10
+ .option("--categories <other,classification,cleaning,marketing,sales,event,copywriting>", "Categories")
11
11
  .option("--name <name>", "Filter by name")
12
12
  .option("--limit <n>", "Limit")
13
13
  .option("--offset <n>", "Offset")
@@ -45,12 +45,12 @@ export function registerRecipeCommands(parent, getApi) {
45
45
  .description("Create a recipe")
46
46
  .requiredOption("--name <name>", "Recipe name")
47
47
  .requiredOption("--description <text>", "Recipe description")
48
- .requiredOption("--category <cat>", "Category (other, classification, cleaning, marketing, sales, event, copywriting)")
49
- .requiredOption("--kind <kind>", "Kind (jsExpression or templateExpression)")
48
+ .requiredOption("--category <other|classification|cleaning|marketing|sales|event|copywriting>", "Category")
49
+ .requiredOption("--kind <jsExpression|templateExpression>", "Kind")
50
50
  .requiredOption("--expression <expr>", "Expression")
51
- .requiredOption("--instruct-to <value>", "Instruct to (ai or none)")
51
+ .requiredOption("--instruct-to <ai|none>", "Instruct to")
52
52
  .requiredOption("--placeholders <json>", 'Placeholders (JSON array, e.g. [{"slug":"my_var","label":"My Variable","kind":"text"}])')
53
- .option("--is-public [value]", "Make recipe public", parseBooleanOption)
53
+ .option("--is-public [true|false]", "Make recipe public", parseBooleanOption)
54
54
  .action(async (opts) => {
55
55
  const api = getApi();
56
56
  const result = await handleApiCall(() => api.expression.recipe.create({
@@ -71,10 +71,10 @@ export function registerRecipeCommands(parent, getApi) {
71
71
  .requiredOption("--uuid <uuid>", "Recipe UUID")
72
72
  .requiredOption("--name <name>", "Recipe name")
73
73
  .requiredOption("--description <text>", "Recipe description")
74
- .requiredOption("--category <cat>", "Category (other, classification, cleaning, marketing, sales, event, copywriting)")
74
+ .requiredOption("--category <other|classification|cleaning|marketing|sales|event|copywriting>", "Category")
75
75
  .requiredOption("--expression <expr>", "Expression")
76
76
  .requiredOption("--placeholders <json>", 'Placeholders (JSON array, e.g. [{"slug":"my_var","label":"My Variable","kind":"text"}])')
77
- .option("--is-public [value]", "Make recipe public", parseBooleanOption)
77
+ .option("--is-public [true|false]", "Make recipe public", parseBooleanOption)
78
78
  .action(async (opts) => {
79
79
  const api = getApi();
80
80
  const result = await handleApiCall(() => api.expression.recipe.createNewVersion({
@@ -10,7 +10,7 @@ export function registerEventCommands(parent, getApi) {
10
10
  .option("--mailbox-uuid <uuid>", "Filter by mailbox")
11
11
  .option("--message-uuid <uuid>", "Filter by outbound message")
12
12
  .option("--thread-uuid <uuid>", "Filter by thread")
13
- .option("--kinds <list>", "Filter by kind (comma-separated: sent,opened,clicked,replied,bounced,unsubscribed)")
13
+ .option("--kinds <sent,opened,clicked,replied,bounced,unsubscribed>", "Filter by kind")
14
14
  .option("--occurred-after <date>", "Occurred after (ISO 8601)")
15
15
  .option("--occurred-before <date>", "Occurred before (ISO 8601)")
16
16
  .option("--search <text>", "Search actor email or snippet")
@@ -1 +1 @@
1
- {"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../../src/commands/mailboxManagement/mailbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAUxC,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CA+SN"}
1
+ {"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../../src/commands/mailboxManagement/mailbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAUxC,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAySN"}
@@ -9,7 +9,7 @@ export function registerMailboxCommands(parent, getApi) {
9
9
  .description("List mailboxes in this workspace")
10
10
  .option("--domain-uuid <uuid>", "Only mailboxes on this sending domain")
11
11
  .option("--folder-uuid <uuid>", 'Folder UUID, or "none" for mailboxes not in a folder')
12
- .option("--statuses <list>", "Filter by statuses (comma-separated: pending,active,inactive)")
12
+ .option("--statuses <pending,active,inactive>", "Filter by statuses")
13
13
  .option("--limit <n>", "Max results to return (integer)")
14
14
  .option("--offset <n>", "Number of results to skip (integer)")
15
15
  .addHelpText("after", `
@@ -43,7 +43,7 @@ Example:
43
43
  .command("create")
44
44
  .description("Provision a mailbox on a sending domain the workspace owns")
45
45
  .requiredOption("--domain-uuid <uuid>", "Sending domain UUID")
46
- .requiredOption("--type <type>", "Mailbox flavour: google, shared, or private (outlook cannot deliver yet)")
46
+ .requiredOption("--type <google|shared|private>", "Mailbox flavour (outlook cannot deliver yet)")
47
47
  .requiredOption("--username <local-part>", "Local part of the address, e.g. jane for jane@acme.com")
48
48
  .requiredOption("--first-name <name>", "Sender first name in the From header")
49
49
  .requiredOption("--last-name <name>", "Sender last name in the From header")
@@ -136,7 +136,7 @@ Example:
136
136
  .description("Change warm-up daily target or pause/resume the pool")
137
137
  .requiredOption("--uuid <uuid>", "Mailbox UUID")
138
138
  .option("--daily-target <n>", "Warm-up messages per day at full ramp")
139
- .option("--status <status>", "Warm-up state: disabled, pending, active, paused, failed")
139
+ .option("--status <disabled|pending|active|paused|failed>", "Warm-up state")
140
140
  .addHelpText("after", `
141
141
  Example:
142
142
  $ cargo-ai mailboxManagement mailbox update-warmup --uuid 550e8400-... --status paused`)
@@ -9,7 +9,7 @@ export function registerMessageCommands(parent, getApi) {
9
9
  .description("List outbound messages")
10
10
  .option("--mailbox-uuid <uuid>", "Filter by mailbox")
11
11
  .option("--thread-uuid <uuid>", "Filter by thread")
12
- .option("--statuses <list>", "Filter by list status (comma-separated: pending,error,sent,opened,clicked,replied,bounced,unsubscribed)")
12
+ .option("--statuses <pending,error,sent,opened,clicked,replied,bounced,unsubscribed>", "Filter by list status")
13
13
  .option("--created-after <date>", "Created after (ISO 8601)")
14
14
  .option("--created-before <date>", "Created before (ISO 8601)")
15
15
  .option("--search <text>", "Search subject or recipient")
@@ -7,7 +7,7 @@ export function registerSuppressionCommands(parent, getApi) {
7
7
  suppression
8
8
  .command("list")
9
9
  .description("List suppressions")
10
- .option("--reasons <list>", "Filter by reason (comma-separated: unsubscribed,bounced,complained,manual)")
10
+ .option("--reasons <unsubscribed,bounced,complained,manual>", "Filter by reason")
11
11
  .option("--limit <n>", "Max results to return (integer)")
12
12
  .option("--offset <n>", "Number of results to skip (integer)")
13
13
  .addHelpText("after", `
@@ -8,7 +8,7 @@ export function registerThreadCommands(parent, getApi) {
8
8
  .command("list")
9
9
  .description("List threads")
10
10
  .option("--mailbox-uuid <uuid>", "Filter by mailbox")
11
- .option("--statuses <list>", "Filter by latest list status (comma-separated: pending,error,sent,opened,clicked,replied,bounced,unsubscribed)")
11
+ .option("--statuses <pending,error,sent,opened,clicked,replied,bounced,unsubscribed>", "Filter by latest list status")
12
12
  .option("--created-after <date>", "Created after (ISO 8601)")
13
13
  .option("--created-before <date>", "Created before (ISO 8601)")
14
14
  .option("--search <text>", "Search subject or recipient")
@@ -28,7 +28,7 @@ export function registerAlertCommands(parent, getApi) {
28
28
  .requiredOption("--scope <json>", 'Scope (JSON), one of: {"kind":"spans","workflowUuid":"..."}, {"kind":"runs","workflowUuid":"...","statuses":["error"]}, {"kind":"records","workflowUuid":"...","statuses":["error"]}, {"kind":"orchestrationQuery","query":"select ..."}, {"kind":"storageQuery","query":"select ..."} or {"kind":"model","modelUuid":"...","filter":{...}}')
29
29
  .requiredOption("--threshold <json>", 'Threshold (JSON). Spans, runs and records scopes: {"metric":"errorRate","operator":"gte","value":10}, {"metric":"duration","aggregation":"p95","operator":"gte","value":30}, {"metric":"credits","aggregation":"sum","operator":"gte","value":500} or {"metric":"count","operator":"lte","value":0}; model scopes: {"metric":"recordsCount","operator":"lte","value":0}, {"metric":"recordsShare","operator":"gte","value":30} (needs a scope filter), {"metric":"freshness","operator":"gte","value":60} or {"metric":"syncDuration","operator":"gte","value":300}; query scopes: {"metric":"query","operator":"gte","value":10}')
30
30
  .option("--actions <json>", "Actions fired as runs on breach (JSON Action[]: connector, tool, or agent nodes)")
31
- .option("--disabled [value]", "Create the alert disabled", parseBooleanOption)
31
+ .option("--disabled [true|false]", "Create the alert disabled", parseBooleanOption)
32
32
  .option("--description <text>", "What this alert watches")
33
33
  .option("--folder <uuid>", "Folder UUID to file the alert under")
34
34
  .action(async (opts) => {
@@ -53,7 +53,7 @@ export function registerAlertCommands(parent, getApi) {
53
53
  .requiredOption("--uuid <uuid>", "Alert UUID")
54
54
  .option("--name <name>", "Alert name")
55
55
  .option("--cron <cron>", 'Evaluation schedule: 5-field cron or "@every <interval>" (UTC), at most once a minute')
56
- .option("--enabled [value]", "Enable or disable the alert (true/false)", parseBooleanOption)
56
+ .option("--enabled [true|false]", "Enable or disable the alert", parseBooleanOption)
57
57
  .option("--scope <json>", "Scope (JSON). See `alert create`")
58
58
  .option("--threshold <json>", "Threshold (JSON). See `alert create`")
59
59
  .option("--actions <json>", "Actions fired as runs on breach (JSON Action[])")
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAqBxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAuSN"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAcxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAgTN"}
@@ -1,6 +1,5 @@
1
1
  import { parseBooleanOption } from "../../utils/booleanOption.js";
2
2
  import { applyRecordsLimit, ExitCodes, failWith, handleApiCall, outputJson, parseJson, parsePositiveInt, pollBatchUntilFinished, pollRunUntilFinished, } from "../runHandler.js";
3
- import { buildCostRows, groupActionsByIntegration, renderCostTable, summarize, } from "./costTable.js";
4
3
  export function registerActionCommands(parent, getApi) {
5
4
  const action = parent
6
5
  .command("action")
@@ -18,21 +17,34 @@ graph needed. Creates a run and consumes credits.
18
17
 
19
18
  To debug a node inside an existing workflow instead, use
20
19
  'cargo-ai orchestration node'.`);
21
- registerCostTableCommand(action, getApi);
22
20
  const listableKinds = ["connector", "native", "tool", "agent"];
23
21
  action
24
22
  .command("list")
25
23
  .description("List actions")
26
24
  .argument("[query...]", "Keywords to match (space-separated, optional)")
27
- .option("--kind <kind>", "Restrict to one kind: connector, native, tool, or agent (enum)")
25
+ .option("--kind <connector|native|tool|agent>", "Restrict to one kind")
28
26
  .option("--integration-slug <slug>", "Restrict connector actions to this integration (string)")
29
- .option("--category <category>", "Restrict connector actions to integrations in this category (e.g. enrichment, sales, freeform)")
27
+ .option("--category <engagement|marketing|sales|finance|analytics|freeform|success|support|enrichment|storage|custom>", "Restrict connector actions to integrations in this category")
30
28
  .option("--limit <n>", "Maximum results to return (integer). Omit to return all results.")
31
29
  .addHelpText("after", `
32
30
  Each result includes an 'action' object you can pass to execute, execute-batch,
33
31
  or get-output-schema. All query terms must match (AND). Matches on the action
34
32
  slug or name rank above integration matches, which rank above description.
35
33
 
34
+ Billed actions carry a 'credits' array — this is where pricing lives, so it is
35
+ the answer to "what does <action> cost". Actions without it cost no credits.
36
+ Each entry is one of three shapes, selected by the 'config' it matches:
37
+
38
+ - fixed: 'cost' credits per call.
39
+ - unit: 'cost' credits per 'unit' consumed, plus 'fixedCost' per call.
40
+ - package: 'cost' credits per block of 'unitsCount' 'unit', plus 'fixedCost'.
41
+
42
+ 'fixedCost' is a base charge on top of the metered rate, not an alternative to
43
+ it — a search billed 0.175 fixedCost + 0.025 per item costs 0.2 for one item.
44
+ When several entries are present the price depends on config, and each entry's
45
+ 'config.jsonSchema' const/enum is what selects it (an LLM model, a phone-or-
46
+ email toggle).
47
+
36
48
  Examples:
37
49
  $ cargo-ai orchestration action list enrich
38
50
  $ cargo-ai orchestration action list --kind tool
@@ -65,7 +77,7 @@ Examples:
65
77
  .description("Execute a single action")
66
78
  .requiredOption("--action <json>", 'Action definition (JSON object, required). Example: \'{"kind":"tool","toolUuid":"550e8400-..."}\'')
67
79
  .requiredOption("--data <json>", "Input data for the run (JSON object, required)")
68
- .option("--wait-until-finished [value]", "Poll the run until it reaches a terminal status before returning (true/false, defaults to true when passed bare)", parseBooleanOption)
80
+ .option("--wait-until-finished [true|false]", "Poll the run until it reaches a terminal status before returning (defaults to true when passed bare)", parseBooleanOption)
69
81
  .option("--polling-interval <ms>", "Polling interval in milliseconds, used with --wait-until-finished (integer, default: 5000)", "5000")
70
82
  .option("--webhook-url <url>", "URL to call when the run completes")
71
83
  .option("--webhook-secret <secret>", "Secret used to sign webhook deliveries")
@@ -99,7 +111,7 @@ Examples:
99
111
  .option("--webhook-url <url>", "URL to call when the batch completes")
100
112
  .option("--webhook-secret <secret>", "Secret used to sign webhook deliveries")
101
113
  .option("--limit <n>", "Pilot: only submit the first N records (integer). Inspect the pilot's output before re-running on the full set — credits-based actions bill per record.")
102
- .option("--wait-until-finished [value]", "Poll the batch until it reaches a terminal status before returning (true/false, defaults to true when passed bare)", parseBooleanOption)
114
+ .option("--wait-until-finished [true|false]", "Poll the batch until it reaches a terminal status before returning (defaults to true when passed bare)", parseBooleanOption)
103
115
  .option("--polling-interval <ms>", "Polling interval in milliseconds, used with --wait-until-finished (integer, default: 5000)", "5000")
104
116
  .addHelpText("after", `
105
117
  Examples:
@@ -160,60 +172,3 @@ Examples:
160
172
  outputJson(result);
161
173
  });
162
174
  }
163
- function registerCostTableCommand(action, getApi) {
164
- action
165
- .command("cost-table")
166
- .description("Price list of every credits-based action in the catalog, sorted by cost (free, reads the catalog)")
167
- .option("--category <category>", "Filter by integration category (string)")
168
- .option("--integration <slug>", "Filter by integration slug (string)")
169
- .option("--raw", "Print the markdown document instead of JSON")
170
- .addHelpText("after", `
171
- Free, spends nothing: the catalog is where pricing actually lives, so this is
172
- the answer to "what does <action> cost" and "what is the cheapest way to do
173
- <stage>" without pricing anyone copied by hand.
174
-
175
- Covers connector actions and Cargo's own native actions: sendEmail, modelAsk
176
- and fileSearch are billed, so a connector-only price list is not a complete one.
177
- Filtering by --category or --integration drops the natives.
178
-
179
- Actions absent from the output cost no credits. Actions whose price depends on
180
- config (an LLM model, a phone-or-email toggle) show a range, with the
181
- per-config prices in the document's second half.
182
-
183
- Examples:
184
- $ cargo-ai orchestration action cost-table
185
- $ cargo-ai orchestration action cost-table --category enrichment --raw
186
- $ cargo-ai orchestration action cost-table --raw > credits-cost-table.md`)
187
- .action(async (opts) => {
188
- const api = getApi();
189
- const isFiltered = opts.category !== undefined || opts.integration !== undefined;
190
- // Fetch all connector and native actions. Omitting limit returns all.
191
- // When filtering by category or integration, only connectors match —
192
- // natives have no category and no integrationSlug.
193
- const kinds = isFiltered
194
- ? ["connector"]
195
- : ["connector", "native"];
196
- const allActions = [];
197
- for (const kind of kinds) {
198
- const result = await handleApiCall(() => api.orchestration.action.list({
199
- kind,
200
- category: opts.category,
201
- integrationSlug: opts.integration,
202
- }));
203
- allActions.push(...result.results);
204
- }
205
- const catalog = groupActionsByIntegration(allActions);
206
- const rows = buildCostRows(catalog);
207
- const summary = summarize(catalog);
208
- if (opts.raw === true) {
209
- console.log(renderCostTable(rows, summary, {
210
- generatedAt: new Date().toISOString().slice(0, 10),
211
- filter: isFiltered
212
- ? { category: opts.category, integration: opts.integration }
213
- : undefined,
214
- }));
215
- return;
216
- }
217
- outputJson({ summary, rows });
218
- });
219
- }
@@ -13,12 +13,12 @@ export function registerBatchCommands(parent, getApi) {
13
13
  .option("--parent-batch-uuid <uuid>", "Filter by parent batch UUID (string)")
14
14
  .option("--parent-run-uuid <uuid>", "Filter by parent run UUID (string)")
15
15
  .option("--parent-node-uuid <uuid>", "Filter by parent node UUID (string)")
16
- .option("--statuses <list>", "Filter by statuses (comma-separated: pending,syncing,skipped,querying,running,success,cancelling,error,cancelled)")
17
- .option("--has-runs [value]", "Only return batches that have runs (true/false, defaults to true when passed bare)", parseBooleanOption)
18
- .option("--is-skipped [value]", "Only return skipped batches (true/false, defaults to true when passed bare)", parseBooleanOption)
19
- .option("--is-finished [value]", "Only return finished batches (true/false, defaults to true when passed bare)", parseBooleanOption)
20
- .option("--included-data-kinds <list>", "Include only these data kinds (comma-separated strings)")
21
- .option("--excluded-data-kinds <list>", "Exclude these data kinds (comma-separated strings)")
16
+ .option("--statuses <pending,syncing,skipped,querying,running,success,cancelling,error,cancelled>", "Filter by statuses")
17
+ .option("--has-runs [true|false]", "Only return batches that have runs (defaults to true when passed bare)", parseBooleanOption)
18
+ .option("--is-skipped [true|false]", "Only return skipped batches (defaults to true when passed bare)", parseBooleanOption)
19
+ .option("--is-finished [true|false]", "Only return finished batches (defaults to true when passed bare)", parseBooleanOption)
20
+ .option("--included-data-kinds <segment,change,filter,recordIds,watchedRecords,records,file,runs,group,schedule,form>", "Include only these data kinds")
21
+ .option("--excluded-data-kinds <segment,change,filter,recordIds,watchedRecords,records,file,runs,group,schedule,form>", "Exclude these data kinds")
22
22
  .option("--limit <n>", "Max results to return (integer, default: 20)", "20")
23
23
  .option("--offset <n>", "Number of results to skip (integer, default: 0)", "0")
24
24
  .action(async (opts) => {
@@ -69,7 +69,7 @@ export function registerBatchCommands(parent, getApi) {
69
69
  .option("--release-uuid <uuid>", "Release UUID to pin the batch to (string)")
70
70
  .option("--file <path>", "Path to a Workflow SDK module (its default export must be the compiled workflow returned by defineWorkflow()). Compiles it, resolves any @cargo-ai/cdk resource handles to real uuids from cargo.state.json, and runs the resulting nodes. Rejected with --nodes.")
71
71
  .option("--nodes <json>", "Custom nodes to override the workflow definition (JSON array). Rejected with --file.")
72
- .option("--wait-until-finished [value]", "Poll the batch until it reaches a terminal status before returning (true/false, defaults to true when passed bare)", parseBooleanOption)
72
+ .option("--wait-until-finished [true|false]", "Poll the batch until it reaches a terminal status before returning (defaults to true when passed bare)", parseBooleanOption)
73
73
  .option("--polling-interval <ms>", "Polling interval in milliseconds, used with --wait-until-finished (integer, default: 5000)", "5000")
74
74
  .addHelpText("after", `
75
75
  Examples:
@@ -111,7 +111,7 @@ function registerDiagramCommand(node, getApi) {
111
111
  .option("--nodes <json>", "Node definitions (JSON array, or '-' to read from stdin)")
112
112
  .option("--file <path>", "Read a JSON payload or node array from a file")
113
113
  .option("--workflow-uuid <uuid>", "Diagram a workflow's deployed release (add --draft for its draft)")
114
- .option("--draft [value]", "With --workflow-uuid, use the draft release", parseBooleanOption)
114
+ .option("--draft [true|false]", "With --workflow-uuid, use the draft release", parseBooleanOption)
115
115
  .option("--release-uuid <uuid>", "Diagram a specific release")
116
116
  .option("--run-uuid <uuid>", "Diagram the graph a run executed (follows the run's release when it has one)")
117
117
  .option("--title <text>", "Title rendered above the diagram")
@@ -119,7 +119,7 @@ function registerDiagramCommand(node, getApi) {
119
119
  .option("--direction <TD|LR>", "Mermaid flow direction, ignored by --format ascii (default: TD)", "TD")
120
120
  .option("--paid <slugs>", "Comma-separated node slugs/uuids that bill credits — marked 💳")
121
121
  .option("--highlight <slugs>", "Comma-separated node slugs/uuids to mark (red in Mermaid, ← in ASCII)")
122
- .option("--raw [value]", "Print the diagram itself instead of JSON", parseBooleanOption)
122
+ .option("--raw [true|false]", "Print the diagram itself instead of JSON", parseBooleanOption)
123
123
  .addHelpText("after", `
124
124
  Free, runs nothing: turns a node graph into a picture so a reviewer can see the
125
125
  routing, the fallback paths and which steps bill before approving or deploying
@@ -1 +1 @@
1
- {"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/play.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAOxC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CAuR7E"}
1
+ {"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/play.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAOxC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CA2R7E"}
@@ -9,9 +9,9 @@ export function registerPlayCommands(parent, getApi) {
9
9
  .description("List plays (optional filters match GET /orchestration/plays/list)")
10
10
  .option("--model-uuid <uuid>", "Only plays for this model UUID")
11
11
  .option("--segment-uuid <uuid>", "Only plays for this segment UUID")
12
- .option("--schedule-type <type>", "Only plays with this schedule type: dbt | cron | realtime | dependency | watch")
13
- .option("--is-enabled [value]", "Only enabled plays (true/false, defaults to true when passed bare)", parseBooleanOption)
14
- .option("--is-disabled [value]", "Only disabled plays (true/false, defaults to true when passed bare)", parseBooleanOption)
12
+ .option("--schedule-type <dbt|cron|realtime|dependency|watch>", "Only plays with this schedule type")
13
+ .option("--is-enabled [true|false]", "Only enabled plays (defaults to true when passed bare)", parseBooleanOption)
14
+ .option("--is-disabled [true|false]", "Only disabled plays (defaults to true when passed bare)", parseBooleanOption)
15
15
  .action(async (opts) => {
16
16
  const api = getApi();
17
17
  const isEnabledFilter = resolveBooleanPair(opts.isEnabled, opts.isDisabled, { positive: "--is-enabled", negative: "--is-disabled" });
@@ -43,8 +43,8 @@ export function registerPlayCommands(parent, getApi) {
43
43
  .description("Create a play")
44
44
  .requiredOption("--name <name>", "Play name (string, required)")
45
45
  .requiredOption("--model-uuid <uuid>", "Model UUID to trigger on (string, required)")
46
- .requiredOption("--change-kinds <kinds>", "Change kinds to trigger on (comma-separated strings, required)")
47
- .requiredOption("--run-creation-rule <rule>", "Run creation rule. Allowed values: always, once, noConcurrency")
46
+ .requiredOption("--change-kinds <added,updated,removed,unchanged>", "Change kinds to trigger on (required)")
47
+ .requiredOption("--run-creation-rule <always|once|noConcurrency>", "Run creation rule")
48
48
  .option("--description <description>", "Play description (string)")
49
49
  .option("--folder-uuid <uuid>", "Folder UUID (string)")
50
50
  .addHelpText("after", `
@@ -82,10 +82,10 @@ Examples:
82
82
  .description("Update a play")
83
83
  .option("--name <name>", "Play name")
84
84
  .option("--description <description>", "Description")
85
- .option("--is-enabled [value]", "Enable the play", parseBooleanOption)
86
- .option("--is-disabled [value]", "Disable the play", parseBooleanOption)
87
- .option("--change-kinds <kinds>", "Change kinds to trigger on (comma-separated strings)")
88
- .option("--run-creation-rule <rule>", "Run creation rule. Allowed values: always, once, noConcurrency")
85
+ .option("--is-enabled [true|false]", "Enable the play", parseBooleanOption)
86
+ .option("--is-disabled [true|false]", "Disable the play", parseBooleanOption)
87
+ .option("--change-kinds <added,updated,removed,unchanged>", "Change kinds to trigger on")
88
+ .option("--run-creation-rule <always|once|noConcurrency>", "Run creation rule")
89
89
  .option("--folder-uuid <uuid>", "Folder UUID")
90
90
  .option("--filter <json>", "Filter definition (JSON object, same format as segmentation segment update)")
91
91
  .option("--sort <json>", 'Sort definition (JSON object). Shape: {"slug": string, "order": "asc" | "desc"}')