@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,274 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import * as crypto from "node:crypto";
4
+ import { createLogger } from "../logger.js";
5
+ import { printError, printOutput } from "../output.js";
6
+ import { removeLock } from "../session.js";
7
+ import { startSession } from "../setup.js";
8
+ import { ensureDaemon, connectToDaemon } from "../daemon/client.js";
9
+ import { loadPitConfig, resolveConfig } from "../config.js";
10
+ const execFileAsync = promisify(execFile);
11
+ const logger = createLogger();
12
+ // ---------------------------------------------------------------------------
13
+ // Helpers
14
+ // ---------------------------------------------------------------------------
15
+ /** Commander.js repeatable-option accumulator. */
16
+ function collect(value, previous) {
17
+ return previous.concat([value]);
18
+ }
19
+ /**
20
+ * Parse `--epic-model` entries (`<epic>=<model>`) into a `Record<string, string>`.
21
+ *
22
+ * - Splits on the **first** `=` only (model names may contain `=`).
23
+ * - Missing `=` → calls `onError` with a descriptive message.
24
+ * - Epic not in `validEpics` → logs a warning and skips.
25
+ * - Duplicate epic → last value wins (natural from iteration order).
26
+ */
27
+ export function parseEpicModels(entries, validEpics, onError = (msg) => {
28
+ throw new Error(msg);
29
+ }) {
30
+ const epicSet = new Set(validEpics);
31
+ const result = {};
32
+ for (const entry of entries) {
33
+ const eqIdx = entry.indexOf("=");
34
+ if (eqIdx === -1) {
35
+ onError(`Invalid --epic-model format "${entry}", expected <epic>=<model>`);
36
+ }
37
+ const epic = entry.slice(0, eqIdx);
38
+ const model = entry.slice(eqIdx + 1);
39
+ if (!epicSet.has(epic)) {
40
+ console.error(`[pit] Warning: --epic-model epic "${epic}" is not in --epics list, skipping`);
41
+ continue;
42
+ }
43
+ result[epic] = model;
44
+ }
45
+ return result;
46
+ }
47
+ /**
48
+ * Run session directly in current process (original behavior)
49
+ * Used for --local mode when daemon should be bypassed
50
+ */
51
+ async function runSessionDirectly(options, pretty) {
52
+ // Resolve project root early so we can use it in exit handlers
53
+ let projectRoot;
54
+ try {
55
+ const { stdout: gitRoot } = await execFileAsync("git", ["rev-parse", "--show-toplevel"]);
56
+ projectRoot = gitRoot.trim();
57
+ }
58
+ catch (err) {
59
+ printError({ error: `Failed to resolve git root: ${err.message}` }, pretty);
60
+ process.exit(1);
61
+ return;
62
+ }
63
+ let result;
64
+ try {
65
+ result = await startSession(options, logger);
66
+ }
67
+ catch (err) {
68
+ printError({ error: err.message }, pretty);
69
+ process.exit(1);
70
+ return;
71
+ }
72
+ // Output the serializable setup result (loops contains live handles, omit them)
73
+ const { loops: _loops, ...serializableResult } = result;
74
+ printOutput(serializableResult, pretty);
75
+ // Keep the process alive while loops are running.
76
+ // Signal files and the event loop keep Node running as long as watchers are active.
77
+ // However, to ensure the process doesn't exit prematurely due to timing issues
78
+ // or edge cases where all watchers might fail, we use an explicit keepalive timer.
79
+ const keepaliveInterval = setInterval(() => {
80
+ // Keepalive timer to prevent process exit
81
+ }, 60000);
82
+ const stopAll = () => {
83
+ clearInterval(keepaliveInterval);
84
+ for (const [, handle] of result.loops) {
85
+ handle.stop();
86
+ }
87
+ };
88
+ process.once("SIGINT", async () => {
89
+ logger.info("Received SIGINT, stopping loops");
90
+ stopAll();
91
+ try {
92
+ await removeLock(projectRoot);
93
+ }
94
+ catch (err) {
95
+ // Log but don't fail - process is exiting anyway
96
+ logger.warn("Failed to remove lock file on exit", { error: String(err) });
97
+ }
98
+ process.exit(0);
99
+ });
100
+ process.once("SIGTERM", async () => {
101
+ logger.info("Received SIGTERM, stopping loops");
102
+ stopAll();
103
+ try {
104
+ await removeLock(projectRoot);
105
+ }
106
+ catch (err) {
107
+ // Log but don't fail - process is exiting anyway
108
+ logger.warn("Failed to remove lock file on exit", { error: String(err) });
109
+ }
110
+ process.exit(0);
111
+ });
112
+ }
113
+ export function registerStart(program) {
114
+ program
115
+ .command("start")
116
+ .description("Start agent sessions for the given epics")
117
+ .requiredOption("--epics <ids>", "Comma-separated beads epic IDs")
118
+ .option("--agent <type>", "Agent type to use", "auto")
119
+ .option("--worktree-dir <path>", "Directory for git worktrees", ".worktrees")
120
+ .option("--base-branch <branch>", "Base branch to create worktrees from", "main")
121
+ .option("--tmux-session <name>", "tmux session name", "pit")
122
+ .option("--prompt-template <path>", "Path to prompt template file")
123
+ .option("--instructions-template <path>", "Path to instructions template file")
124
+ .option("--ticket-timeout <minutes>", "Ticket timeout in minutes (0 or 'none' to disable)")
125
+ .option("--model <value>", "Model to pass to the agent CLI")
126
+ .option("--epic-model <mapping>", "Per-epic model override (<epic>=<model>), repeatable", collect, [])
127
+ .option("--detach", "Run pit detached from parent process (prevents timeouts)")
128
+ .option("--local", "Run in local mode (bypass daemon, for debugging)")
129
+ .action(async (opts, cmd) => {
130
+ const pretty = cmd.parent?.opts().pretty;
131
+ // Handle detached mode - show deprecation warning and continue with daemon mode
132
+ if (opts.detach) {
133
+ console.warn("[pit] --detach is deprecated, daemon mode is now default");
134
+ }
135
+ // Build CLI overrides from only explicitly-set flags
136
+ const cliFlags = {};
137
+ if (cmd.getOptionValueSource("agent") === "cli") {
138
+ cliFlags.agent = opts.agent;
139
+ }
140
+ if (cmd.getOptionValueSource("worktreeDir") === "cli") {
141
+ cliFlags.worktreeDir = opts.worktreeDir;
142
+ }
143
+ if (cmd.getOptionValueSource("baseBranch") === "cli") {
144
+ cliFlags.baseBranch = opts.baseBranch;
145
+ }
146
+ if (cmd.getOptionValueSource("tmuxSession") === "cli") {
147
+ cliFlags.tmuxSession = opts.tmuxSession;
148
+ }
149
+ if (cmd.getOptionValueSource("ticketTimeout") === "cli") {
150
+ const raw = opts.ticketTimeout;
151
+ if (raw === "none" || raw === "0") {
152
+ cliFlags.ticketTimeout = null;
153
+ }
154
+ else {
155
+ const parsed = Number(raw);
156
+ if (!Number.isFinite(parsed) || parsed < 0) {
157
+ printError({ error: `Invalid --ticket-timeout value: ${raw}` }, pretty);
158
+ process.exit(1);
159
+ return;
160
+ }
161
+ cliFlags.ticketTimeout = parsed;
162
+ }
163
+ }
164
+ if (cmd.getOptionValueSource("model") === "cli") {
165
+ cliFlags.model = opts.model;
166
+ }
167
+ // Resolve project root early (needed for config loading)
168
+ let projectRoot;
169
+ try {
170
+ const { stdout: gitRoot } = await execFileAsync("git", ["rev-parse", "--show-toplevel"]);
171
+ projectRoot = gitRoot.trim();
172
+ }
173
+ catch (err) {
174
+ printError({ error: `Failed to resolve git root: ${err.message}` }, pretty);
175
+ process.exit(1);
176
+ return;
177
+ }
178
+ // Load config and resolve with CLI overrides
179
+ const fileConfig = loadPitConfig(projectRoot);
180
+ const resolved = resolveConfig(cliFlags, fileConfig);
181
+ // Handle local mode - bypass daemon and run directly
182
+ if (opts.local) {
183
+ const epics = opts.epics.split(",").map((s) => s.trim());
184
+ // Validate --epic-model entries (errors out on bad format)
185
+ parseEpicModels(opts.epicModel, epics, (msg) => {
186
+ program.error(msg);
187
+ });
188
+ const options = {
189
+ agent: resolved.agent,
190
+ epics,
191
+ worktreeDir: resolved.worktreeDir,
192
+ baseBranch: resolved.baseBranch,
193
+ tmuxSession: resolved.tmuxSession,
194
+ promptTemplate: opts.promptTemplate,
195
+ instructionsTemplate: opts.instructionsTemplate,
196
+ clearDelay: resolved.clearDelay,
197
+ initDelay: resolved.initDelay,
198
+ model: resolved.model ?? undefined,
199
+ };
200
+ return runSessionDirectly(options, pretty);
201
+ }
202
+ // Default: Use daemon client mode
203
+ // Build StartParams with only CLI-overridden fields so the daemon
204
+ // can merge them with its own file config via resolveConfig
205
+ const epics = opts.epics.split(",").map((s) => s.trim());
206
+ const startParams = { epics };
207
+ if (cliFlags.agent !== undefined)
208
+ startParams.agent = cliFlags.agent;
209
+ if (cliFlags.worktreeDir !== undefined)
210
+ startParams.worktreeDir = cliFlags.worktreeDir;
211
+ if (cliFlags.baseBranch !== undefined)
212
+ startParams.baseBranch = cliFlags.baseBranch;
213
+ if (cliFlags.ticketTimeout !== undefined)
214
+ startParams.ticketTimeout = cliFlags.ticketTimeout;
215
+ if (opts.promptTemplate)
216
+ startParams.promptTemplate = opts.promptTemplate;
217
+ if (opts.instructionsTemplate)
218
+ startParams.instructionsTemplate = opts.instructionsTemplate;
219
+ if (cliFlags.model !== undefined)
220
+ startParams.model = cliFlags.model;
221
+ const epicModels = parseEpicModels(opts.epicModel, epics, (msg) => {
222
+ program.error(msg);
223
+ });
224
+ if (Object.keys(epicModels).length > 0)
225
+ startParams.epicModels = epicModels;
226
+ try {
227
+ // Ensure daemon is running (auto-starts if needed)
228
+ const socketPath = await ensureDaemon(projectRoot, resolved.tmuxSession);
229
+ // Connect and send start request
230
+ const client = await connectToDaemon(socketPath);
231
+ try {
232
+ // Send request and handle response
233
+ const response = await client.send({
234
+ id: crypto.randomUUID(),
235
+ method: "start",
236
+ params: startParams,
237
+ });
238
+ if (!response.success || !response.result) {
239
+ throw new Error(response.error?.message || "Daemon start request failed");
240
+ }
241
+ // Extract the result from the daemon response
242
+ const startResult = response.result;
243
+ // Convert daemon response to match existing output format
244
+ const output = {
245
+ status: "started",
246
+ sessionId: startResult.sessionId,
247
+ tmuxSession: resolved.tmuxSession,
248
+ epics: startResult.epics.reduce((acc, epic) => {
249
+ acc[epic.epic] = {
250
+ state: epic.status === "ok" ? "running" : "error",
251
+ window: epic.status === "ok" ? `epic-${epic.epic}` : undefined,
252
+ worktreePath: epic.worktreePath,
253
+ error: epic.error,
254
+ };
255
+ return acc;
256
+ }, {}),
257
+ };
258
+ printOutput(output, pretty);
259
+ }
260
+ finally {
261
+ client.close();
262
+ }
263
+ }
264
+ catch (err) {
265
+ printError({
266
+ error: `Failed to start via daemon: ${err.message}`,
267
+ suggestion: "Try 'pit start --local' to run in local mode for debugging",
268
+ }, pretty);
269
+ process.exit(1);
270
+ return;
271
+ }
272
+ });
273
+ }
274
+ //# 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,24 @@
1
+ import type { Command } from "commander";
2
+ import type { DaemonClientConnection } from "../daemon/client.js";
3
+ import type { StatusResult } from "../daemon/protocol.js";
4
+ export interface EpicStatus {
5
+ epic: string;
6
+ state: "running" | "paused" | "done";
7
+ progress: {
8
+ done: number;
9
+ total: number;
10
+ };
11
+ pauseReason: string | null;
12
+ }
13
+ export interface StatusOutput {
14
+ status: "active" | "inactive";
15
+ epics: Record<string, {
16
+ state: string;
17
+ progress: string;
18
+ reason?: string;
19
+ }>;
20
+ }
21
+ export declare function formatPrettyTable(result: StatusResult): string;
22
+ export declare function getStatusOutput(client: DaemonClientConnection): Promise<StatusResult>;
23
+ export declare function registerStatus(program: Command): void;
24
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,KAAK,EAAE,MAAM,CACX,MAAM,EACN;QACE,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CACF,CAAC;CACH;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAsB9D;AAMD,wBAAsB,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkB3F;AAQD,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsDrD"}
@@ -0,0 +1,101 @@
1
+ import { discoverDaemon, connectToDaemon } from "../daemon/client.js";
2
+ import { printOutput } from "../output.js";
3
+ import { resolveProjectRoot } from "./shared.js";
4
+ // ---------------------------------------------------------------------------
5
+ // Pretty output helpers
6
+ // ---------------------------------------------------------------------------
7
+ export function formatPrettyTable(result) {
8
+ const header = ["Epic", "State", "Progress", "Reason"];
9
+ const rows = result.epics.map((e) => [
10
+ e.epic,
11
+ e.state,
12
+ e.progress ? `${e.progress.done}/${e.progress.total}` : "-",
13
+ e.pauseReason ?? "-",
14
+ ]);
15
+ // Compute column widths
16
+ const allRows = [header, ...rows];
17
+ const widths = header.map((_, col) => Math.max(...allRows.map((row) => (row[col] ?? "").length)));
18
+ function pad(s, w) {
19
+ return s.padEnd(w);
20
+ }
21
+ const headerLine = header.map((h, i) => pad(h, widths[i] ?? 0)).join(" ");
22
+ const separator = widths.map((w) => "-".repeat(w)).join(" ");
23
+ const dataLines = rows.map((row) => row.map((cell, i) => pad(cell, widths[i] ?? 0)).join(" "));
24
+ return [headerLine, separator, ...dataLines].join("\n");
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Core status logic (exported for testability)
28
+ // ---------------------------------------------------------------------------
29
+ export async function getStatusOutput(client) {
30
+ const response = await client.send({
31
+ id: crypto.randomUUID(),
32
+ method: "status",
33
+ params: {},
34
+ });
35
+ const envelope = response;
36
+ if (!envelope.success) {
37
+ throw new Error(envelope.error?.message ?? "Status request failed");
38
+ }
39
+ if (!envelope.result) {
40
+ throw new Error("No result returned from daemon");
41
+ }
42
+ return envelope.result;
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Command registration
46
+ // ---------------------------------------------------------------------------
47
+ import * as crypto from "node:crypto";
48
+ export function registerStatus(program) {
49
+ program
50
+ .command("status")
51
+ .description("Show status of all running epics")
52
+ .action(async (_opts, cmd) => {
53
+ const pretty = cmd.parent?.opts().pretty;
54
+ // Resolve project root — if not in a git repo, there's no daemon
55
+ let projectRoot;
56
+ try {
57
+ projectRoot = await resolveProjectRoot();
58
+ }
59
+ catch {
60
+ // Not in a git repo → no daemon can be running
61
+ const inactiveOutput = { status: "inactive", epics: {} };
62
+ printOutput(inactiveOutput, pretty);
63
+ return;
64
+ }
65
+ // Check if daemon is running
66
+ const info = await discoverDaemon(projectRoot, "pit");
67
+ if (!info.running) {
68
+ // No daemon = no active session
69
+ const inactiveOutput = { status: "inactive", epics: {} };
70
+ printOutput(inactiveOutput, pretty);
71
+ return;
72
+ }
73
+ // Connect to daemon and get status
74
+ const client = await connectToDaemon(info.socketPath);
75
+ try {
76
+ const result = await getStatusOutput(client);
77
+ if (pretty) {
78
+ process.stdout.write(formatPrettyTable(result) + "\n");
79
+ }
80
+ else {
81
+ // Transform status output for backward compatibility
82
+ const compatOutput = {
83
+ sessionId: result.sessionId,
84
+ tmuxSession: result.tmuxSession,
85
+ epics: result.epics.map((e) => ({
86
+ epic: e.epic,
87
+ state: e.state,
88
+ progress: e.progress,
89
+ pauseReason: e.pauseReason,
90
+ lastEvent: null, // Not available in daemon mode yet
91
+ })),
92
+ };
93
+ printOutput(compatOutput, false);
94
+ }
95
+ }
96
+ finally {
97
+ client.close();
98
+ }
99
+ });
100
+ }
101
+ //# 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,11 @@
1
+ import type { Command } from "commander";
2
+ export interface StopResult {
3
+ epic: string;
4
+ status: "stopped" | "already_done" | "timeout";
5
+ }
6
+ export interface StopOutput {
7
+ sessionId: string;
8
+ results: StopResult[];
9
+ }
10
+ export declare function registerStop(program: Command): void;
11
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsDnD"}
@@ -0,0 +1,52 @@
1
+ import * as crypto from "node:crypto";
2
+ import { getClientOrFail } from "./shared.js";
3
+ import { printError, printOutput } from "../output.js";
4
+ export function registerStop(program) {
5
+ program
6
+ .command("stop")
7
+ .description("Stop all running epics")
8
+ .argument("[epic]", "Specific epic to stop (if not provided, stops all epics)")
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: "stop",
16
+ params: { epic },
17
+ });
18
+ const result = response;
19
+ if (!result.success) {
20
+ printError({ error: result.error?.message || "Stop command failed" }, pretty);
21
+ process.exit(1);
22
+ return;
23
+ }
24
+ const daemonResult = result.result;
25
+ if (!daemonResult) {
26
+ printError({ error: "No result returned from daemon" }, pretty);
27
+ process.exit(1);
28
+ return;
29
+ }
30
+ if (pretty) {
31
+ for (const stoppedEpic of daemonResult.stopped) {
32
+ process.stdout.write(`Epic ${stoppedEpic}: stopped\n`);
33
+ }
34
+ }
35
+ else {
36
+ // Transform to legacy format
37
+ const legacyOutput = {
38
+ sessionId: "unknown", // Not available in daemon response
39
+ results: daemonResult.stopped.map((epic) => ({
40
+ epic,
41
+ status: "stopped",
42
+ })),
43
+ };
44
+ printOutput(legacyOutput, false);
45
+ }
46
+ }
47
+ finally {
48
+ client.close();
49
+ }
50
+ });
51
+ }
52
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.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;AAYvD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,QAAQ,EAAE,0DAA0D,CAAC;SAC9E,MAAM,CAAC,KAAK,EAAE,IAAa,EAAE,KAAK,GAAG,EAAE,EAAE,GAAa,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAA2B,CAAA,CAAC,MAAM,IAAI,KAAK,CAAC;QAE7E,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,MAAM;gBACd,MAAM,EAAE,EAAE,IAAI,EAAgB;aAC/B,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,qBAAqB,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC9E,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;YAED,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,MAAM,WAAW,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,WAAW,aAAa,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,MAAM,YAAY,GAAe;oBAC/B,SAAS,EAAE,SAAS,EAAE,mCAAmC;oBACzD,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBAC3C,IAAI;wBACJ,MAAM,EAAE,SAAkB;qBAC3B,CAAC,CAAC;iBACJ,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,15 @@
1
+ import type { Command } from "commander";
2
+ export interface TeardownResult {
3
+ epic: string;
4
+ stopped: boolean;
5
+ windowKilled: boolean;
6
+ worktreeRemoved: boolean;
7
+ }
8
+ export interface TeardownOutput {
9
+ sessionId: string;
10
+ results: TeardownResult[];
11
+ lockRemoved: boolean;
12
+ sessionKilled: boolean;
13
+ }
14
+ export declare function registerTeardown(program: Command): void;
15
+ //# sourceMappingURL=teardown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.d.ts","sourceRoot":"","sources":["../../src/commands/teardown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgFvD"}
@@ -0,0 +1,72 @@
1
+ import * as crypto from "node:crypto";
2
+ import { getClientOrFail } from "./shared.js";
3
+ import { printError, printOutput } from "../output.js";
4
+ export function registerTeardown(program) {
5
+ program
6
+ .command("teardown [epic]")
7
+ .description("Tear down all epics (or a single epic) and clean up resources")
8
+ .option("--keep-worktrees", "Keep git worktrees after teardown (worktrees are removed by default)")
9
+ .option("--force", "Skip safety checks (stale lock, running epics)")
10
+ .action(async (epicArg, opts, cmd) => {
11
+ const pretty = (cmd?.parent?.opts()).pretty ?? false;
12
+ const client = await getClientOrFail({ tmuxSession: "pit" });
13
+ try {
14
+ const teardownParams = {
15
+ keepWorktrees: opts.keepWorktrees ?? false,
16
+ };
17
+ if (epicArg) {
18
+ teardownParams.epic = epicArg;
19
+ }
20
+ // Pass force flag when doing a full teardown (no specific epic)
21
+ if (!epicArg && opts.force) {
22
+ teardownParams.force = true;
23
+ }
24
+ const response = await client.send({
25
+ id: crypto.randomUUID(),
26
+ method: "teardown",
27
+ params: teardownParams,
28
+ });
29
+ const result = response;
30
+ if (!result.success) {
31
+ printError({ error: result.error?.message || "Teardown command failed" }, pretty);
32
+ process.exit(1);
33
+ return;
34
+ }
35
+ const daemonResult = result.result;
36
+ if (!daemonResult) {
37
+ printError({ error: "No result returned from daemon" }, pretty);
38
+ process.exit(1);
39
+ return;
40
+ }
41
+ if (pretty) {
42
+ if (epicArg) {
43
+ process.stdout.write(`Epic torn down: ${epicArg}\n`);
44
+ }
45
+ const cleaned = daemonResult.cleaned;
46
+ if (cleaned?.windows?.length > 0) {
47
+ process.stdout.write(`Windows cleaned: ${cleaned.windows.join(", ")}\n`);
48
+ }
49
+ if (cleaned?.worktrees?.length > 0) {
50
+ process.stdout.write(`Worktrees removed: ${cleaned.worktrees.join(", ")}\n`);
51
+ }
52
+ if (cleaned?.dirtyWorktrees?.length > 0) {
53
+ process.stdout.write(`Warning: worktrees removed with uncommitted changes: ${cleaned.dirtyWorktrees.join(", ")}\n`);
54
+ }
55
+ }
56
+ else {
57
+ // Transform to legacy format
58
+ const legacyOutput = {
59
+ sessionId: "unknown", // Not available in daemon response
60
+ results: [], // Daemon doesn't return individual epic results
61
+ lockRemoved: !epicArg, // Only true for full teardown
62
+ sessionKilled: !epicArg, // Only true for full teardown
63
+ };
64
+ printOutput(legacyOutput, false);
65
+ }
66
+ }
67
+ finally {
68
+ client.close();
69
+ }
70
+ });
71
+ }
72
+ //# sourceMappingURL=teardown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../src/commands/teardown.ts"],"names":[],"mappings":"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"}