@elhu/pit 0.1.1

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 (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +380 -0
  3. package/dist/adapters/claude-code.d.ts +70 -0
  4. package/dist/adapters/claude-code.d.ts.map +1 -0
  5. package/dist/adapters/claude-code.js +166 -0
  6. package/dist/adapters/claude-code.js.map +1 -0
  7. package/dist/adapters/index.d.ts +16 -0
  8. package/dist/adapters/index.d.ts.map +1 -0
  9. package/dist/adapters/index.js +49 -0
  10. package/dist/adapters/index.js.map +1 -0
  11. package/dist/adapters/opencode.d.ts +53 -0
  12. package/dist/adapters/opencode.d.ts.map +1 -0
  13. package/dist/adapters/opencode.js +120 -0
  14. package/dist/adapters/opencode.js.map +1 -0
  15. package/dist/adapters/process-utils.d.ts +29 -0
  16. package/dist/adapters/process-utils.d.ts.map +1 -0
  17. package/dist/adapters/process-utils.js +96 -0
  18. package/dist/adapters/process-utils.js.map +1 -0
  19. package/dist/adapters/types.d.ts +41 -0
  20. package/dist/adapters/types.d.ts.map +1 -0
  21. package/dist/adapters/types.js +6 -0
  22. package/dist/adapters/types.js.map +1 -0
  23. package/dist/assets.generated.d.ts +13 -0
  24. package/dist/assets.generated.d.ts.map +1 -0
  25. package/dist/assets.generated.js +162 -0
  26. package/dist/assets.generated.js.map +1 -0
  27. package/dist/beads.d.ts +85 -0
  28. package/dist/beads.d.ts.map +1 -0
  29. package/dist/beads.js +120 -0
  30. package/dist/beads.js.map +1 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +39 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/commands/add.d.ts +10 -0
  36. package/dist/commands/add.d.ts.map +1 -0
  37. package/dist/commands/add.js +58 -0
  38. package/dist/commands/add.js.map +1 -0
  39. package/dist/commands/cleanup.d.ts +13 -0
  40. package/dist/commands/cleanup.d.ts.map +1 -0
  41. package/dist/commands/cleanup.js +174 -0
  42. package/dist/commands/cleanup.js.map +1 -0
  43. package/dist/commands/daemon.d.ts +3 -0
  44. package/dist/commands/daemon.d.ts.map +1 -0
  45. package/dist/commands/daemon.js +162 -0
  46. package/dist/commands/daemon.js.map +1 -0
  47. package/dist/commands/init.d.ts +20 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +125 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/install-keybinding.d.ts +61 -0
  52. package/dist/commands/install-keybinding.d.ts.map +1 -0
  53. package/dist/commands/install-keybinding.js +138 -0
  54. package/dist/commands/install-keybinding.js.map +1 -0
  55. package/dist/commands/install-status.d.ts +35 -0
  56. package/dist/commands/install-status.d.ts.map +1 -0
  57. package/dist/commands/install-status.js +115 -0
  58. package/dist/commands/install-status.js.map +1 -0
  59. package/dist/commands/log.d.ts +7 -0
  60. package/dist/commands/log.d.ts.map +1 -0
  61. package/dist/commands/log.js +60 -0
  62. package/dist/commands/log.js.map +1 -0
  63. package/dist/commands/pause.d.ts +12 -0
  64. package/dist/commands/pause.d.ts.map +1 -0
  65. package/dist/commands/pause.js +47 -0
  66. package/dist/commands/pause.js.map +1 -0
  67. package/dist/commands/resume.d.ts +12 -0
  68. package/dist/commands/resume.d.ts.map +1 -0
  69. package/dist/commands/resume.js +59 -0
  70. package/dist/commands/resume.js.map +1 -0
  71. package/dist/commands/shared.d.ts +7 -0
  72. package/dist/commands/shared.d.ts.map +1 -0
  73. package/dist/commands/shared.js +56 -0
  74. package/dist/commands/shared.js.map +1 -0
  75. package/dist/commands/start.d.ts +12 -0
  76. package/dist/commands/start.d.ts.map +1 -0
  77. package/dist/commands/start.js +274 -0
  78. package/dist/commands/start.js.map +1 -0
  79. package/dist/commands/status.d.ts +24 -0
  80. package/dist/commands/status.d.ts.map +1 -0
  81. package/dist/commands/status.js +101 -0
  82. package/dist/commands/status.js.map +1 -0
  83. package/dist/commands/stop.d.ts +11 -0
  84. package/dist/commands/stop.d.ts.map +1 -0
  85. package/dist/commands/stop.js +52 -0
  86. package/dist/commands/stop.js.map +1 -0
  87. package/dist/commands/teardown.d.ts +15 -0
  88. package/dist/commands/teardown.d.ts.map +1 -0
  89. package/dist/commands/teardown.js +72 -0
  90. package/dist/commands/teardown.js.map +1 -0
  91. package/dist/config.d.ts +58 -0
  92. package/dist/config.d.ts.map +1 -0
  93. package/dist/config.js +129 -0
  94. package/dist/config.js.map +1 -0
  95. package/dist/daemon/client.d.ts +38 -0
  96. package/dist/daemon/client.d.ts.map +1 -0
  97. package/dist/daemon/client.js +254 -0
  98. package/dist/daemon/client.js.map +1 -0
  99. package/dist/daemon/context.d.ts +63 -0
  100. package/dist/daemon/context.d.ts.map +1 -0
  101. package/dist/daemon/context.js +14 -0
  102. package/dist/daemon/context.js.map +1 -0
  103. package/dist/daemon/handlers.d.ts +79 -0
  104. package/dist/daemon/handlers.d.ts.map +1 -0
  105. package/dist/daemon/handlers.js +1260 -0
  106. package/dist/daemon/handlers.js.map +1 -0
  107. package/dist/daemon/index.d.ts +6 -0
  108. package/dist/daemon/index.d.ts.map +1 -0
  109. package/dist/daemon/index.js +7 -0
  110. package/dist/daemon/index.js.map +1 -0
  111. package/dist/daemon/lifecycle.d.ts +56 -0
  112. package/dist/daemon/lifecycle.d.ts.map +1 -0
  113. package/dist/daemon/lifecycle.js +341 -0
  114. package/dist/daemon/lifecycle.js.map +1 -0
  115. package/dist/daemon/protocol.d.ts +174 -0
  116. package/dist/daemon/protocol.d.ts.map +1 -0
  117. package/dist/daemon/protocol.js +3 -0
  118. package/dist/daemon/protocol.js.map +1 -0
  119. package/dist/daemon/recovery.d.ts +37 -0
  120. package/dist/daemon/recovery.d.ts.map +1 -0
  121. package/dist/daemon/recovery.js +197 -0
  122. package/dist/daemon/recovery.js.map +1 -0
  123. package/dist/daemon/server.d.ts +31 -0
  124. package/dist/daemon/server.d.ts.map +1 -0
  125. package/dist/daemon/server.js +294 -0
  126. package/dist/daemon/server.js.map +1 -0
  127. package/dist/daemon/socket.d.ts +18 -0
  128. package/dist/daemon/socket.d.ts.map +1 -0
  129. package/dist/daemon/socket.js +36 -0
  130. package/dist/daemon/socket.js.map +1 -0
  131. package/dist/daemon/state.d.ts +60 -0
  132. package/dist/daemon/state.d.ts.map +1 -0
  133. package/dist/daemon/state.js +156 -0
  134. package/dist/daemon/state.js.map +1 -0
  135. package/dist/daemon/systemd.d.ts +19 -0
  136. package/dist/daemon/systemd.d.ts.map +1 -0
  137. package/dist/daemon/systemd.js +131 -0
  138. package/dist/daemon/systemd.js.map +1 -0
  139. package/dist/hooks/claude-code-hook.d.ts +32 -0
  140. package/dist/hooks/claude-code-hook.d.ts.map +1 -0
  141. package/dist/hooks/claude-code-hook.js +112 -0
  142. package/dist/hooks/claude-code-hook.js.map +1 -0
  143. package/dist/instructions-template.d.ts +9 -0
  144. package/dist/instructions-template.d.ts.map +1 -0
  145. package/dist/instructions-template.js +123 -0
  146. package/dist/instructions-template.js.map +1 -0
  147. package/dist/logger.d.ts +25 -0
  148. package/dist/logger.d.ts.map +1 -0
  149. package/dist/logger.js +44 -0
  150. package/dist/logger.js.map +1 -0
  151. package/dist/loop.d.ts +88 -0
  152. package/dist/loop.d.ts.map +1 -0
  153. package/dist/loop.js +161 -0
  154. package/dist/loop.js.map +1 -0
  155. package/dist/orchestrator-instructions-template.d.ts +13 -0
  156. package/dist/orchestrator-instructions-template.d.ts.map +1 -0
  157. package/dist/orchestrator-instructions-template.js +147 -0
  158. package/dist/orchestrator-instructions-template.js.map +1 -0
  159. package/dist/output.d.ts +12 -0
  160. package/dist/output.d.ts.map +1 -0
  161. package/dist/output.js +25 -0
  162. package/dist/output.js.map +1 -0
  163. package/dist/plugin/pit.js +57 -0
  164. package/dist/session.d.ts +55 -0
  165. package/dist/session.d.ts.map +1 -0
  166. package/dist/session.js +135 -0
  167. package/dist/session.js.map +1 -0
  168. package/dist/setup.d.ts +92 -0
  169. package/dist/setup.d.ts.map +1 -0
  170. package/dist/setup.js +382 -0
  171. package/dist/setup.js.map +1 -0
  172. package/dist/shell-quote.d.ts +16 -0
  173. package/dist/shell-quote.d.ts.map +1 -0
  174. package/dist/shell-quote.js +18 -0
  175. package/dist/shell-quote.js.map +1 -0
  176. package/dist/signals.d.ts +17 -0
  177. package/dist/signals.d.ts.map +1 -0
  178. package/dist/signals.js +26 -0
  179. package/dist/signals.js.map +1 -0
  180. package/dist/state-machine.d.ts +74 -0
  181. package/dist/state-machine.d.ts.map +1 -0
  182. package/dist/state-machine.js +153 -0
  183. package/dist/state-machine.js.map +1 -0
  184. package/dist/tmux.d.ts +101 -0
  185. package/dist/tmux.d.ts.map +1 -0
  186. package/dist/tmux.js +208 -0
  187. package/dist/tmux.js.map +1 -0
  188. package/dist/worktree.d.ts +33 -0
  189. package/dist/worktree.d.ts.map +1 -0
  190. package/dist/worktree.js +116 -0
  191. package/dist/worktree.js.map +1 -0
  192. package/package.json +66 -0
@@ -0,0 +1,115 @@
1
+ import * as cp from "node:child_process";
2
+ import { printOutput, printError } from "../output.js";
3
+ /**
4
+ * Promise wrapper for cp.execFile.
5
+ * Called lazily so vi.mock can replace cp.execFile before the first call.
6
+ */
7
+ function execFileAsync(file, args) {
8
+ return new Promise((resolve, reject) => {
9
+ cp.execFile(file, args, (err, stdout, stderr) => {
10
+ if (err) {
11
+ reject(err);
12
+ }
13
+ else {
14
+ resolve({ stdout: String(stdout), stderr: String(stderr) });
15
+ }
16
+ });
17
+ });
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // Core logic (exported for testability)
21
+ // ---------------------------------------------------------------------------
22
+ const SEGMENT = "#{@pit-status}";
23
+ /**
24
+ * Append #{@pit-status} to the tmux server's global status-right option.
25
+ *
26
+ * Steps:
27
+ * 1. Read the current status-right value via `tmux show-options -gv status-right`.
28
+ * 2. If #{@pit-status} is already present, return { status: "already_installed" }.
29
+ * 3. Append ` #{@pit-status}` (with a space separator, or no separator if empty).
30
+ * 4. Set the new value via `tmux set-option -g status-right "<new_value>"`.
31
+ * 5. Return { status: "installed", previous, current }.
32
+ *
33
+ * Corner cases:
34
+ * - tmux not running: show-options throws → propagate with friendly error message.
35
+ * - status-right is empty/unset: set to #{@pit-status} with no leading space.
36
+ * - status-right already contains #{@pit-status}: idempotent, return already_installed.
37
+ * - Special characters (quotes, #): use execFileAsync args array to avoid shell injection.
38
+ *
39
+ * Note: set-option -g is SERVER-GLOBAL (applies to all sessions on this server).
40
+ * #{@pit-status} evaluates to empty string when the @pit-status option is unset,
41
+ * so it is invisible when pit isn't running.
42
+ */
43
+ export async function installStatus() {
44
+ // 1. Read the current status-right value
45
+ let current;
46
+ try {
47
+ const { stdout } = await execFileAsync("tmux", ["show-options", "-gv", "status-right"]);
48
+ current = stdout.trimEnd();
49
+ }
50
+ catch (err) {
51
+ const msg = err.stderr ?? err.message ?? "";
52
+ // Distinguish "tmux not running" from "unknown option" (unset value)
53
+ if (msg.includes("no server running") ||
54
+ msg.includes("error connecting") ||
55
+ msg.includes("can't connect")) {
56
+ throw new Error("tmux server not running. Start tmux first.", { cause: err });
57
+ }
58
+ // unknown option or similar — treat as empty
59
+ current = "";
60
+ }
61
+ // 2. Idempotency check
62
+ if (current.includes(SEGMENT)) {
63
+ return {
64
+ status: "already_installed",
65
+ segment: SEGMENT,
66
+ note: `#{@pit-status} is already present in status-right. No changes made.`,
67
+ };
68
+ }
69
+ // 3. Build new value
70
+ const newValue = current.length === 0 ? SEGMENT : `${current} ${SEGMENT}`;
71
+ // 4. Apply via execFileAsync (no shell interpolation — safe for special chars)
72
+ await execFileAsync("tmux", ["set-option", "-g", "status-right", newValue]);
73
+ // 5. Return result
74
+ return {
75
+ status: "installed",
76
+ segment: SEGMENT,
77
+ previous: current,
78
+ current: newValue,
79
+ note: `Appended ${SEGMENT} to status-right (server-global). ${SEGMENT} evaluates to empty string when pit is not running, so it is invisible until pit starts. To persist across tmux restarts, add to tmux.conf: set-option -g status-right "${newValue}"`,
80
+ };
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Command registration
84
+ // ---------------------------------------------------------------------------
85
+ export function registerInstallStatus(program) {
86
+ program
87
+ .command("install-status")
88
+ .description("Append #{@pit-status} to the tmux status bar (server-global status-right option)")
89
+ .action(async (_opts, cmd) => {
90
+ const pretty = (cmd.parent?.opts()).pretty ?? false;
91
+ try {
92
+ const result = await installStatus();
93
+ if (pretty) {
94
+ if (result.status === "already_installed") {
95
+ process.stdout.write(`Already installed: ${result.segment} is already in status-right.\n`);
96
+ process.stdout.write(`Note: ${result.note}\n`);
97
+ }
98
+ else {
99
+ process.stdout.write(`Installed: ${result.segment} appended to status-right.\n`);
100
+ process.stdout.write(`Previous: ${result.previous}\n`);
101
+ process.stdout.write(`Current: ${result.current}\n`);
102
+ process.stdout.write(`\nNote: ${result.note}\n`);
103
+ }
104
+ }
105
+ else {
106
+ printOutput(result, false);
107
+ }
108
+ }
109
+ catch (err) {
110
+ printError({ error: `Failed to install status segment: ${err.message}` }, pretty);
111
+ process.exit(1);
112
+ }
113
+ });
114
+ }
115
+ //# sourceMappingURL=install-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-status.js","sourceRoot":"","sources":["../../src/commands/install-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Command } from "commander";
2
+ export interface LogOutput {
3
+ epic: string;
4
+ content: string;
5
+ }
6
+ export declare function registerLog(program: Command): void;
7
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+DlD"}
@@ -0,0 +1,60 @@
1
+ import * as crypto from "node:crypto";
2
+ import { getClientOrFail } from "./shared.js";
3
+ import { printError } from "../output.js";
4
+ export function registerLog(program) {
5
+ program
6
+ .command("log <epic>")
7
+ .description("Show log output for an epic")
8
+ .option("--lines <n>", "Number of lines to show", "50")
9
+ .option("--raw", "Show raw log output")
10
+ .action(async (epic, opts, cmd) => {
11
+ const pretty = (cmd.parent?.opts()).pretty ?? false;
12
+ // Validate --lines value
13
+ const linesNum = parseInt(opts.lines, 10);
14
+ if (!Number.isInteger(linesNum) || linesNum < 1) {
15
+ printError({ error: `invalid --lines value: must be >= 1` }, pretty);
16
+ process.exit(1);
17
+ return;
18
+ }
19
+ const client = await getClientOrFail({ tmuxSession: "pit" });
20
+ try {
21
+ const response = await client.send({
22
+ id: crypto.randomUUID(),
23
+ method: "log",
24
+ params: {
25
+ epic,
26
+ lines: linesNum,
27
+ raw: opts.raw ?? false,
28
+ },
29
+ });
30
+ const result = response;
31
+ if (!result.success) {
32
+ printError({ error: result.error?.message || "Log command failed" }, pretty);
33
+ process.exit(1);
34
+ return;
35
+ }
36
+ const logResult = result.result;
37
+ if (!logResult) {
38
+ printError({ error: "No result returned from daemon" }, pretty);
39
+ process.exit(1);
40
+ return;
41
+ }
42
+ // --raw or --pretty: print raw terminal text with no JSON wrapper
43
+ if (opts.raw ?? pretty) {
44
+ process.stdout.write(logResult.output);
45
+ }
46
+ else {
47
+ // Transform to legacy format
48
+ const legacyOutput = {
49
+ epic: logResult.epic,
50
+ content: logResult.output,
51
+ };
52
+ console.log(JSON.stringify(legacyOutput));
53
+ }
54
+ }
55
+ finally {
56
+ client.close();
57
+ }
58
+ });
59
+ }
60
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAO1C,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,aAAa,EAAE,yBAAyB,EAAE,IAAI,CAAC;SACtD,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAsC,EAAE,GAAY,EAAE,EAAE;QACnF,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAA2B,CAAA,CAAC,MAAM,IAAI,KAAK,CAAC;QAE5E,yBAAyB;QACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAChD,UAAU,CAAC,EAAE,KAAK,EAAE,qCAAqC,EAAE,EAAE,MAAM,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBACjC,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE;oBACN,IAAI;oBACJ,KAAK,EAAE,QAAQ;oBACf,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,KAAK;iBACV;aACf,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAId,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,oBAAoB,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,UAAU,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,kEAAkE;YAClE,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,MAAM,YAAY,GAAc;oBAC9B,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,OAAO,EAAE,SAAS,CAAC,MAAM;iBAC1B,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Command } from "commander";
2
+ export interface PauseOutput {
3
+ epic: string;
4
+ previousState: string;
5
+ currentState: "paused";
6
+ }
7
+ export interface PauseTimeoutOutput {
8
+ epic: string;
9
+ warning: string;
10
+ }
11
+ export declare function registerPause(program: Command): void;
12
+ //# sourceMappingURL=pause.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../src/commands/pause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,QAAQ,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkDpD"}
@@ -0,0 +1,47 @@
1
+ import * as crypto from "node:crypto";
2
+ import { getClientOrFail } from "./shared.js";
3
+ import { printError, printOutput } from "../output.js";
4
+ export function registerPause(program) {
5
+ program
6
+ .command("pause <epic>")
7
+ .description("Pause a running epic")
8
+ .action(async (epic, _opts, cmd) => {
9
+ const pretty = (cmd.parent?.opts()).pretty ?? false;
10
+ const client = await getClientOrFail({ tmuxSession: "pit" });
11
+ try {
12
+ const response = await client.send({
13
+ id: crypto.randomUUID(),
14
+ method: "pause",
15
+ params: { epic },
16
+ });
17
+ const result = response;
18
+ if (!result.success) {
19
+ printError({ error: result.error?.message || "Pause failed" }, pretty);
20
+ process.exit(1);
21
+ return;
22
+ }
23
+ const pauseResult = result.result;
24
+ if (!pauseResult) {
25
+ printError({ error: "No result returned from daemon" }, pretty);
26
+ process.exit(1);
27
+ return;
28
+ }
29
+ if (pretty) {
30
+ process.stdout.write(`Paused epic ${pauseResult.epic} (${pauseResult.previousState} → ${pauseResult.newState})\n`);
31
+ }
32
+ else {
33
+ // Transform to legacy format
34
+ const legacyOutput = {
35
+ epic: pauseResult.epic,
36
+ previousState: pauseResult.previousState,
37
+ currentState: pauseResult.newState,
38
+ };
39
+ printOutput(legacyOutput, false);
40
+ }
41
+ }
42
+ finally {
43
+ client.close();
44
+ }
45
+ });
46
+ }
47
+ //# sourceMappingURL=pause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause.js","sourceRoot":"","sources":["../../src/commands/pause.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAavD,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,KAA8B,EAAE,GAAY,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAA2B,CAAA,CAAC,MAAM,IAAI,KAAK,CAAC;QAE5E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBACjC,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE,IAAI,EAAiB;aAChC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAId,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,UAAU,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,eAAe,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,aAAa,MAAM,WAAW,CAAC,QAAQ,KAAK,CAC7F,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,MAAM,YAAY,GAAgB;oBAChC,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,aAAa,EAAE,WAAW,CAAC,aAAa;oBACxC,YAAY,EAAE,WAAW,CAAC,QAAQ;iBACnC,CAAC;gBACF,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Command } from "commander";
2
+ export interface ResumeOutput {
3
+ epic: string;
4
+ previousState: "paused";
5
+ currentState: string;
6
+ }
7
+ export interface ResumeTimeoutOutput {
8
+ epic: string;
9
+ warning: string;
10
+ }
11
+ export declare function registerResume(program: Command): void;
12
+ //# sourceMappingURL=resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,QAAQ,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6DrD"}
@@ -0,0 +1,59 @@
1
+ import * as crypto from "node:crypto";
2
+ import { getClientOrFail } from "./shared.js";
3
+ import { printError, printOutput } from "../output.js";
4
+ export function registerResume(program) {
5
+ program
6
+ .command("resume <epic>")
7
+ .description("Resume a paused epic")
8
+ .option("--message <text>", "Message to send to the agent")
9
+ .action(async (epic, opts, cmd) => {
10
+ const pretty = (cmd.parent?.opts()).pretty ?? false;
11
+ const client = await getClientOrFail({ tmuxSession: "pit" });
12
+ try {
13
+ const response = await client.send({
14
+ id: crypto.randomUUID(),
15
+ method: "resume",
16
+ params: {
17
+ epic,
18
+ ...(opts.message && opts.message.length > 0 ? { message: opts.message } : {}),
19
+ },
20
+ });
21
+ const result = response;
22
+ if (!result.success) {
23
+ printError({ error: result.error?.message || "Resume failed" }, pretty);
24
+ process.exit(1);
25
+ return;
26
+ }
27
+ const resumeResult = result.result;
28
+ if (!resumeResult) {
29
+ printError({ error: "No result returned from daemon" }, pretty);
30
+ process.exit(1);
31
+ return;
32
+ }
33
+ if (pretty) {
34
+ if (resumeResult.warning) {
35
+ process.stdout.write(`Warning: ${resumeResult.warning}\n`);
36
+ }
37
+ else {
38
+ process.stdout.write(`Resumed epic ${resumeResult.epic} (${resumeResult.previousState} → ${resumeResult.newState})\n`);
39
+ }
40
+ }
41
+ else {
42
+ // Transform to legacy format
43
+ const legacyOutput = {
44
+ epic: resumeResult.epic,
45
+ previousState: resumeResult.previousState,
46
+ currentState: resumeResult.newState,
47
+ };
48
+ if (resumeResult.warning) {
49
+ legacyOutput.currentState = resumeResult.warning;
50
+ }
51
+ printOutput(legacyOutput, false);
52
+ }
53
+ }
54
+ finally {
55
+ client.close();
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAavD,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAA0B,EAAE,GAAY,EAAE,EAAE;QACvE,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAA2B,CAAA,CAAC,MAAM,IAAI,KAAK,CAAC;QAE5E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBACjC,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE;oBACN,IAAI;oBACJ,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC9D;aAClB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAId,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,MAAM,CAAC,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,UAAU,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;gBAC7D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gBAAgB,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,aAAa,MAAM,YAAY,CAAC,QAAQ,KAAK,CACjG,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,MAAM,YAAY,GAAiB;oBACjC,IAAI,EAAE,YAAY,CAAC,IAAI;oBACvB,aAAa,EAAE,YAAY,CAAC,aAAa;oBACzC,YAAY,EAAE,YAAY,CAAC,QAAQ;iBACpC,CAAC;gBACF,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBACzB,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC;gBACnD,CAAC;gBACD,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DaemonClientConnection } from "../daemon/client.js";
2
+ export declare function resolveProjectRoot(): Promise<string>;
3
+ export declare function getClientOrFail(options: {
4
+ tmuxSession?: string;
5
+ pretty?: boolean;
6
+ }): Promise<DaemonClientConnection>;
7
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIlE,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG1D;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAyClC"}
@@ -0,0 +1,56 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { discoverDaemon, connectWithRetry, DaemonConnectionError, } from "../daemon/client.js";
4
+ const execFileAsync = promisify(execFile);
5
+ export async function resolveProjectRoot() {
6
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--show-toplevel"]);
7
+ return stdout.trim();
8
+ }
9
+ export async function getClientOrFail(options) {
10
+ const projectRoot = await resolveProjectRoot();
11
+ const info = await discoverDaemon(projectRoot, options.tmuxSession ?? "pit");
12
+ if (!info.running) {
13
+ printError("No active session. Run pit start first.", options.pretty);
14
+ process.exit(1);
15
+ }
16
+ try {
17
+ return await connectWithRetry(info.socketPath);
18
+ }
19
+ catch (err) {
20
+ if (err instanceof Error && err.name === "DaemonVersionError") {
21
+ const versionErr = err;
22
+ printError(`Daemon version ${versionErr.daemonVersion} incompatible with CLI ${versionErr.clientVersion}. ` +
23
+ `Run: pit daemon restart`, options.pretty);
24
+ process.exit(1);
25
+ }
26
+ if (err instanceof DaemonConnectionError) {
27
+ if (err.code === "CONNECTION_REFUSED") {
28
+ printError("Daemon not responding (may have crashed). Try: pit daemon start", options.pretty);
29
+ // Clean up stale socket file
30
+ await cleanupStaleSocket(info.socketPath);
31
+ }
32
+ process.exit(1);
33
+ }
34
+ // For other errors, just print and exit
35
+ printError(`Failed to connect to daemon: ${err instanceof Error ? err.message : "Unknown error"}`, options.pretty);
36
+ process.exit(1);
37
+ }
38
+ }
39
+ function printError(message, pretty = false) {
40
+ if (pretty) {
41
+ console.error(`Error: ${message}`);
42
+ }
43
+ else {
44
+ console.error(JSON.stringify({ error: message }));
45
+ }
46
+ }
47
+ async function cleanupStaleSocket(socketPath) {
48
+ try {
49
+ const { unlink } = await import("node:fs/promises");
50
+ await unlink(socketPath);
51
+ }
52
+ catch {
53
+ // Ignore cleanup errors
54
+ }
55
+ }
56
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,cAAc,EACd,gBAAgB,EAEhB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAChF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAGrC;IACC,MAAM,WAAW,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;IAE7E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,UAAU,CAAC,yCAAyC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,GAA8C,CAAC;YAClE,UAAU,CACR,kBAAkB,UAAU,CAAC,aAAa,0BAA0B,UAAU,CAAC,aAAa,IAAI;gBAC9F,yBAAyB,EAC3B,OAAO,CAAC,MAAM,CACf,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;YACzC,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBACtC,UAAU,CACR,iEAAiE,EACjE,OAAO,CAAC,MAAM,CACf,CAAC;gBACF,6BAA6B;gBAC7B,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,wCAAwC;QACxC,UAAU,CACR,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EACtF,OAAO,CAAC,MAAM,CACf,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,MAAM,GAAG,KAAK;IACjD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Command } from "commander";
2
+ /**
3
+ * Parse `--epic-model` entries (`<epic>=<model>`) into a `Record<string, string>`.
4
+ *
5
+ * - Splits on the **first** `=` only (model names may contain `=`).
6
+ * - Missing `=` → calls `onError` with a descriptive message.
7
+ * - Epic not in `validEpics` → logs a warning and skips.
8
+ * - Duplicate epic → last value wins (natural from iteration order).
9
+ */
10
+ export declare function parseEpicModels(entries: string[], validEpics: string[], onError?: (msg: string) => never): Record<string, string>;
11
+ export declare function registerStart(program: Command): void;
12
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BzC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,KAEzB,GACA,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxB;AAsED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiMpD"}