@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.
- package/README.md +15 -0
- package/dist/{account-HWN3W3DJ.js → account-LF73VDLD.js} +3 -3
- package/dist/{alert-2XQKWLXV.js → alert-YDCWKNLG.js} +4 -4
- package/dist/{api-catalog-3DNTXLUR.js → api-catalog-SUJ4DUAW.js} +3 -3
- package/dist/{attachment-EKI6FME3.js → attachment-ZOWURGCW.js} +3 -3
- package/dist/{augmentor-WVDFIJVN.js → augmentor-7JFSE344.js} +3 -3
- package/dist/{chunk-5XJARJVW.js → chunk-4O7KUIYE.js} +2 -2
- package/dist/{chunk-UAF5JTY6.js → chunk-EPMDUCEA.js} +2 -2
- package/dist/{chunk-C6GFGMMI.js → chunk-IC3HQSRW.js} +2 -2
- package/dist/{chunk-5H5LE7ZJ.js → chunk-LNX22N2L.js} +2 -2
- package/dist/{chunk-XFESXI7N.js → chunk-LQ5IBELB.js} +2 -2
- package/dist/{chunk-JWPQUDTG.js → chunk-OCT6HQZK.js} +2 -2
- package/dist/{chunk-JNBZKVZE.js → chunk-QX7RZ5CZ.js} +1 -1
- package/dist/chunk-QX7RZ5CZ.js.map +1 -0
- package/dist/{chunk-FZKJERAJ.js → chunk-SL5GDAWL.js} +2 -2
- package/dist/{chunk-AHVGWPO3.js → chunk-SZOPRIBA.js} +18 -2
- package/dist/chunk-SZOPRIBA.js.map +1 -0
- package/dist/{chunk-HXM3JXCX.js → chunk-TVM3VEAP.js} +2 -2
- package/dist/{chunk-2RGTNVYR.js → chunk-YI4LFJFK.js} +36 -11
- package/dist/{chunk-2RGTNVYR.js.map → chunk-YI4LFJFK.js.map} +1 -1
- package/dist/{credential-YCLLYSXW.js → credential-DAK26ZN5.js} +3 -3
- package/dist/{credential-template-ILUYGLUZ.js → credential-template-2S4IKKWH.js} +3 -3
- package/dist/{dist-FC2BFYMX.js → dist-MQMO6WA3.js} +3 -3
- package/dist/{docs-UGJPGZOR.js → docs-SX5RFWWF.js} +3 -3
- package/dist/{environment-TENLRRC3.js → environment-2OAJCTFK.js} +3 -3
- package/dist/{feature-flag-5EBZJD43.js → feature-flag-2HRNJ6Z6.js} +3 -3
- package/dist/index.js +47 -37
- package/dist/index.js.map +1 -1
- package/dist/{init-YCS4OZFP.js → init-U2Z4ZJCC.js} +3 -3
- package/dist/{install-AVD4R5KA.js → install-VYXTJJVC.js} +3 -3
- package/dist/{issues-TRD5CQ4R.js → issues-QTX3YE5G.js} +3 -3
- package/dist/{knobs-DKAVOTMC.js → knobs-HMONFFHZ.js} +3 -3
- package/dist/{list-W3ONQTUH.js → list-46W2OU5D.js} +3 -3
- package/dist/{local-LLQFYBF3.js → local-4Y75MUYQ.js} +5 -5
- package/dist/{login-X72OFYMF.js → login-GCEIQ5FN.js} +3 -3
- package/dist/{mcp-KGMDCJJO.js → mcp-SLYY6DQL.js} +4 -4
- package/dist/{metrics-IRO7NK4L.js → metrics-3S4ZEA3B.js} +3 -3
- package/dist/{product-FAEOC2BC.js → product-2NW74HNE.js} +3 -3
- package/dist/prompts-NKJEQ62J.js +186 -0
- package/dist/prompts-NKJEQ62J.js.map +1 -0
- package/dist/{property-X6NPV2VK.js → property-E675NNFW.js} +3 -3
- package/dist/{record-CJIEUF2Z.js → record-HELPASIE.js} +4 -4
- package/dist/{release-PGLSKZCM.js → release-ZZIANCH7.js} +3 -3
- package/dist/{sandbox-PBRWVF4Y.js → sandbox-TTFAKM63.js} +82 -7
- package/dist/sandbox-TTFAKM63.js.map +1 -0
- package/dist/{scenarios-5TJ76A5P.js → scenarios-FWFSTCTV.js} +3 -3
- package/dist/{schedule-FRAVS3RH.js → schedule-QIXBH2HF.js} +4 -4
- package/dist/{session-E4PFQPBF.js → session-4RB4TRRU.js} +5 -5
- package/dist/skills/debug-run/SKILL.md +1 -1
- package/dist/{spec-ZNOLW4JR.js → spec-7LGJ4H5W.js} +3 -3
- package/dist/{src-OLQ7ZFHS.js → src-F4UX4PMP.js} +140 -8
- package/dist/src-F4UX4PMP.js.map +1 -0
- package/dist/{src-GEMLVCW4.js → src-FW7TIXEQ.js} +3 -3
- package/dist/{start-EV7J2TEF.js → start-IEUE53KY.js} +3 -3
- package/dist/{tag-UXKWRACA.js → tag-J5SX224K.js} +4 -4
- package/dist/{task-VDLJQKUB.js → task-ONZVZQAQ.js} +3 -3
- package/dist/{test-suite-SOM2MTNH.js → test-suite-STGE6IAV.js} +5 -5
- package/dist/{trace-DZCJO27U.js → trace-O5BVV7ZU.js} +4 -4
- package/dist/{triage-UQAB5HGG.js → triage-VS3S7GXN.js} +4 -4
- package/dist/{utilities-D7EYIATI.js → utilities-ARHQATQ6.js} +3 -3
- package/dist/{workflow-X7QNGJJ2.js → workflow-5FJ4D62D.js} +29 -32
- package/dist/workflow-5FJ4D62D.js.map +1 -0
- package/dist/{workflow-cache-ZMYUGEPB.js → workflow-cache-PDLY7XLW.js} +6 -6
- package/dist/{workflow-debug-LQKP27VI.js → workflow-debug-6IJQ5C3X.js} +6 -6
- package/dist/{workflow-proposals-NEXXWL3O.js → workflow-proposals-MTHYBJGV.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-AHVGWPO3.js.map +0 -1
- package/dist/chunk-JNBZKVZE.js.map +0 -1
- package/dist/sandbox-PBRWVF4Y.js.map +0 -1
- package/dist/src-OLQ7ZFHS.js.map +0 -1
- package/dist/workflow-X7QNGJJ2.js.map +0 -1
- /package/dist/{account-HWN3W3DJ.js.map → account-LF73VDLD.js.map} +0 -0
- /package/dist/{alert-2XQKWLXV.js.map → alert-YDCWKNLG.js.map} +0 -0
- /package/dist/{api-catalog-3DNTXLUR.js.map → api-catalog-SUJ4DUAW.js.map} +0 -0
- /package/dist/{attachment-EKI6FME3.js.map → attachment-ZOWURGCW.js.map} +0 -0
- /package/dist/{augmentor-WVDFIJVN.js.map → augmentor-7JFSE344.js.map} +0 -0
- /package/dist/{chunk-5XJARJVW.js.map → chunk-4O7KUIYE.js.map} +0 -0
- /package/dist/{chunk-UAF5JTY6.js.map → chunk-EPMDUCEA.js.map} +0 -0
- /package/dist/{chunk-C6GFGMMI.js.map → chunk-IC3HQSRW.js.map} +0 -0
- /package/dist/{chunk-5H5LE7ZJ.js.map → chunk-LNX22N2L.js.map} +0 -0
- /package/dist/{chunk-XFESXI7N.js.map → chunk-LQ5IBELB.js.map} +0 -0
- /package/dist/{chunk-JWPQUDTG.js.map → chunk-OCT6HQZK.js.map} +0 -0
- /package/dist/{chunk-FZKJERAJ.js.map → chunk-SL5GDAWL.js.map} +0 -0
- /package/dist/{chunk-HXM3JXCX.js.map → chunk-TVM3VEAP.js.map} +0 -0
- /package/dist/{credential-YCLLYSXW.js.map → credential-DAK26ZN5.js.map} +0 -0
- /package/dist/{credential-template-ILUYGLUZ.js.map → credential-template-2S4IKKWH.js.map} +0 -0
- /package/dist/{dist-FC2BFYMX.js.map → dist-MQMO6WA3.js.map} +0 -0
- /package/dist/{docs-UGJPGZOR.js.map → docs-SX5RFWWF.js.map} +0 -0
- /package/dist/{environment-TENLRRC3.js.map → environment-2OAJCTFK.js.map} +0 -0
- /package/dist/{feature-flag-5EBZJD43.js.map → feature-flag-2HRNJ6Z6.js.map} +0 -0
- /package/dist/{init-YCS4OZFP.js.map → init-U2Z4ZJCC.js.map} +0 -0
- /package/dist/{install-AVD4R5KA.js.map → install-VYXTJJVC.js.map} +0 -0
- /package/dist/{issues-TRD5CQ4R.js.map → issues-QTX3YE5G.js.map} +0 -0
- /package/dist/{knobs-DKAVOTMC.js.map → knobs-HMONFFHZ.js.map} +0 -0
- /package/dist/{list-W3ONQTUH.js.map → list-46W2OU5D.js.map} +0 -0
- /package/dist/{local-LLQFYBF3.js.map → local-4Y75MUYQ.js.map} +0 -0
- /package/dist/{login-X72OFYMF.js.map → login-GCEIQ5FN.js.map} +0 -0
- /package/dist/{mcp-KGMDCJJO.js.map → mcp-SLYY6DQL.js.map} +0 -0
- /package/dist/{metrics-IRO7NK4L.js.map → metrics-3S4ZEA3B.js.map} +0 -0
- /package/dist/{product-FAEOC2BC.js.map → product-2NW74HNE.js.map} +0 -0
- /package/dist/{property-X6NPV2VK.js.map → property-E675NNFW.js.map} +0 -0
- /package/dist/{record-CJIEUF2Z.js.map → record-HELPASIE.js.map} +0 -0
- /package/dist/{release-PGLSKZCM.js.map → release-ZZIANCH7.js.map} +0 -0
- /package/dist/{scenarios-5TJ76A5P.js.map → scenarios-FWFSTCTV.js.map} +0 -0
- /package/dist/{schedule-FRAVS3RH.js.map → schedule-QIXBH2HF.js.map} +0 -0
- /package/dist/{session-E4PFQPBF.js.map → session-4RB4TRRU.js.map} +0 -0
- /package/dist/{spec-ZNOLW4JR.js.map → spec-7LGJ4H5W.js.map} +0 -0
- /package/dist/{src-GEMLVCW4.js.map → src-FW7TIXEQ.js.map} +0 -0
- /package/dist/{start-EV7J2TEF.js.map → start-IEUE53KY.js.map} +0 -0
- /package/dist/{tag-UXKWRACA.js.map → tag-J5SX224K.js.map} +0 -0
- /package/dist/{task-VDLJQKUB.js.map → task-ONZVZQAQ.js.map} +0 -0
- /package/dist/{test-suite-SOM2MTNH.js.map → test-suite-STGE6IAV.js.map} +0 -0
- /package/dist/{trace-DZCJO27U.js.map → trace-O5BVV7ZU.js.map} +0 -0
- /package/dist/{triage-UQAB5HGG.js.map → triage-VS3S7GXN.js.map} +0 -0
- /package/dist/{utilities-D7EYIATI.js.map → utilities-ARHQATQ6.js.map} +0 -0
- /package/dist/{workflow-cache-ZMYUGEPB.js.map → workflow-cache-PDLY7XLW.js.map} +0 -0
- /package/dist/{workflow-debug-LQKP27VI.js.map → workflow-debug-6IJQ5C3X.js.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
776
|
+
//# sourceMappingURL=property-E675NNFW.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
apiRequest,
|
|
8
8
|
downloadStorageState,
|
|
9
9
|
selectCredential
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
5
|
+
} from "./chunk-YI4LFJFK.js";
|
|
6
6
|
import {
|
|
7
7
|
apiRequest,
|
|
8
8
|
selectProperty
|
|
9
|
-
} from "./chunk-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
2166
|
+
//# sourceMappingURL=sandbox-TTFAKM63.js.map
|