epismo 0.4.5 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -38
- package/dist/aliases.js +2 -1
- package/dist/aliases.js.map +1 -1
- package/dist/analytics-service.js +44 -0
- package/dist/analytics-service.js.map +1 -0
- package/dist/api.js +8 -1
- package/dist/api.js.map +1 -1
- package/dist/auth.js +7 -0
- package/dist/auth.js.map +1 -1
- package/dist/context.js +4 -0
- package/dist/context.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/input.js +0 -24
- package/dist/input.js.map +1 -1
- package/dist/packs.js +24 -25
- package/dist/packs.js.map +1 -1
- package/dist/program.js +139 -149
- package/dist/program.js.map +1 -1
- package/dist/projects.js +20 -15
- package/dist/projects.js.map +1 -1
- package/dist/tracks.js +29 -14
- package/dist/tracks.js.map +1 -1
- package/dist/workspaces.js +19 -12
- package/dist/workspaces.js.map +1 -1
- package/package.json +1 -1
package/dist/packs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packs.js","sourceRoot":"","sources":["../src/packs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"packs.js","sourceRoot":"","sources":["../src/packs.ts"],"names":[],"mappings":"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"}
|
package/dist/program.js
CHANGED
|
@@ -9,8 +9,8 @@ import { deleteAlias, getAlias, listAliases, upsertAlias } from "./aliases.js";
|
|
|
9
9
|
import { creditBalance, creditCheckout } from "./credits.js";
|
|
10
10
|
import { CliError } from "./errors.js";
|
|
11
11
|
import { addAgents, listAgents, removeAgents } from "./agents.js";
|
|
12
|
-
import { createWorkspace,
|
|
13
|
-
import {
|
|
12
|
+
import { createWorkspace, deleteWorkspaceMembers, getWorkspaceCheckout, listWorkspaceMembers, updateWorkspace, upsertWorkspaceMembers } from "./workspaces.js";
|
|
13
|
+
import { addProjectMembers, createProject, deleteProject, deleteProjectMembers, listProjectMembers, listProjects, updateProject } from "./projects.js";
|
|
14
14
|
import { createToken } from "./token.js";
|
|
15
15
|
const TRACK_TYPES = ["task", "goal"];
|
|
16
16
|
const PACK_TYPES = ["workflow", "context"];
|
|
@@ -102,11 +102,11 @@ Examples:
|
|
|
102
102
|
epismo whoami
|
|
103
103
|
epismo workspace list
|
|
104
104
|
epismo alias list
|
|
105
|
-
epismo track search --
|
|
106
|
-
epismo pack search --
|
|
107
|
-
epismo pack get
|
|
108
|
-
epismo pack get
|
|
109
|
-
epismo pack get
|
|
105
|
+
epismo track search --query "bug"
|
|
106
|
+
epismo pack search --query "meeting notes"
|
|
107
|
+
epismo pack get <id> --block-id b001
|
|
108
|
+
epismo pack get @myproject
|
|
109
|
+
epismo pack get @handle/myproject`);
|
|
110
110
|
program
|
|
111
111
|
.command("login")
|
|
112
112
|
.description("log in to Epismo; default flow uses email + OTP, or open a browser to sign in")
|
|
@@ -181,13 +181,13 @@ Example:
|
|
|
181
181
|
workspace
|
|
182
182
|
.command("use")
|
|
183
183
|
.description("set the default workspace")
|
|
184
|
-
.
|
|
185
|
-
.action(async (
|
|
186
|
-
printJson(await useWorkspace({ workspaceId
|
|
184
|
+
.argument("<workspace-id>", "workspace id to set as default")
|
|
185
|
+
.action(async (workspaceId) => {
|
|
186
|
+
printJson(await useWorkspace({ workspaceId }));
|
|
187
187
|
});
|
|
188
188
|
workspace.commands.at(-1)?.addHelpText("after", `
|
|
189
189
|
Example:
|
|
190
|
-
epismo workspace use
|
|
190
|
+
epismo workspace use <workspace-id>`);
|
|
191
191
|
workspace
|
|
192
192
|
.command("clear")
|
|
193
193
|
.description("clear the saved workspace (reverts to personal space)")
|
|
@@ -223,25 +223,25 @@ Examples:
|
|
|
223
223
|
workspace
|
|
224
224
|
.command("checkout")
|
|
225
225
|
.description("get the billing URL for a workspace (to complete or retry payment)")
|
|
226
|
-
.
|
|
227
|
-
.action(async (
|
|
226
|
+
.argument("<workspace-id>", "workspace id")
|
|
227
|
+
.action(async (workspaceId) => {
|
|
228
228
|
const context = await resolveContext();
|
|
229
|
-
printJson(await getWorkspaceCheckout(context,
|
|
229
|
+
printJson(await getWorkspaceCheckout(context, workspaceId));
|
|
230
230
|
});
|
|
231
231
|
workspace.commands.at(-1)?.addHelpText("after", `
|
|
232
232
|
Examples:
|
|
233
|
-
epismo workspace checkout
|
|
233
|
+
epismo workspace checkout <workspace-id>`);
|
|
234
234
|
workspace
|
|
235
235
|
.command("update")
|
|
236
236
|
.description("update a workspace you own (PATCH — omitted fields are unchanged)")
|
|
237
|
+
.argument("<workspace-id>", "workspace id to update")
|
|
237
238
|
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
238
|
-
.requiredOption("--id <id>", "workspace id to update")
|
|
239
239
|
.option("--name <name>", "updated workspace name")
|
|
240
240
|
.addOption(new Option("--plan <plan>", "basic | pro").choices(["basic", "pro"]))
|
|
241
|
-
.action(async (options) => {
|
|
241
|
+
.action(async (workspaceId, options) => {
|
|
242
242
|
const payload = await resolveInput({ input: options.input }, { name: options.name, plan: options.plan });
|
|
243
243
|
const context = await resolveContext();
|
|
244
|
-
printJson(await updateWorkspace(context,
|
|
244
|
+
printJson(await updateWorkspace(context, workspaceId, payload));
|
|
245
245
|
});
|
|
246
246
|
const workspaceMember = workspace.command("member").description("manage workspace members");
|
|
247
247
|
workspaceMember
|
|
@@ -254,34 +254,35 @@ Examples:
|
|
|
254
254
|
workspaceMember
|
|
255
255
|
.command("upsert")
|
|
256
256
|
.description("add a workspace member or update the member role")
|
|
257
|
-
.
|
|
258
|
-
.
|
|
259
|
-
.
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
"
|
|
263
|
-
|
|
264
|
-
|
|
257
|
+
.argument("<user-ids>", "user id(s); comma-separated for multiple")
|
|
258
|
+
.addOption(new Option("--role <role>", "owner | admin | member")
|
|
259
|
+
.choices(["owner", "admin", "member"])
|
|
260
|
+
.makeOptionMandatory())
|
|
261
|
+
.action(async (userIdsArg, options) => {
|
|
262
|
+
const userIds = parseStringArrayInput(userIdsArg, "<user-ids>") ?? [];
|
|
263
|
+
if (userIds.length === 0) {
|
|
264
|
+
throw new CliError({
|
|
265
|
+
code: "INVALID_INPUT",
|
|
266
|
+
message: "At least one user id is required."
|
|
267
|
+
});
|
|
268
|
+
}
|
|
265
269
|
const context = await resolveContext();
|
|
266
|
-
|
|
267
|
-
workspaceId: context.workspaceId,
|
|
268
|
-
userId: options.userId,
|
|
269
|
-
role: options.role
|
|
270
|
-
});
|
|
271
|
-
printJson(await upsertWorkspaceMember(context, payload));
|
|
270
|
+
printJson(await upsertWorkspaceMembers(context, userIds, options.role));
|
|
272
271
|
});
|
|
273
272
|
workspaceMember
|
|
274
273
|
.command("delete")
|
|
275
274
|
.description("remove a workspace member")
|
|
276
|
-
.
|
|
277
|
-
.
|
|
278
|
-
|
|
275
|
+
.argument("<user-ids>", "user id(s); comma-separated for multiple")
|
|
276
|
+
.action(async (userIdsArg) => {
|
|
277
|
+
const userIds = parseStringArrayInput(userIdsArg, "<user-ids>") ?? [];
|
|
278
|
+
if (userIds.length === 0) {
|
|
279
|
+
throw new CliError({
|
|
280
|
+
code: "INVALID_INPUT",
|
|
281
|
+
message: "At least one user id is required."
|
|
282
|
+
});
|
|
283
|
+
}
|
|
279
284
|
const context = await resolveContext();
|
|
280
|
-
|
|
281
|
-
workspaceId: context.workspaceId,
|
|
282
|
-
userId: options.userId
|
|
283
|
-
});
|
|
284
|
-
printJson(await deleteWorkspaceMember(context, payload));
|
|
285
|
+
printJson(await deleteWorkspaceMembers(context, userIds));
|
|
285
286
|
});
|
|
286
287
|
const project = program.command("project").description("manage workspace projects");
|
|
287
288
|
project
|
|
@@ -308,29 +309,25 @@ Examples:
|
|
|
308
309
|
project
|
|
309
310
|
.command("update")
|
|
310
311
|
.description("update a project you can access (PATCH — omitted fields are unchanged)")
|
|
312
|
+
.argument("<project-id>", "project id to update")
|
|
311
313
|
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
312
|
-
.requiredOption("--id <id>", "project id to update")
|
|
313
314
|
.option("--name <name>", "updated project name")
|
|
314
315
|
.option("--description <description>", "updated project description")
|
|
315
|
-
.action(async (options) => {
|
|
316
|
+
.action(async (projectId, options) => {
|
|
316
317
|
const payload = await resolveInput(options, {
|
|
317
318
|
name: options.name,
|
|
318
319
|
description: options.description
|
|
319
320
|
});
|
|
320
321
|
const context = await resolveContext();
|
|
321
|
-
printJson(await updateProject(context,
|
|
322
|
+
printJson(await updateProject(context, projectId, payload));
|
|
322
323
|
});
|
|
323
324
|
project
|
|
324
325
|
.command("delete")
|
|
325
326
|
.description("delete a project you can access in the selected workspace")
|
|
326
|
-
.
|
|
327
|
-
.
|
|
328
|
-
.action(async (options) => {
|
|
329
|
-
const payload = await resolveInput(options, {
|
|
330
|
-
id: options.id
|
|
331
|
-
});
|
|
327
|
+
.argument("<project-id>", "project id")
|
|
328
|
+
.action(async (projectId) => {
|
|
332
329
|
const context = await resolveContext();
|
|
333
|
-
printJson(await deleteProject(context,
|
|
330
|
+
printJson(await deleteProject(context, projectId));
|
|
334
331
|
});
|
|
335
332
|
const projectMember = project.command("member").description("manage project members");
|
|
336
333
|
projectMember
|
|
@@ -347,31 +344,39 @@ Examples:
|
|
|
347
344
|
});
|
|
348
345
|
projectMember
|
|
349
346
|
.command("add")
|
|
350
|
-
.description("add
|
|
351
|
-
.
|
|
352
|
-
.
|
|
353
|
-
.
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
347
|
+
.description("add member(s) to a project")
|
|
348
|
+
.argument("<user-ids>", "user id(s); comma-separated for multiple")
|
|
349
|
+
.requiredOption("--project-id <projectId>", "project id")
|
|
350
|
+
.action(async (userIdsArg, options) => {
|
|
351
|
+
const userIds = parseStringArrayInput(userIdsArg, "<user-ids>") ?? [];
|
|
352
|
+
if (userIds.length === 0) {
|
|
353
|
+
throw new CliError({
|
|
354
|
+
code: "INVALID_INPUT",
|
|
355
|
+
message: "At least one user id is required."
|
|
356
|
+
});
|
|
357
|
+
}
|
|
359
358
|
const context = await resolveContext();
|
|
360
|
-
printJson(
|
|
359
|
+
printJson({
|
|
360
|
+
results: await addProjectMembers(context, options.projectId, userIds)
|
|
361
|
+
});
|
|
361
362
|
});
|
|
362
363
|
projectMember
|
|
363
364
|
.command("delete")
|
|
364
|
-
.description("remove
|
|
365
|
-
.
|
|
366
|
-
.
|
|
367
|
-
.
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
365
|
+
.description("remove user(s) from a project")
|
|
366
|
+
.argument("<user-ids>", "user id(s); comma-separated for multiple")
|
|
367
|
+
.requiredOption("--project-id <projectId>", "project id")
|
|
368
|
+
.action(async (userIdsArg, options) => {
|
|
369
|
+
const userIds = parseStringArrayInput(userIdsArg, "<user-ids>") ?? [];
|
|
370
|
+
if (userIds.length === 0) {
|
|
371
|
+
throw new CliError({
|
|
372
|
+
code: "INVALID_INPUT",
|
|
373
|
+
message: "At least one user id is required."
|
|
374
|
+
});
|
|
375
|
+
}
|
|
373
376
|
const context = await resolveContext();
|
|
374
|
-
printJson(
|
|
377
|
+
printJson({
|
|
378
|
+
results: await deleteProjectMembers(context, options.projectId, userIds)
|
|
379
|
+
});
|
|
375
380
|
});
|
|
376
381
|
const track = program.command("track").description("manage project tracks (tasks and goals)");
|
|
377
382
|
track
|
|
@@ -409,8 +414,8 @@ Examples:
|
|
|
409
414
|
track
|
|
410
415
|
.command("update")
|
|
411
416
|
.description("update an existing project track (PATCH — omitted fields are unchanged)")
|
|
417
|
+
.argument("<id>", "track id to update")
|
|
412
418
|
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
413
|
-
.requiredOption("--id <id>", "track id to update")
|
|
414
419
|
.option("--title <title>", "updated title")
|
|
415
420
|
.option("--content <content>", "updated markdown content")
|
|
416
421
|
.option("--project-ids <projectIds>", "JSON array or comma-separated project ids")
|
|
@@ -418,7 +423,7 @@ Examples:
|
|
|
418
423
|
.option("--emails <emails>", "JSON array or comma-separated email addresses")
|
|
419
424
|
.option("--task <task>", 'task-specific fields as partial JSON object e.g. \'{"status":"done"}\'')
|
|
420
425
|
.option("--goal <goal>", "goal-specific fields as partial JSON object e.g. '{\"progress\":50}'")
|
|
421
|
-
.action(async (options, command) => {
|
|
426
|
+
.action(async (id, options, command) => {
|
|
422
427
|
const payload = await resolveInput(options, {
|
|
423
428
|
title: options.title,
|
|
424
429
|
content: options.content,
|
|
@@ -427,31 +432,28 @@ Examples:
|
|
|
427
432
|
goal: parseJsonObjectOption(options.goal, "--goal")
|
|
428
433
|
});
|
|
429
434
|
const context = await resolveContext();
|
|
430
|
-
printJson(await updateTrack(context,
|
|
435
|
+
printJson(await updateTrack(context, id, payload));
|
|
431
436
|
});
|
|
432
437
|
track.commands.at(-1)?.addHelpText("after", `
|
|
433
438
|
Notes:
|
|
434
439
|
Omitted fields keep their existing value.
|
|
435
440
|
|
|
436
441
|
Examples:
|
|
437
|
-
epismo track update
|
|
438
|
-
epismo track update
|
|
439
|
-
epismo track update
|
|
442
|
+
epismo track update <id> --title "Updated title"
|
|
443
|
+
epismo track update <id> --task '{"status":"done"}'
|
|
444
|
+
epismo track update <id> --goal '{"progress":75}'`);
|
|
440
445
|
track
|
|
441
446
|
.command("get")
|
|
442
447
|
.description("fetch one project track")
|
|
448
|
+
.argument("<id>", "track id")
|
|
443
449
|
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
444
|
-
.
|
|
445
|
-
.action(async (options) => {
|
|
446
|
-
const payload = await resolveInput(options, {
|
|
447
|
-
id: options.id
|
|
448
|
-
});
|
|
450
|
+
.action(async (id) => {
|
|
449
451
|
const context = await resolveContext();
|
|
450
|
-
printJson(await getTrack(context,
|
|
452
|
+
printJson(await getTrack(context, id));
|
|
451
453
|
});
|
|
452
454
|
track.commands.at(-1)?.addHelpText("after", `
|
|
453
455
|
Example:
|
|
454
|
-
epismo track get
|
|
456
|
+
epismo track get <id>`);
|
|
455
457
|
track
|
|
456
458
|
.command("search")
|
|
457
459
|
.description("search project tracks")
|
|
@@ -475,24 +477,21 @@ Example:
|
|
|
475
477
|
});
|
|
476
478
|
track.commands.at(-1)?.addHelpText("after", `
|
|
477
479
|
Examples:
|
|
480
|
+
epismo track search --query "bug"
|
|
478
481
|
epismo track search --type task --query "bug"
|
|
479
482
|
epismo track search --type task --filter '{"status":["todo"]}'
|
|
480
483
|
epismo track search --type goal --query "roadmap"`);
|
|
481
484
|
track
|
|
482
485
|
.command("delete")
|
|
483
486
|
.description("delete one project track")
|
|
484
|
-
.
|
|
485
|
-
.
|
|
486
|
-
.action(async (options) => {
|
|
487
|
-
const payload = await resolveInput(options, {
|
|
488
|
-
id: options.id
|
|
489
|
-
});
|
|
487
|
+
.argument("<id>", "track id")
|
|
488
|
+
.action(async (id) => {
|
|
490
489
|
const context = await resolveContext();
|
|
491
|
-
printJson(await deleteTrack(context,
|
|
490
|
+
printJson(await deleteTrack(context, id));
|
|
492
491
|
});
|
|
493
492
|
track.commands.at(-1)?.addHelpText("after", `
|
|
494
493
|
Example:
|
|
495
|
-
epismo track delete
|
|
494
|
+
epismo track delete <id>`);
|
|
496
495
|
track
|
|
497
496
|
.command("apply")
|
|
498
497
|
.description("create, update, and delete multiple tracks in a single request")
|
|
@@ -563,7 +562,7 @@ Examples:
|
|
|
563
562
|
epismo pack create --type context --title "My context" --blocks '[{"title":"Block 1","content":"..."}]'`);
|
|
564
563
|
pack.command("update")
|
|
565
564
|
.description("update an existing agent pack (PATCH semantics — omitted fields are unchanged)")
|
|
566
|
-
.
|
|
565
|
+
.argument("<reference>", "pack reference: id, alias, share URL, or hub URL")
|
|
567
566
|
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
568
567
|
.option("--title <title>", "updated title")
|
|
569
568
|
.option("--content <content>", "updated markdown content")
|
|
@@ -574,7 +573,7 @@ Examples:
|
|
|
574
573
|
.option("--emails <emails>", "JSON array or comma-separated email addresses")
|
|
575
574
|
.option("--steps <steps>", 'step operations as JSON array with op field: [{"op":"add","title":"..."},{"op":"update","id":"s001","content":"..."},{"op":"remove","id":"s002"}]')
|
|
576
575
|
.option("--blocks <blocks>", 'block operations as JSON array with op field: [{"op":"add","title":"..."},{"op":"update","id":"b001","content":"..."},{"op":"remove","id":"b002"}]')
|
|
577
|
-
.action(async (options, command) => {
|
|
576
|
+
.action(async (reference, options, command) => {
|
|
578
577
|
const payload = await resolveInput(options, {
|
|
579
578
|
title: options.title,
|
|
580
579
|
content: options.content,
|
|
@@ -585,7 +584,7 @@ Examples:
|
|
|
585
584
|
blocks: parseJsonArrayOption(options.blocks, "--blocks")
|
|
586
585
|
});
|
|
587
586
|
const context = await resolveContext();
|
|
588
|
-
printJson(await updatePack(context,
|
|
587
|
+
printJson(await updatePack(context, reference, payload));
|
|
589
588
|
});
|
|
590
589
|
pack.commands.at(-1)?.addHelpText("after", `
|
|
591
590
|
Notes:
|
|
@@ -595,41 +594,41 @@ Notes:
|
|
|
595
594
|
To remove all items, send a remove op for each existing item ID.
|
|
596
595
|
|
|
597
596
|
Examples:
|
|
598
|
-
epismo pack update
|
|
599
|
-
epismo pack update
|
|
600
|
-
epismo pack update
|
|
601
|
-
epismo pack update
|
|
602
|
-
epismo pack update
|
|
603
|
-
epismo pack update
|
|
597
|
+
epismo pack update <id> --category ""
|
|
598
|
+
epismo pack update @myproject --visibility public
|
|
599
|
+
epismo pack update <id> --visibility public --category productivity
|
|
600
|
+
epismo pack update <id> --blocks '[{"op":"add","title":"New Block","content":"..."}]'
|
|
601
|
+
epismo pack update <id> --blocks '[{"op":"update","id":"b001","content":"updated..."}]'
|
|
602
|
+
epismo pack update <id> --blocks '[{"op":"remove","id":"b002"}]'
|
|
603
|
+
epismo pack update <id> --input @changes.json`);
|
|
604
604
|
pack.command("get")
|
|
605
605
|
.description("fetch one agent pack")
|
|
606
|
+
.argument("<reference>", "pack reference: id, alias, share URL, or hub URL")
|
|
606
607
|
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
607
|
-
.option("--id <id>", "pack id")
|
|
608
|
-
.addOption(new Option("--alias <alias>", "pack alias (`@alias` or `@handle/alias`)").conflicts("id"))
|
|
609
608
|
.option("--full", "include nested item content")
|
|
610
609
|
.option("--block-id <blockId>", "context block id to extract; comma-separated or repeatable (type=context only)", collectOption)
|
|
611
610
|
.option("--step-id <stepId>", "workflow step id to extract; comma-separated or repeatable (type=workflow only)", collectOption)
|
|
612
|
-
.action(async (options) => {
|
|
611
|
+
.action(async (reference, options) => {
|
|
613
612
|
const payload = await resolveInput(options, {
|
|
614
|
-
id: options.id,
|
|
615
|
-
alias: options.alias,
|
|
616
613
|
full: options.full ? true : undefined
|
|
617
614
|
});
|
|
618
615
|
const context = await resolveContext();
|
|
619
|
-
printJson(await getPack(context, payload, {
|
|
616
|
+
printJson(await getPack(context, reference, payload, {
|
|
620
617
|
blockIds: options.blockId,
|
|
621
618
|
stepIds: options.stepId
|
|
622
619
|
}));
|
|
623
620
|
});
|
|
624
621
|
pack.commands.at(-1)?.addHelpText("after", `
|
|
625
622
|
Examples:
|
|
626
|
-
epismo pack get
|
|
627
|
-
epismo pack get
|
|
628
|
-
epismo pack get
|
|
629
|
-
epismo pack get
|
|
630
|
-
epismo pack get
|
|
631
|
-
epismo pack get
|
|
632
|
-
epismo pack get
|
|
623
|
+
epismo pack get <id>
|
|
624
|
+
epismo pack get @myproject
|
|
625
|
+
epismo pack get @handle/myproject
|
|
626
|
+
epismo pack get https://epismo.ai/share/<token>
|
|
627
|
+
epismo pack get https://epismo.ai/hub/workflows/<id>
|
|
628
|
+
epismo pack get <id> --full
|
|
629
|
+
epismo pack get <id> --block-id b001
|
|
630
|
+
epismo pack get <id> --block-id b001 --block-id b002
|
|
631
|
+
epismo pack get <id> --step-id s001,s002`);
|
|
633
632
|
pack.command("search")
|
|
634
633
|
.description("search agent packs")
|
|
635
634
|
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
@@ -653,17 +652,17 @@ Examples:
|
|
|
653
652
|
pack.commands.at(-1)?.addHelpText("after", `
|
|
654
653
|
Examples:
|
|
655
654
|
epismo pack search --type workflow --query "onboarding"
|
|
655
|
+
epismo pack search --query "meeting notes"
|
|
656
656
|
epismo pack search --type workflow --filter '{"visibility":["public"]}'
|
|
657
657
|
epismo pack search --type context --query "meeting notes"`);
|
|
658
658
|
pack.command("like")
|
|
659
659
|
.description("like or unlike an agent pack")
|
|
660
|
+
.argument("<reference>", "pack reference: id, alias, share URL, or hub URL")
|
|
660
661
|
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
661
|
-
.option("--id <id>", "pack id")
|
|
662
662
|
.option("--liked", "mark as liked")
|
|
663
663
|
.option("--no-liked", "remove like")
|
|
664
|
-
.action(async (options) => {
|
|
664
|
+
.action(async (reference, options) => {
|
|
665
665
|
const payload = await resolveInput(options, {
|
|
666
|
-
id: options.id,
|
|
667
666
|
liked: options.liked
|
|
668
667
|
});
|
|
669
668
|
if (typeof payload.liked !== "boolean") {
|
|
@@ -674,26 +673,25 @@ Examples:
|
|
|
674
673
|
});
|
|
675
674
|
}
|
|
676
675
|
const context = await resolveContext();
|
|
677
|
-
printJson(await likePack(context, payload));
|
|
676
|
+
printJson(await likePack(context, reference, payload));
|
|
678
677
|
});
|
|
679
678
|
pack.commands.at(-1)?.addHelpText("after", `
|
|
680
679
|
Examples:
|
|
681
|
-
epismo pack like
|
|
682
|
-
epismo pack like
|
|
680
|
+
epismo pack like <id> --liked
|
|
681
|
+
epismo pack like @myproject --liked
|
|
682
|
+
epismo pack like <id> --no-liked`);
|
|
683
683
|
pack.command("delete")
|
|
684
684
|
.description("delete one agent pack and any of your aliases that point to it")
|
|
685
|
-
.
|
|
686
|
-
.
|
|
687
|
-
.action(async (options) => {
|
|
688
|
-
const payload = await resolveInput(options, {
|
|
689
|
-
id: options.id
|
|
690
|
-
});
|
|
685
|
+
.argument("<reference>", "pack reference: id, alias, share URL, or hub URL")
|
|
686
|
+
.action(async (reference) => {
|
|
691
687
|
const context = await resolveContext();
|
|
692
|
-
printJson(await deletePack(context,
|
|
688
|
+
printJson(await deletePack(context, reference));
|
|
693
689
|
});
|
|
694
690
|
pack.commands.at(-1)?.addHelpText("after", `
|
|
695
691
|
Examples:
|
|
696
|
-
epismo pack delete
|
|
692
|
+
epismo pack delete <id> # also removes your aliases for that pack
|
|
693
|
+
epismo pack delete @myproject
|
|
694
|
+
epismo pack delete https://epismo.ai/share/<token>`);
|
|
697
695
|
const agent = program.command("agent").description("manage agent availability");
|
|
698
696
|
agent
|
|
699
697
|
.command("list")
|
|
@@ -767,39 +765,35 @@ Example:
|
|
|
767
765
|
alias
|
|
768
766
|
.command("upsert")
|
|
769
767
|
.description("create or update one alias")
|
|
768
|
+
.argument("<alias>", "alias name (`alias` or `@alias`; stored without `@`)")
|
|
770
769
|
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
771
770
|
.addOption(new Option("--type <type>", "workflow | context").choices(PACK_TYPES))
|
|
772
771
|
.option("--id <id>", "target pack id")
|
|
773
|
-
.
|
|
774
|
-
.action(async (options) => {
|
|
772
|
+
.action(async (aliasName, options) => {
|
|
775
773
|
const payload = await resolveInput(options, {
|
|
776
774
|
type: options.type,
|
|
777
775
|
id: options.id,
|
|
778
|
-
alias:
|
|
776
|
+
alias: aliasName
|
|
779
777
|
});
|
|
780
778
|
const context = await resolveContext();
|
|
781
779
|
printJson(await upsertAlias(context, payload));
|
|
782
780
|
});
|
|
783
781
|
alias.commands.at(-1)?.addHelpText("after", `
|
|
784
782
|
Examples:
|
|
785
|
-
epismo alias upsert --type workflow --id <id>
|
|
786
|
-
epismo alias upsert --type context --id <id
|
|
783
|
+
epismo alias upsert @myproject --type workflow --id <id>
|
|
784
|
+
epismo alias upsert @mycontext --type context --id <id>`);
|
|
787
785
|
alias
|
|
788
786
|
.command("get")
|
|
789
787
|
.description("resolve one alias")
|
|
790
|
-
.
|
|
791
|
-
.
|
|
792
|
-
.action(async (options) => {
|
|
793
|
-
const payload = await resolveInput(options, {
|
|
794
|
-
alias: options.alias
|
|
795
|
-
});
|
|
788
|
+
.argument("<alias>", "alias reference (`@alias` or `@handle/alias`)")
|
|
789
|
+
.action(async (aliasRef) => {
|
|
796
790
|
const context = await resolveContext();
|
|
797
|
-
printJson(await getAlias(context,
|
|
791
|
+
printJson(await getAlias(context, { alias: aliasRef }));
|
|
798
792
|
});
|
|
799
793
|
alias.commands.at(-1)?.addHelpText("after", `
|
|
800
794
|
Examples:
|
|
801
|
-
epismo alias get
|
|
802
|
-
epismo alias get
|
|
795
|
+
epismo alias get @myproject
|
|
796
|
+
epismo alias get @handle/myproject`);
|
|
803
797
|
alias
|
|
804
798
|
.command("list")
|
|
805
799
|
.description("list your aliases")
|
|
@@ -815,18 +809,14 @@ Example:
|
|
|
815
809
|
alias
|
|
816
810
|
.command("delete")
|
|
817
811
|
.description("delete one alias")
|
|
818
|
-
.
|
|
819
|
-
.
|
|
820
|
-
.action(async (options) => {
|
|
821
|
-
const payload = await resolveInput(options, {
|
|
822
|
-
alias: options.alias
|
|
823
|
-
});
|
|
812
|
+
.argument("<alias>", "alias name (`alias` or `@alias`; stored without `@`)")
|
|
813
|
+
.action(async (aliasName) => {
|
|
824
814
|
const context = await resolveContext();
|
|
825
|
-
printJson(await deleteAlias(context,
|
|
815
|
+
printJson(await deleteAlias(context, { alias: aliasName }));
|
|
826
816
|
});
|
|
827
817
|
alias.commands.at(-1)?.addHelpText("after", `
|
|
828
818
|
Example:
|
|
829
|
-
epismo alias delete
|
|
819
|
+
epismo alias delete @myproject`);
|
|
830
820
|
const token = program.command("token").description("manage CLI tokens for CI/CD");
|
|
831
821
|
token
|
|
832
822
|
.command("create")
|