xforce 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/env.ts","../../src/cli/commands/run.ts","../../src/core/config.ts","../../src/core/constants.ts","../../src/core/errors.ts","../../src/pipeline/orchestrator.ts","../../src/core/logger.ts","../../src/pipeline/state-machine.ts","../../src/pipeline/feedback-loop.ts","../../src/github/client.ts","../../src/github/issue-parser.ts","../../src/github/branch.ts","../../src/github/pr.ts","../../src/agents/coder.ts","../../src/agents/prompts/coder-system.ts","../../src/agents/prompts/planner-system.ts","../../src/agents/planner.ts","../../src/agents/reviewer.ts","../../src/agents/prompts/reviewer-system.ts","../../src/agents/security-scanner.ts","../../src/testing/test-runner.ts","../../src/notifications/sender.ts","../../src/pipeline/auto-merge.ts","../../src/tracking/cost-tracker.ts","../../src/cli/commands/review.ts","../../src/cli/commands/init.ts","../../src/cli/commands/costs.ts","../../src/cli/commands/serve.ts","../../src/server/webhook.ts","../../src/server/queue.ts"],"sourcesContent":["import yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { loadEnvFile } from \"./env.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { reviewCommand } from \"./commands/review.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { costsCommand } from \"./commands/costs.js\";\nimport { serveCommand } from \"./commands/serve.js\";\n\n// Load .env from current directory before anything else\nloadEnvFile();\n\nyargs(hideBin(process.argv))\n .scriptName(\"xforce\")\n .usage(\"$0 <command> [options]\")\n .command(\n \"run\",\n \"Run the X-Force pipeline on a GitHub issue\",\n (y) =>\n y\n .option(\"issue\", {\n alias: \"i\",\n type: \"string\",\n description: \"GitHub issue URL (e.g., https://github.com/org/repo/issues/42)\",\n })\n .option(\"repo\", {\n alias: \"r\",\n type: \"string\",\n description: \"Repository in owner/name format\",\n })\n .option(\"issue-number\", {\n alias: \"n\",\n type: \"number\",\n description: \"Issue number (used with --repo)\",\n })\n .option(\"config\", {\n alias: \"c\",\n type: \"string\",\n description: \"Path to xforce.config.yaml\",\n })\n .check((argv) => {\n if (!argv.issue && !(argv.repo && argv.issueNumber)) {\n throw new Error(\"Provide --issue <url> or --repo <owner/name> --issue-number <n>\");\n }\n return true;\n }),\n async (argv) => {\n await runCommand({\n issueUrl: argv.issue,\n repo: argv.repo,\n issueNumber: argv.issueNumber,\n configPath: argv.config,\n });\n },\n )\n .command(\n \"init\",\n \"Initialize X-Force in a target repository\",\n (y) =>\n y\n .option(\"path\", {\n type: \"string\",\n description: \"Target repository path (defaults to current directory)\",\n })\n .option(\"owner\", {\n type: \"string\",\n description: \"GitHub repo owner\",\n })\n .option(\"name\", {\n type: \"string\",\n description: \"GitHub repo name\",\n })\n .option(\"branch\", {\n type: \"string\",\n description: \"Default branch name\",\n default: \"main\",\n })\n .option(\"test-command\", {\n type: \"string\",\n description: \"Test command for the repo\",\n default: \"npm test\",\n })\n .option(\"build-command\", {\n type: \"string\",\n description: \"Build command for the repo\",\n })\n .option(\"lint-command\", {\n type: \"string\",\n description: \"Lint command for the repo\",\n })\n .option(\"run-command\", {\n type: \"string\",\n description: \"Run/verification command for the repo\",\n }),\n async (argv) => {\n await initCommand({\n path: argv.path,\n owner: argv.owner,\n name: argv.name,\n branch: argv.branch,\n testCommand: argv.testCommand,\n buildCommand: argv.buildCommand,\n lintCommand: argv.lintCommand,\n runCommand: argv.runCommand,\n });\n },\n )\n .command(\n \"review\",\n \"Run the AI reviewer on a pull request\",\n (y) =>\n y\n .option(\"pr\", {\n alias: \"p\",\n type: \"string\",\n description: \"GitHub PR URL (e.g., https://github.com/org/repo/pull/42)\",\n demandOption: true,\n })\n .option(\"config\", {\n alias: \"c\",\n type: \"string\",\n description: \"Path to xforce.config.yaml\",\n }),\n async (argv) => {\n await reviewCommand({\n prUrl: argv.pr,\n configPath: argv.config,\n });\n },\n )\n .command(\n \"costs\",\n \"Show cost tracking dashboard\",\n (y) =>\n y\n .option(\"repo\", { type: \"string\", description: \"Filter by repo (owner/name)\" })\n .option(\"since\", { type: \"string\", description: \"Start date (YYYY-MM-DD)\" })\n .option(\"until\", { type: \"string\", description: \"End date (YYYY-MM-DD)\" })\n .option(\"detailed\", { type: \"boolean\", description: \"Show individual runs\", default: false })\n .option(\"json\", { type: \"boolean\", description: \"Output as JSON\", default: false }),\n async (argv) => {\n await costsCommand({\n repo: argv.repo,\n since: argv.since,\n until: argv.until,\n detailed: argv.detailed,\n json: argv.json,\n });\n },\n )\n .command(\n \"serve\",\n \"Start the webhook server to receive GitHub events\",\n (y) =>\n y\n .option(\"port\", {\n alias: \"p\",\n type: \"number\",\n description: \"Port to listen on\",\n default: 3000,\n })\n .option(\"host\", {\n type: \"string\",\n description: \"Host to bind to\",\n default: \"0.0.0.0\",\n })\n .option(\"secret\", {\n alias: \"s\",\n type: \"string\",\n description: \"GitHub webhook secret (or set XFORCE_WEBHOOK_SECRET)\",\n })\n .option(\"config\", {\n alias: \"c\",\n type: \"string\",\n description: \"Path to xforce.config.yaml\",\n })\n .option(\"max-queue-size\", {\n type: \"number\",\n description: \"Maximum pending jobs in queue\",\n default: 10,\n }),\n async (argv) => {\n await serveCommand({\n port: argv.port,\n host: argv.host,\n secret: argv.secret,\n configPath: argv.config,\n maxQueueSize: argv.maxQueueSize,\n });\n },\n )\n .demandCommand(1, \"Please specify a command\")\n .strict()\n .help()\n .version()\n .parse();\n","import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/**\n * Load a .env file from the current directory into process.env.\n * Only sets variables that are not already set (env vars take precedence).\n * Silently skips if the file doesn't exist.\n */\nexport function loadEnvFile(dir: string = process.cwd()): void {\n let content: string;\n try {\n content = readFileSync(resolve(dir, \".env.xforce\"), \"utf-8\");\n } catch {\n return; // no .env file, that's fine\n }\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Strip surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n // Don't override existing env vars\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n}\n","import ora from \"ora\";\nimport chalk from \"chalk\";\nimport { loadConfig } from \"../../core/config.js\";\nimport { runPipeline } from \"../../pipeline/orchestrator.js\";\n\nexport async function runCommand(params: {\n issueUrl?: string;\n repo?: string;\n issueNumber?: number;\n configPath?: string;\n}): Promise<void> {\n const spinner = ora(\"Loading configuration...\").start();\n\n try {\n const config = loadConfig(params.configPath);\n spinner.succeed(\"Configuration loaded\");\n\n let owner: string | undefined;\n let name: string | undefined;\n if (params.repo) {\n const parts = params.repo.split(\"/\");\n if (parts.length !== 2) {\n spinner.fail(\"Invalid repo format. Use owner/name\");\n process.exit(1);\n }\n [owner, name] = parts;\n }\n\n spinner.start(\"Starting pipeline...\");\n\n const result = await runPipeline({\n issueUrl: params.issueUrl,\n repoOwner: owner,\n repoName: name,\n issueNumber: params.issueNumber,\n config,\n });\n\n if (result.status === \"failed\") {\n spinner.fail(chalk.red(`Pipeline failed: ${result.error}`));\n console.log();\n console.log(chalk.dim(`Pipeline ID: ${result.id}`));\n console.log(chalk.dim(`Cost: $${result.totalCostUsd.toFixed(4)}`));\n process.exit(1);\n }\n\n spinner.succeed(chalk.green(\"Pipeline completed successfully\"));\n console.log();\n console.log(` ${chalk.bold(\"Pipeline ID:\")} ${result.id}`);\n console.log(` ${chalk.bold(\"PR:\")} ${result.prUrl}`);\n console.log(` ${chalk.bold(\"Branch:\")} ${result.branchName}`);\n console.log(` ${chalk.bold(\"Cost:\")} $${result.totalCostUsd.toFixed(4)}`);\n console.log(` ${chalk.bold(\"Cycles:\")} ${result.reviewCycle + 1}`);\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n spinner.fail(chalk.red(message));\n process.exit(1);\n }\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { z } from \"zod\";\nimport { DEFAULT_CONFIG, CONFIG_FILE_NAMES } from \"./constants.js\";\nimport { ConfigError } from \"./errors.js\";\nimport type { XForceConfig, ResolvedRepoConfig } from \"./types.js\";\n\nconst LabelsSchema = z.object({\n ready: z.string().default(DEFAULT_CONFIG.labels.ready),\n inProgress: z.string().default(DEFAULT_CONFIG.labels.inProgress),\n done: z.string().default(DEFAULT_CONFIG.labels.done),\n failed: z.string().default(DEFAULT_CONFIG.labels.failed),\n});\n\nconst AutoMergeRulesSchema = z.object({\n types: z.array(z.enum([\"feature\", \"bugfix\", \"refactor\", \"test\", \"docs\"])).default([\"bugfix\", \"test\", \"docs\"]),\n maxSize: z.enum([\"xs\", \"s\", \"m\", \"l\", \"xl\"]).default(\"m\"),\n mergeStrategy: z.enum([\"squash\", \"merge\", \"rebase\"]).default(\"squash\"),\n requireCleanSecurityScan: z.boolean().default(true),\n});\n\nconst RepoConfigSchema = z.object({\n owner: z.string().min(1),\n name: z.string().min(1),\n defaultBranch: z.string().default(\"main\"),\n testCommand: z.string().min(1),\n lintCommand: z.string().optional(),\n buildCommand: z.string().optional(),\n runCommand: z.string().optional(),\n claudeMdPath: z.string().optional(),\n maxTurns: z.number().int().positive().optional(),\n maxReviewCycles: z.number().int().min(1).max(10).optional(),\n maxTestRetries: z.number().int().min(0).max(5).optional(),\n budgetPerTaskUsd: z.number().positive().optional(),\n autoMerge: z.boolean().default(false),\n autoMergeRules: AutoMergeRulesSchema.optional(),\n allowedTools: z.array(z.string()).optional(),\n localPath: z.string().optional(),\n});\n\nconst DefaultsSchema = z.object({\n model: z.string().default(DEFAULT_CONFIG.model),\n reviewerModel: z.string().default(DEFAULT_CONFIG.reviewerModel),\n plannerModel: z.string().default(DEFAULT_CONFIG.plannerModel),\n maxTurns: z.number().int().positive().default(DEFAULT_CONFIG.maxTurns),\n maxReviewCycles: z.number().int().min(1).max(10).default(DEFAULT_CONFIG.maxReviewCycles),\n maxTestRetries: z.number().int().min(0).max(5).default(DEFAULT_CONFIG.maxTestRetries),\n timeoutMinutes: z.number().int().positive().default(DEFAULT_CONFIG.timeoutMinutes),\n budgetPerTaskUsd: z.number().positive().default(DEFAULT_CONFIG.budgetPerTaskUsd),\n branchPrefix: z.string().default(DEFAULT_CONFIG.branchPrefix),\n labels: LabelsSchema.default({}),\n allowedTools: z.array(z.string()).default([...DEFAULT_CONFIG.allowedTools]),\n enablePlanning: z.boolean().default(DEFAULT_CONFIG.enablePlanning),\n enableSecurityScan: z.boolean().default(DEFAULT_CONFIG.enableSecurityScan),\n});\n\nconst XForceConfigSchema = z.object({\n version: z.literal(\"1\"),\n defaults: DefaultsSchema.default({}),\n repos: z.array(RepoConfigSchema).min(1),\n notifications: z\n .object({\n slack: z\n .object({\n webhookUrl: z.string(),\n channels: z\n .object({\n success: z.string().optional(),\n failure: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n github: z\n .object({\n mentionOnFailure: z.array(z.string()).optional(),\n mentionOnReview: z.array(z.string()).optional(),\n })\n .optional(),\n })\n .optional(),\n});\n\n/** Interpolate ${ENV_VAR} references in a string */\nfunction interpolateEnvVars(value: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (_match, varName: string) => {\n const envValue = process.env[varName];\n if (envValue === undefined) {\n throw new ConfigError(`Environment variable ${varName} is not set`);\n }\n return envValue;\n });\n}\n\n/** Recursively interpolate env vars in an object */\nfunction interpolateDeep(obj: unknown): unknown {\n if (typeof obj === \"string\") return interpolateEnvVars(obj);\n if (Array.isArray(obj)) return obj.map(interpolateDeep);\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = interpolateDeep(value);\n }\n return result;\n }\n return obj;\n}\n\n/** Find the config file by checking known paths */\nfunction findConfigFile(basePath: string): string | null {\n for (const name of CONFIG_FILE_NAMES) {\n const fullPath = resolve(basePath, name);\n if (existsSync(fullPath)) return fullPath;\n }\n return null;\n}\n\n/** Load and validate the xforce config file */\nexport function loadConfig(configPath?: string): XForceConfig {\n let filePath: string;\n\n if (configPath) {\n filePath = resolve(configPath);\n if (!existsSync(filePath)) {\n throw new ConfigError(`Config file not found: ${filePath}`);\n }\n } else {\n const found = findConfigFile(process.cwd());\n if (!found) {\n throw new ConfigError(\n `No config file found. Create xforce.config.yaml or specify --config path.`,\n );\n }\n filePath = found;\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = parseYaml(raw);\n const interpolated = interpolateDeep(parsed);\n\n const result = XForceConfigSchema.safeParse(interpolated);\n if (!result.success) {\n const errors = result.error.issues\n .map((i) => ` - ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new ConfigError(`Invalid config:\\n${errors}`);\n }\n\n return result.data;\n}\n\n/** Resolve config for a specific repo by merging defaults with repo overrides */\nexport function resolveRepoConfig(config: XForceConfig, owner: string, name: string): ResolvedRepoConfig {\n const repo = config.repos.find((r) => r.owner === owner && r.name === name);\n if (!repo) {\n throw new ConfigError(\n `Repository ${owner}/${name} not found in config. Add it under the 'repos' section.`,\n );\n }\n\n return {\n owner: repo.owner,\n name: repo.name,\n defaultBranch: repo.defaultBranch,\n testCommand: repo.testCommand,\n lintCommand: repo.lintCommand,\n buildCommand: repo.buildCommand,\n runCommand: repo.runCommand,\n claudeMdPath: repo.claudeMdPath,\n model: config.defaults.model,\n reviewerModel: config.defaults.reviewerModel,\n plannerModel: config.defaults.plannerModel,\n maxTurns: repo.maxTurns ?? config.defaults.maxTurns,\n maxReviewCycles: repo.maxReviewCycles ?? config.defaults.maxReviewCycles,\n maxTestRetries: repo.maxTestRetries ?? config.defaults.maxTestRetries,\n timeoutMinutes: config.defaults.timeoutMinutes,\n budgetPerTaskUsd: repo.budgetPerTaskUsd ?? config.defaults.budgetPerTaskUsd,\n branchPrefix: config.defaults.branchPrefix,\n labels: config.defaults.labels,\n autoMerge: repo.autoMerge,\n autoMergeRules: repo.autoMergeRules ?? {\n types: [\"feature\", \"bugfix\", \"refactor\", \"test\", \"docs\"],\n maxSize: \"xl\",\n mergeStrategy: \"squash\",\n requireCleanSecurityScan: false,\n },\n allowedTools: repo.allowedTools ?? config.defaults.allowedTools,\n enablePlanning: config.defaults.enablePlanning,\n enableSecurityScan: config.defaults.enableSecurityScan,\n localPath: repo.localPath,\n };\n}\n","import type { DefaultsConfig } from \"./types.js\";\n\nexport const DEFAULT_CONFIG: DefaultsConfig = {\n model: \"claude-sonnet-4-5-20250929\",\n reviewerModel: \"claude-sonnet-4-5-20250929\",\n plannerModel: \"claude-sonnet-4-5-20250929\",\n maxTurns: 25,\n maxReviewCycles: 3,\n maxTestRetries: 2,\n timeoutMinutes: 30,\n budgetPerTaskUsd: 5.0,\n branchPrefix: \"xforce\",\n labels: {\n ready: \"xforce:ready\",\n inProgress: \"xforce:in-progress\",\n done: \"xforce:done\",\n failed: \"xforce:failed\",\n },\n allowedTools: [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Glob\", \"Grep\"],\n enablePlanning: true,\n enableSecurityScan: true,\n};\n\nexport const CONFIG_FILE_NAMES = [\n \"xforce.config.yaml\",\n \"xforce.config.yml\",\n \".xforce/config.yaml\",\n \".xforce/config.yml\",\n];\n","export class XForceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = \"XForceError\";\n }\n}\n\nexport class ConfigError extends XForceError {\n constructor(message: string) {\n super(message, \"CONFIG_ERROR\");\n this.name = \"ConfigError\";\n }\n}\n\nexport class IssueParseError extends XForceError {\n constructor(message: string) {\n super(message, \"ISSUE_PARSE_ERROR\");\n this.name = \"IssueParseError\";\n }\n}\n\nexport class CodingAgentError extends XForceError {\n constructor(\n message: string,\n public readonly errors: string[],\n public readonly costUsd: number,\n ) {\n super(message, \"CODING_AGENT_ERROR\");\n this.name = \"CodingAgentError\";\n }\n}\n\nexport class ReviewerError extends XForceError {\n constructor(message: string) {\n super(message, \"REVIEWER_ERROR\");\n this.name = \"ReviewerError\";\n }\n}\n\nexport class PipelineError extends XForceError {\n constructor(message: string) {\n super(message, \"PIPELINE_ERROR\");\n this.name = \"PipelineError\";\n }\n}\n\nexport class TimeoutError extends XForceError {\n constructor(message: string) {\n super(message, \"TIMEOUT_ERROR\");\n this.name = \"TimeoutError\";\n }\n}\n\n/** Run a promise with a timeout. Rejects with TimeoutError if the timeout is exceeded. */\nexport function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label = \"Operation\"): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new TimeoutError(`${label} timed out after ${Math.round(timeoutMs / 1000)}s`));\n }, timeoutMs);\n\n promise\n .then((result) => { clearTimeout(timer); resolve(result); })\n .catch((error) => { clearTimeout(timer); reject(error); });\n });\n}\n\nexport class WebhookError extends XForceError {\n constructor(\n message: string,\n public readonly statusCode: number = 400,\n ) {\n super(message, \"WEBHOOK_ERROR\");\n this.name = \"WebhookError\";\n }\n}\n\nexport class RetryableError extends Error {\n constructor(\n message: string,\n public readonly retryAfterMs?: number,\n ) {\n super(message);\n this.name = \"RetryableError\";\n }\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n onRetry?: (error: Error, attempt: number) => void;\n },\n): Promise<T> {\n let lastError: Error | undefined;\n for (let attempt = 0; attempt <= options.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (attempt === options.maxRetries) break;\n const delay =\n error instanceof RetryableError && error.retryAfterMs\n ? error.retryAfterMs\n : Math.min(options.baseDelayMs * 2 ** attempt, options.maxDelayMs);\n options.onRetry?.(lastError, attempt + 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError!;\n}\n","import { nanoid } from \"nanoid\";\nimport { rm } from \"node:fs/promises\";\nimport ora, { type Ora } from \"ora\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport { resolveRepoConfig } from \"../core/config.js\";\nimport { PipelineError, withTimeout } from \"../core/errors.js\";\nimport { validateTransition } from \"./state-machine.js\";\nimport { formatReviewFeedback, formatCommandFeedback } from \"./feedback-loop.js\";\nimport { getIssue, getIssueLabels, addLabel, removeLabel, addComment, parseIssueUrl, getPRDiff } from \"../github/client.js\";\nimport { parseIssueBody } from \"../github/issue-parser.js\";\nimport { setupBranch, commitAndPush, restoreDefaultBranch } from \"../github/branch.js\";\nimport { createPullRequest, updatePullRequest, labelPR, commentOnPR, mergePR } from \"../github/pr.js\";\nimport { runCodingAgent } from \"../agents/coder.js\";\nimport { runPlanningAgent } from \"../agents/planner.js\";\nimport { runReviewerAgent } from \"../agents/reviewer.js\";\nimport { runSecurityScanner } from \"../agents/security-scanner.js\";\nimport { runTests, runCommand } from \"../testing/test-runner.js\";\nimport type { CommandKind } from \"../testing/test-runner.js\";\nimport { notify } from \"../notifications/sender.js\";\nimport { isAutoMergeEligible } from \"./auto-merge.js\";\nimport { appendRecord, buildRecordFromState } from \"../tracking/cost-tracker.js\";\nimport type {\n XForceConfig,\n PipelineState,\n PipelineStatus,\n TaskSpec,\n ReviewResult,\n ResolvedRepoConfig,\n NotificationsConfig,\n ImplementationPlan,\n SecurityReport,\n SecurityScanResult,\n} from \"../core/types.js\";\nimport type { SimpleGit } from \"simple-git\";\n\nconst log = createChildLogger(\"orchestrator\");\n\nfunction transition(state: PipelineState, to: PipelineStatus, message: string): void {\n validateTransition(state.status, to);\n state.status = to;\n state.logs.push({ timestamp: new Date(), status: to, message });\n log.info({ status: to }, message);\n}\n\nexport interface RunPipelineParams {\n issueUrl?: string;\n repoOwner?: string;\n repoName?: string;\n issueNumber?: number;\n config: XForceConfig;\n localDir?: string;\n}\n\nexport async function runPipeline(params: RunPipelineParams): Promise<PipelineState> {\n const { config } = params;\n let owner: string;\n let repo: string;\n let issueNumber: number;\n\n if (params.issueUrl) {\n const parsed = parseIssueUrl(params.issueUrl);\n owner = parsed.owner;\n repo = parsed.repo;\n issueNumber = parsed.issueNumber;\n } else if (params.repoOwner && params.repoName && params.issueNumber) {\n owner = params.repoOwner;\n repo = params.repoName;\n issueNumber = params.issueNumber;\n } else {\n throw new PipelineError(\"Either issueUrl or (repoOwner + repoName + issueNumber) is required\");\n }\n\n const repoConfig = resolveRepoConfig(config, owner, repo);\n const state: PipelineState = {\n id: nanoid(12),\n taskSpec: null as unknown as TaskSpec,\n status: \"parsing_issue\",\n branchName: \"\",\n reviewCycle: 0,\n testRetry: 0,\n totalCostUsd: 0,\n logs: [{ timestamp: new Date(), status: \"parsing_issue\", message: \"Pipeline started\" }],\n startedAt: new Date(),\n };\n\n let workDir: string | null = null;\n let isLocal = false;\n let branchGit: SimpleGit | null = null;\n const timeoutMs = repoConfig.timeoutMinutes * 60 * 1000;\n\n try {\n // Clean up old status labels from previous runs\n await removeLabel(owner, repo, issueNumber, repoConfig.labels.done).catch(() => {});\n await removeLabel(owner, repo, issueNumber, repoConfig.labels.failed).catch(() => {});\n\n // Mark issue as in-progress\n await addLabel(owner, repo, issueNumber, repoConfig.labels.inProgress);\n\n // 1. Parse issue\n log.info({ owner, repo, issueNumber }, \"Fetching and parsing issue\");\n const issue = await getIssue(owner, repo, issueNumber);\n const labels = await getIssueLabels(owner, repo, issueNumber);\n\n const taskSpec = parseIssueBody({\n title: issue.title,\n body: issue.body ?? \"\",\n labels,\n issueNumber,\n issueUrl: issue.html_url,\n repoOwner: owner,\n repoName: repo,\n });\n state.taskSpec = taskSpec;\n\n // Notify: pipeline started\n await notify({ config: config.notifications, state, event: \"started\", owner, repo, issueNumber });\n\n // 2. Clone and create branch\n transition(state, \"creating_branch\", \"Setting up repository and branch\");\n const branchResult = await setupBranch({\n owner,\n repo: repo,\n defaultBranch: repoConfig.defaultBranch,\n issueNumber,\n issueTitle: taskSpec.title,\n branchPrefix: repoConfig.branchPrefix,\n localDir: params.localDir ?? repoConfig.localPath,\n });\n const { branchName, git } = branchResult;\n workDir = branchResult.workDir;\n isLocal = branchResult.isLocal;\n branchGit = git;\n state.branchName = branchName;\n\n // 3. Planning step (optional)\n let plan: ImplementationPlan | undefined;\n if (repoConfig.enablePlanning) {\n transition(state, \"planning\", `Planning with ${repoConfig.plannerModel}`);\n const planSpinner = ora(`Planning with ${repoConfig.plannerModel}`).start();\n const planningResult = await runPlanningAgent({\n taskSpec,\n repoConfig,\n workingDir: workDir,\n onProgress: (msg) => { planSpinner.text = `Planning: ${msg}`; },\n });\n plan = planningResult.plan;\n state.plan = plan;\n state.totalCostUsd += planningResult.costUsd;\n planSpinner.succeed(`Plan created (${plan.implementationSteps.length} steps, ${plan.estimatedComplexity} complexity, $${planningResult.costUsd.toFixed(2)})`);\n\n await addComment(owner, repo, issueNumber, formatPlanComment(plan));\n }\n\n // 4. Run the code-review-test loop (with pipeline timeout)\n await withTimeout(\n codeReviewLoop(state, taskSpec, repoConfig, git, workDir, owner, repo, issueNumber, config.notifications, plan),\n timeoutMs,\n \"Pipeline\",\n );\n\n // Clean up labels\n await removeLabel(owner, repo, issueNumber, repoConfig.labels.inProgress);\n await addLabel(owner, repo, issueNumber, repoConfig.labels.done);\n\n // Comment on issue with summary\n await addComment(\n owner,\n repo,\n issueNumber,\n `X-Force pipeline completed.\\n\\n- **PR**: ${state.prUrl}\\n- **Cost**: $${state.totalCostUsd.toFixed(4)}\\n- **Review cycles**: ${state.reviewCycle}`,\n );\n\n // Notify: pipeline completed\n await notify({ config: config.notifications, state, event: \"completed\", owner, repo, issueNumber });\n\n state.completedAt = new Date();\n await appendRecord(buildRecordFromState(state, repoConfig)).catch((err) => {\n log.warn({ error: (err as Error).message }, \"Failed to persist cost tracking record\");\n });\n\n if (state.status === \"merging\") {\n transition(state, \"completed\", \"PR auto-merged\");\n } else if (state.status !== \"awaiting_human\") {\n transition(state, \"awaiting_human\", \"PR ready for human review\");\n }\n return state;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n state.status = \"failed\";\n state.error = message;\n state.completedAt = new Date();\n log.error({ error: message }, \"Pipeline failed\");\n\n // Notify: pipeline failed\n await notify({ config: config.notifications, state, event: \"failed\", owner, repo, issueNumber }).catch(() => {});\n await appendRecord(buildRecordFromState(state, repoConfig)).catch(() => {});\n\n // Update labels on failure\n try {\n await removeLabel(owner, repo, issueNumber, repoConfig.labels.inProgress);\n await addLabel(owner, repo, issueNumber, repoConfig.labels.failed);\n await addComment(\n owner,\n repo,\n issueNumber,\n `X-Force pipeline failed.\\n\\n**Error**: ${message}\\n**Cost**: $${state.totalCostUsd.toFixed(4)}`,\n );\n } catch {\n log.warn(\"Failed to update issue labels/comments after pipeline failure\");\n }\n\n return state;\n } finally {\n if (isLocal && branchGit) {\n // Restore default branch so the local repo is clean\n await restoreDefaultBranch(branchGit, repoConfig.defaultBranch);\n } else if (workDir) {\n // Clean up temp directory\n try {\n await rm(workDir, { recursive: true, force: true });\n } catch {\n log.warn({ workDir }, \"Failed to clean up working directory\");\n }\n }\n }\n}\n\nasync function codeReviewLoop(\n state: PipelineState,\n taskSpec: TaskSpec,\n repoConfig: ResolvedRepoConfig,\n git: SimpleGit,\n workDir: string,\n owner: string,\n repo: string,\n issueNumber: number,\n notificationsConfig: NotificationsConfig | undefined,\n plan?: ImplementationPlan,\n): Promise<void> {\n let previousReview: ReviewResult | undefined;\n let sessionId: string | undefined;\n\n for (let cycle = 0; cycle <= repoConfig.maxReviewCycles; cycle++) {\n state.reviewCycle = cycle;\n\n // === CODING STEP ===\n transition(state, \"coding\", `Coding with ${repoConfig.model} (cycle ${cycle + 1})`);\n const codeSpinner = ora(`Coding with ${repoConfig.model} (cycle ${cycle + 1})`).start();\n const codingResult = await runCodingAgent({\n taskSpec,\n repoConfig,\n workingDir: workDir,\n previousReview,\n sessionId,\n plan: cycle === 0 ? plan : undefined,\n onProgress: (msg) => { codeSpinner.text = `Coding: ${msg}`; },\n });\n state.totalCostUsd += codingResult.costUsd;\n sessionId = codingResult.sessionId;\n codeSpinner.succeed(`Coding complete (${codingResult.numTurns} turns, $${codingResult.costUsd.toFixed(2)})`);\n\n // Commit and push\n const commitSpinner = ora(\"Committing and pushing changes\").start();\n const sha = await commitAndPush({\n git,\n branchName: state.branchName,\n message: `feat: ${taskSpec.title} (xforce cycle ${cycle + 1})`,\n });\n\n if (!sha && cycle === 0) {\n commitSpinner.fail(\"No changes to commit\");\n throw new PipelineError(\"Coding agent made no changes\");\n }\n commitSpinner.succeed(sha ? `Committed ${sha.slice(0, 7)}` : \"No new changes\");\n\n // === VERIFICATION STEP (lint → build → test → run) ===\n transition(state, \"running_tests\", \"Running verification checks\");\n let allChecksPassed = false;\n\n for (let retry = 0; retry <= repoConfig.maxTestRetries; retry++) {\n state.testRetry = retry;\n let failedCheck: { kind: CommandKind; output: string } | null = null;\n const retryLabel = retry > 0 ? ` (retry ${retry})` : \"\";\n\n // 1. Lint (optional)\n if (repoConfig.lintCommand && !failedCheck) {\n const lintSpinner = ora(`Running lint${retryLabel}`).start();\n const lintResult = await runCommand({\n workingDir: workDir,\n command: repoConfig.lintCommand,\n kind: \"lint\",\n });\n if (lintResult.passed) {\n lintSpinner.succeed(`Lint passed (${(lintResult.durationMs / 1000).toFixed(1)}s)`);\n } else {\n lintSpinner.fail(\"Lint failed\");\n failedCheck = { kind: \"lint\", output: lintResult.output };\n }\n }\n\n // 2. Build (optional)\n if (repoConfig.buildCommand && !failedCheck) {\n const buildSpinner = ora(`Running build${retryLabel}`).start();\n const buildResult = await runCommand({\n workingDir: workDir,\n command: repoConfig.buildCommand,\n kind: \"build\",\n });\n if (buildResult.passed) {\n buildSpinner.succeed(`Build passed (${(buildResult.durationMs / 1000).toFixed(1)}s)`);\n } else {\n buildSpinner.fail(\"Build failed\");\n failedCheck = { kind: \"build\", output: buildResult.output };\n }\n }\n\n // 3. Test (required)\n if (!failedCheck) {\n const testSpinner = ora(`Running tests${retryLabel}`).start();\n const testResult = await runTests({\n workingDir: workDir,\n testCommand: repoConfig.testCommand,\n });\n if (testResult.passed) {\n testSpinner.succeed(`Tests passed (${(testResult.durationMs / 1000).toFixed(1)}s)`);\n } else {\n testSpinner.fail(\"Tests failed\");\n failedCheck = { kind: \"test\", output: testResult.output };\n }\n }\n\n // 4. Run verification (optional)\n if (repoConfig.runCommand && !failedCheck) {\n const runSpinner = ora(`Running verification${retryLabel}`).start();\n const runResult = await runCommand({\n workingDir: workDir,\n command: repoConfig.runCommand,\n kind: \"run\",\n });\n if (runResult.passed) {\n runSpinner.succeed(`Verification passed (${(runResult.durationMs / 1000).toFixed(1)}s)`);\n } else {\n runSpinner.fail(\"Verification failed\");\n failedCheck = { kind: \"run\", output: runResult.output };\n }\n }\n\n if (!failedCheck) {\n allChecksPassed = true;\n break;\n }\n\n // Failed — feed errors back to coder and retry\n if (retry < repoConfig.maxTestRetries) {\n transition(state, \"coding\", `Fixing ${failedCheck.kind} failures (retry ${retry + 1})`);\n\n const fixSpinner = ora(`Fixing ${failedCheck.kind} failures (retry ${retry + 1})`).start();\n const feedback = formatCommandFeedback(failedCheck.kind, failedCheck.output);\n const fixResult = await runCodingAgent({\n taskSpec,\n repoConfig,\n workingDir: workDir,\n ...(failedCheck.kind === \"test\"\n ? { testFailures: feedback }\n : { commandFailures: { kind: failedCheck.kind, output: failedCheck.output } }),\n sessionId,\n onProgress: (msg) => { fixSpinner.text = `Fixing ${failedCheck!.kind}: ${msg}`; },\n });\n state.totalCostUsd += fixResult.costUsd;\n sessionId = fixResult.sessionId;\n fixSpinner.succeed(`Fix applied (${fixResult.numTurns} turns, $${fixResult.costUsd.toFixed(2)})`);\n\n await commitAndPush({\n git,\n branchName: state.branchName,\n message: `fix: address ${failedCheck.kind} failures (xforce retry ${retry + 1})`,\n });\n\n transition(state, \"running_tests\", `Re-running verification checks (retry ${retry + 1})`);\n }\n }\n\n if (!allChecksPassed) {\n throw new PipelineError(\n `Verification checks still failing after ${repoConfig.maxTestRetries} retries`,\n );\n }\n\n // === PR STEP ===\n if (!state.prNumber) {\n const { prNumber, prUrl } = await createPullRequest({\n owner,\n repo,\n branchName: state.branchName,\n defaultBranch: repoConfig.defaultBranch,\n taskSpec,\n pipeline: state,\n });\n state.prNumber = prNumber;\n state.prUrl = prUrl;\n } else {\n await updatePullRequest({\n owner,\n repo,\n prNumber: state.prNumber,\n taskSpec,\n pipeline: state,\n });\n }\n\n // === REVIEW STEP ===\n transition(state, \"reviewing\", `Reviewing with ${repoConfig.reviewerModel} (cycle ${cycle + 1})`);\n const reviewSpinner = ora(`Reviewing with ${repoConfig.reviewerModel} (cycle ${cycle + 1})`).start();\n const diff = await getPRDiff(owner, repo, state.prNumber);\n\n // Run reviewer and security scanner in parallel\n const [review, securityResult] = await Promise.all([\n runReviewerAgent({ taskSpec, diff, repoConfig, reviewCycle: cycle }),\n repoConfig.enableSecurityScan\n ? runSecurityScanner({ taskSpec, diff, repoConfig })\n : Promise.resolve(undefined),\n ]);\n\n if (securityResult) {\n state.totalCostUsd += securityResult.costUsd;\n }\n const reviewStatus = review.approved ? \"Approved\" : `Changes requested (${review.issues.length} issues)`;\n reviewSpinner.succeed(`Review: ${reviewStatus}`);\n\n // Post review comment on PR\n await commentOnPR(\n owner,\n repo,\n state.prNumber,\n formatReviewComment(review, cycle),\n );\n\n // Post security report as separate comment if findings exist\n if (securityResult && securityResult.report.findings.length > 0) {\n await commentOnPR(\n owner,\n repo,\n state.prNumber,\n formatSecurityComment(securityResult.report),\n );\n }\n\n if (review.approved) {\n await labelPR(owner, repo, state.prNumber, repoConfig.labels.done);\n\n // Check auto-merge eligibility\n const autoMergeCheck = isAutoMergeEligible({\n taskSpec,\n repoConfig,\n securityReport: securityResult?.report,\n });\n\n if (autoMergeCheck.eligible) {\n transition(state, \"merging\", \"Auto-merging approved PR\");\n const mergeSpinner = ora(\"Auto-merging approved PR\").start();\n const mergeResult = await mergePR({\n owner,\n repo,\n prNumber: state.prNumber,\n strategy: repoConfig.autoMergeRules.mergeStrategy,\n commitTitle: `${taskSpec.title} (#${state.prNumber})`,\n });\n\n if (mergeResult.merged) {\n mergeSpinner.succeed(`PR auto-merged (${mergeResult.sha?.slice(0, 7)})`);\n await addComment(\n owner,\n repo,\n issueNumber,\n `X-Force auto-merged PR #${state.prNumber} (${repoConfig.autoMergeRules.mergeStrategy}).`,\n );\n } else {\n mergeSpinner.fail(`Auto-merge failed: ${mergeResult.error}`);\n await commentOnPR(\n owner,\n repo,\n state.prNumber,\n `Auto-merge failed: ${mergeResult.error}\\n\\nThis PR requires manual merge.`,\n );\n transition(state, \"awaiting_human\", \"Auto-merge failed, awaiting human review\");\n }\n }\n\n return;\n }\n\n // Not approved - prepare for next cycle\n if (cycle < repoConfig.maxReviewCycles) {\n previousReview = review;\n transition(state, \"addressing_review\", `Addressing review feedback (cycle ${cycle + 1})`);\n }\n }\n\n throw new PipelineError(\n `Review not approved after ${repoConfig.maxReviewCycles} cycles`,\n );\n}\n\nfunction formatSecurityComment(report: SecurityReport): string {\n const findingsTable = report.findings\n .map(\n (f) =>\n `| ${f.severity} | ${f.category} | \\`${f.file}${f.line ? \":\" + f.line : \"\"}\\` | ${f.description} |`,\n )\n .join(\"\\n\");\n\n return `## X-Force Security Scan - Risk Level: ${report.riskLevel.toUpperCase()}\n\n### Summary\n${report.summary}\n\n### Findings\n| Severity | Category | File | Description |\n|----------|----------|------|-------------|\n${findingsTable}\n\n${report.recommendations.length > 0 ? `### Recommendations\\n${report.recommendations.map((r) => `- ${r}`).join(\"\\n\")}` : \"\"}\n\n---\n*Security scan by X-Force AI Pipeline*`;\n}\n\nfunction formatPlanComment(plan: ImplementationPlan): string {\n const steps = plan.implementationSteps\n .sort((a, b) => a.order - b.order)\n .map(\n (s) =>\n `${s.order}. **${s.description}**\\n Files: ${s.files.map((f) => `\\`${f}\\``).join(\", \")}`,\n )\n .join(\"\\n\");\n\n return `## X-Force Implementation Plan\n\n### Approach\n${plan.approach}\n\n### Estimated Complexity: ${plan.estimatedComplexity}\n\n### Files to Modify\n${plan.filesToModify.map((f) => `- \\`${f}\\``).join(\"\\n\") || \"None\"}\n\n### Files to Create\n${plan.filesToCreate.map((f) => `- \\`${f}\\``).join(\"\\n\") || \"None\"}\n\n### Implementation Steps\n${steps}\n\n### Risks\n${plan.risks.map((r) => `- ${r}`).join(\"\\n\") || \"None identified\"}\n\n---\n*Plan generated by X-Force AI Pipeline*`;\n}\n\nfunction formatReviewComment(review: ReviewResult, cycle: number): string {\n const status = review.approved ? \"APPROVED\" : \"CHANGES REQUESTED\";\n const emoji = review.approved ? \"approved\" : \"requesting changes\";\n\n const issueTable =\n review.issues.length > 0\n ? `### Issues Found\\n| Severity | File | Description |\\n|----------|------|-------------|\\n${review.issues.map((i) => `| ${i.severity} | \\`${i.file}${i.line ? \":\" + i.line : \"\"}\\` | ${i.description} |`).join(\"\\n\")}\\n`\n : \"\";\n\n return `## X-Force AI Review (Cycle ${cycle + 1}) - ${status}\n\n### Summary\n${review.summary}\n\n${issueTable}\n### Spec Adherence\n**Met**: ${review.specAdherence.met.join(\", \") || \"None yet\"}\n**Unmet**: ${review.specAdherence.unmet.join(\", \") || \"All met\"}\n\n${review.securityConcerns.length > 0 ? `### Security Concerns\\n${review.securityConcerns.map((c) => `- ${c}`).join(\"\\n\")}` : \"\"}\n\n---\n*Automated review by X-Force (${emoji})*`;\n}\n","import pino from \"pino\";\n\nconst isCI = !!(process.env.CI || process.env.GITHUB_ACTIONS);\n\nexport const logger = pino({\n level: process.env.LOG_LEVEL ?? (isCI ? \"info\" : \"debug\"),\n ...(isCI\n ? {}\n : {\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"HH:MM:ss\",\n ignore: \"pid,hostname\",\n },\n },\n }),\n});\n\nexport function createChildLogger(name: string) {\n return logger.child({ component: name });\n}\n","import type { PipelineStatus } from \"../core/types.js\";\nimport { PipelineError } from \"../core/errors.js\";\n\nconst VALID_TRANSITIONS: Record<PipelineStatus, PipelineStatus[]> = {\n parsing_issue: [\"creating_branch\", \"failed\"],\n creating_branch: [\"planning\", \"coding\", \"failed\"],\n planning: [\"coding\", \"failed\"],\n coding: [\"running_tests\", \"failed\"],\n running_tests: [\"reviewing\", \"coding\", \"failed\"],\n reviewing: [\"awaiting_human\", \"addressing_review\", \"merging\", \"failed\"],\n addressing_review: [\"coding\", \"failed\"],\n merging: [\"completed\", \"awaiting_human\", \"failed\"],\n awaiting_human: [\"completed\", \"failed\"],\n completed: [],\n failed: [],\n};\n\nexport function validateTransition(from: PipelineStatus, to: PipelineStatus): void {\n const valid = VALID_TRANSITIONS[from];\n if (!valid.includes(to)) {\n throw new PipelineError(`Invalid state transition: ${from} -> ${to}`);\n }\n}\n\nexport function isTerminal(status: PipelineStatus): boolean {\n return status === \"completed\" || status === \"failed\";\n}\n","import type { ReviewResult } from \"../core/types.js\";\n\n/** Format review feedback for the coding agent to address */\nexport function formatReviewFeedback(review: ReviewResult): string {\n const issues = review.issues\n .filter((i) => i.severity === \"critical\" || i.severity === \"major\")\n .map(\n (i) =>\n `- [${i.severity.toUpperCase()}] ${i.file}${i.line ? `:${i.line}` : \"\"}: ${i.description}${i.suggestedFix ? ` (Fix: ${i.suggestedFix})` : \"\"}`,\n )\n .join(\"\\n\");\n\n const unmet = review.specAdherence.unmet.map((c) => `- ${c}`).join(\"\\n\");\n const security = review.securityConcerns.map((c) => `- ${c}`).join(\"\\n\");\n\n let feedback = `The AI reviewer found issues with your changes:\\n\\n${review.summary}\\n`;\n if (issues) feedback += `\\nCritical/Major Issues:\\n${issues}\\n`;\n if (unmet) feedback += `\\nUnmet Acceptance Criteria:\\n${unmet}\\n`;\n if (security) feedback += `\\nSecurity Concerns:\\n${security}\\n`;\n\n return feedback;\n}\n\n/** Format test failure output for the coding agent */\nexport function formatTestFeedback(testOutput: string): string {\n return formatCommandFeedback(\"test\", testOutput);\n}\n\n/** Format any command failure output for the coding agent */\nexport function formatCommandFeedback(kind: string, output: string): string {\n const maxLen = 8000;\n const truncated =\n output.length > maxLen ? output.slice(0, maxLen) + \"\\n\\n... (truncated)\" : output;\n\n const labels: Record<string, string> = {\n lint: \"Lint\",\n build: \"Build\",\n test: \"Tests\",\n run: \"Run verification\",\n };\n const label = labels[kind] ?? kind.charAt(0).toUpperCase() + kind.slice(1);\n return `${label} failed. Output:\\n\\n${truncated}`;\n}\n","import { Octokit } from \"@octokit/rest\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport { withRetry, RetryableError } from \"../core/errors.js\";\n\nconst log = createChildLogger(\"github\");\n\nconst RETRY_OPTIONS = {\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n onRetry: (error: Error, attempt: number) => {\n log.warn({ error: error.message, attempt }, \"GitHub API call failed, retrying\");\n },\n};\n\n/** Wrap a GitHub API call with retry logic for rate limits and transient errors */\nasync function withGitHubRetry<T>(fn: () => Promise<T>): Promise<T> {\n return withRetry(async () => {\n try {\n return await fn();\n } catch (error: any) {\n // GitHub rate limit: 403 with x-ratelimit-remaining: 0, or 429\n const status = error?.status ?? error?.response?.status;\n if (status === 429 || status === 403) {\n const retryAfter = error?.response?.headers?.[\"retry-after\"];\n const retryMs = retryAfter ? parseInt(retryAfter) * 1000 : undefined;\n throw new RetryableError(`GitHub API rate limited (${status})`, retryMs);\n }\n // Server errors (500, 502, 503) are retryable\n if (status >= 500) {\n throw new RetryableError(`GitHub API server error (${status})`);\n }\n throw error;\n }\n }, RETRY_OPTIONS);\n}\n\nlet _octokit: Octokit | null = null;\n\nexport function getOctokit(): Octokit {\n if (!_octokit) {\n const token = process.env.GITHUB_TOKEN;\n if (!token) {\n throw new Error(\"GITHUB_TOKEN environment variable is required\");\n }\n _octokit = new Octokit({ auth: token });\n }\n return _octokit;\n}\n\nexport async function getIssue(owner: string, repo: string, issueNumber: number) {\n return withGitHubRetry(async () => {\n const octokit = getOctokit();\n log.debug({ owner, repo, issueNumber }, \"Fetching issue\");\n const { data } = await octokit.issues.get({ owner, repo, issue_number: issueNumber });\n return data;\n });\n}\n\nexport async function getIssueLabels(owner: string, repo: string, issueNumber: number) {\n return withGitHubRetry(async () => {\n const octokit = getOctokit();\n const { data } = await octokit.issues.listLabelsOnIssue({\n owner,\n repo,\n issue_number: issueNumber,\n });\n return data.map((l) => l.name);\n });\n}\n\nexport async function addLabel(owner: string, repo: string, issueNumber: number, label: string) {\n return withGitHubRetry(async () => {\n const octokit = getOctokit();\n log.debug({ owner, repo, issueNumber, label }, \"Adding label\");\n await octokit.issues.addLabels({ owner, repo, issue_number: issueNumber, labels: [label] });\n });\n}\n\nexport async function removeLabel(\n owner: string,\n repo: string,\n issueNumber: number,\n label: string,\n) {\n const octokit = getOctokit();\n log.debug({ owner, repo, issueNumber, label }, \"Removing label\");\n try {\n await octokit.issues.removeLabel({ owner, repo, issue_number: issueNumber, name: label });\n } catch {\n // Label might not exist, that's fine\n }\n}\n\nexport async function addComment(owner: string, repo: string, issueNumber: number, body: string) {\n return withGitHubRetry(async () => {\n const octokit = getOctokit();\n log.debug({ owner, repo, issueNumber }, \"Adding comment\");\n const { data } = await octokit.issues.createComment({\n owner,\n repo,\n issue_number: issueNumber,\n body,\n });\n return data;\n });\n}\n\nexport async function getPRDiff(owner: string, repo: string, prNumber: number): Promise<string> {\n return withGitHubRetry(async () => {\n const octokit = getOctokit();\n log.debug({ owner, repo, prNumber }, \"Fetching PR diff\");\n const { data } = await octokit.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n mediaType: { format: \"diff\" },\n });\n return data as unknown as string;\n });\n}\n\n/** Parse an issue URL into owner, repo, and issue number */\nexport function parseIssueUrl(url: string): { owner: string; repo: string; issueNumber: number } {\n const match = url.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/issues\\/(\\d+)/);\n if (!match) {\n throw new Error(`Invalid GitHub issue URL: ${url}`);\n }\n return {\n owner: match[1],\n repo: match[2],\n issueNumber: parseInt(match[3], 10),\n };\n}\n\n/** Parse a PR URL into owner, repo, and PR number */\nexport function parsePRUrl(url: string): { owner: string; repo: string; prNumber: number } {\n const match = url.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/pull\\/(\\d+)/);\n if (!match) {\n throw new Error(`Invalid GitHub PR URL: ${url}`);\n }\n return {\n owner: match[1],\n repo: match[2],\n prNumber: parseInt(match[3], 10),\n };\n}\n\n/** Get a PR's details */\nexport async function getPR(owner: string, repo: string, prNumber: number) {\n return withGitHubRetry(async () => {\n const octokit = getOctokit();\n log.debug({ owner, repo, prNumber }, \"Fetching PR\");\n const { data } = await octokit.pulls.get({ owner, repo, pull_number: prNumber });\n return data;\n });\n}\n","import { IssueParseError } from \"../core/errors.js\";\nimport type { TaskSpec } from \"../core/types.js\";\n\n/** Extract a section's content from markdown by heading */\nfunction extractSection(body: string, heading: string): string | null {\n // Find the heading line\n const headingRegex = new RegExp(`^#{2,3}\\\\s+${escapeRegex(heading)}\\\\s*$`, \"mi\");\n const headingMatch = headingRegex.exec(body);\n if (!headingMatch) return null;\n\n // Get everything after the heading until the next heading or end of string\n const startIdx = headingMatch.index + headingMatch[0].length;\n const rest = body.slice(startIdx);\n const nextHeadingMatch = rest.match(/\\n#{2,3}\\s+/);\n const content = nextHeadingMatch ? rest.slice(0, nextHeadingMatch.index) : rest;\n const trimmed = content.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Parse a bullet list section into an array of strings */\nfunction parseBulletList(text: string): string[] {\n return text\n .split(\"\\n\")\n .map((line) => line.replace(/^[-*]\\s*(\\[[ x]\\]\\s*)?/, \"\").trim())\n .filter((line) => line.length > 0);\n}\n\n/** Map label names to priority values */\nfunction extractPriority(labels: string[]): TaskSpec[\"priority\"] {\n for (const label of labels) {\n const lower = label.toLowerCase();\n if (lower.includes(\"critical\")) return \"critical\";\n if (lower.includes(\"priority/high\") || lower === \"high\") return \"high\";\n if (lower.includes(\"priority/medium\") || lower === \"medium\") return \"medium\";\n if (lower.includes(\"priority/low\") || lower === \"low\") return \"low\";\n }\n return \"medium\";\n}\n\n/** Map label names to task type */\nfunction extractType(labels: string[]): TaskSpec[\"type\"] {\n for (const label of labels) {\n const lower = label.toLowerCase();\n if (lower.includes(\"feature\") || lower.includes(\"enhancement\")) return \"feature\";\n if (lower.includes(\"bug\")) return \"bugfix\";\n if (lower.includes(\"refactor\")) return \"refactor\";\n if (lower.includes(\"test\")) return \"test\";\n if (lower.includes(\"doc\")) return \"docs\";\n }\n return \"feature\";\n}\n\n/** Map label or section content to size */\nfunction extractSize(labels: string[], body: string): TaskSpec[\"size\"] {\n // Check labels first\n for (const label of labels) {\n const lower = label.toLowerCase();\n if (lower.includes(\"size/xs\") || lower.includes(\"extra small\")) return \"xs\";\n if (lower.includes(\"size/s\") || lower === \"small\") return \"s\";\n if (lower.includes(\"size/m\") || lower === \"medium\") return \"m\";\n if (lower.includes(\"size/l\") && !lower.includes(\"xl\")) return \"l\";\n if (lower.includes(\"size/xl\") || lower.includes(\"extra large\")) return \"xl\";\n }\n\n // Check for Estimated Size section (from GitHub issue form)\n const sizeSection = extractSection(body, \"Estimated Size\");\n if (sizeSection) {\n const lower = sizeSection.toLowerCase();\n if (lower.includes(\"xs\") || lower.includes(\"extra small\")) return \"xs\";\n if (lower.includes(\"xl\") || lower.includes(\"extra large\")) return \"xl\";\n if (lower.includes(\"< 50\") || lower.match(/\\bs\\b/)) return \"s\";\n if (lower.includes(\"150-500\") || lower.match(/\\bm\\b/)) return \"m\";\n if (lower.includes(\"500-1000\") || lower.match(/\\bl\\b/)) return \"l\";\n }\n\n return \"m\";\n}\n\n/** Parse a structured GitHub issue body into a TaskSpec */\nexport function parseIssueBody(params: {\n title: string;\n body: string;\n labels: string[];\n issueNumber: number;\n issueUrl: string;\n repoOwner: string;\n repoName: string;\n}): TaskSpec {\n const { title, body, labels, issueNumber, issueUrl, repoOwner, repoName } = params;\n\n if (!body || body.trim().length === 0) {\n throw new IssueParseError(\"Issue body is empty\");\n }\n\n const context = extractSection(body, \"Context\");\n if (!context) {\n throw new IssueParseError('Missing required section: \"## Context\"');\n }\n\n const criteriaSection = extractSection(body, \"Acceptance Criteria\");\n if (!criteriaSection) {\n throw new IssueParseError('Missing required section: \"## Acceptance Criteria\"');\n }\n const acceptanceCriteria = parseBulletList(criteriaSection);\n if (acceptanceCriteria.length === 0) {\n throw new IssueParseError(\"Acceptance Criteria section has no items\");\n }\n\n const filesSection = extractSection(body, \"Affected Files\");\n const affectedFiles = filesSection ? parseBulletList(filesSection) : [];\n\n const edgeCasesSection = extractSection(body, \"Edge Cases\");\n const edgeCases = edgeCasesSection ? parseBulletList(edgeCasesSection) : [];\n\n return {\n title,\n context,\n acceptanceCriteria,\n affectedFiles,\n edgeCases,\n priority: extractPriority(labels),\n type: extractType(labels),\n size: extractSize(labels, body),\n issueNumber,\n issueUrl,\n repoOwner,\n repoName,\n };\n}\n","import { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdtemp, access, writeFile } from \"node:fs/promises\";\nimport { simpleGit, type SimpleGit } from \"simple-git\";\nimport { createChildLogger } from \"../core/logger.js\";\n\nconst DEFAULT_GITIGNORE = `node_modules/\n.next/\ndist/\nbuild/\n.env\n.env.local\n.env*.local\n*.tsbuildinfo\n.DS_Store\n`;\n\nconst log = createChildLogger(\"git\");\n\n/** Create a slug from an issue title for branch naming */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 40);\n}\n\n/** Clone a repo (or use local dir), create a feature branch, return working directory and git instance */\nexport async function setupBranch(params: {\n owner: string;\n repo: string;\n defaultBranch: string;\n issueNumber: number;\n issueTitle: string;\n branchPrefix: string;\n localDir?: string;\n}): Promise<{ workDir: string; branchName: string; git: SimpleGit; isLocal: boolean }> {\n const { owner, repo, defaultBranch, issueNumber, issueTitle, branchPrefix, localDir } = params;\n\n const slug = slugify(issueTitle);\n const branchName = `${branchPrefix}/${issueNumber}-${slug}`;\n\n if (localDir) {\n // Use existing local repo\n log.info({ workDir: localDir, branchName }, \"Using local repository\");\n\n const repoGit = simpleGit(localDir);\n\n // Fetch latest from remote\n await repoGit.fetch(\"origin\");\n\n // Stash any uncommitted changes to avoid conflicts\n const status = await repoGit.status();\n const hadChanges = status.files.length > 0;\n if (hadChanges) {\n log.info(\"Stashing local changes\");\n await repoGit.stash();\n }\n\n // Create branch from latest remote default branch\n try {\n await repoGit.checkout([\"-B\", branchName, `origin/${defaultBranch}`]);\n } catch {\n // If origin/defaultBranch doesn't exist, create from current HEAD\n await repoGit.checkoutLocalBranch(branchName);\n }\n\n // Configure git identity\n await repoGit.addConfig(\"user.name\", \"X-Force Bot\");\n await repoGit.addConfig(\"user.email\", \"xforce-bot@users.noreply.github.com\");\n\n log.info({ branchName }, \"Branch created\");\n return { workDir: localDir, branchName, git: repoGit, isLocal: true };\n }\n\n // Clone to temp directory\n const cloneUrl = `https://x-access-token:${process.env.GITHUB_TOKEN}@github.com/${owner}/${repo}.git`;\n const workDir = await mkdtemp(join(tmpdir(), `xforce-${repo}-`));\n log.info({ workDir, branchName }, \"Cloning repository\");\n\n const git = simpleGit();\n await git.clone(cloneUrl, workDir, [\"--depth\", \"1\", \"--branch\", defaultBranch]);\n\n const repoGit = simpleGit(workDir);\n\n // Configure git identity for CI environments\n await repoGit.addConfig(\"user.name\", \"X-Force Bot\");\n await repoGit.addConfig(\"user.email\", \"xforce-bot@users.noreply.github.com\");\n\n await repoGit.checkoutLocalBranch(branchName);\n\n // Ensure .gitignore exists to prevent committing node_modules etc.\n const gitignorePath = join(workDir, \".gitignore\");\n try {\n await access(gitignorePath);\n } catch {\n log.info(\"Creating default .gitignore\");\n await writeFile(gitignorePath, DEFAULT_GITIGNORE, \"utf-8\");\n }\n\n log.info({ branchName }, \"Branch created\");\n return { workDir, branchName, git: repoGit, isLocal: false };\n}\n\n/** Checkout back to default branch (used after local repo jobs) */\nexport async function restoreDefaultBranch(git: SimpleGit, defaultBranch: string): Promise<void> {\n try {\n await git.checkout(defaultBranch);\n log.info({ branch: defaultBranch }, \"Restored default branch\");\n } catch (error) {\n log.warn({ error: String(error) }, \"Failed to restore default branch\");\n }\n}\n\n/** Stage all changes, commit, and push */\nexport async function commitAndPush(params: {\n git: SimpleGit;\n branchName: string;\n message: string;\n}): Promise<string> {\n const { git, branchName, message } = params;\n\n await git.add(\"-A\");\n\n const status = await git.status();\n if (status.staged.length === 0 && status.files.length === 0) {\n log.warn(\"No changes to commit\");\n return \"\";\n }\n\n const commitResult = await git.commit(message);\n log.info({ sha: commitResult.commit }, \"Changes committed\");\n\n await git.push(\"origin\", branchName, [\"--set-upstream\", \"--force\"]);\n log.info({ branchName }, \"Pushed to remote\");\n\n return commitResult.commit;\n}\n","import { getOctokit } from \"./client.js\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport type { TaskSpec, PipelineState, MergeResult } from \"../core/types.js\";\n\nconst log = createChildLogger(\"pr\");\n\n/** Create a pull request for the pipeline's changes */\nexport async function createPullRequest(params: {\n owner: string;\n repo: string;\n branchName: string;\n defaultBranch: string;\n taskSpec: TaskSpec;\n pipeline: PipelineState;\n}): Promise<{ prNumber: number; prUrl: string }> {\n const { owner, repo, branchName, defaultBranch, taskSpec, pipeline } = params;\n const octokit = getOctokit();\n\n const body = buildPRBody(taskSpec, pipeline);\n\n log.info({ owner, repo, branchName }, \"Creating pull request\");\n const { data } = await octokit.pulls.create({\n owner,\n repo,\n title: `[X-Force] ${taskSpec.title}`,\n body,\n head: branchName,\n base: defaultBranch,\n });\n\n log.info({ prNumber: data.number, prUrl: data.html_url }, \"PR created\");\n return { prNumber: data.number, prUrl: data.html_url };\n}\n\n/** Update an existing PR's body */\nexport async function updatePullRequest(params: {\n owner: string;\n repo: string;\n prNumber: number;\n taskSpec: TaskSpec;\n pipeline: PipelineState;\n}): Promise<void> {\n const { owner, repo, prNumber, taskSpec, pipeline } = params;\n const octokit = getOctokit();\n\n const body = buildPRBody(taskSpec, pipeline);\n await octokit.pulls.update({ owner, repo, pull_number: prNumber, body });\n}\n\n/** Add a label to a pull request */\nexport async function labelPR(\n owner: string,\n repo: string,\n prNumber: number,\n label: string,\n): Promise<void> {\n const octokit = getOctokit();\n await octokit.issues.addLabels({ owner, repo, issue_number: prNumber, labels: [label] });\n}\n\n/** Add a comment on a pull request */\nexport async function commentOnPR(\n owner: string,\n repo: string,\n prNumber: number,\n body: string,\n): Promise<void> {\n const octokit = getOctokit();\n await octokit.issues.createComment({ owner, repo, issue_number: prNumber, body });\n}\n\n/** Attempt to merge a pull request */\nexport async function mergePR(params: {\n owner: string;\n repo: string;\n prNumber: number;\n strategy: \"squash\" | \"merge\" | \"rebase\";\n commitTitle?: string;\n}): Promise<MergeResult> {\n const { owner, repo, prNumber, strategy, commitTitle } = params;\n const octokit = getOctokit();\n\n log.info({ owner, repo, prNumber, strategy }, \"Attempting to merge PR\");\n\n try {\n const { data } = await octokit.pulls.merge({\n owner,\n repo,\n pull_number: prNumber,\n merge_method: strategy,\n commit_title: commitTitle,\n });\n\n log.info({ sha: data.sha, merged: data.merged }, \"PR merge result\");\n return { merged: data.merged, sha: data.sha };\n } catch (error: unknown) {\n const err = error as { message?: string; status?: number };\n const message = err.message ?? String(error);\n const status = err.status;\n\n // 405: merge not allowed (branch protection, conflicts)\n // 409: conflict\n if (status === 405 || status === 409) {\n log.warn({ status, message }, \"PR cannot be auto-merged\");\n return { merged: false, error: message };\n }\n\n throw error;\n }\n}\n\nfunction buildPRBody(taskSpec: TaskSpec, pipeline: PipelineState): string {\n return `## Automated by X-Force\n\nResolves #${taskSpec.issueNumber}\n\n### Task\n**${taskSpec.title}**\n\n${taskSpec.context}\n\n### Acceptance Criteria\n${taskSpec.acceptanceCriteria.map((c) => `- [ ] ${c}`).join(\"\\n\")}\n\n### Pipeline Info\n- **Pipeline ID**: \\`${pipeline.id}\\`\n- **Review Cycles**: ${pipeline.reviewCycle}\n- **Total Cost**: $${pipeline.totalCostUsd.toFixed(4)}\n- **Status**: ${pipeline.status}\n\n---\n*Generated by [X-Force](https://github.com/xforce) AI Pipeline*`;\n}\n","import { query, type SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport { CodingAgentError } from \"../core/errors.js\";\nimport {\n CODER_SYSTEM_PROMPT_APPEND,\n buildCoderPrompt,\n buildReviewFeedbackSection,\n buildTestFailureFeedbackSection,\n buildCommandFailureFeedbackSection,\n} from \"./prompts/coder-system.js\";\nimport { buildPlanSection } from \"./prompts/planner-system.js\";\nimport type { TaskSpec, ReviewResult, CodingResult, ResolvedRepoConfig, ImplementationPlan } from \"../core/types.js\";\n\nconst log = createChildLogger(\"coder\");\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \"...\" : s;\n}\n\nexport function describeToolUse(name: string, input?: Record<string, unknown>): string {\n const path = input?.file_path as string | undefined;\n switch (name) {\n case \"Read\": return `Reading ${path ?? \"file\"}`;\n case \"Write\": return `Writing ${path ?? \"file\"}`;\n case \"Edit\": return `Editing ${path ?? \"file\"}`;\n case \"Bash\": return `Running: ${truncate((input?.command as string) ?? \"command\", 80)}`;\n case \"Glob\": return `Searching files: ${input?.pattern ?? \"\"}`;\n case \"Grep\": return `Searching for: ${truncate((input?.pattern as string) ?? \"\", 60)}`;\n default: return `Using ${name}`;\n }\n}\n\nexport async function runCodingAgent(params: {\n taskSpec: TaskSpec;\n repoConfig: ResolvedRepoConfig;\n workingDir: string;\n previousReview?: ReviewResult;\n testFailures?: string;\n commandFailures?: { kind: string; output: string };\n sessionId?: string;\n plan?: ImplementationPlan;\n onProgress?: (message: string) => void;\n}): Promise<CodingResult> {\n const { taskSpec, repoConfig, workingDir, previousReview, testFailures, commandFailures, sessionId, plan, onProgress } = params;\n\n let prompt = buildCoderPrompt(taskSpec);\n if (plan) {\n prompt += \"\\n\\n\" + buildPlanSection(plan);\n }\n if (previousReview) {\n prompt += \"\\n\\n\" + buildReviewFeedbackSection(previousReview);\n }\n if (testFailures) {\n prompt += \"\\n\\n\" + buildTestFailureFeedbackSection(testFailures);\n }\n if (commandFailures) {\n prompt += \"\\n\\n\" + buildCommandFailureFeedbackSection(commandFailures.kind, commandFailures.output);\n }\n\n log.info(\n {\n task: taskSpec.title,\n model: repoConfig.model,\n maxTurns: repoConfig.maxTurns,\n budget: repoConfig.budgetPerTaskUsd,\n hasReview: !!previousReview,\n hasTestFailures: !!testFailures,\n },\n \"Starting coding agent\",\n );\n\n const result = query({\n prompt,\n options: {\n cwd: workingDir,\n model: repoConfig.model,\n maxTurns: repoConfig.maxTurns,\n maxBudgetUsd: repoConfig.budgetPerTaskUsd,\n allowedTools: repoConfig.allowedTools,\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n append: CODER_SYSTEM_PROMPT_APPEND,\n },\n ...(sessionId ? { resume: sessionId } : {}),\n },\n });\n\n let resultMessage: SDKResultMessage | undefined;\n\n for await (const message of result) {\n if (message.type === \"assistant\" && \"content\" in message) {\n const content = message.content as Array<{\n type: string;\n name?: string;\n input?: Record<string, unknown>;\n }>;\n for (const block of content) {\n if (block.type === \"tool_use\" && block.name) {\n const detail = describeToolUse(block.name, block.input);\n log.info({ tool: block.name }, detail);\n onProgress?.(detail);\n }\n }\n }\n if (message.type === \"result\") {\n resultMessage = message;\n }\n }\n\n if (!resultMessage) {\n throw new CodingAgentError(\"No result message received from coding agent\", [], 0);\n }\n\n // error_max_turns means the agent ran out of turns but may have done useful work.\n // We treat it as a partial success — the orchestrator will check if files changed.\n if (resultMessage.subtype === \"error_max_turns\") {\n log.warn(\n {\n cost: resultMessage.total_cost_usd,\n turns: resultMessage.num_turns,\n },\n \"Coding agent hit max turns — continuing with partial work\",\n );\n\n return {\n sessionId: resultMessage.session_id,\n costUsd: resultMessage.total_cost_usd,\n result: \"Agent hit max turns limit. Partial work may have been completed.\",\n numTurns: resultMessage.num_turns,\n };\n }\n\n if (resultMessage.subtype !== \"success\") {\n throw new CodingAgentError(\n `Coding agent failed: ${resultMessage.subtype}`,\n \"errors\" in resultMessage ? resultMessage.errors : [],\n resultMessage.total_cost_usd,\n );\n }\n\n log.info(\n {\n cost: resultMessage.total_cost_usd,\n turns: resultMessage.num_turns,\n },\n \"Coding agent completed\",\n );\n\n return {\n sessionId: resultMessage.session_id,\n costUsd: resultMessage.total_cost_usd,\n result: resultMessage.result,\n numTurns: resultMessage.num_turns,\n };\n}\n","import type { TaskSpec, ReviewResult } from \"../../core/types.js\";\n\nexport const CODER_SYSTEM_PROMPT_APPEND = `\nYou are working as part of an automated development pipeline called X-Force.\nYou receive specifications from GitHub Issues and implement them autonomously.\n\nCRITICAL: START WRITING CODE IMMEDIATELY. Do not spend more than a few turns reading existing files. Your primary job is to CREATE and EDIT files. The pipeline will handle committing, testing, and reviewing separately — you must NOT run tests or create git commits yourself.\n\nRULES:\n1. WRITE CODE FIRST. Briefly check the repo structure, then start creating/editing files right away.\n2. Implement EXACTLY what the spec asks for. Do not add unrequested features.\n3. Follow the existing code style and patterns in the repository.\n4. Make minimal, focused changes. Do not refactor unrelated code.\n5. Ensure a .gitignore exists with at minimum: node_modules/, .next/, dist/, build/, .env, .env.local\n6. NEVER commit dependency directories (node_modules, vendor, .venv, __pycache__, etc.).\n\nDO NOT:\n- Run tests (the pipeline runs tests after you finish)\n- Run build commands (the pipeline handles build verification)\n- Run lint commands (the pipeline handles lint checking)\n- Create git commits (the pipeline commits your changes)\n- Run git commands (the pipeline manages git)\n- Spend excessive turns exploring — get to writing code quickly\n\nWhen you receive review feedback (marked with \"## Review Feedback\"), address EVERY issue marked as critical or major. For minor issues, use your judgment.\n\nWhen you receive test failure output (marked with \"## Test Failures\"), analyze the failures and fix your code to make all tests pass.\n`;\n\nexport function buildCoderPrompt(taskSpec: TaskSpec): string {\n return `## Task: ${taskSpec.title}\n\n### Context\n${taskSpec.context}\n\n### Acceptance Criteria\n${taskSpec.acceptanceCriteria.map((c, i) => `${i + 1}. ${c}`).join(\"\\n\")}\n\n### Affected Files\n${taskSpec.affectedFiles.length > 0 ? taskSpec.affectedFiles.map((f) => `- ${f}`).join(\"\\n\") : \"Not specified - determine the best files to modify.\"}\n\n### Edge Cases to Handle\n${taskSpec.edgeCases.length > 0 ? taskSpec.edgeCases.map((e) => `- ${e}`).join(\"\\n\") : \"None specified.\"}\n\n### Task Type: ${taskSpec.type} | Size: ${taskSpec.size} | Priority: ${taskSpec.priority}\n\nPlease implement this task now. Start writing code immediately — do not over-analyze. The pipeline will handle testing, committing, and reviewing your changes.`;\n}\n\nexport function buildReviewFeedbackSection(review: ReviewResult): string {\n const issues = review.issues\n .map(\n (issue) =>\n `- **[${issue.severity.toUpperCase()}]** ${issue.file}${issue.line ? `:${issue.line}` : \"\"}\\n ${issue.description}${issue.suggestedFix ? `\\n Suggested fix: ${issue.suggestedFix}` : \"\"}`,\n )\n .join(\"\\n\");\n\n return `## Review Feedback (Address These Issues)\n\n### Summary\n${review.summary}\n\n### Issues to Fix\n${issues || \"No specific issues listed.\"}\n\n### Unmet Acceptance Criteria\n${review.specAdherence.unmet.length > 0 ? review.specAdherence.unmet.map((c) => `- ${c}`).join(\"\\n\") : \"All criteria met.\"}\n\n### Security Concerns\n${review.securityConcerns.length > 0 ? review.securityConcerns.map((c) => `- ${c}`).join(\"\\n\") : \"None.\"}\n\nAddress all CRITICAL and MAJOR issues. Then re-run tests.`;\n}\n\nexport function buildTestFailureFeedbackSection(testOutput: string): string {\n return buildCommandFailureFeedbackSection(\"test\", testOutput);\n}\n\nexport function buildCommandFailureFeedbackSection(kind: string, output: string): string {\n const label = kind.charAt(0).toUpperCase() + kind.slice(1);\n return `## ${label} Failures\n\nThe following ${kind} failures were detected after your changes. Please analyze and fix them:\n\n\\`\\`\\`\n${output}\n\\`\\`\\`\n\nFix the code to make the ${kind} pass. Do not commit — the pipeline handles that.`;\n}\n","import type { TaskSpec, ImplementationPlan } from \"../../core/types.js\";\n\nexport const PLANNER_SYSTEM_PROMPT = `You are a senior software architect analyzing a codebase to create an implementation plan.\n\nYou have access to read-only tools: Read, Glob, and Grep. Use them to:\n1. Explore the repository structure (Glob for file patterns, Read for file contents)\n2. Understand existing patterns, conventions, and architecture\n3. Identify the exact files that need to be modified or created\n4. Analyze dependencies and potential ripple effects\n\nRULES:\n- Start by quickly checking the project structure (Glob for key file patterns). If the repo is empty or has very few files, skip deep exploration and produce your plan immediately.\n- Be specific about file paths — use actual paths you found in the codebase, or specify paths to create for greenfield projects.\n- Consider test files and their patterns.\n- Identify potential risks (breaking changes, missing test coverage, security).\n- Estimate complexity honestly.\n- Your plan should be actionable and concrete, not vague.\n- Do NOT spend more than a few turns exploring. Produce your JSON plan as quickly as possible.\n\nYou MUST respond with valid JSON matching the required schema.`;\n\nexport function buildPlannerPrompt(taskSpec: TaskSpec): string {\n return `## Task: ${taskSpec.title}\n\n### Context\n${taskSpec.context}\n\n### Acceptance Criteria\n${taskSpec.acceptanceCriteria.map((c, i) => `${i + 1}. ${c}`).join(\"\\n\")}\n\n### Affected Files (from issue — verify these)\n${taskSpec.affectedFiles.length > 0 ? taskSpec.affectedFiles.map((f) => `- ${f}`).join(\"\\n\") : \"Not specified — determine from codebase analysis.\"}\n\n### Edge Cases to Handle\n${taskSpec.edgeCases.length > 0 ? taskSpec.edgeCases.map((e) => `- ${e}`).join(\"\\n\") : \"None specified.\"}\n\n### Task Type: ${taskSpec.type} | Size: ${taskSpec.size} | Priority: ${taskSpec.priority}\n\nAnalyze the codebase and produce a structured implementation plan. Use your tools to explore the project structure and understand the existing patterns before planning.`;\n}\n\nexport function buildPlanSection(plan: ImplementationPlan): string {\n const steps = plan.implementationSteps\n .sort((a, b) => a.order - b.order)\n .map(\n (s) =>\n `${s.order}. ${s.description}\\n Files: ${s.files.join(\", \")}\\n Rationale: ${s.rationale}`,\n )\n .join(\"\\n\\n\");\n\n return `## Implementation Plan (Follow This)\n\n### Approach\n${plan.approach}\n\n### Files to Modify\n${plan.filesToModify.map((f) => `- ${f}`).join(\"\\n\")}\n\n### Files to Create\n${plan.filesToCreate.map((f) => `- ${f}`).join(\"\\n\") || \"None\"}\n\n### Steps\n${steps}\n\n### Risks to Watch For\n${plan.risks.map((r) => `- ${r}`).join(\"\\n\") || \"None identified\"}\n\nFollow this plan closely. If you discover the plan is incorrect or incomplete, adapt as needed but document your deviations.`;\n}\n","import { query, type SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport { z } from \"zod\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport { PipelineError } from \"../core/errors.js\";\nimport { PLANNER_SYSTEM_PROMPT, buildPlannerPrompt } from \"./prompts/planner-system.js\";\nimport { describeToolUse } from \"./coder.js\";\nimport type { TaskSpec, PlanningResult, ImplementationPlan, ResolvedRepoConfig } from \"../core/types.js\";\n\nconst log = createChildLogger(\"planner\");\n\nconst ImplementationStepSchema = z.object({\n order: z.number().int().positive(),\n description: z.string(),\n files: z.array(z.string()),\n rationale: z.string(),\n});\n\nconst ImplementationPlanSchema = z.object({\n approach: z.string(),\n filesToModify: z.array(z.string()),\n filesToCreate: z.array(z.string()),\n estimatedComplexity: z.enum([\"low\", \"medium\", \"high\"]),\n risks: z.array(z.string()),\n implementationSteps: z.array(ImplementationStepSchema),\n estimatedTurns: z.number().int().positive(),\n});\n\nconst PLAN_JSON_SCHEMA = {\n type: \"object\",\n properties: {\n approach: { type: \"string\" },\n filesToModify: { type: \"array\", items: { type: \"string\" } },\n filesToCreate: { type: \"array\", items: { type: \"string\" } },\n estimatedComplexity: { type: \"string\", enum: [\"low\", \"medium\", \"high\"] },\n risks: { type: \"array\", items: { type: \"string\" } },\n implementationSteps: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n order: { type: \"number\" },\n description: { type: \"string\" },\n files: { type: \"array\", items: { type: \"string\" } },\n rationale: { type: \"string\" },\n },\n required: [\"order\", \"description\", \"files\", \"rationale\"],\n },\n },\n estimatedTurns: { type: \"number\" },\n },\n required: [\n \"approach\",\n \"filesToModify\",\n \"filesToCreate\",\n \"estimatedComplexity\",\n \"risks\",\n \"implementationSteps\",\n \"estimatedTurns\",\n ],\n} as const;\n\nfunction extractJSON(text: string): string {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) return jsonMatch[0];\n\n const fenceMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n if (fenceMatch) return fenceMatch[1].trim();\n\n throw new PipelineError(\"Could not extract JSON from planner response\");\n}\n\nfunction validatePlan(parsed: unknown): ImplementationPlan {\n const validated = ImplementationPlanSchema.safeParse(parsed);\n if (!validated.success) {\n const errors = validated.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\", \");\n throw new PipelineError(`Planner response validation failed: ${errors}`);\n }\n return validated.data;\n}\n\nexport async function runPlanningAgent(params: {\n taskSpec: TaskSpec;\n repoConfig: ResolvedRepoConfig;\n workingDir: string;\n onProgress?: (message: string) => void;\n}): Promise<PlanningResult> {\n const { taskSpec, repoConfig, workingDir, onProgress } = params;\n\n const prompt = buildPlannerPrompt(taskSpec);\n\n log.info(\n { task: taskSpec.title, model: repoConfig.plannerModel },\n \"Starting planning agent\",\n );\n\n const result = query({\n prompt,\n options: {\n cwd: workingDir,\n model: repoConfig.plannerModel,\n maxTurns: 50,\n allowedTools: [\"Read\", \"Glob\", \"Grep\"],\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n systemPrompt: PLANNER_SYSTEM_PROMPT,\n outputFormat: {\n type: \"json_schema\",\n schema: PLAN_JSON_SCHEMA as Record<string, unknown>,\n },\n },\n });\n\n let resultMessage: SDKResultMessage | undefined;\n let lastAssistantText = \"\";\n\n for await (const message of result) {\n if (message.type === \"assistant\" && \"content\" in message) {\n const content = message.content as Array<{\n type: string;\n text?: string;\n name?: string;\n input?: Record<string, unknown>;\n }>;\n // Extract tool_use blocks for progress reporting\n for (const block of content) {\n if (block.type === \"tool_use\" && block.name) {\n const detail = describeToolUse(block.name, block.input);\n log.info({ tool: block.name }, detail);\n onProgress?.(detail);\n }\n }\n // Capture text from assistant messages as fallback for max_turns\n const textParts = content\n .filter((c) => c.type === \"text\" && c.text)\n .map((c) => c.text!);\n if (textParts.length > 0) {\n lastAssistantText = textParts.join(\"\\n\");\n }\n }\n if (message.type === \"result\") {\n resultMessage = message;\n }\n }\n\n if (!resultMessage) {\n throw new PipelineError(\"No result message received from planning agent\");\n }\n\n log.debug(\n {\n subtype: resultMessage.subtype,\n hasStructuredOutput: \"structured_output\" in resultMessage && !!resultMessage.structured_output,\n hasResult: \"result\" in resultMessage && !!resultMessage.result,\n hasLastAssistant: !!lastAssistantText,\n lastAssistantLength: lastAssistantText.length,\n },\n \"Planning agent result received\",\n );\n\n const isSuccess = resultMessage.subtype === \"success\";\n const isMaxTurns = resultMessage.subtype === \"error_max_turns\";\n\n if (!isSuccess && !isMaxTurns) {\n const errorDetail =\n \"errors\" in resultMessage ? resultMessage.errors.join(\", \") : \"unknown\";\n throw new PipelineError(\n `Planning agent failed (${resultMessage.subtype}): ${errorDetail}`,\n );\n }\n\n if (isMaxTurns) {\n log.warn(\"Planning agent hit max turns — attempting to extract plan\");\n }\n\n let parsed: unknown;\n if (\"structured_output\" in resultMessage && resultMessage.structured_output) {\n parsed = resultMessage.structured_output;\n } else if (\"result\" in resultMessage && resultMessage.result) {\n const jsonStr = extractJSON(resultMessage.result);\n try {\n parsed = JSON.parse(jsonStr);\n } catch {\n throw new PipelineError(\n `Planner returned invalid JSON: ${String(resultMessage.result).slice(0, 200)}`,\n );\n }\n } else if (lastAssistantText) {\n // Fallback: try to extract plan from last assistant message (common on max_turns)\n log.warn(\"No result output — extracting plan from last assistant message\");\n const jsonStr = extractJSON(lastAssistantText);\n try {\n parsed = JSON.parse(jsonStr);\n } catch {\n throw new PipelineError(\n `Planner returned invalid JSON in assistant message: ${lastAssistantText.slice(0, 200)}`,\n );\n }\n } else {\n throw new PipelineError(\"Planning agent produced no output\");\n }\n\n const plan = validatePlan(parsed);\n\n log.info(\n {\n complexity: plan.estimatedComplexity,\n steps: plan.implementationSteps.length,\n filesToModify: plan.filesToModify.length,\n },\n \"Plan created\",\n );\n\n return {\n plan,\n costUsd: resultMessage.total_cost_usd,\n numTurns: resultMessage.num_turns,\n };\n}\n","import { query, type SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport { z } from \"zod\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport { ReviewerError } from \"../core/errors.js\";\nimport { REVIEWER_SYSTEM_PROMPT, buildReviewerUserPrompt } from \"./prompts/reviewer-system.js\";\nimport type { TaskSpec, ReviewResult, ResolvedRepoConfig } from \"../core/types.js\";\n\nconst log = createChildLogger(\"reviewer\");\n\nconst ReviewIssueSchema = z.object({\n severity: z.enum([\"critical\", \"major\", \"minor\", \"suggestion\"]),\n file: z.string(),\n line: z.number().nullable().optional(),\n description: z.string(),\n suggestedFix: z.string().nullable().optional(),\n});\n\nconst ReviewResultSchema = z.object({\n approved: z.boolean(),\n summary: z.string(),\n issues: z.array(ReviewIssueSchema),\n securityConcerns: z.array(z.string()),\n specAdherence: z.object({\n met: z.array(z.string()),\n unmet: z.array(z.string()),\n }),\n});\n\n/** JSON Schema for the reviewer's structured output */\nconst REVIEW_JSON_SCHEMA = {\n type: \"object\",\n properties: {\n approved: { type: \"boolean\" },\n summary: { type: \"string\" },\n issues: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n severity: { type: \"string\", enum: [\"critical\", \"major\", \"minor\", \"suggestion\"] },\n file: { type: \"string\" },\n line: { type: [\"number\", \"null\"] },\n description: { type: \"string\" },\n suggestedFix: { type: [\"string\", \"null\"] },\n },\n required: [\"severity\", \"file\", \"description\"],\n },\n },\n securityConcerns: { type: \"array\", items: { type: \"string\" } },\n specAdherence: {\n type: \"object\",\n properties: {\n met: { type: \"array\", items: { type: \"string\" } },\n unmet: { type: \"array\", items: { type: \"string\" } },\n },\n required: [\"met\", \"unmet\"],\n },\n },\n required: [\"approved\", \"summary\", \"issues\", \"securityConcerns\", \"specAdherence\"],\n} as const;\n\n/** Extract JSON from a potentially wrapped response text */\nfunction extractJSON(text: string): string {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) return jsonMatch[0];\n\n const fenceMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n if (fenceMatch) return fenceMatch[1].trim();\n\n throw new ReviewerError(\"Could not extract JSON from reviewer response\");\n}\n\n/** Validate raw parsed data against the ReviewResult schema */\nfunction validateReviewResult(parsed: unknown): ReviewResult {\n const validated = ReviewResultSchema.safeParse(parsed);\n if (!validated.success) {\n const errors = validated.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\", \");\n throw new ReviewerError(`Reviewer response validation failed: ${errors}`);\n }\n\n return {\n ...validated.data,\n issues: validated.data.issues.map((issue) => ({\n ...issue,\n line: issue.line ?? undefined,\n suggestedFix: issue.suggestedFix ?? undefined,\n })),\n };\n}\n\nexport async function runReviewerAgent(params: {\n taskSpec: TaskSpec;\n diff: string;\n repoConfig: ResolvedRepoConfig;\n reviewCycle: number;\n}): Promise<ReviewResult> {\n const { taskSpec, diff, repoConfig, reviewCycle } = params;\n\n log.info(\n { model: repoConfig.reviewerModel, cycle: reviewCycle },\n \"Starting reviewer agent\",\n );\n\n const userPrompt = buildReviewerUserPrompt(taskSpec, diff, reviewCycle);\n\n // Use the Agent SDK so auth goes through Claude Code subscription (Max plan)\n // instead of requiring a separate ANTHROPIC_API_KEY.\n // The reviewer gets NO tools — it can only analyze the diff, not modify files.\n const agentResult = query({\n prompt: userPrompt,\n options: {\n model: repoConfig.reviewerModel,\n maxTurns: 50,\n tools: [],\n systemPrompt: REVIEWER_SYSTEM_PROMPT,\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n outputFormat: {\n type: \"json_schema\",\n schema: REVIEW_JSON_SCHEMA as Record<string, unknown>,\n },\n },\n });\n\n let resultMessage: SDKResultMessage | undefined;\n let lastAssistantText = \"\";\n\n for await (const message of agentResult) {\n if (message.type === \"assistant\" && \"content\" in message) {\n const textParts = (message.content as Array<{ type: string; text?: string }>)\n .filter((c) => c.type === \"text\" && c.text)\n .map((c) => c.text!);\n if (textParts.length > 0) {\n lastAssistantText = textParts.join(\"\\n\");\n }\n }\n if (message.type === \"result\") {\n resultMessage = message;\n }\n }\n\n if (!resultMessage) {\n throw new ReviewerError(\"No result message received from reviewer agent\");\n }\n\n // Handle error subtypes — allow error_max_turns if we got structured output\n const isSuccess = resultMessage.subtype === \"success\";\n const isMaxTurns = resultMessage.subtype === \"error_max_turns\";\n\n if (!isSuccess && !isMaxTurns) {\n const errorDetail = \"errors\" in resultMessage ? resultMessage.errors.join(\", \") : \"unknown\";\n throw new ReviewerError(`Reviewer agent failed (${resultMessage.subtype}): ${errorDetail}`);\n }\n\n if (isMaxTurns) {\n log.warn(\"Reviewer hit max turns — attempting to extract result\");\n }\n\n // Parse the result — prefer structured_output, fall back to text parsing\n let parsed: unknown;\n if (\"structured_output\" in resultMessage && resultMessage.structured_output) {\n parsed = resultMessage.structured_output;\n } else if (\"result\" in resultMessage && resultMessage.result) {\n const jsonStr = extractJSON(resultMessage.result);\n try {\n parsed = JSON.parse(jsonStr);\n } catch {\n throw new ReviewerError(`Reviewer returned invalid JSON: ${String(resultMessage.result).slice(0, 200)}`);\n }\n } else if (lastAssistantText) {\n log.warn(\"No result output — extracting review from last assistant message\");\n const jsonStr = extractJSON(lastAssistantText);\n try {\n parsed = JSON.parse(jsonStr);\n } catch {\n throw new ReviewerError(\n `Reviewer returned invalid JSON in assistant message: ${lastAssistantText.slice(0, 200)}`,\n );\n }\n } else {\n throw new ReviewerError(\"Reviewer agent produced no output\");\n }\n\n const review = validateReviewResult(parsed);\n\n log.info(\n {\n approved: review.approved,\n issueCount: review.issues.length,\n cycle: reviewCycle,\n },\n \"Review completed\",\n );\n\n return review;\n}\n","import type { TaskSpec } from \"../../core/types.js\";\n\nexport const REVIEWER_SYSTEM_PROMPT = `You are a senior code reviewer for an automated development pipeline.\nYour job is to review a code diff against a specification and provide structured feedback.\n\nYou must evaluate:\n1. **Spec Adherence**: Does the code implement all acceptance criteria?\n2. **Code Quality**: Is the code clean, maintainable, follows existing patterns?\n3. **Security**: Are there any security vulnerabilities, injection risks, exposed secrets?\n4. **Edge Cases**: Are the listed edge cases handled?\n5. **Tests**: Are tests included and do they cover the key scenarios?\n\nYou MUST respond with valid JSON matching this schema:\n{\n \"approved\": boolean,\n \"summary\": \"string - brief overall assessment\",\n \"issues\": [\n {\n \"severity\": \"critical|major|minor|suggestion\",\n \"file\": \"path/to/file\",\n \"line\": number_or_null,\n \"description\": \"what's wrong\",\n \"suggestedFix\": \"how to fix it (optional, can be null)\"\n }\n ],\n \"securityConcerns\": [\"string array, empty if none\"],\n \"specAdherence\": {\n \"met\": [\"criteria that are satisfied\"],\n \"unmet\": [\"criteria that are NOT satisfied\"]\n }\n}\n\nRules:\n- Only mark \"approved\": true if ALL acceptance criteria are met AND there are zero critical/major issues.\n- Be specific about file paths and line numbers.\n- For review cycle > 0, focus on whether previous feedback was addressed.\n- Do NOT nitpick style if the code follows the repository's existing conventions.\n- Respond ONLY with the JSON object. No markdown fences, no explanation text.`;\n\nexport function buildReviewerUserPrompt(\n taskSpec: TaskSpec,\n diff: string,\n reviewCycle: number,\n): string {\n return `## Original Specification\n\n**Title**: ${taskSpec.title}\n\n**Context**: ${taskSpec.context}\n\n**Acceptance Criteria**:\n${taskSpec.acceptanceCriteria.map((c, i) => `${i + 1}. ${c}`).join(\"\\n\")}\n\n**Edge Cases**:\n${taskSpec.edgeCases.length > 0 ? taskSpec.edgeCases.map((e) => `- ${e}`).join(\"\\n\") : \"None specified.\"}\n\n## Code Diff to Review\n\n\\`\\`\\`diff\n${diff}\n\\`\\`\\`\n\n## Review Cycle: ${reviewCycle + 1}\n${reviewCycle > 0 ? \"This is a re-review after the coder addressed previous feedback. Focus on whether previous issues were fixed.\" : \"This is the initial review.\"}\n\nProvide your review as a JSON object matching the specified schema.`;\n}\n","import { query, type SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport { z } from \"zod\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport { PipelineError } from \"../core/errors.js\";\nimport type { TaskSpec, SecurityReport, SecurityScanResult, ResolvedRepoConfig } from \"../core/types.js\";\n\nconst log = createChildLogger(\"security-scanner\");\n\nconst SecurityFindingSchema = z.object({\n severity: z.enum([\"critical\", \"high\", \"medium\", \"low\", \"info\"]),\n category: z.string(),\n file: z.string(),\n line: z.number().nullable().optional(),\n description: z.string(),\n recommendation: z.string(),\n});\n\nconst SecurityReportSchema = z.object({\n riskLevel: z.enum([\"critical\", \"high\", \"medium\", \"low\", \"none\"]),\n findings: z.array(SecurityFindingSchema),\n recommendations: z.array(z.string()),\n summary: z.string(),\n});\n\nconst SECURITY_REPORT_JSON_SCHEMA = {\n type: \"object\",\n properties: {\n riskLevel: { type: \"string\", enum: [\"critical\", \"high\", \"medium\", \"low\", \"none\"] },\n findings: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n severity: { type: \"string\", enum: [\"critical\", \"high\", \"medium\", \"low\", \"info\"] },\n category: { type: \"string\" },\n file: { type: \"string\" },\n line: { type: [\"number\", \"null\"] },\n description: { type: \"string\" },\n recommendation: { type: \"string\" },\n },\n required: [\"severity\", \"category\", \"file\", \"description\", \"recommendation\"],\n },\n },\n recommendations: { type: \"array\", items: { type: \"string\" } },\n summary: { type: \"string\" },\n },\n required: [\"riskLevel\", \"findings\", \"recommendations\", \"summary\"],\n} as const;\n\nconst SECURITY_SCANNER_SYSTEM_PROMPT = `You are a security-focused code reviewer for an automated development pipeline.\nYour job is to analyze code diffs for security vulnerabilities and risks.\n\nFocus areas:\n1. **Injection**: SQL injection, command injection, XSS, template injection\n2. **Authentication/Authorization**: Broken auth, missing access controls, privilege escalation\n3. **Secrets**: Hardcoded credentials, API keys, tokens, connection strings\n4. **Data Exposure**: Sensitive data in logs, error messages, or responses\n5. **Dependencies**: Known vulnerable patterns, unsafe imports\n6. **Input Validation**: Missing or inadequate validation, buffer overflows\n7. **Cryptography**: Weak algorithms, improper random generation, insecure hashing\n8. **Configuration**: Insecure defaults, debug mode in production, CORS misconfiguration\n\nRules:\n- Only report actual vulnerabilities visible in the diff, not hypothetical ones.\n- Be specific about file paths and line numbers.\n- Provide actionable recommendations.\n- Set riskLevel based on the highest severity finding (or \"none\" if no findings).\n- Respond ONLY with the JSON object. No markdown fences, no explanation text.`;\n\nfunction extractJSON(text: string): string {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) return jsonMatch[0];\n throw new PipelineError(\"Could not extract JSON from security scanner response\");\n}\n\nfunction validateReport(parsed: unknown): SecurityReport {\n const validated = SecurityReportSchema.safeParse(parsed);\n if (!validated.success) {\n const errors = validated.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\", \");\n throw new PipelineError(`Security report validation failed: ${errors}`);\n }\n return {\n ...validated.data,\n findings: validated.data.findings.map((f) => ({\n ...f,\n line: f.line ?? undefined,\n })),\n };\n}\n\nexport async function runSecurityScanner(params: {\n taskSpec: TaskSpec;\n diff: string;\n repoConfig: ResolvedRepoConfig;\n}): Promise<SecurityScanResult> {\n const { taskSpec, diff, repoConfig } = params;\n\n log.info({ task: taskSpec.title, model: repoConfig.reviewerModel }, \"Starting security scan\");\n\n const prompt = `## Security Review Request\n\n**Task**: ${taskSpec.title}\n**Type**: ${taskSpec.type}\n\n## Code Diff to Analyze\n\n\\`\\`\\`diff\n${diff}\n\\`\\`\\`\n\nAnalyze this diff for security vulnerabilities. Provide your report as a JSON object matching the required schema.`;\n\n const result = query({\n prompt,\n options: {\n model: repoConfig.reviewerModel,\n maxTurns: 50,\n tools: [],\n systemPrompt: SECURITY_SCANNER_SYSTEM_PROMPT,\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n outputFormat: {\n type: \"json_schema\",\n schema: SECURITY_REPORT_JSON_SCHEMA as Record<string, unknown>,\n },\n },\n });\n\n let resultMessage: SDKResultMessage | undefined;\n let lastAssistantText = \"\";\n\n for await (const message of result) {\n if (message.type === \"assistant\" && \"content\" in message) {\n const textParts = (message.content as Array<{ type: string; text?: string }>)\n .filter((c) => c.type === \"text\" && c.text)\n .map((c) => c.text!);\n if (textParts.length > 0) {\n lastAssistantText = textParts.join(\"\\n\");\n }\n }\n if (message.type === \"result\") {\n resultMessage = message;\n }\n }\n\n if (!resultMessage) {\n throw new PipelineError(\"No result message received from security scanner\");\n }\n\n const isSuccess = resultMessage.subtype === \"success\";\n const isMaxTurns = resultMessage.subtype === \"error_max_turns\";\n\n if (!isSuccess && !isMaxTurns) {\n const errorDetail =\n \"errors\" in resultMessage ? resultMessage.errors.join(\", \") : \"unknown\";\n throw new PipelineError(\n `Security scanner failed (${resultMessage.subtype}): ${errorDetail}`,\n );\n }\n\n let parsed: unknown;\n if (\"structured_output\" in resultMessage && resultMessage.structured_output) {\n parsed = resultMessage.structured_output;\n } else if (\"result\" in resultMessage && resultMessage.result) {\n const jsonStr = extractJSON(resultMessage.result);\n try {\n parsed = JSON.parse(jsonStr);\n } catch {\n throw new PipelineError(\n `Security scanner returned invalid JSON: ${String(resultMessage.result).slice(0, 200)}`,\n );\n }\n } else if (lastAssistantText) {\n log.warn(\"No result output — extracting report from last assistant message\");\n const jsonStr = extractJSON(lastAssistantText);\n try {\n parsed = JSON.parse(jsonStr);\n } catch {\n throw new PipelineError(\n `Security scanner returned invalid JSON in assistant message: ${lastAssistantText.slice(0, 200)}`,\n );\n }\n } else {\n throw new PipelineError(\"Security scanner produced no output\");\n }\n\n const report = validateReport(parsed);\n\n log.info(\n {\n riskLevel: report.riskLevel,\n findingCount: report.findings.length,\n },\n \"Security scan completed\",\n );\n\n return {\n report,\n costUsd: resultMessage.total_cost_usd,\n };\n}\n","import { execa } from \"execa\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport type { TestResult } from \"../core/types.js\";\n\nconst log = createChildLogger(\"test-runner\");\n\nexport type CommandKind = \"lint\" | \"build\" | \"test\" | \"run\";\n\n/** Run any shell command and capture output */\nexport async function runCommand(params: {\n workingDir: string;\n command: string;\n kind: CommandKind;\n timeoutMs?: number;\n}): Promise<TestResult> {\n const { workingDir, command, kind, timeoutMs = 300_000 } = params;\n const [cmd, ...args] = command.split(\" \");\n\n log.info({ kind, command, workingDir }, `Running ${kind} command`);\n const start = Date.now();\n\n try {\n const result = await execa(cmd, args, {\n cwd: workingDir,\n timeout: timeoutMs,\n reject: false,\n all: true,\n });\n\n const durationMs = Date.now() - start;\n const passed = result.exitCode === 0;\n\n log.info({ kind, passed, durationMs, exitCode: result.exitCode }, `${kind} completed`);\n\n return {\n passed,\n output: result.all ?? result.stdout + \"\\n\" + result.stderr,\n durationMs,\n };\n } catch (error) {\n const durationMs = Date.now() - start;\n const message = error instanceof Error ? error.message : String(error);\n log.error({ kind, error: message, durationMs }, `${kind} execution failed`);\n\n return {\n passed: false,\n output: message,\n durationMs,\n };\n }\n}\n\n/** Run the target repo's test suite and capture output */\nexport async function runTests(params: {\n workingDir: string;\n testCommand: string;\n timeoutMs?: number;\n}): Promise<TestResult> {\n return runCommand({\n workingDir: params.workingDir,\n command: params.testCommand,\n kind: \"test\",\n timeoutMs: params.timeoutMs,\n });\n}\n","import { createChildLogger } from \"../core/logger.js\";\nimport { addComment } from \"../github/client.js\";\nimport type { NotificationsConfig, PipelineState } from \"../core/types.js\";\n\nconst log = createChildLogger(\"notifications\");\n\ntype PipelineEvent = \"started\" | \"tests_passed\" | \"tests_failed\" | \"review_approved\" | \"review_rejected\" | \"completed\" | \"failed\";\n\n/** Send a Slack notification via incoming webhook */\nasync function sendSlackWebhook(webhookUrl: string, message: SlackMessage): Promise<void> {\n try {\n const response = await fetch(webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(message),\n });\n\n if (!response.ok) {\n log.warn({ status: response.status }, \"Slack webhook request failed\");\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.warn({ error: msg }, \"Failed to send Slack notification\");\n }\n}\n\ninterface SlackMessage {\n text: string;\n blocks?: SlackBlock[];\n}\n\ninterface SlackBlock {\n type: string;\n text?: { type: string; text: string };\n elements?: Array<{ type: string; text: string }>;\n}\n\n/** Format a pipeline event as a Slack message */\nfunction formatSlackMessage(state: PipelineState, event: PipelineEvent): SlackMessage {\n const taskTitle = state.taskSpec?.title ?? \"Unknown task\";\n const pipelineId = state.id;\n const cost = `$${state.totalCostUsd.toFixed(4)}`;\n\n const eventDescriptions: Record<PipelineEvent, string> = {\n started: `Pipeline started for: *${taskTitle}*`,\n tests_passed: `Tests passed for: *${taskTitle}*`,\n tests_failed: `Tests failed for: *${taskTitle}*`,\n review_approved: `Review approved for: *${taskTitle}*`,\n review_rejected: `Review rejected for: *${taskTitle}* (cycle ${state.reviewCycle + 1})`,\n completed: `Pipeline completed for: *${taskTitle}*\\nPR: ${state.prUrl ?? \"N/A\"}\\nCost: ${cost}`,\n failed: `Pipeline failed for: *${taskTitle}*\\nError: ${state.error ?? \"Unknown\"}\\nCost: ${cost}`,\n };\n\n const icons: Record<PipelineEvent, string> = {\n started: \":rocket:\",\n tests_passed: \":white_check_mark:\",\n tests_failed: \":x:\",\n review_approved: \":thumbsup:\",\n review_rejected: \":eyes:\",\n completed: \":tada:\",\n failed: \":rotating_light:\",\n };\n\n return {\n text: `${icons[event]} [X-Force ${pipelineId}] ${eventDescriptions[event]}`,\n };\n}\n\n/** Determine the Slack channel for an event */\nfunction getSlackChannel(config: NotificationsConfig, event: PipelineEvent): string | undefined {\n if (!config.slack?.channels) return undefined;\n if (event === \"completed\" || event === \"review_approved\" || event === \"tests_passed\") {\n return config.slack.channels.success;\n }\n if (event === \"failed\" || event === \"tests_failed\") {\n return config.slack.channels.failure;\n }\n return undefined;\n}\n\n/** Post @mentions on a GitHub issue for relevant events */\nasync function postGitHubMentions(\n config: NotificationsConfig,\n owner: string,\n repo: string,\n issueNumber: number,\n event: PipelineEvent,\n state: PipelineState,\n): Promise<void> {\n const github = config.github;\n if (!github) return;\n\n let mentions: string[] = [];\n let message = \"\";\n\n if (event === \"failed\" && github.mentionOnFailure?.length) {\n mentions = github.mentionOnFailure;\n message = `X-Force pipeline failed. ${mentions.join(\" \")} — please review.\\n\\n**Error**: ${state.error ?? \"Unknown\"}`;\n }\n\n if ((event === \"completed\" || event === \"review_approved\") && github.mentionOnReview?.length) {\n mentions = github.mentionOnReview;\n message = `X-Force pipeline completed. ${mentions.join(\" \")} — PR ready for review: ${state.prUrl ?? \"N/A\"}`;\n }\n\n if (message) {\n try {\n await addComment(owner, repo, issueNumber, message);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.warn({ error: msg }, \"Failed to post GitHub mention\");\n }\n }\n}\n\n/** Send all configured notifications for a pipeline event */\nexport async function notify(params: {\n config: NotificationsConfig | undefined;\n state: PipelineState;\n event: PipelineEvent;\n owner: string;\n repo: string;\n issueNumber: number;\n}): Promise<void> {\n const { config, state, event, owner, repo, issueNumber } = params;\n if (!config) return;\n\n const promises: Promise<void>[] = [];\n\n // Slack notification\n if (config.slack?.webhookUrl) {\n const message = formatSlackMessage(state, event);\n promises.push(sendSlackWebhook(config.slack.webhookUrl, message));\n }\n\n // GitHub mentions\n promises.push(postGitHubMentions(config, owner, repo, issueNumber, event, state));\n\n // Fire all notifications in parallel, don't block pipeline on failures\n await Promise.allSettled(promises);\n}\n","import { createChildLogger } from \"../core/logger.js\";\nimport type { TaskSpec, ResolvedRepoConfig, SecurityReport } from \"../core/types.js\";\n\nconst log = createChildLogger(\"auto-merge\");\n\nconst SIZE_ORDER: Record<TaskSpec[\"size\"], number> = {\n xs: 1,\n s: 2,\n m: 3,\n l: 4,\n xl: 5,\n};\n\nexport function isAutoMergeEligible(params: {\n taskSpec: TaskSpec;\n repoConfig: ResolvedRepoConfig;\n securityReport?: SecurityReport;\n}): { eligible: boolean; reasons: string[] } {\n const { taskSpec, repoConfig, securityReport } = params;\n const rules = repoConfig.autoMergeRules;\n const reasons: string[] = [];\n\n if (!repoConfig.autoMerge) {\n return { eligible: false, reasons: [\"Auto-merge is disabled for this repo\"] };\n }\n\n if (!rules.types.includes(taskSpec.type)) {\n reasons.push(\n `Task type \"${taskSpec.type}\" is not in allowed types: [${rules.types.join(\", \")}]`,\n );\n }\n\n if (SIZE_ORDER[taskSpec.size] > SIZE_ORDER[rules.maxSize]) {\n reasons.push(`Task size \"${taskSpec.size}\" exceeds max size \"${rules.maxSize}\"`);\n }\n\n if (rules.requireCleanSecurityScan && securityReport) {\n const hasCriticalOrHigh = securityReport.findings.some(\n (f) => f.severity === \"critical\" || f.severity === \"high\",\n );\n if (hasCriticalOrHigh) {\n reasons.push(\"Security scan found critical or high severity issues\");\n }\n }\n\n if (reasons.length > 0) {\n log.info({ reasons }, \"PR not eligible for auto-merge\");\n }\n\n return { eligible: reasons.length === 0, reasons };\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdir, appendFile, readFile } from \"node:fs/promises\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport type { PipelineState, PipelineRunRecord, CostSummary, ResolvedRepoConfig } from \"../core/types.js\";\n\nconst log = createChildLogger(\"cost-tracker\");\n\nconst HISTORY_DIR = join(homedir(), \".xforce\");\nconst HISTORY_FILE = \"history.jsonl\";\n\nexport function getHistoryPath(basePath?: string): string {\n return join(basePath ?? HISTORY_DIR, HISTORY_FILE);\n}\n\n/** Convert a completed PipelineState into a PipelineRunRecord */\nexport function buildRecordFromState(state: PipelineState, repoConfig: ResolvedRepoConfig): PipelineRunRecord {\n const startedAt = state.startedAt instanceof Date ? state.startedAt : new Date(state.startedAt);\n const completedAt = state.completedAt instanceof Date ? state.completedAt : new Date(state.completedAt ?? Date.now());\n\n return {\n id: state.id,\n repo: `${repoConfig.owner}/${repoConfig.name}`,\n issueNumber: state.taskSpec.issueNumber,\n issueUrl: state.taskSpec.issueUrl,\n prNumber: state.prNumber,\n prUrl: state.prUrl,\n status: state.status === \"failed\" ? \"failed\" : \"completed\",\n totalCostUsd: state.totalCostUsd,\n durationMs: completedAt.getTime() - startedAt.getTime(),\n reviewCycles: state.reviewCycle,\n model: repoConfig.model,\n startedAt: startedAt.toISOString(),\n completedAt: completedAt.toISOString(),\n taskTitle: state.taskSpec.title,\n taskType: state.taskSpec.type,\n taskSize: state.taskSpec.size,\n error: state.error,\n };\n}\n\n/** Append a pipeline run record to the JSONL history file */\nexport async function appendRecord(record: PipelineRunRecord, basePath?: string): Promise<void> {\n const dir = basePath ?? HISTORY_DIR;\n await mkdir(dir, { recursive: true });\n const filePath = join(dir, HISTORY_FILE);\n const line = JSON.stringify(record) + \"\\n\";\n await appendFile(filePath, line, \"utf-8\");\n log.debug({ id: record.id, repo: record.repo }, \"Persisted pipeline run record\");\n}\n\nexport interface CostFilter {\n repo?: string;\n since?: Date;\n until?: Date;\n}\n\n/** Read pipeline run records from the JSONL history file */\nexport async function readRecords(filter?: CostFilter, basePath?: string): Promise<PipelineRunRecord[]> {\n const filePath = getHistoryPath(basePath);\n let content: string;\n try {\n content = await readFile(filePath, \"utf-8\");\n } catch {\n return [];\n }\n\n const records: PipelineRunRecord[] = [];\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const record = JSON.parse(trimmed) as PipelineRunRecord;\n if (filter?.repo && record.repo !== filter.repo) continue;\n if (filter?.since && new Date(record.startedAt) < filter.since) continue;\n if (filter?.until && new Date(record.startedAt) > filter.until) continue;\n records.push(record);\n } catch {\n log.warn(\"Skipping malformed line in history file\");\n }\n }\n\n return records;\n}\n\n/** Compute summary statistics from a set of pipeline run records */\nexport function summarize(records: PipelineRunRecord[]): CostSummary {\n if (records.length === 0) {\n return {\n totalCostUsd: 0,\n totalRuns: 0,\n successfulRuns: 0,\n failedRuns: 0,\n avgCostPerRun: 0,\n avgDurationMs: 0,\n costByRepo: {},\n };\n }\n\n const totalCostUsd = records.reduce((sum, r) => sum + r.totalCostUsd, 0);\n const totalDurationMs = records.reduce((sum, r) => sum + r.durationMs, 0);\n const successfulRuns = records.filter((r) => r.status === \"completed\").length;\n const failedRuns = records.filter((r) => r.status === \"failed\").length;\n\n const costByRepo: Record<string, number> = {};\n for (const r of records) {\n costByRepo[r.repo] = (costByRepo[r.repo] ?? 0) + r.totalCostUsd;\n }\n\n return {\n totalCostUsd,\n totalRuns: records.length,\n successfulRuns,\n failedRuns,\n avgCostPerRun: totalCostUsd / records.length,\n avgDurationMs: totalDurationMs / records.length,\n costByRepo,\n };\n}\n","import ora from \"ora\";\nimport chalk from \"chalk\";\nimport { loadConfig } from \"../../core/config.js\";\nimport { resolveRepoConfig } from \"../../core/config.js\";\nimport { parsePRUrl, getPRDiff, getPR } from \"../../github/client.js\";\nimport { runReviewerAgent } from \"../../agents/reviewer.js\";\nimport type { TaskSpec } from \"../../core/types.js\";\n\nexport async function reviewCommand(params: {\n prUrl: string;\n configPath?: string;\n}): Promise<void> {\n const spinner = ora(\"Loading configuration...\").start();\n\n try {\n const config = loadConfig(params.configPath);\n spinner.succeed(\"Configuration loaded\");\n\n // Parse the PR URL\n const { owner, repo, prNumber } = parsePRUrl(params.prUrl);\n\n // Resolve repo config\n const repoConfig = resolveRepoConfig(config, owner, repo);\n\n // Fetch PR details\n spinner.start(\"Fetching PR details...\");\n const pr = await getPR(owner, repo, prNumber);\n spinner.succeed(`PR #${prNumber}: ${pr.title}`);\n\n // Fetch the diff\n spinner.start(\"Fetching PR diff...\");\n const diff = await getPRDiff(owner, repo, prNumber);\n spinner.succeed(`Diff fetched (${diff.length} chars)`);\n\n // Build a minimal TaskSpec from the PR body\n const taskSpec: TaskSpec = {\n title: pr.title,\n context: pr.body ?? \"No description provided.\",\n acceptanceCriteria: [],\n affectedFiles: [],\n edgeCases: [],\n priority: \"medium\",\n type: \"feature\",\n size: \"m\",\n issueNumber: prNumber,\n issueUrl: pr.html_url,\n repoOwner: owner,\n repoName: repo,\n };\n\n // Run the reviewer\n spinner.start(\"Running AI reviewer...\");\n const review = await runReviewerAgent({\n taskSpec,\n diff,\n repoConfig,\n reviewCycle: 0,\n });\n spinner.stop();\n\n // Display results\n console.log();\n const verdict = review.approved\n ? chalk.green.bold(\"APPROVED\")\n : chalk.red.bold(\"CHANGES REQUESTED\");\n console.log(` ${chalk.bold(\"Verdict:\")} ${verdict}`);\n console.log();\n console.log(` ${chalk.bold(\"Summary:\")}`);\n console.log(` ${review.summary}`);\n\n if (review.issues.length > 0) {\n console.log();\n console.log(` ${chalk.bold(\"Issues:\")} ${review.issues.length}`);\n for (const issue of review.issues) {\n const severity =\n issue.severity === \"critical\"\n ? chalk.red(issue.severity)\n : issue.severity === \"major\"\n ? chalk.yellow(issue.severity)\n : chalk.dim(issue.severity);\n const location = issue.line ? `${issue.file}:${issue.line}` : issue.file;\n console.log(` ${severity} ${chalk.cyan(location)} — ${issue.description}`);\n if (issue.suggestedFix) {\n console.log(` ${chalk.dim(\"Fix:\")} ${issue.suggestedFix}`);\n }\n }\n }\n\n if (review.securityConcerns.length > 0) {\n console.log();\n console.log(` ${chalk.bold.red(\"Security Concerns:\")}`);\n for (const concern of review.securityConcerns) {\n console.log(` - ${concern}`);\n }\n }\n\n if (review.specAdherence.unmet.length > 0) {\n console.log();\n console.log(` ${chalk.bold(\"Unmet Criteria:\")}`);\n for (const unmet of review.specAdherence.unmet) {\n console.log(` - ${unmet}`);\n }\n }\n\n console.log();\n\n if (!review.approved) {\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n spinner.fail(chalk.red(message));\n process.exit(1);\n }\n}\n","import { join, resolve } from \"node:path\";\nimport { mkdir, writeFile, readFile, access } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport ora from \"ora\";\nimport chalk from \"chalk\";\n\n/** Resolve path to bundled template files by finding the package root */\nasync function findTemplateDir(): Promise<string> {\n const thisFile = fileURLToPath(import.meta.url);\n let dir = resolve(thisFile, \"..\");\n // Walk up until we find package.json (marks the package root)\n for (let i = 0; i < 6; i++) {\n const pkgPath = join(dir, \"package.json\");\n if (await fileExists(pkgPath)) {\n return join(dir, \"templates\");\n }\n dir = resolve(dir, \"..\");\n }\n throw new Error(\"Could not find xforce package root (no package.json found)\");\n}\n\nfunction configTemplate(params: {\n repoOwner: string;\n repoName: string;\n defaultBranch: string;\n testCommand: string;\n buildCommand?: string;\n lintCommand?: string;\n runCommand?: string;\n}): string {\n const buildLine = params.buildCommand\n ? ` buildCommand: \"${params.buildCommand}\"`\n : ` # buildCommand: \"npm run build\"`;\n const lintLine = params.lintCommand\n ? ` lintCommand: \"${params.lintCommand}\"`\n : ` # lintCommand: \"npm run lint\"`;\n const runLine = params.runCommand\n ? ` runCommand: \"${params.runCommand}\"`\n : ` # runCommand: \"node dist/index.js --health-check\"`;\n\n return `version: \"1\"\n\ndefaults:\n model: \"claude-opus-4-6\"\n reviewerModel: \"claude-opus-4-6\"\n plannerModel: \"claude-opus-4-6\"\n maxTurns: 500\n maxReviewCycles: 5\n maxTestRetries: 5\n timeoutMinutes: 120\n budgetPerTaskUsd: 50.00\n branchPrefix: \"xforce\"\n enablePlanning: true\n enableSecurityScan: true\n labels:\n ready: \"xforce:ready\"\n inProgress: \"xforce:in-progress\"\n done: \"xforce:done\"\n failed: \"xforce:failed\"\n allowedTools:\n - Read\n - Write\n - Edit\n - Bash\n - Glob\n - Grep\n\nrepos:\n - owner: \"${params.repoOwner}\"\n name: \"${params.repoName}\"\n defaultBranch: \"${params.defaultBranch}\"\n testCommand: \"${params.testCommand}\"\n${buildLine}\n${lintLine}\n${runLine}\n autoMerge: true\n autoMergeRules:\n types: [feature, bugfix, refactor, test, docs]\n maxSize: \"xl\"\n mergeStrategy: \"squash\"\n requireCleanSecurityScan: false\n`;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function initCommand(params: {\n path?: string;\n owner?: string;\n name?: string;\n branch?: string;\n testCommand?: string;\n buildCommand?: string;\n lintCommand?: string;\n runCommand?: string;\n}): Promise<void> {\n const targetDir = resolve(params.path ?? \".\");\n const spinner = ora(\"Initializing X-Force...\").start();\n\n try {\n // Determine repo owner/name from the directory or params\n const owner = params.owner ?? \"your-org\";\n const name = params.name ?? targetDir.split(\"/\").pop() ?? \"your-repo\";\n const defaultBranch = params.branch ?? \"main\";\n const testCommand = params.testCommand ?? \"npm test\";\n\n const created: string[] = [];\n const skipped: string[] = [];\n\n // 1. Copy issue templates\n const issueTemplateDir = join(targetDir, \".github\", \"ISSUE_TEMPLATE\");\n await mkdir(issueTemplateDir, { recursive: true });\n\n const templateNames = [\"feature-request.yml\", \"bug-fix.yml\", \"refactor.yml\"];\n const srcTemplateDir = join(await findTemplateDir(), \"issue-templates\");\n\n for (const tmpl of templateNames) {\n const destPath = join(issueTemplateDir, tmpl);\n if (await fileExists(destPath)) {\n skipped.push(`.github/ISSUE_TEMPLATE/${tmpl}`);\n } else {\n const content = await readFile(join(srcTemplateDir, tmpl), \"utf-8\");\n await writeFile(destPath, content, \"utf-8\");\n created.push(`.github/ISSUE_TEMPLATE/${tmpl}`);\n }\n }\n\n // 2. Write .env.xforce file\n const envPath = join(targetDir, \".env.xforce\");\n if (await fileExists(envPath)) {\n skipped.push(\".env.xforce\");\n } else {\n await writeFile(\n envPath,\n `# X-Force environment variables\\n# This file is loaded automatically by xforce CLI\\n# IMPORTANT: Do not commit this file to git\\n\\nGITHUB_TOKEN=\\nXFORCE_WEBHOOK_SECRET=\\n`,\n \"utf-8\",\n );\n created.push(\".env.xforce\");\n }\n\n // 3. Ensure .env.xforce is in .gitignore\n const gitignorePath = join(targetDir, \".gitignore\");\n let gitignoreContent = \"\";\n try {\n gitignoreContent = await readFile(gitignorePath, \"utf-8\");\n } catch {\n // no .gitignore yet\n }\n if (!gitignoreContent.split(\"\\n\").some((line) => line.trim() === \".env.xforce\")) {\n const separator = gitignoreContent && !gitignoreContent.endsWith(\"\\n\") ? \"\\n\" : \"\";\n await writeFile(gitignorePath, gitignoreContent + separator + \".env.xforce\\n\", \"utf-8\");\n if (gitignoreContent) {\n // appended to existing\n } else {\n created.push(\".gitignore\");\n }\n }\n\n // 4. Write xforce.config.yaml\n const configPath = join(targetDir, \"xforce.config.yaml\");\n if (await fileExists(configPath)) {\n skipped.push(\"xforce.config.yaml\");\n } else {\n await writeFile(configPath, configTemplate({\n repoOwner: owner,\n repoName: name,\n defaultBranch,\n testCommand,\n buildCommand: params.buildCommand,\n lintCommand: params.lintCommand,\n runCommand: params.runCommand,\n }), \"utf-8\");\n created.push(\"xforce.config.yaml\");\n }\n\n spinner.succeed(\"X-Force initialized\");\n console.log();\n\n if (created.length > 0) {\n console.log(chalk.green(\" Created:\"));\n for (const file of created) {\n console.log(chalk.green(` + ${file}`));\n }\n }\n\n if (skipped.length > 0) {\n console.log(chalk.dim(\" Skipped (already exists):\"));\n for (const file of skipped) {\n console.log(chalk.dim(` - ${file}`));\n }\n }\n\n console.log();\n console.log(chalk.bold(\" Next steps:\"));\n console.log(` 1. Edit ${chalk.cyan(\"xforce.config.yaml\")} with your repo details`);\n console.log(` 2. Fill in your keys in ${chalk.cyan(\".env.xforce\")}`);\n console.log(` 3. Run ${chalk.cyan(\"xforce serve\")} to start the webhook server`);\n console.log(` 4. Configure a GitHub webhook pointing to your server`);\n console.log(` 5. Create an issue, add the ${chalk.cyan(\"xforce:ready\")} label`);\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n spinner.fail(chalk.red(`Init failed: ${message}`));\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\nimport { readRecords, summarize } from \"../../tracking/cost-tracker.js\";\nimport type { PipelineRunRecord, CostSummary } from \"../../core/types.js\";\n\nexport interface CostsCommandOptions {\n repo?: string;\n since?: string;\n until?: string;\n detailed?: boolean;\n json?: boolean;\n}\n\nfunction formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds}s`;\n}\n\nfunction formatCost(usd: number): string {\n return `$${usd.toFixed(4)}`;\n}\n\nfunction printSummary(summary: CostSummary): void {\n console.log(chalk.bold(\"\\nCost Summary\"));\n console.log(\"─\".repeat(50));\n console.log(` Total runs: ${summary.totalRuns}`);\n console.log(` Successful: ${chalk.green(summary.successfulRuns.toString())}`);\n console.log(` Failed: ${chalk.red(summary.failedRuns.toString())}`);\n console.log(` Total cost: ${chalk.yellow(formatCost(summary.totalCostUsd))}`);\n console.log(` Avg cost/run: ${formatCost(summary.avgCostPerRun)}`);\n console.log(` Avg duration: ${formatDuration(summary.avgDurationMs)}`);\n\n const repos = Object.entries(summary.costByRepo);\n if (repos.length > 0) {\n console.log(chalk.bold(\"\\nCost by Repository\"));\n console.log(\"─\".repeat(50));\n for (const [repo, cost] of repos.sort((a, b) => b[1] - a[1])) {\n console.log(` ${repo.padEnd(35)} ${formatCost(cost)}`);\n }\n }\n\n console.log();\n}\n\nfunction printDetailed(records: PipelineRunRecord[]): void {\n console.log(chalk.bold(\"\\nPipeline Runs\"));\n console.log(\"─\".repeat(90));\n console.log(\n chalk.dim(\n \" Date\".padEnd(14) +\n \"Repo\".padEnd(25) +\n \"Issue\".padEnd(8) +\n \"Status\".padEnd(12) +\n \"Cost\".padEnd(12) +\n \"Duration\".padEnd(12) +\n \"Cycles\",\n ),\n );\n console.log(\"─\".repeat(90));\n\n for (const r of records.sort((a, b) => b.startedAt.localeCompare(a.startedAt))) {\n const date = new Date(r.startedAt).toISOString().slice(0, 10);\n const status = r.status === \"completed\" ? chalk.green(\"completed\") : chalk.red(\"failed\");\n console.log(\n ` ${date.padEnd(14)}${r.repo.padEnd(25)}#${String(r.issueNumber).padEnd(7)}${status.padEnd(21)}${formatCost(r.totalCostUsd).padEnd(12)}${formatDuration(r.durationMs).padEnd(12)}${r.reviewCycles}`,\n );\n }\n\n console.log();\n}\n\nexport async function costsCommand(options: CostsCommandOptions): Promise<void> {\n const filter = {\n repo: options.repo,\n since: options.since ? new Date(options.since) : new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n until: options.until ? new Date(options.until) : undefined,\n };\n\n const records = await readRecords(filter);\n\n if (options.json) {\n const summary = summarize(records);\n console.log(JSON.stringify({ summary, records: options.detailed ? records : undefined }, null, 2));\n return;\n }\n\n if (records.length === 0) {\n console.log(chalk.dim(\"\\nNo pipeline runs found for the specified period.\\n\"));\n return;\n }\n\n const summary = summarize(records);\n printSummary(summary);\n\n if (options.detailed) {\n printDetailed(records);\n }\n}\n","import chalk from \"chalk\";\nimport { loadConfig } from \"../../core/config.js\";\nimport { createWebhookServer } from \"../../server/webhook.js\";\n\nexport async function serveCommand(params: {\n port: number;\n host: string;\n secret?: string;\n configPath?: string;\n maxQueueSize?: number;\n}): Promise<void> {\n const secret = params.secret ?? process.env.XFORCE_WEBHOOK_SECRET;\n if (!secret) {\n console.error(\n chalk.red(\"Webhook secret is required. Use --secret or set XFORCE_WEBHOOK_SECRET.\"),\n );\n process.exit(1);\n }\n\n let config;\n try {\n config = loadConfig(params.configPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red(`Failed to load config: ${message}`));\n process.exit(1);\n }\n\n const server = createWebhookServer(config, {\n port: params.port,\n host: params.host,\n secret,\n maxQueueSize: params.maxQueueSize,\n });\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log(chalk.dim(\"\\nShutting down...\"));\n await server.stop();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await server.start();\n\n const addr = server.address();\n const url = addr ? `http://${addr.host}:${addr.port}` : `http://${params.host}:${params.port}`;\n\n console.log();\n console.log(chalk.bold(\"X-Force Webhook Server\"));\n console.log();\n console.log(` ${chalk.bold(\"URL:\")} ${url}`);\n console.log(` ${chalk.bold(\"Ready label:\")} ${config.defaults.labels.ready}`);\n console.log(` ${chalk.bold(\"Repos:\")} ${config.repos.map((r) => `${r.owner}/${r.name}`).join(\", \")}`);\n console.log();\n console.log(chalk.dim(\"Endpoints:\"));\n console.log(chalk.dim(` GET ${url}/health — health check`));\n console.log(chalk.dim(` GET ${url}/status — queue status`));\n console.log(chalk.dim(` POST ${url}/webhook — GitHub webhook receiver`));\n console.log();\n console.log(chalk.dim(\"Configure your GitHub repo webhook:\"));\n console.log(chalk.dim(` Payload URL: ${url}/webhook`));\n console.log(chalk.dim(` Content type: application/json`));\n console.log(chalk.dim(` Secret: (your webhook secret)`));\n console.log(chalk.dim(` Events: Issues`));\n console.log();\n console.log(chalk.green(\"Listening for webhook events... (Ctrl+C to stop)\"));\n}\n","import { createServer, type IncomingMessage, type ServerResponse, type Server } from \"node:http\";\nimport crypto from \"node:crypto\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport { runPipeline } from \"../pipeline/orchestrator.js\";\nimport { JobQueue, type QueueStatus, type Job } from \"./queue.js\";\nimport type { XForceConfig } from \"../core/types.js\";\n\nconst log = createChildLogger(\"webhook-server\");\n\nconst MAX_BODY_SIZE = 1_048_576; // 1MB\n\nexport interface WebhookServerOptions {\n port: number;\n host: string;\n secret: string;\n maxQueueSize?: number;\n historySize?: number;\n}\n\nexport interface WebhookServer {\n start(): Promise<void>;\n stop(): Promise<void>;\n getQueueStatus(): QueueStatus;\n address(): { host: string; port: number } | null;\n}\n\nfunction readBody(req: IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > MAX_BODY_SIZE) {\n req.destroy();\n reject(new Error(\"Payload too large\"));\n return;\n }\n chunks.push(chunk);\n });\n\n req.on(\"end\", () => resolve(Buffer.concat(chunks)));\n req.on(\"error\", reject);\n });\n}\n\nfunction verifySignature(payload: Buffer, signature: string, secret: string): boolean {\n const expected = \"sha256=\" + crypto.createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n if (expected.length !== signature.length) return false;\n return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));\n}\n\nfunction sendJson(res: ServerResponse, statusCode: number, body: unknown): void {\n res.writeHead(statusCode, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n}\n\nexport function createWebhookServer(\n config: XForceConfig,\n options: WebhookServerOptions,\n): WebhookServer {\n const startTime = Date.now();\n const readyLabel = config.defaults.labels.ready;\n\n const queue = new JobQueue(\n async (job: Job) => {\n // Look up localPath from repo config\n const repoConf = config.repos.find((r) => r.owner === job.owner && r.name === job.repo);\n return runPipeline({\n repoOwner: job.owner,\n repoName: job.repo,\n issueNumber: job.issueNumber,\n config,\n localDir: repoConf?.localPath,\n });\n },\n {\n maxSize: options.maxQueueSize ?? 10,\n historySize: options.historySize ?? 50,\n },\n );\n\n function handleHealth(_req: IncomingMessage, res: ServerResponse): void {\n sendJson(res, 200, {\n status: \"ok\",\n uptime: Math.floor((Date.now() - startTime) / 1000),\n });\n }\n\n function handleStatus(_req: IncomingMessage, res: ServerResponse): void {\n sendJson(res, 200, queue.getStatus());\n }\n\n async function handleWebhook(req: IncomingMessage, res: ServerResponse): Promise<void> {\n // Read body\n let body: Buffer;\n try {\n body = await readBody(req);\n } catch {\n sendJson(res, 413, { error: \"Payload too large\" });\n return;\n }\n\n // Verify signature\n const signature = req.headers[\"x-hub-signature-256\"] as string | undefined;\n if (!signature) {\n sendJson(res, 401, { error: \"Missing signature\" });\n return;\n }\n\n if (!verifySignature(body, signature, options.secret)) {\n sendJson(res, 401, { error: \"Invalid signature\" });\n return;\n }\n\n // Parse JSON\n let payload: any;\n try {\n payload = JSON.parse(body.toString(\"utf-8\"));\n } catch {\n sendJson(res, 400, { error: \"Invalid JSON\" });\n return;\n }\n\n // Filter: event type\n const event = req.headers[\"x-github-event\"] as string | undefined;\n if (event !== \"issues\") {\n sendJson(res, 200, { ignored: true, reason: `Event type \"${event}\" not handled` });\n return;\n }\n\n // Filter: action + label\n if (payload.action === \"labeled\") {\n // Newly labeled — check if it's the ready label\n const labelName = payload.label?.name;\n if (labelName !== readyLabel) {\n sendJson(res, 200, { ignored: true, reason: `Label \"${labelName}\" does not match ready label \"${readyLabel}\"` });\n return;\n }\n } else if (payload.action === \"reopened\") {\n // Reopened — check if the ready label is already on the issue\n const labels = payload.issue?.labels as Array<{ name: string }> | undefined;\n const hasReadyLabel = labels?.some((l) => l.name === readyLabel);\n if (!hasReadyLabel) {\n sendJson(res, 200, { ignored: true, reason: `Reopened issue does not have \"${readyLabel}\" label` });\n return;\n }\n } else {\n sendJson(res, 200, { ignored: true, reason: `Action \"${payload.action}\" not handled` });\n return;\n }\n\n // Extract repo info\n const owner = payload.repository?.owner?.login as string | undefined;\n const repo = payload.repository?.name as string | undefined;\n const issueNumber = payload.issue?.number as number | undefined;\n const issueUrl = payload.issue?.html_url as string | undefined;\n\n if (!owner || !repo || !issueNumber || !issueUrl) {\n sendJson(res, 400, { error: \"Missing required fields in payload\" });\n return;\n }\n\n // Validate repo is configured\n const repoConfigured = config.repos.some((r) => r.owner === owner && r.name === repo);\n if (!repoConfigured) {\n sendJson(res, 422, { error: `Repository ${owner}/${repo} not configured` });\n return;\n }\n\n // Enqueue\n try {\n const job = queue.enqueue({ owner, repo, issueNumber, issueUrl });\n log.info(\n { jobId: job.id, owner, repo, issueNumber },\n \"Webhook accepted, job enqueued\",\n );\n sendJson(res, 202, { accepted: true, jobId: job.id, position: queue.size });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (message.includes(\"already queued\")) {\n sendJson(res, 409, { error: message });\n } else if (message.includes(\"Queue is full\")) {\n sendJson(res, 503, { error: message });\n } else {\n sendJson(res, 500, { error: message });\n }\n }\n }\n\n const server: Server = createServer(async (req, res) => {\n const method = req.method ?? \"GET\";\n const url = req.url ?? \"/\";\n\n log.debug({ method, url }, \"Request received\");\n\n try {\n if (method === \"GET\" && url === \"/health\") {\n handleHealth(req, res);\n } else if (method === \"GET\" && url === \"/status\") {\n handleStatus(req, res);\n } else if (method === \"POST\" && url === \"/webhook\") {\n await handleWebhook(req, res);\n } else {\n sendJson(res, 404, { error: \"Not found\" });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error({ error: message }, \"Request handler error\");\n if (!res.headersSent) {\n sendJson(res, 500, { error: \"Internal server error\" });\n }\n }\n });\n\n return {\n start(): Promise<void> {\n return new Promise((resolve, reject) => {\n server.listen(options.port, options.host, () => {\n log.info({ port: options.port, host: options.host }, \"Webhook server started\");\n resolve();\n });\n server.on(\"error\", reject);\n });\n },\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n server.close(() => {\n log.info(\"Webhook server stopped\");\n resolve();\n });\n });\n },\n\n getQueueStatus(): QueueStatus {\n return queue.getStatus();\n },\n\n address(): { host: string; port: number } | null {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") return null;\n return { host: addr.address, port: addr.port };\n },\n };\n}\n","import { nanoid } from \"nanoid\";\nimport { createChildLogger } from \"../core/logger.js\";\nimport type { PipelineState } from \"../core/types.js\";\n\nconst log = createChildLogger(\"queue\");\n\nexport type JobStatus = \"pending\" | \"running\" | \"completed\" | \"failed\";\n\nexport interface Job {\n id: string;\n owner: string;\n repo: string;\n issueNumber: number;\n issueUrl: string;\n status: JobStatus;\n result?: PipelineState;\n error?: string;\n enqueuedAt: Date;\n startedAt?: Date;\n completedAt?: Date;\n}\n\nexport interface QueueStatus {\n active: Job | null;\n pending: Job[];\n completed: Job[];\n totalProcessed: number;\n}\n\nexport interface QueueOptions {\n maxSize: number;\n historySize: number;\n}\n\nconst DEFAULT_OPTIONS: QueueOptions = {\n maxSize: 10,\n historySize: 50,\n};\n\nexport class JobQueue {\n private pending: Job[] = [];\n private active: Job | null = null;\n private completed: Job[] = [];\n private totalProcessed = 0;\n private processing = false;\n private readonly options: QueueOptions;\n private readonly processor: (job: Job) => Promise<PipelineState>;\n\n constructor(\n processor: (job: Job) => Promise<PipelineState>,\n options?: Partial<QueueOptions>,\n ) {\n this.processor = processor;\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n enqueue(params: {\n owner: string;\n repo: string;\n issueNumber: number;\n issueUrl: string;\n }): Job {\n if (this.pending.length >= this.options.maxSize) {\n throw new Error(`Queue is full (max ${this.options.maxSize})`);\n }\n\n // Check for duplicate\n const isDuplicate =\n this.isDuplicateIn(this.pending, params) ||\n (this.active &&\n this.active.owner === params.owner &&\n this.active.repo === params.repo &&\n this.active.issueNumber === params.issueNumber);\n\n if (isDuplicate) {\n throw new Error(\n `Issue ${params.owner}/${params.repo}#${params.issueNumber} is already queued or active`,\n );\n }\n\n const job: Job = {\n id: nanoid(12),\n owner: params.owner,\n repo: params.repo,\n issueNumber: params.issueNumber,\n issueUrl: params.issueUrl,\n status: \"pending\",\n enqueuedAt: new Date(),\n };\n\n this.pending.push(job);\n log.info(\n { jobId: job.id, owner: job.owner, repo: job.repo, issue: job.issueNumber },\n \"Job enqueued\",\n );\n\n // Kick off processing (non-blocking)\n void this.processNext();\n\n return job;\n }\n\n getStatus(): QueueStatus {\n return {\n active: this.active,\n pending: [...this.pending],\n completed: [...this.completed],\n totalProcessed: this.totalProcessed,\n };\n }\n\n getJob(id: string): Job | undefined {\n if (this.active?.id === id) return this.active;\n return (\n this.pending.find((j) => j.id === id) ??\n this.completed.find((j) => j.id === id)\n );\n }\n\n get size(): number {\n return this.pending.length;\n }\n\n get isFull(): boolean {\n return this.pending.length >= this.options.maxSize;\n }\n\n private isDuplicateIn(\n jobs: Job[],\n params: { owner: string; repo: string; issueNumber: number },\n ): boolean {\n return jobs.some(\n (j) =>\n j.owner === params.owner &&\n j.repo === params.repo &&\n j.issueNumber === params.issueNumber,\n );\n }\n\n private async processNext(): Promise<void> {\n if (this.processing || this.pending.length === 0) return;\n this.processing = true;\n\n const job = this.pending.shift()!;\n job.status = \"running\";\n job.startedAt = new Date();\n this.active = job;\n\n log.info(\n { jobId: job.id, owner: job.owner, repo: job.repo, issue: job.issueNumber },\n \"Processing job\",\n );\n\n try {\n const result = await this.processor(job);\n job.status = \"completed\";\n job.result = result;\n } catch (error) {\n job.status = \"failed\";\n job.error = error instanceof Error ? error.message : String(error);\n log.error(\n { jobId: job.id, error: job.error },\n \"Job failed\",\n );\n } finally {\n job.completedAt = new Date();\n this.active = null;\n this.totalProcessed++;\n\n this.completed.unshift(job);\n if (this.completed.length > this.options.historySize) {\n this.completed = this.completed.slice(0, this.options.historySize);\n }\n\n this.processing = false;\n\n log.info(\n { jobId: job.id, status: job.status, totalProcessed: this.totalProcessed },\n \"Job finished\",\n );\n\n // Process next job in queue\n void this.processNext();\n }\n }\n}\n"],"mappings":"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","names":["ora","readFileSync","resolve","resolve","resolve","resolve","readFileSync","log","repoGit","log","log","query","z","log","z","query","query","z","log","z","extractJSON","query","query","z","log","z","extractJSON","query","log","log","log","log","join","log","join","log","runCommand","ora","ora","chalk","ora","chalk","join","resolve","mkdir","writeFile","readFile","access","ora","chalk","chalk","chalk","summary","chalk","nanoid","log","nanoid","log","resolve","chalk","runCommand"]}