squad-kit 0.3.0 → 0.6.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.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/ui/banner.ts","../src/ui/theme.ts","../src/ui/tty.ts","../src/ui/prefix.ts","../src/ui/spinner.ts","../src/ui/divider.ts","../src/ui/box.ts","../src/ui/error.ts","../src/commands/init.ts","../src/core/paths.ts","../src/core/gitignore.ts","../src/core/config.ts","../src/core/planner-models.ts","../src/core/secrets.ts","../src/utils/fs.ts","../src/core/template.ts","../src/commands/config/show.ts","../src/commands/config/masks.ts","../src/commands/config/set-planner.ts","../src/tracker/env-overlay.ts","../src/core/probes.ts","../src/commands/config/shared.ts","../src/commands/config/unset-planner.ts","../src/commands/config/set-tracker.ts","../src/tracker/types.ts","../src/tracker/attachments.ts","../src/tracker/azure.ts","../src/tracker/adf.ts","../src/tracker/jira.ts","../src/tracker/index.ts","../src/commands/config/unset-tracker.ts","../src/commands/config/remove-credential.ts","../src/commands/new-story.ts","../src/core/stories.ts","../src/core/tracker.ts","../src/commands/new-plan.ts","../src/utils/clipboard.ts","../src/planner/loop.ts","../src/planner/tools.ts","../src/planner/provider-errors.ts","../src/planner/stable-json.ts","../src/planner/providers/anthropic.ts","../src/planner/providers/openai.ts","../src/planner/providers/google.ts","../src/planner/providers/prefix.ts","../src/planner/providers/index.ts","../src/planner/budget.ts","../src/core/repo-map.ts","../src/planner/system-prompt.ts","../src/planner/writer.ts","../src/core/sequence.ts","../src/core/last-run.ts","../src/ui/planner-cache-summary.ts","../src/commands/status.ts","../src/commands/list.ts","../src/commands/tracker-link.ts","../src/commands/doctor.ts","../src/commands/migrate.ts","../src/commands/upgrade.ts","../src/core/package-info.ts","../src/core/registry.ts","../src/core/package-manager.ts","../src/commands/rm/shared.ts","../src/commands/rm/story.ts","../src/commands/rm/feature.ts","../src/commands/rm/plan.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as ui from './ui/index.js';\nimport { runInit, type InitOptions } from './commands/init.js';\nimport { runNewStory } from './commands/new-story.js';\nimport { runNewPlan } from './commands/new-plan.js';\nimport { runStatus } from './commands/status.js';\nimport { runList } from './commands/list.js';\nimport { runTrackerLink } from './commands/tracker-link.js';\nimport { runDoctor } from './commands/doctor.js';\nimport { runMigrate } from './commands/migrate.js';\nimport { runUpgrade } from './commands/upgrade.js';\nimport {\n runConfigShow,\n runConfigSetPlanner,\n runConfigSetTracker,\n runConfigUnsetPlanner,\n runConfigUnsetTracker,\n runConfigRemoveCredential,\n} from './commands/config/index.js';\nimport { runRmFeature, runRmPlan, runRmStory } from './commands/rm/index.js';\n\nconst program = new Command();\n\nprogram\n .name('squad')\n .description('Plan once, execute cheap. A 3-step SDD workflow CLI.')\n .version('0.3.0');\n\nprogram\n .command('init')\n .description('Bootstrap .squad/ in the current directory')\n .option('--agents <list>', 'Comma-separated agent list: claude-code,cursor,copilot,gemini')\n .option('--tracker <type>', 'Tracker type: none|github|linear|jira|azure')\n .option(\n '--tracker-workspace <hostOrOrg>',\n 'Jira host or Azure org (non-interactive default; also written to config for jira/azure)',\n )\n .option('--tracker-project <name>', 'Azure project name (non-interactive; written to config when set)')\n .option('--name <name>', 'Project name')\n .option('--language <lang>', 'Primary language')\n .option('--force', 'Overwrite existing files', false)\n .option('-y, --yes', 'Accept defaults (non-interactive)', false)\n .option(\n '--skip-secrets-prompt',\n 'Do not prompt for tracker or planner API keys (leaves .squad/secrets.yaml unchanged)',\n false,\n )\n .option(\n '--planner <provider>',\n 'Enable direct planner and set provider (anthropic|openai|google). Implies non-interactive enable.',\n )\n .option('--no-planner', 'Disable direct planner in non-interactive mode (default when -y).', false)\n .action(\n wrap(\n (opts: InitOptions & { noPlanner?: boolean; planner?: string; agents?: string; skipSecretsPrompt?: boolean }) => {\n const { noPlanner, skipSecretsPrompt, ...rest } = opts;\n const noPromptSecrets =\n Boolean(skipSecretsPrompt) || process.argv.includes('--no-prompt-secrets');\n return runInit({\n ...rest,\n noPromptSecrets,\n planner: noPlanner ? false : rest.planner,\n });\n },\n ),\n );\n\nprogram\n .command('new-story [feature-slug]')\n .description('Scaffold a new story intake under .squad/stories/<feature>/<id>/')\n .option('--id <id>', 'Tracker work-item id (used for folder name and auto-fetch when configured)')\n .option('--title <title>', 'Short title hint (placed at top of intake)')\n .option('-y, --yes', 'Fail fast instead of prompting for missing values', false)\n .option('--no-fetch', 'Skip tracker auto-fetch even when tracker and credentials are configured')\n .option('--no-attachments', 'Fetch issue metadata but do not download attachments')\n .option('--attachment-mb <n>', 'Override attachment size cap in MB (default 10)', (v) => parseInt(v, 10))\n .option(\n '--no-tracker',\n 'Skip tracker fetch AND drop the tracker-id requirement for this story',\n )\n .action(wrapArgs(runNewStory));\n\nprogram\n .command('new-plan [intake-path]')\n .description('Generate a plan (via direct API when configured, otherwise copy-paste)')\n .option('--no-clipboard', 'Do not copy the composed prompt to clipboard (copy-paste mode only)')\n .option('--feature <slug>', 'Filter picker by feature slug')\n .option('--all', 'Include already-planned intakes in the picker', false)\n .option('-y, --yes', 'Skip confirmation prompts', false)\n .option('--api', 'Force direct planner API (fails if not configured)', false)\n .option('--copy', 'Force copy-paste mode even when planner API is configured', false)\n .action(wrapArgs(runNewPlan));\n\nprogram.command('status').description('Show squad-kit workspace status').action(wrap(runStatus));\n\nprogram\n .command('doctor')\n .description('Run a health check on the local .squad/ workspace and its external integrations')\n .option('--fix', 'Apply non-destructive repairs (gitignore, permissions, missing dirs)', false)\n .option('--json', 'Emit results as JSON to stdout (for scripting)', false)\n .action(wrap(runDoctor));\n\nprogram\n .command('migrate')\n .description('Apply one-shot structural migrations to bring .squad/ to the latest version')\n .option('--dry-run', 'Show what would change without touching the filesystem', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrap(runMigrate));\n\nprogram\n .command('upgrade')\n .description('Check for and install the latest squad-kit release')\n .option('--check', 'Only check for updates; do not install', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrap(runUpgrade));\n\nprogram\n .command('list')\n .description('List stories and their plan state')\n .option('--feature <slug>', 'Filter by feature slug')\n .action(wrap(runList));\n\nconst rm = program.command('rm').description('Delete stories, plans, or entire features safely');\n\nrm\n .command('story [story-path-or-id]')\n .description('Delete a story: intake folder + matching plan file + overview row')\n .option('--feature <slug>', 'Scope the picker or lookup to one feature')\n .option('--dry-run', 'Show what would be deleted without touching the filesystem', false)\n .option('--trash', 'Move into .squad/.trash/<ts>/ instead of permanent delete', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrapArgs(runRmStory));\n\nrm\n .command('plan [plan-path-or-sequence]')\n .description('Delete a single plan file; leaves the intake for regeneration with new-plan')\n .option('--feature <slug>', 'Scope the picker to one feature')\n .option('--dry-run', 'Show what would be deleted without touching the filesystem', false)\n .option('--trash', 'Move into .squad/.trash/<ts>/ instead of permanent delete', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrapArgs(runRmPlan));\n\nrm\n .command('feature [feature-slug]')\n .description('Delete an entire feature: every story, every plan, the overview file')\n .option('--dry-run', 'Show what would be deleted without touching the filesystem', false)\n .option('--trash', 'Move into .squad/.trash/<ts>/ instead of permanent delete', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrapArgs(runRmFeature));\n\nconst tracker = program.command('tracker').description('Tracker id helpers');\ntracker\n .command('link [story-path] [tracker-id]')\n .description('Attach/update a tracker id on an existing story intake')\n .option('-y, --yes', 'Fail fast instead of prompting for missing values', false)\n .action(wrapArgs(runTrackerLink));\n\nconst config = program.command('config').description('Inspect and change .squad/ settings');\n\nconfig\n .command('show')\n .description('Show the current .squad/config.yaml and .squad/secrets.yaml state (secrets masked)')\n .option('--json', 'Emit as JSON to stdout (secrets still masked)', false)\n .action(wrap(runConfigShow));\n\nconst set = config.command('set').description('Interactively change a section');\nset\n .command('planner')\n .description('Set or change the planner provider, model override, and credentials')\n .option('--provider <name>', 'Skip the provider prompt (anthropic|openai|google)')\n .option('-y, --yes', 'Fail fast instead of prompting for missing values', false)\n .action(wrap(runConfigSetPlanner));\nset\n .command('tracker')\n .description('Set or change the tracker type, workspace, and credentials')\n .option('--type <name>', 'Skip the tracker-type prompt (none|jira|azure|github|linear)')\n .option('-y, --yes', 'Fail fast instead of prompting for missing values', false)\n .action(wrap(runConfigSetTracker));\n\nconst unset = config.command('unset').description('Disable or clear a section');\nunset\n .command('planner')\n .description('Disable the direct planner (keeps provider credentials unless --remove-credentials)')\n .option('--remove-credentials', 'Also delete planner keys from .squad/secrets.yaml', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrap(runConfigUnsetPlanner));\nunset\n .command('tracker')\n .description('Set tracker.type back to \"none\" (keeps credentials unless --remove-credentials)')\n .option('--remove-credentials', 'Also delete tracker credentials from .squad/secrets.yaml', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrap(runConfigUnsetTracker));\n\nconfig\n .command('remove-credential <section>')\n .description('Delete credentials for \"planner\" or \"tracker\" from .squad/secrets.yaml without touching config.yaml')\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(\n wrapArgs(\n (section: string, opts: { yes?: boolean }) => runConfigRemoveCredential(section, { yes: opts.yes }),\n ),\n );\n\nprogram.parseAsync(process.argv).catch((err) => {\n ui.renderError(err);\n process.exit(1);\n});\n\nfunction wrap<T>(fn: (opts: T) => Promise<void>) {\n return async (opts: T) => {\n try {\n await fn(opts);\n } catch (err) {\n ui.renderError(err);\n process.exit(1);\n }\n };\n}\n\nfunction wrapArgs<A extends unknown[]>(fn: (...args: A) => Promise<void>) {\n return async (...args: A) => {\n try {\n await fn(...args);\n } catch (err) {\n ui.renderError(err);\n process.exit(1);\n }\n };\n}\n","import boxen from 'boxen';\nimport { accent, dim, primary } from './theme.js';\nimport { isInteractive } from './tty.js';\n\nexport function banner(): void {\n if (!isInteractive()) return;\n const title = primary('squad');\n const tagline = dim('plan once, execute cheap');\n const body = `${title} ${accent('·')} ${tagline}`;\n const boxed = boxen(body, {\n padding: { top: 0, bottom: 0, left: 2, right: 2 },\n margin: { top: 1, bottom: 1, left: 0, right: 0 },\n borderStyle: 'round',\n borderColor: 'green',\n });\n process.stderr.write(boxed + '\\n');\n}\n\nexport function bannerMinimal(): void {\n if (!isInteractive()) return;\n const line = ` ${primary('▸')} ${primary('squad')} ${dim('· plan once, execute cheap')}`;\n process.stderr.write(line + '\\n');\n process.stderr.write(' ' + dim('─'.repeat(42)) + '\\n\\n');\n}\n","import kleur from 'kleur';\n\nexport const BRAND = {\n primaryHex: '#7cffa0',\n accentHex: '#a393eb',\n} as const;\n\nexport const PREFIX = {\n running: '◆',\n success: '✓',\n failure: '✗',\n step: '▸',\n warn: '!',\n muted: '·',\n} as const;\n\nexport const SPINNER_FRAMES = ['◐', '◓', '◑', '◒'] as const;\n\nexport const primary = (s: string) => kleur.green(s);\nexport const accent = (s: string) => kleur.magenta(s);\nexport const muted = (s: string) => kleur.gray(s);\nexport const danger = (s: string) => kleur.red(s);\nexport const warn = (s: string) => kleur.yellow(s);\nexport const bold = (s: string) => kleur.bold(s);\nexport const dim = (s: string) => kleur.dim(s);\n","export function isInteractive(): boolean {\n if (process.env.CI) return false;\n if (process.env.SQUAD_QUIET) return false;\n return Boolean(process.stdout.isTTY && process.stderr.isTTY);\n}\n\nexport function stderrCols(): number {\n return process.stderr.columns ?? 80;\n}\n","import { PREFIX } from './theme.js';\nimport { accent, danger, dim, primary, warn } from './theme.js';\n\nexport const step = (msg: string) => process.stderr.write(` ${primary(PREFIX.step)} ${msg}\\n`);\nexport const success = (msg: string) => process.stderr.write(` ${primary(PREFIX.success)} ${msg}\\n`);\nexport const failure = (msg: string) => process.stderr.write(` ${danger(PREFIX.failure)} ${msg}\\n`);\nexport const warning = (msg: string) => process.stderr.write(` ${warn(PREFIX.warn)} ${msg}\\n`);\nexport const info = (msg: string) => process.stderr.write(` ${accent(PREFIX.muted)} ${dim(msg)}\\n`);\nexport const blank = () => process.stderr.write('\\n');\n\n/** Single line to stderr (for tables / doctor output). */\nexport function line(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n\nexport function kv(key: string, value: string, keyWidth = 10): void {\n process.stderr.write(` ${dim(key.padEnd(keyWidth))} ${value}\\n`);\n}\n","import ora, { type Ora } from 'ora';\nimport { SPINNER_FRAMES } from './theme.js';\nimport { isInteractive } from './tty.js';\n\nexport interface SquadSpinner {\n update(text: string): void;\n succeed(text?: string): void;\n fail(text?: string): void;\n stop(): void;\n}\n\nexport function spinner(text: string): SquadSpinner {\n if (!isInteractive()) {\n return {\n update: (t) => process.stderr.write(` ◆ ${t}\\n`),\n succeed: (t) => process.stderr.write(` ✓ ${t ?? text}\\n`),\n fail: (t) => process.stderr.write(` ✗ ${t ?? text}\\n`),\n stop: () => {},\n };\n }\n const instance: Ora = ora({\n text,\n stream: process.stderr,\n spinner: { interval: 120, frames: [...SPINNER_FRAMES] },\n color: 'green',\n prefixText: ' ',\n }).start();\n return {\n update: (t) => {\n instance.text = t;\n },\n succeed: (t) => instance.succeed(t),\n fail: (t) => instance.fail(t),\n stop: () => instance.stop(),\n };\n}\n","import { dim } from './theme.js';\nimport { stderrCols } from './tty.js';\n\nexport function divider(label?: string): void {\n const cols = Math.max(30, Math.min(stderrCols() - 4, 80));\n if (!label) {\n process.stderr.write(' ' + dim('─'.repeat(cols)) + '\\n');\n return;\n }\n const labelPart = ` ${label} `;\n const remaining = cols - labelPart.length - 2;\n const left = 2;\n const right = Math.max(2, remaining - left);\n process.stderr.write(' ' + dim('─'.repeat(left)) + labelPart + dim('─'.repeat(right)) + '\\n');\n}\n","import boxen from 'boxen';\nimport { dim } from './theme.js';\nimport { isInteractive } from './tty.js';\n\nexport interface SummaryRow {\n key: string;\n value: string;\n}\n\nexport function summaryBox(title: string, rows: SummaryRow[]): void {\n const keyWidth = Math.max(...rows.map((r) => r.key.length));\n const body = rows.map((r) => `${dim(r.key.padEnd(keyWidth))} ${r.value}`).join('\\n');\n\n if (!isInteractive()) {\n process.stderr.write(`\\n${title}\\n${body}\\n`);\n return;\n }\n\n const out = boxen(body, {\n title,\n titleAlignment: 'left',\n padding: { top: 0, bottom: 0, left: 1, right: 1 },\n margin: { top: 1, bottom: 0, left: 2, right: 0 },\n borderStyle: 'round',\n borderColor: 'green',\n });\n process.stderr.write(out + '\\n');\n}\n","import { danger } from './theme.js';\n\nexport function renderError(err: unknown): void {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(` ${danger('✗')} ${msg}\\n`);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { input, select, checkbox, confirm, password } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { isInteractive } from '../ui/tty.js';\nimport { buildPaths, SQUAD_DIR } from '../core/paths.js';\nimport { ensureGitignore } from '../core/gitignore.js';\nimport { saveConfig, type SquadConfig, type TrackerType } from '../core/config.js';\nimport { modelFor, providerEnvVar, resolveProviderKey } from '../core/planner-models.js';\nimport { copyTree, templatesDir, writeFileSafe, readFile } from '../utils/fs.js';\nimport { render } from '../core/template.js';\nimport type { PlannerConfig } from '../planner/types.js';\nimport type { ProviderName } from '../planner/types.js';\nimport { loadSecrets, saveSecrets, mergeSecrets, type SquadSecrets } from '../core/secrets.js';\nimport {\n runConfigSetPlanner,\n runConfigSetTracker,\n mergePlannerKeyIntoSecrets,\n promptJiraCredentials,\n promptAzureCredentials,\n} from './config/index.js';\n\nexport interface InitOptions {\n agents?: string;\n tracker?: TrackerType;\n /** Jira host or Azure org; used as default in prompts and in `-y` config when set. */\n trackerWorkspace?: string;\n /** Azure project; used as default in prompts and in `-y` config when set. */\n trackerProject?: string;\n name?: string;\n language?: string;\n force?: boolean;\n yes?: boolean;\n /** Skip Jira/Azure + planner key prompts (no writes to secrets.yaml from prompts). */\n noPromptSecrets?: boolean;\n /** String provider when `--planner`; `false` when `--no-planner` (commander). */\n planner?: string | false;\n}\n\nconst SUPPORTED_AGENTS = ['claude-code', 'cursor', 'copilot', 'gemini'] as const;\ntype AgentName = (typeof SUPPORTED_AGENTS)[number];\n\nconst AGENT_INSTALL: Record<AgentName, { subdir: string; srcDir: string }> = {\n 'claude-code': { subdir: path.join('.claude', 'commands'), srcDir: 'claude-code' },\n cursor: { subdir: path.join('.cursor', 'commands'), srcDir: 'cursor' },\n copilot: { subdir: path.join('.github', 'prompts'), srcDir: 'copilot' },\n gemini: { subdir: path.join('.gemini', 'commands'), srcDir: 'gemini' },\n};\n\nexport async function runInit(opts: InitOptions): Promise<void> {\n const root = process.cwd();\n const paths = buildPaths(root);\n\n if (!opts.yes) {\n ui.banner();\n }\n\n if (fs.existsSync(paths.configFile) && !opts.force) {\n if (!isInteractive() || opts.yes) {\n ui.warning(\n `A ${SQUAD_DIR}/config.yaml already exists. Run \\`squad init --force\\` to overwrite, or \\`squad config set planner\\` / \\`squad config set tracker\\` to change individual sections.`,\n );\n return;\n }\n const choice = (await select({\n message: `${SQUAD_DIR}/ already exists. What do you want to do?`,\n choices: [\n { name: 'Reconfigure planner (same as `squad config set planner`)', value: 'planner' as const },\n { name: 'Reconfigure tracker (same as `squad config set tracker`)', value: 'tracker' as const },\n { name: 'Overwrite everything (same as --force)', value: 'overwrite' as const },\n { name: 'Cancel', value: 'cancel' as const },\n ],\n })) as 'planner' | 'tracker' | 'overwrite' | 'cancel';\n if (choice === 'cancel') {\n return;\n }\n if (choice === 'planner') {\n return runConfigSetPlanner({});\n }\n if (choice === 'tracker') {\n return runConfigSetTracker({});\n }\n // overwrite: fall through\n }\n\n const defaults = {\n name: opts.name ?? path.basename(root),\n language: opts.language ?? 'typescript',\n tracker: (opts.tracker ?? 'none') as TrackerType,\n agents: parseAgentsFlag(opts.agents),\n };\n\n const answers = opts.yes\n ? defaults\n : {\n name: await input({ message: 'Project name', default: defaults.name }),\n language: await input({ message: 'Primary language', default: defaults.language }),\n tracker: (await select({\n message: 'Issue tracker',\n choices: [\n { name: 'None', value: 'none' as TrackerType },\n { name: 'GitHub Issues', value: 'github' as TrackerType },\n { name: 'Linear', value: 'linear' as TrackerType },\n { name: 'Jira', value: 'jira' as TrackerType },\n { name: 'Azure DevOps', value: 'azure' as TrackerType },\n ],\n default: defaults.tracker,\n })) as TrackerType,\n agents: (await checkbox({\n message: 'Install slash commands for which agents?',\n choices: SUPPORTED_AGENTS.map((a) => ({ name: a, value: a, checked: defaults.agents.includes(a) })),\n })) as AgentName[],\n };\n\n const includeTrackerId =\n answers.tracker !== 'none'\n ? await confirmSafe('Include tracker id in plan filenames (NN-story-<slug>-<id>.md)?', true, !!opts.yes)\n : false;\n\n const allowSecretPrompts = !opts.yes && !opts.noPromptSecrets;\n let trackerWorkspace = opts.trackerWorkspace?.trim() || undefined;\n let trackerProject = opts.trackerProject?.trim() || undefined;\n\n if (allowSecretPrompts && answers.tracker === 'jira') {\n ui.step('Jira Cloud credentials (stored in .squad/secrets.yaml — always git-ignored)');\n\n const { host, email, token } = await promptJiraCredentials({ host: trackerWorkspace });\n\n const base = loadSecrets(paths.secretsFile);\n const merged = mergeSecrets(base, {\n tracker: { jira: { host: host.trim(), email: email.trim(), token } },\n });\n saveSecrets(paths.secretsFile, merged);\n\n trackerWorkspace = host.trim();\n ui.success('Jira credentials saved');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n } else if (allowSecretPrompts && answers.tracker === 'azure') {\n ui.step('Azure DevOps credentials (stored in .squad/secrets.yaml — always git-ignored)');\n const a = await promptAzureCredentials({ organization: trackerWorkspace, project: trackerProject });\n const base = loadSecrets(paths.secretsFile);\n const merged = mergeSecrets(base, {\n tracker: {\n azure: { organization: a.organization, project: a.project, pat: a.pat },\n },\n });\n saveSecrets(paths.secretsFile, merged);\n\n trackerWorkspace = a.organization;\n trackerProject = a.project;\n ui.success('Azure DevOps credentials saved');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n }\n\n let plannerBlock: PlannerConfig | undefined;\n if (opts.yes) {\n if (opts.planner && opts.planner !== 'false') {\n const provider = opts.planner;\n if (!['anthropic', 'openai', 'google'].includes(provider)) {\n throw new Error(\n '--planner must be one of anthropic | openai | google. Run `squad init --planner anthropic` (or openai / google) with `--yes` in non-interactive mode.',\n );\n }\n plannerBlock = {\n enabled: true,\n provider: provider as ProviderName,\n mode: 'auto',\n budget: {\n maxFileReads: 25,\n maxContextBytes: 50_000,\n maxDurationSeconds: 180,\n },\n };\n }\n } else {\n const plannerEnabled = await confirm({\n message:\n 'Enable automatic plan generation? (press Enter to skip — you can always edit .squad/config.yaml later)',\n default: false,\n });\n if (plannerEnabled) {\n const provider = (await select({\n message: 'Planner provider:',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' as ProviderName },\n { name: 'OpenAI (GPT)', value: 'openai' as ProviderName },\n { name: 'Google (Gemini)', value: 'google' as ProviderName },\n ],\n default: 'anthropic' as ProviderName,\n })) as ProviderName;\n plannerBlock = {\n enabled: true,\n provider,\n mode: 'auto',\n budget: {\n maxFileReads: 25,\n maxContextBytes: 50_000,\n maxDurationSeconds: 180,\n },\n };\n }\n }\n\n if (plannerBlock?.enabled && allowSecretPrompts) {\n const envVar = providerEnvVar(plannerBlock.provider);\n const envPresent = Boolean(process.env[envVar]);\n if (envPresent) {\n ui.info(`Planner key detected in ${envVar}; keeping env-var resolution as the primary source.`);\n } else {\n const storeKey = (await select({\n message: `No ${envVar} in your environment. How do you want to store your planner API key?`,\n choices: [\n { name: `Enter it now and save to .squad/secrets.yaml (git-ignored)`, value: 'secrets' as const },\n { name: `I'll export ${envVar} in my shell profile myself`, value: 'env' as const },\n ],\n })) as 'secrets' | 'env';\n\n if (storeKey === 'secrets') {\n const key = await password({\n message: `${envVar} value (input hidden):`,\n validate: (v) => (v.length >= 20 ? true : 'key looks too short'),\n });\n const base = loadSecrets(paths.secretsFile);\n const merged = mergePlannerKeyIntoSecrets(base, plannerBlock.provider, key);\n saveSecrets(paths.secretsFile, merged);\n ui.success('Planner key saved to .squad/secrets.yaml');\n } else {\n ui.info(`Remember to export ${envVar} before running \\`squad new-plan\\`.`);\n }\n }\n }\n\n const trackerConfig: SquadConfig['tracker'] = { type: answers.tracker };\n if (answers.tracker === 'jira' || answers.tracker === 'azure') {\n if (trackerWorkspace) trackerConfig.workspace = trackerWorkspace;\n if (trackerProject) trackerConfig.project = trackerProject;\n }\n\n const config: SquadConfig = {\n version: 1,\n project: { name: answers.name, primaryLanguage: answers.language, projectRoots: ['.'] },\n tracker: trackerConfig,\n naming: { includeTrackerId, globalSequence: true },\n agents: answers.agents,\n planner: plannerBlock,\n };\n\n fs.mkdirSync(paths.squadDir, { recursive: true });\n fs.mkdirSync(paths.storiesDir, { recursive: true });\n fs.mkdirSync(paths.plansDir, { recursive: true });\n\n writeFileSafe(\n paths.indexFile,\n readFile(path.join(templatesDir(), 'index.md')),\n !!opts.force,\n );\n\n saveConfig(paths.configFile, config);\n\n if (ensureGitignore(paths.root)) {\n ui.info('Updated .gitignore with squad-managed patterns (e.g. .squad/secrets.yaml).');\n }\n\n writeFileSafe(\n path.join(paths.squadDir, 'README.md'),\n renderSquadReadme(config),\n !!opts.force,\n );\n\n for (const agent of answers.agents) {\n installAgent(root, agent as AgentName, !!opts.force);\n }\n\n ui.blank();\n ui.success(`Initialized ${SQUAD_DIR}/ at ${root}`);\n ui.kv('tracker', config.tracker.type, 7);\n ui.kv('agents', answers.agents.length ? answers.agents.join(', ') : '(none)', 7);\n if (plannerBlock) {\n const envVar = providerEnvVar(plannerBlock.provider);\n const hasKey = Boolean(resolveProviderKey(plannerBlock.provider));\n const model = modelFor(plannerBlock.provider, 'plan', plannerBlock.modelOverride);\n const overrideNote = plannerBlock.modelOverride?.[plannerBlock.provider] ? ' (override)' : '';\n ui.kv('planner', `${plannerBlock.provider}/${model}${overrideNote}`);\n ui.kv('key', hasKey ? `✓ (${envVar} or .squad/secrets.yaml)` : `missing (set ${envVar})`);\n if (!hasKey) {\n ui.blank();\n ui.warning('Planner key not found in environment or .squad/secrets.yaml.');\n ui.info('Set one of these before running `squad new-plan`:');\n ui.info(` export ${envVar}=<your-key>`);\n ui.info(' # or use a cross-provider fallback:');\n ui.info(' export SQUAD_PLANNER_API_KEY=<your-key>');\n ui.info(' # or re-run `squad init` and save the key to .squad/secrets.yaml when prompted.');\n ui.info('squad-kit never reads keys from .squad/config.yaml.');\n }\n }\n ui.blank();\n ui.step('Next:');\n ui.info('1) squad new-story <feature-slug>');\n ui.info('2) Fill the generated intake.md, then run /squad-plan in your agent (or squad new-plan).');\n}\n\nfunction parseAgentsFlag(flag?: string): AgentName[] {\n if (!flag) return [];\n return flag\n .split(',')\n .map((s) => s.trim())\n .filter((s): s is AgentName => (SUPPORTED_AGENTS as readonly string[]).includes(s));\n}\n\nasync function confirmSafe(message: string, defaultValue: boolean, nonInteractive: boolean): Promise<boolean> {\n if (nonInteractive) return defaultValue;\n return confirm({ message, default: defaultValue });\n}\n\nfunction installAgent(root: string, agent: AgentName, overwrite: boolean): void {\n const config = AGENT_INSTALL[agent];\n const src = path.join(templatesDir(), 'agents', config.srcDir);\n const dest = path.join(root, config.subdir);\n if (!fs.existsSync(src)) return;\n copyTree(src, dest, overwrite);\n}\n\nfunction renderSquadReadme(config: SquadConfig): string {\n return render(\n `# squad-kit workspace\n\nThis folder is managed by [squad-kit](https://github.com/AzmSquad/squad-kit).\n\n- **Project:** {{name}}\n- **Language:** {{language}}\n- **Tracker:** {{tracker}}\n\n## Workflow\n\n1. **Intake** — \\`squad new-story <feature-slug>\\` scaffolds \\`stories/<feature>/<id>/intake.md\\`. Paste the tracker title, description, and acceptance criteria.\n2. **Plan** — Run \\`/squad-plan <intake-path>\\` in your agent (or \\`squad new-plan <intake-path>\\` to get the composed prompt on stdout).\n3. **Implement** — Open a new, scoped agent session and attach **only** the generated \\`NN-story-*.md\\` file. Let a cheap model execute it.\n\nPlan meta-prompts (\\`generate-plan.md\\`, \\`story-skeleton.md\\`) ship inside the squad-kit package — they are not copied here. Upgrade squad-kit to update them.\n`,\n { name: config.project.name, language: config.project.primaryLanguage ?? '', tracker: config.tracker.type },\n );\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\n\nexport const SQUAD_DIR = '.squad';\n\nexport interface SquadPaths {\n root: string;\n squadDir: string;\n configFile: string;\n secretsFile: string;\n /**\n * Legacy: path where 0.1.x copied prompt templates. No longer created on fresh install\n * and no longer read at runtime. Kept on the interface so `squad doctor` and\n * `squad migrate` can locate and clean up stale copies from pre-0.2 users.\n */\n promptsDir: string;\n storiesDir: string;\n plansDir: string;\n indexFile: string;\n /** `.squad/.trash` — created on demand by `squad rm --trash`. */\n trashDir: string;\n}\n\nexport function buildPaths(root: string): SquadPaths {\n const squadDir = path.join(root, SQUAD_DIR);\n return {\n root,\n squadDir,\n configFile: path.join(squadDir, 'config.yaml'),\n secretsFile: path.join(squadDir, 'secrets.yaml'),\n promptsDir: path.join(squadDir, 'prompts'),\n storiesDir: path.join(squadDir, 'stories'),\n plansDir: path.join(squadDir, 'plans'),\n indexFile: path.join(squadDir, 'plans', '00-index.md'),\n trashDir: path.join(squadDir, '.trash'),\n };\n}\n\nexport function findSquadRoot(startDir: string = process.cwd()): string | null {\n let current = path.resolve(startDir);\n const { root } = path.parse(current);\n while (true) {\n if (fs.existsSync(path.join(current, SQUAD_DIR, 'config.yaml'))) {\n return current;\n }\n if (current === root) return null;\n current = path.dirname(current);\n }\n}\n\nexport function requireSquadRoot(startDir: string = process.cwd()): string {\n const root = findSquadRoot(startDir);\n if (!root) {\n throw new Error(\n `No .squad/ directory found (searched upward from ${startDir}). Run \\`squad init\\` first.`,\n );\n }\n return root;\n}\n\nexport function slugify(input: string): string {\n return input\n .toLowerCase()\n .trim()\n .replace(/[^\\p{L}\\p{N}]+/gu, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport const SQUAD_SECRETS_PATTERN = '.squad/secrets.yaml';\nexport const SQUAD_ATTACHMENTS_PATTERN = '.squad/stories/**/attachments/';\nexport const SQUAD_TRASH_PATTERN = '.squad/.trash/';\nexport const SQUAD_LAST_RUN_PATTERN = '.squad/.last-run.json';\nexport const SQUAD_LAST_COPY_PROMPT_PATTERN = '.squad/.last-copy-prompt.md';\n\nconst MANAGED_BLOCK_HEADER = '# Managed by squad-kit — do not edit this block';\nconst MANAGED_BLOCK_FOOTER = '# End squad-kit block';\n\n/**\n * Ensure the repo-root `.gitignore` contains the managed squad-kit block.\n * Idempotent: safe to call on every `squad init`. Does not remove prior user-added\n * patterns; only appends its own managed block if missing, or appends the trash\n * line to an existing block that predates it.\n *\n * Returns true if the file was created or modified, false if no change was needed.\n */\nexport function ensureGitignore(repoRoot: string): boolean {\n const file = path.join(repoRoot, '.gitignore');\n const text = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';\n\n const requiredPatterns = [\n SQUAD_SECRETS_PATTERN,\n SQUAD_ATTACHMENTS_PATTERN,\n SQUAD_TRASH_PATTERN,\n SQUAD_LAST_RUN_PATTERN,\n SQUAD_LAST_COPY_PROMPT_PATTERN,\n ];\n\n const allPresent = requiredPatterns.every((p) => text.includes(p));\n if (allPresent) return false;\n\n if (!text.includes(SQUAD_SECRETS_PATTERN)) {\n const block = ['', MANAGED_BLOCK_HEADER, ...requiredPatterns, MANAGED_BLOCK_FOOTER, ''].join('\\n');\n const next =\n text.length === 0\n ? block.trimStart()\n : text.endsWith('\\n')\n ? text + block\n : text + '\\n' + block;\n fs.writeFileSync(file, next, 'utf8');\n return true;\n }\n\n let next = text;\n for (const pattern of requiredPatterns) {\n if (next.includes(pattern)) continue;\n if (next.includes(MANAGED_BLOCK_FOOTER)) {\n next = next.replace(MANAGED_BLOCK_FOOTER, pattern + '\\n' + MANAGED_BLOCK_FOOTER);\n } else {\n next = next.replace(/\\n?$/, (m) => m + pattern + '\\n');\n }\n }\n if (next !== text) {\n fs.writeFileSync(file, next, 'utf8');\n return true;\n }\n return false;\n}\n","import fs from 'node:fs';\nimport yaml from 'js-yaml';\nimport type { PlannerConfig, PlannerModelOverride, ProviderName } from '../planner/types.js';\n\nexport type TrackerType = 'none' | 'github' | 'linear' | 'jira' | 'azure';\n\nexport interface SquadConfig {\n version: number;\n project: {\n name: string;\n primaryLanguage?: string;\n projectRoots?: string[];\n };\n tracker: {\n type: TrackerType;\n workspace?: string;\n project?: string;\n };\n naming: {\n includeTrackerId: boolean;\n globalSequence: boolean;\n };\n agents: string[];\n planner?: PlannerConfig;\n}\n\nexport const DEFAULT_CONFIG: SquadConfig = {\n version: 1,\n project: {\n name: 'my-project',\n primaryLanguage: 'typescript',\n projectRoots: ['.'],\n },\n tracker: { type: 'none' },\n naming: { includeTrackerId: false, globalSequence: true },\n agents: [],\n planner: undefined,\n};\n\nconst FORBIDDEN_KEYS = ['apikey', 'api_key', 'token', 'secret', 'credential', 'credentials'];\n\nfunction rejectSecretsInYaml(node: unknown, configFile: string, path: string[] = []): void {\n if (node === null || typeof node !== 'object') return;\n for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n if (FORBIDDEN_KEYS.includes(key.toLowerCase())) {\n throw new Error(\n `Refusing to load ${configFile}: key \"${[...path, key].join('.')}\" looks like a secret. ` +\n `Run \\`squad config set planner\\` or \\`squad config set tracker\\` to save it to .squad/secrets.yaml, then remove the key from config.yaml. ` +\n `Provider keys also work via ANTHROPIC_API_KEY / OPENAI_API_KEY / GOOGLE_API_KEY.`,\n );\n }\n if (typeof value === 'object') rejectSecretsInYaml(value, configFile, [...path, key]);\n }\n}\n\nfunction mergePlanner(\n base: PlannerConfig | undefined,\n override: Partial<PlannerConfig> | undefined,\n): PlannerConfig | undefined {\n if (!override) return base;\n const merged: PlannerConfig = {\n enabled: override.enabled ?? base?.enabled ?? false,\n provider: (override.provider ?? base?.provider ?? 'anthropic') as ProviderName,\n mode: override.mode ?? base?.mode ?? 'auto',\n budget: {\n maxFileReads: override.budget?.maxFileReads ?? base?.budget?.maxFileReads ?? 25,\n maxContextBytes: override.budget?.maxContextBytes ?? base?.budget?.maxContextBytes ?? 50_000,\n maxDurationSeconds: override.budget?.maxDurationSeconds ?? base?.budget?.maxDurationSeconds ?? 180,\n maxCostUsd: override.budget?.maxCostUsd ?? base?.budget?.maxCostUsd,\n },\n modelOverride: {\n ...(base?.modelOverride ?? {}),\n ...(override.modelOverride ?? {}),\n },\n cache: {\n enabled: override.cache?.enabled ?? base?.cache?.enabled ?? true,\n },\n };\n // Normalise: drop undefined/null entries; remove modelOverride entirely if nothing left (clean YAML).\n if (merged.modelOverride) {\n const pruned = Object.fromEntries(\n Object.entries(merged.modelOverride).filter(([, v]) => v !== undefined && v !== null),\n ) as PlannerModelOverride;\n if (Object.keys(pruned).length === 0) {\n delete merged.modelOverride;\n } else {\n merged.modelOverride = pruned;\n }\n }\n return merged;\n}\n\nfunction validateModelOverride(mo: PlannerModelOverride | undefined, configFile: string): void {\n if (!mo) return;\n for (const key of ['anthropic', 'openai', 'google'] as const) {\n const v = mo[key];\n if (v === undefined) continue;\n if (typeof v !== 'string' || v.trim().length === 0) {\n throw new Error(\n `Invalid planner.modelOverride.${key} in ${configFile}: must be a non-empty string when set. ` +\n `Run \\`squad config set planner\\` to fix it.`,\n );\n }\n }\n}\n\nexport function loadConfig(configFile: string): SquadConfig {\n const raw = fs.readFileSync(configFile, 'utf8');\n let parsed: Partial<SquadConfig> | undefined;\n try {\n parsed = yaml.load(raw) as Partial<SquadConfig> | undefined;\n } catch (err) {\n throw new Error(\n `Invalid YAML in ${configFile}: ${(err as Error).message}. ` +\n `Run \\`squad doctor\\` to review, or fix the file, or \\`squad init --force\\` to replace it.`,\n );\n }\n if (!parsed || typeof parsed !== 'object') {\n throw new Error(\n `Invalid config at ${configFile}: expected a YAML object. Run \\`squad doctor\\` to review, or fix the file and try again.`,\n );\n }\n rejectSecretsInYaml(parsed, configFile);\n const merged = mergeConfig(DEFAULT_CONFIG, parsed);\n validateModelOverride(merged.planner?.modelOverride, configFile);\n if (merged.planner?.cache !== undefined) {\n const c = merged.planner.cache;\n if (typeof c !== 'object' || c === null || Array.isArray(c)) {\n throw new Error(\n `planner.cache in ${configFile} must be an object with \\`enabled: true\\` or \\`false\\`. ` +\n `Run \\`squad config set planner\\` to set prompt caching.`,\n );\n }\n const ce = c.enabled;\n if (typeof ce !== 'boolean') {\n throw new Error(\n `planner.cache.enabled in ${configFile} must be a boolean (not a quoted string). ` +\n `Run \\`squad config set planner\\` to set prompt caching, or use \\`true\\` or \\`false\\` unquoted in YAML.`,\n );\n }\n }\n if (merged.planner?.enabled) {\n if (!['anthropic', 'openai', 'google'].includes(merged.planner.provider)) {\n throw new Error(\n `Unsupported planner.provider \"${merged.planner.provider}\". ` +\n `Run \\`squad config set planner\\` and pick anthropic | openai | google.`,\n );\n }\n if (merged.planner.budget.maxFileReads <= 0) {\n throw new Error(\n 'planner.budget.maxFileReads must be > 0. Run `squad config set planner` to fix planner.budget values.',\n );\n }\n if (merged.planner.budget.maxContextBytes <= 0) {\n throw new Error(\n 'planner.budget.maxContextBytes must be > 0. Run `squad config set planner` to fix planner.budget values.',\n );\n }\n if (merged.planner.budget.maxDurationSeconds <= 0) {\n throw new Error(\n 'planner.budget.maxDurationSeconds must be > 0. Run `squad config set planner` to fix planner.budget values.',\n );\n }\n }\n return merged;\n}\n\nexport function serializeConfig(config: SquadConfig): string {\n return yaml.dump(config, { lineWidth: 100, noRefs: true, sortKeys: false });\n}\n\nexport function saveConfig(configFile: string, config: SquadConfig): void {\n fs.writeFileSync(configFile, serializeConfig(config), 'utf8');\n}\n\nfunction mergeConfig(base: SquadConfig, override: Partial<SquadConfig>): SquadConfig {\n return {\n version: override.version ?? base.version,\n project: { ...base.project, ...(override.project ?? {}) },\n tracker: { ...base.tracker, ...(override.tracker ?? {}) },\n naming: { ...base.naming, ...(override.naming ?? {}) },\n agents: override.agents ?? base.agents,\n planner: mergePlanner(base.planner, override.planner as Partial<PlannerConfig> | undefined),\n };\n}\n","import fs from 'node:fs';\nimport { findSquadRoot, buildPaths } from './paths.js';\nimport { loadSecrets, type SquadSecrets } from './secrets.js';\nimport type { PlannerModelOverride, PlannerPhase, ProviderName } from '../planner/types.js';\n\nexport interface PlannerPhaseModels {\n plan: string;\n execute: string;\n}\n\n/**\n * Pinned model IDs for the planner. Anthropic Opus uses the **Claude API ID** from Anthropic’s\n * model overview (versioned id; Haiku uses an explicit dated snapshot). Aliases such as\n * `claude-haiku-4-5` without a date are intentionally NOT used for execute because they can\n * roll forward silently. Update when a provider deprecates a pin; run `pnpm verify:models` after edits.\n *\n * Last verified against Anthropic docs: 2026-04-23 — https://platform.claude.com/docs/en/about-claude/models/overview\n */\nexport const PLANNER_MODEL_MAP: Record<ProviderName, PlannerPhaseModels> = {\n anthropic: {\n plan: 'claude-opus-4-7',\n execute: 'claude-haiku-4-5-20251001',\n },\n openai: {\n // Unverified for 0.2.0. 0.2.1 will pin to dated snapshots once a maintainer can probe.\n plan: 'gpt-5.3-thinking',\n execute: 'gpt-5.3-mini',\n },\n google: {\n // Unverified for 0.2.0. 0.2.1 will pin to dated snapshots once a maintainer can probe.\n plan: 'gemini-3-pro-latest',\n execute: 'gemini-3-flash-latest',\n },\n};\n\nexport function modelFor(\n provider: ProviderName,\n phase: PlannerPhase,\n override?: PlannerModelOverride,\n): string {\n if (phase === 'plan' && override?.[provider]) return override[provider]!;\n return PLANNER_MODEL_MAP[provider][phase];\n}\n\nexport function providerEnvVar(provider: ProviderName): string {\n switch (provider) {\n case 'anthropic':\n return 'ANTHROPIC_API_KEY';\n case 'openai':\n return 'OPENAI_API_KEY';\n case 'google':\n return 'GOOGLE_API_KEY';\n }\n}\n\nexport interface CredentialSource {\n value: string;\n source: 'env' | 'secrets' | 'fallback-env';\n detail: string; // human-friendly hint, e.g. \"ANTHROPIC_API_KEY\" or \".squad/secrets.yaml\"\n}\n\nexport function resolveProviderKey(provider: ProviderName): CredentialSource | undefined {\n const envVar = providerEnvVar(provider);\n const envValue = process.env[envVar];\n if (envValue) return { value: envValue, source: 'env', detail: envVar };\n\n const fallback = process.env.SQUAD_PLANNER_API_KEY;\n if (fallback) return { value: fallback, source: 'fallback-env', detail: 'SQUAD_PLANNER_API_KEY' };\n\n const root = findSquadRoot();\n if (root) {\n const paths = buildPaths(root);\n if (fs.existsSync(paths.secretsFile)) {\n const secrets = loadSecrets(paths.secretsFile);\n const fromFile = secrets.planner?.[provider];\n if (fromFile) return { value: fromFile, source: 'secrets', detail: '.squad/secrets.yaml' };\n }\n }\n return undefined;\n}\n\n/** Backwards-compatible wrapper; returns only the value. Existing callers continue to work. */\nexport function readProviderKey(provider: ProviderName): string | undefined {\n return resolveProviderKey(provider)?.value;\n}\n\nexport interface TrackerCredentialLookup {\n envVars: string[]; // primary env vars, in order\n fallbackEnv: 'SQUAD_TRACKER_API_KEY';\n fromSecrets: (s: SquadSecrets) => string | undefined; // extracts the relevant field\n}\n\nexport function resolveTrackerCredential(\n lookup: TrackerCredentialLookup,\n): CredentialSource | undefined {\n for (const ev of lookup.envVars) {\n const v = process.env[ev];\n if (v) return { value: v, source: 'env', detail: ev };\n }\n const fb = process.env[lookup.fallbackEnv];\n if (fb) return { value: fb, source: 'fallback-env', detail: lookup.fallbackEnv };\n\n const root = findSquadRoot();\n if (!root) return undefined;\n const paths = buildPaths(root);\n if (!fs.existsSync(paths.secretsFile)) return undefined;\n const secrets = loadSecrets(paths.secretsFile);\n const fromFile = lookup.fromSecrets(secrets);\n if (fromFile) return { value: fromFile, source: 'secrets', detail: '.squad/secrets.yaml' };\n return undefined;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport yaml from 'js-yaml';\n\nexport interface TrackerJiraSecrets {\n host?: string; // e.g. \"mycompany.atlassian.net\" (without scheme)\n email?: string;\n token?: string;\n}\n\nexport interface TrackerAzureSecrets {\n organization?: string;\n project?: string;\n pat?: string;\n}\n\nexport interface SquadSecrets {\n planner?: {\n anthropic?: string;\n openai?: string;\n google?: string;\n };\n tracker?: {\n jira?: TrackerJiraSecrets;\n azure?: TrackerAzureSecrets;\n };\n}\n\nconst EMPTY: SquadSecrets = {};\n\nexport function loadSecrets(secretsFile: string): SquadSecrets {\n if (!fs.existsSync(secretsFile)) return EMPTY;\n let raw: string;\n try {\n raw = fs.readFileSync(secretsFile, 'utf8');\n } catch (err) {\n throw new Error(\n `Failed to read ${secretsFile}: ${(err as Error).message}. ` +\n `Run \\`squad doctor\\` to diagnose, or delete the file and run \\`squad config set planner\\` or \\`squad config set tracker\\` to re-enter credentials.`,\n );\n }\n let parsed: unknown;\n try {\n parsed = yaml.load(raw);\n } catch (err) {\n throw new Error(\n `Invalid YAML in ${secretsFile}: ${(err as Error).message}. ` +\n `Run \\`squad doctor\\` to review paths and permissions, or fix the file, or delete it and run \\`squad config set planner\\` / \\`squad config set tracker\\` to re-enter secrets.`,\n );\n }\n if (parsed === null || parsed === undefined) return EMPTY;\n if (typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(\n `Invalid ${secretsFile}: expected a YAML object at the top level. ` +\n `Run \\`squad config set planner\\` or \\`squad config set tracker\\` after fixing or replacing the file.`,\n );\n }\n return parsed as SquadSecrets;\n}\n\nexport function saveSecrets(secretsFile: string, secrets: SquadSecrets): void {\n fs.mkdirSync(path.dirname(secretsFile), { recursive: true });\n const body = yaml.dump(secrets, { lineWidth: 100, noRefs: true, sortKeys: false });\n fs.writeFileSync(secretsFile, body, 'utf8');\n tightenPermissions(secretsFile);\n}\n\nfunction tightenPermissions(file: string): void {\n if (process.platform === 'win32') return;\n try {\n fs.chmodSync(file, 0o600);\n } catch {\n // best-effort; some filesystems (e.g. NTFS mounts on Linux) may refuse chmod\n }\n}\n\n/**\n * Structural merge. New values win over existing ones; undefined/empty-string values are ignored\n * so callers can partial-update a single provider without clobbering siblings.\n */\nexport function mergeSecrets(base: SquadSecrets, patch: SquadSecrets): SquadSecrets {\n return {\n planner: { ...(base.planner ?? {}), ...filterEmpty(patch.planner ?? {}) },\n tracker: {\n jira: {\n ...(base.tracker?.jira ?? {}),\n ...filterEmpty((patch.tracker?.jira ?? {}) as Record<string, unknown>),\n },\n azure: {\n ...(base.tracker?.azure ?? {}),\n ...filterEmpty((patch.tracker?.azure ?? {}) as Record<string, unknown>),\n },\n },\n };\n}\n\nfunction filterEmpty<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined && v !== '') out[k] = v;\n }\n return out as Partial<T>;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function readFile(file: string): string {\n return fs.readFileSync(file, 'utf8');\n}\n\nexport function writeFileSafe(file: string, content: string, overwrite = false): boolean {\n if (!overwrite && fs.existsSync(file)) return false;\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, content, 'utf8');\n return true;\n}\n\nexport function copyTree(srcDir: string, destDir: string, overwrite = false): void {\n fs.mkdirSync(destDir, { recursive: true });\n for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {\n const src = path.join(srcDir, entry.name);\n const dest = path.join(destDir, entry.name);\n if (entry.isDirectory()) {\n copyTree(src, dest, overwrite);\n } else if (entry.isFile()) {\n if (!overwrite && fs.existsSync(dest)) continue;\n fs.copyFileSync(src, dest);\n }\n }\n}\n\nexport function packageRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n // src/utils → package root when running from source (tsx/vitest)\n // dist → package root when running from bundle\n let dir = here;\n for (let i = 0; i < 6; i++) {\n if (fs.existsSync(path.join(dir, 'package.json')) && fs.existsSync(path.join(dir, 'templates'))) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n throw new Error(`Could not locate squad-kit package root from ${here}`);\n}\n\nexport function templatesDir(): string {\n return path.join(packageRoot(), 'templates');\n}\n\n/**\n * Read a prompt file from the installed squad-kit package's `templates/prompts/` directory.\n * This is the ONLY supported way to read prompts. Users do not have the ability to override\n * them; `.squad/prompts/` is legacy and ignored at runtime.\n *\n * @throws if the file is missing (indicates a broken package install).\n */\nexport function readBundledPrompt(name: 'generate-plan.md' | 'intake.md' | 'story-skeleton.md'): string {\n const file = path.join(templatesDir(), 'prompts', name);\n if (!fs.existsSync(file)) {\n throw new Error(\n `Bundled prompt \"${name}\" not found at ${file}. ` +\n `This indicates a broken squad-kit install — reinstall with: pnpm add -g squad-kit`,\n );\n }\n return fs.readFileSync(file, 'utf8');\n}\n","export type TemplateVars = Record<string, string | number | undefined | null>;\n\nconst TOKEN = /\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g;\n\nexport function render(template: string, vars: TemplateVars): string {\n return template.replace(TOKEN, (_, key: string) => {\n const value = vars[key];\n return value === undefined || value === null ? '' : String(value);\n });\n}\n","import fs from 'node:fs';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, type SquadConfig } from '../../core/config.js';\nimport { loadSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { maskPlannerCredentials, maskTrackerForShow } from './masks.js';\nimport type { PlannerConfig } from '../../planner/types.js';\n\nexport interface ConfigShowOptions {\n json?: boolean;\n}\n\nexport type ConfigShowPayload = {\n project: SquadConfig['project'];\n tracker: SquadConfig['tracker'] & { credentials: ReturnType<typeof maskTrackerForShow> };\n naming: SquadConfig['naming'];\n agents: SquadConfig['agents'];\n planner:\n | { enabled: false }\n | (PlannerConfig & { credentials: ReturnType<typeof maskPlannerCredentials> });\n};\n\nfunction buildPayload(config: SquadConfig, secrets: SquadSecrets): ConfigShowPayload {\n const basePlanner = !config.planner || config.planner.enabled !== true;\n const planner: ConfigShowPayload['planner'] = basePlanner\n ? { enabled: false }\n : { ...config.planner!, enabled: true, credentials: maskPlannerCredentials(secrets.planner) };\n return {\n project: config.project,\n tracker: { ...config.tracker, credentials: maskTrackerForShow(secrets) },\n naming: config.naming,\n agents: config.agents,\n planner,\n };\n}\n\nfunction renderShow(root: string, payload: ConfigShowPayload): void {\n ui.divider('squad config show');\n ui.kv('workspace', root, 10);\n ui.blank();\n\n ui.step('Project');\n ui.kv('name', payload.project.name, 14);\n if (payload.project.primaryLanguage) {\n ui.kv('language', payload.project.primaryLanguage, 14);\n }\n if (payload.project.projectRoots?.length) {\n ui.kv('roots', payload.project.projectRoots.join(', '), 14);\n }\n ui.blank();\n\n ui.divider('Tracker');\n ui.kv('type', payload.tracker.type, 10);\n if (payload.tracker.workspace) {\n ui.kv('workspace', payload.tracker.workspace, 10);\n }\n if (payload.tracker.project) {\n ui.kv('project', payload.tracker.project, 10);\n }\n const tc = payload.tracker.credentials;\n if (tc.jira) {\n ui.kv('jira host', tc.jira.host ?? '(not set)', 10);\n ui.kv('jira email', tc.jira.email ?? '(not set)', 10);\n ui.kv('jira token', tc.jira.token, 10);\n }\n if (tc.azure) {\n ui.kv('azure org', tc.azure.organization ?? '(not set)', 10);\n ui.kv('azure project', tc.azure.project ?? '(not set)', 10);\n ui.kv('azure pat', tc.azure.pat, 10);\n }\n if (payload.tracker.type === 'jira' && !tc.jira) {\n ui.kv('jira', '(not configured in secrets.yaml)', 10);\n }\n if (payload.tracker.type === 'azure' && !tc.azure) {\n ui.kv('azure', '(not configured in secrets.yaml)', 10);\n }\n ui.blank();\n\n ui.divider('Naming');\n ui.kv('includeTrackerId', String(payload.naming.includeTrackerId), 18);\n ui.kv('globalSequence', String(payload.naming.globalSequence), 18);\n ui.blank();\n\n ui.divider('Agents');\n ui.kv('installed', payload.agents.length ? payload.agents.join(', ') : '(none)', 10);\n ui.blank();\n\n ui.divider('Planner');\n if (payload.planner.enabled === false) {\n ui.kv('enabled', 'false', 10);\n } else {\n const p = payload.planner;\n ui.kv('enabled', 'true', 10);\n ui.kv('provider', p.provider, 10);\n ui.kv('mode', p.mode, 10);\n const creds = p.credentials;\n ui.kv('key anthropic', creds.anthropic ?? 'not set', 14);\n ui.kv('key openai', creds.openai ?? 'not set', 14);\n ui.kv('key google', creds.google ?? 'not set', 14);\n }\n ui.blank();\n}\n\nexport function buildConfigShowPayload(config: SquadConfig, secrets: SquadSecrets): ConfigShowPayload {\n return buildPayload(config, secrets);\n}\n\nexport async function runConfigShow(opts: ConfigShowOptions): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n const secrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : ({} as SquadSecrets);\n\n const payload = buildPayload(config, secrets);\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n renderShow(root, payload);\n}\n","import type { SquadSecrets } from '../../core/secrets.js';\n\nexport function maskStringKey(value: string | undefined): string | undefined {\n if (value === undefined || value.length === 0) return undefined;\n if (value.length <= 4) return '***';\n const lead = value.slice(0, Math.min(5, value.length - 4));\n const tail = value.slice(-4);\n return `${lead}…${tail}`;\n}\n\nexport function maskPlannerCredentials(planner: SquadSecrets['planner']): {\n anthropic?: string;\n openai?: string;\n google?: string;\n} {\n return {\n anthropic: planner?.anthropic ? maskStringKey(planner.anthropic) : undefined,\n openai: planner?.openai ? maskStringKey(planner.openai) : undefined,\n google: planner?.google ? maskStringKey(planner.google) : undefined,\n };\n}\n\nexport function maskTrackerForShow(secrets: SquadSecrets): {\n jira?: { host?: string; email?: string; token: string };\n azure?: { organization?: string; project?: string; pat: string };\n} {\n const j = secrets.tracker?.jira;\n const a = secrets.tracker?.azure;\n return {\n jira: j\n ? {\n host: j.host,\n email: j.email,\n token: j.token && j.token.length > 0 ? '***' : 'not set',\n }\n : undefined,\n azure: a\n ? {\n organization: a.organization,\n project: a.project,\n pat: a.pat && a.pat.length > 0 ? '***' : 'not set',\n }\n : undefined,\n };\n}\n","import fs from 'node:fs';\nimport { confirm, password, select } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, saveConfig, type SquadConfig } from '../../core/config.js';\nimport { loadSecrets, saveSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { modelFor, providerEnvVar, resolveProviderKey } from '../../core/planner-models.js';\nimport { fetchProviderModelIds } from '../../core/probes.js';\nimport type { PlannerConfig, ProviderName } from '../../planner/types.js';\nimport { isInteractive } from '../../ui/tty.js';\nimport { mergePlannerKeyIntoSecrets, newPlannerBlock } from './shared.js';\nimport { runConfigUnsetPlanner } from './unset-planner.js';\n\nfunction parseProvider(arg: string): ProviderName {\n if (!['anthropic', 'openai', 'google'].includes(arg)) {\n throw new Error(\n `Invalid --provider \"${arg}\". Use anthropic | openai | google, or run \\`squad config set planner\\` to pick a provider interactively.`,\n );\n }\n return arg as ProviderName;\n}\n\nfunction credentialError(provider: ProviderName): Error {\n const ev = providerEnvVar(provider);\n return new Error(\n `Planner credential for \\`${provider}\\` not found. Run \\`squad config set planner\\` (no --yes) to enter a key interactively, or export ${ev}.`,\n );\n}\n\nexport interface ConfigSetPlannerOptions {\n provider?: string;\n yes?: boolean;\n}\n\nexport async function runConfigSetPlanner(opts: ConfigSetPlannerOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n const baseSecrets: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n\n const useYes = Boolean(opts.yes);\n const interactive = !useYes && isInteractive();\n\n if (interactive && config.planner?.enabled === true) {\n const action = await select({\n message: 'The direct planner is enabled. What do you want to do?',\n choices: [\n { name: 'Change provider, key, or model', value: 'change' },\n { name: 'Disable the direct planner', value: 'disable' },\n ],\n default: 'change',\n });\n if (action === 'disable') {\n return runConfigUnsetPlanner({ yes: true, removeCredentials: false });\n }\n }\n\n let provider: ProviderName;\n if (opts.provider) {\n provider = parseProvider(opts.provider);\n } else if (useYes) {\n throw new Error(\n 'Pass --provider (anthropic|openai|google) when using --yes in non-interactive mode, or run `squad config set planner` without --yes in a TTY.',\n );\n } else {\n const current = (config.planner?.enabled === true && config.planner.provider) || 'anthropic';\n provider = (await select({\n message: 'Planner provider',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' as ProviderName },\n { name: 'OpenAI (GPT)', value: 'openai' as ProviderName },\n { name: 'Google (Gemini)', value: 'google' as ProviderName },\n ],\n default: current,\n })) as ProviderName;\n }\n\n if (interactive) {\n if (!config.planner || config.planner.enabled !== true) {\n const enable = await confirm({ message: 'Enable the direct planner?', default: true });\n if (!enable) {\n return;\n }\n }\n }\n\n const prev = config.planner;\n let nextPlanner: PlannerConfig;\n if (!prev || prev.enabled !== true) {\n nextPlanner = newPlannerBlock(provider);\n } else {\n nextPlanner = { ...prev, provider, enabled: true };\n }\n\n if (useYes) {\n if (!resolveProviderKey(provider)) {\n throw credentialError(provider);\n }\n } else {\n const existing = resolveProviderKey(provider);\n if (existing) {\n const shouldUpdate = await confirm({\n message: 'A planner credential is already available. Enter a new key and save it to .squad/secrets.yaml?',\n default: false,\n });\n if (shouldUpdate) {\n const envVar = providerEnvVar(provider);\n const key = await password({\n message: `${envVar} value (input hidden):`,\n validate: (v) => (v.length >= 20 ? true : 'key looks too short'),\n });\n const merged = mergePlannerKeyIntoSecrets(baseSecrets, provider, key);\n saveSecrets(paths.secretsFile, merged);\n ui.success('Planner key saved to .squad/secrets.yaml');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n } else {\n ui.info('Keeping the existing planner credential; no change to .squad/secrets.yaml for the key.');\n }\n } else {\n const envVar = providerEnvVar(provider);\n const key = await password({\n message: `${envVar} value (input hidden) — required:`,\n validate: (v) => (v.length >= 20 ? true : 'key looks too short'),\n });\n const merged = mergePlannerKeyIntoSecrets(baseSecrets, provider, key);\n saveSecrets(paths.secretsFile, merged);\n ui.success('Planner key saved to .squad/secrets.yaml');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n }\n\n const cacheEnabled = await confirm({\n message: 'Enable prompt caching? (Recommended — reduces billed tokens by ~70% on most providers.)',\n default: nextPlanner.cache?.enabled ?? true,\n });\n nextPlanner = { ...nextPlanner, cache: { enabled: cacheEnabled } };\n }\n\n const next: SquadConfig = { ...config, planner: nextPlanner };\n saveConfig(paths.configFile, next);\n\n const cred = resolveProviderKey(provider);\n if (!cred) {\n ui.warning(\n 'Planner key could not be resolved. Run `squad config set planner` to save a key, or set the provider env var, then re-run `squad doctor` to verify.',\n );\n } else {\n const sourceText =\n cred.source === 'env' ? cred.detail : cred.source === 'secrets' ? '.squad/secrets.yaml' : cred.detail;\n const planModel = modelFor(provider, 'plan', nextPlanner.modelOverride);\n const execModel = modelFor(provider, 'execute', nextPlanner.modelOverride);\n ui.blank();\n ui.success('Planner configuration updated.');\n ui.kv('provider', provider, 10);\n ui.kv('model (plan)', planModel, 10);\n ui.kv('model (execute)', execModel, 10);\n ui.kv('credential', `${cred.source} (${sourceText})`, 10);\n }\n\n if (process.env.CI === 'true' || !cred) {\n printPlannerNextSteps(Boolean(cred));\n return;\n }\n const listed = await fetchProviderModelIds(provider, cred.value);\n if (!listed.ok) {\n const st = listed.status;\n if (st === 401 || st === 403) {\n ui.warning(`Could not list models (HTTP ${st}); check your key.`);\n } else {\n ui.warning(`Model list probe failed (HTTP ${st}): ${listed.body.slice(0, 120)}`);\n }\n } else {\n ui.info('Credential check: models API responded OK for this key.');\n }\n\n printPlannerNextSteps(true);\n}\n\nfunction printPlannerNextSteps(credentialReady: boolean): void {\n ui.blank();\n ui.step('Next:');\n if (!credentialReady) {\n ui.info('1) Save a planner key: re-run `squad config set planner` and paste the key when prompted.');\n ui.info('2) Verify with `squad doctor` — all planner checks should turn green.');\n ui.info('3) Then run `squad new-story <slug>` and `squad new-plan --api` to generate your first plan.');\n return;\n }\n ui.info('1) Verify with `squad doctor` — every planner check should be green.');\n ui.info('2) Create a story: squad new-story <feature-slug> (or --no-tracker for a manual story).');\n ui.info('3) Fill the generated intake.md, then run `squad new-plan --api` to generate the plan.');\n ui.info(\n '4) To change provider, key, or disable caching later: re-run `squad config set planner`. Model overrides are edited directly in .squad/config.yaml (planner.modelOverride).',\n );\n}\n","import type { SquadSecrets } from '../core/secrets.js';\n\n/**\n * Build a SquadSecrets from env vars. Values present in `base` are preserved\n * unless the corresponding env var is set, in which case env wins (documented\n * precedence: env > secrets.yaml).\n */\nexport function overlayTrackerEnv(base: SquadSecrets): SquadSecrets {\n const jiraHost = process.env.JIRA_HOST;\n const jiraEmail = process.env.JIRA_EMAIL;\n const jiraToken = process.env.JIRA_API_TOKEN ?? process.env.SQUAD_TRACKER_API_KEY;\n\n const azOrg = process.env.AZURE_DEVOPS_ORG;\n const azProj = process.env.AZURE_DEVOPS_PROJECT;\n const azPat = process.env.AZURE_DEVOPS_PAT ?? process.env.SQUAD_TRACKER_API_KEY;\n\n return {\n ...base,\n tracker: {\n jira: {\n host: jiraHost ?? base.tracker?.jira?.host,\n email: jiraEmail ?? base.tracker?.jira?.email,\n token: jiraToken ?? base.tracker?.jira?.token,\n },\n azure: {\n organization: azOrg ?? base.tracker?.azure?.organization,\n project: azProj ?? base.tracker?.azure?.project,\n pat: azPat ?? base.tracker?.azure?.pat,\n },\n },\n };\n}\n","import type { SquadConfig } from './config.js';\nimport type { SquadSecrets } from './secrets.js';\nimport { overlayTrackerEnv } from '../tracker/env-overlay.js';\nimport type { ProviderName } from '../planner/types.js';\n\nexport async function fetchProviderModelIds(\n provider: ProviderName,\n apiKey: string,\n): Promise<\n { ok: true; ids: Set<string> } | { ok: false; kind: 'http'; status: number; body: string }\n> {\n switch (provider) {\n case 'anthropic': {\n const res = await fetch('https://api.anthropic.com/v1/models?limit=200', {\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n });\n if (!res.ok) {\n return { ok: false, kind: 'http', status: res.status, body: await res.text() };\n }\n const body = (await res.json()) as { data: { id: string }[] };\n return { ok: true, ids: new Set((body.data ?? []).map((m) => m.id)) };\n }\n case 'openai': {\n const res = await fetch('https://api.openai.com/v1/models', {\n headers: { authorization: `Bearer ${apiKey}` },\n });\n if (!res.ok) {\n return { ok: false, kind: 'http', status: res.status, body: await res.text() };\n }\n const body = (await res.json()) as { data: { id: string }[] };\n return { ok: true, ids: new Set((body.data ?? []).map((m) => m.id)) };\n }\n case 'google': {\n const res = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?pageSize=200&key=${encodeURIComponent(apiKey)}`,\n );\n if (!res.ok) {\n return { ok: false, kind: 'http', status: res.status, body: await res.text() };\n }\n const body = (await res.json()) as { models: { name: string }[] };\n return {\n ok: true,\n ids: new Set((body.models ?? []).map((m) => m.name.replace(/^models\\//, ''))),\n };\n }\n }\n}\n\nfunction jiraMyselfUrl(host: string): string {\n const normHost = host.replace(/^https?:\\/\\//i, '').replace(/\\/+$/, '');\n return `https://${normHost}/rest/api/3/myself`;\n}\n\nexport async function probeJiraConnectivity(\n secrets: SquadSecrets,\n config: SquadConfig,\n): Promise<{ ok: boolean; status?: number; detail?: string }> {\n const jira = overlayTrackerEnv(secrets).tracker?.jira ?? {};\n const host = jira.host ?? config.tracker.workspace ?? '';\n const email = jira.email ?? '';\n const token = jira.token ?? '';\n const auth = Buffer.from(`${email}:${token}`).toString('base64');\n const url = jiraMyselfUrl(host);\n try {\n const res = await fetch(url, {\n headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' },\n });\n if (res.ok) return { ok: true };\n return { ok: false, status: res.status, detail: (await res.text()).slice(0, 200) };\n } catch (err) {\n return { ok: false, detail: (err as Error).message };\n }\n}\n\nexport async function probeAzureConnectivity(\n secrets: SquadSecrets,\n config: SquadConfig,\n): Promise<{ ok: boolean; status?: number; detail?: string }> {\n const az = overlayTrackerEnv(secrets).tracker?.azure ?? {};\n const org = az.organization ?? config.tracker.workspace ?? '';\n const pat = az.pat ?? '';\n const auth = Buffer.from(`:${pat}`).toString('base64');\n const url = `https://dev.azure.com/${encodeURIComponent(org)}/_apis/projects?api-version=7.1`;\n try {\n const res = await fetch(url, { headers: { Authorization: `Basic ${auth}` } });\n if (res.ok) return { ok: true };\n return { ok: false, status: res.status, detail: (await res.text()).slice(0, 200) };\n } catch (err) {\n return { ok: false, detail: (err as Error).message };\n }\n}\n","import { input, password } from '@inquirer/prompts';\nimport { mergeSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport type { PlannerConfig } from '../../planner/types.js';\nimport type { ProviderName } from '../../planner/types.js';\n\nconst notEmpty = (v: string) => v.trim().length > 0 || 'required';\n\nexport interface ConfigSetCommonOpts {\n yes?: boolean;\n}\n\nexport async function promptJiraCredentials(defaults: {\n host?: string;\n} = {}): Promise<{ host: string; email: string; token: string }> {\n const host = await input({\n message: 'Jira workspace host (e.g. mycompany.atlassian.net):',\n default: defaults.host ?? '',\n validate: (v) => v.trim().length > 0 || 'host is required',\n });\n const email = await input({\n message: 'Jira account email:',\n validate: (v) => (/@/.test(v) ? true : 'must look like an email'),\n });\n const token = await password({\n message: 'Jira API token (input hidden; create one at id.atlassian.com/manage-profile/security/api-tokens):',\n validate: (v) => (v.length >= 10 ? true : 'token seems too short'),\n });\n return { host: host.trim(), email: email.trim(), token };\n}\n\nexport async function promptAzureCredentials(defaults: {\n organization?: string;\n project?: string;\n} = {}): Promise<{ organization: string; project: string; pat: string }> {\n const organization = await input({\n message: 'Azure DevOps organization:',\n default: defaults.organization ?? '',\n validate: notEmpty,\n });\n const project = await input({\n message: 'Azure DevOps project:',\n default: defaults.project ?? '',\n validate: notEmpty,\n });\n const pat = await password({\n message: 'Personal Access Token (needs \"Work Items (Read)\" scope; input hidden):',\n validate: (v) => (v.length >= 20 ? true : 'PAT seems too short'),\n });\n return { organization: organization.trim(), project: project.trim(), pat };\n}\n\nexport function newPlannerBlock(provider: ProviderName): PlannerConfig {\n return {\n enabled: true,\n provider,\n mode: 'auto',\n budget: {\n maxFileReads: 25,\n maxContextBytes: 50_000,\n maxDurationSeconds: 180,\n },\n cache: { enabled: true },\n };\n}\n\nexport function mergePlannerKeyIntoSecrets(base: SquadSecrets, provider: ProviderName, key: string): SquadSecrets {\n if (provider === 'anthropic') {\n return mergeSecrets(base, { planner: { anthropic: key } });\n }\n if (provider === 'openai') {\n return mergeSecrets(base, { planner: { openai: key } });\n }\n return mergeSecrets(base, { planner: { google: key } });\n}\n","import fs from 'node:fs';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, saveConfig, type SquadConfig } from '../../core/config.js';\nimport { loadSecrets, saveSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { isInteractive } from '../../ui/tty.js';\n\nexport interface ConfigUnsetPlannerOptions {\n removeCredentials?: boolean;\n yes?: boolean;\n}\n\nexport async function runConfigUnsetPlanner(opts: ConfigUnsetPlannerOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n const useYes = Boolean(opts.yes);\n if (!useYes) {\n if (!isInteractive()) {\n ui.warning('Pass -y in non-interactive mode to confirm disabling the planner.');\n return;\n }\n const ok = await confirm({ message: 'Disable the direct planner? (keeps any keys in .squad/secrets.yaml.)', default: false });\n if (!ok) {\n return;\n }\n }\n\n const next: SquadConfig = { ...config };\n delete next.planner;\n saveConfig(paths.configFile, next);\n\n if (opts.removeCredentials) {\n const s: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n if (s.planner) {\n delete s.planner;\n saveSecrets(paths.secretsFile, s);\n }\n ui.success('Planner disabled; planner credentials were removed from .squad/secrets.yaml.');\n } else {\n ui.success('Planner disabled; existing planner keys in .squad/secrets.yaml (if any) were preserved.');\n }\n ui.info('Re-enable any time with `squad config set planner`.');\n}\n","import fs from 'node:fs';\nimport { select } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, saveConfig, type SquadConfig, type TrackerType } from '../../core/config.js';\nimport { loadSecrets, saveSecrets, mergeSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { clientFor, overlayTrackerEnv } from '../../tracker/index.js';\nimport { probeJiraConnectivity, probeAzureConnectivity } from '../../core/probes.js';\nimport { isInteractive } from '../../ui/tty.js';\nimport { promptJiraCredentials, promptAzureCredentials } from './shared.js';\n\nconst TYPES: TrackerType[] = ['none', 'github', 'linear', 'jira', 'azure'];\n\nfunction parseType(t: string | undefined): TrackerType {\n if (!t) {\n throw new Error(\n 'Pass --type (none|jira|azure|github|linear) with --yes, or run `squad config set tracker` without --yes in a TTY to pick a type.',\n );\n }\n if (!TYPES.includes(t as TrackerType)) {\n throw new Error(\n `Invalid --type \"${t}\". Use none | jira | azure | github | linear, or run \\`squad config set tracker\\` interactively.`,\n );\n }\n return t as TrackerType;\n}\n\nfunction jiraError(): Error {\n return new Error(\n `Jira configuration is incomplete. Set JIRA_HOST, JIRA_EMAIL, JIRA_API_TOKEN (or run \\`squad config set tracker\\` without --yes to enter credentials interactively).`,\n );\n}\n\nfunction azureError(): Error {\n return new Error(\n `Azure DevOps configuration is incomplete. Set AZURE_DEVOPS_ORG, AZURE_DEVOPS_PROJECT, AZURE_DEVOPS_PAT (or run \\`squad config set tracker\\` without --yes to enter credentials interactively).`,\n );\n}\n\nexport interface ConfigSetTrackerOptions {\n type?: string;\n yes?: boolean;\n}\n\nexport async function runConfigSetTracker(opts: ConfigSetTrackerOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n const baseSecrets: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n\n const useYes = Boolean(opts.yes);\n const interactive = !useYes && isInteractive();\n\n let type: TrackerType;\n if (opts.type) {\n type = parseType(opts.type);\n } else if (useYes) {\n type = parseType(undefined);\n } else {\n type = (await select({\n message: 'Issue tracker',\n choices: [\n { name: 'None', value: 'none' as TrackerType },\n { name: 'GitHub Issues', value: 'github' as TrackerType },\n { name: 'Linear', value: 'linear' as TrackerType },\n { name: 'Jira', value: 'jira' as TrackerType },\n { name: 'Azure DevOps', value: 'azure' as TrackerType },\n ],\n default: config.tracker.type,\n })) as TrackerType;\n }\n\n let nextTracker!: SquadConfig['tracker'];\n\n if (type === 'none') {\n nextTracker = { type: 'none' };\n } else if (type === 'github' || type === 'linear') {\n nextTracker = { ...config.tracker, type };\n } else if (type === 'jira') {\n if (interactive) {\n ui.step('Jira Cloud credentials (stored in .squad/secrets.yaml — always git-ignored)');\n const j = await promptJiraCredentials({ host: config.tracker.workspace });\n const merged = mergeSecrets(baseSecrets, {\n tracker: { jira: { host: j.host, email: j.email, token: j.token } },\n });\n saveSecrets(paths.secretsFile, merged);\n nextTracker = { type: 'jira', workspace: j.host };\n ui.success('Jira credentials saved');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n } else {\n const o = overlayTrackerEnv(baseSecrets);\n const host = (\n o.tracker?.jira?.host ??\n process.env.JIRA_HOST ??\n (config.tracker.type === 'jira' ? config.tracker.workspace : undefined)\n )?.trim();\n if (!host) {\n throw jiraError();\n }\n const candidate: SquadConfig = { ...config, tracker: { type: 'jira', workspace: host } };\n if (clientFor(candidate, o).error) {\n throw jiraError();\n }\n nextTracker = { type: 'jira', workspace: host };\n }\n } else if (type === 'azure') {\n if (interactive) {\n ui.step('Azure DevOps credentials (stored in .squad/secrets.yaml — always git-ignored)');\n const a = await promptAzureCredentials({\n organization: config.tracker.workspace,\n project: config.tracker.project,\n });\n const merged = mergeSecrets(baseSecrets, {\n tracker: {\n azure: { organization: a.organization, project: a.project, pat: a.pat },\n },\n });\n saveSecrets(paths.secretsFile, merged);\n nextTracker = { type: 'azure', workspace: a.organization, project: a.project };\n ui.success('Azure DevOps credentials saved');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n } else {\n const o = overlayTrackerEnv(baseSecrets);\n const org = (o.tracker?.azure?.organization ?? process.env.AZURE_DEVOPS_ORG ?? config.tracker.workspace)?.trim();\n const project = (o.tracker?.azure?.project ?? process.env.AZURE_DEVOPS_PROJECT ?? config.tracker.project)?.trim();\n if (!org || !project) {\n throw azureError();\n }\n const candidate: SquadConfig = { ...config, tracker: { type: 'azure', workspace: org, project } };\n if (clientFor(candidate, o).error) {\n throw azureError();\n }\n nextTracker = { type: 'azure', workspace: org, project };\n }\n }\n\n const next: SquadConfig = { ...config, tracker: nextTracker };\n saveConfig(paths.configFile, next);\n\n ui.blank();\n ui.success('Tracker configuration updated.');\n ui.kv('type', next.tracker.type, 10);\n if (next.tracker.workspace) {\n ui.kv('workspace', next.tracker.workspace, 10);\n }\n if (next.tracker.project) {\n ui.kv('project', next.tracker.project, 10);\n }\n\n if (process.env.CI === 'true') {\n printTrackerNextSteps(next.tracker.type);\n return;\n }\n\n const reloaded = loadConfig(paths.configFile);\n const s = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n if (reloaded.tracker.type === 'jira') {\n const r = await probeJiraConnectivity(s, reloaded);\n if (r.ok) {\n ui.info('Jira connectivity check: OK');\n } else {\n ui.warning(\n r.status !== undefined\n ? `Jira connectivity check: HTTP ${r.status}`\n : `Jira connectivity check failed: ${r.detail ?? 'unknown'}`,\n );\n }\n } else if (reloaded.tracker.type === 'azure') {\n const r = await probeAzureConnectivity(s, reloaded);\n if (r.ok) {\n ui.info('Azure DevOps connectivity check: OK');\n } else {\n ui.warning(\n r.status !== undefined\n ? `Azure DevOps connectivity check: HTTP ${r.status}`\n : `Azure DevOps connectivity check failed: ${r.detail ?? 'unknown'}`,\n );\n }\n }\n\n printTrackerNextSteps(next.tracker.type);\n}\n\nfunction printTrackerNextSteps(type: string): void {\n ui.blank();\n ui.step('Next:');\n if (type === 'none') {\n ui.info('1) Tracker is off. Create stories manually with `squad new-story <slug> --no-tracker`.');\n ui.info('2) Re-enable any time with `squad config set tracker`.');\n return;\n }\n ui.info('1) Verify with `squad doctor` — tracker checks should be green.');\n ui.info(`2) Create a story: squad new-story <feature-slug> --id <${type === 'jira' ? 'JIRA-123' : 'azure-work-item-id'}>`);\n ui.info(' squad-kit auto-fetches the title, description, and attachments into the intake.');\n ui.info('3) Review the generated intake.md, then run `squad new-plan --api` to generate the plan.');\n}\n","export type TrackerName = 'jira' | 'azure';\n\nexport interface FetchIssueResult {\n id: string; // canonical id, e.g. \"PROJ-123\" (Jira) or \"42\" (Azure)\n title: string;\n description: string; // plain text, may contain blank lines\n url: string; // web URL for the human\n labels: string[];\n type?: string; // \"Story\" | \"Bug\" | \"Task\" | …\n assignee?: string;\n status?: string; // optional status/workflow name\n attachments: AttachmentRef[];\n fetchedAt: string; // ISO-8601 UTC\n}\n\nexport interface AttachmentRef {\n filename: string; // already sanitized\n url: string; // authenticated download URL\n size: number; // bytes; may be 0 if unknown\n mimeType?: string;\n}\n\nexport interface DownloadedAttachment {\n source: AttachmentRef;\n outcome: 'written' | 'skipped-oversize' | 'skipped-error';\n bytesWritten: number;\n absolutePath?: string; // present when outcome === 'written'\n skipReason?: string; // present when outcome starts with 'skipped-'\n}\n\nexport interface TrackerClient {\n readonly name: TrackerName;\n fetchIssue(id: string): Promise<FetchIssueResult>;\n /**\n * Authenticated per-attachment download. Caller passes the directory;\n * client returns one record per attachment describing the outcome.\n * Never throws for a single-file failure; only throws for catastrophic\n * errors (auth revoked mid-session, etc.).\n */\n downloadAttachments(\n refs: AttachmentRef[],\n targetDir: string,\n opts?: DownloadOptions,\n ): Promise<DownloadedAttachment[]>;\n}\n\nexport interface DownloadOptions {\n maxMegabytes?: number; // default 10\n}\n\nexport class TrackerError extends Error {\n constructor(\n message: string,\n public readonly kind: 'auth' | 'not-found' | 'rate-limited' | 'network' | 'other',\n public readonly statusCode?: number,\n ) {\n super(message);\n this.name = 'TrackerError';\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { AttachmentRef, DownloadedAttachment, DownloadOptions } from './types.js';\n\nconst DEFAULT_MAX_MB = 10;\n\nexport async function downloadAttachmentsWith(\n refs: AttachmentRef[],\n targetDir: string,\n authHeaders: Record<string, string>,\n opts: DownloadOptions = {},\n): Promise<DownloadedAttachment[]> {\n const maxMb = opts.maxMegabytes ?? DEFAULT_MAX_MB;\n const maxBytes = maxMb * 1024 * 1024;\n fs.mkdirSync(targetDir, { recursive: true });\n\n const out: DownloadedAttachment[] = [];\n for (const ref of refs) {\n out.push(await one(ref, targetDir, authHeaders, maxBytes, maxMb));\n }\n return out;\n}\n\nasync function one(\n ref: AttachmentRef,\n targetDir: string,\n headers: Record<string, string>,\n maxBytes: number,\n maxMb: number,\n): Promise<DownloadedAttachment> {\n if (ref.size > 0 && ref.size > maxBytes) {\n return {\n source: ref,\n outcome: 'skipped-oversize',\n bytesWritten: 0,\n skipReason: `${formatMb(ref.size)} exceeds cap (${maxMb} MB)`,\n };\n }\n\n const safeName = sanitizeFilename(ref.filename);\n const dest = uniqueDestination(targetDir, safeName);\n\n let res: Response;\n try {\n res = await fetch(ref.url, { headers });\n } catch (err) {\n return {\n source: ref,\n outcome: 'skipped-error',\n bytesWritten: 0,\n skipReason: `network error: ${(err as Error).message}`,\n };\n }\n\n if (!res.ok) {\n return {\n source: ref,\n outcome: 'skipped-error',\n bytesWritten: 0,\n skipReason: `HTTP ${res.status}`,\n };\n }\n\n const buf = Buffer.from(await res.arrayBuffer());\n if (buf.byteLength > maxBytes) {\n return {\n source: ref,\n outcome: 'skipped-oversize',\n bytesWritten: 0,\n skipReason: `${formatMb(buf.byteLength)} after download exceeds cap (${maxMb} MB)`,\n };\n }\n\n fs.writeFileSync(dest, buf);\n return {\n source: ref,\n outcome: 'written',\n bytesWritten: buf.byteLength,\n absolutePath: dest,\n };\n}\n\n/**\n * Strips path separators, leading dots, and control characters.\n * Preserves a sensible extension. Never returns an empty string.\n */\nexport function sanitizeFilename(raw: string): string {\n const normalized = raw.replace(/\\\\/g, '/');\n const base = path.basename(normalized).replace(/[\\\\/]/g, '_');\n const cleaned = base\n .replace(/[\\x00-\\x1f]/g, '')\n .replace(/^\\.+/, '') // no leading dots\n .replace(/\\s+/g, ' ')\n .trim();\n if (cleaned.length === 0) return 'attachment';\n return cleaned.slice(0, 180); // keep filesystems happy\n}\n\nfunction uniqueDestination(dir: string, name: string): string {\n let candidate = path.join(dir, name);\n if (!fs.existsSync(candidate)) return candidate;\n const ext = path.extname(name);\n const stem = name.slice(0, name.length - ext.length);\n let n = 1;\n while (fs.existsSync(candidate) && n < 1000) {\n candidate = path.join(dir, `${stem} (${n})${ext}`);\n n += 1;\n }\n return candidate;\n}\n\nfunction formatMb(bytes: number): string {\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import type {\n AttachmentRef,\n DownloadOptions,\n DownloadedAttachment,\n FetchIssueResult,\n TrackerClient,\n} from './types.js';\nimport { TrackerError } from './types.js';\nimport { downloadAttachmentsWith, sanitizeFilename } from './attachments.js';\n\nexport interface AzureDevOpsClientConfig {\n organization: string; // e.g. \"myorg\"\n project: string; // e.g. \"myproject\"\n pat: string; // personal access token\n apiVersion?: string; // default \"7.1\"\n}\n\nconst HTML_STRIPPER_RE = [\n [/<\\s*br\\s*\\/?>/gi, '\\n'] as const,\n [/<\\/(p|div|li|h[1-6])>/gi, '\\n\\n'] as const,\n [/<[^>]+>/g, ''] as const,\n [/&nbsp;/g, ' '] as const,\n [/&amp;/g, '&'] as const,\n [/&lt;/g, '<'] as const,\n [/&gt;/g, '>'] as const,\n [/&quot;/g, '\"'] as const,\n [/&#39;/g, \"'\"] as const,\n [/\\n{3,}/g, '\\n\\n'] as const,\n];\n\nexport class AzureDevOpsClient implements TrackerClient {\n readonly name = 'azure' as const;\n private readonly authHeader: string;\n private readonly baseUrl: string;\n private readonly apiVersion: string;\n private readonly webBase: string;\n\n constructor(private readonly cfg: AzureDevOpsClientConfig) {\n if (!cfg.organization) throw new Error('AzureDevOpsClient: missing \"organization\".');\n if (!cfg.project) throw new Error('AzureDevOpsClient: missing \"project\".');\n if (!cfg.pat) throw new Error('AzureDevOpsClient: missing \"pat\".');\n this.apiVersion = cfg.apiVersion ?? '7.1';\n this.baseUrl = `https://dev.azure.com/${encodeURIComponent(cfg.organization)}/${encodeURIComponent(cfg.project)}/_apis/wit`;\n this.webBase = `https://dev.azure.com/${encodeURIComponent(cfg.organization)}/${encodeURIComponent(cfg.project)}/_workitems/edit`;\n const basic = Buffer.from(`:${cfg.pat}`).toString('base64');\n this.authHeader = `Basic ${basic}`;\n }\n\n async fetchIssue(id: string): Promise<FetchIssueResult> {\n const url = `${this.baseUrl}/workitems/${encodeURIComponent(id)}?$expand=all&api-version=${this.apiVersion}`;\n let res: Response;\n try {\n res = await fetch(url, { headers: this.headers() });\n } catch (err) {\n throw new TrackerError(`Azure DevOps fetch failed: ${(err as Error).message}`, 'network');\n }\n if (!res.ok) throw this.mapHttpError(res.status, id);\n\n const body = (await res.json()) as AzureWorkItemPayload;\n const fields = body.fields ?? {};\n const relations = Array.isArray(body.relations) ? body.relations : [];\n\n const attachments: AttachmentRef[] = relations\n .filter((r) => r.rel === 'AttachedFile')\n .map((r) => ({\n filename: sanitizeFilename(r.attributes?.name ?? 'attachment'),\n url: r.url,\n size: typeof r.attributes?.resourceSize === 'number' ? r.attributes.resourceSize : 0,\n }));\n\n return {\n id: String(body.id ?? id),\n title: fields['System.Title'] ?? '(no title)',\n description: stripHtml(fields['System.Description'] ?? ''),\n url: `${this.webBase}/${body.id ?? id}`,\n labels: parseTags(fields['System.Tags']),\n type: fields['System.WorkItemType'],\n assignee: fields['System.AssignedTo']?.displayName,\n status: fields['System.State'],\n attachments,\n fetchedAt: new Date().toISOString(),\n };\n }\n\n async downloadAttachments(\n refs: AttachmentRef[],\n targetDir: string,\n opts?: DownloadOptions,\n ): Promise<DownloadedAttachment[]> {\n return downloadAttachmentsWith(refs, targetDir, this.headers(), opts);\n }\n\n private headers(): Record<string, string> {\n return {\n authorization: this.authHeader,\n accept: 'application/json',\n };\n }\n\n private mapHttpError(status: number, id: string): TrackerError {\n if (status === 401 || status === 403) {\n return new TrackerError(\n `Azure DevOps authentication failed (HTTP ${status}). Check your PAT in .squad/secrets.yaml and that it has \"Work Items (Read)\" scope.`,\n 'auth',\n status,\n );\n }\n if (status === 404) {\n return new TrackerError(\n `Azure DevOps work item \"${id}\" not found in ${this.cfg.organization}/${this.cfg.project} (HTTP 404). ` +\n `Check the id and the organization/project in .squad/config.yaml.`,\n 'not-found',\n status,\n );\n }\n if (status === 429) {\n return new TrackerError(`Azure DevOps rate limit hit (HTTP 429). Wait a minute and retry.`, 'rate-limited', status);\n }\n return new TrackerError(`Azure DevOps request failed (HTTP ${status}).`, 'other', status);\n }\n}\n\nfunction parseTags(raw: unknown): string[] {\n if (typeof raw !== 'string' || raw.length === 0) return [];\n return raw\n .split(';')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nfunction stripHtml(html: string): string {\n let out = html;\n for (const [re, replacement] of HTML_STRIPPER_RE) {\n out = out.replace(re, replacement as string);\n }\n return out.trim();\n}\n\n// ---- Local payload types ----\n\ninterface AzureWorkItemPayload {\n id?: number;\n fields?: {\n 'System.Title'?: string;\n 'System.Description'?: string;\n 'System.WorkItemType'?: string;\n 'System.State'?: string;\n 'System.Tags'?: string;\n 'System.AssignedTo'?: { displayName?: string };\n };\n relations?: Array<{\n rel: string;\n url: string;\n attributes?: { name?: string; resourceSize?: number };\n }>;\n}\n","type AdfNode = {\n type: string;\n text?: string;\n content?: AdfNode[];\n};\n\nconst BLOCK_TYPES = new Set([\n 'paragraph',\n 'heading',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'codeBlock',\n 'blockquote',\n 'rule',\n 'panel',\n 'table',\n 'tableRow',\n]);\n\nexport function adfToPlainText(node: unknown): string {\n if (!node || typeof node !== 'object') return '';\n const lines: string[] = [];\n walk(node as AdfNode, lines);\n return lines.join('').trim();\n}\n\nfunction walk(node: AdfNode, out: string[]): void {\n if (!node) return;\n if (typeof node.text === 'string') {\n out.push(node.text);\n return;\n }\n if (Array.isArray(node.content)) {\n for (const child of node.content) walk(child, out);\n }\n if (BLOCK_TYPES.has(node.type)) {\n // ensure block separation\n if (out.length > 0 && !out[out.length - 1]!.endsWith('\\n\\n')) {\n out.push('\\n\\n');\n }\n }\n}\n","import type {\n AttachmentRef,\n DownloadOptions,\n DownloadedAttachment,\n FetchIssueResult,\n TrackerClient,\n} from './types.js';\nimport { TrackerError } from './types.js';\nimport { adfToPlainText } from './adf.js';\nimport { downloadAttachmentsWith, sanitizeFilename } from './attachments.js';\n\nexport interface JiraClientConfig {\n host: string; // e.g. \"mycompany.atlassian.net\" — no scheme, no trailing slash\n email: string;\n token: string;\n}\n\nexport class JiraClient implements TrackerClient {\n readonly name = 'jira' as const;\n private readonly authHeader: string;\n private readonly baseUrl: string;\n\n constructor(private readonly cfg: JiraClientConfig) {\n const normHost = cfg.host.replace(/^https?:\\/\\//i, '').replace(/\\/+$/, '');\n this.baseUrl = `https://${normHost}`;\n const basic = Buffer.from(`${cfg.email}:${cfg.token}`).toString('base64');\n this.authHeader = `Basic ${basic}`;\n }\n\n async fetchIssue(id: string): Promise<FetchIssueResult> {\n const url =\n `${this.baseUrl}/rest/api/3/issue/${encodeURIComponent(id)}` +\n `?fields=summary,description,labels,issuetype,assignee,status,attachment&expand=renderedFields`;\n let res: Response;\n try {\n res = await fetch(url, { headers: this.headers() });\n } catch (err) {\n throw new TrackerError(`Jira fetch failed: ${(err as Error).message}`, 'network');\n }\n if (!res.ok) throw this.mapHttpError(res.status, id);\n\n const body = (await res.json()) as JiraIssuePayload;\n const fields = body.fields ?? {};\n const rendered = body.renderedFields ?? {};\n\n const description =\n typeof rendered.description === 'string' && rendered.description.length > 0\n ? stripHtml(rendered.description)\n : adfToPlainText(fields.description);\n\n const attachments: AttachmentRef[] = (fields.attachment ?? []).map((a) => ({\n filename: sanitizeFilename(a.filename),\n url: a.content,\n size: typeof a.size === 'number' ? a.size : 0,\n mimeType: a.mimeType,\n }));\n\n return {\n id: body.key ?? id,\n title: fields.summary ?? '(no title)',\n description,\n url: `${this.baseUrl}/browse/${body.key ?? id}`,\n labels: Array.isArray(fields.labels) ? fields.labels : [],\n type: fields.issuetype?.name,\n assignee: fields.assignee?.displayName,\n status: fields.status?.name,\n attachments,\n fetchedAt: new Date().toISOString(),\n };\n }\n\n async downloadAttachments(\n refs: AttachmentRef[],\n targetDir: string,\n opts?: DownloadOptions,\n ): Promise<DownloadedAttachment[]> {\n return downloadAttachmentsWith(refs, targetDir, this.headers(), opts);\n }\n\n private headers(): Record<string, string> {\n return {\n authorization: this.authHeader,\n accept: 'application/json',\n };\n }\n\n private mapHttpError(status: number, id: string): TrackerError {\n if (status === 401 || status === 403) {\n return new TrackerError(\n `Jira authentication failed (HTTP ${status}). Check your email and API token in .squad/secrets.yaml.`,\n 'auth',\n status,\n );\n }\n if (status === 404) {\n return new TrackerError(\n `Jira issue \"${id}\" not found on ${this.cfg.host} (HTTP 404). Check the id and your workspace host.`,\n 'not-found',\n status,\n );\n }\n if (status === 429) {\n return new TrackerError(`Jira rate limit hit (HTTP 429). Wait a minute and retry.`, 'rate-limited', status);\n }\n return new TrackerError(`Jira request failed (HTTP ${status}).`, 'other', status);\n }\n}\n\n// ---- Local types for the Jira payload ----\n\ninterface JiraIssuePayload {\n key?: string;\n fields?: {\n summary?: string;\n description?: unknown; // ADF JSON\n labels?: string[];\n issuetype?: { name?: string };\n assignee?: { displayName?: string };\n status?: { name?: string };\n attachment?: Array<{\n filename: string;\n content: string;\n size?: number;\n mimeType?: string;\n }>;\n };\n renderedFields?: {\n description?: string; // HTML\n };\n}\n\nfunction stripHtml(html: string): string {\n return html\n .replace(/<\\s*br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/(p|div|li|h[1-6])>/gi, '\\n\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n","import type { SquadConfig } from '../core/config.js';\nimport type { SquadSecrets } from '../core/secrets.js';\nimport { AzureDevOpsClient } from './azure.js';\nimport { JiraClient } from './jira.js';\nimport type { TrackerClient } from './types.js';\n\nexport * from './types.js';\nexport { JiraClient } from './jira.js';\nexport { AzureDevOpsClient } from './azure.js';\nexport { sanitizeFilename } from './attachments.js';\nexport { overlayTrackerEnv } from './env-overlay.js';\n\nexport interface ClientResolutionError {\n kind: 'unsupported-tracker' | 'missing-credentials';\n message: string;\n detail: string; // actionable hint (env-var name or secrets.yaml path)\n}\n\nexport interface ClientResolution {\n client?: TrackerClient;\n error?: ClientResolutionError;\n}\n\n/**\n * Given the current workspace config + secrets, return a ready-to-use TrackerClient\n * or a structured error that the caller can surface verbatim to the user.\n *\n * NEVER throws. NEVER reads env vars directly. The caller is responsible for merging\n * env-var-sourced credentials into `secrets` before calling, OR for using the\n * `resolveTrackerCredential` helper and passing the resolved value here.\n */\nexport function clientFor(config: SquadConfig, secrets: SquadSecrets): ClientResolution {\n switch (config.tracker.type) {\n case 'jira': {\n const jira = secrets.tracker?.jira ?? {};\n const host = jira.host ?? config.tracker.workspace;\n if (!host || !jira.email || !jira.token) {\n return {\n error: {\n kind: 'missing-credentials',\n message: 'Jira credentials are incomplete.',\n detail:\n 'Run `squad config set tracker` to enter host, email, and token, or set JIRA_HOST / JIRA_EMAIL / JIRA_API_TOKEN. Run `squad doctor` to verify the connection.',\n },\n };\n }\n return { client: new JiraClient({ host, email: jira.email, token: jira.token }) };\n }\n\n case 'azure': {\n const az = secrets.tracker?.azure ?? {};\n const organization = az.organization ?? config.tracker.workspace;\n const project = az.project ?? config.tracker.project;\n if (!organization || !project || !az.pat) {\n return {\n error: {\n kind: 'missing-credentials',\n message: 'Azure DevOps credentials are incomplete.',\n detail:\n 'Run `squad config set tracker` to enter organization, project, and PAT, or set AZURE_DEVOPS_ORG / AZURE_DEVOPS_PROJECT / AZURE_DEVOPS_PAT. Run `squad doctor` to verify the connection.',\n },\n };\n }\n return { client: new AzureDevOpsClient({ organization, project, pat: az.pat }) };\n }\n\n case 'none':\n default:\n return {\n error: {\n kind: 'unsupported-tracker',\n message: `Tracker type \"${config.tracker.type}\" does not support auto-fetch in 0.2.0.`,\n detail:\n 'Run `squad config set tracker` to use jira or azure for fetch, or pass `--no-fetch` on new-story. Run `squad doctor` to review tracker setup.',\n },\n };\n }\n}\n","import fs from 'node:fs';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, saveConfig, type SquadConfig } from '../../core/config.js';\nimport { loadSecrets, saveSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { isInteractive } from '../../ui/tty.js';\n\nexport interface ConfigUnsetTrackerOptions {\n removeCredentials?: boolean;\n yes?: boolean;\n}\n\nexport async function runConfigUnsetTracker(opts: ConfigUnsetTrackerOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n const useYes = Boolean(opts.yes);\n if (!useYes) {\n if (!isInteractive()) {\n ui.warning('Pass -y in non-interactive mode to confirm setting the tracker to none.');\n return;\n }\n const ok = await confirm({ message: 'Set tracker to none? (keeps tracker tokens in .squad/secrets.yaml.)', default: false });\n if (!ok) {\n return;\n }\n }\n\n const next: SquadConfig = { ...config, tracker: { type: 'none' } };\n saveConfig(paths.configFile, next);\n\n if (opts.removeCredentials) {\n const s: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n if (s.tracker) {\n delete s.tracker;\n saveSecrets(paths.secretsFile, s);\n }\n ui.success('Tracker set to none; tracker credentials were removed from .squad/secrets.yaml.');\n } else {\n ui.success('Tracker set to none; any tracker credentials in .squad/secrets.yaml (if any) were preserved.');\n }\n ui.info('Re-enable any time with `squad config set tracker`.');\n}\n","import fs from 'node:fs';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadSecrets, saveSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { isInteractive } from '../../ui/tty.js';\n\nexport type CredentialSection = 'planner' | 'tracker';\n\nexport interface ConfigRemoveCredentialOptions {\n yes?: boolean;\n}\n\nexport async function runConfigRemoveCredential(\n section: string,\n opts: ConfigRemoveCredentialOptions = {},\n): Promise<void> {\n if (section !== 'planner' && section !== 'tracker') {\n throw new Error(\n 'Invalid section. Run `squad config remove-credential planner` or `squad config remove-credential tracker`.',\n );\n }\n\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n\n const useYes = Boolean(opts.yes);\n if (!useYes) {\n if (!isInteractive()) {\n ui.warning('Pass -y in non-interactive mode to confirm, or run `squad config remove-credential` in a TTY.');\n return;\n }\n const ok = await confirm({\n message: `Delete all ${section} credentials from .squad/secrets.yaml? (config is unchanged)`,\n default: false,\n });\n if (!ok) {\n return;\n }\n }\n\n const s: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n if (section === 'planner') {\n if (s.planner) {\n delete s.planner;\n }\n } else {\n if (s.tracker) {\n delete s.tracker;\n }\n }\n saveSecrets(paths.secretsFile, s);\n ui.success(`Removed credentials for ${section}.`);\n ui.info('Run `squad config set ' + section + '` to re-enter credentials.');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { input, select } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot, slugify, type SquadPaths } from '../core/paths.js';\nimport { listFeatures } from '../core/stories.js';\nimport { loadConfig, type SquadConfig, type TrackerType } from '../core/config.js';\nimport { validateTrackerId, trackerIdForFilename } from '../core/tracker.js';\nimport { loadSecrets } from '../core/secrets.js';\nimport { readFile, readBundledPrompt, templatesDir, writeFileSafe } from '../utils/fs.js';\nimport { render } from '../core/template.js';\nimport { clientFor, overlayTrackerEnv } from '../tracker/index.js';\nimport { TrackerError, type DownloadedAttachment, type FetchIssueResult } from '../tracker/types.js';\n\nexport function validateFeatureSlugForPrompt(v: string): true | string {\n const trimmed = v.trim();\n if (!trimmed) return 'Required.';\n const s = slugify(trimmed);\n if (!s) return 'Required.';\n if (s !== trimmed) return 'Use lowercase kebab-case (letters, digits, hyphens).';\n return true;\n}\n\nexport interface NewStoryOptions {\n id?: string;\n title?: string;\n yes?: boolean;\n /** default true; --no-fetch sets false */\n fetch?: boolean;\n /** default true; --no-attachments sets false */\n attachments?: boolean;\n attachmentMb?: number;\n /** default true; --no-tracker sets false. When false, behave as if tracker.type === 'none' for this call. */\n tracker?: boolean;\n}\n\nexport async function runNewStory(featureSlug: string | undefined, opts: NewStoryOptions): Promise<void> {\n const interactive = !opts.yes && Boolean(process.stdin.isTTY) && process.env.CI !== 'true';\n\n let featureSlugInput: string | undefined = featureSlug;\n if (!featureSlugInput) {\n if (!interactive) {\n throw new Error(\n 'feature-slug is required. Run `squad new-story` in a TTY to pick interactively, or pass a slug like `squad new-story <feature-slug>`, or add `--yes` to fail fast in scripts.',\n );\n }\n const rootForPrompt = requireSquadRoot();\n const pathsForPrompt = buildPaths(rootForPrompt);\n const existing = listFeatures(pathsForPrompt);\n if (existing.length > 0) {\n const choice = await select({\n message: 'Feature:',\n choices: [\n ...existing.map((f) => ({ name: f, value: f })),\n { name: '─── new feature ───', value: '__NEW__' },\n ],\n });\n if (choice !== '__NEW__') {\n featureSlugInput = choice;\n }\n }\n if (!featureSlugInput) {\n featureSlugInput = (\n await input({\n message: 'New feature slug (kebab-case):',\n validate: validateFeatureSlugForPrompt,\n })\n ).trim();\n }\n }\n\n const slug = slugify(featureSlugInput!);\n if (!slug) {\n throw new Error(\n `Invalid feature slug: \"${featureSlugInput}\". Run \\`squad new-story\\` and use kebab-case (letters, digits, hyphens).`,\n );\n }\n\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n let noTracker = opts.tracker === false && config.tracker.type !== 'none';\n let id = opts.id;\n if (noTracker) id = undefined;\n let trackerNeedsId =\n !noTracker && config.tracker.type !== 'none' && config.naming.includeTrackerId;\n\n let title = opts.title;\n\n if (!id && trackerNeedsId) {\n if (!interactive) {\n throw new Error(\n `Tracker \"${config.tracker.type}\" is configured and naming.includeTrackerId is true. ` +\n `Run \\`squad new-story <feature-slug> --id <tracker-id>\\` to link now, or \\`squad new-story <feature-slug> --no-tracker\\` to skip the tracker for this story only.`,\n );\n }\n const mode = await select({\n message: `This workspace requires a ${config.tracker.type} id for new stories. How do you want to proceed?`,\n choices: [\n { name: `Enter a ${config.tracker.type} id now`, value: 'enter' },\n { name: 'Skip tracker for this story (same as --no-tracker)', value: 'skip' },\n ],\n default: 'enter',\n });\n if (mode === 'skip') {\n opts.tracker = false;\n noTracker = true;\n trackerNeedsId = false;\n } else {\n id = (\n await input({\n message: `${config.tracker.type} work-item id:`,\n validate: (v) =>\n validateTrackerId(config.tracker.type, v.trim())\n ? true\n : `Invalid ${config.tracker.type} id format.`,\n })\n ).trim();\n }\n }\n\n if (id && !validateTrackerId(config.tracker.type, id)) {\n throw new Error(\n `Invalid tracker id \"${id}\" for tracker type \"${config.tracker.type}\". ` +\n `Run \\`squad config show\\` to review the expected format, or \\`squad config set tracker\\` if the tracker type is wrong.`,\n );\n }\n\n if (!id && !title) {\n if (!interactive) {\n if (!noTracker) {\n throw new Error(\n 'Provide either --id <tracker-id> or --title \"...\" so the story folder has a distinct name. ' +\n 'Run `squad new-story <feature-slug> --id ...` or `squad new-story <feature-slug> --title \"...\"` (or `--no-tracker` with a title).',\n );\n }\n } else {\n title = (await input({ message: 'Short story title:' })).trim();\n if (!title) throw new Error('Title cannot be empty. Run `squad new-story` again and enter a short title, or add `--yes` to fail fast in scripts.');\n }\n }\n\n if (interactive && !title) {\n const maybe = (await input({ message: 'Short title (optional, press Enter to skip):', default: '' })).trim();\n if (maybe) title = maybe;\n }\n\n const storyFolderName = id ? trackerIdForFilename(config.tracker.type, id) : slugify(title ?? '');\n if (!storyFolderName) {\n throw new Error(\n 'Could not derive a story folder name. Pass `--title \"<hint>\"` when using `--no-tracker`, or `--id <tracker-id>` to name the folder after the tracker id.',\n );\n }\n const storyDir = path.join(paths.storiesDir, slug, storyFolderName);\n const intakeFile = path.join(storyDir, 'intake.md');\n const attachmentsDir = path.join(storyDir, 'attachments');\n\n if (fs.existsSync(intakeFile)) {\n throw new Error(\n `Intake already exists: ${intakeFile}. Run \\`squad new-plan ${path.relative(root, intakeFile)}\\` to plan it, or \\`squad rm story\\` to remove the story first.`,\n );\n }\n\n fs.mkdirSync(attachmentsDir, { recursive: true });\n\n let sourceBlock = '';\n let fetchedSummary: { id: string; written: number } | undefined;\n\n const shouldFetch =\n !noTracker && opts.fetch !== false && Boolean(id) && config.tracker.type !== 'none';\n if (shouldFetch) {\n const outcome = await tryFetchIssue(config, id!, opts, paths, attachmentsDir);\n if (outcome.outcome === 'ok') {\n sourceBlock = buildSourcePreamble(outcome.issue, outcome.downloads, config.tracker.type);\n if (!title) title = outcome.issue.title;\n const written = outcome.downloads.filter((d) => d.outcome === 'written').length;\n fetchedSummary = { id: outcome.issue.id, written };\n } else {\n ui.warning(`Tracker fetch skipped: ${outcome.reason}`);\n if (outcome.hint) ui.info(outcome.hint);\n sourceBlock = buildFallbackPreamble(outcome.reason, outcome.hint);\n }\n }\n\n const template = readBundledPrompt('intake.md');\n const rendered = render(template, {\n featureSlug: slug,\n storyId: storyFolderName,\n trackerType: config.tracker.type,\n projectRoots: (config.project.projectRoots ?? ['.']).join(', '),\n primaryLanguage: config.project.primaryLanguage ?? '',\n });\n\n const skippedPreamble =\n noTracker && config.tracker.type !== 'none' && !sourceBlock\n ? buildSkippedTrackerPreamble(config.tracker.type)\n : '';\n const titleHint = title ? `> **Title hint (from CLI):** ${title}\\n\\n` : '';\n writeFileSafe(intakeFile, skippedPreamble + sourceBlock + titleHint + rendered, false);\n\n ensureFeatureOverview(path.join(paths.plansDir, slug), slug);\n\n const relativePath = path.relative(root, intakeFile);\n const relAttachDir = path.relative(root, attachmentsDir);\n ui.success('Created intake');\n if (noTracker && config.tracker.type !== 'none') {\n ui.warning('Created without a tracker link. Use `squad tracker link` later to attach one.');\n }\n ui.kv('intake', relativePath, 11);\n ui.kv('attachments', relAttachDir + path.sep, 11);\n if (fetchedSummary && fetchedSummary.written > 0) {\n ui.kv('fetched', `${fetchedSummary.id} · ${fetchedSummary.written} attachments saved`, 11);\n }\n ui.blank();\n ui.step('Next: review the intake (Source block at top is from the tracker), then:');\n ui.info(`squad new-plan ${relativePath}`);\n}\n\ntype FetchOutcome =\n | { outcome: 'ok'; issue: FetchIssueResult; downloads: DownloadedAttachment[] }\n | { outcome: 'skipped'; reason: string; hint?: string }\n | { outcome: 'failed'; reason: string; hint?: string };\n\nasync function tryFetchIssue(\n config: SquadConfig,\n id: string,\n opts: NewStoryOptions,\n paths: SquadPaths,\n attachmentsDir: string,\n): Promise<FetchOutcome> {\n const secretsFromFile = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n const secrets = overlayTrackerEnv(secretsFromFile);\n const resolution = clientFor(config, secrets);\n if (resolution.error) {\n return { outcome: 'skipped', reason: resolution.error.message, hint: resolution.error.detail };\n }\n const client = resolution.client!;\n\n const spin = ui.spinner(`Fetching ${config.tracker.type} ${id}…`);\n let issue: FetchIssueResult;\n try {\n issue = await client.fetchIssue(id);\n } catch (err) {\n spin.fail('Tracker fetch failed');\n if (err instanceof TrackerError) {\n return { outcome: 'failed', reason: err.message, hint: explainTrackerErrorHint(err) };\n }\n return { outcome: 'failed', reason: (err as Error).message };\n }\n spin.succeed(`Fetched ${issue.id}: ${truncate(issue.title, 60)}`);\n\n let downloads: DownloadedAttachment[] = [];\n if (opts.attachments !== false && issue.attachments.length > 0) {\n const attachSpin = ui.spinner(`Downloading ${issue.attachments.length} attachment(s)…`);\n downloads = await client.downloadAttachments(issue.attachments, attachmentsDir, {\n maxMegabytes: opts.attachmentMb,\n });\n const written = downloads.filter((d) => d.outcome === 'written').length;\n const skipped = downloads.length - written;\n attachSpin.succeed(`Attachments: ${written} saved, ${skipped} skipped`);\n } else if (opts.attachments === false && issue.attachments.length > 0) {\n downloads = issue.attachments.map((source) => ({\n source,\n outcome: 'skipped-error' as const,\n bytesWritten: 0,\n skipReason: 'not downloaded (--no-attachments)',\n }));\n }\n\n return { outcome: 'ok', issue, downloads };\n}\n\nfunction explainTrackerErrorHint(err: TrackerError): string | undefined {\n switch (err.kind) {\n case 'auth':\n return 'Run `squad config set tracker` to re-enter credentials, or `squad doctor` to verify.';\n case 'not-found':\n return 'Run `squad config show` to check workspace settings, or `squad tracker link` with a valid work-item id.';\n case 'rate-limited':\n return 'Wait a minute, then retry, or run `squad new-story` with --no-fetch.';\n case 'network':\n return 'Run `squad doctor` to verify connectivity, or `squad new-story` with --no-fetch to skip.';\n default:\n return undefined;\n }\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + '…';\n}\n\nfunction buildSourcePreamble(\n issue: FetchIssueResult,\n downloads: DownloadedAttachment[],\n trackerType: TrackerType,\n): string {\n const header =\n `> **Fetched from ${trackerType}:** [${issue.id}](${issue.url}) ` +\n `\\n> *Fetched ${issue.fetchedAt}. Edit the sections below as needed; the planner reads this file verbatim.*\\n\\n`;\n\n const metaLines: string[] = [];\n metaLines.push(`**Title:** ${issue.title}`);\n if (issue.type) metaLines.push(`**Type:** ${issue.type}`);\n if (issue.status) metaLines.push(`**Status:** ${issue.status}`);\n if (issue.assignee) metaLines.push(`**Assignee:** ${issue.assignee}`);\n if (issue.labels.length > 0) metaLines.push(`**Labels:** ${issue.labels.join(', ')}`);\n\n const description =\n issue.description.trim().length > 0 ? issue.description.trim() : '*(tracker returned an empty description)*';\n\n const attachmentsTable = renderAttachmentsTable(downloads);\n\n return [\n header,\n '## Source — work item (from tracker)',\n '',\n metaLines.join(' \\n'),\n '',\n '### Description',\n '',\n description,\n '',\n attachmentsTable,\n '',\n '---',\n '',\n ].join('\\n');\n}\n\nfunction renderAttachmentsTable(downloads: DownloadedAttachment[]): string {\n if (downloads.length === 0) return '### Attachments\\n\\nNone.';\n const rows = downloads.map((d) => {\n const sizeNum = (d.bytesWritten || d.source.size) / 1024;\n const size = `${sizeNum | 0} KB`;\n switch (d.outcome) {\n case 'written':\n return `| \\`attachments/${path.basename(d.absolutePath!)}\\` | ${size} | downloaded |`;\n case 'skipped-oversize':\n return `| ${d.source.filename} | ${size} | **skipped** — ${d.skipReason} |`;\n case 'skipped-error':\n return `| ${d.source.filename} | — | **skipped** — ${d.skipReason} |`;\n }\n });\n return ['### Attachments', '', '| File | Size | Status |', '| ---- | ---- | ------ |', ...rows].join('\\n');\n}\n\nfunction buildFallbackPreamble(reason: string, hint?: string): string {\n const hintLine = hint ? `\\n> Hint: ${hint}` : '';\n return `> **Tracker auto-fetch skipped.** \\n> ${reason}${hintLine}\\n\\n---\\n\\n`;\n}\n\nfunction buildSkippedTrackerPreamble(trackerType: TrackerType): string {\n return [\n '> **Source:** manual entry (tracker skipped via `--no-tracker`).',\n `> Active tracker for this workspace: \\`${trackerType}\\` — this story is not linked. `,\n '> Run `squad tracker link <story-path> <tracker-id>` later if you want to attach one.',\n '',\n '',\n ].join('\\n');\n}\n\nfunction ensureFeatureOverview(featurePlanDir: string, slug: string): void {\n fs.mkdirSync(featurePlanDir, { recursive: true });\n const overviewFile = path.join(featurePlanDir, '00-overview.md');\n if (fs.existsSync(overviewFile)) return;\n const template = readFile(path.join(templatesDir(), 'overview.md'));\n writeFileSafe(overviewFile, render(template, { featureSlug: slug }), false);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { SquadPaths } from './paths.js';\n\nexport interface StoryRecord {\n feature: string;\n id: string;\n intakePath: string;\n storyDir: string;\n planFile?: string;\n titleHint?: string;\n}\n\nconst STORY_FILE = /^(\\d{2,})-story-.+\\.md$/;\n\n/** Top-level feature directory names under `.squad/stories/`. */\nexport function listFeatures(paths: SquadPaths): string[] {\n if (!fs.existsSync(paths.storiesDir)) return [];\n return fs\n .readdirSync(paths.storiesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort();\n}\n\n/** All intakes; same rows as `listStories()` with no filter. */\nexport function listAllStories(paths: SquadPaths): StoryRecord[] {\n return listStories(paths);\n}\n\nexport function listStories(paths: SquadPaths, opts: { feature?: string } = {}): StoryRecord[] {\n const rows: StoryRecord[] = [];\n if (!fs.existsSync(paths.storiesDir)) return rows;\n\n for (const feature of fs.readdirSync(paths.storiesDir, { withFileTypes: true })) {\n if (!feature.isDirectory()) continue;\n if (opts.feature && feature.name !== opts.feature) continue;\n const featureDir = path.join(paths.storiesDir, feature.name);\n for (const story of fs.readdirSync(featureDir, { withFileTypes: true })) {\n if (!story.isDirectory()) continue;\n const storyDir = path.join(featureDir, story.name);\n const intakePath = path.join(storyDir, 'intake.md');\n if (!fs.existsSync(intakePath)) continue;\n rows.push({\n feature: feature.name,\n id: story.name,\n intakePath,\n storyDir,\n planFile: findPlanFor(paths.plansDir, feature.name, story.name),\n titleHint: readTitleHint(intakePath),\n });\n }\n }\n return rows;\n}\n\nexport function findPlanFor(plansDir: string, feature: string, storyId: string): string | undefined {\n const featureDir = path.join(plansDir, feature);\n if (!fs.existsSync(featureDir)) return undefined;\n for (const entry of fs.readdirSync(featureDir)) {\n if (!STORY_FILE.test(entry)) continue;\n if (entry.includes(storyId)) return entry;\n }\n return undefined;\n}\n\nexport function findStoryByIntake(records: StoryRecord[], intakePath: string): StoryRecord | undefined {\n const target = normalizeIntakePath(intakePath.trim());\n return records.find((r) => normalizeIntakePath(r.intakePath) === target);\n}\n\nfunction normalizeIntakePath(p: string): string {\n const resolved = path.resolve(p);\n try {\n return fs.realpathSync(resolved);\n } catch {\n return resolved;\n }\n}\n\nexport function readTitleHint(intakePath: string): string | undefined {\n try {\n const head = fs.readFileSync(intakePath, 'utf8').split('\\n').slice(0, 3).join('\\n');\n const m = head.match(/>\\s*\\*\\*Title hint \\(from CLI\\):\\*\\*\\s*(.+?)\\s*$/m);\n return m?.[1]?.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface PlanMetadata {\n provider?: string;\n model?: string;\n generatedBy?: string; // e.g. \"anthropic/claude-opus-4-x\" or undefined for copy-paste plans\n}\n\nexport function readPlanMetadata(planFileAbsPath: string): PlanMetadata {\n try {\n const first = fs.readFileSync(planFileAbsPath, 'utf8').split('\\n', 1)[0] ?? '';\n const m = first.match(/^<!--\\s*squad-kit:\\s*generated by\\s+([^\\s,]+)/);\n if (!m) return {};\n const generatedBy = m[1]!;\n const [provider, model] = generatedBy.split('/');\n return { provider, model, generatedBy };\n } catch {\n return {};\n }\n}\n","import type { TrackerType } from './config.js';\n\nconst VALIDATORS: Record<Exclude<TrackerType, 'none'>, RegExp> = {\n github: /^(?:[\\w.-]+\\/[\\w.-]+#)?\\d+$/,\n linear: /^[A-Z][A-Z0-9]+-\\d+$/i,\n jira: /^[A-Z][A-Z0-9]+-\\d+$/,\n azure: /^\\d+$/,\n};\n\nexport function validateTrackerId(type: TrackerType, id: string): boolean {\n if (type === 'none') return true;\n const pattern = VALIDATORS[type];\n return pattern.test(id);\n}\n\nexport function trackerIdForFilename(type: TrackerType, id: string): string {\n if (type === 'github') return id.replace(/^[\\w.-]+\\/[\\w.-]+#/, '');\n return id;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { confirm, select } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot, type SquadPaths } from '../core/paths.js';\nimport { loadConfig, type SquadConfig } from '../core/config.js';\nimport { readBundledPrompt, readFile } from '../utils/fs.js';\nimport { render } from '../core/template.js';\nimport { copyToClipboard } from '../utils/clipboard.js';\nimport { findStoryByIntake, listStories, type StoryRecord } from '../core/stories.js';\nimport { runPlanner } from '../planner/loop.js';\nimport { providerFor } from '../planner/providers/index.js';\nimport { Budget } from '../planner/budget.js';\nimport { buildRepoMap } from '../core/repo-map.js';\nimport { composeSystemPrompt, composeUserPrompt } from '../planner/system-prompt.js';\nimport { writePlanFile, buildMetadataHeader } from '../planner/writer.js';\nimport { modelFor, providerEnvVar, readProviderKey } from '../core/planner-models.js';\nimport { writeLastRun } from '../core/last-run.js';\nimport { formatPlannerCacheLine } from '../ui/planner-cache-summary.js';\n\nexport interface NewPlanOptions {\n /** Default true; `--no-clipboard` sets false (copy-paste mode only). */\n clipboard?: boolean;\n /** `--copy` — force copy-paste mode. */\n copy?: boolean;\n feature?: string;\n all?: boolean;\n yes?: boolean;\n api?: boolean;\n}\n\nfunction decideMode(opts: NewPlanOptions, config: SquadConfig): 'api' | 'copy' {\n if (opts.api && opts.copy) {\n throw new Error('Pass either --api or --copy, not both. Run `squad new-plan --help` for valid flags.');\n }\n if (opts.api) return 'api';\n if (opts.copy) return 'copy';\n const enabled = config.planner?.enabled;\n const key = enabled && config.planner?.provider ? readProviderKey(config.planner.provider) : undefined;\n return enabled && key ? 'api' : 'copy';\n}\n\nexport async function runNewPlan(intakePath: string | undefined, opts: NewPlanOptions): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n const interactive = !opts.yes && Boolean(process.stdin.isTTY);\n const stories = listStories(paths, { feature: opts.feature });\n\n const story = intakePath\n ? resolveFromPath(intakePath, stories, root)\n : await pickStory(stories, { all: !!opts.all, interactive, feature: opts.feature });\n\n if (!story) return;\n\n if (story.planFile) {\n const proceed = await confirmOverwrite(story, interactive, !!opts.yes);\n if (!proceed) return;\n }\n\n const mode = decideMode(opts, config);\n\n if (mode === 'api') {\n await emitViaApi(story, paths, config, opts);\n } else {\n await emitCopyPrompt(story, paths, config, opts.clipboard !== false);\n }\n}\n\nfunction resolveFromPath(intakePath: string, stories: StoryRecord[], root: string): StoryRecord {\n const resolved = path.resolve(intakePath.trim());\n if (!fs.existsSync(resolved)) {\n throw new Error(\n `Intake not found: ${resolved}. Run \\`squad list\\` to see intakes, or \\`squad new-story\\` to create one first.`,\n );\n }\n const hit = findStoryByIntake(stories, resolved);\n if (hit) return hit;\n throw new Error(\n `Intake at ${resolved} is not under ${relativeStoriesDir(root)}. ` +\n `Run \\`squad new-story\\` to create a story, then pass a path like \\`squad new-plan .squad/stories/<feature>/<id>/intake.md\\`.`,\n );\n}\n\nfunction relativeStoriesDir(root: string): string {\n return path.relative(root, path.join(root, '.squad', 'stories'));\n}\n\nasync function pickStory(\n stories: StoryRecord[],\n opts: { all: boolean; interactive: boolean; feature?: string },\n): Promise<StoryRecord | undefined> {\n const candidates = opts.all ? stories : stories.filter((s) => !s.planFile);\n\n if (candidates.length === 0) {\n if (stories.length === 0) {\n ui.info('No intakes to plan. Run `squad new-story` to create one first.');\n return undefined;\n }\n const filterNote = opts.feature ? ` in feature \"${opts.feature}\"` : '';\n ui.info(`All ${stories.length} intakes${filterNote} already have plans.`);\n ui.blank();\n ui.info('Options:');\n ui.info(' squad new-plan --all pick any intake (replaces existing plan)');\n ui.info(' squad new-plan <intake-path> regenerate a specific plan');\n ui.info(' squad new-story <feature> start a new story');\n return undefined;\n }\n\n if (!opts.interactive) {\n throw new Error(\n 'No intake path provided and not running interactively. Run `squad new-plan` with a path to intake.md, or `squad new-plan` in a TTY to pick, or add `--yes` with an explicit path in CI.',\n );\n }\n\n const pick = await select({\n message: 'Pick a story to plan:',\n pageSize: Math.min(10, candidates.length),\n choices: candidates.map((s) => ({\n name: formatLabel(s),\n value: s.intakePath,\n })),\n });\n\n return candidates.find((s) => path.resolve(s.intakePath) === path.resolve(pick));\n}\n\nfunction formatLabel(s: StoryRecord): string {\n const head = `${s.feature} / ${s.id}`;\n const tail = s.titleHint ? ` ${ui.theme.dim(`— \"${s.titleHint}\"`)}` : '';\n const plannedTag = s.planFile ? ` ${ui.theme.warn('(planned)')}` : '';\n return head + tail + plannedTag;\n}\n\nasync function confirmOverwrite(story: StoryRecord, interactive: boolean, yes: boolean): Promise<boolean> {\n ui.warning(`A plan already exists for this intake:`);\n ui.kv('plan', `.squad/plans/${story.feature}/${story.planFile}`);\n ui.info('Regenerating will replace it when your planner writes the new version.');\n if (yes) return true;\n if (!interactive) {\n throw new Error(\n `Plan already exists (.squad/plans/${story.feature}/${story.planFile}). ` +\n `Run \\`squad new-plan\\` with \\`--yes\\` to overwrite non-interactively, or in a TTY to confirm in the prompt.`,\n );\n }\n const go = await confirm({ message: 'Proceed and regenerate?', default: false });\n return go;\n}\n\nasync function emitViaApi(\n story: StoryRecord,\n paths: SquadPaths,\n config: SquadConfig,\n _opts: NewPlanOptions,\n): Promise<void> {\n const planner = config.planner;\n if (!planner?.enabled) {\n throw new Error(\n 'Direct planner API is not configured. Run `squad init --force` to enable it, or `squad new-plan --copy` for the manual copy-paste flow.',\n );\n }\n const apiKey = readProviderKey(planner.provider);\n if (!apiKey) {\n throw new Error(\n `Missing ${providerEnvVar(planner.provider)}. Run \\`squad config set planner\\` to save a key to secrets, or export the env var, or run \\`squad new-plan --copy\\` without the API.`,\n );\n }\n\n const model = modelFor(planner.provider, 'plan', planner.modelOverride);\n const provider = providerFor(planner.provider);\n const budget = new Budget(planner.budget);\n\n ui.banner();\n ui.step(`planning ${story.feature} / ${story.id}`);\n ui.kv('provider', planner.provider);\n ui.kv('model', model);\n ui.kv(\n 'budget',\n `${planner.budget.maxFileReads} reads · ${(planner.budget.maxContextBytes / 1024).toFixed(0)} KB · ${planner.budget.maxDurationSeconds}s`,\n );\n ui.blank();\n\n const mapSpinner = ui.spinner('building repo map…');\n const repoMap = buildRepoMap(paths.root);\n mapSpinner.succeed(\n `repo map ready (${repoMap.split('\\n').length - 1} paths · ${(repoMap.length / 1024).toFixed(1)} KB)`,\n );\n\n ui.divider('planner session');\n\n const systemPrompt = composeSystemPrompt({\n projectRoots: config.project.projectRoots ?? ['.'],\n primaryLanguage: config.project.primaryLanguage ?? '',\n trackerType: config.tracker.type,\n repoMap,\n });\n const userPrompt = composeUserPrompt({ intakeContent: readFile(story.intakePath) });\n\n const sessionSpinner: { current: ReturnType<typeof ui.spinner> | null } = { current: null };\n const startedAt = Date.now();\n const cacheEnabled = planner.cache?.enabled ?? true;\n\n const result = await runPlanner({\n root: paths.root,\n provider,\n model,\n apiKey,\n systemPrompt,\n userPrompt,\n budget,\n cacheEnabled,\n onToolCall: (tc, bytes, total) => {\n const p = (tc.input as { path?: string }).path ?? '<unknown>';\n sessionSpinner.current?.succeed(\n `read ${p} (${(bytes / 1024).toFixed(1)} KB · ${(total / 1024).toFixed(1)} KB / ${(planner.budget.maxContextBytes / 1024).toFixed(0)} KB)`,\n );\n sessionSpinner.current = ui.spinner(`reading next file…`);\n },\n onAssistantText: () => {\n sessionSpinner.current?.succeed('planner thinking complete (this chunk)');\n sessionSpinner.current = ui.spinner('thinking…');\n },\n onRateLimit: (waitSec) => {\n sessionSpinner.current?.stop();\n ui.warning(`${planner.provider} rate limit hit — retrying in ${waitSec}s`);\n sessionSpinner.current = ui.spinner('waiting for rate limit to reset…');\n },\n });\n sessionSpinner.current?.stop();\n\n if (!result.planText.trim()) {\n throw new Error(\n 'Planner returned no plan text. Run `squad doctor` to check provider and models, or `squad new-plan --copy` to avoid the API.',\n );\n }\n\n const snap = budget.snapshot();\n const elapsedMs = Date.now() - startedAt;\n\n const header = buildMetadataHeader({\n provider: planner.provider,\n model,\n reads: snap.reads,\n bytes: snap.bytes,\n inputTokens: snap.usage.inputTokens,\n outputTokens: snap.usage.outputTokens,\n durationMs: elapsedMs,\n costUsd: snap.usage.costUsd,\n });\n\n const { planFile, sequenceNumber, overwrote } = writePlanFile({\n paths,\n config,\n story,\n planBodyMarkdown: result.planText,\n metadataHeader: header,\n });\n\n try {\n await writeLastRun(paths, {\n stats: result.stats,\n completedAt: new Date().toISOString(),\n provider: planner.provider,\n model,\n });\n } catch {\n // best-effort telemetry\n }\n\n ui.blank();\n ui.summaryBox(' plan generated ', [\n { key: 'file', value: path.relative(paths.root, planFile) },\n { key: 'nn', value: String(sequenceNumber).padStart(2, '0') },\n { key: 'model', value: `${planner.provider}/${model}` },\n { key: 'reads', value: `${snap.reads} files · ${(snap.bytes / 1024).toFixed(1)} KB` },\n {\n key: 'tokens',\n value: `${snap.usage.inputTokens} in · ${snap.usage.outputTokens} out${snap.usage.costUsd !== undefined ? ` ≈ $${snap.usage.costUsd.toFixed(2)}` : ''}`,\n },\n { key: 'cache', value: formatPlannerCacheLine({ cacheEnabled, stats: result.stats }) },\n { key: 'time', value: `${Math.round(elapsedMs / 1000)}s` },\n { key: 'action', value: overwrote ? 'overwrote existing plan' : 'new plan' },\n ]);\n\n if (result.budgetExhausted) ui.warning('Budget exhausted mid-plan. Review and, if needed, re-run with a larger budget.');\n if (result.timedOut) ui.warning('Planner timed out; plan may be incomplete.');\n if (!result.finishedNormally && !result.budgetExhausted && !result.timedOut) {\n ui.warning('Planner did not reach end_turn. Inspect the plan carefully.');\n }\n\n ui.blank();\n ui.info(`next → open a new agent chat and attach only ${path.basename(planFile)}`);\n}\n\nasync function emitCopyPrompt(\n story: StoryRecord,\n paths: SquadPaths,\n config: SquadConfig,\n clipboard: boolean,\n): Promise<void> {\n const intakeContent = readFile(story.intakePath);\n const metaPromptTemplate = readBundledPrompt('generate-plan.md');\n\n const composed = render(metaPromptTemplate, {\n projectRoots: (config.project.projectRoots ?? ['.']).join(', '),\n primaryLanguage: config.project.primaryLanguage ?? '',\n trackerType: config.tracker.type,\n intakeContent,\n });\n\n const promptFile = path.join(paths.squadDir, '.last-copy-prompt.md');\n fs.writeFileSync(promptFile, composed, 'utf8');\n const relPromptFile = path.relative(paths.root, promptFile);\n\n const bytes = Buffer.byteLength(composed, 'utf8');\n const estTokens = Math.round(bytes / 4);\n const clipResult = clipboard\n ? await copyToClipboard(composed)\n : { ok: false as const, reason: 'clipboard disabled (--no-clipboard)' };\n\n ui.blank();\n ui.divider('planner prompt ready');\n ui.kv('mode', 'copy-paste', 10);\n ui.kv('story', `${story.feature} / ${story.id}`, 10);\n ui.kv('prompt', relPromptFile, 10);\n ui.kv('size', `${formatKB(bytes)} · ~${formatCount(estTokens)} tokens (est)`, 10);\n if (clipResult.ok) {\n ui.kv('clipboard', `✓ copied via ${clipResult.tool}`, 10);\n } else {\n ui.kv('clipboard', `! ${clipResult.reason}`, 10);\n }\n\n printModelBanner(config);\n\n ui.blank();\n ui.step('Next:');\n ui.info('1) Open your agent chat (Cursor / Claude Code / Copilot / Gemini).');\n ui.info('2) Switch to a strong plan model (Opus 4.x / GPT-5.3 Codex thinking / Gemini deep-think).');\n if (clipResult.ok) {\n ui.info('3) Paste from clipboard and let the agent work. It will read files and write the plan itself.');\n } else {\n ui.info(`3) Open ${relPromptFile}, paste its contents into the agent chat, and let it work.`);\n }\n ui.info(\n `4) The agent writes the plan to .squad/plans/${story.feature}/<nn>-story-${story.id}.md. Review it, then open a fresh chat to implement (attach only the plan file).`,\n );\n}\n\nfunction formatKB(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nfunction formatCount(n: number): string {\n if (n < 1000) return String(n);\n return `${(n / 1000).toFixed(1)}k`;\n}\n\nfunction printModelBanner(config: SquadConfig): void {\n if (!ui.isInteractive()) return;\n ui.blank();\n ui.divider('paste into your agent');\n ui.info('Recommendation: switch to a strong planning model before pasting.');\n const agents = config.agents ?? [];\n const hint = (name: string, msg: string) => {\n if (agents.includes(name)) ui.kv(name, msg, 14);\n };\n hint('cursor', 'model picker → Claude Opus 4.x or GPT-5.3 Codex (thinking)');\n hint('claude-code', '/model claude-opus-4-x');\n hint('copilot', 'chat model picker → the strongest available reasoning model');\n hint('gemini', '/model gemini-deep-think (or the latest strongest)');\n if (agents.length === 0) {\n ui.info(' (any agent) pick the strongest planning model you have access to.');\n }\n ui.divider();\n ui.blank();\n}\n","import { spawn, spawnSync } from 'node:child_process';\n\nexport interface ClipboardResult {\n ok: boolean;\n /** Which clipboard tool was used (pbcopy, clip, wl-copy, xclip, xsel, termux-clipboard-set). */\n tool?: string;\n /** Human-readable reason when ok === false. */\n reason?: string;\n}\n\ninterface ClipboardCommand {\n command: string;\n args: string[];\n /** Called before use — returns a reason string if the tool is unavailable. */\n unavailableReason?: () => string | undefined;\n}\n\nexport async function copyToClipboard(text: string): Promise<ClipboardResult> {\n const candidates = clipboardCandidates();\n if (candidates.length === 0) {\n return { ok: false, reason: noCandidateReason() };\n }\n\n let lastReason: string | undefined;\n for (const cmd of candidates) {\n const reason = cmd.unavailableReason?.();\n if (reason) {\n lastReason = reason;\n continue;\n }\n const res = await tryCopy(cmd, text);\n if (res.ok) return res;\n lastReason = res.reason;\n }\n return { ok: false, reason: lastReason ?? 'no working clipboard tool found' };\n}\n\nfunction tryCopy(cmd: ClipboardCommand, text: string): Promise<ClipboardResult> {\n return new Promise((resolve) => {\n let child: ReturnType<typeof spawn>;\n try {\n child = spawn(cmd.command, cmd.args, { stdio: ['pipe', 'ignore', 'pipe'] });\n } catch (err) {\n resolve({ ok: false, reason: `${cmd.command} failed to spawn: ${(err as Error).message}` });\n return;\n }\n let stderr = '';\n child.stderr?.on('data', (chunk) => {\n stderr += chunk.toString();\n });\n child.on('error', (err) => {\n resolve({ ok: false, reason: `${cmd.command} spawn error: ${err.message}` });\n });\n child.on('close', (code) => {\n if (code === 0) {\n resolve({ ok: true, tool: cmd.command });\n } else {\n resolve({\n ok: false,\n reason: `${cmd.command} exited with code ${code}${stderr ? `: ${stderr.trim().slice(0, 200)}` : ''}`,\n });\n }\n });\n child.stdin?.write(text);\n child.stdin?.end();\n });\n}\n\nfunction clipboardCandidates(): ClipboardCommand[] {\n if (process.platform === 'darwin') {\n return [{ command: 'pbcopy', args: [] }];\n }\n if (process.platform === 'win32') {\n return [{ command: 'clip', args: [] }];\n }\n const out: ClipboardCommand[] = [];\n if (process.env.WAYLAND_DISPLAY) {\n out.push({ command: 'wl-copy', args: [], unavailableReason: hasBinary('wl-copy') });\n }\n if (process.env.DISPLAY) {\n out.push({ command: 'xclip', args: ['-selection', 'clipboard'], unavailableReason: hasBinary('xclip') });\n out.push({ command: 'xsel', args: ['--clipboard', '--input'], unavailableReason: hasBinary('xsel') });\n }\n if (process.env.TERMUX_VERSION) {\n out.push({ command: 'termux-clipboard-set', args: [], unavailableReason: hasBinary('termux-clipboard-set') });\n }\n return out;\n}\n\nfunction hasBinary(bin: string): () => string | undefined {\n return () => {\n const which = process.platform === 'win32' ? 'where' : 'which';\n const res = spawnSync(which, [bin], { stdio: 'ignore' });\n if (res.status === 0) return undefined;\n return `${bin} not found on PATH`;\n };\n}\n\nfunction noCandidateReason(): string {\n if (process.platform === 'linux') {\n if (!process.env.DISPLAY && !process.env.WAYLAND_DISPLAY && !process.env.TERMUX_VERSION) {\n return 'no display server detected (headless / SSH) — install xclip or xsel, or use the saved file';\n }\n return 'no clipboard tool detected — install xclip, xsel, or wl-copy';\n }\n return `no clipboard tool detected on ${process.platform}`;\n}\n","import path from 'node:path';\nimport type {\n ChatTurn,\n PlannerProvider,\n PlannerRunStats,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n ToolResult,\n Usage,\n} from './types.js';\nimport { Budget } from './budget.js';\nimport { READ_FILE_TOOL, readFileTool } from './tools.js';\nimport { rateLimitMessage } from './provider-errors.js';\nimport { prefixOf } from './providers/prefix.js';\nimport * as ui from '../ui/index.js';\n\n/**\n * Upper bound on the auto-retry wait. Chosen to cover the common Anthropic Tier 1 /\n * OpenAI free-tier \"wait 60-90s\" asks; anything longer means the org is badly over\n * quota and retrying would only burn another request, so we skip and surface guidance.\n */\nconst MAX_RATE_LIMIT_RETRY_SEC = 90;\n\nconst defaultSleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\nexport interface RunPlannerInput {\n root: string;\n provider: PlannerProvider;\n model: string;\n apiKey: string;\n systemPrompt: string;\n userPrompt: string;\n budget: Budget;\n onToolCall?: (tc: ToolCall, bytesLoaded: number, totalBytes: number) => void;\n onUsage?: (u: Usage) => void;\n onAssistantText?: (delta: string) => void;\n /** Invoked when the loop is about to sleep before retrying a 429. The arg is seconds. */\n onRateLimit?: (waitSec: number) => void;\n maxIterations?: number;\n /** When `false`, disables Anthropic prompt-cache markers. Default `true` when omitted. */\n cacheEnabled?: boolean;\n /** Test injection for `setTimeout`. Defaults to the real timer. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nexport interface RunPlannerOutput {\n planText: string;\n budgetExhausted: boolean;\n timedOut: boolean;\n finishedNormally: boolean;\n iterations: number;\n stats: PlannerRunStats;\n}\n\n/** @alias RunPlannerOutput — result object including aggregated cache telemetry from Story 03. */\nexport type RunPlannerResult = RunPlannerOutput;\n\nfunction buildPlannerRunStats(budget: Budget, turns: number, runStartedAt: number): PlannerRunStats {\n const u = budget.snapshot().usage;\n const cacheRead = u.cacheReadTokens ?? 0;\n const cacheCreate = u.cacheCreationTokens ?? 0;\n const inTok = u.inputTokens;\n const outTok = u.outputTokens;\n const totalInput = inTok + cacheRead;\n const cacheHitRatio = totalInput === 0 ? 0 : Math.round((cacheRead / totalInput) * 100) / 100;\n return {\n turns,\n inputTokens: inTok,\n outputTokens: outTok,\n cacheCreationTokens: cacheCreate,\n cacheReadTokens: cacheRead,\n cacheHitRatio,\n durationMs: Date.now() - runStartedAt,\n };\n}\n\nexport async function runPlanner(input: RunPlannerInput): Promise<RunPlannerOutput> {\n const runStartedAt = Date.now();\n const maxIter = input.maxIterations ?? 40;\n const turns: ChatTurn[] = [{ role: 'user', text: input.userPrompt }];\n let accumulatedText = '';\n let iterations = 0;\n let budgetExhausted = false;\n let finishedNormally = false;\n let prevRequestPrefix: string | undefined;\n\n while (iterations < maxIter) {\n iterations += 1;\n\n if (input.budget.timedOut()) {\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: true,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n };\n }\n if (input.budget.overCost()) {\n return {\n planText: accumulatedText,\n budgetExhausted: true,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n };\n }\n\n const request: ProviderRequest = {\n systemPrompt: input.systemPrompt,\n model: input.model,\n tools: [READ_FILE_TOOL],\n turns,\n apiKey: input.apiKey,\n maxOutputTokens: 8192,\n cacheEnabled: input.cacheEnabled ?? true,\n };\n\n if (\n process.env.NODE_ENV !== 'production' &&\n process.env.NODE_ENV !== 'test' &&\n prevRequestPrefix !== undefined\n ) {\n const currentPrefix = prefixOf(input.provider.name, request);\n if (!currentPrefix.startsWith(prevRequestPrefix)) {\n const byte = firstByteDiff(prevRequestPrefix, currentPrefix);\n ui.warning(\n `planner: prefix mutation at turn ${iterations}, byte ${byte} — caching will not hit.`,\n );\n }\n }\n\n let response = await input.provider.send(request);\n if (response.usage) {\n input.budget.recordUsage(response.usage);\n input.onUsage?.(response.usage);\n }\n\n let retriedRateLimit = false;\n let retrySkippedReason: 'retry_after_too_long' | undefined;\n if (response.stopReason === 'error' && response.errorKind === 'rate_limit') {\n const asked = response.retryAfterSec;\n if (asked !== undefined && asked > MAX_RATE_LIMIT_RETRY_SEC) {\n // Provider asked for longer than we're willing to block; a retry now would\n // fail inside the same window and burn a request. Skip straight to guidance.\n retrySkippedReason = 'retry_after_too_long';\n } else {\n const waitSec = Math.min(asked ?? 10, MAX_RATE_LIMIT_RETRY_SEC);\n input.onRateLimit?.(waitSec);\n await (input.sleep ?? defaultSleep)(waitSec * 1000);\n response = await input.provider.send(request);\n if (response.usage) {\n input.budget.recordUsage(response.usage);\n input.onUsage?.(response.usage);\n }\n retriedRateLimit = true;\n }\n }\n\n if (response.stopReason === 'error') {\n throw composePlannerError(input.provider.name, response, retriedRateLimit, retrySkippedReason);\n }\n\n prevRequestPrefix = prefixOf(input.provider.name, request);\n\n if (response.text) {\n accumulatedText += response.text;\n input.onAssistantText?.(response.text);\n }\n\n if (response.stopReason === 'max_tokens' && !response.toolCalls?.length) {\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n };\n }\n\n if (response.stopReason === 'end_turn' || !response.toolCalls?.length) {\n finishedNormally = true;\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n };\n }\n\n turns.push({\n role: 'assistant',\n text: response.text,\n toolCalls: response.toolCalls,\n });\n\n const toolResults: ToolResult[] = [];\n for (const tc of response.toolCalls) {\n if (tc.name !== READ_FILE_TOOL.name) {\n toolResults.push({ toolCallId: tc.id, content: `unknown tool \"${tc.name}\"`, isError: true });\n continue;\n }\n const before = input.budget.snapshot().bytes;\n const result = readFileTool(input.root, input.budget, tc.input);\n const after = input.budget.snapshot().bytes;\n input.onToolCall?.(tc, after - before, after);\n if (result.isError && (/budget/i.test(result.content) || /max file reads/i.test(result.content))) {\n budgetExhausted = true;\n }\n toolResults.push({ toolCallId: tc.id, content: result.content, isError: result.isError });\n }\n\n turns.push({ role: 'user', toolResults });\n\n if (budgetExhausted) {\n turns.push({\n role: 'user',\n text:\n 'Budget is exhausted. Finalise the plan with the information you already have. ' +\n 'Do not call any more tools. Output the complete plan markdown now.',\n });\n }\n }\n\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n };\n}\n\nexport function relativisePath(root: string, p: string): string {\n return path.relative(root, p) || p;\n}\n\nfunction firstByteDiff(a: string, b: string): number {\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i += 1) {\n if (a.charCodeAt(i) !== b.charCodeAt(i)) return i;\n }\n return n;\n}\n\nfunction composePlannerError(\n providerName: PlannerProvider['name'],\n response: ProviderResponse,\n retriedRateLimit: boolean,\n retrySkippedReason?: 'retry_after_too_long',\n): Error {\n if (response.errorKind === 'rate_limit') {\n return new Error(\n rateLimitMessage({\n provider: providerName,\n retryAfterSec: response.retryAfterSec,\n rawBody: response.rawError ?? '',\n retryAlreadyAttempted: retriedRateLimit,\n retrySkippedReason,\n maxRetrySec: MAX_RATE_LIMIT_RETRY_SEC,\n }),\n );\n }\n if (response.errorKind === 'model_not_found') {\n return new Error(response.rawError ?? 'planner: model not found');\n }\n const base = response.rawError ?? 'planner: provider error';\n return new Error(`${base} Run \\`squad doctor\\` to diagnose, or retry \\u2014 most 5xx errors are transient.`);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { Budget } from './budget.js';\nimport type { ToolSchema } from './types.js';\n\nexport const READ_FILE_TOOL: ToolSchema = {\n name: 'read_file',\n description:\n 'Read a UTF-8 text file from the project, returning its contents so you can plan against real code. ' +\n 'Paths must be relative to the project root. Binary files and files outside the project are refused. ' +\n 'You have a bounded context budget; prefer small, targeted reads.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['path'],\n properties: {\n path: { type: 'string', description: 'Repo-relative POSIX path.' },\n },\n },\n};\n\nexport interface ReadFileResult {\n content: string;\n isError: boolean;\n}\n\nconst MAX_BYTES_PER_READ = 32_000;\n\nexport function readFileTool(root: string, budget: Budget, input: unknown): ReadFileResult {\n const raw = (input as { path?: unknown })?.path;\n if (typeof raw !== 'string' || raw.length === 0) {\n return error('read_file: missing or invalid \"path\" argument.');\n }\n\n const resolved = path.resolve(root, raw);\n const relCheck = path.relative(root, resolved);\n if (relCheck.startsWith('..') || path.isAbsolute(relCheck)) {\n return error(`read_file: path \"${raw}\" escapes the project root and was refused.`);\n }\n if (!fs.existsSync(resolved)) {\n return error(`read_file: not found \"${raw}\".`);\n }\n const stat = fs.statSync(resolved);\n if (stat.isDirectory()) {\n return error(`read_file: \"${raw}\" is a directory. Ask for a specific file path.`);\n }\n if (stat.size > MAX_BYTES_PER_READ) {\n return error(\n `read_file: \"${raw}\" is ${stat.size} bytes (> ${MAX_BYTES_PER_READ}). Ask for a smaller file or a specific range.`,\n );\n }\n\n const capacity = budget.canRead(stat.size);\n if (!capacity.ok) {\n return error(`read_file: ${capacity.reason}. Finalise the plan with what you already have.`);\n }\n\n let buf: Buffer;\n try {\n buf = fs.readFileSync(resolved);\n } catch (e) {\n return error(`read_file: failed to read \"${raw}\" (${(e as Error).message}).`);\n }\n\n if (looksBinary(buf)) {\n return error(`read_file: \"${raw}\" looks binary and was refused.`);\n }\n\n budget.recordRead(stat.size);\n return { content: buf.toString('utf8'), isError: false };\n}\n\nfunction error(msg: string): ReadFileResult {\n return { content: msg, isError: true };\n}\n\nfunction looksBinary(buf: Buffer): boolean {\n const sample = buf.subarray(0, Math.min(buf.length, 8000));\n for (const b of sample) {\n if (b === 0) return true;\n }\n return false;\n}\n","import type { ProviderName } from './types.js';\n\nexport interface ModelNotFoundError {\n provider: ProviderName;\n model: string;\n status: number;\n rawBody: string;\n}\n\n/**\n * Detect the \"model not found\" shape across providers. Returns a `ModelNotFoundError` when\n * the response matches, or `undefined` otherwise.\n *\n * Shapes detected:\n * Anthropic: 404 with body.error.type === 'not_found_error' OR body text containing \"model:\"\n * OpenAI: 404 with body.error.code === 'model_not_found'\n * Google: 404 with body.error.status === 'NOT_FOUND' containing the model name\n */\nexport function detectModelNotFound(\n provider: ProviderName,\n model: string,\n status: number,\n rawBody: string,\n): ModelNotFoundError | undefined {\n if (status !== 404) return undefined;\n const body = rawBody.toLowerCase();\n const hints = ['not_found_error', 'model_not_found', 'not_found', 'model:'];\n if (!hints.some((h) => body.includes(h))) return undefined;\n return { provider, model, status, rawBody };\n}\n\n/**\n * Build the user-facing message. Kept as a separate function so callers can choose whether\n * to embed it in a thrown Error (from the provider adapter) or render via ui.failure.\n */\nexport function modelNotFoundMessage(err: ModelNotFoundError): string {\n return [\n `The ${err.provider} planner model \"${err.model}\" is no longer available.`,\n '',\n 'Recovery options:',\n ` 1. Run \\`squad upgrade\\` to install a newer squad-kit (or install manually from npm).`,\n ` 2. Run \\`squad config set planner --provider openai\\` (or another \\`--provider\\`) to switch models via a different provider, then save a key when prompted.`,\n ` 3. Run \\`squad config set planner\\` to set \\`planner.modelOverride.${err.provider}\\` to a still-valid id (no raw YAML), then \\`squad doctor\\` to confirm.`,\n '',\n `Raw provider response: ${err.rawBody.slice(0, 200)}`,\n ].join('\\n');\n}\n\n/** Headers look-up that accepts both fetch `Headers` and plain records. */\nexport type HeadersLike = Headers | Record<string, string | null | undefined>;\n\nexport interface RateLimitError {\n provider: ProviderName;\n status: 429;\n /** Seconds until the provider expects us to retry, if it told us. */\n retryAfterSec?: number;\n rawBody: string;\n}\n\n/**\n * Detect a 429 rate-limit response. Returns a `RateLimitError` when the status is 429,\n * populating `retryAfterSec` from the `Retry-After` header (seconds or HTTP-date) or from\n * Google's body-level `retryDelay: \"30s\"` field. Returns `undefined` for any other status.\n */\nexport function detectRateLimit(\n provider: ProviderName,\n status: number,\n headers: HeadersLike,\n rawBody: string,\n): RateLimitError | undefined {\n if (status !== 429) return undefined;\n return {\n provider,\n status: 429,\n retryAfterSec: parseRetryAfter(headers, rawBody),\n rawBody,\n };\n}\n\nfunction parseRetryAfter(headers: HeadersLike, body: string): number | undefined {\n const raw = headerGet(headers, 'retry-after');\n if (raw) {\n const sec = Number(raw);\n if (Number.isFinite(sec) && sec >= 0) return Math.ceil(sec);\n const asDate = Date.parse(raw);\n if (Number.isFinite(asDate)) {\n return Math.max(0, Math.ceil((asDate - Date.now()) / 1000));\n }\n }\n const bodyMatch = /\"retryDelay\"\\s*:\\s*\"(\\d+)(?:\\.\\d+)?s\"/i.exec(body);\n if (bodyMatch) {\n const sec = Number(bodyMatch[1]);\n if (Number.isFinite(sec) && sec >= 0) return sec;\n }\n return undefined;\n}\n\nfunction headerGet(h: HeadersLike, name: string): string | null {\n if (typeof (h as Headers).get === 'function') {\n return (h as Headers).get(name);\n }\n const key = name.toLowerCase();\n const rec = h as Record<string, string | null | undefined>;\n for (const k of Object.keys(rec)) {\n if (k.toLowerCase() === key) return rec[k] ?? null;\n }\n return null;\n}\n\nexport interface RateLimitMessageInput {\n provider: ProviderName;\n retryAfterSec?: number;\n rawBody: string;\n /** True when squad-kit already retried once and got rate-limited again. */\n retryAlreadyAttempted?: boolean;\n /**\n * Set when the loop deliberately did not retry. Currently only one reason:\n * the provider asked for longer than our retry cap.\n */\n retrySkippedReason?: 'retry_after_too_long';\n /** The retry cap in seconds, used in the skipped-retry sentence. */\n maxRetrySec?: number;\n}\n\n/**\n * User-facing rate-limit message. Composed by the loop when rate-limit retry has been\n * exhausted. Callers in the provider adapters set `errorKind: 'rate_limit'` and let the\n * loop compose this message so the \"already retried\" sentence reflects reality.\n */\nexport function rateLimitMessage(err: RateLimitMessageInput): string {\n const waitHint = err.retryAfterSec ?? 60;\n const limitsUrl: Record<ProviderName, string> = {\n anthropic: 'https://console.anthropic.com/settings/limits',\n openai: 'https://platform.openai.com/settings/organization/limits',\n google: 'https://aistudio.google.com/app/plan_information',\n };\n const headline = err.retryAfterSec\n ? `${err.provider} rate limit hit \\u2014 provider asked us to wait ${err.retryAfterSec}s before retrying.`\n : `${err.provider} rate limit hit.`;\n const cap = err.maxRetrySec ?? 90;\n const retried = err.retrySkippedReason === 'retry_after_too_long'\n ? `squad-kit did not auto-retry: the provider's ${err.retryAfterSec}s wait is longer than our ${cap}s cap, so retrying would just burn another request inside the same throttle window.`\n : err.retryAlreadyAttempted\n ? 'squad-kit already retried once automatically and was throttled again \\u2014 your org is firmly over its per-minute quota.'\n : 'squad-kit aborted before retrying.';\n return [\n headline,\n retried,\n '',\n 'Recovery options:',\n ` 1. Wait ${waitHint}s and rerun \\`squad new-plan --api\\`. Per-minute limits reset quickly.`,\n ` 2. Switch to a smaller planner model: \\`squad config set planner\\` (pick a cheaper model id).`,\n ` 3. Tighten \\`planner.budget\\` in \\`.squad/config.yaml\\` (smaller \\`maxContextBytes\\` / \\`maxFileReads\\`) so each request carries fewer tokens.`,\n ` 4. Upgrade your ${err.provider} tier: ${limitsUrl[err.provider]}.`,\n '',\n 'Full runbook: docs/migrating-from-0.1.md (see \\u00a78. If something goes wrong).',\n '',\n `Raw provider response: ${err.rawBody.slice(0, 200)}`,\n ].join('\\n');\n}\n","/**\n * Recursively sort object keys for deterministic JSON.stringify of nested records.\n * Arrays are preserved; only plain objects (not null, not array) are sorted.\n */\nexport function sortRecordKeys<T>(v: T): T {\n if (v === null || typeof v !== 'object') return v;\n if (Array.isArray(v)) return v.map((x) => sortRecordKeys(x)) as T;\n const o = v as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(o).sort()) {\n out[k] = sortRecordKeys(o[k]);\n }\n return out as T;\n}\n","import type {\n ChatTurn,\n PlannerProvider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n ToolSchema,\n} from '../types.js';\nimport { sortRecordKeys } from '../stable-json.js';\nimport {\n detectModelNotFound,\n detectRateLimit,\n modelNotFoundMessage,\n} from '../provider-errors.js';\n\nconst API_URL = 'https://api.anthropic.com/v1/messages';\nconst API_VERSION = '2023-06-01';\n\ntype AnthropicSystemTextBlock = {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n};\n\ntype AnthropicContentBlock = Record<string, unknown>;\n\ntype AnthropicMessageWire = {\n role: 'assistant' | 'user';\n content: AnthropicContentBlock[];\n};\n\n/**\n * Request JSON sent to the Anthropic messages API. When `turns` is empty, `messages` is\n * omitted so cache-prefix comparisons treat the static header as a literal string prefix\n * of longer requests; `callAnthropic` re-adds `messages: []` for the wire.\n */\nexport type AnthropicRequestBody = {\n model: string;\n max_tokens: number;\n system: string | AnthropicSystemTextBlock[];\n tools: ReturnType<typeof toAnthropicTool>[];\n messages?: AnthropicMessageWire[];\n};\n\nexport const anthropicProvider: PlannerProvider = {\n name: 'anthropic',\n async send(req) {\n return callAnthropic(req);\n },\n};\n\nexport function buildAnthropicBody(req: ProviderRequest): AnthropicRequestBody {\n if (req.cacheEnabled === false) {\n const base: AnthropicRequestBody = {\n model: req.model,\n max_tokens: req.maxOutputTokens ?? 4096,\n system: req.systemPrompt,\n tools: req.tools.map(toAnthropicTool),\n };\n if (req.turns.length === 0) {\n return base;\n }\n return { ...base, messages: req.turns.map((t) => toAnthropicMessage(t)) };\n }\n\n const base: AnthropicRequestBody = {\n model: req.model,\n max_tokens: req.maxOutputTokens ?? 4096,\n system: [\n {\n type: 'text',\n text: req.systemPrompt,\n cache_control: { type: 'ephemeral' },\n },\n ],\n tools: req.tools.map(toAnthropicTool),\n };\n if (req.turns.length === 0) {\n return base;\n }\n return { ...base, messages: toMessagesWithCacheMarkers(req.turns) };\n}\n\nexport async function callAnthropic(req: ProviderRequest): Promise<ProviderResponse> {\n const built = buildAnthropicBody(req);\n const body: AnthropicRequestBody = { ...built, messages: built.messages ?? [] };\n\n const res = await fetch(API_URL, {\n method: 'POST',\n headers: {\n 'x-api-key': req.apiKey,\n 'anthropic-version': API_VERSION,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n const nf = detectModelNotFound('anthropic', req.model, res.status, text);\n if (nf) {\n return {\n stopReason: 'error',\n rawError: modelNotFoundMessage(nf),\n errorKind: 'model_not_found',\n };\n }\n const rl = detectRateLimit('anthropic', res.status, res.headers, text);\n if (rl) {\n return {\n stopReason: 'error',\n rawError: `anthropic 429: ${text.slice(0, 500)}`,\n errorKind: 'rate_limit',\n retryAfterSec: rl.retryAfterSec,\n };\n }\n return { stopReason: 'error', rawError: `anthropic ${res.status}: ${text.slice(0, 500)}` };\n }\n\n const json = (await res.json()) as AnthropicResponse;\n const textOut = json.content\n .filter((b) => b.type === 'text')\n .map((b) => b.text)\n .join('');\n const toolCalls: ToolCall[] = json.content\n .filter((b): b is AnthropicToolUseBlock => b.type === 'tool_use')\n .map((b) => ({ id: b.id, name: b.name, input: b.input }));\n\n return {\n text: textOut || undefined,\n toolCalls: toolCalls.length ? toolCalls : undefined,\n stopReason: mapStop(json.stop_reason),\n usage: {\n inputTokens: json.usage?.input_tokens ?? 0,\n outputTokens: json.usage?.output_tokens ?? 0,\n cacheCreationTokens: json.usage?.cache_creation_input_tokens ?? 0,\n cacheReadTokens: json.usage?.cache_read_input_tokens ?? 0,\n },\n };\n}\n\nfunction toMessagesWithCacheMarkers(turns: ChatTurn[]): AnthropicMessageWire[] {\n let lastUserWithToolResultIdx = -1;\n for (let i = turns.length - 1; i >= 0; i -= 1) {\n const t = turns[i]!;\n if (t.role === 'user' && hasToolResultBlock(t)) {\n lastUserWithToolResultIdx = i;\n break;\n }\n }\n\n return turns.map((turn, idx) => {\n const message = toAnthropicMessage(turn);\n if (idx === lastUserWithToolResultIdx) {\n return attachCacheControlToLastToolResult(message);\n }\n return message;\n });\n}\n\nfunction hasToolResultBlock(turn: ChatTurn): boolean {\n return (turn.toolResults?.length ?? 0) > 0;\n}\n\nfunction attachCacheControlToLastToolResult(msg: AnthropicMessageWire): AnthropicMessageWire {\n const content = [...msg.content];\n for (let i = content.length - 1; i >= 0; i -= 1) {\n const block = content[i] as { type?: string };\n if (block.type === 'tool_result') {\n content[i] = { ...block, cache_control: { type: 'ephemeral' } };\n break;\n }\n }\n return { ...msg, content };\n}\n\nfunction toAnthropicTool(t: ToolSchema) {\n return {\n name: t.name,\n description: t.description,\n input_schema: sortRecordKeys(t.inputSchema) as Record<string, unknown>,\n };\n}\n\nfunction toAnthropicMessage(turn: ChatTurn): AnthropicMessageWire {\n const blocks: AnthropicContentBlock[] = [];\n if (turn.text) blocks.push({ type: 'text', text: turn.text });\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n blocks.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: sortRecordKeys(tc.input) as Record<string, unknown>,\n });\n }\n }\n if (turn.toolResults) {\n for (const tr of turn.toolResults) {\n blocks.push({\n type: 'tool_result',\n tool_use_id: tr.toolCallId,\n content: tr.content,\n is_error: tr.isError ?? false,\n });\n }\n }\n return { role: turn.role === 'assistant' ? 'assistant' : 'user', content: blocks };\n}\n\nfunction mapStop(r: string | undefined): ProviderResponse['stopReason'] {\n if (r === 'tool_use') return 'tool_use';\n if (r === 'max_tokens') return 'max_tokens';\n return 'end_turn';\n}\n\ninterface AnthropicResponse {\n content: Array<AnthropicTextBlock | AnthropicToolUseBlock>;\n stop_reason: string;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\ninterface AnthropicTextBlock {\n type: 'text';\n text: string;\n}\ninterface AnthropicToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n","import type {\n ChatTurn,\n PlannerProvider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n ToolSchema,\n} from '../types.js';\nimport { sortRecordKeys } from '../stable-json.js';\nimport {\n detectModelNotFound,\n detectRateLimit,\n modelNotFoundMessage,\n} from '../provider-errors.js';\n\nconst API_URL = 'https://api.openai.com/v1/chat/completions';\n\n/**\n * When `turns` is empty, `messages` is omitted from the object so prefix helpers can treat\n * the static header as a string prefix; `callOpenAI` injects a single system message for the\n * real POST.\n */\nexport type OpenAIRequestBody = {\n model: string;\n max_completion_tokens: number;\n tools: ReturnType<typeof toOpenAITool>[];\n messages?: unknown[];\n};\n\nexport const openaiProvider: PlannerProvider = {\n name: 'openai',\n async send(req) {\n return callOpenAI(req);\n },\n};\n\nexport function buildOpenAIBody(req: ProviderRequest): OpenAIRequestBody {\n const base: OpenAIRequestBody = {\n model: req.model,\n max_completion_tokens: req.maxOutputTokens ?? 4096,\n tools: req.tools.map(toOpenAITool),\n };\n if (req.turns.length === 0) {\n return base;\n }\n const messages: unknown[] = [{ role: 'system', content: req.systemPrompt }];\n for (const turn of req.turns) messages.push(...toOpenAIMessages(turn));\n return { ...base, messages };\n}\n\nexport async function callOpenAI(req: ProviderRequest): Promise<ProviderResponse> {\n const built = buildOpenAIBody(req);\n const messages: unknown[] =\n built.messages && built.messages.length > 0\n ? (built.messages as unknown[])\n : [{ role: 'system', content: req.systemPrompt }];\n\n const body = { ...built, messages };\n\n const res = await fetch(API_URL, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${req.apiKey}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n const nf = detectModelNotFound('openai', req.model, res.status, text);\n if (nf) {\n return {\n stopReason: 'error',\n rawError: modelNotFoundMessage(nf),\n errorKind: 'model_not_found',\n };\n }\n const rl = detectRateLimit('openai', res.status, res.headers, text);\n if (rl) {\n return {\n stopReason: 'error',\n rawError: `openai 429: ${text.slice(0, 500)}`,\n errorKind: 'rate_limit',\n retryAfterSec: rl.retryAfterSec,\n };\n }\n return { stopReason: 'error', rawError: `openai ${res.status}: ${text.slice(0, 500)}` };\n }\n\n const json = (await res.json()) as OpenAIResponse;\n const choice = json.choices?.[0];\n if (!choice) return { stopReason: 'error', rawError: 'openai: empty choices' };\n\n const textOut = choice.message.content ?? '';\n const toolCalls: ToolCall[] = (choice.message.tool_calls ?? []).map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n input: safeJson(tc.function.arguments),\n }));\n\n return {\n text: textOut || undefined,\n toolCalls: toolCalls.length ? toolCalls : undefined,\n stopReason: mapStop(choice.finish_reason),\n usage: {\n inputTokens: json.usage?.prompt_tokens ?? 0,\n outputTokens: json.usage?.completion_tokens ?? 0,\n },\n };\n}\n\nfunction toOpenAITool(t: ToolSchema) {\n return {\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: sortRecordKeys(t.inputSchema) as Record<string, unknown>,\n },\n };\n}\n\nfunction toOpenAIMessages(turn: ChatTurn): unknown[] {\n const out: unknown[] = [];\n if (turn.role === 'assistant') {\n out.push({\n role: 'assistant',\n content: turn.text ?? null,\n tool_calls: turn.toolCalls?.map((tc) => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: JSON.stringify(sortRecordKeys(tc.input) as Record<string, unknown>),\n },\n })),\n });\n } else {\n if (turn.text) out.push({ role: 'user', content: turn.text });\n if (turn.toolResults) {\n for (const tr of turn.toolResults) {\n out.push({ role: 'tool', tool_call_id: tr.toolCallId, content: tr.content });\n }\n }\n }\n return out;\n}\n\nfunction mapStop(r: string | undefined): ProviderResponse['stopReason'] {\n if (r === 'tool_calls') return 'tool_use';\n if (r === 'length') return 'max_tokens';\n return 'end_turn';\n}\n\nfunction safeJson(raw: string): Record<string, unknown> {\n try {\n return sortRecordKeys(JSON.parse(raw) as Record<string, unknown>);\n } catch {\n return {};\n }\n}\n\ninterface OpenAIResponse {\n choices: Array<{\n message: {\n content: string | null;\n tool_calls?: Array<{ id: string; type: 'function'; function: { name: string; arguments: string } }>;\n };\n finish_reason: string;\n }>;\n usage?: { prompt_tokens: number; completion_tokens: number };\n}\n","import type {\n ChatTurn,\n PlannerProvider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n ToolSchema,\n} from '../types.js';\nimport { sortRecordKeys } from '../stable-json.js';\nimport {\n detectModelNotFound,\n detectRateLimit,\n modelNotFoundMessage,\n} from '../provider-errors.js';\n\nconst API_BASE = 'https://generativelanguage.googleapis.com/v1beta/models';\n\n/**\n * `contents` is last (optional) for cache-prefix string prefixing; it is omitted when `turns`\n * is empty. `callGoogle` adds `contents: []` on the wire when missing.\n */\nexport type GoogleRequestBody = {\n system_instruction: { parts: Array<{ text: string }> };\n tools?: Array<{ functionDeclarations: ReturnType<typeof toGoogleTool>[] }>;\n generationConfig: { maxOutputTokens: number };\n contents?: ReturnType<typeof toGoogleContent>[];\n};\n\nexport const googleProvider: PlannerProvider = {\n name: 'google',\n async send(req) {\n return callGoogle(req);\n },\n};\n\nexport function buildGoogleBody(req: ProviderRequest): GoogleRequestBody {\n const base: GoogleRequestBody = {\n system_instruction: { parts: [{ text: req.systemPrompt }] },\n generationConfig: { maxOutputTokens: req.maxOutputTokens ?? 4096 },\n };\n if (req.tools.length) {\n base.tools = [{ functionDeclarations: req.tools.map(toGoogleTool) }];\n }\n if (req.turns.length === 0) {\n return base;\n }\n return { ...base, contents: req.turns.map(toGoogleContent) };\n}\n\nexport async function callGoogle(req: ProviderRequest): Promise<ProviderResponse> {\n const url = `${API_BASE}/${encodeURIComponent(req.model)}:generateContent?key=${encodeURIComponent(req.apiKey)}`;\n\n const built = buildGoogleBody(req);\n const body: GoogleRequestBody = { ...built, contents: built.contents ?? [] };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n const nf = detectModelNotFound('google', req.model, res.status, text);\n if (nf) {\n return {\n stopReason: 'error',\n rawError: modelNotFoundMessage(nf),\n errorKind: 'model_not_found',\n };\n }\n const rl = detectRateLimit('google', res.status, res.headers, text);\n if (rl) {\n return {\n stopReason: 'error',\n rawError: `google 429: ${text.slice(0, 500)}`,\n errorKind: 'rate_limit',\n retryAfterSec: rl.retryAfterSec,\n };\n }\n return { stopReason: 'error', rawError: `google ${res.status}: ${text.slice(0, 500)}` };\n }\n\n const json = (await res.json()) as GoogleResponse;\n const cand = json.candidates?.[0];\n if (!cand) return { stopReason: 'error', rawError: 'google: empty candidates' };\n\n const parts = cand.content?.parts ?? [];\n const textOut = parts\n .filter((p): p is GoogleTextPart => 'text' in p && !!p.text)\n .map((p) => p.text)\n .join('');\n const toolCalls: ToolCall[] = parts\n .filter((p): p is GoogleFunctionCallPart => 'functionCall' in p && !!p.functionCall)\n .map((p, i) => ({\n id: `gcall_${i}_${p.functionCall.name}`,\n name: p.functionCall.name,\n input: p.functionCall.args ? (sortRecordKeys(p.functionCall.args) as Record<string, unknown>) : {},\n }));\n\n return {\n text: textOut || undefined,\n toolCalls: toolCalls.length ? toolCalls : undefined,\n stopReason: mapStop(cand.finishReason),\n usage: {\n inputTokens: json.usageMetadata?.promptTokenCount ?? 0,\n outputTokens: json.usageMetadata?.candidatesTokenCount ?? 0,\n },\n };\n}\n\nfunction toGoogleTool(t: ToolSchema) {\n return { name: t.name, description: t.description, parameters: sortRecordKeys(t.inputSchema) as Record<string, unknown> };\n}\n\nfunction toGoogleContent(turn: ChatTurn) {\n const role = turn.role === 'assistant' ? 'model' : 'user';\n const parts: unknown[] = [];\n if (turn.text) parts.push({ text: turn.text });\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n parts.push({ functionCall: { name: tc.name, args: sortRecordKeys(tc.input) as Record<string, unknown> } });\n }\n }\n if (turn.toolResults) {\n for (const tr of turn.toolResults) {\n parts.push({\n functionResponse: { name: nameFromToolCallId(tr.toolCallId), response: { content: tr.content } },\n });\n }\n }\n return { role, parts };\n}\n\nfunction nameFromToolCallId(id: string): string {\n const m = id.match(/^gcall_\\d+_(.+)$/);\n return m?.[1] ?? 'read_file';\n}\n\nfunction mapStop(r: string | undefined): ProviderResponse['stopReason'] {\n if (r === 'STOP' || r === 'END_OF_TURN' || r === 'FINISH_REASON_STOP') return 'end_turn';\n if (r === 'MAX_TOKENS') return 'max_tokens';\n return 'tool_use';\n}\n\ninterface GoogleResponse {\n candidates?: Array<{\n content?: { parts?: Array<GoogleTextPart | GoogleFunctionCallPart> };\n finishReason?: string;\n }>;\n usageMetadata?: { promptTokenCount: number; candidatesTokenCount: number };\n}\ninterface GoogleTextPart {\n text: string;\n}\ninterface GoogleFunctionCallPart {\n functionCall: { name: string; args?: Record<string, unknown> };\n}\n","import { buildAnthropicBody } from './anthropic.js';\nimport { buildOpenAIBody } from './openai.js';\nimport { buildGoogleBody } from './google.js';\nimport type { ProviderName, ProviderRequest } from '../types.js';\n\n/**\n * Return a string suitable for comparing cacheable request prefixes across turns: the full\n * JSON for the provider body after removing the last chat turn, with the terminal `}` stripped\n * so a shorter request's prefix is a literal substring prefix of a longer one when new fields\n * are appended (e.g. `messages` / `contents`) in deterministic `build*Body` order.\n */\nexport function prefixOf(provider: ProviderName, req: ProviderRequest): string {\n const trimmed: ProviderRequest = { ...req, turns: req.turns.slice(0, -1) };\n const s = (() => {\n switch (provider) {\n case 'anthropic':\n return JSON.stringify(buildAnthropicBody(trimmed));\n case 'openai':\n return JSON.stringify(buildOpenAIBody(trimmed));\n case 'google':\n return JSON.stringify(buildGoogleBody(trimmed));\n }\n })();\n return s.length > 0 ? s.slice(0, -1) : s;\n}\n","import type { PlannerProvider, ProviderName } from '../types.js';\nimport { anthropicProvider } from './anthropic.js';\nimport { openaiProvider } from './openai.js';\nimport { googleProvider } from './google.js';\n\nexport function providerFor(name: ProviderName): PlannerProvider {\n switch (name) {\n case 'anthropic':\n return anthropicProvider;\n case 'openai':\n return openaiProvider;\n case 'google':\n return googleProvider;\n }\n}\n\nexport { anthropicProvider, openaiProvider, googleProvider };\n","import type { BudgetConfig, Usage } from './types.js';\n\nexport class Budget {\n private reads = 0;\n private bytes = 0;\n private readonly startedAt = Date.now();\n private totalUsage: Usage = { inputTokens: 0, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0 };\n\n constructor(public readonly cfg: BudgetConfig) {}\n\n canRead(nextFileBytes: number): { ok: boolean; reason?: string } {\n if (this.reads >= this.cfg.maxFileReads) {\n return { ok: false, reason: `max file reads (${this.cfg.maxFileReads}) reached` };\n }\n if (this.bytes + nextFileBytes > this.cfg.maxContextBytes) {\n return { ok: false, reason: `context budget (${this.cfg.maxContextBytes} bytes) would be exceeded` };\n }\n return { ok: true };\n }\n\n recordRead(bytes: number): void {\n this.reads += 1;\n this.bytes += bytes;\n }\n\n recordUsage(u: Usage): void {\n this.totalUsage.inputTokens += u.inputTokens;\n this.totalUsage.outputTokens += u.outputTokens;\n if (u.costUsd !== undefined) this.totalUsage.costUsd = (this.totalUsage.costUsd ?? 0) + u.costUsd;\n this.totalUsage.cacheCreationTokens = (this.totalUsage.cacheCreationTokens ?? 0) + (u.cacheCreationTokens ?? 0);\n this.totalUsage.cacheReadTokens = (this.totalUsage.cacheReadTokens ?? 0) + (u.cacheReadTokens ?? 0);\n }\n\n timedOut(): boolean {\n return (Date.now() - this.startedAt) / 1000 > this.cfg.maxDurationSeconds;\n }\n\n overCost(): boolean {\n if (this.cfg.maxCostUsd === undefined) return false;\n return (this.totalUsage.costUsd ?? 0) > this.cfg.maxCostUsd;\n }\n\n snapshot() {\n return {\n reads: this.reads,\n bytes: this.bytes,\n elapsedMs: Date.now() - this.startedAt,\n usage: { ...this.totalUsage },\n };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport ignore, { type Ignore } from 'ignore';\n\nexport interface RepoMapOptions {\n maxEntries?: number; // safety cap on total paths returned\n includeHidden?: boolean;\n}\n\nconst DEFAULT_IGNORES = [\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'coverage',\n '.next',\n '.turbo',\n '.cache',\n '.squad/plans', // don't include existing plans as context; planner will see them separately\n];\n\nexport function buildRepoMap(root: string, opts: RepoMapOptions = {}): string {\n const maxEntries = opts.maxEntries ?? 5000;\n const ig = buildIgnore(root);\n const entries: string[] = [];\n walk(root, root, ig, entries, maxEntries, !!opts.includeHidden);\n entries.sort();\n return entries.join('\\n') + '\\n';\n}\n\nfunction buildIgnore(root: string): Ignore {\n const ig = ignore().add(DEFAULT_IGNORES);\n const gitignore = path.join(root, '.gitignore');\n if (fs.existsSync(gitignore)) {\n try {\n ig.add(fs.readFileSync(gitignore, 'utf8'));\n } catch {\n /* ignore */\n }\n }\n return ig;\n}\n\nfunction walk(root: string, dir: string, ig: Ignore, out: string[], max: number, includeHidden: boolean): void {\n if (out.length >= max) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (out.length >= max) return;\n if (!includeHidden && entry.name.startsWith('.') && entry.name !== '.squad') continue;\n\n const abs = path.join(dir, entry.name);\n const rel = path.relative(root, abs);\n if (!rel || ig.ignores(rel) || (entry.isDirectory() && ig.ignores(rel + '/'))) continue;\n\n if (entry.isDirectory()) {\n walk(root, abs, ig, out, max, includeHidden);\n } else if (entry.isFile()) {\n out.push(rel);\n }\n }\n}\n","import { readBundledPrompt } from '../utils/fs.js';\n\nexport function composeSystemPrompt(args: {\n projectRoots: string[];\n primaryLanguage: string;\n trackerType: string;\n repoMap: string;\n}): string {\n const base = readBundledPrompt('generate-plan.md')\n .replace(/\\{\\{projectRoots\\}\\}/g, args.projectRoots.join(', '))\n .replace(/\\{\\{primaryLanguage\\}\\}/g, args.primaryLanguage)\n .replace(/\\{\\{trackerType\\}\\}/g, args.trackerType)\n .replace(\n /\\{\\{intakeContent\\}\\}/g,\n '_(The intake story is provided in the user message below. Do not ask for it.)_',\n );\n\n const apiPreamble = [\n '',\n '---',\n '',\n '## Direct-API mode notes',\n '',\n 'You are being invoked by the squad-kit CLI, not by a human editor. The intake is already inlined below.',\n 'The repository tree is provided. To see the contents of any file, **call the `read_file` tool** with a repo-relative path.',\n 'You have a bounded context budget (file reads, total bytes, wall-clock time). Read files you genuinely need.',\n 'When you have enough information, output the **complete plan markdown** as your final assistant message. No prose around it, no code fences wrapping the whole plan. The CLI will write your final message verbatim to disk.',\n '',\n '## Repository tree',\n '',\n '```',\n args.repoMap.trimEnd(),\n '```',\n '',\n ].join('\\n');\n\n return base + apiPreamble;\n}\n\nexport function composeUserPrompt(args: { intakeContent: string }): string {\n return [\n 'Produce the implementation plan for the following intake.',\n '',\n '---',\n '',\n args.intakeContent.trimEnd(),\n '',\n ].join('\\n');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { slugify, type SquadPaths } from '../core/paths.js';\nimport { formatSequence, scanPlans } from '../core/sequence.js';\nimport type { SquadConfig } from '../core/config.js';\nimport type { StoryRecord } from '../core/stories.js';\nimport { trackerIdForFilename } from '../core/tracker.js';\n\nexport interface WritePlanInput {\n paths: SquadPaths;\n config: SquadConfig;\n story: StoryRecord;\n planBodyMarkdown: string;\n metadataHeader: string;\n}\n\nexport interface WritePlanOutput {\n planFile: string;\n sequenceNumber: number;\n overwrote: boolean;\n}\n\n/** Concurrent runs against the same intake can race on overview / sequence; callers should serialize if needed. */\nexport function writePlanFile(input: WritePlanInput): WritePlanOutput {\n const { paths, config, story } = input;\n\n const featurePlanDir = path.join(paths.plansDir, story.feature);\n fs.mkdirSync(featurePlanDir, { recursive: true });\n\n const existing = findExistingPlan(featurePlanDir, story.id);\n let targetPath: string;\n let nn: number;\n let overwrote = false;\n\n if (existing) {\n targetPath = existing.absPath;\n nn = existing.nn;\n overwrote = true;\n } else {\n nn = scanPlans(paths.plansDir).nextGlobal;\n const titleHintSlug = story.titleHint ? slugify(story.titleHint) : '';\n const baseSlug = titleHintSlug || slugify(story.id);\n const trackerId =\n config.naming.includeTrackerId && config.tracker.type !== 'none'\n ? trackerIdForFilename(config.tracker.type, story.id)\n : '';\n // Avoid duplicating the id when there's no titleHint — baseSlug would already equal trackerId.\n const trackerPart = trackerId && trackerId !== baseSlug ? `-${trackerId}` : '';\n targetPath = path.join(featurePlanDir, `${formatSequence(nn)}-story-${baseSlug}${trackerPart}.md`);\n }\n\n const body = `${input.metadataHeader.trimEnd()}\\n\\n${input.planBodyMarkdown.trimStart()}\\n`;\n fs.writeFileSync(targetPath, body, 'utf8');\n\n upsertOverviewRow(featurePlanDir, story.feature, nn, path.basename(targetPath), story);\n\n return { planFile: targetPath, sequenceNumber: nn, overwrote };\n}\n\nfunction findExistingPlan(featureDir: string, storyId: string): { absPath: string; nn: number } | undefined {\n if (!fs.existsSync(featureDir)) return undefined;\n const pattern = /^(\\d{2,})-story-.+\\.md$/;\n for (const entry of fs.readdirSync(featureDir)) {\n const m = entry.match(pattern);\n if (!m) continue;\n if (entry.includes(storyId)) return { absPath: path.join(featureDir, entry), nn: parseInt(m[1]!, 10) };\n }\n return undefined;\n}\n\nfunction upsertOverviewRow(\n featureDir: string,\n feature: string,\n nn: number,\n filename: string,\n story: StoryRecord,\n): void {\n const overviewPath = path.join(featureDir, '00-overview.md');\n const row = `| ${formatSequence(nn)} | \\`${filename}\\` | ${story.titleHint ?? story.id} | ${story.id} | — |`;\n if (!fs.existsSync(overviewPath)) {\n const content = `# ${feature} — plan overview\\n\\nEntry point for the **${feature}** feature. Stories execute in order by their \\`NN\\` prefix.\\n\\n## Stories\\n\\n| NN | File | Title | Tracker id | Depends on |\\n|----|------|-------|------------|------------|\\n${row}\\n`;\n fs.writeFileSync(overviewPath, content, 'utf8');\n return;\n }\n\n const current = fs.readFileSync(overviewPath, 'utf8');\n const lines = current.split('\\n');\n const existingIdx = lines.findIndex((l) => l.includes(`\\`${filename}\\``) || l.includes(`| ${formatSequence(nn)} |`));\n if (existingIdx >= 0) {\n lines[existingIdx] = row;\n } else {\n const tableEnd = findTableEnd(lines);\n lines.splice(tableEnd, 0, row);\n }\n fs.writeFileSync(overviewPath, lines.join('\\n'), 'utf8');\n}\n\nfunction findTableEnd(lines: string[]): number {\n let inTable = false;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (!inTable && line.startsWith('|')) {\n inTable = true;\n continue;\n }\n if (inTable && !line.startsWith('|')) return i;\n }\n return lines.length;\n}\n\nexport function buildMetadataHeader(args: {\n provider: string;\n model: string;\n reads: number;\n bytes: number;\n inputTokens: number;\n outputTokens: number;\n durationMs: number;\n costUsd?: number;\n}): string {\n const parts = [\n `generated by ${args.provider}/${args.model}`,\n `at ${new Date().toISOString()}`,\n `${args.reads} reads / ${(args.bytes / 1024).toFixed(1)} KB context`,\n `${args.inputTokens} in / ${args.outputTokens} out tokens`,\n args.costUsd !== undefined ? `~$${args.costUsd.toFixed(2)}` : null,\n ].filter(Boolean);\n return `<!-- squad-kit: ${parts.join(', ')} -->`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nconst STORY_FILE = /^(\\d{2,})-story-.+\\.md$/;\n\nexport interface SequenceScan {\n usedNumbers: number[];\n maxNumber: number;\n duplicates: number[];\n nextGlobal: number;\n}\n\nexport function scanPlans(plansDir: string): SequenceScan {\n const used: number[] = [];\n const seen = new Map<number, number>();\n\n if (fs.existsSync(plansDir)) {\n for (const feature of fs.readdirSync(plansDir, { withFileTypes: true })) {\n if (!feature.isDirectory()) continue;\n const featureDir = path.join(plansDir, feature.name);\n for (const entry of fs.readdirSync(featureDir)) {\n const match = entry.match(STORY_FILE);\n if (!match) continue;\n const n = parseInt(match[1]!, 10);\n used.push(n);\n seen.set(n, (seen.get(n) ?? 0) + 1);\n }\n }\n }\n\n const duplicates = [...seen.entries()].filter(([, c]) => c > 1).map(([n]) => n);\n const maxNumber = used.length ? Math.max(...used) : 0;\n return { usedNumbers: used.sort((a, b) => a - b), maxNumber, duplicates, nextGlobal: maxNumber + 1 };\n}\n\nexport function formatSequence(n: number): string {\n return String(n).padStart(2, '0');\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PlannerRunStats } from '../planner/types.js';\nimport type { SquadPaths } from './paths.js';\n\nexport interface LastRunRecord {\n stats: PlannerRunStats;\n /** ISO-8601 timestamp the run completed. */\n completedAt: string;\n /** Which provider/model were used. For doctor's diagnostic output. */\n provider: string;\n model: string;\n /** Schema version so future shape changes don't misparse. */\n version: 1;\n}\n\nexport async function writeLastRun(paths: SquadPaths, rec: Omit<LastRunRecord, 'version'>): Promise<void> {\n const file = path.join(paths.squadDir, '.last-run.json');\n await fs.writeFile(file, JSON.stringify({ ...rec, version: 1 }, null, 2) + '\\n', 'utf8');\n}\n\nexport async function readLastRun(paths: SquadPaths): Promise<LastRunRecord | undefined> {\n const file = path.join(paths.squadDir, '.last-run.json');\n try {\n const raw = await fs.readFile(file, 'utf8');\n const parsed = JSON.parse(raw) as LastRunRecord;\n if (parsed.version !== 1) return undefined;\n return parsed;\n } catch {\n return undefined;\n }\n}\n","import type { PlannerRunStats } from '../planner/types.js';\n\nexport function formatTokenK(n: number): string {\n return `${(n / 1000).toFixed(1)}k`;\n}\n\nexport function formatPlannerCacheLine(opts: { cacheEnabled: boolean; stats: PlannerRunStats }): string {\n if (!opts.cacheEnabled) {\n return 'cache disabled';\n }\n const { stats } = opts;\n if (stats.cacheReadTokens > 0) {\n const pct = Math.round(stats.cacheHitRatio * 100);\n const total = stats.inputTokens + stats.cacheReadTokens;\n const read = formatTokenK(stats.cacheReadTokens);\n const tot = formatTokenK(total);\n const written =\n stats.cacheCreationTokens > 0 ? ` · ${formatTokenK(stats.cacheCreationTokens)} written` : '';\n return `cache hit ${pct}% (${read} read / ${tot} total${written})`;\n }\n return 'cache miss 0% — run `squad doctor` to diagnose';\n}\n","import fs from 'node:fs';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../core/paths.js';\nimport { loadConfig, type SquadConfig } from '../core/config.js';\nimport { modelFor, providerEnvVar, resolveProviderKey } from '../core/planner-models.js';\nimport { scanPlans, formatSequence } from '../core/sequence.js';\nimport { listStories } from '../core/stories.js';\nimport { loadSecrets, type SquadSecrets } from '../core/secrets.js';\nimport { clientFor, overlayTrackerEnv } from '../tracker/index.js';\n\nconst kw = 28;\n\ntype CredStatus =\n | { state: 'present'; detail: 'env' | 'secrets.yaml' }\n | { state: 'missing'; hint: string };\n\nfunction probeTrackerCredential(config: SquadConfig, overlay: SquadSecrets): CredStatus {\n const { client, error } = clientFor(config, overlay);\n if (client) {\n const fromEnv =\n (config.tracker.type === 'jira' &&\n Boolean(process.env.JIRA_API_TOKEN || process.env.SQUAD_TRACKER_API_KEY)) ||\n (config.tracker.type === 'azure' &&\n Boolean(process.env.AZURE_DEVOPS_PAT || process.env.SQUAD_TRACKER_API_KEY));\n return { state: 'present', detail: fromEnv ? 'env' : 'secrets.yaml' };\n }\n return {\n state: 'missing',\n hint: error?.detail ?? 'Run `squad init` to enter credentials.',\n };\n}\n\nfunction formatCredentialStatus(s: CredStatus): string {\n if (s.state === 'present') {\n return s.detail === 'env' ? 'set via environment variable' : 'set via .squad/secrets.yaml';\n }\n return `missing — ${s.hint}`;\n}\n\nexport async function runStatus(): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n const scan = scanPlans(paths.plansDir);\n\n const storyCount = listStories(paths).length;\n const planCount = scan.usedNumbers.length;\n\n const secrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n const overlay = overlayTrackerEnv(secrets);\n\n ui.banner();\n ui.step('squad-kit status');\n ui.blank();\n ui.kv('project', config.project.name, kw);\n ui.kv('tracker', buildTrackerLine(config, overlay), kw);\n\n if (config.tracker.type === 'jira' || config.tracker.type === 'azure') {\n const result = probeTrackerCredential(config, overlay);\n ui.kv('tracker key', formatCredentialStatus(result), kw);\n }\n\n ui.kv('agents', config.agents.length ? config.agents.join(', ') : '(none)', kw);\n if (config.planner?.enabled) {\n const model = modelFor(config.planner.provider, 'plan', config.planner.modelOverride);\n const overrideNote = config.planner.modelOverride?.[config.planner.provider] ? ' (override)' : '';\n ui.kv('planner', `${config.planner.provider}/${model}${overrideNote}`, kw);\n const cred = resolveProviderKey(config.planner.provider);\n ui.kv(\n 'planner key',\n cred\n ? `set via ${cred.detail}`\n : `missing — set ${providerEnvVar(config.planner.provider)} or run \\`squad init\\``,\n kw,\n );\n } else {\n ui.kv('planner', 'disabled (copy-paste flow)', kw);\n }\n ui.kv('stories (drafts + planned)', String(storyCount), kw);\n ui.kv('plan files', String(planCount), kw);\n ui.kv('next NN', formatSequence(scan.nextGlobal), kw);\n if (scan.duplicates.length > 0) {\n ui.warning(`duplicate NN numbers: ${scan.duplicates.map(formatSequence).join(', ')}`);\n }\n}\n\nfunction buildTrackerLine(config: SquadConfig, overlay: SquadSecrets): string {\n if (config.tracker.type === 'none') return 'none';\n let trackerLine = config.tracker.type;\n if (config.tracker.type === 'jira') {\n if (overlay.tracker?.jira?.host) {\n trackerLine += ` · ${overlay.tracker.jira.host}`;\n } else {\n trackerLine += ' · (no host configured)';\n }\n } else if (config.tracker.type === 'azure') {\n const org = overlay.tracker?.azure?.organization ?? config.tracker.workspace;\n const proj = overlay.tracker?.azure?.project ?? config.tracker.project;\n if (org) {\n trackerLine += ` · ${org}${proj ? `/${proj}` : ''}`;\n } else {\n trackerLine += ' · (no organization configured)';\n }\n }\n return trackerLine;\n}\n","import path from 'node:path';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../core/paths.js';\nimport { type PlanMetadata, listStories, readPlanMetadata } from '../core/stories.js';\n\nexport interface ListOptions {\n feature?: string;\n}\n\ninterface Row {\n feature: string;\n id: string;\n hasIntake: boolean;\n planFile?: string;\n meta?: PlanMetadata;\n}\n\nexport async function runList(opts: ListOptions): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const records = listStories(paths, { feature: opts.feature });\n const rows: Row[] = records.map((r) => {\n const planAbs = r.planFile ? path.join(paths.plansDir, r.feature, r.planFile) : undefined;\n const meta = planAbs ? readPlanMetadata(planAbs) : undefined;\n return {\n feature: r.feature,\n id: r.id,\n hasIntake: true,\n planFile: r.planFile,\n meta,\n };\n });\n\n if (rows.length === 0) {\n ui.info('(no stories yet — try `squad new-story <feature-slug>`)');\n return;\n }\n\n const header = ['feature', 'story', 'intake', 'plan', 'generated by'];\n const table = rows.map((r) => [\n r.feature,\n r.id,\n r.hasIntake ? 'yes' : '—',\n r.planFile ?? ui.theme.dim('—'),\n r.meta?.generatedBy ?? (r.planFile ? 'copy-paste' : ui.theme.dim('—')),\n ]);\n printTable([header, ...table]);\n}\n\nfunction printTable(rows: string[][]): void {\n const widths = rows[0]!.map((_, i) => Math.max(...rows.map((r) => stripAnsi(r[i] ?? '').length)));\n for (const row of rows) {\n console.log(row.map((cell, i) => pad(cell, widths[i]!)).join(' '));\n }\n}\n\nfunction pad(s: string, width: number): string {\n const visible = stripAnsi(s).length;\n return s + ' '.repeat(Math.max(0, width - visible));\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { input, select } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../core/paths.js';\nimport { loadConfig } from '../core/config.js';\nimport { validateTrackerId } from '../core/tracker.js';\nimport { listAllStories } from '../core/stories.js';\n\nexport interface TrackerLinkOptions {\n yes?: boolean;\n}\n\nexport async function runTrackerLink(\n storyPath: string | undefined,\n trackerId: string | undefined,\n opts: TrackerLinkOptions = {},\n): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n const interactive = !opts.yes && Boolean(process.stdin.isTTY) && process.env.CI !== 'true';\n\n let resolvedStoryPath = storyPath;\n if (!resolvedStoryPath) {\n if (!interactive) {\n throw new Error(\n 'Usage: squad tracker link [story-path] [tracker-id]. Run `squad tracker link` without arguments in a TTY to pick from a list, or pass `--yes` to opt out of prompts.',\n );\n }\n const stories = listAllStories(paths);\n if (stories.length === 0) {\n throw new Error('No stories found under .squad/stories/. Create one with `squad new-story` first.');\n }\n resolvedStoryPath = await select({\n message: 'Story to link:',\n choices: stories.map((s) => ({\n name: `${s.feature}/${s.id}`,\n value: s.intakePath,\n })),\n });\n }\n\n let resolvedTrackerId = trackerId;\n if (!resolvedTrackerId) {\n if (!interactive) {\n throw new Error(\n 'Usage: squad tracker link [story-path] [tracker-id]. Run `squad tracker link` without arguments in a TTY to pick from a list, or pass `--yes` to opt out of prompts.',\n );\n }\n resolvedTrackerId = (\n await input({\n message: `${config.tracker.type} work-item id:`,\n validate: (v) => {\n const trimmed = v.trim();\n if (!trimmed) return 'Required.';\n return validateTrackerId(config.tracker.type, trimmed)\n ? true\n : `Invalid ${config.tracker.type} id format.`;\n },\n })\n ).trim();\n }\n\n if (!validateTrackerId(config.tracker.type, resolvedTrackerId)) {\n throw new Error(\n `Invalid tracker id \"${resolvedTrackerId}\" for tracker type \"${config.tracker.type}\". ` +\n `Run \\`squad config show\\` to review the expected format, or \\`squad config set tracker\\` if the type is wrong.`,\n );\n }\n\n const resolved = path.resolve(resolvedStoryPath);\n const intakeFile = resolved.endsWith('intake.md') ? resolved : path.join(resolved, 'intake.md');\n if (!fs.existsSync(intakeFile)) {\n throw new Error(\n `intake.md not found at ${intakeFile}. Run \\`squad list\\` to see valid paths, or \\`squad new-story\\` to create a story first.`,\n );\n }\n\n const content = fs.readFileSync(intakeFile, 'utf8');\n const updated = upsertTrackerId(content, resolvedTrackerId);\n fs.writeFileSync(intakeFile, updated, 'utf8');\n\n ui.success(`Linked tracker id ${resolvedTrackerId} → ${path.relative(root, intakeFile)}`);\n ui.blank();\n ui.step('Next:');\n ui.info('1) Review the intake — the Source block at the top now carries the tracker id.');\n ui.info('2) Run `squad new-plan --api` (or `--copy`) to generate the plan for this story.');\n}\n\nfunction upsertTrackerId(content: string, id: string): string {\n const pattern = /(-\\s*\\*\\*Work item id:\\*\\*)[^\\n]*/;\n if (pattern.test(content)) {\n return content.replace(pattern, `$1 ${id}`);\n }\n return content + `\\n\\n- **Work item id:** ${id}\\n`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport * as ui from '../ui/index.js';\nimport * as theme from '../ui/theme.js';\nimport { findSquadRoot, buildPaths, type SquadPaths } from '../core/paths.js';\nimport { loadConfig, type SquadConfig } from '../core/config.js';\nimport { loadSecrets, type SquadSecrets } from '../core/secrets.js';\nimport { ensureGitignore, SQUAD_TRASH_PATTERN } from '../core/gitignore.js';\nimport { modelFor, providerEnvVar, resolveProviderKey } from '../core/planner-models.js';\nimport { clientFor, overlayTrackerEnv, type ClientResolutionError } from '../tracker/index.js';\nimport type { ProviderName } from '../planner/types.js';\nimport { fetchProviderModelIds, probeJiraConnectivity, probeAzureConnectivity } from '../core/probes.js';\nimport { readLastRun } from '../core/last-run.js';\nimport { formatTokenK } from '../ui/planner-cache-summary.js';\n\nexport interface DoctorOptions {\n fix?: boolean;\n json?: boolean;\n}\n\nexport interface CheckResult {\n id: string;\n name: string;\n status: 'ok' | 'warn' | 'fail' | 'skip';\n detail?: string;\n fixHint?: string;\n fixable?: boolean;\n}\n\ninterface DoctorContext {\n config?: SquadConfig;\n configError?: Error;\n secrets?: SquadSecrets;\n secretsError?: Error;\n hasLegacyPromptsDir: boolean;\n}\n\nasync function gatherContext(paths: SquadPaths): Promise<DoctorContext> {\n const ctx: DoctorContext = { hasLegacyPromptsDir: false };\n try {\n ctx.config = loadConfig(paths.configFile);\n } catch (err) {\n ctx.configError = err as Error;\n }\n try {\n ctx.secrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n } catch (err) {\n ctx.secretsError = err as Error;\n }\n ctx.hasLegacyPromptsDir = fs.existsSync(paths.promptsDir);\n return ctx;\n}\n\nfunction gitignoreHasManagedBlock(repoRoot: string): boolean {\n const gitignore = path.join(repoRoot, '.gitignore');\n return fs.existsSync(gitignore) && fs.readFileSync(gitignore, 'utf8').includes('.squad/secrets.yaml');\n}\n\nfunction gitignoreHasTrashPattern(repoRoot: string): boolean {\n const gitignore = path.join(repoRoot, '.gitignore');\n return fs.existsSync(gitignore) && fs.readFileSync(gitignore, 'utf8').includes(SQUAD_TRASH_PATTERN);\n}\n\nasync function checkDirStructure(paths: SquadPaths, _ctx: DoctorContext, fix: boolean): Promise<CheckResult> {\n const need = [paths.squadDir, paths.storiesDir, paths.plansDir].filter((p) => !fs.existsSync(p));\n if (need.length === 0) {\n return { id: 'dirs', name: '.squad/ directory structure', status: 'ok' };\n }\n if (fix) {\n for (const p of need) {\n fs.mkdirSync(p, { recursive: true });\n }\n return { id: 'dirs', name: '.squad/ directory structure', status: 'ok', detail: 'repaired' };\n }\n return {\n id: 'dirs',\n name: '.squad/ directory structure',\n status: 'warn',\n detail: `missing: ${need.map((p) => path.relative(paths.root, p)).join(', ')}`,\n fixable: true,\n fixHint: 'squad doctor --fix',\n };\n}\n\nasync function checkConfigReadable(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (ctx.configError) {\n return {\n id: 'config',\n name: '.squad/config.yaml readable',\n status: 'fail',\n detail: ctx.configError.message,\n fixHint: 'Fix or recreate .squad/config.yaml; see squad init',\n };\n }\n return { id: 'config', name: '.squad/config.yaml readable', status: 'ok' };\n}\n\nasync function checkGitignore(paths: SquadPaths, _ctx: DoctorContext, fix: boolean): Promise<CheckResult> {\n if (gitignoreHasManagedBlock(paths.root)) {\n return { id: 'gitignore', name: '.gitignore managed block', status: 'ok' };\n }\n if (fix) {\n ensureGitignore(paths.root);\n return { id: 'gitignore', name: '.gitignore managed block', status: 'ok', detail: 'repaired' };\n }\n return {\n id: 'gitignore',\n name: '.gitignore managed block',\n status: 'warn',\n fixable: true,\n fixHint: 'squad doctor --fix',\n };\n}\n\nasync function checkGitignoreTrashPattern(paths: SquadPaths, _ctx: DoctorContext, fix: boolean): Promise<CheckResult> {\n if (gitignoreHasTrashPattern(paths.root)) {\n return { id: 'gitignore-trash', name: '.gitignore includes .squad/.trash/', status: 'ok' };\n }\n if (fix) {\n ensureGitignore(paths.root);\n if (gitignoreHasTrashPattern(paths.root)) {\n return { id: 'gitignore-trash', name: '.gitignore includes .squad/.trash/', status: 'ok', detail: 'repaired' };\n }\n }\n return {\n id: 'gitignore-trash',\n name: '.gitignore includes .squad/.trash/',\n status: 'warn',\n fixable: true,\n fixHint: 'squad doctor --fix',\n };\n}\n\nasync function checkSecretsPermissions(paths: SquadPaths, _ctx: DoctorContext, fix: boolean): Promise<CheckResult> {\n if (process.platform === 'win32') {\n return { id: 'secrets-perms', name: '.squad/secrets.yaml permissions', status: 'skip', detail: 'Windows' };\n }\n if (!fs.existsSync(paths.secretsFile)) {\n return { id: 'secrets-perms', name: '.squad/secrets.yaml permissions', status: 'ok', detail: 'not present' };\n }\n const mode = fs.statSync(paths.secretsFile).mode & 0o777;\n if (mode === 0o600) {\n return { id: 'secrets-perms', name: '.squad/secrets.yaml permissions', status: 'ok' };\n }\n if (fix) {\n fs.chmodSync(paths.secretsFile, 0o600);\n return { id: 'secrets-perms', name: '.squad/secrets.yaml permissions', status: 'ok', detail: 'repaired' };\n }\n return {\n id: 'secrets-perms',\n name: '.squad/secrets.yaml permissions',\n status: 'warn',\n detail: `mode ${mode.toString(8)} (expected 600)`,\n fixable: true,\n fixHint: 'squad doctor --fix',\n };\n}\n\nasync function checkSecretsParseable(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (ctx.secretsError) {\n return {\n id: 'secrets-yaml',\n name: '.squad/secrets.yaml parseable',\n status: 'fail',\n detail: ctx.secretsError.message,\n };\n }\n if (!fs.existsSync(_paths.secretsFile)) {\n return { id: 'secrets-yaml', name: '.squad/secrets.yaml parseable', status: 'ok', detail: 'not present' };\n }\n return { id: 'secrets-yaml', name: '.squad/secrets.yaml parseable', status: 'ok' };\n}\n\nasync function checkLegacyPrompts(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (ctx.hasLegacyPromptsDir) {\n return {\n id: 'legacy-prompts',\n name: 'legacy .squad/prompts/ directory',\n status: 'warn',\n detail: 'stale copy from pre-0.2 installs',\n fixHint: 'squad migrate',\n };\n }\n return { id: 'legacy-prompts', name: 'legacy .squad/prompts/ directory', status: 'ok' };\n}\n\nasync function checkPlannerConfig(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'skip',\n detail: 'config unavailable',\n };\n }\n const p = ctx.config.planner;\n if (p?.enabled !== true) {\n return { id: 'planner-config', name: 'planner configuration', status: 'skip', detail: 'disabled' };\n }\n if (!['anthropic', 'openai', 'google'].includes(p.provider)) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'fail',\n detail: `unsupported planner.provider \"${p.provider}\"`,\n };\n }\n const mo = p.modelOverride;\n if (mo) {\n for (const key of ['anthropic', 'openai', 'google'] as const) {\n const v = mo[key];\n if (v !== undefined && (typeof v !== 'string' || v.trim().length === 0)) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'fail',\n detail: `planner.modelOverride.${key} must be a non-empty string when set`,\n };\n }\n }\n }\n if (p.budget.maxFileReads <= 0 || p.budget.maxContextBytes <= 0 || p.budget.maxDurationSeconds <= 0) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'fail',\n detail: 'planner budget limits must be > 0',\n };\n }\n if (p.budget.maxCostUsd !== undefined && p.budget.maxCostUsd <= 0) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'fail',\n detail: 'planner.budget.maxCostUsd must be > 0 when set',\n };\n }\n return { id: 'planner-config', name: 'planner configuration', status: 'ok' };\n}\n\nasync function checkPlannerCredential(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config || ctx.config.planner?.enabled !== true) {\n return { id: 'planner-cred', name: 'planner credential resolves', status: 'skip', detail: 'planner disabled' };\n }\n const provider = ctx.config.planner.provider;\n const resolved = resolveProviderKey(provider);\n if (!resolved) {\n const envVar = providerEnvVar(provider);\n return {\n id: 'planner-cred',\n name: 'planner credential resolves',\n status: 'fail',\n detail: `no API key found (${envVar} or .squad/secrets.yaml)`,\n fixHint: `Set ${envVar} or save a key via 'squad init' interactive setup`,\n };\n }\n return {\n id: 'planner-cred',\n name: 'planner credential resolves',\n status: 'ok',\n detail: `source=${resolved.source} (${resolved.detail})`,\n };\n}\n\nasync function checkPlannerModel(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config || ctx.config.planner?.enabled !== true) {\n return { id: 'planner-model', name: 'planner model resolves at provider', status: 'skip', detail: 'planner disabled' };\n }\n const provider = ctx.config.planner.provider;\n const cred = resolveProviderKey(provider);\n if (!cred) {\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'skip',\n detail: 'no credential',\n };\n }\n const model = modelFor(provider, 'plan', ctx.config.planner.modelOverride);\n try {\n const listed = await fetchProviderModelIds(provider, cred.value);\n if (!listed.ok) {\n const st = listed.status;\n if (st === 401 || st === 403) {\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'warn',\n detail: `models API HTTP ${st}`,\n };\n }\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'warn',\n detail: `models API HTTP ${st}: ${listed.body.slice(0, 120)}`,\n };\n }\n if (!listed.ids.has(model)) {\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'fail',\n detail: `model \"${model}\" not listed by provider`,\n fixHint: `Upgrade squad-kit for updated pins, set planner.modelOverride.${provider} in .squad/config.yaml, or switch planner.provider to a provider that exposes this model id.`,\n };\n }\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'ok',\n detail: `${model} (${provider})`,\n };\n } catch (err) {\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'warn',\n detail: (err as Error).message,\n };\n }\n}\n\nasync function checkPlannerTierAwareness(\n _paths: SquadPaths,\n ctx: DoctorContext,\n): Promise<CheckResult> {\n const id = 'planner-tier';\n const name = 'planner tier vs. model';\n if (!ctx.config || ctx.config.planner?.enabled !== true) {\n return { id, name, status: 'skip', detail: 'planner disabled' };\n }\n const provider = ctx.config.planner.provider;\n if (provider !== 'anthropic') {\n return { id, name, status: 'skip', detail: `not applicable for ${provider}` };\n }\n const planModel = modelFor(provider, 'plan', ctx.config.planner.modelOverride);\n if (!/opus/i.test(planModel)) {\n return { id, name, status: 'ok', detail: `${planModel} is comfortably under Tier 1` };\n }\n const cacheOn = ctx.config.planner?.cache?.enabled !== false;\n if (cacheOn) {\n return {\n id,\n name,\n status: 'warn',\n detail: 'Anthropic Tier 1 with Opus — tight but viable with prompt caching on',\n fixHint: [\n 'Caching saves ~70% on billed input tokens. Keep `planner.cache.enabled: true` in config.',\n 'If you still hit 429s on long runs, reduce `planner.budget.maxContextBytes` or use Haiku for plan phase.',\n ].join('\\n'),\n };\n }\n return {\n id,\n name,\n status: 'warn',\n detail: `${planModel} on Anthropic Tier 1 (10k input tokens/min) is throttle-prone for plans over ~3 file reads`,\n fixHint:\n 'Run `squad config set planner` and pick a Sonnet or Haiku id for planner.modelOverride.anthropic, ' +\n 'or upgrade tier at https://console.anthropic.com/settings/limits. ' +\n 'squad-kit will auto-retry a 429 once (waiting up to 90s), but repeated throttling means the plan model is simply too big for your quota.',\n };\n}\n\nexport async function checkPlannerCache(paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n const id = 'planner-cache';\n const name = 'planner cache effectiveness';\n const config = ctx.config;\n const cacheCfg = config?.planner?.cache;\n\n if (config?.planner?.enabled !== true) {\n return { id, name, status: 'skip', detail: 'planner disabled — cache check not applicable' };\n }\n\n if (cacheCfg?.enabled === false) {\n return {\n id,\n name,\n status: 'warn',\n detail: 'prompt caching is disabled in .squad/config.yaml',\n fixHint: 'Cache saves ~70% on billed tokens. Re-enable with `squad config set planner`.',\n };\n }\n\n const lastRun = await readLastRun(paths);\n if (!lastRun) {\n return {\n id,\n name,\n status: 'skip',\n detail: 'no planner runs logged yet',\n fixHint: 'Run `squad new-plan --api` once, then re-run `squad doctor` to see cache telemetry.',\n };\n }\n\n const { stats } = lastRun;\n const hitPct = Math.round(stats.cacheHitRatio * 100);\n\n if (stats.cacheReadTokens === 0 && stats.turns > 1) {\n return {\n id,\n name,\n status: 'fail',\n detail: `caching configured but last run saw 0% hits across ${stats.turns} turns`,\n fixHint: [\n 'Possible causes:',\n ' • Planner provider is not Anthropic and the prefix is below 1024 tokens (OpenAI / Google need larger prefixes).',\n ' • System prompt is mutating between turns — check recent changes.',\n \" • Using an older model that doesn't support caching.\",\n `Provider: ${lastRun.provider}/${lastRun.model}. Run \\`NODE_ENV=development squad new-plan --api\\` to surface prefix-mismatch warnings.`,\n ].join('\\n'),\n };\n }\n\n if (hitPct < 30 && stats.turns > 3) {\n return {\n id,\n name,\n status: 'warn',\n detail: `low cache hit rate: ${hitPct}% (last run, ${stats.turns} turns)`,\n fixHint: 'Expected ≥60% for Anthropic, ≥40% for OpenAI, ≥50% for Google after 3+ turns. Prefix may be unstable.',\n };\n }\n\n return {\n id,\n name,\n status: 'ok',\n detail: `caching active — last run ${hitPct}% hit (${formatTokenK(stats.cacheReadTokens)} read, ${lastRun.provider}/${lastRun.model})`,\n };\n}\n\nasync function checkTrackerConfig(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config) {\n return { id: 'tracker-config', name: 'tracker configuration', status: 'skip', detail: 'config unavailable' };\n }\n const t = ctx.config.tracker;\n if (t.type === 'none') {\n return { id: 'tracker-config', name: 'tracker configuration', status: 'skip', detail: 'none' };\n }\n if (t.type === 'jira' && !t.workspace?.trim()) {\n return {\n id: 'tracker-config',\n name: 'tracker configuration',\n status: 'fail',\n detail: 'Jira requires tracker.workspace (host)',\n };\n }\n if (t.type === 'azure' && (!t.workspace?.trim() || !t.project?.trim())) {\n return {\n id: 'tracker-config',\n name: 'tracker configuration',\n status: 'fail',\n detail: 'Azure DevOps requires tracker.workspace (organization) and tracker.project',\n };\n }\n return { id: 'tracker-config', name: 'tracker configuration', status: 'ok' };\n}\n\nfunction formatClientError(err: ClientResolutionError): string {\n return `${err.message} ${err.detail}`.trim();\n}\n\nasync function checkTrackerCredential(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config) {\n return { id: 'tracker-cred', name: 'tracker credential resolves', status: 'skip', detail: 'config unavailable' };\n }\n if (ctx.config.tracker.type === 'none') {\n return { id: 'tracker-cred', name: 'tracker credential resolves', status: 'skip', detail: 'none' };\n }\n const secrets = ctx.secrets ?? {};\n const overlay = overlayTrackerEnv(secrets);\n const { client, error } = clientFor(ctx.config, overlay);\n if (error) {\n return {\n id: 'tracker-cred',\n name: 'tracker credential resolves',\n status: 'fail',\n detail: formatClientError(error),\n };\n }\n if (!client) {\n return {\n id: 'tracker-cred',\n name: 'tracker credential resolves',\n status: 'fail',\n detail: 'no tracker client',\n };\n }\n return { id: 'tracker-cred', name: 'tracker credential resolves', status: 'ok' };\n}\n\nasync function checkTrackerConnectivity(paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config || ctx.config.tracker.type === 'none') {\n return { id: 'tracker-live', name: 'tracker connectivity', status: 'skip', detail: 'none' };\n }\n const secrets = ctx.secrets ?? {};\n const overlay = overlayTrackerEnv(secrets);\n const { client, error } = clientFor(ctx.config, overlay);\n if (error || !client) {\n return { id: 'tracker-live', name: 'tracker connectivity', status: 'skip', detail: 'no credential' };\n }\n if (client.name === 'jira') {\n const r = await probeJiraConnectivity(secrets, ctx.config);\n if (r.ok) return { id: 'tracker-live', name: 'tracker connectivity', status: 'ok', detail: 'Jira REST' };\n return {\n id: 'tracker-live',\n name: 'tracker connectivity',\n status: 'fail',\n detail: r.status !== undefined ? `HTTP ${r.status}` : r.detail ?? 'request failed',\n };\n }\n if (client.name === 'azure') {\n const r = await probeAzureConnectivity(secrets, ctx.config);\n if (r.ok) return { id: 'tracker-live', name: 'tracker connectivity', status: 'ok', detail: 'Azure DevOps' };\n return {\n id: 'tracker-live',\n name: 'tracker connectivity',\n status: 'fail',\n detail: r.status !== undefined ? `HTTP ${r.status}` : r.detail ?? 'request failed',\n };\n }\n return {\n id: 'tracker-live',\n name: 'tracker connectivity',\n status: 'skip',\n detail: 'unsupported client',\n };\n}\n\nasync function guardCheck(checkName: string, fn: () => Promise<CheckResult>): Promise<CheckResult> {\n try {\n return await fn();\n } catch (err) {\n return {\n id: 'unexpected',\n name: checkName,\n status: 'fail',\n detail: (err as Error).message,\n };\n }\n}\n\nasync function runAllChecks(paths: SquadPaths, ctx: DoctorContext, fix: boolean): Promise<CheckResult[]> {\n const checks: CheckResult[] = [];\n const add = async (label: string, fn: () => Promise<CheckResult>) => {\n checks.push(await guardCheck(label, fn));\n };\n await add('.squad/ directory structure', () => checkDirStructure(paths, ctx, fix));\n await add('.squad/config.yaml readable', () => checkConfigReadable(paths, ctx));\n await add('.gitignore managed block', () => checkGitignore(paths, ctx, fix));\n await add('.gitignore includes .squad/.trash/', () => checkGitignoreTrashPattern(paths, ctx, fix));\n await add('.squad/secrets.yaml permissions', () => checkSecretsPermissions(paths, ctx, fix));\n await add('.squad/secrets.yaml parseable', () => checkSecretsParseable(paths, ctx));\n await add('legacy .squad/prompts/ directory', () => checkLegacyPrompts(paths, ctx));\n await add('planner configuration', () => checkPlannerConfig(paths, ctx));\n await add('planner credential resolves', () => checkPlannerCredential(paths, ctx));\n await add('planner model resolves at provider', () => checkPlannerModel(paths, ctx));\n await add('planner tier vs. model', () => checkPlannerTierAwareness(paths, ctx));\n await add('planner cache effectiveness', () => checkPlannerCache(paths, ctx));\n await add('tracker configuration', () => checkTrackerConfig(paths, ctx));\n await add('tracker credential resolves', () => checkTrackerCredential(paths, ctx));\n await add('tracker connectivity', () => checkTrackerConnectivity(paths, ctx));\n return checks;\n}\n\nfunction summarise(checks: CheckResult[]): { ok: number; warn: number; fail: number; skip: number } {\n return {\n ok: checks.filter((c) => c.status === 'ok').length,\n warn: checks.filter((c) => c.status === 'warn').length,\n fail: checks.filter((c) => c.status === 'fail').length,\n skip: checks.filter((c) => c.status === 'skip').length,\n };\n}\n\nfunction colorForStatus(s: CheckResult['status']): (t: string) => string {\n switch (s) {\n case 'ok':\n return theme.primary;\n case 'warn':\n return theme.warn;\n case 'fail':\n return theme.danger;\n case 'skip':\n return theme.dim;\n default:\n return (x) => x;\n }\n}\n\nfunction symbolForStatus(s: CheckResult['status']): string {\n switch (s) {\n case 'ok':\n return '✓';\n case 'warn':\n return '!';\n case 'fail':\n return '✗';\n case 'skip':\n return '·';\n default:\n return '?';\n }\n}\n\nfunction renderChecks(root: string, checks: CheckResult[]): void {\n ui.divider('squad doctor');\n ui.info(`workspace ${root}`);\n ui.info('');\n for (const c of checks) {\n const sym = symbolForStatus(c.status);\n const col = colorForStatus(c.status);\n const detail = c.detail ? theme.dim(` — ${c.detail}`) : '';\n ui.line(` ${col(sym)} ${c.name}${detail}`);\n if (c.fixHint) ui.line(` ${theme.dim('↳ ' + c.fixHint)}`);\n }\n ui.info('');\n const counts = summarise(checks);\n ui.info(`${counts.ok} ok · ${counts.warn} warn · ${counts.fail} fail · ${counts.skip} skip`);\n}\n\nexport async function runDoctor(opts: DoctorOptions): Promise<void> {\n const fix = opts.fix ?? false;\n const json = opts.json ?? false;\n\n const root = findSquadRoot();\n if (!root) {\n if (json) {\n process.stdout.write(\n JSON.stringify({ error: 'No .squad/ directory found. Run `squad init` first.', checks: [] }, null, 2) + '\\n',\n );\n } else {\n ui.failure('No .squad/ directory found. Run `squad init` first.');\n }\n process.exit(1);\n }\n const paths = buildPaths(root);\n\n const ctx = await gatherContext(paths);\n const checks = await runAllChecks(paths, ctx, fix);\n\n if (json) {\n process.stdout.write(JSON.stringify({ root, checks }, null, 2) + '\\n');\n } else {\n renderChecks(root, checks);\n }\n\n if (fix) {\n const repaired = checks.filter((c) => c.detail === 'repaired').length;\n if (repaired > 0 && !json) {\n ui.info('');\n ui.info(`Applied ${repaired} repair(s).`);\n }\n }\n\n if (!json) {\n const fixableWarns = checks.filter((c) => c.status === 'warn' && c.fixable).length;\n const migrateNeeded = checks.filter((c) => c.id === 'legacy-prompts' && c.status === 'warn').length;\n if (!fix && (fixableWarns > 0 || migrateNeeded > 0)) {\n ui.info('');\n if (fixableWarns > 0) {\n ui.info(\n `${fixableWarns} fixable issue(s) found. Run \\`squad doctor --fix\\` to apply non-destructive repairs.`,\n );\n }\n if (migrateNeeded > 0) {\n ui.info(`${migrateNeeded} destructive issue requires \\`squad migrate\\`.`);\n }\n }\n }\n\n const fails = checks.filter((c) => c.status === 'fail').length;\n if (fails > 0) process.exit(1);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { findSquadRoot, buildPaths, type SquadPaths } from '../core/paths.js';\nimport { loadConfig, saveConfig, serializeConfig } from '../core/config.js';\nimport { ensureGitignore } from '../core/gitignore.js';\n\nexport interface MigrateOptions {\n dryRun?: boolean;\n yes?: boolean;\n}\n\nexport interface Migration {\n id: string;\n name: string;\n /** true if, after this function returns, there is nothing left to migrate of this type. */\n isApplied: (paths: SquadPaths) => boolean | Promise<boolean>;\n /** The destructive side-effect. Only called when --dry-run is false and the user confirmed. */\n apply: (paths: SquadPaths) => void | Promise<void>;\n /** Human-readable one-liner describing what apply() will do. */\n describe: (paths: SquadPaths) => string;\n}\n\nconst LEGACY_PROMPTS_MIGRATION: Migration = {\n id: 'legacy-prompts',\n name: 'Remove legacy .squad/prompts/',\n isApplied: (paths) => !fs.existsSync(paths.promptsDir),\n describe: (paths) =>\n `delete ${path.relative(paths.root, paths.promptsDir)} (prompts are now bundled in squad-kit)`,\n apply: (paths) => {\n const target = paths.promptsDir;\n if (!target.includes(path.sep + '.squad' + path.sep + 'prompts')) {\n throw new Error(\n `Refusing to delete suspicious path: ${target}. This is a safety check — run \\`squad doctor\\` if .squad/ paths look wrong.`,\n );\n }\n if (fs.existsSync(target)) {\n fs.rmSync(target, { recursive: true, force: true });\n }\n },\n};\n\nconst GITIGNORE_MIGRATION: Migration = {\n id: 'gitignore',\n name: 'Ensure .gitignore managed block',\n isApplied: (paths) => {\n const f = path.join(paths.root, '.gitignore');\n return fs.existsSync(f) && fs.readFileSync(f, 'utf8').includes('.squad/secrets.yaml');\n },\n describe: () => 'add squad-kit managed block to .gitignore',\n apply: (paths) => {\n ensureGitignore(paths.root);\n },\n};\n\nconst SECRETS_PERMS_MIGRATION: Migration = {\n id: 'secrets-perms',\n name: 'Tighten .squad/secrets.yaml permissions',\n isApplied: (paths) => {\n if (process.platform === 'win32') return true;\n if (!fs.existsSync(paths.secretsFile)) return true;\n const st = fs.statSync(paths.secretsFile);\n return (st.mode & 0o777) === 0o600;\n },\n describe: (paths) => `chmod 0600 ${path.relative(paths.root, paths.secretsFile)}`,\n apply: (paths) => {\n if (process.platform === 'win32') return;\n if (fs.existsSync(paths.secretsFile)) fs.chmodSync(paths.secretsFile, 0o600);\n },\n};\n\nconst PLANNER_BUDGET_DEFAULTS_MIGRATION: Migration = {\n id: 'planner-budget-defaults',\n name: 'Backfill planner.budget defaults in config.yaml',\n isApplied: (paths) => {\n if (!fs.existsSync(paths.configFile)) return true;\n try {\n const raw = fs.readFileSync(paths.configFile, 'utf8');\n if (!/^\\s*planner:/m.test(raw)) return true;\n if (/^\\s*budget:/m.test(raw)) return true;\n const cfg = loadConfig(paths.configFile);\n return !cfg.planner?.enabled;\n } catch {\n return true;\n }\n },\n describe: () => 'add planner.budget defaults to config.yaml',\n apply: (paths) => {\n const cfg = loadConfig(paths.configFile);\n if (cfg.planner?.enabled) saveConfig(paths.configFile, cfg);\n },\n};\n\nconst CONFIG_NORMALIZE_MIGRATION: Migration = {\n id: 'config-normalize',\n name: 'Normalise .squad/config.yaml formatting',\n isApplied: (paths) => {\n if (!fs.existsSync(paths.configFile)) return true;\n try {\n const raw = fs.readFileSync(paths.configFile, 'utf8');\n const cfg = loadConfig(paths.configFile);\n return raw.trim() === serializeConfig(cfg).trim();\n } catch {\n return true;\n }\n },\n describe: () => 'rewrite config.yaml with canonical YAML formatting (drops comments)',\n apply: (paths) => {\n if (!fs.existsSync(paths.configFile)) return;\n const cfg = loadConfig(paths.configFile);\n saveConfig(paths.configFile, cfg);\n },\n};\n\nexport const MIGRATIONS: Migration[] = [\n LEGACY_PROMPTS_MIGRATION,\n GITIGNORE_MIGRATION,\n SECRETS_PERMS_MIGRATION,\n PLANNER_BUDGET_DEFAULTS_MIGRATION,\n CONFIG_NORMALIZE_MIGRATION,\n];\n\nexport async function runMigrate(opts: MigrateOptions): Promise<void> {\n const root = findSquadRoot();\n if (!root) {\n ui.failure('No .squad/ directory found. Run `squad init` first.');\n process.exit(1);\n }\n const paths = buildPaths(root);\n\n const pending: Migration[] = [];\n for (const m of MIGRATIONS) {\n const already = await Promise.resolve(m.isApplied(paths));\n if (!already) pending.push(m);\n }\n\n ui.divider('squad migrate');\n ui.info(`workspace ${root}`);\n ui.info('');\n\n if (pending.length === 0) {\n ui.success('No migrations needed. Your .squad/ is up to date.');\n return;\n }\n\n ui.info(`${pending.length} migration(s) pending:`);\n for (const m of pending) {\n ui.line(` · ${m.name} — ${m.describe(paths)}`);\n }\n ui.info('');\n\n if (opts.dryRun) {\n ui.info('Dry run: no changes applied. Re-run without --dry-run to apply.');\n return;\n }\n\n if (!opts.yes) {\n const interactive = Boolean(process.stdin.isTTY) && process.env.CI !== 'true';\n if (!interactive) {\n ui.failure(\n 'Refusing to apply migrations without --yes in a non-interactive shell. Run `squad migrate --yes` to apply without a prompt, or re-run in a TTY to confirm interactively.',\n );\n process.exit(1);\n }\n const go = await confirm({ message: `Apply ${pending.length} migration(s)?`, default: true });\n if (!go) {\n ui.info('Cancelled. No changes applied.');\n return;\n }\n }\n\n let applied = 0;\n for (const m of pending) {\n const spin = ui.spinner(m.name);\n try {\n await Promise.resolve(m.apply(paths));\n spin.succeed(`${m.name} — applied`);\n applied++;\n } catch (err) {\n spin.fail(`${m.name} — failed: ${(err as Error).message}`);\n process.exit(1);\n }\n }\n ui.info('');\n ui.success(`Applied ${applied}/${pending.length} migration(s).`);\n ui.blank();\n ui.step('Next:');\n ui.info('1) Run `squad doctor` to verify every check is green.');\n ui.info('2) If you were upgrading from 0.1.x, review .squad/config.yaml — new defaults (planner, cache) may have been added.');\n ui.info('3) Continue your usual workflow: `squad new-story` → fill intake → `squad new-plan`.');\n}\n","import { spawn } from 'node:child_process';\nimport process from 'node:process';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { changelogBlobUrl, readInstalledPackage } from '../core/package-info.js';\nimport { fetchLatest, isNewer } from '../core/registry.js';\nimport { detectPackageManager, installCommandFor } from '../core/package-manager.js';\n\nconst REGISTRY_HOST = 'registry.npmjs.org';\n\nexport interface UpgradeOptions {\n check?: boolean;\n yes?: boolean;\n}\n\nexport async function runUpgrade(opts: UpgradeOptions): Promise<void> {\n const installed = readInstalledPackage();\n ui.divider('squad upgrade');\n ui.info(` installed ${installed.version}`);\n\n if (installed.isDevInstall) {\n ui.failure(\n 'Development install detected (source directory alongside the binary). Run `pnpm add -g squad-kit@latest` (or `npm i -g squad-kit@latest`) from npm, not a source checkout.',\n );\n process.exit(1);\n }\n\n let latest: string;\n try {\n const info = await fetchLatest(installed.name);\n latest = info.latest;\n } catch (err) {\n ui.failure(\n `Could not reach the npm registry: ${(err as Error).message}. Check your network, then run \\`pnpm add -g squad-kit@latest\\` (or \\`npm i -g squad-kit@latest\\`) manually.`,\n );\n process.exit(1);\n }\n\n ui.info(` latest ${latest} (from ${REGISTRY_HOST})`);\n\n if (!isNewer(latest, installed.version)) {\n ui.blank();\n ui.success(`You're on the latest version (${installed.version}).`);\n return;\n }\n\n const [installedMajor = 0] = installed.version.split('.').map((n) => parseInt(n, 10) || 0);\n const [latestMajor = 0] = latest.split('.').map((n) => parseInt(n, 10) || 0);\n if (latestMajor > installedMajor) {\n ui.blank();\n ui.failure(\n `Major version change detected (${installed.version} → ${latest}). Run \\`squad upgrade --check\\` after you install a specific version, and review: ${changelogBlobUrl(installed.repositoryUrl, latest)}`,\n );\n process.exit(1);\n }\n\n const pm = detectPackageManager(installed.root);\n const { cmd, args } = installCommandFor(pm.pm, installed.name, latest);\n\n ui.blank();\n ui.info(`Detected package manager: ${pm.pm} (${pm.reason})`);\n ui.info(`Changelog: ${changelogBlobUrl(installed.repositoryUrl, latest)}`);\n\n if (opts.check) {\n ui.blank();\n ui.info(`Run to upgrade: ${cmd} ${args.join(' ')}`);\n return;\n }\n\n if (!opts.yes) {\n const interactive = Boolean(process.stdin.isTTY) && process.env.CI !== 'true';\n if (!interactive) {\n ui.failure(\n `Refusing to run a global install without --yes. Run \\`squad upgrade --yes\\` in non-interactive mode, or run manually: ${cmd} ${args.join(' ')}`,\n );\n process.exit(1);\n }\n const go = await confirm({ message: `Run \"${cmd} ${args.join(' ')}\"?`, default: true });\n if (!go) {\n ui.info('Cancelled. No changes applied.');\n return;\n }\n }\n\n ui.blank();\n ui.info(`Running: ${cmd} ${args.join(' ')}`);\n const exitCode = await spawnInherit(cmd, args);\n\n if (exitCode !== 0) {\n ui.failure(\n `${cmd} exited with code ${exitCode}. Upgrade may be incomplete — run \\`squad doctor\\` and re-run \\`squad upgrade\\` if needed.`,\n );\n process.exit(exitCode);\n }\n\n ui.blank();\n ui.success(`Upgraded to ${latest}.`);\n ui.info('Run `squad migrate` to update your .squad/ structure if needed.');\n}\n\nfunction spawnInherit(cmd: string, args: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, { stdio: 'inherit', shell: process.platform === 'win32' });\n child.on('exit', (code) => resolve(code ?? 0));\n child.on('error', (err) => reject(err));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { packageRoot } from '../utils/fs.js';\n\nexport interface InstalledPackage {\n name: string;\n version: string;\n root: string;\n /** Git repository URL from package.json (for changelog links). */\n repositoryUrl?: string;\n /** True if the binary is running from a linked local checkout (pnpm link, npm link). */\n isDevInstall: boolean;\n}\n\n/**\n * Build a GitHub/GitLab-style blob URL for CHANGELOG.md at a tagged release.\n */\nexport function changelogBlobUrl(repositoryUrl: string | undefined, version: string): string {\n let base = repositoryUrl;\n if (!base) base = 'https://github.com/AzmSquad/squad-kit';\n if (base.startsWith('git+')) base = base.slice(4);\n if (base.endsWith('.git')) base = base.slice(0, -4);\n base = base.replace(/\\/$/, '');\n return `${base}/blob/v${version}/CHANGELOG.md`;\n}\n\nexport function readInstalledPackage(): InstalledPackage {\n const root = packageRoot();\n const pkgFile = path.join(root, 'package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgFile, 'utf8')) as {\n name: string;\n version: string;\n repository?: { url?: string };\n };\n\n // Dev-install detection: the package root contains a `src/` directory (source lives alongside dist).\n // Registry installs only ship dist/ + templates/ (per the files field in package.json).\n const isDevInstall = fs.existsSync(path.join(root, 'src'));\n\n return {\n name: pkg.name,\n version: pkg.version,\n root,\n repositoryUrl: pkg.repository?.url,\n isDevInstall,\n };\n}\n","const REGISTRY_BASE = 'https://registry.npmjs.org';\n\nexport interface RegistryInfo {\n latest: string;\n versions: string[];\n}\n\nexport async function fetchLatest(packageName: string, timeoutMs = 5000): Promise<RegistryInfo> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(`${REGISTRY_BASE}/${encodeURIComponent(packageName)}`, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n if (!res.ok) throw new Error(`registry ${res.status}: ${await res.text().catch(() => '')}`.slice(0, 200));\n const body = (await res.json()) as { 'dist-tags': { latest: string }; versions: Record<string, unknown> };\n return {\n latest: body['dist-tags'].latest,\n versions: Object.keys(body.versions),\n };\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport function isNewer(a: string, b: string): boolean {\n // Simple semver-minor compare without importing a package. Handles x.y.z only.\n const parse = (v: string) => v.split('.').map((n) => parseInt(n, 10) || 0);\n const [a1 = 0, a2 = 0, a3 = 0] = parse(a);\n const [b1 = 0, b2 = 0, b3 = 0] = parse(b);\n if (a1 !== b1) return a1 > b1;\n if (a2 !== b2) return a2 > b2;\n return a3 > b3;\n}\n","import path from 'node:path';\nimport process from 'node:process';\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\nexport interface DetectedPM {\n pm: PackageManager;\n /** Why we think this — e.g. \"binary path contains ~/.pnpm/\" or \"npm_config_user_agent\". */\n reason: string;\n}\n\n/**\n * Best-effort detection based on the current process metadata and the installed binary path.\n * Order of preference: explicit user-agent > install-path heuristic > fallback to npm.\n */\nexport function detectPackageManager(installRoot: string): DetectedPM {\n const ua = process.env.npm_config_user_agent;\n if (ua) {\n if (ua.startsWith('pnpm/')) return { pm: 'pnpm', reason: 'npm_config_user_agent' };\n if (ua.startsWith('yarn/')) return { pm: 'yarn', reason: 'npm_config_user_agent' };\n if (ua.startsWith('bun/')) return { pm: 'bun', reason: 'npm_config_user_agent' };\n if (ua.startsWith('npm/')) return { pm: 'npm', reason: 'npm_config_user_agent' };\n }\n\n // Path-based heuristic: where is the package installed?\n const root = installRoot.toLowerCase();\n if (root.includes(`${path.sep}pnpm${path.sep}`) || root.includes(`${path.sep}.pnpm${path.sep}`))\n return { pm: 'pnpm', reason: `install path contains pnpm` };\n if (root.includes(`${path.sep}.yarn${path.sep}`) || root.includes(`${path.sep}yarn${path.sep}`))\n return { pm: 'yarn', reason: `install path contains yarn` };\n if (root.includes(`${path.sep}.bun${path.sep}`) || root.includes(`${path.sep}bun${path.sep}`))\n return { pm: 'bun', reason: `install path contains bun` };\n\n return { pm: 'npm', reason: 'default fallback' };\n}\n\nexport function installCommandFor(pm: PackageManager, pkg: string, version: string): { cmd: string; args: string[] } {\n const spec = `${pkg}@${version}`;\n switch (pm) {\n case 'pnpm':\n return { cmd: 'pnpm', args: ['add', '-g', spec] };\n case 'yarn':\n return { cmd: 'yarn', args: ['global', 'add', spec] };\n case 'bun':\n return { cmd: 'bun', args: ['install', '-g', spec] };\n case 'npm':\n return { cmd: 'npm', args: ['install', '-g', spec] };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { select } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { isInteractive } from '../../ui/tty.js';\nimport { formatSequence } from '../../core/sequence.js';\nimport { findStoryByIntake, listAllStories, listFeatures, type StoryRecord } from '../../core/stories.js';\nimport type { SquadPaths } from '../../core/paths.js';\n\nconst STORY_PLAN = /^(\\d{2,})-story-.+\\.md$/;\n\nexport interface RmBaseOptions {\n dryRun?: boolean;\n trash?: boolean;\n yes?: boolean;\n feature?: string;\n}\n\nexport function canPromptForRm(opts: { yes?: boolean }): boolean {\n if (opts.yes) return false;\n return isInteractive() && Boolean(process.stdin.isTTY);\n}\n\n/**\n * Remove the overview row for a story (matched by storyId appearing in the row text).\n * Idempotent: missing row or missing file is a no-op.\n */\nexport function removeOverviewRow(featurePlanDir: string, storyId: string): void {\n const overview = path.join(featurePlanDir, '00-overview.md');\n if (!fs.existsSync(overview)) return;\n const src = fs.readFileSync(overview, 'utf8');\n const lines = src.split('\\n');\n const filtered = lines.filter((line) => {\n if (!line.startsWith('|')) return true;\n if (line.includes('NN') && line.includes('File') && line.includes('Title')) return true;\n if (/^\\|\\s*-+/.test(line)) return true;\n return !line.includes(storyId);\n });\n fs.writeFileSync(overview, filtered.join('\\n'), 'utf8');\n}\n\n/** Remove a table row that references a plan file basename. */\nexport function removeOverviewRowForPlanFile(featurePlanDir: string, planBasename: string): void {\n const overview = path.join(featurePlanDir, '00-overview.md');\n if (!fs.existsSync(overview)) return;\n const src = fs.readFileSync(overview, 'utf8');\n const token = `\\`${planBasename}\\``;\n const lines = src.split('\\n');\n const filtered = lines.filter((line) => {\n if (!line.startsWith('|')) return true;\n if (line.includes('NN') && line.includes('File') && line.includes('Title')) return true;\n if (/^\\|\\s*-+/.test(line)) return true;\n return !line.includes(token);\n });\n fs.writeFileSync(overview, filtered.join('\\n'), 'utf8');\n}\n\nexport function trashOrDelete(\n absPaths: string[],\n trashRoot: string,\n useTrash: boolean,\n): { removed: string[]; trashed?: string } {\n if (!useTrash) {\n for (const p of absPaths) fs.rmSync(p, { recursive: true, force: true });\n return { removed: absPaths };\n }\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const bucket = path.join(trashRoot, ts);\n fs.mkdirSync(bucket, { recursive: true });\n for (const src of absPaths) {\n const rel = path.basename(src);\n let dst = path.join(bucket, rel);\n let n = 0;\n while (fs.existsSync(dst)) {\n n += 1;\n dst = path.join(bucket, `${n}_${rel}`);\n }\n fs.renameSync(src, dst);\n }\n return { removed: absPaths, trashed: bucket };\n}\n\nexport function renderPreview(\n kind: 'story' | 'plan' | 'feature',\n targets: Array<{ label: string; absPath: string; kind: 'dir' | 'file' }>,\n opts: { dryRun: boolean; trash: boolean; trashRoot: string },\n): void {\n ui.divider(`squad rm ${kind}`);\n ui.step(opts.dryRun ? 'Dry run — nothing will be changed.' : 'About to remove:');\n for (const t of targets) {\n ui.kv(t.kind, t.label, 6);\n }\n if (opts.trash) {\n ui.info(`Items will move to ${path.relative(process.cwd(), opts.trashRoot)}/<timestamp>/`);\n } else if (!opts.dryRun) {\n ui.warning('This is a permanent delete. Pass --trash to move to .squad/.trash/ instead.');\n }\n}\n\nexport interface PlanListEntry {\n feature: string;\n file: string;\n abs: string;\n}\n\nexport function listAllPlanListEntries(paths: SquadPaths, featureFilter?: string): PlanListEntry[] {\n if (!fs.existsSync(paths.plansDir)) return [];\n const out: PlanListEntry[] = [];\n for (const ent of fs.readdirSync(paths.plansDir, { withFileTypes: true })) {\n if (!ent.isDirectory()) continue;\n if (featureFilter && ent.name !== featureFilter) continue;\n const featureDir = path.join(paths.plansDir, ent.name);\n for (const name of fs.readdirSync(featureDir)) {\n if (!STORY_PLAN.test(name)) continue;\n out.push({ feature: ent.name, file: name, abs: path.join(featureDir, name) });\n }\n }\n return out.sort((a, b) => (a.feature + a.file).localeCompare(b.feature + b.file));\n}\n\nexport async function pickStoryInteractive(paths: SquadPaths, featureFilter?: string): Promise<StoryRecord> {\n const stories = listAllStories(paths).filter((s) => !featureFilter || s.feature === featureFilter);\n if (stories.length === 0) {\n throw new Error('No stories to pick. Run `squad new-story` first, or `squad list` to verify paths.');\n }\n if (stories.length === 1) return stories[0]!;\n const choice = await select<StoryRecord>({\n message: 'Story to remove:',\n choices: stories.map((s) => ({\n name: `${s.feature}/${s.id} · ${s.titleHint ?? s.id}`,\n value: s,\n })),\n });\n return choice;\n}\n\nexport async function pickPlanInteractive(paths: SquadPaths, featureFilter?: string): Promise<PlanListEntry> {\n const plans = listAllPlanListEntries(paths, featureFilter);\n if (plans.length === 0) {\n throw new Error('No plan files to pick. Run `squad new-plan` first, or `squad list` to see plans.');\n }\n if (plans.length === 1) return plans[0]!;\n return select<PlanListEntry>({\n message: 'Plan file to remove:',\n choices: plans.map((p) => ({\n name: `${p.feature}/${p.file}`,\n value: p,\n })),\n });\n}\n\nexport async function pickFeatureInteractive(paths: SquadPaths): Promise<string> {\n const feats = listFeatures(paths);\n if (feats.length === 0) {\n throw new Error('No features to pick. Run `squad new-story` first, or `squad list` to see features.');\n }\n if (feats.length === 1) return feats[0]!;\n return select<string>({\n message: 'Feature to remove:',\n choices: feats.map((f) => ({ name: f, value: f })),\n });\n}\n\nexport function resolveStoryFromArg(\n arg: string,\n stories: StoryRecord[],\n root: string,\n): StoryRecord | undefined {\n const t = arg.trim();\n for (const s of stories) {\n if (s.id === t) return s;\n if (`${s.feature}/${s.id}` === t) return s;\n }\n const abs = path.isAbsolute(t) ? t : path.resolve(root, t);\n const withIntake = t.endsWith('intake.md') ? abs : path.join(abs, 'intake.md');\n return findStoryByIntake(stories, withIntake) ?? findStoryByIntake(stories, abs);\n}\n\nfunction isSequenceToken(s: string): boolean {\n return /^\\d{1,4}$/.test(s) && s.length > 0;\n}\n\nfunction tryParsePlanFilePath(absPath: string, paths: SquadPaths, featureFilter: string | undefined): PlanListEntry | undefined {\n if (!fs.existsSync(absPath) || !STORY_PLAN.test(path.basename(absPath))) return undefined;\n const planRoot = fs.realpathSync(path.resolve(paths.plansDir));\n const fileReal = fs.realpathSync(path.resolve(absPath));\n const rel = path.relative(planRoot, fileReal);\n if (rel.startsWith('..') || path.isAbsolute(rel)) return undefined;\n const segs = rel.split(path.sep);\n if (segs.length < 2) return undefined;\n const feature = segs[0]!;\n const file = segs.slice(1).join(path.sep);\n if (featureFilter && feature !== featureFilter) return undefined;\n return { feature, file, abs: path.resolve(absPath) };\n}\n\nexport function resolvePlanFromArg(\n arg: string,\n paths: SquadPaths,\n featureFilter: string | undefined,\n): PlanListEntry | undefined {\n const t = arg.trim();\n if (!t) return undefined;\n\n const asPath = path.isAbsolute(t) ? t : path.resolve(process.cwd(), t);\n const a = tryParsePlanFilePath(asPath, paths, featureFilter);\n if (a) return a;\n if (!path.isAbsolute(t)) {\n const under = tryParsePlanFilePath(path.join(paths.plansDir, t), paths, featureFilter);\n if (under) return under;\n }\n\n if (isSequenceToken(t)) {\n const nn = formatSequence(parseInt(t, 10));\n const prefix = `${nn}-`;\n const cands: PlanListEntry[] = [];\n for (const p of listAllPlanListEntries(paths, featureFilter)) {\n if (p.file.startsWith(prefix)) cands.push(p);\n }\n if (cands.length === 1) return cands[0]!;\n if (cands.length > 1) {\n throw new Error(\n `Multiple plans match sequence \"${t}\". Run \\`squad rm plan\\` in a TTY, or add \\`--feature <slug>\\` to disambiguate.`,\n );\n }\n }\n\n return undefined;\n}\n\nexport function countOverviewDataRows(overviewContent: string): number {\n let n = 0;\n for (const line of overviewContent.split('\\n')) {\n if (!line.startsWith('|')) continue;\n if (/^\\|\\s*-+/.test(line)) continue;\n if (line.includes('NN') && line.includes('File') && line.includes('Title')) continue;\n n++;\n }\n return n;\n}\n\nexport function featureStoriesDirEmpty(paths: SquadPaths, feature: string): boolean {\n const d = path.join(paths.storiesDir, feature);\n if (!fs.existsSync(d)) return true;\n return fs.readdirSync(d).length === 0;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { listAllStories } from '../../core/stories.js';\nimport type { StoryRecord } from '../../core/stories.js';\nimport {\n canPromptForRm,\n countOverviewDataRows,\n featureStoriesDirEmpty,\n pickStoryInteractive,\n removeOverviewRow,\n renderPreview,\n resolveStoryFromArg,\n trashOrDelete,\n type RmBaseOptions,\n} from './shared.js';\nimport { runRmFeature } from './feature.js';\n\nexport interface RmStoryOptions extends RmBaseOptions {}\n\nexport async function runRmStory(storyPathOrId: string | undefined, opts: RmStoryOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const dryRun = !!opts.dryRun;\n const useTrash = !!opts.trash;\n const yes = !!opts.yes;\n const featureFilter = opts.feature?.trim() || undefined;\n\n const stories = listAllStories(paths).filter((s) => !featureFilter || s.feature === featureFilter);\n\n if (stories.length === 0) {\n ui.info('No stories to delete. Create one with `squad new-story`.');\n return;\n }\n\n const canPrompt = canPromptForRm({ yes });\n let story: StoryRecord | undefined;\n\n if (storyPathOrId?.trim()) {\n story = resolveStoryFromArg(storyPathOrId, stories, root);\n if (!story) {\n throw new Error(\n `\"${storyPathOrId.trim()}\" did not match any story. Run \\`squad rm story\\` without arguments to pick from a list, or \\`squad list\\` to see all stories.`,\n );\n }\n } else {\n if (stories.length === 1) {\n story = stories[0]!;\n } else if (!canPrompt) {\n throw new Error(\n 'Usage: squad rm story <path-or-id> — run `squad rm story` in a TTY to pick, or pass a path/id with `-y` to skip the confirmation once a target is chosen.',\n );\n } else {\n story = await pickStoryInteractive(paths, featureFilter);\n }\n }\n\n const targets: Array<{ label: string; absPath: string; kind: 'dir' | 'file' }> = [\n { label: path.relative(root, story.storyDir), absPath: story.storyDir, kind: 'dir' },\n ];\n if (story.planFile) {\n const planAbs = path.join(paths.plansDir, story.feature, story.planFile);\n targets.push({ label: path.relative(root, planAbs), absPath: planAbs, kind: 'file' });\n }\n\n renderPreview('story', targets, {\n dryRun,\n trash: useTrash,\n trashRoot: paths.trashDir,\n });\n\n if (dryRun) {\n ui.info('Dry run: no changes applied. Re-run without --dry-run to delete.');\n return;\n }\n\n if (!yes) {\n if (!canPrompt) {\n throw new Error(\n 'Pass --yes to confirm deletion in a non-interactive environment, or run `squad rm story` in a TTY to confirm the prompt interactively.',\n );\n }\n const ok = await confirm({ message: 'Delete this story and related plan/overview row?', default: false });\n if (!ok) {\n ui.info('Cancelled.');\n return;\n }\n }\n\n const absPaths = targets.map((t) => t.absPath);\n const result = trashOrDelete(absPaths, paths.trashDir, useTrash);\n removeOverviewRow(path.join(paths.plansDir, story.feature), story.id);\n\n if (result.trashed) {\n ui.success(`Removed (moved to ${path.relative(root, result.trashed)}).`);\n } else {\n ui.success('Removed story folder, plan file (if any), and overview row.');\n }\n\n const featurePlanDir = path.join(paths.plansDir, story.feature);\n const overviewPath = path.join(featurePlanDir, '00-overview.md');\n if (fs.existsSync(overviewPath)) {\n const body = fs.readFileSync(overviewPath, 'utf8');\n const onlyShell = countOverviewDataRows(body) === 0;\n if (onlyShell && featureStoriesDirEmpty(paths, story.feature)) {\n if (canPrompt) {\n const also = await confirm({\n message: `Feature \"${story.feature}\" has no stories left and an empty overview table. Remove the whole feature with \\`squad rm feature ${story.feature}\\` now?`,\n default: false,\n });\n if (also) {\n await runRmFeature(story.feature, { dryRun: false, trash: useTrash, yes: true });\n return;\n }\n } else {\n ui.info(`Feature \"${story.feature}\" has no stories under .squad/stories/ and no overview rows. Run \\`squad rm feature ${story.feature}\\` to remove the feature directories.`);\n }\n }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { listFeatures } from '../../core/stories.js';\nimport { listAllPlanListEntries, canPromptForRm, pickFeatureInteractive, trashOrDelete, type RmBaseOptions } from './shared.js';\n\nfunction countStoryDirs(storiesDir: string, feature: string): number {\n const d = path.join(storiesDir, feature);\n if (!fs.existsSync(d)) return 0;\n return fs.readdirSync(d, { withFileTypes: true }).filter((x) => x.isDirectory()).length;\n}\n\nexport interface RmFeatureOptions extends RmBaseOptions {}\n\nexport async function runRmFeature(featureSlug: string | undefined, opts: RmFeatureOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const dryRun = !!opts.dryRun;\n const useTrash = !!opts.trash;\n const yes = !!opts.yes;\n const canPrompt = canPromptForRm({ yes });\n\n const feats = listFeatures(paths);\n if (feats.length === 0) {\n ui.info('No feature directories found under .squad/stories/.');\n return;\n }\n\n let feature: string;\n if (featureSlug?.trim()) {\n const t = featureSlug.trim();\n if (!feats.includes(t)) {\n throw new Error(\n `No feature \"${t}\" found. Run \\`squad list\\` or \\`squad rm feature\\` without arguments to pick a feature.`,\n );\n }\n feature = t;\n } else {\n if (feats.length === 1) {\n feature = feats[0]!;\n } else if (!canPrompt) {\n throw new Error(\n 'This command removes an entire feature. Run `squad rm feature <slug> --yes` in CI, or `squad rm feature` in a TTY to pick a feature interactively.',\n );\n } else {\n feature = await pickFeatureInteractive(paths);\n }\n }\n\n const storyDir = path.join(paths.storiesDir, feature);\n const planDir = path.join(paths.plansDir, feature);\n const nStories = countStoryDirs(paths.storiesDir, feature);\n const nPlans = listAllPlanListEntries(paths, feature).length;\n const hasOverview = fs.existsSync(path.join(planDir, '00-overview.md')) ? 1 : 0;\n\n const targets: Array<{ label: string; absPath: string; kind: 'dir' | 'file' }> = [];\n if (fs.existsSync(storyDir)) {\n targets.push({ label: path.relative(root, storyDir), absPath: storyDir, kind: 'dir' });\n }\n if (fs.existsSync(planDir)) {\n targets.push({ label: path.relative(root, planDir), absPath: planDir, kind: 'dir' });\n }\n\n ui.divider('squad rm feature');\n ui.info(`Feature: ${feature}`);\n ui.info(`Delete: ${nStories} stories, ${nPlans} plans, ${hasOverview} overview file`);\n ui.info('Paths:');\n for (const t of targets) {\n ui.line(` ${t.label}/`);\n }\n ui.blank();\n ui.step(dryRun ? 'Dry run — nothing will be changed.' : 'About to remove:');\n for (const t of targets) {\n ui.kv(t.kind, t.label, 6);\n }\n if (useTrash) {\n ui.info(`Items will move to ${path.relative(process.cwd(), paths.trashDir)}/<timestamp>/`);\n } else if (!dryRun) {\n ui.warning('This is a permanent delete. Pass --trash to move to .squad/.trash/ instead.');\n }\n\n if (dryRun) {\n ui.info('Dry run: no changes applied. Re-run without --dry-run to delete.');\n return;\n }\n\n if (targets.length === 0) {\n ui.info('Nothing to remove for this feature.');\n return;\n }\n\n if (!yes) {\n if (!canPrompt) {\n throw new Error(\n 'This command removes an entire feature. Run `squad rm feature --yes` in CI, or `squad rm feature` in a TTY to confirm the prompt interactively.',\n );\n }\n const ok = await confirm({\n message: `Delete all of feature \"${feature}\" (stories + plans)?`,\n default: false,\n });\n if (!ok) {\n ui.info('Cancelled.');\n return;\n }\n }\n\n const result = trashOrDelete(\n targets.map((t) => t.absPath),\n paths.trashDir,\n useTrash,\n );\n\n if (result.trashed) {\n ui.success(`Feature removed. Items moved to ${path.relative(root, result.trashed)}.`);\n } else {\n ui.success('Feature removed (stories and plans directories).');\n }\n ui.info('Run `squad doctor` to confirm the workspace is in a clean state.');\n}\n","import path from 'node:path';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { listStories } from '../../core/stories.js';\nimport {\n canPromptForRm,\n listAllPlanListEntries,\n pickPlanInteractive,\n removeOverviewRowForPlanFile,\n renderPreview,\n resolvePlanFromArg,\n trashOrDelete,\n type PlanListEntry,\n type RmBaseOptions,\n} from './shared.js';\n\nexport interface RmPlanOptions extends RmBaseOptions {}\n\nexport async function runRmPlan(planPathOrSequence: string | undefined, opts: RmPlanOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const dryRun = !!opts.dryRun;\n const useTrash = !!opts.trash;\n const yes = !!opts.yes;\n const featureFilter = opts.feature?.trim() || undefined;\n\n const allPlans = listAllPlanListEntries(paths, featureFilter);\n if (allPlans.length === 0) {\n ui.info('No plan files to delete. Run `squad new-plan` to generate one.');\n return;\n }\n\n const canPrompt = canPromptForRm({ yes });\n let plan: PlanListEntry | undefined;\n\n if (planPathOrSequence?.trim()) {\n plan = resolvePlanFromArg(planPathOrSequence, paths, featureFilter);\n if (!plan) {\n throw new Error(\n `Could not find a plan matching \"${planPathOrSequence.trim()}\". Run \\`squad rm plan\\` without arguments to pick from a list.`,\n );\n }\n } else {\n if (allPlans.length === 1) {\n plan = allPlans[0]!;\n } else if (!canPrompt) {\n throw new Error(\n 'Usage: squad rm plan <path|NN> — run `squad rm plan` in a TTY to pick, or pass `squad rm plan <path|NN> --yes` in CI.',\n );\n } else {\n plan = await pickPlanInteractive(paths, featureFilter);\n }\n }\n\n const storyRows = listStories(paths, { feature: plan.feature });\n const linked = storyRows.find((s) => s.planFile === plan.file);\n\n const targets = [{ label: path.relative(root, plan.abs), absPath: plan.abs, kind: 'file' as const }];\n renderPreview('plan', targets, {\n dryRun,\n trash: useTrash,\n trashRoot: paths.trashDir,\n });\n\n if (dryRun) {\n ui.info('Dry run: no changes applied. Re-run without --dry-run to delete.');\n return;\n }\n\n if (!yes) {\n if (!canPrompt) {\n throw new Error(\n 'Pass --yes to confirm deletion in a non-interactive environment, or run `squad rm plan` in a TTY.',\n );\n }\n const ok = await confirm({ message: 'Delete this plan file only? (intake and config are kept.)', default: false });\n if (!ok) {\n ui.info('Cancelled.');\n return;\n }\n }\n\n trashOrDelete([plan.abs], paths.trashDir, useTrash);\n removeOverviewRowForPlanFile(path.join(paths.plansDir, plan.feature), plan.file);\n\n const intakeHint = linked\n ? path.relative(root, linked.intakePath)\n : `under .squad/stories/${plan.feature}/`;\n ui.success(`Plan removed. Run \\`squad new-plan ${intakeHint}\\` to regenerate.`);\n}\n"],"mappings":"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","names":["boxen","boxen","fs","path","input","select","confirm","password","input","fs","path","next","fs","path","config","fs","fs","path","yaml","fs","fs","path","fs","config","config","fs","fs","confirm","password","config","fs","config","fs","config","fs","confirm","password","fs","select","fs","path","stripHtml","config","config","fs","select","fs","confirm","config","confirm","fs","fs","confirm","confirm","fs","path","fs","select","input","confirm","password","config","fs","path","input","select","fs","path","select","input","config","path","fs","fs","path","confirm","select","path","fs","path","input","base","API_URL","mapStop","mapStop","input","fs","path","walk","fs","path","fs","path","STORY_FILE","input","config","path","fs","line","fs","path","config","path","fs","select","confirm","fs","config","error","fs","path","path","fs","path","input","select","config","select","input","path","fs","fs","path","fs","path","config","error","fs","path","confirm","fs","path","confirm","spawn","process","confirm","fs","path","path","fs","path","process","process","info","confirm","spawn","fs","path","select","path","fs","line","select","fs","path","confirm","fs","path","confirm","path","fs","confirm","path","confirm","fs","path","confirm","path","confirm"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/ui/banner.ts","../src/ui/theme.ts","../src/ui/tty.ts","../src/ui/prefix.ts","../src/ui/spinner.ts","../src/ui/divider.ts","../src/ui/box.ts","../src/ui/error.ts","../src/core/cli-exit.ts","../src/commands/init.ts","../src/core/paths.ts","../src/core/gitignore.ts","../src/core/config.ts","../src/core/planner-models.ts","../src/core/secrets.ts","../src/utils/fs.ts","../src/core/template.ts","../src/commands/config/show.ts","../src/commands/config/masks.ts","../src/commands/config/set-planner.ts","../src/tracker/env-overlay.ts","../src/core/probes.ts","../src/commands/config/shared.ts","../src/commands/config/unset-planner.ts","../src/commands/config/set-tracker.ts","../src/tracker/types.ts","../src/tracker/attachments.ts","../src/tracker/azure.ts","../src/tracker/adf.ts","../src/tracker/jira.ts","../src/tracker/index.ts","../src/commands/config/unset-tracker.ts","../src/commands/config/remove-credential.ts","../src/commands/new-story.ts","../src/core/stories.ts","../src/core/tracker.ts","../src/core/story-intake-helpers.ts","../src/core/story-mutations.ts","../src/commands/rm/shared.ts","../src/core/sequence.ts","../src/commands/new-plan.ts","../src/utils/clipboard.ts","../src/planner/loop.ts","../src/planner/tools.ts","../src/planner/provider-errors.ts","../src/planner/stable-json.ts","../src/planner/providers/anthropic.ts","../src/planner/providers/openai.ts","../src/planner/providers/google.ts","../src/planner/providers/prefix.ts","../src/core/runs.ts","../src/planner/session-limits.ts","../src/planner/events.ts","../src/planner/planner-limit-messages.ts","../src/planner/providers/index.ts","../src/planner/budget.ts","../src/core/repo-map.ts","../src/planner/system-prompt.ts","../src/planner/writer.ts","../src/core/copy-plan-prompt.ts","../src/core/last-run.ts","../src/ui/planner-cache-summary.ts","../src/commands/status.ts","../src/commands/list.ts","../src/commands/tracker-link.ts","../src/commands/doctor-engine.ts","../src/commands/doctor.ts","../src/commands/migrate.ts","../src/commands/upgrade.ts","../src/core/package-info.ts","../src/core/registry.ts","../src/core/package-manager.ts","../src/commands/console.ts","../src/console/server.ts","../src/console/api/stories.ts","../src/utils/path-safety.ts","../src/console/api/plans.ts","../src/console/api/config.ts","../src/console/api/meta.ts","../src/console/api/runs.ts","../src/console/api/secrets.ts","../src/core/mask-token.ts","../src/console/api/tracker.ts","../src/commands/doctor-api.ts","../src/console/api/doctor.ts","../src/console/api/copy-plan-prompt.ts","../src/console/api/dashboard.ts","../src/console/api/projects.ts","../src/console/api/index.ts","../src/console/static-assets.ts","../src/console/auth.ts","../src/commands/rm/story.ts","../src/commands/rm/feature.ts","../src/commands/rm/plan.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as ui from './ui/index.js';\nimport { isSquadExit } from './core/cli-exit.js';\nimport { runInit, type InitOptions } from './commands/init.js';\nimport { runNewStory } from './commands/new-story.js';\nimport { runNewPlan } from './commands/new-plan.js';\nimport { runStatus } from './commands/status.js';\nimport { runList } from './commands/list.js';\nimport { runTrackerLink } from './commands/tracker-link.js';\nimport { runDoctor } from './commands/doctor.js';\nimport { runMigrate } from './commands/migrate.js';\nimport { runUpgrade } from './commands/upgrade.js';\nimport { runConsole } from './commands/console.js';\nimport {\n runConfigShow,\n runConfigSetPlanner,\n runConfigSetTracker,\n runConfigUnsetPlanner,\n runConfigUnsetTracker,\n runConfigRemoveCredential,\n} from './commands/config/index.js';\nimport { runRmFeature, runRmPlan, runRmStory } from './commands/rm/index.js';\n\nconst program = new Command();\n\nprogram\n .name('squad')\n .description('Plan once, execute cheap. A 3-step SDD workflow CLI.')\n .version('0.6.0');\n\nprogram\n .command('init')\n .description('Bootstrap .squad/ in the current directory')\n .option('--agents <list>', 'Comma-separated agent list: claude-code,cursor,copilot,gemini')\n .option('--tracker <type>', 'Tracker type: none|github|linear|jira|azure')\n .option(\n '--tracker-workspace <hostOrOrg>',\n 'Jira host or Azure org (non-interactive default; also written to config for jira/azure)',\n )\n .option('--tracker-project <name>', 'Azure project name (non-interactive; written to config when set)')\n .option('--name <name>', 'Project name')\n .option('--language <lang>', 'Primary language')\n .option('--force', 'Overwrite existing files', false)\n .option('-y, --yes', 'Accept defaults (non-interactive)', false)\n .option(\n '--skip-secrets-prompt',\n 'Do not prompt for tracker or planner API keys (leaves .squad/secrets.yaml unchanged)',\n false,\n )\n .option(\n '--planner <provider>',\n 'Enable direct planner and set provider (anthropic|openai|google). Implies non-interactive enable.',\n )\n .option('--no-planner', 'Disable direct planner in non-interactive mode (default when -y).', false)\n .action(\n wrap(\n (opts: InitOptions & { noPlanner?: boolean; planner?: string; agents?: string; skipSecretsPrompt?: boolean }) => {\n const { noPlanner, skipSecretsPrompt, ...rest } = opts;\n const noPromptSecrets =\n Boolean(skipSecretsPrompt) || process.argv.includes('--no-prompt-secrets');\n return runInit({\n ...rest,\n noPromptSecrets,\n planner: noPlanner ? false : rest.planner,\n });\n },\n ),\n );\n\nprogram\n .command('new-story [feature-slug]')\n .description('Scaffold a new story intake under .squad/stories/<feature>/<id>/')\n .option('--id <id>', 'Tracker work-item id (used for folder name and auto-fetch when configured)')\n .option('--title <title>', 'Short title hint (placed at top of intake)')\n .option('-y, --yes', 'Fail fast instead of prompting for missing values', false)\n .option('--no-fetch', 'Skip tracker auto-fetch even when tracker and credentials are configured')\n .option('--no-attachments', 'Fetch issue metadata but do not download attachments')\n .option('--attachment-mb <n>', 'Override attachment size cap in MB (default 10)', (v) => parseInt(v, 10))\n .option(\n '--no-tracker',\n 'Skip tracker fetch AND drop the tracker-id requirement for this story',\n )\n .action(wrapArgs(runNewStory));\n\nprogram\n .command('new-plan [intake-path]')\n .description('Generate a plan (via direct API when configured, otherwise copy-paste)')\n .option('--no-clipboard', 'Do not copy the composed prompt to clipboard (copy-paste mode only)')\n .option('--feature <slug>', 'Filter picker by feature slug')\n .option('--all', 'Include already-planned intakes in the picker', false)\n .option('-y, --yes', 'Skip confirmation prompts', false)\n .option('--api', 'Force direct planner API (fails if not configured)', false)\n .option('--copy', 'Force copy-paste mode even when planner API is configured', false)\n .action(wrapArgs(runNewPlan));\n\nprogram.command('status').description('Show squad-kit workspace status').action(wrap(runStatus));\n\nprogram\n .command('doctor')\n .description('Run a health check on the local .squad/ workspace and its external integrations')\n .option('--fix', 'Apply non-destructive repairs (gitignore, permissions, missing dirs)', false)\n .option('--json', 'Emit results as JSON to stdout (for scripting)', false)\n .action(wrap(runDoctor));\n\nprogram\n .command('migrate')\n .description('Apply one-shot structural migrations to bring .squad/ to the latest version')\n .option('--dry-run', 'Show what would change without touching the filesystem', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrap(runMigrate));\n\nprogram\n .command('upgrade')\n .description('Check for and install the latest squad-kit release')\n .option('--check', 'Only check for updates; do not install', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrap(runUpgrade));\n\nprogram\n .command('console')\n .description('Open the squad-kit web console (local, dark-modern UI for stories, plans, runs, config)')\n .option(\n '--port <number>',\n 'Port to bind on 127.0.0.1 (default 4571; falls back to next free port)',\n (v) => parseInt(v, 10),\n )\n .option('--no-open', 'Do not auto-open the browser; print the URL instead')\n .option('--token <hex>', 'Reuse a specific session token (advanced; default: random per session)')\n .action(wrap(runConsole));\n\nprogram\n .command('list')\n .description('List stories and their plan state')\n .option('--feature <slug>', 'Filter by feature slug')\n .action(wrap(runList));\n\nconst rm = program.command('rm').description('Delete stories, plans, or entire features safely');\n\nrm\n .command('story [story-path-or-id]')\n .description('Delete a story: intake folder + matching plan file + overview row')\n .option('--feature <slug>', 'Scope the picker or lookup to one feature')\n .option('--dry-run', 'Show what would be deleted without touching the filesystem', false)\n .option('--trash', 'Move into .squad/.trash/<ts>/ instead of permanent delete', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrapArgs(runRmStory));\n\nrm\n .command('plan [plan-path-or-sequence]')\n .description('Delete a single plan file; leaves the intake for regeneration with new-plan')\n .option('--feature <slug>', 'Scope the picker to one feature')\n .option('--dry-run', 'Show what would be deleted without touching the filesystem', false)\n .option('--trash', 'Move into .squad/.trash/<ts>/ instead of permanent delete', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrapArgs(runRmPlan));\n\nrm\n .command('feature [feature-slug]')\n .description('Delete an entire feature: every story, every plan, the overview file')\n .option('--dry-run', 'Show what would be deleted without touching the filesystem', false)\n .option('--trash', 'Move into .squad/.trash/<ts>/ instead of permanent delete', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrapArgs(runRmFeature));\n\nconst tracker = program.command('tracker').description('Tracker id helpers');\ntracker\n .command('link [story-path] [tracker-id]')\n .description('Attach/update a tracker id on an existing story intake')\n .option('-y, --yes', 'Fail fast instead of prompting for missing values', false)\n .action(wrapArgs(runTrackerLink));\n\nconst config = program.command('config').description('Inspect and change .squad/ settings');\n\nconfig\n .command('show')\n .description('Show the current .squad/config.yaml and .squad/secrets.yaml state (secrets masked)')\n .option('--json', 'Emit as JSON to stdout (secrets still masked)', false)\n .action(wrap(runConfigShow));\n\nconst set = config.command('set').description('Interactively change a section');\nset\n .command('planner')\n .description('Set or change the planner provider, model override, and credentials')\n .option('--provider <name>', 'Skip the provider prompt (anthropic|openai|google)')\n .option('-y, --yes', 'Fail fast instead of prompting for missing values', false)\n .action(wrap(runConfigSetPlanner));\nset\n .command('tracker')\n .description('Set or change the tracker type, workspace, and credentials')\n .option('--type <name>', 'Skip the tracker-type prompt (none|jira|azure|github|linear)')\n .option('-y, --yes', 'Fail fast instead of prompting for missing values', false)\n .action(wrap(runConfigSetTracker));\n\nconst unset = config.command('unset').description('Disable or clear a section');\nunset\n .command('planner')\n .description('Disable the direct planner (keeps provider credentials unless --remove-credentials)')\n .option('--remove-credentials', 'Also delete planner keys from .squad/secrets.yaml', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrap(runConfigUnsetPlanner));\nunset\n .command('tracker')\n .description('Set tracker.type back to \"none\" (keeps credentials unless --remove-credentials)')\n .option('--remove-credentials', 'Also delete tracker credentials from .squad/secrets.yaml', false)\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(wrap(runConfigUnsetTracker));\n\nconfig\n .command('remove-credential <section>')\n .description('Delete credentials for \"planner\" or \"tracker\" from .squad/secrets.yaml without touching config.yaml')\n .option('-y, --yes', 'Skip the confirmation prompt', false)\n .action(\n wrapArgs(\n (section: string, opts: { yes?: boolean }) => runConfigRemoveCredential(section, { yes: opts.yes }),\n ),\n );\n\nprogram.parseAsync(process.argv).catch((err) => {\n if (isSquadExit(err)) {\n if (err.message.trim()) ui.info(err.message);\n process.exit(err.exitCode);\n }\n ui.renderError(err);\n process.exit(1);\n});\n\nfunction wrap<T>(fn: (opts: T) => Promise<void>) {\n return async (opts: T) => {\n try {\n await fn(opts);\n } catch (err) {\n if (isSquadExit(err)) {\n if (err.message.trim()) ui.info(err.message);\n process.exit(err.exitCode);\n }\n ui.renderError(err);\n process.exit(1);\n }\n };\n}\n\nfunction wrapArgs<A extends unknown[]>(fn: (...args: A) => Promise<void>) {\n return async (...args: A) => {\n try {\n await fn(...args);\n } catch (err) {\n if (isSquadExit(err)) {\n if (err.message.trim()) ui.info(err.message);\n process.exit(err.exitCode);\n }\n ui.renderError(err);\n process.exit(1);\n }\n };\n}\n","import boxen from 'boxen';\nimport { accent, dim, primary } from './theme.js';\nimport { isInteractive } from './tty.js';\n\nexport function banner(): void {\n if (!isInteractive()) return;\n const title = primary('squad');\n const tagline = dim('plan once, execute cheap');\n const body = `${title} ${accent('·')} ${tagline}`;\n const boxed = boxen(body, {\n padding: { top: 0, bottom: 0, left: 2, right: 2 },\n margin: { top: 1, bottom: 1, left: 0, right: 0 },\n borderStyle: 'round',\n borderColor: 'green',\n });\n process.stderr.write(boxed + '\\n');\n}\n\nexport function bannerMinimal(): void {\n if (!isInteractive()) return;\n const line = ` ${primary('▸')} ${primary('squad')} ${dim('· plan once, execute cheap')}`;\n process.stderr.write(line + '\\n');\n process.stderr.write(' ' + dim('─'.repeat(42)) + '\\n\\n');\n}\n","import kleur from 'kleur';\n\nexport const BRAND = {\n primaryHex: '#7cffa0',\n accentHex: '#a393eb',\n} as const;\n\nexport const PREFIX = {\n running: '◆',\n success: '✓',\n failure: '✗',\n step: '▸',\n warn: '!',\n muted: '·',\n} as const;\n\nexport const SPINNER_FRAMES = ['◐', '◓', '◑', '◒'] as const;\n\nexport const primary = (s: string) => kleur.green(s);\nexport const accent = (s: string) => kleur.magenta(s);\nexport const muted = (s: string) => kleur.gray(s);\nexport const danger = (s: string) => kleur.red(s);\nexport const warn = (s: string) => kleur.yellow(s);\nexport const bold = (s: string) => kleur.bold(s);\nexport const dim = (s: string) => kleur.dim(s);\n","export function isInteractive(): boolean {\n if (process.env.CI) return false;\n if (process.env.SQUAD_QUIET) return false;\n return Boolean(process.stdout.isTTY && process.stderr.isTTY);\n}\n\nexport function stderrCols(): number {\n return process.stderr.columns ?? 80;\n}\n","import { PREFIX } from './theme.js';\nimport { accent, danger, dim, primary, warn } from './theme.js';\n\nexport const step = (msg: string) => process.stderr.write(` ${primary(PREFIX.step)} ${msg}\\n`);\nexport const success = (msg: string) => process.stderr.write(` ${primary(PREFIX.success)} ${msg}\\n`);\nexport const failure = (msg: string) => process.stderr.write(` ${danger(PREFIX.failure)} ${msg}\\n`);\nexport const warning = (msg: string) => process.stderr.write(` ${warn(PREFIX.warn)} ${msg}\\n`);\nexport const info = (msg: string) => process.stderr.write(` ${accent(PREFIX.muted)} ${dim(msg)}\\n`);\nexport const blank = () => process.stderr.write('\\n');\n\n/** Single line to stderr (for tables / doctor output). */\nexport function line(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n\nexport function kv(key: string, value: string, keyWidth = 10): void {\n process.stderr.write(` ${dim(key.padEnd(keyWidth))} ${value}\\n`);\n}\n","import ora, { type Ora } from 'ora';\nimport { SPINNER_FRAMES } from './theme.js';\nimport { isInteractive } from './tty.js';\n\nexport interface SquadSpinner {\n update(text: string): void;\n succeed(text?: string): void;\n fail(text?: string): void;\n stop(): void;\n}\n\nexport function spinner(text: string): SquadSpinner {\n if (!isInteractive()) {\n return {\n update: (t) => process.stderr.write(` ◆ ${t}\\n`),\n succeed: (t) => process.stderr.write(` ✓ ${t ?? text}\\n`),\n fail: (t) => process.stderr.write(` ✗ ${t ?? text}\\n`),\n stop: () => {},\n };\n }\n const instance: Ora = ora({\n text,\n stream: process.stderr,\n spinner: { interval: 120, frames: [...SPINNER_FRAMES] },\n color: 'green',\n prefixText: ' ',\n }).start();\n return {\n update: (t) => {\n instance.text = t;\n },\n succeed: (t) => instance.succeed(t),\n fail: (t) => instance.fail(t),\n stop: () => instance.stop(),\n };\n}\n","import { dim } from './theme.js';\nimport { stderrCols } from './tty.js';\n\nexport function divider(label?: string): void {\n const cols = Math.max(30, Math.min(stderrCols() - 4, 80));\n if (!label) {\n process.stderr.write(' ' + dim('─'.repeat(cols)) + '\\n');\n return;\n }\n const labelPart = ` ${label} `;\n const remaining = cols - labelPart.length - 2;\n const left = 2;\n const right = Math.max(2, remaining - left);\n process.stderr.write(' ' + dim('─'.repeat(left)) + labelPart + dim('─'.repeat(right)) + '\\n');\n}\n","import boxen from 'boxen';\nimport { dim } from './theme.js';\nimport { isInteractive } from './tty.js';\n\nexport interface SummaryRow {\n key: string;\n value: string;\n}\n\nexport function summaryBox(title: string, rows: SummaryRow[]): void {\n const keyWidth = Math.max(...rows.map((r) => r.key.length));\n const body = rows.map((r) => `${dim(r.key.padEnd(keyWidth))} ${r.value}`).join('\\n');\n\n if (!isInteractive()) {\n process.stderr.write(`\\n${title}\\n${body}\\n`);\n return;\n }\n\n const out = boxen(body, {\n title,\n titleAlignment: 'left',\n padding: { top: 0, bottom: 0, left: 1, right: 1 },\n margin: { top: 1, bottom: 0, left: 2, right: 0 },\n borderStyle: 'round',\n borderColor: 'green',\n });\n process.stderr.write(out + '\\n');\n}\n","import { danger } from './theme.js';\n\nexport function renderError(err: unknown): void {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(` ${danger('✗')} ${msg}\\n`);\n}\n","/** Thrown to exit the CLI with a specific code (after normal UI output). */\nexport class SquadExit extends Error {\n override readonly name = 'SquadExit';\n\n constructor(\n public readonly exitCode: number,\n message?: string,\n ) {\n super(message ?? '');\n }\n}\n\nexport function isSquadExit(err: unknown): err is SquadExit {\n return err instanceof SquadExit;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { input, select, checkbox, confirm, password } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { isInteractive } from '../ui/tty.js';\nimport { buildPaths, SQUAD_DIR } from '../core/paths.js';\nimport { ensureGitignore } from '../core/gitignore.js';\nimport {\n DEFAULT_PLANNER_MAX_OUTPUT_TOKENS,\n saveConfig,\n type SquadConfig,\n type TrackerType,\n} from '../core/config.js';\nimport { modelFor, providerEnvVar, resolveProviderKey } from '../core/planner-models.js';\nimport { copyTree, templatesDir, writeFileSafe, readFile } from '../utils/fs.js';\nimport { render } from '../core/template.js';\nimport type { PlannerConfig } from '../planner/types.js';\nimport type { ProviderName } from '../planner/types.js';\nimport { loadSecrets, saveSecrets, mergeSecrets, type SquadSecrets } from '../core/secrets.js';\nimport {\n runConfigSetPlanner,\n runConfigSetTracker,\n mergePlannerKeyIntoSecrets,\n promptJiraCredentials,\n promptAzureCredentials,\n} from './config/index.js';\n\nexport interface InitOptions {\n agents?: string;\n tracker?: TrackerType;\n /** Jira host or Azure org; used as default in prompts and in `-y` config when set. */\n trackerWorkspace?: string;\n /** Azure project; used as default in prompts and in `-y` config when set. */\n trackerProject?: string;\n name?: string;\n language?: string;\n force?: boolean;\n yes?: boolean;\n /** Skip Jira/Azure + planner key prompts (no writes to secrets.yaml from prompts). */\n noPromptSecrets?: boolean;\n /** String provider when `--planner`; `false` when `--no-planner` (commander). */\n planner?: string | false;\n}\n\nconst SUPPORTED_AGENTS = ['claude-code', 'cursor', 'copilot', 'gemini'] as const;\ntype AgentName = (typeof SUPPORTED_AGENTS)[number];\n\nconst AGENT_INSTALL: Record<AgentName, { subdir: string; srcDir: string }> = {\n 'claude-code': { subdir: path.join('.claude', 'commands'), srcDir: 'claude-code' },\n cursor: { subdir: path.join('.cursor', 'commands'), srcDir: 'cursor' },\n copilot: { subdir: path.join('.github', 'prompts'), srcDir: 'copilot' },\n gemini: { subdir: path.join('.gemini', 'commands'), srcDir: 'gemini' },\n};\n\nexport async function runInit(opts: InitOptions): Promise<void> {\n const root = process.cwd();\n const paths = buildPaths(root);\n\n if (!opts.yes) {\n ui.banner();\n }\n\n if (fs.existsSync(paths.configFile) && !opts.force) {\n if (!isInteractive() || opts.yes) {\n ui.warning(\n `A ${SQUAD_DIR}/config.yaml already exists. Run \\`squad init --force\\` to overwrite, or \\`squad config set planner\\` / \\`squad config set tracker\\` to change individual sections.`,\n );\n return;\n }\n const choice = (await select({\n message: `${SQUAD_DIR}/ already exists. What do you want to do?`,\n choices: [\n { name: 'Reconfigure planner (same as `squad config set planner`)', value: 'planner' as const },\n { name: 'Reconfigure tracker (same as `squad config set tracker`)', value: 'tracker' as const },\n { name: 'Overwrite everything (same as --force)', value: 'overwrite' as const },\n { name: 'Cancel', value: 'cancel' as const },\n ],\n })) as 'planner' | 'tracker' | 'overwrite' | 'cancel';\n if (choice === 'cancel') {\n return;\n }\n if (choice === 'planner') {\n return runConfigSetPlanner({});\n }\n if (choice === 'tracker') {\n return runConfigSetTracker({});\n }\n // overwrite: fall through\n }\n\n const defaults = {\n name: opts.name ?? path.basename(root),\n language: opts.language ?? 'typescript',\n tracker: (opts.tracker ?? 'none') as TrackerType,\n agents: parseAgentsFlag(opts.agents),\n };\n\n const answers = opts.yes\n ? defaults\n : {\n name: await input({ message: 'Project name', default: defaults.name }),\n language: await input({ message: 'Primary language', default: defaults.language }),\n tracker: (await select({\n message: 'Issue tracker',\n choices: [\n { name: 'None', value: 'none' as TrackerType },\n { name: 'GitHub Issues', value: 'github' as TrackerType },\n { name: 'Linear', value: 'linear' as TrackerType },\n { name: 'Jira', value: 'jira' as TrackerType },\n { name: 'Azure DevOps', value: 'azure' as TrackerType },\n ],\n default: defaults.tracker,\n })) as TrackerType,\n agents: (await checkbox({\n message: 'Install slash commands for which agents?',\n choices: SUPPORTED_AGENTS.map((a) => ({ name: a, value: a, checked: defaults.agents.includes(a) })),\n })) as AgentName[],\n };\n\n const includeTrackerId =\n answers.tracker !== 'none'\n ? await confirmSafe('Include tracker id in plan filenames (NN-story-<slug>-<id>.md)?', true, !!opts.yes)\n : false;\n\n const allowSecretPrompts = !opts.yes && !opts.noPromptSecrets;\n let trackerWorkspace = opts.trackerWorkspace?.trim() || undefined;\n let trackerProject = opts.trackerProject?.trim() || undefined;\n\n if (allowSecretPrompts && answers.tracker === 'jira') {\n ui.step('Jira Cloud credentials (stored in .squad/secrets.yaml — always git-ignored)');\n\n const { host, email, token } = await promptJiraCredentials({ host: trackerWorkspace });\n\n const base = loadSecrets(paths.secretsFile);\n const merged = mergeSecrets(base, {\n tracker: { jira: { host: host.trim(), email: email.trim(), token } },\n });\n saveSecrets(paths.secretsFile, merged);\n\n trackerWorkspace = host.trim();\n ui.success('Jira credentials saved');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n } else if (allowSecretPrompts && answers.tracker === 'azure') {\n ui.step('Azure DevOps credentials (stored in .squad/secrets.yaml — always git-ignored)');\n const a = await promptAzureCredentials({ organization: trackerWorkspace, project: trackerProject });\n const base = loadSecrets(paths.secretsFile);\n const merged = mergeSecrets(base, {\n tracker: {\n azure: { organization: a.organization, project: a.project, pat: a.pat },\n },\n });\n saveSecrets(paths.secretsFile, merged);\n\n trackerWorkspace = a.organization;\n trackerProject = a.project;\n ui.success('Azure DevOps credentials saved');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n }\n\n let plannerBlock: PlannerConfig | undefined;\n if (opts.yes) {\n if (opts.planner && opts.planner !== 'false') {\n const provider = opts.planner;\n if (!['anthropic', 'openai', 'google'].includes(provider)) {\n throw new Error(\n '--planner must be one of anthropic | openai | google. Run `squad init --planner anthropic` (or openai / google) with `--yes` in non-interactive mode.',\n );\n }\n plannerBlock = {\n enabled: true,\n provider: provider as ProviderName,\n mode: 'auto',\n budget: {\n maxFileReads: 25,\n maxContextBytes: 50_000,\n maxDurationSeconds: 180,\n },\n cache: { enabled: true },\n maxOutputTokens: DEFAULT_PLANNER_MAX_OUTPUT_TOKENS,\n };\n }\n } else {\n const plannerEnabled = await confirm({\n message:\n 'Enable automatic plan generation? (press Enter to skip — you can always edit .squad/config.yaml later)',\n default: false,\n });\n if (plannerEnabled) {\n const provider = (await select({\n message: 'Planner provider:',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' as ProviderName },\n { name: 'OpenAI (GPT)', value: 'openai' as ProviderName },\n { name: 'Google (Gemini)', value: 'google' as ProviderName },\n ],\n default: 'anthropic' as ProviderName,\n })) as ProviderName;\n plannerBlock = {\n enabled: true,\n provider,\n mode: 'auto',\n budget: {\n maxFileReads: 25,\n maxContextBytes: 50_000,\n maxDurationSeconds: 180,\n },\n cache: { enabled: true },\n maxOutputTokens: DEFAULT_PLANNER_MAX_OUTPUT_TOKENS,\n };\n }\n }\n\n if (plannerBlock?.enabled && allowSecretPrompts) {\n const envVar = providerEnvVar(plannerBlock.provider);\n const envPresent = Boolean(process.env[envVar]);\n if (envPresent) {\n ui.info(`Planner key detected in ${envVar}; keeping env-var resolution as the primary source.`);\n } else {\n const storeKey = (await select({\n message: `No ${envVar} in your environment. How do you want to store your planner API key?`,\n choices: [\n { name: `Enter it now and save to .squad/secrets.yaml (git-ignored)`, value: 'secrets' as const },\n { name: `I'll export ${envVar} in my shell profile myself`, value: 'env' as const },\n ],\n })) as 'secrets' | 'env';\n\n if (storeKey === 'secrets') {\n const key = await password({\n message: `${envVar} value (input hidden):`,\n validate: (v) => (v.length >= 20 ? true : 'key looks too short'),\n });\n const base = loadSecrets(paths.secretsFile);\n const merged = mergePlannerKeyIntoSecrets(base, plannerBlock.provider, key);\n saveSecrets(paths.secretsFile, merged);\n ui.success('Planner key saved to .squad/secrets.yaml');\n } else {\n ui.info(`Remember to export ${envVar} before running \\`squad new-plan\\`.`);\n }\n }\n }\n\n const trackerConfig: SquadConfig['tracker'] = { type: answers.tracker };\n if (answers.tracker === 'jira' || answers.tracker === 'azure') {\n if (trackerWorkspace) trackerConfig.workspace = trackerWorkspace;\n if (trackerProject) trackerConfig.project = trackerProject;\n }\n\n const config: SquadConfig = {\n version: 1,\n project: { name: answers.name, primaryLanguage: answers.language, projectRoots: ['.'] },\n tracker: trackerConfig,\n naming: { includeTrackerId, globalSequence: true },\n agents: answers.agents,\n planner: plannerBlock,\n };\n\n fs.mkdirSync(paths.squadDir, { recursive: true });\n fs.mkdirSync(paths.storiesDir, { recursive: true });\n fs.mkdirSync(paths.plansDir, { recursive: true });\n\n writeFileSafe(\n paths.indexFile,\n readFile(path.join(templatesDir(), 'index.md')),\n !!opts.force,\n );\n\n saveConfig(paths.configFile, config);\n\n if (ensureGitignore(paths.root)) {\n ui.info('Updated .gitignore with squad-managed patterns (e.g. .squad/secrets.yaml).');\n }\n\n writeFileSafe(\n path.join(paths.squadDir, 'README.md'),\n renderSquadReadme(config),\n !!opts.force,\n );\n\n for (const agent of answers.agents) {\n installAgent(root, agent as AgentName, !!opts.force);\n }\n\n ui.blank();\n ui.success(`Initialized ${SQUAD_DIR}/ at ${root}`);\n ui.kv('tracker', config.tracker.type, 7);\n ui.kv('agents', answers.agents.length ? answers.agents.join(', ') : '(none)', 7);\n if (plannerBlock) {\n const envVar = providerEnvVar(plannerBlock.provider);\n const hasKey = Boolean(resolveProviderKey(plannerBlock.provider));\n const model = modelFor(plannerBlock.provider, 'plan', plannerBlock.modelOverride);\n const overrideNote = plannerBlock.modelOverride?.[plannerBlock.provider] ? ' (override)' : '';\n ui.kv('planner', `${plannerBlock.provider}/${model}${overrideNote}`);\n ui.kv('key', hasKey ? `✓ (${envVar} or .squad/secrets.yaml)` : `missing (set ${envVar})`);\n if (!hasKey) {\n ui.blank();\n ui.warning('Planner key not found in environment or .squad/secrets.yaml.');\n ui.info('Set one of these before running `squad new-plan`:');\n ui.info(` export ${envVar}=<your-key>`);\n ui.info(' # or use a cross-provider fallback:');\n ui.info(' export SQUAD_PLANNER_API_KEY=<your-key>');\n ui.info(' # or re-run `squad init` and save the key to .squad/secrets.yaml when prompted.');\n ui.info('squad-kit never reads keys from .squad/config.yaml.');\n }\n }\n ui.blank();\n ui.step('Next:');\n ui.info('1) squad new-story <feature-slug>');\n ui.info('2) Fill the generated intake.md, then run /squad-plan in your agent (or squad new-plan).');\n}\n\nfunction parseAgentsFlag(flag?: string): AgentName[] {\n if (!flag) return [];\n return flag\n .split(',')\n .map((s) => s.trim())\n .filter((s): s is AgentName => (SUPPORTED_AGENTS as readonly string[]).includes(s));\n}\n\nasync function confirmSafe(message: string, defaultValue: boolean, nonInteractive: boolean): Promise<boolean> {\n if (nonInteractive) return defaultValue;\n return confirm({ message, default: defaultValue });\n}\n\nfunction installAgent(root: string, agent: AgentName, overwrite: boolean): void {\n const config = AGENT_INSTALL[agent];\n const src = path.join(templatesDir(), 'agents', config.srcDir);\n const dest = path.join(root, config.subdir);\n if (!fs.existsSync(src)) return;\n copyTree(src, dest, overwrite);\n}\n\nfunction renderSquadReadme(config: SquadConfig): string {\n return render(\n `# squad-kit workspace\n\nThis folder is managed by [squad-kit](https://github.com/AzmSquad/squad-kit).\n\n- **Project:** {{name}}\n- **Language:** {{language}}\n- **Tracker:** {{tracker}}\n\n## Workflow\n\n1. **Intake** — \\`squad new-story <feature-slug>\\` scaffolds \\`stories/<feature>/<id>/intake.md\\`. Paste the tracker title, description, and acceptance criteria.\n2. **Plan** — Run \\`/squad-plan <intake-path>\\` in your agent (or \\`squad new-plan <intake-path>\\` to get the composed prompt on stdout).\n3. **Implement** — Open a new, scoped agent session and attach **only** the generated \\`NN-story-*.md\\` file. Let a cheap model execute it.\n\nPlan meta-prompts (\\`generate-plan.md\\`, \\`story-skeleton.md\\`) ship inside the squad-kit package — they are not copied here. Upgrade squad-kit to update them.\n`,\n { name: config.project.name, language: config.project.primaryLanguage ?? '', tracker: config.tracker.type },\n );\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\n\nexport const SQUAD_DIR = '.squad';\n\nexport interface SquadPaths {\n root: string;\n squadDir: string;\n configFile: string;\n secretsFile: string;\n /**\n * Legacy: path where 0.1.x copied prompt templates. No longer created on fresh install\n * and no longer read at runtime. Kept on the interface so `squad doctor` and\n * `squad migrate` can locate and clean up stale copies from pre-0.2 users.\n */\n promptsDir: string;\n storiesDir: string;\n plansDir: string;\n indexFile: string;\n /** `.squad/.trash` — created on demand by `squad rm --trash`. */\n trashDir: string;\n}\n\nexport function buildPaths(root: string): SquadPaths {\n const squadDir = path.join(root, SQUAD_DIR);\n return {\n root,\n squadDir,\n configFile: path.join(squadDir, 'config.yaml'),\n secretsFile: path.join(squadDir, 'secrets.yaml'),\n promptsDir: path.join(squadDir, 'prompts'),\n storiesDir: path.join(squadDir, 'stories'),\n plansDir: path.join(squadDir, 'plans'),\n indexFile: path.join(squadDir, 'plans', '00-index.md'),\n trashDir: path.join(squadDir, '.trash'),\n };\n}\n\nexport function findSquadRoot(startDir: string = process.cwd()): string | null {\n let current = path.resolve(startDir);\n const { root } = path.parse(current);\n while (true) {\n if (fs.existsSync(path.join(current, SQUAD_DIR, 'config.yaml'))) {\n return current;\n }\n if (current === root) return null;\n current = path.dirname(current);\n }\n}\n\nexport function requireSquadRoot(startDir: string = process.cwd()): string {\n const root = findSquadRoot(startDir);\n if (!root) {\n throw new Error(\n `No .squad/ directory found (searched upward from ${startDir}). Run \\`squad init\\` first.`,\n );\n }\n return root;\n}\n\nexport function slugify(input: string): string {\n return input\n .toLowerCase()\n .trim()\n .replace(/[^\\p{L}\\p{N}]+/gu, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport const SQUAD_SECRETS_PATTERN = '.squad/secrets.yaml';\nexport const SQUAD_ATTACHMENTS_PATTERN = '.squad/stories/**/attachments/';\nexport const SQUAD_TRASH_PATTERN = '.squad/.trash/';\nexport const SQUAD_LAST_RUN_PATTERN = '.squad/.last-run.json';\nexport const SQUAD_LAST_COPY_PROMPT_PATTERN = '.squad/.last-copy-prompt.md';\nexport const SQUAD_RUNS_PATTERN = '.squad/runs/';\n\nconst MANAGED_BLOCK_HEADER = '# Managed by squad-kit — do not edit this block';\nconst MANAGED_BLOCK_FOOTER = '# End squad-kit block';\n\n/**\n * Ensure the repo-root `.gitignore` contains the managed squad-kit block.\n * Idempotent: safe to call on every `squad init`. Does not remove prior user-added\n * patterns; only appends its own managed block if missing, or appends the trash\n * line to an existing block that predates it.\n *\n * Returns true if the file was created or modified, false if no change was needed.\n */\nexport function ensureGitignore(repoRoot: string): boolean {\n const file = path.join(repoRoot, '.gitignore');\n const text = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';\n\n const requiredPatterns = [\n SQUAD_SECRETS_PATTERN,\n SQUAD_ATTACHMENTS_PATTERN,\n SQUAD_TRASH_PATTERN,\n SQUAD_LAST_RUN_PATTERN,\n SQUAD_LAST_COPY_PROMPT_PATTERN,\n SQUAD_RUNS_PATTERN,\n ];\n\n const allPresent = requiredPatterns.every((p) => text.includes(p));\n if (allPresent) return false;\n\n if (!text.includes(SQUAD_SECRETS_PATTERN)) {\n const block = ['', MANAGED_BLOCK_HEADER, ...requiredPatterns, MANAGED_BLOCK_FOOTER, ''].join('\\n');\n const next =\n text.length === 0\n ? block.trimStart()\n : text.endsWith('\\n')\n ? text + block\n : text + '\\n' + block;\n fs.writeFileSync(file, next, 'utf8');\n return true;\n }\n\n let next = text;\n for (const pattern of requiredPatterns) {\n if (next.includes(pattern)) continue;\n if (next.includes(MANAGED_BLOCK_FOOTER)) {\n next = next.replace(MANAGED_BLOCK_FOOTER, pattern + '\\n' + MANAGED_BLOCK_FOOTER);\n } else {\n next = next.replace(/\\n?$/, (m) => m + pattern + '\\n');\n }\n }\n if (next !== text) {\n fs.writeFileSync(file, next, 'utf8');\n return true;\n }\n return false;\n}\n","import fs from 'node:fs';\nimport yaml from 'js-yaml';\nimport type { PlannerConfig, PlannerModelOverride, ProviderName } from '../planner/types.js';\n\nexport type TrackerType = 'none' | 'github' | 'linear' | 'jira' | 'azure';\n\nexport interface SquadConfig {\n version: number;\n project: {\n name: string;\n primaryLanguage?: string;\n projectRoots?: string[];\n };\n tracker: {\n type: TrackerType;\n workspace?: string;\n project?: string;\n };\n naming: {\n includeTrackerId: boolean;\n globalSequence: boolean;\n };\n agents: string[];\n planner?: PlannerConfig;\n}\n\nexport const DEFAULT_CONFIG: SquadConfig = {\n version: 1,\n project: {\n name: 'my-project',\n primaryLanguage: 'typescript',\n projectRoots: ['.'],\n },\n tracker: { type: 'none' },\n naming: { includeTrackerId: false, globalSequence: true },\n agents: [],\n planner: undefined,\n};\n\nconst FORBIDDEN_KEYS = ['apikey', 'api_key', 'token', 'secret', 'credential', 'credentials'];\n\n/** Default max completion tokens per planner API round (was 8192; long Opus plans truncated). */\nexport const DEFAULT_PLANNER_MAX_OUTPUT_TOKENS = 16384;\nconst MIN_PLANNER_MAX_OUTPUT_TOKENS = 1024;\nconst MAX_PLANNER_MAX_OUTPUT_TOKENS = 128_000;\n\nfunction clampPlannerMaxOut(raw: unknown): number {\n if (raw === undefined || raw === null) return DEFAULT_PLANNER_MAX_OUTPUT_TOKENS;\n const n = typeof raw === 'number' ? raw : typeof raw === 'string' ? Number.parseInt(raw, 10) : NaN;\n if (!Number.isFinite(n) || n < 1) return DEFAULT_PLANNER_MAX_OUTPUT_TOKENS;\n return Math.min(\n MAX_PLANNER_MAX_OUTPUT_TOKENS,\n Math.max(MIN_PLANNER_MAX_OUTPUT_TOKENS, Math.round(n)),\n );\n}\n\nfunction rejectSecretsInYaml(node: unknown, configFile: string, path: string[] = []): void {\n if (node === null || typeof node !== 'object') return;\n for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n if (FORBIDDEN_KEYS.includes(key.toLowerCase())) {\n throw new Error(\n `Refusing to load ${configFile}: key \"${[...path, key].join('.')}\" looks like a secret. ` +\n `Run \\`squad config set planner\\` or \\`squad config set tracker\\` to save it to .squad/secrets.yaml, then remove the key from config.yaml. ` +\n `Provider keys also work via ANTHROPIC_API_KEY / OPENAI_API_KEY / GOOGLE_API_KEY.`,\n );\n }\n if (typeof value === 'object') rejectSecretsInYaml(value, configFile, [...path, key]);\n }\n}\n\nfunction mergePlanner(\n base: PlannerConfig | undefined,\n override: Partial<PlannerConfig> | undefined,\n): PlannerConfig | undefined {\n if (!override) return base;\n const merged: PlannerConfig = {\n enabled: override.enabled ?? base?.enabled ?? false,\n provider: (override.provider ?? base?.provider ?? 'anthropic') as ProviderName,\n mode: override.mode ?? base?.mode ?? 'auto',\n budget: {\n maxFileReads: override.budget?.maxFileReads ?? base?.budget?.maxFileReads ?? 25,\n maxContextBytes: override.budget?.maxContextBytes ?? base?.budget?.maxContextBytes ?? 50_000,\n maxDurationSeconds: override.budget?.maxDurationSeconds ?? base?.budget?.maxDurationSeconds ?? 180,\n maxCostUsd: override.budget?.maxCostUsd ?? base?.budget?.maxCostUsd,\n },\n modelOverride: {\n ...(base?.modelOverride ?? {}),\n ...(override.modelOverride ?? {}),\n },\n cache: {\n enabled: override.cache?.enabled ?? base?.cache?.enabled ?? true,\n },\n maxOutputTokens: clampPlannerMaxOut(override.maxOutputTokens ?? base?.maxOutputTokens),\n };\n // Normalise: drop undefined/null entries; remove modelOverride entirely if nothing left (clean YAML).\n if (merged.modelOverride) {\n const pruned = Object.fromEntries(\n Object.entries(merged.modelOverride).filter(([, v]) => v !== undefined && v !== null),\n ) as PlannerModelOverride;\n if (Object.keys(pruned).length === 0) {\n delete merged.modelOverride;\n } else {\n merged.modelOverride = pruned;\n }\n }\n return merged;\n}\n\nfunction validateModelOverride(mo: PlannerModelOverride | undefined, configFile: string): void {\n if (!mo) return;\n for (const key of ['anthropic', 'openai', 'google'] as const) {\n const v = mo[key];\n if (v === undefined) continue;\n if (typeof v !== 'string' || v.trim().length === 0) {\n throw new Error(\n `Invalid planner.modelOverride.${key} in ${configFile}: must be a non-empty string when set. ` +\n `Run \\`squad config set planner\\` to fix it.`,\n );\n }\n }\n}\n\n/**\n * Parse and validate config YAML the same way as reading from disk. Used by `loadConfig` and `saveConfig` (round-trip check).\n */\nexport function parseConfig(raw: string, configFile: string): SquadConfig {\n let parsed: Partial<SquadConfig> | undefined;\n try {\n parsed = yaml.load(raw) as Partial<SquadConfig> | undefined;\n } catch (err) {\n throw new Error(\n `Invalid YAML in ${configFile}: ${(err as Error).message}. ` +\n `Run \\`squad doctor\\` to review, or fix the file, or \\`squad init --force\\` to replace it.`,\n );\n }\n if (!parsed || typeof parsed !== 'object') {\n throw new Error(\n `Invalid config at ${configFile}: expected a YAML object. Run \\`squad doctor\\` to review, or fix the file and try again.`,\n );\n }\n rejectSecretsInYaml(parsed, configFile);\n const merged = mergeConfig(DEFAULT_CONFIG, parsed);\n validateModelOverride(merged.planner?.modelOverride, configFile);\n if (merged.planner?.cache !== undefined) {\n const c = merged.planner.cache;\n if (typeof c !== 'object' || c === null || Array.isArray(c)) {\n throw new Error(\n `planner.cache in ${configFile} must be an object with \\`enabled: true\\` or \\`false\\`. ` +\n `Run \\`squad config set planner\\` to set prompt caching.`,\n );\n }\n const ce = c.enabled;\n if (typeof ce !== 'boolean') {\n throw new Error(\n `planner.cache.enabled in ${configFile} must be a boolean (not a quoted string). ` +\n `Run \\`squad config set planner\\` to set prompt caching, or use \\`true\\` or \\`false\\` unquoted in YAML.`,\n );\n }\n }\n if (merged.planner?.enabled) {\n if (!['anthropic', 'openai', 'google'].includes(merged.planner.provider)) {\n throw new Error(\n `Unsupported planner.provider \"${merged.planner.provider}\". ` +\n `Run \\`squad config set planner\\` and pick anthropic | openai | google.`,\n );\n }\n if (merged.planner.budget.maxFileReads <= 0) {\n throw new Error(\n 'planner.budget.maxFileReads must be > 0. Run `squad config set planner` to fix planner.budget values.',\n );\n }\n if (merged.planner.budget.maxContextBytes <= 0) {\n throw new Error(\n 'planner.budget.maxContextBytes must be > 0. Run `squad config set planner` to fix planner.budget values.',\n );\n }\n if (merged.planner.budget.maxDurationSeconds <= 0) {\n throw new Error(\n 'planner.budget.maxDurationSeconds must be > 0. Run `squad config set planner` to fix planner.budget values.',\n );\n }\n }\n return merged;\n}\n\nexport function loadConfig(configFile: string): SquadConfig {\n const raw = fs.readFileSync(configFile, 'utf8');\n return parseConfig(raw, configFile);\n}\n\nexport function serializeConfig(config: SquadConfig): string {\n return yaml.dump(config, { lineWidth: 100, noRefs: true, sortKeys: false });\n}\n\nexport function saveConfig(configFile: string, config: SquadConfig): void {\n const body = serializeConfig(config);\n parseConfig(body, configFile);\n fs.writeFileSync(configFile, body, 'utf8');\n}\n\nfunction mergeConfig(base: SquadConfig, override: Partial<SquadConfig>): SquadConfig {\n return {\n version: override.version ?? base.version,\n project: { ...base.project, ...(override.project ?? {}) },\n tracker: { ...base.tracker, ...(override.tracker ?? {}) },\n naming: { ...base.naming, ...(override.naming ?? {}) },\n agents: override.agents ?? base.agents,\n planner: mergePlanner(base.planner, override.planner as Partial<PlannerConfig> | undefined),\n };\n}\n","import fs from 'node:fs';\nimport { findSquadRoot, buildPaths, type SquadPaths } from './paths.js';\nimport { loadSecrets, type SquadSecrets } from './secrets.js';\nimport type { PlannerModelOverride, PlannerPhase, ProviderName } from '../planner/types.js';\n\nexport interface PlannerPhaseModels {\n plan: string;\n execute: string;\n}\n\n/**\n * Pinned model IDs for the planner. Anthropic Opus uses the **Claude API ID** from Anthropic’s\n * model overview (versioned id; Haiku uses an explicit dated snapshot). Aliases such as\n * `claude-haiku-4-5` without a date are intentionally NOT used for execute because they can\n * roll forward silently. Update when a provider deprecates a pin; run `pnpm verify:models` after edits.\n *\n * Last verified against Anthropic docs: 2026-04-23 — https://platform.claude.com/docs/en/about-claude/models/overview\n */\nexport const PLANNER_MODEL_MAP: Record<ProviderName, PlannerPhaseModels> = {\n anthropic: {\n plan: 'claude-opus-4-7',\n execute: 'claude-haiku-4-5-20251001',\n },\n openai: {\n // Unverified for 0.2.0. 0.2.1 will pin to dated snapshots once a maintainer can probe.\n plan: 'gpt-5.3-thinking',\n execute: 'gpt-5.3-mini',\n },\n google: {\n // Unverified for 0.2.0. 0.2.1 will pin to dated snapshots once a maintainer can probe.\n plan: 'gemini-3-pro-latest',\n execute: 'gemini-3-flash-latest',\n },\n};\n\nexport function modelFor(\n provider: ProviderName,\n phase: PlannerPhase,\n override?: PlannerModelOverride,\n): string {\n if (phase === 'plan' && override?.[provider]) return override[provider]!;\n return PLANNER_MODEL_MAP[provider][phase];\n}\n\nexport function providerEnvVar(provider: ProviderName): string {\n switch (provider) {\n case 'anthropic':\n return 'ANTHROPIC_API_KEY';\n case 'openai':\n return 'OPENAI_API_KEY';\n case 'google':\n return 'GOOGLE_API_KEY';\n }\n}\n\nexport interface CredentialSource {\n value: string;\n source: 'env' | 'secrets' | 'fallback-env';\n detail: string; // human-friendly hint, e.g. \"ANTHROPIC_API_KEY\" or \".squad/secrets.yaml\"\n}\n\nexport function resolveProviderKey(provider: ProviderName): CredentialSource | undefined {\n const envVar = providerEnvVar(provider);\n const envValue = process.env[envVar];\n if (envValue) return { value: envValue, source: 'env', detail: envVar };\n\n const fallback = process.env.SQUAD_PLANNER_API_KEY;\n if (fallback) return { value: fallback, source: 'fallback-env', detail: 'SQUAD_PLANNER_API_KEY' };\n\n const root = findSquadRoot();\n if (root) {\n const paths = buildPaths(root);\n if (fs.existsSync(paths.secretsFile)) {\n const secrets = loadSecrets(paths.secretsFile);\n const fromFile = secrets.planner?.[provider];\n if (fromFile) return { value: fromFile, source: 'secrets', detail: '.squad/secrets.yaml' };\n }\n }\n return undefined;\n}\n\n/** Backwards-compatible wrapper; returns only the value. Existing callers continue to work. */\nexport function readProviderKey(provider: ProviderName): string | undefined {\n return resolveProviderKey(provider)?.value;\n}\n\n/**\n * Resolve planner API key for a known workspace (e.g. console server) without relying on\n * `process.cwd()` / `findSquadRoot()`.\n */\nexport function readProviderKeyForPaths(paths: SquadPaths, provider: ProviderName): string | undefined {\n const envVar = providerEnvVar(provider);\n const envValue = process.env[envVar];\n if (envValue) return envValue;\n const fallback = process.env.SQUAD_PLANNER_API_KEY;\n if (fallback) return fallback;\n if (fs.existsSync(paths.secretsFile)) {\n const secrets = loadSecrets(paths.secretsFile);\n const fromFile = secrets.planner?.[provider];\n if (fromFile) return fromFile;\n }\n return undefined;\n}\n\nexport interface TrackerCredentialLookup {\n envVars: string[]; // primary env vars, in order\n fallbackEnv: 'SQUAD_TRACKER_API_KEY';\n fromSecrets: (s: SquadSecrets) => string | undefined; // extracts the relevant field\n}\n\nexport function resolveTrackerCredential(\n lookup: TrackerCredentialLookup,\n): CredentialSource | undefined {\n for (const ev of lookup.envVars) {\n const v = process.env[ev];\n if (v) return { value: v, source: 'env', detail: ev };\n }\n const fb = process.env[lookup.fallbackEnv];\n if (fb) return { value: fb, source: 'fallback-env', detail: lookup.fallbackEnv };\n\n const root = findSquadRoot();\n if (!root) return undefined;\n const paths = buildPaths(root);\n if (!fs.existsSync(paths.secretsFile)) return undefined;\n const secrets = loadSecrets(paths.secretsFile);\n const fromFile = lookup.fromSecrets(secrets);\n if (fromFile) return { value: fromFile, source: 'secrets', detail: '.squad/secrets.yaml' };\n return undefined;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport yaml from 'js-yaml';\n\nexport interface TrackerJiraSecrets {\n host?: string; // e.g. \"mycompany.atlassian.net\" (without scheme)\n email?: string;\n token?: string;\n}\n\nexport interface TrackerAzureSecrets {\n organization?: string;\n project?: string;\n pat?: string;\n}\n\nexport interface SquadSecrets {\n planner?: {\n anthropic?: string;\n openai?: string;\n google?: string;\n };\n tracker?: {\n jira?: TrackerJiraSecrets;\n azure?: TrackerAzureSecrets;\n };\n}\n\nconst EMPTY: SquadSecrets = {};\n\nexport function loadSecrets(secretsFile: string): SquadSecrets {\n if (!fs.existsSync(secretsFile)) return EMPTY;\n let raw: string;\n try {\n raw = fs.readFileSync(secretsFile, 'utf8');\n } catch (err) {\n throw new Error(\n `Failed to read ${secretsFile}: ${(err as Error).message}. ` +\n `Run \\`squad doctor\\` to diagnose, or delete the file and run \\`squad config set planner\\` or \\`squad config set tracker\\` to re-enter credentials.`,\n );\n }\n let parsed: unknown;\n try {\n parsed = yaml.load(raw);\n } catch (err) {\n throw new Error(\n `Invalid YAML in ${secretsFile}: ${(err as Error).message}. ` +\n `Run \\`squad doctor\\` to review paths and permissions, or fix the file, or delete it and run \\`squad config set planner\\` / \\`squad config set tracker\\` to re-enter secrets.`,\n );\n }\n if (parsed === null || parsed === undefined) return EMPTY;\n if (typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(\n `Invalid ${secretsFile}: expected a YAML object at the top level. ` +\n `Run \\`squad config set planner\\` or \\`squad config set tracker\\` after fixing or replacing the file.`,\n );\n }\n return parsed as SquadSecrets;\n}\n\nexport function saveSecrets(secretsFile: string, secrets: SquadSecrets): void {\n fs.mkdirSync(path.dirname(secretsFile), { recursive: true });\n const body = yaml.dump(secrets, { lineWidth: 100, noRefs: true, sortKeys: false });\n fs.writeFileSync(secretsFile, body, 'utf8');\n tightenPermissions(secretsFile);\n}\n\nfunction tightenPermissions(file: string): void {\n if (process.platform === 'win32') return;\n try {\n fs.chmodSync(file, 0o600);\n } catch {\n // best-effort; some filesystems (e.g. NTFS mounts on Linux) may refuse chmod\n }\n}\n\n/**\n * Structural merge. New values win over existing ones; undefined/empty-string values are ignored\n * so callers can partial-update a single provider without clobbering siblings.\n */\nexport function mergeSecrets(base: SquadSecrets, patch: SquadSecrets): SquadSecrets {\n return {\n planner: { ...(base.planner ?? {}), ...filterEmpty(patch.planner ?? {}) },\n tracker: {\n jira: {\n ...(base.tracker?.jira ?? {}),\n ...filterEmpty((patch.tracker?.jira ?? {}) as Record<string, unknown>),\n },\n azure: {\n ...(base.tracker?.azure ?? {}),\n ...filterEmpty((patch.tracker?.azure ?? {}) as Record<string, unknown>),\n },\n },\n };\n}\n\nfunction filterEmpty<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined && v !== '') out[k] = v;\n }\n return out as Partial<T>;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function readFile(file: string): string {\n return fs.readFileSync(file, 'utf8');\n}\n\nexport function writeFileSafe(file: string, content: string, overwrite = false): boolean {\n if (!overwrite && fs.existsSync(file)) return false;\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, content, 'utf8');\n return true;\n}\n\nexport function copyTree(srcDir: string, destDir: string, overwrite = false): void {\n fs.mkdirSync(destDir, { recursive: true });\n for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {\n const src = path.join(srcDir, entry.name);\n const dest = path.join(destDir, entry.name);\n if (entry.isDirectory()) {\n copyTree(src, dest, overwrite);\n } else if (entry.isFile()) {\n if (!overwrite && fs.existsSync(dest)) continue;\n fs.copyFileSync(src, dest);\n }\n }\n}\n\nexport function packageRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n // src/utils → package root when running from source (tsx/vitest)\n // dist → package root when running from bundle\n let dir = here;\n for (let i = 0; i < 6; i++) {\n if (fs.existsSync(path.join(dir, 'package.json')) && fs.existsSync(path.join(dir, 'templates'))) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n throw new Error(`Could not locate squad-kit package root from ${here}`);\n}\n\nexport function templatesDir(): string {\n return path.join(packageRoot(), 'templates');\n}\n\n/**\n * Read a prompt file from the installed squad-kit package's `templates/prompts/` directory.\n * This is the ONLY supported way to read prompts. Users do not have the ability to override\n * them; `.squad/prompts/` is legacy and ignored at runtime.\n *\n * @throws if the file is missing (indicates a broken package install).\n */\nexport function readBundledPrompt(name: 'generate-plan.md' | 'intake.md' | 'story-skeleton.md'): string {\n const file = path.join(templatesDir(), 'prompts', name);\n if (!fs.existsSync(file)) {\n throw new Error(\n `Bundled prompt \"${name}\" not found at ${file}. ` +\n `This indicates a broken squad-kit install — reinstall with: pnpm add -g squad-kit`,\n );\n }\n return fs.readFileSync(file, 'utf8');\n}\n","export type TemplateVars = Record<string, string | number | undefined | null>;\n\nconst TOKEN = /\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g;\n\nexport function render(template: string, vars: TemplateVars): string {\n return template.replace(TOKEN, (_, key: string) => {\n const value = vars[key];\n return value === undefined || value === null ? '' : String(value);\n });\n}\n\n/**\n * Values interpolated into `render()` must not contain literal `{{key}}` substrings,\n * or those tokens would be substituted in a second conceptual pass. Break `{{` so\n * the simple regex no longer matches.\n */\nexport function escapeTemplateValue(s: string): string {\n return s.replace(/\\{\\{/g, '{ {');\n}\n","import fs from 'node:fs';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, type SquadConfig } from '../../core/config.js';\nimport { loadSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { maskPlannerCredentials, maskTrackerForShow } from './masks.js';\nimport type { PlannerConfig } from '../../planner/types.js';\n\nexport interface ConfigShowOptions {\n json?: boolean;\n}\n\nexport type ConfigShowPayload = {\n project: SquadConfig['project'];\n tracker: SquadConfig['tracker'] & { credentials: ReturnType<typeof maskTrackerForShow> };\n naming: SquadConfig['naming'];\n agents: SquadConfig['agents'];\n planner:\n | { enabled: false }\n | (PlannerConfig & { credentials: ReturnType<typeof maskPlannerCredentials> });\n};\n\nfunction buildPayload(config: SquadConfig, secrets: SquadSecrets): ConfigShowPayload {\n const basePlanner = !config.planner || config.planner.enabled !== true;\n const planner: ConfigShowPayload['planner'] = basePlanner\n ? { enabled: false }\n : { ...config.planner!, enabled: true, credentials: maskPlannerCredentials(secrets.planner) };\n return {\n project: config.project,\n tracker: { ...config.tracker, credentials: maskTrackerForShow(secrets) },\n naming: config.naming,\n agents: config.agents,\n planner,\n };\n}\n\nfunction renderShow(root: string, payload: ConfigShowPayload): void {\n ui.divider('squad config show');\n ui.kv('workspace', root, 10);\n ui.blank();\n\n ui.step('Project');\n ui.kv('name', payload.project.name, 14);\n if (payload.project.primaryLanguage) {\n ui.kv('language', payload.project.primaryLanguage, 14);\n }\n if (payload.project.projectRoots?.length) {\n ui.kv('roots', payload.project.projectRoots.join(', '), 14);\n }\n ui.blank();\n\n ui.divider('Tracker');\n ui.kv('type', payload.tracker.type, 10);\n if (payload.tracker.workspace) {\n ui.kv('workspace', payload.tracker.workspace, 10);\n }\n if (payload.tracker.project) {\n ui.kv('project', payload.tracker.project, 10);\n }\n const tc = payload.tracker.credentials;\n if (tc.jira) {\n ui.kv('jira host', tc.jira.host ?? '(not set)', 10);\n ui.kv('jira email', tc.jira.email ?? '(not set)', 10);\n ui.kv('jira token', tc.jira.token, 10);\n }\n if (tc.azure) {\n ui.kv('azure org', tc.azure.organization ?? '(not set)', 10);\n ui.kv('azure project', tc.azure.project ?? '(not set)', 10);\n ui.kv('azure pat', tc.azure.pat, 10);\n }\n if (payload.tracker.type === 'jira' && !tc.jira) {\n ui.kv('jira', '(not configured in secrets.yaml)', 10);\n }\n if (payload.tracker.type === 'azure' && !tc.azure) {\n ui.kv('azure', '(not configured in secrets.yaml)', 10);\n }\n ui.blank();\n\n ui.divider('Naming');\n ui.kv('includeTrackerId', String(payload.naming.includeTrackerId), 18);\n ui.kv('globalSequence', String(payload.naming.globalSequence), 18);\n ui.blank();\n\n ui.divider('Agents');\n ui.kv('installed', payload.agents.length ? payload.agents.join(', ') : '(none)', 10);\n ui.blank();\n\n ui.divider('Planner');\n if (payload.planner.enabled === false) {\n ui.kv('enabled', 'false', 10);\n } else {\n const p = payload.planner;\n ui.kv('enabled', 'true', 10);\n ui.kv('provider', p.provider, 10);\n ui.kv('mode', p.mode, 10);\n const creds = p.credentials;\n ui.kv('key anthropic', creds.anthropic ?? 'not set', 14);\n ui.kv('key openai', creds.openai ?? 'not set', 14);\n ui.kv('key google', creds.google ?? 'not set', 14);\n }\n ui.blank();\n}\n\nexport function buildConfigShowPayload(config: SquadConfig, secrets: SquadSecrets): ConfigShowPayload {\n return buildPayload(config, secrets);\n}\n\nexport async function runConfigShow(opts: ConfigShowOptions): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n const secrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : ({} as SquadSecrets);\n\n const payload = buildPayload(config, secrets);\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n renderShow(root, payload);\n}\n","import type { SquadSecrets } from '../../core/secrets.js';\n\nexport function maskStringKey(value: string | undefined): string | undefined {\n if (value === undefined || value.length === 0) return undefined;\n if (value.length <= 4) return '***';\n const lead = value.slice(0, Math.min(5, value.length - 4));\n const tail = value.slice(-4);\n return `${lead}…${tail}`;\n}\n\nexport function maskPlannerCredentials(planner: SquadSecrets['planner']): {\n anthropic?: string;\n openai?: string;\n google?: string;\n} {\n return {\n anthropic: planner?.anthropic ? maskStringKey(planner.anthropic) : undefined,\n openai: planner?.openai ? maskStringKey(planner.openai) : undefined,\n google: planner?.google ? maskStringKey(planner.google) : undefined,\n };\n}\n\nexport function maskTrackerForShow(secrets: SquadSecrets): {\n jira?: { host?: string; email?: string; token: string };\n azure?: { organization?: string; project?: string; pat: string };\n} {\n const j = secrets.tracker?.jira;\n const a = secrets.tracker?.azure;\n return {\n jira: j\n ? {\n host: j.host,\n email: j.email,\n token: j.token && j.token.length > 0 ? '***' : 'not set',\n }\n : undefined,\n azure: a\n ? {\n organization: a.organization,\n project: a.project,\n pat: a.pat && a.pat.length > 0 ? '***' : 'not set',\n }\n : undefined,\n };\n}\n","import fs from 'node:fs';\nimport { confirm, password, select } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, saveConfig, type SquadConfig } from '../../core/config.js';\nimport { loadSecrets, saveSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { modelFor, providerEnvVar, resolveProviderKey } from '../../core/planner-models.js';\nimport { fetchProviderModelIds } from '../../core/probes.js';\nimport type { PlannerConfig, ProviderName } from '../../planner/types.js';\nimport { isInteractive } from '../../ui/tty.js';\nimport { mergePlannerKeyIntoSecrets, newPlannerBlock } from './shared.js';\nimport { runConfigUnsetPlanner } from './unset-planner.js';\n\nfunction parseProvider(arg: string): ProviderName {\n if (!['anthropic', 'openai', 'google'].includes(arg)) {\n throw new Error(\n `Invalid --provider \"${arg}\". Use anthropic | openai | google, or run \\`squad config set planner\\` to pick a provider interactively.`,\n );\n }\n return arg as ProviderName;\n}\n\nfunction credentialError(provider: ProviderName): Error {\n const ev = providerEnvVar(provider);\n return new Error(\n `Planner credential for \\`${provider}\\` not found. Run \\`squad config set planner\\` (no --yes) to enter a key interactively, or export ${ev}.`,\n );\n}\n\nexport interface ConfigSetPlannerOptions {\n provider?: string;\n yes?: boolean;\n}\n\nexport async function runConfigSetPlanner(opts: ConfigSetPlannerOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n const baseSecrets: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n\n const useYes = Boolean(opts.yes);\n const interactive = !useYes && isInteractive();\n\n if (interactive && config.planner?.enabled === true) {\n const action = await select({\n message: 'The direct planner is enabled. What do you want to do?',\n choices: [\n { name: 'Change provider, key, or model', value: 'change' },\n { name: 'Disable the direct planner', value: 'disable' },\n ],\n default: 'change',\n });\n if (action === 'disable') {\n return runConfigUnsetPlanner({ yes: true, removeCredentials: false });\n }\n }\n\n let provider: ProviderName;\n if (opts.provider) {\n provider = parseProvider(opts.provider);\n } else if (useYes) {\n throw new Error(\n 'Pass --provider (anthropic|openai|google) when using --yes in non-interactive mode, or run `squad config set planner` without --yes in a TTY.',\n );\n } else {\n const current = (config.planner?.enabled === true && config.planner.provider) || 'anthropic';\n provider = (await select({\n message: 'Planner provider',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' as ProviderName },\n { name: 'OpenAI (GPT)', value: 'openai' as ProviderName },\n { name: 'Google (Gemini)', value: 'google' as ProviderName },\n ],\n default: current,\n })) as ProviderName;\n }\n\n if (interactive) {\n if (!config.planner || config.planner.enabled !== true) {\n const enable = await confirm({ message: 'Enable the direct planner?', default: true });\n if (!enable) {\n return;\n }\n }\n }\n\n const prev = config.planner;\n let nextPlanner: PlannerConfig;\n if (!prev || prev.enabled !== true) {\n nextPlanner = newPlannerBlock(provider);\n } else {\n nextPlanner = { ...prev, provider, enabled: true };\n }\n\n if (useYes) {\n if (!resolveProviderKey(provider)) {\n throw credentialError(provider);\n }\n } else {\n const existing = resolveProviderKey(provider);\n if (existing) {\n const shouldUpdate = await confirm({\n message: 'A planner credential is already available. Enter a new key and save it to .squad/secrets.yaml?',\n default: false,\n });\n if (shouldUpdate) {\n const envVar = providerEnvVar(provider);\n const key = await password({\n message: `${envVar} value (input hidden):`,\n validate: (v) => (v.length >= 20 ? true : 'key looks too short'),\n });\n const merged = mergePlannerKeyIntoSecrets(baseSecrets, provider, key);\n saveSecrets(paths.secretsFile, merged);\n ui.success('Planner key saved to .squad/secrets.yaml');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n } else {\n ui.info('Keeping the existing planner credential; no change to .squad/secrets.yaml for the key.');\n }\n } else {\n const envVar = providerEnvVar(provider);\n const key = await password({\n message: `${envVar} value (input hidden) — required:`,\n validate: (v) => (v.length >= 20 ? true : 'key looks too short'),\n });\n const merged = mergePlannerKeyIntoSecrets(baseSecrets, provider, key);\n saveSecrets(paths.secretsFile, merged);\n ui.success('Planner key saved to .squad/secrets.yaml');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n }\n\n const cacheEnabled = await confirm({\n message: 'Enable prompt caching? (Recommended — reduces billed tokens by ~70% on most providers.)',\n default: nextPlanner.cache?.enabled ?? true,\n });\n nextPlanner = { ...nextPlanner, cache: { enabled: cacheEnabled } };\n }\n\n const next: SquadConfig = { ...config, planner: nextPlanner };\n saveConfig(paths.configFile, next);\n\n const cred = resolveProviderKey(provider);\n if (!cred) {\n ui.warning(\n 'Planner key could not be resolved. Run `squad config set planner` to save a key, or set the provider env var, then re-run `squad doctor` to verify.',\n );\n } else {\n const sourceText =\n cred.source === 'env' ? cred.detail : cred.source === 'secrets' ? '.squad/secrets.yaml' : cred.detail;\n const planModel = modelFor(provider, 'plan', nextPlanner.modelOverride);\n const execModel = modelFor(provider, 'execute', nextPlanner.modelOverride);\n ui.blank();\n ui.success('Planner configuration updated.');\n ui.kv('provider', provider, 10);\n ui.kv('model (plan)', planModel, 10);\n ui.kv('model (execute)', execModel, 10);\n ui.kv('credential', `${cred.source} (${sourceText})`, 10);\n }\n\n if (process.env.CI === 'true' || !cred) {\n printPlannerNextSteps(Boolean(cred));\n return;\n }\n const listed = await fetchProviderModelIds(provider, cred.value);\n if (!listed.ok) {\n const st = listed.status;\n if (st === 401 || st === 403) {\n ui.warning(`Could not list models (HTTP ${st}); check your key.`);\n } else {\n ui.warning(`Model list probe failed (HTTP ${st}): ${listed.body.slice(0, 120)}`);\n }\n } else {\n ui.info('Credential check: models API responded OK for this key.');\n }\n\n printPlannerNextSteps(true);\n}\n\nfunction printPlannerNextSteps(credentialReady: boolean): void {\n ui.blank();\n ui.step('Next:');\n if (!credentialReady) {\n ui.info('1) Save a planner key: re-run `squad config set planner` and paste the key when prompted.');\n ui.info('2) Verify with `squad doctor` — all planner checks should turn green.');\n ui.info('3) Then run `squad new-story <slug>` and `squad new-plan --api` to generate your first plan.');\n return;\n }\n ui.info('1) Verify with `squad doctor` — every planner check should be green.');\n ui.info('2) Create a story: squad new-story <feature-slug> (or --no-tracker for a manual story).');\n ui.info('3) Fill the generated intake.md, then run `squad new-plan --api` to generate the plan.');\n ui.info(\n '4) To change provider, key, or disable caching later: re-run `squad config set planner`. Model overrides are edited directly in .squad/config.yaml (planner.modelOverride).',\n );\n}\n","import type { SquadSecrets } from '../core/secrets.js';\n\n/**\n * Build a SquadSecrets from env vars. Values present in `base` are preserved\n * unless the corresponding env var is set, in which case env wins (documented\n * precedence: env > secrets.yaml).\n */\nexport function overlayTrackerEnv(base: SquadSecrets): SquadSecrets {\n const jiraHost = process.env.JIRA_HOST;\n const jiraEmail = process.env.JIRA_EMAIL;\n const jiraToken = process.env.JIRA_API_TOKEN ?? process.env.SQUAD_TRACKER_API_KEY;\n\n const azOrg = process.env.AZURE_DEVOPS_ORG;\n const azProj = process.env.AZURE_DEVOPS_PROJECT;\n const azPat = process.env.AZURE_DEVOPS_PAT ?? process.env.SQUAD_TRACKER_API_KEY;\n\n return {\n ...base,\n tracker: {\n jira: {\n host: jiraHost ?? base.tracker?.jira?.host,\n email: jiraEmail ?? base.tracker?.jira?.email,\n token: jiraToken ?? base.tracker?.jira?.token,\n },\n azure: {\n organization: azOrg ?? base.tracker?.azure?.organization,\n project: azProj ?? base.tracker?.azure?.project,\n pat: azPat ?? base.tracker?.azure?.pat,\n },\n },\n };\n}\n","import type { SquadConfig } from './config.js';\nimport type { SquadSecrets } from './secrets.js';\nimport { overlayTrackerEnv } from '../tracker/env-overlay.js';\nimport type { ProviderName } from '../planner/types.js';\n\nexport async function fetchProviderModelIds(\n provider: ProviderName,\n apiKey: string,\n): Promise<\n { ok: true; ids: Set<string> } | { ok: false; kind: 'http'; status: number; body: string }\n> {\n switch (provider) {\n case 'anthropic': {\n const res = await fetch('https://api.anthropic.com/v1/models?limit=200', {\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n });\n if (!res.ok) {\n return { ok: false, kind: 'http', status: res.status, body: await res.text() };\n }\n const body = (await res.json()) as { data: { id: string }[] };\n return { ok: true, ids: new Set((body.data ?? []).map((m) => m.id)) };\n }\n case 'openai': {\n const res = await fetch('https://api.openai.com/v1/models', {\n headers: { authorization: `Bearer ${apiKey}` },\n });\n if (!res.ok) {\n return { ok: false, kind: 'http', status: res.status, body: await res.text() };\n }\n const body = (await res.json()) as { data: { id: string }[] };\n return { ok: true, ids: new Set((body.data ?? []).map((m) => m.id)) };\n }\n case 'google': {\n const res = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?pageSize=200&key=${encodeURIComponent(apiKey)}`,\n );\n if (!res.ok) {\n return { ok: false, kind: 'http', status: res.status, body: await res.text() };\n }\n const body = (await res.json()) as { models: { name: string }[] };\n return {\n ok: true,\n ids: new Set((body.models ?? []).map((m) => m.name.replace(/^models\\//, ''))),\n };\n }\n }\n}\n\nfunction jiraMyselfUrl(host: string): string {\n const normHost = host.replace(/^https?:\\/\\//i, '').replace(/\\/+$/, '');\n return `https://${normHost}/rest/api/3/myself`;\n}\n\nexport async function probeJiraConnectivity(\n secrets: SquadSecrets,\n config: SquadConfig,\n): Promise<{ ok: boolean; status?: number; detail?: string }> {\n const jira = overlayTrackerEnv(secrets).tracker?.jira ?? {};\n const host = jira.host ?? config.tracker.workspace ?? '';\n const email = jira.email ?? '';\n const token = jira.token ?? '';\n const auth = Buffer.from(`${email}:${token}`).toString('base64');\n const url = jiraMyselfUrl(host);\n try {\n const res = await fetch(url, {\n headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' },\n });\n if (res.ok) return { ok: true };\n return { ok: false, status: res.status, detail: (await res.text()).slice(0, 200) };\n } catch (err) {\n return { ok: false, detail: (err as Error).message };\n }\n}\n\nexport async function probeAzureConnectivity(\n secrets: SquadSecrets,\n config: SquadConfig,\n): Promise<{ ok: boolean; status?: number; detail?: string }> {\n const az = overlayTrackerEnv(secrets).tracker?.azure ?? {};\n const org = az.organization ?? config.tracker.workspace ?? '';\n const pat = az.pat ?? '';\n const auth = Buffer.from(`:${pat}`).toString('base64');\n const url = `https://dev.azure.com/${encodeURIComponent(org)}/_apis/projects?api-version=7.1`;\n try {\n const res = await fetch(url, { headers: { Authorization: `Basic ${auth}` } });\n if (res.ok) return { ok: true };\n return { ok: false, status: res.status, detail: (await res.text()).slice(0, 200) };\n } catch (err) {\n return { ok: false, detail: (err as Error).message };\n }\n}\n","import { input, password } from '@inquirer/prompts';\nimport { DEFAULT_PLANNER_MAX_OUTPUT_TOKENS } from '../../core/config.js';\nimport { mergeSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport type { PlannerConfig } from '../../planner/types.js';\nimport type { ProviderName } from '../../planner/types.js';\n\nconst notEmpty = (v: string) => v.trim().length > 0 || 'required';\n\nexport interface ConfigSetCommonOpts {\n yes?: boolean;\n}\n\nexport async function promptJiraCredentials(defaults: {\n host?: string;\n} = {}): Promise<{ host: string; email: string; token: string }> {\n const host = await input({\n message: 'Jira workspace host (e.g. mycompany.atlassian.net):',\n default: defaults.host ?? '',\n validate: (v) => v.trim().length > 0 || 'host is required',\n });\n const email = await input({\n message: 'Jira account email:',\n validate: (v) => (/@/.test(v) ? true : 'must look like an email'),\n });\n const token = await password({\n message: 'Jira API token (input hidden; create one at id.atlassian.com/manage-profile/security/api-tokens):',\n validate: (v) => (v.length >= 10 ? true : 'token seems too short'),\n });\n return { host: host.trim(), email: email.trim(), token };\n}\n\nexport async function promptAzureCredentials(defaults: {\n organization?: string;\n project?: string;\n} = {}): Promise<{ organization: string; project: string; pat: string }> {\n const organization = await input({\n message: 'Azure DevOps organization:',\n default: defaults.organization ?? '',\n validate: notEmpty,\n });\n const project = await input({\n message: 'Azure DevOps project:',\n default: defaults.project ?? '',\n validate: notEmpty,\n });\n const pat = await password({\n message: 'Personal Access Token (needs \"Work Items (Read)\" scope; input hidden):',\n validate: (v) => (v.length >= 20 ? true : 'PAT seems too short'),\n });\n return { organization: organization.trim(), project: project.trim(), pat };\n}\n\nexport function newPlannerBlock(provider: ProviderName): PlannerConfig {\n return {\n enabled: true,\n provider,\n mode: 'auto',\n budget: {\n maxFileReads: 25,\n maxContextBytes: 50_000,\n maxDurationSeconds: 180,\n },\n cache: { enabled: true },\n maxOutputTokens: DEFAULT_PLANNER_MAX_OUTPUT_TOKENS,\n };\n}\n\nexport function mergePlannerKeyIntoSecrets(base: SquadSecrets, provider: ProviderName, key: string): SquadSecrets {\n if (provider === 'anthropic') {\n return mergeSecrets(base, { planner: { anthropic: key } });\n }\n if (provider === 'openai') {\n return mergeSecrets(base, { planner: { openai: key } });\n }\n return mergeSecrets(base, { planner: { google: key } });\n}\n","import fs from 'node:fs';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, saveConfig, type SquadConfig } from '../../core/config.js';\nimport { loadSecrets, saveSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { isInteractive } from '../../ui/tty.js';\n\nexport interface ConfigUnsetPlannerOptions {\n removeCredentials?: boolean;\n yes?: boolean;\n}\n\nexport async function runConfigUnsetPlanner(opts: ConfigUnsetPlannerOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n const useYes = Boolean(opts.yes);\n if (!useYes) {\n if (!isInteractive()) {\n ui.warning('Pass -y in non-interactive mode to confirm disabling the planner.');\n return;\n }\n const ok = await confirm({ message: 'Disable the direct planner? (keeps any keys in .squad/secrets.yaml.)', default: false });\n if (!ok) {\n return;\n }\n }\n\n const next: SquadConfig = { ...config };\n delete next.planner;\n saveConfig(paths.configFile, next);\n\n if (opts.removeCredentials) {\n const s: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n if (s.planner) {\n delete s.planner;\n saveSecrets(paths.secretsFile, s);\n }\n ui.success('Planner disabled; planner credentials were removed from .squad/secrets.yaml.');\n } else {\n ui.success('Planner disabled; existing planner keys in .squad/secrets.yaml (if any) were preserved.');\n }\n ui.info('Re-enable any time with `squad config set planner`.');\n}\n","import fs from 'node:fs';\nimport { select } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, saveConfig, type SquadConfig, type TrackerType } from '../../core/config.js';\nimport { loadSecrets, saveSecrets, mergeSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { clientFor, overlayTrackerEnv } from '../../tracker/index.js';\nimport { probeJiraConnectivity, probeAzureConnectivity } from '../../core/probes.js';\nimport { isInteractive } from '../../ui/tty.js';\nimport { promptJiraCredentials, promptAzureCredentials } from './shared.js';\n\nconst TYPES: TrackerType[] = ['none', 'github', 'linear', 'jira', 'azure'];\n\nfunction parseType(t: string | undefined): TrackerType {\n if (!t) {\n throw new Error(\n 'Pass --type (none|jira|azure|github|linear) with --yes, or run `squad config set tracker` without --yes in a TTY to pick a type.',\n );\n }\n if (!TYPES.includes(t as TrackerType)) {\n throw new Error(\n `Invalid --type \"${t}\". Use none | jira | azure | github | linear, or run \\`squad config set tracker\\` interactively.`,\n );\n }\n return t as TrackerType;\n}\n\nfunction jiraError(): Error {\n return new Error(\n `Jira configuration is incomplete. Set JIRA_HOST, JIRA_EMAIL, JIRA_API_TOKEN (or run \\`squad config set tracker\\` without --yes to enter credentials interactively).`,\n );\n}\n\nfunction azureError(): Error {\n return new Error(\n `Azure DevOps configuration is incomplete. Set AZURE_DEVOPS_ORG, AZURE_DEVOPS_PROJECT, AZURE_DEVOPS_PAT (or run \\`squad config set tracker\\` without --yes to enter credentials interactively).`,\n );\n}\n\nexport interface ConfigSetTrackerOptions {\n type?: string;\n yes?: boolean;\n}\n\nexport async function runConfigSetTracker(opts: ConfigSetTrackerOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n const baseSecrets: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n\n const useYes = Boolean(opts.yes);\n const interactive = !useYes && isInteractive();\n\n let type: TrackerType;\n if (opts.type) {\n type = parseType(opts.type);\n } else if (useYes) {\n type = parseType(undefined);\n } else {\n type = (await select({\n message: 'Issue tracker',\n choices: [\n { name: 'None', value: 'none' as TrackerType },\n { name: 'GitHub Issues', value: 'github' as TrackerType },\n { name: 'Linear', value: 'linear' as TrackerType },\n { name: 'Jira', value: 'jira' as TrackerType },\n { name: 'Azure DevOps', value: 'azure' as TrackerType },\n ],\n default: config.tracker.type,\n })) as TrackerType;\n }\n\n let nextTracker!: SquadConfig['tracker'];\n\n if (type === 'none') {\n nextTracker = { type: 'none' };\n } else if (type === 'github' || type === 'linear') {\n nextTracker = { ...config.tracker, type };\n } else if (type === 'jira') {\n if (interactive) {\n ui.step('Jira Cloud credentials (stored in .squad/secrets.yaml — always git-ignored)');\n const j = await promptJiraCredentials({ host: config.tracker.workspace });\n const merged = mergeSecrets(baseSecrets, {\n tracker: { jira: { host: j.host, email: j.email, token: j.token } },\n });\n saveSecrets(paths.secretsFile, merged);\n nextTracker = { type: 'jira', workspace: j.host };\n ui.success('Jira credentials saved');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n } else {\n const o = overlayTrackerEnv(baseSecrets);\n const host = (\n o.tracker?.jira?.host ??\n process.env.JIRA_HOST ??\n (config.tracker.type === 'jira' ? config.tracker.workspace : undefined)\n )?.trim();\n if (!host) {\n throw jiraError();\n }\n const candidate: SquadConfig = { ...config, tracker: { type: 'jira', workspace: host } };\n if (clientFor(candidate, o).error) {\n throw jiraError();\n }\n nextTracker = { type: 'jira', workspace: host };\n }\n } else if (type === 'azure') {\n if (interactive) {\n ui.step('Azure DevOps credentials (stored in .squad/secrets.yaml — always git-ignored)');\n const a = await promptAzureCredentials({\n organization: config.tracker.workspace,\n project: config.tracker.project,\n });\n const merged = mergeSecrets(baseSecrets, {\n tracker: {\n azure: { organization: a.organization, project: a.project, pat: a.pat },\n },\n });\n saveSecrets(paths.secretsFile, merged);\n nextTracker = { type: 'azure', workspace: a.organization, project: a.project };\n ui.success('Azure DevOps credentials saved');\n ui.info('.squad/secrets.yaml updated (chmod 0600 on POSIX)');\n } else {\n const o = overlayTrackerEnv(baseSecrets);\n const org = (o.tracker?.azure?.organization ?? process.env.AZURE_DEVOPS_ORG ?? config.tracker.workspace)?.trim();\n const project = (o.tracker?.azure?.project ?? process.env.AZURE_DEVOPS_PROJECT ?? config.tracker.project)?.trim();\n if (!org || !project) {\n throw azureError();\n }\n const candidate: SquadConfig = { ...config, tracker: { type: 'azure', workspace: org, project } };\n if (clientFor(candidate, o).error) {\n throw azureError();\n }\n nextTracker = { type: 'azure', workspace: org, project };\n }\n }\n\n const next: SquadConfig = { ...config, tracker: nextTracker };\n saveConfig(paths.configFile, next);\n\n ui.blank();\n ui.success('Tracker configuration updated.');\n ui.kv('type', next.tracker.type, 10);\n if (next.tracker.workspace) {\n ui.kv('workspace', next.tracker.workspace, 10);\n }\n if (next.tracker.project) {\n ui.kv('project', next.tracker.project, 10);\n }\n\n if (process.env.CI === 'true') {\n printTrackerNextSteps(next.tracker.type);\n return;\n }\n\n const reloaded = loadConfig(paths.configFile);\n const s = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n if (reloaded.tracker.type === 'jira') {\n const r = await probeJiraConnectivity(s, reloaded);\n if (r.ok) {\n ui.info('Jira connectivity check: OK');\n } else {\n ui.warning(\n r.status !== undefined\n ? `Jira connectivity check: HTTP ${r.status}`\n : `Jira connectivity check failed: ${r.detail ?? 'unknown'}`,\n );\n }\n } else if (reloaded.tracker.type === 'azure') {\n const r = await probeAzureConnectivity(s, reloaded);\n if (r.ok) {\n ui.info('Azure DevOps connectivity check: OK');\n } else {\n ui.warning(\n r.status !== undefined\n ? `Azure DevOps connectivity check: HTTP ${r.status}`\n : `Azure DevOps connectivity check failed: ${r.detail ?? 'unknown'}`,\n );\n }\n }\n\n printTrackerNextSteps(next.tracker.type);\n}\n\nfunction printTrackerNextSteps(type: string): void {\n ui.blank();\n ui.step('Next:');\n if (type === 'none') {\n ui.info('1) Tracker is off. Create stories manually with `squad new-story <slug> --no-tracker`.');\n ui.info('2) Re-enable any time with `squad config set tracker`.');\n return;\n }\n ui.info('1) Verify with `squad doctor` — tracker checks should be green.');\n ui.info(`2) Create a story: squad new-story <feature-slug> --id <${type === 'jira' ? 'JIRA-123' : 'azure-work-item-id'}>`);\n ui.info(' squad-kit auto-fetches the title, description, and attachments into the intake.');\n ui.info('3) Review the generated intake.md, then run `squad new-plan --api` to generate the plan.');\n}\n","export type TrackerName = 'jira' | 'azure';\n\nexport interface FetchIssueResult {\n id: string; // canonical id, e.g. \"PROJ-123\" (Jira) or \"42\" (Azure)\n title: string;\n description: string; // plain text, may contain blank lines\n /** Plain text when the tracker exposes it (e.g. Azure); empty string otherwise. */\n acceptanceCriteria: string;\n url: string; // web URL for the human\n labels: string[];\n type?: string; // \"Story\" | \"Bug\" | \"Task\" | …\n assignee?: string;\n status?: string; // optional status/workflow name\n attachments: AttachmentRef[];\n fetchedAt: string; // ISO-8601 UTC\n}\n\nexport interface AttachmentRef {\n filename: string; // already sanitized\n url: string; // authenticated download URL\n size: number; // bytes; may be 0 if unknown\n mimeType?: string;\n}\n\nexport interface DownloadedAttachment {\n source: AttachmentRef;\n outcome: 'written' | 'skipped-oversize' | 'skipped-error';\n bytesWritten: number;\n absolutePath?: string; // present when outcome === 'written'\n skipReason?: string; // present when outcome starts with 'skipped-'\n}\n\n/** Subset of issue fields for search result lists. */\nexport type SearchIssueRow = Pick<FetchIssueResult, 'id' | 'title' | 'type' | 'status' | 'url'>;\n\nexport interface TrackerClient {\n readonly name: TrackerName;\n fetchIssue(id: string): Promise<FetchIssueResult>;\n /**\n * Find issues by id, free-text, or recent (empty query → recently updated).\n * Default limit 25.\n */\n searchIssues(query: string, opts?: { limit?: number }): Promise<SearchIssueRow[]>;\n /**\n * Authenticated per-attachment download. Caller passes the directory;\n * client returns one record per attachment describing the outcome.\n * Never throws for a single-file failure; only throws for catastrophic\n * errors (auth revoked mid-session, etc.).\n */\n downloadAttachments(\n refs: AttachmentRef[],\n targetDir: string,\n opts?: DownloadOptions,\n ): Promise<DownloadedAttachment[]>;\n}\n\nexport interface DownloadOptions {\n maxMegabytes?: number; // default 10\n}\n\nexport class TrackerError extends Error {\n constructor(\n message: string,\n public readonly kind: 'auth' | 'not-found' | 'rate-limited' | 'network' | 'other',\n public readonly statusCode?: number,\n ) {\n super(message);\n this.name = 'TrackerError';\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { AttachmentRef, DownloadedAttachment, DownloadOptions } from './types.js';\n\nconst DEFAULT_MAX_MB = 10;\n\nexport async function downloadAttachmentsWith(\n refs: AttachmentRef[],\n targetDir: string,\n authHeaders: Record<string, string>,\n opts: DownloadOptions = {},\n): Promise<DownloadedAttachment[]> {\n const maxMb = opts.maxMegabytes ?? DEFAULT_MAX_MB;\n const maxBytes = maxMb * 1024 * 1024;\n fs.mkdirSync(targetDir, { recursive: true });\n\n const out: DownloadedAttachment[] = [];\n for (const ref of refs) {\n out.push(await one(ref, targetDir, authHeaders, maxBytes, maxMb));\n }\n return out;\n}\n\nasync function one(\n ref: AttachmentRef,\n targetDir: string,\n headers: Record<string, string>,\n maxBytes: number,\n maxMb: number,\n): Promise<DownloadedAttachment> {\n if (ref.size > 0 && ref.size > maxBytes) {\n return {\n source: ref,\n outcome: 'skipped-oversize',\n bytesWritten: 0,\n skipReason: `${formatMb(ref.size)} exceeds cap (${maxMb} MB)`,\n };\n }\n\n const safeName = sanitizeFilename(ref.filename);\n const dest = uniqueDestination(targetDir, safeName);\n\n let res: Response;\n try {\n res = await fetch(ref.url, { headers });\n } catch (err) {\n return {\n source: ref,\n outcome: 'skipped-error',\n bytesWritten: 0,\n skipReason: `network error: ${(err as Error).message}`,\n };\n }\n\n if (!res.ok) {\n return {\n source: ref,\n outcome: 'skipped-error',\n bytesWritten: 0,\n skipReason: `HTTP ${res.status}`,\n };\n }\n\n const buf = Buffer.from(await res.arrayBuffer());\n if (buf.byteLength > maxBytes) {\n return {\n source: ref,\n outcome: 'skipped-oversize',\n bytesWritten: 0,\n skipReason: `${formatMb(buf.byteLength)} after download exceeds cap (${maxMb} MB)`,\n };\n }\n\n fs.writeFileSync(dest, buf);\n return {\n source: ref,\n outcome: 'written',\n bytesWritten: buf.byteLength,\n absolutePath: dest,\n };\n}\n\n/**\n * Strips path separators, leading dots, and control characters.\n * Preserves a sensible extension. Never returns an empty string.\n */\nexport function sanitizeFilename(raw: string): string {\n const normalized = raw.replace(/\\\\/g, '/');\n const base = path.basename(normalized).replace(/[\\\\/]/g, '_');\n const cleaned = base\n .replace(/[\\x00-\\x1f]/g, '')\n .replace(/^\\.+/, '') // no leading dots\n .replace(/\\s+/g, ' ')\n .trim();\n if (cleaned.length === 0) return 'attachment';\n return cleaned.slice(0, 180); // keep filesystems happy\n}\n\nfunction uniqueDestination(dir: string, name: string): string {\n let candidate = path.join(dir, name);\n if (!fs.existsSync(candidate)) return candidate;\n const ext = path.extname(name);\n const stem = name.slice(0, name.length - ext.length);\n let n = 1;\n while (fs.existsSync(candidate) && n < 1000) {\n candidate = path.join(dir, `${stem} (${n})${ext}`);\n n += 1;\n }\n return candidate;\n}\n\nfunction formatMb(bytes: number): string {\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import type {\n AttachmentRef,\n DownloadOptions,\n DownloadedAttachment,\n FetchIssueResult,\n SearchIssueRow,\n TrackerClient,\n} from './types.js';\nimport { TrackerError } from './types.js';\nimport { downloadAttachmentsWith, sanitizeFilename } from './attachments.js';\n\nexport interface AzureDevOpsClientConfig {\n organization: string; // e.g. \"myorg\"\n project: string; // e.g. \"myproject\"\n pat: string; // personal access token\n apiVersion?: string; // default \"7.1\"\n}\n\nconst HTML_STRIPPER_RE = [\n [/<\\s*br\\s*\\/?>/gi, '\\n'] as const,\n [/<\\/(p|div|li|h[1-6])>/gi, '\\n\\n'] as const,\n [/<[^>]+>/g, ''] as const,\n [/&nbsp;/g, ' '] as const,\n [/&amp;/g, '&'] as const,\n [/&lt;/g, '<'] as const,\n [/&gt;/g, '>'] as const,\n [/&quot;/g, '\"'] as const,\n [/&#39;/g, \"'\"] as const,\n [/\\n{3,}/g, '\\n\\n'] as const,\n];\n\nexport class AzureDevOpsClient implements TrackerClient {\n readonly name = 'azure' as const;\n private readonly authHeader: string;\n private readonly baseUrl: string;\n private readonly apiVersion: string;\n private readonly webBase: string;\n\n constructor(private readonly cfg: AzureDevOpsClientConfig) {\n if (!cfg.organization) throw new Error('AzureDevOpsClient: missing \"organization\".');\n if (!cfg.project) throw new Error('AzureDevOpsClient: missing \"project\".');\n if (!cfg.pat) throw new Error('AzureDevOpsClient: missing \"pat\".');\n this.apiVersion = cfg.apiVersion ?? '7.1';\n this.baseUrl = `https://dev.azure.com/${encodeURIComponent(cfg.organization)}/${encodeURIComponent(cfg.project)}/_apis/wit`;\n this.webBase = `https://dev.azure.com/${encodeURIComponent(cfg.organization)}/${encodeURIComponent(cfg.project)}/_workitems/edit`;\n const basic = Buffer.from(`:${cfg.pat}`).toString('base64');\n this.authHeader = `Basic ${basic}`;\n }\n\n async searchIssues(query: string, opts?: { limit?: number }): Promise<SearchIssueRow[]> {\n const limit = Math.min(50, Math.max(1, opts?.limit ?? 25));\n const q = query.trim();\n let wiql: string;\n if (/^\\d+$/.test(q)) {\n wiql = `SELECT [System.Id] FROM WorkItems WHERE [System.Id] = ${q}`;\n } else if (q.length === 0) {\n wiql = 'SELECT [System.Id] FROM WorkItems ORDER BY [System.ChangedDate] DESC';\n } else {\n const esc = q.replace(/'/g, \"''\");\n wiql = `SELECT [System.Id] FROM WorkItems WHERE [System.Title] CONTAINS STRING '${esc}' ORDER BY [System.ChangedDate] DESC`;\n }\n const wiqlUrl = `${this.baseUrl}/wiql?api-version=${this.apiVersion}`;\n let wiqlRes: Response;\n try {\n wiqlRes = await fetch(wiqlUrl, {\n method: 'POST',\n headers: { ...this.headers(), 'content-type': 'application/json' },\n body: JSON.stringify({ query: `${wiql}` }),\n });\n } catch (err) {\n throw new TrackerError(`Azure DevOps search failed: ${(err as Error).message}`, 'network');\n }\n if (!wiqlRes.ok) throw this.mapHttpError(wiqlRes.status, 'search');\n const wiqlBody = (await wiqlRes.json()) as { workItems?: { id: number }[] };\n const ids = (wiqlBody.workItems ?? []).slice(0, limit).map((w) => w.id);\n if (ids.length === 0) return [];\n const batchUrl = `${this.baseUrl}/workitems?ids=${ids.map(String).join(',')}&$expand=all&api-version=${this.apiVersion}`;\n let batchRes: Response;\n try {\n batchRes = await fetch(batchUrl, { headers: this.headers() });\n } catch (err) {\n throw new TrackerError(`Azure DevOps work items fetch failed: ${(err as Error).message}`, 'network');\n }\n if (!batchRes.ok) throw this.mapHttpError(batchRes.status, 'search');\n const batchBody = (await batchRes.json()) as { value?: AzureWorkItemPayload[] };\n const value = batchBody.value ?? [];\n return value.map((body) => {\n const id = String(body.id ?? '');\n const fields = body.fields ?? {};\n return {\n id,\n title: fields['System.Title'] ?? '(no title)',\n type: fields['System.WorkItemType'],\n status: fields['System.State'],\n url: `${this.webBase}/${id}`,\n };\n });\n }\n\n async fetchIssue(id: string): Promise<FetchIssueResult> {\n const url = `${this.baseUrl}/workitems/${encodeURIComponent(id)}?$expand=all&api-version=${this.apiVersion}`;\n let res: Response;\n try {\n res = await fetch(url, { headers: this.headers() });\n } catch (err) {\n throw new TrackerError(`Azure DevOps fetch failed: ${(err as Error).message}`, 'network');\n }\n if (!res.ok) throw this.mapHttpError(res.status, id);\n\n const body = (await res.json()) as AzureWorkItemPayload;\n const fields = body.fields ?? {};\n const relations = Array.isArray(body.relations) ? body.relations : [];\n\n const attachments: AttachmentRef[] = relations\n .filter((r) => r.rel === 'AttachedFile')\n .map((r) => ({\n filename: sanitizeFilename(r.attributes?.name ?? 'attachment'),\n url: r.url,\n size: typeof r.attributes?.resourceSize === 'number' ? r.attributes.resourceSize : 0,\n }));\n\n return {\n id: String(body.id ?? id),\n title: fields['System.Title'] ?? '(no title)',\n description: stripHtml(fields['System.Description'] ?? ''),\n acceptanceCriteria: stripHtml(fields['Microsoft.VSTS.Common.AcceptanceCriteria'] ?? ''),\n url: `${this.webBase}/${body.id ?? id}`,\n labels: parseTags(fields['System.Tags']),\n type: fields['System.WorkItemType'],\n assignee: fields['System.AssignedTo']?.displayName,\n status: fields['System.State'],\n attachments,\n fetchedAt: new Date().toISOString(),\n };\n }\n\n async downloadAttachments(\n refs: AttachmentRef[],\n targetDir: string,\n opts?: DownloadOptions,\n ): Promise<DownloadedAttachment[]> {\n return downloadAttachmentsWith(refs, targetDir, this.headers(), opts);\n }\n\n private headers(): Record<string, string> {\n return {\n authorization: this.authHeader,\n accept: 'application/json',\n };\n }\n\n private mapHttpError(status: number, id: string): TrackerError {\n if (status === 401 || status === 403) {\n return new TrackerError(\n `Azure DevOps authentication failed (HTTP ${status}). Check your PAT in .squad/secrets.yaml and that it has \"Work Items (Read)\" scope.`,\n 'auth',\n status,\n );\n }\n if (status === 404) {\n return new TrackerError(\n id === 'search'\n ? `Azure DevOps search failed (HTTP 404) in ${this.cfg.organization}/${this.cfg.project}.`\n : `Azure DevOps work item \"${id}\" not found in ${this.cfg.organization}/${this.cfg.project} (HTTP 404). ` +\n `Check the id and the organization/project in .squad/config.yaml.`,\n 'not-found',\n status,\n );\n }\n if (status === 429) {\n return new TrackerError(`Azure DevOps rate limit hit (HTTP 429). Wait a minute and retry.`, 'rate-limited', status);\n }\n return new TrackerError(\n id === 'search' ? `Azure DevOps search failed (HTTP ${status}).` : `Azure DevOps request failed (HTTP ${status}).`,\n 'other',\n status,\n );\n }\n}\n\nfunction parseTags(raw: unknown): string[] {\n if (typeof raw !== 'string' || raw.length === 0) return [];\n return raw\n .split(';')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nfunction stripHtml(html: string): string {\n let out = html;\n for (const [re, replacement] of HTML_STRIPPER_RE) {\n out = out.replace(re, replacement as string);\n }\n return out.trim();\n}\n\n// ---- Local payload types ----\n\ninterface AzureWorkItemPayload {\n id?: number;\n fields?: {\n 'System.Title'?: string;\n 'System.Description'?: string;\n 'Microsoft.VSTS.Common.AcceptanceCriteria'?: string;\n 'System.WorkItemType'?: string;\n 'System.State'?: string;\n 'System.Tags'?: string;\n 'System.AssignedTo'?: { displayName?: string };\n };\n relations?: Array<{\n rel: string;\n url: string;\n attributes?: { name?: string; resourceSize?: number };\n }>;\n}\n","type AdfNode = {\n type: string;\n text?: string;\n content?: AdfNode[];\n};\n\nconst BLOCK_TYPES = new Set([\n 'paragraph',\n 'heading',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'codeBlock',\n 'blockquote',\n 'rule',\n 'panel',\n 'table',\n 'tableRow',\n]);\n\nexport function adfToPlainText(node: unknown): string {\n if (!node || typeof node !== 'object') return '';\n const lines: string[] = [];\n walk(node as AdfNode, lines);\n return lines.join('').trim();\n}\n\nfunction walk(node: AdfNode, out: string[]): void {\n if (!node) return;\n if (typeof node.text === 'string') {\n out.push(node.text);\n return;\n }\n if (Array.isArray(node.content)) {\n for (const child of node.content) walk(child, out);\n }\n if (BLOCK_TYPES.has(node.type)) {\n // ensure block separation\n if (out.length > 0 && !out[out.length - 1]!.endsWith('\\n\\n')) {\n out.push('\\n\\n');\n }\n }\n}\n","import type {\n AttachmentRef,\n DownloadOptions,\n DownloadedAttachment,\n FetchIssueResult,\n SearchIssueRow,\n TrackerClient,\n} from './types.js';\nimport { TrackerError } from './types.js';\nimport { adfToPlainText } from './adf.js';\nimport { downloadAttachmentsWith, sanitizeFilename } from './attachments.js';\n\nexport interface JiraClientConfig {\n host: string; // e.g. \"mycompany.atlassian.net\" — no scheme, no trailing slash\n email: string;\n token: string;\n}\n\nexport class JiraClient implements TrackerClient {\n readonly name = 'jira' as const;\n private readonly authHeader: string;\n private readonly baseUrl: string;\n\n constructor(private readonly cfg: JiraClientConfig) {\n const normHost = cfg.host.replace(/^https?:\\/\\//i, '').replace(/\\/+$/, '');\n this.baseUrl = `https://${normHost}`;\n const basic = Buffer.from(`${cfg.email}:${cfg.token}`).toString('base64');\n this.authHeader = `Basic ${basic}`;\n }\n\n async fetchIssue(id: string): Promise<FetchIssueResult> {\n const url =\n `${this.baseUrl}/rest/api/3/issue/${encodeURIComponent(id)}` +\n `?fields=summary,description,labels,issuetype,assignee,status,attachment&expand=renderedFields`;\n let res: Response;\n try {\n res = await fetch(url, { headers: this.headers() });\n } catch (err) {\n throw new TrackerError(`Jira fetch failed: ${(err as Error).message}`, 'network');\n }\n if (!res.ok) throw this.mapHttpError(res.status, id);\n\n const body = (await res.json()) as JiraIssuePayload;\n const fields = body.fields ?? {};\n const rendered = body.renderedFields ?? {};\n\n const description =\n typeof rendered.description === 'string' && rendered.description.length > 0\n ? stripHtml(rendered.description)\n : adfToPlainText(fields.description);\n\n const attachments: AttachmentRef[] = (fields.attachment ?? []).map((a) => ({\n filename: sanitizeFilename(a.filename),\n url: a.content,\n size: typeof a.size === 'number' ? a.size : 0,\n mimeType: a.mimeType,\n }));\n\n return {\n id: body.key ?? id,\n title: fields.summary ?? '(no title)',\n description,\n acceptanceCriteria: '',\n url: `${this.baseUrl}/browse/${body.key ?? id}`,\n labels: Array.isArray(fields.labels) ? fields.labels : [],\n type: fields.issuetype?.name,\n assignee: fields.assignee?.displayName,\n status: fields.status?.name,\n attachments,\n fetchedAt: new Date().toISOString(),\n };\n }\n\n async searchIssues(query: string, opts?: { limit?: number }): Promise<SearchIssueRow[]> {\n const limit = Math.min(50, Math.max(1, opts?.limit ?? 25));\n const q = query.trim();\n let jql: string;\n if (/^[A-Z][A-Z0-9_]+-\\d+$/i.test(q)) {\n jql = `issuekey = \"${q.toUpperCase()}\"`;\n } else if (q.length === 0) {\n jql = 'order by updated DESC';\n } else {\n const esc = q.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n jql = `text ~ \"${esc}\" order by updated DESC`;\n }\n const url =\n `${this.baseUrl}/rest/api/3/search?jql=${encodeURIComponent(jql)}` +\n `&fields=summary,status,issuetype&maxResults=${limit}`;\n let res: Response;\n try {\n res = await fetch(url, { headers: this.headers() });\n } catch (err) {\n throw new TrackerError(`Jira search failed: ${(err as Error).message}`, 'network');\n }\n if (!res.ok) throw this.mapHttpError(res.status, 'search');\n const body = (await res.json()) as { issues?: JiraSearchIssue[] };\n const issues = body.issues ?? [];\n return issues.map((it) => {\n const key = it.key ?? '';\n const f = it.fields ?? {};\n return {\n id: key,\n title: f.summary ?? '(no title)',\n type: f.issuetype?.name,\n status: f.status?.name,\n url: `${this.baseUrl}/browse/${key}`,\n };\n });\n }\n\n async downloadAttachments(\n refs: AttachmentRef[],\n targetDir: string,\n opts?: DownloadOptions,\n ): Promise<DownloadedAttachment[]> {\n return downloadAttachmentsWith(refs, targetDir, this.headers(), opts);\n }\n\n private headers(): Record<string, string> {\n return {\n authorization: this.authHeader,\n accept: 'application/json',\n };\n }\n\n private mapHttpError(status: number, id: string): TrackerError {\n if (status === 401 || status === 403) {\n return new TrackerError(\n `Jira authentication failed (HTTP ${status}). Check your email and API token in .squad/secrets.yaml.`,\n 'auth',\n status,\n );\n }\n if (status === 404) {\n return new TrackerError(\n id === 'search'\n ? `Jira search not found (HTTP 404) on ${this.cfg.host}.`\n : `Jira issue \"${id}\" not found on ${this.cfg.host} (HTTP 404). Check the id and your workspace host.`,\n 'not-found',\n status,\n );\n }\n if (status === 429) {\n return new TrackerError(`Jira rate limit hit (HTTP 429). Wait a minute and retry.`, 'rate-limited', status);\n }\n return new TrackerError(\n id === 'search' ? `Jira search failed (HTTP ${status}).` : `Jira request failed (HTTP ${status}).`,\n 'other',\n status,\n );\n }\n}\n\ninterface JiraSearchIssue {\n key?: string;\n fields?: {\n summary?: string;\n issuetype?: { name?: string };\n status?: { name?: string };\n };\n}\n\n// ---- Local types for the Jira payload ----\n\ninterface JiraIssuePayload {\n key?: string;\n fields?: {\n summary?: string;\n description?: unknown; // ADF JSON\n labels?: string[];\n issuetype?: { name?: string };\n assignee?: { displayName?: string };\n status?: { name?: string };\n attachment?: Array<{\n filename: string;\n content: string;\n size?: number;\n mimeType?: string;\n }>;\n };\n renderedFields?: {\n description?: string; // HTML\n };\n}\n\nfunction stripHtml(html: string): string {\n return html\n .replace(/<\\s*br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/(p|div|li|h[1-6])>/gi, '\\n\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n","import type { SquadConfig } from '../core/config.js';\nimport type { SquadSecrets } from '../core/secrets.js';\nimport { AzureDevOpsClient } from './azure.js';\nimport { JiraClient } from './jira.js';\nimport type { TrackerClient } from './types.js';\n\nexport * from './types.js';\nexport { JiraClient } from './jira.js';\nexport { AzureDevOpsClient } from './azure.js';\nexport { sanitizeFilename } from './attachments.js';\nexport { overlayTrackerEnv } from './env-overlay.js';\n\nexport interface ClientResolutionError {\n kind: 'unsupported-tracker' | 'missing-credentials';\n message: string;\n detail: string; // actionable hint (env-var name or secrets.yaml path)\n}\n\nexport interface ClientResolution {\n client?: TrackerClient;\n error?: ClientResolutionError;\n}\n\n/**\n * Given the current workspace config + secrets, return a ready-to-use TrackerClient\n * or a structured error that the caller can surface verbatim to the user.\n *\n * NEVER throws. NEVER reads env vars directly. The caller is responsible for merging\n * env-var-sourced credentials into `secrets` before calling, OR for using the\n * `resolveTrackerCredential` helper and passing the resolved value here.\n */\nexport function clientFor(config: SquadConfig, secrets: SquadSecrets): ClientResolution {\n switch (config.tracker.type) {\n case 'jira': {\n const jira = secrets.tracker?.jira ?? {};\n const host = jira.host ?? config.tracker.workspace;\n if (!host || !jira.email || !jira.token) {\n return {\n error: {\n kind: 'missing-credentials',\n message: 'Jira credentials are incomplete.',\n detail:\n 'Run `squad config set tracker` to enter host, email, and token, or set JIRA_HOST / JIRA_EMAIL / JIRA_API_TOKEN. Run `squad doctor` to verify the connection.',\n },\n };\n }\n return { client: new JiraClient({ host, email: jira.email, token: jira.token }) };\n }\n\n case 'azure': {\n const az = secrets.tracker?.azure ?? {};\n const organization = az.organization ?? config.tracker.workspace;\n const project = az.project ?? config.tracker.project;\n if (!organization || !project || !az.pat) {\n return {\n error: {\n kind: 'missing-credentials',\n message: 'Azure DevOps credentials are incomplete.',\n detail:\n 'Run `squad config set tracker` to enter organization, project, and PAT, or set AZURE_DEVOPS_ORG / AZURE_DEVOPS_PROJECT / AZURE_DEVOPS_PAT. Run `squad doctor` to verify the connection.',\n },\n };\n }\n return { client: new AzureDevOpsClient({ organization, project, pat: az.pat }) };\n }\n\n case 'none':\n default:\n return {\n error: {\n kind: 'unsupported-tracker',\n message: `Tracker type \"${config.tracker.type}\" does not support auto-fetch in 0.2.0.`,\n detail:\n 'Run `squad config set tracker` to use jira or azure for fetch, or pass `--no-fetch` on new-story. Run `squad doctor` to review tracker setup.',\n },\n };\n }\n}\n","import fs from 'node:fs';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadConfig, saveConfig, type SquadConfig } from '../../core/config.js';\nimport { loadSecrets, saveSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { isInteractive } from '../../ui/tty.js';\n\nexport interface ConfigUnsetTrackerOptions {\n removeCredentials?: boolean;\n yes?: boolean;\n}\n\nexport async function runConfigUnsetTracker(opts: ConfigUnsetTrackerOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n const useYes = Boolean(opts.yes);\n if (!useYes) {\n if (!isInteractive()) {\n ui.warning('Pass -y in non-interactive mode to confirm setting the tracker to none.');\n return;\n }\n const ok = await confirm({ message: 'Set tracker to none? (keeps tracker tokens in .squad/secrets.yaml.)', default: false });\n if (!ok) {\n return;\n }\n }\n\n const next: SquadConfig = { ...config, tracker: { type: 'none' } };\n saveConfig(paths.configFile, next);\n\n if (opts.removeCredentials) {\n const s: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n if (s.tracker) {\n delete s.tracker;\n saveSecrets(paths.secretsFile, s);\n }\n ui.success('Tracker set to none; tracker credentials were removed from .squad/secrets.yaml.');\n } else {\n ui.success('Tracker set to none; any tracker credentials in .squad/secrets.yaml (if any) were preserved.');\n }\n ui.info('Re-enable any time with `squad config set tracker`.');\n}\n","import fs from 'node:fs';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { loadSecrets, saveSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { isInteractive } from '../../ui/tty.js';\n\nexport type CredentialSection = 'planner' | 'tracker';\n\nexport interface ConfigRemoveCredentialOptions {\n yes?: boolean;\n}\n\nexport async function runConfigRemoveCredential(\n section: string,\n opts: ConfigRemoveCredentialOptions = {},\n): Promise<void> {\n if (section !== 'planner' && section !== 'tracker') {\n throw new Error(\n 'Invalid section. Run `squad config remove-credential planner` or `squad config remove-credential tracker`.',\n );\n }\n\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n\n const useYes = Boolean(opts.yes);\n if (!useYes) {\n if (!isInteractive()) {\n ui.warning('Pass -y in non-interactive mode to confirm, or run `squad config remove-credential` in a TTY.');\n return;\n }\n const ok = await confirm({\n message: `Delete all ${section} credentials from .squad/secrets.yaml? (config is unchanged)`,\n default: false,\n });\n if (!ok) {\n return;\n }\n }\n\n const s: SquadSecrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n if (section === 'planner') {\n if (s.planner) {\n delete s.planner;\n }\n } else {\n if (s.tracker) {\n delete s.tracker;\n }\n }\n saveSecrets(paths.secretsFile, s);\n ui.success(`Removed credentials for ${section}.`);\n ui.info('Run `squad config set ' + section + '` to re-enter credentials.');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { input, select } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot, slugify, type SquadPaths } from '../core/paths.js';\nimport { listFeatures } from '../core/stories.js';\nimport { loadConfig, type SquadConfig } from '../core/config.js';\nimport { validateTrackerId, trackerIdForFilename } from '../core/tracker.js';\nimport { loadSecrets } from '../core/secrets.js';\nimport {\n buildFallbackPreamble,\n buildSourcePreamble,\n} from '../core/story-intake-helpers.js';\nimport { writeNewStoryToDisk } from '../core/story-mutations.js';\nimport { clientFor, overlayTrackerEnv } from '../tracker/index.js';\nimport { TrackerError, type DownloadedAttachment, type FetchIssueResult } from '../tracker/types.js';\n\nexport function validateFeatureSlugForPrompt(v: string): true | string {\n const trimmed = v.trim();\n if (!trimmed) return 'Required.';\n const s = slugify(trimmed);\n if (!s) return 'Required.';\n if (s !== trimmed) return 'Use lowercase kebab-case (letters, digits, hyphens).';\n return true;\n}\n\nexport interface NewStoryOptions {\n id?: string;\n title?: string;\n yes?: boolean;\n /** default true; --no-fetch sets false */\n fetch?: boolean;\n /** default true; --no-attachments sets false */\n attachments?: boolean;\n attachmentMb?: number;\n /** default true; --no-tracker sets false. When false, behave as if tracker.type === 'none' for this call. */\n tracker?: boolean;\n}\n\nexport async function runNewStory(featureSlug: string | undefined, opts: NewStoryOptions): Promise<void> {\n const interactive = !opts.yes && Boolean(process.stdin.isTTY) && process.env.CI !== 'true';\n\n let featureSlugInput: string | undefined = featureSlug;\n if (!featureSlugInput) {\n if (!interactive) {\n throw new Error(\n 'feature-slug is required. Run `squad new-story` in a TTY to pick interactively, or pass a slug like `squad new-story <feature-slug>`, or add `--yes` to fail fast in scripts.',\n );\n }\n const rootForPrompt = requireSquadRoot();\n const pathsForPrompt = buildPaths(rootForPrompt);\n const existing = listFeatures(pathsForPrompt);\n if (existing.length > 0) {\n const choice = await select({\n message: 'Feature:',\n choices: [\n ...existing.map((f) => ({ name: f, value: f })),\n { name: '─── new feature ───', value: '__NEW__' },\n ],\n });\n if (choice !== '__NEW__') {\n featureSlugInput = choice;\n }\n }\n if (!featureSlugInput) {\n featureSlugInput = (\n await input({\n message: 'New feature slug (kebab-case):',\n validate: validateFeatureSlugForPrompt,\n })\n ).trim();\n }\n }\n\n const slug = slugify(featureSlugInput!);\n if (!slug) {\n throw new Error(\n `Invalid feature slug: \"${featureSlugInput}\". Run \\`squad new-story\\` and use kebab-case (letters, digits, hyphens).`,\n );\n }\n\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n let noTracker = opts.tracker === false && config.tracker.type !== 'none';\n let id = opts.id;\n if (noTracker) id = undefined;\n let trackerNeedsId =\n !noTracker && config.tracker.type !== 'none' && config.naming.includeTrackerId;\n\n let title = opts.title;\n\n if (!id && trackerNeedsId) {\n if (!interactive) {\n throw new Error(\n `Tracker \"${config.tracker.type}\" is configured and naming.includeTrackerId is true. ` +\n `Run \\`squad new-story <feature-slug> --id <tracker-id>\\` to link now, or \\`squad new-story <feature-slug> --no-tracker\\` to skip the tracker for this story only.`,\n );\n }\n const mode = await select({\n message: `This workspace requires a ${config.tracker.type} id for new stories. How do you want to proceed?`,\n choices: [\n { name: `Enter a ${config.tracker.type} id now`, value: 'enter' },\n { name: 'Skip tracker for this story (same as --no-tracker)', value: 'skip' },\n ],\n default: 'enter',\n });\n if (mode === 'skip') {\n opts.tracker = false;\n noTracker = true;\n trackerNeedsId = false;\n } else {\n id = (\n await input({\n message: `${config.tracker.type} work-item id:`,\n validate: (v) =>\n validateTrackerId(config.tracker.type, v.trim())\n ? true\n : `Invalid ${config.tracker.type} id format.`,\n })\n ).trim();\n }\n }\n\n if (id && !validateTrackerId(config.tracker.type, id)) {\n throw new Error(\n `Invalid tracker id \"${id}\" for tracker type \"${config.tracker.type}\". ` +\n `Run \\`squad config show\\` to review the expected format, or \\`squad config set tracker\\` if the tracker type is wrong.`,\n );\n }\n\n if (!id && !title) {\n if (!interactive) {\n if (!noTracker) {\n throw new Error(\n 'Provide either --id <tracker-id> or --title \"...\" so the story folder has a distinct name. ' +\n 'Run `squad new-story <feature-slug> --id ...` or `squad new-story <feature-slug> --title \"...\"` (or `--no-tracker` with a title).',\n );\n }\n } else {\n title = (await input({ message: 'Short story title:' })).trim();\n if (!title) throw new Error('Title cannot be empty. Run `squad new-story` again and enter a short title, or add `--yes` to fail fast in scripts.');\n }\n }\n\n if (interactive && !title) {\n const maybe = (await input({ message: 'Short title (optional, press Enter to skip):', default: '' })).trim();\n if (maybe) title = maybe;\n }\n\n const storyFolderName = id ? trackerIdForFilename(config.tracker.type, id) : slugify(title ?? '');\n if (!storyFolderName) {\n throw new Error(\n 'Could not derive a story folder name. Pass `--title \"<hint>\"` when using `--no-tracker`, or `--id <tracker-id>` to name the folder after the tracker id.',\n );\n }\n const storyDir = path.join(paths.storiesDir, slug, storyFolderName);\n const intakeFile = path.join(storyDir, 'intake.md');\n const attachmentsDir = path.join(storyDir, 'attachments');\n\n if (fs.existsSync(intakeFile)) {\n throw new Error(\n `Intake already exists: ${intakeFile}. Run \\`squad new-plan ${path.relative(root, intakeFile)}\\` to plan it, or \\`squad rm story\\` to remove the story first.`,\n );\n }\n\n fs.mkdirSync(attachmentsDir, { recursive: true });\n\n let sourceBlock = '';\n let fetchedSummary: { id: string; written: number } | undefined;\n let fetchedIssue: FetchIssueResult | undefined;\n\n const shouldFetch =\n !noTracker && opts.fetch !== false && Boolean(id) && config.tracker.type !== 'none';\n if (shouldFetch) {\n const outcome = await tryFetchIssue(config, id!, opts, paths, attachmentsDir);\n if (outcome.outcome === 'ok') {\n fetchedIssue = outcome.issue;\n sourceBlock = buildSourcePreamble(outcome.issue, outcome.downloads, config.tracker.type);\n if (!title) title = outcome.issue.title;\n const written = outcome.downloads.filter((d) => d.outcome === 'written').length;\n fetchedSummary = { id: outcome.issue.id, written };\n } else {\n ui.warning(`Tracker fetch skipped: ${outcome.reason}`);\n if (outcome.hint) ui.info(outcome.hint);\n sourceBlock = buildFallbackPreamble(outcome.reason, outcome.hint);\n }\n }\n\n writeNewStoryToDisk({\n paths,\n config,\n featureSlug: slug,\n storyFolderName,\n id,\n title,\n noTracker,\n sourceBlock,\n fetchedIssue,\n });\n\n const relativePath = path.relative(root, intakeFile);\n const relAttachDir = path.relative(root, attachmentsDir);\n ui.success('Created intake');\n if (noTracker && config.tracker.type !== 'none') {\n ui.warning('Created without a tracker link. Use `squad tracker link` later to attach one.');\n }\n ui.kv('intake', relativePath, 11);\n ui.kv('attachments', relAttachDir + path.sep, 11);\n if (fetchedSummary && fetchedSummary.written > 0) {\n ui.kv('fetched', `${fetchedSummary.id} · ${fetchedSummary.written} attachments saved`, 11);\n }\n ui.blank();\n ui.step('Next: review the intake (Source block at top is from the tracker), then:');\n ui.info(`squad new-plan ${relativePath}`);\n}\n\ntype FetchOutcome =\n | { outcome: 'ok'; issue: FetchIssueResult; downloads: DownloadedAttachment[] }\n | { outcome: 'skipped'; reason: string; hint?: string }\n | { outcome: 'failed'; reason: string; hint?: string };\n\nasync function tryFetchIssue(\n config: SquadConfig,\n id: string,\n opts: NewStoryOptions,\n paths: SquadPaths,\n attachmentsDir: string,\n): Promise<FetchOutcome> {\n const secretsFromFile = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n const secrets = overlayTrackerEnv(secretsFromFile);\n const resolution = clientFor(config, secrets);\n if (resolution.error) {\n return { outcome: 'skipped', reason: resolution.error.message, hint: resolution.error.detail };\n }\n const client = resolution.client!;\n\n const spin = ui.spinner(`Fetching ${config.tracker.type} ${id}…`);\n let issue: FetchIssueResult;\n try {\n issue = await client.fetchIssue(id);\n } catch (err) {\n spin.fail('Tracker fetch failed');\n if (err instanceof TrackerError) {\n return { outcome: 'failed', reason: err.message, hint: explainTrackerErrorHint(err) };\n }\n return { outcome: 'failed', reason: (err as Error).message };\n }\n spin.succeed(`Fetched ${issue.id}: ${truncate(issue.title, 60)}`);\n\n let downloads: DownloadedAttachment[] = [];\n if (opts.attachments !== false && issue.attachments.length > 0) {\n const attachSpin = ui.spinner(`Downloading ${issue.attachments.length} attachment(s)…`);\n downloads = await client.downloadAttachments(issue.attachments, attachmentsDir, {\n maxMegabytes: opts.attachmentMb,\n });\n const written = downloads.filter((d) => d.outcome === 'written').length;\n const skipped = downloads.length - written;\n attachSpin.succeed(`Attachments: ${written} saved, ${skipped} skipped`);\n } else if (opts.attachments === false && issue.attachments.length > 0) {\n downloads = issue.attachments.map((source) => ({\n source,\n outcome: 'skipped-error' as const,\n bytesWritten: 0,\n skipReason: 'not downloaded (--no-attachments)',\n }));\n }\n\n return { outcome: 'ok', issue, downloads };\n}\n\nfunction explainTrackerErrorHint(err: TrackerError): string | undefined {\n switch (err.kind) {\n case 'auth':\n return 'Run `squad config set tracker` to re-enter credentials, or `squad doctor` to verify.';\n case 'not-found':\n return 'Run `squad config show` to check workspace settings, or `squad tracker link` with a valid work-item id.';\n case 'rate-limited':\n return 'Wait a minute, then retry, or run `squad new-story` with --no-fetch.';\n case 'network':\n return 'Run `squad doctor` to verify connectivity, or `squad new-story` with --no-fetch to skip.';\n default:\n return undefined;\n }\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + '…';\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { SquadPaths } from './paths.js';\n\nexport interface StoryRecord {\n feature: string;\n id: string;\n intakePath: string;\n storyDir: string;\n planFile?: string;\n titleHint?: string;\n}\n\nconst STORY_FILE = /^(\\d{2,})-story-.+\\.md$/;\n\n/** Top-level feature directory names under `.squad/stories/`. */\nexport function listFeatures(paths: SquadPaths): string[] {\n if (!fs.existsSync(paths.storiesDir)) return [];\n return fs\n .readdirSync(paths.storiesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort();\n}\n\n/** Feature slugs that have a `plans/<feature>/` tree (union of story features and plan-only dirs). */\nexport function listPlanFeatureNames(paths: SquadPaths): string[] {\n const names = new Set(listFeatures(paths));\n if (fs.existsSync(paths.plansDir)) {\n for (const e of fs.readdirSync(paths.plansDir, { withFileTypes: true })) {\n if (e.isDirectory()) names.add(e.name);\n }\n }\n return [...names].sort();\n}\n\n/** All intakes; same rows as `listStories()` with no filter. */\nexport function listAllStories(paths: SquadPaths): StoryRecord[] {\n return listStories(paths);\n}\n\nexport function listStories(paths: SquadPaths, opts: { feature?: string } = {}): StoryRecord[] {\n const rows: StoryRecord[] = [];\n if (!fs.existsSync(paths.storiesDir)) return rows;\n\n for (const feature of fs.readdirSync(paths.storiesDir, { withFileTypes: true })) {\n if (!feature.isDirectory()) continue;\n if (opts.feature && feature.name !== opts.feature) continue;\n const featureDir = path.join(paths.storiesDir, feature.name);\n for (const story of fs.readdirSync(featureDir, { withFileTypes: true })) {\n if (!story.isDirectory()) continue;\n const storyDir = path.join(featureDir, story.name);\n const intakePath = path.join(storyDir, 'intake.md');\n if (!fs.existsSync(intakePath)) continue;\n rows.push({\n feature: feature.name,\n id: story.name,\n intakePath,\n storyDir,\n planFile: findPlanFor(paths.plansDir, feature.name, story.name),\n titleHint: readTitleHint(intakePath),\n });\n }\n }\n return rows;\n}\n\nexport function findPlanFor(plansDir: string, feature: string, storyId: string): string | undefined {\n const featureDir = path.join(plansDir, feature);\n if (!fs.existsSync(featureDir)) return undefined;\n const candidates: string[] = [];\n for (const entry of fs.readdirSync(featureDir)) {\n if (!STORY_FILE.test(entry)) continue;\n if (entry.includes(storyId)) candidates.push(entry);\n }\n if (candidates.length === 0) return undefined;\n const complete = candidates.find((e) => !e.endsWith('.partial.md'));\n return complete ?? candidates[0];\n}\n\nexport function findStoryByIntake(records: StoryRecord[], intakePath: string): StoryRecord | undefined {\n const target = normalizeIntakePath(intakePath.trim());\n return records.find((r) => normalizeIntakePath(r.intakePath) === target);\n}\n\nfunction normalizeIntakePath(p: string): string {\n const resolved = path.resolve(p);\n try {\n return fs.realpathSync(resolved);\n } catch {\n return resolved;\n }\n}\n\nexport function readTitleHint(intakePath: string): string | undefined {\n try {\n const raw = fs.readFileSync(intakePath, 'utf8');\n const head = raw.split('\\n').slice(0, 30).join('\\n');\n const hintLine = head.match(/>\\s*\\*\\*Title hint \\(from CLI\\):\\*\\*\\s*(.+?)\\s*$/m);\n const fromHint = hintLine?.[1]?.trim();\n if (fromHint) return fromHint;\n\n // Anchor heading: `### Description` in a tracker preamble contains the substring `## Description`.\n const titleFence = raw.match(/(?:^|\\n)## Title\\b[\\s\\S]*?\\n```(?:[\\w-]*)?\\s*\\n([\\s\\S]*?)\\n```/);\n const fromFence = titleFence?.[1]?.trim();\n if (fromFence) return fromFence;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface PlanMetadata {\n provider?: string;\n model?: string;\n generatedBy?: string; // e.g. \"anthropic/claude-opus-4-x\" when the plan header includes squad-kit metadata\n}\n\nconst PLAN_GENERATED_BY = /^<!--\\s*squad-kit:\\s*generated by\\s+([^\\s,]+)/;\nconst PLAN_ANY_SQUAD = /^<!--\\s*squad-kit:\\s*(.+?)\\s*-->$/;\n\nconst MAX_FREEFORM_META_LEN = 96;\n\nfunction parsePlanMetadataLine(line: string): PlanMetadata | null {\n const strict = line.match(PLAN_GENERATED_BY);\n if (strict) {\n const generatedBy = strict[1]!;\n const [provider, model] = generatedBy.split('/');\n return { provider, model, generatedBy };\n }\n const any = line.match(PLAN_ANY_SQUAD);\n if (!any) return null;\n const inner = any[1]!.trim();\n const flex = inner.match(/^generated\\s+by\\s+([^\\s,]+)/i);\n if (flex) {\n const generatedBy = flex[1]!;\n const [provider, model] = generatedBy.split('/');\n return { provider, model, generatedBy };\n }\n const short =\n inner.length > MAX_FREEFORM_META_LEN ? `${inner.slice(0, MAX_FREEFORM_META_LEN - 1)}…` : inner;\n return { generatedBy: short };\n}\n\n/**\n * Reads the first `<!-- squad-kit: … -->` line near the top of a plan file.\n * - API plans: `generated by provider/model, …` → splits provider / model for tooling.\n * - Other comments: exposes the inner text as `generatedBy` (truncated) so `squad list` is not blank.\n */\nexport function readPlanMetadata(planFileAbsPath: string): PlanMetadata {\n try {\n const raw = fs.readFileSync(planFileAbsPath, 'utf8').replace(/^\\uFEFF/, '');\n const lines = raw.split(/\\n/);\n const scan = Math.min(lines.length, 40);\n for (let i = 0; i < scan; i++) {\n const line = (lines[i] ?? '').replace(/\\r$/, '').trim();\n if (!line) continue;\n const parsed = parsePlanMetadataLine(line);\n if (parsed) return parsed;\n }\n return {};\n } catch {\n return {};\n }\n}\n","import type { TrackerType } from './config.js';\n\nconst VALIDATORS: Record<Exclude<TrackerType, 'none'>, RegExp> = {\n github: /^(?:[\\w.-]+\\/[\\w.-]+#)?\\d+$/,\n linear: /^[A-Z][A-Z0-9]+-\\d+$/i,\n jira: /^[A-Z][A-Z0-9]+-\\d+$/,\n azure: /^\\d+$/,\n};\n\nexport function validateTrackerId(type: TrackerType, id: string): boolean {\n if (type === 'none') return true;\n const pattern = VALIDATORS[type];\n return pattern.test(id);\n}\n\nexport function trackerIdForFilename(type: TrackerType, id: string): string {\n if (type === 'github') return id.replace(/^[\\w.-]+\\/[\\w.-]+#/, '');\n return id;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { SquadConfig, TrackerType } from './config.js';\nimport { readFile, templatesDir, writeFileSafe } from '../utils/fs.js';\nimport { escapeTemplateValue, render } from './template.js';\nimport type { DownloadedAttachment, FetchIssueResult } from '../tracker/types.js';\n\nexport function buildIntakeTemplateVars(args: {\n config: SquadConfig;\n featureSlug: string;\n storyFolderName: string;\n trackerId: string | undefined;\n title: string | undefined;\n fetchedIssue: FetchIssueResult | undefined;\n}): Record<string, string> {\n const e = escapeTemplateValue;\n const { config, featureSlug, storyFolderName, trackerId, title, fetchedIssue } = args;\n return {\n featureSlug,\n storyId: storyFolderName,\n trackerType: config.tracker.type,\n trackerWorkItemId: e((fetchedIssue?.id ?? trackerId ?? '').trim()),\n trackerWorkItemType: e((fetchedIssue?.type ?? '').trim()),\n trackerStatus: e((fetchedIssue?.status ?? '').trim()),\n trackerAssignee: e((fetchedIssue?.assignee ?? '').trim()),\n trackerLabels: e((fetchedIssue?.labels ?? []).join(', ').trim()),\n trackerTitle: e((title ?? '').trim()),\n trackerDescription: e((fetchedIssue?.description ?? '').trim()),\n trackerAcceptanceCriteria: e((fetchedIssue?.acceptanceCriteria ?? '').trim()),\n projectRoots: (config.project.projectRoots ?? ['.']).join(', '),\n primaryLanguage: config.project.primaryLanguage ?? '',\n };\n}\n\nexport function buildSourcePreamble(\n issue: FetchIssueResult,\n downloads: DownloadedAttachment[],\n trackerType: TrackerType,\n): string {\n const header =\n `> **Fetched from ${trackerType}:** [${issue.id}](${issue.url}) ` +\n `\\n> *Fetched ${issue.fetchedAt}. Edit the sections below as needed; the planner reads this file verbatim.*\\n\\n`;\n\n const metaLines: string[] = [];\n metaLines.push(`**Title:** ${issue.title}`);\n if (issue.type) metaLines.push(`**Type:** ${issue.type}`);\n if (issue.status) metaLines.push(`**Status:** ${issue.status}`);\n if (issue.assignee) metaLines.push(`**Assignee:** ${issue.assignee}`);\n if (issue.labels.length > 0) metaLines.push(`**Labels:** ${issue.labels.join(', ')}`);\n\n const description =\n issue.description.trim().length > 0 ? issue.description.trim() : '*(tracker returned an empty description)*';\n\n const attachmentsTable = renderAttachmentsTable(downloads);\n\n return [\n header,\n '## Source — work item (from tracker)',\n '',\n metaLines.join(' \\n'),\n '',\n '### Description',\n '',\n description,\n '',\n attachmentsTable,\n '',\n '---',\n '',\n ].join('\\n');\n}\n\nfunction renderAttachmentsTable(downloads: DownloadedAttachment[]): string {\n if (downloads.length === 0) return '### Attachments\\n\\nNone.';\n const rows = downloads.map((d) => {\n const sizeNum = (d.bytesWritten || d.source.size) / 1024;\n const size = `${sizeNum | 0} KB`;\n switch (d.outcome) {\n case 'written':\n return `| \\`attachments/${path.basename(d.absolutePath!)}\\` | ${size} | downloaded |`;\n case 'skipped-oversize':\n return `| ${d.source.filename} | ${size} | **skipped** — ${d.skipReason} |`;\n case 'skipped-error':\n return `| ${d.source.filename} | — | **skipped** — ${d.skipReason} |`;\n }\n });\n return ['### Attachments', '', '| File | Size | Status |', '| ---- | ---- | ------ |', ...rows].join('\\n');\n}\n\nexport function buildFallbackPreamble(reason: string, hint?: string): string {\n const hintLine = hint ? `\\n> Hint: ${hint}` : '';\n return `> **Tracker auto-fetch skipped.** \\n> ${reason}${hintLine}\\n\\n---\\n\\n`;\n}\n\nexport function buildSkippedTrackerPreamble(trackerType: TrackerType): string {\n return [\n '> **Source:** manual entry (tracker skipped via `--no-tracker`).',\n `> Active tracker for this workspace: \\`${trackerType}\\` — this story is not linked. `,\n '> Run `squad tracker link <story-path> <tracker-id>` later if you want to attach one.',\n '',\n '',\n ].join('\\n');\n}\n\nexport function ensureFeatureOverview(featurePlanDir: string, slug: string): void {\n fs.mkdirSync(featurePlanDir, { recursive: true });\n const overviewFile = path.join(featurePlanDir, '00-overview.md');\n if (fs.existsSync(overviewFile)) return;\n const template = readFile(path.join(templatesDir(), 'overview.md'));\n writeFileSafe(overviewFile, render(template, { featureSlug: slug }), false);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { SquadConfig } from './config.js';\nimport type { SquadPaths } from './paths.js';\nimport { slugify } from './paths.js';\nimport { readBundledPrompt, writeFileSafe } from '../utils/fs.js';\nimport { render } from './template.js';\nimport { validateTrackerId, trackerIdForFilename } from './tracker.js';\nimport { removeOverviewRow, trashOrDelete } from '../commands/rm/shared.js';\nimport type { StoryRecord } from './stories.js';\nimport type { DownloadedAttachment, FetchIssueResult, TrackerClient } from '../tracker/types.js';\nimport {\n buildIntakeTemplateVars,\n buildSkippedTrackerPreamble,\n buildSourcePreamble,\n ensureFeatureOverview,\n} from './story-intake-helpers.js';\n\nexport interface CreatedStory {\n storyDir: string;\n intakePath: string;\n feature: string;\n id: string;\n}\n\n/**\n * Persists a new story intake to disk. Used by the CLI (after optional tracker fetch) and the console API.\n * Caller must have already decided feature slug, folder name, preambles, and fetch data.\n */\nexport function writeNewStoryToDisk(input: {\n paths: SquadPaths;\n config: SquadConfig;\n featureSlug: string;\n storyFolderName: string;\n id: string | undefined;\n title: string | undefined;\n noTracker: boolean;\n sourceBlock: string;\n fetchedIssue: FetchIssueResult | undefined;\n}): CreatedStory {\n const { paths, config, featureSlug, storyFolderName, id, title, noTracker, sourceBlock, fetchedIssue } = input;\n const storyDir = path.join(paths.storiesDir, featureSlug, storyFolderName);\n const intakeFile = path.join(storyDir, 'intake.md');\n const attachmentsDir = path.join(storyDir, 'attachments');\n if (fs.existsSync(intakeFile)) {\n const rel = path.relative(paths.root, intakeFile);\n throw new Error(\n `Intake already exists: ${intakeFile}. Run \\`squad new-plan ${rel}\\` to plan it, or \\`squad rm story\\` to remove the story first.`,\n );\n }\n fs.mkdirSync(attachmentsDir, { recursive: true });\n\n const template = readBundledPrompt('intake.md');\n const rendered = render(\n template,\n buildIntakeTemplateVars({\n config,\n featureSlug,\n storyFolderName,\n trackerId: id,\n title,\n fetchedIssue,\n }),\n );\n const skippedPreamble =\n noTracker && config.tracker.type !== 'none' && !sourceBlock\n ? buildSkippedTrackerPreamble(config.tracker.type)\n : '';\n writeFileSafe(intakeFile, skippedPreamble + sourceBlock + rendered, false);\n ensureFeatureOverview(path.join(paths.plansDir, featureSlug), featureSlug);\n return { storyDir, intakePath: intakeFile, feature: featureSlug, id: storyFolderName };\n}\n\n/**\n * console API: non-interactive new story, never fetches the tracker. Same rules as\n * `squad new-story` with --yes, --no-fetch, and (when no `trackerId`) skip-tracker naming for linked workspaces.\n */\nexport function createStoryRecord(input: {\n paths: SquadPaths;\n config: SquadConfig;\n feature: string;\n title?: string;\n trackerId?: string;\n}): CreatedStory {\n const feature = slugify(input.feature);\n if (!feature) {\n throw new Error(`Invalid feature slug: \"${input.feature}\". Use kebab-case (letters, digits, hyphens).`);\n }\n const rawId = input.trackerId?.trim() || undefined;\n const noTracker = input.config.tracker.type !== 'none' && !rawId;\n let id: string | undefined = rawId;\n if (noTracker) id = undefined;\n\n if (id && !validateTrackerId(input.config.tracker.type, id)) {\n throw new Error(\n `Invalid tracker id \"${id}\" for tracker type \"${input.config.tracker.type}\". ` +\n `Check the expected format, or \\`squad config set tracker\\` if the tracker type is wrong.`,\n );\n }\n\n const title = input.title?.trim() || undefined;\n const storyFolderName = id ? trackerIdForFilename(input.config.tracker.type, id) : slugify(title ?? '');\n if (!storyFolderName) {\n throw new Error(\n 'Could not derive a story folder name. Pass a \"title\" when not linking a tracker id, or provide a \"trackerId\" to name the folder after it.',\n );\n }\n\n return writeNewStoryToDisk({\n paths: input.paths,\n config: input.config,\n featureSlug: feature,\n storyFolderName,\n id,\n title,\n noTracker,\n sourceBlock: '',\n fetchedIssue: undefined,\n });\n}\n\nexport interface CreateStoryFromIssueInput {\n paths: SquadPaths;\n feature: string;\n issue: FetchIssueResult;\n withAttachments: boolean;\n client: TrackerClient;\n config: SquadConfig;\n}\n\n/**\n * Create a story from an already-fetched issue (e.g. console import). Reuses the same\n * intake template and source preamble as `squad new-story` with tracker fetch.\n */\nexport async function createStoryRecordFromIssue(input: CreateStoryFromIssueInput): Promise<CreatedStory> {\n const feature = slugify(input.feature);\n if (!feature) {\n throw new Error(`Invalid feature slug: \"${input.feature}\". Use kebab-case (letters, digits, hyphens).`);\n }\n const id = input.issue.id.trim();\n if (!validateTrackerId(input.config.tracker.type, id)) {\n throw new Error(\n `Invalid tracker id \"${id}\" for tracker type \"${input.config.tracker.type}\". ` +\n `Check the expected format, or \\`squad config set tracker\\` if the tracker type is wrong.`,\n );\n }\n const title = input.issue.title;\n const storyFolderName = trackerIdForFilename(input.config.tracker.type, id);\n const storyDir = path.join(input.paths.storiesDir, feature, storyFolderName);\n const intakeFile = path.join(storyDir, 'intake.md');\n const attachmentsDir = path.join(storyDir, 'attachments');\n if (fs.existsSync(intakeFile)) {\n const rel = path.relative(input.paths.root, intakeFile);\n throw new Error(\n `Intake already exists: ${intakeFile}. Run \\`squad new-plan ${rel}\\` to plan it, or \\`squad rm story\\` to remove the story first.`,\n );\n }\n fs.mkdirSync(attachmentsDir, { recursive: true });\n\n let downloads: DownloadedAttachment[] = [];\n if (input.withAttachments && input.issue.attachments.length > 0) {\n downloads = await input.client.downloadAttachments(input.issue.attachments, attachmentsDir);\n } else if (!input.withAttachments && input.issue.attachments.length > 0) {\n downloads = input.issue.attachments.map((source) => ({\n source,\n outcome: 'skipped-error' as const,\n bytesWritten: 0,\n skipReason: 'not downloaded',\n }));\n }\n const sourceBlock = buildSourcePreamble(input.issue, downloads, input.config.tracker.type);\n return writeNewStoryToDisk({\n paths: input.paths,\n config: input.config,\n featureSlug: feature,\n storyFolderName,\n id,\n title,\n noTracker: false,\n sourceBlock,\n fetchedIssue: input.issue,\n });\n}\n\nexport interface DeleteStoryInput {\n paths: SquadPaths;\n story: StoryRecord;\n trash: boolean;\n}\n\nexport interface DeletedStory {\n removed: string[];\n trashed?: string;\n}\n\nexport function deleteStoryRecord(input: DeleteStoryInput): DeletedStory {\n const targets: string[] = [input.story.storyDir];\n if (input.story.planFile) {\n targets.push(path.join(input.paths.plansDir, input.story.feature, input.story.planFile));\n }\n const result = trashOrDelete(targets, input.paths.trashDir, input.trash);\n removeOverviewRow(path.join(input.paths.plansDir, input.story.feature), input.story.id);\n return result;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { select } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { isInteractive } from '../../ui/tty.js';\nimport { formatSequence } from '../../core/sequence.js';\nimport { findStoryByIntake, listAllStories, listFeatures, type StoryRecord } from '../../core/stories.js';\nimport type { SquadPaths } from '../../core/paths.js';\n\nconst STORY_PLAN = /^(\\d{2,})-story-.+\\.md$/;\n\nexport interface RmBaseOptions {\n dryRun?: boolean;\n trash?: boolean;\n yes?: boolean;\n feature?: string;\n}\n\nexport function canPromptForRm(opts: { yes?: boolean }): boolean {\n if (opts.yes) return false;\n return isInteractive() && Boolean(process.stdin.isTTY);\n}\n\n/**\n * Remove the overview row for a story (matched by storyId appearing in the row text).\n * Idempotent: missing row or missing file is a no-op.\n */\nexport function removeOverviewRow(featurePlanDir: string, storyId: string): void {\n const overview = path.join(featurePlanDir, '00-overview.md');\n if (!fs.existsSync(overview)) return;\n const src = fs.readFileSync(overview, 'utf8');\n const lines = src.split('\\n');\n const filtered = lines.filter((line) => {\n if (!line.startsWith('|')) return true;\n if (line.includes('NN') && line.includes('File') && line.includes('Title')) return true;\n if (/^\\|\\s*-+/.test(line)) return true;\n return !line.includes(storyId);\n });\n fs.writeFileSync(overview, filtered.join('\\n'), 'utf8');\n}\n\n/** Remove a table row that references a plan file basename. */\nexport function removeOverviewRowForPlanFile(featurePlanDir: string, planBasename: string): void {\n const overview = path.join(featurePlanDir, '00-overview.md');\n if (!fs.existsSync(overview)) return;\n const src = fs.readFileSync(overview, 'utf8');\n const token = `\\`${planBasename}\\``;\n const lines = src.split('\\n');\n const filtered = lines.filter((line) => {\n if (!line.startsWith('|')) return true;\n if (line.includes('NN') && line.includes('File') && line.includes('Title')) return true;\n if (/^\\|\\s*-+/.test(line)) return true;\n return !line.includes(token);\n });\n fs.writeFileSync(overview, filtered.join('\\n'), 'utf8');\n}\n\nexport function trashOrDelete(\n absPaths: string[],\n trashRoot: string,\n useTrash: boolean,\n): { removed: string[]; trashed?: string } {\n if (!useTrash) {\n for (const p of absPaths) fs.rmSync(p, { recursive: true, force: true });\n return { removed: absPaths };\n }\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const bucket = path.join(trashRoot, ts);\n fs.mkdirSync(bucket, { recursive: true });\n for (const src of absPaths) {\n const rel = path.basename(src);\n let dst = path.join(bucket, rel);\n let n = 0;\n while (fs.existsSync(dst)) {\n n += 1;\n dst = path.join(bucket, `${n}_${rel}`);\n }\n fs.renameSync(src, dst);\n }\n return { removed: absPaths, trashed: bucket };\n}\n\nexport function renderPreview(\n kind: 'story' | 'plan' | 'feature',\n targets: Array<{ label: string; absPath: string; kind: 'dir' | 'file' }>,\n opts: { dryRun: boolean; trash: boolean; trashRoot: string },\n): void {\n ui.divider(`squad rm ${kind}`);\n ui.step(opts.dryRun ? 'Dry run — nothing will be changed.' : 'About to remove:');\n for (const t of targets) {\n ui.kv(t.kind, t.label, 6);\n }\n if (opts.trash) {\n ui.info(`Items will move to ${path.relative(process.cwd(), opts.trashRoot)}/<timestamp>/`);\n } else if (!opts.dryRun) {\n ui.warning('This is a permanent delete. Pass --trash to move to .squad/.trash/ instead.');\n }\n}\n\nexport interface PlanListEntry {\n feature: string;\n file: string;\n abs: string;\n}\n\nexport function listAllPlanListEntries(paths: SquadPaths, featureFilter?: string): PlanListEntry[] {\n if (!fs.existsSync(paths.plansDir)) return [];\n const out: PlanListEntry[] = [];\n for (const ent of fs.readdirSync(paths.plansDir, { withFileTypes: true })) {\n if (!ent.isDirectory()) continue;\n if (featureFilter && ent.name !== featureFilter) continue;\n const featureDir = path.join(paths.plansDir, ent.name);\n for (const name of fs.readdirSync(featureDir)) {\n if (!STORY_PLAN.test(name)) continue;\n out.push({ feature: ent.name, file: name, abs: path.join(featureDir, name) });\n }\n }\n return out.sort((a, b) => (a.feature + a.file).localeCompare(b.feature + b.file));\n}\n\nexport async function pickStoryInteractive(paths: SquadPaths, featureFilter?: string): Promise<StoryRecord> {\n const stories = listAllStories(paths).filter((s) => !featureFilter || s.feature === featureFilter);\n if (stories.length === 0) {\n throw new Error('No stories to pick. Run `squad new-story` first, or `squad list` to verify paths.');\n }\n if (stories.length === 1) return stories[0]!;\n const choice = await select<StoryRecord>({\n message: 'Story to remove:',\n choices: stories.map((s) => ({\n name: `${s.feature}/${s.id} · ${s.titleHint ?? s.id}`,\n value: s,\n })),\n });\n return choice;\n}\n\nexport async function pickPlanInteractive(paths: SquadPaths, featureFilter?: string): Promise<PlanListEntry> {\n const plans = listAllPlanListEntries(paths, featureFilter);\n if (plans.length === 0) {\n throw new Error('No plan files to pick. Run `squad new-plan` first, or `squad list` to see plans.');\n }\n if (plans.length === 1) return plans[0]!;\n return select<PlanListEntry>({\n message: 'Plan file to remove:',\n choices: plans.map((p) => ({\n name: `${p.feature}/${p.file}`,\n value: p,\n })),\n });\n}\n\nexport async function pickFeatureInteractive(paths: SquadPaths): Promise<string> {\n const feats = listFeatures(paths);\n if (feats.length === 0) {\n throw new Error('No features to pick. Run `squad new-story` first, or `squad list` to see features.');\n }\n if (feats.length === 1) return feats[0]!;\n return select<string>({\n message: 'Feature to remove:',\n choices: feats.map((f) => ({ name: f, value: f })),\n });\n}\n\nexport function resolveStoryFromArg(\n arg: string,\n stories: StoryRecord[],\n root: string,\n): StoryRecord | undefined {\n const t = arg.trim();\n for (const s of stories) {\n if (s.id === t) return s;\n if (`${s.feature}/${s.id}` === t) return s;\n }\n const abs = path.isAbsolute(t) ? t : path.resolve(root, t);\n const withIntake = t.endsWith('intake.md') ? abs : path.join(abs, 'intake.md');\n return findStoryByIntake(stories, withIntake) ?? findStoryByIntake(stories, abs);\n}\n\nfunction isSequenceToken(s: string): boolean {\n return /^\\d{1,4}$/.test(s) && s.length > 0;\n}\n\nfunction tryParsePlanFilePath(absPath: string, paths: SquadPaths, featureFilter: string | undefined): PlanListEntry | undefined {\n if (!fs.existsSync(absPath) || !STORY_PLAN.test(path.basename(absPath))) return undefined;\n const planRoot = fs.realpathSync(path.resolve(paths.plansDir));\n const fileReal = fs.realpathSync(path.resolve(absPath));\n const rel = path.relative(planRoot, fileReal);\n if (rel.startsWith('..') || path.isAbsolute(rel)) return undefined;\n const segs = rel.split(path.sep);\n if (segs.length < 2) return undefined;\n const feature = segs[0]!;\n const file = segs.slice(1).join(path.sep);\n if (featureFilter && feature !== featureFilter) return undefined;\n return { feature, file, abs: path.resolve(absPath) };\n}\n\nexport function resolvePlanFromArg(\n arg: string,\n paths: SquadPaths,\n featureFilter: string | undefined,\n): PlanListEntry | undefined {\n const t = arg.trim();\n if (!t) return undefined;\n\n const asPath = path.isAbsolute(t) ? t : path.resolve(process.cwd(), t);\n const a = tryParsePlanFilePath(asPath, paths, featureFilter);\n if (a) return a;\n if (!path.isAbsolute(t)) {\n const under = tryParsePlanFilePath(path.join(paths.plansDir, t), paths, featureFilter);\n if (under) return under;\n }\n\n if (isSequenceToken(t)) {\n const nn = formatSequence(parseInt(t, 10));\n const prefix = `${nn}-`;\n const cands: PlanListEntry[] = [];\n for (const p of listAllPlanListEntries(paths, featureFilter)) {\n if (p.file.startsWith(prefix)) cands.push(p);\n }\n if (cands.length === 1) return cands[0]!;\n if (cands.length > 1) {\n throw new Error(\n `Multiple plans match sequence \"${t}\". Run \\`squad rm plan\\` in a TTY, or add \\`--feature <slug>\\` to disambiguate.`,\n );\n }\n }\n\n return undefined;\n}\n\nexport function countOverviewDataRows(overviewContent: string): number {\n let n = 0;\n for (const line of overviewContent.split('\\n')) {\n if (!line.startsWith('|')) continue;\n if (/^\\|\\s*-+/.test(line)) continue;\n if (line.includes('NN') && line.includes('File') && line.includes('Title')) continue;\n n++;\n }\n return n;\n}\n\nexport function featureStoriesDirEmpty(paths: SquadPaths, feature: string): boolean {\n const d = path.join(paths.storiesDir, feature);\n if (!fs.existsSync(d)) return true;\n return fs.readdirSync(d).length === 0;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nconst STORY_FILE = /^(\\d{2,})-story-.+\\.md$/;\n\nexport interface SequenceScan {\n usedNumbers: number[];\n maxNumber: number;\n duplicates: number[];\n nextGlobal: number;\n}\n\nexport function scanPlans(plansDir: string): SequenceScan {\n const used: number[] = [];\n const seen = new Map<number, number>();\n\n if (fs.existsSync(plansDir)) {\n for (const feature of fs.readdirSync(plansDir, { withFileTypes: true })) {\n if (!feature.isDirectory()) continue;\n const featureDir = path.join(plansDir, feature.name);\n for (const entry of fs.readdirSync(featureDir)) {\n const match = entry.match(STORY_FILE);\n if (!match) continue;\n const n = parseInt(match[1]!, 10);\n used.push(n);\n seen.set(n, (seen.get(n) ?? 0) + 1);\n }\n }\n }\n\n const duplicates = [...seen.entries()].filter(([, c]) => c > 1).map(([n]) => n);\n const maxNumber = used.length ? Math.max(...used) : 0;\n return { usedNumbers: used.sort((a, b) => a - b), maxNumber, duplicates, nextGlobal: maxNumber + 1 };\n}\n\nexport function formatSequence(n: number): string {\n return String(n).padStart(2, '0');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { confirm, select } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { SquadExit } from '../core/cli-exit.js';\nimport { buildPaths, requireSquadRoot, type SquadPaths } from '../core/paths.js';\nimport { DEFAULT_PLANNER_MAX_OUTPUT_TOKENS, loadConfig, type SquadConfig } from '../core/config.js';\nimport { readFile } from '../utils/fs.js';\nimport { copyToClipboard } from '../utils/clipboard.js';\nimport { findStoryByIntake, listStories, type StoryRecord } from '../core/stories.js';\nimport { runPlanner, type RunPlannerOutput } from '../planner/loop.js';\nimport type { PlannerLimitDecision, PlannerSessionLimitContext } from '../planner/session-limits.js';\nimport {\n printPlannerApiCostNotice,\n printPlannerLimitExplanation,\n printPlannerLimitNextSteps,\n} from '../planner/planner-limit-messages.js';\nimport { providerFor } from '../planner/providers/index.js';\nimport { Budget } from '../planner/budget.js';\nimport { buildRepoMap } from '../core/repo-map.js';\nimport { composeSystemPrompt, composeUserPrompt } from '../planner/system-prompt.js';\nimport { writePlanFile, buildMetadataHeader } from '../planner/writer.js';\nimport { buildCopyPlanPromptMarkdown } from '../core/copy-plan-prompt.js';\nimport { modelFor, providerEnvVar, readProviderKey } from '../core/planner-models.js';\nimport { writeLastRun } from '../core/last-run.js';\nimport { appendRun, newRunId } from '../core/runs.js';\nimport { formatPlannerCacheLine } from '../ui/planner-cache-summary.js';\nimport { PlannerEventBus } from '../planner/events.js';\n\nexport interface NewPlanOptions {\n /** Default true; `--no-clipboard` sets false (copy-paste mode only). */\n clipboard?: boolean;\n /** `--copy` — force copy-paste mode. */\n copy?: boolean;\n feature?: string;\n all?: boolean;\n yes?: boolean;\n api?: boolean;\n}\n\nfunction decideMode(opts: NewPlanOptions, config: SquadConfig): 'api' | 'copy' {\n if (opts.api && opts.copy) {\n throw new Error('Pass either --api or --copy, not both. Run `squad new-plan --help` for valid flags.');\n }\n if (opts.api) return 'api';\n if (opts.copy) return 'copy';\n const enabled = config.planner?.enabled;\n const key = enabled && config.planner?.provider ? readProviderKey(config.planner.provider) : undefined;\n return enabled && key ? 'api' : 'copy';\n}\n\nexport async function runNewPlan(intakePath: string | undefined, opts: NewPlanOptions): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n const interactive = !opts.yes && Boolean(process.stdin.isTTY);\n const stories = listStories(paths, { feature: opts.feature });\n\n const story = intakePath\n ? resolveFromPath(intakePath, stories, root)\n : await pickStory(stories, { all: !!opts.all, interactive, feature: opts.feature });\n\n if (!story) return;\n\n if (story.planFile) {\n const proceed = await confirmOverwrite(story, interactive, !!opts.yes);\n if (!proceed) return;\n }\n\n const mode = decideMode(opts, config);\n\n if (mode === 'api') {\n await emitViaApi(story, paths, config, opts);\n } else {\n await emitCopyPrompt(story, paths, config, opts.clipboard !== false);\n }\n}\n\nfunction resolveFromPath(intakePath: string, stories: StoryRecord[], root: string): StoryRecord {\n const resolved = path.resolve(intakePath.trim());\n if (!fs.existsSync(resolved)) {\n throw new Error(\n `Intake not found: ${resolved}. Run \\`squad list\\` to see intakes, or \\`squad new-story\\` to create one first.`,\n );\n }\n const hit = findStoryByIntake(stories, resolved);\n if (hit) return hit;\n throw new Error(\n `Intake at ${resolved} is not under ${relativeStoriesDir(root)}. ` +\n `Run \\`squad new-story\\` to create a story, then pass a path like \\`squad new-plan .squad/stories/<feature>/<id>/intake.md\\`.`,\n );\n}\n\nfunction relativeStoriesDir(root: string): string {\n return path.relative(root, path.join(root, '.squad', 'stories'));\n}\n\nasync function pickStory(\n stories: StoryRecord[],\n opts: { all: boolean; interactive: boolean; feature?: string },\n): Promise<StoryRecord | undefined> {\n const candidates = opts.all ? stories : stories.filter((s) => !s.planFile);\n\n if (candidates.length === 0) {\n if (stories.length === 0) {\n ui.info('No intakes to plan. Run `squad new-story` to create one first.');\n return undefined;\n }\n const filterNote = opts.feature ? ` in feature \"${opts.feature}\"` : '';\n ui.info(`All ${stories.length} intakes${filterNote} already have plans.`);\n ui.blank();\n ui.info('Options:');\n ui.info(' squad new-plan --all pick any intake (replaces existing plan)');\n ui.info(' squad new-plan <intake-path> regenerate a specific plan');\n ui.info(' squad new-story <feature> start a new story');\n return undefined;\n }\n\n if (!opts.interactive) {\n throw new Error(\n 'No intake path provided and not running interactively. Run `squad new-plan` with a path to intake.md, or `squad new-plan` in a TTY to pick, or add `--yes` with an explicit path in CI.',\n );\n }\n\n const pick = await select({\n message: 'Pick a story to plan:',\n pageSize: Math.min(10, candidates.length),\n choices: candidates.map((s) => ({\n name: formatLabel(s),\n value: s.intakePath,\n })),\n });\n\n return candidates.find((s) => path.resolve(s.intakePath) === path.resolve(pick));\n}\n\nfunction formatLabel(s: StoryRecord): string {\n const head = `${s.feature} / ${s.id}`;\n const tail = s.titleHint ? ` ${ui.theme.dim(`— \"${s.titleHint}\"`)}` : '';\n const plannedTag = s.planFile ? ` ${ui.theme.warn('(planned)')}` : '';\n return head + tail + plannedTag;\n}\n\nasync function confirmOverwrite(story: StoryRecord, interactive: boolean, yes: boolean): Promise<boolean> {\n ui.warning(`A plan already exists for this intake:`);\n ui.kv('plan', `.squad/plans/${story.feature}/${story.planFile}`);\n ui.info('Regenerating will replace it when your planner writes the new version.');\n if (yes) return true;\n if (!interactive) {\n throw new Error(\n `Plan already exists (.squad/plans/${story.feature}/${story.planFile}). ` +\n `Run \\`squad new-plan\\` with \\`--yes\\` to overwrite non-interactively, or in a TTY to confirm in the prompt.`,\n );\n }\n const go = await confirm({ message: 'Proceed and regenerate?', default: false });\n return go;\n}\n\nfunction printPlannerRunIncompleteSummary(result: RunPlannerOutput, relPlanFile: string): void {\n ui.blank();\n ui.warning('Planning stopped before the model reported a clean completion.');\n ui.kv('saved', relPlanFile, 8);\n if (result.userCancelled) ui.kv('stopped', 'you chose not to continue after a limit', 8);\n if (result.timedOut) ui.kv('timed out', 'yes', 8);\n if (result.budgetExhausted) ui.kv('read budget', 'exhausted (model was asked to finalise)', 8);\n if (result.incompleteKind) ui.kv('detail', result.incompleteKind, 8);\n ui.blank();\n ui.info('The file uses the `.partial.md` suffix and YAML `squad-kit-plan-status: partial`.');\n ui.info('Raise limits in `.squad/config.yaml` (`planner.budget`, `planner.maxOutputTokens`) or re-run when ready.');\n}\n\nasync function emitViaApi(\n story: StoryRecord,\n paths: SquadPaths,\n config: SquadConfig,\n opts: NewPlanOptions,\n): Promise<void> {\n const planner = config.planner;\n if (!planner?.enabled) {\n throw new Error(\n 'Direct planner API is not configured. Run `squad init --force` to enable it, or `squad new-plan --copy` for the manual copy-paste flow.',\n );\n }\n const apiKey = readProviderKey(planner.provider);\n if (!apiKey) {\n throw new Error(\n `Missing ${providerEnvVar(planner.provider)}. Run \\`squad config set planner\\` to save a key to secrets, or export the env var, or run \\`squad new-plan --copy\\` without the API.`,\n );\n }\n\n const model = modelFor(planner.provider, 'plan', planner.modelOverride);\n const provider = providerFor(planner.provider);\n const budget = new Budget(planner.budget);\n\n ui.banner();\n ui.step(`planning ${story.feature} / ${story.id}`);\n ui.kv('provider', planner.provider);\n ui.kv('model', model);\n ui.kv(\n 'budget',\n `${planner.budget.maxFileReads} reads · ${(planner.budget.maxContextBytes / 1024).toFixed(0)} KB · ${planner.budget.maxDurationSeconds}s`,\n );\n ui.blank();\n\n const interactive = !opts.yes && Boolean(process.stdin.isTTY);\n if (interactive) {\n printPlannerApiCostNotice();\n }\n\n const mapSpinner = ui.spinner('building repo map…');\n const repoMap = buildRepoMap(paths.root);\n mapSpinner.succeed(\n `repo map ready (${repoMap.split('\\n').length - 1} paths · ${(repoMap.length / 1024).toFixed(1)} KB)`,\n );\n\n ui.divider('planner session');\n\n const systemPrompt = composeSystemPrompt({\n projectRoots: config.project.projectRoots ?? ['.'],\n primaryLanguage: config.project.primaryLanguage ?? '',\n trackerType: config.tracker.type,\n repoMap,\n });\n const userPrompt = composeUserPrompt({ intakeContent: readFile(story.intakePath) });\n\n const sessionSpinner: { current: ReturnType<typeof ui.spinner> | null } = { current: null };\n const startedAt = Date.now();\n const cacheEnabled = planner.cache?.enabled ?? true;\n const runId = newRunId();\n const bus = new PlannerEventBus();\n const unsubscribe = bus.subscribe((e) => {\n switch (e.kind) {\n case 'tool_call': {\n const p = (e.toolCall.input as { path?: string }).path ?? '<unknown>';\n sessionSpinner.current?.succeed(\n `read ${p} (${(e.bytesLoaded / 1024).toFixed(1)} KB · ${(e.totalBytes / 1024).toFixed(1)} KB / ${(planner.budget.maxContextBytes / 1024).toFixed(0)} KB)`,\n );\n sessionSpinner.current = ui.spinner('reading next file…');\n break;\n }\n case 'assistant_text':\n sessionSpinner.current?.succeed('planner thinking complete (this chunk)');\n sessionSpinner.current = ui.spinner('thinking…');\n break;\n case 'rate_limit':\n sessionSpinner.current?.stop();\n ui.warning(`${planner.provider} rate limit hit — retrying in ${e.waitSec}s`);\n sessionSpinner.current = ui.spinner('waiting for rate limit to reset…');\n break;\n case 'usage':\n break;\n default:\n break;\n }\n });\n\n const decideOnLimit = interactive\n ? async (ctx: PlannerSessionLimitContext): Promise<PlannerLimitDecision> => {\n printPlannerLimitExplanation(ctx);\n const ans = await select({\n message: 'Continue this planning session? (Continuing sends more API requests and is billed.)',\n choices: [\n { name: 'Continue — extend limits for this run', value: 'continue' as const },\n { name: 'Stop — save partial plan and exit', value: 'cancel' as const },\n ],\n });\n if (ans === 'cancel') printPlannerLimitNextSteps();\n return ans;\n }\n : undefined;\n\n let result: RunPlannerOutput;\n try {\n result = await runPlanner({\n root: paths.root,\n provider,\n model,\n apiKey,\n systemPrompt,\n userPrompt,\n budget,\n maxOutputTokens: planner.maxOutputTokens,\n cacheEnabled,\n decideOnLimit,\n events: bus,\n runId,\n });\n } finally {\n unsubscribe();\n sessionSpinner.current?.stop();\n }\n\n if (!result.planText.trim()) {\n throw new Error(\n 'Planner returned no plan text. Run `squad doctor` to check provider and models, or `squad new-plan --copy` to avoid the API.',\n );\n }\n\n const snap = budget.snapshot();\n const elapsedMs = Date.now() - startedAt;\n const success = result.finishedNormally && !result.timedOut && !result.userCancelled;\n\n const header = buildMetadataHeader({\n provider: planner.provider,\n model,\n reads: snap.reads,\n bytes: snap.bytes,\n inputTokens: snap.usage.inputTokens,\n outputTokens: snap.usage.outputTokens,\n durationMs: elapsedMs,\n costUsd: snap.usage.costUsd,\n planStatus: success ? undefined : 'partial',\n });\n\n const { planFile, sequenceNumber, overwrote } = writePlanFile({\n paths,\n config,\n story,\n planBodyMarkdown: result.planText,\n metadataHeader: header,\n partial: !success,\n });\n\n const relPlan = path.relative(paths.root, planFile);\n\n try {\n await writeLastRun(paths, {\n stats: result.stats,\n completedAt: new Date().toISOString(),\n provider: planner.provider,\n model,\n });\n await appendRun(paths, {\n runId,\n provider: planner.provider,\n model,\n feature: story.feature,\n storyId: story.id,\n startedAt: new Date(startedAt).toISOString(),\n completedAt: new Date().toISOString(),\n success,\n partial: !success,\n planFile: relPlan,\n stats: result.stats,\n cacheEnabled,\n durationMs: elapsedMs,\n });\n } catch {\n // best-effort telemetry\n }\n ui.blank();\n ui.summaryBox(success ? ' plan generated ' : ' plan saved (incomplete) ', [\n { key: 'file', value: relPlan },\n { key: 'nn', value: String(sequenceNumber).padStart(2, '0') },\n { key: 'model', value: `${planner.provider}/${model}` },\n { key: 'reads', value: `${snap.reads} files · ${(snap.bytes / 1024).toFixed(1)} KB` },\n {\n key: 'tokens',\n value: `${snap.usage.inputTokens} in · ${snap.usage.outputTokens} out${snap.usage.costUsd !== undefined ? ` ≈ $${snap.usage.costUsd.toFixed(2)}` : ''}`,\n },\n { key: 'cache', value: formatPlannerCacheLine({ cacheEnabled, stats: result.stats }) },\n {\n key: 'max out',\n value: `${planner.maxOutputTokens ?? DEFAULT_PLANNER_MAX_OUTPUT_TOKENS} tok/req`,\n },\n { key: 'time', value: `${Math.round(elapsedMs / 1000)}s` },\n {\n key: 'action',\n value: success\n ? overwrote\n ? 'overwrote existing plan'\n : 'new plan'\n : 'partial plan (review limits)',\n },\n ]);\n\n if (!success) {\n printPlannerRunIncompleteSummary(result, relPlan);\n throw new SquadExit(2);\n }\n\n if (result.budgetExhausted) {\n ui.info('Note: file-read budget was reached; the model finalised without further reads.');\n }\n\n ui.blank();\n ui.info(`next → open a new agent chat and attach only ${path.basename(planFile)}`);\n}\n\nasync function emitCopyPrompt(\n story: StoryRecord,\n paths: SquadPaths,\n config: SquadConfig,\n clipboard: boolean,\n): Promise<void> {\n const intakeContent = readFile(story.intakePath);\n const composed = buildCopyPlanPromptMarkdown(config, intakeContent);\n\n const promptFile = path.join(paths.squadDir, '.last-copy-prompt.md');\n fs.writeFileSync(promptFile, composed, 'utf8');\n const relPromptFile = path.relative(paths.root, promptFile);\n\n const bytes = Buffer.byteLength(composed, 'utf8');\n const estTokens = Math.round(bytes / 4);\n const clipResult = clipboard\n ? await copyToClipboard(composed)\n : { ok: false as const, reason: 'clipboard disabled (--no-clipboard)' };\n\n ui.blank();\n ui.divider('planner prompt ready');\n ui.kv('mode', 'copy-paste', 10);\n ui.kv('story', `${story.feature} / ${story.id}`, 10);\n ui.kv('prompt', relPromptFile, 10);\n ui.kv('size', `${formatKB(bytes)} · ~${formatCount(estTokens)} tokens (est)`, 10);\n if (clipResult.ok) {\n ui.kv('clipboard', `✓ copied via ${clipResult.tool}`, 10);\n } else {\n ui.kv('clipboard', `! ${clipResult.reason}`, 10);\n }\n\n printModelBanner(config);\n\n ui.blank();\n ui.step('Next:');\n ui.info('1) Open your agent chat (Cursor / Claude Code / Copilot / Gemini).');\n ui.info('2) Switch to a strong plan model (Opus 4.x / GPT-5.3 Codex thinking / Gemini deep-think).');\n if (clipResult.ok) {\n ui.info('3) Paste from clipboard and let the agent work. It will read files and write the plan itself.');\n } else {\n ui.info(`3) Open ${relPromptFile}, paste its contents into the agent chat, and let it work.`);\n }\n ui.info(\n `4) The agent writes the plan to .squad/plans/${story.feature}/<nn>-story-${story.id}.md. Review it, then open a fresh chat to implement (attach only the plan file).`,\n );\n}\n\nfunction formatKB(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nfunction formatCount(n: number): string {\n if (n < 1000) return String(n);\n return `${(n / 1000).toFixed(1)}k`;\n}\n\nfunction printModelBanner(config: SquadConfig): void {\n if (!ui.isInteractive()) return;\n ui.blank();\n ui.divider('paste into your agent');\n ui.info('Recommendation: switch to a strong planning model before pasting.');\n const agents = config.agents ?? [];\n const hint = (name: string, msg: string) => {\n if (agents.includes(name)) ui.kv(name, msg, 14);\n };\n hint('cursor', 'model picker → Claude Opus 4.x or GPT-5.3 Codex (thinking)');\n hint('claude-code', '/model claude-opus-4-x');\n hint('copilot', 'chat model picker → the strongest available reasoning model');\n hint('gemini', '/model gemini-deep-think (or the latest strongest)');\n if (agents.length === 0) {\n ui.info(' (any agent) pick the strongest planning model you have access to.');\n }\n ui.divider();\n ui.blank();\n}\n","import { spawn, spawnSync } from 'node:child_process';\n\nexport interface ClipboardResult {\n ok: boolean;\n /** Which clipboard tool was used (pbcopy, clip, wl-copy, xclip, xsel, termux-clipboard-set). */\n tool?: string;\n /** Human-readable reason when ok === false. */\n reason?: string;\n}\n\ninterface ClipboardCommand {\n command: string;\n args: string[];\n /** Called before use — returns a reason string if the tool is unavailable. */\n unavailableReason?: () => string | undefined;\n}\n\nexport async function copyToClipboard(text: string): Promise<ClipboardResult> {\n const candidates = clipboardCandidates();\n if (candidates.length === 0) {\n return { ok: false, reason: noCandidateReason() };\n }\n\n let lastReason: string | undefined;\n for (const cmd of candidates) {\n const reason = cmd.unavailableReason?.();\n if (reason) {\n lastReason = reason;\n continue;\n }\n const res = await tryCopy(cmd, text);\n if (res.ok) return res;\n lastReason = res.reason;\n }\n return { ok: false, reason: lastReason ?? 'no working clipboard tool found' };\n}\n\nfunction tryCopy(cmd: ClipboardCommand, text: string): Promise<ClipboardResult> {\n return new Promise((resolve) => {\n let child: ReturnType<typeof spawn>;\n try {\n child = spawn(cmd.command, cmd.args, { stdio: ['pipe', 'ignore', 'pipe'] });\n } catch (err) {\n resolve({ ok: false, reason: `${cmd.command} failed to spawn: ${(err as Error).message}` });\n return;\n }\n let stderr = '';\n child.stderr?.on('data', (chunk) => {\n stderr += chunk.toString();\n });\n child.on('error', (err) => {\n resolve({ ok: false, reason: `${cmd.command} spawn error: ${err.message}` });\n });\n child.on('close', (code) => {\n if (code === 0) {\n resolve({ ok: true, tool: cmd.command });\n } else {\n resolve({\n ok: false,\n reason: `${cmd.command} exited with code ${code}${stderr ? `: ${stderr.trim().slice(0, 200)}` : ''}`,\n });\n }\n });\n child.stdin?.write(text);\n child.stdin?.end();\n });\n}\n\nfunction clipboardCandidates(): ClipboardCommand[] {\n if (process.platform === 'darwin') {\n return [{ command: 'pbcopy', args: [] }];\n }\n if (process.platform === 'win32') {\n return [{ command: 'clip', args: [] }];\n }\n const out: ClipboardCommand[] = [];\n if (process.env.WAYLAND_DISPLAY) {\n out.push({ command: 'wl-copy', args: [], unavailableReason: hasBinary('wl-copy') });\n }\n if (process.env.DISPLAY) {\n out.push({ command: 'xclip', args: ['-selection', 'clipboard'], unavailableReason: hasBinary('xclip') });\n out.push({ command: 'xsel', args: ['--clipboard', '--input'], unavailableReason: hasBinary('xsel') });\n }\n if (process.env.TERMUX_VERSION) {\n out.push({ command: 'termux-clipboard-set', args: [], unavailableReason: hasBinary('termux-clipboard-set') });\n }\n return out;\n}\n\nfunction hasBinary(bin: string): () => string | undefined {\n return () => {\n const which = process.platform === 'win32' ? 'where' : 'which';\n const res = spawnSync(which, [bin], { stdio: 'ignore' });\n if (res.status === 0) return undefined;\n return `${bin} not found on PATH`;\n };\n}\n\nfunction noCandidateReason(): string {\n if (process.platform === 'linux') {\n if (!process.env.DISPLAY && !process.env.WAYLAND_DISPLAY && !process.env.TERMUX_VERSION) {\n return 'no display server detected (headless / SSH) — install xclip or xsel, or use the saved file';\n }\n return 'no clipboard tool detected — install xclip, xsel, or wl-copy';\n }\n return `no clipboard tool detected on ${process.platform}`;\n}\n","import path from 'node:path';\nimport type {\n ChatTurn,\n PlannerProvider,\n PlannerRunStats,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n ToolResult,\n Usage,\n} from './types.js';\nimport { Budget } from './budget.js';\nimport { READ_FILE_TOOL, readFileTool } from './tools.js';\nimport type { ReadFileResult } from './tools.js';\nimport { rateLimitMessage } from './provider-errors.js';\nimport { prefixOf } from './providers/prefix.js';\nimport * as ui from '../ui/index.js';\nimport { DEFAULT_PLANNER_MAX_OUTPUT_TOKENS } from '../core/config.js';\nimport { newRunId } from '../core/runs.js';\nimport {\n DEFAULT_PLANNER_MAX_ITERATIONS,\n PLANNER_MARKDOWN_CONTINUATION_USER,\n type PlannerLimitDecision,\n type PlannerSessionLimitContext,\n} from './session-limits.js';\nimport { PlannerEventBus } from './events.js';\n\n/**\n * Upper bound on the auto-retry wait. Chosen to cover the common Anthropic Tier 1 /\n * OpenAI free-tier \"wait 60-90s\" asks; anything longer means the org is badly over\n * quota and retrying would only burn another request, so we skip and surface guidance.\n */\nconst MAX_RATE_LIMIT_RETRY_SEC = 90;\n\nconst defaultSleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\nfunction isAbortError(e: unknown): boolean {\n return e instanceof Error && e.name === 'AbortError';\n}\n\nasync function sleepWithAbort(\n ms: number,\n sleepFn: (n: number) => Promise<void>,\n abort: AbortSignal | undefined,\n): Promise<void> {\n if (!abort) {\n await sleepFn(ms);\n return;\n }\n if (abort.aborted) throw new DOMException('Aborted', 'AbortError');\n await Promise.race([\n sleepFn(ms),\n new Promise<never>((_, reject) => {\n abort.addEventListener('abort', () => reject(new DOMException('Aborted', 'AbortError')), { once: true });\n }),\n ]);\n}\n\nexport interface RunPlannerInput {\n root: string;\n provider: PlannerProvider;\n model: string;\n apiKey: string;\n systemPrompt: string;\n userPrompt: string;\n budget: Budget;\n onToolCall?: (tc: ToolCall, bytesLoaded: number, totalBytes: number) => void;\n onUsage?: (u: Usage) => void;\n onAssistantText?: (delta: string) => void;\n /** Invoked when the loop is about to sleep before retrying a 429. The arg is seconds. */\n onRateLimit?: (waitSec: number) => void;\n maxIterations?: number;\n /** When `false`, disables Anthropic prompt-cache markers. Default `true` when omitted. */\n cacheEnabled?: boolean;\n /** Test injection for `setTimeout`. Defaults to the real timer. */\n sleep?: (ms: number) => Promise<void>;\n /** Per provider request; default 16384 when omitted. */\n maxOutputTokens?: number;\n /**\n * When set, the planner asks before extending limits (extra provider calls = extra cost).\n * When omitted, legacy behaviour: read-budget hits nudge the model to finalise without tools;\n * other hard stops return immediately.\n */\n decideOnLimit?: (ctx: PlannerSessionLimitContext) => Promise<PlannerLimitDecision>;\n /** Optional event bus the caller has set up subscribers on. */\n events?: PlannerEventBus;\n /** Stable id for this run; surfaces in every event for correlation. */\n runId?: string;\n /** Optional cancel signal; loop checks between turns and inside long sleeps. */\n abort?: AbortSignal;\n}\n\n/** Why the loop stopped when `finishedNormally` is false (non-error, non-budget, non-timeout). */\nexport type PlannerIncompleteKind =\n | 'max_output_tokens'\n | 'max_iterations'\n | 'wall_clock'\n | 'cost_cap'\n | 'budget_reads';\n\nexport interface RunPlannerOutput {\n planText: string;\n budgetExhausted: boolean;\n timedOut: boolean;\n finishedNormally: boolean;\n iterations: number;\n stats: PlannerRunStats;\n incompleteKind?: PlannerIncompleteKind;\n /** User declined to continue after a session limit was hit (only when `decideOnLimit` is set). */\n userCancelled?: boolean;\n}\n\n/** @alias RunPlannerOutput — result object including aggregated cache telemetry from Story 03. */\nexport type RunPlannerResult = RunPlannerOutput;\n\nexport type { PlannerLimitDecision, PlannerSessionLimitContext, PlannerSessionLimitKind } from './session-limits.js';\n\nfunction buildPlannerRunStats(budget: Budget, turns: number, runStartedAt: number): PlannerRunStats {\n const u = budget.snapshot().usage;\n const cacheRead = u.cacheReadTokens ?? 0;\n const cacheCreate = u.cacheCreationTokens ?? 0;\n const inTok = u.inputTokens;\n const outTok = u.outputTokens;\n const totalInput = inTok + cacheRead;\n const cacheHitRatio = totalInput === 0 ? 0 : Math.round((cacheRead / totalInput) * 100) / 100;\n return {\n turns,\n inputTokens: inTok,\n outputTokens: outTok,\n cacheCreationTokens: cacheCreate,\n cacheReadTokens: cacheRead,\n cacheHitRatio,\n durationMs: Date.now() - runStartedAt,\n };\n}\n\nfunction readBudgetishError(result: ReadFileResult): boolean {\n return result.isError && (/budget/i.test(result.content) || /max file reads/i.test(result.content));\n}\n\nfunction extendAllSessionLimits(\n input: RunPlannerInput,\n maxIter: { current: number },\n maxOut: { current: number },\n baseMaxIter: number,\n baseMaxOut: number,\n): void {\n input.budget.extendSession();\n maxIter.current += baseMaxIter;\n maxOut.current += baseMaxOut;\n}\n\nfunction recordUsageAndEmit(\n bus: PlannerEventBus,\n input: RunPlannerInput,\n runId: string,\n turn: number,\n usage: Usage,\n): void {\n input.budget.recordUsage(usage);\n input.onUsage?.(usage);\n bus.emit({ kind: 'usage', runId, turn, usage });\n const u = input.budget.snapshot().usage;\n const cacheRead = u.cacheReadTokens ?? 0;\n const cacheCreate = u.cacheCreationTokens ?? 0;\n if (cacheRead > 0 || cacheCreate > 0) {\n const inTok = u.inputTokens;\n const totalInput = inTok + cacheRead;\n const cacheHitRatio = totalInput === 0 ? 0 : Math.round((cacheRead / totalInput) * 100) / 100;\n bus.emit({\n kind: 'cache_summary',\n runId,\n turn,\n cacheHitRatio,\n cacheReadTokens: cacheRead,\n cacheCreationTokens: cacheCreate,\n });\n }\n}\n\nfunction cancelledOutput(\n input: RunPlannerInput,\n bus: PlannerEventBus,\n runId: string,\n accumulatedText: string,\n budgetExhausted: boolean,\n iterations: number,\n runStartedAt: number,\n): RunPlannerOutput {\n bus.emit({ kind: 'cancelled', runId });\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n userCancelled: true,\n };\n}\n\nexport async function runPlanner(input: RunPlannerInput): Promise<RunPlannerOutput> {\n const runStartedAt = Date.now();\n const bus = input.events ?? new PlannerEventBus();\n const runId = input.runId ?? newRunId();\n const cacheEnabled = input.cacheEnabled ?? true;\n bus.emit({\n kind: 'started',\n runId,\n provider: input.provider.name,\n model: input.model,\n cacheEnabled,\n });\n\n const baseMaxIter = input.maxIterations ?? DEFAULT_PLANNER_MAX_ITERATIONS;\n const maxIter = { current: baseMaxIter };\n const baseMaxOut = input.maxOutputTokens ?? DEFAULT_PLANNER_MAX_OUTPUT_TOKENS;\n const maxOut = { current: baseMaxOut };\n const turns: ChatTurn[] = [{ role: 'user', text: input.userPrompt }];\n let accumulatedText = '';\n let iterations = 0;\n let budgetExhausted = false;\n let finishedNormally = false;\n let prevRequestPrefix: string | undefined;\n const decide = input.decideOnLimit;\n const sleepFn = input.sleep ?? defaultSleep;\n\n const limitCtx = (kind: PlannerSessionLimitContext['kind']): PlannerSessionLimitContext => ({\n kind,\n budgetSnapshot: input.budget.snapshot(),\n iterations,\n maxIterations: maxIter.current,\n maxOutputTokens: maxOut.current,\n });\n\n for (;;) {\n if (input.abort?.aborted) {\n return cancelledOutput(input, bus, runId, accumulatedText, budgetExhausted, iterations, runStartedAt);\n }\n\n if (iterations >= maxIter.current) {\n if (decide) {\n const d = await decide(limitCtx('max_iterations'));\n if (d === 'cancel') {\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n incompleteKind: 'max_iterations',\n userCancelled: true,\n };\n }\n extendAllSessionLimits(input, maxIter, maxOut, baseMaxIter, baseMaxOut);\n continue;\n }\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n incompleteKind: 'max_iterations',\n };\n }\n\n iterations += 1;\n\n if (input.budget.timedOut()) {\n if (decide) {\n const d = await decide(limitCtx('wall_clock'));\n if (d === 'cancel') {\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: true,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n incompleteKind: 'wall_clock',\n userCancelled: true,\n };\n }\n extendAllSessionLimits(input, maxIter, maxOut, baseMaxIter, baseMaxOut);\n iterations -= 1;\n continue;\n }\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: true,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n };\n }\n if (input.budget.overCost()) {\n if (decide) {\n const d = await decide(limitCtx('cost_cap'));\n if (d === 'cancel') {\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n incompleteKind: 'cost_cap',\n userCancelled: true,\n };\n }\n extendAllSessionLimits(input, maxIter, maxOut, baseMaxIter, baseMaxOut);\n iterations -= 1;\n continue;\n }\n return {\n planText: accumulatedText,\n budgetExhausted: true,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n };\n }\n\n if (iterations >= 2) {\n bus.emit({ kind: 'turn_started', runId, turn: iterations });\n }\n\n const request: ProviderRequest = {\n systemPrompt: input.systemPrompt,\n model: input.model,\n tools: [READ_FILE_TOOL],\n turns,\n apiKey: input.apiKey,\n maxOutputTokens: maxOut.current,\n cacheEnabled,\n abort: input.abort,\n };\n\n bus.emit({ kind: 'request_sent', runId, turn: iterations });\n\n if (\n process.env.NODE_ENV !== 'production' &&\n process.env.NODE_ENV !== 'test' &&\n prevRequestPrefix !== undefined\n ) {\n const currentPrefix = prefixOf(input.provider.name, request);\n if (!currentPrefix.startsWith(prevRequestPrefix)) {\n const byte = firstByteDiff(prevRequestPrefix, currentPrefix);\n ui.warning(\n `planner: prefix mutation at turn ${iterations}, byte ${byte} — caching will not hit.`,\n );\n }\n }\n\n let response: ProviderResponse;\n try {\n response = await input.provider.send(request);\n } catch (e) {\n if (isAbortError(e)) {\n return cancelledOutput(input, bus, runId, accumulatedText, budgetExhausted, iterations, runStartedAt);\n }\n throw e;\n }\n\n if (response.usage) {\n recordUsageAndEmit(bus, input, runId, iterations, response.usage);\n }\n\n let retriedRateLimit = false;\n let retrySkippedReason: 'retry_after_too_long' | undefined;\n if (response.stopReason === 'error' && response.errorKind === 'rate_limit') {\n const asked = response.retryAfterSec;\n if (asked !== undefined && asked > MAX_RATE_LIMIT_RETRY_SEC) {\n retrySkippedReason = 'retry_after_too_long';\n } else {\n const waitSec = Math.min(asked ?? 10, MAX_RATE_LIMIT_RETRY_SEC);\n input.onRateLimit?.(waitSec);\n bus.emit({ kind: 'rate_limit', runId, turn: iterations, waitSec });\n try {\n await sleepWithAbort(waitSec * 1000, sleepFn, input.abort);\n } catch (e) {\n if (isAbortError(e)) {\n return cancelledOutput(input, bus, runId, accumulatedText, budgetExhausted, iterations, runStartedAt);\n }\n throw e;\n }\n try {\n response = await input.provider.send(request);\n } catch (e) {\n if (isAbortError(e)) {\n return cancelledOutput(input, bus, runId, accumulatedText, budgetExhausted, iterations, runStartedAt);\n }\n throw e;\n }\n if (response.usage) {\n recordUsageAndEmit(bus, input, runId, iterations, response.usage);\n }\n retriedRateLimit = true;\n }\n }\n\n if (response.stopReason === 'error') {\n throw composePlannerError(input.provider.name, response, retriedRateLimit, retrySkippedReason);\n }\n\n prevRequestPrefix = prefixOf(input.provider.name, request);\n\n if (response.text) {\n accumulatedText += response.text;\n input.onAssistantText?.(response.text);\n bus.emit({ kind: 'assistant_text', runId, turn: iterations, delta: response.text });\n }\n\n if (response.stopReason === 'max_tokens' && !response.toolCalls?.length) {\n bus.emit({ kind: 'turn_complete', runId, turn: iterations, stopReason: response.stopReason });\n if (decide) {\n const d = await decide(limitCtx('max_output_tokens'));\n if (d === 'cancel') {\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n incompleteKind: 'max_output_tokens',\n userCancelled: true,\n };\n }\n extendAllSessionLimits(input, maxIter, maxOut, baseMaxIter, baseMaxOut);\n turns.push({ role: 'assistant', text: response.text ?? '' });\n turns.push({ role: 'user', text: PLANNER_MARKDOWN_CONTINUATION_USER });\n iterations -= 1;\n continue;\n }\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n incompleteKind: 'max_output_tokens',\n };\n }\n\n if (response.stopReason === 'end_turn' || !response.toolCalls?.length) {\n bus.emit({ kind: 'turn_complete', runId, turn: iterations, stopReason: response.stopReason });\n finishedNormally = true;\n return {\n planText: accumulatedText,\n budgetExhausted,\n timedOut: false,\n finishedNormally,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n };\n }\n\n turns.push({\n role: 'assistant',\n text: response.text,\n toolCalls: response.toolCalls,\n });\n\n const toolResults: ToolResult[] = [];\n const toolCalls = response.toolCalls;\n for (let i = 0; i < toolCalls.length; i += 1) {\n const tc = toolCalls[i]!;\n if (tc.name !== READ_FILE_TOOL.name) {\n toolResults.push({ toolCallId: tc.id, content: `unknown tool \"${tc.name}\"`, isError: true });\n continue;\n }\n const before = input.budget.snapshot().bytes;\n let result = readFileTool(input.root, input.budget, tc.input);\n const after = input.budget.snapshot().bytes;\n const bytesLoaded = after - before;\n input.onToolCall?.(tc, bytesLoaded, after);\n bus.emit({\n kind: 'tool_call',\n runId,\n turn: iterations,\n toolCall: tc,\n bytesLoaded,\n totalBytes: after,\n });\n if (readBudgetishError(result)) {\n if (decide) {\n const d = await decide(limitCtx('file_or_context_reads'));\n if (d === 'cancel') {\n toolResults.push({ toolCallId: tc.id, content: result.content, isError: true });\n for (let j = i + 1; j < toolCalls.length; j += 1) {\n const t2 = toolCalls[j]!;\n toolResults.push({\n toolCallId: t2.id,\n content:\n t2.name === READ_FILE_TOOL.name\n ? 'read_file: not executed (planning session stopped after file/context budget).'\n : `unknown tool \"${t2.name}\"`,\n isError: true,\n });\n }\n turns.push({ role: 'user', toolResults });\n return {\n planText: accumulatedText,\n budgetExhausted: false,\n timedOut: false,\n finishedNormally: false,\n iterations,\n stats: buildPlannerRunStats(input.budget, iterations, runStartedAt),\n incompleteKind: 'budget_reads',\n userCancelled: true,\n };\n }\n extendAllSessionLimits(input, maxIter, maxOut, baseMaxIter, baseMaxOut);\n result = readFileTool(input.root, input.budget, tc.input);\n } else {\n budgetExhausted = true;\n }\n }\n toolResults.push({ toolCallId: tc.id, content: result.content, isError: result.isError });\n }\n\n turns.push({ role: 'user', toolResults });\n\n if (budgetExhausted) {\n turns.push({\n role: 'user',\n text:\n 'Budget is exhausted. Finalise the plan with the information you already have. ' +\n 'Do not call any more tools. Output the complete plan markdown now.',\n });\n }\n\n bus.emit({ kind: 'turn_complete', runId, turn: iterations, stopReason: response.stopReason });\n }\n}\n\nexport function relativisePath(root: string, p: string): string {\n return path.relative(root, p) || p;\n}\n\nfunction firstByteDiff(a: string, b: string): number {\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i += 1) {\n if (a.charCodeAt(i) !== b.charCodeAt(i)) return i;\n }\n return n;\n}\n\nfunction composePlannerError(\n providerName: PlannerProvider['name'],\n response: ProviderResponse,\n retriedRateLimit: boolean,\n retrySkippedReason?: 'retry_after_too_long',\n): Error {\n if (response.errorKind === 'rate_limit') {\n return new Error(\n rateLimitMessage({\n provider: providerName,\n retryAfterSec: response.retryAfterSec,\n rawBody: response.rawError ?? '',\n retryAlreadyAttempted: retriedRateLimit,\n retrySkippedReason,\n maxRetrySec: MAX_RATE_LIMIT_RETRY_SEC,\n }),\n );\n }\n if (response.errorKind === 'model_not_found') {\n return new Error(response.rawError ?? 'planner: model not found');\n }\n const base = response.rawError ?? 'planner: provider error';\n return new Error(`${base} Run \\`squad doctor\\` to diagnose, or retry \\u2014 most 5xx errors are transient.`);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { Budget } from './budget.js';\nimport type { ToolSchema } from './types.js';\n\nexport const READ_FILE_TOOL: ToolSchema = {\n name: 'read_file',\n description:\n 'Read a UTF-8 text file from the project, returning its contents so you can plan against real code. ' +\n 'Paths must be relative to the project root. Binary files and files outside the project are refused. ' +\n 'You have a bounded context budget; prefer small, targeted reads.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['path'],\n properties: {\n path: { type: 'string', description: 'Repo-relative POSIX path.' },\n },\n },\n};\n\nexport interface ReadFileResult {\n content: string;\n isError: boolean;\n}\n\nconst MAX_BYTES_PER_READ = 32_000;\n\nexport function readFileTool(root: string, budget: Budget, input: unknown): ReadFileResult {\n const raw = (input as { path?: unknown })?.path;\n if (typeof raw !== 'string' || raw.length === 0) {\n return error('read_file: missing or invalid \"path\" argument.');\n }\n\n const resolved = path.resolve(root, raw);\n const relCheck = path.relative(root, resolved);\n if (relCheck.startsWith('..') || path.isAbsolute(relCheck)) {\n return error(`read_file: path \"${raw}\" escapes the project root and was refused.`);\n }\n if (!fs.existsSync(resolved)) {\n return error(`read_file: not found \"${raw}\".`);\n }\n const stat = fs.statSync(resolved);\n if (stat.isDirectory()) {\n return error(`read_file: \"${raw}\" is a directory. Ask for a specific file path.`);\n }\n if (stat.size > MAX_BYTES_PER_READ) {\n return error(\n `read_file: \"${raw}\" is ${stat.size} bytes (> ${MAX_BYTES_PER_READ}). Ask for a smaller file or a specific range.`,\n );\n }\n\n const capacity = budget.canRead(stat.size);\n if (!capacity.ok) {\n return error(`read_file: ${capacity.reason}. Finalise the plan with what you already have.`);\n }\n\n let buf: Buffer;\n try {\n buf = fs.readFileSync(resolved);\n } catch (e) {\n return error(`read_file: failed to read \"${raw}\" (${(e as Error).message}).`);\n }\n\n if (looksBinary(buf)) {\n return error(`read_file: \"${raw}\" looks binary and was refused.`);\n }\n\n budget.recordRead(stat.size);\n return { content: buf.toString('utf8'), isError: false };\n}\n\nfunction error(msg: string): ReadFileResult {\n return { content: msg, isError: true };\n}\n\nfunction looksBinary(buf: Buffer): boolean {\n const sample = buf.subarray(0, Math.min(buf.length, 8000));\n for (const b of sample) {\n if (b === 0) return true;\n }\n return false;\n}\n","import type { ProviderName } from './types.js';\n\nexport interface ModelNotFoundError {\n provider: ProviderName;\n model: string;\n status: number;\n rawBody: string;\n}\n\n/**\n * Detect the \"model not found\" shape across providers. Returns a `ModelNotFoundError` when\n * the response matches, or `undefined` otherwise.\n *\n * Shapes detected:\n * Anthropic: 404 with body.error.type === 'not_found_error' OR body text containing \"model:\"\n * OpenAI: 404 with body.error.code === 'model_not_found'\n * Google: 404 with body.error.status === 'NOT_FOUND' containing the model name\n */\nexport function detectModelNotFound(\n provider: ProviderName,\n model: string,\n status: number,\n rawBody: string,\n): ModelNotFoundError | undefined {\n if (status !== 404) return undefined;\n const body = rawBody.toLowerCase();\n const hints = ['not_found_error', 'model_not_found', 'not_found', 'model:'];\n if (!hints.some((h) => body.includes(h))) return undefined;\n return { provider, model, status, rawBody };\n}\n\n/**\n * Build the user-facing message. Kept as a separate function so callers can choose whether\n * to embed it in a thrown Error (from the provider adapter) or render via ui.failure.\n */\nexport function modelNotFoundMessage(err: ModelNotFoundError): string {\n return [\n `The ${err.provider} planner model \"${err.model}\" is no longer available.`,\n '',\n 'Recovery options:',\n ` 1. Run \\`squad upgrade\\` to install a newer squad-kit (or install manually from npm).`,\n ` 2. Run \\`squad config set planner --provider openai\\` (or another \\`--provider\\`) to switch models via a different provider, then save a key when prompted.`,\n ` 3. Run \\`squad config set planner\\` to set \\`planner.modelOverride.${err.provider}\\` to a still-valid id (no raw YAML), then \\`squad doctor\\` to confirm.`,\n '',\n `Raw provider response: ${err.rawBody.slice(0, 200)}`,\n ].join('\\n');\n}\n\n/** Headers look-up that accepts both fetch `Headers` and plain records. */\nexport type HeadersLike = Headers | Record<string, string | null | undefined>;\n\nexport interface RateLimitError {\n provider: ProviderName;\n status: 429;\n /** Seconds until the provider expects us to retry, if it told us. */\n retryAfterSec?: number;\n rawBody: string;\n}\n\n/**\n * Detect a 429 rate-limit response. Returns a `RateLimitError` when the status is 429,\n * populating `retryAfterSec` from the `Retry-After` header (seconds or HTTP-date) or from\n * Google's body-level `retryDelay: \"30s\"` field. Returns `undefined` for any other status.\n */\nexport function detectRateLimit(\n provider: ProviderName,\n status: number,\n headers: HeadersLike,\n rawBody: string,\n): RateLimitError | undefined {\n if (status !== 429) return undefined;\n return {\n provider,\n status: 429,\n retryAfterSec: parseRetryAfter(headers, rawBody),\n rawBody,\n };\n}\n\nfunction parseRetryAfter(headers: HeadersLike, body: string): number | undefined {\n const raw = headerGet(headers, 'retry-after');\n if (raw) {\n const sec = Number(raw);\n if (Number.isFinite(sec) && sec >= 0) return Math.ceil(sec);\n const asDate = Date.parse(raw);\n if (Number.isFinite(asDate)) {\n return Math.max(0, Math.ceil((asDate - Date.now()) / 1000));\n }\n }\n const bodyMatch = /\"retryDelay\"\\s*:\\s*\"(\\d+)(?:\\.\\d+)?s\"/i.exec(body);\n if (bodyMatch) {\n const sec = Number(bodyMatch[1]);\n if (Number.isFinite(sec) && sec >= 0) return sec;\n }\n return undefined;\n}\n\nfunction headerGet(h: HeadersLike, name: string): string | null {\n if (typeof (h as Headers).get === 'function') {\n return (h as Headers).get(name);\n }\n const key = name.toLowerCase();\n const rec = h as Record<string, string | null | undefined>;\n for (const k of Object.keys(rec)) {\n if (k.toLowerCase() === key) return rec[k] ?? null;\n }\n return null;\n}\n\nexport interface RateLimitMessageInput {\n provider: ProviderName;\n retryAfterSec?: number;\n rawBody: string;\n /** True when squad-kit already retried once and got rate-limited again. */\n retryAlreadyAttempted?: boolean;\n /**\n * Set when the loop deliberately did not retry. Currently only one reason:\n * the provider asked for longer than our retry cap.\n */\n retrySkippedReason?: 'retry_after_too_long';\n /** The retry cap in seconds, used in the skipped-retry sentence. */\n maxRetrySec?: number;\n}\n\n/**\n * User-facing rate-limit message. Composed by the loop when rate-limit retry has been\n * exhausted. Callers in the provider adapters set `errorKind: 'rate_limit'` and let the\n * loop compose this message so the \"already retried\" sentence reflects reality.\n */\nexport function rateLimitMessage(err: RateLimitMessageInput): string {\n const waitHint = err.retryAfterSec ?? 60;\n const limitsUrl: Record<ProviderName, string> = {\n anthropic: 'https://console.anthropic.com/settings/limits',\n openai: 'https://platform.openai.com/settings/organization/limits',\n google: 'https://aistudio.google.com/app/plan_information',\n };\n const headline = err.retryAfterSec\n ? `${err.provider} rate limit hit \\u2014 provider asked us to wait ${err.retryAfterSec}s before retrying.`\n : `${err.provider} rate limit hit.`;\n const cap = err.maxRetrySec ?? 90;\n const retried = err.retrySkippedReason === 'retry_after_too_long'\n ? `squad-kit did not auto-retry: the provider's ${err.retryAfterSec}s wait is longer than our ${cap}s cap, so retrying would just burn another request inside the same throttle window.`\n : err.retryAlreadyAttempted\n ? 'squad-kit already retried once automatically and was throttled again \\u2014 your org is firmly over its per-minute quota.'\n : 'squad-kit aborted before retrying.';\n return [\n headline,\n retried,\n '',\n 'Recovery options:',\n ` 1. Wait ${waitHint}s and rerun \\`squad new-plan --api\\`. Per-minute limits reset quickly.`,\n ` 2. Switch to a smaller planner model: \\`squad config set planner\\` (pick a cheaper model id).`,\n ` 3. Tighten \\`planner.budget\\` in \\`.squad/config.yaml\\` (smaller \\`maxContextBytes\\` / \\`maxFileReads\\`) so each request carries fewer tokens.`,\n ` 4. Upgrade your ${err.provider} tier: ${limitsUrl[err.provider]}.`,\n '',\n 'Full runbook: docs/migrating-from-0.1.md (see \\u00a78. If something goes wrong).',\n '',\n `Raw provider response: ${err.rawBody.slice(0, 200)}`,\n ].join('\\n');\n}\n","/**\n * Recursively sort object keys for deterministic JSON.stringify of nested records.\n * Arrays are preserved; only plain objects (not null, not array) are sorted.\n */\nexport function sortRecordKeys<T>(v: T): T {\n if (v === null || typeof v !== 'object') return v;\n if (Array.isArray(v)) return v.map((x) => sortRecordKeys(x)) as T;\n const o = v as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(o).sort()) {\n out[k] = sortRecordKeys(o[k]);\n }\n return out as T;\n}\n","import type {\n ChatTurn,\n PlannerProvider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n ToolSchema,\n} from '../types.js';\nimport { sortRecordKeys } from '../stable-json.js';\nimport {\n detectModelNotFound,\n detectRateLimit,\n modelNotFoundMessage,\n} from '../provider-errors.js';\n\nconst API_URL = 'https://api.anthropic.com/v1/messages';\nconst API_VERSION = '2023-06-01';\n\ntype AnthropicSystemTextBlock = {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n};\n\ntype AnthropicContentBlock = Record<string, unknown>;\n\ntype AnthropicMessageWire = {\n role: 'assistant' | 'user';\n content: AnthropicContentBlock[];\n};\n\n/**\n * Request JSON sent to the Anthropic messages API. When `turns` is empty, `messages` is\n * omitted so cache-prefix comparisons treat the static header as a literal string prefix\n * of longer requests; `callAnthropic` re-adds `messages: []` for the wire.\n */\nexport type AnthropicRequestBody = {\n model: string;\n max_tokens: number;\n system: string | AnthropicSystemTextBlock[];\n tools: ReturnType<typeof toAnthropicTool>[];\n messages?: AnthropicMessageWire[];\n};\n\nexport const anthropicProvider: PlannerProvider = {\n name: 'anthropic',\n async send(req) {\n return callAnthropic(req);\n },\n};\n\nexport function buildAnthropicBody(req: ProviderRequest): AnthropicRequestBody {\n if (req.cacheEnabled === false) {\n const base: AnthropicRequestBody = {\n model: req.model,\n max_tokens: req.maxOutputTokens ?? 4096,\n system: req.systemPrompt,\n tools: req.tools.map(toAnthropicTool),\n };\n if (req.turns.length === 0) {\n return base;\n }\n return { ...base, messages: req.turns.map((t) => toAnthropicMessage(t)) };\n }\n\n const base: AnthropicRequestBody = {\n model: req.model,\n max_tokens: req.maxOutputTokens ?? 4096,\n system: [\n {\n type: 'text',\n text: req.systemPrompt,\n cache_control: { type: 'ephemeral' },\n },\n ],\n tools: req.tools.map(toAnthropicTool),\n };\n if (req.turns.length === 0) {\n return base;\n }\n return { ...base, messages: toMessagesWithCacheMarkers(req.turns) };\n}\n\nexport async function callAnthropic(req: ProviderRequest): Promise<ProviderResponse> {\n const built = buildAnthropicBody(req);\n const body: AnthropicRequestBody = { ...built, messages: built.messages ?? [] };\n\n const res = await fetch(API_URL, {\n method: 'POST',\n headers: {\n 'x-api-key': req.apiKey,\n 'anthropic-version': API_VERSION,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(body),\n signal: req.abort,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n const nf = detectModelNotFound('anthropic', req.model, res.status, text);\n if (nf) {\n return {\n stopReason: 'error',\n rawError: modelNotFoundMessage(nf),\n errorKind: 'model_not_found',\n };\n }\n const rl = detectRateLimit('anthropic', res.status, res.headers, text);\n if (rl) {\n return {\n stopReason: 'error',\n rawError: `anthropic 429: ${text.slice(0, 500)}`,\n errorKind: 'rate_limit',\n retryAfterSec: rl.retryAfterSec,\n };\n }\n return { stopReason: 'error', rawError: `anthropic ${res.status}: ${text.slice(0, 500)}` };\n }\n\n const json = (await res.json()) as AnthropicResponse;\n const textOut = json.content\n .filter((b) => b.type === 'text')\n .map((b) => b.text)\n .join('');\n const toolCalls: ToolCall[] = json.content\n .filter((b): b is AnthropicToolUseBlock => b.type === 'tool_use')\n .map((b) => ({ id: b.id, name: b.name, input: b.input }));\n\n return {\n text: textOut || undefined,\n toolCalls: toolCalls.length ? toolCalls : undefined,\n stopReason: mapStop(json.stop_reason),\n usage: {\n inputTokens: json.usage?.input_tokens ?? 0,\n outputTokens: json.usage?.output_tokens ?? 0,\n cacheCreationTokens: json.usage?.cache_creation_input_tokens ?? 0,\n cacheReadTokens: json.usage?.cache_read_input_tokens ?? 0,\n },\n };\n}\n\nfunction toMessagesWithCacheMarkers(turns: ChatTurn[]): AnthropicMessageWire[] {\n let lastUserWithToolResultIdx = -1;\n for (let i = turns.length - 1; i >= 0; i -= 1) {\n const t = turns[i]!;\n if (t.role === 'user' && hasToolResultBlock(t)) {\n lastUserWithToolResultIdx = i;\n break;\n }\n }\n\n return turns.map((turn, idx) => {\n const message = toAnthropicMessage(turn);\n if (idx === lastUserWithToolResultIdx) {\n return attachCacheControlToLastToolResult(message);\n }\n return message;\n });\n}\n\nfunction hasToolResultBlock(turn: ChatTurn): boolean {\n return (turn.toolResults?.length ?? 0) > 0;\n}\n\nfunction attachCacheControlToLastToolResult(msg: AnthropicMessageWire): AnthropicMessageWire {\n const content = [...msg.content];\n for (let i = content.length - 1; i >= 0; i -= 1) {\n const block = content[i] as { type?: string };\n if (block.type === 'tool_result') {\n content[i] = { ...block, cache_control: { type: 'ephemeral' } };\n break;\n }\n }\n return { ...msg, content };\n}\n\nfunction toAnthropicTool(t: ToolSchema) {\n return {\n name: t.name,\n description: t.description,\n input_schema: sortRecordKeys(t.inputSchema) as Record<string, unknown>,\n };\n}\n\nfunction toAnthropicMessage(turn: ChatTurn): AnthropicMessageWire {\n const blocks: AnthropicContentBlock[] = [];\n if (turn.text) blocks.push({ type: 'text', text: turn.text });\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n blocks.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: sortRecordKeys(tc.input) as Record<string, unknown>,\n });\n }\n }\n if (turn.toolResults) {\n for (const tr of turn.toolResults) {\n blocks.push({\n type: 'tool_result',\n tool_use_id: tr.toolCallId,\n content: tr.content,\n is_error: tr.isError ?? false,\n });\n }\n }\n return { role: turn.role === 'assistant' ? 'assistant' : 'user', content: blocks };\n}\n\nfunction mapStop(r: string | undefined): ProviderResponse['stopReason'] {\n if (r === 'tool_use') return 'tool_use';\n if (r === 'max_tokens') return 'max_tokens';\n return 'end_turn';\n}\n\ninterface AnthropicResponse {\n content: Array<AnthropicTextBlock | AnthropicToolUseBlock>;\n stop_reason: string;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\ninterface AnthropicTextBlock {\n type: 'text';\n text: string;\n}\ninterface AnthropicToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n","import type {\n ChatTurn,\n PlannerProvider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n ToolSchema,\n} from '../types.js';\nimport { sortRecordKeys } from '../stable-json.js';\nimport {\n detectModelNotFound,\n detectRateLimit,\n modelNotFoundMessage,\n} from '../provider-errors.js';\n\nconst API_URL = 'https://api.openai.com/v1/chat/completions';\n\n/**\n * When `turns` is empty, `messages` is omitted from the object so prefix helpers can treat\n * the static header as a string prefix; `callOpenAI` injects a single system message for the\n * real POST.\n */\nexport type OpenAIRequestBody = {\n model: string;\n max_completion_tokens: number;\n tools: ReturnType<typeof toOpenAITool>[];\n messages?: unknown[];\n};\n\nexport const openaiProvider: PlannerProvider = {\n name: 'openai',\n async send(req) {\n return callOpenAI(req);\n },\n};\n\nexport function buildOpenAIBody(req: ProviderRequest): OpenAIRequestBody {\n const base: OpenAIRequestBody = {\n model: req.model,\n max_completion_tokens: req.maxOutputTokens ?? 4096,\n tools: req.tools.map(toOpenAITool),\n };\n if (req.turns.length === 0) {\n return base;\n }\n const messages: unknown[] = [{ role: 'system', content: req.systemPrompt }];\n for (const turn of req.turns) messages.push(...toOpenAIMessages(turn));\n return { ...base, messages };\n}\n\nexport async function callOpenAI(req: ProviderRequest): Promise<ProviderResponse> {\n const built = buildOpenAIBody(req);\n const messages: unknown[] =\n built.messages && built.messages.length > 0\n ? (built.messages as unknown[])\n : [{ role: 'system', content: req.systemPrompt }];\n\n const body = { ...built, messages };\n\n const res = await fetch(API_URL, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${req.apiKey}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(body),\n signal: req.abort,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n const nf = detectModelNotFound('openai', req.model, res.status, text);\n if (nf) {\n return {\n stopReason: 'error',\n rawError: modelNotFoundMessage(nf),\n errorKind: 'model_not_found',\n };\n }\n const rl = detectRateLimit('openai', res.status, res.headers, text);\n if (rl) {\n return {\n stopReason: 'error',\n rawError: `openai 429: ${text.slice(0, 500)}`,\n errorKind: 'rate_limit',\n retryAfterSec: rl.retryAfterSec,\n };\n }\n return { stopReason: 'error', rawError: `openai ${res.status}: ${text.slice(0, 500)}` };\n }\n\n const json = (await res.json()) as OpenAIResponse;\n const choice = json.choices?.[0];\n if (!choice) return { stopReason: 'error', rawError: 'openai: empty choices' };\n\n const textOut = choice.message.content ?? '';\n const toolCalls: ToolCall[] = (choice.message.tool_calls ?? []).map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n input: safeJson(tc.function.arguments),\n }));\n\n return {\n text: textOut || undefined,\n toolCalls: toolCalls.length ? toolCalls : undefined,\n stopReason: mapStop(choice.finish_reason),\n usage: {\n inputTokens: json.usage?.prompt_tokens ?? 0,\n outputTokens: json.usage?.completion_tokens ?? 0,\n },\n };\n}\n\nfunction toOpenAITool(t: ToolSchema) {\n return {\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: sortRecordKeys(t.inputSchema) as Record<string, unknown>,\n },\n };\n}\n\nfunction toOpenAIMessages(turn: ChatTurn): unknown[] {\n const out: unknown[] = [];\n if (turn.role === 'assistant') {\n out.push({\n role: 'assistant',\n content: turn.text ?? null,\n tool_calls: turn.toolCalls?.map((tc) => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: JSON.stringify(sortRecordKeys(tc.input) as Record<string, unknown>),\n },\n })),\n });\n } else {\n if (turn.text) out.push({ role: 'user', content: turn.text });\n if (turn.toolResults) {\n for (const tr of turn.toolResults) {\n out.push({ role: 'tool', tool_call_id: tr.toolCallId, content: tr.content });\n }\n }\n }\n return out;\n}\n\nfunction mapStop(r: string | undefined): ProviderResponse['stopReason'] {\n if (r === 'tool_calls') return 'tool_use';\n if (r === 'length') return 'max_tokens';\n return 'end_turn';\n}\n\nfunction safeJson(raw: string): Record<string, unknown> {\n try {\n return sortRecordKeys(JSON.parse(raw) as Record<string, unknown>);\n } catch {\n return {};\n }\n}\n\ninterface OpenAIResponse {\n choices: Array<{\n message: {\n content: string | null;\n tool_calls?: Array<{ id: string; type: 'function'; function: { name: string; arguments: string } }>;\n };\n finish_reason: string;\n }>;\n usage?: { prompt_tokens: number; completion_tokens: number };\n}\n","import type {\n ChatTurn,\n PlannerProvider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n ToolSchema,\n} from '../types.js';\nimport { sortRecordKeys } from '../stable-json.js';\nimport {\n detectModelNotFound,\n detectRateLimit,\n modelNotFoundMessage,\n} from '../provider-errors.js';\n\nconst API_BASE = 'https://generativelanguage.googleapis.com/v1beta/models';\n\n/**\n * `contents` is last (optional) for cache-prefix string prefixing; it is omitted when `turns`\n * is empty. `callGoogle` adds `contents: []` on the wire when missing.\n */\nexport type GoogleRequestBody = {\n system_instruction: { parts: Array<{ text: string }> };\n tools?: Array<{ functionDeclarations: ReturnType<typeof toGoogleTool>[] }>;\n generationConfig: { maxOutputTokens: number };\n contents?: ReturnType<typeof toGoogleContent>[];\n};\n\nexport const googleProvider: PlannerProvider = {\n name: 'google',\n async send(req) {\n return callGoogle(req);\n },\n};\n\nexport function buildGoogleBody(req: ProviderRequest): GoogleRequestBody {\n const base: GoogleRequestBody = {\n system_instruction: { parts: [{ text: req.systemPrompt }] },\n generationConfig: { maxOutputTokens: req.maxOutputTokens ?? 4096 },\n };\n if (req.tools.length) {\n base.tools = [{ functionDeclarations: req.tools.map(toGoogleTool) }];\n }\n if (req.turns.length === 0) {\n return base;\n }\n return { ...base, contents: req.turns.map(toGoogleContent) };\n}\n\nexport async function callGoogle(req: ProviderRequest): Promise<ProviderResponse> {\n const url = `${API_BASE}/${encodeURIComponent(req.model)}:generateContent?key=${encodeURIComponent(req.apiKey)}`;\n\n const built = buildGoogleBody(req);\n const body: GoogleRequestBody = { ...built, contents: built.contents ?? [] };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n signal: req.abort,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n const nf = detectModelNotFound('google', req.model, res.status, text);\n if (nf) {\n return {\n stopReason: 'error',\n rawError: modelNotFoundMessage(nf),\n errorKind: 'model_not_found',\n };\n }\n const rl = detectRateLimit('google', res.status, res.headers, text);\n if (rl) {\n return {\n stopReason: 'error',\n rawError: `google 429: ${text.slice(0, 500)}`,\n errorKind: 'rate_limit',\n retryAfterSec: rl.retryAfterSec,\n };\n }\n return { stopReason: 'error', rawError: `google ${res.status}: ${text.slice(0, 500)}` };\n }\n\n const json = (await res.json()) as GoogleResponse;\n const cand = json.candidates?.[0];\n if (!cand) return { stopReason: 'error', rawError: 'google: empty candidates' };\n\n const parts = cand.content?.parts ?? [];\n const textOut = parts\n .filter((p): p is GoogleTextPart => 'text' in p && !!p.text)\n .map((p) => p.text)\n .join('');\n const toolCalls: ToolCall[] = parts\n .filter((p): p is GoogleFunctionCallPart => 'functionCall' in p && !!p.functionCall)\n .map((p, i) => ({\n id: `gcall_${i}_${p.functionCall.name}`,\n name: p.functionCall.name,\n input: p.functionCall.args ? (sortRecordKeys(p.functionCall.args) as Record<string, unknown>) : {},\n }));\n\n return {\n text: textOut || undefined,\n toolCalls: toolCalls.length ? toolCalls : undefined,\n stopReason: mapStop(cand.finishReason),\n usage: {\n inputTokens: json.usageMetadata?.promptTokenCount ?? 0,\n outputTokens: json.usageMetadata?.candidatesTokenCount ?? 0,\n },\n };\n}\n\nfunction toGoogleTool(t: ToolSchema) {\n return { name: t.name, description: t.description, parameters: sortRecordKeys(t.inputSchema) as Record<string, unknown> };\n}\n\nfunction toGoogleContent(turn: ChatTurn) {\n const role = turn.role === 'assistant' ? 'model' : 'user';\n const parts: unknown[] = [];\n if (turn.text) parts.push({ text: turn.text });\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n parts.push({ functionCall: { name: tc.name, args: sortRecordKeys(tc.input) as Record<string, unknown> } });\n }\n }\n if (turn.toolResults) {\n for (const tr of turn.toolResults) {\n parts.push({\n functionResponse: { name: nameFromToolCallId(tr.toolCallId), response: { content: tr.content } },\n });\n }\n }\n return { role, parts };\n}\n\nfunction nameFromToolCallId(id: string): string {\n const m = id.match(/^gcall_\\d+_(.+)$/);\n return m?.[1] ?? 'read_file';\n}\n\nfunction mapStop(r: string | undefined): ProviderResponse['stopReason'] {\n if (r === 'STOP' || r === 'END_OF_TURN' || r === 'FINISH_REASON_STOP') return 'end_turn';\n if (r === 'MAX_TOKENS') return 'max_tokens';\n return 'tool_use';\n}\n\ninterface GoogleResponse {\n candidates?: Array<{\n content?: { parts?: Array<GoogleTextPart | GoogleFunctionCallPart> };\n finishReason?: string;\n }>;\n usageMetadata?: { promptTokenCount: number; candidatesTokenCount: number };\n}\ninterface GoogleTextPart {\n text: string;\n}\ninterface GoogleFunctionCallPart {\n functionCall: { name: string; args?: Record<string, unknown> };\n}\n","import { buildAnthropicBody } from './anthropic.js';\nimport { buildOpenAIBody } from './openai.js';\nimport { buildGoogleBody } from './google.js';\nimport type { ProviderName, ProviderRequest } from '../types.js';\n\n/**\n * Return a string suitable for comparing cacheable request prefixes across turns: the full\n * JSON for the provider body after removing the last chat turn, with the terminal `}` stripped\n * so a shorter request's prefix is a literal substring prefix of a longer one when new fields\n * are appended (e.g. `messages` / `contents`) in deterministic `build*Body` order.\n */\nexport function prefixOf(provider: ProviderName, req: ProviderRequest): string {\n const trimmed: ProviderRequest = { ...req, turns: req.turns.slice(0, -1) };\n const s = (() => {\n switch (provider) {\n case 'anthropic':\n return JSON.stringify(buildAnthropicBody(trimmed));\n case 'openai':\n return JSON.stringify(buildOpenAIBody(trimmed));\n case 'google':\n return JSON.stringify(buildGoogleBody(trimmed));\n }\n })();\n return s.length > 0 ? s.slice(0, -1) : s;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport type { PlannerRunStats } from '../planner/types.js';\nimport type { SquadPaths } from './paths.js';\n\nexport interface RunRecord {\n runId: string;\n provider: string;\n model: string;\n feature: string;\n storyId: string;\n startedAt: string;\n completedAt: string;\n success: boolean;\n partial: boolean;\n planFile: string | null;\n stats: PlannerRunStats;\n cacheEnabled: boolean;\n durationMs: number;\n version: 1;\n}\n\nconst RING_SIZE = 20;\n\nexport function newRunId(): string {\n const ts = Date.now().toString(36).padStart(9, '0');\n const rnd = randomBytes(8).toString('hex');\n return `${ts}-${rnd}`;\n}\n\nexport async function appendRun(paths: SquadPaths, rec: Omit<RunRecord, 'version'>): Promise<void> {\n const dir = path.join(paths.squadDir, 'runs');\n await fs.mkdir(dir, { recursive: true });\n const file = path.join(dir, `${rec.runId}.json`);\n await fs.writeFile(file, JSON.stringify({ ...rec, version: 1 }, null, 2) + '\\n', 'utf8');\n await pruneOldRuns(dir);\n}\n\nasync function pruneOldRuns(dir: string): Promise<void> {\n const entries = (await fs.readdir(dir)).filter((n) => n.endsWith('.json'));\n if (entries.length <= RING_SIZE) return;\n entries.sort();\n const drop = entries.slice(0, entries.length - RING_SIZE);\n await Promise.all(drop.map((n) => fs.rm(path.join(dir, n), { force: true })));\n}\n\nexport async function listRuns(paths: SquadPaths): Promise<RunRecord[]> {\n const dir = path.join(paths.squadDir, 'runs');\n let entries: string[];\n try {\n entries = await fs.readdir(dir);\n } catch {\n return [];\n }\n const files = entries.filter((n) => n.endsWith('.json')).sort().reverse();\n const out: RunRecord[] = [];\n for (const f of files) {\n try {\n const raw = await fs.readFile(path.join(dir, f), 'utf8');\n const parsed = JSON.parse(raw) as RunRecord;\n if (parsed.version === 1) out.push(parsed);\n } catch {\n /* skip malformed */\n }\n }\n return out;\n}\n","import type { Budget } from './budget.js';\n\nexport const DEFAULT_PLANNER_MAX_ITERATIONS = 40;\n\nexport type PlannerSessionLimitKind =\n | 'max_output_tokens'\n | 'max_iterations'\n | 'wall_clock'\n | 'cost_cap'\n | 'file_or_context_reads';\n\nexport type PlannerLimitDecision = 'continue' | 'cancel';\n\nexport interface PlannerSessionLimitContext {\n kind: PlannerSessionLimitKind;\n budgetSnapshot: ReturnType<Budget['snapshot']>;\n iterations: number;\n maxIterations: number;\n maxOutputTokens: number;\n}\n\n/** User message appended after a max_tokens truncation so the model can finish the markdown without repeating prior sections. */\nexport const PLANNER_MARKDOWN_CONTINUATION_USER =\n 'Your previous reply was cut off because it hit the per-response output token limit for this request. ' +\n 'Continue the Markdown plan from the exact cut-off only: write the remainder, do not repeat headings or paragraphs already sent. ' +\n 'When the plan is complete, use end_turn without unnecessary tool calls.';\n","import type { ToolCall, Usage, PlannerRunStats } from './types.js';\n\nexport type PlannerEvent =\n | { kind: 'started'; runId: string; provider: string; model: string; cacheEnabled: boolean }\n | { kind: 'turn_started'; runId: string; turn: number }\n | { kind: 'request_sent'; runId: string; turn: number }\n | { kind: 'usage'; runId: string; turn: number; usage: Usage }\n | {\n kind: 'cache_summary';\n runId: string;\n turn: number;\n cacheHitRatio: number;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n }\n | { kind: 'tool_call'; runId: string; turn: number; toolCall: ToolCall; bytesLoaded: number; totalBytes: number }\n | { kind: 'assistant_text'; runId: string; turn: number; delta: string }\n | { kind: 'rate_limit'; runId: string; turn: number; waitSec: number }\n | { kind: 'turn_complete'; runId: string; turn: number; stopReason: string }\n | {\n kind: 'done';\n runId: string;\n success: boolean;\n planFile: string | null;\n partial: boolean;\n stats: PlannerRunStats;\n durationMs: number;\n }\n | { kind: 'error'; runId: string; message: string }\n | { kind: 'cancelled'; runId: string };\n\nexport type PlannerEventListener = (e: PlannerEvent) => void;\n\nexport class PlannerEventBus {\n private listeners = new Set<PlannerEventListener>();\n emit(e: PlannerEvent): void {\n for (const fn of this.listeners) {\n try {\n fn(e);\n } catch {\n /* listener errors must not break the loop */\n }\n }\n }\n subscribe(fn: PlannerEventListener): () => void {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n","import * as ui from '../ui/index.js';\nimport type { PlannerSessionLimitContext } from './session-limits.js';\n\nexport function printPlannerApiCostNotice(): void {\n ui.blank();\n ui.step('Billing');\n ui.info(\n '`squad new-plan --api` sends your intake and repo context to the configured provider. ' +\n 'Each model round is billed like any other API usage (input tokens, output tokens, and cache-related tokens when applicable). ' +\n 'Choosing “Continue” after a limit runs more rounds and usually increases cost.',\n );\n ui.blank();\n}\n\nfunction kindTitle(kind: PlannerSessionLimitContext['kind']): string {\n switch (kind) {\n case 'max_output_tokens':\n return 'Output length limit (single response)';\n case 'max_iterations':\n return 'Model round limit';\n case 'wall_clock':\n return 'Wall-clock time limit';\n case 'cost_cap':\n return 'Estimated cost cap';\n case 'file_or_context_reads':\n return 'File read or context size limit';\n }\n}\n\nfunction kindDetail(ctx: PlannerSessionLimitContext): string[] {\n const snap = ctx.budgetSnapshot;\n const cost =\n snap.usage.costUsd !== undefined\n ? `Estimated spend so far: about $${snap.usage.costUsd.toFixed(2)} (provider-reported when available).`\n : 'Estimated spend so far: not reported by the provider for this run.';\n\n switch (ctx.kind) {\n case 'max_output_tokens':\n return [\n `The model hit the per-request output cap (${ctx.maxOutputTokens} completion tokens). Long plans can stop mid-markdown even though the session is otherwise healthy.`,\n 'You can continue: squad-kit will ask the model to append the rest of the plan in a follow-up request (extra tokens apply).',\n cost,\n ];\n case 'max_iterations':\n return [\n `The planner reached its round cap (${ctx.maxIterations} model turns) without a clean stop.`,\n 'Continuing raises the round cap and file/time budgets for this run by another full slice from your config.',\n cost,\n ];\n case 'wall_clock':\n return [\n 'The configured wall-clock budget for this planning session elapsed before the model finished.',\n 'Continuing adds another slice of time (and read/output/round limits) from your planner budget.',\n cost,\n ];\n case 'cost_cap':\n return [\n 'Spending crossed the optional `planner.budget.maxCostUsd` ceiling for this session.',\n 'Continuing raises that ceiling for this run by another slice from config (if a cap is set).',\n cost,\n ];\n case 'file_or_context_reads':\n return [\n 'A `read_file` call could not run because the file-read count or total read-bytes budget was exhausted.',\n 'Continuing extends read, context, time, round, and output limits for this session so the model can read again or finish without reads.',\n cost,\n ];\n }\n}\n\nexport function printPlannerLimitExplanation(ctx: PlannerSessionLimitContext): void {\n ui.warning(kindTitle(ctx.kind));\n for (const line of kindDetail(ctx)) {\n ui.info(line);\n }\n ui.kv('session so far', `${snapSummary(ctx)}`, 18);\n}\n\nfunction snapSummary(ctx: PlannerSessionLimitContext): string {\n const s = ctx.budgetSnapshot;\n return `${s.reads} reads · ${(s.bytes / 1024).toFixed(1)} KB read context · ${s.usage.inputTokens} in / ${s.usage.outputTokens} out tokens`;\n}\n\nexport function printPlannerLimitNextSteps(): void {\n ui.blank();\n ui.step('If you stop here');\n ui.info('An incomplete plan is saved as `*.partial.md` with front matter `squad-kit-plan-status: partial`.');\n ui.info('Fix limits in `.squad/config.yaml` (`planner.budget`, `planner.maxOutputTokens`) or run again when ready.');\n ui.blank();\n}\n","import type { PlannerProvider, ProviderName } from '../types.js';\nimport { anthropicProvider } from './anthropic.js';\nimport { openaiProvider } from './openai.js';\nimport { googleProvider } from './google.js';\n\nexport function providerFor(name: ProviderName): PlannerProvider {\n switch (name) {\n case 'anthropic':\n return anthropicProvider;\n case 'openai':\n return openaiProvider;\n case 'google':\n return googleProvider;\n }\n}\n\nexport { anthropicProvider, openaiProvider, googleProvider };\n","import type { BudgetConfig, Usage } from './types.js';\n\nexport class Budget {\n private reads = 0;\n private bytes = 0;\n private readonly startedAt = Date.now();\n private totalUsage: Usage = { inputTokens: 0, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0 };\n\n private maxFileReadsAllowed: number;\n private maxContextBytesAllowed: number;\n private maxWallSeconds: number;\n private maxCostUsdCeiling?: number;\n\n constructor(public readonly cfg: BudgetConfig) {\n this.maxFileReadsAllowed = cfg.maxFileReads;\n this.maxContextBytesAllowed = cfg.maxContextBytes;\n this.maxWallSeconds = cfg.maxDurationSeconds;\n this.maxCostUsdCeiling = cfg.maxCostUsd;\n }\n\n /** Add another slice of the original config limits (used when the user chooses to continue a planner session). */\n extendSession(): void {\n this.maxFileReadsAllowed += this.cfg.maxFileReads;\n this.maxContextBytesAllowed += this.cfg.maxContextBytes;\n this.maxWallSeconds += this.cfg.maxDurationSeconds;\n if (this.cfg.maxCostUsd !== undefined) {\n this.maxCostUsdCeiling = (this.maxCostUsdCeiling ?? 0) + this.cfg.maxCostUsd;\n }\n }\n\n canRead(nextFileBytes: number): { ok: boolean; reason?: string } {\n if (this.reads >= this.maxFileReadsAllowed) {\n return { ok: false, reason: `max file reads (${this.maxFileReadsAllowed}) reached` };\n }\n if (this.bytes + nextFileBytes > this.maxContextBytesAllowed) {\n return { ok: false, reason: `context budget (${this.maxContextBytesAllowed} bytes) would be exceeded` };\n }\n return { ok: true };\n }\n\n recordRead(bytes: number): void {\n this.reads += 1;\n this.bytes += bytes;\n }\n\n recordUsage(u: Usage): void {\n this.totalUsage.inputTokens += u.inputTokens;\n this.totalUsage.outputTokens += u.outputTokens;\n if (u.costUsd !== undefined) this.totalUsage.costUsd = (this.totalUsage.costUsd ?? 0) + u.costUsd;\n this.totalUsage.cacheCreationTokens = (this.totalUsage.cacheCreationTokens ?? 0) + (u.cacheCreationTokens ?? 0);\n this.totalUsage.cacheReadTokens = (this.totalUsage.cacheReadTokens ?? 0) + (u.cacheReadTokens ?? 0);\n }\n\n timedOut(): boolean {\n return (Date.now() - this.startedAt) / 1000 > this.maxWallSeconds;\n }\n\n overCost(): boolean {\n if (this.maxCostUsdCeiling === undefined) return false;\n return (this.totalUsage.costUsd ?? 0) > this.maxCostUsdCeiling;\n }\n\n snapshot() {\n return {\n reads: this.reads,\n bytes: this.bytes,\n elapsedMs: Date.now() - this.startedAt,\n usage: { ...this.totalUsage },\n };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport ignore, { type Ignore } from 'ignore';\n\nexport interface RepoMapOptions {\n maxEntries?: number; // safety cap on total paths returned\n includeHidden?: boolean;\n}\n\nconst DEFAULT_IGNORES = [\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'coverage',\n '.next',\n '.turbo',\n '.cache',\n '.squad/plans', // don't include existing plans as context; planner will see them separately\n];\n\nexport function buildRepoMap(root: string, opts: RepoMapOptions = {}): string {\n const maxEntries = opts.maxEntries ?? 5000;\n const ig = buildIgnore(root);\n const entries: string[] = [];\n walk(root, root, ig, entries, maxEntries, !!opts.includeHidden);\n entries.sort();\n return entries.join('\\n') + '\\n';\n}\n\nfunction buildIgnore(root: string): Ignore {\n const ig = ignore().add(DEFAULT_IGNORES);\n const gitignore = path.join(root, '.gitignore');\n if (fs.existsSync(gitignore)) {\n try {\n ig.add(fs.readFileSync(gitignore, 'utf8'));\n } catch {\n /* ignore */\n }\n }\n return ig;\n}\n\nfunction walk(root: string, dir: string, ig: Ignore, out: string[], max: number, includeHidden: boolean): void {\n if (out.length >= max) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (out.length >= max) return;\n if (!includeHidden && entry.name.startsWith('.') && entry.name !== '.squad') continue;\n\n const abs = path.join(dir, entry.name);\n const rel = path.relative(root, abs);\n if (!rel || ig.ignores(rel) || (entry.isDirectory() && ig.ignores(rel + '/'))) continue;\n\n if (entry.isDirectory()) {\n walk(root, abs, ig, out, max, includeHidden);\n } else if (entry.isFile()) {\n out.push(rel);\n }\n }\n}\n","import { readBundledPrompt } from '../utils/fs.js';\n\nexport function composeSystemPrompt(args: {\n projectRoots: string[];\n primaryLanguage: string;\n trackerType: string;\n repoMap: string;\n}): string {\n const base = readBundledPrompt('generate-plan.md')\n .replace(/\\{\\{projectRoots\\}\\}/g, args.projectRoots.join(', '))\n .replace(/\\{\\{primaryLanguage\\}\\}/g, args.primaryLanguage)\n .replace(/\\{\\{trackerType\\}\\}/g, args.trackerType)\n .replace(\n /\\{\\{intakeContent\\}\\}/g,\n '_(The intake story is provided in the user message below. Do not ask for it.)_',\n );\n\n const apiPreamble = [\n '',\n '---',\n '',\n '## Direct-API mode notes',\n '',\n 'You are being invoked by the squad-kit CLI, not by a human editor. The intake is already inlined below.',\n 'The repository tree is provided. To see the contents of any file, **call the `read_file` tool** with a repo-relative path.',\n 'You have a bounded context budget (file reads, total bytes, wall-clock time). Read files you genuinely need.',\n 'When you have enough information, output the **complete plan markdown** as your final assistant message. No prose around it, no code fences wrapping the whole plan. The CLI will write your final message verbatim to disk.',\n '',\n '## Repository tree',\n '',\n '```',\n args.repoMap.trimEnd(),\n '```',\n '',\n ].join('\\n');\n\n return base + apiPreamble;\n}\n\nexport function composeUserPrompt(args: { intakeContent: string }): string {\n return [\n 'Produce the implementation plan for the following intake.',\n '',\n '---',\n '',\n args.intakeContent.trimEnd(),\n '',\n ].join('\\n');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { slugify, type SquadPaths } from '../core/paths.js';\nimport { formatSequence, scanPlans } from '../core/sequence.js';\nimport type { SquadConfig } from '../core/config.js';\nimport type { StoryRecord } from '../core/stories.js';\nimport { trackerIdForFilename } from '../core/tracker.js';\n\nexport interface WritePlanInput {\n paths: SquadPaths;\n config: SquadConfig;\n story: StoryRecord;\n planBodyMarkdown: string;\n metadataHeader: string;\n /**\n * When true, writes `*.partial.md`, reuses an existing partial for the same story when present,\n * and expects `metadataHeader` to include the partial front matter (see `buildMetadataHeader`).\n */\n partial?: boolean;\n}\n\nexport interface WritePlanOutput {\n planFile: string;\n sequenceNumber: number;\n overwrote: boolean;\n}\n\n/** Stem after `NN-story-`: always the story folder id (`slugify(story.id)`), never the title hint (keeps paths short). */\nfunction planFileSlugParts(config: SquadConfig, story: StoryRecord): { baseSlug: string; trackerPart: string } {\n const baseSlug = slugify(story.id);\n const trackerId =\n config.naming.includeTrackerId && config.tracker.type !== 'none'\n ? trackerIdForFilename(config.tracker.type, story.id)\n : '';\n const trackerPart =\n trackerId && trackerId.toLowerCase() !== baseSlug ? `-${trackerId}` : '';\n return { baseSlug, trackerPart };\n}\n\n/** Concurrent runs against the same intake can race on overview / sequence; callers should serialize if needed. */\nexport function writePlanFile(input: WritePlanInput): WritePlanOutput {\n const { paths, config, story } = input;\n\n const featurePlanDir = path.join(paths.plansDir, story.feature);\n fs.mkdirSync(featurePlanDir, { recursive: true });\n\n if (input.partial) {\n return writePartialPlanFile(input, featurePlanDir, paths, config, story);\n }\n\n const existing = findExistingPlan(featurePlanDir, story.id);\n let targetPath: string;\n let nn: number;\n let overwrote = false;\n\n if (existing) {\n targetPath = existing.absPath;\n nn = existing.nn;\n overwrote = true;\n } else {\n nn = scanPlans(paths.plansDir).nextGlobal;\n const { baseSlug, trackerPart } = planFileSlugParts(config, story);\n targetPath = path.join(featurePlanDir, `${formatSequence(nn)}-story-${baseSlug}${trackerPart}.md`);\n }\n\n const body = `${input.metadataHeader.trimEnd()}\\n\\n${input.planBodyMarkdown.trimStart()}\\n`;\n fs.writeFileSync(targetPath, body, 'utf8');\n\n upsertOverviewRow(featurePlanDir, story.feature, nn, path.basename(targetPath), story, false);\n\n return { planFile: targetPath, sequenceNumber: nn, overwrote };\n}\n\nfunction writePartialPlanFile(\n input: WritePlanInput,\n featurePlanDir: string,\n paths: SquadPaths,\n config: SquadConfig,\n story: StoryRecord,\n): WritePlanOutput {\n const existingPartial = findExistingPartialPlan(featurePlanDir, story.id);\n let targetPath: string;\n let nn: number;\n let overwrote = false;\n\n if (existingPartial) {\n targetPath = existingPartial.absPath;\n nn = existingPartial.nn;\n overwrote = true;\n } else {\n nn = scanPlans(paths.plansDir).nextGlobal;\n const { baseSlug, trackerPart } = planFileSlugParts(config, story);\n targetPath = path.join(featurePlanDir, `${formatSequence(nn)}-story-${baseSlug}${trackerPart}.partial.md`);\n }\n\n const body = `${input.metadataHeader.trimEnd()}\\n\\n${input.planBodyMarkdown.trimStart()}\\n`;\n fs.writeFileSync(targetPath, body, 'utf8');\n\n upsertOverviewRow(featurePlanDir, story.feature, nn, path.basename(targetPath), story, true);\n\n return { planFile: targetPath, sequenceNumber: nn, overwrote };\n}\n\nfunction findExistingPlan(featureDir: string, storyId: string): { absPath: string; nn: number } | undefined {\n if (!fs.existsSync(featureDir)) return undefined;\n const pattern = /^(\\d{2,})-story-.+\\.md$/;\n for (const entry of fs.readdirSync(featureDir)) {\n if (entry.endsWith('.partial.md')) continue;\n const m = entry.match(pattern);\n if (!m) continue;\n if (entry.includes(storyId)) return { absPath: path.join(featureDir, entry), nn: parseInt(m[1]!, 10) };\n }\n return undefined;\n}\n\nfunction findExistingPartialPlan(\n featureDir: string,\n storyId: string,\n): { absPath: string; nn: number } | undefined {\n if (!fs.existsSync(featureDir)) return undefined;\n const pattern = /^(\\d{2,})-story-.+\\.partial\\.md$/;\n for (const entry of fs.readdirSync(featureDir)) {\n const m = entry.match(pattern);\n if (!m) continue;\n if (entry.includes(storyId)) return { absPath: path.join(featureDir, entry), nn: parseInt(m[1]!, 10) };\n }\n return undefined;\n}\n\nfunction upsertOverviewRow(\n featureDir: string,\n feature: string,\n nn: number,\n filename: string,\n story: StoryRecord,\n isPartial: boolean,\n): void {\n const overviewPath = path.join(featureDir, '00-overview.md');\n const titleCell = isPartial ? `${story.titleHint ?? story.id} (partial)` : (story.titleHint ?? story.id);\n const row = `| ${formatSequence(nn)} | \\`${filename}\\` | ${titleCell} | ${story.id} | — |`;\n if (!fs.existsSync(overviewPath)) {\n const content = `# ${feature} — plan overview\\n\\nEntry point for the **${feature}** feature. Stories execute in order by their \\`NN\\` prefix.\\n\\n## Stories\\n\\n| NN | File | Title | Tracker id | Depends on |\\n|----|------|-------|------------|------------|\\n${row}\\n`;\n fs.writeFileSync(overviewPath, content, 'utf8');\n return;\n }\n\n const current = fs.readFileSync(overviewPath, 'utf8');\n const lines = current.split('\\n');\n const existingIdx = lines.findIndex((l) => l.includes(`\\`${filename}\\``) || l.includes(`| ${formatSequence(nn)} |`));\n if (existingIdx >= 0) {\n lines[existingIdx] = row;\n } else {\n const tableEnd = findTableEnd(lines);\n lines.splice(tableEnd, 0, row);\n }\n fs.writeFileSync(overviewPath, lines.join('\\n'), 'utf8');\n}\n\nfunction findTableEnd(lines: string[]): number {\n let inTable = false;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (!inTable && line.startsWith('|')) {\n inTable = true;\n continue;\n }\n if (inTable && !line.startsWith('|')) return i;\n }\n return lines.length;\n}\n\nexport function buildMetadataHeader(args: {\n provider: string;\n model: string;\n reads: number;\n bytes: number;\n inputTokens: number;\n outputTokens: number;\n durationMs: number;\n costUsd?: number;\n /** When `partial`, appends YAML front matter after the HTML comment. */\n planStatus?: 'complete' | 'partial';\n}): string {\n const parts = [\n `generated by ${args.provider}/${args.model}`,\n `at ${new Date().toISOString()}`,\n `${args.reads} reads / ${(args.bytes / 1024).toFixed(1)} KB context`,\n `${args.inputTokens} in / ${args.outputTokens} out tokens`,\n args.costUsd !== undefined ? `~$${args.costUsd.toFixed(2)}` : null,\n ].filter(Boolean);\n const line1 = `<!-- squad-kit: ${parts.join(', ')} -->`;\n if (args.planStatus === 'partial') {\n return `${line1}\\n\\n---\\nsquad-kit-plan-status: partial\\n---`;\n }\n return line1;\n}\n","import type { SquadConfig } from './config.js';\nimport { readBundledPrompt } from '../utils/fs.js';\nimport { render } from './template.js';\n\n/** Same composed markdown as `squad new-plan --copy` / `emitCopyPrompt` (no clipboard or filesystem side effects). */\nexport function buildCopyPlanPromptMarkdown(config: SquadConfig, intakeContent: string): string {\n const metaPromptTemplate = readBundledPrompt('generate-plan.md');\n return render(metaPromptTemplate, {\n projectRoots: (config.project.projectRoots ?? ['.']).join(', '),\n primaryLanguage: config.project.primaryLanguage ?? '',\n trackerType: config.tracker.type,\n intakeContent,\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PlannerRunStats } from '../planner/types.js';\nimport type { SquadPaths } from './paths.js';\n\nexport interface LastRunRecord {\n stats: PlannerRunStats;\n /** ISO-8601 timestamp the run completed. */\n completedAt: string;\n /** Which provider/model were used. For doctor's diagnostic output. */\n provider: string;\n model: string;\n /** Schema version so future shape changes don't misparse. */\n version: 1;\n}\n\nexport async function writeLastRun(paths: SquadPaths, rec: Omit<LastRunRecord, 'version'>): Promise<void> {\n const file = path.join(paths.squadDir, '.last-run.json');\n await fs.writeFile(file, JSON.stringify({ ...rec, version: 1 }, null, 2) + '\\n', 'utf8');\n}\n\nexport async function readLastRun(paths: SquadPaths): Promise<LastRunRecord | undefined> {\n const file = path.join(paths.squadDir, '.last-run.json');\n try {\n const raw = await fs.readFile(file, 'utf8');\n const parsed = JSON.parse(raw) as LastRunRecord;\n if (parsed.version !== 1) return undefined;\n return parsed;\n } catch {\n return undefined;\n }\n}\n","import type { PlannerRunStats } from '../planner/types.js';\n\nexport function formatTokenK(n: number): string {\n return `${(n / 1000).toFixed(1)}k`;\n}\n\nexport function formatPlannerCacheLine(opts: { cacheEnabled: boolean; stats: PlannerRunStats }): string {\n if (!opts.cacheEnabled) {\n return 'cache disabled';\n }\n const { stats } = opts;\n if (stats.cacheReadTokens > 0) {\n const pct = Math.round(stats.cacheHitRatio * 100);\n const total = stats.inputTokens + stats.cacheReadTokens;\n const read = formatTokenK(stats.cacheReadTokens);\n const tot = formatTokenK(total);\n const written =\n stats.cacheCreationTokens > 0 ? ` · ${formatTokenK(stats.cacheCreationTokens)} written` : '';\n return `cache hit ${pct}% (${read} read / ${tot} total${written})`;\n }\n return 'cache miss 0% — run `squad doctor` to diagnose';\n}\n","import fs from 'node:fs';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../core/paths.js';\nimport { loadConfig, type SquadConfig } from '../core/config.js';\nimport { modelFor, providerEnvVar, resolveProviderKey } from '../core/planner-models.js';\nimport { scanPlans, formatSequence } from '../core/sequence.js';\nimport { listStories } from '../core/stories.js';\nimport { loadSecrets, type SquadSecrets } from '../core/secrets.js';\nimport { clientFor, overlayTrackerEnv } from '../tracker/index.js';\n\nconst kw = 28;\n\ntype CredStatus =\n | { state: 'present'; detail: 'env' | 'secrets.yaml' }\n | { state: 'missing'; hint: string };\n\nfunction probeTrackerCredential(config: SquadConfig, overlay: SquadSecrets): CredStatus {\n const { client, error } = clientFor(config, overlay);\n if (client) {\n const fromEnv =\n (config.tracker.type === 'jira' &&\n Boolean(process.env.JIRA_API_TOKEN || process.env.SQUAD_TRACKER_API_KEY)) ||\n (config.tracker.type === 'azure' &&\n Boolean(process.env.AZURE_DEVOPS_PAT || process.env.SQUAD_TRACKER_API_KEY));\n return { state: 'present', detail: fromEnv ? 'env' : 'secrets.yaml' };\n }\n return {\n state: 'missing',\n hint: error?.detail ?? 'Run `squad init` to enter credentials.',\n };\n}\n\nfunction formatCredentialStatus(s: CredStatus): string {\n if (s.state === 'present') {\n return s.detail === 'env' ? 'set via environment variable' : 'set via .squad/secrets.yaml';\n }\n return `missing — ${s.hint}`;\n}\n\nexport async function runStatus(): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n const scan = scanPlans(paths.plansDir);\n\n const storyCount = listStories(paths).length;\n const planCount = scan.usedNumbers.length;\n\n const secrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n const overlay = overlayTrackerEnv(secrets);\n\n ui.banner();\n ui.step('squad-kit status');\n ui.blank();\n ui.kv('project', config.project.name, kw);\n ui.kv('tracker', buildTrackerLine(config, overlay), kw);\n\n if (config.tracker.type === 'jira' || config.tracker.type === 'azure') {\n const result = probeTrackerCredential(config, overlay);\n ui.kv('tracker key', formatCredentialStatus(result), kw);\n }\n\n ui.kv('agents', config.agents.length ? config.agents.join(', ') : '(none)', kw);\n if (config.planner?.enabled) {\n const model = modelFor(config.planner.provider, 'plan', config.planner.modelOverride);\n const overrideNote = config.planner.modelOverride?.[config.planner.provider] ? ' (override)' : '';\n ui.kv('planner', `${config.planner.provider}/${model}${overrideNote}`, kw);\n const cred = resolveProviderKey(config.planner.provider);\n ui.kv(\n 'planner key',\n cred\n ? `set via ${cred.detail}`\n : `missing — set ${providerEnvVar(config.planner.provider)} or run \\`squad init\\``,\n kw,\n );\n } else {\n ui.kv('planner', 'disabled (copy-paste flow)', kw);\n }\n ui.kv('stories (drafts + planned)', String(storyCount), kw);\n ui.kv('plan files', String(planCount), kw);\n ui.kv('next NN', formatSequence(scan.nextGlobal), kw);\n if (scan.duplicates.length > 0) {\n ui.warning(`duplicate NN numbers: ${scan.duplicates.map(formatSequence).join(', ')}`);\n }\n}\n\nfunction buildTrackerLine(config: SquadConfig, overlay: SquadSecrets): string {\n if (config.tracker.type === 'none') return 'none';\n let trackerLine = config.tracker.type;\n if (config.tracker.type === 'jira') {\n if (overlay.tracker?.jira?.host) {\n trackerLine += ` · ${overlay.tracker.jira.host}`;\n } else {\n trackerLine += ' · (no host configured)';\n }\n } else if (config.tracker.type === 'azure') {\n const org = overlay.tracker?.azure?.organization ?? config.tracker.workspace;\n const proj = overlay.tracker?.azure?.project ?? config.tracker.project;\n if (org) {\n trackerLine += ` · ${org}${proj ? `/${proj}` : ''}`;\n } else {\n trackerLine += ' · (no organization configured)';\n }\n }\n return trackerLine;\n}\n","import path from 'node:path';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../core/paths.js';\nimport { type PlanMetadata, listStories, readPlanMetadata } from '../core/stories.js';\n\nexport interface ListOptions {\n feature?: string;\n}\n\ninterface Row {\n feature: string;\n id: string;\n hasIntake: boolean;\n planFile?: string;\n meta?: PlanMetadata;\n}\n\nexport async function runList(opts: ListOptions): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const records = listStories(paths, { feature: opts.feature });\n const rows: Row[] = records.map((r) => {\n const planAbs = r.planFile ? path.join(paths.plansDir, r.feature, r.planFile) : undefined;\n const meta = planAbs ? readPlanMetadata(planAbs) : undefined;\n return {\n feature: r.feature,\n id: r.id,\n hasIntake: true,\n planFile: r.planFile,\n meta,\n };\n });\n\n if (rows.length === 0) {\n ui.info('(no stories yet — try `squad new-story <feature-slug>`)');\n return;\n }\n\n const header = ['feature', 'story', 'intake', 'plan', 'generated by'];\n const table = rows.map((r) => [\n r.feature,\n r.id,\n r.hasIntake ? 'yes' : '—',\n r.planFile ?? ui.theme.dim('—'),\n r.meta?.generatedBy ?? (r.planFile ? ui.theme.dim('not recorded') : ui.theme.dim('—')),\n ]);\n printTable([header, ...table]);\n}\n\nfunction printTable(rows: string[][]): void {\n const widths = rows[0]!.map((_, i) => Math.max(...rows.map((r) => stripAnsi(r[i] ?? '').length)));\n for (const row of rows) {\n console.log(row.map((cell, i) => pad(cell, widths[i]!)).join(' '));\n }\n}\n\nfunction pad(s: string, width: number): string {\n const visible = stripAnsi(s).length;\n return s + ' '.repeat(Math.max(0, width - visible));\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { input, select } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../core/paths.js';\nimport { loadConfig } from '../core/config.js';\nimport { validateTrackerId } from '../core/tracker.js';\nimport { listAllStories } from '../core/stories.js';\n\nexport interface TrackerLinkOptions {\n yes?: boolean;\n}\n\nexport async function runTrackerLink(\n storyPath: string | undefined,\n trackerId: string | undefined,\n opts: TrackerLinkOptions = {},\n): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const config = loadConfig(paths.configFile);\n\n const interactive = !opts.yes && Boolean(process.stdin.isTTY) && process.env.CI !== 'true';\n\n let resolvedStoryPath = storyPath;\n if (!resolvedStoryPath) {\n if (!interactive) {\n throw new Error(\n 'Usage: squad tracker link [story-path] [tracker-id]. Run `squad tracker link` without arguments in a TTY to pick from a list, or pass `--yes` to opt out of prompts.',\n );\n }\n const stories = listAllStories(paths);\n if (stories.length === 0) {\n throw new Error('No stories found under .squad/stories/. Create one with `squad new-story` first.');\n }\n resolvedStoryPath = await select({\n message: 'Story to link:',\n choices: stories.map((s) => ({\n name: `${s.feature}/${s.id}`,\n value: s.intakePath,\n })),\n });\n }\n\n let resolvedTrackerId = trackerId;\n if (!resolvedTrackerId) {\n if (!interactive) {\n throw new Error(\n 'Usage: squad tracker link [story-path] [tracker-id]. Run `squad tracker link` without arguments in a TTY to pick from a list, or pass `--yes` to opt out of prompts.',\n );\n }\n resolvedTrackerId = (\n await input({\n message: `${config.tracker.type} work-item id:`,\n validate: (v) => {\n const trimmed = v.trim();\n if (!trimmed) return 'Required.';\n return validateTrackerId(config.tracker.type, trimmed)\n ? true\n : `Invalid ${config.tracker.type} id format.`;\n },\n })\n ).trim();\n }\n\n if (!validateTrackerId(config.tracker.type, resolvedTrackerId)) {\n throw new Error(\n `Invalid tracker id \"${resolvedTrackerId}\" for tracker type \"${config.tracker.type}\". ` +\n `Run \\`squad config show\\` to review the expected format, or \\`squad config set tracker\\` if the type is wrong.`,\n );\n }\n\n const resolved = path.resolve(resolvedStoryPath);\n const intakeFile = resolved.endsWith('intake.md') ? resolved : path.join(resolved, 'intake.md');\n if (!fs.existsSync(intakeFile)) {\n throw new Error(\n `intake.md not found at ${intakeFile}. Run \\`squad list\\` to see valid paths, or \\`squad new-story\\` to create a story first.`,\n );\n }\n\n const content = fs.readFileSync(intakeFile, 'utf8');\n const updated = upsertTrackerId(content, resolvedTrackerId);\n fs.writeFileSync(intakeFile, updated, 'utf8');\n\n ui.success(`Linked tracker id ${resolvedTrackerId} → ${path.relative(root, intakeFile)}`);\n ui.blank();\n ui.step('Next:');\n ui.info('1) Review the intake — the Source block at the top now carries the tracker id.');\n ui.info('2) Run `squad new-plan --api` (or `--copy`) to generate the plan for this story.');\n}\n\nfunction upsertTrackerId(content: string, id: string): string {\n const pattern = /(-\\s*\\*\\*Work item id:\\*\\*)[^\\n]*/;\n if (pattern.test(content)) {\n return content.replace(pattern, `$1 ${id}`);\n }\n return content + `\\n\\n- **Work item id:** ${id}\\n`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { type SquadPaths } from '../core/paths.js';\nimport { loadConfig, type SquadConfig } from '../core/config.js';\nimport { loadSecrets, type SquadSecrets } from '../core/secrets.js';\nimport { ensureGitignore, SQUAD_TRASH_PATTERN } from '../core/gitignore.js';\nimport { modelFor, providerEnvVar, resolveProviderKey } from '../core/planner-models.js';\nimport { clientFor, overlayTrackerEnv, type ClientResolutionError } from '../tracker/index.js';\nimport type { ProviderName } from '../planner/types.js';\nimport { fetchProviderModelIds, probeJiraConnectivity, probeAzureConnectivity } from '../core/probes.js';\nimport { readLastRun } from '../core/last-run.js';\nimport { formatTokenK } from '../ui/planner-cache-summary.js';\n\nexport interface CheckResult {\n id: string;\n name: string;\n status: 'ok' | 'warn' | 'fail' | 'skip';\n detail?: string;\n fixHint?: string;\n fixable?: boolean;\n}\n\nexport interface DoctorContext {\n config?: SquadConfig;\n configError?: Error;\n secrets?: SquadSecrets;\n secretsError?: Error;\n hasLegacyPromptsDir: boolean;\n}\n\nexport async function gatherContext(paths: SquadPaths): Promise<DoctorContext> {\n const ctx: DoctorContext = { hasLegacyPromptsDir: false };\n try {\n ctx.config = loadConfig(paths.configFile);\n } catch (err) {\n ctx.configError = err as Error;\n }\n try {\n ctx.secrets = fs.existsSync(paths.secretsFile) ? loadSecrets(paths.secretsFile) : {};\n } catch (err) {\n ctx.secretsError = err as Error;\n }\n ctx.hasLegacyPromptsDir = fs.existsSync(paths.promptsDir);\n return ctx;\n}\n\nfunction gitignoreHasManagedBlock(repoRoot: string): boolean {\n const gitignore = path.join(repoRoot, '.gitignore');\n return fs.existsSync(gitignore) && fs.readFileSync(gitignore, 'utf8').includes('.squad/secrets.yaml');\n}\n\nfunction gitignoreHasTrashPattern(repoRoot: string): boolean {\n const gitignore = path.join(repoRoot, '.gitignore');\n return fs.existsSync(gitignore) && fs.readFileSync(gitignore, 'utf8').includes(SQUAD_TRASH_PATTERN);\n}\n\nasync function checkDirStructure(paths: SquadPaths, _ctx: DoctorContext, fix: boolean): Promise<CheckResult> {\n const need = [paths.squadDir, paths.storiesDir, paths.plansDir].filter((p) => !fs.existsSync(p));\n if (need.length === 0) {\n return { id: 'dirs', name: '.squad/ directory structure', status: 'ok' };\n }\n if (fix) {\n for (const p of need) {\n fs.mkdirSync(p, { recursive: true });\n }\n return { id: 'dirs', name: '.squad/ directory structure', status: 'ok', detail: 'repaired' };\n }\n return {\n id: 'dirs',\n name: '.squad/ directory structure',\n status: 'warn',\n detail: `missing: ${need.map((p) => path.relative(paths.root, p)).join(', ')}`,\n fixable: true,\n fixHint: 'squad doctor --fix',\n };\n}\n\nasync function checkConfigReadable(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (ctx.configError) {\n return {\n id: 'config',\n name: '.squad/config.yaml readable',\n status: 'fail',\n detail: ctx.configError.message,\n fixHint: 'Fix or recreate .squad/config.yaml; see squad init',\n };\n }\n return { id: 'config', name: '.squad/config.yaml readable', status: 'ok' };\n}\n\nasync function checkGitignore(paths: SquadPaths, _ctx: DoctorContext, fix: boolean): Promise<CheckResult> {\n if (gitignoreHasManagedBlock(paths.root)) {\n return { id: 'gitignore', name: '.gitignore managed block', status: 'ok' };\n }\n if (fix) {\n ensureGitignore(paths.root);\n return { id: 'gitignore', name: '.gitignore managed block', status: 'ok', detail: 'repaired' };\n }\n return {\n id: 'gitignore',\n name: '.gitignore managed block',\n status: 'warn',\n fixable: true,\n fixHint: 'squad doctor --fix',\n };\n}\n\nasync function checkGitignoreTrashPattern(paths: SquadPaths, _ctx: DoctorContext, fix: boolean): Promise<CheckResult> {\n if (gitignoreHasTrashPattern(paths.root)) {\n return { id: 'gitignore-trash', name: '.gitignore includes .squad/.trash/', status: 'ok' };\n }\n if (fix) {\n ensureGitignore(paths.root);\n if (gitignoreHasTrashPattern(paths.root)) {\n return { id: 'gitignore-trash', name: '.gitignore includes .squad/.trash/', status: 'ok', detail: 'repaired' };\n }\n }\n return {\n id: 'gitignore-trash',\n name: '.gitignore includes .squad/.trash/',\n status: 'warn',\n fixable: true,\n fixHint: 'squad doctor --fix',\n };\n}\n\nasync function checkSecretsPermissions(paths: SquadPaths, _ctx: DoctorContext, fix: boolean): Promise<CheckResult> {\n if (process.platform === 'win32') {\n return { id: 'secrets-perms', name: '.squad/secrets.yaml permissions', status: 'skip', detail: 'Windows' };\n }\n if (!fs.existsSync(paths.secretsFile)) {\n return { id: 'secrets-perms', name: '.squad/secrets.yaml permissions', status: 'ok', detail: 'not present' };\n }\n const mode = fs.statSync(paths.secretsFile).mode & 0o777;\n if (mode === 0o600) {\n return { id: 'secrets-perms', name: '.squad/secrets.yaml permissions', status: 'ok' };\n }\n if (fix) {\n fs.chmodSync(paths.secretsFile, 0o600);\n return { id: 'secrets-perms', name: '.squad/secrets.yaml permissions', status: 'ok', detail: 'repaired' };\n }\n return {\n id: 'secrets-perms',\n name: '.squad/secrets.yaml permissions',\n status: 'warn',\n detail: `mode ${mode.toString(8)} (expected 600)`,\n fixable: true,\n fixHint: 'squad doctor --fix',\n };\n}\n\nasync function checkSecretsParseable(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (ctx.secretsError) {\n return {\n id: 'secrets-yaml',\n name: '.squad/secrets.yaml parseable',\n status: 'fail',\n detail: ctx.secretsError.message,\n };\n }\n if (!fs.existsSync(_paths.secretsFile)) {\n return { id: 'secrets-yaml', name: '.squad/secrets.yaml parseable', status: 'ok', detail: 'not present' };\n }\n return { id: 'secrets-yaml', name: '.squad/secrets.yaml parseable', status: 'ok' };\n}\n\nasync function checkLegacyPrompts(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (ctx.hasLegacyPromptsDir) {\n return {\n id: 'legacy-prompts',\n name: 'legacy .squad/prompts/ directory',\n status: 'warn',\n detail: 'stale copy from pre-0.2 installs',\n fixHint: 'squad migrate',\n };\n }\n return { id: 'legacy-prompts', name: 'legacy .squad/prompts/ directory', status: 'ok' };\n}\n\nasync function checkPlannerConfig(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'skip',\n detail: 'config unavailable',\n };\n }\n const p = ctx.config.planner;\n if (p?.enabled !== true) {\n return { id: 'planner-config', name: 'planner configuration', status: 'skip', detail: 'disabled' };\n }\n if (!['anthropic', 'openai', 'google'].includes(p.provider)) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'fail',\n detail: `unsupported planner.provider \"${p.provider}\"`,\n };\n }\n const mo = p.modelOverride;\n if (mo) {\n for (const key of ['anthropic', 'openai', 'google'] as const) {\n const v = mo[key];\n if (v !== undefined && (typeof v !== 'string' || v.trim().length === 0)) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'fail',\n detail: `planner.modelOverride.${key} must be a non-empty string when set`,\n };\n }\n }\n }\n if (p.budget.maxFileReads <= 0 || p.budget.maxContextBytes <= 0 || p.budget.maxDurationSeconds <= 0) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'fail',\n detail: 'planner budget limits must be > 0',\n };\n }\n if (p.budget.maxCostUsd !== undefined && p.budget.maxCostUsd <= 0) {\n return {\n id: 'planner-config',\n name: 'planner configuration',\n status: 'fail',\n detail: 'planner.budget.maxCostUsd must be > 0 when set',\n };\n }\n return { id: 'planner-config', name: 'planner configuration', status: 'ok' };\n}\n\nasync function checkPlannerCredential(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config || ctx.config.planner?.enabled !== true) {\n return { id: 'planner-cred', name: 'planner credential resolves', status: 'skip', detail: 'planner disabled' };\n }\n const provider = ctx.config.planner.provider;\n const resolved = resolveProviderKey(provider);\n if (!resolved) {\n const envVar = providerEnvVar(provider);\n return {\n id: 'planner-cred',\n name: 'planner credential resolves',\n status: 'fail',\n detail: `no API key found (${envVar} or .squad/secrets.yaml)`,\n fixHint: `Set ${envVar} or save a key via 'squad init' interactive setup`,\n };\n }\n return {\n id: 'planner-cred',\n name: 'planner credential resolves',\n status: 'ok',\n detail: `source=${resolved.source} (${resolved.detail})`,\n };\n}\n\nasync function checkPlannerModel(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config || ctx.config.planner?.enabled !== true) {\n return { id: 'planner-model', name: 'planner model resolves at provider', status: 'skip', detail: 'planner disabled' };\n }\n const provider = ctx.config.planner.provider;\n const cred = resolveProviderKey(provider);\n if (!cred) {\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'skip',\n detail: 'no credential',\n };\n }\n const model = modelFor(provider, 'plan', ctx.config.planner.modelOverride);\n try {\n const listed = await fetchProviderModelIds(provider, cred.value);\n if (!listed.ok) {\n const st = listed.status;\n if (st === 401 || st === 403) {\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'warn',\n detail: `models API HTTP ${st}`,\n };\n }\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'warn',\n detail: `models API HTTP ${st}: ${listed.body.slice(0, 120)}`,\n };\n }\n if (!listed.ids.has(model)) {\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'fail',\n detail: `model \"${model}\" not listed by provider`,\n fixHint: `Upgrade squad-kit for updated pins, set planner.modelOverride.${provider} in .squad/config.yaml, or switch planner.provider to a provider that exposes this model id.`,\n };\n }\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'ok',\n detail: `${model} (${provider})`,\n };\n } catch (err) {\n return {\n id: 'planner-model',\n name: 'planner model resolves at provider',\n status: 'warn',\n detail: (err as Error).message,\n };\n }\n}\n\nasync function checkPlannerTierAwareness(\n _paths: SquadPaths,\n ctx: DoctorContext,\n): Promise<CheckResult> {\n const id = 'planner-tier';\n const name = 'planner tier vs. model';\n if (!ctx.config || ctx.config.planner?.enabled !== true) {\n return { id, name, status: 'skip', detail: 'planner disabled' };\n }\n const provider = ctx.config.planner.provider;\n if (provider !== 'anthropic') {\n return { id, name, status: 'skip', detail: `not applicable for ${provider}` };\n }\n const planModel = modelFor(provider, 'plan', ctx.config.planner.modelOverride);\n if (!/opus/i.test(planModel)) {\n return { id, name, status: 'ok', detail: `${planModel} is comfortably under Tier 1` };\n }\n const cacheOn = ctx.config.planner?.cache?.enabled !== false;\n if (cacheOn) {\n return {\n id,\n name,\n status: 'warn',\n detail: 'Anthropic Tier 1 with Opus — tight but viable with prompt caching on',\n fixHint: [\n 'Caching saves ~70% on billed input tokens. Keep `planner.cache.enabled: true` in config.',\n 'If you still hit 429s on long runs, reduce `planner.budget.maxContextBytes` or use Haiku for plan phase.',\n ].join('\\n'),\n };\n }\n return {\n id,\n name,\n status: 'warn',\n detail: `${planModel} on Anthropic Tier 1 (10k input tokens/min) is throttle-prone for plans over ~3 file reads`,\n fixHint:\n 'Run `squad config set planner` and pick a Sonnet or Haiku id for planner.modelOverride.anthropic, ' +\n 'or upgrade tier at https://console.anthropic.com/settings/limits. ' +\n 'squad-kit will auto-retry a 429 once (waiting up to 90s), but repeated throttling means the plan model is simply too big for your quota.',\n };\n}\n\nexport async function checkPlannerCache(paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n const id = 'planner-cache';\n const name = 'planner cache effectiveness';\n const config = ctx.config;\n const cacheCfg = config?.planner?.cache;\n\n if (config?.planner?.enabled !== true) {\n return { id, name, status: 'skip', detail: 'planner disabled — cache check not applicable' };\n }\n\n if (cacheCfg?.enabled === false) {\n return {\n id,\n name,\n status: 'warn',\n detail: 'prompt caching is disabled in .squad/config.yaml',\n fixHint: 'Cache saves ~70% on billed tokens. Re-enable with `squad config set planner`.',\n };\n }\n\n const lastRun = await readLastRun(paths);\n if (!lastRun) {\n return {\n id,\n name,\n status: 'skip',\n detail: 'no planner runs logged yet',\n fixHint: 'Run `squad new-plan --api` once, then re-run `squad doctor` to see cache telemetry.',\n };\n }\n\n const { stats } = lastRun;\n const hitPct = Math.round(stats.cacheHitRatio * 100);\n\n if (stats.cacheReadTokens === 0 && stats.turns > 1) {\n return {\n id,\n name,\n status: 'fail',\n detail: `caching configured but last run saw 0% hits across ${stats.turns} turns`,\n fixHint: [\n 'Possible causes:',\n ' • Planner provider is not Anthropic and the prefix is below 1024 tokens (OpenAI / Google need larger prefixes).',\n ' • System prompt is mutating between turns — check recent changes.',\n \" • Using an older model that doesn't support caching.\",\n `Provider: ${lastRun.provider}/${lastRun.model}. Run \\`NODE_ENV=development squad new-plan --api\\` to surface prefix-mismatch warnings.`,\n ].join('\\n'),\n };\n }\n\n if (hitPct < 30 && stats.turns > 3) {\n return {\n id,\n name,\n status: 'warn',\n detail: `low cache hit rate: ${hitPct}% (last run, ${stats.turns} turns)`,\n fixHint: 'Expected ≥60% for Anthropic, ≥40% for OpenAI, ≥50% for Google after 3+ turns. Prefix may be unstable.',\n };\n }\n\n return {\n id,\n name,\n status: 'ok',\n detail: `caching active — last run ${hitPct}% hit (${formatTokenK(stats.cacheReadTokens)} read, ${lastRun.provider}/${lastRun.model})`,\n };\n}\n\nasync function checkTrackerConfig(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config) {\n return { id: 'tracker-config', name: 'tracker configuration', status: 'skip', detail: 'config unavailable' };\n }\n const t = ctx.config.tracker;\n if (t.type === 'none') {\n return { id: 'tracker-config', name: 'tracker configuration', status: 'skip', detail: 'none' };\n }\n if (t.type === 'jira' && !t.workspace?.trim()) {\n return {\n id: 'tracker-config',\n name: 'tracker configuration',\n status: 'fail',\n detail: 'Jira requires tracker.workspace (host)',\n };\n }\n if (t.type === 'azure' && (!t.workspace?.trim() || !t.project?.trim())) {\n return {\n id: 'tracker-config',\n name: 'tracker configuration',\n status: 'fail',\n detail: 'Azure DevOps requires tracker.workspace (organization) and tracker.project',\n };\n }\n return { id: 'tracker-config', name: 'tracker configuration', status: 'ok' };\n}\n\nfunction formatClientError(err: ClientResolutionError): string {\n return `${err.message} ${err.detail}`.trim();\n}\n\nasync function checkTrackerCredential(_paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config) {\n return { id: 'tracker-cred', name: 'tracker credential resolves', status: 'skip', detail: 'config unavailable' };\n }\n if (ctx.config.tracker.type === 'none') {\n return { id: 'tracker-cred', name: 'tracker credential resolves', status: 'skip', detail: 'none' };\n }\n const secrets = ctx.secrets ?? {};\n const overlay = overlayTrackerEnv(secrets);\n const { client, error } = clientFor(ctx.config, overlay);\n if (error) {\n return {\n id: 'tracker-cred',\n name: 'tracker credential resolves',\n status: 'fail',\n detail: formatClientError(error),\n };\n }\n if (!client) {\n return {\n id: 'tracker-cred',\n name: 'tracker credential resolves',\n status: 'fail',\n detail: 'no tracker client',\n };\n }\n return { id: 'tracker-cred', name: 'tracker credential resolves', status: 'ok' };\n}\n\nasync function checkTrackerConnectivity(paths: SquadPaths, ctx: DoctorContext): Promise<CheckResult> {\n if (!ctx.config || ctx.config.tracker.type === 'none') {\n return { id: 'tracker-live', name: 'tracker connectivity', status: 'skip', detail: 'none' };\n }\n const secrets = ctx.secrets ?? {};\n const overlay = overlayTrackerEnv(secrets);\n const { client, error } = clientFor(ctx.config, overlay);\n if (error || !client) {\n return { id: 'tracker-live', name: 'tracker connectivity', status: 'skip', detail: 'no credential' };\n }\n if (client.name === 'jira') {\n const r = await probeJiraConnectivity(secrets, ctx.config);\n if (r.ok) return { id: 'tracker-live', name: 'tracker connectivity', status: 'ok', detail: 'Jira REST' };\n return {\n id: 'tracker-live',\n name: 'tracker connectivity',\n status: 'fail',\n detail: r.status !== undefined ? `HTTP ${r.status}` : r.detail ?? 'request failed',\n };\n }\n if (client.name === 'azure') {\n const r = await probeAzureConnectivity(secrets, ctx.config);\n if (r.ok) return { id: 'tracker-live', name: 'tracker connectivity', status: 'ok', detail: 'Azure DevOps' };\n return {\n id: 'tracker-live',\n name: 'tracker connectivity',\n status: 'fail',\n detail: r.status !== undefined ? `HTTP ${r.status}` : r.detail ?? 'request failed',\n };\n }\n return {\n id: 'tracker-live',\n name: 'tracker connectivity',\n status: 'skip',\n detail: 'unsupported client',\n };\n}\n\nasync function guardCheck(checkName: string, fn: () => Promise<CheckResult>): Promise<CheckResult> {\n try {\n return await fn();\n } catch (err) {\n return {\n id: 'unexpected',\n name: checkName,\n status: 'fail',\n detail: (err as Error).message,\n };\n }\n}\n\nexport async function runAllChecks(paths: SquadPaths, ctx: DoctorContext, fix: boolean): Promise<CheckResult[]> {\n const checks: CheckResult[] = [];\n const add = async (label: string, fn: () => Promise<CheckResult>) => {\n checks.push(await guardCheck(label, fn));\n };\n await add('.squad/ directory structure', () => checkDirStructure(paths, ctx, fix));\n await add('.squad/config.yaml readable', () => checkConfigReadable(paths, ctx));\n await add('.gitignore managed block', () => checkGitignore(paths, ctx, fix));\n await add('.gitignore includes .squad/.trash/', () => checkGitignoreTrashPattern(paths, ctx, fix));\n await add('.squad/secrets.yaml permissions', () => checkSecretsPermissions(paths, ctx, fix));\n await add('.squad/secrets.yaml parseable', () => checkSecretsParseable(paths, ctx));\n await add('legacy .squad/prompts/ directory', () => checkLegacyPrompts(paths, ctx));\n await add('planner configuration', () => checkPlannerConfig(paths, ctx));\n await add('planner credential resolves', () => checkPlannerCredential(paths, ctx));\n await add('planner model resolves at provider', () => checkPlannerModel(paths, ctx));\n await add('planner tier vs. model', () => checkPlannerTierAwareness(paths, ctx));\n await add('planner cache effectiveness', () => checkPlannerCache(paths, ctx));\n await add('tracker configuration', () => checkTrackerConfig(paths, ctx));\n await add('tracker credential resolves', () => checkTrackerCredential(paths, ctx));\n await add('tracker connectivity', () => checkTrackerConnectivity(paths, ctx));\n return checks;\n}\n\nexport function summarise(checks: CheckResult[]): { ok: number; warn: number; fail: number; skip: number } {\n return {\n ok: checks.filter((c) => c.status === 'ok').length,\n warn: checks.filter((c) => c.status === 'warn').length,\n fail: checks.filter((c) => c.status === 'fail').length,\n skip: checks.filter((c) => c.status === 'skip').length,\n };\n}\n","import * as ui from '../ui/index.js';\nimport * as theme from '../ui/theme.js';\nimport { findSquadRoot, buildPaths } from '../core/paths.js';\nimport {\n gatherContext,\n runAllChecks,\n summarise,\n type CheckResult,\n type DoctorContext,\n} from './doctor-engine.js';\n\nexport type { CheckResult, DoctorContext };\n\n/** Re-export for tests that assert cache-check behaviour. */\nexport { checkPlannerCache } from './doctor-engine.js';\n\nexport interface DoctorOptions {\n fix?: boolean;\n json?: boolean;\n}\n\nfunction colorForStatus(s: CheckResult['status']): (t: string) => string {\n switch (s) {\n case 'ok':\n return theme.primary;\n case 'warn':\n return theme.warn;\n case 'fail':\n return theme.danger;\n case 'skip':\n return theme.dim;\n default:\n return (x) => x;\n }\n}\n\nfunction symbolForStatus(s: CheckResult['status']): string {\n switch (s) {\n case 'ok':\n return '✓';\n case 'warn':\n return '!';\n case 'fail':\n return '✗';\n case 'skip':\n return '·';\n default:\n return '?';\n }\n}\n\nfunction renderChecks(root: string, checks: CheckResult[]): void {\n ui.divider('squad doctor');\n ui.info(`workspace ${root}`);\n ui.info('');\n for (const c of checks) {\n const sym = symbolForStatus(c.status);\n const col = colorForStatus(c.status);\n const detail = c.detail ? theme.dim(` — ${c.detail}`) : '';\n ui.line(` ${col(sym)} ${c.name}${detail}`);\n if (c.fixHint) ui.line(` ${theme.dim('↳ ' + c.fixHint)}`);\n }\n ui.info('');\n const counts = summarise(checks);\n ui.info(`${counts.ok} ok · ${counts.warn} warn · ${counts.fail} fail · ${counts.skip} skip`);\n}\n\nexport async function runDoctor(opts: DoctorOptions): Promise<void> {\n const fix = opts.fix ?? false;\n const json = opts.json ?? false;\n\n const root = findSquadRoot();\n if (!root) {\n if (json) {\n process.stdout.write(\n JSON.stringify({ error: 'No .squad/ directory found. Run `squad init` first.', checks: [] }, null, 2) + '\\n',\n );\n } else {\n ui.failure('No .squad/ directory found. Run `squad init` first.');\n }\n process.exit(1);\n }\n const paths = buildPaths(root);\n\n const ctx = await gatherContext(paths);\n const checks = await runAllChecks(paths, ctx, fix);\n\n if (json) {\n process.stdout.write(JSON.stringify({ root, checks }, null, 2) + '\\n');\n } else {\n renderChecks(root, checks);\n }\n\n if (fix) {\n const repaired = checks.filter((c) => c.detail === 'repaired').length;\n if (repaired > 0 && !json) {\n ui.info('');\n ui.info(`Applied ${repaired} repair(s).`);\n }\n }\n\n if (!json) {\n const fixableWarns = checks.filter((c) => c.status === 'warn' && c.fixable).length;\n const migrateNeeded = checks.filter((c) => c.id === 'legacy-prompts' && c.status === 'warn').length;\n if (!fix && (fixableWarns > 0 || migrateNeeded > 0)) {\n ui.info('');\n if (fixableWarns > 0) {\n ui.info(\n `${fixableWarns} fixable issue(s) found. Run \\`squad doctor --fix\\` to apply non-destructive repairs.`,\n );\n }\n if (migrateNeeded > 0) {\n ui.info(`${migrateNeeded} destructive issue requires \\`squad migrate\\`.`);\n }\n }\n }\n\n const fails = checks.filter((c) => c.status === 'fail').length;\n if (fails > 0) process.exit(1);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { findSquadRoot, buildPaths, type SquadPaths } from '../core/paths.js';\nimport { loadConfig, saveConfig, serializeConfig } from '../core/config.js';\nimport { ensureGitignore } from '../core/gitignore.js';\n\nexport interface MigrateOptions {\n dryRun?: boolean;\n yes?: boolean;\n}\n\nexport interface Migration {\n id: string;\n name: string;\n /** true if, after this function returns, there is nothing left to migrate of this type. */\n isApplied: (paths: SquadPaths) => boolean | Promise<boolean>;\n /** The destructive side-effect. Only called when --dry-run is false and the user confirmed. */\n apply: (paths: SquadPaths) => void | Promise<void>;\n /** Human-readable one-liner describing what apply() will do. */\n describe: (paths: SquadPaths) => string;\n}\n\nconst LEGACY_PROMPTS_MIGRATION: Migration = {\n id: 'legacy-prompts',\n name: 'Remove legacy .squad/prompts/',\n isApplied: (paths) => !fs.existsSync(paths.promptsDir),\n describe: (paths) =>\n `delete ${path.relative(paths.root, paths.promptsDir)} (prompts are now bundled in squad-kit)`,\n apply: (paths) => {\n const target = paths.promptsDir;\n if (!target.includes(path.sep + '.squad' + path.sep + 'prompts')) {\n throw new Error(\n `Refusing to delete suspicious path: ${target}. This is a safety check — run \\`squad doctor\\` if .squad/ paths look wrong.`,\n );\n }\n if (fs.existsSync(target)) {\n fs.rmSync(target, { recursive: true, force: true });\n }\n },\n};\n\nconst GITIGNORE_MIGRATION: Migration = {\n id: 'gitignore',\n name: 'Ensure .gitignore managed block',\n isApplied: (paths) => {\n const f = path.join(paths.root, '.gitignore');\n return fs.existsSync(f) && fs.readFileSync(f, 'utf8').includes('.squad/secrets.yaml');\n },\n describe: () => 'add squad-kit managed block to .gitignore',\n apply: (paths) => {\n ensureGitignore(paths.root);\n },\n};\n\nconst SECRETS_PERMS_MIGRATION: Migration = {\n id: 'secrets-perms',\n name: 'Tighten .squad/secrets.yaml permissions',\n isApplied: (paths) => {\n if (process.platform === 'win32') return true;\n if (!fs.existsSync(paths.secretsFile)) return true;\n const st = fs.statSync(paths.secretsFile);\n return (st.mode & 0o777) === 0o600;\n },\n describe: (paths) => `chmod 0600 ${path.relative(paths.root, paths.secretsFile)}`,\n apply: (paths) => {\n if (process.platform === 'win32') return;\n if (fs.existsSync(paths.secretsFile)) fs.chmodSync(paths.secretsFile, 0o600);\n },\n};\n\nconst PLANNER_BUDGET_DEFAULTS_MIGRATION: Migration = {\n id: 'planner-budget-defaults',\n name: 'Backfill planner.budget defaults in config.yaml',\n isApplied: (paths) => {\n if (!fs.existsSync(paths.configFile)) return true;\n try {\n const raw = fs.readFileSync(paths.configFile, 'utf8');\n if (!/^\\s*planner:/m.test(raw)) return true;\n if (/^\\s*budget:/m.test(raw)) return true;\n const cfg = loadConfig(paths.configFile);\n return !cfg.planner?.enabled;\n } catch {\n return true;\n }\n },\n describe: () => 'add planner.budget defaults to config.yaml',\n apply: (paths) => {\n const cfg = loadConfig(paths.configFile);\n if (cfg.planner?.enabled) saveConfig(paths.configFile, cfg);\n },\n};\n\nconst CONFIG_NORMALIZE_MIGRATION: Migration = {\n id: 'config-normalize',\n name: 'Normalise .squad/config.yaml formatting',\n isApplied: (paths) => {\n if (!fs.existsSync(paths.configFile)) return true;\n try {\n const raw = fs.readFileSync(paths.configFile, 'utf8');\n const cfg = loadConfig(paths.configFile);\n return raw.trim() === serializeConfig(cfg).trim();\n } catch {\n return true;\n }\n },\n describe: () => 'rewrite config.yaml with canonical YAML formatting (drops comments)',\n apply: (paths) => {\n if (!fs.existsSync(paths.configFile)) return;\n const cfg = loadConfig(paths.configFile);\n saveConfig(paths.configFile, cfg);\n },\n};\n\nexport const MIGRATIONS: Migration[] = [\n LEGACY_PROMPTS_MIGRATION,\n GITIGNORE_MIGRATION,\n SECRETS_PERMS_MIGRATION,\n PLANNER_BUDGET_DEFAULTS_MIGRATION,\n CONFIG_NORMALIZE_MIGRATION,\n];\n\nexport async function runMigrate(opts: MigrateOptions): Promise<void> {\n const root = findSquadRoot();\n if (!root) {\n ui.failure('No .squad/ directory found. Run `squad init` first.');\n process.exit(1);\n }\n const paths = buildPaths(root);\n\n const pending: Migration[] = [];\n for (const m of MIGRATIONS) {\n const already = await Promise.resolve(m.isApplied(paths));\n if (!already) pending.push(m);\n }\n\n ui.divider('squad migrate');\n ui.info(`workspace ${root}`);\n ui.info('');\n\n if (pending.length === 0) {\n ui.success('No migrations needed. Your .squad/ is up to date.');\n return;\n }\n\n ui.info(`${pending.length} migration(s) pending:`);\n for (const m of pending) {\n ui.line(` · ${m.name} — ${m.describe(paths)}`);\n }\n ui.info('');\n\n if (opts.dryRun) {\n ui.info('Dry run: no changes applied. Re-run without --dry-run to apply.');\n return;\n }\n\n if (!opts.yes) {\n const interactive = Boolean(process.stdin.isTTY) && process.env.CI !== 'true';\n if (!interactive) {\n ui.failure(\n 'Refusing to apply migrations without --yes in a non-interactive shell. Run `squad migrate --yes` to apply without a prompt, or re-run in a TTY to confirm interactively.',\n );\n process.exit(1);\n }\n const go = await confirm({ message: `Apply ${pending.length} migration(s)?`, default: true });\n if (!go) {\n ui.info('Cancelled. No changes applied.');\n return;\n }\n }\n\n let applied = 0;\n for (const m of pending) {\n const spin = ui.spinner(m.name);\n try {\n await Promise.resolve(m.apply(paths));\n spin.succeed(`${m.name} — applied`);\n applied++;\n } catch (err) {\n spin.fail(`${m.name} — failed: ${(err as Error).message}`);\n process.exit(1);\n }\n }\n ui.info('');\n ui.success(`Applied ${applied}/${pending.length} migration(s).`);\n ui.blank();\n ui.step('Next:');\n ui.info('1) Run `squad doctor` to verify every check is green.');\n ui.info('2) If you were upgrading from 0.1.x, review .squad/config.yaml — new defaults (planner, cache) may have been added.');\n ui.info('3) Continue your usual workflow: `squad new-story` → fill intake → `squad new-plan`.');\n}\n","import { spawn } from 'node:child_process';\nimport process from 'node:process';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../ui/index.js';\nimport { changelogBlobUrl, readInstalledPackage } from '../core/package-info.js';\nimport { fetchLatest, isNewer } from '../core/registry.js';\nimport { detectPackageManager, installCommandFor } from '../core/package-manager.js';\n\nconst REGISTRY_HOST = 'registry.npmjs.org';\n\nexport interface UpgradeOptions {\n check?: boolean;\n yes?: boolean;\n}\n\nexport async function runUpgrade(opts: UpgradeOptions): Promise<void> {\n const installed = readInstalledPackage();\n ui.divider('squad upgrade');\n ui.info(` installed ${installed.version}`);\n\n if (installed.isDevInstall) {\n ui.failure(\n 'Development install detected (source directory alongside the binary). Run `pnpm add -g squad-kit@latest` (or `npm i -g squad-kit@latest`) from npm, not a source checkout.',\n );\n process.exit(1);\n }\n\n let latest: string;\n try {\n const info = await fetchLatest(installed.name);\n latest = info.latest;\n } catch (err) {\n ui.failure(\n `Could not reach the npm registry: ${(err as Error).message}. Check your network, then run \\`pnpm add -g squad-kit@latest\\` (or \\`npm i -g squad-kit@latest\\`) manually.`,\n );\n process.exit(1);\n }\n\n ui.info(` latest ${latest} (from ${REGISTRY_HOST})`);\n\n if (!isNewer(latest, installed.version)) {\n ui.blank();\n ui.success(`You're on the latest version (${installed.version}).`);\n return;\n }\n\n const [installedMajor = 0] = installed.version.split('.').map((n) => parseInt(n, 10) || 0);\n const [latestMajor = 0] = latest.split('.').map((n) => parseInt(n, 10) || 0);\n if (latestMajor > installedMajor) {\n ui.blank();\n ui.failure(\n `Major version change detected (${installed.version} → ${latest}). Run \\`squad upgrade --check\\` after you install a specific version, and review: ${changelogBlobUrl(installed.repositoryUrl, latest)}`,\n );\n process.exit(1);\n }\n\n const pm = detectPackageManager(installed.root);\n const { cmd, args } = installCommandFor(pm.pm, installed.name, latest);\n\n ui.blank();\n ui.info(`Detected package manager: ${pm.pm} (${pm.reason})`);\n ui.info(`Changelog: ${changelogBlobUrl(installed.repositoryUrl, latest)}`);\n\n if (opts.check) {\n ui.blank();\n ui.info(`Run to upgrade: ${cmd} ${args.join(' ')}`);\n return;\n }\n\n if (!opts.yes) {\n const interactive = Boolean(process.stdin.isTTY) && process.env.CI !== 'true';\n if (!interactive) {\n ui.failure(\n `Refusing to run a global install without --yes. Run \\`squad upgrade --yes\\` in non-interactive mode, or run manually: ${cmd} ${args.join(' ')}`,\n );\n process.exit(1);\n }\n const go = await confirm({ message: `Run \"${cmd} ${args.join(' ')}\"?`, default: true });\n if (!go) {\n ui.info('Cancelled. No changes applied.');\n return;\n }\n }\n\n ui.blank();\n ui.info(`Running: ${cmd} ${args.join(' ')}`);\n const exitCode = await spawnInherit(cmd, args);\n\n if (exitCode !== 0) {\n ui.failure(\n `${cmd} exited with code ${exitCode}. Upgrade may be incomplete — run \\`squad doctor\\` and re-run \\`squad upgrade\\` if needed.`,\n );\n process.exit(exitCode);\n }\n\n ui.blank();\n ui.success(`Upgraded to ${latest}.`);\n ui.info('Run `squad migrate` to update your .squad/ structure if needed.');\n}\n\nfunction spawnInherit(cmd: string, args: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, { stdio: 'inherit', shell: process.platform === 'win32' });\n child.on('exit', (code) => resolve(code ?? 0));\n child.on('error', (err) => reject(err));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { packageRoot } from '../utils/fs.js';\n\nexport interface InstalledPackage {\n name: string;\n version: string;\n root: string;\n /** Git repository URL from package.json (for changelog links). */\n repositoryUrl?: string;\n /** True if the binary is running from a linked local checkout (pnpm link, npm link). */\n isDevInstall: boolean;\n}\n\n/**\n * Build a GitHub/GitLab-style blob URL for CHANGELOG.md at a tagged release.\n */\nexport function changelogBlobUrl(repositoryUrl: string | undefined, version: string): string {\n let base = repositoryUrl;\n if (!base) base = 'https://github.com/AzmSquad/squad-kit';\n if (base.startsWith('git+')) base = base.slice(4);\n if (base.endsWith('.git')) base = base.slice(0, -4);\n base = base.replace(/\\/$/, '');\n return `${base}/blob/v${version}/CHANGELOG.md`;\n}\n\nexport function readInstalledPackage(): InstalledPackage {\n const root = packageRoot();\n const pkgFile = path.join(root, 'package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgFile, 'utf8')) as {\n name: string;\n version: string;\n repository?: { url?: string };\n };\n\n // Dev-install detection: the package root contains a `src/` directory (source lives alongside dist).\n // Registry installs only ship dist/ + templates/ (per the files field in package.json).\n const isDevInstall = fs.existsSync(path.join(root, 'src'));\n\n return {\n name: pkg.name,\n version: pkg.version,\n root,\n repositoryUrl: pkg.repository?.url,\n isDevInstall,\n };\n}\n","const REGISTRY_BASE = 'https://registry.npmjs.org';\n\nexport interface RegistryInfo {\n latest: string;\n versions: string[];\n}\n\nexport async function fetchLatest(packageName: string, timeoutMs = 5000): Promise<RegistryInfo> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(`${REGISTRY_BASE}/${encodeURIComponent(packageName)}`, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n if (!res.ok) throw new Error(`registry ${res.status}: ${await res.text().catch(() => '')}`.slice(0, 200));\n const body = (await res.json()) as { 'dist-tags': { latest: string }; versions: Record<string, unknown> };\n return {\n latest: body['dist-tags'].latest,\n versions: Object.keys(body.versions),\n };\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport function isNewer(a: string, b: string): boolean {\n // Simple semver-minor compare without importing a package. Handles x.y.z only.\n const parse = (v: string) => v.split('.').map((n) => parseInt(n, 10) || 0);\n const [a1 = 0, a2 = 0, a3 = 0] = parse(a);\n const [b1 = 0, b2 = 0, b3 = 0] = parse(b);\n if (a1 !== b1) return a1 > b1;\n if (a2 !== b2) return a2 > b2;\n return a3 > b3;\n}\n","import path from 'node:path';\nimport process from 'node:process';\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\nexport interface DetectedPM {\n pm: PackageManager;\n /** Why we think this — e.g. \"binary path contains ~/.pnpm/\" or \"npm_config_user_agent\". */\n reason: string;\n}\n\n/**\n * Best-effort detection based on the current process metadata and the installed binary path.\n * Order of preference: explicit user-agent > install-path heuristic > fallback to npm.\n */\nexport function detectPackageManager(installRoot: string): DetectedPM {\n const ua = process.env.npm_config_user_agent;\n if (ua) {\n if (ua.startsWith('pnpm/')) return { pm: 'pnpm', reason: 'npm_config_user_agent' };\n if (ua.startsWith('yarn/')) return { pm: 'yarn', reason: 'npm_config_user_agent' };\n if (ua.startsWith('bun/')) return { pm: 'bun', reason: 'npm_config_user_agent' };\n if (ua.startsWith('npm/')) return { pm: 'npm', reason: 'npm_config_user_agent' };\n }\n\n // Path-based heuristic: where is the package installed?\n const root = installRoot.toLowerCase();\n if (root.includes(`${path.sep}pnpm${path.sep}`) || root.includes(`${path.sep}.pnpm${path.sep}`))\n return { pm: 'pnpm', reason: `install path contains pnpm` };\n if (root.includes(`${path.sep}.yarn${path.sep}`) || root.includes(`${path.sep}yarn${path.sep}`))\n return { pm: 'yarn', reason: `install path contains yarn` };\n if (root.includes(`${path.sep}.bun${path.sep}`) || root.includes(`${path.sep}bun${path.sep}`))\n return { pm: 'bun', reason: `install path contains bun` };\n\n return { pm: 'npm', reason: 'default fallback' };\n}\n\nexport function installCommandFor(pm: PackageManager, pkg: string, version: string): { cmd: string; args: string[] } {\n const spec = `${pkg}@${version}`;\n switch (pm) {\n case 'pnpm':\n return { cmd: 'pnpm', args: ['add', '-g', spec] };\n case 'yarn':\n return { cmd: 'yarn', args: ['global', 'add', spec] };\n case 'bun':\n return { cmd: 'bun', args: ['install', '-g', spec] };\n case 'npm':\n return { cmd: 'npm', args: ['install', '-g', spec] };\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport { resolve } from 'node:path';\nimport open from 'open';\nimport * as ui from '../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../core/paths.js';\nimport { loadConfig } from '../core/config.js';\nimport { startConsoleServer, type ConsoleServer } from '../console/server.js';\n\nexport interface ConsoleOptions {\n port?: number;\n /** Commander negates `--no-open` to `open: false`. */\n open?: boolean;\n token?: string;\n}\n\nconst DEFAULT_PORT = 4571;\n\nexport async function runConsole(opts: ConsoleOptions): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n // loadConfig also validates the YAML — surface schema problems before binding a port.\n loadConfig(paths.configFile);\n\n const portOpt = opts.port;\n const requestedPort =\n portOpt !== undefined && !Number.isNaN(portOpt) && portOpt >= 0 ? portOpt : DEFAULT_PORT;\n const token = opts.token ?? randomBytes(32).toString('hex');\n\n const server: ConsoleServer = await startConsoleServer({ paths, requestedPort, token });\n\n const url = `http://127.0.0.1:${server.port}/?t=${token}`;\n\n ui.banner();\n ui.divider('squad console');\n ui.summaryBox(' squad console ', [\n { key: 'project', value: resolve(paths.root) },\n { key: 'url', value: url },\n { key: 'token', value: `${token.slice(0, 8)}…` },\n { key: 'port', value: String(server.port) },\n ]);\n if (server.port !== requestedPort) {\n ui.warning(`port ${requestedPort} was busy — bound to ${server.port} instead`);\n }\n ui.blank();\n ui.step('Next:');\n ui.info('1) Pick a story in the Stories tab.');\n ui.info('2) Click \"Generate plan\" to start a planning run live.');\n ui.info(\"3) Press Ctrl-C in this terminal to stop the server when you're done.\");\n\n if (opts.open !== false) {\n try {\n await open(url);\n } catch {\n ui.warning('Could not open a browser automatically. Copy the URL above into your browser.');\n }\n } else {\n ui.info('Browser auto-open disabled (--no-open). Copy the URL above into your browser.');\n }\n\n // Block until SIGINT/SIGTERM. The server attaches its own listeners that resolve `done`.\n await server.done;\n ui.info('console stopped');\n}\n","import { createServer } from 'node:net';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { secureHeaders } from 'hono/secure-headers';\nimport * as ui from '../ui/index.js';\nimport type { SquadPaths } from '../core/paths.js';\nimport { mountApi } from './api/index.js';\nimport { mountStaticAssets } from './static-assets.js';\nimport { authMiddleware } from './auth.js';\n\nexport interface StartConsoleServerOptions {\n paths: SquadPaths;\n requestedPort: number;\n token: string;\n}\n\nexport interface ConsoleServer {\n port: number;\n /** Resolves when the server has fully shut down (SIGINT, SIGTERM, or programmatic close). */\n done: Promise<void>;\n /** Programmatic close (used by tests). */\n close(): Promise<void>;\n}\n\nexport async function startConsoleServer(opts: StartConsoleServerOptions): Promise<ConsoleServer> {\n const bindPort =\n opts.requestedPort === 0\n ? await reserveEphemeralPort()\n : await findFreePortFromBase(opts.requestedPort);\n\n const app = new Hono();\n\n // Public health endpoint (no auth) — used by tests and external uptime checks.\n app.get('/healthz', (c) =>\n c.json(\n { ok: true, version: '0.6.0', port: bindPort },\n 200,\n {\n 'cache-control': 'no-store',\n },\n ),\n );\n\n // Tighten headers everywhere. Static asset and API responses inherit these.\n app.use(\n '*',\n secureHeaders({\n contentSecurityPolicy: {\n defaultSrc: [\"'self'\"],\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\n imgSrc: [\"'self'\", 'data:'],\n connectSrc: [\"'self'\"],\n scriptSrc: [\"'self'\"],\n frameAncestors: [\"'none'\"],\n },\n referrerPolicy: 'no-referrer',\n }),\n );\n\n // Disable CORS in production builds — same-origin only.\n app.use('*', cors({ origin: 'http://127.0.0.1:' + bindPort }));\n\n // API: token-gated.\n app.use('/api/*', authMiddleware(opts.token));\n mountApi(app, { paths: opts.paths });\n\n // Static SPA: public reads from project/dist/console-ui (story 02 fills it in).\n mountStaticAssets(app, { paths: opts.paths });\n\n const nodeServer = serve({ fetch: app.fetch, hostname: '127.0.0.1', port: bindPort });\n\n let resolveDone: () => void = () => {};\n const done = new Promise<void>((resolve) => {\n resolveDone = resolve;\n });\n\n const actualPort = (() => {\n const addr = nodeServer.address();\n if (addr && typeof addr === 'object') return addr.port;\n return bindPort;\n })();\n\n const shutdown = (onClose: (err?: Error) => void) => {\n nodeServer.close((err) => {\n onClose(err);\n });\n };\n\n const stop = () => {\n shutdown((err) => {\n if (err) ui.warning(`server close: ${err.message}`);\n resolveDone();\n });\n };\n\n process.once('SIGINT', stop);\n process.once('SIGTERM', stop);\n\n return {\n port: actualPort,\n done,\n close: () =>\n new Promise<void>((resolve, reject) => {\n shutdown((err) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n resolveDone();\n });\n }),\n };\n}\n\n/** Picks a free port, lets the OS choose the number, then returns it (avoids passing `0` into URLs). */\nfunction reserveEphemeralPort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const s = createServer();\n s.once('error', reject);\n s.listen(0, '127.0.0.1', () => {\n const addr = s.address();\n s.close((closeErr) => {\n if (closeErr) {\n reject(closeErr);\n return;\n }\n if (addr && typeof addr === 'object') {\n resolve(addr.port);\n } else {\n reject(new Error('Could not determine ephemeral port'));\n }\n });\n });\n });\n}\n\nasync function findFreePortFromBase(start: number, attempts = 20): Promise<number> {\n for (let i = 0; i < attempts; i += 1) {\n const candidate = start + i;\n if (await isPortFree(candidate)) return candidate;\n }\n throw new Error(\n `Could not find a free port in [${start}, ${start + attempts - 1}]. Pass \\`--port <n>\\` to pick another base.`,\n );\n}\n\nfunction isPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const probe = createServer();\n probe.once('error', () => resolve(false));\n probe.once('listening', () => probe.close(() => resolve(true)));\n probe.listen(port, '127.0.0.1');\n });\n}\n","import fs from 'node:fs';\nimport type { Hono } from 'hono';\nimport { z } from 'zod';\nimport { createStoryRecord, deleteStoryRecord } from '../../core/story-mutations.js';\nimport { loadConfig } from '../../core/config.js';\nimport { listStories } from '../../core/stories.js';\nimport { slugify } from '../../core/paths.js';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { isInside } from '../../utils/path-safety.js';\n\nconst CreateBody = z.object({\n feature: z.string().min(1).max(80),\n title: z.string().max(200).optional(),\n trackerId: z.string().max(80).optional(),\n});\nconst PatchBody = z.object({\n intakeContent: z.string().min(1).max(1_000_000),\n});\n\nfunction safeFeatureParam(feature: string): boolean {\n return feature.length > 0 && !feature.includes('/') && !feature.includes('..') && slugify(feature) === feature;\n}\n\nexport function mountStoriesApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/stories', (c) => {\n const feature = c.req.query('feature') ?? undefined;\n const stories = listStories(opts.paths, { feature });\n return c.json(\n stories.map((s) => ({\n feature: s.feature,\n id: s.id,\n intakePath: s.intakePath,\n storyDir: s.storyDir,\n planFile: s.planFile ?? null,\n titleHint: s.titleHint ?? null,\n })),\n );\n });\n\n app.get('/api/stories/:feature/:id', (c) => {\n const { feature, id } = c.req.param();\n if (!safeFeatureParam(feature)) return c.json({ error: 'forbidden' }, 403);\n const stories = listStories(opts.paths, { feature });\n const hit = stories.find((s) => s.id === id);\n if (!hit) return c.json({ error: 'not_found' }, 404);\n if (!isInside(hit.intakePath, opts.paths.storiesDir)) return c.json({ error: 'forbidden' }, 403);\n let intakeContent = '';\n try {\n intakeContent = fs.readFileSync(hit.intakePath, 'utf8');\n } catch {\n // surfaced as empty content; UI handles\n }\n return c.json({\n feature: hit.feature,\n id: hit.id,\n intakePath: hit.intakePath,\n storyDir: hit.storyDir,\n planFile: hit.planFile ?? null,\n titleHint: hit.titleHint ?? null,\n intakeContent,\n });\n });\n\n app.post('/api/stories', async (c) => {\n const body = CreateBody.safeParse(await c.req.json());\n if (!body.success) return c.json({ error: 'invalid_body', issues: body.error.issues }, 400);\n const cfg = loadConfig(opts.paths.configFile);\n let created;\n try {\n created = createStoryRecord({\n paths: opts.paths,\n config: cfg,\n feature: body.data.feature,\n title: body.data.title,\n trackerId: body.data.trackerId,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (/already exists|Intake already exists/.test(msg)) {\n return c.json({ error: 'conflict', message: msg }, 409);\n }\n return c.json({ error: 'invalid_request', message: msg }, 400);\n }\n return c.json(created, 201);\n });\n\n app.patch('/api/stories/:feature/:id', async (c) => {\n const body = PatchBody.safeParse(await c.req.json());\n if (!body.success) return c.json({ error: 'invalid_body', issues: body.error.issues }, 400);\n const { feature, id } = c.req.param();\n if (!safeFeatureParam(feature)) return c.json({ error: 'forbidden' }, 403);\n const stories = listStories(opts.paths, { feature });\n const hit = stories.find((s) => s.id === id);\n if (!hit) return c.json({ error: 'not_found' }, 404);\n if (!isInside(hit.intakePath, opts.paths.storiesDir)) return c.json({ error: 'forbidden' }, 403);\n fs.writeFileSync(hit.intakePath, body.data.intakeContent, 'utf8');\n return c.json({ ok: true });\n });\n\n app.delete('/api/stories/:feature/:id', (c) => {\n const trash = c.req.query('trash') === '1';\n const { feature, id } = c.req.param();\n if (!safeFeatureParam(feature)) return c.json({ error: 'forbidden' }, 403);\n const stories = listStories(opts.paths, { feature });\n const hit = stories.find((s) => s.id === id);\n if (!hit) return c.json({ error: 'not_found' }, 404);\n if (!isInside(hit.storyDir, opts.paths.storiesDir)) return c.json({ error: 'forbidden' }, 403);\n const result = deleteStoryRecord({ paths: opts.paths, story: hit, trash });\n return c.json(result);\n });\n}\n","import path from 'node:path';\n\n/**\n * True when `abs` is inside `parent` (canonical paths, no prefix-collision on sibling dirs).\n */\nexport function isInside(abs: string, parent: string): boolean {\n const a = path.resolve(abs) + path.sep;\n const p = path.resolve(parent) + path.sep;\n return a.startsWith(p);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { Hono } from 'hono';\nimport { z } from 'zod';\nimport { diffLines, type Change } from 'diff';\nimport { listPlanFeatureNames, readPlanMetadata } from '../../core/stories.js';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { slugify } from '../../core/paths.js';\nimport { isInside } from '../../utils/path-safety.js';\nimport { trashOrDelete } from '../../commands/rm/shared.js';\nimport { removeOverviewRowForPlanFile } from '../../commands/rm/shared.js';\n\nconst DiffQuery = z.object({\n feature: z.string().min(1).max(80),\n a: z.string().min(1).max(200),\n b: z.string().min(1).max(200),\n});\n\nfunction safeFeatureParam(feature: string): boolean {\n return feature.length > 0 && !feature.includes('/') && !feature.includes('..') && slugify(feature) === feature;\n}\n\nexport function mountPlansApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/plans', (c) => {\n const out: { feature: string; planFile: string; metadata: ReturnType<typeof readPlanMetadata> }[] = [];\n for (const feature of listPlanFeatureNames(opts.paths)) {\n const featureDir = path.join(opts.paths.plansDir, feature);\n if (!fs.existsSync(featureDir)) continue;\n for (const entry of fs.readdirSync(featureDir)) {\n if (!entry.endsWith('.md') || entry === '00-index.md') continue;\n const abs = path.join(featureDir, entry);\n out.push({ feature, planFile: entry, metadata: readPlanMetadata(abs) });\n }\n }\n return c.json(out);\n });\n\n app.get('/api/plans/:feature/:planFile', (c) => {\n const { feature, planFile } = c.req.param();\n if (!safeFeatureParam(feature)) return c.json({ error: 'forbidden' }, 403);\n const abs = path.resolve(path.join(opts.paths.plansDir, feature, planFile));\n if (!isInside(abs, opts.paths.plansDir)) return c.json({ error: 'forbidden' }, 403);\n if (!fs.existsSync(abs)) return c.json({ error: 'not_found' }, 404);\n const content = fs.readFileSync(abs, 'utf8');\n return c.json({\n feature,\n planFile,\n content,\n absPath: abs,\n metadata: readPlanMetadata(abs),\n });\n });\n\n app.get('/api/plans/diff', (c) => {\n const parse = DiffQuery.safeParse({\n feature: c.req.query('feature'),\n a: c.req.query('a'),\n b: c.req.query('b'),\n });\n if (!parse.success) return c.json({ error: 'invalid_query', issues: parse.error.issues }, 400);\n const { feature, a, b } = parse.data;\n if (!safeFeatureParam(feature)) return c.json({ error: 'forbidden' }, 403);\n const featureDir = path.join(opts.paths.plansDir, feature);\n const aAbs = path.join(featureDir, a);\n const bAbs = path.join(featureDir, b);\n if (!isInside(aAbs, opts.paths.plansDir) || !isInside(bAbs, opts.paths.plansDir)) {\n return c.json({ error: 'forbidden' }, 403);\n }\n if (!fs.existsSync(aAbs) || !fs.existsSync(bAbs)) return c.json({ error: 'not_found' }, 404);\n const aText = fs.readFileSync(aAbs, 'utf8');\n const bText = fs.readFileSync(bAbs, 'utf8');\n const changes: Change[] = diffLines(aText, bText);\n return c.json({ feature, a, b, changes });\n });\n\n app.delete('/api/plans/:feature/:planFile', (c) => {\n const trash = c.req.query('trash') === '1';\n const { feature, planFile } = c.req.param();\n if (!safeFeatureParam(feature)) return c.json({ error: 'forbidden' }, 403);\n const abs = path.join(opts.paths.plansDir, feature, planFile);\n if (!isInside(abs, opts.paths.plansDir)) return c.json({ error: 'forbidden' }, 403);\n if (!fs.existsSync(abs)) return c.json({ error: 'not_found' }, 404);\n if (trash) {\n const result = trashOrDelete([abs], opts.paths.trashDir, true);\n removeOverviewRowForPlanFile(path.join(opts.paths.plansDir, feature), planFile);\n return c.json({ ok: true, trashed: result.trashed });\n }\n fs.rmSync(abs);\n removeOverviewRowForPlanFile(path.join(opts.paths.plansDir, feature), planFile);\n return c.json({ ok: true });\n });\n}\n","import { z } from 'zod';\nimport type { Hono } from 'hono';\nimport { loadConfig, saveConfig } from '../../core/config.js';\nimport type { SquadPaths } from '../../core/paths.js';\n\nconst ConfigBody = z.object({}).passthrough();\n\nexport function mountConfigApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/config', (c) => {\n const config = loadConfig(opts.paths.configFile);\n return c.json(config);\n });\n\n app.put('/api/config', async (c) => {\n const body = ConfigBody.safeParse(await c.req.json());\n if (!body.success) return c.json({ error: 'invalid_body', issues: body.error.issues }, 400);\n try {\n saveConfig(opts.paths.configFile, body.data as never);\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: 'invalid_config', detail: (err as Error).message }, 400);\n }\n });\n}\n","import type { Hono } from 'hono';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { loadConfig } from '../../core/config.js';\nimport { readLastRun } from '../../core/last-run.js';\n\nexport function mountMetaApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/meta', async (c) => {\n const config = loadConfig(opts.paths.configFile);\n const lastRun = await readLastRun(opts.paths);\n return c.json({\n version: '0.6.0',\n root: opts.paths.root,\n project: config.project,\n planner: config.planner\n ? { provider: config.planner.provider, enabled: config.planner.enabled }\n : null,\n tracker: { type: config.tracker.type },\n lastRun,\n });\n });\n\n app.get('/api/last-run', async (c) => {\n const lastRun = await readLastRun(opts.paths);\n return c.json(lastRun ?? null);\n });\n}\n","import { streamSSE } from 'hono/streaming';\nimport type { Hono } from 'hono';\nimport { z } from 'zod';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { loadConfig } from '../../core/config.js';\nimport { providerFor } from '../../planner/providers/index.js';\nimport { Budget } from '../../planner/budget.js';\nimport { runPlanner } from '../../planner/loop.js';\nimport { PlannerEventBus, type PlannerEvent } from '../../planner/events.js';\nimport { listStories } from '../../core/stories.js';\nimport { modelFor, readProviderKeyForPaths, providerEnvVar } from '../../core/planner-models.js';\nimport { buildRepoMap } from '../../core/repo-map.js';\nimport { composeSystemPrompt, composeUserPrompt } from '../../planner/system-prompt.js';\nimport { writePlanFile, buildMetadataHeader } from '../../planner/writer.js';\nimport { writeLastRun } from '../../core/last-run.js';\nimport { appendRun, listRuns, newRunId } from '../../core/runs.js';\nimport type { PlannerRunStats } from '../../planner/types.js';\n\ninterface ActiveRun {\n runId: string;\n bus: PlannerEventBus;\n controller: AbortController;\n feature: string;\n storyId: string;\n startedAt: number;\n done: Promise<void>;\n eventBuffer: PlannerEvent[];\n}\n\nconst active = new Map<string, ActiveRun>();\n\nconst EVENT_BUF_CAP = 512;\n\nconst StartBody = z.object({\n feature: z.string().min(1),\n storyId: z.string().min(1),\n});\n\nfunction emptyStats(durationMs: number): PlannerRunStats {\n return {\n turns: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n cacheHitRatio: 0,\n durationMs,\n };\n}\n\nexport function mountRunsApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/runs', async (c) => c.json(await listRuns(opts.paths)));\n\n app.get('/api/runs/active', (c) => {\n const rows = [...active.values()].map((r) => ({\n runId: r.runId,\n feature: r.feature,\n storyId: r.storyId,\n startedAt: r.startedAt,\n }));\n return c.json(rows);\n });\n\n app.post('/api/runs', async (c) => {\n const body = StartBody.safeParse(await c.req.json());\n if (!body.success) return c.json({ error: 'invalid_body', issues: body.error.issues }, 400);\n\n const cfg = loadConfig(opts.paths.configFile);\n if (!cfg.planner?.enabled) {\n return c.json({ error: 'planner_disabled', detail: 'Run `squad config set planner` first.' }, 400);\n }\n const apiKey = readProviderKeyForPaths(opts.paths, cfg.planner.provider);\n if (!apiKey) {\n return c.json(\n {\n error: 'missing_credentials',\n detail: `Set ${providerEnvVar(cfg.planner.provider)} or save a key via the Secrets tab.`,\n },\n 400,\n );\n }\n const stories = listStories(opts.paths, { feature: body.data.feature });\n const story = stories.find((s) => s.id === body.data.storyId);\n if (!story) return c.json({ error: 'not_found' }, 404);\n\n const runId = newRunId();\n const eventBuffer: PlannerEvent[] = [];\n const bus = new PlannerEventBus();\n bus.subscribe((e) => {\n eventBuffer.push(e);\n if (eventBuffer.length > EVENT_BUF_CAP) eventBuffer.splice(0, eventBuffer.length - EVENT_BUF_CAP);\n });\n const controller = new AbortController();\n const startedAt = Date.now();\n\n const done = (async () => {\n const cfgFresh = loadConfig(opts.paths.configFile);\n const planner = cfgFresh.planner!;\n const provider = providerFor(planner.provider);\n const model = modelFor(planner.provider, 'plan', planner.modelOverride);\n const budget = new Budget(planner.budget);\n const cacheEnabled = planner.cache?.enabled ?? true;\n const repoMap = buildRepoMap(opts.paths.root);\n const systemPrompt = composeSystemPrompt({\n projectRoots: cfgFresh.project.projectRoots ?? ['.'],\n primaryLanguage: cfgFresh.project.primaryLanguage ?? '',\n trackerType: cfgFresh.tracker.type,\n repoMap,\n });\n const userPrompt = composeUserPrompt({\n intakeContent: fs.readFileSync(story.intakePath, 'utf8'),\n });\n\n let result;\n try {\n result = await runPlanner({\n root: opts.paths.root,\n provider,\n model,\n apiKey,\n systemPrompt,\n userPrompt,\n budget,\n maxOutputTokens: planner.maxOutputTokens,\n cacheEnabled,\n events: bus,\n runId,\n abort: controller.signal,\n });\n } catch (err) {\n const durationMs = Date.now() - startedAt;\n bus.emit({ kind: 'error', runId, message: (err as Error).message });\n bus.emit({\n kind: 'done',\n runId,\n success: false,\n planFile: null,\n partial: true,\n stats: emptyStats(durationMs),\n durationMs,\n });\n return;\n }\n\n const runSuccess = result.finishedNormally && !result.timedOut && !result.userCancelled;\n let planFile: string | null = null;\n if (result.planText.trim()) {\n const snap = budget.snapshot();\n const header = buildMetadataHeader({\n provider: planner.provider,\n model,\n reads: snap.reads,\n bytes: snap.bytes,\n inputTokens: snap.usage.inputTokens,\n outputTokens: snap.usage.outputTokens,\n durationMs: Date.now() - startedAt,\n costUsd: snap.usage.costUsd,\n planStatus: runSuccess ? undefined : 'partial',\n });\n const out = writePlanFile({\n paths: opts.paths,\n config: cfgFresh,\n story,\n planBodyMarkdown: result.planText,\n metadataHeader: header,\n partial: !runSuccess,\n });\n planFile = path.relative(opts.paths.root, out.planFile);\n }\n\n try {\n await writeLastRun(opts.paths, {\n stats: result.stats,\n completedAt: new Date().toISOString(),\n provider: planner.provider,\n model,\n });\n await appendRun(opts.paths, {\n runId,\n provider: planner.provider,\n model,\n feature: story.feature,\n storyId: story.id,\n startedAt: new Date(startedAt).toISOString(),\n completedAt: new Date().toISOString(),\n success: runSuccess,\n partial: !runSuccess,\n planFile,\n stats: result.stats,\n cacheEnabled,\n durationMs: Date.now() - startedAt,\n });\n } catch {\n /* best-effort */\n }\n\n bus.emit({\n kind: 'done',\n runId,\n success: runSuccess,\n planFile,\n partial: !runSuccess,\n stats: result.stats,\n durationMs: Date.now() - startedAt,\n });\n })().finally(() => {\n active.delete(runId);\n });\n\n active.set(runId, { runId, bus, controller, feature: story.feature, storyId: story.id, startedAt, done, eventBuffer });\n return c.json({ runId, eventStream: `/api/runs/${runId}/stream` }, 202);\n });\n\n app.get('/api/runs/:runId/stream', (c) => {\n const runId = c.req.param('runId');\n const run = active.get(runId);\n return streamSSE(c, async (stream) => {\n if (!run) {\n await stream.writeSSE({ event: 'error', data: JSON.stringify({ message: 'unknown run' }) });\n await stream.writeSSE({ event: 'closed', data: '{}' });\n return;\n }\n let idx = 0;\n let resolveWaiter: (() => void) | null = null;\n const notify = () => resolveWaiter?.();\n const unsubscribe = run.bus.subscribe(() => notify());\n const ka = setInterval(() => stream.writeSSE({ event: 'ping', data: '{}' }).catch(() => {}), 15_000);\n let closed = false;\n stream.onAbort(() => {\n closed = true;\n unsubscribe();\n clearInterval(ka);\n });\n\n try {\n while (!closed) {\n while (idx < run.eventBuffer.length) {\n const e = run.eventBuffer[idx++]!;\n await stream.writeSSE({ event: e.kind, data: JSON.stringify(e) });\n if (e.kind === 'done') {\n await stream.writeSSE({ event: 'closed', data: JSON.stringify({ ok: true }) });\n clearInterval(ka);\n unsubscribe();\n return;\n }\n }\n await new Promise<void>((resolve) => {\n resolveWaiter = resolve;\n });\n resolveWaiter = null;\n }\n } finally {\n clearInterval(ka);\n unsubscribe();\n }\n });\n });\n\n app.delete('/api/runs/:runId', (c) => {\n const runId = c.req.param('runId');\n const run = active.get(runId);\n if (!run) return c.json({ error: 'not_found' }, 404);\n run.controller.abort();\n return c.json({ ok: true });\n });\n}\n","import { z } from 'zod';\nimport type { Hono } from 'hono';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { loadSecrets, mergeSecrets, saveSecrets, type SquadSecrets } from '../../core/secrets.js';\nimport { maskToken } from '../../core/mask-token.js';\nimport { fetchProviderModelIds, probeJiraConnectivity, probeAzureConnectivity } from '../../core/probes.js';\nimport { loadConfig } from '../../core/config.js';\nimport type { ProviderName } from '../../planner/types.js';\n\nconst PROVIDERS: readonly ProviderName[] = ['anthropic', 'openai', 'google'] as const;\n\nexport { maskToken };\n\nexport function mountSecretsApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/secrets', (c) => {\n const s = loadSecrets(opts.paths.secretsFile);\n return c.json({\n planner: {\n anthropic: maskToken(s.planner?.anthropic),\n openai: maskToken(s.planner?.openai),\n google: maskToken(s.planner?.google),\n },\n tracker: {\n jira: {\n host: s.tracker?.jira?.host ?? null,\n email: s.tracker?.jira?.email ?? null,\n token: maskToken(s.tracker?.jira?.token),\n },\n azure: {\n organization: s.tracker?.azure?.organization ?? null,\n project: s.tracker?.azure?.project ?? null,\n pat: maskToken(s.tracker?.azure?.pat),\n },\n },\n });\n });\n\n const PutBody = z.object({\n planner: z\n .object({\n anthropic: z.string().optional(),\n openai: z.string().optional(),\n google: z.string().optional(),\n })\n .optional(),\n tracker: z\n .object({\n jira: z\n .object({\n host: z.string().optional(),\n email: z.string().optional(),\n token: z.string().optional(),\n })\n .optional(),\n azure: z\n .object({\n organization: z.string().optional(),\n project: z.string().optional(),\n pat: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n });\n\n app.put('/api/secrets', async (c) => {\n const parse = PutBody.safeParse(await c.req.json());\n if (!parse.success) return c.json({ error: 'invalid_body', issues: parse.error.issues }, 400);\n const current = loadSecrets(opts.paths.secretsFile);\n const merged = mergeSecrets(current, parse.data as SquadSecrets);\n saveSecrets(opts.paths.secretsFile, merged);\n return c.json({ ok: true });\n });\n\n for (const p of PROVIDERS) {\n app.post(`/api/secrets/test/${p}`, async (c) => {\n const s = loadSecrets(opts.paths.secretsFile);\n const key = s.planner?.[p];\n if (!key) return c.json({ ok: false, detail: `${p} key not saved` }, 400);\n const result = await fetchProviderModelIds(p, key);\n if (result.ok) return c.json({ ok: true, modelCount: result.ids.size });\n return c.json({ ok: false, status: result.status, detail: result.body.slice(0, 200) }, 200);\n });\n }\n\n app.post('/api/secrets/test/jira', async (c) => {\n const cfg = loadConfig(opts.paths.configFile);\n const s = loadSecrets(opts.paths.secretsFile);\n return c.json(await probeJiraConnectivity(s, cfg));\n });\n\n app.post('/api/secrets/test/azure', async (c) => {\n const cfg = loadConfig(opts.paths.configFile);\n const s = loadSecrets(opts.paths.secretsFile);\n return c.json(await probeAzureConnectivity(s, cfg));\n });\n}\n","/** Masks API tokens for display (console secrets UI and GET /api/secrets). */\nexport function maskToken(t?: string): string | null {\n if (!t) return null;\n if (t.length <= 8) return '••••' + t.slice(-2);\n return t.slice(0, 4) + '…' + t.slice(-4);\n}\n","import type { Hono } from 'hono';\nimport { z } from 'zod';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { loadConfig } from '../../core/config.js';\nimport { loadSecrets } from '../../core/secrets.js';\nimport { clientFor, overlayTrackerEnv } from '../../tracker/index.js';\nimport { TrackerError } from '../../tracker/types.js';\nimport { createStoryRecordFromIssue } from '../../core/story-mutations.js';\n\nconst SearchQuery = z.object({ q: z.string().max(500) });\nconst ImportBody = z.object({\n issueId: z.string().min(1),\n feature: z.string().min(1).max(80),\n withAttachments: z.boolean().optional(),\n});\n\nexport function mountTrackerApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/tracker/search', async (c) => {\n const q = SearchQuery.safeParse({ q: c.req.query('q') });\n if (!q.success) return c.json({ error: 'invalid_query' }, 400);\n const cfg = loadConfig(opts.paths.configFile);\n const secrets = overlayTrackerEnv(loadSecrets(opts.paths.secretsFile));\n const { client, error } = clientFor(cfg, secrets);\n if (!client) {\n return c.json({ error: error?.kind ?? 'unsupported', detail: error?.detail ?? '' }, 400);\n }\n try {\n const results = await client.searchIssues(q.data.q);\n return c.json({ ok: true, results });\n } catch (err) {\n if (err instanceof TrackerError) {\n return c.json({ ok: false, kind: err.kind, status: err.statusCode, detail: err.message }, 200);\n }\n return c.json({ ok: false, detail: (err as Error).message }, 200);\n }\n });\n\n app.post('/api/tracker/import', async (c) => {\n const body = ImportBody.safeParse(await c.req.json());\n if (!body.success) return c.json({ error: 'invalid_body', issues: body.error.issues }, 400);\n const cfg = loadConfig(opts.paths.configFile);\n const secrets = overlayTrackerEnv(loadSecrets(opts.paths.secretsFile));\n const { client, error } = clientFor(cfg, secrets);\n if (!client) {\n return c.json({ error: error?.kind ?? 'unsupported', detail: error?.detail ?? '' }, 400);\n }\n try {\n const issue = await client.fetchIssue(body.data.issueId);\n const created = await createStoryRecordFromIssue({\n paths: opts.paths,\n feature: body.data.feature,\n issue,\n withAttachments: body.data.withAttachments ?? true,\n client,\n config: cfg,\n });\n return c.json(created, 201);\n } catch (err) {\n if (err instanceof TrackerError) return c.json({ error: err.kind, detail: err.message }, 502);\n return c.json({ error: 'fetch_failed', detail: (err as Error).message }, 500);\n }\n });\n}\n","import type { SquadPaths } from '../core/paths.js';\nimport { gatherContext, runAllChecks, type DoctorContext } from './doctor-engine.js';\n\nexport type { DoctorContext };\n\nexport async function gatherContextForApi(paths: SquadPaths): Promise<DoctorContext> {\n return gatherContext(paths);\n}\n\nexport async function runAllChecksForApi(\n paths: SquadPaths,\n ctx: DoctorContext,\n fix: boolean,\n): ReturnType<typeof runAllChecks> {\n return runAllChecks(paths, ctx, fix);\n}\n","import type { Hono } from 'hono';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { gatherContextForApi, runAllChecksForApi } from '../../commands/doctor-api.js';\nimport { summarise } from '../../commands/doctor-engine.js';\n\nexport function mountDoctorApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/doctor', async (c) => {\n const ctx = await gatherContextForApi(opts.paths);\n const checks = await runAllChecksForApi(opts.paths, ctx, false);\n return c.json({ root: opts.paths.root, checks, summary: summarise(checks) });\n });\n\n app.post('/api/doctor/fix', async (c) => {\n const ctx = await gatherContextForApi(opts.paths);\n const checks = await runAllChecksForApi(opts.paths, ctx, true);\n return c.json({ root: opts.paths.root, checks, summary: summarise(checks) });\n });\n}\n","import type { Hono } from 'hono';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { loadConfig } from '../../core/config.js';\nimport { listStories } from '../../core/stories.js';\nimport { readFile } from '../../utils/fs.js';\nimport { buildCopyPlanPromptMarkdown } from '../../core/copy-plan-prompt.js';\n\nexport function mountCopyPlanPromptApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/copy-plan-prompt', (c) => {\n const feature = (c.req.query('feature') ?? '').trim();\n const storyId = (c.req.query('storyId') ?? '').trim();\n if (!feature || !storyId) {\n return c.json({ error: 'bad_request', detail: 'Query params `feature` and `storyId` are required.' }, 400);\n }\n const stories = listStories(opts.paths, { feature });\n const hit = stories.find((s) => s.feature === feature && s.id === storyId);\n if (!hit) {\n return c.json({ error: 'not_found', detail: `No story intake for feature \"${feature}\" and id \"${storyId}\".` }, 404);\n }\n const config = loadConfig(opts.paths.configFile);\n const intakeContent = readFile(hit.intakePath);\n const prompt = buildCopyPlanPromptMarkdown(config, intakeContent);\n const bytes = Buffer.byteLength(prompt, 'utf8');\n return c.json({\n prompt,\n feature: hit.feature,\n storyId: hit.id,\n bytes,\n estTokensApprox: Math.round(bytes / 4),\n });\n });\n}\n","import type { Hono } from 'hono';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { loadConfig } from '../../core/config.js';\nimport { listStories } from '../../core/stories.js';\nimport { readLastRun } from '../../core/last-run.js';\nimport { listRuns } from '../../core/runs.js';\n\nexport function mountDashboardApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/dashboard', async (c) => {\n const cfg = loadConfig(opts.paths.configFile);\n const lastRun = (await readLastRun(opts.paths)) ?? null;\n const runs = await listRuns(opts.paths);\n const stories = listStories(opts.paths);\n return c.json({\n version: '0.6.0',\n root: opts.paths.root,\n project: cfg.project,\n planner: cfg.planner ? { provider: cfg.planner.provider, enabled: cfg.planner.enabled } : null,\n tracker: { type: cfg.tracker.type },\n lastRun,\n runs: runs.map((r) => ({\n runId: r.runId,\n startedAt: r.startedAt,\n durationMs: r.durationMs,\n success: r.success,\n partial: r.partial,\n inputTokens: r.stats.inputTokens,\n outputTokens: r.stats.outputTokens,\n cacheHitRatio: r.stats.cacheHitRatio,\n })),\n storyCounts: countStories(stories),\n stories: stories.map((s) => ({\n feature: s.feature,\n id: s.id,\n intakePath: s.intakePath,\n storyDir: s.storyDir,\n planFile: s.planFile ?? null,\n titleHint: s.titleHint ?? null,\n })),\n });\n });\n}\n\nfunction countStories(stories: ReturnType<typeof listStories>) {\n const total = stories.length;\n const planned = stories.filter((s) => !!s.planFile).length;\n return { total, planned, unplanned: total - planned };\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { Hono } from 'hono';\nimport type { SquadPaths } from '../../core/paths.js';\n\ninterface RecentProject {\n root: string;\n lastOpenedAt: string;\n}\n\nconst MAX = 10;\n\nfunction recentFilePath(): string {\n return path.join(os.homedir(), '.squad', 'recent-projects.json');\n}\n\nasync function loadRecent(): Promise<RecentProject[]> {\n const RECENT_FILE = recentFilePath();\n try {\n const raw = await fs.readFile(RECENT_FILE, 'utf8');\n const parsed = JSON.parse(raw) as RecentProject[];\n return Array.isArray(parsed) ? parsed.slice(0, MAX) : [];\n } catch {\n return [];\n }\n}\n\nasync function saveRecent(list: RecentProject[]): Promise<void> {\n const RECENT_FILE = recentFilePath();\n await fs.mkdir(path.dirname(RECENT_FILE), { recursive: true });\n await fs.writeFile(RECENT_FILE, JSON.stringify(list.slice(0, MAX), null, 2) + '\\n', 'utf8');\n}\n\nexport function mountProjectsApi(app: Hono, opts: { paths: SquadPaths }): void {\n app.get('/api/projects/recent', async (c) => c.json(await loadRecent()));\n\n app.post('/api/projects/touch', async (c) => {\n const list = await loadRecent();\n const filtered = list.filter((p) => p.root !== opts.paths.root);\n filtered.unshift({ root: opts.paths.root, lastOpenedAt: new Date().toISOString() });\n await saveRecent(filtered);\n return c.json({ ok: true });\n });\n}\n","import type { Hono } from 'hono';\nimport type { SquadPaths } from '../../core/paths.js';\nimport { mountStoriesApi } from './stories.js';\nimport { mountPlansApi } from './plans.js';\nimport { mountConfigApi } from './config.js';\nimport { mountMetaApi } from './meta.js';\nimport { mountRunsApi } from './runs.js';\nimport { mountSecretsApi } from './secrets.js';\nimport { mountTrackerApi } from './tracker.js';\nimport { mountDoctorApi } from './doctor.js';\nimport { mountCopyPlanPromptApi } from './copy-plan-prompt.js';\nimport { mountDashboardApi } from './dashboard.js';\nimport { mountProjectsApi } from './projects.js';\n\nexport interface MountApiOptions {\n paths: SquadPaths;\n}\n\nexport function mountApi(app: Hono, opts: MountApiOptions): void {\n mountMetaApi(app, opts);\n mountDashboardApi(app, opts);\n mountProjectsApi(app, opts);\n mountStoriesApi(app, opts);\n mountPlansApi(app, opts);\n mountConfigApi(app, opts);\n mountRunsApi(app, opts);\n mountSecretsApi(app, opts);\n mountTrackerApi(app, opts);\n mountDoctorApi(app, opts);\n mountCopyPlanPromptApi(app, opts);\n}\n","import fs from 'node:fs';\nimport type { IncomingMessage } from 'node:http';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Readable } from 'node:stream';\nimport type { Context, Hono } from 'hono';\nimport type { SquadPaths } from '../core/paths.js';\n\n/** Passed by `@hono/node-server` as `c.env` (second argument to `app.fetch`). */\ntype NodeServerEnv = { incoming?: IncomingMessage };\n\nfunction pathnameForStatic(c: Context): string {\n const rawUrl = (c.env as NodeServerEnv).incoming?.url;\n if (typeof rawUrl === 'string' && rawUrl.startsWith('/')) {\n const pathOnly = rawUrl.split('?', 1)[0] ?? rawUrl;\n try {\n return decodeURIComponent(pathOnly);\n } catch {\n return pathOnly;\n }\n }\n try {\n return decodeURIComponent(new URL(c.req.url).pathname);\n } catch {\n return new URL(c.req.url).pathname;\n }\n}\n\nexport interface MountStaticOptions {\n paths: SquadPaths;\n}\n\nexport function mountStaticAssets(app: Hono, _opts: MountStaticOptions): void {\n const distDir = resolveConsoleUiDist();\n\n app.get('/logo.svg', (c) => serveFile(c, distDir, 'logo.svg', 'image/svg+xml'));\n app.get('/favicon.ico', (c) => serveFile(c, distDir, 'favicon.ico', 'image/x-icon'));\n\n app.get('*', (c) => {\n const pathname = pathnameForStatic(c);\n\n if (pathname.startsWith('/assets/')) {\n return assetResponse(c, distDir, pathname);\n }\n\n if (c.req.path.startsWith('/api/') || c.req.path.startsWith('/healthz')) return c.notFound();\n if (!distDir) return c.text('UI not built. Run `pnpm -C console-ui build`.', 404);\n const indexHtml = path.join(distDir, 'index.html');\n if (!fs.existsSync(indexHtml)) return c.text('UI not built', 404);\n return c.html(fs.readFileSync(indexHtml, 'utf8'), 200, { 'cache-control': 'no-store' });\n });\n}\n\nfunction assetResponse(c: Context, distDir: string | null, pathname: string): Response {\n if (!distDir) return c.text('UI not built', 404);\n const rel = pathname.replace(/^\\//, '');\n const abs = path.normalize(path.join(distDir, rel));\n if (!isInside(abs, distDir)) return c.text('forbidden', 403);\n if (!fs.existsSync(abs) || !fs.statSync(abs).isFile()) return c.text('not found', 404);\n const body = Readable.toWeb(fs.createReadStream(abs)) as ReadableStream;\n return new Response(body, {\n headers: {\n 'content-type': contentTypeFor(abs),\n 'cache-control': 'public, max-age=31536000, immutable',\n },\n });\n}\n\nfunction serveFile(c: Context, distDir: string | null, name: string, ct: string) {\n if (!distDir) return c.text('UI not built', 404);\n const abs = path.join(distDir, name);\n if (!fs.existsSync(abs)) return c.text('not found', 404);\n return new Response(fs.readFileSync(abs), {\n headers: { 'content-type': ct, 'cache-control': 'public, max-age=86400' },\n });\n}\n\nfunction contentTypeFor(p: string): string {\n if (p.endsWith('.js')) return 'application/javascript; charset=utf-8';\n if (p.endsWith('.css')) return 'text/css; charset=utf-8';\n if (p.endsWith('.html')) return 'text/html; charset=utf-8';\n if (p.endsWith('.svg')) return 'image/svg+xml';\n if (p.endsWith('.png')) return 'image/png';\n if (p.endsWith('.woff2')) return 'font/woff2';\n if (p.endsWith('.json')) return 'application/json';\n return 'application/octet-stream';\n}\n\nfunction isInside(abs: string, parent: string): boolean {\n const a = path.resolve(abs) + path.sep;\n const p = path.resolve(parent) + path.sep;\n return a.startsWith(p);\n}\n\nfunction resolveConsoleUiDist(): string | null {\n const fromEnv = process.env.SQUAD_CONSOLE_UI_DIST;\n if (fromEnv && fs.existsSync(path.join(fromEnv, 'index.html'))) return fromEnv;\n\n // `import.meta.url` is either dist/cli.js (published bundle) or src/console/static-assets.ts (tsx dev).\n const candidates = [\n fileURLToPath(new URL('./console-ui/', import.meta.url)), // dist/cli.js → dist/console-ui/\n fileURLToPath(new URL('../../dist/console-ui/', import.meta.url)), // src/console/*.ts → project/dist/console-ui/\n fileURLToPath(new URL('../console-ui/dist/', import.meta.url)), // dist/cli.js → project/console-ui/dist\n fileURLToPath(new URL('../../console-ui/dist/', import.meta.url)), // src/console/*.ts → project/console-ui/dist\n ];\n for (const c of candidates) {\n if (fs.existsSync(path.join(c, 'index.html'))) return c;\n }\n return null;\n}\n","import type { MiddlewareHandler } from 'hono';\n\n/**\n * Token gate for /api/* routes.\n *\n * Accepts the token via:\n * - `Authorization: Bearer <token>` (preferred; used by `fetch`).\n * - `?t=<token>` query string (used by `EventSource`, which can't set headers).\n *\n * Constant-time compare to avoid timing oracles on guess attempts.\n */\nexport function authMiddleware(expected: string): MiddlewareHandler {\n return async (c, next) => {\n const presented = readPresentedToken(c.req.raw);\n if (!presented || !timingSafeEqualHex(presented, expected)) {\n return c.json({ error: 'unauthorized', detail: 'missing or invalid session token' }, 401);\n }\n await next();\n };\n}\n\nexport function readPresentedToken(req: Request): string | null {\n const auth = req.headers.get('authorization');\n if (auth && auth.toLowerCase().startsWith('bearer ')) {\n return auth.slice('bearer '.length).trim();\n }\n const url = new URL(req.url);\n return url.searchParams.get('t');\n}\n\nexport function timingSafeEqualHex(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let mismatch = 0;\n for (let i = 0; i < a.length; i += 1) {\n mismatch |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return mismatch === 0;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { listAllStories } from '../../core/stories.js';\nimport type { StoryRecord } from '../../core/stories.js';\nimport {\n canPromptForRm,\n countOverviewDataRows,\n featureStoriesDirEmpty,\n pickStoryInteractive,\n renderPreview,\n resolveStoryFromArg,\n type RmBaseOptions,\n} from './shared.js';\nimport { deleteStoryRecord } from '../../core/story-mutations.js';\nimport { runRmFeature } from './feature.js';\n\nexport interface RmStoryOptions extends RmBaseOptions {}\n\nexport async function runRmStory(storyPathOrId: string | undefined, opts: RmStoryOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const dryRun = !!opts.dryRun;\n const useTrash = !!opts.trash;\n const yes = !!opts.yes;\n const featureFilter = opts.feature?.trim() || undefined;\n\n const stories = listAllStories(paths).filter((s) => !featureFilter || s.feature === featureFilter);\n\n if (stories.length === 0) {\n ui.info('No stories to delete. Create one with `squad new-story`.');\n return;\n }\n\n const canPrompt = canPromptForRm({ yes });\n let story: StoryRecord | undefined;\n\n if (storyPathOrId?.trim()) {\n story = resolveStoryFromArg(storyPathOrId, stories, root);\n if (!story) {\n throw new Error(\n `\"${storyPathOrId.trim()}\" did not match any story. Run \\`squad rm story\\` without arguments to pick from a list, or \\`squad list\\` to see all stories.`,\n );\n }\n } else {\n if (stories.length === 1) {\n story = stories[0]!;\n } else if (!canPrompt) {\n throw new Error(\n 'Usage: squad rm story <path-or-id> — run `squad rm story` in a TTY to pick, or pass a path/id with `-y` to skip the confirmation once a target is chosen.',\n );\n } else {\n story = await pickStoryInteractive(paths, featureFilter);\n }\n }\n\n const targets: Array<{ label: string; absPath: string; kind: 'dir' | 'file' }> = [\n { label: path.relative(root, story.storyDir), absPath: story.storyDir, kind: 'dir' },\n ];\n if (story.planFile) {\n const planAbs = path.join(paths.plansDir, story.feature, story.planFile);\n targets.push({ label: path.relative(root, planAbs), absPath: planAbs, kind: 'file' });\n }\n\n renderPreview('story', targets, {\n dryRun,\n trash: useTrash,\n trashRoot: paths.trashDir,\n });\n\n if (dryRun) {\n ui.info('Dry run: no changes applied. Re-run without --dry-run to delete.');\n return;\n }\n\n if (!yes) {\n if (!canPrompt) {\n throw new Error(\n 'Pass --yes to confirm deletion in a non-interactive environment, or run `squad rm story` in a TTY to confirm the prompt interactively.',\n );\n }\n const ok = await confirm({ message: 'Delete this story and related plan/overview row?', default: false });\n if (!ok) {\n ui.info('Cancelled.');\n return;\n }\n }\n\n const result = deleteStoryRecord({ paths, story, trash: useTrash });\n\n if (result.trashed) {\n ui.success(`Removed (moved to ${path.relative(root, result.trashed)}).`);\n } else {\n ui.success('Removed story folder, plan file (if any), and overview row.');\n }\n\n const featurePlanDir = path.join(paths.plansDir, story.feature);\n const overviewPath = path.join(featurePlanDir, '00-overview.md');\n if (fs.existsSync(overviewPath)) {\n const body = fs.readFileSync(overviewPath, 'utf8');\n const onlyShell = countOverviewDataRows(body) === 0;\n if (onlyShell && featureStoriesDirEmpty(paths, story.feature)) {\n if (canPrompt) {\n const also = await confirm({\n message: `Feature \"${story.feature}\" has no stories left and an empty overview table. Remove the whole feature with \\`squad rm feature ${story.feature}\\` now?`,\n default: false,\n });\n if (also) {\n await runRmFeature(story.feature, { dryRun: false, trash: useTrash, yes: true });\n return;\n }\n } else {\n ui.info(`Feature \"${story.feature}\" has no stories under .squad/stories/ and no overview rows. Run \\`squad rm feature ${story.feature}\\` to remove the feature directories.`);\n }\n }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { listFeatures } from '../../core/stories.js';\nimport { listAllPlanListEntries, canPromptForRm, pickFeatureInteractive, trashOrDelete, type RmBaseOptions } from './shared.js';\n\nfunction countStoryDirs(storiesDir: string, feature: string): number {\n const d = path.join(storiesDir, feature);\n if (!fs.existsSync(d)) return 0;\n return fs.readdirSync(d, { withFileTypes: true }).filter((x) => x.isDirectory()).length;\n}\n\nexport interface RmFeatureOptions extends RmBaseOptions {}\n\nexport async function runRmFeature(featureSlug: string | undefined, opts: RmFeatureOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const dryRun = !!opts.dryRun;\n const useTrash = !!opts.trash;\n const yes = !!opts.yes;\n const canPrompt = canPromptForRm({ yes });\n\n const feats = listFeatures(paths);\n if (feats.length === 0) {\n ui.info('No feature directories found under .squad/stories/.');\n return;\n }\n\n let feature: string;\n if (featureSlug?.trim()) {\n const t = featureSlug.trim();\n if (!feats.includes(t)) {\n throw new Error(\n `No feature \"${t}\" found. Run \\`squad list\\` or \\`squad rm feature\\` without arguments to pick a feature.`,\n );\n }\n feature = t;\n } else {\n if (feats.length === 1) {\n feature = feats[0]!;\n } else if (!canPrompt) {\n throw new Error(\n 'This command removes an entire feature. Run `squad rm feature <slug> --yes` in CI, or `squad rm feature` in a TTY to pick a feature interactively.',\n );\n } else {\n feature = await pickFeatureInteractive(paths);\n }\n }\n\n const storyDir = path.join(paths.storiesDir, feature);\n const planDir = path.join(paths.plansDir, feature);\n const nStories = countStoryDirs(paths.storiesDir, feature);\n const nPlans = listAllPlanListEntries(paths, feature).length;\n const hasOverview = fs.existsSync(path.join(planDir, '00-overview.md')) ? 1 : 0;\n\n const targets: Array<{ label: string; absPath: string; kind: 'dir' | 'file' }> = [];\n if (fs.existsSync(storyDir)) {\n targets.push({ label: path.relative(root, storyDir), absPath: storyDir, kind: 'dir' });\n }\n if (fs.existsSync(planDir)) {\n targets.push({ label: path.relative(root, planDir), absPath: planDir, kind: 'dir' });\n }\n\n ui.divider('squad rm feature');\n ui.info(`Feature: ${feature}`);\n ui.info(`Delete: ${nStories} stories, ${nPlans} plans, ${hasOverview} overview file`);\n ui.info('Paths:');\n for (const t of targets) {\n ui.line(` ${t.label}/`);\n }\n ui.blank();\n ui.step(dryRun ? 'Dry run — nothing will be changed.' : 'About to remove:');\n for (const t of targets) {\n ui.kv(t.kind, t.label, 6);\n }\n if (useTrash) {\n ui.info(`Items will move to ${path.relative(process.cwd(), paths.trashDir)}/<timestamp>/`);\n } else if (!dryRun) {\n ui.warning('This is a permanent delete. Pass --trash to move to .squad/.trash/ instead.');\n }\n\n if (dryRun) {\n ui.info('Dry run: no changes applied. Re-run without --dry-run to delete.');\n return;\n }\n\n if (targets.length === 0) {\n ui.info('Nothing to remove for this feature.');\n return;\n }\n\n if (!yes) {\n if (!canPrompt) {\n throw new Error(\n 'This command removes an entire feature. Run `squad rm feature --yes` in CI, or `squad rm feature` in a TTY to confirm the prompt interactively.',\n );\n }\n const ok = await confirm({\n message: `Delete all of feature \"${feature}\" (stories + plans)?`,\n default: false,\n });\n if (!ok) {\n ui.info('Cancelled.');\n return;\n }\n }\n\n const result = trashOrDelete(\n targets.map((t) => t.absPath),\n paths.trashDir,\n useTrash,\n );\n\n if (result.trashed) {\n ui.success(`Feature removed. Items moved to ${path.relative(root, result.trashed)}.`);\n } else {\n ui.success('Feature removed (stories and plans directories).');\n }\n ui.info('Run `squad doctor` to confirm the workspace is in a clean state.');\n}\n","import path from 'node:path';\nimport { confirm } from '@inquirer/prompts';\nimport * as ui from '../../ui/index.js';\nimport { buildPaths, requireSquadRoot } from '../../core/paths.js';\nimport { listStories } from '../../core/stories.js';\nimport {\n canPromptForRm,\n listAllPlanListEntries,\n pickPlanInteractive,\n removeOverviewRowForPlanFile,\n renderPreview,\n resolvePlanFromArg,\n trashOrDelete,\n type PlanListEntry,\n type RmBaseOptions,\n} from './shared.js';\n\nexport interface RmPlanOptions extends RmBaseOptions {}\n\nexport async function runRmPlan(planPathOrSequence: string | undefined, opts: RmPlanOptions = {}): Promise<void> {\n const root = requireSquadRoot();\n const paths = buildPaths(root);\n const dryRun = !!opts.dryRun;\n const useTrash = !!opts.trash;\n const yes = !!opts.yes;\n const featureFilter = opts.feature?.trim() || undefined;\n\n const allPlans = listAllPlanListEntries(paths, featureFilter);\n if (allPlans.length === 0) {\n ui.info('No plan files to delete. Run `squad new-plan` to generate one.');\n return;\n }\n\n const canPrompt = canPromptForRm({ yes });\n let plan: PlanListEntry | undefined;\n\n if (planPathOrSequence?.trim()) {\n plan = resolvePlanFromArg(planPathOrSequence, paths, featureFilter);\n if (!plan) {\n throw new Error(\n `Could not find a plan matching \"${planPathOrSequence.trim()}\". Run \\`squad rm plan\\` without arguments to pick from a list.`,\n );\n }\n } else {\n if (allPlans.length === 1) {\n plan = allPlans[0]!;\n } else if (!canPrompt) {\n throw new Error(\n 'Usage: squad rm plan <path|NN> — run `squad rm plan` in a TTY to pick, or pass `squad rm plan <path|NN> --yes` in CI.',\n );\n } else {\n plan = await pickPlanInteractive(paths, featureFilter);\n }\n }\n\n const storyRows = listStories(paths, { feature: plan.feature });\n const linked = storyRows.find((s) => s.planFile === plan.file);\n\n const targets = [{ label: path.relative(root, plan.abs), absPath: plan.abs, kind: 'file' as const }];\n renderPreview('plan', targets, {\n dryRun,\n trash: useTrash,\n trashRoot: paths.trashDir,\n });\n\n if (dryRun) {\n ui.info('Dry run: no changes applied. Re-run without --dry-run to delete.');\n return;\n }\n\n if (!yes) {\n if (!canPrompt) {\n throw new Error(\n 'Pass --yes to confirm deletion in a non-interactive environment, or run `squad rm plan` in a TTY.',\n );\n }\n const ok = await confirm({ message: 'Delete this plan file only? (intake and config are kept.)', default: false });\n if (!ok) {\n ui.info('Cancelled.');\n return;\n }\n }\n\n trashOrDelete([plan.abs], paths.trashDir, useTrash);\n removeOverviewRowForPlanFile(path.join(paths.plansDir, plan.feature), plan.file);\n\n const intakeHint = linked\n ? path.relative(root, linked.intakePath)\n : `under .squad/stories/${plan.feature}/`;\n ui.success(`Plan removed. Run \\`squad new-plan ${intakeHint}\\` to regenerate.`);\n}\n"],"mappings":"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","names":["boxen","boxen","fs","path","input","select","confirm","password","input","fs","path","next","fs","path","config","fs","fs","path","yaml","fs","fs","path","fs","config","config","fs","fs","confirm","password","config","fs","config","fs","config","fs","confirm","password","fs","select","fs","path","stripHtml","config","config","fs","select","fs","confirm","config","confirm","fs","fs","confirm","confirm","fs","path","fs","select","input","confirm","password","config","fs","path","input","select","fs","path","line","fs","path","config","path","fs","fs","path","fs","path","select","fs","path","STORY_FILE","path","fs","line","select","input","config","path","fs","select","input","config","path","fs","fs","path","confirm","select","resolve","path","fs","path","input","base","API_URL","mapStop","mapStop","fs","path","resolve","input","line","fs","path","walk","fs","path","config","input","path","fs","line","config","fs","path","config","path","fs","select","confirm","success","fs","config","error","fs","path","path","fs","path","input","select","config","select","input","path","fs","fs","path","fs","path","config","error","fs","path","confirm","fs","path","confirm","spawn","process","confirm","fs","path","path","fs","path","process","process","info","confirm","resolve","spawn","randomBytes","fs","path","fs","fs","path","z","z","safeFeatureParam","path","fs","z","z","config","config","z","path","fs","z","fs","path","resolve","z","z","z","z","error","config","fs","path","fs","path","fileURLToPath","isInside","resolve","randomBytes","fs","path","confirm","fs","path","confirm","path","fs","confirm","path","confirm","fs","path","confirm","path","confirm"]}