copperhead 0.7.0 → 0.8.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 (79) hide show
  1. package/README.md +36 -4
  2. package/dist/agent/animate.js +76 -0
  3. package/dist/agent/animate.js.map +1 -0
  4. package/dist/agent/box.js +89 -0
  5. package/dist/agent/box.js.map +1 -0
  6. package/dist/agent/dock-renderer.js +173 -0
  7. package/dist/agent/dock-renderer.js.map +1 -0
  8. package/dist/agent/logo.js +21 -0
  9. package/dist/agent/logo.js.map +1 -0
  10. package/dist/agent/loop.js +15 -5
  11. package/dist/agent/loop.js.map +1 -1
  12. package/dist/agent/providers/claude-code.js +1 -212
  13. package/dist/agent/providers/claude-code.js.map +1 -1
  14. package/dist/agent/providers/cursor.js +317 -0
  15. package/dist/agent/providers/cursor.js.map +1 -0
  16. package/dist/agent/providers/tool-protocol.js +205 -0
  17. package/dist/agent/providers/tool-protocol.js.map +1 -0
  18. package/dist/agent/render.js +32 -15
  19. package/dist/agent/render.js.map +1 -1
  20. package/dist/agent/runmeta.js +4 -5
  21. package/dist/agent/runmeta.js.map +1 -1
  22. package/dist/agent/theme.js +84 -0
  23. package/dist/agent/theme.js.map +1 -0
  24. package/dist/cli.js +134 -13
  25. package/dist/cli.js.map +1 -1
  26. package/dist/commands/create.js +41 -32
  27. package/dist/commands/create.js.map +1 -1
  28. package/dist/commands/demo.js +146 -0
  29. package/dist/commands/demo.js.map +1 -0
  30. package/dist/commands/doctor.js +240 -0
  31. package/dist/commands/doctor.js.map +1 -0
  32. package/dist/commands/repl-inspect.js +342 -0
  33. package/dist/commands/repl-inspect.js.map +1 -0
  34. package/dist/commands/repl.js +618 -0
  35. package/dist/commands/repl.js.map +1 -0
  36. package/dist/config.js +5 -2
  37. package/dist/config.js.map +1 -1
  38. package/dist/kicad/cli.js +126 -6
  39. package/dist/kicad/cli.js.map +1 -1
  40. package/dist/util/cli-args.js +35 -0
  41. package/dist/util/cli-args.js.map +1 -0
  42. package/dist/util/dock.js +155 -0
  43. package/dist/util/dock.js.map +1 -0
  44. package/dist/util/git.js +129 -4
  45. package/dist/util/git.js.map +1 -1
  46. package/dist/util/live-prompt.js +542 -0
  47. package/dist/util/live-prompt.js.map +1 -0
  48. package/dist/util/paths.js +9 -0
  49. package/dist/util/paths.js.map +1 -1
  50. package/dist/util/select.js +172 -0
  51. package/dist/util/select.js.map +1 -0
  52. package/package.json +3 -2
  53. package/src/agent/animate.ts +90 -0
  54. package/src/agent/box.ts +99 -0
  55. package/src/agent/dock-renderer.ts +181 -0
  56. package/src/agent/logo.ts +23 -0
  57. package/src/agent/loop.ts +15 -5
  58. package/src/agent/providers/claude-code.ts +2 -216
  59. package/src/agent/providers/cursor.ts +364 -0
  60. package/src/agent/providers/tool-protocol.ts +212 -0
  61. package/src/agent/render.ts +33 -16
  62. package/src/agent/runmeta.ts +6 -7
  63. package/src/agent/theme.ts +91 -0
  64. package/src/cli.ts +139 -15
  65. package/src/commands/create.ts +81 -30
  66. package/src/commands/demo.ts +184 -0
  67. package/src/commands/doctor.ts +289 -0
  68. package/src/commands/repl-inspect.ts +353 -0
  69. package/src/commands/repl.ts +685 -0
  70. package/src/config.ts +6 -3
  71. package/src/kicad/cli.ts +132 -7
  72. package/src/layout/claude-ui-layout.md +72 -0
  73. package/src/layout/repl-ui-layout.md +139 -0
  74. package/src/util/cli-args.ts +42 -0
  75. package/src/util/dock.ts +161 -0
  76. package/src/util/git.ts +140 -4
  77. package/src/util/live-prompt.ts +595 -0
  78. package/src/util/paths.ts +10 -0
  79. package/src/util/select.ts +192 -0
