@oxgeneral/orch 0.2.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/dist/App-CPQPQTZU.js +4751 -0
  3. package/dist/agent-J62U7ABO.js +157 -0
  4. package/dist/chunk-2B32FPEB.js +11 -0
  5. package/dist/chunk-2B32FPEB.js.map +1 -0
  6. package/dist/chunk-2VSAM7RH.js +166 -0
  7. package/dist/chunk-33QNTNR6.js +46 -0
  8. package/dist/chunk-45K2XID7.js +29 -0
  9. package/dist/chunk-6GFVB6EK.js +101 -0
  10. package/dist/chunk-6HENRUYZ.js +2 -0
  11. package/dist/chunk-6HENRUYZ.js.map +1 -0
  12. package/dist/chunk-AELEEEV3.js +92 -0
  13. package/dist/chunk-AELEEEV3.js.map +1 -0
  14. package/dist/chunk-CHIP7O6V.js +83 -0
  15. package/dist/chunk-CIIE6LNG.js +217 -0
  16. package/dist/chunk-E3TCKHU6.js +13 -0
  17. package/dist/chunk-E3TCKHU6.js.map +1 -0
  18. package/dist/chunk-ED47GL3F.js +29 -0
  19. package/dist/chunk-HNKJ4IF7.js +177 -0
  20. package/dist/chunk-HXYAZGLP.js +15 -0
  21. package/dist/chunk-IRN2U2NE.js +79 -0
  22. package/dist/chunk-IZYSGYXG.js +2 -0
  23. package/dist/chunk-IZYSGYXG.js.map +1 -0
  24. package/dist/chunk-O5AO5QIR.js +76 -0
  25. package/dist/chunk-P6ATSXGL.js +107 -0
  26. package/dist/chunk-PBFE5V3G.js +2 -0
  27. package/dist/chunk-PBFE5V3G.js.map +1 -0
  28. package/dist/chunk-PNE6LQRF.js +5 -0
  29. package/dist/chunk-POUC4CPC.js +2 -0
  30. package/dist/chunk-POUC4CPC.js.map +1 -0
  31. package/dist/chunk-TX7WOFCW.js +59 -0
  32. package/dist/chunk-VTA74YWX.js +291 -0
  33. package/dist/chunk-XI4TU6VU.js +50 -0
  34. package/dist/chunk-ZU6AY2VU.js +2 -0
  35. package/dist/chunk-ZU6AY2VU.js.map +1 -0
  36. package/dist/claude-GH6P2DC5.js +4 -0
  37. package/dist/claude-S47YTIHU.js +2 -0
  38. package/dist/claude-S47YTIHU.js.map +1 -0
  39. package/dist/cli.js +205 -0
  40. package/dist/codex-2CH57B7G.js +2 -0
  41. package/dist/codex-2CH57B7G.js.map +1 -0
  42. package/dist/codex-U7LTJTX6.js +115 -0
  43. package/dist/config-VN4MYHSY.js +75 -0
  44. package/dist/container-74P43KDY.js +1532 -0
  45. package/dist/context-EPHCF34F.js +83 -0
  46. package/dist/cursor-3DI5GKRF.js +92 -0
  47. package/dist/cursor-QFUNKPCQ.js +2 -0
  48. package/dist/cursor-QFUNKPCQ.js.map +1 -0
  49. package/dist/doctor-BK46WCQ5.js +67 -0
  50. package/dist/doctor-service-A34DHPKI.js +2 -0
  51. package/dist/doctor-service-NTWBWOM2.js +2 -0
  52. package/dist/doctor-service-NTWBWOM2.js.map +1 -0
  53. package/dist/goal-KGAIM3ZK.js +110 -0
  54. package/dist/index.d.ts +1356 -0
  55. package/dist/index.js +6 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/init-QBWCEDCI.js +152 -0
  58. package/dist/logs-PYEKMQE2.js +207 -0
  59. package/dist/msg-BBIPCGDO.js +95 -0
  60. package/dist/orchestrator-TAFBYQQ5.js +2 -0
  61. package/dist/orchestrator-TAFBYQQ5.js.map +1 -0
  62. package/dist/orchestrator-VGYKSOZJ.js +1292 -0
  63. package/dist/output-5VQVCJ2K.js +2 -0
  64. package/dist/process-manager-HUVNAPQV.js +2 -0
  65. package/dist/process-manager-TLZOTO4Y.js +2 -0
  66. package/dist/process-manager-TLZOTO4Y.js.map +1 -0
  67. package/dist/registry-PQWRVNF2.js +2 -0
  68. package/dist/registry-UQAHK77P.js +2 -0
  69. package/dist/registry-UQAHK77P.js.map +1 -0
  70. package/dist/run-4GSZFGQZ.js +95 -0
  71. package/dist/shell-5ZNXFGXV.js +3 -0
  72. package/dist/shell-OGTSH4RJ.js +3 -0
  73. package/dist/shell-OGTSH4RJ.js.map +1 -0
  74. package/dist/status-KIISF542.js +56 -0
  75. package/dist/task-NUCRHYW7.js +209 -0
  76. package/dist/team-IBUP5XV4.js +97 -0
  77. package/dist/template-engine-322SCRR6.js +2 -0
  78. package/dist/template-engine-322SCRR6.js.map +1 -0
  79. package/dist/template-engine-3CDRZNMJ.js +3 -0
  80. package/dist/tui-WWZA73IO.js +225 -0
  81. package/dist/update-RJ4IYACQ.js +64 -0
  82. package/dist/update-check-4RV7Z6WT.js +2 -0
  83. package/dist/workspace-manager-47KI7B27.js +179 -0
  84. package/dist/workspace-manager-7M46ESUL.js +2 -0
  85. package/dist/workspace-manager-7M46ESUL.js.map +1 -0
  86. package/package.json +79 -0
  87. package/readme.md +270 -0
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+ import { printSuccess, printError, dim, formatDurationSince, printTable } from './chunk-2VSAM7RH.js';
3
+
4
+ // src/cli/commands/context.ts
5
+ function registerContextCommand(program, container) {
6
+ const ctx = program.command("context").description("Shared context store for inter-agent data exchange");
7
+ ctx.command("set <key> <value>").description("Set a shared context entry").option("--ttl <ms>", "Time-to-live in milliseconds").action(async (key, value, opts) => {
8
+ await container.paths.requireInit();
9
+ const ttlMs = opts.ttl ? parseInt(opts.ttl, 10) : void 0;
10
+ await container.contextStore.set(key, value, ttlMs);
11
+ if (container.context.json) {
12
+ const entry = await container.contextStore.get(key);
13
+ console.log(JSON.stringify(entry, null, 2));
14
+ } else if (container.context.quiet) {
15
+ console.log(key);
16
+ } else {
17
+ printSuccess(`Set context "${key}"`);
18
+ }
19
+ });
20
+ ctx.command("get <key>").description("Get a shared context entry").action(async (key) => {
21
+ await container.paths.requireInit();
22
+ const entry = await container.contextStore.get(key);
23
+ if (!entry) {
24
+ if (container.context.json) {
25
+ console.log("null");
26
+ } else {
27
+ printError(`Context key "${key}" not found`);
28
+ }
29
+ return;
30
+ }
31
+ if (container.context.json) {
32
+ console.log(JSON.stringify(entry, null, 2));
33
+ } else if (container.context.quiet) {
34
+ console.log(entry.value);
35
+ } else {
36
+ console.log(`
37
+ ${key} = ${entry.value}`);
38
+ if (entry.expires_at) {
39
+ console.log(` ${dim(`expires: ${entry.expires_at}`)}`);
40
+ }
41
+ console.log();
42
+ }
43
+ });
44
+ ctx.command("list").description("List all shared context entries").action(async () => {
45
+ await container.paths.requireInit();
46
+ const entries = await container.contextStore.list();
47
+ if (container.context.json) {
48
+ console.log(JSON.stringify(entries, null, 2));
49
+ return;
50
+ }
51
+ if (container.context.quiet) {
52
+ entries.forEach((e) => console.log(`${e.key}=${e.value}`));
53
+ return;
54
+ }
55
+ if (entries.length === 0) {
56
+ console.log(`
57
+ No shared context entries. Set one: ${dim("orch context set key value")}
58
+ `);
59
+ return;
60
+ }
61
+ const headers = ["KEY", "VALUE", "UPDATED", "TTL"];
62
+ const rows = entries.map((e) => [
63
+ e.key,
64
+ e.value.length > 50 ? e.value.slice(0, 47) + "..." : e.value,
65
+ formatDurationSince(e.updated_at),
66
+ e.expires_at ? formatDurationSince(e.expires_at) : dim("\u2014")
67
+ ]);
68
+ console.log();
69
+ printTable(headers, rows);
70
+ console.log(`
71
+ ${entries.length} entries
72
+ `);
73
+ });
74
+ ctx.command("delete <key>").description("Delete a shared context entry").action(async (key) => {
75
+ await container.paths.requireInit();
76
+ await container.contextStore.delete(key);
77
+ if (!container.context.quiet && !container.context.json) {
78
+ printSuccess(`Deleted context "${key}"`);
79
+ }
80
+ });
81
+ }
82
+
83
+ export { registerContextCommand };
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env node
2
+ import { createStreamingEvents, extractTokens } from './chunk-TX7WOFCW.js';
3
+ import './chunk-CHIP7O6V.js';
4
+ import { execFile } from 'child_process';
5
+ import { promisify } from 'util';
6
+
7
+ var execFileAsync = promisify(execFile);
8
+ async function findCommand() {
9
+ for (const cmd of ["cursor-agent", "agent"]) {
10
+ try {
11
+ const { stdout } = await execFileAsync(cmd, ["--version"]);
12
+ return { command: cmd, version: stdout.trim() };
13
+ } catch {
14
+ }
15
+ }
16
+ return null;
17
+ }
18
+ var CursorAdapter = class {
19
+ constructor(processManager) {
20
+ this.processManager = processManager;
21
+ }
22
+ kind = "cursor";
23
+ resolvedCommand = "cursor-agent";
24
+ async test() {
25
+ const found = await findCommand();
26
+ if (found) {
27
+ this.resolvedCommand = found.command;
28
+ return { ok: true, version: found.version };
29
+ }
30
+ return {
31
+ ok: false,
32
+ error: "Cursor Agent CLI not found. The headless agent CLI is required (cursor-agent or agent)."
33
+ };
34
+ }
35
+ execute(params) {
36
+ const args = [
37
+ "-p",
38
+ "--output-format",
39
+ "stream-json",
40
+ "--workspace",
41
+ params.workspace,
42
+ "--yolo"
43
+ // bypass interactive prompts for autonomous agents
44
+ ];
45
+ if (params.config.model) {
46
+ args.push("--model", params.config.model);
47
+ }
48
+ const { process: proc, pid } = this.processManager.spawn(this.resolvedCommand, args, {
49
+ cwd: params.workspace,
50
+ env: { ...process.env, ...params.env },
51
+ signal: params.signal,
52
+ stdio: ["pipe", "pipe", "pipe"]
53
+ // stdin must be 'pipe' to send prompt
54
+ });
55
+ if (proc.stdin) {
56
+ proc.stdin.write(params.prompt);
57
+ proc.stdin.end();
58
+ }
59
+ const events = createStreamingEvents(proc, parseCursorEvent, "Cursor agent", params.signal);
60
+ return { pid, events };
61
+ }
62
+ async stop(pid) {
63
+ await this.processManager.killWithGrace(pid);
64
+ }
65
+ };
66
+ function parseCursorEvent(line) {
67
+ if (!line.trim()) return null;
68
+ try {
69
+ const parsed = JSON.parse(line);
70
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
71
+ switch (parsed.type) {
72
+ case "assistant":
73
+ return { type: "output", timestamp, data: parsed.message ?? parsed };
74
+ case "tool_use":
75
+ return { type: "tool_call", timestamp, data: parsed };
76
+ case "tool_result":
77
+ return { type: "output", timestamp, data: parsed };
78
+ case "error":
79
+ return { type: "error", timestamp, data: parsed.error ?? parsed };
80
+ case "result": {
81
+ const tokens = extractTokens(parsed);
82
+ return { type: "done", timestamp, data: parsed, tokens };
83
+ }
84
+ default:
85
+ return { type: "output", timestamp, data: parsed };
86
+ }
87
+ } catch {
88
+ return { type: "output", timestamp: (/* @__PURE__ */ new Date()).toISOString(), data: line };
89
+ }
90
+ }
91
+
92
+ export { CursorAdapter };
@@ -0,0 +1,2 @@
1
+ import {b,a as a$1}from'./chunk-IZYSGYXG.js';import'./chunk-PBFE5V3G.js';import'./chunk-POUC4CPC.js';import {execFile}from'child_process';import {promisify}from'util';var d=promisify(execFile);async function m(){for(let r of ["cursor-agent","agent"])try{let{stdout:e}=await d(r,["--version"]);return {command:r,version:e.trim()}}catch{}return null}var a=class{constructor(e){this.processManager=e;}kind="cursor";resolvedCommand="cursor-agent";async test(){let e=await m();return e?(this.resolvedCommand=e.command,{ok:true,version:e.version}):{ok:false,error:"Cursor Agent CLI not found. The headless agent CLI is required (cursor-agent or agent)."}}execute(e){let t=["-p","--output-format","stream-json","--workspace",e.workspace,"--yolo"];e.config.model&&t.push("--model",e.config.model);let{process:n,pid:i}=this.processManager.spawn(this.resolvedCommand,t,{cwd:e.workspace,env:{...process.env,...e.env},signal:e.signal,stdio:["pipe","pipe","pipe"]});n.stdin&&(n.stdin.write(e.prompt),n.stdin.end());let c=b(n,l,"Cursor agent",e.signal);return {pid:i,events:c}}async stop(e){await this.processManager.killWithGrace(e);}};function l(r){if(!r.trim())return null;try{let e=JSON.parse(r),t=new Date().toISOString();switch(e.type){case "assistant":return {type:"output",timestamp:t,data:e.message??e};case "tool_use":return {type:"tool_call",timestamp:t,data:e};case "tool_result":return {type:"output",timestamp:t,data:e};case "error":return {type:"error",timestamp:t,data:e.error??e};case "result":{let n=a$1(e);return {type:"done",timestamp:t,data:e,tokens:n}}default:return {type:"output",timestamp:t,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:r}}}export{a as CursorAdapter};//# sourceMappingURL=cursor-QFUNKPCQ.js.map
2
+ //# sourceMappingURL=cursor-QFUNKPCQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/adapters/cursor.ts"],"names":["execFileAsync","promisify","execFile","findCommand","cmd","stdout","CursorAdapter","processManager","found","params","args","proc","pid","events","createStreamingEvents","parseCursorEvent","line","parsed","timestamp","tokens","extractTokens"],"mappings":"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","file":"cursor-QFUNKPCQ.js","sourcesContent":["/**\n * Cursor Agent adapter.\n *\n * Spawns `cursor-agent` (Cursor's headless agent CLI) with `--output-format stream-json`.\n * Falls back to `agent` command if `cursor-agent` is not found.\n * Parses JSON-lines from stdout into AgentEvent stream.\n *\n * Note: This requires Cursor Agent CLI, not the regular `cursor` IDE command.\n * Install via: npm i -g @anthropic-ai/cursor-agent (when available)\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { extractTokens, createStreamingEvents } from './utils.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\n/** Try multiple command names and return the first that works */\nasync function findCommand(): Promise<{ command: string; version: string } | null> {\n for (const cmd of ['cursor-agent', 'agent']) {\n try {\n const { stdout } = await execFileAsync(cmd, ['--version']);\n return { command: cmd, version: stdout.trim() };\n } catch {\n // try next\n }\n }\n return null;\n}\n\nexport class CursorAdapter implements IAgentAdapter {\n readonly kind = 'cursor';\n\n private resolvedCommand: string = 'cursor-agent';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n const found = await findCommand();\n if (found) {\n this.resolvedCommand = found.command;\n return { ok: true, version: found.version };\n }\n return {\n ok: false,\n error: 'Cursor Agent CLI not found. The headless agent CLI is required (cursor-agent or agent).',\n };\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n '-p',\n '--output-format', 'stream-json',\n '--workspace', params.workspace,\n '--yolo', // bypass interactive prompts for autonomous agents\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n const { process: proc, pid } = this.processManager.spawn(this.resolvedCommand, args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n stdio: ['pipe', 'pipe', 'pipe'], // stdin must be 'pipe' to send prompt\n });\n\n // Pipe prompt via stdin\n if (proc.stdin) {\n proc.stdin.write(params.prompt);\n proc.stdin.end();\n }\n\n const events = createStreamingEvents(proc, parseCursorEvent, 'Cursor agent', params.signal);\n\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction parseCursorEvent(line: string): AgentEvent | null {\n if (!line.trim()) return null;\n\n try {\n const parsed: Record<string, unknown> = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n // Cursor stream-json uses the same format as Claude stream-json\n switch (parsed.type) {\n case 'assistant':\n return { type: 'output', timestamp, data: (parsed.message as unknown) ?? parsed };\n case 'tool_use':\n return { type: 'tool_call', timestamp, data: parsed };\n case 'tool_result':\n return { type: 'output', timestamp, data: parsed };\n case 'error':\n return { type: 'error', timestamp, data: (parsed.error as unknown) ?? parsed };\n case 'result': {\n const tokens = extractTokens(parsed);\n return { type: 'done', timestamp, data: parsed, tokens };\n }\n default:\n return { type: 'output', timestamp, data: parsed };\n }\n } catch {\n return { type: 'output', timestamp: new Date().toISOString(), data: line };\n }\n}\n"]}
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ import { DoctorService } from './chunk-XI4TU6VU.js';
3
+ import { Paths } from './chunk-VTA74YWX.js';
4
+ import './chunk-O5AO5QIR.js';
5
+ import { amber, getIcon, dim } from './chunk-2VSAM7RH.js';
6
+ import { AdapterRegistry } from './chunk-45K2XID7.js';
7
+ import { ClaudeAdapter } from './chunk-IRN2U2NE.js';
8
+ import './chunk-TX7WOFCW.js';
9
+ import { ShellAdapter } from './chunk-CIIE6LNG.js';
10
+ import { ProcessManager } from './chunk-CHIP7O6V.js';
11
+ import chalk from 'chalk';
12
+
13
+ function registerDoctorCommand(program, container) {
14
+ program.command("doctor").description("Check adapters and dependencies").action(async () => {
15
+ let doctorService;
16
+ let paths;
17
+ let hasContainer = false;
18
+ if (container) {
19
+ doctorService = container.doctorService;
20
+ paths = container.paths;
21
+ hasContainer = true;
22
+ } else {
23
+ const pm = new ProcessManager();
24
+ const registry = new AdapterRegistry();
25
+ registry.register(new ClaudeAdapter(pm));
26
+ registry.register(new ShellAdapter(pm));
27
+ doctorService = new DoctorService(registry, pm);
28
+ paths = new Paths(process.cwd());
29
+ }
30
+ console.log();
31
+ console.log(` ${amber("orch doctor")} \xB7 checking adapters and dependencies`);
32
+ console.log();
33
+ const report = await doctorService.runAll();
34
+ if (container?.context.json) {
35
+ console.log(JSON.stringify(report, null, 2));
36
+ return;
37
+ }
38
+ for (const check of report.checks) {
39
+ const icon = check.status === "ok" ? chalk.ansi256(72)(getIcon("done")) : check.status === "fail" ? chalk.ansi256(167)(getIcon("failed")) : dim("\u2014");
40
+ const detail = check.detail ? dim(` ${check.detail}`) : "";
41
+ console.log(` ${icon} ${check.name.padEnd(12)}${detail}`);
42
+ }
43
+ if (paths) {
44
+ const initialized = await paths.isInitialized();
45
+ if (initialized && hasContainer) {
46
+ const agents = await container.agentService.list();
47
+ const tasks = await container.taskService.list();
48
+ console.log();
49
+ console.log(
50
+ ` ${chalk.ansi256(72)(getIcon("done"))} .orchestry/ ${dim(`exists \xB7 ${agents.length} agents \xB7 ${tasks.length} tasks`)}`
51
+ );
52
+ } else if (!initialized) {
53
+ console.log();
54
+ console.log(
55
+ ` ${chalk.ansi256(167)(getIcon("failed"))} .orchestry/ ${dim("not found \u2014 run: orch init")}`
56
+ );
57
+ }
58
+ }
59
+ console.log();
60
+ console.log(
61
+ ` ${report.adaptersReady} of ${report.adaptersTotal} adapters ready`
62
+ );
63
+ console.log();
64
+ });
65
+ }
66
+
67
+ export { registerDoctorCommand };
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export { DoctorService } from './chunk-XI4TU6VU.js';
@@ -0,0 +1,2 @@
1
+ import {execFile}from'child_process';import {promisify}from'util';var c=promisify(execFile),o=class{constructor(t,r){this.adapterRegistry=t;this.processManager=r;}async runAll(){let t=[],r=this.adapterRegistry.list(),e=0;for(let s of r){let a=await s.test();a.ok?(e++,t.push({name:s.kind,status:"ok",detail:a.version})):t.push({name:s.kind,status:"fail",detail:a.error});}return t.push(await this.checkCommand("git",["--version"],"git")),t.push(await this.checkCommand("node",["--version"],"node")),{checks:t,adaptersReady:e,adaptersTotal:r.length}}async checkCommand(t,r,e){try{let{stdout:s}=await c(t,r);return {name:e,status:"ok",detail:s.trim()}}catch{return {name:e,status:"fail",detail:`${t}: command not found`}}}};export{o as DoctorService};//# sourceMappingURL=doctor-service-NTWBWOM2.js.map
2
+ //# sourceMappingURL=doctor-service-NTWBWOM2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/application/doctor-service.ts"],"names":["execFileAsync","promisify","execFile","DoctorService","adapterRegistry","processManager","checks","adapters","adaptersReady","adapter","result","command","args","name","stdout"],"mappings":"kEAWA,IAAMA,CAAAA,CAAgBC,SAAAA,CAAUC,QAAQ,CAAA,CAc3BC,CAAAA,CAAN,KAAoB,CACzB,YACmBC,CAAAA,CACAC,CAAAA,CACjB,CAFiB,IAAA,CAAA,eAAA,CAAAD,EACA,IAAA,CAAA,cAAA,CAAAC,EAChB,CAEH,MAAM,QAAgC,CACpC,IAAMC,CAAAA,CAAwB,GAGxBC,CAAAA,CAAW,IAAA,CAAK,eAAA,CAAgB,IAAA,GAClCC,CAAAA,CAAgB,CAAA,CAEpB,IAAA,IAAWC,CAAAA,IAAWF,EAAU,CAC9B,IAAMG,CAAAA,CAAS,MAAMD,EAAQ,IAAA,EAAK,CAC9BC,CAAAA,CAAO,EAAA,EACTF,IACAF,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAMG,EAAQ,IAAA,CACd,MAAA,CAAQ,IAAA,CACR,MAAA,CAAQC,EAAO,OACjB,CAAC,CAAA,EAEDJ,CAAAA,CAAO,KAAK,CACV,IAAA,CAAMG,CAAAA,CAAQ,IAAA,CACd,OAAQ,MAAA,CACR,MAAA,CAAQC,CAAAA,CAAO,KACjB,CAAC,EAEL,CAGA,OAAAJ,CAAAA,CAAO,KAAK,MAAM,IAAA,CAAK,YAAA,CAAa,KAAA,CAAO,CAAC,WAAW,CAAA,CAAG,KAAK,CAAC,EAGhEA,CAAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,aAAa,MAAA,CAAQ,CAAC,WAAW,CAAA,CAAG,MAAM,CAAC,CAAA,CAE3D,CACL,MAAA,CAAAA,EACA,aAAA,CAAAE,CAAAA,CACA,aAAA,CAAeD,CAAAA,CAAS,MAC1B,CACF,CAEA,MAAc,YAAA,CACZI,EACAC,CAAAA,CACAC,CAAAA,CACsB,CACtB,GAAI,CACF,GAAM,CAAE,MAAA,CAAAC,CAAO,EAAI,MAAMd,CAAAA,CAAcW,CAAAA,CAASC,CAAI,EACpD,OAAO,CAAE,IAAA,CAAAC,CAAAA,CAAM,OAAQ,IAAA,CAAM,MAAA,CAAQC,CAAAA,CAAO,IAAA,EAAO,CACrD,CAAA,KAAQ,CACN,OAAO,CAAE,IAAA,CAAAD,CAAAA,CAAM,MAAA,CAAQ,MAAA,CAAQ,OAAQ,CAAA,EAAGF,CAAO,CAAA,mBAAA,CAAsB,CACzE,CACF,CACF","file":"doctor-service-NTWBWOM2.js","sourcesContent":["/**\n * Doctor service — diagnostics and health checks.\n *\n * Checks adapter availability, system dependencies, project state.\n */\n\nimport type { AdapterRegistry } from '../infrastructure/adapters/registry.js';\nimport type { IProcessManager } from '../infrastructure/process/process-manager.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface DoctorCheck {\n name: string;\n status: 'ok' | 'fail' | 'skip';\n detail?: string;\n}\n\nexport interface DoctorReport {\n checks: DoctorCheck[];\n adaptersReady: number;\n adaptersTotal: number;\n}\n\nexport class DoctorService {\n constructor(\n private readonly adapterRegistry: AdapterRegistry,\n private readonly processManager: IProcessManager,\n ) {}\n\n async runAll(): Promise<DoctorReport> {\n const checks: DoctorCheck[] = [];\n\n // Check adapters\n const adapters = this.adapterRegistry.list();\n let adaptersReady = 0;\n\n for (const adapter of adapters) {\n const result = await adapter.test();\n if (result.ok) {\n adaptersReady++;\n checks.push({\n name: adapter.kind,\n status: 'ok',\n detail: result.version,\n });\n } else {\n checks.push({\n name: adapter.kind,\n status: 'fail',\n detail: result.error,\n });\n }\n }\n\n // Check git\n checks.push(await this.checkCommand('git', ['--version'], 'git'));\n\n // Check node\n checks.push(await this.checkCommand('node', ['--version'], 'node'));\n\n return {\n checks,\n adaptersReady,\n adaptersTotal: adapters.length,\n };\n }\n\n private async checkCommand(\n command: string,\n args: string[],\n name: string,\n ): Promise<DoctorCheck> {\n try {\n const { stdout } = await execFileAsync(command, args);\n return { name, status: 'ok', detail: stdout.trim() };\n } catch {\n return { name, status: 'fail', detail: `${command}: command not found` };\n }\n }\n}\n"]}
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env node
2
+ import { GOAL_STATUSES } from './chunk-HXYAZGLP.js';
3
+ import { printSuccess, dim, printTable, printKeyValue, printError } from './chunk-2VSAM7RH.js';
4
+
5
+ // src/cli/commands/goal.ts
6
+ var STATUS_ICON = {
7
+ active: "\u25CF",
8
+ // ●
9
+ paused: "\u2016",
10
+ // ‖
11
+ achieved: "\u2713",
12
+ // ✓
13
+ abandoned: "\u2715"
14
+ // ✕
15
+ };
16
+ function registerGoalCommand(program, container) {
17
+ const goal = program.command("goal").description("Manage goals");
18
+ goal.command("add <title>").description("Create a new goal").option("--description <desc>", "Goal description").option("--assignee <agentId>", "Assign to a specific agent").action(async (title, opts) => {
19
+ await container.paths.requireInit();
20
+ const g = await container.goalService.create({
21
+ title,
22
+ description: opts.description,
23
+ assignee: opts.assignee
24
+ });
25
+ if (container.context.json) {
26
+ console.log(JSON.stringify(g, null, 2));
27
+ } else if (container.context.quiet) {
28
+ console.log(g.id);
29
+ } else {
30
+ printSuccess(`Created goal "${g.title}" (${g.id})`);
31
+ }
32
+ });
33
+ goal.command("list").alias("ls").description("List all goals").option("--status <status>", "Filter by status").action(async (opts) => {
34
+ await container.paths.requireInit();
35
+ const goals = await container.goalService.list(
36
+ opts.status ? { status: opts.status } : void 0
37
+ );
38
+ if (container.context.json) {
39
+ console.log(JSON.stringify(goals, null, 2));
40
+ return;
41
+ }
42
+ if (goals.length === 0) {
43
+ console.log(dim("No goals found."));
44
+ return;
45
+ }
46
+ const rows = goals.map((g) => [
47
+ STATUS_ICON[g.status] ?? "?",
48
+ g.id,
49
+ g.title,
50
+ g.status,
51
+ g.assignee ?? dim("any")
52
+ ]);
53
+ printTable(["", "ID", "Title", "Status", "Assignee"], rows);
54
+ });
55
+ goal.command("show <id>").description("Show goal details").action(async (id) => {
56
+ await container.paths.requireInit();
57
+ const g = await container.goalService.get(id);
58
+ if (container.context.json) {
59
+ console.log(JSON.stringify(g, null, 2));
60
+ return;
61
+ }
62
+ printKeyValue([
63
+ ["ID", g.id],
64
+ ["Title", g.title],
65
+ ["Status", g.status],
66
+ ["Assignee", g.assignee ?? dim("any")],
67
+ ["Description", g.description || dim("none")],
68
+ ["Created", g.created_at],
69
+ ["Updated", g.updated_at ?? dim("never")]
70
+ ]);
71
+ });
72
+ goal.command("status <id> <status>").description("Change goal status (active, paused, achieved, abandoned)").action(async (id, status) => {
73
+ await container.paths.requireInit();
74
+ if (!GOAL_STATUSES.includes(status)) {
75
+ printError(`Invalid status "${status}". Valid: ${GOAL_STATUSES.join(", ")}`);
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ const g = await container.goalService.updateStatus(id, status);
80
+ if (container.context.json) {
81
+ console.log(JSON.stringify(g, null, 2));
82
+ } else if (container.context.quiet) {
83
+ console.log(g.id);
84
+ } else {
85
+ printSuccess(`Goal "${g.title}" \u2192 ${g.status}`);
86
+ }
87
+ });
88
+ goal.command("update <id>").description("Update goal fields").option("--title <title>", "New title").option("--description <desc>", "New description").option("--assignee <agentId>", "New assignee (empty string to unassign)").action(async (id, opts) => {
89
+ await container.paths.requireInit();
90
+ const g = await container.goalService.update(id, opts);
91
+ if (container.context.json) {
92
+ console.log(JSON.stringify(g, null, 2));
93
+ } else if (container.context.quiet) {
94
+ console.log(g.id);
95
+ } else {
96
+ printSuccess(`Updated goal "${g.title}"`);
97
+ }
98
+ });
99
+ goal.command("delete <id>").alias("rm").description("Delete a goal").action(async (id) => {
100
+ await container.paths.requireInit();
101
+ await container.goalService.delete(id);
102
+ if (container.context.json) {
103
+ console.log(JSON.stringify({ deleted: id }));
104
+ } else if (!container.context.quiet) {
105
+ printSuccess(`Deleted goal ${id}`);
106
+ }
107
+ });
108
+ }
109
+
110
+ export { registerGoalCommand };