squad-kit 0.2.1 → 0.3.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/CHANGELOG.md +82 -1
- package/README.md +21 -7
- package/dist/cli.js +857 -353
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
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/providers/anthropic.ts","../src/planner/providers/openai.ts","../src/planner/providers/google.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/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.2.1');\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/';\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 if (text.includes(SQUAD_SECRETS_PATTERN) && text.includes(SQUAD_TRASH_PATTERN)) {\n return false;\n }\n\n if (text.includes(SQUAD_SECRETS_PATTERN) && !text.includes(SQUAD_TRASH_PATTERN)) {\n let next = text;\n if (next.includes(SQUAD_ATTACHMENTS_PATTERN + '\\n')) {\n next = next.replace(\n SQUAD_ATTACHMENTS_PATTERN + '\\n',\n SQUAD_ATTACHMENTS_PATTERN + '\\n' + SQUAD_TRASH_PATTERN + '\\n',\n );\n } else if (next.includes(MANAGED_BLOCK_FOOTER)) {\n next = next.replace(MANAGED_BLOCK_FOOTER, SQUAD_TRASH_PATTERN + '\\n' + MANAGED_BLOCK_FOOTER);\n } else {\n next = next.replace(/\\n?$/, (m) => m + SQUAD_TRASH_PATTERN + '\\n');\n }\n if (next !== text) {\n fs.writeFileSync(file, next, 'utf8');\n return true;\n }\n }\n\n if (!text.includes(SQUAD_SECRETS_PATTERN)) {\n const block = [\n '',\n MANAGED_BLOCK_HEADER,\n SQUAD_SECRETS_PATTERN,\n SQUAD_ATTACHMENTS_PATTERN,\n SQUAD_TRASH_PATTERN,\n MANAGED_BLOCK_FOOTER,\n '',\n ].join('\\n');\n\n const next =\n text.length === 0\n ? block.trimStart()\n : text.endsWith('\\n')\n ? text + block\n : text + '\\n' + block;\n\n fs.writeFileSync(file, next, 'utf8');\n return true;\n }\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 };\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?.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, input, 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 wantOverride = await confirm({\n message: 'Set a custom plan-phase model id (planner.modelOverride)?',\n default: false,\n });\n if (wantOverride) {\n const modelId = await input({\n message: 'Plan model id (leave empty to use the default for this provider):',\n default: '',\n });\n if (modelId.trim().length > 0 && nextPlanner) {\n nextPlanner = {\n ...nextPlanner,\n modelOverride: { ...(nextPlanner.modelOverride ?? {}), [provider]: modelId.trim() },\n };\n }\n }\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 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","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 };\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 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","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 [/ /g, ' '] as const,\n [/&/g, '&'] as const,\n [/</g, '<'] as const,\n [/>/g, '>'] as const,\n [/"/g, '\"'] as const,\n [/'/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(/ /g, ' ')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/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';\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\n const result = await runPlanner({\n root: paths.root,\n provider,\n model,\n apiKey,\n systemPrompt,\n userPrompt,\n budget,\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 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: '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 printModelBanner(config);\n\n process.stdout.write(composed);\n if (!composed.endsWith('\\n')) process.stdout.write('\\n');\n\n if (clipboard) {\n const ok = await copyToClipboard(composed);\n if (ok) ui.info('copied to clipboard');\n }\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 } from 'node:child_process';\n\nexport async function copyToClipboard(text: string): Promise<boolean> {\n const cmd = clipboardCommand();\n if (!cmd) return false;\n return new Promise((resolve) => {\n const child = spawn(cmd.command, cmd.args, { stdio: ['pipe', 'ignore', 'ignore'] });\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n child.stdin.write(text);\n child.stdin.end();\n });\n}\n\nfunction clipboardCommand(): { command: string; args: string[] } | null {\n if (process.platform === 'darwin') return { command: 'pbcopy', args: [] };\n if (process.platform === 'win32') return { command: 'clip', args: [] };\n if (process.env.WAYLAND_DISPLAY) return { command: 'wl-copy', args: [] };\n if (process.env.DISPLAY) return { command: 'xclip', args: ['-selection', 'clipboard'] };\n return null;\n}\n","import path from 'node:path';\nimport type {\n ChatTurn,\n PlannerProvider,\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';\n\n/** Upper bound on the auto-retry wait. Provider can ask for more, but we never block longer. */\nconst MAX_RATE_LIMIT_RETRY_SEC = 30;\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 /** 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}\n\nexport async function runPlanner(input: RunPlannerInput): Promise<RunPlannerOutput> {\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\n while (iterations < maxIter) {\n iterations += 1;\n\n if (input.budget.timedOut()) {\n return { planText: accumulatedText, budgetExhausted, timedOut: true, finishedNormally: false, iterations };\n }\n if (input.budget.overCost()) {\n return { planText: accumulatedText, budgetExhausted: true, timedOut: false, finishedNormally: false, 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: 8192,\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 if (response.stopReason === 'error' && response.errorKind === 'rate_limit') {\n const waitSec = Math.min(response.retryAfterSec ?? 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 if (response.stopReason === 'error') {\n throw composePlannerError(input.provider.name, response, retriedRateLimit);\n }\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 { planText: accumulatedText, budgetExhausted, timedOut: false, finishedNormally: false, iterations };\n }\n\n if (response.stopReason === 'end_turn' || !response.toolCalls?.length) {\n finishedNormally = true;\n return { planText: accumulatedText, budgetExhausted, timedOut: false, finishedNormally, iterations };\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 { planText: accumulatedText, budgetExhausted, timedOut: false, finishedNormally: false, iterations };\n}\n\nexport function relativisePath(root: string, p: string): string {\n return path.relative(root, p) || p;\n}\n\nfunction composePlannerError(\n providerName: PlannerProvider['name'],\n response: ProviderResponse,\n retriedRateLimit: boolean,\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 }),\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\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 retried = 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","import type {\n ChatTurn,\n PlannerProvider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n ToolSchema,\n} from '../types.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\nexport const anthropicProvider: PlannerProvider = {\n name: 'anthropic',\n async send(req) {\n return callAnthropic(req);\n },\n};\n\nexport async function callAnthropic(req: ProviderRequest): Promise<ProviderResponse> {\n const body = {\n model: req.model,\n max_tokens: req.maxOutputTokens ?? 4096,\n system: req.systemPrompt,\n tools: req.tools.map(toAnthropicTool),\n messages: req.turns.map(toAnthropicMessage),\n };\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 },\n };\n}\n\nfunction toAnthropicTool(t: ToolSchema) {\n return { name: t.name, description: t.description, input_schema: t.inputSchema };\n}\n\nfunction toAnthropicMessage(turn: ChatTurn) {\n const blocks: unknown[] = [];\n if (turn.text) blocks.push({ type: 'text', text: turn.text });\n if (turn.toolCalls)\n for (const tc of turn.toolCalls) blocks.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.input });\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 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?: { input_tokens: number; output_tokens: number };\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 {\n detectModelNotFound,\n detectRateLimit,\n modelNotFoundMessage,\n} from '../provider-errors.js';\n\nconst API_URL = 'https://api.openai.com/v1/chat/completions';\n\nexport const openaiProvider: PlannerProvider = {\n name: 'openai',\n async send(req) {\n return callOpenAI(req);\n },\n};\n\nexport async function callOpenAI(req: ProviderRequest): Promise<ProviderResponse> {\n const messages: unknown[] = [{ role: 'system', content: req.systemPrompt }];\n for (const turn of req.turns) messages.push(...toOpenAIMessages(turn));\n\n const body = {\n model: req.model,\n messages,\n tools: req.tools.map(toOpenAITool),\n max_completion_tokens: req.maxOutputTokens ?? 4096,\n };\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 { type: 'function', function: { name: t.name, description: t.description, parameters: t.inputSchema } };\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: { name: tc.name, arguments: JSON.stringify(tc.input) },\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 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 {\n detectModelNotFound,\n detectRateLimit,\n modelNotFoundMessage,\n} from '../provider-errors.js';\n\nconst API_BASE = 'https://generativelanguage.googleapis.com/v1beta/models';\n\nexport const googleProvider: PlannerProvider = {\n name: 'google',\n async send(req) {\n return callGoogle(req);\n },\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 body = {\n system_instruction: { parts: [{ text: req.systemPrompt }] },\n contents: req.turns.map(toGoogleContent),\n tools: req.tools.length ? [{ functionDeclarations: req.tools.map(toGoogleTool) }] : undefined,\n generationConfig: { maxOutputTokens: req.maxOutputTokens ?? 4096 },\n };\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 ?? {},\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: t.inputSchema };\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) parts.push({ functionCall: { name: tc.name, args: tc.input } });\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 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 };\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 }\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';\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}\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';\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 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('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.info('Run `squad doctor` to verify.');\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","fs","path","config","fs","fs","path","yaml","fs","fs","path","fs","config","config","fs","fs","confirm","input","password","config","fs","config","fs","config","fs","confirm","password","input","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","input","API_URL","mapStop","mapStop","fs","path","walk","fs","path","fs","path","STORY_FILE","input","config","path","fs","line","config","path","fs","select","confirm","fs","config","error","fs","path","path","fs","path","input","select","config","select","input","path","fs","fs","path","fs","path","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/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 [/ /g, ' '] as const,\n [/&/g, '&'] as const,\n [/</g, '<'] as const,\n [/>/g, '>'] as const,\n [/"/g, '\"'] as const,\n [/'/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(/ /g, ' ')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/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"]}
|