@dmrlzz/davecode 0.0.0-stage → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -2
  3. package/bin/davecode.js +2 -0
  4. package/dist/ChatApp-BO7QMBWD.js +1045 -0
  5. package/dist/ChatApp-BO7QMBWD.js.map +1 -0
  6. package/dist/RunnerView-A7JSPUW5.js +18 -0
  7. package/dist/RunnerView-A7JSPUW5.js.map +1 -0
  8. package/dist/account-UGNLJPQ4.js +23 -0
  9. package/dist/account-UGNLJPQ4.js.map +1 -0
  10. package/dist/accounts-NM7IWP53.js +37 -0
  11. package/dist/accounts-NM7IWP53.js.map +1 -0
  12. package/dist/budget-INAW6FXD.js +115 -0
  13. package/dist/budget-INAW6FXD.js.map +1 -0
  14. package/dist/chat-U4QJQ7M6.js +359 -0
  15. package/dist/chat-U4QJQ7M6.js.map +1 -0
  16. package/dist/chunk-3Q2KCXLN.js +9608 -0
  17. package/dist/chunk-3Q2KCXLN.js.map +1 -0
  18. package/dist/chunk-5LKOJBUL.js +20 -0
  19. package/dist/chunk-5LKOJBUL.js.map +1 -0
  20. package/dist/chunk-7XVXEO7U.js +23 -0
  21. package/dist/chunk-7XVXEO7U.js.map +1 -0
  22. package/dist/chunk-CWBVNS3L.js +731 -0
  23. package/dist/chunk-CWBVNS3L.js.map +1 -0
  24. package/dist/chunk-DZ2FDABF.js +1614 -0
  25. package/dist/chunk-DZ2FDABF.js.map +1 -0
  26. package/dist/chunk-FRFSJMN4.js +79 -0
  27. package/dist/chunk-FRFSJMN4.js.map +1 -0
  28. package/dist/chunk-GE22VBCY.js +200 -0
  29. package/dist/chunk-GE22VBCY.js.map +1 -0
  30. package/dist/chunk-GHDOUII5.js +144 -0
  31. package/dist/chunk-GHDOUII5.js.map +1 -0
  32. package/dist/chunk-GZJ6JSO7.js +213 -0
  33. package/dist/chunk-GZJ6JSO7.js.map +1 -0
  34. package/dist/chunk-IC3TDONV.js +12 -0
  35. package/dist/chunk-IC3TDONV.js.map +1 -0
  36. package/dist/chunk-MC7RIPL7.js +116 -0
  37. package/dist/chunk-MC7RIPL7.js.map +1 -0
  38. package/dist/chunk-MOK5D3XJ.js +114 -0
  39. package/dist/chunk-MOK5D3XJ.js.map +1 -0
  40. package/dist/chunk-PGPXE6LF.js +20 -0
  41. package/dist/chunk-PGPXE6LF.js.map +1 -0
  42. package/dist/chunk-QA3O6RA2.js +81 -0
  43. package/dist/chunk-QA3O6RA2.js.map +1 -0
  44. package/dist/chunk-ROIUTNQV.js +20 -0
  45. package/dist/chunk-ROIUTNQV.js.map +1 -0
  46. package/dist/chunk-SF5ZEAP4.js +105 -0
  47. package/dist/chunk-SF5ZEAP4.js.map +1 -0
  48. package/dist/chunk-Z6NQDJEN.js +180 -0
  49. package/dist/chunk-Z6NQDJEN.js.map +1 -0
  50. package/dist/config-YEAPBMBX.js +158 -0
  51. package/dist/config-YEAPBMBX.js.map +1 -0
  52. package/dist/dashboard/assets/Accounts-CeVyX4a3.js +1 -0
  53. package/dist/dashboard/assets/Badge-CGY6DgGx.js +55 -0
  54. package/dist/dashboard/assets/Callout-DauCk_cW.js +1 -0
  55. package/dist/dashboard/assets/Field-OXMnT9Tb.js +1 -0
  56. package/dist/dashboard/assets/Goals-DH-KDh8M.js +1 -0
  57. package/dist/dashboard/assets/Library-C15szLjZ.js +1 -0
  58. package/dist/dashboard/assets/Markdown-Xhao3sgL.js +69 -0
  59. package/dist/dashboard/assets/Panel-Du40pM7n.js +1 -0
  60. package/dist/dashboard/assets/RoutesPage-Cj1OelGO.js +4 -0
  61. package/dist/dashboard/assets/Runner-BK1-ZF7h.js +1 -0
  62. package/dist/dashboard/assets/Settings-C1nzQQhe.js +1 -0
  63. package/dist/dashboard/assets/Switch-bwtIJ00H.js +1 -0
  64. package/dist/dashboard/assets/Tasks-x4s8IiPG.js +2 -0
  65. package/dist/dashboard/assets/Traffic-CV7TaTid.js +1 -0
  66. package/dist/dashboard/assets/Workspace-DAL-MBc0.js +1 -0
  67. package/dist/dashboard/assets/arrow-up-goM9r-I9.js +1 -0
  68. package/dist/dashboard/assets/forms-DtpfI65-.js +1 -0
  69. package/dist/dashboard/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  70. package/dist/dashboard/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  71. package/dist/dashboard/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  72. package/dist/dashboard/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  73. package/dist/dashboard/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  74. package/dist/dashboard/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  75. package/dist/dashboard/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  76. package/dist/dashboard/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  77. package/dist/dashboard/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  78. package/dist/dashboard/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  79. package/dist/dashboard/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  80. package/dist/dashboard/assets/index-BCi-Vuvh.js +104 -0
  81. package/dist/dashboard/assets/index-CcJFhc98.css +2 -0
  82. package/dist/dashboard/assets/task-errors-B2pgjUGN.js +1 -0
  83. package/dist/dashboard/assets/trash-BVojETtF.js +1 -0
  84. package/dist/dashboard/favicon.svg +1 -0
  85. package/dist/dashboard/github.svg +1 -0
  86. package/dist/dashboard/index.html +31 -0
  87. package/dist/dist-RRQGUBL3.js +379 -0
  88. package/dist/dist-RRQGUBL3.js.map +1 -0
  89. package/dist/doctor-MQYK44S2.js +279 -0
  90. package/dist/doctor-MQYK44S2.js.map +1 -0
  91. package/dist/goal-6NUX4AIT.js +302 -0
  92. package/dist/goal-6NUX4AIT.js.map +1 -0
  93. package/dist/index.js +399 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/init-AXYIWAB3.js +194 -0
  96. package/dist/init-AXYIWAB3.js.map +1 -0
  97. package/dist/prompts-TZ7UC42M.js +219 -0
  98. package/dist/prompts-TZ7UC42M.js.map +1 -0
  99. package/dist/run-QRTLHFB3.js +376 -0
  100. package/dist/run-QRTLHFB3.js.map +1 -0
  101. package/dist/runner-state-QFU3LJVJ.js +17 -0
  102. package/dist/runner-state-QFU3LJVJ.js.map +1 -0
  103. package/dist/runtime.js +18 -0
  104. package/dist/runtime.js.map +1 -0
  105. package/dist/start-O5I5TSO2.js +285 -0
  106. package/dist/start-O5I5TSO2.js.map +1 -0
  107. package/dist/status-LEA3RVUX.js +25 -0
  108. package/dist/status-LEA3RVUX.js.map +1 -0
  109. package/dist/tasks-XOTVICVZ.js +184 -0
  110. package/dist/tasks-XOTVICVZ.js.map +1 -0
  111. package/package.json +73 -3
