@runcofactor/cli 0.23.0 → 0.25.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 (118) hide show
  1. package/README.md +15 -0
  2. package/dist/{account-HWN3W3DJ.js → account-LF73VDLD.js} +3 -3
  3. package/dist/{alert-2XQKWLXV.js → alert-YDCWKNLG.js} +4 -4
  4. package/dist/{api-catalog-3DNTXLUR.js → api-catalog-SUJ4DUAW.js} +3 -3
  5. package/dist/{attachment-EKI6FME3.js → attachment-ZOWURGCW.js} +3 -3
  6. package/dist/{augmentor-WVDFIJVN.js → augmentor-7JFSE344.js} +3 -3
  7. package/dist/{chunk-5XJARJVW.js → chunk-4O7KUIYE.js} +2 -2
  8. package/dist/{chunk-UAF5JTY6.js → chunk-EPMDUCEA.js} +2 -2
  9. package/dist/{chunk-C6GFGMMI.js → chunk-IC3HQSRW.js} +2 -2
  10. package/dist/{chunk-5H5LE7ZJ.js → chunk-LNX22N2L.js} +2 -2
  11. package/dist/{chunk-XFESXI7N.js → chunk-LQ5IBELB.js} +2 -2
  12. package/dist/{chunk-JWPQUDTG.js → chunk-OCT6HQZK.js} +2 -2
  13. package/dist/{chunk-JNBZKVZE.js → chunk-QX7RZ5CZ.js} +1 -1
  14. package/dist/chunk-QX7RZ5CZ.js.map +1 -0
  15. package/dist/{chunk-FZKJERAJ.js → chunk-SL5GDAWL.js} +2 -2
  16. package/dist/{chunk-AHVGWPO3.js → chunk-SZOPRIBA.js} +18 -2
  17. package/dist/chunk-SZOPRIBA.js.map +1 -0
  18. package/dist/{chunk-HXM3JXCX.js → chunk-TVM3VEAP.js} +2 -2
  19. package/dist/{chunk-2RGTNVYR.js → chunk-YI4LFJFK.js} +36 -11
  20. package/dist/{chunk-2RGTNVYR.js.map → chunk-YI4LFJFK.js.map} +1 -1
  21. package/dist/{credential-YCLLYSXW.js → credential-DAK26ZN5.js} +3 -3
  22. package/dist/{credential-template-ILUYGLUZ.js → credential-template-2S4IKKWH.js} +3 -3
  23. package/dist/{dist-FC2BFYMX.js → dist-MQMO6WA3.js} +3 -3
  24. package/dist/{docs-UGJPGZOR.js → docs-SX5RFWWF.js} +3 -3
  25. package/dist/{environment-TENLRRC3.js → environment-2OAJCTFK.js} +3 -3
  26. package/dist/{feature-flag-5EBZJD43.js → feature-flag-2HRNJ6Z6.js} +3 -3
  27. package/dist/index.js +47 -37
  28. package/dist/index.js.map +1 -1
  29. package/dist/{init-YCS4OZFP.js → init-U2Z4ZJCC.js} +3 -3
  30. package/dist/{install-AVD4R5KA.js → install-VYXTJJVC.js} +3 -3
  31. package/dist/{issues-TRD5CQ4R.js → issues-QTX3YE5G.js} +3 -3
  32. package/dist/{knobs-DKAVOTMC.js → knobs-HMONFFHZ.js} +3 -3
  33. package/dist/{list-W3ONQTUH.js → list-46W2OU5D.js} +3 -3
  34. package/dist/{local-LLQFYBF3.js → local-4Y75MUYQ.js} +5 -5
  35. package/dist/{login-X72OFYMF.js → login-GCEIQ5FN.js} +3 -3
  36. package/dist/{mcp-KGMDCJJO.js → mcp-SLYY6DQL.js} +4 -4
  37. package/dist/{metrics-IRO7NK4L.js → metrics-3S4ZEA3B.js} +3 -3
  38. package/dist/{product-FAEOC2BC.js → product-2NW74HNE.js} +3 -3
  39. package/dist/prompts-NKJEQ62J.js +186 -0
  40. package/dist/prompts-NKJEQ62J.js.map +1 -0
  41. package/dist/{property-X6NPV2VK.js → property-E675NNFW.js} +3 -3
  42. package/dist/{record-CJIEUF2Z.js → record-HELPASIE.js} +4 -4
  43. package/dist/{release-PGLSKZCM.js → release-ZZIANCH7.js} +3 -3
  44. package/dist/{sandbox-PBRWVF4Y.js → sandbox-TTFAKM63.js} +82 -7
  45. package/dist/sandbox-TTFAKM63.js.map +1 -0
  46. package/dist/{scenarios-5TJ76A5P.js → scenarios-FWFSTCTV.js} +3 -3
  47. package/dist/{schedule-FRAVS3RH.js → schedule-QIXBH2HF.js} +4 -4
  48. package/dist/{session-E4PFQPBF.js → session-4RB4TRRU.js} +5 -5
  49. package/dist/skills/debug-run/SKILL.md +1 -1
  50. package/dist/{spec-ZNOLW4JR.js → spec-7LGJ4H5W.js} +3 -3
  51. package/dist/{src-OLQ7ZFHS.js → src-F4UX4PMP.js} +140 -8
  52. package/dist/src-F4UX4PMP.js.map +1 -0
  53. package/dist/{src-GEMLVCW4.js → src-FW7TIXEQ.js} +3 -3
  54. package/dist/{start-EV7J2TEF.js → start-IEUE53KY.js} +3 -3
  55. package/dist/{tag-UXKWRACA.js → tag-J5SX224K.js} +4 -4
  56. package/dist/{task-VDLJQKUB.js → task-ONZVZQAQ.js} +3 -3
  57. package/dist/{test-suite-SOM2MTNH.js → test-suite-STGE6IAV.js} +5 -5
  58. package/dist/{trace-DZCJO27U.js → trace-O5BVV7ZU.js} +4 -4
  59. package/dist/{triage-UQAB5HGG.js → triage-VS3S7GXN.js} +4 -4
  60. package/dist/{utilities-D7EYIATI.js → utilities-ARHQATQ6.js} +3 -3
  61. package/dist/{workflow-X7QNGJJ2.js → workflow-5FJ4D62D.js} +29 -32
  62. package/dist/workflow-5FJ4D62D.js.map +1 -0
  63. package/dist/{workflow-cache-ZMYUGEPB.js → workflow-cache-PDLY7XLW.js} +6 -6
  64. package/dist/{workflow-debug-LQKP27VI.js → workflow-debug-6IJQ5C3X.js} +6 -6
  65. package/dist/{workflow-proposals-NEXXWL3O.js → workflow-proposals-MTHYBJGV.js} +3 -3
  66. package/package.json +1 -1
  67. package/dist/chunk-AHVGWPO3.js.map +0 -1
  68. package/dist/chunk-JNBZKVZE.js.map +0 -1
  69. package/dist/sandbox-PBRWVF4Y.js.map +0 -1
  70. package/dist/src-OLQ7ZFHS.js.map +0 -1
  71. package/dist/workflow-X7QNGJJ2.js.map +0 -1
  72. /package/dist/{account-HWN3W3DJ.js.map → account-LF73VDLD.js.map} +0 -0
  73. /package/dist/{alert-2XQKWLXV.js.map → alert-YDCWKNLG.js.map} +0 -0
  74. /package/dist/{api-catalog-3DNTXLUR.js.map → api-catalog-SUJ4DUAW.js.map} +0 -0
  75. /package/dist/{attachment-EKI6FME3.js.map → attachment-ZOWURGCW.js.map} +0 -0
  76. /package/dist/{augmentor-WVDFIJVN.js.map → augmentor-7JFSE344.js.map} +0 -0
  77. /package/dist/{chunk-5XJARJVW.js.map → chunk-4O7KUIYE.js.map} +0 -0
  78. /package/dist/{chunk-UAF5JTY6.js.map → chunk-EPMDUCEA.js.map} +0 -0
  79. /package/dist/{chunk-C6GFGMMI.js.map → chunk-IC3HQSRW.js.map} +0 -0
  80. /package/dist/{chunk-5H5LE7ZJ.js.map → chunk-LNX22N2L.js.map} +0 -0
  81. /package/dist/{chunk-XFESXI7N.js.map → chunk-LQ5IBELB.js.map} +0 -0
  82. /package/dist/{chunk-JWPQUDTG.js.map → chunk-OCT6HQZK.js.map} +0 -0
  83. /package/dist/{chunk-FZKJERAJ.js.map → chunk-SL5GDAWL.js.map} +0 -0
  84. /package/dist/{chunk-HXM3JXCX.js.map → chunk-TVM3VEAP.js.map} +0 -0
  85. /package/dist/{credential-YCLLYSXW.js.map → credential-DAK26ZN5.js.map} +0 -0
  86. /package/dist/{credential-template-ILUYGLUZ.js.map → credential-template-2S4IKKWH.js.map} +0 -0
  87. /package/dist/{dist-FC2BFYMX.js.map → dist-MQMO6WA3.js.map} +0 -0
  88. /package/dist/{docs-UGJPGZOR.js.map → docs-SX5RFWWF.js.map} +0 -0
  89. /package/dist/{environment-TENLRRC3.js.map → environment-2OAJCTFK.js.map} +0 -0
  90. /package/dist/{feature-flag-5EBZJD43.js.map → feature-flag-2HRNJ6Z6.js.map} +0 -0
  91. /package/dist/{init-YCS4OZFP.js.map → init-U2Z4ZJCC.js.map} +0 -0
  92. /package/dist/{install-AVD4R5KA.js.map → install-VYXTJJVC.js.map} +0 -0
  93. /package/dist/{issues-TRD5CQ4R.js.map → issues-QTX3YE5G.js.map} +0 -0
  94. /package/dist/{knobs-DKAVOTMC.js.map → knobs-HMONFFHZ.js.map} +0 -0
  95. /package/dist/{list-W3ONQTUH.js.map → list-46W2OU5D.js.map} +0 -0
  96. /package/dist/{local-LLQFYBF3.js.map → local-4Y75MUYQ.js.map} +0 -0
  97. /package/dist/{login-X72OFYMF.js.map → login-GCEIQ5FN.js.map} +0 -0
  98. /package/dist/{mcp-KGMDCJJO.js.map → mcp-SLYY6DQL.js.map} +0 -0
  99. /package/dist/{metrics-IRO7NK4L.js.map → metrics-3S4ZEA3B.js.map} +0 -0
  100. /package/dist/{product-FAEOC2BC.js.map → product-2NW74HNE.js.map} +0 -0
  101. /package/dist/{property-X6NPV2VK.js.map → property-E675NNFW.js.map} +0 -0
  102. /package/dist/{record-CJIEUF2Z.js.map → record-HELPASIE.js.map} +0 -0
  103. /package/dist/{release-PGLSKZCM.js.map → release-ZZIANCH7.js.map} +0 -0
  104. /package/dist/{scenarios-5TJ76A5P.js.map → scenarios-FWFSTCTV.js.map} +0 -0
  105. /package/dist/{schedule-FRAVS3RH.js.map → schedule-QIXBH2HF.js.map} +0 -0
  106. /package/dist/{session-E4PFQPBF.js.map → session-4RB4TRRU.js.map} +0 -0
  107. /package/dist/{spec-ZNOLW4JR.js.map → spec-7LGJ4H5W.js.map} +0 -0
  108. /package/dist/{src-GEMLVCW4.js.map → src-FW7TIXEQ.js.map} +0 -0
  109. /package/dist/{start-EV7J2TEF.js.map → start-IEUE53KY.js.map} +0 -0
  110. /package/dist/{tag-UXKWRACA.js.map → tag-J5SX224K.js.map} +0 -0
  111. /package/dist/{task-VDLJQKUB.js.map → task-ONZVZQAQ.js.map} +0 -0
  112. /package/dist/{test-suite-SOM2MTNH.js.map → test-suite-STGE6IAV.js.map} +0 -0
  113. /package/dist/{trace-DZCJO27U.js.map → trace-O5BVV7ZU.js.map} +0 -0
  114. /package/dist/{triage-UQAB5HGG.js.map → triage-VS3S7GXN.js.map} +0 -0
  115. /package/dist/{utilities-D7EYIATI.js.map → utilities-ARHQATQ6.js.map} +0 -0
  116. /package/dist/{workflow-cache-ZMYUGEPB.js.map → workflow-cache-PDLY7XLW.js.map} +0 -0
  117. /package/dist/{workflow-debug-LQKP27VI.js.map → workflow-debug-6IJQ5C3X.js.map} +0 -0
  118. /package/dist/{workflow-proposals-NEXXWL3O.js.map → workflow-proposals-MTHYBJGV.js.map} +0 -0
