@oxagen/cli 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +2 -2
  2. package/dist/commands/agent.mcp.consent.list.d.ts +3 -0
  3. package/dist/commands/agent.mcp.consent.list.d.ts.map +1 -0
  4. package/dist/commands/agent.mcp.consent.list.js +30 -0
  5. package/dist/commands/agent.mcp.consent.list.js.map +1 -0
  6. package/dist/commands/agent.mcp.consent.resolve.d.ts +3 -0
  7. package/dist/commands/agent.mcp.consent.resolve.d.ts.map +1 -0
  8. package/dist/commands/agent.mcp.consent.resolve.js +34 -0
  9. package/dist/commands/agent.mcp.consent.resolve.js.map +1 -0
  10. package/dist/commands/agent.mcp.delete.d.ts +3 -0
  11. package/dist/commands/agent.mcp.delete.d.ts.map +1 -0
  12. package/dist/commands/agent.mcp.delete.js +27 -0
  13. package/dist/commands/agent.mcp.delete.js.map +1 -0
  14. package/dist/commands/agent.mcp.set_enabled.d.ts +3 -0
  15. package/dist/commands/agent.mcp.set_enabled.d.ts.map +1 -0
  16. package/dist/commands/agent.mcp.set_enabled.js +33 -0
  17. package/dist/commands/agent.mcp.set_enabled.js.map +1 -0
  18. package/dist/commands/audit.log.query.d.ts +3 -0
  19. package/dist/commands/audit.log.query.d.ts.map +1 -0
  20. package/dist/commands/audit.log.query.js +42 -0
  21. package/dist/commands/audit.log.query.js.map +1 -0
  22. package/dist/commands/automation.create.d.ts.map +1 -1
  23. package/dist/commands/automation.create.js +43 -4
  24. package/dist/commands/automation.create.js.map +1 -1
  25. package/dist/commands/automation.disable.d.ts +3 -0
  26. package/dist/commands/automation.disable.d.ts.map +1 -0
  27. package/dist/commands/automation.disable.js +24 -0
  28. package/dist/commands/automation.disable.js.map +1 -0
  29. package/dist/commands/automation.enable.d.ts +3 -0
  30. package/dist/commands/automation.enable.d.ts.map +1 -0
  31. package/dist/commands/automation.enable.js +24 -0
  32. package/dist/commands/automation.enable.js.map +1 -0
  33. package/dist/commands/automation.update.d.ts +3 -0
  34. package/dist/commands/automation.update.d.ts.map +1 -0
  35. package/dist/commands/automation.update.js +42 -0
  36. package/dist/commands/automation.update.js.map +1 -0
  37. package/dist/commands/conversation.files.list.d.ts +3 -0
  38. package/dist/commands/conversation.files.list.d.ts.map +1 -0
  39. package/dist/commands/conversation.files.list.js +39 -0
  40. package/dist/commands/conversation.files.list.js.map +1 -0
  41. package/dist/commands/markdown.generate.d.ts +3 -0
  42. package/dist/commands/markdown.generate.d.ts.map +1 -0
  43. package/dist/commands/markdown.generate.js +37 -0
  44. package/dist/commands/markdown.generate.js.map +1 -0
  45. package/dist/commands/mermaid.generate.d.ts +3 -0
  46. package/dist/commands/mermaid.generate.d.ts.map +1 -0
  47. package/dist/commands/mermaid.generate.js +33 -0
  48. package/dist/commands/mermaid.generate.js.map +1 -0
  49. package/dist/commands/ontology.neighbors.d.ts +3 -0
  50. package/dist/commands/ontology.neighbors.d.ts.map +1 -0
  51. package/dist/commands/ontology.neighbors.js +34 -0
  52. package/dist/commands/ontology.neighbors.js.map +1 -0
  53. package/dist/commands/ontology.query.d.ts +3 -0
  54. package/dist/commands/ontology.query.d.ts.map +1 -0
  55. package/dist/commands/ontology.query.js +36 -0
  56. package/dist/commands/ontology.query.js.map +1 -0
  57. package/dist/commands/privacy.erase.d.ts.map +1 -1
  58. package/dist/commands/privacy.erase.js +2 -1
  59. package/dist/commands/privacy.erase.js.map +1 -1
  60. package/dist/commands/privacy.erase.test.d.ts +2 -0
  61. package/dist/commands/privacy.erase.test.d.ts.map +1 -0
  62. package/dist/commands/privacy.erase.test.js +125 -0
  63. package/dist/commands/privacy.erase.test.js.map +1 -0
  64. package/dist/commands/skill.edit.d.ts +3 -0
  65. package/dist/commands/skill.edit.d.ts.map +1 -0
  66. package/dist/commands/skill.edit.js +28 -0
  67. package/dist/commands/skill.edit.js.map +1 -0
  68. package/dist/commands/skill.export.d.ts +3 -0
  69. package/dist/commands/skill.export.d.ts.map +1 -0
  70. package/dist/commands/skill.export.js +25 -0
  71. package/dist/commands/skill.export.js.map +1 -0
  72. package/dist/commands/skill.metrics.read.d.ts +3 -0
  73. package/dist/commands/skill.metrics.read.d.ts.map +1 -0
  74. package/dist/commands/skill.metrics.read.js +56 -0
  75. package/dist/commands/skill.metrics.read.js.map +1 -0
  76. package/dist/commands/skill.version.activate.d.ts +3 -0
  77. package/dist/commands/skill.version.activate.d.ts.map +1 -0
  78. package/dist/commands/skill.version.activate.js +24 -0
  79. package/dist/commands/skill.version.activate.js.map +1 -0
  80. package/dist/commands/skill.version.get.d.ts +3 -0
  81. package/dist/commands/skill.version.get.d.ts.map +1 -0
  82. package/dist/commands/skill.version.get.js +43 -0
  83. package/dist/commands/skill.version.get.js.map +1 -0
  84. package/dist/commands/skill.version.list.d.ts +3 -0
  85. package/dist/commands/skill.version.list.d.ts.map +1 -0
  86. package/dist/commands/skill.version.list.js +38 -0
  87. package/dist/commands/skill.version.list.js.map +1 -0
  88. package/dist/commands/skill.version.upload.d.ts +3 -0
  89. package/dist/commands/skill.version.upload.d.ts.map +1 -0
  90. package/dist/commands/skill.version.upload.js +28 -0
  91. package/dist/commands/skill.version.upload.js.map +1 -0
  92. package/dist/commands/skill.workspace.install.d.ts +3 -0
  93. package/dist/commands/skill.workspace.install.d.ts.map +1 -0
  94. package/dist/commands/skill.workspace.install.js +52 -0
  95. package/dist/commands/skill.workspace.install.js.map +1 -0
  96. package/dist/commands.test.js +117 -73
  97. package/dist/commands.test.js.map +1 -1
  98. package/dist/components/DevStatus.d.ts.map +1 -1
  99. package/dist/components/DevStatus.js +1 -1
  100. package/dist/components/DevStatus.js.map +1 -1
  101. package/dist/index.js +53 -7
  102. package/dist/index.js.map +1 -1
  103. package/dist/lib/config.d.ts.map +1 -1
  104. package/dist/lib/config.js +9 -2
  105. package/dist/lib/config.js.map +1 -1
  106. package/dist/lib/config.test.js +21 -3
  107. package/dist/lib/config.test.js.map +1 -1
  108. package/package.json +1 -1
  109. package/README.html +0 -379
