@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.
- package/LICENSE +21 -0
- package/README.md +380 -0
- package/dist/adapters/claude-code.d.ts +70 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +166 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/index.d.ts +16 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +49 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/opencode.d.ts +53 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +120 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/process-utils.d.ts +29 -0
- package/dist/adapters/process-utils.d.ts.map +1 -0
- package/dist/adapters/process-utils.js +96 -0
- package/dist/adapters/process-utils.js.map +1 -0
- package/dist/adapters/types.d.ts +41 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +6 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/assets.generated.d.ts +13 -0
- package/dist/assets.generated.d.ts.map +1 -0
- package/dist/assets.generated.js +162 -0
- package/dist/assets.generated.js.map +1 -0
- package/dist/beads.d.ts +85 -0
- package/dist/beads.d.ts.map +1 -0
- package/dist/beads.js +120 -0
- package/dist/beads.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +39 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +10 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +58 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/cleanup.d.ts +13 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +174 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/daemon.d.ts +3 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +162 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/init.d.ts +20 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +125 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install-keybinding.d.ts +61 -0
- package/dist/commands/install-keybinding.d.ts.map +1 -0
- package/dist/commands/install-keybinding.js +138 -0
- package/dist/commands/install-keybinding.js.map +1 -0
- package/dist/commands/install-status.d.ts +35 -0
- package/dist/commands/install-status.d.ts.map +1 -0
- package/dist/commands/install-status.js +115 -0
- package/dist/commands/install-status.js.map +1 -0
- package/dist/commands/log.d.ts +7 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +60 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/pause.d.ts +12 -0
- package/dist/commands/pause.d.ts.map +1 -0
- package/dist/commands/pause.js +47 -0
- package/dist/commands/pause.js.map +1 -0
- package/dist/commands/resume.d.ts +12 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +59 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/shared.d.ts +7 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +56 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/start.d.ts +12 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +274 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +24 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +101 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +11 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +52 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/teardown.d.ts +15 -0
- package/dist/commands/teardown.d.ts.map +1 -0
- package/dist/commands/teardown.js +72 -0
- package/dist/commands/teardown.js.map +1 -0
- package/dist/config.d.ts +58 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +129 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/client.d.ts +38 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +254 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/context.d.ts +63 -0
- package/dist/daemon/context.d.ts.map +1 -0
- package/dist/daemon/context.js +14 -0
- package/dist/daemon/context.js.map +1 -0
- package/dist/daemon/handlers.d.ts +79 -0
- package/dist/daemon/handlers.d.ts.map +1 -0
- package/dist/daemon/handlers.js +1260 -0
- package/dist/daemon/handlers.js.map +1 -0
- package/dist/daemon/index.d.ts +6 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +7 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +56 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +341 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/protocol.d.ts +174 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +3 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/recovery.d.ts +37 -0
- package/dist/daemon/recovery.d.ts.map +1 -0
- package/dist/daemon/recovery.js +197 -0
- package/dist/daemon/recovery.js.map +1 -0
- package/dist/daemon/server.d.ts +31 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +294 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/socket.d.ts +18 -0
- package/dist/daemon/socket.d.ts.map +1 -0
- package/dist/daemon/socket.js +36 -0
- package/dist/daemon/socket.js.map +1 -0
- package/dist/daemon/state.d.ts +60 -0
- package/dist/daemon/state.d.ts.map +1 -0
- package/dist/daemon/state.js +156 -0
- package/dist/daemon/state.js.map +1 -0
- package/dist/daemon/systemd.d.ts +19 -0
- package/dist/daemon/systemd.d.ts.map +1 -0
- package/dist/daemon/systemd.js +131 -0
- package/dist/daemon/systemd.js.map +1 -0
- package/dist/hooks/claude-code-hook.d.ts +32 -0
- package/dist/hooks/claude-code-hook.d.ts.map +1 -0
- package/dist/hooks/claude-code-hook.js +112 -0
- package/dist/hooks/claude-code-hook.js.map +1 -0
- package/dist/instructions-template.d.ts +9 -0
- package/dist/instructions-template.d.ts.map +1 -0
- package/dist/instructions-template.js +123 -0
- package/dist/instructions-template.js.map +1 -0
- package/dist/logger.d.ts +25 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +44 -0
- package/dist/logger.js.map +1 -0
- package/dist/loop.d.ts +88 -0
- package/dist/loop.d.ts.map +1 -0
- package/dist/loop.js +161 -0
- package/dist/loop.js.map +1 -0
- package/dist/orchestrator-instructions-template.d.ts +13 -0
- package/dist/orchestrator-instructions-template.d.ts.map +1 -0
- package/dist/orchestrator-instructions-template.js +147 -0
- package/dist/orchestrator-instructions-template.js.map +1 -0
- package/dist/output.d.ts +12 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +25 -0
- package/dist/output.js.map +1 -0
- package/dist/plugin/pit.js +57 -0
- package/dist/session.d.ts +55 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +135 -0
- package/dist/session.js.map +1 -0
- package/dist/setup.d.ts +92 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +382 -0
- package/dist/setup.js.map +1 -0
- package/dist/shell-quote.d.ts +16 -0
- package/dist/shell-quote.d.ts.map +1 -0
- package/dist/shell-quote.js +18 -0
- package/dist/shell-quote.js.map +1 -0
- package/dist/signals.d.ts +17 -0
- package/dist/signals.d.ts.map +1 -0
- package/dist/signals.js +26 -0
- package/dist/signals.js.map +1 -0
- package/dist/state-machine.d.ts +74 -0
- package/dist/state-machine.d.ts.map +1 -0
- package/dist/state-machine.js +153 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/tmux.d.ts +101 -0
- package/dist/tmux.d.ts.map +1 -0
- package/dist/tmux.js +208 -0
- package/dist/tmux.js.map +1 -0
- package/dist/worktree.d.ts +33 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +116 -0
- package/dist/worktree.js.map +1 -0
- 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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"}
|