@getpilfer/cli 0.1.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.
@@ -0,0 +1,1102 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ apiRequest,
4
+ coerceBodyFlag,
5
+ coerceQueryFlag,
6
+ mergeBody,
7
+ printOutput
8
+ } from "./chunk-HJFKOMTC.js";
9
+ import "./chunk-GZ4DXDQM.js";
10
+
11
+ // src/lib/bulk.ts
12
+ var MAX_IDS = 25;
13
+ var CONCURRENCY = 5;
14
+ var MAX_RETRIES = 3;
15
+ function parseIds(idsFlag) {
16
+ if (!idsFlag?.trim()) return [];
17
+ return idsFlag.split(",").map((s) => s.trim()).filter(Boolean);
18
+ }
19
+ function validateBulkIds(ids, resourceLabel) {
20
+ if (ids.length > MAX_IDS) {
21
+ throw new Error(
22
+ `${resourceLabel}: max ${MAX_IDS} IDs per invocation (got ${ids.length}). Use multiple invocations for more.`
23
+ );
24
+ }
25
+ }
26
+ async function runBulk(options) {
27
+ const { items, runOne, toResult } = options;
28
+ const concurrency = Math.min(options.concurrency ?? CONCURRENCY, items.length);
29
+ const results = [];
30
+ let succeeded = 0;
31
+ let failed = 0;
32
+ async function runWithRetry(id) {
33
+ let lastRes = null;
34
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
35
+ const res = await runOne(id);
36
+ lastRes = res;
37
+ if (res.status !== 429) break;
38
+ const retryAfter = 2 ** attempt;
39
+ await new Promise((r2) => setTimeout(r2, retryAfter * 1e3));
40
+ }
41
+ const r = lastRes;
42
+ const result = toResult(id, r.ok, r.status, r.data, r.error);
43
+ if (r.ok) succeeded++;
44
+ else failed++;
45
+ return result;
46
+ }
47
+ const queue = [...items];
48
+ const workers = Array.from({ length: concurrency }, async () => {
49
+ while (queue.length > 0) {
50
+ const id = queue.shift();
51
+ const result = await runWithRetry(id);
52
+ results.push(result);
53
+ }
54
+ });
55
+ await Promise.all(workers);
56
+ return {
57
+ data: results,
58
+ summary: { total: items.length, succeeded, failed }
59
+ };
60
+ }
61
+
62
+ // src/commands/generated/index.ts
63
+ function register(program, helpers) {
64
+ const { getOutputFormat, requireToken, exitWithError, getBaseUrl, syncRootOptsFromCommand } = helpers;
65
+ const organizationsCmd = program.command("organizations").description("organizations resource");
66
+ organizationsCmd.command("list").description("List organizations").option("--limit <n>", "Max results").option("--offset <n>", "Skip n results").hook("preAction", (thisCommand) => {
67
+ syncRootOptsFromCommand(thisCommand);
68
+ }).action(async (opts) => {
69
+ const token = requireToken();
70
+ if (!token) exitWithError(401, "Missing or invalid token");
71
+ const query = {};
72
+ if (opts.limit != null) query.limit = opts.limit;
73
+ if (opts.offset != null) query.offset = opts.offset;
74
+ const res = await apiRequest({ method: "GET", path: "organizations", token, baseUrl: getBaseUrl(), query });
75
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
76
+ const data = res.data?.data ?? [];
77
+ printOutput(getOutputFormat(), data, false);
78
+ });
79
+ organizationsCmd.command("get <id>").description("Get one organizations by id").hook("preAction", (thisCommand) => {
80
+ syncRootOptsFromCommand(thisCommand);
81
+ }).action(async (id, opts) => {
82
+ const token = requireToken();
83
+ if (!token) exitWithError(401, "Missing or invalid token");
84
+ const query = {};
85
+ const res = await apiRequest({ method: "GET", path: "organizations/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), query });
86
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
87
+ const data = res.data?.data ?? res.data;
88
+ printOutput(getOutputFormat(), data ?? {}, false);
89
+ });
90
+ const projectsCmd = program.command("projects").description("projects resource");
91
+ projectsCmd.command("list").description("List projects").option("--limit <n>", "Max results").option("--offset <n>", "Skip n results").option("--organization-id <value>", "Filter by organizationId").hook("preAction", (thisCommand) => {
92
+ syncRootOptsFromCommand(thisCommand);
93
+ }).action(async (opts) => {
94
+ const token = requireToken();
95
+ if (!token) exitWithError(401, "Missing or invalid token");
96
+ const query = {};
97
+ if (opts.limit != null) query.limit = opts.limit;
98
+ if (opts.offset != null) query.offset = opts.offset;
99
+ if (opts.organizationId != null) {
100
+ query.organizationId = coerceQueryFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
101
+ }
102
+ const res = await apiRequest({ method: "GET", path: "projects", token, baseUrl: getBaseUrl(), query });
103
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
104
+ const data = res.data?.data ?? [];
105
+ printOutput(getOutputFormat(), data, false);
106
+ });
107
+ projectsCmd.command("get <id>").description("Get one projects by id").hook("preAction", (thisCommand) => {
108
+ syncRootOptsFromCommand(thisCommand);
109
+ }).action(async (id, opts) => {
110
+ const token = requireToken();
111
+ if (!token) exitWithError(401, "Missing or invalid token");
112
+ const query = {};
113
+ const res = await apiRequest({ method: "GET", path: "projects/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), query });
114
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
115
+ const data = res.data?.data ?? res.data;
116
+ printOutput(getOutputFormat(), data ?? {}, false);
117
+ });
118
+ projectsCmd.command("create").description("Create projects").option("--body <json>", "Request body JSON (merged with flags)").option("--name <value>", "name").option("--description <value>", "description").option("--organization-id <value>", "organizationId").option("--priority <value>", "priority").option("--if-not-exists", "Return existing if match found").hook("preAction", (thisCommand) => {
119
+ syncRootOptsFromCommand(thisCommand);
120
+ }).action(async (opts) => {
121
+ const token = requireToken();
122
+ if (!token) exitWithError(401, "Missing or invalid token");
123
+ const bodyFromFlags = {};
124
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
125
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
126
+ const parsedDescription = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
127
+ if (parsedDescription !== void 0) bodyFromFlags.description = parsedDescription;
128
+ const parsedOrganizationId = coerceBodyFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
129
+ if (parsedOrganizationId !== void 0) bodyFromFlags.organizationId = parsedOrganizationId;
130
+ const parsedPriority = coerceBodyFlag(opts.priority, { field: "priority", flag: "--priority", kind: "string" }, exitWithError);
131
+ if (parsedPriority !== void 0) bodyFromFlags.priority = parsedPriority;
132
+ const body = mergeBody(bodyFromFlags, opts.body);
133
+ if (opts.ifNotExists) {
134
+ }
135
+ const res = await apiRequest({ method: "POST", path: "projects", token, baseUrl: getBaseUrl(), body });
136
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
137
+ const data = res.data?.data ?? res.data;
138
+ printOutput(getOutputFormat(), data ?? {}, false);
139
+ });
140
+ projectsCmd.command("update <id>").description("Update projects").option("--body <json>", "Request body JSON (merged with flags)").option("--ids <ids>", "Comma-separated IDs for bulk update (max 25)").option("--name <value>", "name").option("--description <value>", "description").option("--priority <value>", "priority").hook("preAction", (thisCommand) => {
141
+ syncRootOptsFromCommand(thisCommand);
142
+ }).action(async (id, opts) => {
143
+ const token = requireToken();
144
+ if (!token) exitWithError(401, "Missing or invalid token");
145
+ const ids = parseIds(opts.ids);
146
+ if (ids.length > 0) {
147
+ validateBulkIds(ids, "projects");
148
+ const { data: data2, summary } = await runBulk({
149
+ items: ids,
150
+ runOne: async (itemId) => {
151
+ const bodyFromFlags2 = {};
152
+ const parsedName2 = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
153
+ if (parsedName2 !== void 0) bodyFromFlags2.name = parsedName2;
154
+ const parsedDescription2 = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
155
+ if (parsedDescription2 !== void 0) bodyFromFlags2.description = parsedDescription2;
156
+ const parsedPriority2 = coerceBodyFlag(opts.priority, { field: "priority", flag: "--priority", kind: "string" }, exitWithError);
157
+ if (parsedPriority2 !== void 0) bodyFromFlags2.priority = parsedPriority2;
158
+ const body2 = mergeBody(bodyFromFlags2, opts.body);
159
+ const res2 = await apiRequest({ method: "PATCH", path: "projects/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl(), body: body2 });
160
+ return { ok: res2.ok, status: res2.status || 0, data: res2.data, error: res2.error };
161
+ },
162
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "updated" } : { error: true, statusCode: status, message: err ?? "Failed" }
163
+ });
164
+ printOutput(getOutputFormat(), { data: data2, summary }, false);
165
+ return;
166
+ }
167
+ const bodyFromFlags = {};
168
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
169
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
170
+ const parsedDescription = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
171
+ if (parsedDescription !== void 0) bodyFromFlags.description = parsedDescription;
172
+ const parsedPriority = coerceBodyFlag(opts.priority, { field: "priority", flag: "--priority", kind: "string" }, exitWithError);
173
+ if (parsedPriority !== void 0) bodyFromFlags.priority = parsedPriority;
174
+ const body = mergeBody(bodyFromFlags, opts.body);
175
+ const res = await apiRequest({ method: "PATCH", path: "projects/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), body });
176
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
177
+ const data = res.data?.data ?? res.data;
178
+ printOutput(getOutputFormat(), data ?? {}, false);
179
+ });
180
+ projectsCmd.command("delete <id>").description("Delete projects").option("--ids <ids>", "Comma-separated IDs for bulk delete (max 25)").hook("preAction", (thisCommand) => {
181
+ syncRootOptsFromCommand(thisCommand);
182
+ }).action(async (id, opts) => {
183
+ const token = requireToken();
184
+ if (!token) exitWithError(401, "Missing or invalid token");
185
+ const ids = parseIds(opts.ids);
186
+ if (ids.length > 0) {
187
+ validateBulkIds(ids, "projects");
188
+ const { data, summary } = await runBulk({
189
+ items: ids,
190
+ runOne: async (itemId) => {
191
+ const res2 = await apiRequest({ method: "DELETE", path: "projects/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl() });
192
+ return { ok: res2.ok, status: res2.status || 0, error: res2.error };
193
+ },
194
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "deleted" } : { error: true, statusCode: status, message: err ?? "Failed" }
195
+ });
196
+ printOutput(getOutputFormat(), { data, summary }, false);
197
+ return;
198
+ }
199
+ const res = await apiRequest({ method: "DELETE", path: "projects/" + encodeURIComponent(id), token, baseUrl: getBaseUrl() });
200
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
201
+ if (getOutputFormat() === "json") console.log(JSON.stringify({ data: null, deleted: true }));
202
+ });
203
+ const spacesCmd = program.command("spaces").description("spaces resource");
204
+ spacesCmd.command("list").description("List spaces").option("--limit <n>", "Max results").option("--offset <n>", "Skip n results").option("--organization-id <value>", "Filter by organizationId").option("--project-id <value>", "Filter by projectId").hook("preAction", (thisCommand) => {
205
+ syncRootOptsFromCommand(thisCommand);
206
+ }).action(async (opts) => {
207
+ const token = requireToken();
208
+ if (!token) exitWithError(401, "Missing or invalid token");
209
+ const query = {};
210
+ if (opts.limit != null) query.limit = opts.limit;
211
+ if (opts.offset != null) query.offset = opts.offset;
212
+ if (opts.organizationId != null) {
213
+ query.organizationId = coerceQueryFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
214
+ }
215
+ if (opts.projectId != null) {
216
+ query.projectId = coerceQueryFlag(opts.projectId, { field: "projectId", flag: "--project-id", kind: "string" }, exitWithError);
217
+ }
218
+ const res = await apiRequest({ method: "GET", path: "spaces", token, baseUrl: getBaseUrl(), query });
219
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
220
+ const data = res.data?.data ?? [];
221
+ printOutput(getOutputFormat(), data, false);
222
+ });
223
+ spacesCmd.command("get <id>").description("Get one spaces by id").hook("preAction", (thisCommand) => {
224
+ syncRootOptsFromCommand(thisCommand);
225
+ }).action(async (id, opts) => {
226
+ const token = requireToken();
227
+ if (!token) exitWithError(401, "Missing or invalid token");
228
+ const query = {};
229
+ const res = await apiRequest({ method: "GET", path: "spaces/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), query });
230
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
231
+ const data = res.data?.data ?? res.data;
232
+ printOutput(getOutputFormat(), data ?? {}, false);
233
+ });
234
+ spacesCmd.command("create").description("Create spaces").option("--body <json>", "Request body JSON (merged with flags)").option("--name <value>", "name").option("--description <value>", "description").option("--organization-id <value>", "organizationId").option("--project-id <value>", "projectId").option("--status <value>", "status").option("--priority <value>", "priority").option("--current-strength <value>", "currentStrength").option("--if-not-exists", "Return existing if match found").hook("preAction", (thisCommand) => {
235
+ syncRootOptsFromCommand(thisCommand);
236
+ }).action(async (opts) => {
237
+ const token = requireToken();
238
+ if (!token) exitWithError(401, "Missing or invalid token");
239
+ const bodyFromFlags = {};
240
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
241
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
242
+ const parsedDescription = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
243
+ if (parsedDescription !== void 0) bodyFromFlags.description = parsedDescription;
244
+ const parsedOrganizationId = coerceBodyFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
245
+ if (parsedOrganizationId !== void 0) bodyFromFlags.organizationId = parsedOrganizationId;
246
+ const parsedProjectId = coerceBodyFlag(opts.projectId, { field: "projectId", flag: "--project-id", kind: "string" }, exitWithError);
247
+ if (parsedProjectId !== void 0) bodyFromFlags.projectId = parsedProjectId;
248
+ const parsedStatus = coerceBodyFlag(opts.status, { field: "status", flag: "--status", kind: "string" }, exitWithError);
249
+ if (parsedStatus !== void 0) bodyFromFlags.status = parsedStatus;
250
+ const parsedPriority = coerceBodyFlag(opts.priority, { field: "priority", flag: "--priority", kind: "string" }, exitWithError);
251
+ if (parsedPriority !== void 0) bodyFromFlags.priority = parsedPriority;
252
+ const parsedCurrentStrength = coerceBodyFlag(opts.currentStrength, { field: "currentStrength", flag: "--current-strength", kind: "number" }, exitWithError);
253
+ if (parsedCurrentStrength !== void 0) bodyFromFlags.currentStrength = parsedCurrentStrength;
254
+ const body = mergeBody(bodyFromFlags, opts.body);
255
+ if (opts.ifNotExists) {
256
+ }
257
+ const res = await apiRequest({ method: "POST", path: "spaces", token, baseUrl: getBaseUrl(), body });
258
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
259
+ const data = res.data?.data ?? res.data;
260
+ printOutput(getOutputFormat(), data ?? {}, false);
261
+ });
262
+ spacesCmd.command("update <id>").description("Update spaces").option("--body <json>", "Request body JSON (merged with flags)").option("--ids <ids>", "Comma-separated IDs for bulk update (max 25)").option("--name <value>", "name").option("--description <value>", "description").option("--project-id <value>", "projectId").option("--status <value>", "status").option("--priority <value>", "priority").option("--current-strength <value>", "currentStrength").hook("preAction", (thisCommand) => {
263
+ syncRootOptsFromCommand(thisCommand);
264
+ }).action(async (id, opts) => {
265
+ const token = requireToken();
266
+ if (!token) exitWithError(401, "Missing or invalid token");
267
+ const ids = parseIds(opts.ids);
268
+ if (ids.length > 0) {
269
+ validateBulkIds(ids, "spaces");
270
+ const { data: data2, summary } = await runBulk({
271
+ items: ids,
272
+ runOne: async (itemId) => {
273
+ const bodyFromFlags2 = {};
274
+ const parsedName2 = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
275
+ if (parsedName2 !== void 0) bodyFromFlags2.name = parsedName2;
276
+ const parsedDescription2 = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
277
+ if (parsedDescription2 !== void 0) bodyFromFlags2.description = parsedDescription2;
278
+ const parsedProjectId2 = coerceBodyFlag(opts.projectId, { field: "projectId", flag: "--project-id", kind: "string", allowNull: true }, exitWithError);
279
+ if (parsedProjectId2 !== void 0) bodyFromFlags2.projectId = parsedProjectId2;
280
+ const parsedStatus2 = coerceBodyFlag(opts.status, { field: "status", flag: "--status", kind: "string" }, exitWithError);
281
+ if (parsedStatus2 !== void 0) bodyFromFlags2.status = parsedStatus2;
282
+ const parsedPriority2 = coerceBodyFlag(opts.priority, { field: "priority", flag: "--priority", kind: "string" }, exitWithError);
283
+ if (parsedPriority2 !== void 0) bodyFromFlags2.priority = parsedPriority2;
284
+ const parsedCurrentStrength2 = coerceBodyFlag(opts.currentStrength, { field: "currentStrength", flag: "--current-strength", kind: "number" }, exitWithError);
285
+ if (parsedCurrentStrength2 !== void 0) bodyFromFlags2.currentStrength = parsedCurrentStrength2;
286
+ const body2 = mergeBody(bodyFromFlags2, opts.body);
287
+ const res2 = await apiRequest({ method: "PATCH", path: "spaces/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl(), body: body2 });
288
+ return { ok: res2.ok, status: res2.status || 0, data: res2.data, error: res2.error };
289
+ },
290
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "updated" } : { error: true, statusCode: status, message: err ?? "Failed" }
291
+ });
292
+ printOutput(getOutputFormat(), { data: data2, summary }, false);
293
+ return;
294
+ }
295
+ const bodyFromFlags = {};
296
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
297
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
298
+ const parsedDescription = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
299
+ if (parsedDescription !== void 0) bodyFromFlags.description = parsedDescription;
300
+ const parsedProjectId = coerceBodyFlag(opts.projectId, { field: "projectId", flag: "--project-id", kind: "string", allowNull: true }, exitWithError);
301
+ if (parsedProjectId !== void 0) bodyFromFlags.projectId = parsedProjectId;
302
+ const parsedStatus = coerceBodyFlag(opts.status, { field: "status", flag: "--status", kind: "string" }, exitWithError);
303
+ if (parsedStatus !== void 0) bodyFromFlags.status = parsedStatus;
304
+ const parsedPriority = coerceBodyFlag(opts.priority, { field: "priority", flag: "--priority", kind: "string" }, exitWithError);
305
+ if (parsedPriority !== void 0) bodyFromFlags.priority = parsedPriority;
306
+ const parsedCurrentStrength = coerceBodyFlag(opts.currentStrength, { field: "currentStrength", flag: "--current-strength", kind: "number" }, exitWithError);
307
+ if (parsedCurrentStrength !== void 0) bodyFromFlags.currentStrength = parsedCurrentStrength;
308
+ const body = mergeBody(bodyFromFlags, opts.body);
309
+ const res = await apiRequest({ method: "PATCH", path: "spaces/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), body });
310
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
311
+ const data = res.data?.data ?? res.data;
312
+ printOutput(getOutputFormat(), data ?? {}, false);
313
+ });
314
+ spacesCmd.command("delete <id>").description("Delete spaces").option("--ids <ids>", "Comma-separated IDs for bulk delete (max 25)").hook("preAction", (thisCommand) => {
315
+ syncRootOptsFromCommand(thisCommand);
316
+ }).action(async (id, opts) => {
317
+ const token = requireToken();
318
+ if (!token) exitWithError(401, "Missing or invalid token");
319
+ const ids = parseIds(opts.ids);
320
+ if (ids.length > 0) {
321
+ validateBulkIds(ids, "spaces");
322
+ const { data, summary } = await runBulk({
323
+ items: ids,
324
+ runOne: async (itemId) => {
325
+ const res2 = await apiRequest({ method: "DELETE", path: "spaces/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl() });
326
+ return { ok: res2.ok, status: res2.status || 0, error: res2.error };
327
+ },
328
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "deleted" } : { error: true, statusCode: status, message: err ?? "Failed" }
329
+ });
330
+ printOutput(getOutputFormat(), { data, summary }, false);
331
+ return;
332
+ }
333
+ const res = await apiRequest({ method: "DELETE", path: "spaces/" + encodeURIComponent(id), token, baseUrl: getBaseUrl() });
334
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
335
+ if (getOutputFormat() === "json") console.log(JSON.stringify({ data: null, deleted: true }));
336
+ });
337
+ const scoutsCmd = program.command("scouts").description("scouts resource");
338
+ scoutsCmd.command("list").description("List scouts").option("--limit <n>", "Max results").option("--offset <n>", "Skip n results").option("--organization-id <value>", "Filter by organizationId").option("--category-id <value>", "Filter by categoryId").hook("preAction", (thisCommand) => {
339
+ syncRootOptsFromCommand(thisCommand);
340
+ }).action(async (opts) => {
341
+ const token = requireToken();
342
+ if (!token) exitWithError(401, "Missing or invalid token");
343
+ const query = {};
344
+ if (opts.limit != null) query.limit = opts.limit;
345
+ if (opts.offset != null) query.offset = opts.offset;
346
+ if (opts.organizationId != null) {
347
+ query.organizationId = coerceQueryFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
348
+ }
349
+ if (opts.categoryId != null) {
350
+ query.categoryId = coerceQueryFlag(opts.categoryId, { field: "categoryId", flag: "--category-id", kind: "string" }, exitWithError);
351
+ }
352
+ const res = await apiRequest({ method: "GET", path: "scouts", token, baseUrl: getBaseUrl(), query });
353
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
354
+ const data = res.data?.data ?? [];
355
+ printOutput(getOutputFormat(), data, false);
356
+ });
357
+ scoutsCmd.command("get <id>").description("Get one scouts by id").hook("preAction", (thisCommand) => {
358
+ syncRootOptsFromCommand(thisCommand);
359
+ }).action(async (id, opts) => {
360
+ const token = requireToken();
361
+ if (!token) exitWithError(401, "Missing or invalid token");
362
+ const query = {};
363
+ const res = await apiRequest({ method: "GET", path: "scouts/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), query });
364
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
365
+ const data = res.data?.data ?? res.data;
366
+ printOutput(getOutputFormat(), data ?? {}, false);
367
+ });
368
+ scoutsCmd.command("create").description("Create scouts").option("--body <json>", "Request body JSON (merged with flags)").option("--name <value>", "name").option("--description <value>", "description").option("--organization-id <value>", "organizationId").option("--category-id <value>", "categoryId").option("--metadata <value>", "metadata").option("--url <value>", "url").option("--hero-image <value>", "heroImage").option("--priority <value>", "priority").option("--status <value>", "status").option("--estimated-cost <value>", "estimatedCost").option("--potential-cost <value>", "potentialCost").option("--need <value>", "need").option("--urgency <value>", "urgency").option("--use <value>", "use").option("--longevity <value>", "longevity").option("--roi <value>", "roi").option("--system-fit <value>", "systemFit").option("--emotional-pull <value>", "emotionalPull").option("--infrastructure-fit <value>", "infrastructureFit").option("--activation-potential <value>", "activationPotential").option("--if-not-exists", "Return existing if match found").hook("preAction", (thisCommand) => {
369
+ syncRootOptsFromCommand(thisCommand);
370
+ }).action(async (opts) => {
371
+ const token = requireToken();
372
+ if (!token) exitWithError(401, "Missing or invalid token");
373
+ const bodyFromFlags = {};
374
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
375
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
376
+ const parsedDescription = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
377
+ if (parsedDescription !== void 0) bodyFromFlags.description = parsedDescription;
378
+ const parsedOrganizationId = coerceBodyFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
379
+ if (parsedOrganizationId !== void 0) bodyFromFlags.organizationId = parsedOrganizationId;
380
+ const parsedCategoryId = coerceBodyFlag(opts.categoryId, { field: "categoryId", flag: "--category-id", kind: "string" }, exitWithError);
381
+ if (parsedCategoryId !== void 0) bodyFromFlags.categoryId = parsedCategoryId;
382
+ const parsedMetadata = coerceBodyFlag(opts.metadata, { field: "metadata", flag: "--metadata", kind: "string" }, exitWithError);
383
+ if (parsedMetadata !== void 0) bodyFromFlags.metadata = parsedMetadata;
384
+ const parsedUrl = coerceBodyFlag(opts.url, { field: "url", flag: "--url", kind: "string" }, exitWithError);
385
+ if (parsedUrl !== void 0) bodyFromFlags.url = parsedUrl;
386
+ const parsedHeroImage = coerceBodyFlag(opts.heroImage, { field: "heroImage", flag: "--hero-image", kind: "string" }, exitWithError);
387
+ if (parsedHeroImage !== void 0) bodyFromFlags.heroImage = parsedHeroImage;
388
+ const parsedPriority = coerceBodyFlag(opts.priority, { field: "priority", flag: "--priority", kind: "string" }, exitWithError);
389
+ if (parsedPriority !== void 0) bodyFromFlags.priority = parsedPriority;
390
+ const parsedStatus = coerceBodyFlag(opts.status, { field: "status", flag: "--status", kind: "string" }, exitWithError);
391
+ if (parsedStatus !== void 0) bodyFromFlags.status = parsedStatus;
392
+ const parsedEstimatedCost = coerceBodyFlag(opts.estimatedCost, { field: "estimatedCost", flag: "--estimated-cost", kind: "number" }, exitWithError);
393
+ if (parsedEstimatedCost !== void 0) bodyFromFlags.estimatedCost = parsedEstimatedCost;
394
+ const parsedPotentialCost = coerceBodyFlag(opts.potentialCost, { field: "potentialCost", flag: "--potential-cost", kind: "number" }, exitWithError);
395
+ if (parsedPotentialCost !== void 0) bodyFromFlags.potentialCost = parsedPotentialCost;
396
+ const parsedNeed = coerceBodyFlag(opts.need, { field: "need", flag: "--need", kind: "number" }, exitWithError);
397
+ if (parsedNeed !== void 0) bodyFromFlags.need = parsedNeed;
398
+ const parsedUrgency = coerceBodyFlag(opts.urgency, { field: "urgency", flag: "--urgency", kind: "number" }, exitWithError);
399
+ if (parsedUrgency !== void 0) bodyFromFlags.urgency = parsedUrgency;
400
+ const parsedUse = coerceBodyFlag(opts.use, { field: "use", flag: "--use", kind: "number" }, exitWithError);
401
+ if (parsedUse !== void 0) bodyFromFlags.use = parsedUse;
402
+ const parsedLongevity = coerceBodyFlag(opts.longevity, { field: "longevity", flag: "--longevity", kind: "number" }, exitWithError);
403
+ if (parsedLongevity !== void 0) bodyFromFlags.longevity = parsedLongevity;
404
+ const parsedRoi = coerceBodyFlag(opts.roi, { field: "roi", flag: "--roi", kind: "number" }, exitWithError);
405
+ if (parsedRoi !== void 0) bodyFromFlags.roi = parsedRoi;
406
+ const parsedSystemFit = coerceBodyFlag(opts.systemFit, { field: "systemFit", flag: "--system-fit", kind: "number" }, exitWithError);
407
+ if (parsedSystemFit !== void 0) bodyFromFlags.systemFit = parsedSystemFit;
408
+ const parsedEmotionalPull = coerceBodyFlag(opts.emotionalPull, { field: "emotionalPull", flag: "--emotional-pull", kind: "number" }, exitWithError);
409
+ if (parsedEmotionalPull !== void 0) bodyFromFlags.emotionalPull = parsedEmotionalPull;
410
+ const parsedInfrastructureFit = coerceBodyFlag(opts.infrastructureFit, { field: "infrastructureFit", flag: "--infrastructure-fit", kind: "number" }, exitWithError);
411
+ if (parsedInfrastructureFit !== void 0) bodyFromFlags.infrastructureFit = parsedInfrastructureFit;
412
+ const parsedActivationPotential = coerceBodyFlag(opts.activationPotential, { field: "activationPotential", flag: "--activation-potential", kind: "number" }, exitWithError);
413
+ if (parsedActivationPotential !== void 0) bodyFromFlags.activationPotential = parsedActivationPotential;
414
+ const body = mergeBody(bodyFromFlags, opts.body);
415
+ if (opts.ifNotExists) {
416
+ }
417
+ const res = await apiRequest({ method: "POST", path: "scouts", token, baseUrl: getBaseUrl(), body });
418
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
419
+ const data = res.data?.data ?? res.data;
420
+ printOutput(getOutputFormat(), data ?? {}, false);
421
+ });
422
+ scoutsCmd.command("update <id>").description("Update scouts").option("--body <json>", "Request body JSON (merged with flags)").option("--ids <ids>", "Comma-separated IDs for bulk update (max 25)").option("--name <value>", "name").option("--description <value>", "description").option("--category-id <value>", "categoryId").option("--url <value>", "url").option("--hero-image <value>", "heroImage").option("--priority <value>", "priority").option("--status <value>", "status").option("--estimated-cost <value>", "estimatedCost").option("--potential-cost <value>", "potentialCost").option("--need <value>", "need").option("--urgency <value>", "urgency").option("--use <value>", "use").option("--longevity <value>", "longevity").option("--roi <value>", "roi").option("--system-fit <value>", "systemFit").option("--emotional-pull <value>", "emotionalPull").option("--infrastructure-fit <value>", "infrastructureFit").option("--activation-potential <value>", "activationPotential").hook("preAction", (thisCommand) => {
423
+ syncRootOptsFromCommand(thisCommand);
424
+ }).action(async (id, opts) => {
425
+ const token = requireToken();
426
+ if (!token) exitWithError(401, "Missing or invalid token");
427
+ const ids = parseIds(opts.ids);
428
+ if (ids.length > 0) {
429
+ validateBulkIds(ids, "scouts");
430
+ const { data: data2, summary } = await runBulk({
431
+ items: ids,
432
+ runOne: async (itemId) => {
433
+ const bodyFromFlags2 = {};
434
+ const parsedName2 = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
435
+ if (parsedName2 !== void 0) bodyFromFlags2.name = parsedName2;
436
+ const parsedDescription2 = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
437
+ if (parsedDescription2 !== void 0) bodyFromFlags2.description = parsedDescription2;
438
+ const parsedCategoryId2 = coerceBodyFlag(opts.categoryId, { field: "categoryId", flag: "--category-id", kind: "string", allowNull: true }, exitWithError);
439
+ if (parsedCategoryId2 !== void 0) bodyFromFlags2.categoryId = parsedCategoryId2;
440
+ const parsedUrl2 = coerceBodyFlag(opts.url, { field: "url", flag: "--url", kind: "string" }, exitWithError);
441
+ if (parsedUrl2 !== void 0) bodyFromFlags2.url = parsedUrl2;
442
+ const parsedHeroImage2 = coerceBodyFlag(opts.heroImage, { field: "heroImage", flag: "--hero-image", kind: "string" }, exitWithError);
443
+ if (parsedHeroImage2 !== void 0) bodyFromFlags2.heroImage = parsedHeroImage2;
444
+ const parsedPriority2 = coerceBodyFlag(opts.priority, { field: "priority", flag: "--priority", kind: "string" }, exitWithError);
445
+ if (parsedPriority2 !== void 0) bodyFromFlags2.priority = parsedPriority2;
446
+ const parsedStatus2 = coerceBodyFlag(opts.status, { field: "status", flag: "--status", kind: "string" }, exitWithError);
447
+ if (parsedStatus2 !== void 0) bodyFromFlags2.status = parsedStatus2;
448
+ const parsedEstimatedCost2 = coerceBodyFlag(opts.estimatedCost, { field: "estimatedCost", flag: "--estimated-cost", kind: "number" }, exitWithError);
449
+ if (parsedEstimatedCost2 !== void 0) bodyFromFlags2.estimatedCost = parsedEstimatedCost2;
450
+ const parsedPotentialCost2 = coerceBodyFlag(opts.potentialCost, { field: "potentialCost", flag: "--potential-cost", kind: "number" }, exitWithError);
451
+ if (parsedPotentialCost2 !== void 0) bodyFromFlags2.potentialCost = parsedPotentialCost2;
452
+ const parsedNeed2 = coerceBodyFlag(opts.need, { field: "need", flag: "--need", kind: "number" }, exitWithError);
453
+ if (parsedNeed2 !== void 0) bodyFromFlags2.need = parsedNeed2;
454
+ const parsedUrgency2 = coerceBodyFlag(opts.urgency, { field: "urgency", flag: "--urgency", kind: "number" }, exitWithError);
455
+ if (parsedUrgency2 !== void 0) bodyFromFlags2.urgency = parsedUrgency2;
456
+ const parsedUse2 = coerceBodyFlag(opts.use, { field: "use", flag: "--use", kind: "number" }, exitWithError);
457
+ if (parsedUse2 !== void 0) bodyFromFlags2.use = parsedUse2;
458
+ const parsedLongevity2 = coerceBodyFlag(opts.longevity, { field: "longevity", flag: "--longevity", kind: "number" }, exitWithError);
459
+ if (parsedLongevity2 !== void 0) bodyFromFlags2.longevity = parsedLongevity2;
460
+ const parsedRoi2 = coerceBodyFlag(opts.roi, { field: "roi", flag: "--roi", kind: "number" }, exitWithError);
461
+ if (parsedRoi2 !== void 0) bodyFromFlags2.roi = parsedRoi2;
462
+ const parsedSystemFit2 = coerceBodyFlag(opts.systemFit, { field: "systemFit", flag: "--system-fit", kind: "number" }, exitWithError);
463
+ if (parsedSystemFit2 !== void 0) bodyFromFlags2.systemFit = parsedSystemFit2;
464
+ const parsedEmotionalPull2 = coerceBodyFlag(opts.emotionalPull, { field: "emotionalPull", flag: "--emotional-pull", kind: "number" }, exitWithError);
465
+ if (parsedEmotionalPull2 !== void 0) bodyFromFlags2.emotionalPull = parsedEmotionalPull2;
466
+ const parsedInfrastructureFit2 = coerceBodyFlag(opts.infrastructureFit, { field: "infrastructureFit", flag: "--infrastructure-fit", kind: "number" }, exitWithError);
467
+ if (parsedInfrastructureFit2 !== void 0) bodyFromFlags2.infrastructureFit = parsedInfrastructureFit2;
468
+ const parsedActivationPotential2 = coerceBodyFlag(opts.activationPotential, { field: "activationPotential", flag: "--activation-potential", kind: "number" }, exitWithError);
469
+ if (parsedActivationPotential2 !== void 0) bodyFromFlags2.activationPotential = parsedActivationPotential2;
470
+ const body2 = mergeBody(bodyFromFlags2, opts.body);
471
+ const res2 = await apiRequest({ method: "PATCH", path: "scouts/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl(), body: body2 });
472
+ return { ok: res2.ok, status: res2.status || 0, data: res2.data, error: res2.error };
473
+ },
474
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "updated" } : { error: true, statusCode: status, message: err ?? "Failed" }
475
+ });
476
+ printOutput(getOutputFormat(), { data: data2, summary }, false);
477
+ return;
478
+ }
479
+ const bodyFromFlags = {};
480
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
481
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
482
+ const parsedDescription = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
483
+ if (parsedDescription !== void 0) bodyFromFlags.description = parsedDescription;
484
+ const parsedCategoryId = coerceBodyFlag(opts.categoryId, { field: "categoryId", flag: "--category-id", kind: "string", allowNull: true }, exitWithError);
485
+ if (parsedCategoryId !== void 0) bodyFromFlags.categoryId = parsedCategoryId;
486
+ const parsedUrl = coerceBodyFlag(opts.url, { field: "url", flag: "--url", kind: "string" }, exitWithError);
487
+ if (parsedUrl !== void 0) bodyFromFlags.url = parsedUrl;
488
+ const parsedHeroImage = coerceBodyFlag(opts.heroImage, { field: "heroImage", flag: "--hero-image", kind: "string" }, exitWithError);
489
+ if (parsedHeroImage !== void 0) bodyFromFlags.heroImage = parsedHeroImage;
490
+ const parsedPriority = coerceBodyFlag(opts.priority, { field: "priority", flag: "--priority", kind: "string" }, exitWithError);
491
+ if (parsedPriority !== void 0) bodyFromFlags.priority = parsedPriority;
492
+ const parsedStatus = coerceBodyFlag(opts.status, { field: "status", flag: "--status", kind: "string" }, exitWithError);
493
+ if (parsedStatus !== void 0) bodyFromFlags.status = parsedStatus;
494
+ const parsedEstimatedCost = coerceBodyFlag(opts.estimatedCost, { field: "estimatedCost", flag: "--estimated-cost", kind: "number" }, exitWithError);
495
+ if (parsedEstimatedCost !== void 0) bodyFromFlags.estimatedCost = parsedEstimatedCost;
496
+ const parsedPotentialCost = coerceBodyFlag(opts.potentialCost, { field: "potentialCost", flag: "--potential-cost", kind: "number" }, exitWithError);
497
+ if (parsedPotentialCost !== void 0) bodyFromFlags.potentialCost = parsedPotentialCost;
498
+ const parsedNeed = coerceBodyFlag(opts.need, { field: "need", flag: "--need", kind: "number" }, exitWithError);
499
+ if (parsedNeed !== void 0) bodyFromFlags.need = parsedNeed;
500
+ const parsedUrgency = coerceBodyFlag(opts.urgency, { field: "urgency", flag: "--urgency", kind: "number" }, exitWithError);
501
+ if (parsedUrgency !== void 0) bodyFromFlags.urgency = parsedUrgency;
502
+ const parsedUse = coerceBodyFlag(opts.use, { field: "use", flag: "--use", kind: "number" }, exitWithError);
503
+ if (parsedUse !== void 0) bodyFromFlags.use = parsedUse;
504
+ const parsedLongevity = coerceBodyFlag(opts.longevity, { field: "longevity", flag: "--longevity", kind: "number" }, exitWithError);
505
+ if (parsedLongevity !== void 0) bodyFromFlags.longevity = parsedLongevity;
506
+ const parsedRoi = coerceBodyFlag(opts.roi, { field: "roi", flag: "--roi", kind: "number" }, exitWithError);
507
+ if (parsedRoi !== void 0) bodyFromFlags.roi = parsedRoi;
508
+ const parsedSystemFit = coerceBodyFlag(opts.systemFit, { field: "systemFit", flag: "--system-fit", kind: "number" }, exitWithError);
509
+ if (parsedSystemFit !== void 0) bodyFromFlags.systemFit = parsedSystemFit;
510
+ const parsedEmotionalPull = coerceBodyFlag(opts.emotionalPull, { field: "emotionalPull", flag: "--emotional-pull", kind: "number" }, exitWithError);
511
+ if (parsedEmotionalPull !== void 0) bodyFromFlags.emotionalPull = parsedEmotionalPull;
512
+ const parsedInfrastructureFit = coerceBodyFlag(opts.infrastructureFit, { field: "infrastructureFit", flag: "--infrastructure-fit", kind: "number" }, exitWithError);
513
+ if (parsedInfrastructureFit !== void 0) bodyFromFlags.infrastructureFit = parsedInfrastructureFit;
514
+ const parsedActivationPotential = coerceBodyFlag(opts.activationPotential, { field: "activationPotential", flag: "--activation-potential", kind: "number" }, exitWithError);
515
+ if (parsedActivationPotential !== void 0) bodyFromFlags.activationPotential = parsedActivationPotential;
516
+ const body = mergeBody(bodyFromFlags, opts.body);
517
+ const res = await apiRequest({ method: "PATCH", path: "scouts/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), body });
518
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
519
+ const data = res.data?.data ?? res.data;
520
+ printOutput(getOutputFormat(), data ?? {}, false);
521
+ });
522
+ scoutsCmd.command("delete <id>").description("Delete scouts").option("--ids <ids>", "Comma-separated IDs for bulk delete (max 25)").hook("preAction", (thisCommand) => {
523
+ syncRootOptsFromCommand(thisCommand);
524
+ }).action(async (id, opts) => {
525
+ const token = requireToken();
526
+ if (!token) exitWithError(401, "Missing or invalid token");
527
+ const ids = parseIds(opts.ids);
528
+ if (ids.length > 0) {
529
+ validateBulkIds(ids, "scouts");
530
+ const { data, summary } = await runBulk({
531
+ items: ids,
532
+ runOne: async (itemId) => {
533
+ const res2 = await apiRequest({ method: "DELETE", path: "scouts/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl() });
534
+ return { ok: res2.ok, status: res2.status || 0, error: res2.error };
535
+ },
536
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "deleted" } : { error: true, statusCode: status, message: err ?? "Failed" }
537
+ });
538
+ printOutput(getOutputFormat(), { data, summary }, false);
539
+ return;
540
+ }
541
+ const res = await apiRequest({ method: "DELETE", path: "scouts/" + encodeURIComponent(id), token, baseUrl: getBaseUrl() });
542
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
543
+ if (getOutputFormat() === "json") console.log(JSON.stringify({ data: null, deleted: true }));
544
+ });
545
+ const assetsCmd = program.command("assets").description("assets resource");
546
+ assetsCmd.command("list").description("List assets").option("--limit <n>", "Max results").option("--offset <n>", "Skip n results").option("--organization-id <value>", "Filter by organizationId").option("--scout-id <value>", "Filter by scoutId").hook("preAction", (thisCommand) => {
547
+ syncRootOptsFromCommand(thisCommand);
548
+ }).action(async (opts) => {
549
+ const token = requireToken();
550
+ if (!token) exitWithError(401, "Missing or invalid token");
551
+ const query = {};
552
+ if (opts.limit != null) query.limit = opts.limit;
553
+ if (opts.offset != null) query.offset = opts.offset;
554
+ if (opts.organizationId != null) {
555
+ query.organizationId = coerceQueryFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
556
+ }
557
+ if (opts.scoutId != null) {
558
+ query.scoutId = coerceQueryFlag(opts.scoutId, { field: "scoutId", flag: "--scout-id", kind: "string" }, exitWithError);
559
+ }
560
+ const res = await apiRequest({ method: "GET", path: "assets", token, baseUrl: getBaseUrl(), query });
561
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
562
+ const data = res.data?.data ?? [];
563
+ printOutput(getOutputFormat(), data, false);
564
+ });
565
+ assetsCmd.command("get <id>").description("Get one assets by id").hook("preAction", (thisCommand) => {
566
+ syncRootOptsFromCommand(thisCommand);
567
+ }).action(async (id, opts) => {
568
+ const token = requireToken();
569
+ if (!token) exitWithError(401, "Missing or invalid token");
570
+ const query = {};
571
+ const res = await apiRequest({ method: "GET", path: "assets/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), query });
572
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
573
+ const data = res.data?.data ?? res.data;
574
+ printOutput(getOutputFormat(), data ?? {}, false);
575
+ });
576
+ assetsCmd.command("create").description("Create assets").option("--body <json>", "Request body JSON (merged with flags)").option("--name <value>", "name").option("--description <value>", "description").option("--organization-id <value>", "organizationId").option("--scout-id <value>", "scoutId").option("--category-id <value>", "categoryId").option("--hero-image <value>", "heroImage").option("--condition <value>", "condition").option("--satisfaction <value>", "satisfaction").option("--usage <value>", "usage").option("--friction <value>", "friction").option("--lifetime-value <value>", "lifetimeValue").option("--acquisition-date <value>", "acquisitionDate").option("--cost <value>", "cost").option("--if-not-exists", "Return existing if match found").hook("preAction", (thisCommand) => {
577
+ syncRootOptsFromCommand(thisCommand);
578
+ }).action(async (opts) => {
579
+ const token = requireToken();
580
+ if (!token) exitWithError(401, "Missing or invalid token");
581
+ const bodyFromFlags = {};
582
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
583
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
584
+ const parsedDescription = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
585
+ if (parsedDescription !== void 0) bodyFromFlags.description = parsedDescription;
586
+ const parsedOrganizationId = coerceBodyFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
587
+ if (parsedOrganizationId !== void 0) bodyFromFlags.organizationId = parsedOrganizationId;
588
+ const parsedScoutId = coerceBodyFlag(opts.scoutId, { field: "scoutId", flag: "--scout-id", kind: "string" }, exitWithError);
589
+ if (parsedScoutId !== void 0) bodyFromFlags.scoutId = parsedScoutId;
590
+ const parsedCategoryId = coerceBodyFlag(opts.categoryId, { field: "categoryId", flag: "--category-id", kind: "string" }, exitWithError);
591
+ if (parsedCategoryId !== void 0) bodyFromFlags.categoryId = parsedCategoryId;
592
+ const parsedHeroImage = coerceBodyFlag(opts.heroImage, { field: "heroImage", flag: "--hero-image", kind: "string" }, exitWithError);
593
+ if (parsedHeroImage !== void 0) bodyFromFlags.heroImage = parsedHeroImage;
594
+ const parsedCondition = coerceBodyFlag(opts.condition, { field: "condition", flag: "--condition", kind: "number" }, exitWithError);
595
+ if (parsedCondition !== void 0) bodyFromFlags.condition = parsedCondition;
596
+ const parsedSatisfaction = coerceBodyFlag(opts.satisfaction, { field: "satisfaction", flag: "--satisfaction", kind: "number" }, exitWithError);
597
+ if (parsedSatisfaction !== void 0) bodyFromFlags.satisfaction = parsedSatisfaction;
598
+ const parsedUsage = coerceBodyFlag(opts.usage, { field: "usage", flag: "--usage", kind: "number" }, exitWithError);
599
+ if (parsedUsage !== void 0) bodyFromFlags.usage = parsedUsage;
600
+ const parsedFriction = coerceBodyFlag(opts.friction, { field: "friction", flag: "--friction", kind: "number" }, exitWithError);
601
+ if (parsedFriction !== void 0) bodyFromFlags.friction = parsedFriction;
602
+ const parsedLifetimeValue = coerceBodyFlag(opts.lifetimeValue, { field: "lifetimeValue", flag: "--lifetime-value", kind: "number" }, exitWithError);
603
+ if (parsedLifetimeValue !== void 0) bodyFromFlags.lifetimeValue = parsedLifetimeValue;
604
+ const parsedAcquisitionDate = coerceBodyFlag(opts.acquisitionDate, { field: "acquisitionDate", flag: "--acquisition-date", kind: "number" }, exitWithError);
605
+ if (parsedAcquisitionDate !== void 0) bodyFromFlags.acquisitionDate = parsedAcquisitionDate;
606
+ const parsedCost = coerceBodyFlag(opts.cost, { field: "cost", flag: "--cost", kind: "number" }, exitWithError);
607
+ if (parsedCost !== void 0) bodyFromFlags.cost = parsedCost;
608
+ const body = mergeBody(bodyFromFlags, opts.body);
609
+ if (opts.ifNotExists) {
610
+ }
611
+ const res = await apiRequest({ method: "POST", path: "assets", token, baseUrl: getBaseUrl(), body });
612
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
613
+ const data = res.data?.data ?? res.data;
614
+ printOutput(getOutputFormat(), data ?? {}, false);
615
+ });
616
+ assetsCmd.command("update <id>").description("Update assets").option("--body <json>", "Request body JSON (merged with flags)").option("--ids <ids>", "Comma-separated IDs for bulk update (max 25)").option("--name <value>", "name").option("--description <value>", "description").option("--scout-id <value>", "scoutId").option("--category-id <value>", "categoryId").option("--hero-image <value>", "heroImage").option("--condition <value>", "condition").option("--satisfaction <value>", "satisfaction").option("--usage <value>", "usage").option("--friction <value>", "friction").option("--lifetime-value <value>", "lifetimeValue").option("--acquisition-date <value>", "acquisitionDate").option("--cost <value>", "cost").hook("preAction", (thisCommand) => {
617
+ syncRootOptsFromCommand(thisCommand);
618
+ }).action(async (id, opts) => {
619
+ const token = requireToken();
620
+ if (!token) exitWithError(401, "Missing or invalid token");
621
+ const ids = parseIds(opts.ids);
622
+ if (ids.length > 0) {
623
+ validateBulkIds(ids, "assets");
624
+ const { data: data2, summary } = await runBulk({
625
+ items: ids,
626
+ runOne: async (itemId) => {
627
+ const bodyFromFlags2 = {};
628
+ const parsedName2 = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
629
+ if (parsedName2 !== void 0) bodyFromFlags2.name = parsedName2;
630
+ const parsedDescription2 = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
631
+ if (parsedDescription2 !== void 0) bodyFromFlags2.description = parsedDescription2;
632
+ const parsedScoutId2 = coerceBodyFlag(opts.scoutId, { field: "scoutId", flag: "--scout-id", kind: "string", allowNull: true }, exitWithError);
633
+ if (parsedScoutId2 !== void 0) bodyFromFlags2.scoutId = parsedScoutId2;
634
+ const parsedCategoryId2 = coerceBodyFlag(opts.categoryId, { field: "categoryId", flag: "--category-id", kind: "string", allowNull: true }, exitWithError);
635
+ if (parsedCategoryId2 !== void 0) bodyFromFlags2.categoryId = parsedCategoryId2;
636
+ const parsedHeroImage2 = coerceBodyFlag(opts.heroImage, { field: "heroImage", flag: "--hero-image", kind: "string" }, exitWithError);
637
+ if (parsedHeroImage2 !== void 0) bodyFromFlags2.heroImage = parsedHeroImage2;
638
+ const parsedCondition2 = coerceBodyFlag(opts.condition, { field: "condition", flag: "--condition", kind: "number" }, exitWithError);
639
+ if (parsedCondition2 !== void 0) bodyFromFlags2.condition = parsedCondition2;
640
+ const parsedSatisfaction2 = coerceBodyFlag(opts.satisfaction, { field: "satisfaction", flag: "--satisfaction", kind: "number" }, exitWithError);
641
+ if (parsedSatisfaction2 !== void 0) bodyFromFlags2.satisfaction = parsedSatisfaction2;
642
+ const parsedUsage2 = coerceBodyFlag(opts.usage, { field: "usage", flag: "--usage", kind: "number" }, exitWithError);
643
+ if (parsedUsage2 !== void 0) bodyFromFlags2.usage = parsedUsage2;
644
+ const parsedFriction2 = coerceBodyFlag(opts.friction, { field: "friction", flag: "--friction", kind: "number" }, exitWithError);
645
+ if (parsedFriction2 !== void 0) bodyFromFlags2.friction = parsedFriction2;
646
+ const parsedLifetimeValue2 = coerceBodyFlag(opts.lifetimeValue, { field: "lifetimeValue", flag: "--lifetime-value", kind: "number" }, exitWithError);
647
+ if (parsedLifetimeValue2 !== void 0) bodyFromFlags2.lifetimeValue = parsedLifetimeValue2;
648
+ const parsedAcquisitionDate2 = coerceBodyFlag(opts.acquisitionDate, { field: "acquisitionDate", flag: "--acquisition-date", kind: "number" }, exitWithError);
649
+ if (parsedAcquisitionDate2 !== void 0) bodyFromFlags2.acquisitionDate = parsedAcquisitionDate2;
650
+ const parsedCost2 = coerceBodyFlag(opts.cost, { field: "cost", flag: "--cost", kind: "number" }, exitWithError);
651
+ if (parsedCost2 !== void 0) bodyFromFlags2.cost = parsedCost2;
652
+ const body2 = mergeBody(bodyFromFlags2, opts.body);
653
+ const res2 = await apiRequest({ method: "PATCH", path: "assets/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl(), body: body2 });
654
+ return { ok: res2.ok, status: res2.status || 0, data: res2.data, error: res2.error };
655
+ },
656
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "updated" } : { error: true, statusCode: status, message: err ?? "Failed" }
657
+ });
658
+ printOutput(getOutputFormat(), { data: data2, summary }, false);
659
+ return;
660
+ }
661
+ const bodyFromFlags = {};
662
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
663
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
664
+ const parsedDescription = coerceBodyFlag(opts.description, { field: "description", flag: "--description", kind: "string" }, exitWithError);
665
+ if (parsedDescription !== void 0) bodyFromFlags.description = parsedDescription;
666
+ const parsedScoutId = coerceBodyFlag(opts.scoutId, { field: "scoutId", flag: "--scout-id", kind: "string", allowNull: true }, exitWithError);
667
+ if (parsedScoutId !== void 0) bodyFromFlags.scoutId = parsedScoutId;
668
+ const parsedCategoryId = coerceBodyFlag(opts.categoryId, { field: "categoryId", flag: "--category-id", kind: "string", allowNull: true }, exitWithError);
669
+ if (parsedCategoryId !== void 0) bodyFromFlags.categoryId = parsedCategoryId;
670
+ const parsedHeroImage = coerceBodyFlag(opts.heroImage, { field: "heroImage", flag: "--hero-image", kind: "string" }, exitWithError);
671
+ if (parsedHeroImage !== void 0) bodyFromFlags.heroImage = parsedHeroImage;
672
+ const parsedCondition = coerceBodyFlag(opts.condition, { field: "condition", flag: "--condition", kind: "number" }, exitWithError);
673
+ if (parsedCondition !== void 0) bodyFromFlags.condition = parsedCondition;
674
+ const parsedSatisfaction = coerceBodyFlag(opts.satisfaction, { field: "satisfaction", flag: "--satisfaction", kind: "number" }, exitWithError);
675
+ if (parsedSatisfaction !== void 0) bodyFromFlags.satisfaction = parsedSatisfaction;
676
+ const parsedUsage = coerceBodyFlag(opts.usage, { field: "usage", flag: "--usage", kind: "number" }, exitWithError);
677
+ if (parsedUsage !== void 0) bodyFromFlags.usage = parsedUsage;
678
+ const parsedFriction = coerceBodyFlag(opts.friction, { field: "friction", flag: "--friction", kind: "number" }, exitWithError);
679
+ if (parsedFriction !== void 0) bodyFromFlags.friction = parsedFriction;
680
+ const parsedLifetimeValue = coerceBodyFlag(opts.lifetimeValue, { field: "lifetimeValue", flag: "--lifetime-value", kind: "number" }, exitWithError);
681
+ if (parsedLifetimeValue !== void 0) bodyFromFlags.lifetimeValue = parsedLifetimeValue;
682
+ const parsedAcquisitionDate = coerceBodyFlag(opts.acquisitionDate, { field: "acquisitionDate", flag: "--acquisition-date", kind: "number" }, exitWithError);
683
+ if (parsedAcquisitionDate !== void 0) bodyFromFlags.acquisitionDate = parsedAcquisitionDate;
684
+ const parsedCost = coerceBodyFlag(opts.cost, { field: "cost", flag: "--cost", kind: "number" }, exitWithError);
685
+ if (parsedCost !== void 0) bodyFromFlags.cost = parsedCost;
686
+ const body = mergeBody(bodyFromFlags, opts.body);
687
+ const res = await apiRequest({ method: "PATCH", path: "assets/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), body });
688
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
689
+ const data = res.data?.data ?? res.data;
690
+ printOutput(getOutputFormat(), data ?? {}, false);
691
+ });
692
+ assetsCmd.command("delete <id>").description("Delete assets").option("--ids <ids>", "Comma-separated IDs for bulk delete (max 25)").hook("preAction", (thisCommand) => {
693
+ syncRootOptsFromCommand(thisCommand);
694
+ }).action(async (id, opts) => {
695
+ const token = requireToken();
696
+ if (!token) exitWithError(401, "Missing or invalid token");
697
+ const ids = parseIds(opts.ids);
698
+ if (ids.length > 0) {
699
+ validateBulkIds(ids, "assets");
700
+ const { data, summary } = await runBulk({
701
+ items: ids,
702
+ runOne: async (itemId) => {
703
+ const res2 = await apiRequest({ method: "DELETE", path: "assets/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl() });
704
+ return { ok: res2.ok, status: res2.status || 0, error: res2.error };
705
+ },
706
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "deleted" } : { error: true, statusCode: status, message: err ?? "Failed" }
707
+ });
708
+ printOutput(getOutputFormat(), { data, summary }, false);
709
+ return;
710
+ }
711
+ const res = await apiRequest({ method: "DELETE", path: "assets/" + encodeURIComponent(id), token, baseUrl: getBaseUrl() });
712
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
713
+ if (getOutputFormat() === "json") console.log(JSON.stringify({ data: null, deleted: true }));
714
+ });
715
+ const categoriesCmd = program.command("categories").description("categories resource");
716
+ categoriesCmd.command("list").description("List categories").option("--limit <n>", "Max results").option("--offset <n>", "Skip n results").option("--organization-id <value>", "Filter by organizationId").hook("preAction", (thisCommand) => {
717
+ syncRootOptsFromCommand(thisCommand);
718
+ }).action(async (opts) => {
719
+ const token = requireToken();
720
+ if (!token) exitWithError(401, "Missing or invalid token");
721
+ const query = {};
722
+ if (opts.limit != null) query.limit = opts.limit;
723
+ if (opts.offset != null) query.offset = opts.offset;
724
+ if (opts.organizationId != null) {
725
+ query.organizationId = coerceQueryFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
726
+ }
727
+ const res = await apiRequest({ method: "GET", path: "categories", token, baseUrl: getBaseUrl(), query });
728
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
729
+ const data = res.data?.data ?? [];
730
+ printOutput(getOutputFormat(), data, false);
731
+ });
732
+ categoriesCmd.command("get <id>").description("Get one categories by id").hook("preAction", (thisCommand) => {
733
+ syncRootOptsFromCommand(thisCommand);
734
+ }).action(async (id, opts) => {
735
+ const token = requireToken();
736
+ if (!token) exitWithError(401, "Missing or invalid token");
737
+ const query = {};
738
+ const res = await apiRequest({ method: "GET", path: "categories/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), query });
739
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
740
+ const data = res.data?.data ?? res.data;
741
+ printOutput(getOutputFormat(), data ?? {}, false);
742
+ });
743
+ categoriesCmd.command("create").description("Create categories").option("--body <json>", "Request body JSON (merged with flags)").option("--name <value>", "name").option("--organization-id <value>", "organizationId").option("--default-bucket <value>", "defaultBucket").option("--if-not-exists", "Return existing if match found").hook("preAction", (thisCommand) => {
744
+ syncRootOptsFromCommand(thisCommand);
745
+ }).action(async (opts) => {
746
+ const token = requireToken();
747
+ if (!token) exitWithError(401, "Missing or invalid token");
748
+ const bodyFromFlags = {};
749
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
750
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
751
+ const parsedOrganizationId = coerceBodyFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
752
+ if (parsedOrganizationId !== void 0) bodyFromFlags.organizationId = parsedOrganizationId;
753
+ const parsedDefaultBucket = coerceBodyFlag(opts.defaultBucket, { field: "defaultBucket", flag: "--default-bucket", kind: "string" }, exitWithError);
754
+ if (parsedDefaultBucket !== void 0) bodyFromFlags.defaultBucket = parsedDefaultBucket;
755
+ const body = mergeBody(bodyFromFlags, opts.body);
756
+ if (opts.ifNotExists) {
757
+ }
758
+ const res = await apiRequest({ method: "POST", path: "categories", token, baseUrl: getBaseUrl(), body });
759
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
760
+ const data = res.data?.data ?? res.data;
761
+ printOutput(getOutputFormat(), data ?? {}, false);
762
+ });
763
+ categoriesCmd.command("update <id>").description("Update categories").option("--body <json>", "Request body JSON (merged with flags)").option("--ids <ids>", "Comma-separated IDs for bulk update (max 25)").option("--name <value>", "name").option("--default-bucket <value>", "defaultBucket").hook("preAction", (thisCommand) => {
764
+ syncRootOptsFromCommand(thisCommand);
765
+ }).action(async (id, opts) => {
766
+ const token = requireToken();
767
+ if (!token) exitWithError(401, "Missing or invalid token");
768
+ const ids = parseIds(opts.ids);
769
+ if (ids.length > 0) {
770
+ validateBulkIds(ids, "categories");
771
+ const { data: data2, summary } = await runBulk({
772
+ items: ids,
773
+ runOne: async (itemId) => {
774
+ const bodyFromFlags2 = {};
775
+ const parsedName2 = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
776
+ if (parsedName2 !== void 0) bodyFromFlags2.name = parsedName2;
777
+ const parsedDefaultBucket2 = coerceBodyFlag(opts.defaultBucket, { field: "defaultBucket", flag: "--default-bucket", kind: "string" }, exitWithError);
778
+ if (parsedDefaultBucket2 !== void 0) bodyFromFlags2.defaultBucket = parsedDefaultBucket2;
779
+ const body2 = mergeBody(bodyFromFlags2, opts.body);
780
+ const res2 = await apiRequest({ method: "PATCH", path: "categories/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl(), body: body2 });
781
+ return { ok: res2.ok, status: res2.status || 0, data: res2.data, error: res2.error };
782
+ },
783
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "updated" } : { error: true, statusCode: status, message: err ?? "Failed" }
784
+ });
785
+ printOutput(getOutputFormat(), { data: data2, summary }, false);
786
+ return;
787
+ }
788
+ const bodyFromFlags = {};
789
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
790
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
791
+ const parsedDefaultBucket = coerceBodyFlag(opts.defaultBucket, { field: "defaultBucket", flag: "--default-bucket", kind: "string" }, exitWithError);
792
+ if (parsedDefaultBucket !== void 0) bodyFromFlags.defaultBucket = parsedDefaultBucket;
793
+ const body = mergeBody(bodyFromFlags, opts.body);
794
+ const res = await apiRequest({ method: "PATCH", path: "categories/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), body });
795
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
796
+ const data = res.data?.data ?? res.data;
797
+ printOutput(getOutputFormat(), data ?? {}, false);
798
+ });
799
+ categoriesCmd.command("delete <id>").description("Delete categories").option("--ids <ids>", "Comma-separated IDs for bulk delete (max 25)").hook("preAction", (thisCommand) => {
800
+ syncRootOptsFromCommand(thisCommand);
801
+ }).action(async (id, opts) => {
802
+ const token = requireToken();
803
+ if (!token) exitWithError(401, "Missing or invalid token");
804
+ const ids = parseIds(opts.ids);
805
+ if (ids.length > 0) {
806
+ validateBulkIds(ids, "categories");
807
+ const { data, summary } = await runBulk({
808
+ items: ids,
809
+ runOne: async (itemId) => {
810
+ const res2 = await apiRequest({ method: "DELETE", path: "categories/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl() });
811
+ return { ok: res2.ok, status: res2.status || 0, error: res2.error };
812
+ },
813
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "deleted" } : { error: true, statusCode: status, message: err ?? "Failed" }
814
+ });
815
+ printOutput(getOutputFormat(), { data, summary }, false);
816
+ return;
817
+ }
818
+ const res = await apiRequest({ method: "DELETE", path: "categories/" + encodeURIComponent(id), token, baseUrl: getBaseUrl() });
819
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
820
+ if (getOutputFormat() === "json") console.log(JSON.stringify({ data: null, deleted: true }));
821
+ });
822
+ const labelsCmd = program.command("labels").description("labels resource");
823
+ labelsCmd.command("list").description("List labels").option("--limit <n>", "Max results").option("--offset <n>", "Skip n results").option("--organization-id <value>", "Filter by organizationId").hook("preAction", (thisCommand) => {
824
+ syncRootOptsFromCommand(thisCommand);
825
+ }).action(async (opts) => {
826
+ const token = requireToken();
827
+ if (!token) exitWithError(401, "Missing or invalid token");
828
+ const query = {};
829
+ if (opts.limit != null) query.limit = opts.limit;
830
+ if (opts.offset != null) query.offset = opts.offset;
831
+ if (opts.organizationId != null) {
832
+ query.organizationId = coerceQueryFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
833
+ }
834
+ const res = await apiRequest({ method: "GET", path: "labels", token, baseUrl: getBaseUrl(), query });
835
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
836
+ const data = res.data?.data ?? [];
837
+ printOutput(getOutputFormat(), data, false);
838
+ });
839
+ labelsCmd.command("get <id>").description("Get one labels by id").hook("preAction", (thisCommand) => {
840
+ syncRootOptsFromCommand(thisCommand);
841
+ }).action(async (id, opts) => {
842
+ const token = requireToken();
843
+ if (!token) exitWithError(401, "Missing or invalid token");
844
+ const query = {};
845
+ const res = await apiRequest({ method: "GET", path: "labels/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), query });
846
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
847
+ const data = res.data?.data ?? res.data;
848
+ printOutput(getOutputFormat(), data ?? {}, false);
849
+ });
850
+ labelsCmd.command("create").description("Create labels").option("--body <json>", "Request body JSON (merged with flags)").option("--name <value>", "name").option("--organization-id <value>", "organizationId").option("--colour <value>", "colour").option("--if-not-exists", "Return existing if match found").hook("preAction", (thisCommand) => {
851
+ syncRootOptsFromCommand(thisCommand);
852
+ }).action(async (opts) => {
853
+ const token = requireToken();
854
+ if (!token) exitWithError(401, "Missing or invalid token");
855
+ const bodyFromFlags = {};
856
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
857
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
858
+ const parsedOrganizationId = coerceBodyFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
859
+ if (parsedOrganizationId !== void 0) bodyFromFlags.organizationId = parsedOrganizationId;
860
+ const parsedColour = coerceBodyFlag(opts.colour, { field: "colour", flag: "--colour", kind: "string" }, exitWithError);
861
+ if (parsedColour !== void 0) bodyFromFlags.colour = parsedColour;
862
+ const body = mergeBody(bodyFromFlags, opts.body);
863
+ if (opts.ifNotExists) {
864
+ }
865
+ const res = await apiRequest({ method: "POST", path: "labels", token, baseUrl: getBaseUrl(), body });
866
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
867
+ const data = res.data?.data ?? res.data;
868
+ printOutput(getOutputFormat(), data ?? {}, false);
869
+ });
870
+ labelsCmd.command("update <id>").description("Update labels").option("--body <json>", "Request body JSON (merged with flags)").option("--ids <ids>", "Comma-separated IDs for bulk update (max 25)").option("--name <value>", "name").option("--colour <value>", "colour").hook("preAction", (thisCommand) => {
871
+ syncRootOptsFromCommand(thisCommand);
872
+ }).action(async (id, opts) => {
873
+ const token = requireToken();
874
+ if (!token) exitWithError(401, "Missing or invalid token");
875
+ const ids = parseIds(opts.ids);
876
+ if (ids.length > 0) {
877
+ validateBulkIds(ids, "labels");
878
+ const { data: data2, summary } = await runBulk({
879
+ items: ids,
880
+ runOne: async (itemId) => {
881
+ const bodyFromFlags2 = {};
882
+ const parsedName2 = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
883
+ if (parsedName2 !== void 0) bodyFromFlags2.name = parsedName2;
884
+ const parsedColour2 = coerceBodyFlag(opts.colour, { field: "colour", flag: "--colour", kind: "string" }, exitWithError);
885
+ if (parsedColour2 !== void 0) bodyFromFlags2.colour = parsedColour2;
886
+ const body2 = mergeBody(bodyFromFlags2, opts.body);
887
+ const res2 = await apiRequest({ method: "PATCH", path: "labels/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl(), body: body2 });
888
+ return { ok: res2.ok, status: res2.status || 0, data: res2.data, error: res2.error };
889
+ },
890
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "updated" } : { error: true, statusCode: status, message: err ?? "Failed" }
891
+ });
892
+ printOutput(getOutputFormat(), { data: data2, summary }, false);
893
+ return;
894
+ }
895
+ const bodyFromFlags = {};
896
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
897
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
898
+ const parsedColour = coerceBodyFlag(opts.colour, { field: "colour", flag: "--colour", kind: "string" }, exitWithError);
899
+ if (parsedColour !== void 0) bodyFromFlags.colour = parsedColour;
900
+ const body = mergeBody(bodyFromFlags, opts.body);
901
+ const res = await apiRequest({ method: "PATCH", path: "labels/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), body });
902
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
903
+ const data = res.data?.data ?? res.data;
904
+ printOutput(getOutputFormat(), data ?? {}, false);
905
+ });
906
+ labelsCmd.command("delete <id>").description("Delete labels").option("--ids <ids>", "Comma-separated IDs for bulk delete (max 25)").hook("preAction", (thisCommand) => {
907
+ syncRootOptsFromCommand(thisCommand);
908
+ }).action(async (id, opts) => {
909
+ const token = requireToken();
910
+ if (!token) exitWithError(401, "Missing or invalid token");
911
+ const ids = parseIds(opts.ids);
912
+ if (ids.length > 0) {
913
+ validateBulkIds(ids, "labels");
914
+ const { data, summary } = await runBulk({
915
+ items: ids,
916
+ runOne: async (itemId) => {
917
+ const res2 = await apiRequest({ method: "DELETE", path: "labels/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl() });
918
+ return { ok: res2.ok, status: res2.status || 0, error: res2.error };
919
+ },
920
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "deleted" } : { error: true, statusCode: status, message: err ?? "Failed" }
921
+ });
922
+ printOutput(getOutputFormat(), { data, summary }, false);
923
+ return;
924
+ }
925
+ const res = await apiRequest({ method: "DELETE", path: "labels/" + encodeURIComponent(id), token, baseUrl: getBaseUrl() });
926
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
927
+ if (getOutputFormat() === "json") console.log(JSON.stringify({ data: null, deleted: true }));
928
+ });
929
+ const viewsCmd = program.command("views").description("views resource");
930
+ viewsCmd.command("list").description("List views").option("--limit <n>", "Max results").option("--offset <n>", "Skip n results").option("--organization-id <value>", "Filter by organizationId").option("--project-id <value>", "Filter by projectId").option("--entity-type <value>", "Filter by entityType").hook("preAction", (thisCommand) => {
931
+ syncRootOptsFromCommand(thisCommand);
932
+ }).action(async (opts) => {
933
+ const token = requireToken();
934
+ if (!token) exitWithError(401, "Missing or invalid token");
935
+ const query = {};
936
+ if (opts.limit != null) query.limit = opts.limit;
937
+ if (opts.offset != null) query.offset = opts.offset;
938
+ if (opts.organizationId != null) {
939
+ query.organizationId = coerceQueryFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
940
+ }
941
+ if (opts.projectId != null) {
942
+ query.projectId = coerceQueryFlag(opts.projectId, { field: "projectId", flag: "--project-id", kind: "string" }, exitWithError);
943
+ }
944
+ if (opts.entityType != null) {
945
+ query.entityType = coerceQueryFlag(opts.entityType, { field: "entityType", flag: "--entity-type", kind: "string" }, exitWithError);
946
+ }
947
+ const res = await apiRequest({ method: "GET", path: "views", token, baseUrl: getBaseUrl(), query });
948
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
949
+ const data = res.data?.data ?? [];
950
+ printOutput(getOutputFormat(), data, false);
951
+ });
952
+ viewsCmd.command("get <id>").description("Get one views by id").hook("preAction", (thisCommand) => {
953
+ syncRootOptsFromCommand(thisCommand);
954
+ }).action(async (id, opts) => {
955
+ const token = requireToken();
956
+ if (!token) exitWithError(401, "Missing or invalid token");
957
+ const query = {};
958
+ const res = await apiRequest({ method: "GET", path: "views/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), query });
959
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
960
+ const data = res.data?.data ?? res.data;
961
+ printOutput(getOutputFormat(), data ?? {}, false);
962
+ });
963
+ viewsCmd.command("create").description("Create views").option("--body <json>", "Request body JSON (merged with flags)").option("--name <value>", "name").option("--organization-id <value>", "organizationId").option("--project-id <value>", "projectId").option("--entity-type <value>", "entityType").option("--config <value>", "config").option("--is-default <value>", "isDefault").option("--if-not-exists", "Return existing if match found").hook("preAction", (thisCommand) => {
964
+ syncRootOptsFromCommand(thisCommand);
965
+ }).action(async (opts) => {
966
+ const token = requireToken();
967
+ if (!token) exitWithError(401, "Missing or invalid token");
968
+ const bodyFromFlags = {};
969
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
970
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
971
+ const parsedOrganizationId = coerceBodyFlag(opts.organizationId, { field: "organizationId", flag: "--organization-id", kind: "string" }, exitWithError);
972
+ if (parsedOrganizationId !== void 0) bodyFromFlags.organizationId = parsedOrganizationId;
973
+ const parsedProjectId = coerceBodyFlag(opts.projectId, { field: "projectId", flag: "--project-id", kind: "string" }, exitWithError);
974
+ if (parsedProjectId !== void 0) bodyFromFlags.projectId = parsedProjectId;
975
+ const parsedEntityType = coerceBodyFlag(opts.entityType, { field: "entityType", flag: "--entity-type", kind: "string" }, exitWithError);
976
+ if (parsedEntityType !== void 0) bodyFromFlags.entityType = parsedEntityType;
977
+ const parsedConfig = coerceBodyFlag(opts.config, { field: "config", flag: "--config", kind: "string" }, exitWithError);
978
+ if (parsedConfig !== void 0) bodyFromFlags.config = parsedConfig;
979
+ const parsedIsDefault = coerceBodyFlag(opts.isDefault, { field: "isDefault", flag: "--is-default", kind: "boolean" }, exitWithError);
980
+ if (parsedIsDefault !== void 0) bodyFromFlags.isDefault = parsedIsDefault;
981
+ const body = mergeBody(bodyFromFlags, opts.body);
982
+ if (opts.ifNotExists) {
983
+ }
984
+ const res = await apiRequest({ method: "POST", path: "views", token, baseUrl: getBaseUrl(), body });
985
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
986
+ const data = res.data?.data ?? res.data;
987
+ printOutput(getOutputFormat(), data ?? {}, false);
988
+ });
989
+ viewsCmd.command("update <id>").description("Update views").option("--body <json>", "Request body JSON (merged with flags)").option("--ids <ids>", "Comma-separated IDs for bulk update (max 25)").option("--name <value>", "name").option("--project-id <value>", "projectId").option("--config <value>", "config").option("--is-default <value>", "isDefault").hook("preAction", (thisCommand) => {
990
+ syncRootOptsFromCommand(thisCommand);
991
+ }).action(async (id, opts) => {
992
+ const token = requireToken();
993
+ if (!token) exitWithError(401, "Missing or invalid token");
994
+ const ids = parseIds(opts.ids);
995
+ if (ids.length > 0) {
996
+ validateBulkIds(ids, "views");
997
+ const { data: data2, summary } = await runBulk({
998
+ items: ids,
999
+ runOne: async (itemId) => {
1000
+ const bodyFromFlags2 = {};
1001
+ const parsedName2 = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
1002
+ if (parsedName2 !== void 0) bodyFromFlags2.name = parsedName2;
1003
+ const parsedProjectId2 = coerceBodyFlag(opts.projectId, { field: "projectId", flag: "--project-id", kind: "string" }, exitWithError);
1004
+ if (parsedProjectId2 !== void 0) bodyFromFlags2.projectId = parsedProjectId2;
1005
+ const parsedConfig2 = coerceBodyFlag(opts.config, { field: "config", flag: "--config", kind: "string" }, exitWithError);
1006
+ if (parsedConfig2 !== void 0) bodyFromFlags2.config = parsedConfig2;
1007
+ const parsedIsDefault2 = coerceBodyFlag(opts.isDefault, { field: "isDefault", flag: "--is-default", kind: "boolean" }, exitWithError);
1008
+ if (parsedIsDefault2 !== void 0) bodyFromFlags2.isDefault = parsedIsDefault2;
1009
+ const body2 = mergeBody(bodyFromFlags2, opts.body);
1010
+ const res2 = await apiRequest({ method: "PATCH", path: "views/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl(), body: body2 });
1011
+ return { ok: res2.ok, status: res2.status || 0, data: res2.data, error: res2.error };
1012
+ },
1013
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "updated" } : { error: true, statusCode: status, message: err ?? "Failed" }
1014
+ });
1015
+ printOutput(getOutputFormat(), { data: data2, summary }, false);
1016
+ return;
1017
+ }
1018
+ const bodyFromFlags = {};
1019
+ const parsedName = coerceBodyFlag(opts.name, { field: "name", flag: "--name", kind: "string" }, exitWithError);
1020
+ if (parsedName !== void 0) bodyFromFlags.name = parsedName;
1021
+ const parsedProjectId = coerceBodyFlag(opts.projectId, { field: "projectId", flag: "--project-id", kind: "string" }, exitWithError);
1022
+ if (parsedProjectId !== void 0) bodyFromFlags.projectId = parsedProjectId;
1023
+ const parsedConfig = coerceBodyFlag(opts.config, { field: "config", flag: "--config", kind: "string" }, exitWithError);
1024
+ if (parsedConfig !== void 0) bodyFromFlags.config = parsedConfig;
1025
+ const parsedIsDefault = coerceBodyFlag(opts.isDefault, { field: "isDefault", flag: "--is-default", kind: "boolean" }, exitWithError);
1026
+ if (parsedIsDefault !== void 0) bodyFromFlags.isDefault = parsedIsDefault;
1027
+ const body = mergeBody(bodyFromFlags, opts.body);
1028
+ const res = await apiRequest({ method: "PATCH", path: "views/" + encodeURIComponent(id), token, baseUrl: getBaseUrl(), body });
1029
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
1030
+ const data = res.data?.data ?? res.data;
1031
+ printOutput(getOutputFormat(), data ?? {}, false);
1032
+ });
1033
+ viewsCmd.command("delete <id>").description("Delete views").option("--ids <ids>", "Comma-separated IDs for bulk delete (max 25)").hook("preAction", (thisCommand) => {
1034
+ syncRootOptsFromCommand(thisCommand);
1035
+ }).action(async (id, opts) => {
1036
+ const token = requireToken();
1037
+ if (!token) exitWithError(401, "Missing or invalid token");
1038
+ const ids = parseIds(opts.ids);
1039
+ if (ids.length > 0) {
1040
+ validateBulkIds(ids, "views");
1041
+ const { data, summary } = await runBulk({
1042
+ items: ids,
1043
+ runOne: async (itemId) => {
1044
+ const res2 = await apiRequest({ method: "DELETE", path: "views/" + encodeURIComponent(itemId), token, baseUrl: getBaseUrl() });
1045
+ return { ok: res2.ok, status: res2.status || 0, error: res2.error };
1046
+ },
1047
+ toResult: (itemId, ok, status, _data, err) => ok ? { _id: itemId, status: "deleted" } : { error: true, statusCode: status, message: err ?? "Failed" }
1048
+ });
1049
+ printOutput(getOutputFormat(), { data, summary }, false);
1050
+ return;
1051
+ }
1052
+ const res = await apiRequest({ method: "DELETE", path: "views/" + encodeURIComponent(id), token, baseUrl: getBaseUrl() });
1053
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
1054
+ if (getOutputFormat() === "json") console.log(JSON.stringify({ data: null, deleted: true }));
1055
+ });
1056
+ const commentsCmd = program.command("comments").description("comments resource");
1057
+ commentsCmd.command("list").description("List comments").option("--limit <n>", "Max results").option("--offset <n>", "Skip n results").option("--entity-type <value>", "Filter by entityType").option("--entity-id <value>", "Filter by entityId").hook("preAction", (thisCommand) => {
1058
+ syncRootOptsFromCommand(thisCommand);
1059
+ }).action(async (opts) => {
1060
+ const token = requireToken();
1061
+ if (!token) exitWithError(401, "Missing or invalid token");
1062
+ const query = {};
1063
+ if (opts.limit != null) query.limit = opts.limit;
1064
+ if (opts.offset != null) query.offset = opts.offset;
1065
+ if (opts.entityType != null) {
1066
+ query.entityType = coerceQueryFlag(opts.entityType, { field: "entityType", flag: "--entity-type", kind: "string" }, exitWithError);
1067
+ }
1068
+ if (opts.entityId != null) {
1069
+ query.entityId = coerceQueryFlag(opts.entityId, { field: "entityId", flag: "--entity-id", kind: "string" }, exitWithError);
1070
+ }
1071
+ const res = await apiRequest({ method: "GET", path: "comments", token, baseUrl: getBaseUrl(), query });
1072
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
1073
+ const data = res.data?.data ?? [];
1074
+ printOutput(getOutputFormat(), data, false);
1075
+ });
1076
+ commentsCmd.command("create").description("Create comments").option("--body <json>", "Request body JSON (merged with flags)").option("--entity-type <value>", "entityType").option("--entity-id <value>", "entityId").option("--text <value>", "body").option("--parent-comment-id <value>", "parentCommentId").option("--if-not-exists", "Return existing if match found").hook("preAction", (thisCommand) => {
1077
+ syncRootOptsFromCommand(thisCommand);
1078
+ }).action(async (opts) => {
1079
+ const token = requireToken();
1080
+ if (!token) exitWithError(401, "Missing or invalid token");
1081
+ const bodyFromFlags = {};
1082
+ const parsedEntityType = coerceBodyFlag(opts.entityType, { field: "entityType", flag: "--entity-type", kind: "string" }, exitWithError);
1083
+ if (parsedEntityType !== void 0) bodyFromFlags.entityType = parsedEntityType;
1084
+ const parsedEntityId = coerceBodyFlag(opts.entityId, { field: "entityId", flag: "--entity-id", kind: "string" }, exitWithError);
1085
+ if (parsedEntityId !== void 0) bodyFromFlags.entityId = parsedEntityId;
1086
+ const parsedBody = coerceBodyFlag(opts.text, { field: "body", flag: "--text", kind: "string" }, exitWithError);
1087
+ if (parsedBody !== void 0) bodyFromFlags.body = parsedBody;
1088
+ const parsedParentCommentId = coerceBodyFlag(opts.parentCommentId, { field: "parentCommentId", flag: "--parent-comment-id", kind: "string" }, exitWithError);
1089
+ if (parsedParentCommentId !== void 0) bodyFromFlags.parentCommentId = parsedParentCommentId;
1090
+ const body = mergeBody(bodyFromFlags, opts.body);
1091
+ if (opts.ifNotExists) {
1092
+ }
1093
+ const res = await apiRequest({ method: "POST", path: "comments", token, baseUrl: getBaseUrl(), body });
1094
+ if (!res.ok) exitWithError(res.status || 500, res.error ?? "Request failed");
1095
+ const data = res.data?.data ?? res.data;
1096
+ printOutput(getOutputFormat(), data ?? {}, false);
1097
+ });
1098
+ }
1099
+ export {
1100
+ register
1101
+ };
1102
+ //# sourceMappingURL=generated-D7S53VGE.js.map