@@ -0,0 +1,33 @@
1
+ import { Command } from "commander";
2
+ import { apiRequest } from "../lib/api-client.js";
3
+ import * as fs from "fs";
4
+ export const mermaidGenerateCommand = new Command("generate")
5
+ .description("Generate a Mermaid diagram artifact")
6
+ .requiredOption("-d, --diagram <source>", "Mermaid diagram source text")
7
+ .requiredOption("-t, --title <title>", "Diagram title")
8
+ .option("--theme <theme>", "Mermaid theme: default | dark | neutral | forest (default: default)", "default")
9
+ .option("-o, --output <path>", "Write the diagram source to a file")
10
+ .action(async (options) => {
11
+ try {
12
+ const result = await apiRequest("/mermaid/generate", {
13
+ method: "POST",
14
+ body: JSON.stringify({
15
+ title: options.title,
16
+ diagram: options.diagram,
17
+ theme: options.theme,
18
+ }),
19
+ });
20
+ if (options.output) {
21
+ fs.writeFileSync(String(options.output), result.source);
22
+ console.log(`Diagram source written to ${options.output}`);
23
+ }
24
+ else {
25
+ console.log(JSON.stringify(result, null, 2));
26
+ }
27
+ }
28
+ catch (error) {
29
+ console.error("Failed to generate Mermaid diagram:", error);
30
+ process.exit(1);
31
+ }
32
+ });
33
+ //# sourceMappingURL=mermaid.generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.generate.js","sourceRoot":"","sources":["../../src/commands/mermaid.generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAWzB,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KAC1D,WAAW,CAAC,qCAAqC,CAAC;KAClD,cAAc,CAAC,wBAAwB,EAAE,6BAA6B,CAAC;KACvE,cAAc,CAAC,qBAAqB,EAAE,eAAe,CAAC;KACtD,MAAM,CACL,iBAAiB,EACjB,qEAAqE,EACrE,SAAS,CACV;KACA,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;KACnE,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAA0B,mBAAmB,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC;SACH,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const ontologyNeighborsCommand: Command;
3
+ //# sourceMappingURL=ontology.neighbors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ontology.neighbors.d.ts","sourceRoot":"","sources":["../../src/commands/ontology.neighbors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,wBAAwB,SAmCjC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { Command } from "commander";
2
+ import { apiRequest } from "../lib/api-client.js";
3
+ export const ontologyNeighborsCommand = new Command("neighbors")
4
+ .description("Return the one-hop neighborhood of a node — directly connected nodes, " +
5
+ "optionally filtered by relationship type and direction.")
6
+ .requiredOption("-n, --node <publicId>", "publicId of the node whose neighbors to fetch")
7
+ .option("-e, --edge-types <types>", "Comma-separated relationship types to include (default: all types)")
8
+ .option("-d, --direction <dir>", "Neighbor direction: out | in | both", "both")
9
+ .option("--limit <n>", "Maximum neighbors to return (1–500)", "100")
10
+ .action(async (options) => {
11
+ try {
12
+ const edgeTypes = options.edgeTypes
13
+ ? String(options.edgeTypes)
14
+ .split(",")
15
+ .map((s) => s.trim())
16
+ .filter(Boolean)
17
+ : undefined;
18
+ const result = await apiRequest("/ontology/neighbors", {
19
+ method: "POST",
20
+ body: JSON.stringify({
21
+ nodeId: options.node,
22
+ edgeTypes,
23
+ direction: options.direction,
24
+ limit: Number(options.limit),
25
+ }),
26
+ });
27
+ console.log(JSON.stringify(result, null, 2));
28
+ }
29
+ catch (error) {
30
+ console.error("Failed to fetch node neighbors:", error);
31
+ process.exit(1);
32
+ }
33
+ });
34
+ //# sourceMappingURL=ontology.neighbors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ontology.neighbors.js","sourceRoot":"","sources":["../../src/commands/ontology.neighbors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KAC7D,WAAW,CACV,wEAAwE;IACtE,yDAAyD,CAC5D;KACA,cAAc,CAAC,uBAAuB,EAAE,+CAA+C,CAAC;KACxF,MAAM,CACL,0BAA0B,EAC1B,oEAAoE,CACrE;KACA,MAAM,CAAC,uBAAuB,EAAE,qCAAqC,EAAE,MAAM,CAAC;KAC9E,MAAM,CAAC,aAAa,EAAE,qCAAqC,EAAE,KAAK,CAAC;KACnE,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;YACjC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;iBACtB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,qBAAqB,EAAE;YACrD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,OAAO,CAAC,IAAI;gBACpB,SAAS;gBACT,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;aAC7B,CAAC;SACH,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const ontologyQueryCommand: Command;
3
+ //# sourceMappingURL=ontology.query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ontology.query.d.ts","sourceRoot":"","sources":["../../src/commands/ontology.query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,oBAAoB,SAqC7B,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { Command } from "commander";
2
+ import { apiRequest } from "../lib/api-client.js";
3
+ export const ontologyQueryCommand = new Command("query")
4
+ .description("Typed multi-hop traversal from a start node over named relationship type(s). " +
5
+ "Returns the reachable subgraph (nodes + edges) without writing Cypher.")
6
+ .requiredOption("-n, --node <publicId>", "publicId of the start node")
7
+ .option("-e, --edge-types <types>", "Comma-separated relationship types to follow (default: all types)")
8
+ .option("-d, --direction <dir>", "Traversal direction: out | in | both", "out")
9
+ .option("--max-depth <n>", "Maximum hop distance (1–5)", "2")
10
+ .option("--limit <n>", "Maximum nodes to return (1–500)", "100")
11
+ .action(async (options) => {
12
+ try {
13
+ const edgeTypes = options.edgeTypes
14
+ ? String(options.edgeTypes)
15
+ .split(",")
16
+ .map((s) => s.trim())
17
+ .filter(Boolean)
18
+ : undefined;
19
+ const result = await apiRequest("/ontology/query", {
20
+ method: "POST",
21
+ body: JSON.stringify({
22
+ startNodeId: options.node,
23
+ edgeTypes,
24
+ direction: options.direction,
25
+ maxDepth: Number(options.maxDepth),
26
+ limit: Number(options.limit),
27
+ }),
28
+ });
29
+ console.log(JSON.stringify(result, null, 2));
30
+ }
31
+ catch (error) {
32
+ console.error("Failed to run ontology query:", error);
33
+ process.exit(1);
34
+ }
35
+ });
36
+ //# sourceMappingURL=ontology.query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ontology.query.js","sourceRoot":"","sources":["../../src/commands/ontology.query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KACrD,WAAW,CACV,+EAA+E;IAC7E,wEAAwE,CAC3E;KACA,cAAc,CAAC,uBAAuB,EAAE,4BAA4B,CAAC;KACrE,MAAM,CACL,0BAA0B,EAC1B,mEAAmE,CACpE;KACA,MAAM,CAAC,uBAAuB,EAAE,sCAAsC,EAAE,KAAK,CAAC;KAC9E,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,EAAE,GAAG,CAAC;KAC5D,MAAM,CAAC,aAAa,EAAE,iCAAiC,EAAE,KAAK,CAAC;KAC/D,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;YACjC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;iBACtB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,WAAW,EAAE,OAAO,CAAC,IAAI;gBACzB,SAAS;gBACT,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAClC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;aAC7B,CAAC;SACH,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"privacy.erase.d.ts","sourceRoot":"","sources":["../../src/commands/privacy.erase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,mBAAmB,SAiD5B,CAAC"}
1
+ {"version":3,"file":"privacy.erase.d.ts","sourceRoot":"","sources":["../../src/commands/privacy.erase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,mBAAmB,SAmD5B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import * as readline from "node:readline";
3
- import { apiRequest, ApiError } from "../lib/api-client.js";
3
+ import { apiRequest, requireAuth, ApiError } from "../lib/api-client.js";
4
4
  async function promptConfirm(message) {
5
5
  const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
6
6
  return new Promise((resolve) => {
@@ -16,6 +16,7 @@ export const privacyEraseCommand = new Command("erase")
16
16
  .option("--org-id <id>", "Organization ID (required when --scope=org)")
17
17
  .option("-y, --yes", "Skip interactive confirmation (CI use only)")
18
18
  .action(async (options) => {
19
+ requireAuth();
19
20
  if (options.scope !== "user" && options.scope !== "org") {
20
21
  console.error("Error: --scope must be 'user' or 'org'");
21
22
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"privacy.erase.js","sourceRoot":"","sources":["../../src/commands/privacy.erase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"privacy.erase.js","sourceRoot":"","sources":["../../src/commands/privacy.erase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=privacy.erase.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy.erase.test.d.ts","sourceRoot":"","sources":["../../src/commands/privacy.erase.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,125 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ // Mock api-client before importing the command so the module factory is hoisted
3
+ vi.mock("../lib/api-client.js", () => ({
4
+ requireAuth: vi.fn(),
5
+ apiRequest: vi.fn(),
6
+ ApiError: class ApiError extends Error {
7
+ status;
8
+ constructor(status, message) {
9
+ super(message);
10
+ this.name = "ApiError";
11
+ this.status = status;
12
+ }
13
+ },
14
+ }));
15
+ // readline is used for the interactive CONFIRM prompt — mock it so tests don't block on stdin
16
+ vi.mock("node:readline", () => ({
17
+ createInterface: vi.fn(() => ({
18
+ question: vi.fn((_msg, cb) => cb("CONFIRM")),
19
+ close: vi.fn(),
20
+ })),
21
+ }));
22
+ import * as apiClientModule from "../lib/api-client.js";
23
+ import { privacyEraseCommand } from "./privacy.erase.js";
24
+ const mockRequireAuth = vi.mocked(apiClientModule.requireAuth);
25
+ const mockApiRequest = vi.mocked(apiClientModule.apiRequest);
26
+ // Retrieve ApiError from the mock module so instanceof checks work against the same class
27
+ const { ApiError } = apiClientModule;
28
+ beforeEach(() => {
29
+ vi.clearAllMocks();
30
+ });
31
+ /**
32
+ * Invoke the command action directly by parsing the given argv.
33
+ * We call parseAsync so the async action handler runs to completion.
34
+ */
35
+ async function runCommand(argv) {
36
+ await privacyEraseCommand.parseAsync(argv, { from: "user" });
37
+ }
38
+ describe("privacy erase command — requireAuth gate", () => {
39
+ it("calls requireAuth() before any other logic", async () => {
40
+ // requireAuth throws (simulating process.exit) so we can assert it ran
41
+ mockRequireAuth.mockImplementation(() => {
42
+ throw new Error("not authenticated");
43
+ });
44
+ await expect(runCommand(["--yes"])).rejects.toThrow("not authenticated");
45
+ // requireAuth must have been called
46
+ expect(mockRequireAuth).toHaveBeenCalledTimes(1);
47
+ // apiRequest must NOT have been called — auth check came first
48
+ expect(mockApiRequest).not.toHaveBeenCalled();
49
+ });
50
+ it("calls requireAuth() before showing the interactive confirmation prompt", async () => {
51
+ // Simulate unauthenticated: requireAuth exits before the prompt
52
+ let requireAuthCalled = false;
53
+ mockRequireAuth.mockImplementation(() => {
54
+ requireAuthCalled = true;
55
+ throw new Error("exit:1");
56
+ });
57
+ await expect(runCommand([])).rejects.toThrow("exit:1");
58
+ expect(requireAuthCalled).toBe(true);
59
+ // apiRequest should not be reached
60
+ expect(mockApiRequest).not.toHaveBeenCalled();
61
+ });
62
+ });
63
+ describe("privacy erase command — authenticated flow", () => {
64
+ beforeEach(() => {
65
+ // Pass-through: auth is satisfied
66
+ mockRequireAuth.mockReturnValue(undefined);
67
+ });
68
+ it("exits non-zero for invalid --scope value", async () => {
69
+ const exitSpy = vi.spyOn(process, "exit").mockImplementation((code) => {
70
+ throw new Error(`exit:${code ?? 0}`);
71
+ });
72
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
73
+ await expect(runCommand(["--scope", "invalid", "--yes"])).rejects.toThrow("exit:1");
74
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("--scope must be"));
75
+ exitSpy.mockRestore();
76
+ consoleSpy.mockRestore();
77
+ });
78
+ it("exits non-zero when --scope=org and --org-id is missing", async () => {
79
+ const exitSpy = vi.spyOn(process, "exit").mockImplementation((code) => {
80
+ throw new Error(`exit:${code ?? 0}`);
81
+ });
82
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
83
+ await expect(runCommand(["--scope", "org", "--yes"])).rejects.toThrow("exit:1");
84
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("--org-id is required"));
85
+ exitSpy.mockRestore();
86
+ consoleSpy.mockRestore();
87
+ });
88
+ it("sends POST to /privacy/erase with --yes flag (skips confirmation)", async () => {
89
+ mockApiRequest.mockResolvedValueOnce({
90
+ requestId: "req-123",
91
+ status: "scheduled",
92
+ effectiveAt: "2026-06-21T00:00:00Z",
93
+ });
94
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
95
+ await runCommand(["--yes"]);
96
+ expect(mockApiRequest).toHaveBeenCalledWith("/privacy/erase", expect.objectContaining({ method: "POST" }));
97
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("req-123"));
98
+ logSpy.mockRestore();
99
+ });
100
+ it("sends POST with orgId when --scope=org", async () => {
101
+ mockApiRequest.mockResolvedValueOnce({
102
+ requestId: "req-456",
103
+ status: "scheduled",
104
+ effectiveAt: "2026-06-21T00:00:00Z",
105
+ });
106
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
107
+ await runCommand(["--scope", "org", "--org-id", "org-abc", "--yes"]);
108
+ expect(mockApiRequest).toHaveBeenCalledWith("/privacy/erase", expect.objectContaining({
109
+ body: expect.stringContaining("org-abc"),
110
+ }));
111
+ logSpy.mockRestore();
112
+ });
113
+ it("prints error and exits non-zero on ApiError", async () => {
114
+ mockApiRequest.mockRejectedValueOnce(new ApiError(401, "Unauthorized"));
115
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
116
+ const exitSpy = vi.spyOn(process, "exit").mockImplementation((code) => {
117
+ throw new Error(`exit:${code ?? 0}`);
118
+ });
119
+ await expect(runCommand(["--yes"])).rejects.toThrow("exit:1");
120
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Unauthorized"));
121
+ consoleSpy.mockRestore();
122
+ exitSpy.mockRestore();
123
+ });
124
+ });
125
+ //# sourceMappingURL=privacy.erase.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy.erase.test.js","sourceRoot":"","sources":["../../src/commands/privacy.erase.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,gFAAgF;AAChF,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,QAAQ,EAAE,MAAM,QAAS,SAAQ,KAAK;QACpC,MAAM,CAAS;QACf,YAAY,MAAc,EAAE,OAAe;YACzC,KAAK,CAAC,OAAO,CAAC,CAAC;YACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;KACF;CACF,CAAC,CAAC,CAAC;AAEJ,8FAA8F;AAC9F,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5B,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAA4B,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9E,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,eAAe,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;AAC/D,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AAC7D,0FAA0F;AAC1F,MAAM,EAAE,QAAQ,EAAE,GAAG,eAEpB,CAAC;AAEF,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,aAAa,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH;;;GAGG;AACH,KAAK,UAAU,UAAU,CAAC,IAAc;IACtC,MAAM,mBAAmB,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,uEAAuE;QACvE,eAAe,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAEzE,oCAAoC;QACpC,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjD,+DAA+D;QAC/D,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,gEAAgE;QAChE,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,eAAe,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACtC,iBAAiB,GAAG,IAAI,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEvD,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,mCAAmC;QACnC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,UAAU,CAAC,GAAG,EAAE;QACd,kCAAkC;QAClC,eAAe,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;YACpE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE3E,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpF,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEpF,OAAO,CAAC,WAAW,EAAE,CAAC;QACtB,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;YACpE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE3E,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChF,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEzF,OAAO,CAAC,WAAW,EAAE,CAAC;QACtB,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,cAAc,CAAC,qBAAqB,CAAC;YACnC,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,WAAW;YACnB,WAAW,EAAE,sBAAsB;SACpC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAErE,MAAM,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAE5B,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACzC,gBAAgB,EAChB,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAC5C,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QAExE,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,cAAc,CAAC,qBAAqB,CAAC;YACnC,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,WAAW;YACnB,WAAW,EAAE,sBAAsB;SACpC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAErE,MAAM,UAAU,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAErE,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACzC,gBAAgB,EAChB,MAAM,CAAC,gBAAgB,CAAC;YACtB,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC;SACzC,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,cAAc,CAAC,qBAAqB,CAAC,IAAI,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;YACpE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;QAEjF,UAAU,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const skillEditCommand: Command;
3
+ //# sourceMappingURL=skill.edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.edit.d.ts","sourceRoot":"","sources":["../../src/commands/skill.edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,gBAAgB,SA0BzB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Command } from "commander";
2
+ import { readFile } from "node:fs/promises";
3
+ import { apiRequest, ApiError } from "../lib/api-client.js";
4
+ export const skillEditCommand = new Command("edit")
5
+ .description("Save an edited skill body as a new immutable version")
6
+ .requiredOption("-s, --skill <id>", "Skill public ID (e.g. skl_…)")
7
+ .requiredOption("-f, --file <path>", "Path to the updated .skill.md file")
8
+ .option("--no-activate", "Save without setting as the active version (default: activate)")
9
+ .action(async (options) => {
10
+ try {
11
+ const body = await readFile(options.file, "utf8");
12
+ const data = await apiRequest("/skill/edit", {
13
+ method: "POST",
14
+ body: JSON.stringify({
15
+ skill_id: options.skill,
16
+ body,
17
+ activate: options.activate,
18
+ }),
19
+ });
20
+ console.log(`Saved edit to skill ${data.skill_id} → version ${data.version_number} (${data.version_id})${data.activated ? " [active]" : ""}`);
21
+ }
22
+ catch (err) {
23
+ const msg = err instanceof ApiError ? err.message : String(err);
24
+ console.error(`Error: ${msg}`);
25
+ process.exit(1);
26
+ }
27
+ });
28
+ //# sourceMappingURL=skill.edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.edit.js","sourceRoot":"","sources":["../../src/commands/skill.edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAS5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAChD,WAAW,CAAC,sDAAsD,CAAC;KACnE,cAAc,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;KAClE,cAAc,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;KACzE,MAAM,CAAC,eAAe,EAAE,gEAAgE,CAAC;KACzF,MAAM,CAAC,KAAK,EAAE,OAA2D,EAAE,EAAE;IAC5E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAElD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAoB,aAAa,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,OAAO,CAAC,KAAK;gBACvB,IAAI;gBACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC;SACH,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CACT,uBAAuB,IAAI,CAAC,QAAQ,cAAc,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CACjI,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const skillExportCommand: Command;
3
+ //# sourceMappingURL=skill.export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.export.d.ts","sourceRoot":"","sources":["../../src/commands/skill.export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,kBAAkB,SA2B5B,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { Command } from "commander";
2
+ import { writeFile } from "node:fs/promises";
3
+ import { apiRequest, ApiError } from "../lib/api-client.js";
4
+ export const skillExportCommand = new Command("export")
5
+ .description("Export a skill as a .skill.md file")
6
+ .requiredOption("-s, --skill <id>", "Skill public ID (skl_…)")
7
+ .option("-v, --version <number>", "Version number to export (defaults to active version)")
8
+ .option("-o, --output <path>", "Output file path (defaults to <slug>.skill.md in current directory)")
9
+ .action(async (options) => {
10
+ try {
11
+ const params = new URLSearchParams({ skillId: options.skill });
12
+ if (options.version)
13
+ params.set("versionNumber", options.version);
14
+ const data = await apiRequest(`/skill/export?${params.toString()}`);
15
+ const outputPath = options.output ?? data.filename;
16
+ await writeFile(outputPath, data.content, "utf8");
17
+ console.log(`Exported skill version ${data.versionNumber} → ${outputPath}`);
18
+ }
19
+ catch (err) {
20
+ const msg = err instanceof ApiError ? err.message : String(err);
21
+ console.error(`Error: ${msg}`);
22
+ process.exit(1);
23
+ }
24
+ });
25
+ //# sourceMappingURL=skill.export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.export.js","sourceRoot":"","sources":["../../src/commands/skill.export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQ5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KACpD,WAAW,CAAC,oCAAoC,CAAC;KACjD,cAAc,CAAC,kBAAkB,EAAE,yBAAyB,CAAC;KAC7D,MAAM,CAAC,wBAAwB,EAAE,uDAAuD,CAAC;KACzF,MAAM,CAAC,qBAAqB,EAAE,qEAAqE,CAAC;KACpG,MAAM,CACL,KAAK,EAAE,OAA6D,EAAE,EAAE;IACtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAElE,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,iBAAiB,MAAM,CAAC,QAAQ,EAAE,EAAE,CACrC,CAAC;QAEF,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC;QACnD,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAElD,OAAO,CAAC,GAAG,CACT,0BAA0B,IAAI,CAAC,aAAa,MAAM,UAAU,EAAE,CAC/D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const skillMetricsReadCommand: Command;
3
+ //# sourceMappingURL=skill.metrics.read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.metrics.read.d.ts","sourceRoot":"","sources":["../../src/commands/skill.metrics.read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,eAAO,MAAM,uBAAuB,SAuDhC,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { Command } from "commander";
2
+ import { apiRequest, ApiError } from "../lib/api-client.js";
3
+ import { getWorkspaceId } from "../lib/config.js";
4
+ export const skillMetricsReadCommand = new Command("metrics")
5
+ .description("Read aggregated usage and cost metrics for workspace skills")
6
+ .option("-s, --skill <id>", "Public ID of a specific skill (e.g. skl_…); omit for workspace-wide")
7
+ .option("-w, --workspace <id>", "Workspace ID (defaults to current workspace)")
8
+ .option("--json", "Output raw JSON")
9
+ .action(async (options) => {
10
+ try {
11
+ const params = new URLSearchParams();
12
+ const workspaceId = options.workspace ?? getWorkspaceId();
13
+ if (workspaceId)
14
+ params.set("workspace_id", workspaceId);
15
+ if (options.skill)
16
+ params.set("skill_id", options.skill);
17
+ const query = params.toString() ? `?${params.toString()}` : "";
18
+ const data = await apiRequest(`/skill/metrics/read${query}`);
19
+ if (options.json) {
20
+ console.log(JSON.stringify(data, null, 2));
21
+ return;
22
+ }
23
+ if (data.skills.length === 0) {
24
+ console.log("No skills found.");
25
+ return;
26
+ }
27
+ console.log(`Skill metrics (${data.skills.length}):`);
28
+ for (const s of data.skills) {
29
+ const activeLabel = s.activeVersion !== null ? `v${s.activeVersion}` : "no active version";
30
+ const lastUsed = s.lastUsedAt
31
+ ? new Date(s.lastUsedAt).toLocaleString()
32
+ : "never";
33
+ const cost = s.approxTokenCost !== null ? `~$${(s.approxTokenCost / 100).toFixed(4)}` : "n/a";
34
+ console.log(`\n ${s.slug} (${s.skillId})`);
35
+ console.log(` Active version : ${activeLabel}`);
36
+ console.log(` Usage count : ${s.usageCount}`);
37
+ console.log(` Last used : ${lastUsed}`);
38
+ console.log(` Approx cost : ${cost}`);
39
+ if (s.perVersionLoads.length > 0) {
40
+ console.log(" Per-version loads:");
41
+ for (const v of s.perVersionLoads) {
42
+ const vLastUsed = v.lastUsed
43
+ ? new Date(v.lastUsed).toLocaleString()
44
+ : "never";
45
+ console.log(` v${v.version}: ${v.loads} load(s), last used ${vLastUsed}`);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ catch (err) {
51
+ const msg = err instanceof ApiError ? err.message : String(err);
52
+ console.error(`Error: ${msg}`);
53
+ process.exit(1);
54
+ }
55
+ });
56
+ //# sourceMappingURL=skill.metrics.read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.metrics.read.js","sourceRoot":"","sources":["../../src/commands/skill.metrics.read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAsBlD,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KAC1D,WAAW,CAAC,6DAA6D,CAAC;KAC1E,MAAM,CAAC,kBAAkB,EAAE,qEAAqE,CAAC;KACjG,MAAM,CAAC,sBAAsB,EAAE,8CAA8C,CAAC;KAC9E,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACnC,MAAM,CAAC,KAAK,EAAE,OAA+D,EAAE,EAAE;IAChF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,IAAI,cAAc,EAAE,CAAC;QAC1D,IAAI,WAAW;YAAE,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/D,MAAM,IAAI,GAAG,MAAM,UAAU,CAA2B,sBAAsB,KAAK,EAAE,CAAC,CAAC;QAEvF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC;YAC3F,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU;gBAC3B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE;gBACzC,CAAC,CAAC,OAAO,CAAC;YACZ,MAAM,IAAI,GACR,CAAC,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAEnF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;YAE5C,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBACtC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;oBAClC,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ;wBAC1B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE;wBACvC,CAAC,CAAC,OAAO,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,uBAAuB,SAAS,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const skillVersionActivateCommand: Command;
3
+ //# sourceMappingURL=skill.version.activate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.version.activate.d.ts","sourceRoot":"","sources":["../../src/commands/skill.version.activate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,2BAA2B,SAmBpC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Command } from "commander";
2
+ import { apiRequest, ApiError } from "../lib/api-client.js";
3
+ export const skillVersionActivateCommand = new Command("activate")
4
+ .description("Set the active version for a skill (can activate an older version to roll back)")
5
+ .requiredOption("-s, --skill <id>", "Skill public ID (e.g. skl_...)")
6
+ .requiredOption("-v, --version <number>", "Version number to activate", parseInt)
7
+ .action(async (options) => {
8
+ try {
9
+ const data = await apiRequest("/skill/version/activate", {
10
+ method: "POST",
11
+ body: JSON.stringify({
12
+ skillId: options.skill,
13
+ versionNumber: options.version,
14
+ }),
15
+ });
16
+ console.log(`Skill ${data.skillId} activated version ${data.activeVersionNumber} at ${data.activatedAt}`);
17
+ }
18
+ catch (err) {
19
+ const msg = err instanceof ApiError ? err.message : String(err);
20
+ console.error(`Error: ${msg}`);
21
+ process.exit(1);
22
+ }
23
+ });
24
+ //# sourceMappingURL=skill.version.activate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.version.activate.js","sourceRoot":"","sources":["../../src/commands/skill.version.activate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQ5D,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KAC/D,WAAW,CAAC,iFAAiF,CAAC;KAC9F,cAAc,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;KACpE,cAAc,CAAC,wBAAwB,EAAE,4BAA4B,EAAE,QAAQ,CAAC;KAChF,MAAM,CAAC,KAAK,EAAE,OAA2C,EAAE,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAA+B,yBAAyB,EAAE;YACrF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,OAAO,CAAC,KAAK;gBACtB,aAAa,EAAE,OAAO,CAAC,OAAO;aAC/B,CAAC;SACH,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,sBAAsB,IAAI,CAAC,mBAAmB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5G,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const skillVersionGetCommand: Command;
3
+ //# sourceMappingURL=skill.version.get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.version.get.d.ts","sourceRoot":"","sources":["../../src/commands/skill.version.get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,sBAAsB,SAsC/B,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { Command } from "commander";
2
+ import { apiRequest, ApiError } from "../lib/api-client.js";
3
+ export const skillVersionGetCommand = new Command("get")
4
+ .description("Fetch a specific version of a skill including full body and frontmatter")
5
+ .requiredOption("-s, --skill <id>", "Skill public ID (e.g. skl_...)")
6
+ .requiredOption("-v, --version-id <id>", "Version public ID (e.g. slv_...)")
7
+ .option("--body", "Print the raw skill body instead of metadata summary")
8
+ .action(async (options) => {
9
+ try {
10
+ const params = new URLSearchParams({
11
+ skill_id: options.skill,
12
+ version_id: options.versionId,
13
+ });
14
+ const data = await apiRequest(`/skill/version/get?${params.toString()}`);
15
+ if (options.body) {
16
+ process.stdout.write(data.body);
17
+ return;
18
+ }
19
+ const flags = [];
20
+ if (data.isActive)
21
+ flags.push("active");
22
+ if (data.isLatest)
23
+ flags.push("latest");
24
+ console.log(`Skill: ${data.skill_id}`);
25
+ console.log(`Version: ${data.id} (v${data.versionNumber}) [${flags.join(", ") || "none"}]`);
26
+ console.log(`Created: ${data.createdAt}${data.createdBy ? ` by ${data.createdBy}` : ""}`);
27
+ if (Object.keys(data.frontmatter).length > 0) {
28
+ console.log("Frontmatter:");
29
+ for (const [k, val] of Object.entries(data.frontmatter)) {
30
+ console.log(` ${k}: ${JSON.stringify(val)}`);
31
+ }
32
+ }
33
+ if (data.referencesPayload.length > 0) {
34
+ console.log(`References: ${data.referencesPayload.length} item(s)`);
35
+ }
36
+ }
37
+ catch (err) {
38
+ const msg = err instanceof ApiError ? err.message : String(err);
39
+ console.error(`Error: ${msg}`);
40
+ process.exit(1);
41
+ }
42
+ });
43
+ //# sourceMappingURL=skill.version.get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.version.get.js","sourceRoot":"","sources":["../../src/commands/skill.version.get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAe5D,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACrD,WAAW,CAAC,yEAAyE,CAAC;KACtF,cAAc,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;KACpE,cAAc,CAAC,uBAAuB,EAAE,kCAAkC,CAAC;KAC3E,MAAM,CAAC,QAAQ,EAAE,sDAAsD,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,OAA6D,EAAE,EAAE;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,QAAQ,EAAE,OAAO,CAAC,KAAK;YACvB,UAAU,EAAE,OAAO,CAAC,SAAS;SAC9B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,sBAAsB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAC1C,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,aAAa,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3F,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,iBAAiB,CAAC,MAAM,UAAU,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const skillVersionListCommand: Command;
3
+ //# sourceMappingURL=skill.version.list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.version.list.d.ts","sourceRoot":"","sources":["../../src/commands/skill.version.list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,eAAO,MAAM,uBAAuB,SA+BhC,CAAC"}