@@ -0,0 +1,376 @@
1
+ import {
2
+ logText
3
+ } from "./chunk-GE22VBCY.js";
4
+ import {
5
+ initialRunnerState,
6
+ isTerminal
7
+ } from "./chunk-FRFSJMN4.js";
8
+ import "./chunk-5LKOJBUL.js";
9
+ import "./chunk-PGPXE6LF.js";
10
+ import {
11
+ formatDuration
12
+ } from "./chunk-SF5ZEAP4.js";
13
+ import {
14
+ printJson
15
+ } from "./chunk-QA3O6RA2.js";
16
+ import {
17
+ GatewayError,
18
+ detectProjectRoot,
19
+ findGateway,
20
+ wireProject
21
+ } from "./chunk-DZ2FDABF.js";
22
+ import {
23
+ CliError,
24
+ EXIT
25
+ } from "./chunk-7XVXEO7U.js";
26
+ import {
27
+ ProjectBrain,
28
+ RunnerError,
29
+ createEngine,
30
+ loadConfig
31
+ } from "./chunk-3Q2KCXLN.js";
32
+ import "./chunk-MC7RIPL7.js";
33
+
34
+ // src/commands/run.ts
35
+ import { existsSync } from "fs";
36
+ import { basename, resolve } from "path";
37
+ var HINTS = {
38
+ not_a_repo: () => ({
39
+ message: "This project is not inside a git repository",
40
+ hint: "The runner works on task branches: run `git init` and make a first commit."
41
+ }),
42
+ no_brain: () => ({
43
+ message: "No project brain here",
44
+ hint: "Run `davecode init`, then add tasks with `davecode tasks add`."
45
+ }),
46
+ no_base_branch: (config) => ({
47
+ message: `The base branch "${config.runner.baseBranch}" does not exist`,
48
+ hint: "Create it, or set runner.baseBranch in .davecode/config.json."
49
+ }),
50
+ dirty_worktree: () => ({
51
+ hint: "Commit or stash your changes, then run again (the runner never works on top of uncommitted edits)."
52
+ }),
53
+ invalid_graph: () => ({
54
+ hint: "Fix .davecode/TASK_GRAPH.json; `davecode tasks` shows the problem."
55
+ }),
56
+ task_not_found: () => ({
57
+ hint: "See `davecode tasks` for the task ids."
58
+ }),
59
+ task_not_runnable: () => ({
60
+ hint: "Only PENDING tasks can run: reopen it with `davecode tasks status <id> PENDING`."
61
+ }),
62
+ task_blocked: () => ({
63
+ hint: "Run its dependencies first (`davecode tasks` shows what each task waits on)."
64
+ }),
65
+ busy: () => ({
66
+ hint: "Stop the runner or the running goal (dashboard, `davecode goals cancel <id>` or the other `davecode run`) first."
67
+ })
68
+ };
69
+ var CODE_PATTERNS = [
70
+ ["not_a_repo", /not inside a git repository/i],
71
+ ["no_brain", /no project brain/i],
72
+ ["no_base_branch", /base branch .* does not exist/i],
73
+ ["dirty_worktree", /uncommitted changes/i],
74
+ ["busy", /already running|working tree is busy/i],
75
+ ["invalid_graph", /task graph/i]
76
+ ];
77
+ function explainRunnerError(err, config) {
78
+ const message = err instanceof Error ? err.message : String(err);
79
+ let code;
80
+ if (err instanceof RunnerError) code = err.code;
81
+ else if (err instanceof GatewayError && err.status === 409) {
82
+ code = err.code in HINTS ? err.code : CODE_PATTERNS.find(([, re]) => re.test(message))?.[0];
83
+ }
84
+ if (!code) return err;
85
+ const friendly = HINTS[code](config);
86
+ return new CliError(friendly.message ?? message, { hint: friendly.hint });
87
+ }
88
+ function signalWaiter() {
89
+ let dispose = () => {
90
+ };
91
+ const promise = new Promise((resolveSignal) => {
92
+ const done = () => {
93
+ dispose();
94
+ resolveSignal();
95
+ };
96
+ dispose = () => {
97
+ process.off("SIGINT", done);
98
+ process.off("SIGTERM", done);
99
+ };
100
+ process.on("SIGINT", done);
101
+ process.on("SIGTERM", done);
102
+ });
103
+ return { promise, dispose };
104
+ }
105
+ function interruptFor(deps) {
106
+ return deps.interrupt ? { promise: deps.interrupt(), dispose: () => {
107
+ } } : signalWaiter();
108
+ }
109
+ function describeResult(ctx, result) {
110
+ const { theme } = ctx;
111
+ const task = result.task ? `${theme.bold(result.task.id)} ${result.task.title}` : "";
112
+ const lines = [];
113
+ switch (result.outcome) {
114
+ case "success":
115
+ lines.push(`${theme.ok(theme.glyph.ok)} ${task} ${theme.ok("succeeded")}`);
116
+ if (result.delivery?.mode === "pr" && result.delivery.url) {
117
+ lines.push(` pull request ${theme.accent(result.delivery.url)}`);
118
+ } else if (result.delivery) lines.push(theme.dim(" merged into the base branch"));
119
+ break;
120
+ case "failed":
121
+ lines.push(`${theme.error(theme.glyph.fail)} ${task} ${theme.error("failed")}`);
122
+ if (result.branch) lines.push(theme.dim(` work kept on ${result.branch}`));
123
+ break;
124
+ case "idle":
125
+ lines.push(theme.dim("Nothing to do: no task is ready (see `davecode tasks`)."));
126
+ break;
127
+ case "stopped":
128
+ lines.push(theme.warn(`${theme.glyph.warn} Stopped; the task is back to PENDING.`));
129
+ if (result.branch) lines.push(theme.dim(` partial work kept on ${result.branch}`));
130
+ break;
131
+ default:
132
+ lines.push(
133
+ `${theme.error(theme.glyph.fail)} Runner error: ${result.error ?? "unknown error"}`
134
+ );
135
+ }
136
+ if (result.outcome === "success" || result.outcome === "failed") {
137
+ lines.push(theme.dim(` repair cycles ${result.repairCycles}`));
138
+ if (result.validation && !result.validation.ok) {
139
+ const failing = result.validation.steps.filter((s) => !s.ok).map((s) => s.name);
140
+ if (failing.length > 0) lines.push(theme.dim(` failing checks: ${failing.join(", ")}`));
141
+ }
142
+ if (result.verdict) {
143
+ lines.push(
144
+ theme.dim(
145
+ ` judge ${result.verdict.pass ? "passed" : "rejected"}${result.verdict.confidence !== void 0 ? ` (confidence ${result.verdict.confidence.toFixed(2)})` : ""}`
146
+ )
147
+ );
148
+ }
149
+ if (result.summary) lines.push("", result.summary.trim());
150
+ }
151
+ return lines;
152
+ }
153
+ function exitCodeFor(result) {
154
+ if (result.outcome === "success" || result.outcome === "idle") return EXIT.ok;
155
+ if (result.outcome === "stopped") return 130;
156
+ return EXIT.failure;
157
+ }
158
+ function printEvent(ctx, event, toStderr) {
159
+ const write = toStderr ? ctx.err : ctx.out;
160
+ const theme = toStderr ? ctx.errTheme : ctx.theme;
161
+ if (event.type === "runner.log" && event.level !== "debug") {
162
+ write(
163
+ logText(theme, { ts: event.ts, level: event.level, message: event.message }, ctx.columns)
164
+ );
165
+ } else if (event.type === "runner.status") {
166
+ const s = event.status;
167
+ write(
168
+ theme.dim(
169
+ `${new Date(event.ts).toTimeString().slice(0, 8)} ${theme.glyph.arrow} ${s.state}${s.taskId ? ` \xB7 ${s.taskId}` : ""}${s.repairCycle ? ` \xB7 repair ${s.repairCycle}` : ""}`
170
+ )
171
+ );
172
+ }
173
+ }
174
+ async function runCommand(ctx, opts, deps = {}) {
175
+ const root = opts.project ? resolve(ctx.cwd, opts.project) : await detectProjectRoot(ctx.cwd, ctx.home);
176
+ if (!root || !existsSync(root)) {
177
+ throw new CliError("Not inside a project", {
178
+ hint: "Run `davecode run` inside a git repository with a project brain (`davecode init`)."
179
+ });
180
+ }
181
+ const config = deps.engine?.config ?? loadConfig({ home: ctx.home, env: ctx.env, projectRoot: root });
182
+ const gateway = deps.noGateway ? void 0 : await findGateway(config).catch(() => void 0);
183
+ if (gateway) {
184
+ const status = await gateway.client.get("/api/runner").then((r) => r.status).catch(() => void 0);
185
+ if (status && !["idle", "stopped", "error"].includes(status.state)) {
186
+ throw new CliError(`The gateway's runner is already ${status.state}`, {
187
+ hint: `Watch it in the dashboard at ${gateway.client.baseUrl}/ or stop it there first.`
188
+ });
189
+ }
190
+ if (!opts.once) return driveGateway(ctx, gateway.client, config, root, opts.task);
191
+ }
192
+ const engine = deps.engine ?? createEngine({ home: ctx.home, env: ctx.env, projectRoot: root });
193
+ try {
194
+ const { runner } = (deps.wire ?? ((e, r) => wireProject(e, r, { env: ctx.env })))(engine, root);
195
+ const graph = await new ProjectBrain(root).readGraph().catch(() => ({ version: 1, tasks: [] }));
196
+ return opts.once ? await runOnce(ctx, engine, runner, config, deps, opts.task) : await runContinuous(
197
+ ctx,
198
+ engine,
199
+ runner,
200
+ config,
201
+ basename(root),
202
+ graph.tasks,
203
+ deps,
204
+ opts.task
205
+ );
206
+ } finally {
207
+ if (!deps.engine) engine.close();
208
+ }
209
+ }
210
+ async function runOnce(ctx, engine, runner, config, deps, taskId) {
211
+ const unsubscribe = engine.events.subscribe((event) => printEvent(ctx, event, ctx.json));
212
+ let interrupted = false;
213
+ const interrupt = interruptFor(deps);
214
+ void interrupt.promise.then(() => {
215
+ interrupted = true;
216
+ if (!ctx.json) ctx.err(ctx.errTheme.dim("Stopping safely\u2026"));
217
+ void runner.stop();
218
+ });
219
+ const started = Date.now();
220
+ let result;
221
+ try {
222
+ result = await runner.runOnce(taskId === void 0 ? {} : { taskId });
223
+ } catch (err) {
224
+ throw explainRunnerError(err, config);
225
+ } finally {
226
+ unsubscribe();
227
+ interrupt.dispose();
228
+ }
229
+ if (ctx.json) {
230
+ printJson(ctx, { ...result, interrupted });
231
+ } else {
232
+ ctx.out();
233
+ for (const line of describeResult(ctx, result)) ctx.out(line);
234
+ ctx.out(ctx.theme.dim(` took ${formatDuration((Date.now() - started) / 1e3)}`));
235
+ }
236
+ return exitCodeFor(result);
237
+ }
238
+ async function runContinuous(ctx, engine, runner, config, projectName, tasks, deps, taskId) {
239
+ const early = [];
240
+ const unsubscribeEarly = engine.events.subscribe((e) => early.push(e));
241
+ try {
242
+ await runner.start(taskId === void 0 ? {} : { taskId });
243
+ } catch (err) {
244
+ unsubscribeEarly();
245
+ throw explainRunnerError(err, config);
246
+ }
247
+ if (!ctx.interactive) {
248
+ unsubscribeEarly();
249
+ for (const event of early) printEvent(ctx, event, false);
250
+ const unsubscribe = engine.events.subscribe((event) => printEvent(ctx, event, false));
251
+ const finished = new Promise((resolveDone) => {
252
+ const timer = setInterval(() => {
253
+ if (!runner.running) {
254
+ clearInterval(timer);
255
+ resolveDone();
256
+ }
257
+ }, 250);
258
+ });
259
+ const interrupt = interruptFor(deps);
260
+ await Promise.race([interrupt.promise, finished]);
261
+ interrupt.dispose();
262
+ if (runner.running) {
263
+ ctx.out(ctx.theme.dim("Stopping safely\u2026"));
264
+ await runner.stop();
265
+ }
266
+ unsubscribe();
267
+ } else {
268
+ const [{ render }, { createElement }, { RunnerApp }] = await Promise.all([
269
+ import("ink"),
270
+ import("react"),
271
+ import("./RunnerView-A7JSPUW5.js")
272
+ ]);
273
+ let initial = initialRunnerState(runner.status(), tasks);
274
+ const { runnerReducer } = await import("./runner-state-QFU3LJVJ.js");
275
+ for (const event of early) initial = runnerReducer(initial, event);
276
+ unsubscribeEarly();
277
+ const instance = render(
278
+ createElement(RunnerApp, {
279
+ theme: ctx.theme,
280
+ initial,
281
+ subscribe: (onEvent) => engine.events.subscribe(onEvent),
282
+ maxRepairCycles: config.runner.maxRepairCycles,
283
+ projectName,
284
+ stop: () => runner.stop(),
285
+ pause: () => runner.pause(),
286
+ resume: () => runner.resume()
287
+ }),
288
+ { stdout: ctx.io.stdout, exitOnCtrlC: false }
289
+ );
290
+ await instance.waitUntilExit();
291
+ if (runner.running) await runner.stop();
292
+ }
293
+ const final = runner.status();
294
+ if (final.state === "error") {
295
+ ctx.err(ctx.errTheme.error(`Runner error: ${final.lastError ?? "unknown error"}`));
296
+ return EXIT.failure;
297
+ }
298
+ return EXIT.ok;
299
+ }
300
+ async function driveGateway(ctx, client, config, root, taskId) {
301
+ try {
302
+ await client.post("/api/runner/start", taskId === void 0 ? void 0 : { taskId });
303
+ } catch (err) {
304
+ if (err instanceof GatewayError && err.status === 501) {
305
+ throw new CliError("The running gateway has no project brain to work on", {
306
+ hint: "Restart `davecode start` inside this repository, or stop it so `davecode run` can work in-process."
307
+ });
308
+ }
309
+ throw explainRunnerError(err, config);
310
+ }
311
+ const stop = async () => {
312
+ await client.post("/api/runner/stop", void 0, { timeoutMs: 10 * 6e4 });
313
+ };
314
+ const controller = new AbortController();
315
+ const listeners = /* @__PURE__ */ new Set();
316
+ let latest = { state: "selecting" };
317
+ const pump = (async () => {
318
+ try {
319
+ for await (const event of client.events(controller.signal)) {
320
+ if (event.type === "runner.status") latest = event.status;
321
+ for (const listener of listeners) listener(event);
322
+ }
323
+ } catch {
324
+ }
325
+ })();
326
+ try {
327
+ if (!ctx.interactive) {
328
+ const print = (e) => printEvent(ctx, e, false);
329
+ listeners.add(print);
330
+ await signalWaiter().promise;
331
+ ctx.out(ctx.theme.dim("Stopping safely\u2026"));
332
+ await stop();
333
+ } else {
334
+ const [{ render }, { createElement }, { RunnerApp }, { tasks }] = await Promise.all([
335
+ import("ink"),
336
+ import("react"),
337
+ import("./RunnerView-A7JSPUW5.js"),
338
+ client.get("/api/tasks").then((r) => ({ tasks: r.graph.tasks })).catch(() => ({ tasks: [] }))
339
+ ]);
340
+ const status = await client.get("/api/runner").then((r) => r.status).catch(() => latest);
341
+ const instance = render(
342
+ createElement(RunnerApp, {
343
+ theme: ctx.theme,
344
+ initial: initialRunnerState(status, tasks),
345
+ subscribe: (onEvent) => {
346
+ listeners.add(onEvent);
347
+ return () => listeners.delete(onEvent);
348
+ },
349
+ maxRepairCycles: config.runner.maxRepairCycles,
350
+ projectName: basename(root),
351
+ stop,
352
+ pause: async () => {
353
+ await client.post("/api/runner/pause");
354
+ },
355
+ resume: async () => {
356
+ await client.post("/api/runner/start");
357
+ }
358
+ }),
359
+ { stdout: ctx.io.stdout, exitOnCtrlC: false }
360
+ );
361
+ await instance.waitUntilExit();
362
+ if (!isTerminal(latest.state)) await stop().catch(() => void 0);
363
+ }
364
+ } finally {
365
+ controller.abort();
366
+ await pump;
367
+ }
368
+ return latest.state === "error" ? EXIT.failure : EXIT.ok;
369
+ }
370
+ export {
371
+ describeResult,
372
+ exitCodeFor,
373
+ explainRunnerError,
374
+ runCommand
375
+ };
376
+ //# sourceMappingURL=run-QRTLHFB3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/run.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { basename, resolve } from 'node:path';\nimport {\n type AutonomousRunner,\n createEngine,\n type DaveConfig,\n type DaveEvent,\n type Engine,\n loadConfig,\n ProjectBrain,\n RunnerError,\n type RunnerErrorCode,\n type RunnerStatus,\n type RunOnceResult,\n type TaskGraph,\n type TaskNode,\n} from '@davecode/core';\nimport { findGateway, type GatewayClient, GatewayError } from '../client';\nimport { type CliContext, printJson } from '../context';\nimport { CliError, EXIT } from '../errors';\nimport { detectProjectRoot, wireProject } from '../runtime';\nimport { logText } from '../tui/RunnerView';\nimport { initialRunnerState, isTerminal } from '../tui/runner-state';\nimport { formatDuration } from '../ui/format';\n\nexport interface RunOptions {\n once?: boolean;\n task?: string;\n project?: string;\n}\n\n/** Test seams: an injected runner/engine instead of building them from the project. */\nexport interface RunDeps {\n wire?: (\n engine: Engine,\n root: string,\n ) => {\n runner: Pick<\n AutonomousRunner,\n 'runOnce' | 'start' | 'stop' | 'pause' | 'resume' | 'status' | 'running'\n >;\n };\n engine?: Engine;\n /** Resolves when the user asks to stop (default: SIGINT/SIGTERM). */\n interrupt?: () => Promise<void>;\n /** Skip the running-gateway probe. */\n noGateway?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Friendly errors\n// ---------------------------------------------------------------------------\n\nconst HINTS: Record<RunnerErrorCode, (config: DaveConfig) => { message?: string; hint: string }> = {\n not_a_repo: () => ({\n message: 'This project is not inside a git repository',\n hint: 'The runner works on task branches: run `git init` and make a first commit.',\n }),\n no_brain: () => ({\n message: 'No project brain here',\n hint: 'Run `davecode init`, then add tasks with `davecode tasks add`.',\n }),\n no_base_branch: (config) => ({\n message: `The base branch \"${config.runner.baseBranch}\" does not exist`,\n hint: 'Create it, or set runner.baseBranch in .davecode/config.json.',\n }),\n dirty_worktree: () => ({\n hint: 'Commit or stash your changes, then run again (the runner never works on top of uncommitted edits).',\n }),\n invalid_graph: () => ({\n hint: 'Fix .davecode/TASK_GRAPH.json; `davecode tasks` shows the problem.',\n }),\n task_not_found: () => ({\n hint: 'See `davecode tasks` for the task ids.',\n }),\n task_not_runnable: () => ({\n hint: 'Only PENDING tasks can run: reopen it with `davecode tasks status <id> PENDING`.',\n }),\n task_blocked: () => ({\n hint: 'Run its dependencies first (`davecode tasks` shows what each task waits on).',\n }),\n busy: () => ({\n hint: 'Stop the runner or the running goal (dashboard, `davecode goals cancel <id>` or the other `davecode run`) first.',\n }),\n};\n\nconst CODE_PATTERNS: Array<[RunnerErrorCode, RegExp]> = [\n ['not_a_repo', /not inside a git repository/i],\n ['no_brain', /no project brain/i],\n ['no_base_branch', /base branch .* does not exist/i],\n ['dirty_worktree', /uncommitted changes/i],\n ['busy', /already running|working tree is busy/i],\n ['invalid_graph', /task graph/i],\n];\n\n/** Turn a `RunnerError` (or the gateway's 409 for one) into a CLI error with a fix. */\nexport function explainRunnerError(err: unknown, config: DaveConfig): unknown {\n const message = err instanceof Error ? err.message : String(err);\n let code: RunnerErrorCode | undefined;\n if (err instanceof RunnerError) code = err.code;\n else if (err instanceof GatewayError && err.status === 409) {\n // The gateway forwards RunnerError codes; fall back to message matching for older gateways.\n code =\n err.code in HINTS\n ? (err.code as RunnerErrorCode)\n : CODE_PATTERNS.find(([, re]) => re.test(message))?.[0];\n }\n if (!code) return err;\n const friendly = HINTS[code](config);\n return new CliError(friendly.message ?? message, { hint: friendly.hint });\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface Waiter {\n promise: Promise<void>;\n dispose(): void;\n}\n\n/** Resolves on SIGINT/SIGTERM; `dispose()` removes the listeners again. */\nfunction signalWaiter(): Waiter {\n let dispose = () => {};\n const promise = new Promise<void>((resolveSignal) => {\n const done = () => {\n dispose();\n resolveSignal();\n };\n dispose = () => {\n process.off('SIGINT', done);\n process.off('SIGTERM', done);\n };\n process.on('SIGINT', done);\n process.on('SIGTERM', done);\n });\n return { promise, dispose };\n}\n\nfunction interruptFor(deps: RunDeps): Waiter {\n return deps.interrupt ? { promise: deps.interrupt(), dispose: () => {} } : signalWaiter();\n}\n\nexport function describeResult(ctx: CliContext, result: RunOnceResult): string[] {\n const { theme } = ctx;\n const task = result.task ? `${theme.bold(result.task.id)} ${result.task.title}` : '';\n const lines: string[] = [];\n switch (result.outcome) {\n case 'success':\n lines.push(`${theme.ok(theme.glyph.ok)} ${task} ${theme.ok('succeeded')}`);\n if (result.delivery?.mode === 'pr' && result.delivery.url) {\n lines.push(` pull request ${theme.accent(result.delivery.url)}`);\n } else if (result.delivery) lines.push(theme.dim(' merged into the base branch'));\n break;\n case 'failed':\n lines.push(`${theme.error(theme.glyph.fail)} ${task} ${theme.error('failed')}`);\n if (result.branch) lines.push(theme.dim(` work kept on ${result.branch}`));\n break;\n case 'idle':\n lines.push(theme.dim('Nothing to do: no task is ready (see `davecode tasks`).'));\n break;\n case 'stopped':\n lines.push(theme.warn(`${theme.glyph.warn} Stopped; the task is back to PENDING.`));\n if (result.branch) lines.push(theme.dim(` partial work kept on ${result.branch}`));\n break;\n default:\n lines.push(\n `${theme.error(theme.glyph.fail)} Runner error: ${result.error ?? 'unknown error'}`,\n );\n }\n if (result.outcome === 'success' || result.outcome === 'failed') {\n lines.push(theme.dim(` repair cycles ${result.repairCycles}`));\n if (result.validation && !result.validation.ok) {\n const failing = result.validation.steps.filter((s) => !s.ok).map((s) => s.name);\n if (failing.length > 0) lines.push(theme.dim(` failing checks: ${failing.join(', ')}`));\n }\n if (result.verdict) {\n lines.push(\n theme.dim(\n ` judge ${result.verdict.pass ? 'passed' : 'rejected'}${result.verdict.confidence !== undefined ? ` (confidence ${result.verdict.confidence.toFixed(2)})` : ''}`,\n ),\n );\n }\n if (result.summary) lines.push('', result.summary.trim());\n }\n return lines;\n}\n\nexport function exitCodeFor(result: RunOnceResult): number {\n if (result.outcome === 'success' || result.outcome === 'idle') return EXIT.ok;\n if (result.outcome === 'stopped') return 130;\n return EXIT.failure;\n}\n\nfunction printEvent(ctx: CliContext, event: DaveEvent, toStderr: boolean): void {\n const write = toStderr ? ctx.err : ctx.out;\n const theme = toStderr ? ctx.errTheme : ctx.theme;\n if (event.type === 'runner.log' && event.level !== 'debug') {\n write(\n logText(theme, { ts: event.ts, level: event.level, message: event.message }, ctx.columns),\n );\n } else if (event.type === 'runner.status') {\n const s = event.status;\n write(\n theme.dim(\n `${new Date(event.ts).toTimeString().slice(0, 8)} ${theme.glyph.arrow} ${s.state}${s.taskId ? ` · ${s.taskId}` : ''}${s.repairCycle ? ` · repair ${s.repairCycle}` : ''}`,\n ),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function runCommand(\n ctx: CliContext,\n opts: RunOptions,\n deps: RunDeps = {},\n): Promise<number> {\n const root = opts.project\n ? resolve(ctx.cwd, opts.project)\n : await detectProjectRoot(ctx.cwd, ctx.home);\n if (!root || !existsSync(root)) {\n throw new CliError('Not inside a project', {\n hint: 'Run `davecode run` inside a git repository with a project brain (`davecode init`).',\n });\n }\n const config =\n deps.engine?.config ?? loadConfig({ home: ctx.home, env: ctx.env, projectRoot: root });\n\n // A gateway (davecode start) may already own a runner for this repository.\n const gateway = deps.noGateway ? undefined : await findGateway(config).catch(() => undefined);\n if (gateway) {\n const status = await gateway.client\n .get<{ status: RunnerStatus }>('/api/runner')\n .then((r) => r.status)\n .catch(() => undefined);\n if (status && !['idle', 'stopped', 'error'].includes(status.state)) {\n throw new CliError(`The gateway's runner is already ${status.state}`, {\n hint: `Watch it in the dashboard at ${gateway.client.baseUrl}/ or stop it there first.`,\n });\n }\n if (!opts.once) return driveGateway(ctx, gateway.client, config, root, opts.task);\n }\n\n const engine = deps.engine ?? createEngine({ home: ctx.home, env: ctx.env, projectRoot: root });\n try {\n const { runner } = (deps.wire ?? ((e, r) => wireProject(e, r, { env: ctx.env })))(engine, root);\n const graph = await new ProjectBrain(root)\n .readGraph()\n .catch(() => ({ version: 1 as const, tasks: [] }));\n return opts.once\n ? await runOnce(ctx, engine, runner, config, deps, opts.task)\n : await runContinuous(\n ctx,\n engine,\n runner,\n config,\n basename(root),\n graph.tasks,\n deps,\n opts.task,\n );\n } finally {\n if (!deps.engine) engine.close();\n }\n}\n\ntype RunnerLike = ReturnType<NonNullable<RunDeps['wire']>>['runner'];\n\nasync function runOnce(\n ctx: CliContext,\n engine: Engine,\n runner: RunnerLike,\n config: DaveConfig,\n deps: RunDeps,\n taskId?: string,\n): Promise<number> {\n const unsubscribe = engine.events.subscribe((event) => printEvent(ctx, event, ctx.json));\n let interrupted = false;\n const interrupt = interruptFor(deps);\n void interrupt.promise.then(() => {\n interrupted = true;\n if (!ctx.json) ctx.err(ctx.errTheme.dim('Stopping safely…'));\n void runner.stop();\n });\n const started = Date.now();\n let result: RunOnceResult;\n try {\n result = await runner.runOnce(taskId === undefined ? {} : { taskId });\n } catch (err) {\n throw explainRunnerError(err, config);\n } finally {\n unsubscribe();\n interrupt.dispose();\n }\n if (ctx.json) {\n printJson(ctx, { ...result, interrupted });\n } else {\n ctx.out();\n for (const line of describeResult(ctx, result)) ctx.out(line);\n ctx.out(ctx.theme.dim(` took ${formatDuration((Date.now() - started) / 1000)}`));\n }\n return exitCodeFor(result);\n}\n\nasync function runContinuous(\n ctx: CliContext,\n engine: Engine,\n runner: RunnerLike,\n config: DaveConfig,\n projectName: string,\n tasks: TaskNode[],\n deps: RunDeps,\n taskId?: string,\n): Promise<number> {\n // Buffer events emitted before the view mounts so the first log lines are not lost.\n const early: DaveEvent[] = [];\n const unsubscribeEarly = engine.events.subscribe((e) => early.push(e));\n try {\n await runner.start(taskId === undefined ? {} : { taskId });\n } catch (err) {\n unsubscribeEarly();\n throw explainRunnerError(err, config);\n }\n\n if (!ctx.interactive) {\n unsubscribeEarly();\n for (const event of early) printEvent(ctx, event, false);\n const unsubscribe = engine.events.subscribe((event) => printEvent(ctx, event, false));\n const finished = new Promise<void>((resolveDone) => {\n const timer = setInterval(() => {\n if (!runner.running) {\n clearInterval(timer);\n resolveDone();\n }\n }, 250);\n });\n const interrupt = interruptFor(deps);\n await Promise.race([interrupt.promise, finished]);\n interrupt.dispose();\n if (runner.running) {\n ctx.out(ctx.theme.dim('Stopping safely…'));\n await runner.stop();\n }\n unsubscribe();\n } else {\n const [{ render }, { createElement }, { RunnerApp }] = await Promise.all([\n import('ink'),\n import('react'),\n import('../tui/RunnerView'),\n ]);\n let initial = initialRunnerState(runner.status(), tasks);\n const { runnerReducer } = await import('../tui/runner-state');\n for (const event of early) initial = runnerReducer(initial, event);\n unsubscribeEarly();\n const instance = render(\n createElement(RunnerApp, {\n theme: ctx.theme,\n initial,\n subscribe: (onEvent: (e: DaveEvent) => void) => engine.events.subscribe(onEvent),\n maxRepairCycles: config.runner.maxRepairCycles,\n projectName,\n stop: () => runner.stop(),\n pause: () => runner.pause(),\n resume: () => runner.resume(),\n }),\n { stdout: ctx.io.stdout as NodeJS.WriteStream, exitOnCtrlC: false },\n );\n await instance.waitUntilExit();\n if (runner.running) await runner.stop();\n }\n const final = runner.status();\n if (final.state === 'error') {\n ctx.err(ctx.errTheme.error(`Runner error: ${final.lastError ?? 'unknown error'}`));\n return EXIT.failure;\n }\n return EXIT.ok;\n}\n\n/** Continuous mode against the runner of a running gateway, fed by `/api/events`. */\nasync function driveGateway(\n ctx: CliContext,\n client: GatewayClient,\n config: DaveConfig,\n root: string,\n taskId?: string,\n): Promise<number> {\n try {\n await client.post('/api/runner/start', taskId === undefined ? undefined : { taskId });\n } catch (err) {\n if (err instanceof GatewayError && err.status === 501) {\n throw new CliError('The running gateway has no project brain to work on', {\n hint: 'Restart `davecode start` inside this repository, or stop it so `davecode run` can work in-process.',\n });\n }\n throw explainRunnerError(err, config);\n }\n const stop = async () => {\n await client.post('/api/runner/stop', undefined, { timeoutMs: 10 * 60_000 });\n };\n const controller = new AbortController();\n const listeners = new Set<(e: DaveEvent) => void>();\n let latest: RunnerStatus = { state: 'selecting' };\n const pump = (async () => {\n try {\n for await (const event of client.events(controller.signal)) {\n if (event.type === 'runner.status') latest = event.status;\n for (const listener of listeners) listener(event);\n }\n } catch {\n // aborted or disconnected\n }\n })();\n\n try {\n if (!ctx.interactive) {\n const print = (e: DaveEvent) => printEvent(ctx, e, false);\n listeners.add(print);\n await signalWaiter().promise;\n ctx.out(ctx.theme.dim('Stopping safely…'));\n await stop();\n } else {\n const [{ render }, { createElement }, { RunnerApp }, { tasks }] = await Promise.all([\n import('ink'),\n import('react'),\n import('../tui/RunnerView'),\n client\n .get<{ graph: TaskGraph }>('/api/tasks')\n .then((r) => ({ tasks: r.graph.tasks }))\n .catch(() => ({ tasks: [] as TaskNode[] })),\n ]);\n const status = await client\n .get<{ status: RunnerStatus }>('/api/runner')\n .then((r) => r.status)\n .catch(() => latest);\n const instance = render(\n createElement(RunnerApp, {\n theme: ctx.theme,\n initial: initialRunnerState(status, tasks),\n subscribe: (onEvent: (e: DaveEvent) => void) => {\n listeners.add(onEvent);\n return () => listeners.delete(onEvent);\n },\n maxRepairCycles: config.runner.maxRepairCycles,\n projectName: basename(root),\n stop,\n pause: async () => {\n await client.post('/api/runner/pause');\n },\n resume: async () => {\n await client.post('/api/runner/start');\n },\n }),\n { stdout: ctx.io.stdout as NodeJS.WriteStream, exitOnCtrlC: false },\n );\n await instance.waitUntilExit();\n if (!isTerminal(latest.state)) await stop().catch(() => undefined);\n }\n } finally {\n controller.abort();\n await pump;\n }\n return latest.state === 'error' ? EXIT.failure : EXIT.ok;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,17 @@
1
+ import {
2
+ LOG_LIMIT,
3
+ PIPELINE,
4
+ initialRunnerState,
5
+ isTerminal,
6
+ pipelineIndex,
7
+ runnerReducer
8
+ } from "./chunk-FRFSJMN4.js";
9
+ export {
10
+ LOG_LIMIT,
11
+ PIPELINE,
12
+ initialRunnerState,
13
+ isTerminal,
14
+ pipelineIndex,
15
+ runnerReducer
16
+ };
17
+ //# sourceMappingURL=runner-state-QFU3LJVJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,18 @@
1
+ import {
2
+ detectProjectRoot,
3
+ launchLoginTerminal,
4
+ resolveDashboardDir,
5
+ resolveProjectRoot,
6
+ startRuntime,
7
+ wireProject
8
+ } from "./chunk-DZ2FDABF.js";
9
+ import "./chunk-3Q2KCXLN.js";
10
+ export {
11
+ detectProjectRoot,
12
+ launchLoginTerminal,
13
+ resolveDashboardDir,
14
+ resolveProjectRoot,
15
+ startRuntime,
16
+ wireProject
17
+ };
18
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}