conductor-oss 0.1.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 (57) hide show
  1. package/dist/commands/attach.d.ts +8 -0
  2. package/dist/commands/attach.d.ts.map +1 -0
  3. package/dist/commands/attach.js +65 -0
  4. package/dist/commands/attach.js.map +1 -0
  5. package/dist/commands/cleanup.d.ts +9 -0
  6. package/dist/commands/cleanup.d.ts.map +1 -0
  7. package/dist/commands/cleanup.js +68 -0
  8. package/dist/commands/cleanup.js.map +1 -0
  9. package/dist/commands/dashboard.d.ts +8 -0
  10. package/dist/commands/dashboard.d.ts.map +1 -0
  11. package/dist/commands/dashboard.js +40 -0
  12. package/dist/commands/dashboard.js.map +1 -0
  13. package/dist/commands/init.d.ts +9 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +104 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/kill.d.ts +8 -0
  18. package/dist/commands/kill.d.ts.map +1 -0
  19. package/dist/commands/kill.js +65 -0
  20. package/dist/commands/kill.js.map +1 -0
  21. package/dist/commands/list.d.ts +9 -0
  22. package/dist/commands/list.d.ts.map +1 -0
  23. package/dist/commands/list.js +172 -0
  24. package/dist/commands/list.js.map +1 -0
  25. package/dist/commands/restore.d.ts +9 -0
  26. package/dist/commands/restore.d.ts.map +1 -0
  27. package/dist/commands/restore.js +44 -0
  28. package/dist/commands/restore.js.map +1 -0
  29. package/dist/commands/send.d.ts +8 -0
  30. package/dist/commands/send.d.ts.map +1 -0
  31. package/dist/commands/send.js +42 -0
  32. package/dist/commands/send.js.map +1 -0
  33. package/dist/commands/spawn.d.ts +9 -0
  34. package/dist/commands/spawn.d.ts.map +1 -0
  35. package/dist/commands/spawn.js +64 -0
  36. package/dist/commands/spawn.js.map +1 -0
  37. package/dist/commands/start.d.ts +13 -0
  38. package/dist/commands/start.d.ts.map +1 -0
  39. package/dist/commands/start.js +224 -0
  40. package/dist/commands/start.js.map +1 -0
  41. package/dist/commands/status.d.ts +10 -0
  42. package/dist/commands/status.d.ts.map +1 -0
  43. package/dist/commands/status.js +132 -0
  44. package/dist/commands/status.js.map +1 -0
  45. package/dist/commands/watch.d.ts +12 -0
  46. package/dist/commands/watch.d.ts.map +1 -0
  47. package/dist/commands/watch.js +82 -0
  48. package/dist/commands/watch.js.map +1 -0
  49. package/dist/index.d.ts +9 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +39 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/services.d.ts +31 -0
  54. package/dist/services.d.ts.map +1 -0
  55. package/dist/services.js +78 -0
  56. package/dist/services.js.map +1 -0
  57. package/package.json +59 -0
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `co restore <session>`
3
+ *
4
+ * Restores a dead/exited session by re-launching the agent
5
+ * in the existing worktree.
6
+ */
7
+ import type { Command } from "commander";
8
+ export declare function registerRestore(program: Command): void;
9
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqCtD"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `co restore <session>`
3
+ *
4
+ * Restores a dead/exited session by re-launching the agent
5
+ * in the existing worktree.
6
+ */
7
+ import chalk from "chalk";
8
+ import ora from "ora";
9
+ import { createServices, loadConfig } from "../services.js";
10
+ export function registerRestore(program) {
11
+ program
12
+ .command("restore")
13
+ .description("Restore a dead/exited session (re-launch agent)")
14
+ .argument("<session>", "Session ID to restore")
15
+ .action(async (sessionId) => {
16
+ const spinner = ora(`Restoring session ${sessionId}`).start();
17
+ try {
18
+ const config = await loadConfig();
19
+ const { sessionManager } = await createServices(config);
20
+ // Verify session exists
21
+ const existing = await sessionManager.get(sessionId);
22
+ if (!existing) {
23
+ spinner.fail(`Session ${chalk.red(sessionId)} not found.`);
24
+ process.exit(1);
25
+ }
26
+ const session = await sessionManager.restore(sessionId);
27
+ spinner.succeed(`Session ${chalk.green(sessionId)} restored.`);
28
+ if (session.workspacePath) {
29
+ console.log(chalk.dim(` Worktree: ${session.workspacePath}`));
30
+ }
31
+ if (session.branch) {
32
+ console.log(chalk.dim(` Branch: ${session.branch}`));
33
+ }
34
+ const tmuxTarget = session.runtimeHandle?.id ?? sessionId;
35
+ console.log(chalk.dim(` Attach: tmux attach -t ${tmuxTarget}`));
36
+ }
37
+ catch (err) {
38
+ spinner.fail("Failed to restore session");
39
+ console.error(chalk.red(String(err)));
40
+ process.exit(1);
41
+ }
42
+ });
43
+ }
44
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAE9D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAExD,wBAAwB;YACxB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxD,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAE/D,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,SAAS,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `co send <session> <message>`
3
+ *
4
+ * Sends a message to a running agent session via the session manager.
5
+ */
6
+ import type { Command } from "commander";
7
+ export declare function registerSend(program: Command): void;
8
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoCnD"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * `co send <session> <message>`
3
+ *
4
+ * Sends a message to a running agent session via the session manager.
5
+ */
6
+ import chalk from "chalk";
7
+ import ora from "ora";
8
+ import { createServices, loadConfig } from "../services.js";
9
+ export function registerSend(program) {
10
+ program
11
+ .command("send")
12
+ .description("Send a message to a running agent session")
13
+ .argument("<session>", "Session ID")
14
+ .argument("<message...>", "Message to send to the agent")
15
+ .action(async (sessionId, messageParts) => {
16
+ const message = messageParts.join(" ");
17
+ if (!message.trim()) {
18
+ console.error(chalk.red("Empty message. Provide text to send."));
19
+ process.exit(1);
20
+ }
21
+ const spinner = ora(`Sending message to ${sessionId}`).start();
22
+ try {
23
+ const config = await loadConfig();
24
+ const { sessionManager } = await createServices(config);
25
+ // Verify session exists
26
+ const session = await sessionManager.get(sessionId);
27
+ if (!session) {
28
+ spinner.fail(`Session ${chalk.red(sessionId)} not found`);
29
+ process.exit(1);
30
+ }
31
+ await sessionManager.send(sessionId, message);
32
+ spinner.succeed(`Message sent to ${chalk.green(sessionId)}`);
33
+ console.log(chalk.dim(` > ${message.length > 80 ? message.slice(0, 79) + "\u2026" : message}`));
34
+ }
35
+ catch (err) {
36
+ spinner.fail("Failed to send message");
37
+ console.error(chalk.red(String(err)));
38
+ process.exit(1);
39
+ }
40
+ });
41
+ }
42
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2CAA2C,CAAC;SACxD,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;SACnC,QAAQ,CAAC,cAAc,EAAE,8BAA8B,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,YAAsB,EAAE,EAAE;QAC1D,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAE/D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAExD,wBAAwB;YACxB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,CAAC,OAAO,CAAC,mBAAmB,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `co spawn <project> [issueOrPrompt]`
3
+ *
4
+ * Spawns a new agent session for the given project.
5
+ * Optionally targets a specific issue (e.g. #42) or provides a free-text prompt.
6
+ */
7
+ import type { Command } from "commander";
8
+ export declare function registerSpawn(program: Command): void;
9
+ //# sourceMappingURL=spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgEpD"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * `co spawn <project> [issueOrPrompt]`
3
+ *
4
+ * Spawns a new agent session for the given project.
5
+ * Optionally targets a specific issue (e.g. #42) or provides a free-text prompt.
6
+ */
7
+ import chalk from "chalk";
8
+ import ora from "ora";
9
+ import { createServices, loadConfig } from "../services.js";
10
+ export function registerSpawn(program) {
11
+ program
12
+ .command("spawn")
13
+ .description("Spawn a new agent session for a project")
14
+ .argument("<project>", "Project ID from conductor config")
15
+ .argument("[issueOrPrompt]", "Issue identifier (#42, INT-123) or inline prompt")
16
+ .option("--agent <name>", "Override agent plugin (e.g. claude-code, codex)")
17
+ .option("--model <name>", "Override model (e.g. o4-mini, claude-opus-4-6)")
18
+ .option("--branch <name>", "Override branch name")
19
+ .option("--prompt <text>", "Explicit prompt (if issueOrPrompt is an issue)")
20
+ .action(async (project, issueOrPrompt, opts) => {
21
+ const config = await loadConfig();
22
+ if (!config.projects[project]) {
23
+ console.error(chalk.red(`Unknown project: ${project}\nAvailable: ${Object.keys(config.projects).join(", ")}`));
24
+ process.exit(1);
25
+ }
26
+ // Determine whether the positional arg is an issue or a prompt.
27
+ // Issue identifiers look like #42, GH-123, INT-456, etc.
28
+ const isIssue = issueOrPrompt
29
+ ? /^#?\d+$/.test(issueOrPrompt) || /^[A-Z]+-\d+$/.test(issueOrPrompt)
30
+ : false;
31
+ const spawnConfig = {
32
+ projectId: project,
33
+ issueId: isIssue ? issueOrPrompt : undefined,
34
+ prompt: opts.prompt ?? (!isIssue ? issueOrPrompt : undefined),
35
+ branch: opts.branch,
36
+ agent: opts.agent,
37
+ model: opts.model,
38
+ };
39
+ const spinner = ora("Creating session").start();
40
+ try {
41
+ const { sessionManager } = await createServices(config);
42
+ spinner.text = "Spawning agent session";
43
+ const session = await sessionManager.spawn(spawnConfig);
44
+ spinner.succeed(`Session ${chalk.green(session.id)} created`);
45
+ console.log(` Worktree: ${chalk.dim(session.workspacePath ?? "-")}`);
46
+ if (session.branch) {
47
+ console.log(` Branch: ${chalk.dim(session.branch)}`);
48
+ }
49
+ if (session.issueId) {
50
+ console.log(` Issue: ${chalk.dim(session.issueId)}`);
51
+ }
52
+ const tmuxTarget = session.runtimeHandle?.id ?? session.id;
53
+ console.log(` Attach: ${chalk.dim(`tmux attach -t ${tmuxTarget}`)}`);
54
+ console.log();
55
+ console.log(`SESSION=${session.id}`);
56
+ }
57
+ catch (err) {
58
+ spinner.fail("Failed to spawn session");
59
+ console.error(chalk.red(String(err)));
60
+ process.exit(1);
61
+ }
62
+ });
63
+ }
64
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `co start`
3
+ *
4
+ * Starts the lifecycle manager and web dashboard.
5
+ * Runs in the foreground -- designed for LaunchAgent / systemd usage.
6
+ *
7
+ * The lifecycle manager polls sessions periodically, advancing their
8
+ * state machine (checking CI, reviews, merging, sending reactions, etc.).
9
+ * The web dashboard provides a browser UI for monitoring and interaction.
10
+ */
11
+ import type { Command } from "commander";
12
+ export declare function registerStart(program: Command): void;
13
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqOpD"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * `co start`
3
+ *
4
+ * Starts the lifecycle manager and web dashboard.
5
+ * Runs in the foreground -- designed for LaunchAgent / systemd usage.
6
+ *
7
+ * The lifecycle manager polls sessions periodically, advancing their
8
+ * state machine (checking CI, reviews, merging, sending reactions, etc.).
9
+ * The web dashboard provides a browser UI for monitoring and interaction.
10
+ */
11
+ import { spawn } from "node:child_process";
12
+ import chalk from "chalk";
13
+ import ora from "ora";
14
+ import { createServices, loadConfig } from "../services.js";
15
+ export function registerStart(program) {
16
+ program
17
+ .command("start")
18
+ .description("Start lifecycle manager + board watcher + web dashboard (foreground)")
19
+ .option("--no-dashboard", "Skip starting the web dashboard")
20
+ .option("--no-watcher", "Skip starting the board watcher")
21
+ .option("-p, --port <port>", "Dashboard port override")
22
+ .option("-w, --workspace <path>", "Obsidian workspace path")
23
+ .action(async (opts) => {
24
+ try {
25
+ const config = await loadConfig();
26
+ // Mutable ref — set after boardWatcher is created, used by lifecycle callback
27
+ let boardWatcherRef = null;
28
+ const port = opts.port ? parseInt(opts.port, 10) : (config.port ?? 3000);
29
+ const line = "=".repeat(50);
30
+ console.log(chalk.dim(line));
31
+ console.log(chalk.bold.cyan(" Conductor -- Starting"));
32
+ console.log(chalk.dim(line));
33
+ console.log();
34
+ // ---- Start lifecycle manager ----
35
+ const spinner = ora("Starting lifecycle manager").start();
36
+ const core = await import("@conductor-oss/core");
37
+ if (typeof core.createLifecycleManager !== "function") {
38
+ spinner.warn("Lifecycle manager not yet implemented in @conductor-oss/core");
39
+ }
40
+ else {
41
+ const { sessionManager } = await createServices(config);
42
+ const lifecycle = core.createLifecycleManager({
43
+ config,
44
+ sessionManager,
45
+ onStatusChange: (sessionId, newStatus, projectId) => {
46
+ console.log(`[lifecycle] Status change: ${sessionId} → ${newStatus} (${projectId})`);
47
+ // Trigger immediate board sync
48
+ boardWatcherRef?.updateNow();
49
+ },
50
+ });
51
+ lifecycle.start(10_000); // Poll every 10s (was 30s)
52
+ spinner.succeed("Lifecycle manager running");
53
+ // Graceful shutdown
54
+ const shutdown = () => {
55
+ console.log(chalk.dim("\nShutting down lifecycle manager..."));
56
+ lifecycle.stop();
57
+ process.exit(0);
58
+ };
59
+ process.on("SIGINT", shutdown);
60
+ process.on("SIGTERM", shutdown);
61
+ }
62
+ // ---- Start board watcher ----
63
+ if (opts.watcher !== false) {
64
+ const watchSpinner = ora("Starting board watcher").start();
65
+ try {
66
+ const workspacePath = opts.workspace
67
+ ?? process.env["CONDUCTOR_WORKSPACE"]
68
+ ?? `${process.env["HOME"]}/.conductor/workspace`;
69
+ const boards = core.discoverBoards(workspacePath);
70
+ if (boards.length === 0) {
71
+ watchSpinner.warn("No CONDUCTOR.md boards found");
72
+ }
73
+ else {
74
+ // Need sessionManager for the watcher
75
+ const { sessionManager: sm } = await createServices(config);
76
+ const boardProjectMap = core.buildBoardProjectMap(boards, config);
77
+ const boardWatcher = core.createBoardWatcher({
78
+ config,
79
+ sessionManager: sm,
80
+ boardPaths: boards,
81
+ boardProjectMap,
82
+ pollIntervalMs: 5000,
83
+ workspacePath,
84
+ onDispatch: (projectId, sessionId, task) => {
85
+ console.log(`[board-watcher] Dispatched ${sessionId} -> ${projectId}: "${task}"`);
86
+ },
87
+ });
88
+ boardWatcher.start();
89
+ boardWatcherRef = boardWatcher;
90
+ watchSpinner.succeed(`Board watcher running (${boards.length} boards)`);
91
+ // Add to shutdown
92
+ const prevSIGINT = process.listeners("SIGINT");
93
+ process.removeAllListeners("SIGINT");
94
+ process.on("SIGINT", () => {
95
+ boardWatcher.stop();
96
+ for (const listener of prevSIGINT) {
97
+ listener();
98
+ }
99
+ });
100
+ }
101
+ }
102
+ catch (err) {
103
+ watchSpinner.warn(`Board watcher failed: ${err}`);
104
+ }
105
+ }
106
+ // ---- Start web dashboard ----
107
+ let dashboardProcess = null;
108
+ if (opts.dashboard !== false) {
109
+ const dashSpinner = ora("Starting web dashboard").start();
110
+ try {
111
+ const cliDir = new URL(".", import.meta.url).pathname;
112
+ const { join, resolve } = await import("node:path");
113
+ const { existsSync } = await import("node:fs");
114
+ // Search order:
115
+ // 1. Standalone build inside CLI package (npm install -g)
116
+ // 2. Sibling packages/web in monorepo dev setup
117
+ // 3. config.configPath-relative monorepo root
118
+ let webDir = null;
119
+ const candidates = [
120
+ resolve(cliDir, "..", "web"), // npm: cli/dist/../web
121
+ resolve(cliDir, "..", "..", "..", "web"), // npm: cli/dist/../../web
122
+ resolve(cliDir, "..", "..", "web"), // monorepo: packages/cli/dist/../../web = packages/web
123
+ config.configPath ? resolve(config.configPath, "..", "packages", "web") : null,
124
+ ].filter(Boolean);
125
+ for (const candidate of candidates) {
126
+ if (existsSync(join(candidate, "package.json"))) {
127
+ webDir = candidate;
128
+ break;
129
+ }
130
+ }
131
+ if (!webDir) {
132
+ dashSpinner.warn("Dashboard not found. Run: pnpm --filter @conductor-oss/web build");
133
+ return;
134
+ }
135
+ // Prefer standalone build (output: standalone in next.config), then production, then dev
136
+ // Find standalone server.js (location varies by monorepo nesting)
137
+ const { readdirSync, statSync: fsStat } = await import("node:fs");
138
+ const standaloneDir = join(webDir, ".next", "standalone");
139
+ let standaloneServer = null;
140
+ const searchQueue = [standaloneDir];
141
+ for (let depth = 0; depth < 6 && searchQueue.length > 0 && !standaloneServer; depth++) {
142
+ const nextQueue = [];
143
+ for (const d of searchQueue) {
144
+ const candidate = join(d, "server.js");
145
+ if (existsSync(candidate) && !candidate.includes("node_modules")) {
146
+ standaloneServer = candidate;
147
+ break;
148
+ }
149
+ try {
150
+ for (const entry of readdirSync(d)) {
151
+ const full = join(d, String(entry));
152
+ if (fsStat(full).isDirectory() && entry !== "node_modules") {
153
+ nextQueue.push(full);
154
+ }
155
+ }
156
+ }
157
+ catch { /* ignore */ }
158
+ }
159
+ searchQueue.splice(0, searchQueue.length, ...nextQueue);
160
+ }
161
+ const hasNextBuild = existsSync(join(webDir, ".next"));
162
+ let cmd;
163
+ let args;
164
+ if (hasNextBuild) {
165
+ // Use pnpm run start (next start) — reliable, serves static assets correctly
166
+ cmd = "pnpm";
167
+ args = ["run", "start"];
168
+ }
169
+ else {
170
+ cmd = "pnpm";
171
+ args = ["run", "dev"];
172
+ }
173
+ dashboardProcess = spawn(cmd, args, {
174
+ cwd: webDir,
175
+ stdio: "inherit",
176
+ detached: false,
177
+ env: {
178
+ ...process.env,
179
+ PORT: String(port),
180
+ HOSTNAME: "0.0.0.0",
181
+ },
182
+ });
183
+ dashboardProcess.on("error", () => {
184
+ dashSpinner.warn("Dashboard failed to start. Try: cd packages/web && pnpm build");
185
+ });
186
+ dashSpinner.succeed(`Web dashboard starting on http://localhost:${port}`);
187
+ }
188
+ catch {
189
+ dashSpinner.warn("Could not start dashboard.");
190
+ }
191
+ }
192
+ // ---- Summary ----
193
+ console.log();
194
+ console.log(chalk.bold.green("Conductor is running."));
195
+ console.log(chalk.dim(` Config: ${config.configPath}`));
196
+ if (opts.dashboard !== false) {
197
+ console.log(chalk.dim(` Dashboard: http://localhost:${port}`));
198
+ }
199
+ if (opts.watcher !== false) {
200
+ console.log(chalk.dim(" Watcher: Obsidian CONDUCTOR.md boards"));
201
+ }
202
+ console.log(chalk.dim(" Press Ctrl-C to stop.\n"));
203
+ // Keep process alive. Dashboard is optional for orchestrator health.
204
+ // If it crashes (e.g. EADDRINUSE), keep lifecycle + board watcher running.
205
+ if (dashboardProcess) {
206
+ dashboardProcess.on("exit", (code, signal) => {
207
+ if (code !== 0 && code !== null) {
208
+ console.error(chalk.yellow(`Dashboard exited with code ${code}${signal ? ` (signal ${signal})` : ""}. ` +
209
+ "Keeping orchestrator core services running."));
210
+ }
211
+ });
212
+ }
213
+ // Always keep process alive via interval heartbeat.
214
+ setInterval(() => {
215
+ // heartbeat -- lifecycle manager / watcher run on their own intervals
216
+ }, 60_000);
217
+ }
218
+ catch (err) {
219
+ console.error(chalk.red(`Failed to start: ${err}`));
220
+ process.exit(1);
221
+ }
222
+ });
223
+ }
224
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `co status`
3
+ *
4
+ * Kanban-style summary grouped by attention level.
5
+ * Shows sessions bucketed into: needs response, needs review,
6
+ * working, pending, and ready to merge.
7
+ */
8
+ import type { Command } from "commander";
9
+ export declare function registerStatus(program: Command): void;
10
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyEzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8ErD"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * `co status`
3
+ *
4
+ * Kanban-style summary grouped by attention level.
5
+ * Shows sessions bucketed into: needs response, needs review,
6
+ * working, pending, and ready to merge.
7
+ */
8
+ import chalk from "chalk";
9
+ import { createServices, loadConfig } from "../services.js";
10
+ const BUCKETS = [
11
+ {
12
+ label: "NEEDS RESPONSE",
13
+ color: chalk.red,
14
+ statuses: new Set(["needs_input", "stuck", "errored"]),
15
+ },
16
+ {
17
+ label: "NEEDS REVIEW",
18
+ color: chalk.magenta,
19
+ statuses: new Set(["changes_requested", "ci_failed"]),
20
+ },
21
+ {
22
+ label: "WORKING",
23
+ color: chalk.green,
24
+ statuses: new Set(["spawning", "working"]),
25
+ },
26
+ {
27
+ label: "PENDING",
28
+ color: chalk.blue,
29
+ statuses: new Set(["pr_open", "review_pending"]),
30
+ },
31
+ {
32
+ label: "READY TO MERGE",
33
+ color: chalk.cyan,
34
+ statuses: new Set(["approved", "mergeable"]),
35
+ },
36
+ ];
37
+ function formatAge(date) {
38
+ const diff = Math.floor((Date.now() - date.getTime()) / 1000);
39
+ if (diff < 60)
40
+ return `${diff}s`;
41
+ if (diff < 3600)
42
+ return `${Math.floor(diff / 60)}m`;
43
+ if (diff < 86400)
44
+ return `${Math.floor(diff / 3600)}h`;
45
+ return `${Math.floor(diff / 86400)}d`;
46
+ }
47
+ function printSessionLine(session) {
48
+ const parts = [
49
+ chalk.green(session.id),
50
+ ];
51
+ if (session.branch) {
52
+ parts.push(chalk.cyan(session.branch));
53
+ }
54
+ if (session.issueId) {
55
+ parts.push(chalk.blue(session.issueId));
56
+ }
57
+ const summary = session.agentInfo?.summary ?? session.metadata["summary"];
58
+ if (summary) {
59
+ const truncated = summary.length > 50 ? summary.slice(0, 49) + "\u2026" : summary;
60
+ parts.push(chalk.dim(truncated));
61
+ }
62
+ parts.push(chalk.dim(`(${formatAge(session.lastActivityAt)})`));
63
+ console.log(` ${parts.join(" ")}`);
64
+ }
65
+ // ---- Command registration ----
66
+ export function registerStatus(program) {
67
+ program
68
+ .command("status")
69
+ .description("Kanban-style status summary grouped by attention level")
70
+ .option("-p, --project <id>", "Filter by project ID")
71
+ .action(async (opts) => {
72
+ try {
73
+ const config = await loadConfig();
74
+ if (opts.project && !config.projects[opts.project]) {
75
+ console.error(chalk.red(`Unknown project: ${opts.project}`));
76
+ process.exit(1);
77
+ }
78
+ const { sessionManager } = await createServices(config);
79
+ const sessions = await sessionManager.list(opts.project);
80
+ // Exclude terminal sessions
81
+ const TERMINAL = new Set([
82
+ "killed", "terminated", "done", "cleanup", "merged",
83
+ ]);
84
+ const active = sessions.filter((s) => !TERMINAL.has(s.status));
85
+ if (active.length === 0) {
86
+ console.log(chalk.dim("\nNo active sessions.\n"));
87
+ return;
88
+ }
89
+ // Banner
90
+ const line = "=".repeat(60);
91
+ console.log(chalk.dim(`\n${line}`));
92
+ console.log(chalk.bold.cyan(" CONDUCTOR STATUS"));
93
+ console.log(chalk.dim(line));
94
+ // Bucket sessions
95
+ const bucketed = new Set();
96
+ for (const bucket of BUCKETS) {
97
+ const matching = active.filter((s) => bucket.statuses.has(s.status));
98
+ if (matching.length === 0)
99
+ continue;
100
+ matching.forEach((s) => bucketed.add(s.id));
101
+ console.log();
102
+ console.log(` ${bucket.color(bucket.label)} ${chalk.dim(`(${matching.length})`)}`);
103
+ for (const session of matching) {
104
+ printSessionLine(session);
105
+ }
106
+ }
107
+ // Catch any sessions not in a bucket
108
+ const unbucketed = active.filter((s) => !bucketed.has(s.id));
109
+ if (unbucketed.length > 0) {
110
+ console.log();
111
+ console.log(` ${chalk.yellow("OTHER")} ${chalk.dim(`(${unbucketed.length})`)}`);
112
+ for (const session of unbucketed) {
113
+ printSessionLine(session);
114
+ }
115
+ }
116
+ // Summary line
117
+ console.log();
118
+ console.log(chalk.dim(` ${active.length} active session${active.length !== 1 ? "s" : ""}`));
119
+ // Recently merged count
120
+ const merged = sessions.filter((s) => s.status === "merged");
121
+ if (merged.length > 0) {
122
+ console.log(chalk.dim(` ${merged.length} merged`));
123
+ }
124
+ console.log();
125
+ }
126
+ catch (err) {
127
+ console.error(chalk.red(`Error: ${err}`));
128
+ process.exit(1);
129
+ }
130
+ });
131
+ }
132
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `co watch`
3
+ *
4
+ * Watches Obsidian CONDUCTOR.md kanban boards for tasks moved to "Ready to Dispatch".
5
+ * When a task is detected, spawns an agent session via `co spawn`.
6
+ *
7
+ * Supports project-specific boards (auto-detected from path) and the workspace-level
8
+ * board (requires #project/ tag on the card).
9
+ */
10
+ import type { Command } from "commander";
11
+ export declare function registerWatch(program: Command): void;
12
+ //# sourceMappingURL=watch.d.ts.map