@@ -0,0 +1,618 @@
1
+ /**
2
+ * Interactive agent shell (Claude Code–style). Default when `copperhead` is
3
+ * invoked with no subcommand on a TTY: prompt → one `do`-equivalent run →
4
+ * prompt again until /quit.
5
+ */
6
+ import path from 'node:path';
7
+ import { createWriteStream, existsSync, mkdirSync } from 'node:fs';
8
+ import { bold, copper, dim, err, ok, warn } from '../agent/theme.js';
9
+ import { fiducialMark } from '../agent/logo.js';
10
+ import { animateMarkAt, staggerWrite } from '../agent/animate.js';
11
+ import { runAgentLoop } from '../agent/loop.js';
12
+ import { loadConfig } from '../config.js';
13
+ import { branchName, headCommit, isDirty, isGitRepo, uncommittedCount } from '../util/git.js';
14
+ import { shortPath } from '../util/paths.js';
15
+ import { redactSecrets } from '../util/redact.js';
16
+ import { pickModel } from '../util/select.js';
17
+ import { KeyReader, PASTE_OFF, PASTE_ON, promptWithSlashHints } from '../util/live-prompt.js';
18
+ import { TerminalDock } from '../util/dock.js';
19
+ import { DockRenderer } from '../agent/dock-renderer.js';
20
+ import { callout } from '../agent/box.js';
21
+ import { runCheck } from './check.js';
22
+ import { demoTourText } from './demo.js';
23
+ import { formatBomInspect, formatConfigInspect, formatConstraintsInspect, formatDriftInspect, formatGitInspect, formatLastInspect, formatNetsInspect, formatOpenSpecInspect, formatPartsInspect, formatRunsInspect, formatSyncInspect, } from './repl-inspect.js';
24
+ const QUIT = new Set(['/quit', '/exit', '/q']);
25
+ /** Slash commands shown in `/` dropdown, `/help`, and tab completion. */
26
+ export const SLASH_COMMANDS = [
27
+ { value: '/demo', label: '/demo', description: 'what copperhead does + how to try it' },
28
+ { value: '/examples', label: '/examples', description: 'example change-request prompts' },
29
+ { value: '/status', label: '/status', description: 'repo, git, and config snapshot' },
30
+ { value: '/check', label: '/check', description: 'ERC + DRC + drift — no LLM' },
31
+ { value: '/parts', label: '/parts', description: 'refdes / value / footprint from schematic' },
32
+ { value: '/nets', label: '/nets', description: 'net names and pin attachments' },
33
+ { value: '/bom', label: '/bom', description: 'parsed docs/BOM.md (read-only)' },
34
+ { value: '/sync', label: '/sync', description: 'doc↔board inconsistency report (verify only)' },
35
+ { value: '/drift', label: '/drift', description: 'BOM/PINOUT vs schematic drift' },
36
+ { value: '/constraints', label: '/constraints', description: 'open constraint registry' },
37
+ { value: '/openspec', label: '/openspec', description: 'openspec validate (no LLM)' },
38
+ { value: '/config', label: '/config', description: 'resolved .copperhead/config.json' },
39
+ { value: '/git', label: '/git', description: 'branch + dirty file list' },
40
+ { value: '/runs', label: '/runs', description: 'recent .copperhead/runs/' },
41
+ { value: '/last', label: '/last', description: 'newest run summary preview' },
42
+ { value: '/model', label: '/model', description: 'switch the session model (picker)' },
43
+ { value: '/version', label: '/version', description: 'copperhead / kicad-cli / node' },
44
+ { value: '/clear', label: '/clear', description: 'clear the screen' },
45
+ { value: '/help', label: '/help', description: 'list commands' },
46
+ { value: '/quit', label: '/quit', description: 'leave the shell' },
47
+ ];
48
+ /** Placeholder examples rotated through the empty input box. */
49
+ const EXAMPLE_REQUESTS = [
50
+ 'add reverse-polarity protection on VIN',
51
+ 'rename net KEY_DAH to KEY_DASH',
52
+ 'add a power LED on the 3V3 rail',
53
+ 'add ESD diodes on the USB data lines',
54
+ ];
55
+ /** Bare words that must NOT start an agent run (common mistake: `clear` without `/`). */
56
+ const BARE_ALIASES = {
57
+ quit: '/quit',
58
+ exit: '/quit',
59
+ q: '/quit',
60
+ clear: '/clear',
61
+ cls: '/clear',
62
+ help: '/help',
63
+ demo: '/demo',
64
+ examples: '/examples',
65
+ status: '/status',
66
+ check: '/check',
67
+ parts: '/parts',
68
+ nets: '/nets',
69
+ bom: '/bom',
70
+ sync: '/sync',
71
+ drift: '/drift',
72
+ constraints: '/constraints',
73
+ openspec: '/openspec',
74
+ config: '/config',
75
+ git: '/git',
76
+ runs: '/runs',
77
+ last: '/last',
78
+ model: '/model',
79
+ version: '/version',
80
+ };
81
+ /** Parse a slash command; returns null when the line is a normal request. */
82
+ export function parseSlash(line) {
83
+ const t = line.trim();
84
+ if (!t)
85
+ return null;
86
+ // Bare aliases: `quit` / `clear` / … act like their slash forms so a typo
87
+ // does not kick off a multi-minute agent turn.
88
+ const bare = BARE_ALIASES[t.toLowerCase()];
89
+ if (bare)
90
+ return { cmd: bare, args: '' };
91
+ if (!t.startsWith('/'))
92
+ return null;
93
+ // Bare `/` opens the command dropdown.
94
+ if (t === '/')
95
+ return { cmd: '/', args: '' };
96
+ const sp = t.indexOf(' ');
97
+ if (sp < 0)
98
+ return { cmd: t.toLowerCase(), args: '' };
99
+ return { cmd: t.slice(0, sp).toLowerCase(), args: t.slice(sp + 1).trim() };
100
+ }
101
+ /** Tab-completion matches for a partial slash command. */
102
+ export function completeSlash(partial) {
103
+ const p = partial.trim().toLowerCase();
104
+ if (!p.startsWith('/'))
105
+ return [];
106
+ return SLASH_COMMANDS.map((c) => c.value).filter((c) => c.startsWith(p));
107
+ }
108
+ export { shortPath };
109
+ /** Exported for tests. */
110
+ export function helpText() {
111
+ const rows = [
112
+ ['/', 'type `/` to see live command suggestions'],
113
+ ['<request>', 'run one gated agent change (same as `do`)'],
114
+ ...SLASH_COMMANDS.map((c) => [c.label, c.description ?? '']),
115
+ ];
116
+ const width = Math.max(...rows.map(([cmd]) => cmd.length));
117
+ return [
118
+ '',
119
+ copper(' Commands'),
120
+ '',
121
+ ...rows.map(([cmd, desc]) => ` ${copper(cmd.padEnd(width))} ${dim(desc)}`),
122
+ '',
123
+ dim(' Tip: type `/` to filter commands — ↑/↓ + Enter to pick, Tab to complete.'),
124
+ dim(' Tip: run `copperhead demo` outside the shell for the full USB-C create pipeline.'),
125
+ dim(' Tip: PgUp/PgDn scroll session history; the log mirrors to .copperhead/runs/repl-<ts>.log.'),
126
+ '',
127
+ ].join('\n');
128
+ }
129
+ export function examplesText() {
130
+ return [
131
+ '',
132
+ copper(' Example prompts'),
133
+ '',
134
+ dim(' Drop any of these at the prompt (or use `copperhead do "…"`):'),
135
+ '',
136
+ ` ${copper('▸')} add reverse-polarity protection on VIN`,
137
+ ` ${copper('▸')} rename net KEY_DAH to KEY_DASH`,
138
+ ` ${copper('▸')} add a power LED on the 3V3 rail`,
139
+ ` ${copper('▸')} move the key input to a different RTC-capable pin`,
140
+ ` ${copper('▸')} add ESD diodes on the USB data lines`,
141
+ '',
142
+ dim(' Full board-from-brief demo:'),
143
+ ` ${copper('copperhead demo')} ${dim('— USB-C power breakout create pipeline')}`,
144
+ '',
145
+ ].join('\n');
146
+ }
147
+ function metaRow(label, value) {
148
+ return ` ${dim(label.padEnd(10))} ${value}`;
149
+ }
150
+ /** Exported for tests. Claude Code-style lockup: mark left, three meta lines right. */
151
+ export function banner(opts) {
152
+ const repo = shortPath(path.resolve(opts.repoRoot));
153
+ const mark = fiducialMark();
154
+ const info = [
155
+ `${bold('copperhead')} ${dim(`v${opts.version}`)}`,
156
+ dim(`${opts.model} via ${opts.modelSource} · kicad-cli ${opts.kicadCliVersion}`),
157
+ dim(repo),
158
+ ];
159
+ const lines = ['', ...mark.map((m, i) => `${copper(m)} ${info[i]}`), ''];
160
+ if (!existsSync(path.join(path.resolve(opts.repoRoot), '.copperhead'))) {
161
+ lines.push(...callout('info', 'New repository?', [
162
+ ' `copperhead init` scaffolds docs/ from an existing schematic',
163
+ ' `copperhead demo` runs the USB-C breakout create pipeline',
164
+ copper('Docs: https://docs.copperhead.sh'),
165
+ ]), '');
166
+ }
167
+ return lines;
168
+ }
169
+ /** Plain prompt text; the input area paints it copper (nbsp after ❯, like Claude Code). */
170
+ const PROMPT = '❯ ';
171
+ function isTtyStream(input, output) {
172
+ return Boolean(input.isTTY) && Boolean(output.isTTY);
173
+ }
174
+ async function statusText(opts) {
175
+ const repo = path.resolve(opts.repoRoot);
176
+ const lines = [
177
+ '',
178
+ copper(' Status'),
179
+ '',
180
+ metaRow('repo', shortPath(repo)),
181
+ metaRow('model', `${opts.model} ${dim(`via ${opts.modelSource}`)}`),
182
+ metaRow('kicad-cli', opts.kicadCliVersion),
183
+ metaRow('node', process.version),
184
+ ];
185
+ if (await isGitRepo(repo)) {
186
+ const [branch, commit, dirty, n] = await Promise.all([
187
+ branchName(repo).catch(() => 'unknown'),
188
+ headCommit(repo).catch(() => 'unknown'),
189
+ isDirty(repo).catch(() => null),
190
+ uncommittedCount(repo).catch(() => null),
191
+ ]);
192
+ const state = dirty === null ? 'unknown' : dirty ? `dirty (${n ?? '?'} file(s))` : ok('clean');
193
+ lines.push(metaRow('git', `${branch}@${commit.slice(0, 7)} ${state}`));
194
+ }
195
+ else {
196
+ lines.push(metaRow('git', warn('not a git repository')));
197
+ }
198
+ try {
199
+ const config = await loadConfig(repo);
200
+ lines.push(metaRow('schematic', config.schematic ?? dim('null')));
201
+ lines.push(metaRow('board', config.board ?? dim('null')));
202
+ lines.push(metaRow('docs', config.docs));
203
+ lines.push(metaRow('maxTurns', String(opts.maxTurns ?? config.maxTurns)));
204
+ }
205
+ catch {
206
+ lines.push(metaRow('config', dim('no .copperhead/config.json yet — try `copperhead init`')));
207
+ }
208
+ if (!existsSync(path.join(repo, '.copperhead'))) {
209
+ lines.push('');
210
+ lines.push(dim(' Hint: `copperhead init` scaffolds docs/ from an existing schematic.'));
211
+ }
212
+ lines.push('');
213
+ return lines.join('\n');
214
+ }
215
+ function defaultRunner(opts, log) {
216
+ return (request) => runAgentLoop({
217
+ repoRoot: opts.repoRoot,
218
+ request,
219
+ model: opts.model,
220
+ ...(opts.maxTurns !== undefined ? { maxTurns: opts.maxTurns } : {}),
221
+ allowDirty: opts.allowDirty ?? false,
222
+ interactive: opts.interactive ?? false,
223
+ confirm: opts.confirm,
224
+ ...(opts.onBudgetExhausted ? { onBudgetExhausted: opts.onBudgetExhausted } : {}),
225
+ renderer: opts.renderer,
226
+ log,
227
+ meta: {
228
+ command: 'repl',
229
+ modelSource: opts.modelSource,
230
+ version: opts.version,
231
+ kicadCliVersion: opts.kicadCliVersion,
232
+ },
233
+ });
234
+ }
235
+ /**
236
+ * Run the interactive shell. Resolves when the user quits.
237
+ * Returns ok:false when the shell could not start (non-TTY without a usable seed).
238
+ */
239
+ export async function runRepl(opts) {
240
+ const baseLog = opts.log ?? ((l) => console.log(l));
241
+ // Every durable content line lands in the session history so PgUp/PgDn can
242
+ // scroll back through it (the alt screen has no native scrollback), and is
243
+ // mirrored to a session log file by default (plain text, run through the
244
+ // shared AC-4.1 redactor so this new persisted file is no weaker than the
245
+ // transcripts beside it). Injected loggers (tests/embeds) own their sinks:
246
+ // no file then.
247
+ const history = [];
248
+ const HISTORY_CAP = 5000;
249
+ const SGR_RE = /\x1b\[[0-9;]*m/g;
250
+ let logFile = null;
251
+ let logFilePath = null;
252
+ const fileLine = (l) => {
253
+ try {
254
+ if (!logFile) {
255
+ const dir = path.join(path.resolve(opts.repoRoot), '.copperhead', 'runs');
256
+ mkdirSync(dir, { recursive: true });
257
+ logFilePath = path.join(dir, `repl-${new Date().toISOString().replace(/[:.]/g, '-')}.log`);
258
+ logFile = createWriteStream(logFilePath, { flags: 'a' });
259
+ }
260
+ logFile.write(redactSecrets(l.replace(SGR_RE, '')) + '\n');
261
+ }
262
+ catch {
263
+ // Best-effort: the shell never fails because the log file cannot.
264
+ }
265
+ };
266
+ const log = (l) => {
267
+ for (const line of String(l).split('\n')) {
268
+ history.push(line);
269
+ if (!opts.log)
270
+ fileLine(line);
271
+ }
272
+ if (history.length > HISTORY_CAP)
273
+ history.splice(0, history.length - HISTORY_CAP);
274
+ baseLog(l);
275
+ };
276
+ const input = opts.input ?? process.stdin;
277
+ const output = opts.output ?? process.stdout;
278
+ const seed = opts.seed?.trim() || undefined;
279
+ const tty = isTtyStream(input, output);
280
+ const runOne = opts.runRequest ?? defaultRunner(opts, log);
281
+ const checkCmd = opts.runCheckCmd ??
282
+ (async () => {
283
+ const res = await runCheck(opts.repoRoot, log);
284
+ log(res.ok ? ok('check: all green') : warn('check: failures reported above'));
285
+ });
286
+ if (!tty) {
287
+ if (!seed) {
288
+ log(err('copperhead: interactive shell requires a TTY. Use `copperhead do "<request>"` for one-shot runs.'));
289
+ return { ok: false, turns: 0 };
290
+ }
291
+ try {
292
+ const res = await runOne(seed, log, opts.renderer);
293
+ return { ok: res.outcome !== 'failure', turns: 1 };
294
+ }
295
+ catch (e) {
296
+ log(err(e.message));
297
+ return { ok: false, turns: 0 };
298
+ }
299
+ }
300
+ // Own the full window (htop-style): switch to the alternate screen buffer,
301
+ // so the shell underneath stays untouched, the viewport cannot scroll into
302
+ // old shell content, and quitting restores the terminal exactly as it was.
303
+ // Bracketed paste goes on with it, so a pasted multi-line request arrives as
304
+ // one delimited blob instead of submitting itself at the first newline.
305
+ output.write(`\x1b[?1049h\x1b[2J\x1b[H${PASTE_ON}`);
306
+ const restoreScreen = () => {
307
+ // Reset the scroll region too: it survives the alt-screen switch on some
308
+ // terminals and would leave the user's shell fenced to a partial window.
309
+ output.write(`${PASTE_OFF}\x1b[r\x1b[?1049l\x1b[?25h`);
310
+ };
311
+ // Ctrl+C during an agent turn terminates the process (PR semantics); make
312
+ // sure the terminal is never left stranded in the alternate buffer.
313
+ const onSigint = () => {
314
+ restoreScreen();
315
+ process.exit(130);
316
+ };
317
+ process.on('SIGINT', onSigint);
318
+ process.once('exit', restoreScreen);
319
+ // Load the full screen first (banner now, dock right after); the mark
320
+ // animation plays in place once the prompt is up. First run in a repo
321
+ // (no .copperhead/ yet) uses the slow, recordable timing.
322
+ const firstRun = !existsSync(path.join(path.resolve(opts.repoRoot), '.copperhead'));
323
+ for (const line of banner(opts))
324
+ log(line);
325
+ let turns = 0;
326
+ const handleRequest = async (request) => {
327
+ try {
328
+ const res = await runOne(request, log, opts.renderer);
329
+ turns++;
330
+ if (res.outcome === 'failure') {
331
+ log(dim('(session continues — fix the issue or try another request)'));
332
+ }
333
+ }
334
+ catch (e) {
335
+ log(err(e.message));
336
+ log(dim('(session continues)'));
337
+ }
338
+ };
339
+ if (seed) {
340
+ log(` ${copper('→')} ${seed}`);
341
+ log('');
342
+ await handleRequest(seed);
343
+ }
344
+ const keys = new KeyReader(input);
345
+ const dock = new TerminalDock(output);
346
+ /** Feed the session KeyReader into option pickers (selectMenu). */
347
+ async function* sessionKeys() {
348
+ for (;;) {
349
+ const k = await keys.next();
350
+ if (k === null)
351
+ return;
352
+ yield k;
353
+ }
354
+ }
355
+ const runSlash = async (cmd) => {
356
+ if (QUIT.has(cmd))
357
+ return 'quit';
358
+ if (cmd === '/help' || cmd === '/h' || cmd === '/?') {
359
+ await staggerWrite(helpText().split('\n'), log);
360
+ return 'continue';
361
+ }
362
+ if (cmd === '/demo') {
363
+ await staggerWrite(demoTourText().split('\n'), log);
364
+ return 'continue';
365
+ }
366
+ if (cmd === '/examples') {
367
+ await staggerWrite(examplesText().split('\n'), log);
368
+ return 'continue';
369
+ }
370
+ if (cmd === '/status') {
371
+ log(await statusText(opts));
372
+ return 'continue';
373
+ }
374
+ if (cmd === '/version') {
375
+ log('');
376
+ log(metaRow('copperhead', opts.version));
377
+ log(metaRow('kicad-cli', opts.kicadCliVersion));
378
+ log(metaRow('node', process.version));
379
+ log('');
380
+ return 'continue';
381
+ }
382
+ if (cmd === '/clear' || cmd === '/cls') {
383
+ output.write('\x1b[2J\x1b[H');
384
+ for (const line of banner(opts))
385
+ log(line);
386
+ return 'continue';
387
+ }
388
+ if (cmd === '/model') {
389
+ // Claude Code-style option picker: switch the session model in place.
390
+ log('');
391
+ const chosen = await pickModel({
392
+ output: output,
393
+ keys: sessionKeys(),
394
+ });
395
+ if (chosen && chosen !== opts.model) {
396
+ opts.model = chosen;
397
+ opts.modelSource = 'picker';
398
+ log(ok(` model switched to ${chosen}`));
399
+ }
400
+ else {
401
+ log(metaRow('model', `${opts.model} ${dim(`via ${opts.modelSource}`)}`));
402
+ }
403
+ log('');
404
+ return 'continue';
405
+ }
406
+ if (cmd === '/check') {
407
+ log('');
408
+ try {
409
+ await checkCmd(log);
410
+ }
411
+ catch (e) {
412
+ log(err(e.message));
413
+ }
414
+ log('');
415
+ return 'continue';
416
+ }
417
+ if (cmd === '/sync') {
418
+ try {
419
+ log(await formatSyncInspect(opts.repoRoot));
420
+ }
421
+ catch (e) {
422
+ log(err(e.message));
423
+ }
424
+ return 'continue';
425
+ }
426
+ if (cmd === '/drift') {
427
+ try {
428
+ log(await formatDriftInspect(opts.repoRoot));
429
+ }
430
+ catch (e) {
431
+ log(err(e.message));
432
+ }
433
+ return 'continue';
434
+ }
435
+ if (cmd === '/constraints') {
436
+ try {
437
+ log(await formatConstraintsInspect(opts.repoRoot));
438
+ }
439
+ catch (e) {
440
+ log(err(e.message));
441
+ }
442
+ return 'continue';
443
+ }
444
+ if (cmd === '/config') {
445
+ try {
446
+ log(await formatConfigInspect(opts.repoRoot));
447
+ }
448
+ catch (e) {
449
+ log(err(e.message));
450
+ }
451
+ return 'continue';
452
+ }
453
+ if (cmd === '/git') {
454
+ try {
455
+ log(await formatGitInspect(opts.repoRoot));
456
+ }
457
+ catch (e) {
458
+ log(err(e.message));
459
+ }
460
+ return 'continue';
461
+ }
462
+ if (cmd === '/runs') {
463
+ try {
464
+ log(await formatRunsInspect(opts.repoRoot));
465
+ }
466
+ catch (e) {
467
+ log(err(e.message));
468
+ }
469
+ return 'continue';
470
+ }
471
+ if (cmd === '/parts') {
472
+ try {
473
+ log(await formatPartsInspect(opts.repoRoot));
474
+ }
475
+ catch (e) {
476
+ log(err(e.message));
477
+ }
478
+ return 'continue';
479
+ }
480
+ if (cmd === '/nets') {
481
+ try {
482
+ log(await formatNetsInspect(opts.repoRoot));
483
+ }
484
+ catch (e) {
485
+ log(err(e.message));
486
+ }
487
+ return 'continue';
488
+ }
489
+ if (cmd === '/bom') {
490
+ try {
491
+ log(await formatBomInspect(opts.repoRoot));
492
+ }
493
+ catch (e) {
494
+ log(err(e.message));
495
+ }
496
+ return 'continue';
497
+ }
498
+ if (cmd === '/openspec') {
499
+ try {
500
+ log(await formatOpenSpecInspect(opts.repoRoot));
501
+ }
502
+ catch (e) {
503
+ log(err(e.message));
504
+ }
505
+ return 'continue';
506
+ }
507
+ if (cmd === '/last') {
508
+ try {
509
+ log(await formatLastInspect(opts.repoRoot));
510
+ }
511
+ catch (e) {
512
+ log(err(e.message));
513
+ }
514
+ return 'continue';
515
+ }
516
+ log(warn(` unknown command ${cmd} — type / to see commands`));
517
+ return 'continue';
518
+ };
519
+ // Status-bar segments; git state refreshes after each agent turn.
520
+ let gitSeg = '';
521
+ const refreshGit = async () => {
522
+ if (!(await isGitRepo(opts.repoRoot))) {
523
+ gitSeg = '';
524
+ return;
525
+ }
526
+ const [branch, dirty] = await Promise.all([
527
+ branchName(opts.repoRoot).catch(() => ''),
528
+ isDirty(opts.repoRoot).catch(() => false),
529
+ ]);
530
+ gitSeg = branch ? `${branch}${dirty ? '*' : ''}` : '';
531
+ };
532
+ await refreshGit();
533
+ const metaLine = () => `${copper('●')} ${dim([opts.model, gitSeg].filter(Boolean).join(' · '))}`;
534
+ let asked = 0;
535
+ const ask = () => {
536
+ const example = EXAMPLE_REQUESTS[asked++ % EXAMPLE_REQUESTS.length];
537
+ return promptWithSlashHints({
538
+ prompt: PROMPT,
539
+ commands: SLASH_COMMANDS,
540
+ output: output,
541
+ dock,
542
+ placeholder: `Try "${example}"`,
543
+ status: () => ({
544
+ left: dim('/ for commands · pgup history · ctrl+c twice to quit'),
545
+ right: dim(`In ${path.basename(path.resolve(opts.repoRoot))}`),
546
+ }),
547
+ meta: metaLine,
548
+ echo: (line) => log(line),
549
+ history: () => history,
550
+ readKey: () => keys.next(),
551
+ drainPrintable: () => keys.drainPrintable(),
552
+ });
553
+ };
554
+ // Agent turns render through the dock too: durable lines into the content
555
+ // region + history, the live observability row pinned inside the dock.
556
+ opts.renderer = new DockRenderer(dock, log, () => ({
557
+ meta: metaLine(),
558
+ hints: dim('ctrl+c interrupts the run · output above scrolls into history'),
559
+ }));
560
+ // The banner mark sits at screen rows 2-4 (row 1 is the blank line after
561
+ // the alt-screen clear); pulse it once the first prompt has painted.
562
+ let markAnimated = false;
563
+ try {
564
+ for (;;) {
565
+ const pending = ask();
566
+ if (!markAnimated) {
567
+ markAnimated = true;
568
+ void animateMarkAt(output, 2, { slow: firstRun }).then(() => dock.repaint());
569
+ }
570
+ const raw = await pending;
571
+ if (raw === null)
572
+ break;
573
+ const line = raw.trim();
574
+ if (!line)
575
+ continue;
576
+ const slash = parseSlash(line);
577
+ if (slash) {
578
+ // Live prompt already resolves bare `/` to a concrete command via Enter.
579
+ if (slash.cmd === '/')
580
+ continue;
581
+ // Echo again above command output so history stays readable after
582
+ // long tours (/demo) push the prompt line out of the first viewport.
583
+ log(dim(` → ${slash.cmd}`));
584
+ const result = await runSlash(slash.cmd);
585
+ if (result === 'quit')
586
+ break;
587
+ continue;
588
+ }
589
+ // Pause raw-mode so Ctrl+C is a real SIGINT during the agent turn.
590
+ log('');
591
+ keys.pause();
592
+ try {
593
+ await handleRequest(line);
594
+ }
595
+ finally {
596
+ keys.resume();
597
+ }
598
+ await refreshGit();
599
+ log('');
600
+ }
601
+ }
602
+ finally {
603
+ keys.close();
604
+ dock.release();
605
+ process.removeListener('SIGINT', onSigint);
606
+ process.removeListener('exit', restoreScreen);
607
+ restoreScreen();
608
+ }
609
+ // Printed after the screen restore, so it lands in the normal buffer where
610
+ // the user's shell resumes.
611
+ log(dim(' copperhead session ended'));
612
+ if (logFilePath)
613
+ log(dim(` session log: ${shortPath(logFilePath)}`));
614
+ // Cast: TS narrows the closure-assigned handle to its initializer here.
615
+ logFile?.end();
616
+ return { ok: true, turns };
617
+ }
618
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/commands/repl.ts"],"names":[],"mappings":"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"}