@cam5/baby-bird 0.1.1 → 0.1.2

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/dist/cli.js CHANGED
@@ -4,32 +4,37 @@ import {
4
4
  BbError,
5
5
  CliRenderer,
6
6
  CommandProvider,
7
+ ConfigError,
7
8
  NotARepoError,
8
9
  TourCache,
9
10
  UsageError,
10
11
  allPresets,
12
+ buildChatContext,
13
+ chatSlots,
11
14
  describeSource2 as describeSource,
12
15
  generateTour,
16
+ git,
13
17
  gitRoot,
18
+ launchChat,
14
19
  loadConfig,
15
20
  prepareTour,
16
21
  projectConfigPath,
17
22
  relativeTime,
23
+ resolveChat,
18
24
  resolveLlm,
19
- supports256Colors,
20
25
  wrap,
21
26
  writeMaybePaged,
22
27
  writeStdout
23
- } from "./chunk-7ALXKEST.js";
28
+ } from "./chunk-YI2UL4IC.js";
24
29
 
25
30
  // src/cli/main.ts
26
31
  import { Command, InvalidArgumentError } from "commander";
27
- import pc5 from "picocolors";
32
+ import pc6 from "picocolors";
28
33
 
29
34
  // package.json
30
35
  var package_default = {
31
36
  name: "@cam5/baby-bird",
32
- version: "0.1.1",
37
+ version: "0.1.2",
33
38
  description: "Guided code tours for git changes, on the command line.",
34
39
  license: "MIT",
35
40
  type: "module",
@@ -105,7 +110,6 @@ function flagsToOverrides(flags) {
105
110
  if (flags.cache === false) o.cache = { enabled: false };
106
111
  if (flags.pager === false) o.render = { ...o.render ?? {}, pager: "never" };
107
112
  if (flags.highlight === false) o.render = { ...o.render ?? {}, highlight: "never" };
108
- if (flags.theme) o.render = { ...o.render ?? {}, theme: flags.theme };
109
113
  return o;
110
114
  }
111
115
  async function openSession(flags, opts) {
@@ -132,9 +136,8 @@ function resolveColor(mode) {
132
136
  return Boolean(process.stdout.isTTY) && process.env.TERM !== "dumb";
133
137
  }
134
138
  function resolveHighlight(mode, colorEnabled) {
135
- if (!colorEnabled || mode === "never") return false;
136
- if (mode === "always") return true;
137
- return supports256Colors();
139
+ if (mode === "never") return false;
140
+ return colorEnabled;
138
141
  }
139
142
  function terminalWidth(configured, stream = process.stdout) {
140
143
  return configured ?? (stream.columns || 80);
@@ -201,6 +204,13 @@ async function configCommand(flags) {
201
204
  } catch (err) {
202
205
  out.push(` ${c.red(err.message)}`);
203
206
  }
207
+ try {
208
+ const chat = resolveChat(config);
209
+ const provider = new CommandProvider({ command: chat.command, promptVia: "arg", timeoutMs: 1 });
210
+ out.push(` chat: ${provider.describe()}${c.dim(" (bb ask)")}`);
211
+ } catch (err) {
212
+ out.push(` chat: ${c.dim(`none: ${err.message}`)}`);
213
+ }
204
214
  out.push("");
205
215
  out.push(c.bold("Presets"));
206
216
  const presets = allPresets(config);
@@ -215,32 +225,13 @@ async function configCommand(flags) {
215
225
  process.stdout.write(out.join("\n") + "\n");
216
226
  }
217
227
 
218
- // src/cli/init-cmd.ts
219
- import { mkdir, writeFile } from "fs/promises";
220
- import { dirname } from "path";
221
- var STARTER = {
222
- llm: { preset: "claude" },
223
- codehost: { provider: "gh" }
224
- };
225
- async function initCommand(flags) {
226
- const session = await openSession(flags, { requireRepo: true });
227
- if (!session.root) throw new NotARepoError(session.cwd);
228
- const path = projectConfigPath(session.root);
229
- const existing = session.loaded.layers.find((l) => l.name === "project");
230
- if (existing?.found && !flags.force) {
231
- throw new UsageError(`${path} already exists.`, "Pass --force to overwrite it.");
232
- }
233
- await mkdir(dirname(path), { recursive: true });
234
- await writeFile(path, JSON.stringify(STARTER, null, 2) + "\n", "utf8");
235
- process.stdout.write(`Wrote ${path}
236
- Run \`bb config\` to see the effective configuration and available presets.
237
- `);
238
- }
228
+ // src/cli/ask-cmd.ts
229
+ import pc5 from "picocolors";
239
230
 
240
231
  // src/cli/progress.ts
241
232
  import pc4 from "picocolors";
242
233
  var SPINNER = ["\u2722", "\u2733", "\u2736", "\u273B", "\u273D", "\u273B", "\u2736", "\u2733"];
243
- var VERBS = ["Hatching", "Pecking", "Nesting", "Chirping", "Preening", "Fledging", "Brooding", "Warbling", "Peeping"];
234
+ var VERBS = ["Hatching", "Pecking", "Nesting", "Chirping", "Preening", "Fledging", "Brooding", "Warbling", "Peeping", "Squawking", "Swooping", "Tweeting", "Xeeting", "Cawing", "Twiddling About", "Hopping", "\u{1F425}-ing", "\u{1F423}-ing", "Masticating"];
244
235
  var THINKING_TAIL_CHARS = 2e3;
245
236
  var VERB_INTERVAL_MS = 7500;
246
237
  var LiveProgress = class {
@@ -463,6 +454,104 @@ function formatCount(n) {
463
454
  return n >= 1e3 ? `${(n / 1e3).toFixed(1)}k` : String(n);
464
455
  }
465
456
 
457
+ // src/cli/ask-cmd.ts
458
+ async function splitAskArgs(words, opts) {
459
+ const [first, ...rest] = words;
460
+ if (first !== void 0 && opts.rangeAllowed && await isRange(first, opts.cwd)) {
461
+ return { range: first, message: joinMessage(rest) };
462
+ }
463
+ return { message: joinMessage(words) };
464
+ }
465
+ async function isRange(word, cwd) {
466
+ if (!word || /\s/.test(word)) return false;
467
+ const res = await git(["rev-parse", "--quiet", "--end-of-options", word], { cwd, allowFailure: true });
468
+ return res.code === 0;
469
+ }
470
+ function joinMessage(words) {
471
+ const text = words.join(" ").trim();
472
+ return text ? text : void 0;
473
+ }
474
+ async function askCommand(words, flags) {
475
+ const session = await openSession(flags, { requireRepo: true });
476
+ if (!session.root) throw new NotARepoError(session.cwd);
477
+ const { config } = session.loaded;
478
+ const c = pc5.createColors(session.colorEnabled);
479
+ const chat = resolveChat(config);
480
+ const slots = chatSlots(chat.command);
481
+ if (!slots.context) {
482
+ throw new ConfigError("The chat command has no {context-file} or {context} token, so the tour cannot be handed to it.", "Add one of them to the chatCommand; see the README.");
483
+ }
484
+ const llm = resolveLlm(config);
485
+ const { range, message } = await splitAskArgs(words, { cwd: session.root, rangeAllowed: !flags.working && !flags.staged });
486
+ session.debug(range ? `range: ${range}` : "no range argument");
487
+ session.debug(message ? `opening message: ${JSON.stringify(message)}` : "no opening message");
488
+ const live = flags.progress !== false && !flags.debug && Boolean(process.stderr.isTTY) && !flags.dumpContext;
489
+ const progress = live ? new LiveProgress(process.stderr, { color: session.colorEnabled, width: terminalWidth(null, process.stderr) }) : loggingProgress(session.debug);
490
+ const options = {
491
+ cwd: session.root,
492
+ config,
493
+ cacheDir: session.loaded.cacheDir,
494
+ range: { arg: range, working: flags.working, staged: flags.staged },
495
+ refresh: flags.refresh,
496
+ noCache: flags.cache === false,
497
+ debug: session.debug,
498
+ warn: session.warn,
499
+ progress
500
+ };
501
+ if (progress instanceof LiveProgress) progress.start();
502
+ let prepared;
503
+ let result;
504
+ try {
505
+ prepared = await prepareTour(options);
506
+ result = await generateTour(options, prepared);
507
+ } catch (err) {
508
+ if (progress instanceof LiveProgress) progress.stop();
509
+ throw err;
510
+ }
511
+ if (progress instanceof LiveProgress) progress.stop(result.fromCache ? void 0 : progress.summary());
512
+ const context = buildChatContext({ tour: result.tour, change: prepared.context, maxBytes: llm.maxPromptBytes, tourPath: result.cachePath });
513
+ if (context.truncation.truncated.length || context.truncation.omitted.length) {
514
+ session.warn(`Chat context exceeded ${llm.maxPromptBytes} bytes; truncated ${context.truncation.truncated.length} and omitted ${context.truncation.omitted.length} file diff(s).`);
515
+ }
516
+ if (flags.dumpContext) {
517
+ await writeStdout(context.text.endsWith("\n") ? context.text : context.text + "\n");
518
+ return;
519
+ }
520
+ const tour = result.tour;
521
+ const when = result.fromCache ? `cached ${relativeTime(tour.generatedAt)}` : "generated just now";
522
+ process.stderr.write(`${c.bold(`\u{1F423} ${tour.title}`)}${c.dim(` \xB7 ${describeSource(tour.source)} \xB7 ${when}`)}
523
+ `);
524
+ if (message && !slots.message) {
525
+ session.warn("This chat command has no {message} slot; type your question into the chat once it opens.");
526
+ }
527
+ process.stderr.write(c.dim(`Opening ${chat.preset ?? chat.command[0]} with the tour as context\u2026
528
+ `));
529
+ const outcome = await launchChat({ command: chat.command, context: context.text, message, cwd: session.root, env: chat.env, debug: session.debug });
530
+ process.exitCode = outcome.exitCode;
531
+ }
532
+
533
+ // src/cli/init-cmd.ts
534
+ import { mkdir, writeFile } from "fs/promises";
535
+ import { dirname } from "path";
536
+ var STARTER = {
537
+ llm: { preset: "claude" },
538
+ codehost: { provider: "gh" }
539
+ };
540
+ async function initCommand(flags) {
541
+ const session = await openSession(flags, { requireRepo: true });
542
+ if (!session.root) throw new NotARepoError(session.cwd);
543
+ const path = projectConfigPath(session.root);
544
+ const existing = session.loaded.layers.find((l) => l.name === "project");
545
+ if (existing?.found && !flags.force) {
546
+ throw new UsageError(`${path} already exists.`, "Pass --force to overwrite it.");
547
+ }
548
+ await mkdir(dirname(path), { recursive: true });
549
+ await writeFile(path, JSON.stringify(STARTER, null, 2) + "\n", "utf8");
550
+ process.stdout.write(`Wrote ${path}
551
+ Run \`bb config\` to see the effective configuration and available presets.
552
+ `);
553
+ }
554
+
466
555
  // src/cli/tour.ts
467
556
  async function tourCommand(rangeArg, flags) {
468
557
  const session = await openSession(flags, { requireRepo: true });
@@ -505,8 +594,7 @@ async function tourCommand(rangeArg, flags) {
505
594
  width: terminalWidth(config.render.width),
506
595
  section: flags.section,
507
596
  fromCache: result.fromCache,
508
- highlight: resolveHighlight(config.render.highlight, session.colorEnabled),
509
- theme: config.render.theme
597
+ highlight: resolveHighlight(config.render.highlight, session.colorEnabled)
510
598
  });
511
599
  await writeMaybePaged(output, {
512
600
  mode: config.render.pager,
@@ -521,6 +609,9 @@ function positiveInt(value) {
521
609
  if (!Number.isInteger(n) || n < 1) throw new InvalidArgumentError("must be a positive integer");
522
610
  return n;
523
611
  }
612
+ function optsWithGlobals(cmd) {
613
+ return cmd.optsWithGlobals();
614
+ }
524
615
  function addGlobalFlags(cmd) {
525
616
  return cmd.option("-C, --cwd <dir>", "run as if started in <dir>").option("--preset <name>", "LLM preset to use (see `bb config`)").option("--color", "force colored output").option("--no-color", "disable colored output").option("--debug", "print diagnostics (resolved range, prompt size, raw model output) to stderr");
526
617
  }
@@ -529,11 +620,8 @@ process.stdout.on("error", (err) => {
529
620
  throw err;
530
621
  });
531
622
  var program = new Command();
532
- program.name("bb").description("Guided code tours for git changes, on the command line.").version(package_default.version, "-V, --version").configureOutput({ outputError: (str, write) => write(pc5.red(str)) }).showHelpAfterError("(run with --help for usage)");
533
- addGlobalFlags(program).argument("[range]", "what to tour: A..B, A...B, or a single ref (compared at its merge-base with HEAD)").option("-w, --working", "tour uncommitted changes in the working tree (tracked and untracked)").option("-s, --staged", "tour staged changes only").option("--section <n>", "render only section <n>", positiveInt).option("--json", "print the tour as JSON instead of rendering it").option("--dump-prompt", "print the prompt that would be sent to the model and exit").option("--refresh", "ignore a cached tour and regenerate it").option("--no-cache", "neither read nor write the tour cache").option("--no-pager", "never pipe output through a pager").option("--no-highlight", "plain green/red excerpts instead of syntax colors with tinted rows").option("--theme <name>", "background tint palette for added/removed lines: dark or light", (v) => {
534
- if (v !== "dark" && v !== "light") throw new InvalidArgumentError("must be dark or light");
535
- return v;
536
- }).option("--no-progress", "do not show the live status block while generating").addHelpText(
623
+ program.name("bb").description("Guided code tours for git changes, on the command line.").version(package_default.version, "-V, --version").enablePositionalOptions().configureOutput({ outputError: (str, write) => write(pc6.red(str)) }).showHelpAfterError("(run with --help for usage)");
624
+ addGlobalFlags(program).argument("[range]", "what to tour: A..B, A...B, or a single ref (compared at its merge-base with HEAD)").option("-w, --working", "tour uncommitted changes in the working tree (tracked and untracked)").option("-s, --staged", "tour staged changes only").option("--section <n>", "render only section <n>", positiveInt).option("--json", "print the tour as JSON instead of rendering it").option("--dump-prompt", "print the prompt that would be sent to the model and exit").option("--refresh", "ignore a cached tour and regenerate it").option("--no-cache", "neither read nor write the tour cache").option("--no-pager", "never pipe output through a pager").option("--no-highlight", "plain excerpts with green/red +/- signs instead of syntax colors").option("--no-progress", "do not show the live status block while generating").addHelpText(
537
625
  "after",
538
626
  `
539
627
  Examples:
@@ -544,34 +632,51 @@ Examples:
544
632
  bb --section 2 show only the second section
545
633
  bb --json | jq machine-readable output
546
634
  bb --preset claude-sonnet --refresh
635
+ bb ask HEAD~1 "what changed in progress.ts?" chat about a tour (see bb ask --help)
547
636
  `
548
637
  ).action(async (range, flags) => {
549
638
  await tourCommand(range, flags);
550
639
  });
640
+ addGlobalFlags(program.command("ask").description("chat with the LLM about a tour (the tour is generated or taken from the cache first)")).argument("[range]", "what to tour, as for `bb`; omit it to tour the same thing bare `bb` would").argument("[message...]", "opening message for the chat").option("-w, --working", "tour uncommitted changes in the working tree (tracked and untracked)").option("-s, --staged", "tour staged changes only").option("--refresh", "ignore a cached tour and regenerate it").option("--no-cache", "neither read nor write the tour cache").option("--no-progress", "do not show the live status block while generating").option("--dump-context", "print the context that would be handed to the chat and exit").addHelpText(
641
+ "after",
642
+ `
643
+ The first word is taken as a range only when git can resolve it (HEAD~3, main..feature);
644
+ everything else is the opening message. The chat command comes from the preset (see \`bb config\`).
645
+
646
+ Examples:
647
+ bb ask chat about the current branch's tour
648
+ bb ask "why does the cache key include the command?"
649
+ bb ask HEAD~1 "what is going on in progress.ts?"
650
+ bb ask main..feature --preset claude-opus
651
+ bb ask --staged "is this safe to commit?"
652
+ `
653
+ ).action(async (range, message, _flags, cmd) => {
654
+ await askCommand([range, ...message].filter((w) => w !== void 0), optsWithGlobals(cmd));
655
+ });
551
656
  var cache = program.command("cache").description("manage cached tours");
552
- addGlobalFlags(cache.command("ls").description("list cached tours")).action(cacheLsCommand);
553
- addGlobalFlags(cache.command("clear").description("delete all cached tours")).action(cacheClearCommand);
554
- addGlobalFlags(cache.command("path").description("print the cache directory")).action(cachePathCommand);
555
- addGlobalFlags(program.command("config").description("show the effective configuration, its sources, and available presets")).option("--json", "print only the effective config as JSON").action(configCommand);
556
- addGlobalFlags(program.command("init").description("write a starter .baby-bird/config.json in this repository")).option("--force", "overwrite an existing project config").action(initCommand);
657
+ addGlobalFlags(cache.command("ls").description("list cached tours")).action((_flags, cmd) => cacheLsCommand(optsWithGlobals(cmd)));
658
+ addGlobalFlags(cache.command("clear").description("delete all cached tours")).action((_flags, cmd) => cacheClearCommand(optsWithGlobals(cmd)));
659
+ addGlobalFlags(cache.command("path").description("print the cache directory")).action((_flags, cmd) => cachePathCommand(optsWithGlobals(cmd)));
660
+ addGlobalFlags(program.command("config").description("show the effective configuration, its sources, and available presets")).option("--json", "print only the effective config as JSON").action((_flags, cmd) => configCommand(optsWithGlobals(cmd)));
661
+ addGlobalFlags(program.command("init").description("write a starter .baby-bird/config.json in this repository")).option("--force", "overwrite an existing project config").action((_flags, cmd) => initCommand(optsWithGlobals(cmd)));
557
662
  program.parseAsync(process.argv).catch((err) => {
558
663
  const debug = process.argv.includes("--debug");
559
664
  if (err instanceof BbError) {
560
- process.stderr.write(pc5.red(`error: ${err.message}
665
+ process.stderr.write(pc6.red(`error: ${err.message}
561
666
  `));
562
- if (err.hint) process.stderr.write(pc5.dim(`${err.hint}
667
+ if (err.hint) process.stderr.write(pc6.dim(`${err.hint}
563
668
  `));
564
- if (debug && err instanceof BadLlmOutputError) process.stderr.write(pc5.dim(`--- raw model output ---
669
+ if (debug && err instanceof BadLlmOutputError) process.stderr.write(pc6.dim(`--- raw model output ---
565
670
  ${err.raw}
566
671
  `));
567
- if (debug && err.cause) process.stderr.write(pc5.dim(`${String(err.cause.stack ?? err.cause)}
672
+ if (debug && err.cause) process.stderr.write(pc6.dim(`${String(err.cause.stack ?? err.cause)}
568
673
  `));
569
674
  process.exitCode = err.exitCode;
570
675
  return;
571
676
  }
572
- process.stderr.write(pc5.red(`error: ${err.message ?? String(err)}
677
+ process.stderr.write(pc6.red(`error: ${err.message ?? String(err)}
573
678
  `));
574
- if (debug && err.stack) process.stderr.write(pc5.dim(`${err.stack}
679
+ if (debug && err.stack) process.stderr.write(pc6.dim(`${err.stack}
575
680
  `));
576
681
  process.exitCode = 1;
577
682
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/main.ts","../package.json","../src/cli/cache-cmd.ts","../src/cli/shared.ts","../src/cli/config-cmd.ts","../src/cli/init-cmd.ts","../src/cli/progress.ts","../src/cli/tour.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command, InvalidArgumentError } from 'commander';\nimport pc from 'picocolors';\nimport pkg from '../../package.json' with { type: 'json' };\nimport { BadLlmOutputError, BbError } from '../core/errors.js';\nimport { cacheClearCommand, cacheLsCommand, cachePathCommand } from './cache-cmd.js';\nimport { configCommand } from './config-cmd.js';\nimport { initCommand } from './init-cmd.js';\nimport { tourCommand } from './tour.js';\n\nfunction positiveInt(value: string): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) throw new InvalidArgumentError('must be a positive integer');\n return n;\n}\n\nfunction addGlobalFlags(cmd: Command): Command {\n return cmd\n .option('-C, --cwd <dir>', 'run as if started in <dir>')\n .option('--preset <name>', 'LLM preset to use (see `bb config`)')\n .option('--color', 'force colored output')\n .option('--no-color', 'disable colored output')\n .option('--debug', 'print diagnostics (resolved range, prompt size, raw model output) to stderr');\n}\n\n// A reader that quits early (`bb | head`) is a normal end, not a crash.\nprocess.stdout.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EPIPE') process.exit(0);\n throw err;\n});\n\nconst program = new Command();\n\nprogram\n .name('bb')\n .description('Guided code tours for git changes, on the command line.')\n .version(pkg.version, '-V, --version')\n .configureOutput({ outputError: (str, write) => write(pc.red(str)) })\n .showHelpAfterError('(run with --help for usage)');\n\naddGlobalFlags(program)\n .argument('[range]', 'what to tour: A..B, A...B, or a single ref (compared at its merge-base with HEAD)')\n .option('-w, --working', 'tour uncommitted changes in the working tree (tracked and untracked)')\n .option('-s, --staged', 'tour staged changes only')\n .option('--section <n>', 'render only section <n>', positiveInt)\n .option('--json', 'print the tour as JSON instead of rendering it')\n .option('--dump-prompt', 'print the prompt that would be sent to the model and exit')\n .option('--refresh', 'ignore a cached tour and regenerate it')\n .option('--no-cache', 'neither read nor write the tour cache')\n .option('--no-pager', 'never pipe output through a pager')\n .option('--no-highlight', 'plain green/red excerpts instead of syntax colors with tinted rows')\n .option('--theme <name>', 'background tint palette for added/removed lines: dark or light', (v: string) => {\n if (v !== 'dark' && v !== 'light') throw new InvalidArgumentError('must be dark or light');\n return v;\n })\n .option('--no-progress', 'do not show the live status block while generating')\n .addHelpText(\n 'after',\n `\nExamples:\n bb tour the current branch (dirty tree, PR base, nearest branch, or default branch)\n bb main..feature tour an explicit range\n bb HEAD~3 tour the last three commits\n bb --staged tour what you are about to commit\n bb --section 2 show only the second section\n bb --json | jq machine-readable output\n bb --preset claude-sonnet --refresh\n`,\n )\n .action(async (range: string | undefined, flags) => {\n await tourCommand(range, flags);\n });\n\nconst cache = program.command('cache').description('manage cached tours');\naddGlobalFlags(cache.command('ls').description('list cached tours')).action(cacheLsCommand);\naddGlobalFlags(cache.command('clear').description('delete all cached tours')).action(cacheClearCommand);\naddGlobalFlags(cache.command('path').description('print the cache directory')).action(cachePathCommand);\n\naddGlobalFlags(program.command('config').description('show the effective configuration, its sources, and available presets'))\n .option('--json', 'print only the effective config as JSON')\n .action(configCommand);\n\naddGlobalFlags(program.command('init').description('write a starter .baby-bird/config.json in this repository'))\n .option('--force', 'overwrite an existing project config')\n .action(initCommand);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n const debug = process.argv.includes('--debug');\n if (err instanceof BbError) {\n process.stderr.write(pc.red(`error: ${err.message}\\n`));\n if (err.hint) process.stderr.write(pc.dim(`${err.hint}\\n`));\n if (debug && err instanceof BadLlmOutputError) process.stderr.write(pc.dim(`--- raw model output ---\\n${err.raw}\\n`));\n if (debug && err.cause) process.stderr.write(pc.dim(`${String((err.cause as Error).stack ?? err.cause)}\\n`));\n process.exitCode = err.exitCode;\n return;\n }\n process.stderr.write(pc.red(`error: ${(err as Error).message ?? String(err)}\\n`));\n if (debug && (err as Error).stack) process.stderr.write(pc.dim(`${(err as Error).stack}\\n`));\n process.exitCode = 1;\n});\n","{\n \"name\": \"@cam5/baby-bird\",\n \"version\": \"0.1.1\",\n \"description\": \"Guided code tours for git changes, on the command line.\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/cam5/baby-bird.git\"\n },\n \"keywords\": [\n \"git\",\n \"code-review\",\n \"diff\",\n \"llm\",\n \"cli\",\n \"code-tour\"\n ],\n \"bin\": {\n \"bb\": \"dist/cli.js\",\n \"baby-bird\": \"dist/cli.js\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"packageManager\": \"pnpm@10.33.0\",\n \"scripts\": {\n \"dev\": \"tsx src/cli/main.ts\",\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm typecheck && pnpm test && pnpm build\"\n },\n \"dependencies\": {\n \"commander\": \"^15.0.0\",\n \"lowlight\": \"^3.3.0\",\n \"picocolors\": \"^1.1.1\",\n \"zod\": \"^4.6.2\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.20.2\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.23.13\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^5.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import pc from 'picocolors';\nimport { TourCache } from '../core/cache.js';\nimport { describeSource, relativeTime } from '../render/cli.js';\nimport { openSession, type GlobalFlags } from './shared.js';\n\nexport async function cacheLsCommand(flags: GlobalFlags): Promise<void> {\n const session = await openSession(flags, { requireRepo: false });\n const c = pc.createColors(session.colorEnabled);\n const cache = new TourCache(session.loaded.cacheDir);\n const entries = await cache.list();\n if (entries.length === 0) {\n process.stdout.write(`No cached tours in ${cache.toursDir}\\n`);\n return;\n }\n for (const e of entries) {\n const t = e.tour;\n process.stdout.write(\n `${c.dim(e.key.slice(0, 12))} ${relativeTime(t.generatedAt).padEnd(12)} ${c.bold(t.title)}\\n` +\n `${' '.repeat(14)}${c.dim(describeSource(t.source))}${t.generator.preset ? c.dim(` · ${t.generator.preset}`) : ''}\\n`,\n );\n }\n}\n\nexport async function cacheClearCommand(flags: GlobalFlags): Promise<void> {\n const session = await openSession(flags, { requireRepo: false });\n const cache = new TourCache(session.loaded.cacheDir);\n const n = await cache.clear();\n process.stdout.write(`Removed ${n} cached tour${n === 1 ? '' : 's'} from ${cache.toursDir}\\n`);\n}\n\nexport async function cachePathCommand(flags: GlobalFlags): Promise<void> {\n const session = await openSession(flags, { requireRepo: false });\n process.stdout.write(new TourCache(session.loaded.cacheDir).toursDir + '\\n');\n}\n","import pc from 'picocolors';\nimport { resolve } from 'node:path';\nimport type { PartialConfig } from '../core/config.js';\nimport { loadConfig, type LoadedConfig } from '../core/config.js';\nimport { gitRoot } from '../git/exec.js';\nimport { supports256Colors } from '../render/highlight.js';\n\nexport interface GlobalFlags {\n cwd?: string;\n debug?: boolean;\n color?: boolean;\n preset?: string;\n cache?: boolean;\n pager?: boolean;\n highlight?: boolean;\n theme?: 'dark' | 'light';\n}\n\nexport interface Session {\n /** Directory the user pointed at (resolved). */\n cwd: string;\n /** Git root, or null when not in a repository. */\n root: string | null;\n loaded: LoadedConfig;\n debug: (msg: string) => void;\n warn: (msg: string) => void;\n colorEnabled: boolean;\n}\n\nexport function flagsToOverrides(flags: GlobalFlags): PartialConfig {\n const o: PartialConfig = {};\n if (flags.preset) o.llm = { preset: flags.preset };\n if (flags.color === true) o.render = { color: 'always' };\n else if (flags.color === false) o.render = { color: 'never' };\n if (flags.cache === false) o.cache = { enabled: false };\n if (flags.pager === false) o.render = { ...(o.render ?? {}), pager: 'never' };\n if (flags.highlight === false) o.render = { ...(o.render ?? {}), highlight: 'never' };\n if (flags.theme) o.render = { ...(o.render ?? {}), theme: flags.theme };\n return o;\n}\n\nexport async function openSession(flags: GlobalFlags, opts: { requireRepo: boolean }): Promise<Session> {\n const cwd = resolve(flags.cwd ?? process.cwd());\n let root: string | null = null;\n try {\n root = await gitRoot(cwd);\n } catch (err) {\n if (opts.requireRepo) throw err;\n }\n const loaded = await loadConfig({ gitRoot: root, env: process.env, overrides: flagsToOverrides(flags) });\n const colorEnabled = resolveColor(loaded.config.render.color);\n const c = pc.createColors(colorEnabled);\n const debug = flags.debug ? (msg: string) => process.stderr.write(c.dim(`[bb] ${msg}\\n`)) : () => {};\n const warn = (msg: string) => process.stderr.write(c.yellow(`warning: ${msg}\\n`));\n return { cwd, root, loaded, debug, warn, colorEnabled };\n}\n\nexport function resolveColor(mode: 'auto' | 'always' | 'never'): boolean {\n if (mode === 'always') return true;\n if (mode === 'never') return false;\n return Boolean(process.stdout.isTTY) && process.env.TERM !== 'dumb';\n}\n\nexport function resolveHighlight(mode: 'auto' | 'always' | 'never', colorEnabled: boolean): boolean {\n if (!colorEnabled || mode === 'never') return false;\n if (mode === 'always') return true;\n return supports256Colors();\n}\n\nexport function terminalWidth(configured: number | null, stream: { columns?: number } = process.stdout): number {\n return configured ?? (stream.columns || 80);\n}\n","import pc from 'picocolors';\nimport { allPresets, resolveLlm } from '../core/config.js';\nimport { ConfigError } from '../core/errors.js';\nimport { CommandProvider } from '../llm/command.js';\nimport { openSession, type GlobalFlags } from './shared.js';\n\nexport async function configCommand(flags: GlobalFlags & { json?: boolean }): Promise<void> {\n const session = await openSession(flags, { requireRepo: false });\n const { config, layers, cacheDir } = session.loaded;\n\n if (flags.json) {\n process.stdout.write(JSON.stringify(config, null, 2) + '\\n');\n return;\n }\n\n const c = pc.createColors(session.colorEnabled);\n const out: string[] = [];\n out.push(c.bold('Layers') + c.dim(' (later layers win; objects merge, arrays replace)'));\n for (const layer of layers) {\n const status = layer.found ? c.green('applied') : c.dim('not found');\n const where = layer.path ?? (layer.detail || (layer.name === 'defaults' ? 'built-in' : layer.name === 'flags' ? 'command line' : ''));\n out.push(` ${layer.name.padEnd(8)} ${status.padEnd(session.colorEnabled ? 18 : 9)} ${c.dim(where)}`);\n }\n out.push(` cache dir: ${cacheDir}`);\n out.push('');\n\n out.push(c.bold('LLM'));\n try {\n const llm = resolveLlm(config);\n const provider = new CommandProvider({ command: llm.command, promptVia: llm.promptVia, timeoutMs: llm.timeoutMs });\n out.push(` preset: ${llm.preset ?? c.dim('(custom command)')}`);\n out.push(` command: ${provider.describe()}`);\n out.push(` prompt: via ${llm.promptVia}`);\n } catch (err) {\n out.push(` ${c.red((err as ConfigError).message)}`);\n }\n out.push('');\n\n out.push(c.bold('Presets'));\n const presets = allPresets(config);\n const width = Math.max(...Object.keys(presets).map((k) => k.length));\n for (const [name, preset] of Object.entries(presets).sort(([a], [b]) => a.localeCompare(b))) {\n const custom = name in config.llm.presets ? c.dim(' (yours)') : '';\n out.push(` ${name.padEnd(width)} ${preset.description ?? c.dim(preset.command.join(' '))}${custom}`);\n }\n out.push('');\n\n out.push(c.bold('Effective config'));\n out.push(JSON.stringify(config, null, 2).split('\\n').map((l) => ' ' + l).join('\\n'));\n process.stdout.write(out.join('\\n') + '\\n');\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { projectConfigPath } from '../core/config.js';\nimport { NotARepoError, UsageError } from '../core/errors.js';\nimport { openSession, type GlobalFlags } from './shared.js';\n\nconst STARTER = {\n llm: { preset: 'claude' },\n codehost: { provider: 'gh' },\n};\n\nexport async function initCommand(flags: GlobalFlags & { force?: boolean }): Promise<void> {\n const session = await openSession(flags, { requireRepo: true });\n if (!session.root) throw new NotARepoError(session.cwd);\n const path = projectConfigPath(session.root);\n const existing = session.loaded.layers.find((l) => l.name === 'project');\n if (existing?.found && !flags.force) {\n throw new UsageError(`${path} already exists.`, 'Pass --force to overwrite it.');\n }\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(STARTER, null, 2) + '\\n', 'utf8');\n process.stdout.write(`Wrote ${path}\\nRun \\`bb config\\` to see the effective configuration and available presets.\\n`);\n}\n","import pc from 'picocolors';\nimport type { ProgressSink } from '../core/progress.js';\nimport type { LlmEvent } from '../llm/provider.js';\nimport { wrap } from '../render/cli.js';\n\nconst SPINNER = ['✢', '✳', '✶', '✻', '✽', '✻', '✶', '✳'];\nconst VERBS = ['Hatching', 'Pecking', 'Nesting', 'Chirping', 'Preening', 'Fledging', 'Brooding', 'Warbling', 'Peeping'];\nconst THINKING_TAIL_CHARS = 2000;\nconst VERB_INTERVAL_MS = 7500;\n\nexport interface LiveProgressOptions {\n color: boolean;\n width: number;\n /** How many lines of thinking / section titles to show under the status line. */\n windowLines?: number;\n now?: () => number;\n /** Pin a single verb (tests). */\n verb?: string;\n /** Verbs to rotate through; the built-in list is used, shuffled, when omitted. */\n verbs?: string[];\n /** How often the verb changes. */\n verbIntervalMs?: number;\n frameMs?: number;\n}\n\ninterface Usage {\n outputTokens?: number;\n thinkingTokens?: number;\n model?: string;\n}\n\ntype Stage = 'prep' | 'thinking' | 'writing' | 'output';\n\n/**\n * In-place status block on a TTY: a spinner line plus a small window showing\n * the model's reasoning as it streams, then section titles as the answer forms.\n */\nexport class LiveProgress implements ProgressSink {\n private phaseLabel = '';\n private stage: Stage = 'prep';\n private thinking = '';\n private pulses = 0;\n private answer = '';\n private titles: string[] = [];\n private notices: string[] = [];\n private outputBytes = 0;\n private usage: Usage = {};\n private readonly startedAt: number;\n private frameIndex = 0;\n private lastLines = 0;\n private timer: NodeJS.Timeout | null = null;\n private stopped = false;\n private readonly verbs: string[];\n private readonly now: () => number;\n private readonly windowLines: number;\n private readonly onSigint = () => {\n this.stop();\n process.exit(130);\n };\n\n constructor(\n private readonly stream: { write(chunk: string): boolean },\n private readonly opts: LiveProgressOptions,\n ) {\n this.now = opts.now ?? Date.now;\n this.startedAt = this.now();\n this.verbs = opts.verb ? [opts.verb] : opts.verbs && opts.verbs.length ? opts.verbs : shuffle(VERBS);\n this.windowLines = opts.windowLines ?? 5;\n }\n\n start(): void {\n this.stream.write('\\x1b[?25l');\n process.once('SIGINT', this.onSigint);\n this.timer = setInterval(() => {\n this.frameIndex++;\n this.render();\n }, this.opts.frameMs ?? 80);\n this.timer.unref?.();\n this.render();\n }\n\n phase(label: string): void {\n this.phaseLabel = label;\n if (/^asking/i.test(label)) {\n this.stage = 'thinking';\n this.thinking = '';\n this.pulses = 0;\n this.answer = '';\n this.titles = [];\n this.notices = [];\n this.outputBytes = 0;\n } else if (this.stage !== 'prep') {\n this.stage = 'prep';\n }\n this.render();\n }\n\n llm(event: LlmEvent): void {\n switch (event.type) {\n case 'thinking':\n this.thinking += event.text;\n this.stage = 'thinking'; // thinking after a rejected answer comes back into view\n break;\n case 'thinking-pulse':\n this.pulses++;\n this.stage = 'thinking';\n break;\n case 'answer-start':\n this.answer = '';\n this.titles = [];\n break;\n case 'notice':\n this.notices.push(event.text);\n break;\n case 'text':\n this.answer += event.text;\n this.titles = extractTitles(this.answer);\n this.stage = 'writing';\n break;\n case 'output':\n this.outputBytes = event.bytes;\n this.stage = 'output';\n break;\n case 'usage':\n if (event.outputTokens !== undefined) this.usage.outputTokens = event.outputTokens;\n if (event.thinkingTokens !== undefined) this.usage.thinkingTokens = event.thinkingTokens;\n if (event.model !== undefined) this.usage.model = event.model;\n break;\n default:\n break;\n }\n }\n\n /** The lines that make up the current status block. */\n frame(): string[] {\n const c = pc.createColors(this.opts.color);\n const width = Math.max(30, this.opts.width);\n const spin = c.magenta(SPINNER[this.frameIndex % SPINNER.length]!);\n const elapsed = this.elapsed();\n const fit = (s: string) => (s.length > width - 1 ? s.slice(0, width - 2) + '…' : s);\n const lines: string[] = [];\n\n switch (this.stage) {\n case 'prep':\n lines.push(`${spin} ${fit(this.phaseLabel || 'Starting')}… ${c.dim(elapsed)}`);\n break;\n case 'thinking': {\n const meta = [elapsed, this.phaseLabel.replace(/^asking\\s+/i, '')].filter(Boolean).join(' · ');\n lines.push(`${spin} ${this.verb()}… ${c.dim(meta)}`);\n for (const n of this.notices.slice(-1)) lines.push(` ${c.yellow('↻')} ${c.yellow(fit(n).slice(0, width - 4))}`);\n if (this.thinking) {\n const tail = this.thinking.slice(-THINKING_TAIL_CHARS).replace(/\\s+/g, ' ').trim();\n const wrapped = wrap(tail, width - 4).slice(-this.windowLines);\n for (const l of wrapped) lines.push(` ${c.dim('│')} ${c.dim(l)}`);\n } else if (this.pulses > 0) {\n // The runner reports reasoning heartbeats without text: show a trail that grows with each one.\n const room = Math.max(8, width - 16);\n const n = this.pulses % (room + 1);\n lines.push(` ${c.dim('│')} ${c.dim('reasoning')} ${c.magenta('·'.repeat(n))}`);\n }\n break;\n }\n case 'writing': {\n const n = Math.max(0, this.titles.length - 1);\n lines.push(`${spin} Writing the tour… ${c.dim(`${elapsed} · ${n} section${n === 1 ? '' : 's'} so far`)}`);\n for (const note of this.notices.slice(-1)) lines.push(` ${c.yellow('↻')} ${c.yellow(fit(note).slice(0, width - 4))}`);\n const [tourTitle, ...sections] = this.titles;\n const items: string[] = [];\n if (tourTitle) items.push(` 🐣 ${c.bold(fit(tourTitle).slice(0, width - 6))}`);\n sections.forEach((t) => items.push(` ${c.green('✓')} ${fit(t).slice(0, width - 5)}`));\n for (const l of items.slice(-this.windowLines)) lines.push(l);\n break;\n }\n case 'output':\n lines.push(`${spin} ${this.verb()}… ${c.dim(`${elapsed} · ${formatBytes(this.outputBytes)} received`)}`);\n break;\n }\n return lines;\n }\n\n render(): void {\n if (this.stopped) return;\n const lines = this.frame();\n this.stream.write(this.erase() + lines.join('\\n') + '\\n');\n this.lastLines = lines.length;\n }\n\n /** Clear the block, restore the cursor, and optionally leave a final line behind. */\n stop(finalLine?: string): void {\n if (this.stopped) return;\n this.stopped = true;\n if (this.timer) clearInterval(this.timer);\n process.removeListener('SIGINT', this.onSigint);\n this.stream.write(this.erase() + (finalLine ? finalLine + '\\n' : '') + '\\x1b[?25h');\n this.lastLines = 0;\n }\n\n /** A one-line summary of the model call, for the final line. */\n summary(): string {\n const c = pc.createColors(this.opts.color);\n const parts = [`Hatched in ${this.elapsed()}`];\n if (this.usage.outputTokens) {\n parts.push(`${formatCount(this.usage.outputTokens)} tokens${this.usage.thinkingTokens ? ` (${formatCount(this.usage.thinkingTokens)} thinking)` : ''}`);\n }\n if (this.usage.model) parts.push(this.usage.model);\n return c.dim(`✻ ${parts.join(' · ')}`);\n }\n\n /** The current verb; rotates every verbIntervalMs so long waits do not stare at one word. */\n private verb(): string {\n const step = Math.floor((this.now() - this.startedAt) / (this.opts.verbIntervalMs ?? VERB_INTERVAL_MS));\n return this.verbs[step % this.verbs.length]!;\n }\n\n private elapsed(): string {\n const s = Math.max(0, Math.round((this.now() - this.startedAt) / 1000));\n return s >= 60 ? `${Math.floor(s / 60)}m ${s % 60}s` : `${s}s`;\n }\n\n private erase(): string {\n return this.lastLines ? `\\x1b[${this.lastLines}A\\x1b[0J` : '';\n }\n}\n\n/** Every \"title\" string value in a (possibly partial) JSON document, in order. */\nexport function extractTitles(text: string): string[] {\n const out: string[] = [];\n for (const m of text.matchAll(/\"title\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/g)) {\n out.push(m[1]!.replace(/\\\\([\"\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, (_, esc: string) => {\n switch (esc[0]) {\n case '\"': return '\"';\n case '\\\\': return '\\\\';\n case '/': return '/';\n case 'n': return '\\n';\n case 't': return '\\t';\n case 'u': return String.fromCharCode(parseInt(esc.slice(1), 16));\n default: return '';\n }\n }));\n }\n return out;\n}\n\n/** A sink that logs phases as plain lines (used with --debug or without a TTY). */\nexport function loggingProgress(log: (msg: string) => void): ProgressSink {\n return {\n phase: (label) => log(label),\n llm: () => {},\n };\n}\n\nfunction shuffle<T>(items: readonly T[]): T[] {\n const out = [...items];\n for (let i = out.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [out[i], out[j]] = [out[j]!, out[i]!];\n }\n return out;\n}\n\nfunction formatBytes(n: number): string {\n return n < 1024 ? `${n} B` : `${(n / 1024).toFixed(1)} KB`;\n}\n\nfunction formatCount(n: number): string {\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n","import { NotARepoError } from '../core/errors.js';\nimport { generateTour, prepareTour } from '../core/tour.js';\nimport { CliRenderer } from '../render/cli.js';\nimport { writeMaybePaged, writeStdout } from '../render/pager.js';\nimport { LiveProgress, loggingProgress } from './progress.js';\nimport { openSession, resolveHighlight, terminalWidth, type GlobalFlags } from './shared.js';\n\nexport interface TourFlags extends GlobalFlags {\n working?: boolean;\n staged?: boolean;\n section?: number;\n json?: boolean;\n dumpPrompt?: boolean;\n refresh?: boolean;\n progress?: boolean;\n}\n\nexport async function tourCommand(rangeArg: string | undefined, flags: TourFlags): Promise<void> {\n const session = await openSession(flags, { requireRepo: true });\n if (!session.root) throw new NotARepoError(session.cwd);\n const { config } = session.loaded;\n\n const live = flags.progress !== false && !flags.debug && Boolean(process.stderr.isTTY) && !flags.dumpPrompt;\n const progress = live\n ? new LiveProgress(process.stderr, { color: session.colorEnabled, width: terminalWidth(null, process.stderr) })\n : loggingProgress(session.debug);\n\n const options = {\n cwd: session.root,\n config,\n cacheDir: session.loaded.cacheDir,\n range: { arg: rangeArg, working: flags.working, staged: flags.staged },\n refresh: flags.refresh,\n noCache: flags.cache === false,\n debug: session.debug,\n warn: session.warn,\n progress,\n };\n\n if (progress instanceof LiveProgress) progress.start();\n let result: Awaited<ReturnType<typeof generateTour>>;\n try {\n const prepared = await prepareTour(options);\n if (flags.dumpPrompt) {\n await writeStdout(prepared.built.prompt.endsWith('\\n') ? prepared.built.prompt : prepared.built.prompt + '\\n');\n return;\n }\n result = await generateTour(options, prepared);\n } catch (err) {\n if (progress instanceof LiveProgress) progress.stop();\n throw err;\n }\n if (progress instanceof LiveProgress) progress.stop(result.fromCache ? undefined : progress.summary());\n\n if (flags.json) {\n await writeStdout(JSON.stringify(result.tour, null, 2) + '\\n');\n return;\n }\n\n const renderer = new CliRenderer();\n const output = renderer.render(result.tour, {\n color: session.colorEnabled,\n width: terminalWidth(config.render.width),\n section: flags.section,\n fromCache: result.fromCache,\n highlight: resolveHighlight(config.render.highlight, session.colorEnabled),\n theme: config.render.theme,\n });\n await writeMaybePaged(output, {\n mode: config.render.pager,\n isTTY: Boolean(process.stdout.isTTY),\n rows: process.stdout.rows ?? 24,\n });\n}\n"],"mappings":"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","names":["pc","pc","pc","cache","pc","pc","pc","pc","pc"]}
1
+ {"version":3,"sources":["../src/cli/main.ts","../package.json","../src/cli/cache-cmd.ts","../src/cli/shared.ts","../src/cli/config-cmd.ts","../src/cli/ask-cmd.ts","../src/cli/progress.ts","../src/cli/init-cmd.ts","../src/cli/tour.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command, InvalidArgumentError } from 'commander';\nimport pc from 'picocolors';\nimport pkg from '../../package.json' with { type: 'json' };\nimport { BadLlmOutputError, BbError } from '../core/errors.js';\nimport { cacheClearCommand, cacheLsCommand, cachePathCommand } from './cache-cmd.js';\nimport { configCommand } from './config-cmd.js';\nimport { askCommand } from './ask-cmd.js';\nimport { initCommand } from './init-cmd.js';\nimport { tourCommand } from './tour.js';\n\nfunction positiveInt(value: string): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < 1) throw new InvalidArgumentError('must be a positive integer');\n return n;\n}\n\n/** A subcommand's options plus any global flags given before its name (`bb -C dir cache ls`). */\nfunction optsWithGlobals<T>(cmd: Command): T {\n return cmd.optsWithGlobals() as T;\n}\n\nfunction addGlobalFlags(cmd: Command): Command {\n return cmd\n .option('-C, --cwd <dir>', 'run as if started in <dir>')\n .option('--preset <name>', 'LLM preset to use (see `bb config`)')\n .option('--color', 'force colored output')\n .option('--no-color', 'disable colored output')\n .option('--debug', 'print diagnostics (resolved range, prompt size, raw model output) to stderr');\n}\n\n// A reader that quits early (`bb | head`) is a normal end, not a crash.\nprocess.stdout.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EPIPE') process.exit(0);\n throw err;\n});\n\nconst program = new Command();\n\nprogram\n .name('bb')\n .description('Guided code tours for git changes, on the command line.')\n .version(pkg.version, '-V, --version')\n // Options after a subcommand name belong to the subcommand; `bb ask --preset x` must not be eaten by the root.\n .enablePositionalOptions()\n .configureOutput({ outputError: (str, write) => write(pc.red(str)) })\n .showHelpAfterError('(run with --help for usage)');\n\naddGlobalFlags(program)\n .argument('[range]', 'what to tour: A..B, A...B, or a single ref (compared at its merge-base with HEAD)')\n .option('-w, --working', 'tour uncommitted changes in the working tree (tracked and untracked)')\n .option('-s, --staged', 'tour staged changes only')\n .option('--section <n>', 'render only section <n>', positiveInt)\n .option('--json', 'print the tour as JSON instead of rendering it')\n .option('--dump-prompt', 'print the prompt that would be sent to the model and exit')\n .option('--refresh', 'ignore a cached tour and regenerate it')\n .option('--no-cache', 'neither read nor write the tour cache')\n .option('--no-pager', 'never pipe output through a pager')\n .option('--no-highlight', 'plain excerpts with green/red +/- signs instead of syntax colors')\n .option('--no-progress', 'do not show the live status block while generating')\n .addHelpText(\n 'after',\n `\nExamples:\n bb tour the current branch (dirty tree, PR base, nearest branch, or default branch)\n bb main..feature tour an explicit range\n bb HEAD~3 tour the last three commits\n bb --staged tour what you are about to commit\n bb --section 2 show only the second section\n bb --json | jq machine-readable output\n bb --preset claude-sonnet --refresh\n bb ask HEAD~1 \"what changed in progress.ts?\" chat about a tour (see bb ask --help)\n`,\n )\n .action(async (range: string | undefined, flags) => {\n await tourCommand(range, flags);\n });\n\naddGlobalFlags(program.command('ask').description('chat with the LLM about a tour (the tour is generated or taken from the cache first)'))\n .argument('[range]', 'what to tour, as for `bb`; omit it to tour the same thing bare `bb` would')\n .argument('[message...]', 'opening message for the chat')\n .option('-w, --working', 'tour uncommitted changes in the working tree (tracked and untracked)')\n .option('-s, --staged', 'tour staged changes only')\n .option('--refresh', 'ignore a cached tour and regenerate it')\n .option('--no-cache', 'neither read nor write the tour cache')\n .option('--no-progress', 'do not show the live status block while generating')\n .option('--dump-context', 'print the context that would be handed to the chat and exit')\n .addHelpText(\n 'after',\n `\nThe first word is taken as a range only when git can resolve it (HEAD~3, main..feature);\neverything else is the opening message. The chat command comes from the preset (see \\`bb config\\`).\n\nExamples:\n bb ask chat about the current branch's tour\n bb ask \"why does the cache key include the command?\"\n bb ask HEAD~1 \"what is going on in progress.ts?\"\n bb ask main..feature --preset claude-opus\n bb ask --staged \"is this safe to commit?\"\n`,\n )\n .action(async (range: string | undefined, message: string[], _flags, cmd: Command) => {\n await askCommand([range, ...message].filter((w): w is string => w !== undefined), optsWithGlobals(cmd));\n });\n\nconst cache = program.command('cache').description('manage cached tours');\naddGlobalFlags(cache.command('ls').description('list cached tours')).action((_flags, cmd: Command) => cacheLsCommand(optsWithGlobals(cmd)));\naddGlobalFlags(cache.command('clear').description('delete all cached tours')).action((_flags, cmd: Command) => cacheClearCommand(optsWithGlobals(cmd)));\naddGlobalFlags(cache.command('path').description('print the cache directory')).action((_flags, cmd: Command) => cachePathCommand(optsWithGlobals(cmd)));\n\naddGlobalFlags(program.command('config').description('show the effective configuration, its sources, and available presets'))\n .option('--json', 'print only the effective config as JSON')\n .action((_flags, cmd: Command) => configCommand(optsWithGlobals(cmd)));\n\naddGlobalFlags(program.command('init').description('write a starter .baby-bird/config.json in this repository'))\n .option('--force', 'overwrite an existing project config')\n .action((_flags, cmd: Command) => initCommand(optsWithGlobals(cmd)));\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n const debug = process.argv.includes('--debug');\n if (err instanceof BbError) {\n process.stderr.write(pc.red(`error: ${err.message}\\n`));\n if (err.hint) process.stderr.write(pc.dim(`${err.hint}\\n`));\n if (debug && err instanceof BadLlmOutputError) process.stderr.write(pc.dim(`--- raw model output ---\\n${err.raw}\\n`));\n if (debug && err.cause) process.stderr.write(pc.dim(`${String((err.cause as Error).stack ?? err.cause)}\\n`));\n process.exitCode = err.exitCode;\n return;\n }\n process.stderr.write(pc.red(`error: ${(err as Error).message ?? String(err)}\\n`));\n if (debug && (err as Error).stack) process.stderr.write(pc.dim(`${(err as Error).stack}\\n`));\n process.exitCode = 1;\n});\n","{\n \"name\": \"@cam5/baby-bird\",\n \"version\": \"0.1.2\",\n \"description\": \"Guided code tours for git changes, on the command line.\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/cam5/baby-bird.git\"\n },\n \"keywords\": [\n \"git\",\n \"code-review\",\n \"diff\",\n \"llm\",\n \"cli\",\n \"code-tour\"\n ],\n \"bin\": {\n \"bb\": \"dist/cli.js\",\n \"baby-bird\": \"dist/cli.js\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"packageManager\": \"pnpm@10.33.0\",\n \"scripts\": {\n \"dev\": \"tsx src/cli/main.ts\",\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm typecheck && pnpm test && pnpm build\"\n },\n \"dependencies\": {\n \"commander\": \"^15.0.0\",\n \"lowlight\": \"^3.3.0\",\n \"picocolors\": \"^1.1.1\",\n \"zod\": \"^4.6.2\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.20.2\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.23.13\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^5.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import pc from 'picocolors';\nimport { TourCache } from '../core/cache.js';\nimport { describeSource, relativeTime } from '../render/cli.js';\nimport { openSession, type GlobalFlags } from './shared.js';\n\nexport async function cacheLsCommand(flags: GlobalFlags): Promise<void> {\n const session = await openSession(flags, { requireRepo: false });\n const c = pc.createColors(session.colorEnabled);\n const cache = new TourCache(session.loaded.cacheDir);\n const entries = await cache.list();\n if (entries.length === 0) {\n process.stdout.write(`No cached tours in ${cache.toursDir}\\n`);\n return;\n }\n for (const e of entries) {\n const t = e.tour;\n process.stdout.write(\n `${c.dim(e.key.slice(0, 12))} ${relativeTime(t.generatedAt).padEnd(12)} ${c.bold(t.title)}\\n` +\n `${' '.repeat(14)}${c.dim(describeSource(t.source))}${t.generator.preset ? c.dim(` · ${t.generator.preset}`) : ''}\\n`,\n );\n }\n}\n\nexport async function cacheClearCommand(flags: GlobalFlags): Promise<void> {\n const session = await openSession(flags, { requireRepo: false });\n const cache = new TourCache(session.loaded.cacheDir);\n const n = await cache.clear();\n process.stdout.write(`Removed ${n} cached tour${n === 1 ? '' : 's'} from ${cache.toursDir}\\n`);\n}\n\nexport async function cachePathCommand(flags: GlobalFlags): Promise<void> {\n const session = await openSession(flags, { requireRepo: false });\n process.stdout.write(new TourCache(session.loaded.cacheDir).toursDir + '\\n');\n}\n","import pc from 'picocolors';\nimport { resolve } from 'node:path';\nimport type { PartialConfig } from '../core/config.js';\nimport { loadConfig, type LoadedConfig } from '../core/config.js';\nimport { gitRoot } from '../git/exec.js';\n\nexport interface GlobalFlags {\n cwd?: string;\n debug?: boolean;\n color?: boolean;\n preset?: string;\n cache?: boolean;\n pager?: boolean;\n highlight?: boolean;\n}\n\nexport interface Session {\n /** Directory the user pointed at (resolved). */\n cwd: string;\n /** Git root, or null when not in a repository. */\n root: string | null;\n loaded: LoadedConfig;\n debug: (msg: string) => void;\n warn: (msg: string) => void;\n colorEnabled: boolean;\n}\n\nexport function flagsToOverrides(flags: GlobalFlags): PartialConfig {\n const o: PartialConfig = {};\n if (flags.preset) o.llm = { preset: flags.preset };\n if (flags.color === true) o.render = { color: 'always' };\n else if (flags.color === false) o.render = { color: 'never' };\n if (flags.cache === false) o.cache = { enabled: false };\n if (flags.pager === false) o.render = { ...(o.render ?? {}), pager: 'never' };\n if (flags.highlight === false) o.render = { ...(o.render ?? {}), highlight: 'never' };\n return o;\n}\n\nexport async function openSession(flags: GlobalFlags, opts: { requireRepo: boolean }): Promise<Session> {\n const cwd = resolve(flags.cwd ?? process.cwd());\n let root: string | null = null;\n try {\n root = await gitRoot(cwd);\n } catch (err) {\n if (opts.requireRepo) throw err;\n }\n const loaded = await loadConfig({ gitRoot: root, env: process.env, overrides: flagsToOverrides(flags) });\n const colorEnabled = resolveColor(loaded.config.render.color);\n const c = pc.createColors(colorEnabled);\n const debug = flags.debug ? (msg: string) => process.stderr.write(c.dim(`[bb] ${msg}\\n`)) : () => {};\n const warn = (msg: string) => process.stderr.write(c.yellow(`warning: ${msg}\\n`));\n return { cwd, root, loaded, debug, warn, colorEnabled };\n}\n\nexport function resolveColor(mode: 'auto' | 'always' | 'never'): boolean {\n if (mode === 'always') return true;\n if (mode === 'never') return false;\n return Boolean(process.stdout.isTTY) && process.env.TERM !== 'dumb';\n}\n\nexport function resolveHighlight(mode: 'auto' | 'always' | 'never', colorEnabled: boolean): boolean {\n if (mode === 'never') return false;\n return colorEnabled;\n}\n\nexport function terminalWidth(configured: number | null, stream: { columns?: number } = process.stdout): number {\n return configured ?? (stream.columns || 80);\n}\n","import pc from 'picocolors';\nimport { allPresets, resolveChat, resolveLlm } from '../core/config.js';\nimport { ConfigError } from '../core/errors.js';\nimport { CommandProvider } from '../llm/command.js';\nimport { openSession, type GlobalFlags } from './shared.js';\n\nexport async function configCommand(flags: GlobalFlags & { json?: boolean }): Promise<void> {\n const session = await openSession(flags, { requireRepo: false });\n const { config, layers, cacheDir } = session.loaded;\n\n if (flags.json) {\n process.stdout.write(JSON.stringify(config, null, 2) + '\\n');\n return;\n }\n\n const c = pc.createColors(session.colorEnabled);\n const out: string[] = [];\n out.push(c.bold('Layers') + c.dim(' (later layers win; objects merge, arrays replace)'));\n for (const layer of layers) {\n const status = layer.found ? c.green('applied') : c.dim('not found');\n const where = layer.path ?? (layer.detail || (layer.name === 'defaults' ? 'built-in' : layer.name === 'flags' ? 'command line' : ''));\n out.push(` ${layer.name.padEnd(8)} ${status.padEnd(session.colorEnabled ? 18 : 9)} ${c.dim(where)}`);\n }\n out.push(` cache dir: ${cacheDir}`);\n out.push('');\n\n out.push(c.bold('LLM'));\n try {\n const llm = resolveLlm(config);\n const provider = new CommandProvider({ command: llm.command, promptVia: llm.promptVia, timeoutMs: llm.timeoutMs });\n out.push(` preset: ${llm.preset ?? c.dim('(custom command)')}`);\n out.push(` command: ${provider.describe()}`);\n out.push(` prompt: via ${llm.promptVia}`);\n } catch (err) {\n out.push(` ${c.red((err as ConfigError).message)}`);\n }\n try {\n const chat = resolveChat(config);\n const provider = new CommandProvider({ command: chat.command, promptVia: 'arg', timeoutMs: 1 });\n out.push(` chat: ${provider.describe()}${c.dim(' (bb ask)')}`);\n } catch (err) {\n out.push(` chat: ${c.dim(`none: ${(err as ConfigError).message}`)}`);\n }\n out.push('');\n\n out.push(c.bold('Presets'));\n const presets = allPresets(config);\n const width = Math.max(...Object.keys(presets).map((k) => k.length));\n for (const [name, preset] of Object.entries(presets).sort(([a], [b]) => a.localeCompare(b))) {\n const custom = name in config.llm.presets ? c.dim(' (yours)') : '';\n out.push(` ${name.padEnd(width)} ${preset.description ?? c.dim(preset.command.join(' '))}${custom}`);\n }\n out.push('');\n\n out.push(c.bold('Effective config'));\n out.push(JSON.stringify(config, null, 2).split('\\n').map((l) => ' ' + l).join('\\n'));\n process.stdout.write(out.join('\\n') + '\\n');\n}\n","import pc from 'picocolors';\nimport { buildChatContext } from '../core/chat.js';\nimport { resolveChat, resolveLlm } from '../core/config.js';\nimport { ConfigError, NotARepoError } from '../core/errors.js';\nimport { generateTour, prepareTour } from '../core/tour.js';\nimport { git } from '../git/exec.js';\nimport { chatSlots, launchChat } from '../llm/chat.js';\nimport { describeSource, relativeTime } from '../render/cli.js';\nimport { writeStdout } from '../render/pager.js';\nimport { LiveProgress, loggingProgress } from './progress.js';\nimport { openSession, terminalWidth, type GlobalFlags } from './shared.js';\n\nexport interface AskFlags extends GlobalFlags {\n working?: boolean;\n staged?: boolean;\n refresh?: boolean;\n progress?: boolean;\n dumpContext?: boolean;\n}\n\nexport interface AskArgs {\n range?: string;\n message?: string;\n}\n\n/**\n * `bb ask [range] [message...]`: the first word is a range only when git can resolve it\n * (`HEAD~1`, `main..feat`); otherwise every word is part of the opening message.\n */\nexport async function splitAskArgs(words: string[], opts: { cwd: string; rangeAllowed: boolean }): Promise<AskArgs> {\n const [first, ...rest] = words;\n if (first !== undefined && opts.rangeAllowed && (await isRange(first, opts.cwd))) {\n return { range: first, message: joinMessage(rest) };\n }\n return { message: joinMessage(words) };\n}\n\nasync function isRange(word: string, cwd: string): Promise<boolean> {\n if (!word || /\\s/.test(word)) return false;\n const res = await git(['rev-parse', '--quiet', '--end-of-options', word], { cwd, allowFailure: true });\n return res.code === 0;\n}\n\nfunction joinMessage(words: string[]): string | undefined {\n const text = words.join(' ').trim();\n return text ? text : undefined;\n}\n\nexport async function askCommand(words: string[], flags: AskFlags): Promise<void> {\n const session = await openSession(flags, { requireRepo: true });\n if (!session.root) throw new NotARepoError(session.cwd);\n const { config } = session.loaded;\n const c = pc.createColors(session.colorEnabled);\n\n // Fail before any git or model work when there is nothing to chat with.\n const chat = resolveChat(config);\n const slots = chatSlots(chat.command);\n if (!slots.context) {\n throw new ConfigError('The chat command has no {context-file} or {context} token, so the tour cannot be handed to it.', 'Add one of them to the chatCommand; see the README.');\n }\n const llm = resolveLlm(config);\n\n const { range, message } = await splitAskArgs(words, { cwd: session.root, rangeAllowed: !flags.working && !flags.staged });\n session.debug(range ? `range: ${range}` : 'no range argument');\n session.debug(message ? `opening message: ${JSON.stringify(message)}` : 'no opening message');\n\n const live = flags.progress !== false && !flags.debug && Boolean(process.stderr.isTTY) && !flags.dumpContext;\n const progress = live\n ? new LiveProgress(process.stderr, { color: session.colorEnabled, width: terminalWidth(null, process.stderr) })\n : loggingProgress(session.debug);\n\n const options = {\n cwd: session.root,\n config,\n cacheDir: session.loaded.cacheDir,\n range: { arg: range, working: flags.working, staged: flags.staged },\n refresh: flags.refresh,\n noCache: flags.cache === false,\n debug: session.debug,\n warn: session.warn,\n progress,\n };\n\n if (progress instanceof LiveProgress) progress.start();\n let prepared: Awaited<ReturnType<typeof prepareTour>>;\n let result: Awaited<ReturnType<typeof generateTour>>;\n try {\n prepared = await prepareTour(options);\n result = await generateTour(options, prepared);\n } catch (err) {\n if (progress instanceof LiveProgress) progress.stop();\n throw err;\n }\n if (progress instanceof LiveProgress) progress.stop(result.fromCache ? undefined : progress.summary());\n\n const context = buildChatContext({ tour: result.tour, change: prepared.context, maxBytes: llm.maxPromptBytes, tourPath: result.cachePath });\n if (context.truncation.truncated.length || context.truncation.omitted.length) {\n session.warn(`Chat context exceeded ${llm.maxPromptBytes} bytes; truncated ${context.truncation.truncated.length} and omitted ${context.truncation.omitted.length} file diff(s).`);\n }\n if (flags.dumpContext) {\n await writeStdout(context.text.endsWith('\\n') ? context.text : context.text + '\\n');\n return;\n }\n\n const tour = result.tour;\n const when = result.fromCache ? `cached ${relativeTime(tour.generatedAt)}` : 'generated just now';\n process.stderr.write(`${c.bold(`🐣 ${tour.title}`)}${c.dim(` · ${describeSource(tour.source)} · ${when}`)}\\n`);\n if (message && !slots.message) {\n session.warn('This chat command has no {message} slot; type your question into the chat once it opens.');\n }\n process.stderr.write(c.dim(`Opening ${chat.preset ?? chat.command[0]} with the tour as context…\\n`));\n\n const outcome = await launchChat({ command: chat.command, context: context.text, message, cwd: session.root, env: chat.env, debug: session.debug });\n process.exitCode = outcome.exitCode;\n}\n","import pc from 'picocolors';\nimport type { ProgressSink } from '../core/progress.js';\nimport type { LlmEvent } from '../llm/provider.js';\nimport { wrap } from '../render/cli.js';\n\nconst SPINNER = ['✢', '✳', '✶', '✻', '✽', '✻', '✶', '✳'];\nconst VERBS = ['Hatching', 'Pecking', 'Nesting', 'Chirping', 'Preening', 'Fledging', 'Brooding', 'Warbling', 'Peeping', 'Squawking', 'Swooping', 'Tweeting', 'Xeeting', 'Cawing', 'Twiddling About', 'Hopping', '🐥-ing', '🐣-ing', 'Masticating'];\nconst THINKING_TAIL_CHARS = 2000;\nconst VERB_INTERVAL_MS = 7500;\n\nexport interface LiveProgressOptions {\n color: boolean;\n width: number;\n /** How many lines of thinking / section titles to show under the status line. */\n windowLines?: number;\n now?: () => number;\n /** Pin a single verb (tests). */\n verb?: string;\n /** Verbs to rotate through; the built-in list is used, shuffled, when omitted. */\n verbs?: string[];\n /** How often the verb changes. */\n verbIntervalMs?: number;\n frameMs?: number;\n}\n\ninterface Usage {\n outputTokens?: number;\n thinkingTokens?: number;\n model?: string;\n}\n\ntype Stage = 'prep' | 'thinking' | 'writing' | 'output';\n\n/**\n * In-place status block on a TTY: a spinner line plus a small window showing\n * the model's reasoning as it streams, then section titles as the answer forms.\n */\nexport class LiveProgress implements ProgressSink {\n private phaseLabel = '';\n private stage: Stage = 'prep';\n private thinking = '';\n private pulses = 0;\n private answer = '';\n private titles: string[] = [];\n private notices: string[] = [];\n private outputBytes = 0;\n private usage: Usage = {};\n private readonly startedAt: number;\n private frameIndex = 0;\n private lastLines = 0;\n private timer: NodeJS.Timeout | null = null;\n private stopped = false;\n private readonly verbs: string[];\n private readonly now: () => number;\n private readonly windowLines: number;\n private readonly onSigint = () => {\n this.stop();\n process.exit(130);\n };\n\n constructor(\n private readonly stream: { write(chunk: string): boolean },\n private readonly opts: LiveProgressOptions,\n ) {\n this.now = opts.now ?? Date.now;\n this.startedAt = this.now();\n this.verbs = opts.verb ? [opts.verb] : opts.verbs && opts.verbs.length ? opts.verbs : shuffle(VERBS);\n this.windowLines = opts.windowLines ?? 5;\n }\n\n start(): void {\n this.stream.write('\\x1b[?25l');\n process.once('SIGINT', this.onSigint);\n this.timer = setInterval(() => {\n this.frameIndex++;\n this.render();\n }, this.opts.frameMs ?? 80);\n this.timer.unref?.();\n this.render();\n }\n\n phase(label: string): void {\n this.phaseLabel = label;\n if (/^asking/i.test(label)) {\n this.stage = 'thinking';\n this.thinking = '';\n this.pulses = 0;\n this.answer = '';\n this.titles = [];\n this.notices = [];\n this.outputBytes = 0;\n } else if (this.stage !== 'prep') {\n this.stage = 'prep';\n }\n this.render();\n }\n\n llm(event: LlmEvent): void {\n switch (event.type) {\n case 'thinking':\n this.thinking += event.text;\n this.stage = 'thinking'; // thinking after a rejected answer comes back into view\n break;\n case 'thinking-pulse':\n this.pulses++;\n this.stage = 'thinking';\n break;\n case 'answer-start':\n this.answer = '';\n this.titles = [];\n break;\n case 'notice':\n this.notices.push(event.text);\n break;\n case 'text':\n this.answer += event.text;\n this.titles = extractTitles(this.answer);\n this.stage = 'writing';\n break;\n case 'output':\n this.outputBytes = event.bytes;\n this.stage = 'output';\n break;\n case 'usage':\n if (event.outputTokens !== undefined) this.usage.outputTokens = event.outputTokens;\n if (event.thinkingTokens !== undefined) this.usage.thinkingTokens = event.thinkingTokens;\n if (event.model !== undefined) this.usage.model = event.model;\n break;\n default:\n break;\n }\n }\n\n /** The lines that make up the current status block. */\n frame(): string[] {\n const c = pc.createColors(this.opts.color);\n const width = Math.max(30, this.opts.width);\n const spin = c.magenta(SPINNER[this.frameIndex % SPINNER.length]!);\n const elapsed = this.elapsed();\n const fit = (s: string) => (s.length > width - 1 ? s.slice(0, width - 2) + '…' : s);\n const lines: string[] = [];\n\n switch (this.stage) {\n case 'prep':\n lines.push(`${spin} ${fit(this.phaseLabel || 'Starting')}… ${c.dim(elapsed)}`);\n break;\n case 'thinking': {\n const meta = [elapsed, this.phaseLabel.replace(/^asking\\s+/i, '')].filter(Boolean).join(' · ');\n lines.push(`${spin} ${this.verb()}… ${c.dim(meta)}`);\n for (const n of this.notices.slice(-1)) lines.push(` ${c.yellow('↻')} ${c.yellow(fit(n).slice(0, width - 4))}`);\n if (this.thinking) {\n const tail = this.thinking.slice(-THINKING_TAIL_CHARS).replace(/\\s+/g, ' ').trim();\n const wrapped = wrap(tail, width - 4).slice(-this.windowLines);\n for (const l of wrapped) lines.push(` ${c.dim('│')} ${c.dim(l)}`);\n } else if (this.pulses > 0) {\n // The runner reports reasoning heartbeats without text: show a trail that grows with each one.\n const room = Math.max(8, width - 16);\n const n = this.pulses % (room + 1);\n lines.push(` ${c.dim('│')} ${c.dim('reasoning')} ${c.magenta('·'.repeat(n))}`);\n }\n break;\n }\n case 'writing': {\n const n = Math.max(0, this.titles.length - 1);\n lines.push(`${spin} Writing the tour… ${c.dim(`${elapsed} · ${n} section${n === 1 ? '' : 's'} so far`)}`);\n for (const note of this.notices.slice(-1)) lines.push(` ${c.yellow('↻')} ${c.yellow(fit(note).slice(0, width - 4))}`);\n const [tourTitle, ...sections] = this.titles;\n const items: string[] = [];\n if (tourTitle) items.push(` 🐣 ${c.bold(fit(tourTitle).slice(0, width - 6))}`);\n sections.forEach((t) => items.push(` ${c.green('✓')} ${fit(t).slice(0, width - 5)}`));\n for (const l of items.slice(-this.windowLines)) lines.push(l);\n break;\n }\n case 'output':\n lines.push(`${spin} ${this.verb()}… ${c.dim(`${elapsed} · ${formatBytes(this.outputBytes)} received`)}`);\n break;\n }\n return lines;\n }\n\n render(): void {\n if (this.stopped) return;\n const lines = this.frame();\n this.stream.write(this.erase() + lines.join('\\n') + '\\n');\n this.lastLines = lines.length;\n }\n\n /** Clear the block, restore the cursor, and optionally leave a final line behind. */\n stop(finalLine?: string): void {\n if (this.stopped) return;\n this.stopped = true;\n if (this.timer) clearInterval(this.timer);\n process.removeListener('SIGINT', this.onSigint);\n this.stream.write(this.erase() + (finalLine ? finalLine + '\\n' : '') + '\\x1b[?25h');\n this.lastLines = 0;\n }\n\n /** A one-line summary of the model call, for the final line. */\n summary(): string {\n const c = pc.createColors(this.opts.color);\n const parts = [`Hatched in ${this.elapsed()}`];\n if (this.usage.outputTokens) {\n parts.push(`${formatCount(this.usage.outputTokens)} tokens${this.usage.thinkingTokens ? ` (${formatCount(this.usage.thinkingTokens)} thinking)` : ''}`);\n }\n if (this.usage.model) parts.push(this.usage.model);\n return c.dim(`✻ ${parts.join(' · ')}`);\n }\n\n /** The current verb; rotates every verbIntervalMs so long waits do not stare at one word. */\n private verb(): string {\n const step = Math.floor((this.now() - this.startedAt) / (this.opts.verbIntervalMs ?? VERB_INTERVAL_MS));\n return this.verbs[step % this.verbs.length]!;\n }\n\n private elapsed(): string {\n const s = Math.max(0, Math.round((this.now() - this.startedAt) / 1000));\n return s >= 60 ? `${Math.floor(s / 60)}m ${s % 60}s` : `${s}s`;\n }\n\n private erase(): string {\n return this.lastLines ? `\\x1b[${this.lastLines}A\\x1b[0J` : '';\n }\n}\n\n/** Every \"title\" string value in a (possibly partial) JSON document, in order. */\nexport function extractTitles(text: string): string[] {\n const out: string[] = [];\n for (const m of text.matchAll(/\"title\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/g)) {\n out.push(m[1]!.replace(/\\\\([\"\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, (_, esc: string) => {\n switch (esc[0]) {\n case '\"': return '\"';\n case '\\\\': return '\\\\';\n case '/': return '/';\n case 'n': return '\\n';\n case 't': return '\\t';\n case 'u': return String.fromCharCode(parseInt(esc.slice(1), 16));\n default: return '';\n }\n }));\n }\n return out;\n}\n\n/** A sink that logs phases as plain lines (used with --debug or without a TTY). */\nexport function loggingProgress(log: (msg: string) => void): ProgressSink {\n return {\n phase: (label) => log(label),\n llm: () => {},\n };\n}\n\nfunction shuffle<T>(items: readonly T[]): T[] {\n const out = [...items];\n for (let i = out.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [out[i], out[j]] = [out[j]!, out[i]!];\n }\n return out;\n}\n\nfunction formatBytes(n: number): string {\n return n < 1024 ? `${n} B` : `${(n / 1024).toFixed(1)} KB`;\n}\n\nfunction formatCount(n: number): string {\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { projectConfigPath } from '../core/config.js';\nimport { NotARepoError, UsageError } from '../core/errors.js';\nimport { openSession, type GlobalFlags } from './shared.js';\n\nconst STARTER = {\n llm: { preset: 'claude' },\n codehost: { provider: 'gh' },\n};\n\nexport async function initCommand(flags: GlobalFlags & { force?: boolean }): Promise<void> {\n const session = await openSession(flags, { requireRepo: true });\n if (!session.root) throw new NotARepoError(session.cwd);\n const path = projectConfigPath(session.root);\n const existing = session.loaded.layers.find((l) => l.name === 'project');\n if (existing?.found && !flags.force) {\n throw new UsageError(`${path} already exists.`, 'Pass --force to overwrite it.');\n }\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(STARTER, null, 2) + '\\n', 'utf8');\n process.stdout.write(`Wrote ${path}\\nRun \\`bb config\\` to see the effective configuration and available presets.\\n`);\n}\n","import { NotARepoError } from '../core/errors.js';\nimport { generateTour, prepareTour } from '../core/tour.js';\nimport { CliRenderer } from '../render/cli.js';\nimport { writeMaybePaged, writeStdout } from '../render/pager.js';\nimport { LiveProgress, loggingProgress } from './progress.js';\nimport { openSession, resolveHighlight, terminalWidth, type GlobalFlags } from './shared.js';\n\nexport interface TourFlags extends GlobalFlags {\n working?: boolean;\n staged?: boolean;\n section?: number;\n json?: boolean;\n dumpPrompt?: boolean;\n refresh?: boolean;\n progress?: boolean;\n}\n\nexport async function tourCommand(rangeArg: string | undefined, flags: TourFlags): Promise<void> {\n const session = await openSession(flags, { requireRepo: true });\n if (!session.root) throw new NotARepoError(session.cwd);\n const { config } = session.loaded;\n\n const live = flags.progress !== false && !flags.debug && Boolean(process.stderr.isTTY) && !flags.dumpPrompt;\n const progress = live\n ? new LiveProgress(process.stderr, { color: session.colorEnabled, width: terminalWidth(null, process.stderr) })\n : loggingProgress(session.debug);\n\n const options = {\n cwd: session.root,\n config,\n cacheDir: session.loaded.cacheDir,\n range: { arg: rangeArg, working: flags.working, staged: flags.staged },\n refresh: flags.refresh,\n noCache: flags.cache === false,\n debug: session.debug,\n warn: session.warn,\n progress,\n };\n\n if (progress instanceof LiveProgress) progress.start();\n let result: Awaited<ReturnType<typeof generateTour>>;\n try {\n const prepared = await prepareTour(options);\n if (flags.dumpPrompt) {\n await writeStdout(prepared.built.prompt.endsWith('\\n') ? prepared.built.prompt : prepared.built.prompt + '\\n');\n return;\n }\n result = await generateTour(options, prepared);\n } catch (err) {\n if (progress instanceof LiveProgress) progress.stop();\n throw err;\n }\n if (progress instanceof LiveProgress) progress.stop(result.fromCache ? undefined : progress.summary());\n\n if (flags.json) {\n await writeStdout(JSON.stringify(result.tour, null, 2) + '\\n');\n return;\n }\n\n const renderer = new CliRenderer();\n const output = renderer.render(result.tour, {\n color: session.colorEnabled,\n width: terminalWidth(config.render.width),\n section: flags.section,\n fromCache: result.fromCache,\n highlight: resolveHighlight(config.render.highlight, session.colorEnabled),\n });\n await writeMaybePaged(output, {\n mode: config.render.pager,\n isTTY: Boolean(process.stdout.isTTY),\n rows: process.stdout.rows ?? 24,\n });\n}\n"],"mappings":"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","names":["pc","pc","pc","cache","pc","pc","pc","pc","pc","pc","pc"]}