@@ -2,7 +2,7 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  apiRequest,
4
4
  fetchList
5
- } from "./chunk-AHVGWPO3.js";
5
+ } from "./chunk-SZOPRIBA.js";
6
6
  import "./chunk-H3LWYSKY.js";
7
7
  import {
8
8
  getArgValue,
@@ -10,7 +10,7 @@ import {
10
10
  resolveConfig
11
11
  } from "./chunk-ZPPG4MGR.js";
12
12
  import "./chunk-S3Q7MDCS.js";
13
- import "./chunk-JNBZKVZE.js";
13
+ import "./chunk-QX7RZ5CZ.js";
14
14
  import "./chunk-ZSOAFMES.js";
15
15
  import "./chunk-ICKB3EOT.js";
16
16
 
@@ -370,4 +370,4 @@ async function runMetrics(argv) {
370
370
  export {
371
371
  runMetrics
372
372
  };
373
- //# sourceMappingURL=metrics-IRO7NK4L.js.map
373
+ //# sourceMappingURL=metrics-3S4ZEA3B.js.map
@@ -2,7 +2,7 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  apiRequest,
4
4
  fetchList
5
- } from "./chunk-AHVGWPO3.js";
5
+ } from "./chunk-SZOPRIBA.js";
6
6
  import "./chunk-H3LWYSKY.js";
