@neotx/cli 0.1.0-alpha.14 → 0.1.0-alpha.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,342 @@
1
+ import {
2
+ printError,
3
+ printJson,
4
+ printSuccess,
5
+ printTable
6
+ } from "./chunk-YQIWMDXL.js";
7
+
8
+ // src/commands/decision.ts
9
+ import { DecisionStore, getSupervisorDecisionsPath } from "@neotx/core";
10
+ import { defineCommand } from "citty";
11
+ var DEFAULT_EXPIRES_MS = 24 * 60 * 60 * 1e3;
12
+ function truncate(text, max) {
13
+ return text.length > max ? `${text.slice(0, max - 1)}\u2026` : text;
14
+ }
15
+ function formatStatus(decision) {
16
+ if (decision.answer !== void 0) {
17
+ return "answered";
18
+ }
19
+ if (decision.expiredAt !== void 0) {
20
+ return "expired";
21
+ }
22
+ if (decision.expiresAt && decision.expiresAt < (/* @__PURE__ */ new Date()).toISOString()) {
23
+ return "expired";
24
+ }
25
+ return "pending";
26
+ }
27
+ function formatTimeAgo(timestamp) {
28
+ const ms = Date.now() - new Date(timestamp).getTime();
29
+ const seconds = Math.floor(ms / 1e3);
30
+ if (seconds < 60) return `${seconds}s ago`;
31
+ const minutes = Math.floor(seconds / 60);
32
+ if (minutes < 60) return `${minutes}m ago`;
33
+ const hours = Math.floor(minutes / 60);
34
+ return `${hours}h ago`;
35
+ }
36
+ function parseDurationMs(input) {
37
+ const match = input.match(/^(\d+)(h|m|d)$/);
38
+ if (!match) return void 0;
39
+ const value = Number(match[1]);
40
+ const unit = match[2];
41
+ switch (unit) {
42
+ case "d":
43
+ return value * 24 * 60 * 60 * 1e3;
44
+ case "h":
45
+ return value * 60 * 60 * 1e3;
46
+ case "m":
47
+ return value * 60 * 1e3;
48
+ default:
49
+ return void 0;
50
+ }
51
+ }
52
+ function parseOptions(optionsArg) {
53
+ if (!optionsArg.trim()) return void 0;
54
+ const options = [];
55
+ const parts = optionsArg.split(",");
56
+ for (const part of parts) {
57
+ const segments = part.trim().split(":");
58
+ const key = segments[0];
59
+ const label = segments[1];
60
+ if (!key || !label) {
61
+ throw new Error(
62
+ `Invalid option format: "${part}". Expected "key:label" or "key:label:description"`
63
+ );
64
+ }
65
+ const descParts = segments.slice(2);
66
+ options.push({
67
+ key: key.trim(),
68
+ label: label.trim(),
69
+ description: descParts.length > 0 ? descParts.join(":").trim() : void 0
70
+ });
71
+ }
72
+ return options.length > 0 ? options : void 0;
73
+ }
74
+ function openStore(name) {
75
+ const filePath = getSupervisorDecisionsPath(name);
76
+ return new DecisionStore(filePath);
77
+ }
78
+ async function handleCreate(args) {
79
+ if (!args.question) {
80
+ printError(
81
+ "Usage: neo decision create <question> --options 'key1:label1,key2:label2' [--default <key>] [--expires-in 24h]"
82
+ );
83
+ process.exitCode = 1;
84
+ return;
85
+ }
86
+ let options;
87
+ if (args.options) {
88
+ try {
89
+ options = parseOptions(args.options);
90
+ } catch (error) {
91
+ printError(error instanceof Error ? error.message : String(error));
92
+ process.exitCode = 1;
93
+ return;
94
+ }
95
+ }
96
+ let expiresAt;
97
+ if (args.expiresIn) {
98
+ const ms = parseDurationMs(args.expiresIn);
99
+ if (!ms) {
100
+ printError('Invalid --expires-in format. Use e.g. "24h", "30m", or "7d".');
101
+ process.exitCode = 1;
102
+ return;
103
+ }
104
+ expiresAt = new Date(Date.now() + ms).toISOString();
105
+ } else {
106
+ expiresAt = new Date(Date.now() + DEFAULT_EXPIRES_MS).toISOString();
107
+ }
108
+ const store = openStore(args.name);
109
+ try {
110
+ const id = await store.create({
111
+ question: args.question,
112
+ options,
113
+ defaultAnswer: args.defaultAnswer,
114
+ expiresAt,
115
+ type: args.type ?? "generic",
116
+ source: "supervisor",
117
+ context: args.context
118
+ });
119
+ printSuccess(`Decision created: ${id}`);
120
+ console.log(id);
121
+ } catch (error) {
122
+ printError(
123
+ `Failed to create decision: ${error instanceof Error ? error.message : String(error)}`
124
+ );
125
+ process.exitCode = 1;
126
+ }
127
+ }
128
+ async function handleList(args) {
129
+ const store = openStore(args.name);
130
+ const pending = await store.pending();
131
+ if (args.json) {
132
+ printJson(pending);
133
+ return;
134
+ }
135
+ if (pending.length === 0) {
136
+ console.log("No pending decisions.");
137
+ return;
138
+ }
139
+ printTable(
140
+ ["ID", "TYPE", "QUESTION", "SOURCE", "CREATED"],
141
+ pending.map((d) => [
142
+ d.id.slice(0, 12),
143
+ d.type,
144
+ truncate(d.question, 50),
145
+ d.source,
146
+ formatTimeAgo(d.createdAt)
147
+ ])
148
+ );
149
+ }
150
+ async function handleGet(args) {
151
+ if (!args.value) {
152
+ printError("Usage: neo decision get <id>");
153
+ process.exitCode = 1;
154
+ return;
155
+ }
156
+ const store = openStore(args.name);
157
+ const decision = await store.get(args.value);
158
+ if (!decision) {
159
+ printError(`Decision not found: ${args.value}`);
160
+ process.exitCode = 1;
161
+ return;
162
+ }
163
+ if (args.json) {
164
+ printJson(decision);
165
+ return;
166
+ }
167
+ const status = formatStatus(decision);
168
+ console.log(`ID: ${decision.id}`);
169
+ console.log(`Status: ${status}`);
170
+ console.log(`Type: ${decision.type}`);
171
+ console.log(`Source: ${decision.source}`);
172
+ console.log(`Created: ${decision.createdAt}`);
173
+ console.log();
174
+ console.log(`Question: ${decision.question}`);
175
+ if (decision.context) {
176
+ console.log();
177
+ console.log(`Context:
178
+ ${decision.context}`);
179
+ }
180
+ if (decision.options && decision.options.length > 0) {
181
+ console.log();
182
+ console.log("Options:");
183
+ for (const opt of decision.options) {
184
+ console.log(` [${opt.key}] ${opt.label}${opt.description ? ` - ${opt.description}` : ""}`);
185
+ }
186
+ }
187
+ if (decision.answer !== void 0) {
188
+ console.log();
189
+ console.log(`Answer: ${decision.answer}`);
190
+ if (decision.answeredAt) {
191
+ console.log(`Answered: ${decision.answeredAt}`);
192
+ }
193
+ }
194
+ if (decision.defaultAnswer !== void 0) {
195
+ console.log(`Default: ${decision.defaultAnswer}`);
196
+ }
197
+ if (decision.expiresAt) {
198
+ console.log(`Expires: ${decision.expiresAt}`);
199
+ }
200
+ }
201
+ async function handleAnswer(args) {
202
+ const argv = process.argv;
203
+ const answerIdx = argv.indexOf("answer");
204
+ const idArg = argv[answerIdx + 1];
205
+ const answerArg = argv[answerIdx + 2];
206
+ if (!idArg || !answerArg) {
207
+ printError("Usage: neo decision answer <id> <answer>");
208
+ process.exitCode = 1;
209
+ return;
210
+ }
211
+ const store = openStore(args.name);
212
+ try {
213
+ await store.answer(idArg, answerArg);
214
+ printSuccess(`Decision answered: ${idArg} \u2192 "${answerArg}"`);
215
+ } catch (error) {
216
+ printError(error instanceof Error ? error.message : "Unknown error");
217
+ process.exitCode = 1;
218
+ }
219
+ }
220
+ async function handlePending(args) {
221
+ const store = openStore(args.name);
222
+ const pending = await store.pending();
223
+ if (args.json) {
224
+ printJson(pending);
225
+ return;
226
+ }
227
+ if (pending.length === 0) {
228
+ console.log("No pending decisions.");
229
+ return;
230
+ }
231
+ for (const d of pending) {
232
+ console.log(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
233
+ console.log(`ID: ${d.id} (${formatTimeAgo(d.createdAt)})`);
234
+ console.log(`Question: ${d.question}`);
235
+ if (d.options && d.options.length > 0) {
236
+ console.log("Options:");
237
+ for (const opt of d.options) {
238
+ console.log(` [${opt.key}] ${opt.label}`);
239
+ }
240
+ }
241
+ if (d.defaultAnswer) {
242
+ console.log(`Default: ${d.defaultAnswer}`);
243
+ }
244
+ console.log();
245
+ }
246
+ console.log(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
247
+ console.log(`
248
+ Answer with: neo decision answer <id> <answer>`);
249
+ }
250
+ var decision_default = defineCommand({
251
+ meta: {
252
+ name: "decision",
253
+ description: "Manage supervisor decision gates"
254
+ },
255
+ args: {
256
+ action: {
257
+ type: "positional",
258
+ description: "Action: create, list, get, answer, pending",
259
+ required: true
260
+ },
261
+ value: {
262
+ type: "positional",
263
+ description: "Decision ID (for get/answer) or question text (for create)",
264
+ required: false
265
+ },
266
+ options: {
267
+ type: "string",
268
+ alias: "o",
269
+ description: 'Options in format "key1:label1,key2:label2" or "key1:label1:desc1,key2:label2:desc2"'
270
+ },
271
+ "default-answer": {
272
+ type: "string",
273
+ alias: "d",
274
+ description: "Default answer key (used if decision expires)"
275
+ },
276
+ "expires-in": {
277
+ type: "string",
278
+ alias: "e",
279
+ description: "Expiration duration (e.g. 24h, 30m, 7d). Default: 24h"
280
+ },
281
+ type: {
282
+ type: "string",
283
+ alias: "t",
284
+ description: "Decision type (default: generic)"
285
+ },
286
+ context: {
287
+ type: "string",
288
+ alias: "c",
289
+ description: "Additional context for the decision"
290
+ },
291
+ name: {
292
+ type: "string",
293
+ description: "Supervisor name",
294
+ default: "supervisor"
295
+ },
296
+ json: {
297
+ type: "boolean",
298
+ description: "Output as JSON",
299
+ default: false
300
+ }
301
+ },
302
+ async run({ args }) {
303
+ const action = args.action;
304
+ const parsed = {
305
+ action,
306
+ value: args.value,
307
+ question: args.value,
308
+ // For create action
309
+ options: args.options,
310
+ defaultAnswer: args["default-answer"],
311
+ expiresIn: args["expires-in"],
312
+ type: args.type,
313
+ context: args.context,
314
+ name: args.name,
315
+ id: args.value,
316
+ // For get/answer actions
317
+ answer: void 0,
318
+ json: args.json
319
+ };
320
+ switch (action) {
321
+ case "create":
322
+ return handleCreate(parsed);
323
+ case "list":
324
+ return handleList(parsed);
325
+ case "get":
326
+ return handleGet(parsed);
327
+ case "answer":
328
+ return handleAnswer(parsed);
329
+ case "pending":
330
+ return handlePending(parsed);
331
+ default:
332
+ printError(
333
+ `Unknown action "${action}". Must be one of: create, list, get, answer, pending`
334
+ );
335
+ process.exitCode = 1;
336
+ }
337
+ }
338
+ });
339
+ export {
340
+ decision_default as default
341
+ };
342
+ //# sourceMappingURL=decision-2BY7JK4O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/decision.ts"],"sourcesContent":["import type { Decision, DecisionOption } from \"@neotx/core\";\nimport { DecisionStore, getSupervisorDecisionsPath } from \"@neotx/core\";\nimport { defineCommand } from \"citty\";\nimport { printError, printJson, printSuccess, printTable } from \"../output.js\";\n\nconst DEFAULT_EXPIRES_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface ParsedArgs {\n action: string;\n value: string | undefined;\n question: string | undefined;\n options: string | undefined;\n defaultAnswer: string | undefined;\n expiresIn: string | undefined;\n type: string | undefined;\n context: string | undefined;\n name: string;\n id: string | undefined;\n answer: string | undefined;\n json: boolean;\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nfunction formatStatus(decision: Decision): string {\n if (decision.answer !== undefined) {\n return \"answered\";\n }\n if (decision.expiredAt !== undefined) {\n return \"expired\";\n }\n if (decision.expiresAt && decision.expiresAt < new Date().toISOString()) {\n return \"expired\";\n }\n return \"pending\";\n}\n\nfunction formatTimeAgo(timestamp: string): string {\n const ms = Date.now() - new Date(timestamp).getTime();\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n return `${hours}h ago`;\n}\n\nfunction parseDurationMs(input: string): number | undefined {\n const match = input.match(/^(\\d+)(h|m|d)$/);\n if (!match) return undefined;\n\n const value = Number(match[1]);\n const unit = match[2];\n switch (unit) {\n case \"d\":\n return value * 24 * 60 * 60 * 1000;\n case \"h\":\n return value * 60 * 60 * 1000;\n case \"m\":\n return value * 60 * 1000;\n default:\n return undefined;\n }\n}\n\nfunction parseOptions(optionsArg: string): DecisionOption[] | undefined {\n // Format: \"key1:label1,key2:label2\" or \"key1:label1:description1,key2:label2:description2\"\n if (!optionsArg.trim()) return undefined;\n\n const options: DecisionOption[] = [];\n const parts = optionsArg.split(\",\");\n\n for (const part of parts) {\n const segments = part.trim().split(\":\");\n const key = segments[0];\n const label = segments[1];\n if (!key || !label) {\n throw new Error(\n `Invalid option format: \"${part}\". Expected \"key:label\" or \"key:label:description\"`,\n );\n }\n const descParts = segments.slice(2);\n options.push({\n key: key.trim(),\n label: label.trim(),\n description: descParts.length > 0 ? descParts.join(\":\").trim() : undefined,\n });\n }\n\n return options.length > 0 ? options : undefined;\n}\n\nfunction openStore(name: string): DecisionStore {\n const filePath = getSupervisorDecisionsPath(name);\n return new DecisionStore(filePath);\n}\n\nasync function handleCreate(args: ParsedArgs): Promise<void> {\n if (!args.question) {\n printError(\n \"Usage: neo decision create <question> --options 'key1:label1,key2:label2' [--default <key>] [--expires-in 24h]\",\n );\n process.exitCode = 1;\n return;\n }\n\n let options: DecisionOption[] | undefined;\n if (args.options) {\n try {\n options = parseOptions(args.options);\n } catch (error) {\n printError(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n return;\n }\n }\n\n let expiresAt: string | undefined;\n if (args.expiresIn) {\n const ms = parseDurationMs(args.expiresIn);\n if (!ms) {\n printError('Invalid --expires-in format. Use e.g. \"24h\", \"30m\", or \"7d\".');\n process.exitCode = 1;\n return;\n }\n expiresAt = new Date(Date.now() + ms).toISOString();\n } else {\n // Default to 24 hours\n expiresAt = new Date(Date.now() + DEFAULT_EXPIRES_MS).toISOString();\n }\n\n const store = openStore(args.name);\n try {\n const id = await store.create({\n question: args.question,\n options,\n defaultAnswer: args.defaultAnswer,\n expiresAt,\n type: args.type ?? \"generic\",\n source: \"supervisor\",\n context: args.context,\n });\n printSuccess(`Decision created: ${id}`);\n console.log(id); // Output just the ID for easy parsing in scripts\n } catch (error) {\n printError(\n `Failed to create decision: ${error instanceof Error ? error.message : String(error)}`,\n );\n process.exitCode = 1;\n }\n}\n\nasync function handleList(args: ParsedArgs): Promise<void> {\n const store = openStore(args.name);\n const pending = await store.pending();\n\n if (args.json) {\n printJson(pending);\n return;\n }\n\n if (pending.length === 0) {\n console.log(\"No pending decisions.\");\n return;\n }\n\n printTable(\n [\"ID\", \"TYPE\", \"QUESTION\", \"SOURCE\", \"CREATED\"],\n pending.map((d) => [\n d.id.slice(0, 12),\n d.type,\n truncate(d.question, 50),\n d.source,\n formatTimeAgo(d.createdAt),\n ]),\n );\n}\n\nasync function handleGet(args: ParsedArgs): Promise<void> {\n if (!args.value) {\n printError(\"Usage: neo decision get <id>\");\n process.exitCode = 1;\n return;\n }\n\n const store = openStore(args.name);\n const decision = await store.get(args.value);\n\n if (!decision) {\n printError(`Decision not found: ${args.value}`);\n process.exitCode = 1;\n return;\n }\n\n if (args.json) {\n printJson(decision);\n return;\n }\n\n const status = formatStatus(decision);\n console.log(`ID: ${decision.id}`);\n console.log(`Status: ${status}`);\n console.log(`Type: ${decision.type}`);\n console.log(`Source: ${decision.source}`);\n console.log(`Created: ${decision.createdAt}`);\n console.log();\n console.log(`Question: ${decision.question}`);\n if (decision.context) {\n console.log();\n console.log(`Context:\\n${decision.context}`);\n }\n if (decision.options && decision.options.length > 0) {\n console.log();\n console.log(\"Options:\");\n for (const opt of decision.options) {\n console.log(` [${opt.key}] ${opt.label}${opt.description ? ` - ${opt.description}` : \"\"}`);\n }\n }\n if (decision.answer !== undefined) {\n console.log();\n console.log(`Answer: ${decision.answer}`);\n if (decision.answeredAt) {\n console.log(`Answered: ${decision.answeredAt}`);\n }\n }\n if (decision.defaultAnswer !== undefined) {\n console.log(`Default: ${decision.defaultAnswer}`);\n }\n if (decision.expiresAt) {\n console.log(`Expires: ${decision.expiresAt}`);\n }\n}\n\nasync function handleAnswer(args: ParsedArgs): Promise<void> {\n // Parse positional args from process.argv\n const argv = process.argv;\n const answerIdx = argv.indexOf(\"answer\");\n const idArg = argv[answerIdx + 1];\n const answerArg = argv[answerIdx + 2];\n\n if (!idArg || !answerArg) {\n printError(\"Usage: neo decision answer <id> <answer>\");\n process.exitCode = 1;\n return;\n }\n\n const store = openStore(args.name);\n\n try {\n await store.answer(idArg, answerArg);\n printSuccess(`Decision answered: ${idArg} → \"${answerArg}\"`);\n } catch (error) {\n printError(error instanceof Error ? error.message : \"Unknown error\");\n process.exitCode = 1;\n }\n}\n\nasync function handlePending(args: ParsedArgs): Promise<void> {\n const store = openStore(args.name);\n const pending = await store.pending();\n\n if (args.json) {\n printJson(pending);\n return;\n }\n\n if (pending.length === 0) {\n console.log(\"No pending decisions.\");\n return;\n }\n\n // Show more detailed view for pending decisions\n for (const d of pending) {\n console.log(`─────────────────────────────────────────`);\n console.log(`ID: ${d.id} (${formatTimeAgo(d.createdAt)})`);\n console.log(`Question: ${d.question}`);\n if (d.options && d.options.length > 0) {\n console.log(\"Options:\");\n for (const opt of d.options) {\n console.log(` [${opt.key}] ${opt.label}`);\n }\n }\n if (d.defaultAnswer) {\n console.log(`Default: ${d.defaultAnswer}`);\n }\n console.log();\n }\n console.log(`─────────────────────────────────────────`);\n console.log(`\\nAnswer with: neo decision answer <id> <answer>`);\n}\n\nexport default defineCommand({\n meta: {\n name: \"decision\",\n description: \"Manage supervisor decision gates\",\n },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: create, list, get, answer, pending\",\n required: true,\n },\n value: {\n type: \"positional\",\n description: \"Decision ID (for get/answer) or question text (for create)\",\n required: false,\n },\n options: {\n type: \"string\",\n alias: \"o\",\n description:\n 'Options in format \"key1:label1,key2:label2\" or \"key1:label1:desc1,key2:label2:desc2\"',\n },\n \"default-answer\": {\n type: \"string\",\n alias: \"d\",\n description: \"Default answer key (used if decision expires)\",\n },\n \"expires-in\": {\n type: \"string\",\n alias: \"e\",\n description: \"Expiration duration (e.g. 24h, 30m, 7d). Default: 24h\",\n },\n type: {\n type: \"string\",\n alias: \"t\",\n description: \"Decision type (default: generic)\",\n },\n context: {\n type: \"string\",\n alias: \"c\",\n description: \"Additional context for the decision\",\n },\n name: {\n type: \"string\",\n description: \"Supervisor name\",\n default: \"supervisor\",\n },\n json: {\n type: \"boolean\",\n description: \"Output as JSON\",\n default: false,\n },\n },\n async run({ args }) {\n const action = args.action as string;\n const parsed: ParsedArgs = {\n action,\n value: args.value as string | undefined,\n question: args.value as string | undefined, // For create action\n options: args.options as string | undefined,\n defaultAnswer: args[\"default-answer\"] as string | undefined,\n expiresIn: args[\"expires-in\"] as string | undefined,\n type: args.type as string | undefined,\n context: args.context as string | undefined,\n name: args.name as string,\n id: args.value as string | undefined, // For get/answer actions\n answer: undefined,\n json: args.json as boolean,\n };\n\n switch (action) {\n case \"create\":\n return handleCreate(parsed);\n case \"list\":\n return handleList(parsed);\n case \"get\":\n return handleGet(parsed);\n case \"answer\":\n return handleAnswer(parsed);\n case \"pending\":\n return handlePending(parsed);\n default:\n printError(\n `Unknown action \"${action}\". Must be one of: create, list, get, answer, pending`,\n );\n process.exitCode = 1;\n }\n },\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,23 @@
1
+ import {
2
+ resolveAgentsPackageDir
3
+ } from "./chunk-F622JUDY.js";
4
+
5
+ // src/commands/guide.ts
6
+ import { readFile } from "fs/promises";
7
+ import path from "path";
8
+ import { defineCommand } from "citty";
9
+ var guide_default = defineCommand({
10
+ meta: {
11
+ name: "guide",
12
+ description: "Print the AI integration guide for using neo"
13
+ },
14
+ async run() {
15
+ const guidePath = path.join(resolveAgentsPackageDir(), "GUIDE.md");
16
+ const content = await readFile(guidePath, "utf-8");
17
+ console.log(content);
18
+ }
19
+ });
20
+ export {
21
+ guide_default as default
22
+ };
23
+ //# sourceMappingURL=guide-UQRNA3FC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/guide.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { resolveAgentsPackageDir } from \"../resolve.js\";\n\nexport default defineCommand({\n meta: {\n name: \"guide\",\n description: \"Print the AI integration guide for using neo\",\n },\n async run() {\n const guidePath = path.join(resolveAgentsPackageDir(), \"GUIDE.md\");\n const content = await readFile(guidePath, \"utf-8\");\n console.log(content);\n },\n});\n"],"mappings":";;;;;AAAA,SAAS,gBAAgB;AACzB,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAG9B,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM,MAAM;AACV,UAAM,YAAY,KAAK,KAAK,wBAAwB,GAAG,UAAU;AACjE,UAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,YAAQ,IAAI,OAAO;AAAA,EACrB;AACF,CAAC;","names":[]}
package/dist/index.js CHANGED
@@ -9,18 +9,23 @@ var main = defineCommand({
9
9
  },
10
10
  subCommands: {
11
11
  init: () => import("./init-UYS6KS5U.js").then((m) => m.default),
12
- run: () => import("./run-QB2JHTLX.js").then((m) => m.default),
13
- runs: () => import("./runs-SSBMKO53.js").then((m) => m.default),
12
+ run: () => import("./run-OF53USMD.js").then((m) => m.default),
13
+ decision: () => import("./decision-2BY7JK4O.js").then((m) => m.default),
14
+ runs: () => import("./runs-TAASM3YF.js").then((m) => m.default),
14
15
  log: () => import("./log-PTHLI7ZN.js").then((m) => m.default),
15
16
  logs: () => import("./logs-AWNAMMJC.js").then((m) => m.default),
16
17
  cost: () => import("./cost-OQGFNBBG.js").then((m) => m.default),
18
+ config: () => import("./config-NYF6AJXU.js").then((m) => m.default),
17
19
  repos: () => import("./repos-GI6F72NO.js").then((m) => m.default),
18
20
  agents: () => import("./agents-PH3P7G7E.js").then((m) => m.default),
19
- supervise: () => import("./supervise-R3W7ZF33.js").then((m) => m.default),
21
+ supervise: () => import("./supervise-632LRYWF.js").then((m) => m.default),
22
+ supervisor: () => import("./supervisor-3RUX5SPH.js").then((m) => m.default),
20
23
  memory: () => import("./memory-6R22DFS7.js").then((m) => m.default),
21
24
  mcp: () => import("./mcp-XHZND5A4.js").then((m) => m.default),
25
+ guide: () => import("./guide-UQRNA3FC.js").then((m) => m.default),
22
26
  doctor: () => import("./doctor-ZBO73UID.js").then((m) => m.default),
23
- version: () => import("./version-XVOAMGDD.js").then((m) => m.default)
27
+ version: () => import("./version-XVOAMGDD.js").then((m) => m.default),
28
+ webhooks: () => import("./webhooks-PUKAHFHE.js").then((m) => m.default)
24
29
  }
25
30
  });
26
31
  runMain(main);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\n\nconst main = defineCommand({\n meta: {\n name: \"neo\",\n version: \"0.1.0\",\n description:\n \"Orchestrate autonomous developer agents with clone isolation, budget guards, and 3-level recovery. Run 'neo init' to get started.\",\n },\n subCommands: {\n init: () => import(\"./commands/init.js\").then((m) => m.default),\n run: () => import(\"./commands/run.js\").then((m) => m.default),\n runs: () => import(\"./commands/runs.js\").then((m) => m.default),\n log: () => import(\"./commands/log.js\").then((m) => m.default),\n logs: () => import(\"./commands/logs.js\").then((m) => m.default),\n cost: () => import(\"./commands/cost.js\").then((m) => m.default),\n repos: () => import(\"./commands/repos.js\").then((m) => m.default),\n agents: () => import(\"./commands/agents.js\").then((m) => m.default),\n supervise: () => import(\"./commands/supervise.js\").then((m) => m.default),\n memory: () => import(\"./commands/memory.js\").then((m) => m.default),\n mcp: () => import(\"./commands/mcp.js\").then((m) => m.default),\n doctor: () => import(\"./commands/doctor.js\").then((m) => m.default),\n version: () => import(\"./commands/version.js\").then((m) => m.default),\n },\n});\n\nrunMain(main);\n"],"mappings":";AAAA,SAAS,eAAe,eAAe;AAEvC,IAAM,OAAO,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACX,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,KAAK,MAAM,OAAO,mBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC5D,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,KAAK,MAAM,OAAO,mBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC5D,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,OAAO,MAAM,OAAO,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChE,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClE,WAAW,MAAM,OAAO,yBAAyB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACxE,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClE,KAAK,MAAM,OAAO,mBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC5D,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClE,SAAS,MAAM,OAAO,uBAAuB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACtE;AACF,CAAC;AAED,QAAQ,IAAI;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\n\nconst main = defineCommand({\n meta: {\n name: \"neo\",\n version: \"0.1.0\",\n description:\n \"Orchestrate autonomous developer agents with clone isolation, budget guards, and 3-level recovery. Run 'neo init' to get started.\",\n },\n subCommands: {\n init: () => import(\"./commands/init.js\").then((m) => m.default),\n run: () => import(\"./commands/run.js\").then((m) => m.default),\n decision: () => import(\"./commands/decision.js\").then((m) => m.default),\n runs: () => import(\"./commands/runs.js\").then((m) => m.default),\n log: () => import(\"./commands/log.js\").then((m) => m.default),\n logs: () => import(\"./commands/logs.js\").then((m) => m.default),\n cost: () => import(\"./commands/cost.js\").then((m) => m.default),\n config: () => import(\"./commands/config.js\").then((m) => m.default),\n repos: () => import(\"./commands/repos.js\").then((m) => m.default),\n agents: () => import(\"./commands/agents.js\").then((m) => m.default),\n supervise: () => import(\"./commands/supervise.js\").then((m) => m.default),\n supervisor: () => import(\"./commands/supervisor/index.js\").then((m) => m.default),\n memory: () => import(\"./commands/memory.js\").then((m) => m.default),\n mcp: () => import(\"./commands/mcp.js\").then((m) => m.default),\n guide: () => import(\"./commands/guide.js\").then((m) => m.default),\n doctor: () => import(\"./commands/doctor.js\").then((m) => m.default),\n version: () => import(\"./commands/version.js\").then((m) => m.default),\n webhooks: () => import(\"./commands/webhooks.js\").then((m) => m.default),\n },\n});\n\nrunMain(main);\n"],"mappings":";AAAA,SAAS,eAAe,eAAe;AAEvC,IAAM,OAAO,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACX,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,KAAK,MAAM,OAAO,mBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC5D,UAAU,MAAM,OAAO,wBAAwB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACtE,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,KAAK,MAAM,OAAO,mBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC5D,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,MAAM,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC9D,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClE,OAAO,MAAM,OAAO,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChE,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClE,WAAW,MAAM,OAAO,yBAAyB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACxE,YAAY,MAAM,OAAO,0BAAgC,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChF,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClE,KAAK,MAAM,OAAO,mBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC5D,OAAO,MAAM,OAAO,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChE,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClE,SAAS,MAAM,OAAO,uBAAuB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACpE,UAAU,MAAM,OAAO,wBAAwB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACxE;AACF,CAAC;AAED,QAAQ,IAAI;","names":[]}
@@ -78,7 +78,7 @@ async function runDetached(params) {
78
78
  const persistedRun = {
79
79
  version: 1,
80
80
  runId,
81
- workflow: `_run_${params.agentName}`,
81
+ agent: params.agentName,
82
82
  repo: params.repo,
83
83
  prompt: params.prompt,
84
84
  status: "running",
@@ -220,13 +220,6 @@ var run_default = defineCommand({
220
220
  }
221
221
  const orchestrator = new Orchestrator(config, { skipOrphanRecovery: true });
222
222
  orchestrator.registerAgent(agent);
223
- orchestrator.registerWorkflow({
224
- name: `_run_${args.agent}`,
225
- description: `Direct dispatch to ${args.agent}`,
226
- steps: {
227
- run: { agent: args.agent }
228
- }
229
- });
230
223
  if (!jsonOutput) {
231
224
  orchestrator.on("*", printProgress);
232
225
  }
@@ -234,7 +227,7 @@ var run_default = defineCommand({
234
227
  await orchestrator.start();
235
228
  const gitStrategy = args["git-strategy"];
236
229
  const result = await orchestrator.dispatch({
237
- workflow: `_run_${args.agent}`,
230
+ agent: args.agent,
238
231
  repo,
239
232
  prompt: args.prompt,
240
233
  ...args.branch ? { branch: args.branch } : {},
@@ -261,4 +254,4 @@ var run_default = defineCommand({
261
254
  export {
262
255
  run_default as default
263
256
  };
264
- //# sourceMappingURL=run-QB2JHTLX.js.map
257
+ //# sourceMappingURL=run-OF53USMD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/run.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { NeoEvent, PersistedRun } from \"@neotx/core\";\nimport {\n AgentRegistry,\n getRepoRunsDir,\n getRunDispatchPath,\n loadGlobalConfig,\n Orchestrator,\n toRepoSlug,\n} from \"@neotx/core\";\nimport { defineCommand } from \"citty\";\nimport { printError, printJson, printSuccess } from \"../output.js\";\nimport { resolveAgentsDir } from \"../resolve.js\";\n\nfunction printProgress(event: NeoEvent): void {\n const ts = event.timestamp.slice(11, 19);\n switch (event.type) {\n case \"session:start\":\n console.log(`[${ts}] ${event.agent}: starting`);\n break;\n case \"session:complete\":\n console.log(`[${ts}] session complete: $${event.costUsd.toFixed(4)}`);\n break;\n case \"session:fail\":\n console.log(`[${ts}] session failed: ${event.error}`);\n break;\n case \"cost:update\":\n break;\n case \"budget:alert\":\n console.log(`[${ts}] ⚠ Budget alert: ${event.utilizationPct.toFixed(0)}% used`);\n break;\n }\n}\n\nfunction parseMetadata(meta: string | undefined): Record<string, unknown> | undefined {\n if (!meta) return undefined;\n try {\n return JSON.parse(meta) as Record<string, unknown>;\n } catch {\n throw new Error(`Invalid --meta JSON: ${meta}`);\n }\n}\n\nfunction printResult(result: import(\"@neotx/core\").TaskResult, agentName: string): void {\n console.log(\"\");\n console.log(`Run: ${result.runId}`);\n console.log(`Agent: ${agentName}`);\n console.log(`Status: ${result.status}`);\n console.log(`Cost: $${result.costUsd.toFixed(4)}`);\n console.log(`Duration: ${(result.durationMs / 1000).toFixed(1)}s`);\n if (result.branch) {\n console.log(`Branch: ${result.branch}`);\n }\n if (result.prUrl) {\n console.log(`PR: ${result.prUrl}`);\n }\n\n const stepResult = Object.values(result.steps)[0];\n const output = stepResult?.output ?? result.summary;\n if (output) {\n console.log(\"\");\n console.log(typeof output === \"string\" ? output : JSON.stringify(output, null, 2));\n }\n}\n\ninterface DetachParams {\n agentName: string;\n repo: string;\n prompt: string;\n branch: string | undefined;\n priority: string;\n metadata: Record<string, unknown> | undefined;\n bundledAgentsDir: string;\n customAgentsDir: string | undefined;\n jsonOutput: boolean;\n}\n\nasync function runDetached(params: DetachParams): Promise<void> {\n const runId = randomUUID();\n const repoSlug = toRepoSlug({ path: params.repo });\n const runsDir = getRepoRunsDir(repoSlug);\n await mkdir(runsDir, { recursive: true });\n\n const persistedRun: PersistedRun = {\n version: 1,\n runId,\n agent: params.agentName,\n repo: params.repo,\n prompt: params.prompt,\n status: \"running\",\n steps: {},\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n metadata: params.metadata,\n };\n await writeFile(\n path.join(runsDir, `${runId}.json`),\n JSON.stringify(persistedRun, null, 2),\n \"utf-8\",\n );\n\n const dispatchPath = getRunDispatchPath(repoSlug, runId);\n await writeFile(\n dispatchPath,\n JSON.stringify({\n agentName: params.agentName,\n repo: params.repo,\n prompt: params.prompt,\n branch: params.branch,\n priority: params.priority,\n metadata: params.metadata,\n bundledAgentsDir: params.bundledAgentsDir,\n customAgentsDir: params.customAgentsDir,\n }),\n \"utf-8\",\n );\n\n const workerPath = path.join(path.dirname(fileURLToPath(import.meta.url)), \"daemon\", \"worker.js\");\n // Use spawn (not fork) so the child gets its own process group via detached: true.\n // fork() shares the parent's process group, so when the SDK kills the Bash\n // process tree the worker dies too.\n const child = spawn(process.execPath, [workerPath, runId, repoSlug], {\n detached: true,\n stdio: \"ignore\",\n env: process.env,\n });\n child.unref();\n\n // Write PID to persisted run immediately so other workers' recoverOrphanedRuns()\n // can see this process is alive (prevents false orphan detection on concurrent launches)\n if (child.pid) {\n const runFilePath = path.join(runsDir, `${runId}.json`);\n try {\n const raw = await readFile(runFilePath, \"utf-8\");\n const run = JSON.parse(raw) as PersistedRun;\n run.pid = child.pid;\n await writeFile(runFilePath, JSON.stringify(run, null, 2), \"utf-8\");\n } catch {\n // Non-critical — worker will write PID on startup anyway\n }\n }\n\n if (params.jsonOutput) {\n printJson({ runId, status: \"detached\", pid: child.pid });\n } else {\n printSuccess(`Detached run started: ${runId}`);\n console.log(` PID: ${String(child.pid)}`);\n console.log(` Logs: neo logs -f ${runId}`);\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"run\",\n description: \"Dispatch an agent to execute a task in an isolated clone\",\n },\n args: {\n agent: {\n type: \"positional\",\n description: \"Agent name to run (e.g. developer, architect, reviewer-quality)\",\n required: true,\n },\n repo: {\n type: \"string\",\n description: \"Target repository path\",\n default: \".\",\n },\n prompt: {\n type: \"string\",\n description: \"Task description for the agent\",\n required: true,\n },\n branch: {\n type: \"string\",\n description: \"Branch name for the session clone (required for writable agents)\",\n },\n priority: {\n type: \"string\",\n description: \"Priority level: critical, high, medium, low\",\n },\n meta: {\n type: \"string\",\n description: \"Metadata as JSON string (for traceability: ticketId, stage, etc.)\",\n },\n output: {\n type: \"string\",\n description: \"Output format: json\",\n },\n detach: {\n type: \"boolean\",\n alias: \"d\",\n description: \"Run in background and return immediately with the run ID\",\n default: true,\n },\n sync: {\n type: \"boolean\",\n alias: \"s\",\n description: \"Run in foreground (blocking) instead of detached\",\n default: false,\n },\n \"git-strategy\": {\n type: \"string\",\n description: \"Git strategy: pr (create PR), branch (push only, default)\",\n },\n },\n async run({ args }) {\n const jsonOutput = args.output === \"json\";\n\n // Zero-config: only need global config (auto-creates ~/.neo/config.yml if absent)\n const config = await loadGlobalConfig();\n const repo = path.resolve(args.repo);\n\n // Load agent registry (bundled + project-local agents)\n const bundledAgentsDir = resolveAgentsDir();\n const customAgentsDir = path.resolve(\".neo/agents\");\n const agentRegistry = new AgentRegistry(\n bundledAgentsDir,\n existsSync(customAgentsDir) ? customAgentsDir : undefined,\n );\n await agentRegistry.load();\n\n // Validate agent exists\n const agent = agentRegistry.get(args.agent);\n if (!agent) {\n const available = agentRegistry\n .list()\n .map((a) => a.name)\n .join(\", \");\n printError(`Agent \"${args.agent}\" not found. Available: ${available}`);\n process.exitCode = 1;\n return;\n }\n\n if (args.detach && !args.sync) {\n await runDetached({\n agentName: args.agent,\n repo,\n prompt: args.prompt,\n branch: args.branch,\n priority: args.priority ?? \"medium\",\n metadata: parseMetadata(args.meta),\n bundledAgentsDir,\n customAgentsDir: existsSync(customAgentsDir) ? customAgentsDir : undefined,\n jsonOutput,\n });\n return;\n }\n\n // ─── Foreground mode (default) ──────────────────────\n const orchestrator = new Orchestrator(config, { skipOrphanRecovery: true });\n orchestrator.registerAgent(agent);\n\n if (!jsonOutput) {\n orchestrator.on(\"*\", printProgress);\n }\n\n try {\n await orchestrator.start();\n\n const gitStrategy = args[\"git-strategy\"] as \"pr\" | \"branch\" | undefined;\n const result = await orchestrator.dispatch({\n agent: args.agent,\n repo,\n prompt: args.prompt,\n ...(args.branch ? { branch: args.branch } : {}),\n priority: (args.priority as \"critical\" | \"high\" | \"medium\" | \"low\") ?? \"medium\",\n metadata: parseMetadata(args.meta),\n ...(gitStrategy ? { gitStrategy } : {}),\n });\n\n if (jsonOutput) {\n printJson(result);\n } else {\n printResult(result, args.agent);\n }\n\n await orchestrator.shutdown();\n if (result.status !== \"success\") {\n process.exitCode = 1;\n }\n } catch (error) {\n await orchestrator.shutdown();\n printError(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n },\n});\n"],"mappings":";;;;;;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,OAAO,UAAU,iBAAiB;AAC3C,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAI9B,SAAS,cAAc,OAAuB;AAC5C,QAAM,KAAK,MAAM,UAAU,MAAM,IAAI,EAAE;AACvC,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,cAAQ,IAAI,IAAI,EAAE,KAAK,MAAM,KAAK,YAAY;AAC9C;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,IAAI,EAAE,wBAAwB,MAAM,QAAQ,QAAQ,CAAC,CAAC,EAAE;AACpE;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,IAAI,EAAE,qBAAqB,MAAM,KAAK,EAAE;AACpD;AAAA,IACF,KAAK;AACH;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,IAAI,EAAE,0BAAqB,MAAM,eAAe,QAAQ,CAAC,CAAC,QAAQ;AAC9E;AAAA,EACJ;AACF;AAEA,SAAS,cAAc,MAA+D;AACpF,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,MAAM,wBAAwB,IAAI,EAAE;AAAA,EAChD;AACF;AAEA,SAAS,YAAY,QAA0C,WAAyB;AACtF,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,aAAa,OAAO,KAAK,EAAE;AACvC,UAAQ,IAAI,aAAa,SAAS,EAAE;AACpC,UAAQ,IAAI,aAAa,OAAO,MAAM,EAAE;AACxC,UAAQ,IAAI,cAAc,OAAO,QAAQ,QAAQ,CAAC,CAAC,EAAE;AACrD,UAAQ,IAAI,cAAc,OAAO,aAAa,KAAM,QAAQ,CAAC,CAAC,GAAG;AACjE,MAAI,OAAO,QAAQ;AACjB,YAAQ,IAAI,aAAa,OAAO,MAAM,EAAE;AAAA,EAC1C;AACA,MAAI,OAAO,OAAO;AAChB,YAAQ,IAAI,aAAa,OAAO,KAAK,EAAE;AAAA,EACzC;AAEA,QAAM,aAAa,OAAO,OAAO,OAAO,KAAK,EAAE,CAAC;AAChD,QAAM,SAAS,YAAY,UAAU,OAAO;AAC5C,MAAI,QAAQ;AACV,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EACnF;AACF;AAcA,eAAe,YAAY,QAAqC;AAC9D,QAAM,QAAQ,WAAW;AACzB,QAAM,WAAW,WAAW,EAAE,MAAM,OAAO,KAAK,CAAC;AACjD,QAAM,UAAU,eAAe,QAAQ;AACvC,QAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAExC,QAAM,eAA6B;AAAA,IACjC,SAAS;AAAA,IACT;AAAA,IACA,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO;AAAA,IACf,QAAQ;AAAA,IACR,OAAO,CAAC;AAAA,IACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,UAAU,OAAO;AAAA,EACnB;AACA,QAAM;AAAA,IACJ,KAAK,KAAK,SAAS,GAAG,KAAK,OAAO;AAAA,IAClC,KAAK,UAAU,cAAc,MAAM,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,eAAe,mBAAmB,UAAU,KAAK;AACvD,QAAM;AAAA,IACJ;AAAA,IACA,KAAK,UAAU;AAAA,MACb,WAAW,OAAO;AAAA,MAClB,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,kBAAkB,OAAO;AAAA,MACzB,iBAAiB,OAAO;AAAA,IAC1B,CAAC;AAAA,IACD;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,UAAU,WAAW;AAIhG,QAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,YAAY,OAAO,QAAQ,GAAG;AAAA,IACnE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK,QAAQ;AAAA,EACf,CAAC;AACD,QAAM,MAAM;AAIZ,MAAI,MAAM,KAAK;AACb,UAAM,cAAc,KAAK,KAAK,SAAS,GAAG,KAAK,OAAO;AACtD,QAAI;AACF,YAAM,MAAM,MAAM,SAAS,aAAa,OAAO;AAC/C,YAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,UAAI,MAAM,MAAM;AAChB,YAAM,UAAU,aAAa,KAAK,UAAU,KAAK,MAAM,CAAC,GAAG,OAAO;AAAA,IACpE,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,OAAO,YAAY;AACrB,cAAU,EAAE,OAAO,QAAQ,YAAY,KAAK,MAAM,IAAI,CAAC;AAAA,EACzD,OAAO;AACL,iBAAa,yBAAyB,KAAK,EAAE;AAC7C,YAAQ,IAAI,WAAW,OAAO,MAAM,GAAG,CAAC,EAAE;AAC1C,YAAQ,IAAI,uBAAuB,KAAK,EAAE;AAAA,EAC5C;AACF;AAEA,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,aAAa,KAAK,WAAW;AAGnC,UAAM,SAAS,MAAM,iBAAiB;AACtC,UAAM,OAAO,KAAK,QAAQ,KAAK,IAAI;AAGnC,UAAM,mBAAmB,iBAAiB;AAC1C,UAAM,kBAAkB,KAAK,QAAQ,aAAa;AAClD,UAAM,gBAAgB,IAAI;AAAA,MACxB;AAAA,MACA,WAAW,eAAe,IAAI,kBAAkB;AAAA,IAClD;AACA,UAAM,cAAc,KAAK;AAGzB,UAAM,QAAQ,cAAc,IAAI,KAAK,KAAK;AAC1C,QAAI,CAAC,OAAO;AACV,YAAM,YAAY,cACf,KAAK,EACL,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI;AACZ,iBAAW,UAAU,KAAK,KAAK,2BAA2B,SAAS,EAAE;AACrE,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,KAAK,UAAU,CAAC,KAAK,MAAM;AAC7B,YAAM,YAAY;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK,YAAY;AAAA,QAC3B,UAAU,cAAc,KAAK,IAAI;AAAA,QACjC;AAAA,QACA,iBAAiB,WAAW,eAAe,IAAI,kBAAkB;AAAA,QACjE;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAGA,UAAM,eAAe,IAAI,aAAa,QAAQ,EAAE,oBAAoB,KAAK,CAAC;AAC1E,iBAAa,cAAc,KAAK;AAEhC,QAAI,CAAC,YAAY;AACf,mBAAa,GAAG,KAAK,aAAa;AAAA,IACpC;AAEA,QAAI;AACF,YAAM,aAAa,MAAM;AAEzB,YAAM,cAAc,KAAK,cAAc;AACvC,YAAM,SAAS,MAAM,aAAa,SAAS;AAAA,QACzC,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,QAC7C,UAAW,KAAK,YAAuD;AAAA,QACvE,UAAU,cAAc,KAAK,IAAI;AAAA,QACjC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,MACvC,CAAC;AAED,UAAI,YAAY;AACd,kBAAU,MAAM;AAAA,MAClB,OAAO;AACL,oBAAY,QAAQ,KAAK,KAAK;AAAA,MAChC;AAEA,YAAM,aAAa,SAAS;AAC5B,UAAI,OAAO,WAAW,WAAW;AAC/B,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,aAAa,SAAS;AAC5B,iBAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACjE,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -27,10 +27,9 @@ function repoName(run) {
27
27
  return run.repo.split("/").pop() ?? run.repo;
28
28
  }
29
29
  function agentName(run) {
30
+ if (run.agent) return run.agent;
30
31
  const stepAgent = Object.values(run.steps)[0]?.agent;
31
- if (stepAgent) return stepAgent;
32
- if (run.workflow.startsWith("_run_")) return run.workflow.slice(5);
33
- return run.workflow;
32
+ return stepAgent ?? "unknown";
34
33
  }
35
34
  function showRunDetail(match, short) {
36
35
  if (short) {
@@ -178,4 +177,4 @@ var runs_default = defineCommand({
178
177
  export {
179
178
  runs_default as default
180
179
  };
181
- //# sourceMappingURL=runs-SSBMKO53.js.map
180
+ //# sourceMappingURL=runs-TAASM3YF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/runs.ts"],"sourcesContent":["import type { PersistedRun } from \"@neotx/core\";\nimport { defineCommand } from \"citty\";\nimport { printError, printJson, printTable } from \"../output.js\";\nimport { loadRunsFiltered, resolveRepoFilter } from \"../repo-filter.js\";\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction totalCost(run: PersistedRun): number {\n return Object.values(run.steps).reduce((sum, s) => sum + s.costUsd, 0);\n}\n\nfunction totalDuration(run: PersistedRun): number {\n return Object.values(run.steps).reduce((sum, s) => sum + s.durationMs, 0);\n}\n\nfunction shortId(runId: string): string {\n return runId.slice(0, 8);\n}\n\nfunction repoName(run: PersistedRun): string {\n return run.repo.split(\"/\").pop() ?? run.repo;\n}\n\nfunction agentName(run: PersistedRun): string {\n // First try the step's agent field (available after step starts)\n const stepAgent = Object.values(run.steps)[0]?.agent;\n if (stepAgent) return stepAgent;\n\n // Fall back to extracting from workflow name (e.g. \"_run_reviewer\" → \"reviewer\")\n if (run.workflow.startsWith(\"_run_\")) return run.workflow.slice(5);\n\n return run.workflow;\n}\n\nfunction showRunDetail(match: PersistedRun, short: boolean): void {\n if (short) {\n console.log(`${match.runId} ${match.status} $${totalCost(match).toFixed(4)}`);\n for (const [name, step] of Object.entries(match.steps)) {\n const out = typeof step.output === \"string\" ? step.output.slice(0, 200) : \"\";\n console.log(` ${name}: ${step.status} ${step.agent} ${out}`);\n }\n return;\n }\n\n console.log(`Run: ${match.runId}`);\n console.log(`Status: ${match.status}`);\n console.log(`Repo: ${match.repo}`);\n console.log(`Prompt: ${match.prompt}`);\n if (match.branch) console.log(`Branch: ${match.branch}`);\n console.log(`Cost: $${totalCost(match).toFixed(4)}`);\n console.log(`Duration: ${formatDuration(totalDuration(match))}`);\n console.log(`Created: ${match.createdAt}`);\n console.log(\"\");\n for (const [name, step] of Object.entries(match.steps)) {\n console.log(`Step: ${name}`);\n console.log(` Agent: ${step.agent}`);\n console.log(` Status: ${step.status}`);\n console.log(` Cost: $${step.costUsd.toFixed(4)}`);\n console.log(` Duration: ${formatDuration(step.durationMs)}`);\n if (step.error) console.log(` Error: ${step.error}`);\n if (step.output) {\n const out = typeof step.output === \"string\" ? step.output : JSON.stringify(step.output);\n console.log(` Output: ${out}`);\n }\n }\n}\n\nfunction listRuns(runs: PersistedRun[], short: boolean): void {\n if (short) {\n for (const r of runs) {\n const agent = Object.values(r.steps)[0]?.agent ?? \"?\";\n console.log(\n `${shortId(r.runId)} ${r.status.padEnd(9)} ${repoName(r).padEnd(14)} ${agent.padEnd(18)} $${totalCost(r).toFixed(4).padStart(8)} ${formatDuration(totalDuration(r)).padStart(7)}`,\n );\n }\n return;\n }\n\n if (runs.length === 0) {\n console.log(\"No runs found.\");\n return;\n }\n\n printTable(\n [\"RUN\", \"STATUS\", \"REPO\", \"AGENT\", \"COST\", \"DURATION\", \"BRANCH\"],\n runs.map((r) => [\n shortId(r.runId),\n r.status,\n repoName(r),\n agentName(r),\n `$${totalCost(r).toFixed(4)}`,\n formatDuration(totalDuration(r)),\n r.branch?.replace(\"feat/run-\", \"\").slice(0, 8) ?? \"-\",\n ]),\n );\n}\n\nexport default defineCommand({\n meta: {\n name: \"runs\",\n description: \"List runs or show details of a specific run\",\n },\n args: {\n runId: {\n type: \"positional\",\n description: \"Run ID to show details (omit to list all runs)\",\n required: false,\n },\n repo: {\n type: \"string\",\n description: \"Filter by repo name or path\",\n },\n last: {\n type: \"string\",\n description: \"Show only the last N runs\",\n },\n status: {\n type: \"string\",\n description: \"Filter by status: completed, failed, running\",\n },\n short: {\n type: \"boolean\",\n description: \"Compact output for supervisor agents (saves tokens)\",\n default: false,\n },\n output: {\n type: \"string\",\n description: \"Output format: json\",\n },\n },\n async run({ args }) {\n const jsonOutput = args.output === \"json\";\n const filter = await resolveRepoFilter({ repo: args.repo });\n let runs = await loadRunsFiltered(filter);\n\n if (runs.length === 0) {\n if (!jsonOutput) {\n printError(\"No runs found. Run 'neo run <agent>' first.\");\n } else {\n printJson([]);\n }\n return;\n }\n\n // If a runId is given (full or prefix), show details\n if (args.runId) {\n const match = runs.find(\n (r) => r.runId === args.runId || r.runId.startsWith(args.runId as string),\n );\n if (!match) {\n printError(`Run \"${args.runId}\" not found.`);\n process.exitCode = 1;\n return;\n }\n\n if (jsonOutput) {\n printJson(match);\n return;\n }\n\n showRunDetail(match, args.short);\n return;\n }\n\n // List mode\n if (args.status) {\n runs = runs.filter((r) => r.status === args.status);\n }\n\n if (args.last) {\n runs = runs.slice(0, Number(args.last));\n }\n\n if (jsonOutput) {\n printJson(\n runs.map((r) => ({\n runId: r.runId,\n status: r.status,\n repo: r.repo,\n agent: agentName(r),\n costUsd: totalCost(r),\n durationMs: totalDuration(r),\n branch: r.branch,\n updatedAt: r.updatedAt,\n })),\n );\n return;\n }\n\n listRuns(runs, args.short);\n },\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/runs.ts"],"sourcesContent":["import type { PersistedRun } from \"@neotx/core\";\nimport { defineCommand } from \"citty\";\nimport { printError, printJson, printTable } from \"../output.js\";\nimport { loadRunsFiltered, resolveRepoFilter } from \"../repo-filter.js\";\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction totalCost(run: PersistedRun): number {\n return Object.values(run.steps).reduce((sum, s) => sum + s.costUsd, 0);\n}\n\nfunction totalDuration(run: PersistedRun): number {\n return Object.values(run.steps).reduce((sum, s) => sum + s.durationMs, 0);\n}\n\nfunction shortId(runId: string): string {\n return runId.slice(0, 8);\n}\n\nfunction repoName(run: PersistedRun): string {\n return run.repo.split(\"/\").pop() ?? run.repo;\n}\n\nfunction agentName(run: PersistedRun): string {\n // Use run.agent directly (new schema)\n if (run.agent) return run.agent;\n\n // Fall back to step's agent field for older runs\n const stepAgent = Object.values(run.steps)[0]?.agent;\n return stepAgent ?? \"unknown\";\n}\n\nfunction showRunDetail(match: PersistedRun, short: boolean): void {\n if (short) {\n console.log(`${match.runId} ${match.status} $${totalCost(match).toFixed(4)}`);\n for (const [name, step] of Object.entries(match.steps)) {\n const out = typeof step.output === \"string\" ? step.output.slice(0, 200) : \"\";\n console.log(` ${name}: ${step.status} ${step.agent} ${out}`);\n }\n return;\n }\n\n console.log(`Run: ${match.runId}`);\n console.log(`Status: ${match.status}`);\n console.log(`Repo: ${match.repo}`);\n console.log(`Prompt: ${match.prompt}`);\n if (match.branch) console.log(`Branch: ${match.branch}`);\n console.log(`Cost: $${totalCost(match).toFixed(4)}`);\n console.log(`Duration: ${formatDuration(totalDuration(match))}`);\n console.log(`Created: ${match.createdAt}`);\n console.log(\"\");\n for (const [name, step] of Object.entries(match.steps)) {\n console.log(`Step: ${name}`);\n console.log(` Agent: ${step.agent}`);\n console.log(` Status: ${step.status}`);\n console.log(` Cost: $${step.costUsd.toFixed(4)}`);\n console.log(` Duration: ${formatDuration(step.durationMs)}`);\n if (step.error) console.log(` Error: ${step.error}`);\n if (step.output) {\n const out = typeof step.output === \"string\" ? step.output : JSON.stringify(step.output);\n console.log(` Output: ${out}`);\n }\n }\n}\n\nfunction listRuns(runs: PersistedRun[], short: boolean): void {\n if (short) {\n for (const r of runs) {\n const agent = Object.values(r.steps)[0]?.agent ?? \"?\";\n console.log(\n `${shortId(r.runId)} ${r.status.padEnd(9)} ${repoName(r).padEnd(14)} ${agent.padEnd(18)} $${totalCost(r).toFixed(4).padStart(8)} ${formatDuration(totalDuration(r)).padStart(7)}`,\n );\n }\n return;\n }\n\n if (runs.length === 0) {\n console.log(\"No runs found.\");\n return;\n }\n\n printTable(\n [\"RUN\", \"STATUS\", \"REPO\", \"AGENT\", \"COST\", \"DURATION\", \"BRANCH\"],\n runs.map((r) => [\n shortId(r.runId),\n r.status,\n repoName(r),\n agentName(r),\n `$${totalCost(r).toFixed(4)}`,\n formatDuration(totalDuration(r)),\n r.branch?.replace(\"feat/run-\", \"\").slice(0, 8) ?? \"-\",\n ]),\n );\n}\n\nexport default defineCommand({\n meta: {\n name: \"runs\",\n description: \"List runs or show details of a specific run\",\n },\n args: {\n runId: {\n type: \"positional\",\n description: \"Run ID to show details (omit to list all runs)\",\n required: false,\n },\n repo: {\n type: \"string\",\n description: \"Filter by repo name or path\",\n },\n last: {\n type: \"string\",\n description: \"Show only the last N runs\",\n },\n status: {\n type: \"string\",\n description: \"Filter by status: completed, failed, running\",\n },\n short: {\n type: \"boolean\",\n description: \"Compact output for supervisor agents (saves tokens)\",\n default: false,\n },\n output: {\n type: \"string\",\n description: \"Output format: json\",\n },\n },\n async run({ args }) {\n const jsonOutput = args.output === \"json\";\n const filter = await resolveRepoFilter({ repo: args.repo });\n let runs = await loadRunsFiltered(filter);\n\n if (runs.length === 0) {\n if (!jsonOutput) {\n printError(\"No runs found. Run 'neo run <agent>' first.\");\n } else {\n printJson([]);\n }\n return;\n }\n\n // If a runId is given (full or prefix), show details\n if (args.runId) {\n const match = runs.find(\n (r) => r.runId === args.runId || r.runId.startsWith(args.runId as string),\n );\n if (!match) {\n printError(`Run \"${args.runId}\" not found.`);\n process.exitCode = 1;\n return;\n }\n\n if (jsonOutput) {\n printJson(match);\n return;\n }\n\n showRunDetail(match, args.short);\n return;\n }\n\n // List mode\n if (args.status) {\n runs = runs.filter((r) => r.status === args.status);\n }\n\n if (args.last) {\n runs = runs.slice(0, Number(args.last));\n }\n\n if (jsonOutput) {\n printJson(\n runs.map((r) => ({\n runId: r.runId,\n status: r.status,\n repo: r.repo,\n agent: agentName(r),\n costUsd: totalCost(r),\n durationMs: totalDuration(r),\n branch: r.branch,\n updatedAt: r.updatedAt,\n })),\n );\n return;\n }\n\n listRuns(runs, args.short);\n },\n});\n"],"mappings":"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","names":[]}