bumblebee-cli 0.1.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/dist/index.js +4214 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -28
- package/templates/skills/bb-agent/SKILL.md +180 -0
- package/templates/skills/bb-agent/references/bb-commands.md +124 -0
- package/templates/skills/bb-agent/references/investigate-workflow.md +150 -0
- package/templates/skills/bb-agent/references/parallel-workflow.md +105 -0
- package/templates/skills/bb-agent/references/prompts.md +144 -0
- package/templates/skills/bb-agent/references/status-transitions.md +93 -0
- package/templates/skills/bb-agent/references/workflow.md +178 -0
- package/README.md +0 -47
- package/bin/bb.mjs +0 -132
- package/python/bb_cli/__init__.py +0 -0
- package/python/bb_cli/api_client.py +0 -38
- package/python/bb_cli/bumblebee_cli.egg-info/PKG-INFO +0 -9
- package/python/bb_cli/bumblebee_cli.egg-info/SOURCES.txt +0 -21
- package/python/bb_cli/bumblebee_cli.egg-info/dependency_links.txt +0 -1
- package/python/bb_cli/bumblebee_cli.egg-info/entry_points.txt +0 -2
- package/python/bb_cli/bumblebee_cli.egg-info/requires.txt +0 -4
- package/python/bb_cli/bumblebee_cli.egg-info/top_level.txt +0 -5
- package/python/bb_cli/commands/__init__.py +0 -0
- package/python/bb_cli/commands/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/agent.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/auth.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/board.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/comment.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/init.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/item.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/label.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/project.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/sprint.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/story.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/__pycache__/task.cpython-313.pyc +0 -0
- package/python/bb_cli/commands/agent.py +0 -1030
- package/python/bb_cli/commands/auth.py +0 -79
- package/python/bb_cli/commands/board.py +0 -47
- package/python/bb_cli/commands/comment.py +0 -34
- package/python/bb_cli/commands/init.py +0 -62
- package/python/bb_cli/commands/item.py +0 -192
- package/python/bb_cli/commands/label.py +0 -43
- package/python/bb_cli/commands/project.py +0 -111
- package/python/bb_cli/commands/sprint.py +0 -84
- package/python/bb_cli/config.py +0 -136
- package/python/bb_cli/main.py +0 -44
- package/python/pyproject.toml +0 -18
- package/scripts/build.sh +0 -20
- package/scripts/postinstall.mjs +0 -146
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/api-client.ts","../src/config.ts","../src/lib/utils.ts","../src/commands/project.ts","../src/commands/item.ts","../src/commands/comment.ts","../src/commands/sprint.ts","../src/commands/label.ts","../src/commands/board.ts","../src/commands/doctor.ts","../src/commands/init.ts","../src/lib/ide-setup.ts","../src/commands/agent/index.ts","../src/commands/agent/suggest.ts","../src/lib/claude-runner.ts","../src/lib/agent-streamer.ts","../src/lib/prompt-builder.ts","../src/lib/progress-tracker.ts","../src/commands/agent/execute.ts","../src/lib/git-worktree.ts","../src/commands/agent/test.ts","../src/commands/agent/verify.ts","../src/commands/agent/reimplement.ts","../src/lib/docker-runner.ts","../src/commands/agent/run.ts","../src/commands/agent/continue.ts","../src/commands/agent/split.ts","../src/commands/agent/integrate.ts","../src/commands/agent/merge.ts","../src/commands/agent/status.ts","../src/commands/agent/worktree.ts","../src/commands/agent/daemon.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { authCommand } from \"./commands/auth.js\";\r\nimport { projectCommand } from \"./commands/project.js\";\r\nimport { itemCommand } from \"./commands/item.js\";\r\nimport { commentCommand } from \"./commands/comment.js\";\r\nimport { sprintCommand } from \"./commands/sprint.js\";\r\nimport { labelCommand } from \"./commands/label.js\";\r\nimport { boardCommand } from \"./commands/board.js\";\r\nimport { doctorCommand } from \"./commands/doctor.js\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport { agentCommand } from \"./commands/agent/index.js\";\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name(\"bb\")\r\n .description(\"Bumblebee — Dev Task Management + Claude Code Automation CLI\")\r\n .version(\"0.3.0\");\r\n\r\n// Command groups\r\nprogram.addCommand(authCommand);\r\nprogram.addCommand(projectCommand);\r\nprogram.addCommand(itemCommand);\r\nprogram.addCommand(commentCommand);\r\nprogram.addCommand(sprintCommand);\r\nprogram.addCommand(labelCommand);\r\nprogram.addCommand(boardCommand);\r\nprogram.addCommand(doctorCommand);\r\nprogram.addCommand(initCommand);\r\nprogram.addCommand(agentCommand);\r\n\r\n// Top-level aliases for convenience\r\nprogram\r\n .command(\"login\")\r\n .description(\"Log in (alias for auth login)\")\r\n .option(\"-e, --email <email>\", \"Email address\")\r\n .option(\"-p, --password <password>\", \"Password\")\r\n .action(async (opts) => {\r\n // Delegate to auth login\r\n await program.parseAsync([\"auth\", \"login\", ...(opts.email ? [\"-e\", opts.email] : []), ...(opts.password ? [\"-p\", opts.password] : [])], { from: \"user\" });\r\n });\r\n\r\nprogram\r\n .command(\"logout\")\r\n .description(\"Log out (alias for auth logout)\")\r\n .action(async () => {\r\n await program.parseAsync([\"auth\", \"logout\"], { from: \"user\" });\r\n });\r\n\r\n// Global error handler\r\nprocess.on(\"unhandledRejection\", (err: any) => {\r\n console.error(`Error: ${err?.message ?? err}`);\r\n process.exit(1);\r\n});\r\n\r\nprogram.parse();\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport * as p from \"@clack/prompts\";\r\nimport { apiGet, apiPost } from \"../api-client.js\";\r\nimport {\r\n getApiUrl,\r\n getProjectPath,\r\n isLocalConfigActive,\r\n loadConfig,\r\n setToken,\r\n clearToken,\r\n getCurrentProject,\r\n} from \"../config.js\";\r\nimport { withErrorHandling } from \"../lib/utils.js\";\r\nimport type { LoginResponse, User } from \"../types.js\";\r\n\r\nexport const authCommand = new Command(\"auth\").description(\r\n \"Authentication commands\",\r\n);\r\n\r\n// ── login ────────────────────────────────────────────────────\r\n\r\nauthCommand\r\n .command(\"login\")\r\n .description(\"Log in to Bumblebee API\")\r\n .option(\"-e, --email <email>\", \"Email address\")\r\n .option(\"-p, --password <password>\", \"Password\")\r\n .action((opts) =>\r\n withErrorHandling(async () => {\r\n let { email, password } = opts;\r\n\r\n if (!email) {\r\n const value = await p.text({\r\n message: \"Email\",\r\n validate: (v) => (v.length === 0 ? \"Email is required\" : undefined),\r\n });\r\n if (p.isCancel(value)) {\r\n console.log(chalk.yellow(\"Cancelled.\"));\r\n process.exit(0);\r\n }\r\n email = value;\r\n }\r\n\r\n if (!password) {\r\n const value = await p.password({\r\n message: \"Password\",\r\n validate: (v) =>\r\n v.length === 0 ? \"Password is required\" : undefined,\r\n });\r\n if (p.isCancel(value)) {\r\n console.log(chalk.yellow(\"Cancelled.\"));\r\n process.exit(0);\r\n }\r\n password = value;\r\n }\r\n\r\n const data = await apiPost<LoginResponse>(\"/auth/login\", {\r\n email,\r\n password,\r\n });\r\n setToken(data.access_token);\r\n console.log(chalk.green(\"Logged in successfully.\"));\r\n }),\r\n );\r\n\r\n// ── register ─────────────────────────────────────────────────\r\n\r\nauthCommand\r\n .command(\"register\")\r\n .description(\"Register a new Bumblebee account\")\r\n .option(\"-e, --email <email>\", \"Email address\")\r\n .option(\"-u, --username <username>\", \"Username\")\r\n .option(\"-p, --password <password>\", \"Password\")\r\n .action((opts) =>\r\n withErrorHandling(async () => {\r\n let { email, username, password } = opts;\r\n\r\n if (!email) {\r\n const value = await p.text({\r\n message: \"Email\",\r\n validate: (v) => (v.length === 0 ? \"Email is required\" : undefined),\r\n });\r\n if (p.isCancel(value)) {\r\n console.log(chalk.yellow(\"Cancelled.\"));\r\n process.exit(0);\r\n }\r\n email = value;\r\n }\r\n\r\n if (!username) {\r\n const value = await p.text({\r\n message: \"Username\",\r\n validate: (v) =>\r\n v.length === 0 ? \"Username is required\" : undefined,\r\n });\r\n if (p.isCancel(value)) {\r\n console.log(chalk.yellow(\"Cancelled.\"));\r\n process.exit(0);\r\n }\r\n username = value;\r\n }\r\n\r\n if (!password) {\r\n const value = await p.password({\r\n message: \"Password\",\r\n validate: (v) =>\r\n v.length === 0 ? \"Password is required\" : undefined,\r\n });\r\n if (p.isCancel(value)) {\r\n console.log(chalk.yellow(\"Cancelled.\"));\r\n process.exit(0);\r\n }\r\n password = value;\r\n\r\n const confirm = await p.password({ message: \"Confirm password\" });\r\n if (p.isCancel(confirm)) {\r\n console.log(chalk.yellow(\"Cancelled.\"));\r\n process.exit(0);\r\n }\r\n if (confirm !== password) {\r\n console.error(chalk.red(\"Passwords do not match.\"));\r\n process.exit(1);\r\n }\r\n }\r\n\r\n await apiPost(\"/auth/register\", { email, username, password });\r\n console.log(\r\n chalk.green(`Registered! You can now run ${chalk.bold(\"bb login\")}.`),\r\n );\r\n }),\r\n );\r\n\r\n// ── logout ───────────────────────────────────────────────────\r\n\r\nauthCommand\r\n .command(\"logout\")\r\n .description(\"Clear saved credentials\")\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n clearToken();\r\n console.log(chalk.yellow(\"Logged out.\"));\r\n }),\r\n );\r\n\r\n// ── whoami ───────────────────────────────────────────────────\r\n\r\nauthCommand\r\n .command(\"whoami\")\r\n .description(\"Show current user info\")\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n const user = await apiGet<User>(\"/auth/me\");\r\n console.log(`${chalk.bold(user.username)} (${user.email})`);\r\n }),\r\n );\r\n\r\n// ── config ───────────────────────────────────────────────────\r\n\r\nauthCommand\r\n .command(\"config\")\r\n .description(\"Show current CLI configuration\")\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n const cfg = loadConfig();\r\n const slug = cfg.current_project as string | undefined;\r\n const configSource = isLocalConfigActive()\r\n ? \"local (.bumblebee/)\"\r\n : \"global (~/.bumblebee/)\";\r\n\r\n console.log(`Config source: ${configSource}`);\r\n console.log(`API URL: ${getApiUrl()}`);\r\n console.log(`Logged in: ${cfg.token ? \"Yes\" : \"No\"}`);\r\n console.log(`Current project: ${slug ?? \"None\"}`);\r\n\r\n if (slug) {\r\n const projectPath = getProjectPath(slug);\r\n console.log(`Source path: ${projectPath ?? chalk.dim(\"not linked\")}`);\r\n }\r\n\r\n const projects = (cfg.projects ?? {}) as Record<string, any>;\r\n const projectKeys = Object.keys(projects);\r\n if (projectKeys.length > 0) {\r\n console.log(`\\n${chalk.bold(\"Project paths:\")}`);\r\n for (const name of projectKeys) {\r\n console.log(` ${name} -> ${projects[name]?.path ?? \"?\"}`);\r\n }\r\n }\r\n }),\r\n );\r\n","import { ofetch, type FetchOptions } from \"ofetch\";\r\nimport { getApiUrl, getToken } from \"./config.js\";\r\n\r\nfunction createClient() {\r\n return ofetch.create({\r\n baseURL: getApiUrl(),\r\n headers: (() => {\r\n const h: Record<string, string> = {};\r\n const token = getToken();\r\n if (token) h.Authorization = `Bearer ${token}`;\r\n return h;\r\n })(),\r\n timeout: 30_000,\r\n });\r\n}\r\n\r\nexport async function apiGet<T = any>(\r\n path: string,\r\n params?: Record<string, any>,\r\n): Promise<T> {\r\n return createClient()<T>(path, { method: \"GET\", query: params });\r\n}\r\n\r\nexport async function apiPost<T = any>(\r\n path: string,\r\n body?: Record<string, any>,\r\n params?: Record<string, any>,\r\n): Promise<T> {\r\n return createClient()<T>(path, {\r\n method: \"POST\",\r\n body,\r\n query: params,\r\n });\r\n}\r\n\r\nexport async function apiPut<T = any>(\r\n path: string,\r\n body: Record<string, any>,\r\n): Promise<T> {\r\n return createClient()<T>(path, { method: \"PUT\", body });\r\n}\r\n\r\nexport async function apiPatch<T = any>(\r\n path: string,\r\n body: Record<string, any>,\r\n): Promise<T> {\r\n return createClient()<T>(path, { method: \"PATCH\", body });\r\n}\r\n\r\nexport async function apiDelete(path: string): Promise<void> {\r\n await createClient()(path, { method: \"DELETE\" });\r\n}\r\n","import fs from \"node:fs\";\r\nimport os from \"node:os\";\r\nimport path from \"node:path\";\r\nimport TOML from \"@iarna/toml\";\r\n\r\n// ── Paths ───────────────────────────────────────────────────\r\n\r\nconst GLOBAL_CONFIG_DIR = path.join(os.homedir(), \".bumblebee\");\r\nconst GLOBAL_CONFIG_FILE = path.join(GLOBAL_CONFIG_DIR, \"config.toml\");\r\nconst LOCAL_DIR_NAME = \".bumblebee\";\r\nconst LOCAL_CONFIG_NAME = \"config.toml\";\r\n\r\nexport { GLOBAL_CONFIG_DIR, LOCAL_DIR_NAME, LOCAL_CONFIG_NAME };\r\n\r\n// ── Helpers ─────────────────────────────────────────────────\r\n\r\nfunction ensureConfigDir(): void {\r\n fs.mkdirSync(GLOBAL_CONFIG_DIR, { recursive: true });\r\n}\r\n\r\nexport function findProjectRoot(start?: string): string | null {\r\n let current = path.resolve(start ?? process.cwd());\r\n while (true) {\r\n if (fs.existsSync(path.join(current, LOCAL_DIR_NAME))) return current;\r\n if (fs.existsSync(path.join(current, \".git\"))) return current;\r\n const parent = path.dirname(current);\r\n if (parent === current) break;\r\n current = parent;\r\n }\r\n return null;\r\n}\r\n\r\nexport function getLocalConfigDir(): string | null {\r\n const root = findProjectRoot();\r\n if (root) {\r\n const dir = path.join(root, LOCAL_DIR_NAME);\r\n if (fs.existsSync(dir)) return dir;\r\n }\r\n return null;\r\n}\r\n\r\nexport function isLocalConfigActive(): boolean {\r\n return getLocalConfigDir() !== null;\r\n}\r\n\r\n// ── Load / Save ─────────────────────────────────────────────\r\n\r\nfunction loadToml(filePath: string): Record<string, any> {\r\n if (!fs.existsSync(filePath)) return {};\r\n const content = fs.readFileSync(filePath, \"utf-8\");\r\n return TOML.parse(content) as Record<string, any>;\r\n}\r\n\r\nfunction loadGlobalConfig(): Record<string, any> {\r\n return loadToml(GLOBAL_CONFIG_FILE);\r\n}\r\n\r\nexport function loadLocalConfig(): Record<string, any> {\r\n const dir = getLocalConfigDir();\r\n if (dir) {\r\n const file = path.join(dir, LOCAL_CONFIG_NAME);\r\n return loadToml(file);\r\n }\r\n return {};\r\n}\r\n\r\nexport function saveLocalConfig(data: Record<string, any>): void {\r\n const dir = getLocalConfigDir();\r\n if (!dir) throw new Error(\"No .bumblebee/ directory found. Run 'bb init' first.\");\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(path.join(dir, LOCAL_CONFIG_NAME), TOML.stringify(data as any));\r\n}\r\n\r\nexport function loadConfig(): Record<string, any> {\r\n const globalCfg = loadGlobalConfig();\r\n const localCfg = loadLocalConfig();\r\n delete localCfg.token; // never pull token from local config\r\n return { ...globalCfg, ...localCfg };\r\n}\r\n\r\nexport function saveConfig(data: Record<string, any>): void {\r\n ensureConfigDir();\r\n fs.writeFileSync(GLOBAL_CONFIG_FILE, TOML.stringify(data as any));\r\n}\r\n\r\n// ── Getters / Setters ───────────────────────────────────────\r\n\r\nexport function getApiUrl(): string {\r\n const env = process.env.BB_API_URL;\r\n if (env) return env;\r\n const cfg = loadConfig();\r\n return (cfg.api_url as string) ?? \"http://localhost:8000\";\r\n}\r\n\r\nexport function getToken(): string | null {\r\n const cfg = loadGlobalConfig();\r\n return (cfg.token as string) ?? null;\r\n}\r\n\r\nexport function setToken(token: string): void {\r\n const cfg = loadGlobalConfig();\r\n cfg.token = token;\r\n saveConfig(cfg);\r\n}\r\n\r\nexport function clearToken(): void {\r\n const cfg = loadGlobalConfig();\r\n delete cfg.token;\r\n saveConfig(cfg);\r\n}\r\n\r\nexport function getCurrentProject(): string | null {\r\n const cfg = loadConfig();\r\n return (cfg.current_project as string) ?? null;\r\n}\r\n\r\nexport function getProjectPath(slug?: string): string | null {\r\n const cfg = loadConfig();\r\n const target = slug ?? (cfg.current_project as string);\r\n if (!target) return null;\r\n const projects = (cfg.projects ?? {}) as Record<string, any>;\r\n return projects[target]?.path ?? null;\r\n}\r\n\r\nexport function setProjectPath(slug: string, projectPath: string): void {\r\n const cfg = loadGlobalConfig();\r\n if (!cfg.projects) cfg.projects = {};\r\n const projects = cfg.projects as Record<string, any>;\r\n if (!projects[slug]) projects[slug] = {};\r\n projects[slug].path = projectPath;\r\n saveConfig(cfg);\r\n}\r\n","import chalk from \"chalk\";\r\nimport { getCurrentProject, getProjectPath } from \"../config.js\";\r\nimport { apiGet } from \"../api-client.js\";\r\nimport type { WorkItem } from \"../types.js\";\r\n\r\n/** Ensure a project is selected, exit with message if not. */\r\nexport function requireProject(): string {\r\n const slug = getCurrentProject();\r\n if (!slug) {\r\n console.error(chalk.red(\"No project selected. Run 'bb project switch <slug>' first.\"));\r\n process.exit(1);\r\n }\r\n return slug;\r\n}\r\n\r\n/** Ensure project has a linked source path. */\r\nexport function requireProjectPath(slug: string): string {\r\n const p = getProjectPath(slug);\r\n if (!p) {\r\n console.error(chalk.red(\"No source code directory linked to this project.\"));\r\n console.error(chalk.yellow(\"Run 'bb project link <path>' to set it.\"));\r\n process.exit(1);\r\n }\r\n return p;\r\n}\r\n\r\n/**\r\n * Resolve a work item by UUID, number, or KEY-number (e.g. BB-42).\r\n */\r\nexport async function resolveItemId(\r\n slug: string,\r\n idOrNumber: string,\r\n): Promise<WorkItem> {\r\n // UUID format\r\n if (idOrNumber.length > 8 && idOrNumber.includes(\"-\") && idOrNumber.match(/^[0-9a-f-]+$/i)) {\r\n return apiGet<WorkItem>(`/api/work-items/${idOrNumber}`);\r\n }\r\n\r\n // KEY-number (e.g. BB-42) or plain integer\r\n const match = idOrNumber.match(/^(?:[A-Za-z]+-)?(\\d+)$/);\r\n if (match) {\r\n const num = parseInt(match[1], 10);\r\n return apiGet<WorkItem>(`/api/projects/${slug}/work-items/by-number/${num}`);\r\n }\r\n\r\n console.error(\r\n chalk.red(`Invalid identifier: ${idOrNumber}. Use UUID, number, or KEY-number (e.g. BB-42).`),\r\n );\r\n process.exit(1);\r\n}\r\n\r\n/** Turn a title into a branch-safe slug. */\r\nexport function slugify(text: string, maxLen = 48): string {\r\n let s = text.toLowerCase().trim();\r\n s = s.replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\r\n if (s.length > maxLen) {\r\n s = s.slice(0, maxLen);\r\n const last = s.lastIndexOf(\"-\");\r\n if (last > 0) s = s.slice(0, last);\r\n }\r\n return s;\r\n}\r\n\r\n/** Truncate text with ellipsis. */\r\nexport function truncate(text: string, max: number): string {\r\n return text.length <= max ? text : text.slice(0, max - 3) + \"...\";\r\n}\r\n\r\n/** Shared error handler for commands. */\r\nexport async function withErrorHandling(fn: () => Promise<void>): Promise<void> {\r\n try {\r\n await fn();\r\n } catch (err: any) {\r\n if (err?.data?.detail) {\r\n console.error(chalk.red(`Error: ${err.data.detail}`));\r\n } else if (err?.statusCode === 401) {\r\n console.error(chalk.red(\"Not authenticated. Run 'bb login' first.\"));\r\n } else if (err?.message?.includes(\"fetch failed\") || err?.code === \"ECONNREFUSED\") {\r\n console.error(chalk.red(\"Cannot connect to the API server.\"));\r\n } else {\r\n console.error(chalk.red(`Error: ${err?.message ?? err}`));\r\n }\r\n process.exit(1);\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport path from \"node:path\";\r\nimport fs from \"node:fs\";\r\nimport Table from \"cli-table3\";\r\nimport * as p from \"@clack/prompts\";\r\nimport { apiGet, apiPost } from \"../api-client.js\";\r\nimport {\r\n getProjectPath,\r\n isLocalConfigActive,\r\n loadConfig,\r\n loadLocalConfig,\r\n saveConfig,\r\n saveLocalConfig,\r\n setProjectPath,\r\n getCurrentProject,\r\n} from \"../config.js\";\r\nimport { withErrorHandling, slugify } from \"../lib/utils.js\";\r\nimport type { Project } from \"../types.js\";\r\n\r\nexport const projectCommand = new Command(\"project\").description(\r\n \"Project management\",\r\n);\r\n\r\n// ── Helpers ──────────────────────────────────────────────────\r\n\r\nasync function selectProjectInteractive(): Promise<Project> {\r\n const projects = await apiGet<Project[]>(\"/api/projects\");\r\n\r\n if (!projects || projects.length === 0) {\r\n console.log(\r\n chalk.yellow(\r\n `No projects found. Create one with ${chalk.bold(\"bb project create <name>\")}.`,\r\n ),\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const choices = projects.map((proj) => ({\r\n value: proj,\r\n label: `${proj.slug} - ${proj.name}`,\r\n }));\r\n\r\n const selected = await p.select({\r\n message: \"Select a project\",\r\n options: choices,\r\n });\r\n\r\n if (p.isCancel(selected)) {\r\n console.log(chalk.yellow(\"Cancelled.\"));\r\n process.exit(0);\r\n }\r\n\r\n return selected as Project;\r\n}\r\n\r\nfunction setCurrentProject(slug: string): void {\r\n if (isLocalConfigActive()) {\r\n const localCfg = loadLocalConfig();\r\n localCfg.current_project = slug;\r\n saveLocalConfig(localCfg);\r\n } else {\r\n const cfg = loadConfig();\r\n cfg.current_project = slug;\r\n saveConfig(cfg);\r\n }\r\n}\r\n\r\n// ── list ─────────────────────────────────────────────────────\r\n\r\nprojectCommand\r\n .command(\"list\")\r\n .description(\"List all projects\")\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n const projects = await apiGet<Project[]>(\"/api/projects\");\r\n\r\n const table = new Table({\r\n head: [\"Slug\", \"Name\", \"Local Path\", \"Repo\"],\r\n style: { head: [\"cyan\"] },\r\n });\r\n\r\n for (const proj of projects) {\r\n const localPath = getProjectPath(proj.slug) ?? \"-\";\r\n table.push([\r\n proj.slug,\r\n proj.name,\r\n localPath,\r\n proj.repo_url ?? \"-\",\r\n ]);\r\n }\r\n\r\n console.log(table.toString());\r\n }),\r\n );\r\n\r\n// ── create ───────────────────────────────────────────────────\r\n\r\nprojectCommand\r\n .command(\"create\")\r\n .description(\"Create a new project\")\r\n .argument(\"<name>\", \"Project name\")\r\n .option(\"--slug <slug>\", \"Project slug (defaults to name kebab-cased)\")\r\n .option(\"--repo-url <url>\", \"Repository URL\")\r\n .action((name, opts) =>\r\n withErrorHandling(async () => {\r\n const projectSlug = opts.slug ?? slugify(name);\r\n const project = await apiPost<Project>(\"/api/projects\", {\r\n name,\r\n slug: projectSlug,\r\n repo_url: opts.repoUrl ?? null,\r\n });\r\n console.log(\r\n chalk.green(`Created project ${chalk.bold(project.slug)}`),\r\n );\r\n }),\r\n );\r\n\r\n// ── switch ───────────────────────────────────────────────────\r\n\r\nprojectCommand\r\n .command(\"switch\")\r\n .description(\"Switch to a project as the active context\")\r\n .argument(\"[slug]\", \"Project slug (interactive picker if omitted)\")\r\n .option(\"-p, --path <path>\", \"Local source code directory\")\r\n .action((slug, opts) =>\r\n withErrorHandling(async () => {\r\n if (!slug) {\r\n const selected = await selectProjectInteractive();\r\n slug = selected.slug;\r\n } else {\r\n // Verify project exists\r\n await apiGet<Project>(`/api/projects/${slug}`);\r\n }\r\n\r\n setCurrentProject(slug);\r\n\r\n if (opts.path) {\r\n const resolved = path.resolve(opts.path);\r\n setProjectPath(slug, resolved);\r\n console.log(\r\n chalk.green(`Switched to ${chalk.bold(slug)} -> ${resolved}`),\r\n );\r\n } else {\r\n const existing = getProjectPath(slug);\r\n console.log(chalk.green(`Switched to project ${chalk.bold(slug)}`));\r\n if (!existing) {\r\n console.log(\r\n chalk.dim(\r\n `Tip: use ${chalk.bold(\"bb project link <path>\")} to set the source code directory.`,\r\n ),\r\n );\r\n }\r\n }\r\n }),\r\n );\r\n\r\n// ── link ─────────────────────────────────────────────────────\r\n\r\nprojectCommand\r\n .command(\"link\")\r\n .description(\"Link current project to a local source code directory\")\r\n .argument(\"[path]\", \"Path to source directory (default: current dir)\", \".\")\r\n .action((linkPath) =>\r\n withErrorHandling(async () => {\r\n const slug = getCurrentProject();\r\n if (!slug) {\r\n console.error(\r\n chalk.red(\r\n `No project selected. Run ${chalk.bold(\"bb project switch <slug>\")} first.`,\r\n ),\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const resolved = path.resolve(linkPath);\r\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {\r\n console.error(chalk.red(`Directory not found: ${resolved}`));\r\n process.exit(1);\r\n }\r\n\r\n setProjectPath(slug, resolved);\r\n console.log(\r\n chalk.green(`Linked ${chalk.bold(slug)} -> ${resolved}`),\r\n );\r\n }),\r\n );\r\n\r\n// ── current ──────────────────────────────────────────────────\r\n\r\nprojectCommand\r\n .command(\"current\")\r\n .description(\"Show the current active project\")\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n const slug = getCurrentProject();\r\n if (!slug) {\r\n console.log(\r\n chalk.yellow(\r\n `No project selected. Use ${chalk.bold(\"bb project switch <slug>\")}.`,\r\n ),\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const project = await apiGet<Project>(`/api/projects/${slug}`);\r\n console.log(`${chalk.bold(project.name)} (${project.slug})`);\r\n\r\n const localPath = getProjectPath(slug);\r\n if (localPath) {\r\n console.log(`Path: ${localPath}`);\r\n } else {\r\n console.log(\r\n chalk.dim(\r\n `Path: not linked - use ${chalk.bold(\"bb project link <path>\")}`,\r\n ),\r\n );\r\n }\r\n\r\n if (project.repo_url) {\r\n console.log(`Repo: ${project.repo_url}`);\r\n }\r\n }),\r\n );\r\n\r\n// ── refresh ──────────────────────────────────────────────────\r\n\r\nprojectCommand\r\n .command(\"refresh\")\r\n .description(\r\n \"Re-pick the active project from the API and link the current directory\",\r\n )\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n const selected = await selectProjectInteractive();\r\n const slug = selected.slug;\r\n\r\n setCurrentProject(slug);\r\n\r\n // Auto-link current directory\r\n const resolved = path.resolve(process.cwd());\r\n setProjectPath(slug, resolved);\r\n console.log(\r\n chalk.green(\r\n `Switched to ${chalk.bold(selected.name)} (${slug}) -> ${resolved}`,\r\n ),\r\n );\r\n }),\r\n );\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport Table from \"cli-table3\";\r\nimport { apiGet, apiPost, apiPut } from \"../api-client.js\";\r\nimport { requireProject, resolveItemId, withErrorHandling } from \"../lib/utils.js\";\r\nimport type { WorkItem } from \"../types.js\";\r\n\r\nexport const itemCommand = new Command(\"item\").description(\r\n \"Work item management\",\r\n);\r\n\r\n// ── list ─────────────────────────────────────────────────────\r\n\r\nitemCommand\r\n .command(\"list\")\r\n .description(\"List work items in the current project\")\r\n .option(\"-t, --type <type>\", \"Filter by type (story, task, epic, bug...)\")\r\n .option(\"-s, --status <status>\", \"Filter by status\")\r\n .option(\"--parent <parent>\", \"Filter by parent ID\")\r\n .option(\"-a, --assignee <assignee>\", \"Filter by assignee\")\r\n .action((opts) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const params: Record<string, string> = {};\r\n if (opts.type) params.type = opts.type;\r\n if (opts.status) params.status = opts.status;\r\n if (opts.parent) params.parent_id = opts.parent;\r\n if (opts.assignee) params.assignee = opts.assignee;\r\n\r\n const items = await apiGet<WorkItem[]>(\r\n `/api/projects/${slug}/work-items`,\r\n params,\r\n );\r\n\r\n const table = new Table({\r\n head: [\"#\", \"Type\", \"Title\", \"Status\", \"Priority\", \"Assignee\"],\r\n style: { head: [\"cyan\"] },\r\n });\r\n\r\n for (const item of items) {\r\n const key = item.key ?? String(item.number);\r\n table.push([\r\n key,\r\n item.type,\r\n item.title,\r\n item.status,\r\n item.priority,\r\n item.assignee ?? \"-\",\r\n ]);\r\n }\r\n\r\n console.log(table.toString());\r\n }),\r\n );\r\n\r\n// ── create ───────────────────────────────────────────────────\r\n\r\nitemCommand\r\n .command(\"create\")\r\n .description(\"Create a new work item\")\r\n .argument(\"<title>\", \"Item title\")\r\n .option(\r\n \"-t, --type <type>\",\r\n \"Item type: story, task, epic, bug, feature, chore, spike\",\r\n \"story\",\r\n )\r\n .option(\"-d, --description <description>\", \"Description\")\r\n .option(\"-p, --priority <priority>\", \"Priority\", \"medium\")\r\n .option(\"--parent <parent>\", \"Parent item ID or number\")\r\n .action((title, opts) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n\r\n const data: Record<string, any> = {\r\n title,\r\n type: opts.type,\r\n priority: opts.priority,\r\n };\r\n\r\n if (opts.description) {\r\n data.description = opts.description;\r\n }\r\n\r\n if (opts.parent) {\r\n const parentItem = await resolveItemId(slug, opts.parent);\r\n data.parent_id = parentItem.id;\r\n }\r\n\r\n const item = await apiPost<WorkItem>(\r\n `/api/projects/${slug}/work-items`,\r\n data,\r\n );\r\n const key = item.key ?? `#${item.number}`;\r\n console.log(chalk.green(`Created ${item.type} ${key}: ${item.title}`));\r\n }),\r\n );\r\n\r\n// ── show ─────────────────────────────────────────────────────\r\n\r\nitemCommand\r\n .command(\"show\")\r\n .description(\"Show work item details\")\r\n .argument(\"<id>\", \"UUID, number, or KEY-number (e.g. BB-42)\")\r\n .action((idOrNumber) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const item = await resolveItemId(slug, idOrNumber);\r\n\r\n const key = item.key ?? `#${item.number}`;\r\n console.log(\r\n `${chalk.bold(key)} [${item.type}] ${item.title}`,\r\n );\r\n console.log(\r\n `Status: ${item.status} | Priority: ${item.priority}`,\r\n );\r\n\r\n if (item.assignee) {\r\n console.log(`Assignee: ${item.assignee}`);\r\n }\r\n if (item.parent_id) {\r\n console.log(`Parent: ${item.parent_id}`);\r\n }\r\n if (item.sprint_id) {\r\n console.log(`Sprint: ${item.sprint_id}`);\r\n }\r\n if (item.story_points) {\r\n console.log(`Points: ${item.story_points}`);\r\n }\r\n if (item.description) {\r\n console.log(`\\n${item.description}`);\r\n }\r\n if (item.acceptance_criteria) {\r\n console.log(\r\n `\\n${chalk.bold(\"Acceptance Criteria:\")}\\n${item.acceptance_criteria}`,\r\n );\r\n }\r\n if (item.plan) {\r\n console.log(`\\n${chalk.bold(\"Plan:\")}\\n${item.plan}`);\r\n }\r\n if (item.ai_summary) {\r\n console.log(`\\n${chalk.bold(\"AI Summary:\")}\\n${item.ai_summary}`);\r\n }\r\n }),\r\n );\r\n\r\n// ── update ───────────────────────────────────────────────────\r\n\r\nitemCommand\r\n .command(\"update\")\r\n .description(\"Update a work item\")\r\n .argument(\"<id>\", \"UUID, number, or KEY-number\")\r\n .option(\"-s, --status <status>\", \"New status\")\r\n .option(\"-a, --assignee <assignee>\", \"New assignee\")\r\n .option(\"-p, --priority <priority>\", \"New priority\")\r\n .option(\"--title <title>\", \"New title\")\r\n .option(\"-t, --type <type>\", \"New type\")\r\n .action((idOrNumber, opts) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const item = await resolveItemId(slug, idOrNumber);\r\n\r\n const data: Record<string, string> = {};\r\n if (opts.status) data.status = opts.status;\r\n if (opts.assignee) data.assignee = opts.assignee;\r\n if (opts.priority) data.priority = opts.priority;\r\n if (opts.title) data.title = opts.title;\r\n if (opts.type) data.type = opts.type;\r\n\r\n if (Object.keys(data).length === 0) {\r\n console.log(chalk.yellow(\"Nothing to update.\"));\r\n return;\r\n }\r\n\r\n const updated = await apiPut<WorkItem>(\r\n `/api/work-items/${item.id}`,\r\n data,\r\n );\r\n const key = updated.key ?? `#${updated.number}`;\r\n console.log(chalk.green(`Updated ${key}`));\r\n }),\r\n );\r\n\r\n// ── assign ───────────────────────────────────────────────────\r\n\r\nitemCommand\r\n .command(\"assign\")\r\n .description(\"Assign a work item to someone\")\r\n .argument(\"<id>\", \"UUID, number, or KEY-number\")\r\n .argument(\"<assignee>\", \"Assignee name\")\r\n .action((idOrNumber, assignee) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const item = await resolveItemId(slug, idOrNumber);\r\n\r\n const updated = await apiPut<WorkItem>(`/api/work-items/${item.id}`, {\r\n assignee,\r\n });\r\n const key = updated.key ?? `#${updated.number}`;\r\n console.log(chalk.green(`${key} assigned to ${assignee}`));\r\n }),\r\n );\r\n\r\n// ── children ─────────────────────────────────────────────────\r\n\r\nitemCommand\r\n .command(\"children\")\r\n .description(\"List children of a work item\")\r\n .argument(\"<id>\", \"UUID, number, or KEY-number\")\r\n .action((idOrNumber) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const item = await resolveItemId(slug, idOrNumber);\r\n\r\n const kids = await apiGet<WorkItem[]>(\r\n `/api/work-items/${item.id}/children`,\r\n );\r\n\r\n if (!kids || kids.length === 0) {\r\n console.log(chalk.dim(\"No children.\"));\r\n return;\r\n }\r\n\r\n const parentKey = item.key ?? `#${item.number}`;\r\n const table = new Table({\r\n head: [\"#\", \"Type\", \"Title\", \"Status\", \"Assignee\"],\r\n style: { head: [\"cyan\"] },\r\n });\r\n\r\n for (const kid of kids) {\r\n const key = kid.key ?? String(kid.number);\r\n table.push([\r\n key,\r\n kid.type,\r\n kid.title,\r\n kid.status,\r\n kid.assignee ?? \"-\",\r\n ]);\r\n }\r\n\r\n console.log(`Children of ${parentKey}`);\r\n console.log(table.toString());\r\n }),\r\n );\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport { apiGet, apiPost } from \"../api-client.js\";\r\nimport { requireProject, resolveItemId, withErrorHandling } from \"../lib/utils.js\";\r\nimport type { Comment } from \"../types.js\";\r\n\r\nexport const commentCommand = new Command(\"comment\").description(\r\n \"Comment management\",\r\n);\r\n\r\n// ── list ─────────────────────────────────────────────────────\r\n\r\ncommentCommand\r\n .command(\"list\")\r\n .description(\"List comments on a work item\")\r\n .argument(\"<id>\", \"Work item UUID, number, or KEY-number\")\r\n .action((idOrNumber) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const item = await resolveItemId(slug, idOrNumber);\r\n\r\n const comments = await apiGet<Comment[]>(\r\n `/api/work-items/${item.id}/comments`,\r\n );\r\n\r\n if (!comments || comments.length === 0) {\r\n console.log(chalk.dim(\"No comments yet.\"));\r\n return;\r\n }\r\n\r\n for (const c of comments) {\r\n const typeTag =\r\n c.type && c.type !== \"discussion\" ? ` [${c.type}]` : \"\";\r\n console.log(`${chalk.bold(c.author)}${typeTag}: ${c.body}`);\r\n }\r\n }),\r\n );\r\n\r\n// ── add ──────────────────────────────────────────────────────\r\n\r\ncommentCommand\r\n .command(\"add\")\r\n .description(\"Add a comment to a work item\")\r\n .argument(\"<id>\", \"Work item UUID, number, or KEY-number\")\r\n .argument(\"<body>\", \"Comment body\")\r\n .option(\r\n \"-t, --type <type>\",\r\n \"Comment type: discussion, investigation, proposal, review, agent_output\",\r\n \"discussion\",\r\n )\r\n .action((idOrNumber, body, opts) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const item = await resolveItemId(slug, idOrNumber);\r\n\r\n await apiPost(`/api/work-items/${item.id}/comments`, {\r\n body,\r\n type: opts.type,\r\n });\r\n console.log(chalk.green(\"Comment added.\"));\r\n }),\r\n );\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport Table from \"cli-table3\";\r\nimport { apiGet, apiPost } from \"../api-client.js\";\r\nimport { requireProject, withErrorHandling } from \"../lib/utils.js\";\r\nimport type { Sprint } from \"../types.js\";\r\n\r\nexport const sprintCommand = new Command(\"sprint\").description(\r\n \"Sprint management\",\r\n);\r\n\r\n// ── list ─────────────────────────────────────────────────────\r\n\r\nsprintCommand\r\n .command(\"list\")\r\n .description(\"List sprints in the current project\")\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const sprints = await apiGet<Sprint[]>(\r\n `/api/projects/${slug}/sprints`,\r\n );\r\n\r\n const table = new Table({\r\n head: [\"ID\", \"Name\", \"Status\", \"Start\", \"End\"],\r\n style: { head: [\"cyan\"] },\r\n });\r\n\r\n for (const s of sprints) {\r\n table.push([\r\n s.id.slice(0, 8),\r\n s.name,\r\n s.status,\r\n s.start_date ?? \"-\",\r\n s.end_date ?? \"-\",\r\n ]);\r\n }\r\n\r\n console.log(table.toString());\r\n }),\r\n );\r\n\r\n// ── create ───────────────────────────────────────────────────\r\n\r\nsprintCommand\r\n .command(\"create\")\r\n .description(\"Create a new sprint\")\r\n .argument(\"<name>\", \"Sprint name\")\r\n .option(\"-g, --goal <goal>\", \"Sprint goal\")\r\n .action((name, opts) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const data: Record<string, string> = { name };\r\n if (opts.goal) {\r\n data.goal = opts.goal;\r\n }\r\n\r\n const sprint = await apiPost<Sprint>(\r\n `/api/projects/${slug}/sprints`,\r\n data,\r\n );\r\n console.log(chalk.green(`Created sprint: ${sprint.name}`));\r\n }),\r\n );\r\n\r\n// ── start ────────────────────────────────────────────────────\r\n\r\nsprintCommand\r\n .command(\"start\")\r\n .description(\"Start a sprint (set status to active)\")\r\n .argument(\"<id>\", \"Sprint ID\")\r\n .action((sprintId) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const sprint = await apiPost<Sprint>(\r\n `/api/projects/${slug}/sprints/${sprintId}/start`,\r\n );\r\n console.log(\r\n chalk.green(`Sprint ${chalk.bold(sprint.name)} is now active.`),\r\n );\r\n }),\r\n );\r\n\r\n// ── close ────────────────────────────────────────────────────\r\n\r\nsprintCommand\r\n .command(\"close\")\r\n .description(\"Close an active sprint\")\r\n .argument(\"<id>\", \"Sprint ID\")\r\n .action((sprintId) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const sprint = await apiPost<Sprint>(\r\n `/api/projects/${slug}/sprints/${sprintId}/close`,\r\n );\r\n console.log(\r\n chalk.green(`Sprint ${chalk.bold(sprint.name)} completed.`),\r\n );\r\n }),\r\n );\r\n\r\n// ── current ──────────────────────────────────────────────────\r\n\r\nsprintCommand\r\n .command(\"current\")\r\n .description(\"Show the currently active sprint\")\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const sprints = await apiGet<Sprint[]>(\r\n `/api/projects/${slug}/sprints`,\r\n );\r\n\r\n const active = sprints.filter((s) => s.status === \"active\");\r\n\r\n if (active.length === 0) {\r\n console.log(chalk.yellow(\"No active sprint.\"));\r\n return;\r\n }\r\n\r\n const s = active[0];\r\n console.log(`${chalk.bold(s.name)} (${s.status})`);\r\n if (s.goal) {\r\n console.log(`Goal: ${s.goal}`);\r\n }\r\n console.log(\r\n `Period: ${s.start_date ?? \"?\"} -> ${s.end_date ?? \"?\"}`,\r\n );\r\n }),\r\n );\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport Table from \"cli-table3\";\r\nimport { apiGet, apiPost } from \"../api-client.js\";\r\nimport { requireProject, withErrorHandling } from \"../lib/utils.js\";\r\nimport type { Label } from \"../types.js\";\r\n\r\nexport const labelCommand = new Command(\"label\").description(\r\n \"Label management\",\r\n);\r\n\r\n// ── list ─────────────────────────────────────────────────────\r\n\r\nlabelCommand\r\n .command(\"list\")\r\n .description(\"List labels in the current project\")\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const labels = await apiGet<Label[]>(\r\n `/api/projects/${slug}/labels`,\r\n );\r\n\r\n const table = new Table({\r\n head: [\"Name\", \"Color\"],\r\n style: { head: [\"cyan\"] },\r\n });\r\n\r\n for (const label of labels) {\r\n table.push([label.name, label.color ?? \"-\"]);\r\n }\r\n\r\n console.log(table.toString());\r\n }),\r\n );\r\n\r\n// ── create ───────────────────────────────────────────────────\r\n\r\nlabelCommand\r\n .command(\"create\")\r\n .description(\"Create a label\")\r\n .argument(\"<name>\", \"Label name\")\r\n .option(\"-c, --color <color>\", \"Hex color e.g. #ff0000\")\r\n .action((name, opts) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const data: Record<string, string> = { name };\r\n if (opts.color) {\r\n data.color = opts.color;\r\n }\r\n\r\n const label = await apiPost<Label>(\r\n `/api/projects/${slug}/labels`,\r\n data,\r\n );\r\n console.log(chalk.green(`Created label: ${label.name}`));\r\n }),\r\n );\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport Table from \"cli-table3\";\r\nimport { apiGet } from \"../api-client.js\";\r\nimport { requireProject, truncate, withErrorHandling } from \"../lib/utils.js\";\r\nimport type { WorkItem } from \"../types.js\";\r\n\r\nconst COLUMNS = [\"open\", \"in_progress\", \"in_review\", \"resolved\", \"closed\"] as const;\r\n\r\nconst COLUMN_WIDTH = 24;\r\n\r\nexport const boardCommand = new Command(\"board\")\r\n .description(\"Show kanban board for current project work items\")\r\n .option(\"-t, --type <type>\", \"Filter by type (story, task, etc.)\")\r\n .action((opts) =>\r\n withErrorHandling(async () => {\r\n const slug = requireProject();\r\n\r\n const params: Record<string, string> = {};\r\n if (opts.type) params.type = opts.type;\r\n\r\n const items = await apiGet<WorkItem[]>(\r\n `/api/projects/${slug}/work-items`,\r\n params,\r\n );\r\n\r\n // Group items by status\r\n const grouped: Record<string, WorkItem[]> = {};\r\n for (const col of COLUMNS) {\r\n grouped[col] = [];\r\n }\r\n for (const item of items) {\r\n if (grouped[item.status]) {\r\n grouped[item.status].push(item);\r\n }\r\n }\r\n\r\n // Build each column's content as an array of lines\r\n const columnContents: string[][] = COLUMNS.map((col) => {\r\n const colItems = grouped[col];\r\n if (colItems.length === 0) {\r\n return [chalk.dim(\" (empty)\")];\r\n }\r\n const lines: string[] = [];\r\n for (const item of colItems) {\r\n const key = item.key ?? `#${item.number}`;\r\n lines.push(\r\n ` ${chalk.bold(key)} ${chalk.dim(`[${item.type}]`)}`,\r\n );\r\n lines.push(` ${truncate(item.title, COLUMN_WIDTH - 2)}`);\r\n const meta: string[] = [];\r\n if (item.priority) meta.push(item.priority);\r\n if (item.assignee) meta.push(`-> ${item.assignee}`);\r\n if (meta.length > 0) {\r\n lines.push(` ${chalk.dim(meta.join(\" \"))}`);\r\n }\r\n lines.push(\"\"); // blank line between items\r\n }\r\n return lines;\r\n });\r\n\r\n // Find the max number of lines across columns\r\n const maxLines = Math.max(...columnContents.map((c) => c.length));\r\n\r\n // Pad columns to equal height\r\n for (const col of columnContents) {\r\n while (col.length < maxLines) {\r\n col.push(\"\");\r\n }\r\n }\r\n\r\n // Build table using cli-table3\r\n const headers = COLUMNS.map((col) =>\r\n col.replace(/_/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()),\r\n );\r\n\r\n const table = new Table({\r\n head: headers,\r\n style: { head: [\"cyan\"] },\r\n colWidths: COLUMNS.map(() => COLUMN_WIDTH),\r\n wordWrap: true,\r\n });\r\n\r\n // Build rows: each row is one \"line\" across all columns\r\n for (let i = 0; i < maxLines; i++) {\r\n const row = columnContents.map((col) => col[i] ?? \"\");\r\n table.push(row);\r\n }\r\n\r\n console.log(`\\n${chalk.bold(`Board - ${slug}`)}\\n`);\r\n console.log(table.toString());\r\n }),\r\n );\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport Table from \"cli-table3\";\r\nimport { execa } from \"execa\";\r\nimport { apiGet } from \"../api-client.js\";\r\nimport { getApiUrl, getToken } from \"../config.js\";\r\nimport { withErrorHandling } from \"../lib/utils.js\";\r\nimport type { HealthFull, User } from \"../types.js\";\r\n\r\ntype CheckStatus = \"pass\" | \"fail\" | \"warn\";\r\n\r\ninterface CheckResult {\r\n name: string;\r\n status: CheckStatus;\r\n detail: string;\r\n}\r\n\r\nasync function checkBinary(name: string): Promise<CheckResult> {\r\n try {\r\n const { stdout } = await execa(name, [\"--version\"]);\r\n const version = stdout.trim().split(\"\\n\")[0];\r\n return { name, status: \"pass\", detail: version };\r\n } catch {\r\n return { name, status: \"fail\", detail: \"Not found in PATH\" };\r\n }\r\n}\r\n\r\nasync function checkNodeVersion(): Promise<CheckResult> {\r\n const version = process.version;\r\n const major = parseInt(version.slice(1).split(\".\")[0], 10);\r\n if (major >= 20) {\r\n return { name: \"Node.js\", status: \"pass\", detail: version };\r\n }\r\n return {\r\n name: \"Node.js\",\r\n status: \"warn\",\r\n detail: `${version} (>= 20 recommended)`,\r\n };\r\n}\r\n\r\nasync function checkApi(): Promise<CheckResult> {\r\n try {\r\n const health = await apiGet<HealthFull>(\"/health\");\r\n const parts: string[] = [health.status];\r\n if (health.version) parts.push(`v${health.version}`);\r\n if (health.db) parts.push(`db: ${health.db}`);\r\n return { name: \"API Server\", status: \"pass\", detail: parts.join(\", \") };\r\n } catch {\r\n return {\r\n name: \"API Server\",\r\n status: \"fail\",\r\n detail: `Cannot reach ${getApiUrl()}`,\r\n };\r\n }\r\n}\r\n\r\nasync function checkAuth(): Promise<CheckResult> {\r\n const token = getToken();\r\n if (!token) {\r\n return { name: \"Authentication\", status: \"warn\", detail: \"Not logged in\" };\r\n }\r\n try {\r\n const user = await apiGet<User>(\"/auth/me\");\r\n return {\r\n name: \"Authentication\",\r\n status: \"pass\",\r\n detail: `${user.username} (${user.email})`,\r\n };\r\n } catch {\r\n return {\r\n name: \"Authentication\",\r\n status: \"fail\",\r\n detail: \"Token is invalid or expired\",\r\n };\r\n }\r\n}\r\n\r\nfunction statusIcon(status: CheckStatus): string {\r\n switch (status) {\r\n case \"pass\":\r\n return chalk.green(\"PASS\");\r\n case \"fail\":\r\n return chalk.red(\"FAIL\");\r\n case \"warn\":\r\n return chalk.yellow(\"WARN\");\r\n }\r\n}\r\n\r\nexport const doctorCommand = new Command(\"doctor\")\r\n .description(\"Check prerequisites and connectivity\")\r\n .action(() =>\r\n withErrorHandling(async () => {\r\n console.log(chalk.bold(\"\\nBumblebee Doctor\\n\"));\r\n console.log(\"Checking prerequisites...\\n\");\r\n\r\n const results: CheckResult[] = await Promise.all([\r\n checkBinary(\"claude\"),\r\n checkBinary(\"docker\"),\r\n checkBinary(\"git\"),\r\n checkNodeVersion(),\r\n checkApi(),\r\n checkAuth(),\r\n ]);\r\n\r\n const table = new Table({\r\n head: [\"Check\", \"Status\", \"Details\"],\r\n style: { head: [\"cyan\"] },\r\n colWidths: [18, 10, 50],\r\n });\r\n\r\n for (const result of results) {\r\n table.push([result.name, statusIcon(result.status), result.detail]);\r\n }\r\n\r\n console.log(table.toString());\r\n\r\n const failures = results.filter((r) => r.status === \"fail\");\r\n const warnings = results.filter((r) => r.status === \"warn\");\r\n\r\n console.log(\"\");\r\n if (failures.length > 0) {\r\n console.log(\r\n chalk.red(\r\n `${failures.length} check(s) failed. Please resolve before continuing.`,\r\n ),\r\n );\r\n } else if (warnings.length > 0) {\r\n console.log(\r\n chalk.yellow(\r\n `All checks passed with ${warnings.length} warning(s).`,\r\n ),\r\n );\r\n } else {\r\n console.log(chalk.green(\"All checks passed!\"));\r\n }\r\n }),\r\n );\r\n","/**\r\n * `bb init` -- Initialize a .bumblebee/ config directory in the project root.\r\n *\r\n * Creates the local config, optionally links to a project, and installs\r\n * IDE skill files (Claude Code, Cursor, Antigravity).\r\n */\r\n\r\nimport { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport * as p from \"@clack/prompts\";\r\nimport fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport TOML from \"@iarna/toml\";\r\nimport { apiGet, apiPost } from \"../api-client.js\";\r\nimport {\r\n findProjectRoot,\r\n setProjectPath,\r\n LOCAL_DIR_NAME,\r\n LOCAL_CONFIG_NAME,\r\n} from \"../config.js\";\r\nimport { installSkills } from \"../lib/ide-setup.js\";\r\nimport { withErrorHandling } from \"../lib/utils.js\";\r\nimport type { Project } from \"../types.js\";\r\n\r\n// ── Helpers ──────────────────────────────────────────────────\r\n\r\nfunction parseIdesOption(value: string): string[] {\r\n if (value === \"none\") return [];\r\n if (value === \"all\") return [\"claude\", \"cursor\", \"antigravity\"];\r\n\r\n const valid = new Set([\"claude\", \"cursor\", \"antigravity\"]);\r\n const ides = value.split(\",\").map((s) => s.trim());\r\n\r\n for (const ide of ides) {\r\n if (!valid.has(ide)) {\r\n console.error(\r\n chalk.red(\r\n `Unknown IDE: ${ide}. Valid: claude, cursor, antigravity, all, none`,\r\n ),\r\n );\r\n process.exit(1);\r\n }\r\n }\r\n\r\n return ides;\r\n}\r\n\r\nasync function promptIdeSelection(): Promise<string[]> {\r\n const result = await p.select({\r\n message: \"Install AI agent skills for your IDE?\",\r\n options: [\r\n { value: \"claude\", label: \"Claude Code (.claude/skills/)\" },\r\n { value: \"cursor\", label: \"Cursor (.cursor/rules/)\" },\r\n { value: \"antigravity\", label: \"Antigravity (.antigravity/rules/)\" },\r\n { value: \"all\", label: \"All of the above\" },\r\n { value: \"none\", label: \"Skip\" },\r\n ],\r\n initialValue: \"all\",\r\n });\r\n\r\n if (p.isCancel(result) || result === \"none\") return [];\r\n if (result === \"all\") return [\"claude\", \"cursor\", \"antigravity\"];\r\n return [result as string];\r\n}\r\n\r\n// ── Command ─────────────────────────────────────────────────\r\n\r\nexport const initCommand = new Command(\"init\")\r\n .description(\r\n \"Initialize a .bumblebee/ config directory in the project root\",\r\n )\r\n .option(\r\n \"-p, --project <slug>\",\r\n \"Set current_project in local config\",\r\n )\r\n .option(\"--api-url <url>\", \"Set api_url in local config\")\r\n .option(\r\n \"--ides <ides>\",\r\n \"IDEs to install skills for (claude,cursor,antigravity,all,none)\",\r\n )\r\n .option(\"-f, --force\", \"Overwrite existing config\")\r\n .action((opts) =>\r\n withErrorHandling(async () => {\r\n const root = findProjectRoot() ?? process.cwd();\r\n const bbDir = path.join(root, LOCAL_DIR_NAME);\r\n const configFile = path.join(bbDir, LOCAL_CONFIG_NAME);\r\n const gitignoreFile = path.join(bbDir, \".gitignore\");\r\n\r\n if (fs.existsSync(configFile) && !opts.force) {\r\n console.log(\r\n chalk.yellow(`.bumblebee/ already exists at ${root}`),\r\n );\r\n console.log(chalk.dim(\"Use --force to overwrite.\"));\r\n process.exit(1);\r\n }\r\n\r\n // Create directory\r\n fs.mkdirSync(bbDir, { recursive: true });\r\n\r\n // Interactive project selection when --project is not provided\r\n let project = opts.project as string | undefined;\r\n let selectedName: string | undefined;\r\n\r\n if (!project) {\r\n try {\r\n const projects = await apiGet<Project[]>(\"/api/projects\");\r\n\r\n if (projects && projects.length > 0) {\r\n const options = [\r\n ...projects.map((proj) => ({\r\n value: proj.slug,\r\n label: `${proj.slug} - ${proj.name}`,\r\n })),\r\n { value: \"__new__\", label: \"+ Create new project\" },\r\n ];\r\n\r\n const selected = await p.select({\r\n message: \"Select a project\",\r\n options,\r\n });\r\n\r\n if (p.isCancel(selected)) {\r\n // User cancelled -- continue without project\r\n } else if (selected === \"__new__\") {\r\n const name = await p.text({ message: \"Project name\" });\r\n\r\n if (!p.isCancel(name)) {\r\n const defaultSlug = (name as string)\r\n .toLowerCase()\r\n .replace(/\\s+/g, \"-\");\r\n const slug = await p.text({\r\n message: \"Project slug\",\r\n initialValue: defaultSlug,\r\n });\r\n\r\n if (!p.isCancel(slug)) {\r\n const created = await apiPost<Project>(\r\n \"/api/projects\",\r\n { name, slug },\r\n );\r\n project = created.slug;\r\n selectedName = created.name;\r\n console.log(\r\n chalk.green(\r\n `Created project ${chalk.bold(project)}`,\r\n ),\r\n );\r\n }\r\n }\r\n } else {\r\n project = selected as string;\r\n selectedName = projects.find(\r\n (proj) => proj.slug === project,\r\n )?.name;\r\n }\r\n }\r\n } catch {\r\n // API unavailable or auth issue -- continue without project\r\n }\r\n }\r\n\r\n // Build config\r\n const cfg: Record<string, any> = {};\r\n if (project) cfg.current_project = project;\r\n if (opts.apiUrl) cfg.api_url = opts.apiUrl;\r\n\r\n // Write config.toml\r\n if (Object.keys(cfg).length > 0) {\r\n fs.writeFileSync(configFile, TOML.stringify(cfg as any));\r\n } else {\r\n fs.writeFileSync(\r\n configFile,\r\n \"# Bumblebee project-local config\\n# Settings here override ~/.bumblebee/config.toml\\n\",\r\n );\r\n }\r\n\r\n // Write .gitignore to exclude local-only files\r\n if (!fs.existsSync(gitignoreFile) || opts.force) {\r\n fs.writeFileSync(gitignoreFile, \"*.local.toml\\n\");\r\n }\r\n\r\n // Auto-link the current directory as the project path\r\n if (project) {\r\n setProjectPath(project, path.resolve(root));\r\n }\r\n\r\n console.log(chalk.green(`Initialized .bumblebee/ at ${root}`));\r\n\r\n if (project) {\r\n const display = selectedName\r\n ? `${selectedName} (${project})`\r\n : project;\r\n console.log(` current_project = ${display}`);\r\n console.log(` linked path = ${path.resolve(root)}`);\r\n }\r\n\r\n if (opts.apiUrl) {\r\n console.log(` api_url = ${opts.apiUrl}`);\r\n }\r\n\r\n if (!project) {\r\n console.log(\r\n chalk.dim(\r\n \"Tip: Add project-specific settings to .bumblebee/config.toml\",\r\n ),\r\n );\r\n }\r\n\r\n // IDE skill installation\r\n let ideList: string[];\r\n if (opts.ides) {\r\n ideList = parseIdesOption(opts.ides);\r\n } else {\r\n ideList = await promptIdeSelection();\r\n }\r\n\r\n if (ideList.length > 0) {\r\n installSkills(root, ideList);\r\n }\r\n\r\n console.log(chalk.green.bold(\"\\nDone!\"));\r\n }),\r\n );\r\n","/**\r\n * IDE skill installer -- copies bb-agent skill files and MCP configs\r\n * to IDE-specific locations (Claude Code, Cursor, Antigravity).\r\n */\r\n\r\nimport fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport chalk from \"chalk\";\r\nimport { getApiUrl, getToken } from \"../config.js\";\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\n\r\n// Templates are at cli-ts/templates/ relative to package root.\r\n// After build, dist/lib/ide-setup.js is at cli-ts/dist/lib/, so walk up to find templates/.\r\nfunction templatesDir(): string {\r\n let dir = __dirname;\r\n for (let i = 0; i < 5; i++) {\r\n const candidate = path.join(dir, \"templates\", \"skills\", \"bb-agent\");\r\n if (fs.existsSync(candidate)) return candidate;\r\n dir = path.dirname(dir);\r\n }\r\n // Fallback for development (src/lib -> src -> cli-ts -> templates)\r\n return path.join(__dirname, \"..\", \"..\", \"templates\", \"skills\", \"bb-agent\");\r\n}\r\n\r\n/** Files in the bb-agent skill template. */\r\nconst SKILL_FILES = [\r\n \"SKILL.md\",\r\n \"references/workflow.md\",\r\n \"references/investigate-workflow.md\",\r\n \"references/bb-commands.md\",\r\n \"references/prompts.md\",\r\n \"references/status-transitions.md\",\r\n \"references/parallel-workflow.md\",\r\n];\r\n\r\n/** Valid IDE identifiers for skill installation. */\r\nexport const IDE_CHOICES = [\"claude\", \"cursor\", \"antigravity\", \"all\", \"none\"] as const;\r\n\r\nfunction getTemplateContent(relativePath: string): string {\r\n const fullPath = path.join(templatesDir(), relativePath);\r\n return fs.readFileSync(fullPath, \"utf-8\");\r\n}\r\n\r\nfunction buildMcpConfig(apiUrl: string, token: string): Record<string, any> {\r\n return {\r\n type: \"http\",\r\n url: `${apiUrl}/mcp`,\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Write/update MCP config with the bumblebee server entry.\r\n *\r\n * @param projectRoot - Root directory of the project.\r\n * @param targetDir - Sub-directory for the config file (e.g. \".cursor\").\r\n * If omitted, writes to projectRoot/.mcp.json.\r\n * @returns true if the config was written, false if skipped.\r\n */\r\nfunction installMcpConfig(projectRoot: string, targetDir?: string): boolean {\r\n const apiUrl = getApiUrl();\r\n const token = getToken();\r\n\r\n if (!token) {\r\n console.log(\r\n ` ${chalk.yellow(\"!\")} No auth token - skipping MCP config (run ${chalk.bold(\"bb login\")} first)`,\r\n );\r\n return false;\r\n }\r\n\r\n const serverEntry = buildMcpConfig(apiUrl, token);\r\n\r\n let configPath: string;\r\n if (targetDir) {\r\n configPath = path.join(projectRoot, targetDir, \"mcp.json\");\r\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\r\n } else {\r\n configPath = path.join(projectRoot, \".mcp.json\");\r\n }\r\n\r\n // Merge with existing config\r\n let config: Record<string, any>;\r\n if (fs.existsSync(configPath)) {\r\n const existing = JSON.parse(fs.readFileSync(configPath, \"utf-8\"));\r\n if (!existing.mcpServers) existing.mcpServers = {};\r\n existing.mcpServers.bumblebee = serverEntry;\r\n config = existing;\r\n } else {\r\n config = { mcpServers: { bumblebee: serverEntry } };\r\n }\r\n\r\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\r\n return true;\r\n}\r\n\r\n/** Copy full skill directory structure to .claude/skills/bb-agent/. */\r\nfunction installClaudeSkills(projectRoot: string): void {\r\n const target = path.join(projectRoot, \".claude\", \"skills\", \"bb-agent\");\r\n fs.mkdirSync(path.join(target, \"references\"), { recursive: true });\r\n\r\n for (const relPath of SKILL_FILES) {\r\n const content = getTemplateContent(relPath);\r\n const dest = path.join(target, relPath);\r\n fs.mkdirSync(path.dirname(dest), { recursive: true });\r\n fs.writeFileSync(dest, content);\r\n }\r\n\r\n installMcpConfig(projectRoot);\r\n console.log(` ${chalk.green(\"\\u2713\")} Installed Claude Code skills + MCP config`);\r\n}\r\n\r\n/** Flatten all skill files into a single markdown document for non-Claude IDEs. */\r\nfunction flattenSkillToMarkdown(): string {\r\n const sections: string[] = [];\r\n\r\n // Main SKILL.md content (skip YAML frontmatter)\r\n let skillContent = getTemplateContent(\"SKILL.md\");\r\n if (skillContent.startsWith(\"---\")) {\r\n const end = skillContent.indexOf(\"---\", 3);\r\n if (end !== -1) {\r\n skillContent = skillContent.slice(end + 3).trim();\r\n }\r\n }\r\n sections.push(skillContent);\r\n\r\n // Append each reference file\r\n const refFiles = SKILL_FILES.filter((f) => f.startsWith(\"references/\"));\r\n for (const relPath of refFiles) {\r\n const content = getTemplateContent(relPath);\r\n sections.push(`\\n---\\n\\n${content}`);\r\n }\r\n\r\n return sections.join(\"\\n\");\r\n}\r\n\r\n/** Flatten skill into .cursor/rules/bb-agent.md. */\r\nfunction installCursorRules(projectRoot: string): void {\r\n const targetDir = path.join(projectRoot, \".cursor\", \"rules\");\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n const content = flattenSkillToMarkdown();\r\n fs.writeFileSync(path.join(targetDir, \"bb-agent.md\"), content);\r\n installMcpConfig(projectRoot, \".cursor\");\r\n console.log(` ${chalk.green(\"\\u2713\")} Installed Cursor rules + MCP config`);\r\n}\r\n\r\n/** Flatten skill into .antigravity/rules/bb-agent.md. */\r\nfunction installAntigravityRules(projectRoot: string): void {\r\n const targetDir = path.join(projectRoot, \".antigravity\", \"rules\");\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n const content = flattenSkillToMarkdown();\r\n fs.writeFileSync(path.join(targetDir, \"bb-agent.md\"), content);\r\n installMcpConfig(projectRoot, \".antigravity\");\r\n console.log(` ${chalk.green(\"\\u2713\")} Installed Antigravity rules + MCP config`);\r\n}\r\n\r\n/**\r\n * Install bb-agent skill files for the specified IDEs.\r\n *\r\n * @param projectRoot - Root directory of the project.\r\n * @param ideList - List of IDE identifiers (\"claude\", \"cursor\", \"antigravity\").\r\n */\r\nexport function installSkills(projectRoot: string, ideList: string[]): void {\r\n const installers: Record<string, (root: string) => void> = {\r\n claude: installClaudeSkills,\r\n cursor: installCursorRules,\r\n antigravity: installAntigravityRules,\r\n };\r\n\r\n for (const ide of ideList) {\r\n const installer = installers[ide];\r\n if (installer) installer(projectRoot);\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport { suggestCommand, batchSuggestCommand } from \"./suggest.js\";\r\nimport { executeCommand, batchExecuteCommand } from \"./execute.js\";\r\nimport { testCommand } from \"./test.js\";\r\nimport { verifyCommand } from \"./verify.js\";\r\nimport { reimplementCommand } from \"./reimplement.js\";\r\nimport { runCommand, batchRunCommand } from \"./run.js\";\r\nimport { continueCommand } from \"./continue.js\";\r\nimport { splitCommand } from \"./split.js\";\r\nimport { integrateCommand } from \"./integrate.js\";\r\nimport { mergeCommand } from \"./merge.js\";\r\nimport { statusCommand, abortCommand } from \"./status.js\";\r\nimport { worktreesCommand, cleanupCommand } from \"./worktree.js\";\r\nimport { daemonCommand } from \"./daemon.js\";\r\n\r\nexport const agentCommand = new Command(\"agent\")\r\n .description(\"Agent session management\")\r\n .addCommand(suggestCommand)\r\n .addCommand(executeCommand)\r\n .addCommand(testCommand)\r\n .addCommand(verifyCommand)\r\n .addCommand(reimplementCommand)\r\n .addCommand(runCommand)\r\n .addCommand(continueCommand)\r\n .addCommand(splitCommand)\r\n .addCommand(integrateCommand)\r\n .addCommand(mergeCommand)\r\n .addCommand(statusCommand)\r\n .addCommand(abortCommand)\r\n .addCommand(worktreesCommand)\r\n .addCommand(cleanupCommand)\r\n .addCommand(batchSuggestCommand)\r\n .addCommand(batchExecuteCommand)\r\n .addCommand(batchRunCommand)\r\n .addCommand(daemonCommand);\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport pLimit from \"p-limit\";\r\nimport { apiGet, apiPost, apiPut } from \"../../api-client.js\";\r\nimport { requireProject, requireProjectPath, resolveItemId, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { runClaude } from \"../../lib/claude-runner.js\";\r\nimport { AgentStreamer, completeSession, updatePhase } from \"../../lib/agent-streamer.js\";\r\nimport { readKnowledge, getItemComments, formatCommentsContext, buildSuggestPrompt } from \"../../lib/prompt-builder.js\";\r\nimport { AgentProgressTracker } from \"../../lib/progress-tracker.js\";\r\nimport type { WorkItem } from \"../../types.js\";\r\n\r\nexport async function suggestOne(\r\n slug: string,\r\n projectPath: string,\r\n idOrNumber: string,\r\n tracker?: AgentProgressTracker,\r\n): Promise<Record<string, any>> {\r\n let item: WorkItem;\r\n try {\r\n item = await resolveItemId(slug, idOrNumber);\r\n } catch (e: any) {\r\n return { key: idOrNumber, status: \"failed\", error: `Resolve failed: ${e.message}` };\r\n }\r\n\r\n const itemId = item.id;\r\n const key = item.key ?? `#${item.number}`;\r\n\r\n // Start agent session\r\n let sessionId: string | number | null = null;\r\n try {\r\n const session = await apiPost(\"/api/agent-sessions/start\", {\r\n work_item_id: itemId, origin: \"cli\", phase: \"suggest\",\r\n }, { project_slug: slug });\r\n sessionId = session.id;\r\n } catch {}\r\n\r\n if (tracker && sessionId) {\r\n tracker.update(key, \"suggest\", \"running\", \"Starting analysis...\");\r\n }\r\n\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildSuggestPrompt(item, knowledge, commentsCtx);\r\n\r\n let streamer: AgentStreamer | null = null;\r\n if (sessionId) {\r\n streamer = new AgentStreamer(sessionId);\r\n if (tracker) {\r\n streamer.setCallback((_p, t) => {\r\n if (t) tracker.update(key, \"suggest\", \"running\", t.slice(0, 60));\r\n });\r\n }\r\n streamer.start();\r\n await updatePhase(sessionId, \"suggest\");\r\n }\r\n\r\n const result = await runClaude({\r\n cmd: [\"claude\", \"-p\", prompt, \"--output-format\", \"stream-json\"],\r\n cwd: projectPath,\r\n onLine: (line) => streamer?.feed(line),\r\n });\r\n\r\n const textBlocks = streamer?.stop() ?? [];\r\n\r\n if (result.returncode !== 0) {\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: result.stderr.slice(0, 500) });\r\n return { key, status: \"failed\", error: result.stderr.slice(0, 500) || `Exit code ${result.returncode}` };\r\n }\r\n\r\n const suggestion = textBlocks.join(\"\\n\\n\");\r\n if (!suggestion) {\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: \"Empty response\" });\r\n return { key, status: \"failed\", error: \"Empty response\" };\r\n }\r\n\r\n // Post comment\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: suggestion, author: \"bb-agent\", type: \"proposal\",\r\n });\r\n\r\n // Advance status\r\n if (item.status === \"open\") {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"confirmed\" });\r\n }\r\n\r\n if (sessionId) await completeSession(sessionId, \"completed\");\r\n return { key, status: \"ok\", suggestion: suggestion.slice(0, 200) };\r\n}\r\n\r\nexport const suggestCommand = new Command(\"suggest\")\r\n .description(\"Phase 1: Analyse a work item and post a solution plan\")\r\n .argument(\"<id>\", \"Work item ID, number, or KEY-number\")\r\n .action(async (id: string) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n\r\n console.log(chalk.cyan(`Fetching work item ${id}...`));\r\n const item = await resolveItemId(slug, id);\r\n const itemId = item.id;\r\n const key = item.key ?? `#${item.number}`;\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildSuggestPrompt(item, knowledge, commentsCtx);\r\n\r\n console.log(chalk.cyan(`Running Claude Code analysis in ${projectPath}...`));\r\n\r\n const result = await runClaude({\r\n cmd: [\"claude\", \"-p\", prompt, \"--output-format\", \"stream-json\"],\r\n cwd: projectPath,\r\n onLine: (line) => {\r\n try {\r\n const payload = JSON.parse(line);\r\n if (payload.type === \"assistant\") {\r\n for (const block of payload.content ?? []) {\r\n if (block.type === \"text\") process.stdout.write(block.text);\r\n }\r\n }\r\n } catch {}\r\n },\r\n });\r\n\r\n if (result.returncode !== 0) {\r\n console.error(chalk.red(`Claude analysis failed:\\n${result.stderr}`));\r\n process.exit(1);\r\n }\r\n\r\n const suggestion = result.textBlocks.join(\"\\n\\n\");\r\n if (!suggestion) {\r\n console.error(chalk.red(\"Claude returned an empty response.\"));\r\n process.exit(1);\r\n }\r\n\r\n // Post as agent comment\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: suggestion, author: \"bb-agent\", type: \"proposal\",\r\n });\r\n console.log(chalk.green(\"Suggestion posted as comment on the work item.\"));\r\n\r\n // Save plan\r\n await apiPut(`/api/work-items/${itemId}`, { plan: suggestion });\r\n console.log(chalk.green(\"Plan saved to work item.\"));\r\n\r\n if (item.status === \"open\") {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"confirmed\" });\r\n console.log(chalk.dim(\"Status -> confirmed\"));\r\n }\r\n });\r\n });\r\n\r\nexport const batchSuggestCommand = new Command(\"batch-suggest\")\r\n .description(\"Analyse multiple work items in parallel\")\r\n .argument(\"[items...]\", \"Work item IDs/numbers\")\r\n .option(\"-A, --all\", \"Suggest all open items\")\r\n .option(\"-P, --parallel <n>\", \"Max parallel analyses\", \"3\")\r\n .action(async (items: string[], opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n const maxParallel = parseInt(opts.parallel, 10);\r\n\r\n if (opts.all) {\r\n const openItems = await apiGet<WorkItem[]>(`/api/projects/${slug}/work-items`, { status: \"open\" });\r\n const filtered = openItems.filter(i => i.type !== \"epic\");\r\n if (!filtered.length) {\r\n console.log(chalk.yellow(\"No open items found.\"));\r\n return;\r\n }\r\n items = filtered.map(i => i.key ?? String(i.number));\r\n console.log(chalk.cyan(`Found ${items.length} open items: ${items.join(\", \")}`));\r\n } else if (!items.length) {\r\n console.error(chalk.red(\"Provide item IDs or use --all flag.\"));\r\n process.exit(1);\r\n }\r\n\r\n console.log(chalk.cyan(`Suggesting ${items.length} items (max ${maxParallel} parallel)...\\n`));\r\n\r\n const tracker = new AgentProgressTracker();\r\n for (const ref of items) tracker.register(ref);\r\n tracker.start();\r\n\r\n const limit = pLimit(maxParallel);\r\n const results = await Promise.all(\r\n items.map(ref =>\r\n limit(async () => {\r\n const r = await suggestOne(slug, projectPath, ref, tracker);\r\n tracker.complete(ref, r.status === \"ok\", r.error ?? \"Done\");\r\n return r;\r\n }),\r\n ),\r\n );\r\n\r\n tracker.stop();\r\n\r\n const ok = results.filter(r => r.status === \"ok\").length;\r\n console.log(chalk.bold(`\\nDone: ${ok}/${items.length} succeeded.`));\r\n\r\n if (ok > 0) {\r\n const suggested = results.filter(r => r.status === \"ok\").map(r => r.key);\r\n console.log(chalk.dim(`\\nReview suggestions, then run:`));\r\n console.log(chalk.dim(` bb agent batch-execute ${suggested.join(\" \")}`));\r\n }\r\n });\r\n });\r\n","import { execa } from \"execa\";\r\nimport fs from \"node:fs\";\r\nimport { execSync } from \"node:child_process\";\r\nimport { createInterface } from \"node:readline\";\r\nimport type { ClaudeResult } from \"../types.js\";\r\n\r\nconst CLAUDE_PROCESS_TIMEOUT = 30 * 60 * 1000; // 30 min\r\nconst CLAUDE_STALL_TIMEOUT = 5 * 60 * 1000; // 5 min\r\n\r\nexport { CLAUDE_PROCESS_TIMEOUT, CLAUDE_STALL_TIMEOUT };\r\n\r\n/**\r\n * Resolve the full path to the claude CLI binary.\r\n *\r\n * On Windows, subprocess spawning may not find 'claude' if invoked through\r\n * an npm wrapper chain (bb.cmd -> node -> python). We resolve the full\r\n * path once using a PATH search.\r\n */\r\nfunction claudeBin(): string {\r\n // Use platform-appropriate `which` / `where` to find claude in PATH\r\n try {\r\n const cmd = process.platform === \"win32\" ? \"where claude\" : \"which claude\";\r\n const resolved = execSync(cmd, { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] })\r\n .split(\"\\n\")[0]\r\n .trim();\r\n if (resolved) return resolved;\r\n } catch {\r\n // Not found via which/where\r\n }\r\n\r\n // Fallback: common install locations on Windows\r\n if (process.platform === \"win32\") {\r\n const home = process.env.USERPROFILE ?? process.env.HOME ?? \"\";\r\n const candidates = [\r\n `${home}\\\\.local\\\\bin\\\\claude.exe`,\r\n `${home}\\\\AppData\\\\Roaming\\\\npm\\\\claude.cmd`,\r\n ];\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate;\r\n }\r\n }\r\n\r\n // Let it fail naturally with a clear error\r\n return \"claude\";\r\n}\r\n\r\n/**\r\n * Build env for Claude subprocess.\r\n * Removes CLAUDECODE to avoid session conflicts with the spawning Claude.\r\n */\r\nfunction claudeEnv(): Record<string, string | undefined> {\r\n const env = { ...process.env };\r\n delete env.CLAUDECODE;\r\n return env;\r\n}\r\n\r\nexport interface RunClaudeOptions {\r\n /** Full command array, e.g. [\"claude\", \"-p\", prompt, \"--output-format\", \"stream-json\"] */\r\n cmd: string[];\r\n /** Working directory for the subprocess */\r\n cwd: string;\r\n /** Callback invoked for each stdout line */\r\n onLine?: (line: string) => void;\r\n /** Data to write to stdin (e.g. MCP config JSON) */\r\n stdinData?: string;\r\n /** Total process timeout in ms (default 30 min) */\r\n timeout?: number;\r\n /** Stall watchdog timeout in ms (default 5 min) */\r\n stallTimeout?: number;\r\n}\r\n\r\n/**\r\n * Run Claude CLI subprocess with timeout, watchdog, and line-by-line output.\r\n *\r\n * - Reads stdout + stderr concurrently (no deadlock)\r\n * - Total process timeout (default 30 min)\r\n * - Stall watchdog: aborts if no stdout for stallTimeout ms\r\n * - Always captures stderr for error reporting\r\n */\r\nexport async function runClaude(opts: RunClaudeOptions): Promise<ClaudeResult> {\r\n const resolvedCmd = [...opts.cmd];\r\n if (resolvedCmd[0] === \"claude\") {\r\n resolvedCmd[0] = claudeBin();\r\n }\r\n\r\n const timeout = opts.timeout ?? CLAUDE_PROCESS_TIMEOUT;\r\n const stallTimeout = opts.stallTimeout ?? CLAUDE_STALL_TIMEOUT;\r\n\r\n const stderrChunks: string[] = [];\r\n let lastOutputTime = Date.now();\r\n let timedOut = false;\r\n let stalled = false;\r\n\r\n // AbortController for timeout / stall abort\r\n const controller = new AbortController();\r\n\r\n const totalTimer = setTimeout(() => {\r\n timedOut = true;\r\n controller.abort();\r\n }, timeout);\r\n\r\n // Stall watchdog: check every 30s if stdout has gone silent\r\n const stallChecker = setInterval(() => {\r\n if (Date.now() - lastOutputTime >= stallTimeout) {\r\n stalled = true;\r\n controller.abort();\r\n }\r\n }, 30_000);\r\n\r\n try {\r\n const proc = execa(resolvedCmd[0], resolvedCmd.slice(1), {\r\n cwd: opts.cwd,\r\n env: claudeEnv(),\r\n stdin: opts.stdinData ? \"pipe\" : undefined,\r\n stdout: \"pipe\",\r\n stderr: \"pipe\",\r\n cancelSignal: controller.signal,\r\n gracefulCancel: true,\r\n });\r\n\r\n // Write stdin if provided (e.g. MCP config)\r\n if (opts.stdinData && proc.stdin) {\r\n proc.stdin.write(opts.stdinData);\r\n proc.stdin.end();\r\n }\r\n\r\n // Collect stderr in parallel (non-blocking)\r\n proc.stderr?.on(\"data\", (chunk: Buffer) => {\r\n stderrChunks.push(chunk.toString());\r\n });\r\n\r\n // Read stdout line by line\r\n if (proc.stdout) {\r\n const rl = createInterface({ input: proc.stdout });\r\n for await (const line of rl) {\r\n lastOutputTime = Date.now();\r\n if (opts.onLine) opts.onLine(line);\r\n }\r\n }\r\n\r\n // Wait for process to exit\r\n const result = await proc;\r\n\r\n return {\r\n returncode: result.exitCode ?? 0,\r\n textBlocks: [],\r\n stderr: stderrChunks.join(\"\").trim(),\r\n timedOut,\r\n stalled,\r\n };\r\n } catch (err: any) {\r\n // Check if watchdog killed it (SIGKILL on Linux/macOS, exit 1 on Windows)\r\n if (\r\n !timedOut &&\r\n (err.exitCode === 137 || err.signal === \"SIGKILL\")\r\n ) {\r\n stalled = true;\r\n }\r\n\r\n return {\r\n returncode: err.exitCode ?? 1,\r\n textBlocks: [],\r\n stderr: stderrChunks.join(\"\").trim() || err.stderr || err.message,\r\n timedOut,\r\n stalled,\r\n };\r\n } finally {\r\n clearTimeout(totalTimer);\r\n clearInterval(stallChecker);\r\n }\r\n}\r\n","import fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport os from \"node:os\";\r\nimport { apiPost, apiPatch } from \"../api-client.js\";\r\n\r\n/**\r\n * Return (and create) the logs directory at ~/.bumblebee/logs.\r\n */\r\nfunction logsDir(): string {\r\n const d = path.join(os.homedir(), \".bumblebee\", \"logs\");\r\n fs.mkdirSync(d, { recursive: true });\r\n return d;\r\n}\r\n\r\n/**\r\n * Buffered relay for Claude CLI stream-json output.\r\n *\r\n * - Reads JSON lines via feed()\r\n * - Writes each line to a local log file immediately (safety net)\r\n * - Batches events and POSTs to /relay-batch periodically\r\n * - Extracts text blocks for summary\r\n */\r\nexport class AgentStreamer {\r\n private sessionId: string | number;\r\n private textBlocks: string[] = [];\r\n private logPath: string;\r\n private logStream: fs.WriteStream;\r\n private buffer: any[] = [];\r\n private flushTimer: ReturnType<typeof setInterval> | null = null;\r\n private callback?: (payload: any, text: string | null) => void;\r\n\r\n static readonly BATCH_SIZE = 20;\r\n static readonly FLUSH_INTERVAL = 500; // ms\r\n\r\n constructor(sessionId: string | number) {\r\n this.sessionId = sessionId;\r\n this.logPath = path.join(logsDir(), `session-${sessionId}.jsonl`);\r\n this.logStream = fs.createWriteStream(this.logPath, { flags: \"a\" });\r\n }\r\n\r\n /** All extracted text blocks from assistant messages. */\r\n get texts(): string[] {\r\n return this.textBlocks;\r\n }\r\n\r\n /** Path to the local log file. */\r\n get logFile(): string {\r\n return this.logPath;\r\n }\r\n\r\n /**\r\n * Set a callback invoked for each parsed event.\r\n * Signature: (payload: any, text: string | null) => void\r\n */\r\n setCallback(cb: (payload: any, text: string | null) => void): void {\r\n this.callback = cb;\r\n }\r\n\r\n /** Start the periodic flush timer. */\r\n start(): void {\r\n this.flushTimer = setInterval(() => this.flush(), AgentStreamer.FLUSH_INTERVAL);\r\n }\r\n\r\n /**\r\n * Feed a raw JSON line from Claude CLI stdout.\r\n * Parses JSON, writes to log, extracts text blocks, buffers for relay.\r\n */\r\n feed(line: string): void {\r\n line = line.trim();\r\n if (!line) return;\r\n\r\n let payload: any;\r\n try {\r\n payload = JSON.parse(line);\r\n } catch {\r\n return;\r\n }\r\n\r\n // Write to log file immediately (safety net)\r\n this.logStream.write(line + \"\\n\");\r\n\r\n // Extract text blocks from assistant messages\r\n let text: string | null = null;\r\n if (payload.type === \"assistant\") {\r\n for (const block of payload.content ?? []) {\r\n if (block.type === \"text\") {\r\n text = block.text as string;\r\n if (text) this.textBlocks.push(text);\r\n }\r\n }\r\n }\r\n\r\n // Notify callback (for terminal display, progress tracker, etc.)\r\n if (this.callback) {\r\n try {\r\n this.callback(payload, text);\r\n } catch {\r\n // Swallow callback errors\r\n }\r\n }\r\n\r\n // Buffer for batch relay\r\n this.buffer.push(payload);\r\n if (this.buffer.length >= AgentStreamer.BATCH_SIZE) {\r\n this.flush();\r\n }\r\n }\r\n\r\n /**\r\n * Stop streaming, flush remaining events, close log file.\r\n * Returns all extracted text blocks.\r\n */\r\n stop(): string[] {\r\n if (this.flushTimer) {\r\n clearInterval(this.flushTimer);\r\n this.flushTimer = null;\r\n }\r\n this.flush();\r\n this.logStream.end();\r\n return this.textBlocks;\r\n }\r\n\r\n /** Flush buffered events to the API (fire-and-forget). */\r\n private flush(): void {\r\n if (this.buffer.length === 0) return;\r\n const events = [...this.buffer];\r\n this.buffer = [];\r\n\r\n // POST batch to API. Swallow errors -- log file is the safety net.\r\n apiPost(\r\n `/api/agent-sessions/${this.sessionId}/relay-batch`,\r\n { events },\r\n ).catch(() => {});\r\n }\r\n}\r\n\r\n/**\r\n * Update agent session phase via API (fire-and-forget).\r\n */\r\nexport async function updatePhase(\r\n sessionId: string | number,\r\n phase: string,\r\n extra?: Record<string, any>,\r\n): Promise<void> {\r\n try {\r\n await apiPatch(`/api/agent-sessions/${sessionId}/phase`, {\r\n phase,\r\n ...extra,\r\n });\r\n } catch {\r\n // Best-effort -- don't crash on phase update failure\r\n }\r\n}\r\n\r\n/**\r\n * Mark agent session as completed/failed via API (fire-and-forget).\r\n */\r\nexport async function completeSession(\r\n sessionId: string | number,\r\n status: string,\r\n extra?: Record<string, any>,\r\n): Promise<void> {\r\n try {\r\n await apiPost(`/api/agent-sessions/${sessionId}/complete`, {\r\n status,\r\n ...extra,\r\n });\r\n } catch {\r\n // Best-effort -- don't crash on completion failure\r\n }\r\n}\r\n","import fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { apiGet } from \"../api-client.js\";\r\nimport type { WorkItem, Comment } from \"../types.js\";\r\n\r\n/**\r\n * Read knowledge base files from the project directory.\r\n * Searches standard locations: CLAUDE.md, docs/knowledge.md, .claude/lessons-learned.md\r\n */\r\nexport function readKnowledge(projectPath: string): string {\r\n const candidates = [\r\n \"CLAUDE.md\",\r\n \"docs/knowledge.md\",\r\n \".claude/lessons-learned.md\",\r\n ];\r\n const parts: string[] = [];\r\n for (const rel of candidates) {\r\n const fp = path.join(projectPath, rel);\r\n if (fs.existsSync(fp)) {\r\n try {\r\n const text = fs.readFileSync(fp, \"utf-8\").trim();\r\n if (text) parts.push(`### ${rel}\\n\\n${text}`);\r\n } catch {\r\n // Skip unreadable files\r\n }\r\n }\r\n }\r\n return parts.join(\"\\n\\n---\\n\\n\");\r\n}\r\n\r\n/**\r\n * Fetch comments for a work item from the API.\r\n * Returns empty array on failure.\r\n */\r\nexport async function getItemComments(itemId: string): Promise<Comment[]> {\r\n try {\r\n return await apiGet<Comment[]>(`/api/work-items/${itemId}/comments`);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Format comments into a context section for prompts.\r\n */\r\nexport function formatCommentsContext(comments: Comment[]): string {\r\n if (!comments.length) return \"\";\r\n const parts = [\"## Previous Comments / Progress\"];\r\n for (const c of comments) {\r\n const tag = c.type !== \"discussion\" ? ` [${c.type}]` : \"\";\r\n parts.push(`\\n### ${c.author}${tag} -- ${c.created_at}\\n${c.body}`);\r\n }\r\n return parts.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Keep the last maxChars characters of output for embedding in prompts.\r\n */\r\nfunction truncateOutput(output: string, maxChars = 4000): string {\r\n if (output.length <= maxChars) return output;\r\n return (\r\n `... (truncated, showing last ${maxChars} chars)\\n` +\r\n output.slice(-maxChars)\r\n );\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Shared helper to build the common item header lines\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction itemHeader(\r\n item: WorkItem,\r\n verb: string,\r\n includeStatus = false,\r\n): string[] {\r\n const key = item.key ?? `#${item.number}`;\r\n const parts = [`You are ${verb} ${item.type} ${key}: ${item.title}`, \"\"];\r\n if (includeStatus) {\r\n parts.push(\r\n `Type: ${item.type} | Priority: ${item.priority} | Status: ${item.status}`,\r\n );\r\n } else {\r\n parts.push(`Type: ${item.type} | Priority: ${item.priority}`);\r\n }\r\n return parts;\r\n}\r\n\r\nfunction appendContext(\r\n parts: string[],\r\n item: WorkItem,\r\n knowledge: string,\r\n commentsCtx: string,\r\n planHeading = \"## Existing Plan\",\r\n): void {\r\n if (item.description) {\r\n parts.push(\"\", \"## Description\", item.description);\r\n }\r\n if (item.acceptance_criteria) {\r\n parts.push(\"\", \"## Acceptance Criteria\", item.acceptance_criteria);\r\n }\r\n if (item.plan) {\r\n parts.push(\"\", planHeading, item.plan);\r\n }\r\n if (commentsCtx) {\r\n parts.push(\"\", commentsCtx);\r\n }\r\n if (knowledge) {\r\n parts.push(\"\", \"## Project Knowledge Base\", knowledge);\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Prompt builders -- ported from Python _build_*_prompt functions\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Phase 1 prompt -- analyse only, no code changes.\r\n */\r\nexport function buildSuggestPrompt(\r\n item: WorkItem,\r\n knowledge: string,\r\n commentsCtx: string,\r\n): string {\r\n const parts = itemHeader(item, \"analysing\", /* includeStatus */ true);\r\n\r\n appendContext(parts, item, knowledge, commentsCtx, \"## Existing Plan\");\r\n\r\n parts.push(\r\n \"\",\r\n \"## Your Task\",\r\n \"\",\r\n \"Analyse this work item **and** the project source code. Return a Markdown plan:\",\r\n \"\",\r\n \"1. **Root Cause / Analysis** -- what needs to change and why\",\r\n \"2. **Files to Modify** -- list every file with a short description of the change\",\r\n \"3. **Implementation Steps** -- numbered, concrete steps\",\r\n \"4. **Testing Strategy** -- how to verify the changes\",\r\n \"5. **Risks & Considerations** -- edge cases, breaking changes\",\r\n \"\",\r\n \"IMPORTANT: Do NOT modify any files. Only analyse and produce the plan.\",\r\n );\r\n\r\n // Split analysis section (required)\r\n parts.push(\r\n \"\",\r\n \"## Split Analysis (Required)\",\r\n \"\",\r\n \"Analyze which packages (api/, web/, cli/) this item affects.\",\r\n \"Output in exact format at the end of your response:\",\r\n \"\",\r\n \"### SPLIT_RESULT\",\r\n \"NEEDS_SPLIT: true|false\",\r\n \"ITEMS:\",\r\n \"- SCOPE: <package>\",\r\n \" TITLE: <task title>\",\r\n \" DESCRIPTION: <what to do>\",\r\n \" ACCEPTANCE_CRITERIA: <testable criteria>\",\r\n \"\",\r\n \"If the item only affects one package, set NEEDS_SPLIT: false and omit ITEMS.\",\r\n );\r\n\r\n return parts.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Phase 2 prompt -- implement the changes.\r\n */\r\nexport function buildExecutePrompt(\r\n item: WorkItem,\r\n knowledge: string,\r\n commentsCtx: string,\r\n): string {\r\n const parts = itemHeader(item, \"implementing\");\r\n\r\n appendContext(parts, item, knowledge, commentsCtx, \"## Implementation Plan\");\r\n\r\n parts.push(\r\n \"\",\r\n \"## Instructions\",\r\n \"\",\r\n \"Implement the changes described in the plan / comments above.\",\r\n \"\",\r\n \"1. Follow the project's existing coding conventions and patterns\",\r\n \"2. Work through changes one file at a time\",\r\n \"3. Run existing tests after your changes and fix any failures\",\r\n \"4. Add new tests where appropriate\",\r\n \"5. Commit your work with a clear, descriptive commit message\",\r\n \"6. If you hit a blocker, document it clearly so the next run can continue\",\r\n );\r\n\r\n return parts.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Phase 3 prompt -- run tests and verify implementation.\r\n */\r\nexport function buildTestPrompt(\r\n item: WorkItem,\r\n knowledge: string,\r\n commentsCtx: string,\r\n): string {\r\n const parts = itemHeader(item, \"verifying the implementation of\");\r\n\r\n // Test prompt does NOT include plan, only description + acceptance criteria\r\n if (item.description) {\r\n parts.push(\"\", \"## Description\", item.description);\r\n }\r\n if (item.acceptance_criteria) {\r\n parts.push(\"\", \"## Acceptance Criteria\", item.acceptance_criteria);\r\n }\r\n if (commentsCtx) {\r\n parts.push(\"\", commentsCtx);\r\n }\r\n if (knowledge) {\r\n parts.push(\"\", \"## Project Knowledge Base\", knowledge);\r\n }\r\n\r\n parts.push(\r\n \"\",\r\n \"## Your Task\",\r\n \"\",\r\n \"Run ALL relevant tests and verify the implementation. Follow these steps:\",\r\n \"\",\r\n \"1. Identify test commands from CLAUDE.md or project config (pytest, vitest, npm test, etc.)\",\r\n \"2. Run all relevant test suites\",\r\n \"3. Check acceptance criteria from the work item (if any)\",\r\n \"4. Review the git diff for obvious issues\",\r\n \"\",\r\n \"Return a structured test report in this format:\",\r\n \"\",\r\n \"## Test Report\",\r\n \"\",\r\n \"### Results\",\r\n \"- **Status**: PASS or FAIL\",\r\n \"- **Tests run**: <count>\",\r\n \"- **Passed**: <count>\",\r\n \"- **Failed**: <count>\",\r\n \"\",\r\n \"### Failing Tests (if any)\",\r\n \"- Test name: reason for failure\",\r\n \"\",\r\n \"### Acceptance Criteria Check\",\r\n \"- [x] or [ ] for each criterion\",\r\n \"\",\r\n \"### Root Cause Analysis (if failures)\",\r\n \"Brief analysis of why tests are failing.\",\r\n \"\",\r\n \"IMPORTANT: Do NOT fix any code. Only run tests and report results.\",\r\n );\r\n\r\n return parts.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Re-implementation prompt -- reads previous failure reasons and tries again.\r\n */\r\nexport function buildReimplementPrompt(\r\n item: WorkItem,\r\n knowledge: string,\r\n commentsCtx: string,\r\n dockerOutput = \"\",\r\n): string {\r\n const key = item.key ?? `#${item.number}`;\r\n const parts = [\r\n `You are RE-IMPLEMENTING ${item.type} ${key}: ${item.title}`,\r\n \"\",\r\n `Type: ${item.type} | Priority: ${item.priority}`,\r\n \"\",\r\n \"**IMPORTANT: A previous implementation attempt had test failures.**\",\r\n \"Read the comments below carefully — they contain the original plan,\",\r\n \"execution report, and test failure details. Fix the issues identified\",\r\n \"in the test report.\",\r\n ];\r\n\r\n appendContext(parts, item, knowledge, commentsCtx, \"## Implementation Plan\");\r\n\r\n if (dockerOutput) {\r\n const truncated = truncateOutput(dockerOutput, 3000);\r\n parts.push(\r\n \"\",\r\n \"## Docker Test Output (from last run)\",\r\n \"\",\r\n \"The following is the raw Docker test output. Use this to identify exact failures:\",\r\n \"\",\r\n `\\`\\`\\`\\n${truncated}\\n\\`\\`\\``,\r\n );\r\n }\r\n\r\n parts.push(\r\n \"\",\r\n \"## Instructions\",\r\n \"\",\r\n \"1. Read the test report and failure reasons from previous comments AND the Docker output above\",\r\n \"2. Identify what went wrong in the previous implementation\",\r\n \"3. Fix the issues — focus on the root causes identified in the test report\",\r\n \"4. Ensure all tests pass after your changes\",\r\n \"5. Run the full test suite to verify no regressions\",\r\n \"6. Commit your fixes with a clear message referencing the re-implementation\",\r\n \"7. If you hit a blocker, document it clearly\",\r\n );\r\n\r\n return parts.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Verify prompt -- analyse requirements feasibility, return READY or NEEDS_INFO verdict.\r\n */\r\nexport function buildVerifyPrompt(\r\n item: WorkItem,\r\n knowledge: string,\r\n commentsCtx: string,\r\n): string {\r\n const parts = itemHeader(\r\n item,\r\n \"verifying requirements for\",\r\n /* includeStatus */ true,\r\n );\r\n\r\n appendContext(parts, item, knowledge, commentsCtx, \"## Existing Plan\");\r\n\r\n parts.push(\r\n \"\",\r\n \"## Your Task\",\r\n \"\",\r\n \"Analyse this work item's requirements AND the project source code. Determine if the item is ready for implementation.\",\r\n \"\",\r\n \"Check the following:\",\r\n \"1. Are the requirements clear and specific enough to implement?\",\r\n \"2. Do acceptance criteria exist and are they testable?\",\r\n \"3. Is the requested change feasible given the current codebase?\",\r\n \"4. Are there any blockers, missing dependencies, or unclear areas?\",\r\n \"\",\r\n \"Return a structured analysis:\",\r\n \"\",\r\n \"## Requirement Analysis\",\r\n \"\",\r\n \"### Clarity\",\r\n \"- Are requirements clear? What's ambiguous?\",\r\n \"\",\r\n \"### Feasibility\",\r\n \"- What files need to change?\",\r\n \"- Is the architecture compatible?\",\r\n \"- Any technical blockers?\",\r\n \"\",\r\n \"### Solution Approach\",\r\n \"- Proposed approach (high-level)\",\r\n \"- Files to modify with brief description\",\r\n \"- Estimated complexity (low/medium/high)\",\r\n \"\",\r\n \"### Blockers & Missing Information\",\r\n \"- List anything that would prevent implementation\",\r\n \"\",\r\n \"### VERDICT: READY\",\r\n \"or\",\r\n \"### VERDICT: NEEDS_INFO\",\r\n \"- If NEEDS_INFO, list exactly what information is missing\",\r\n \"\",\r\n \"IMPORTANT:\",\r\n \"- You MUST include exactly one verdict line: `VERDICT: READY` or `VERDICT: NEEDS_INFO`\",\r\n \"- Do NOT modify any files. Only analyse and produce the assessment.\",\r\n );\r\n\r\n return parts.join(\"\\n\");\r\n}\r\n","import logUpdate from \"log-update\";\r\nimport chalk from \"chalk\";\r\n\r\ninterface ItemProgress {\r\n phase: string;\r\n status: string;\r\n lastLine: string;\r\n start: number;\r\n}\r\n\r\n/**\r\n * Live terminal progress tracker for batch agent operations.\r\n *\r\n * Uses log-update for in-place terminal rendering (equivalent of Rich Live).\r\n *\r\n * Usage:\r\n * const tracker = new AgentProgressTracker();\r\n * tracker.register(\"BB-42\");\r\n * tracker.start();\r\n * // From async workers:\r\n * tracker.update(\"BB-42\", \"execute\", \"running\", \"Modifying auth.py\");\r\n * tracker.complete(\"BB-42\", true, \"Done\");\r\n * tracker.stop();\r\n */\r\nexport class AgentProgressTracker {\r\n private data = new Map<string, ItemProgress>();\r\n private startTime = Date.now();\r\n private completed = 0;\r\n private total = 0;\r\n private timer: ReturnType<typeof setInterval> | null = null;\r\n\r\n /** Register an item before work starts. */\r\n register(itemKey: string): void {\r\n this.data.set(itemKey, {\r\n phase: \"pending\",\r\n status: \"waiting\",\r\n lastLine: \"\",\r\n start: Date.now(),\r\n });\r\n this.total++;\r\n }\r\n\r\n /** Update progress for an item. */\r\n update(itemKey: string, phase: string, status: string, lastLine: string): void {\r\n const existing = this.data.get(itemKey);\r\n const start = existing?.start ?? Date.now();\r\n this.data.set(itemKey, { phase, status, lastLine, start });\r\n this.render();\r\n }\r\n\r\n /** Mark an item as completed or failed. */\r\n complete(itemKey: string, success: boolean, message = \"\"): void {\r\n const existing = this.data.get(itemKey);\r\n if (existing) {\r\n existing.status = success ? \"done\" : \"failed\";\r\n existing.lastLine = message.slice(0, 60);\r\n }\r\n this.completed++;\r\n this.render();\r\n }\r\n\r\n /** Start periodic render updates (every 500ms). */\r\n start(): void {\r\n this.timer = setInterval(() => this.render(), 500);\r\n }\r\n\r\n /** Stop updates and persist final output. */\r\n stop(): void {\r\n if (this.timer) {\r\n clearInterval(this.timer);\r\n this.timer = null;\r\n }\r\n this.render(); // final render\r\n logUpdate.done(); // persist the output (prevent overwrite)\r\n }\r\n\r\n /** Render the progress table to the terminal using log-update. */\r\n private render(): void {\r\n const lines: string[] = [];\r\n lines.push(\r\n chalk.bold.cyan(\r\n \" Item Phase Status Last Output\",\r\n ),\r\n );\r\n lines.push(chalk.dim(\" \" + \"\\u2500\".repeat(70)));\r\n\r\n for (const [key, info] of this.data) {\r\n const statusColor =\r\n info.status === \"running\"\r\n ? chalk.yellow\r\n : info.status === \"done\"\r\n ? chalk.green\r\n : info.status === \"failed\"\r\n ? chalk.red\r\n : chalk.dim;\r\n\r\n lines.push(\r\n ` ${chalk.bold(key.padEnd(12))} ${info.phase.padEnd(14)} ${statusColor(info.status.padEnd(10))} ${chalk.dim(info.lastLine.slice(0, 50))}`,\r\n );\r\n }\r\n\r\n const elapsed = Math.floor((Date.now() - this.startTime) / 1000);\r\n const mins = Math.floor(elapsed / 60);\r\n const secs = elapsed % 60;\r\n lines.push(\"\");\r\n lines.push(\r\n chalk.dim(\r\n ` Elapsed: ${mins}m ${secs.toString().padStart(2, \"0\")}s | ${this.completed}/${this.total} complete | Ctrl+C to abort`,\r\n ),\r\n );\r\n\r\n logUpdate(lines.join(\"\\n\"));\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport pLimit from \"p-limit\";\r\nimport { apiGet, apiPost, apiPut } from \"../../api-client.js\";\r\nimport { getApiUrl, getToken } from \"../../config.js\";\r\nimport { requireProject, requireProjectPath, resolveItemId, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { runClaude } from \"../../lib/claude-runner.js\";\r\nimport { AgentStreamer, completeSession, updatePhase } from \"../../lib/agent-streamer.js\";\r\nimport { readKnowledge, getItemComments, formatCommentsContext, buildExecutePrompt } from \"../../lib/prompt-builder.js\";\r\nimport { createWorktree, removeWorktree } from \"../../lib/git-worktree.js\";\r\nimport { AgentProgressTracker } from \"../../lib/progress-tracker.js\";\r\nimport type { WorkItem } from \"../../types.js\";\r\n\r\nfunction buildMcpConfig(): string {\r\n const apiUrl = getApiUrl();\r\n const token = getToken();\r\n return JSON.stringify({\r\n mcpServers: {\r\n bumblebee: {\r\n url: `${apiUrl}/mcp`,\r\n headers: token ? { Authorization: `Bearer ${token}` } : {},\r\n },\r\n },\r\n });\r\n}\r\n\r\nexport async function executeOne(\r\n slug: string,\r\n projectPath: string,\r\n idOrNumber: string,\r\n tracker?: AgentProgressTracker,\r\n): Promise<Record<string, any>> {\r\n let item: WorkItem;\r\n try {\r\n item = await resolveItemId(slug, idOrNumber);\r\n } catch (e: any) {\r\n return { key: idOrNumber, status: \"failed\", error: `Resolve failed: ${e.message}` };\r\n }\r\n\r\n const itemId = item.id;\r\n const key = item.key ?? `#${item.number}`;\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildExecutePrompt(item, knowledge, commentsCtx);\r\n\r\n // Create worktree\r\n let workDir: string;\r\n let branchName: string;\r\n try {\r\n const wt = await createWorktree(projectPath, slug, item);\r\n workDir = wt.worktreePath;\r\n branchName = wt.branchName;\r\n } catch (e: any) {\r\n return { key, status: \"failed\", error: `Worktree failed: ${e.message}` };\r\n }\r\n\r\n // Agent session\r\n let sessionId: string | number;\r\n try {\r\n const session = await apiPost(\"/api/agent-sessions/start\", {\r\n work_item_id: itemId, origin: \"cli\", phase: \"execute\",\r\n }, { project_slug: slug });\r\n sessionId = session.id;\r\n } catch (e: any) {\r\n return { key, status: \"failed\", error: `Session start failed: ${e.message}`, branch: branchName };\r\n }\r\n\r\n await updatePhase(sessionId, \"execute\", { branch_name: branchName, worktree_path: workDir });\r\n\r\n // Status -> in_progress\r\n if ([\"open\", \"confirmed\", \"approved\"].includes(item.status)) {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_progress\" });\r\n }\r\n\r\n if (tracker) tracker.update(key, \"execute\", \"running\", \"Starting implementation...\");\r\n\r\n const streamer = new AgentStreamer(sessionId);\r\n if (tracker) {\r\n streamer.setCallback((_p, t) => {\r\n if (t) tracker.update(key, \"execute\", \"running\", t.slice(0, 60));\r\n });\r\n }\r\n streamer.start();\r\n\r\n const result = await runClaude({\r\n cmd: [\r\n \"claude\", \"--output-format\", \"stream-json\", \"--verbose\",\r\n \"--permission-mode\", \"bypassPermissions\", \"--mcp-config\", \"-\",\r\n \"-p\", prompt,\r\n ],\r\n cwd: workDir,\r\n onLine: (line) => streamer.feed(line),\r\n stdinData: buildMcpConfig(),\r\n });\r\n\r\n const textBlocks = streamer.stop();\r\n\r\n // Post completion comment\r\n const tail = textBlocks.slice(-3).join(\"\\n\\n\") || \"No text output captured.\";\r\n let extra = \"\";\r\n if (result.timedOut) extra = \"\\n**Reason**: Process timed out\\n\";\r\n else if (result.stalled) extra = \"\\n**Reason**: Process stalled (no output)\\n\";\r\n else if (result.stderr) extra = `\\n**Stderr**: ${result.stderr.slice(0, 300)}\\n`;\r\n\r\n const body = [\r\n \"## Agent Execution Report\\n\",\r\n `**Branch**: \\`${branchName}\\`\\n`,\r\n `**Exit code**: \\`${result.returncode}\\`\\n`,\r\n extra,\r\n `\\n### Output (last messages)\\n\\n${tail}`,\r\n ].join(\"\\n\");\r\n\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body, author: \"bb-agent\", type: \"agent_output\",\r\n });\r\n\r\n if (result.returncode === 0) {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_review\" });\r\n await completeSession(sessionId, \"completed\");\r\n return { key, status: \"ok\", branch: branchName, worktree: workDir };\r\n } else {\r\n await completeSession(sessionId, \"failed\", { error: result.stderr.slice(0, 500) });\r\n return { key, status: \"failed\", error: result.stderr.slice(0, 500) || `Exit code ${result.returncode}`, branch: branchName };\r\n }\r\n}\r\n\r\nexport const executeCommand = new Command(\"execute\")\r\n .description(\"Phase 2: Create a worktree and implement with Claude Code\")\r\n .argument(\"<id>\", \"Work item ID, number, or KEY-number\")\r\n .option(\"--no-worktree\", \"Work in main directory\")\r\n .option(\"--cleanup\", \"Remove worktree after completion\")\r\n .action(async (id: string, opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n\r\n const item = await resolveItemId(slug, id);\r\n const itemId = item.id;\r\n const key = item.key ?? `#${item.number}`;\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildExecutePrompt(item, knowledge, commentsCtx);\r\n\r\n let workDir = projectPath;\r\n let branchName: string | null = null;\r\n\r\n if (opts.worktree !== false) {\r\n console.log(chalk.cyan(`Creating worktree for ${key}...`));\r\n const wt = await createWorktree(projectPath, slug, item);\r\n workDir = wt.worktreePath;\r\n branchName = wt.branchName;\r\n console.log(chalk.green(`Worktree: ${workDir}`));\r\n console.log(chalk.green(`Branch: ${branchName}`));\r\n }\r\n\r\n // Agent session\r\n const session = await apiPost(\"/api/agent-sessions/start\", {\r\n work_item_id: itemId, origin: \"cli\",\r\n }, { project_slug: slug });\r\n const sessionId = session.id;\r\n console.log(chalk.green(`Session: ${sessionId}`));\r\n\r\n if ([\"open\", \"confirmed\", \"approved\"].includes(item.status)) {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_progress\" });\r\n console.log(chalk.dim(\"Status -> in_progress\"));\r\n }\r\n\r\n const streamer = new AgentStreamer(sessionId);\r\n streamer.setCallback((_p, text) => {\r\n if (text) process.stdout.write(text);\r\n });\r\n streamer.start();\r\n\r\n console.log(chalk.cyan(`\\nSpawning Claude Code agent in ${workDir}...\\n`));\r\n\r\n const result = await runClaude({\r\n cmd: [\r\n \"claude\", \"--output-format\", \"stream-json\", \"--verbose\",\r\n \"--permission-mode\", \"bypassPermissions\", \"--mcp-config\", \"-\",\r\n \"-p\", prompt,\r\n ],\r\n cwd: workDir,\r\n onLine: (line) => streamer.feed(line),\r\n stdinData: buildMcpConfig(),\r\n });\r\n\r\n const textBlocks = streamer.stop();\r\n\r\n // Post comment\r\n const tail = textBlocks.slice(-3).join(\"\\n\\n\") || \"No text output captured.\";\r\n const bodyLines = [\"## Agent Execution Report\\n\"];\r\n if (branchName) bodyLines.push(`**Branch**: \\`${branchName}\\`\\n`);\r\n bodyLines.push(`**Exit code**: \\`${result.returncode}\\`\\n`);\r\n if (result.timedOut) bodyLines.push(\"**Reason**: Process timed out\\n\");\r\n else if (result.stalled) bodyLines.push(\"**Reason**: Process stalled (no output)\\n\");\r\n else if (result.stderr) bodyLines.push(`**Stderr**: ${result.stderr.slice(0, 300)}\\n`);\r\n bodyLines.push(`\\n### Output (last messages)\\n\\n${tail}`);\r\n\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: bodyLines.join(\"\\n\"), author: \"bb-agent\", type: \"agent_output\",\r\n });\r\n\r\n if (result.returncode === 0) {\r\n console.log(chalk.green(\"\\nAgent completed successfully.\"));\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_review\" });\r\n console.log(chalk.dim(\"Status -> in_review\"));\r\n } else {\r\n if (result.timedOut) console.log(chalk.yellow(`\\nAgent timed out.`));\r\n else if (result.stalled) console.log(chalk.yellow(`\\nAgent stalled.`));\r\n else console.log(chalk.yellow(`\\nAgent exited with code ${result.returncode}.`));\r\n }\r\n\r\n if (branchName && workDir !== projectPath) {\r\n if (opts.cleanup) {\r\n await removeWorktree(projectPath, workDir);\r\n console.log(chalk.dim(\"Worktree removed.\"));\r\n } else {\r\n console.log(chalk.dim(`\\nWorktree: ${workDir}`));\r\n console.log(chalk.dim(`Cleanup: bb agent cleanup ${item.number}`));\r\n }\r\n }\r\n });\r\n });\r\n\r\nexport const batchExecuteCommand = new Command(\"batch-execute\")\r\n .description(\"Implement multiple work items in parallel\")\r\n .argument(\"<items...>\", \"Work item IDs/numbers\")\r\n .option(\"-P, --parallel <n>\", \"Max parallel agents\", \"2\")\r\n .action(async (items: string[], opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n const maxParallel = parseInt(opts.parallel, 10);\r\n\r\n console.log(chalk.cyan(`Executing ${items.length} items (max ${maxParallel} parallel)...\\n`));\r\n\r\n const tracker = new AgentProgressTracker();\r\n for (const ref of items) tracker.register(ref);\r\n tracker.start();\r\n\r\n const limit = pLimit(maxParallel);\r\n const results = await Promise.all(\r\n items.map(ref =>\r\n limit(async () => {\r\n const r = await executeOne(slug, projectPath, ref, tracker);\r\n tracker.complete(ref, r.status === \"ok\", (r.branch ?? r.error ?? \"Done\").slice(0, 60));\r\n return r;\r\n }),\r\n ),\r\n );\r\n\r\n tracker.stop();\r\n\r\n const ok = results.filter(r => r.status === \"ok\").length;\r\n console.log(chalk.bold(`\\nDone: ${ok}/${items.length} succeeded.`));\r\n\r\n const branches = results.filter(r => r.branch);\r\n if (branches.length) {\r\n console.log(chalk.dim(`\\nMerge all with: bb agent merge --target release/dev`));\r\n }\r\n });\r\n });\r\n","import fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport os from \"node:os\";\r\nimport { execa } from \"execa\";\r\nimport { slugify } from \"./utils.js\";\r\n\r\nconst WORKTREES_DIR = path.join(os.homedir(), \".bumblebee\", \"worktrees\");\r\n\r\n/** Maps work item type to git branch prefix. */\r\nconst TYPE_BRANCH_PREFIX: Record<string, string> = {\r\n epic: \"epic\",\r\n story: \"feat\",\r\n task: \"task\",\r\n bug: \"fix\",\r\n feature: \"feat\",\r\n chore: \"chore\",\r\n spike: \"spike\",\r\n};\r\n\r\nexport { WORKTREES_DIR, TYPE_BRANCH_PREFIX };\r\n\r\n/**\r\n * Build a descriptive branch name from a work item.\r\n *\r\n * Format: {type_prefix}/{key}_{slugified_title}\r\n * Example: feat/bb-42_authentication-by-google\r\n */\r\nexport function buildBranchName(item: {\r\n type: string;\r\n key?: string;\r\n number: number;\r\n title: string;\r\n}): string {\r\n const prefix = TYPE_BRANCH_PREFIX[item.type] ?? \"task\";\r\n const key = (item.key ?? `item-${item.number}`).toLowerCase();\r\n const titleSlug = slugify(item.title);\r\n return `${prefix}/${key}_${titleSlug}`;\r\n}\r\n\r\n/**\r\n * Return the worktree directory path for an item.\r\n *\r\n * New format: item-{number}-{title-slug} (e.g. item-2-enhance-users-table)\r\n * Legacy format: item-{number} (still discovered by findWorktree)\r\n */\r\nexport function worktreePath(\r\n slug: string,\r\n itemNumber: number,\r\n title?: string,\r\n): string {\r\n if (title) {\r\n const shortSlug = slugify(title, 40);\r\n return path.join(WORKTREES_DIR, slug, `item-${itemNumber}-${shortSlug}`);\r\n }\r\n return path.join(WORKTREES_DIR, slug, `item-${itemNumber}`);\r\n}\r\n\r\n/**\r\n * Find an existing worktree for an item (handles both old and new naming).\r\n * Returns the path even if it doesn't exist (caller must check).\r\n */\r\nexport function findWorktree(slug: string, itemNumber: number): string {\r\n const parent = path.join(WORKTREES_DIR, slug);\r\n if (fs.existsSync(parent)) {\r\n // Match item-{number}-* (new) or item-{number} (legacy)\r\n const entries = fs.readdirSync(parent).sort().reverse();\r\n for (const name of entries) {\r\n const full = path.join(parent, name);\r\n if (\r\n fs.statSync(full).isDirectory() &&\r\n (name === `item-${itemNumber}` ||\r\n name.startsWith(`item-${itemNumber}-`))\r\n ) {\r\n return full;\r\n }\r\n }\r\n }\r\n // Fallback: return the legacy path (caller checks .exists())\r\n return path.join(WORKTREES_DIR, slug, `item-${itemNumber}`);\r\n}\r\n\r\n/**\r\n * Create (or reuse) a git worktree for a work item.\r\n * Returns { worktreePath, branchName }.\r\n */\r\nexport async function createWorktree(\r\n projectPath: string,\r\n slug: string,\r\n item: { number: number; type: string; key?: string; title: string },\r\n): Promise<{ worktreePath: string; branchName: string }> {\r\n const branch = buildBranchName(item);\r\n const itemNumber = item.number;\r\n\r\n // Check for any existing worktree (legacy or new naming) first\r\n let wt = findWorktree(slug, itemNumber);\r\n if (!fs.existsSync(wt)) {\r\n wt = worktreePath(slug, itemNumber, item.title);\r\n }\r\n\r\n fs.mkdirSync(path.dirname(wt), { recursive: true });\r\n\r\n // Already exists and valid?\r\n if (fs.existsSync(wt)) {\r\n const { stdout } = await execa(\"git\", [\"worktree\", \"list\", \"--porcelain\"], {\r\n cwd: projectPath,\r\n });\r\n // Normalise to forward-slash for reliable comparison\r\n const wtNorm = wt.replace(/\\\\/g, \"/\");\r\n if (\r\n stdout\r\n .split(\"\\n\")\r\n .some((ln) => ln.replace(/\\\\/g, \"/\").includes(wtNorm))\r\n ) {\r\n return { worktreePath: wt, branchName: branch };\r\n }\r\n // Stale -- clean up\r\n await execa(\"git\", [\"worktree\", \"prune\"], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n if (fs.existsSync(wt)) {\r\n fs.rmSync(wt, { recursive: true, force: true });\r\n }\r\n }\r\n\r\n // Check if branch already exists\r\n const check = await execa(\r\n \"git\",\r\n [\"rev-parse\", \"--verify\", branch],\r\n { cwd: projectPath, reject: false },\r\n );\r\n\r\n if (check.exitCode === 0) {\r\n await execa(\"git\", [\"worktree\", \"add\", wt, branch], {\r\n cwd: projectPath,\r\n });\r\n } else {\r\n await execa(\"git\", [\"worktree\", \"add\", \"-b\", branch, wt], {\r\n cwd: projectPath,\r\n });\r\n }\r\n\r\n return { worktreePath: wt, branchName: branch };\r\n}\r\n\r\n/**\r\n * Remove a worktree and prune stale entries.\r\n */\r\nexport async function removeWorktree(\r\n projectPath: string,\r\n wtPath: string,\r\n): Promise<void> {\r\n await execa(\"git\", [\"worktree\", \"remove\", \"--force\", wtPath], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n await execa(\"git\", [\"worktree\", \"prune\"], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n}\r\n\r\n/**\r\n * Detect the branch name for a worktree directory from git metadata.\r\n * Returns null if the branch cannot be determined.\r\n */\r\nexport async function detectWorktreeBranch(\r\n projectPath: string,\r\n wtPath: string,\r\n): Promise<string | null> {\r\n const { stdout } = await execa(\r\n \"git\",\r\n [\"worktree\", \"list\", \"--porcelain\"],\r\n { cwd: projectPath },\r\n );\r\n const wtNorm = wtPath.replace(/\\\\/g, \"/\");\r\n const lines = stdout.split(\"\\n\");\r\n for (let i = 0; i < lines.length; i++) {\r\n if (lines[i].replace(/\\\\/g, \"/\").includes(wtNorm)) {\r\n // Next line(s) with \"branch\" has the ref\r\n for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) {\r\n if (lines[j].startsWith(\"branch \")) {\r\n return lines[j].replace(\"branch refs/heads/\", \"\");\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * List all agent branches (both new and legacy naming conventions).\r\n */\r\nexport async function listAgentBranches(\r\n projectPath: string,\r\n): Promise<string[]> {\r\n const prefixes = [...new Set(Object.values(TYPE_BRANCH_PREFIX))];\r\n const all: string[] = [];\r\n\r\n for (const prefix of prefixes) {\r\n const { stdout } = await execa(\r\n \"git\",\r\n [\"branch\", \"--list\", `${prefix}/*`],\r\n { cwd: projectPath, reject: false },\r\n );\r\n all.push(\r\n ...stdout\r\n .split(\"\\n\")\r\n .map((b) => b.trim().replace(/^\\*\\s*/, \"\"))\r\n .filter(Boolean),\r\n );\r\n }\r\n\r\n // Legacy convention: bb/item-*\r\n const { stdout } = await execa(\r\n \"git\",\r\n [\"branch\", \"--list\", \"bb/item-*\"],\r\n { cwd: projectPath, reject: false },\r\n );\r\n all.push(\r\n ...stdout\r\n .split(\"\\n\")\r\n .map((b) => b.trim().replace(/^\\*\\s*/, \"\"))\r\n .filter(Boolean),\r\n );\r\n\r\n return [...new Set(all)].sort();\r\n}\r\n\r\n/**\r\n * Extract item number from branch name (supports both conventions).\r\n *\r\n * New: feat/bb-42_some-title -> 42\r\n * Legacy: bb/item-42 -> 42\r\n */\r\nexport function extractItemNumberFromBranch(branch: string): number | null {\r\n // Legacy: bb/item-{N}\r\n if (branch.startsWith(\"bb/item-\")) {\r\n const n = parseInt(branch.replace(\"bb/item-\", \"\"), 10);\r\n return isNaN(n) ? null : n;\r\n }\r\n // New: {prefix}/{key}_{slug} where key is like bb-42 or item-42\r\n const m = branch.match(/\\/(?:[a-z]+-)?(\\d+)/);\r\n return m ? parseInt(m[1], 10) : null;\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport fs from \"node:fs\";\r\nimport { apiPost, apiPut } from \"../../api-client.js\";\r\nimport { requireProject, requireProjectPath, resolveItemId, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { runClaude } from \"../../lib/claude-runner.js\";\r\nimport { AgentStreamer, completeSession, updatePhase } from \"../../lib/agent-streamer.js\";\r\nimport { readKnowledge, getItemComments, formatCommentsContext, buildTestPrompt } from \"../../lib/prompt-builder.js\";\r\nimport { findWorktree } from \"../../lib/git-worktree.js\";\r\nimport { AgentProgressTracker } from \"../../lib/progress-tracker.js\";\r\nimport type { WorkItem } from \"../../types.js\";\r\n\r\nexport async function testOne(\r\n slug: string,\r\n projectPath: string,\r\n idOrNumber: string,\r\n tracker?: AgentProgressTracker,\r\n): Promise<Record<string, any>> {\r\n let item: WorkItem;\r\n try {\r\n item = await resolveItemId(slug, idOrNumber);\r\n } catch (e: any) {\r\n return { key: idOrNumber, status: \"failed\", error: `Resolve failed: ${e.message}` };\r\n }\r\n\r\n const itemId = item.id;\r\n const itemNumber = item.number;\r\n const key = item.key ?? `#${itemNumber}`;\r\n\r\n // Worktree must already exist\r\n const wt = findWorktree(slug, itemNumber);\r\n if (!fs.existsSync(wt)) {\r\n return { key, status: \"failed\", error: \"No worktree found (execute first)\" };\r\n }\r\n\r\n const workDir = wt;\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildTestPrompt(item, knowledge, commentsCtx);\r\n\r\n if (tracker) {\r\n tracker.update(key, \"test\", \"running\", \"Starting tests...\");\r\n }\r\n\r\n // Create a session for streaming\r\n let sessionId: string | number | null = null;\r\n try {\r\n const session = await apiPost(\"/api/agent-sessions/start\", {\r\n work_item_id: itemId, origin: \"cli\", phase: \"test\",\r\n }, { project_slug: slug });\r\n sessionId = session.id;\r\n } catch {}\r\n\r\n let streamer: AgentStreamer | null = null;\r\n if (sessionId) {\r\n streamer = new AgentStreamer(sessionId);\r\n if (tracker) {\r\n streamer.setCallback((_p, t) => {\r\n if (t) tracker.update(key, \"test\", \"running\", t.slice(0, 60));\r\n });\r\n }\r\n streamer.start();\r\n await updatePhase(sessionId, \"test\");\r\n }\r\n\r\n const result = await runClaude({\r\n cmd: [\"claude\", \"-p\", prompt, \"--output-format\", \"stream-json\"],\r\n cwd: workDir,\r\n onLine: (line) => streamer?.feed(line),\r\n });\r\n\r\n const textBlocks = streamer?.stop() ?? [];\r\n\r\n if (result.returncode !== 0) {\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: result.stderr.slice(0, 500) });\r\n return { key, status: \"failed\", error: result.stderr.slice(0, 500) || `Exit code ${result.returncode}` };\r\n }\r\n\r\n const report = textBlocks.join(\"\\n\\n\");\r\n if (!report) {\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: \"Empty test report\" });\r\n return { key, status: \"failed\", error: \"Empty test report\" };\r\n }\r\n\r\n // Determine pass/fail from the report\r\n const reportLower = report.toLowerCase();\r\n const testsPassed =\r\n reportLower.includes(\"**status**: pass\") ||\r\n reportLower.includes(\"status: pass\") ||\r\n (reportLower.includes(\"all tests pass\") &&\r\n !reportLower.split(\"all tests pass\")[0].slice(-50).includes(\"fail\"));\r\n\r\n // Post test report comment\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: report, author: \"bb-agent\", type: \"test_report\",\r\n });\r\n\r\n if (testsPassed) {\r\n if (sessionId) await completeSession(sessionId, \"completed\");\r\n return { key, status: \"ok\", report: report.slice(0, 200) };\r\n } else {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"failed\" });\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: \"Tests failed\" });\r\n return { key, status: \"failed\", error: \"Tests failed\", report: report.slice(0, 200) };\r\n }\r\n}\r\n\r\nexport const testCommand = new Command(\"test\")\r\n .description(\"Phase 3: Run tests in the worktree and report results\")\r\n .argument(\"<id>\", \"Work item ID, number, or KEY-number to test\")\r\n .action(async (id: string) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n\r\n console.log(chalk.cyan(`Fetching work item ${id}...`));\r\n const item = await resolveItemId(slug, id);\r\n const itemId = item.id;\r\n const itemNumber = item.number;\r\n const key = item.key ?? `#${itemNumber}`;\r\n\r\n // Worktree must already exist\r\n const wt = findWorktree(slug, itemNumber);\r\n if (!fs.existsSync(wt)) {\r\n console.error(chalk.red(`No worktree found for ${key}. Run 'bb agent execute ${id}' first.`));\r\n process.exit(1);\r\n }\r\n\r\n const workDir = wt;\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildTestPrompt(item, knowledge, commentsCtx);\r\n\r\n console.log(chalk.cyan(`Running tests in ${workDir}...`));\r\n\r\n const result = await runClaude({\r\n cmd: [\"claude\", \"-p\", prompt, \"--output-format\", \"stream-json\"],\r\n cwd: workDir,\r\n onLine: (line) => {\r\n try {\r\n const payload = JSON.parse(line);\r\n if (payload.type === \"assistant\") {\r\n for (const block of payload.content ?? []) {\r\n if (block.type === \"text\") process.stdout.write(block.text);\r\n }\r\n }\r\n } catch {}\r\n },\r\n });\r\n\r\n if (result.returncode !== 0) {\r\n console.error(chalk.red(`Claude test runner failed:\\n${result.stderr}`));\r\n process.exit(1);\r\n }\r\n\r\n const report = result.textBlocks.join(\"\\n\\n\");\r\n if (!report) {\r\n console.error(chalk.red(\"Empty test report.\"));\r\n process.exit(1);\r\n }\r\n\r\n // Post test report comment\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: report, author: \"bb-agent\", type: \"test_report\",\r\n });\r\n console.log(chalk.green(\"Test report posted as comment.\"));\r\n\r\n // Determine pass/fail\r\n const reportLower = report.toLowerCase();\r\n const testsPassed =\r\n reportLower.includes(\"**status**: pass\") ||\r\n reportLower.includes(\"status: pass\") ||\r\n (reportLower.includes(\"all tests pass\") &&\r\n !reportLower.split(\"all tests pass\")[0].slice(-50).includes(\"fail\"));\r\n\r\n if (testsPassed) {\r\n console.log(chalk.green(\"All tests passed!\"));\r\n } else {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"failed\" });\r\n console.log(chalk.red(\"Tests failed. Status -> failed\"));\r\n console.log(chalk.dim(`Fix with: bb agent reimplement ${id}`));\r\n process.exit(1);\r\n }\r\n });\r\n });\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport { apiPost, apiPut } from \"../../api-client.js\";\r\nimport { requireProject, requireProjectPath, resolveItemId, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { runClaude } from \"../../lib/claude-runner.js\";\r\nimport { AgentStreamer, completeSession, updatePhase } from \"../../lib/agent-streamer.js\";\r\nimport { readKnowledge, getItemComments, formatCommentsContext, buildVerifyPrompt } from \"../../lib/prompt-builder.js\";\r\n\r\nexport const verifyCommand = new Command(\"verify\")\r\n .description(\"Phase 0: Verify requirements -- analyse feasibility and return READY or NEEDS_INFO verdict\")\r\n .argument(\"<id>\", \"Work item ID, number, or KEY-number to verify\")\r\n .action(async (id: string) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n\r\n console.log(chalk.cyan(`Fetching work item ${id}...`));\r\n const item = await resolveItemId(slug, id);\r\n const itemId = item.id;\r\n const key = item.key ?? `#${item.number}`;\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildVerifyPrompt(item, knowledge, commentsCtx);\r\n\r\n console.log(chalk.cyan(`Running requirement analysis for ${key}...`));\r\n\r\n // Create session for streaming\r\n let sessionId: string | number | null = null;\r\n try {\r\n const session = await apiPost(\"/api/agent-sessions/start\", {\r\n work_item_id: itemId, origin: \"cli\", phase: \"verify\",\r\n }, { project_slug: slug });\r\n sessionId = session.id;\r\n } catch {}\r\n\r\n let streamer: AgentStreamer | null = null;\r\n if (sessionId) {\r\n streamer = new AgentStreamer(sessionId);\r\n streamer.start();\r\n await updatePhase(sessionId, \"verify\");\r\n }\r\n\r\n const result = await runClaude({\r\n cmd: [\"claude\", \"-p\", prompt, \"--output-format\", \"stream-json\"],\r\n cwd: projectPath,\r\n onLine: (line) => {\r\n streamer?.feed(line);\r\n try {\r\n const payload = JSON.parse(line);\r\n if (payload.type === \"assistant\") {\r\n for (const block of payload.content ?? []) {\r\n if (block.type === \"text\") process.stdout.write(block.text);\r\n }\r\n }\r\n } catch {}\r\n },\r\n });\r\n\r\n const textBlocks = streamer?.stop() ?? result.textBlocks;\r\n\r\n if (result.returncode !== 0) {\r\n console.error(chalk.red(`Claude analysis failed:\\n${result.stderr}`));\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: result.stderr.slice(0, 500) });\r\n process.exit(1);\r\n }\r\n\r\n const analysis = textBlocks.join(\"\\n\\n\");\r\n if (!analysis) {\r\n console.error(chalk.red(\"Claude returned an empty response.\"));\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: \"Empty response\" });\r\n process.exit(1);\r\n }\r\n\r\n // Parse verdict from output\r\n const analysisUpper = analysis.toUpperCase();\r\n let verdict: string;\r\n if (analysisUpper.includes(\"VERDICT: READY\")) {\r\n verdict = \"ready\";\r\n } else if (analysisUpper.includes(\"VERDICT: NEEDS_INFO\")) {\r\n verdict = \"needs_info\";\r\n } else {\r\n console.log(chalk.yellow(\"No explicit verdict found in analysis. Defaulting to READY.\"));\r\n verdict = \"ready\";\r\n }\r\n\r\n if (verdict === \"ready\") {\r\n // Post as proposal comment and save plan\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: analysis, author: \"bb-agent\", type: \"proposal\",\r\n });\r\n console.log(chalk.green(\"Analysis posted as proposal comment.\"));\r\n\r\n await apiPut(`/api/work-items/${itemId}`, { plan: analysis });\r\n console.log(chalk.green(\"Plan saved to work item.\"));\r\n\r\n if (item.status === \"open\") {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"confirmed\" });\r\n console.log(chalk.dim(\"Status -> confirmed\"));\r\n }\r\n\r\n if (sessionId) await completeSession(sessionId, \"completed\");\r\n console.log(chalk.green(`\\nVERDICT: READY -- ${key} is ready for implementation.`));\r\n } else {\r\n // Post as analysis comment, set needs_info\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: analysis, author: \"bb-agent\", type: \"analysis\",\r\n });\r\n console.log(chalk.yellow(\"Analysis posted as comment.\"));\r\n\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"needs_info\" });\r\n console.log(chalk.dim(\"Status -> needs_info\"));\r\n\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: \"NEEDS_INFO\" });\r\n console.log(chalk.yellow(`\\nVERDICT: NEEDS_INFO -- ${key} requires clarification before implementation.`));\r\n process.exit(1);\r\n }\r\n });\r\n });\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport fs from \"node:fs\";\r\nimport { apiPost, apiPut } from \"../../api-client.js\";\r\nimport { getApiUrl, getToken } from \"../../config.js\";\r\nimport { requireProject, requireProjectPath, resolveItemId, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { runClaude } from \"../../lib/claude-runner.js\";\r\nimport { AgentStreamer, completeSession, updatePhase } from \"../../lib/agent-streamer.js\";\r\nimport { readKnowledge, getItemComments, formatCommentsContext, buildReimplementPrompt } from \"../../lib/prompt-builder.js\";\r\nimport { findWorktree, detectWorktreeBranch } from \"../../lib/git-worktree.js\";\r\nimport { doSingleMerge } from \"../../lib/docker-runner.js\";\r\nimport { AgentProgressTracker } from \"../../lib/progress-tracker.js\";\r\nimport { testOne } from \"./test.js\";\r\nimport type { WorkItem } from \"../../types.js\";\r\n\r\nfunction buildMcpConfig(): string {\r\n const apiUrl = getApiUrl();\r\n const token = getToken();\r\n return JSON.stringify({\r\n mcpServers: {\r\n bumblebee: {\r\n url: `${apiUrl}/mcp`,\r\n headers: token ? { Authorization: `Bearer ${token}` } : {},\r\n },\r\n },\r\n });\r\n}\r\n\r\nexport async function reimplementOne(\r\n slug: string,\r\n projectPath: string,\r\n idOrNumber: string,\r\n dockerOutput = \"\",\r\n tracker?: AgentProgressTracker,\r\n): Promise<Record<string, any>> {\r\n let item: WorkItem;\r\n try {\r\n item = await resolveItemId(slug, idOrNumber);\r\n } catch (e: any) {\r\n return { key: idOrNumber, status: \"failed\", error: `Resolve failed: ${e.message}` };\r\n }\r\n\r\n const itemId = item.id;\r\n const itemNumber = item.number;\r\n const key = item.key ?? `#${itemNumber}`;\r\n\r\n // Reuse existing worktree\r\n const wt = findWorktree(slug, itemNumber);\r\n if (!fs.existsSync(wt)) {\r\n return { key, status: \"failed\", error: \"No worktree found (execute first)\" };\r\n }\r\n\r\n const workDir = wt;\r\n const branchName = await detectWorktreeBranch(projectPath, wt);\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildReimplementPrompt(item, knowledge, commentsCtx, dockerOutput);\r\n\r\n // Status -> in_progress\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_progress\" });\r\n\r\n if (tracker) {\r\n tracker.update(key, \"reimplement\", \"running\", \"Re-implementing...\");\r\n }\r\n\r\n // Agent session for streaming\r\n let sessionId: string | number | null = null;\r\n try {\r\n const session = await apiPost(\"/api/agent-sessions/start\", {\r\n work_item_id: itemId, origin: \"cli\", phase: \"reimplement\",\r\n }, { project_slug: slug });\r\n sessionId = session.id;\r\n } catch {}\r\n\r\n let streamer: AgentStreamer | null = null;\r\n if (sessionId) {\r\n streamer = new AgentStreamer(sessionId);\r\n if (tracker) {\r\n streamer.setCallback((_p, t) => {\r\n if (t) tracker.update(key, \"reimplement\", \"running\", t.slice(0, 60));\r\n });\r\n }\r\n streamer.start();\r\n await updatePhase(sessionId, \"reimplement\", {\r\n branch_name: branchName ?? \"\",\r\n worktree_path: workDir,\r\n });\r\n }\r\n\r\n const result = await runClaude({\r\n cmd: [\r\n \"claude\", \"--output-format\", \"stream-json\", \"--verbose\",\r\n \"--permission-mode\", \"bypassPermissions\", \"--mcp-config\", \"-\",\r\n \"-p\", prompt,\r\n ],\r\n cwd: workDir,\r\n onLine: (line) => streamer?.feed(line),\r\n stdinData: buildMcpConfig(),\r\n });\r\n\r\n const textBlocks = streamer?.stop() ?? [];\r\n\r\n // Post re-implementation report\r\n const tail = textBlocks.slice(-3).join(\"\\n\\n\") || \"No text output captured.\";\r\n let extra = \"\";\r\n if (result.timedOut) extra = \"\\n**Reason**: Process timed out\\n\";\r\n else if (result.stalled) extra = \"\\n**Reason**: Process stalled (no output)\\n\";\r\n else if (result.stderr) extra = `\\n**Stderr**: ${result.stderr.slice(0, 300)}\\n`;\r\n\r\n const body = [\r\n \"## Re-implementation Report\\n\",\r\n `**Branch**: \\`${branchName ?? \"unknown\"}\\`\\n`,\r\n `**Exit code**: \\`${result.returncode}\\`\\n`,\r\n extra,\r\n `\\n### Output (last messages)\\n\\n${tail}`,\r\n ].join(\"\\n\");\r\n\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body, author: \"bb-agent\", type: \"agent_output\",\r\n });\r\n\r\n if (result.returncode === 0) {\r\n if (sessionId) await completeSession(sessionId, \"completed\");\r\n return { key, status: \"ok\", branch: branchName, worktree: workDir };\r\n } else {\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: result.stderr.slice(0, 500) });\r\n return { key, status: \"failed\", error: result.stderr.slice(0, 500) || `Exit code ${result.returncode}`, branch: branchName };\r\n }\r\n}\r\n\r\nexport const reimplementCommand = new Command(\"reimplement\")\r\n .description(\"Re-implement a failed work item using previous feedback\")\r\n .argument(\"<id>\", \"Work item ID, number, or KEY-number to re-implement\")\r\n .option(\"--test\", \"Run tests after re-implementation (default)\", true)\r\n .option(\"--no-test\", \"Skip tests after re-implementation\")\r\n .option(\"--auto-merge\", \"Auto-merge to target on test pass\")\r\n .option(\"-t, --target <branch>\", \"Target branch for auto-merge\", \"release/dev\")\r\n .action(async (id: string, opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n\r\n console.log(chalk.cyan(`Fetching work item ${id}...`));\r\n const item = await resolveItemId(slug, id);\r\n const itemId = item.id;\r\n const itemNumber = item.number;\r\n const key = item.key ?? `#${itemNumber}`;\r\n\r\n // Worktree must already exist\r\n const wt = findWorktree(slug, itemNumber);\r\n if (!fs.existsSync(wt)) {\r\n console.error(chalk.red(`No worktree found for ${key}. Run 'bb agent execute ${id}' first.`));\r\n process.exit(1);\r\n }\r\n\r\n const workDir = wt;\r\n const branchName = await detectWorktreeBranch(projectPath, wt);\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildReimplementPrompt(item, knowledge, commentsCtx);\r\n\r\n // Status -> in_progress\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_progress\" });\r\n console.log(chalk.dim(\"Status -> in_progress\"));\r\n\r\n // Agent session\r\n const session = await apiPost(\"/api/agent-sessions/start\", {\r\n work_item_id: itemId, origin: \"cli\",\r\n }, { project_slug: slug });\r\n const sessionId = session.id;\r\n console.log(chalk.green(`Session: ${sessionId}`));\r\n\r\n console.log(chalk.cyan(`\\nRe-implementing in ${workDir}...\\n`));\r\n\r\n const streamer = new AgentStreamer(sessionId);\r\n streamer.setCallback((_p, text) => {\r\n if (text) process.stdout.write(text);\r\n });\r\n streamer.start();\r\n\r\n const result = await runClaude({\r\n cmd: [\r\n \"claude\", \"--output-format\", \"stream-json\", \"--verbose\",\r\n \"--permission-mode\", \"bypassPermissions\", \"--mcp-config\", \"-\",\r\n \"-p\", prompt,\r\n ],\r\n cwd: workDir,\r\n onLine: (line) => streamer.feed(line),\r\n stdinData: buildMcpConfig(),\r\n });\r\n\r\n const textBlocks = streamer.stop();\r\n\r\n // Post re-implementation report\r\n const tail = textBlocks.slice(-3).join(\"\\n\\n\") || \"No text output captured.\";\r\n const bodyLines = [\"## Re-implementation Report\\n\"];\r\n if (branchName) bodyLines.push(`**Branch**: \\`${branchName}\\`\\n`);\r\n bodyLines.push(`**Exit code**: \\`${result.returncode}\\`\\n`);\r\n if (result.timedOut) bodyLines.push(\"**Reason**: Process timed out\\n\");\r\n else if (result.stalled) bodyLines.push(\"**Reason**: Process stalled (no output)\\n\");\r\n else if (result.stderr) bodyLines.push(`**Stderr**: ${result.stderr.slice(0, 300)}\\n`);\r\n bodyLines.push(`\\n### Output (last messages)\\n\\n${tail}`);\r\n\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: bodyLines.join(\"\\n\"), author: \"bb-agent\", type: \"agent_output\",\r\n });\r\n\r\n if (result.returncode !== 0) {\r\n if (result.timedOut) console.log(chalk.yellow(`\\nAgent timed out.`));\r\n else if (result.stalled) console.log(chalk.yellow(`\\nAgent stalled.`));\r\n else console.log(chalk.yellow(`\\nAgent exited with code ${result.returncode}.`));\r\n if (result.stderr) console.log(chalk.dim(result.stderr.slice(0, 300)));\r\n return;\r\n }\r\n\r\n console.log(chalk.green(\"\\nRe-implementation completed.\"));\r\n\r\n // Auto-test after re-implementation\r\n if (opts.test !== false) {\r\n console.log(chalk.cyan(\"\\nRunning tests...\"));\r\n const testResult = await testOne(slug, projectPath, id);\r\n if (testResult.status === \"ok\") {\r\n console.log(chalk.green(\"All tests passed!\"));\r\n if (opts.autoMerge && branchName) {\r\n console.log(chalk.cyan(`\\nMerging ${branchName} into ${opts.target}...`));\r\n const mergeOk = await doSingleMerge(projectPath, branchName, opts.target);\r\n if (mergeOk) {\r\n console.log(chalk.green(`Merged into ${opts.target}.`));\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"resolved\" });\r\n console.log(chalk.dim(\"Status -> resolved\"));\r\n } else {\r\n console.log(chalk.red(\"Merge failed. Resolve conflicts manually.\"));\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_review\" });\r\n }\r\n } else {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_review\" });\r\n console.log(chalk.dim(\"Status -> in_review\"));\r\n }\r\n } else {\r\n console.log(chalk.red(\"Tests still failing after re-implementation.\"));\r\n console.log(chalk.dim(`Try again: bb agent reimplement ${id}`));\r\n }\r\n } else {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_review\" });\r\n console.log(chalk.dim(\"Status -> in_review\"));\r\n }\r\n });\r\n });\r\n","import fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { execa } from \"execa\";\r\n\r\n/** Docker Compose test files that must be present in the worktree. */\r\nconst COMPOSE_FILES = [\r\n \"docker-compose.test.yml\",\r\n \"Dockerfile.api-test\",\r\n \"Dockerfile.web-test\",\r\n];\r\n\r\nexport { COMPOSE_FILES };\r\n\r\n/**\r\n * Copy Docker test files into the worktree if they are missing.\r\n */\r\nexport function ensureComposeFiles(\r\n workDir: string,\r\n projectPath: string,\r\n): void {\r\n for (const name of COMPOSE_FILES) {\r\n const src = path.join(projectPath, name);\r\n const dst = path.join(workDir, name);\r\n if (fs.existsSync(src) && !fs.existsSync(dst)) {\r\n fs.copyFileSync(src, dst);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Keep the last maxChars characters of output for posting as a comment.\r\n */\r\nexport function truncateOutput(output: string, maxChars = 4000): string {\r\n if (output.length <= maxChars) return output;\r\n return (\r\n `... (truncated, showing last ${maxChars} chars)\\n` +\r\n output.slice(-maxChars)\r\n );\r\n}\r\n\r\nexport interface DockerTestResult {\r\n success: boolean;\r\n rawOutput: string;\r\n details: string;\r\n}\r\n\r\n/**\r\n * Run Docker Compose test pipeline.\r\n *\r\n * Returns { success, rawOutput, details }.\r\n * Always tears down containers afterwards.\r\n */\r\nexport async function runDockerTests(\r\n workDir: string,\r\n timeout = 600_000,\r\n): Promise<DockerTestResult> {\r\n const composeCmd = [\"docker\", \"compose\", \"-f\", \"docker-compose.test.yml\"];\r\n\r\n try {\r\n // Run tests\r\n const result = await execa(\r\n composeCmd[0],\r\n [...composeCmd.slice(1), \"up\", \"--build\", \"--abort-on-container-exit\"],\r\n {\r\n cwd: workDir,\r\n timeout,\r\n reject: false,\r\n },\r\n );\r\n\r\n const raw = (result.stdout ?? \"\") + \"\\n\" + (result.stderr ?? \"\");\r\n const exitCode = result.exitCode ?? 1;\r\n\r\n // Gather per-service exit codes\r\n const ps = await execa(\r\n composeCmd[0],\r\n [\r\n ...composeCmd.slice(1),\r\n \"ps\",\r\n \"-a\",\r\n \"--format\",\r\n \"{{.Service}}\\t{{.ExitCode}}\",\r\n ],\r\n {\r\n cwd: workDir,\r\n reject: false,\r\n },\r\n );\r\n\r\n const serviceResults: Record<string, number> = {};\r\n for (const line of (ps.stdout ?? \"\").split(\"\\n\")) {\r\n const parts = line.split(\"\\t\");\r\n if (parts.length === 2) {\r\n const [svc, code] = parts;\r\n serviceResults[svc] = parseInt(code, 10);\r\n if (isNaN(serviceResults[svc])) {\r\n serviceResults[svc] = -1;\r\n }\r\n }\r\n }\r\n\r\n // Build summary\r\n const lines: string[] = [];\r\n let allPass = true;\r\n for (const svc of [\"api-test\", \"web-build\"]) {\r\n const code = serviceResults[svc];\r\n if (code === undefined) {\r\n lines.push(`- **${svc}**: unknown (container not found)`);\r\n allPass = false;\r\n } else if (code === 0) {\r\n lines.push(`- **${svc}**: passed`);\r\n } else {\r\n lines.push(`- **${svc}**: FAILED (exit code ${code})`);\r\n allPass = false;\r\n }\r\n }\r\n\r\n return {\r\n success: exitCode === 0 && allPass,\r\n rawOutput: raw,\r\n details: lines.join(\"\\n\"),\r\n };\r\n } catch (err: any) {\r\n if (err.timedOut) {\r\n return {\r\n success: false,\r\n rawOutput: \"\",\r\n details: `- Docker tests timed out after ${timeout / 1000}s`,\r\n };\r\n }\r\n return {\r\n success: false,\r\n rawOutput: \"\",\r\n details: \"- `docker` command not found. Is Docker installed?\",\r\n };\r\n } finally {\r\n // Always clean up containers\r\n await execa(\r\n composeCmd[0],\r\n [...composeCmd.slice(1), \"down\", \"-v\", \"--remove-orphans\"],\r\n {\r\n cwd: workDir,\r\n reject: false,\r\n timeout: 60_000,\r\n },\r\n ).catch(() => {});\r\n }\r\n}\r\n\r\n/**\r\n * Merge a single branch into a target branch.\r\n * Returns true on success, false on failure (auto-aborts merge on conflict).\r\n */\r\nexport async function doSingleMerge(\r\n projectPath: string,\r\n branch: string,\r\n target: string,\r\n): Promise<boolean> {\r\n // Remember current branch\r\n const { stdout: current } = await execa(\r\n \"git\",\r\n [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\r\n { cwd: projectPath },\r\n );\r\n\r\n // Ensure target exists\r\n const check = await execa(\r\n \"git\",\r\n [\"rev-parse\", \"--verify\", target],\r\n { cwd: projectPath, reject: false },\r\n );\r\n if (check.exitCode !== 0) {\r\n await execa(\"git\", [\"branch\", target], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n }\r\n\r\n // Prune stale worktrees so checkout succeeds\r\n await execa(\"git\", [\"worktree\", \"prune\"], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n\r\n // Checkout target\r\n const co = await execa(\"git\", [\"checkout\", target], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n if (co.exitCode !== 0) return false;\r\n\r\n // Merge\r\n const merge = await execa(\r\n \"git\",\r\n [\r\n \"merge\",\r\n branch,\r\n \"--no-ff\",\r\n \"-m\",\r\n `Merge ${branch} into ${target}`,\r\n ],\r\n {\r\n cwd: projectPath,\r\n reject: false,\r\n },\r\n );\r\n const ok = merge.exitCode === 0;\r\n\r\n if (!ok) {\r\n await execa(\"git\", [\"merge\", \"--abort\"], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n }\r\n\r\n // Return to original branch\r\n await execa(\"git\", [\"checkout\", current.trim()], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n\r\n return ok;\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport fs from \"node:fs\";\r\nimport readline from \"node:readline\";\r\nimport pLimit from \"p-limit\";\r\nimport { apiPost, apiPut } from \"../../api-client.js\";\r\nimport { requireProject, requireProjectPath, resolveItemId, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { readKnowledge, getItemComments, formatCommentsContext, buildVerifyPrompt } from \"../../lib/prompt-builder.js\";\r\nimport { runClaude } from \"../../lib/claude-runner.js\";\r\nimport { AgentStreamer, completeSession, updatePhase } from \"../../lib/agent-streamer.js\";\r\nimport { executeOne } from \"./execute.js\";\r\nimport { reimplementOne } from \"./reimplement.js\";\r\nimport {\r\n findWorktree,\r\n removeWorktree,\r\n detectWorktreeBranch,\r\n} from \"../../lib/git-worktree.js\";\r\nimport {\r\n ensureComposeFiles,\r\n runDockerTests,\r\n truncateOutput,\r\n doSingleMerge,\r\n} from \"../../lib/docker-runner.js\";\r\nimport { AgentProgressTracker } from \"../../lib/progress-tracker.js\";\r\nimport type { WorkItem } from \"../../types.js\";\r\n\r\nasync function confirm(question: string): Promise<boolean> {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(question + \" (y/N) \", (answer) => {\r\n rl.close();\r\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\r\n });\r\n });\r\n}\r\n\r\nasync function dockerTestOne(\r\n slug: string,\r\n projectPath: string,\r\n idOrNumber: string,\r\n timeout = 600,\r\n): Promise<Record<string, any>> {\r\n let item: WorkItem;\r\n try {\r\n item = await resolveItemId(slug, idOrNumber);\r\n } catch (e: any) {\r\n return { key: idOrNumber, status: \"failed\", output: \"\", details: `Resolve failed: ${e.message}` };\r\n }\r\n\r\n const itemId = item.id;\r\n const itemNumber = item.number;\r\n const key = item.key ?? `#${itemNumber}`;\r\n\r\n // Worktree must already exist\r\n const wt = findWorktree(slug, itemNumber);\r\n if (!fs.existsSync(wt)) {\r\n return { key, status: \"failed\", output: \"\", details: \"No worktree found (execute first)\" };\r\n }\r\n\r\n const workDir = wt;\r\n\r\n // Ensure Docker files exist in worktree\r\n ensureComposeFiles(workDir, projectPath);\r\n\r\n // Run Docker tests\r\n const result = await runDockerTests(workDir, timeout * 1000);\r\n\r\n // Post test results as comment\r\n let body: string;\r\n let commentType: string;\r\n if (result.success) {\r\n body = `## Docker Test Report\\n\\n**Status**: PASS\\n\\n${result.details}`;\r\n commentType = \"test_report\";\r\n } else {\r\n const truncated = truncateOutput(result.rawOutput, 4000);\r\n body = `## Docker Test Report\\n\\n**Status**: FAIL\\n\\n${result.details}\\n\\n### Docker Output\\n\\n\\`\\`\\`\\n${truncated}\\n\\`\\`\\``;\r\n commentType = \"test_failure\";\r\n }\r\n\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body, author: \"bb-agent\", type: commentType,\r\n });\r\n\r\n const status = result.success ? \"ok\" : \"failed\";\r\n return { key, status, output: result.rawOutput, details: result.details };\r\n}\r\n\r\nexport const runCommand = new Command(\"run\")\r\n .description(\"Full autonomous loop: verify -> execute -> Docker test -> reimplement retry -> merge\")\r\n .argument(\"<id>\", \"Work item ID, number, or KEY-number\")\r\n .option(\"--skip-verify\", \"Skip the requirement verification phase\")\r\n .option(\"-y, --yes\", \"Auto-confirm after verification\")\r\n .option(\"--auto-merge\", \"Auto-merge to target branch on test pass (default)\", true)\r\n .option(\"--no-auto-merge\", \"Disable auto-merge\")\r\n .option(\"-t, --target <branch>\", \"Target branch for auto-merge\", \"release/dev\")\r\n .option(\"--max-retries <n>\", \"Max re-implementation attempts on test failure\", \"3\")\r\n .option(\"--timeout <seconds>\", \"Docker test timeout in seconds\", \"600\")\r\n .option(\"--auto-split\", \"Auto-split multi-package items (default)\", true)\r\n .option(\"--no-auto-split\", \"Disable auto-split\")\r\n .action(async (id: string, opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n const maxRetries = parseInt(opts.maxRetries, 10);\r\n const timeout = parseInt(opts.timeout, 10);\r\n\r\n // Phase 1: Verify requirements\r\n if (!opts.skipVerify) {\r\n console.log(chalk.bold.cyan(\"Phase 1: Verifying requirements...\\n\"));\r\n\r\n const item = await resolveItemId(slug, id);\r\n const itemId = item.id;\r\n const key = item.key ?? `#${item.number}`;\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildVerifyPrompt(item, knowledge, commentsCtx);\r\n\r\n // Create session for streaming\r\n let sessionId: string | number | null = null;\r\n try {\r\n const session = await apiPost(\"/api/agent-sessions/start\", {\r\n work_item_id: itemId, origin: \"cli\", phase: \"verify\",\r\n }, { project_slug: slug });\r\n sessionId = session.id;\r\n } catch {}\r\n\r\n let streamer: AgentStreamer | null = null;\r\n if (sessionId) {\r\n streamer = new AgentStreamer(sessionId);\r\n streamer.start();\r\n await updatePhase(sessionId, \"verify\");\r\n }\r\n\r\n const verifyResult = await runClaude({\r\n cmd: [\"claude\", \"-p\", prompt, \"--output-format\", \"stream-json\"],\r\n cwd: projectPath,\r\n onLine: (line) => streamer?.feed(line),\r\n });\r\n\r\n const textBlocks = streamer?.stop() ?? verifyResult.textBlocks;\r\n\r\n if (verifyResult.returncode !== 0) {\r\n console.error(chalk.red(`Claude analysis failed:\\n${verifyResult.stderr}`));\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: verifyResult.stderr.slice(0, 500) });\r\n console.log(chalk.red(\"\\nVerification failed -- aborting run.\"));\r\n process.exit(1);\r\n }\r\n\r\n const analysis = textBlocks.join(\"\\n\\n\");\r\n if (!analysis) {\r\n console.error(chalk.red(\"Claude returned an empty response.\"));\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: \"Empty response\" });\r\n process.exit(1);\r\n }\r\n\r\n // Parse verdict\r\n const analysisUpper = analysis.toUpperCase();\r\n let verdict: string;\r\n if (analysisUpper.includes(\"VERDICT: READY\")) {\r\n verdict = \"ready\";\r\n } else if (analysisUpper.includes(\"VERDICT: NEEDS_INFO\")) {\r\n verdict = \"needs_info\";\r\n } else {\r\n verdict = \"ready\";\r\n }\r\n\r\n if (verdict === \"ready\") {\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: analysis, author: \"bb-agent\", type: \"proposal\",\r\n });\r\n await apiPut(`/api/work-items/${itemId}`, { plan: analysis });\r\n if (item.status === \"open\") {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"confirmed\" });\r\n }\r\n if (sessionId) await completeSession(sessionId, \"completed\");\r\n console.log(chalk.green(`VERDICT: READY -- ${key} is ready for implementation.`));\r\n } else {\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: analysis, author: \"bb-agent\", type: \"analysis\",\r\n });\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"needs_info\" });\r\n if (sessionId) await completeSession(sessionId, \"failed\", { error: \"NEEDS_INFO\" });\r\n console.log(chalk.yellow(`VERDICT: NEEDS_INFO -- ${key} requires clarification.`));\r\n console.log(chalk.red(\"\\nVerification failed -- aborting run.\"));\r\n process.exit(1);\r\n }\r\n\r\n if (!opts.yes) {\r\n console.log();\r\n const ok = await confirm(\"Proceed with implementation?\");\r\n if (!ok) {\r\n console.log(chalk.yellow(`Aborted. Run bb agent execute ${id} when ready.`));\r\n return;\r\n }\r\n }\r\n } else {\r\n console.log(chalk.dim(\"Skipping verification phase.\"));\r\n }\r\n\r\n // Phase 1.5: Auto-split (if enabled)\r\n if (opts.autoSplit !== false) {\r\n console.log(chalk.bold.cyan(\"\\nPhase 1.5: Checking for split...\\n\"));\r\n // Check if split is needed from existing proposal\r\n const itemForSplit = await resolveItemId(slug, id);\r\n const commentsForSplit = await getItemComments(itemForSplit.id);\r\n let proposal: string | null = null;\r\n for (let i = commentsForSplit.length - 1; i >= 0; i--) {\r\n if (commentsForSplit[i].type === \"proposal\") {\r\n proposal = commentsForSplit[i].body;\r\n break;\r\n }\r\n }\r\n\r\n if (proposal && /NEEDS_SPLIT:\\s*true/i.test(proposal)) {\r\n console.log(chalk.cyan(\"Item needs splitting into sub-items.\"));\r\n console.log(chalk.dim(\"Use 'bb agent split' to split, then 'bb agent batch-run' for children.\"));\r\n // Note: auto-split with children is complex; suggest manual split for TS CLI\r\n }\r\n }\r\n\r\n // Phase 2: Execute\r\n console.log(chalk.bold.cyan(\"\\nPhase 2: Implementing...\\n\"));\r\n const execResult = await executeOne(slug, projectPath, id);\r\n if (execResult.status !== \"ok\") {\r\n console.error(chalk.red(`Execution failed: ${execResult.error ?? \"unknown error\"}`));\r\n process.exit(1);\r\n }\r\n console.log(chalk.green(\"Execution completed.\"));\r\n\r\n // Phase 3: Docker test\r\n console.log(chalk.bold.cyan(\"\\nPhase 3: Docker testing...\"));\r\n let dockerResult = await dockerTestOne(slug, projectPath, id, timeout);\r\n\r\n if (dockerResult.status === \"ok\") {\r\n console.log(chalk.green(\"Docker tests passed!\"));\r\n } else {\r\n // Tests failed -- retry loop\r\n console.log(chalk.red(\"Docker tests failed.\"));\r\n let dockerOutput = dockerResult.output ?? \"\";\r\n let retriesDone = 0;\r\n\r\n while (retriesDone < maxRetries) {\r\n retriesDone++;\r\n console.log(chalk.bold.cyan(`\\nRetry ${retriesDone}/${maxRetries}: Re-implementing...`));\r\n\r\n const reimplResult = await reimplementOne(slug, projectPath, id, dockerOutput);\r\n if (reimplResult.status !== \"ok\") {\r\n console.log(chalk.red(`Re-implementation failed: ${reimplResult.error ?? \"?\"}`));\r\n continue;\r\n }\r\n\r\n console.log(chalk.cyan(\"Re-testing with Docker...\"));\r\n dockerResult = await dockerTestOne(slug, projectPath, id, timeout);\r\n if (dockerResult.status === \"ok\") {\r\n console.log(chalk.green(\"Docker tests passed after re-implementation!\"));\r\n break;\r\n }\r\n dockerOutput = dockerResult.output ?? \"\";\r\n }\r\n\r\n if (dockerResult.status !== \"ok\") {\r\n // All retries exhausted\r\n const itemFailed = await resolveItemId(slug, id);\r\n await apiPut(`/api/work-items/${itemFailed.id}`, { status: \"failed\" });\r\n console.log(chalk.dim(\"Status -> failed\"));\r\n\r\n // Post failure summary\r\n await apiPost(`/api/work-items/${itemFailed.id}/comments`, {\r\n body: (\r\n `## Agent Run Failed\\n\\n` +\r\n `All ${maxRetries} re-implementation retries exhausted.\\n\\n` +\r\n `### Last Docker Output\\n\\n${dockerResult.details ?? \"No details\"}\\n\\n` +\r\n `Manual intervention required.`\r\n ),\r\n author: \"bb-agent\",\r\n type: \"test_failure\",\r\n });\r\n\r\n console.log(chalk.red(`\\nAll ${maxRetries} retries exhausted.`));\r\n console.log(chalk.dim(`Status -> failed. Manual fix: bb agent continue ${id}`));\r\n return;\r\n }\r\n }\r\n\r\n // Phase 4: Merge (only reached if Docker tests passed)\r\n if (opts.autoMerge !== false) {\r\n const itemForMerge = await resolveItemId(slug, id);\r\n const itemNumber = itemForMerge.number;\r\n const wt = findWorktree(slug, itemNumber);\r\n const branchName = await detectWorktreeBranch(projectPath, wt);\r\n\r\n if (branchName) {\r\n console.log(chalk.bold.cyan(`\\nPhase 4: Merging ${branchName} into ${opts.target}...`));\r\n const mergeOk = await doSingleMerge(projectPath, branchName, opts.target);\r\n if (mergeOk) {\r\n console.log(chalk.green(`Merged into ${opts.target}.`));\r\n await apiPut(`/api/work-items/${itemForMerge.id}`, { status: \"resolved\" });\r\n console.log(chalk.dim(\"Status -> resolved\"));\r\n await removeWorktree(projectPath, wt);\r\n console.log(chalk.dim(\"Worktree cleaned up.\"));\r\n } else {\r\n console.log(chalk.red(\"Merge failed -- conflicts detected.\"));\r\n await apiPut(`/api/work-items/${itemForMerge.id}`, { status: \"in_review\" });\r\n console.log(chalk.dim(\"Status -> in_review (manual merge needed)\"));\r\n }\r\n } else {\r\n console.log(chalk.yellow(\"Could not detect branch -- skipping merge.\"));\r\n }\r\n } else {\r\n console.log(chalk.dim(\"Auto-merge disabled. Merge manually when ready.\"));\r\n }\r\n });\r\n });\r\n\r\nexport const batchRunCommand = new Command(\"batch-run\")\r\n .description(\"Execute -> test -> merge for multiple items\")\r\n .argument(\"<items...>\", \"Work item IDs/numbers for full loop\")\r\n .option(\"-P, --parallel <n>\", \"Max parallel agents\", \"2\")\r\n .option(\"--auto-merge\", \"Auto-merge passing items to target\")\r\n .option(\"-t, --target <branch>\", \"Target branch for auto-merge\", \"release/dev\")\r\n .action(async (items: string[], opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n const maxParallel = parseInt(opts.parallel, 10);\r\n const target: string = opts.target;\r\n\r\n // Phase 1: parallel execute\r\n console.log(chalk.bold.cyan(`Phase 1: Implementing ${items.length} items (max ${maxParallel} parallel)...\\n`));\r\n\r\n const execTracker = new AgentProgressTracker();\r\n for (const ref of items) execTracker.register(ref);\r\n execTracker.start();\r\n\r\n const limit = pLimit(maxParallel);\r\n const execResults = await Promise.all(\r\n items.map((ref) =>\r\n limit(async () => {\r\n const r = await executeOne(slug, projectPath, ref, execTracker);\r\n execTracker.complete(ref, r.status === \"ok\", (r.branch ?? r.error ?? \"\").slice(0, 60));\r\n return r;\r\n }),\r\n ),\r\n );\r\n\r\n execTracker.stop();\r\n\r\n const executed = execResults.filter((r) => r.status === \"ok\").map((r) => r.key as string);\r\n console.log(chalk.bold(`\\nExecute done: ${executed.length}/${items.length} succeeded.`));\r\n\r\n if (!executed.length) return;\r\n\r\n // Phase 2: parallel Docker test\r\n console.log(chalk.bold.cyan(\"\\nPhase 2: Docker testing...\\n\"));\r\n\r\n const testTracker = new AgentProgressTracker();\r\n for (const ref of executed) testTracker.register(ref);\r\n testTracker.start();\r\n\r\n const testResults = await Promise.all(\r\n executed.map((ref) =>\r\n limit(async () => {\r\n const r = await dockerTestOne(slug, projectPath, ref);\r\n testTracker.complete(ref, r.status === \"ok\", (r.details ?? \"\").slice(0, 60));\r\n return r;\r\n }),\r\n ),\r\n );\r\n\r\n testTracker.stop();\r\n\r\n const passed = testResults.filter((r) => r.status === \"ok\").map((r) => r.key as string);\r\n const failedItems = testResults.filter((r) => r.status !== \"ok\").map((r) => r.key as string);\r\n console.log(chalk.bold(`\\nTest done: ${passed.length}/${executed.length} passed.`));\r\n\r\n // Phase 3: merge passing items\r\n if (opts.autoMerge && passed.length) {\r\n console.log(chalk.bold.cyan(`\\nPhase 3: Merging to ${target}...\\n`));\r\n for (const itemKey of passed) {\r\n try {\r\n const mergeItem = await resolveItemId(slug, itemKey);\r\n const wt = findWorktree(slug, mergeItem.number);\r\n const branchName = await detectWorktreeBranch(projectPath, wt);\r\n if (branchName) {\r\n const mergeOk = await doSingleMerge(projectPath, branchName, target);\r\n if (mergeOk) {\r\n console.log(chalk.green(` ${itemKey.padStart(8)} -- merged`));\r\n await apiPut(`/api/work-items/${mergeItem.id}`, { status: \"resolved\" });\r\n await removeWorktree(projectPath, wt);\r\n } else {\r\n console.log(chalk.red(` ${itemKey.padStart(8)} -- merge conflict`));\r\n }\r\n }\r\n } catch (e: any) {\r\n console.log(chalk.red(` ${itemKey.padStart(8)} -- merge error: ${e.message}`));\r\n }\r\n }\r\n } else if (!opts.autoMerge && passed.length) {\r\n console.log(chalk.dim(\"Merge with: bb agent merge --target release/dev\"));\r\n }\r\n\r\n if (failedItems.length) {\r\n console.log(chalk.yellow(`\\nFailed items: ${failedItems.join(\" \")}`));\r\n console.log(chalk.dim(\"Re-implement: bb agent reimplement <item>\"));\r\n }\r\n });\r\n });\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport { apiPost, apiPut } from \"../../api-client.js\";\r\nimport { getApiUrl, getToken } from \"../../config.js\";\r\nimport { requireProject, requireProjectPath, resolveItemId, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { runClaude } from \"../../lib/claude-runner.js\";\r\nimport { AgentStreamer } from \"../../lib/agent-streamer.js\";\r\nimport { readKnowledge, getItemComments, formatCommentsContext, buildExecutePrompt } from \"../../lib/prompt-builder.js\";\r\nimport { createWorktree } from \"../../lib/git-worktree.js\";\r\n\r\nfunction buildMcpConfig(): string {\r\n const apiUrl = getApiUrl();\r\n const token = getToken();\r\n return JSON.stringify({\r\n mcpServers: {\r\n bumblebee: {\r\n url: `${apiUrl}/mcp`,\r\n headers: token ? { Authorization: `Bearer ${token}` } : {},\r\n },\r\n },\r\n });\r\n}\r\n\r\nexport const continueCommand = new Command(\"continue\")\r\n .description(\"Continue a previous agent run (reads prior comments for context)\")\r\n .argument(\"<id>\", \"Work item ID, number, or KEY-number to continue\")\r\n .action(async (id: string) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n\r\n const item = await resolveItemId(slug, id);\r\n const itemId = item.id;\r\n const key = item.key ?? `#${item.number}`;\r\n const knowledge = readKnowledge(projectPath);\r\n const comments = await getItemComments(itemId);\r\n const commentsCtx = formatCommentsContext(comments);\r\n const prompt = buildExecutePrompt(item, knowledge, commentsCtx);\r\n\r\n // Create/reuse worktree\r\n console.log(chalk.cyan(`Creating worktree for ${key}...`));\r\n const wt = await createWorktree(projectPath, slug, item);\r\n const workDir = wt.worktreePath;\r\n const branchName = wt.branchName;\r\n console.log(chalk.green(`Worktree: ${workDir}`));\r\n console.log(chalk.green(`Branch: ${branchName}`));\r\n\r\n // Agent session\r\n const session = await apiPost(\"/api/agent-sessions/start\", {\r\n work_item_id: itemId, origin: \"cli\",\r\n }, { project_slug: slug });\r\n const sessionId = session.id;\r\n console.log(chalk.green(`Session: ${sessionId}`));\r\n\r\n if ([\"open\", \"confirmed\", \"approved\"].includes(item.status)) {\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_progress\" });\r\n console.log(chalk.dim(\"Status -> in_progress\"));\r\n }\r\n\r\n const streamer = new AgentStreamer(sessionId);\r\n streamer.setCallback((_p, text) => {\r\n if (text) process.stdout.write(text);\r\n });\r\n streamer.start();\r\n\r\n console.log(chalk.cyan(`\\nSpawning Claude Code agent in ${workDir}...\\n`));\r\n\r\n const result = await runClaude({\r\n cmd: [\r\n \"claude\", \"--output-format\", \"stream-json\", \"--verbose\",\r\n \"--permission-mode\", \"bypassPermissions\", \"--mcp-config\", \"-\",\r\n \"-p\", prompt,\r\n ],\r\n cwd: workDir,\r\n onLine: (line) => streamer.feed(line),\r\n stdinData: buildMcpConfig(),\r\n });\r\n\r\n const textBlocks = streamer.stop();\r\n\r\n // Post comment\r\n const tail = textBlocks.slice(-3).join(\"\\n\\n\") || \"No text output captured.\";\r\n const bodyLines = [\"## Agent Execution Report\\n\"];\r\n bodyLines.push(`**Branch**: \\`${branchName}\\`\\n`);\r\n bodyLines.push(`**Exit code**: \\`${result.returncode}\\`\\n`);\r\n if (result.timedOut) bodyLines.push(\"**Reason**: Process timed out\\n\");\r\n else if (result.stalled) bodyLines.push(\"**Reason**: Process stalled (no output)\\n\");\r\n else if (result.stderr) bodyLines.push(`**Stderr**: ${result.stderr.slice(0, 300)}\\n`);\r\n bodyLines.push(`\\n### Output (last messages)\\n\\n${tail}`);\r\n\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: bodyLines.join(\"\\n\"), author: \"bb-agent\", type: \"agent_output\",\r\n });\r\n\r\n if (result.returncode === 0) {\r\n console.log(chalk.green(\"\\nAgent completed successfully.\"));\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"in_review\" });\r\n console.log(chalk.dim(\"Status -> in_review\"));\r\n } else {\r\n if (result.timedOut) console.log(chalk.yellow(`\\nAgent timed out.`));\r\n else if (result.stalled) console.log(chalk.yellow(`\\nAgent stalled.`));\r\n else console.log(chalk.yellow(`\\nAgent exited with code ${result.returncode}.`));\r\n }\r\n\r\n console.log(chalk.dim(`\\nWorktree: ${workDir}`));\r\n console.log(chalk.dim(`Cleanup: bb agent cleanup ${item.number}`));\r\n });\r\n });\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport readline from \"node:readline\";\r\nimport { apiPost } from \"../../api-client.js\";\r\nimport { requireProject, resolveItemId, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { getItemComments } from \"../../lib/prompt-builder.js\";\r\nimport type { WorkItem } from \"../../types.js\";\r\n\r\nasync function confirm(question: string): Promise<boolean> {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(question + \" (y/N) \", (answer) => {\r\n rl.close();\r\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\r\n });\r\n });\r\n}\r\n\r\nexport const splitCommand = new Command(\"split\")\r\n .description(\"Split a work item into sub-items based on the latest proposal's SPLIT_RESULT\")\r\n .argument(\"<id>\", \"Parent work item ID or number\")\r\n .option(\"-y, --yes\", \"Auto-confirm split\")\r\n .action(async (id: string, opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n\r\n const item = await resolveItemId(slug, id);\r\n const itemId = item.id;\r\n const key = item.key ?? `#${item.number}`;\r\n\r\n // Find latest proposal comment\r\n const comments = await getItemComments(itemId);\r\n let proposal: string | null = null;\r\n for (let i = comments.length - 1; i >= 0; i--) {\r\n if (comments[i].type === \"proposal\") {\r\n proposal = comments[i].body;\r\n break;\r\n }\r\n }\r\n\r\n if (!proposal) {\r\n console.error(chalk.red(`No proposal comment found for ${key}. Run 'bb agent suggest ${id}' first.`));\r\n process.exit(1);\r\n }\r\n\r\n // Parse SPLIT_RESULT block\r\n const splitMatch = proposal.match(/### SPLIT_RESULT\\s*\\n([\\s\\S]*?)(?:\\n###|\\Z|$)/);\r\n if (!splitMatch) {\r\n console.log(chalk.yellow(`No SPLIT_RESULT block found in proposal for ${key}.`));\r\n console.log(chalk.dim(\"The suggest prompt may not have included split analysis.\"));\r\n process.exit(1);\r\n }\r\n\r\n const block = splitMatch[1].trim();\r\n\r\n // Check NEEDS_SPLIT\r\n const needsSplitMatch = block.match(/NEEDS_SPLIT:\\s*(true|false)/i);\r\n if (!needsSplitMatch || needsSplitMatch[1].toLowerCase() === \"false\") {\r\n console.log(chalk.green(`${key} does not need splitting (single-package scope).`));\r\n return;\r\n }\r\n\r\n // Parse items\r\n const subItems: Array<{ scope?: string; title?: string; description?: string; acceptance_criteria?: string }> = [];\r\n let currentItem: Record<string, string> = {};\r\n\r\n for (const line of block.split(\"\\n\")) {\r\n const trimmed = line.trim();\r\n if (trimmed.startsWith(\"- SCOPE:\")) {\r\n if (currentItem.title) {\r\n subItems.push({ ...currentItem });\r\n }\r\n currentItem = { scope: trimmed.split(\":\").slice(1).join(\":\").trim() };\r\n } else if (trimmed.startsWith(\"TITLE:\")) {\r\n currentItem.title = trimmed.split(\":\").slice(1).join(\":\").trim();\r\n } else if (trimmed.startsWith(\"DESCRIPTION:\")) {\r\n currentItem.description = trimmed.split(\":\").slice(1).join(\":\").trim();\r\n } else if (trimmed.startsWith(\"ACCEPTANCE_CRITERIA:\")) {\r\n currentItem.acceptance_criteria = trimmed.split(\":\").slice(1).join(\":\").trim();\r\n }\r\n }\r\n if (currentItem.title) {\r\n subItems.push({ ...currentItem });\r\n }\r\n\r\n if (!subItems.length) {\r\n console.log(chalk.yellow(\"SPLIT_RESULT block found but no items could be parsed.\"));\r\n process.exit(1);\r\n }\r\n\r\n // Display proposed sub-items\r\n console.log(chalk.bold(`\\nProposed sub-items for ${key}:\\n`));\r\n console.log(\" # Scope Title Description\");\r\n console.log(\" \" + \"-\".repeat(70));\r\n for (let i = 0; i < subItems.length; i++) {\r\n const si = subItems[i];\r\n const desc = (si.description ?? \"\").length > 60\r\n ? (si.description ?? \"\").slice(0, 60) + \"...\"\r\n : (si.description ?? \"\");\r\n console.log(\r\n ` ${String(i + 1).padEnd(2)} ${(si.scope ?? \"?\").padEnd(15)} ${(si.title ?? \"?\").padEnd(30)} ${desc}`,\r\n );\r\n }\r\n\r\n if (!opts.yes) {\r\n const ok = await confirm(`\\nCreate ${subItems.length} sub-items under ${key}?`);\r\n if (!ok) {\r\n console.log(chalk.yellow(\"Aborted.\"));\r\n return;\r\n }\r\n }\r\n\r\n // Create children\r\n const createdKeys: string[] = [];\r\n for (const si of subItems) {\r\n const payload = {\r\n title: si.title ?? \"Untitled\",\r\n type: \"task\",\r\n description: si.description ?? \"\",\r\n acceptance_criteria: si.acceptance_criteria ?? \"\",\r\n parent_id: itemId,\r\n priority: item.priority ?? \"medium\",\r\n status: \"open\",\r\n };\r\n const child = await apiPost(`/api/projects/${slug}/work-items`, payload);\r\n const childKey = child.key ?? `#${child.number}`;\r\n createdKeys.push(childKey);\r\n console.log(chalk.green(` Created ${childKey}: ${si.title ?? \"\"}`));\r\n }\r\n\r\n // Post summary comment on parent\r\n const summaryLines = [`## Split into ${createdKeys.length} sub-items\\n`];\r\n for (let i = 0; i < createdKeys.length; i++) {\r\n const si = subItems[i];\r\n summaryLines.push(`- **${createdKeys[i]}** [${si.scope ?? \"?\"}]: ${si.title ?? \"?\"}`);\r\n }\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: summaryLines.join(\"\\n\"),\r\n author: \"bb-agent\",\r\n type: \"agent_output\",\r\n });\r\n\r\n console.log(chalk.green(`\\nSplit complete! Created ${createdKeys.length} sub-items.`));\r\n console.log(chalk.dim(`\\nNext step:`));\r\n console.log(chalk.dim(` bb agent batch-run ${createdKeys.join(\" \")}`));\r\n });\r\n });\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport fs from \"node:fs\";\r\nimport readline from \"node:readline\";\r\nimport { execa } from \"execa\";\r\nimport { apiGet, apiPost, apiPut } from \"../../api-client.js\";\r\nimport { requireProject, requireProjectPath, resolveItemId, withErrorHandling } from \"../../lib/utils.js\";\r\nimport {\r\n findWorktree,\r\n removeWorktree,\r\n detectWorktreeBranch,\r\n} from \"../../lib/git-worktree.js\";\r\nimport {\r\n ensureComposeFiles,\r\n runDockerTests,\r\n truncateOutput,\r\n} from \"../../lib/docker-runner.js\";\r\nimport type { WorkItem } from \"../../types.js\";\r\n\r\nasync function confirm(question: string): Promise<boolean> {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(question + \" (y/N) \", (answer) => {\r\n rl.close();\r\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\r\n });\r\n });\r\n}\r\n\r\nexport const integrateCommand = new Command(\"integrate\")\r\n .description(\"Integrate all child branches: merge into integration branch, Docker test, merge to target\")\r\n .argument(\"<id>\", \"Parent work item ID or number\")\r\n .option(\"-t, --target <branch>\", \"Target branch for integration\", \"release/dev\")\r\n .option(\"--cleanup\", \"Remove worktrees after successful integration\")\r\n .option(\"--timeout <seconds>\", \"Docker test timeout in seconds\", \"600\")\r\n .option(\"-y, --yes\", \"Auto-confirm integration\")\r\n .action(async (id: string, opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n const timeout = parseInt(opts.timeout, 10) * 1000;\r\n const target: string = opts.target;\r\n\r\n const item = await resolveItemId(slug, id);\r\n const itemId = item.id;\r\n const key = item.key ?? `#${item.number}`;\r\n\r\n // Fetch children\r\n const children = await apiGet<WorkItem[]>(`/api/work-items/${itemId}/children`);\r\n if (!children || children.length === 0) {\r\n console.error(chalk.red(`No child items found for ${key}.`));\r\n process.exit(1);\r\n }\r\n\r\n // Validate children statuses\r\n const notReady = children.filter((c) => ![\"resolved\", \"in_review\"].includes(c.status));\r\n if (notReady.length) {\r\n console.log(chalk.yellow(\"Some children are not ready for integration:\"));\r\n for (const c of notReady) {\r\n const ck = c.key ?? `#${c.number}`;\r\n console.log(chalk.yellow(` ${ck}: ${c.status}`));\r\n }\r\n if (!opts.yes) {\r\n const ok = await confirm(\"Proceed anyway?\");\r\n if (!ok) return;\r\n }\r\n }\r\n\r\n // Collect child branches\r\n const childBranches: Array<{ key: string; branch: string; worktree: string; id: string }> = [];\r\n for (const c of children) {\r\n if ([\"resolved\", \"in_review\"].includes(c.status)) {\r\n const wt = findWorktree(slug, c.number);\r\n if (fs.existsSync(wt)) {\r\n const branch = await detectWorktreeBranch(projectPath, wt);\r\n if (branch) {\r\n childBranches.push({\r\n key: c.key ?? `#${c.number}`,\r\n branch,\r\n worktree: wt,\r\n id: c.id,\r\n });\r\n } else {\r\n console.log(chalk.yellow(` Could not detect branch for #${c.number}`));\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!childBranches.length) {\r\n console.error(chalk.red(\"No child branches found. Children may not have worktrees.\"));\r\n process.exit(1);\r\n }\r\n\r\n console.log(chalk.bold(`\\nIntegrating ${childBranches.length} branches for ${key}:`));\r\n for (const cb of childBranches) {\r\n console.log(` ${cb.key}: ${cb.branch}`);\r\n }\r\n\r\n // Create integration branch\r\n const integrationBranch = `integrate/${key.toLowerCase()}`;\r\n console.log(chalk.cyan(`\\nCreating integration branch: ${integrationBranch}`));\r\n\r\n // Remember current branch\r\n const { stdout: currentRaw } = await execa(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], {\r\n cwd: projectPath,\r\n });\r\n const current = currentRaw.trim();\r\n\r\n // Prune stale worktrees\r\n await execa(\"git\", [\"worktree\", \"prune\"], { cwd: projectPath, reject: false });\r\n\r\n // Create integration branch from target\r\n await execa(\"git\", [\"branch\", \"-D\", integrationBranch], { cwd: projectPath, reject: false });\r\n await execa(\"git\", [\"branch\", integrationBranch, target], { cwd: projectPath, reject: false });\r\n const co = await execa(\"git\", [\"checkout\", integrationBranch], { cwd: projectPath, reject: false });\r\n if (co.exitCode !== 0) {\r\n console.error(chalk.red(`Failed to checkout integration branch: ${co.stderr}`));\r\n process.exit(1);\r\n }\r\n\r\n // Merge each child branch\r\n const mergeFailures: typeof childBranches = [];\r\n for (const cb of childBranches) {\r\n process.stdout.write(` Merging ${cb.branch}... `);\r\n const mergeResult = await execa(\r\n \"git\",\r\n [\"merge\", cb.branch, \"--no-ff\", \"-m\", `Merge ${cb.branch} into ${integrationBranch}`],\r\n { cwd: projectPath, reject: false },\r\n );\r\n if (mergeResult.exitCode === 0) {\r\n console.log(chalk.green(\"ok\"));\r\n } else {\r\n console.log(chalk.red(\"CONFLICT\"));\r\n await execa(\"git\", [\"merge\", \"--abort\"], { cwd: projectPath, reject: false });\r\n mergeFailures.push(cb);\r\n }\r\n }\r\n\r\n if (mergeFailures.length) {\r\n console.log(chalk.red(`\\nMerge conflicts in ${mergeFailures.length} branch(es):`));\r\n for (const mf of mergeFailures) {\r\n console.log(chalk.red(` ${mf.key}: ${mf.branch}`));\r\n }\r\n // Cleanup and abort\r\n await execa(\"git\", [\"checkout\", current], { cwd: projectPath, reject: false });\r\n await execa(\"git\", [\"branch\", \"-D\", integrationBranch], { cwd: projectPath, reject: false });\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: `## Integration Failed\\n\\nMerge conflicts in: ${mergeFailures.map((mf) => mf.key).join(\", \")}`,\r\n author: \"bb-agent\",\r\n type: \"test_failure\",\r\n });\r\n process.exit(1);\r\n }\r\n\r\n console.log(chalk.green(`\\nAll branches merged into ${integrationBranch}.`));\r\n\r\n // Run Docker tests on integration branch\r\n console.log(chalk.cyan(\"\\nRunning Docker tests on integration branch...\"));\r\n ensureComposeFiles(projectPath, projectPath);\r\n const dockerResult = await runDockerTests(projectPath, timeout);\r\n\r\n if (dockerResult.success) {\r\n console.log(chalk.green(`Docker tests passed!\\n${dockerResult.details}`));\r\n\r\n // Fast-forward target to integration branch\r\n console.log(chalk.cyan(`\\nMerging ${integrationBranch} into ${target}...`));\r\n await execa(\"git\", [\"checkout\", target], { cwd: projectPath, reject: false });\r\n const ffResult = await execa(\r\n \"git\",\r\n [\"merge\", integrationBranch, \"--ff-only\"],\r\n { cwd: projectPath, reject: false },\r\n );\r\n if (ffResult.exitCode !== 0) {\r\n // Non-fast-forward, do a regular merge\r\n await execa(\r\n \"git\",\r\n [\"merge\", integrationBranch, \"--no-ff\", \"-m\", `Merge ${integrationBranch} into ${target}`],\r\n { cwd: projectPath, reject: false },\r\n );\r\n }\r\n\r\n // Update parent status\r\n await apiPut(`/api/work-items/${itemId}`, { status: \"resolved\" });\r\n console.log(chalk.dim(\"Parent status -> resolved\"));\r\n\r\n // Update children statuses\r\n for (const cb of childBranches) {\r\n await apiPut(`/api/work-items/${cb.id}`, { status: \"resolved\" });\r\n }\r\n\r\n // Cleanup\r\n if (opts.cleanup) {\r\n for (const cb of childBranches) {\r\n await removeWorktree(projectPath, cb.worktree);\r\n }\r\n console.log(chalk.dim(\"Worktrees cleaned up.\"));\r\n }\r\n\r\n // Cleanup integration branch\r\n await execa(\"git\", [\"branch\", \"-D\", integrationBranch], { cwd: projectPath, reject: false });\r\n\r\n // Post success comment\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: `## Integration Successful\\n\\nAll ${childBranches.length} branches merged and Docker tests passed.\\nMerged to \\`${target}\\`.`,\r\n author: \"bb-agent\",\r\n type: \"agent_output\",\r\n });\r\n\r\n console.log(chalk.green(`\\nIntegration complete! All branches merged to ${target}.`));\r\n } else {\r\n console.log(chalk.red(`Docker tests failed!\\n${dockerResult.details}`));\r\n\r\n // Cleanup integration branch\r\n await execa(\"git\", [\"checkout\", current], { cwd: projectPath, reject: false });\r\n await execa(\"git\", [\"branch\", \"-D\", integrationBranch], { cwd: projectPath, reject: false });\r\n\r\n // Post failure comment\r\n const truncated = truncateOutput(dockerResult.rawOutput, 4000);\r\n await apiPost(`/api/work-items/${itemId}/comments`, {\r\n body: `## Integration Failed\\n\\n**Docker tests failed.**\\n\\n${dockerResult.details}\\n\\n### Docker Output\\n\\n\\`\\`\\`\\n${truncated}\\n\\`\\`\\``,\r\n author: \"bb-agent\",\r\n type: \"test_failure\",\r\n });\r\n\r\n console.log(chalk.red(\"\\nIntegration failed. See Docker test output above.\"));\r\n process.exit(1);\r\n }\r\n\r\n // Return to original branch\r\n await execa(\"git\", [\"checkout\", current], { cwd: projectPath, reject: false });\r\n });\r\n });\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport fs from \"node:fs\";\r\nimport { execa } from \"execa\";\r\nimport { requireProject, requireProjectPath, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { runClaude } from \"../../lib/claude-runner.js\";\r\nimport {\r\n listAgentBranches,\r\n extractItemNumberFromBranch,\r\n findWorktree,\r\n removeWorktree,\r\n} from \"../../lib/git-worktree.js\";\r\n\r\nexport const mergeCommand = new Command(\"merge\")\r\n .description(\"Merge agent branches into a target branch (e.g. release/dev)\")\r\n .argument(\"[items...]\", \"Specific item numbers (default: all agent branches)\")\r\n .option(\"-t, --target <branch>\", \"Target branch to merge into\", \"release/dev\")\r\n .option(\"--cleanup\", \"Remove worktrees + branches after successful merge\")\r\n .option(\"--agent\", \"Use Claude to resolve merge conflicts\")\r\n .action(async (items: string[], opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n\r\n // Remember current branch\r\n const { stdout: currentRaw } = await execa(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], {\r\n cwd: projectPath,\r\n });\r\n const current = currentRaw.trim();\r\n\r\n const allBranches = await listAgentBranches(projectPath);\r\n\r\n let branches: string[];\r\n if (items && items.length > 0) {\r\n const wantedNums = new Set(items.map((n) => parseInt(n, 10)));\r\n branches = allBranches.filter((b) => {\r\n const num = extractItemNumberFromBranch(b);\r\n return num !== null && wantedNums.has(num);\r\n });\r\n } else {\r\n branches = allBranches;\r\n }\r\n\r\n if (!branches.length) {\r\n console.log(chalk.yellow(\"No agent branches found to merge.\"));\r\n return;\r\n }\r\n\r\n const target = opts.target;\r\n console.log(chalk.cyan(`Merging ${branches.length} branches into ${target}...\\n`));\r\n for (const b of branches) {\r\n console.log(` ${b}`);\r\n }\r\n console.log();\r\n\r\n // Ensure target branch exists\r\n const check = await execa(\"git\", [\"rev-parse\", \"--verify\", target], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n if (check.exitCode !== 0) {\r\n console.log(chalk.yellow(`Branch '${target}' does not exist. Creating from HEAD...`));\r\n await execa(\"git\", [\"branch\", target], { cwd: projectPath });\r\n }\r\n\r\n // Prune stale worktrees\r\n await execa(\"git\", [\"worktree\", \"prune\"], { cwd: projectPath, reject: false });\r\n\r\n // Checkout target branch\r\n const co = await execa(\"git\", [\"checkout\", target], { cwd: projectPath, reject: false });\r\n if (co.exitCode !== 0) {\r\n console.error(chalk.red(`Failed to checkout ${target}: ${co.stderr}`));\r\n return;\r\n }\r\n\r\n const merged: string[] = [];\r\n const failed: Array<[string, string]> = [];\r\n\r\n for (const branch of branches) {\r\n process.stdout.write(` Merging ${branch}... `);\r\n const mergeResult = await execa(\r\n \"git\",\r\n [\"merge\", branch, \"--no-ff\", \"-m\", `Merge ${branch} into ${target}`],\r\n { cwd: projectPath, reject: false },\r\n );\r\n\r\n if (mergeResult.exitCode === 0) {\r\n console.log(chalk.green(\"ok\"));\r\n merged.push(branch);\r\n } else {\r\n if (opts.agent) {\r\n console.log(chalk.yellow(\"conflict -> resolving with Claude...\"));\r\n await runClaude({\r\n cmd: [\r\n \"claude\", \"-p\",\r\n `Resolve all merge conflicts in this git repo. The merge of '${branch}' into '${target}' has conflicts. ` +\r\n `Use 'git diff' to find conflicts, resolve them keeping both sets of changes where possible, ` +\r\n `then stage and commit. Do NOT abort the merge.`,\r\n \"--output-format\", \"text\",\r\n \"--permission-mode\", \"bypassPermissions\",\r\n ],\r\n cwd: projectPath,\r\n timeout: 300_000,\r\n });\r\n\r\n // Check if conflicts are resolved\r\n const statusCheck = await execa(\r\n \"git\",\r\n [\"diff\", \"--name-only\", \"--diff-filter=U\"],\r\n { cwd: projectPath, reject: false },\r\n );\r\n if (statusCheck.stdout.trim() === \"\") {\r\n console.log(chalk.green(\" Conflict resolved by agent\"));\r\n merged.push(branch);\r\n } else {\r\n console.log(chalk.red(\" Agent could not resolve all conflicts\"));\r\n await execa(\"git\", [\"merge\", \"--abort\"], { cwd: projectPath, reject: false });\r\n failed.push([branch, \"conflict (agent failed)\"]);\r\n }\r\n } else {\r\n console.log(chalk.red(\"CONFLICT\"));\r\n await execa(\"git\", [\"merge\", \"--abort\"], { cwd: projectPath, reject: false });\r\n failed.push([branch, \"conflict\"]);\r\n }\r\n }\r\n }\r\n\r\n // Summary\r\n console.log();\r\n console.log(chalk.bold(`Merge Results -> ${target}`));\r\n console.log(\"-\".repeat(50));\r\n for (const b of merged) {\r\n console.log(` ${b.padEnd(40)} ${chalk.green(\"merged\")}`);\r\n }\r\n for (const [b, reason] of failed) {\r\n console.log(` ${b.padEnd(40)} ${chalk.red(reason)}`);\r\n }\r\n\r\n // Cleanup if requested\r\n if (opts.cleanup && merged.length) {\r\n for (const branch of merged) {\r\n const num = extractItemNumberFromBranch(branch);\r\n if (num !== null) {\r\n try {\r\n const wt = findWorktree(slug, num);\r\n if (fs.existsSync(wt)) {\r\n await removeWorktree(projectPath, wt);\r\n }\r\n } catch {}\r\n }\r\n await execa(\"git\", [\"branch\", \"-D\", branch], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n }\r\n console.log(chalk.dim(\"Cleaned up merged worktrees and branches.\"));\r\n }\r\n\r\n if (failed.length) {\r\n console.log(chalk.yellow(\"\\nFailed branches can be retried:\"));\r\n console.log(chalk.dim(\" bb agent merge --agent (use Claude to resolve conflicts)\"));\r\n console.log(chalk.dim(` or resolve manually: git checkout ${target} && git merge <branch>`));\r\n }\r\n\r\n // Return to original branch\r\n await execa(\"git\", [\"checkout\", current], { cwd: projectPath, reject: false });\r\n });\r\n });\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport { apiGet, apiPost } from \"../../api-client.js\";\r\nimport { requireProject, withErrorHandling } from \"../../lib/utils.js\";\r\nimport type { AgentSession } from \"../../types.js\";\r\n\r\nexport const statusCommand = new Command(\"status\")\r\n .description(\"Show agent sessions for the current project\")\r\n .action(async () => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const sessions = await apiGet<AgentSession[]>(\"/api/agent-sessions\", { project_slug: slug });\r\n\r\n if (!sessions || sessions.length === 0) {\r\n console.log(chalk.dim(\"No agent sessions.\"));\r\n return;\r\n }\r\n\r\n for (const s of sessions) {\r\n const colorFn =\r\n s.status === \"running\" ? chalk.yellow :\r\n s.status === \"completed\" ? chalk.green :\r\n s.status === \"failed\" ? chalk.red :\r\n chalk.white;\r\n\r\n const sid = String(s.id).slice(0, 8);\r\n const itemId = s.work_item_id ?? \"--\";\r\n console.log(` ${colorFn(s.status.padStart(10))} ${sid} item: ${itemId}`);\r\n }\r\n });\r\n });\r\n\r\nexport const abortCommand = new Command(\"abort\")\r\n .description(\"Abort a running agent session\")\r\n .argument(\"<session-id>\", \"Session ID to abort\")\r\n .action(async (sessionId: string) => {\r\n await withErrorHandling(async () => {\r\n await apiPost(`/api/agent-sessions/${sessionId}/abort`);\r\n console.log(chalk.yellow(`Session ${sessionId.slice(0, 8)} aborted.`));\r\n });\r\n });\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport fs from \"node:fs\";\r\nimport { execa } from \"execa\";\r\nimport { requireProject, requireProjectPath, withErrorHandling } from \"../../lib/utils.js\";\r\nimport { findWorktree, removeWorktree, detectWorktreeBranch, WORKTREES_DIR } from \"../../lib/git-worktree.js\";\r\n\r\nexport const worktreesCommand = new Command(\"worktrees\")\r\n .description(\"List active agent worktrees for the current project\")\r\n .action(async () => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n\r\n const result = await execa(\"git\", [\"worktree\", \"list\"], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n\r\n if (result.exitCode !== 0) {\r\n console.error(chalk.red(\"Failed to list worktrees.\"));\r\n process.exit(1);\r\n }\r\n\r\n // Filter to worktrees under our managed directory\r\n const wtDir = WORKTREES_DIR.replace(/\\\\/g, \"/\") + \"/\" + slug;\r\n const lines = result.stdout.trim().split(\"\\n\");\r\n const bbLines = lines.filter((ln) => ln.replace(/\\\\/g, \"/\").includes(wtDir));\r\n\r\n if (!bbLines.length) {\r\n console.log(chalk.dim(\"No agent worktrees.\"));\r\n return;\r\n }\r\n\r\n console.log(chalk.bold(\"Agent worktrees:\"));\r\n for (const ln of bbLines) {\r\n console.log(` ${ln}`);\r\n }\r\n });\r\n });\r\n\r\nexport const cleanupCommand = new Command(\"cleanup\")\r\n .description(\"Remove the worktree created for a work item\")\r\n .argument(\"<item-number>\", \"Work item number whose worktree to remove\")\r\n .option(\"-D, --delete-branch\", \"Also delete the git branch\")\r\n .action(async (itemNumberStr: string, opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = requireProject();\r\n const projectPath = requireProjectPath(slug);\r\n const itemNumber = parseInt(itemNumberStr, 10);\r\n\r\n if (isNaN(itemNumber)) {\r\n console.error(chalk.red(\"Invalid item number.\"));\r\n process.exit(1);\r\n }\r\n\r\n const wt = findWorktree(slug, itemNumber);\r\n\r\n if (!fs.existsSync(wt)) {\r\n console.log(chalk.yellow(`No worktree found for item #${itemNumber}.`));\r\n return;\r\n }\r\n\r\n // Detect branch before removing worktree\r\n const branch = await detectWorktreeBranch(projectPath, wt);\r\n\r\n await removeWorktree(projectPath, wt);\r\n console.log(chalk.green(`Worktree removed: ${wt}`));\r\n\r\n if (opts.deleteBranch && branch) {\r\n await execa(\"git\", [\"branch\", \"-D\", branch], {\r\n cwd: projectPath,\r\n reject: false,\r\n });\r\n console.log(chalk.green(`Branch deleted: ${branch}`));\r\n } else if (branch) {\r\n console.log(chalk.dim(`Branch '${branch}' kept. Delete with: git branch -D ${branch}`));\r\n } else {\r\n console.log(chalk.dim(\"Could not detect branch name (worktree may have been stale).\"));\r\n }\r\n });\r\n });\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport os from \"node:os\";\r\nimport { apiGet, apiPost } from \"../../api-client.js\";\r\nimport { getCurrentProject, getProjectPath, getApiUrl, getToken } from \"../../config.js\";\r\nimport { withErrorHandling } from \"../../lib/utils.js\";\r\nimport { suggestOne } from \"./suggest.js\";\r\nimport { executeOne } from \"./execute.js\";\r\nimport type { AgentSession } from \"../../types.js\";\r\n\r\nfunction daemonId(): string {\r\n return `${os.hostname()}-${process.pid}`;\r\n}\r\n\r\nasync function pollPendingSessions(slug: string): Promise<AgentSession[]> {\r\n try {\r\n const sessions = await apiGet<AgentSession[]>(\"/api/agent-sessions\", { project_slug: slug });\r\n return sessions.filter((s) => s.status === \"pending\" && !s.claimed_by);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nasync function claimSession(sessionId: string | number, dId: string): Promise<AgentSession | null> {\r\n try {\r\n return await apiPost<AgentSession>(`/api/agent-sessions/${sessionId}/claim`, undefined, { daemon_id: dId });\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nasync function runSession(slug: string, projectPath: string, session: AgentSession): Promise<void> {\r\n const sessionId = session.id;\r\n const workItemId = session.work_item_id;\r\n const phase = session.phase ?? \"execute\";\r\n\r\n if (!workItemId) {\r\n console.log(chalk.yellow(` Session ${sessionId}: no work_item_id, skipping.`));\r\n await apiPost(`/api/agent-sessions/${sessionId}/complete`, {\r\n status: \"failed\", error: \"No work item specified\",\r\n });\r\n return;\r\n }\r\n\r\n // Resolve item number for the worker functions\r\n let idOrNumber: string;\r\n try {\r\n const item = await apiGet(`/api/work-items/${workItemId}`);\r\n idOrNumber = item.key ?? String(item.number);\r\n } catch (e: any) {\r\n console.log(chalk.red(` Session ${sessionId}: failed to resolve item ${workItemId}: ${e.message}`));\r\n await apiPost(`/api/agent-sessions/${sessionId}/complete`, {\r\n status: \"failed\", error: String(e.message),\r\n });\r\n return;\r\n }\r\n\r\n console.log(chalk.cyan(` Running ${phase} for ${idOrNumber}...`));\r\n\r\n let result: Record<string, any>;\r\n if (phase === \"suggest\" || phase === \"verify\") {\r\n result = await suggestOne(slug, projectPath, idOrNumber);\r\n } else {\r\n result = await executeOne(slug, projectPath, idOrNumber);\r\n }\r\n\r\n const status = result.status === \"ok\" ? \"ok\" : \"failed\";\r\n const color = status === \"ok\" ? chalk.green : chalk.red;\r\n const suffix = status !== \"ok\" ? ` -- ${result.error ?? \"\"}` : \"\";\r\n console.log(color(` ${idOrNumber}: ${status}${suffix}`));\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport const daemonCommand = new Command(\"daemon\")\r\n .description(\"Start the agent daemon -- polls for web-initiated sessions and executes them\")\r\n .option(\"-p, --poll <seconds>\", \"Polling interval in seconds\", \"5\")\r\n .action(async (opts) => {\r\n await withErrorHandling(async () => {\r\n const slug = getCurrentProject();\r\n if (!slug) {\r\n console.error(chalk.red(\"No project configured. Run 'bb init' or 'bb project use <slug>' first.\"));\r\n process.exit(1);\r\n }\r\n\r\n const projectPath = getProjectPath(slug);\r\n if (!projectPath) {\r\n console.error(chalk.red(\"No project path configured. Run 'bb init' first.\"));\r\n process.exit(1);\r\n }\r\n\r\n const token = getToken();\r\n if (!token) {\r\n console.error(chalk.red(\"Not authenticated. Run 'bb login' first.\"));\r\n process.exit(1);\r\n }\r\n\r\n const dId = daemonId();\r\n const apiUrl = getApiUrl();\r\n const pollInterval = parseInt(opts.poll, 10) * 1000;\r\n\r\n console.log(chalk.bold.green(\"Bumblebee Agent Daemon\"));\r\n console.log(` Project: ${chalk.cyan(slug)}`);\r\n console.log(` Path: ${chalk.cyan(projectPath)}`);\r\n console.log(` API: ${chalk.cyan(apiUrl)}`);\r\n console.log(` Daemon: ${chalk.cyan(dId)}`);\r\n console.log(` Poll: every ${opts.poll}s`);\r\n console.log(chalk.dim(\"\\nListening for web-initiated agent requests... (Ctrl+C to stop)\\n\"));\r\n\r\n // Graceful shutdown\r\n let running = true;\r\n\r\n const shutdown = () => {\r\n console.log(chalk.yellow(\"\\nShutting down daemon...\"));\r\n running = false;\r\n };\r\n\r\n process.on(\"SIGINT\", shutdown);\r\n process.on(\"SIGTERM\", shutdown);\r\n\r\n while (running) {\r\n const pending = await pollPendingSessions(slug);\r\n\r\n for (const session of pending) {\r\n const claimed = await claimSession(session.id, dId);\r\n if (claimed) {\r\n console.log(chalk.cyan(`Claimed session ${session.id}`));\r\n try {\r\n await runSession(slug, projectPath, claimed);\r\n } catch (e: any) {\r\n console.log(chalk.red(`Session ${session.id} failed: ${e.message}`));\r\n try {\r\n await apiPost(`/api/agent-sessions/${session.id}/complete`, {\r\n status: \"failed\", error: String(e.message),\r\n });\r\n } catch {}\r\n }\r\n }\r\n }\r\n\r\n await sleep(pollInterval);\r\n }\r\n\r\n console.log(chalk.dim(\"Daemon stopped.\"));\r\n });\r\n });\r\n"],"mappings":"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","names":["Command","chalk","path","p","text","password","chalk","confirm","Command","chalk","path","fs","p","Command","chalk","path","fs","Command","chalk","Table","Command","Table","chalk","Command","chalk","Command","chalk","Command","chalk","Table","Command","Table","chalk","s","Command","chalk","Table","Command","Table","chalk","Command","chalk","Table","Command","chalk","Table","Command","chalk","Table","chalk","Command","Table","Command","chalk","p","fs","path","TOML","fs","path","chalk","path","fs","path","fs","chalk","chalk","Command","path","fs","TOML","Command","Command","chalk","execa","fs","fs","execa","fs","path","os","path","os","fs","text","fs","path","path","fs","text","chalk","Command","chalk","Command","chalk","pLimit","fs","path","os","execa","path","os","path","fs","execa","stdout","buildMcpConfig","Command","chalk","text","pLimit","Command","chalk","fs","fs","Command","chalk","Command","chalk","Command","chalk","Command","chalk","fs","fs","path","execa","path","fs","truncateOutput","execa","buildMcpConfig","fs","Command","chalk","text","Command","chalk","fs","pLimit","fs","truncateOutput","Command","chalk","pLimit","Command","chalk","buildMcpConfig","Command","chalk","text","Command","chalk","readline","confirm","readline","Command","chalk","Command","chalk","fs","readline","execa","confirm","readline","Command","chalk","fs","execa","truncateOutput","Command","chalk","fs","execa","Command","execa","chalk","fs","Command","chalk","Command","chalk","Command","chalk","fs","execa","Command","execa","chalk","fs","Command","chalk","os","os","chalk","Command","Command","Command"]}
|