7
7
  import {
8
8
  getArgValue,
@@ -10,7 +10,7 @@ import {
10
10
  resolveConfig
11
11
  } from "./chunk-ZPPG4MGR.js";
12
12
  import "./chunk-S3Q7MDCS.js";
13
- import "./chunk-JNBZKVZE.js";
13
+ import "./chunk-QX7RZ5CZ.js";
14
14
  import "./chunk-ZSOAFMES.js";
15
15
  import "./chunk-ICKB3EOT.js";
16
16
 
@@ -344,4 +344,4 @@ async function runProduct(argv) {
344
344
  export {
345
345
  runProduct
346
346
  };
347
- //# sourceMappingURL=product-FAEOC2BC.js.map
347
+ //# sourceMappingURL=product-2NW74HNE.js.map
@@ -0,0 +1,186 @@
1
+ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
2
+ import {
3
+ apiRequest
4
+ } from "./chunk-SZOPRIBA.js";
5
+ import "./chunk-H3LWYSKY.js";
6
+ import {
7
+ getArgValue,
8
+ hasFlag,
9
+ resolveConfig
10
+ } from "./chunk-ZPPG4MGR.js";
11
+ import "./chunk-S3Q7MDCS.js";
12
+ import "./chunk-QX7RZ5CZ.js";
13
+ import "./chunk-ZSOAFMES.js";
14
+ import "./chunk-ICKB3EOT.js";
15
+
16
+ // src/prompts.ts
17
+ import fs from "fs/promises";
18
+ import path from "path";
19
+ import process from "process";
20
+ function printHelp() {
21
+ const lines = [
22
+ "Curated starter prompts for coding agents.",
23
+ "",
24
+ "Usage:",
25
+ " canary prompts list [--json] List global + your org prompts",
26
+ " canary prompts get <slug|id> [--json|--raw] Print a prompt (markdown to stdout)",
27
+ " canary prompts create [<file>|--stdin] --title <t> [--description <d>] [--global] [--json]",
28
+ " canary prompts delete <id> Delete one of your org prompts",
29
+ "",
30
+ "Notes:",
31
+ " --global creates/edits a Cofactor-wide prompt (superadmin only).",
32
+ "",
33
+ "Examples:",
34
+ " canary prompts list",
35
+ " canary prompts get install-cli",
36
+ ' canary prompts create recipe.md --title "Set up CI"',
37
+ ' cat recipe.md | canary prompts create --stdin --title "Set up CI"'
38
+ ];
39
+ console.log(lines.join("\n"));
40
+ }
41
+ async function readStdin() {
42
+ const chunks = [];
43
+ for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
44
+ return Buffer.concat(chunks).toString("utf-8");
45
+ }
46
+ async function promptsList(argv, apiUrl, token) {
47
+ const result = await apiRequest(
48
+ apiUrl,
49
+ token,
50
+ "GET",
51
+ "/prompts"
52
+ );
53
+ if (!result.ok) {
54
+ console.error(`Error: ${result.error ?? "failed to list prompts"}`);
55
+ process.exit(1);
56
+ }
57
+ if (hasFlag(argv, "--json")) {
58
+ console.log(JSON.stringify(result.data, null, 2));
59
+ return;
60
+ }
61
+ if (result.data.length === 0) {
62
+ console.log("No prompts.");
63
+ return;
64
+ }
65
+ const slugWidth = Math.max(...result.data.map((p) => p.slug.length));
66
+ console.log("Available prompts:\n");
67
+ for (const p of result.data) {
68
+ const tag = p.scope === "global" ? "[global]" : "[org] ";
69
+ console.log(` ${tag} ${p.slug.padEnd(slugWidth)} ${p.title}`);
70
+ if (p.description) console.log(` ${" ".repeat(slugWidth)} ${p.description}`);
71
+ }
72
+ console.log("\nPrint one with: canary prompts get <slug>");
73
+ }
74
+ async function promptsGet(argv, apiUrl, token) {
75
+ const idOrSlug = argv.find((a) => !a.startsWith("-"));
76
+ if (!idOrSlug) {
77
+ console.error("Error: missing prompt. Usage: canary prompts get <slug|id> [--raw|--json]");
78
+ process.exit(1);
79
+ }
80
+ const result = await apiRequest(
81
+ apiUrl,
82
+ token,
83
+ "GET",
84
+ `/prompts/${encodeURIComponent(idOrSlug)}`
85
+ );
86
+ if (!result.ok || !result.data) {
87
+ console.error(`Error: ${result.error ?? "prompt not found"}`);
88
+ process.exit(1);
89
+ }
90
+ if (hasFlag(argv, "--json")) {
91
+ console.log(JSON.stringify(result.data, null, 2));
92
+ return;
93
+ }
94
+ console.log(result.data.content);
95
+ }
96
+ async function promptsCreate(argv, apiUrl, token) {
97
+ const filePath = argv[0] && !argv[0].startsWith("-") ? argv[0] : void 0;
98
+ const inline = getArgValue(argv, "--content");
99
+ let content;
100
+ if (hasFlag(argv, "--stdin")) {
101
+ content = await readStdin();
102
+ } else if (inline !== void 0) {
103
+ content = inline;
104
+ } else if (filePath) {
105
+ try {
106
+ content = await fs.readFile(filePath, "utf-8");
107
+ } catch (err) {
108
+ console.error(
109
+ `Error: failed to read ${filePath}: ${err instanceof Error ? err.message : err}`
110
+ );
111
+ process.exit(1);
112
+ }
113
+ } else {
114
+ console.error("Error: provide content via a <file> arg, --stdin, or --content <text>.");
115
+ process.exit(1);
116
+ }
117
+ const title = getArgValue(argv, "--title") ?? (filePath ? path.basename(filePath).replace(/\.[^.]+$/, "") : void 0);
118
+ if (!title) {
119
+ console.error("Error: a title is required. Pass --title <t>.");
120
+ process.exit(1);
121
+ }
122
+ const description = getArgValue(argv, "--description");
123
+ const scope = hasFlag(argv, "--global") ? "global" : "org";
124
+ const result = await apiRequest(
125
+ apiUrl,
126
+ token,
127
+ "POST",
128
+ "/prompts",
129
+ { title, content, scope, ...description ? { description } : {} }
130
+ );
131
+ if (!result.ok || !result.data) {
132
+ console.error(`Error: ${result.error ?? "failed to create prompt"}`);
133
+ process.exit(1);
134
+ }
135
+ if (hasFlag(argv, "--json")) {
136
+ console.log(JSON.stringify(result.data, null, 2));
137
+ return;
138
+ }
139
+ console.log(`\u2713 Created ${result.data.scope} prompt "${result.data.title}"`);
140
+ console.log(` slug: ${result.data.slug}`);
141
+ console.log(` id: ${result.data.id}`);
142
+ }
143
+ async function promptsDelete(argv, apiUrl, token) {
144
+ const id = argv.find((a) => !a.startsWith("-"));
145
+ if (!id) {
146
+ console.error("Error: missing prompt id. Usage: canary prompts delete <id>");
147
+ process.exit(1);
148
+ }
149
+ const result = await apiRequest(
150
+ apiUrl,
151
+ token,
152
+ "DELETE",
153
+ `/prompts/${encodeURIComponent(id)}`
154
+ );
155
+ if (!result.ok) {
156
+ console.error(`Error: ${result.error ?? "failed to delete prompt"}`);
157
+ process.exit(1);
158
+ }
159
+ console.log("\u2713 Deleted prompt");
160
+ }
161
+ async function runPrompts(argv) {
162
+ const [sub, ...rest] = argv;
163
+ if (!sub || sub === "help" || hasFlag(argv, "--help", "-h")) {
164
+ printHelp();
165
+ return;
166
+ }
167
+ const { apiUrl, token } = await resolveConfig(rest);
168
+ switch (sub) {
169
+ case "list":
170
+ return promptsList(rest, apiUrl, token);
171
+ case "get":
172
+ return promptsGet(rest, apiUrl, token);
173
+ case "create":
174
+ return promptsCreate(rest, apiUrl, token);
175
+ case "delete":
176
+ return promptsDelete(rest, apiUrl, token);
177
+ default:
178
+ console.error(`Unknown prompts subcommand: ${sub}`);
179
+ printHelp();
180
+ process.exit(1);
181
+ }
182
+ }
183
+ export {
184
+ runPrompts
185
+ };
186
+ //# sourceMappingURL=prompts-NKJEQ62J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/prompts.ts"],"sourcesContent":["/**\n * CLI Prompt Library\n *\n * Browse and manage the Prompt Library from the terminal — curated,\n * agent-agnostic starter prompts. Lists Cofactor's GLOBAL prompts plus your\n * org's prompts; create/delete your org's prompts (and, as a superadmin,\n * GLOBAL ones with `--global`). Backed by the `/prompts` API.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\n\ntype PromptScope = 'global' | 'org';\n\ninterface PromptSummary {\n id: string;\n slug: string;\n title: string;\n description: string | null;\n scope: PromptScope;\n}\n\ninterface PromptDetail extends PromptSummary {\n content: string;\n}\n\nfunction printHelp(): void {\n const lines = [\n 'Curated starter prompts for coding agents.',\n '',\n 'Usage:',\n ' canary prompts list [--json] List global + your org prompts',\n ' canary prompts get <slug|id> [--json|--raw] Print a prompt (markdown to stdout)',\n ' canary prompts create [<file>|--stdin] --title <t> [--description <d>] [--global] [--json]',\n ' canary prompts delete <id> Delete one of your org prompts',\n '',\n 'Notes:',\n ' --global creates/edits a Cofactor-wide prompt (superadmin only).',\n '',\n 'Examples:',\n ' canary prompts list',\n ' canary prompts get install-cli',\n ' canary prompts create recipe.md --title \"Set up CI\"',\n ' cat recipe.md | canary prompts create --stdin --title \"Set up CI\"',\n ];\n console.log(lines.join('\\n'));\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf-8');\n}\n\nasync function promptsList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const result = await apiRequest<{ ok: boolean; error?: string; data: PromptSummary[] }>(\n apiUrl,\n token,\n 'GET',\n '/prompts'\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'failed to list prompts'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.data, null, 2));\n return;\n }\n if (result.data.length === 0) {\n console.log('No prompts.');\n return;\n }\n const slugWidth = Math.max(...result.data.map((p) => p.slug.length));\n console.log('Available prompts:\\n');\n for (const p of result.data) {\n const tag = p.scope === 'global' ? '[global]' : '[org] ';\n console.log(` ${tag} ${p.slug.padEnd(slugWidth)} ${p.title}`);\n if (p.description) console.log(` ${' '.repeat(slugWidth)} ${p.description}`);\n }\n console.log('\\nPrint one with: canary prompts get <slug>');\n}\n\nasync function promptsGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const idOrSlug = argv.find((a) => !a.startsWith('-'));\n if (!idOrSlug) {\n console.error('Error: missing prompt. Usage: canary prompts get <slug|id> [--raw|--json]');\n process.exit(1);\n }\n const result = await apiRequest<{ ok: boolean; error?: string; data?: PromptDetail }>(\n apiUrl,\n token,\n 'GET',\n `/prompts/${encodeURIComponent(idOrSlug)}`\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'prompt not found'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.data, null, 2));\n return;\n }\n // Raw markdown to stdout so it pastes cleanly into an agent.\n console.log(result.data.content);\n}\n\nasync function promptsCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n // A positional file is only the FIRST arg (`prompts create <file> …`); anything\n // else is a flag (or a flag's value, e.g. `--title \"Set up CI\"`) and must not be\n // mistaken for a path.\n const filePath = argv[0] && !argv[0].startsWith('-') ? argv[0] : undefined;\n const inline = getArgValue(argv, '--content');\n let content: string;\n if (hasFlag(argv, '--stdin')) {\n content = await readStdin();\n } else if (inline !== undefined) {\n content = inline;\n } else if (filePath) {\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n console.error(\n `Error: failed to read ${filePath}: ${err instanceof Error ? err.message : err}`\n );\n process.exit(1);\n }\n } else {\n console.error('Error: provide content via a <file> arg, --stdin, or --content <text>.');\n process.exit(1);\n }\n\n const title =\n getArgValue(argv, '--title') ??\n (filePath ? path.basename(filePath).replace(/\\.[^.]+$/, '') : undefined);\n if (!title) {\n console.error('Error: a title is required. Pass --title <t>.');\n process.exit(1);\n }\n const description = getArgValue(argv, '--description');\n const scope = hasFlag(argv, '--global') ? 'global' : 'org';\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: PromptDetail }>(\n apiUrl,\n token,\n 'POST',\n '/prompts',\n { title, content, scope, ...(description ? { description } : {}) }\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'failed to create prompt'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.data, null, 2));\n return;\n }\n console.log(`✓ Created ${result.data.scope} prompt \"${result.data.title}\"`);\n console.log(` slug: ${result.data.slug}`);\n console.log(` id: ${result.data.id}`);\n}\n\nasync function promptsDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: missing prompt id. Usage: canary prompts delete <id>');\n process.exit(1);\n }\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n `/prompts/${encodeURIComponent(id)}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'failed to delete prompt'}`);\n process.exit(1);\n }\n console.log('✓ Deleted prompt');\n}\n\nexport async function runPrompts(argv: string[]): Promise<void> {\n const [sub, ...rest] = argv;\n\n if (!sub || sub === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp();\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(rest);\n\n switch (sub) {\n case 'list':\n return promptsList(rest, apiUrl, token);\n case 'get':\n return promptsGet(rest, apiUrl, token);\n case 'create':\n return promptsCreate(rest, apiUrl, token);\n case 'delete':\n return promptsDelete(rest, apiUrl, token);\n default:\n console.error(`Unknown prompts subcommand: ${sub}`);\n printHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  apiRequest,
4
4
  fetchProperties,
5
5
  getApplicationArg
6
- } from "./chunk-AHVGWPO3.js";
6
+ } from "./chunk-SZOPRIBA.js";
7
7
  import "./chunk-H3LWYSKY.js";
8
8
  import {
9
9
  getArgValue,
@@ -11,7 +11,7 @@ import {
11
11
  resolveConfig
12
12
  } from "./chunk-ZPPG4MGR.js";
13
13
  import "./chunk-S3Q7MDCS.js";
14
- import "./chunk-JNBZKVZE.js";
14
+ import "./chunk-QX7RZ5CZ.js";
15
15
  import "./chunk-ZSOAFMES.js";
16
16
  import "./chunk-ICKB3EOT.js";
17
17
 
@@ -773,4 +773,4 @@ async function runProperty(argv) {
773
773
  export {
774
774
  runProperty
775
775
  };
776
- //# sourceMappingURL=property-X6NPV2VK.js.map
776
+ //# sourceMappingURL=property-E675NNFW.js.map
@@ -7,7 +7,7 @@ import {
7
7
  apiRequest,
8
8
  downloadStorageState,
9
9
  selectCredential
10
- } from "./chunk-AHVGWPO3.js";
10
+ } from "./chunk-SZOPRIBA.js";
11
11
  import "./chunk-H3LWYSKY.js";
12
12
  import {
13
13
  getArgValue,
@@ -17,7 +17,7 @@ import {
17
17
  import {
18
18
  getCanaryTmpDir
19
19
  } from "./chunk-S3Q7MDCS.js";
20
- import "./chunk-JNBZKVZE.js";
20
+ import "./chunk-QX7RZ5CZ.js";
21
21
  import "./chunk-ZSOAFMES.js";
22
22
  import "./chunk-ICKB3EOT.js";
23
23
 
@@ -86,7 +86,7 @@ async function runRecord(argv) {
86
86
  );
87
87
  }
88
88
  console.log("Launching browser...");
89
- const { PlaywrightClient, consoleLogger, captureElementAtPoint } = await import("./dist-FC2BFYMX.js");
89
+ const { PlaywrightClient, consoleLogger, captureElementAtPoint } = await import("./dist-MQMO6WA3.js");
90
90
  const client = new PlaywrightClient({ logger: consoleLogger });
91
91
  await client.connect({
92
92
  browserMode: "headed",
@@ -229,4 +229,4 @@ Output directory: ${outDir}`);
229
229
  export {
230
230
  runRecord
231
231
  };
232
- //# sourceMappingURL=record-CJIEUF2Z.js.map
232
+ //# sourceMappingURL=record-HELPASIE.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
2
2
  import {
3
3
  getApplicationIdArg
4
- } from "./chunk-AHVGWPO3.js";
4
+ } from "./chunk-SZOPRIBA.js";
5
5
  import "./chunk-H3LWYSKY.js";
6
6
  import {
7
7
  getArgValue,
@@ -9,7 +9,7 @@ import {
9
9
  resolveConfig
10
10
  } from "./chunk-ZPPG4MGR.js";
11
11
  import "./chunk-S3Q7MDCS.js";
12
- import "./chunk-JNBZKVZE.js";
12
+ import "./chunk-QX7RZ5CZ.js";
13
13
  import "./chunk-ZSOAFMES.js";
14
14
  import "./chunk-ICKB3EOT.js";
15
15
 
@@ -352,4 +352,4 @@ async function runRelease(argv) {
352
352
  export {
353
353
  runRelease
354
354
  };
355
- //# sourceMappingURL=release-PGLSKZCM.js.map
355
+ //# sourceMappingURL=release-ZZIANCH7.js.map
@@ -2,11 +2,11 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  SANDBOX_GUIDE_SECTIONS,
4
4
  printGuide
5
- } from "./chunk-2RGTNVYR.js";
5
+ } from "./chunk-YI4LFJFK.js";
6
6
  import {
7
7
  apiRequest,
8
8
  selectProperty
9
- } from "./chunk-AHVGWPO3.js";
9
+ } from "./chunk-SZOPRIBA.js";
10
10
  import {
11
11
  apiFetch,
12
12
  exitOnFailure,
@@ -22,7 +22,7 @@ import {
22
22
  INSTANCE_SIZES,
23
23
  INSTANCE_SIZE_SPEC,
24
24
  parseInstanceSize
25
- } from "./chunk-JNBZKVZE.js";
25
+ } from "./chunk-QX7RZ5CZ.js";
26
26
  import "./chunk-ZSOAFMES.js";
27
27
  import "./chunk-ICKB3EOT.js";
28
28
 
@@ -77,7 +77,9 @@ function printHelp() {
77
77
  " artifact get <template-id> <type> Get artifact content",
78
78
  " artifact create <template-id> <type> <file> Upload artifact (use --path for file type)",
79
79
  " create [property] [options] Create template from property (triggers provisioning)",
80
- " provision <template-id> [options] Create instance from verified template",
80
+ " provision <template-id> [options] Create a dedicated instance from a verified template",
81
+ " warm <template-id> [--wait] [--timeout <sec>] Warm the org-shared flow-authoring instance",
82
+ " (the one the flow designer auto-spins; sandbox runs reuse it)",
81
83
  " verify <template-id> Verify an authoring template (provision + probe + flip to verified)",
82
84
  ' set-size <template-id> <size> Set EC2 size for next provision (see "Instance sizes" below)',
83
85
  " ami list <template-id> List per-template AMI history",
@@ -195,11 +197,15 @@ async function handleList(argv, apiUrl, token) {
195
197
  if (instances.length === 0) {
196
198
  console.log(" (none)");
197
199
  } else {
198
- console.log(` ${pad("ID", 38)} ${pad("Status", 14)} ${pad("Access", 10)} ${pad("Template", 38)} Expires`);
200
+ console.log(` ${pad("ID", 38)} ${pad("Status", 14)} ${pad("Purpose", 16)} ${pad("Access", 10)} ${pad("Template", 38)} Expires`);
199
201
  for (const i of instances) {
200
202
  const access = i.isPrivate ? "private" : "public";
201
- console.log(` ${pad(i.id, 38)} ${pad(i.status, 14)} ${pad(access, 10)} ${pad(i.templateId, 38)} ${i.expiresAt ? formatDate(i.expiresAt) : "-"}`);
203
+ const purpose = i.purpose === "flow_authoring" ? "flow_authoring*" : i.purpose ?? "-";
204
+ console.log(` ${pad(i.id, 38)} ${pad(i.status, 14)} ${pad(purpose, 16)} ${pad(access, 10)} ${pad(i.templateId, 38)} ${i.expiresAt ? formatDate(i.expiresAt) : "-"}`);
202
205
  }
206
+ console.log("");
207
+ console.log(" * flow_authoring = org-shared instance the flow designer auto-spins and");
208
+ console.log(" sandbox workflow runs reuse. Warm it with: canary sandbox warm <template-id>");
203
209
  }
204
210
  }
205
211
  async function handleTemplate(argv, apiUrl, token) {
@@ -608,6 +614,72 @@ async function handleProvision(argv, apiUrl, token) {
608
614
  if (isPrivate) console.log(` Access: private (no public URL)`);
609
615
  console.log(` Expires: ${res.data.expiresAt ? formatDate(res.data.expiresAt) : "-"}`);
610
616
  }
617
+ async function handleWarm(argv, apiUrl, token) {
618
+ const positional = argv.filter((a) => !a.startsWith("-"));
619
+ const templateId = positional[0];
620
+ const json = hasFlag(argv, "--json");
621
+ const wait = hasFlag(argv, "--wait");
622
+ const timeoutSec = parseInt(getArgValue(argv, "--timeout") ?? "600", 10);
623
+ if (!templateId) {
624
+ console.error(
625
+ "Error: template ID required. Usage: canary sandbox warm <template-id> [--wait] [--timeout <sec>]"
626
+ );
627
+ console.error("Find the template id with: canary sandbox list");
628
+ process.exit(1);
629
+ }
630
+ const ensure = () => apiRequest(
631
+ apiUrl,
632
+ token,
633
+ "POST",
634
+ `/org/environments/templates/${templateId}/authoring-instance`
635
+ );
636
+ const first = await ensure();
637
+ if (!first.ok || !first.data) {
638
+ if (json) {
639
+ console.log(JSON.stringify(first, null, 2));
640
+ } else {
641
+ console.error(`Error: ${first.error ?? "Failed to warm sandbox"}`);
642
+ }
643
+ process.exit(1);
644
+ }
645
+ const terminalOk = /* @__PURE__ */ new Set(["running"]);
646
+ const terminalFail = /* @__PURE__ */ new Set(["failed", "terminated", "stopping"]);
647
+ let current = first.data;
648
+ if (wait && !terminalOk.has(current.status) && !terminalFail.has(current.status)) {
649
+ const deadline = Date.now() + timeoutSec * 1e3;
650
+ if (!json) console.log(`Warming flow-authoring sandbox (${current.status})...`);
651
+ while (Date.now() < deadline) {
652
+ await new Promise((r) => setTimeout(r, 5e3));
653
+ const poll = await ensure();
654
+ if (!poll.ok || !poll.data) {
655
+ console.error(`Error polling sandbox: ${poll.error ?? "Unknown error"}`);
656
+ process.exit(1);
657
+ }
658
+ current = poll.data;
659
+ if (terminalOk.has(current.status) || terminalFail.has(current.status)) break;
660
+ }
661
+ }
662
+ if (json) {
663
+ console.log(JSON.stringify({ ok: true, data: current }, null, 2));
664
+ } else {
665
+ console.log(`Sandbox ${current.created ? "created" : "reused"}: ${current.instanceId}`);
666
+ console.log(` Status: ${current.status}`);
667
+ if (current.url) console.log(` URL: ${current.url}`);
668
+ if (current.expiresAt) console.log(` Expires: ${formatDate(current.expiresAt)}`);
669
+ if (current.status === "running") {
670
+ console.log("\nReady. Run a workflow against it with:");
671
+ console.log(" canary workflow run <workflowId> [--environment <name|id>] --stream");
672
+ } else if (wait && terminalFail.has(current.status)) {
673
+ console.log("\nSandbox did not reach a ready state.");
674
+ } else if (wait) {
675
+ console.log("\nTimed out waiting for the sandbox to become ready. Re-run to keep waiting.");
676
+ } else {
677
+ console.log("\nWarming in the background. Poll with: canary sandbox warm " + templateId + " --wait");
678
+ }
679
+ }
680
+ if (terminalFail.has(current.status)) process.exit(1);
681
+ if (wait && current.status !== "running") process.exit(1);
682
+ }
611
683
  function parseDockerPs(stdout) {
612
684
  const lines = stdout.split("\n").map((l) => l.trim()).filter(Boolean);
613
685
  return lines.map((line) => {
@@ -1998,6 +2070,9 @@ async function runSandbox(argv) {
1998
2070
  case "provision":
1999
2071
  await handleProvision(args, apiUrl, token);
2000
2072
  break;
2073
+ case "warm":
2074
+ await handleWarm(args, apiUrl, token);
2075
+ break;
2001
2076
  case "verify":
2002
2077
  await handleVerify(args, apiUrl, token);
2003
2078
  break;
@@ -2088,4 +2163,4 @@ export {
2088
2163
  parseDockerPs,
2089
2164
  runSandbox
2090
2165
  };
2091
- //# sourceMappingURL=sandbox-PBRWVF4Y.js.map
2166
+ //# sourceMappingURL=sandbox-TTFAKM63.js.map