@neuravim/aiden 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.fr.md +204 -0
- package/README.md +208 -0
- package/dist/index.js +7483 -0
- package/dist/index.js.map +1 -0
- package/package.json +85 -0
- package/templates/aiden.config.yaml +46 -0
- package/templates/rules/coding-standards.md +29 -0
- package/templates/skills/adr-enforcer/instructions.md +66 -0
- package/templates/skills/adr-enforcer/skill.yaml +14 -0
- package/templates/skills/adversarial-review/instructions.md +33 -0
- package/templates/skills/adversarial-review/skill.yaml +11 -0
- package/templates/skills/api-design-restful/instructions.md +74 -0
- package/templates/skills/api-design-restful/skill.yaml +16 -0
- package/templates/skills/changelog-gen/instructions.md +59 -0
- package/templates/skills/changelog-gen/skill.yaml +14 -0
- package/templates/skills/code-review-strict/instructions.md +13 -0
- package/templates/skills/code-review-strict/skill.yaml +8 -0
- package/templates/skills/compliance-rgpd/instructions.md +18 -0
- package/templates/skills/compliance-rgpd/skill.yaml +12 -0
- package/templates/skills/dead-code-detector/instructions.md +38 -0
- package/templates/skills/dead-code-detector/skill.yaml +7 -0
- package/templates/skills/dependency-audit/instructions.md +43 -0
- package/templates/skills/dependency-audit/skill.yaml +17 -0
- package/templates/skills/hipaa-guard/instructions.md +62 -0
- package/templates/skills/hipaa-guard/skill.yaml +23 -0
- package/templates/skills/iso-27001/instructions.md +54 -0
- package/templates/skills/iso-27001/skill.yaml +10 -0
- package/templates/skills/jira-sync/instructions.md +10 -0
- package/templates/skills/jira-sync/skill.yaml +18 -0
- package/templates/skills/linear-sync/instructions.md +39 -0
- package/templates/skills/linear-sync/skill.yaml +22 -0
- package/templates/skills/naming-conventions/instructions.md +45 -0
- package/templates/skills/naming-conventions/skill.yaml +16 -0
- package/templates/skills/nestjs-patterns/instructions.md +55 -0
- package/templates/skills/nestjs-patterns/skill.yaml +12 -0
- package/templates/skills/owasp-check/instructions.md +71 -0
- package/templates/skills/owasp-check/skill.yaml +20 -0
- package/templates/skills/react-best-practices/instructions.md +59 -0
- package/templates/skills/react-best-practices/skill.yaml +12 -0
- package/templates/skills/secret-scan/instructions.md +44 -0
- package/templates/skills/secret-scan/skill.yaml +11 -0
- package/templates/skills/slack-notify/instructions.md +45 -0
- package/templates/skills/slack-notify/skill.yaml +19 -0
- package/templates/skills/test-coverage-enforcer/instructions.md +42 -0
- package/templates/skills/test-coverage-enforcer/skill.yaml +18 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/init.ts","../src/utils/fs-helpers.ts","../src/utils/project-scanner.ts","../src/cli/commands/flash.ts","../src/cli/bootstrap.ts","../src/config/config-loader.ts","../src/types/index.ts","../src/config/config.schema.ts","../src/memory/scoped-memory.ts","../src/config/defaults.ts","../src/providers/provider-registry.ts","../src/providers/router.ts","../src/providers/subprocess.ts","../src/providers/adapters/claude-code.ts","../src/providers/adapters/gemini.ts","../src/providers/adapters/copilot.ts","../src/providers/adapters/opencode.ts","../src/providers/adapters/codex.ts","../src/providers/adapters/api.ts","../src/providers/provider-factory.ts","../src/memory/context-store.ts","../src/utils/file-lock.ts","../src/memory/decisions-log.ts","../src/memory/metrics-collector.ts","../src/utils/logger.ts","../src/core/orchestrator.ts","../src/core/token-budget.ts","../src/core/context-compressor.ts","../src/providers/prompt-sanitizer.ts","../src/agents/personas.ts","../src/i18n/labels.ts","../src/agents/base-agent.ts","../src/core/mode-detector.ts","../src/core/circuit-breaker.ts","../src/core/quality-gate.ts","../src/core/objective-reminder.ts","../src/agents/lead.ts","../src/artefacts/artefact.ts","../src/utils/yaml-helpers.ts","../src/artefacts/template-engine.ts","../src/utils/slugify.ts","../src/agents/elicitation-techniques.ts","../src/agents/analyst.ts","../src/agents/planner.ts","../src/agents/dev.ts","../src/agents/qa.ts","../src/agents/docops.ts","../src/core/feature-state.ts","../src/rules/rules-loader.ts","../src/rules/rules-injector.ts","../src/skills/skill-loader.ts","../src/skills/skill-injector.ts","../src/agents/agent-profiles.ts","../src/hooks/hook-runner.ts","../src/core/trace/trace-collector.ts","../src/core/trace/trace-store.ts","../src/core/trace/trace-hook-bridge.ts","../src/core/trace/trace-timeline.ts","../src/core/trace/trace-live.ts","../src/reporting/issue-url.ts","../src/cli/commands/standard.ts","../src/cli/commands/enterprise.ts","../src/cli/commands/status.ts","../src/cli/commands/resume.ts","../src/cli/commands/abort.ts","../src/cli/commands/agent.ts","../src/cli/commands/provider.ts","../src/cli/commands/metrics.ts","../src/cli/commands/config.ts","../src/cli/commands/rules.ts","../src/cli/commands/skills.ts","../src/skills/skill-registry.ts","../src/skills/skill-errors.ts","../src/skills/skill-packs.ts","../src/cli/commands/retex.ts","../src/memory/retex-store.ts","../src/cli/commands/template.ts","../src/cli/commands/trace.ts","../src/core/trace/trace-diagram.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { createInitCommand } from './commands/init.js';\nimport { createFlashCommand } from './commands/flash.js';\nimport { createStandardCommand } from './commands/standard.js';\nimport { createEnterpriseCommand } from './commands/enterprise.js';\nimport { createStatusCommand } from './commands/status.js';\nimport { createResumeCommand } from './commands/resume.js';\nimport { createAbortCommand } from './commands/abort.js';\nimport { createAgentCommand } from './commands/agent.js';\nimport { createProviderCommand } from './commands/provider.js';\nimport { createMetricsCommand } from './commands/metrics.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createRulesCommand } from './commands/rules.js';\nimport { createSkillsCommand } from './commands/skills.js';\nimport { createRetexCommand } from './commands/retex.js';\nimport { createTemplateCommand } from './commands/template.js';\nimport { createTraceCommand } from './commands/trace.js';\nimport { reportCrash } from '../reporting/issue-url.js';\nimport { createLogger } from '../utils/logger.js';\n\ndeclare const __AIDEN_VERSION__: string;\n\nprocess.on('uncaughtException', (err) => {\n reportCrash(createLogger('error'), {\n error: err,\n command: process.argv[2],\n aidenVersion: typeof __AIDEN_VERSION__ !== 'undefined' ? __AIDEN_VERSION__ : undefined,\n argv: process.argv.slice(2),\n extra: { origin: 'uncaughtException' },\n });\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n reportCrash(createLogger('error'), {\n error: reason,\n command: process.argv[2],\n aidenVersion: typeof __AIDEN_VERSION__ !== 'undefined' ? __AIDEN_VERSION__ : undefined,\n argv: process.argv.slice(2),\n extra: { origin: 'unhandledRejection' },\n });\n process.exit(1);\n});\n\nconst program = new Command();\n\nprogram\n .name('aiden')\n .description('AIDEN — AI-Driven Engineering: CLI framework for AI-assisted development')\n .version(__AIDEN_VERSION__);\n\nprogram.addCommand(createInitCommand());\nprogram.addCommand(createFlashCommand());\nprogram.addCommand(createStandardCommand());\nprogram.addCommand(createEnterpriseCommand());\nprogram.addCommand(createStatusCommand());\nprogram.addCommand(createResumeCommand());\nprogram.addCommand(createAbortCommand());\nprogram.addCommand(createAgentCommand());\nprogram.addCommand(createProviderCommand());\nprogram.addCommand(createMetricsCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createRulesCommand());\nprogram.addCommand(createSkillsCommand());\nprogram.addCommand(createRetexCommand());\nprogram.addCommand(createTemplateCommand());\nprogram.addCommand(createTraceCommand());\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { join } from 'node:path';\nimport { writeFile } from 'node:fs/promises';\nimport { ensureDir, fileExists, writeYaml } from '../../utils/fs-helpers.js';\nimport { scanProject } from '../../utils/project-scanner.js';\n\nconst DEFAULT_CODING_STANDARDS = `# Coding Standards\n\n## General\n- Follow project conventions\n- Write meaningful commit messages (Conventional Commits)\n- Keep functions small and focused\n\n## TypeScript\n- Use strict mode\n- No \\`any\\` types\n- Prefer named exports\n\n## Testing\n- Write unit tests for business logic\n- Use descriptive test names\n`;\n\nconst DEFAULT_DECISIONS_HEADER = '';\n\nexport function createInitCommand(): Command {\n return new Command('init')\n .description('Initialize AIDEN in the current project')\n .option('--enterprise', 'Include enterprise templates and rules')\n .action(async (options: { enterprise?: boolean }) => {\n const projectDir = process.cwd();\n const aidenDir = join(projectDir, '.aiden');\n\n if (await fileExists(join(aidenDir, 'aiden.config.yaml'))) {\n // eslint-disable-next-line no-console\n console.log('AIDEN already initialized in this project.');\n return;\n }\n\n // Create directory structure\n await ensureDir(aidenDir);\n await ensureDir(join(aidenDir, 'memory'));\n await ensureDir(join(aidenDir, 'rules'));\n await ensureDir(join(aidenDir, 'templates'));\n await ensureDir(join(aidenDir, 'features'));\n\n // Create default config\n const configData = {\n project: projectDir.split(/[/\\\\]/).pop() ?? 'my-project',\n provider: 'claude-code',\n mode: options.enterprise ? 'enterprise' : 'standard',\n lang: 'fr',\n routing: {\n strategy: 'prefer',\n fallback: ['claude-code', 'gemini', 'opencode', 'codex', 'copilot'],\n },\n budget: {\n monthlyLimit: 500000,\n alertAt: 80,\n perFeature: {\n flash: 5000,\n standard: 20000,\n enterprise: 100000,\n },\n },\n };\n await writeYaml(join(aidenDir, 'aiden.config.yaml'), configData);\n\n // Create default rules file\n await writeFile(\n join(aidenDir, 'rules', 'coding-standards.md'),\n DEFAULT_CODING_STANDARDS,\n 'utf-8',\n );\n\n // Scan project for tech stack\n const projectInfo = await scanProject(projectDir);\n\n // Initialize empty decisions log and context\n await writeFile(\n join(aidenDir, 'memory', 'decisions.jsonl'),\n DEFAULT_DECISIONS_HEADER,\n 'utf-8',\n );\n await writeYaml(join(aidenDir, 'memory', 'context.yaml'), {\n project: {\n name: projectInfo.name,\n techStack: projectInfo.techStack,\n architecture: projectInfo.architecture,\n ci: projectInfo.ci,\n ...(projectInfo.packageManager ? { packageManager: projectInfo.packageManager } : {}),\n ...(projectInfo.databases ? { databases: projectInfo.databases } : {}),\n ...(projectInfo.monorepo ? { monorepo: projectInfo.monorepo } : {}),\n },\n activeFeatures: {},\n globalConstraints: [],\n });\n\n if (options.enterprise) {\n // Create enterprise-specific directories\n await ensureDir(join(aidenDir, 'rules', 'compliance'));\n await writeFile(\n join(aidenDir, 'rules', 'compliance', 'security.md'),\n '# Security Rules\\n\\n- All inputs must be validated\\n- No secrets in source code\\n- Dependencies must be audited\\n',\n 'utf-8',\n );\n }\n\n // eslint-disable-next-line no-console\n console.log(`AIDEN initialized in ${aidenDir}`);\n // eslint-disable-next-line no-console\n console.log(` Config: .aiden/aiden.config.yaml`);\n // eslint-disable-next-line no-console\n console.log(` Rules: .aiden/rules/coding-standards.md`);\n // eslint-disable-next-line no-console\n console.log(` Memory: .aiden/memory/`);\n // eslint-disable-next-line no-console\n console.log(` Stack: ${projectInfo.techStack.join(', ') || 'none detected'}`);\n if (projectInfo.architecture.length > 0) {\n // eslint-disable-next-line no-console\n console.log(` Arch: ${projectInfo.architecture.join(', ')}`);\n }\n if (projectInfo.ci.length > 0) {\n // eslint-disable-next-line no-console\n console.log(` CI: ${projectInfo.ci.join(', ')}`);\n }\n if (projectInfo.packageManager) {\n // eslint-disable-next-line no-console\n console.log(` PM: ${projectInfo.packageManager}`);\n }\n if (projectInfo.databases && projectInfo.databases.length > 0) {\n // eslint-disable-next-line no-console\n console.log(` DB: ${projectInfo.databases.join(', ')}`);\n }\n if (projectInfo.monorepo) {\n // eslint-disable-next-line no-console\n console.log(` Mono: ${projectInfo.monorepo}`);\n }\n if (options.enterprise) {\n // eslint-disable-next-line no-console\n console.log(' Enterprise mode enabled with compliance rules.');\n }\n });\n}\n","import { mkdir, readFile, writeFile, access } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport yaml from 'js-yaml';\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readYaml<T>(filePath: string): Promise<T> {\n const content = await readFile(filePath, 'utf-8');\n return yaml.load(content) as T;\n}\n\nexport async function writeYaml(filePath: string, data: unknown): Promise<void> {\n await ensureDir(dirname(filePath));\n const content = yaml.dump(data, { lineWidth: 120, noRefs: true });\n await writeFile(filePath, content, 'utf-8');\n}\n\nexport async function readText(filePath: string): Promise<string> {\n return readFile(filePath, 'utf-8');\n}\n\nexport async function writeText(filePath: string, content: string): Promise<void> {\n await ensureDir(dirname(filePath));\n await writeFile(filePath, content, 'utf-8');\n}\n","import { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { fileExists } from './fs-helpers.js';\n\nexport interface ProjectConventions {\n naming?: string;\n testing?: string;\n imports?: string;\n stateManagement?: string;\n apiPattern?: string;\n}\n\nexport interface ProjectPatterns {\n errorHandling?: string;\n logging?: string;\n validation?: string;\n authentication?: string;\n}\n\nexport interface ProjectInfo {\n name: string;\n techStack: string[];\n architecture: string[];\n ci: string[];\n packageManager?: string;\n databases?: string[];\n monorepo?: string;\n conventions?: ProjectConventions;\n patterns?: ProjectPatterns;\n criticalPaths?: string[];\n}\n\nexport async function scanProject(projectDir: string): Promise<ProjectInfo> {\n const name = projectDir.split(/[/\\\\]/).pop() ?? 'unknown';\n const techStack: string[] = [];\n const architecture: string[] = [];\n const ci: string[] = [];\n const databases: string[] = [];\n let packageManager: string | undefined;\n let monorepo: string | undefined;\n\n // Detect package manager from lockfile\n if (await fileExists(join(projectDir, 'pnpm-lock.yaml'))) packageManager = 'pnpm';\n else if (await fileExists(join(projectDir, 'yarn.lock'))) packageManager = 'yarn';\n else if (await fileExists(join(projectDir, 'bun.lockb'))) packageManager = 'bun';\n else if (await fileExists(join(projectDir, 'package-lock.json'))) packageManager = 'npm';\n\n // Detect monorepo\n if (await fileExists(join(projectDir, 'turbo.json'))) monorepo = 'turborepo';\n else if (await fileExists(join(projectDir, 'nx.json'))) monorepo = 'nx';\n else if (await fileExists(join(projectDir, 'lerna.json'))) monorepo = 'lerna';\n else if (await fileExists(join(projectDir, 'pnpm-workspace.yaml'))) monorepo = 'pnpm-workspaces';\n\n // Detect from package.json\n if (await fileExists(join(projectDir, 'package.json'))) {\n try {\n const raw = await readFile(join(projectDir, 'package.json'), 'utf-8');\n const pkg = JSON.parse(raw) as Record<string, Record<string, string> | undefined>;\n const deps = pkg['dependencies'] ?? {};\n const devDeps = pkg['devDependencies'] ?? {};\n\n techStack.push('node');\n if (deps['typescript'] || devDeps['typescript']) techStack.push('typescript');\n\n // Frontend frameworks\n if (deps['react'] || devDeps['react']) techStack.push('react');\n if (deps['next']) techStack.push('next.js');\n if (deps['vue'] || devDeps['vue']) techStack.push('vue');\n if (deps['@angular/core'] || devDeps['@angular/core']) techStack.push('angular');\n if (deps['svelte'] || devDeps['svelte']) techStack.push('svelte');\n if (deps['solid-js']) techStack.push('solid');\n\n // Backend frameworks\n if (deps['express']) techStack.push('express');\n if (deps['fastify']) techStack.push('fastify');\n if (deps['@nestjs/core']) techStack.push('nestjs');\n if (deps['koa']) techStack.push('koa');\n if (deps['hapi'] || deps['@hapi/hapi']) techStack.push('hapi');\n\n // Test frameworks\n if (devDeps['vitest']) techStack.push('vitest');\n if (devDeps['jest']) techStack.push('jest');\n\n // CSS frameworks\n if (devDeps['tailwindcss'] || deps['tailwindcss']) techStack.push('tailwind');\n\n // ORMs / databases\n if (deps['prisma'] || devDeps['prisma']) {\n techStack.push('prisma');\n databases.push('prisma');\n }\n if (deps['typeorm']) {\n techStack.push('typeorm');\n databases.push('typeorm');\n }\n if (deps['sequelize']) {\n techStack.push('sequelize');\n databases.push('sequelize');\n }\n if (deps['drizzle-orm']) {\n techStack.push('drizzle');\n databases.push('drizzle');\n }\n if (deps['pg'] || deps['postgres']) databases.push('postgres');\n if (deps['mysql2'] || deps['mysql']) databases.push('mysql');\n if (deps['redis'] || deps['ioredis']) databases.push('redis');\n if (deps['mongodb'] || deps['mongoose']) databases.push('mongodb');\n } catch {\n techStack.push('node');\n }\n }\n\n // Detect Python\n if (\n (await fileExists(join(projectDir, 'requirements.txt'))) ||\n (await fileExists(join(projectDir, 'pyproject.toml')))\n ) {\n techStack.push('python');\n }\n\n // Detect Go\n if (await fileExists(join(projectDir, 'go.mod'))) {\n techStack.push('go');\n }\n\n // Detect Rust\n if (await fileExists(join(projectDir, 'Cargo.toml'))) {\n techStack.push('rust');\n }\n\n // Detect architecture\n if (\n (await fileExists(join(projectDir, 'docker-compose.yml'))) ||\n (await fileExists(join(projectDir, 'docker-compose.yaml')))\n ) {\n architecture.push('docker-compose');\n // Try to detect databases from docker-compose\n await detectDatabasesFromDockerCompose(projectDir, databases);\n }\n if (await fileExists(join(projectDir, 'Dockerfile'))) {\n architecture.push('docker');\n }\n if (\n (await fileExists(join(projectDir, 'Chart.yaml'))) ||\n (await fileExists(join(projectDir, 'k8s'))) ||\n (await fileExists(join(projectDir, 'kubernetes'))) ||\n (await fileExists(join(projectDir, 'helm')))\n ) {\n architecture.push('kubernetes');\n }\n\n // Detect CI\n if (await fileExists(join(projectDir, '.github', 'workflows'))) ci.push('github-actions');\n if (await fileExists(join(projectDir, '.gitlab-ci.yml'))) ci.push('gitlab-ci');\n if (await fileExists(join(projectDir, 'Jenkinsfile'))) ci.push('jenkins');\n if (await fileExists(join(projectDir, '.circleci'))) ci.push('circleci');\n\n // Detect conventions and patterns\n const conventions = await detectConventions(projectDir, techStack);\n const patterns = await detectPatterns(projectDir);\n\n return {\n name,\n techStack,\n architecture,\n ci,\n packageManager,\n databases: databases.length > 0 ? [...new Set(databases)] : undefined,\n monorepo,\n conventions: hasValues(conventions) ? conventions : undefined,\n patterns: hasValues(patterns) ? patterns : undefined,\n };\n}\n\nasync function detectConventions(\n projectDir: string,\n techStack: string[],\n): Promise<ProjectConventions> {\n const conventions: ProjectConventions = {};\n\n // Detect testing framework from config files\n if (\n (await fileExists(join(projectDir, 'vitest.config.ts'))) ||\n (await fileExists(join(projectDir, 'vitest.config.js')))\n ) {\n conventions.testing = 'vitest';\n } else if (\n (await fileExists(join(projectDir, 'jest.config.ts'))) ||\n (await fileExists(join(projectDir, 'jest.config.js')))\n ) {\n conventions.testing = 'jest';\n }\n\n // Detect naming from tsconfig / eslint\n if (await fileExists(join(projectDir, 'tsconfig.json'))) {\n try {\n const raw = await readFile(join(projectDir, 'tsconfig.json'), 'utf-8');\n if (raw.includes('\"verbatimModuleSyntax\"')) {\n conventions.imports = 'named exports only (verbatimModuleSyntax)';\n }\n } catch {\n // ignore\n }\n }\n\n // Detect state management from deps\n if (techStack.includes('react')) {\n if (await depsContain(projectDir, 'zustand')) conventions.stateManagement = 'zustand';\n else if (\n (await depsContain(projectDir, 'redux')) ||\n (await depsContain(projectDir, '@reduxjs/toolkit'))\n )\n conventions.stateManagement = 'redux';\n else if (await depsContain(projectDir, 'jotai')) conventions.stateManagement = 'jotai';\n else if (await depsContain(projectDir, 'recoil')) conventions.stateManagement = 'recoil';\n }\n\n return conventions;\n}\n\nasync function detectPatterns(projectDir: string): Promise<ProjectPatterns> {\n const patterns: ProjectPatterns = {};\n\n // Detect logging from deps\n if (await depsContain(projectDir, 'winston')) patterns.logging = 'winston';\n else if (await depsContain(projectDir, 'pino')) patterns.logging = 'pino';\n else if (await depsContain(projectDir, 'bunyan')) patterns.logging = 'bunyan';\n\n // Detect validation from deps\n if (await depsContain(projectDir, 'zod')) patterns.validation = 'zod';\n else if (await depsContain(projectDir, 'joi')) patterns.validation = 'joi';\n else if (await depsContain(projectDir, 'yup')) patterns.validation = 'yup';\n else if (await depsContain(projectDir, 'class-validator'))\n patterns.validation = 'class-validator';\n\n // Detect auth from deps\n if ((await depsContain(projectDir, 'jsonwebtoken')) || (await depsContain(projectDir, 'jose'))) {\n patterns.authentication = 'JWT';\n } else if (await depsContain(projectDir, 'passport')) {\n patterns.authentication = 'passport';\n } else if (\n (await depsContain(projectDir, 'next-auth')) ||\n (await depsContain(projectDir, '@auth/core'))\n ) {\n patterns.authentication = 'next-auth';\n }\n\n return patterns;\n}\n\nasync function depsContain(projectDir: string, depName: string): Promise<boolean> {\n try {\n const raw = await readFile(join(projectDir, 'package.json'), 'utf-8');\n const pkg = JSON.parse(raw) as Record<string, Record<string, string> | undefined>;\n return !!(pkg['dependencies']?.[depName] || pkg['devDependencies']?.[depName]);\n } catch {\n return false;\n }\n}\n\nfunction hasValues(obj: object): boolean {\n return Object.values(obj).some((v) => v !== undefined);\n}\n\nasync function detectDatabasesFromDockerCompose(\n projectDir: string,\n databases: string[],\n): Promise<void> {\n const paths = [join(projectDir, 'docker-compose.yml'), join(projectDir, 'docker-compose.yaml')];\n for (const p of paths) {\n if (!(await fileExists(p))) continue;\n try {\n const content = await readFile(p, 'utf-8');\n const lower = content.toLowerCase();\n if (lower.includes('postgres')) databases.push('postgres');\n if (lower.includes('mysql') || lower.includes('mariadb')) databases.push('mysql');\n if (lower.includes('redis')) databases.push('redis');\n if (lower.includes('mongo')) databases.push('mongodb');\n } catch {\n // ignore parse errors\n }\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { bootstrapOrchestrator } from '../bootstrap.js';\nimport { TraceLiveRenderer } from '../../core/trace/trace-live.js';\nimport { reportCrash } from '../../reporting/issue-url.js';\nimport { createLogger } from '../../utils/logger.js';\n\ndeclare const __AIDEN_VERSION__: string;\n\nexport function createFlashCommand(): Command {\n return new Command('flash')\n .description('Run a flash workflow (quick fix, small feature)')\n .argument('<description>', 'Feature or fix description')\n .option('--dry-run', 'Show what would be done without executing')\n .option('--provider <name>', 'Override provider')\n .option('--profile <name>', 'Activate an agent profile / domain playbook')\n .option('--trace', 'Enable workflow tracing')\n .option('--verbose [level]', 'Enable verbose trace output (normal|full)')\n .action(\n async (\n description: string,\n options: {\n dryRun?: boolean;\n provider?: string;\n profile?: string;\n trace?: boolean;\n verbose?: boolean | string;\n },\n ) => {\n if (options.dryRun) {\n // eslint-disable-next-line no-console\n console.log(`[DRY RUN] Flash workflow: \"${description}\"`);\n // eslint-disable-next-line no-console\n console.log('Mode: flash | Agents: lead, dev');\n return;\n }\n\n const spinner = ora(`Starting flash workflow: \"${description}\"`).start();\n\n try {\n const orchestrator = await bootstrapOrchestrator({\n provider: options.provider,\n mode: 'flash',\n profile: options.profile,\n });\n\n const traceEnabled = !!(options.trace || options.verbose);\n const traceListener = options.verbose\n ? new TraceLiveRenderer({\n verbose: options.verbose === 'full' ? 'full' : 'normal',\n colorize: process.stderr.isTTY ?? false,\n })\n : undefined;\n\n if (traceListener) spinner.stop();\n\n spinner.text = 'Running flash workflow...';\n const result = await orchestrator.runFlash(description, {\n trace: traceEnabled,\n traceListener,\n });\n\n if (result.status === 'completed') {\n spinner.succeed(chalk.green(`Flash workflow completed: ${result.feature}`));\n // eslint-disable-next-line no-console\n console.log(\n chalk.dim(` Tokens: ${result.totalTokens} | Duration: ${result.totalDurationMs}ms`),\n );\n } else {\n spinner.fail(chalk.red(`Flash workflow blocked: ${result.feature}`));\n }\n } catch (err) {\n spinner.fail(chalk.red('Flash workflow failed'));\n reportCrash(createLogger('error'), {\n error: err,\n command: 'flash',\n mode: 'flash',\n aidenVersion: typeof __AIDEN_VERSION__ !== 'undefined' ? __AIDEN_VERSION__ : undefined,\n argv: process.argv.slice(2),\n extra: { description },\n });\n process.exitCode = 1;\n }\n },\n );\n}\n","import { join } from 'node:path';\nimport { loadConfig } from '../config/config-loader.js';\nimport { createProviderRegistry } from '../providers/provider-registry.js';\nimport { createRouter } from '../providers/router.js';\nimport { createProviderFromConfig } from '../providers/provider-factory.js';\nimport { createContextStore } from '../memory/context-store.js';\nimport { createDecisionsLog } from '../memory/decisions-log.js';\nimport { createMetricsCollector } from '../memory/metrics-collector.js';\nimport { createLogger } from '../utils/logger.js';\nimport { ensureDir, fileExists } from '../utils/fs-helpers.js';\nimport { Orchestrator } from '../core/orchestrator.js';\nimport type { AidenMode, RoutingStrategy } from '../types/index.js';\n\nexport interface BootstrapOptions {\n provider?: string;\n mode?: AidenMode;\n profile?: string;\n}\n\nexport async function bootstrapOrchestrator(options: BootstrapOptions = {}): Promise<Orchestrator> {\n const projectDir = process.cwd();\n const aidenDir = join(projectDir, '.aiden');\n const memoryDir = join(aidenDir, 'memory');\n\n if (!(await fileExists(join(aidenDir, 'aiden.config.yaml')))) {\n throw new BootstrapError('AIDEN not initialized. Run `aiden init` first.');\n }\n\n await ensureDir(memoryDir);\n\n const config = await loadConfig({\n projectDir,\n cliOverrides: {\n ...(options.provider ? { provider: options.provider } : {}),\n ...(options.mode ? { mode: options.mode } : {}),\n ...(options.profile ? { activeProfile: options.profile } : {}),\n },\n });\n\n const logger = createLogger('info');\n\n // Dynamic provider registration from config\n const registry = createProviderRegistry();\n for (const [name, providerConfig] of Object.entries(config.providers ?? {})) {\n const provider = createProviderFromConfig(name, providerConfig, projectDir);\n if (provider) registry.register(provider);\n }\n\n const router = createRouter(registry, {\n strategy: (config.routing?.strategy ?? 'prefer') as RoutingStrategy,\n preferredProvider: options.provider ?? config.provider,\n fallbackChain: config.routing?.fallback ?? [\n 'claude-code',\n 'gemini',\n 'opencode',\n 'codex',\n 'copilot',\n ],\n });\n\n const contextStore = createContextStore(memoryDir);\n const decisionsLog = createDecisionsLog(memoryDir);\n const metricsCollector = createMetricsCollector(memoryDir);\n\n return new Orchestrator({\n config,\n router,\n registry,\n contextStore,\n decisionsLog,\n metricsCollector,\n logger,\n aidenDir,\n });\n}\n\nexport class BootstrapError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BootstrapError';\n }\n}\n","import { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { AidenConfig } from '../types/index.js';\nimport { validateConfig } from './config.schema.js';\nimport { DEFAULT_CONFIG } from './defaults.js';\nimport { fileExists, readYaml } from '../utils/fs-helpers.js';\n\nexport interface ConfigLoadOptions {\n projectDir?: string;\n featureSlug?: string;\n cliOverrides?: Partial<AidenConfig>;\n}\n\n/**\n * Loads multi-level configuration:\n * 1. AIDEN defaults (built-in)\n * 2. Global enterprise config (~/.aiden/enterprise.config.yaml)\n * 3. Project config (.aiden/aiden.config.yaml)\n * 4. Feature config (.aiden/features/<slug>/.override.yaml)\n * 5. CLI flags (overrides)\n */\nexport async function loadConfig(options: ConfigLoadOptions = {}): Promise<AidenConfig> {\n const { projectDir = process.cwd(), featureSlug, cliOverrides } = options;\n\n let merged: Record<string, unknown> = { ...DEFAULT_CONFIG };\n\n // Level 2: Enterprise config\n const enterprisePath = join(homedir(), '.aiden', 'enterprise.config.yaml');\n if (await fileExists(enterprisePath)) {\n const enterprise = await readYaml<Record<string, unknown>>(enterprisePath);\n merged = deepMerge(merged, enterprise);\n }\n\n // Level 3: Project config\n const projectPath = join(projectDir, '.aiden', 'aiden.config.yaml');\n if (await fileExists(projectPath)) {\n const project = await readYaml<Record<string, unknown>>(projectPath);\n merged = deepMerge(merged, project);\n }\n\n // Level 4: Feature override\n if (featureSlug) {\n const featurePath = join(projectDir, '.aiden', 'features', featureSlug, '.override.yaml');\n if (await fileExists(featurePath)) {\n const feature = await readYaml<Record<string, unknown>>(featurePath);\n merged = deepMerge(merged, feature);\n }\n }\n\n // Level 5: CLI overrides\n if (cliOverrides) {\n merged = deepMerge(merged, stripUndefined(cliOverrides));\n }\n\n return validateConfig(merged);\n}\n\n/**\n * Deep merges two objects. The second object overrides the first.\n */\nexport function deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...target };\n\n for (const key of Object.keys(source)) {\n const targetVal = target[key];\n const sourceVal = source[key];\n\n if (isPlainObject(targetVal) && isPlainObject(sourceVal)) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>,\n );\n } else {\n result[key] = sourceVal;\n }\n }\n\n return result;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction stripUndefined(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * AIDEN — AI-Driven Engineering\n * Global project types\n */\n\nimport { z } from 'zod';\n\n// ============================================================\n// Enums and base types\n// ============================================================\n\n/** AIDEN operating modes */\nexport type AidenMode = 'flash' | 'standard' | 'enterprise';\n\n/** Agent roles */\nexport type AgentRole = 'lead' | 'analyst' | 'planner' | 'dev' | 'qa' | 'docops';\n\n/** Feature state machine states */\nexport type FeatureStatus =\n | 'created'\n | 'analyzing'\n | 'planning'\n | 'ready'\n | 'in_progress'\n | 'in_review'\n | 'documenting'\n | 'completed'\n | 'blocked';\n\n/** Provider routing strategies */\nexport type RoutingStrategy = 'auto' | 'prefer' | 'fixed' | 'cost-optimized';\n\n/** Artefact types */\nexport type ArtefactType =\n | 'brief'\n | 'spec'\n | 'story'\n | 'review'\n | 'change-summary'\n | 'architecture-decision'\n | 'quality-report'\n | 'prfaq';\n\n/** Artefact statuses */\nexport type ArtefactStatus = 'draft' | 'review' | 'approved' | 'implemented';\n\n/** Task types for routing */\nexport type TaskType =\n | 'analysis'\n | 'planning'\n | 'code_gen'\n | 'code_review'\n | 'quick_fix'\n | 'test_gen'\n | 'documentation'\n | 'pr_review';\n\n// ============================================================\n// Zod Schemas (validation runtime)\n// ============================================================\n\nexport const aidenModeSchema = z.enum(['flash', 'standard', 'enterprise']);\n\nexport const agentRoleSchema = z.enum(['lead', 'analyst', 'planner', 'dev', 'qa', 'docops']);\n\nconst agentPersonaOverrideSchema = z\n .object({\n name: z.string().min(1).optional(),\n role: z.string().min(1).optional(),\n traits: z.array(z.string()).optional(),\n expertise: z.array(z.string()).optional(),\n perspective: z.string().min(1).optional(),\n })\n .strict();\n\nexport const agentProfileSchema = z\n .object({\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n recommendedMode: aidenModeSchema.optional(),\n workflowPreset: z.string().min(1).optional(),\n instructions: z.string().optional(),\n skills: z.array(z.string().min(1)).optional(),\n artefacts: z.array(z.string().min(1)).optional(),\n agents: z\n .record(agentRoleSchema, z.union([agentPersonaOverrideSchema, z.literal(false)]))\n .optional(),\n })\n .strict();\n\nexport const featureStatusSchema = z.enum([\n 'created',\n 'analyzing',\n 'planning',\n 'ready',\n 'in_progress',\n 'in_review',\n 'documenting',\n 'completed',\n 'blocked',\n]);\n\nexport const routingStrategySchema = z.enum(['auto', 'prefer', 'fixed', 'cost-optimized']);\n\nexport const artefactTypeSchema = z.enum([\n 'brief',\n 'spec',\n 'story',\n 'review',\n 'change-summary',\n 'architecture-decision',\n 'quality-report',\n 'prfaq',\n]);\n\nexport const artefactStatusSchema = z.enum(['draft', 'review', 'approved', 'implemented']);\n\n// ============================================================\n// Provider\n// ============================================================\n\nexport interface ProviderCapabilities {\n analysis: boolean;\n codeGeneration: boolean;\n codeReview: boolean;\n multiFile: boolean;\n longContext: boolean;\n inlineCompletion: boolean;\n}\n\nexport interface ProviderConfig {\n enabled: boolean;\n command: string;\n model: string;\n maxTokens: number;\n costPer1k: number;\n}\n\nexport interface AidenResponse {\n content: string;\n tokensUsed: number;\n provider: string;\n model: string;\n durationMs: number;\n}\n\nexport interface ReviewCriteria {\n checkSecurity: boolean;\n checkPerformance: boolean;\n checkStyle: boolean;\n checkTests: boolean;\n customRules: string[];\n}\n\nexport interface ReviewResult {\n passed: boolean;\n score: number;\n issues: ReviewIssue[];\n suggestions: string[];\n tokensUsed: number;\n}\n\nexport interface ReviewIssue {\n severity: 'error' | 'warning' | 'info';\n file: string;\n line?: number;\n message: string;\n rule?: string;\n}\n\nexport interface AidenProvider {\n name: string;\n capabilities: ProviderCapabilities;\n generate(prompt: string, context: AidenContext): Promise<AidenResponse>;\n review(code: string, criteria: ReviewCriteria): Promise<ReviewResult>;\n refine(artefact: string, feedback: string): Promise<AidenResponse>;\n estimateTokens(prompt: string): number;\n getCostEstimate(tokens: number): number;\n isAvailable(): Promise<boolean>;\n}\n\n// ============================================================\n// Configuration\n// ============================================================\n\nexport const providerConfigSchema = z.object({\n enabled: z.boolean(),\n command: z.string(),\n model: z.string(),\n maxTokens: z.number().positive(),\n costPer1k: z.number().nonnegative(),\n baseUrl: z.string().optional(),\n apiKey: z.string().optional(),\n});\n\nexport const tokenBudgetConfigSchema = z.object({\n monthlyLimit: z.number().positive(),\n alertAt: z.number().min(0).max(100),\n perFeature: z.object({\n flash: z.number().positive(),\n standard: z.number().positive(),\n enterprise: z.number().positive(),\n }),\n});\n\nexport const hookConfigSchema = z.object({\n command: z.string(),\n onFailure: z.enum(['block', 'warn', 'ignore']).default('warn'),\n requireApproval: z.boolean().default(false),\n});\n\nexport const memoryScopeSchema = z.enum(['user', 'project', 'session', 'task']);\n\nexport const memorySizeSchema = z.union([\n z.enum(['small', 'medium', 'large']),\n z.number().int().positive(),\n]);\n\nexport const memoryLifecycleSchema = z.enum(['ephemeral', 'session', 'ttl', 'persistent']);\n\nexport const memoryWritePolicySchema = z.enum(['never', 'manual', 'suggested', 'automatic']);\n\nexport const memoryReadPolicySchema = z.enum(['never', 'explicit', 'contextual', 'always']);\n\nexport const memorySensitivitySchema = z.enum(['low', 'medium', 'high']);\n\nexport const memorySummarizationSchema = z.enum(['none', 'periodic', 'on_limit', 'on_close']);\n\nexport const memoryScopeConfigSchema = z.object({\n enabled: z.boolean().default(true),\n maxSize: memorySizeSchema.default('small'),\n lifecycle: memoryLifecycleSchema.default('session'),\n writePolicy: memoryWritePolicySchema.default('suggested'),\n readPolicy: memoryReadPolicySchema.default('contextual'),\n sensitivity: memorySensitivitySchema.default('medium'),\n retention: z\n .object({\n ttlMs: z.number().int().positive().optional(),\n maxEntries: z.number().int().positive().optional(),\n })\n .optional(),\n summarization: memorySummarizationSchema.default('on_limit'),\n revalidateBeforeUse: z.boolean().default(false).optional(),\n});\n\nconst defaultMemoryScopes = {\n user: {\n enabled: true,\n maxSize: 'small',\n lifecycle: 'persistent',\n writePolicy: 'suggested',\n readPolicy: 'contextual',\n sensitivity: 'medium',\n summarization: 'on_limit',\n },\n project: {\n enabled: true,\n maxSize: 'medium',\n lifecycle: 'persistent',\n writePolicy: 'suggested',\n readPolicy: 'contextual',\n sensitivity: 'medium',\n summarization: 'periodic',\n revalidateBeforeUse: true,\n },\n session: {\n enabled: true,\n maxSize: 'large',\n lifecycle: 'session',\n writePolicy: 'automatic',\n readPolicy: 'contextual',\n sensitivity: 'medium',\n summarization: 'on_close',\n },\n task: {\n enabled: true,\n maxSize: 'small',\n lifecycle: 'ephemeral',\n writePolicy: 'automatic',\n readPolicy: 'always',\n sensitivity: 'low',\n summarization: 'none',\n },\n} as const;\n\nexport const memoryConfigSchema = z\n .object({\n enabled: z.boolean().default(true),\n scopePrecedence: z.array(memoryScopeSchema).default(['task', 'session', 'project', 'user']),\n scopes: z\n .object({\n user: memoryScopeConfigSchema.default(defaultMemoryScopes.user),\n project: memoryScopeConfigSchema.default(defaultMemoryScopes.project),\n session: memoryScopeConfigSchema.default(defaultMemoryScopes.session),\n task: memoryScopeConfigSchema.default(defaultMemoryScopes.task),\n })\n .strict()\n .default(defaultMemoryScopes),\n })\n .default({\n enabled: true,\n scopePrecedence: ['task', 'session', 'project', 'user'],\n scopes: defaultMemoryScopes,\n });\n\nexport const aidenConfigSchema = z.object({\n project: z.string(),\n provider: z.string().default('claude-code'),\n mode: aidenModeSchema.default('standard'),\n lang: z.string().default('fr'),\n activeProfile: z.string().min(1).optional(),\n agentProfiles: z.record(z.string(), agentProfileSchema).optional(),\n providers: z.record(z.string(), providerConfigSchema).optional(),\n routing: z\n .object({\n strategy: routingStrategySchema.default('prefer'),\n fallback: z.array(z.string()).default([]),\n })\n .optional(),\n budget: tokenBudgetConfigSchema.optional(),\n hooks: z.record(z.string(), z.array(hookConfigSchema)).optional(),\n rules: z.array(z.string()).optional(),\n pipeline: z\n .object({\n maxOutputCharsPerAgent: z.number().positive().default(8000),\n })\n .optional(),\n sanitize: z.boolean().default(true).optional(),\n memory: memoryConfigSchema,\n skills: z\n .object({\n registryUrl: z.string().url().optional(),\n autoUpdate: z.boolean().default(false),\n trustedAuthors: z.array(z.string()).default([]),\n cacheTtl: z.number().positive().default(86_400_000),\n })\n .optional(),\n});\n\nexport type AidenConfig = z.infer<typeof aidenConfigSchema>;\nexport type AgentProfile = z.infer<typeof agentProfileSchema>;\nexport type HookConfig = z.infer<typeof hookConfigSchema>;\nexport type TokenBudgetConfig = z.infer<typeof tokenBudgetConfigSchema>;\nexport type MemoryConfig = z.infer<typeof memoryConfigSchema>;\nexport type MemoryScope = z.infer<typeof memoryScopeSchema>;\nexport type MemoryScopeConfig = z.infer<typeof memoryScopeConfigSchema>;\n\n// ============================================================\n// Context Bus\n// ============================================================\n\nexport interface FeatureContext {\n slug: string;\n name: string;\n state: FeatureStatus;\n mode: AidenMode;\n currentAgent?: AgentRole;\n currentStory?: string;\n objective: string;\n constraints: string[];\n decisions: Decision[];\n blockers: string[];\n tokensUsed: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AidenContext {\n project: {\n name: string;\n techStack: string[];\n architecture: string[];\n ci: string[];\n packageManager?: string;\n databases?: string[];\n monorepo?: string;\n conventions?: {\n naming?: string;\n testing?: string;\n imports?: string;\n stateManagement?: string;\n apiPattern?: string;\n };\n patterns?: {\n errorHandling?: string;\n logging?: string;\n validation?: string;\n authentication?: string;\n };\n criticalPaths?: string[];\n };\n activeFeatures: Record<string, FeatureContext>;\n globalConstraints: string[];\n}\n\n// ============================================================\n// Agents\n// ============================================================\n\nexport interface AgentConfig {\n role: AgentRole;\n provider: string;\n maxRetries: number;\n objectiveReminderInterval: number;\n maxFileChanges: number;\n rules: string[];\n}\n\nexport interface StructuredOutput {\n // Analyst\n complexity?: number;\n risks?: string[];\n questions?: string[];\n elicitation?: string[];\n // Planner\n stories?: Array<{ id: string; title: string; description: string }>;\n estimatedTokens?: number;\n // Dev\n filesChanged?: string[];\n testsGenerated?: string[];\n // QA\n passed?: boolean;\n score?: number;\n issues?: Array<{ severity: string; message: string }>;\n criteriaResults?: Array<{ story: string; criterion: string; passed: boolean; reason?: string }>;\n layers?: Array<{ type: string; findingsCount: number }>;\n // DocOps\n docsGenerated?: string[];\n}\n\nexport const structuredOutputSchema = z.object({\n complexity: z.number().min(1).max(5).optional(),\n risks: z.array(z.string()).optional(),\n questions: z.array(z.string()).optional(),\n elicitation: z.array(z.string()).optional(),\n stories: z\n .array(z.object({ id: z.string(), title: z.string(), description: z.string() }))\n .optional(),\n estimatedTokens: z.number().nonnegative().optional(),\n filesChanged: z.array(z.string()).optional(),\n testsGenerated: z.array(z.string()).optional(),\n passed: z.boolean().optional(),\n score: z.number().min(1).max(10).optional(),\n issues: z.array(z.object({ severity: z.string(), message: z.string() })).optional(),\n criteriaResults: z\n .array(\n z.object({\n story: z.string(),\n criterion: z.string(),\n passed: z.boolean(),\n reason: z.string().optional(),\n }),\n )\n .optional(),\n layers: z.array(z.object({ type: z.string(), findingsCount: z.number() })).optional(),\n docsGenerated: z.array(z.string()).optional(),\n});\n\nexport interface AgentOutput {\n agent: AgentRole;\n content: string;\n artefacts: ArtefactMeta[];\n tokensUsed: number;\n durationMs: number;\n decisions: Decision[];\n structured?: StructuredOutput;\n}\n\n// ============================================================\n// Artefacts\n// ============================================================\n\nexport interface ArtefactFrontmatter {\n type: ArtefactType;\n feature: string;\n version: number;\n created: string;\n author: AgentRole;\n status: ArtefactStatus;\n provider: string;\n tokensUsed: number;\n mode: AidenMode;\n}\n\nexport const artefactFrontmatterSchema = z.object({\n type: artefactTypeSchema,\n feature: z.string(),\n version: z.number().int().positive(),\n created: z.string(),\n author: agentRoleSchema,\n status: artefactStatusSchema,\n provider: z.string(),\n tokensUsed: z.number().nonnegative(),\n mode: aidenModeSchema,\n});\n\nexport interface ArtefactMeta {\n type: ArtefactType;\n path: string;\n feature: string;\n}\n\n// ============================================================\n// Decisions Log\n// ============================================================\n\nexport interface Decision {\n ts: string;\n feature: string;\n agent: AgentRole;\n type: string;\n value: string | number;\n reason?: string;\n tokens?: number;\n attempt?: number;\n max?: number;\n}\n\nexport const decisionSchema = z.object({\n ts: z.string(),\n feature: z.string(),\n agent: agentRoleSchema,\n type: z.string(),\n value: z.union([z.string(), z.number()]),\n reason: z.string().optional(),\n tokens: z.number().optional(),\n attempt: z.number().optional(),\n max: z.number().optional(),\n});\n\n// ============================================================\n// Quality Gates\n// ============================================================\n\nexport interface QualityGateResult {\n phase: string;\n passed: boolean;\n criteria: QualityGateCriterion[];\n timestamp: string;\n}\n\nexport interface QualityGateCriterion {\n name: string;\n passed: boolean;\n message?: string;\n}\n\n// ============================================================\n// Circuit Breaker\n// ============================================================\n\nexport type CircuitBreakerStatus = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerState {\n status: CircuitBreakerStatus;\n failures: number;\n maxFailures: number;\n lastFailure?: string;\n lastError?: string;\n}\n\n// ============================================================\n// Hooks\n// ============================================================\n\nexport type HookEvent =\n | 'on_feature_created'\n | 'on_phase_start'\n | 'on_phase_end'\n | 'on_feature_completed'\n | 'on_feature_blocked'\n | 'on_agent_start'\n | 'on_agent_output'\n | 'on_agent_error'\n | 'on_quality_gate_pass'\n | 'on_quality_gate_fail'\n | 'on_circuit_breaker'\n | 'on_escalation'\n | 'on_provider_switch'\n | 'on_token_budget_alert';\n\nexport interface HookResult {\n event: HookEvent;\n command: string;\n success: boolean;\n output?: string;\n error?: string;\n durationMs: number;\n}\n\n// ============================================================\n// Skills\n// ============================================================\n\nexport const skillCompatibilitySchema = z.object({\n aiden: z.string().optional(),\n skills: z.record(z.string(), z.string()).optional(),\n conflicts: z.array(z.string()).optional(),\n});\n\nexport const skillManifestSchema = z.object({\n name: z.string().min(1),\n version: z.string().default('1.0.0'),\n description: z.string().default(''),\n author: z.string().optional(),\n agents: z.array(agentRoleSchema).default(['lead', 'analyst', 'planner', 'dev', 'qa', 'docops']),\n modes: z.array(aidenModeSchema).optional(),\n hooks: z.record(z.string(), z.array(hookConfigSchema)).optional(),\n config: z.record(z.string(), z.unknown()).optional(),\n priority: z.number().int().default(0),\n enabled: z.boolean().default(true),\n compatibility: skillCompatibilitySchema.optional(),\n profiles: z.record(z.string(), agentProfileSchema).optional(),\n artefacts: z.array(z.string().min(1)).optional(),\n workflowPresets: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type SkillManifest = z.infer<typeof skillManifestSchema>;\nexport type SkillCompatibility = z.infer<typeof skillCompatibilitySchema>;\n\nexport interface LoadedSkill {\n manifest: SkillManifest;\n instructions: string;\n rules: Array<{ name: string; content: string }>;\n dir: string;\n}\n\n// ============================================================\n// Skills Registry\n// ============================================================\n\nexport const skillCategorySchema = z.enum([\n 'quality',\n 'security',\n 'compliance',\n 'integration',\n 'framework',\n 'performance',\n 'documentation',\n 'domain',\n]);\n\nexport type SkillCategory = z.infer<typeof skillCategorySchema>;\n\nexport const registryEntrySchema = z.object({\n name: z\n .string()\n .min(1)\n .regex(/^[a-z0-9-]+$/, 'kebab-case only'),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/),\n description: z.string().min(10).max(200),\n category: skillCategorySchema,\n tags: z.array(z.string()).min(1).max(10),\n author: z.string().min(1),\n license: z.string().default('MIT'),\n agents: z.array(agentRoleSchema).min(1),\n modes: z.array(aidenModeSchema).optional(),\n minAidenVersion: z.string(),\n downloadUrl: z.string().url(),\n checksum: z.string().regex(/^[a-f0-9]{64}$/, 'SHA-256 hex'),\n size: z.number().positive(),\n createdAt: z.string(),\n updatedAt: z.string(),\n downloads: z.number().optional(),\n repository: z.string().url().optional(),\n});\n\nexport type RegistryEntry = z.infer<typeof registryEntrySchema>;\n\nexport const registryIndexSchema = z.object({\n version: z.string(),\n generatedAt: z.string(),\n skills: z.array(registryEntrySchema),\n});\n\nexport type RegistryIndex = z.infer<typeof registryIndexSchema>;\n\nexport const registryLockEntrySchema = z.object({\n version: z.string(),\n installedAt: z.string(),\n updatedAt: z.string().optional(),\n source: z.string(),\n checksum: z.string().optional(),\n autoUpdate: z.boolean().default(false),\n});\n\nexport type RegistryLockEntry = z.infer<typeof registryLockEntrySchema>;\n\nexport const registryLockSchema = z.object({\n lockVersion: z.literal(1),\n skills: z.record(z.string(), registryLockEntrySchema),\n});\n\nexport type RegistryLock = z.infer<typeof registryLockSchema>;\n\nexport const skillsConfigSchema = z.object({\n registryUrl: z.string().url().optional(),\n autoUpdate: z.boolean().default(false),\n trustedAuthors: z.array(z.string()).default([]),\n cacheTtl: z.number().positive().default(86_400_000),\n});\n\nexport type SkillsConfig = z.infer<typeof skillsConfigSchema>;\n\nexport interface SkillPack {\n name: string;\n description: string;\n skills: string[];\n category: 'starter' | 'team' | 'compliance' | 'custom';\n}\n\nexport const skillPackSchema = z.object({\n name: z.string().min(1),\n description: z.string().default(''),\n skills: z.array(z.string()).min(1),\n category: z.enum(['starter', 'team', 'compliance', 'custom']).default('custom'),\n});\n\nexport const packIndexSchema = z.object({\n packs: z.array(skillPackSchema),\n});\n\n// ============================================================\n// Token Budget\n// ============================================================\n\nexport interface TokenBudget {\n totalBudget: number;\n used: number;\n remaining: number;\n alertThreshold: number;\n isOverBudget: boolean;\n isNearLimit: boolean;\n}\n\n// ============================================================\n// Feature State Machine transitions\n// ============================================================\n\nexport const featureTransitions: Record<FeatureStatus, FeatureStatus[]> = {\n created: ['analyzing', 'in_progress'],\n analyzing: ['planning', 'blocked'],\n planning: ['ready', 'blocked'],\n ready: ['in_progress', 'blocked'],\n in_progress: ['in_review', 'blocked', 'completed'],\n in_review: ['documenting', 'completed', 'blocked', 'in_progress'],\n documenting: ['completed', 'blocked'],\n completed: [],\n blocked: ['created', 'analyzing', 'planning', 'ready', 'in_progress'],\n};\n","export { aidenConfigSchema } from '../types/index.js';\nexport type { AidenConfig } from '../types/index.js';\n\nimport { aidenConfigSchema } from '../types/index.js';\nimport type { AidenConfig } from '../types/index.js';\n\n/**\n * Validates a configuration object and returns the typed result.\n * Throws a ConfigValidationError if invalid.\n */\nexport function validateConfig(raw: unknown): AidenConfig {\n const result = aidenConfigSchema.safeParse(raw);\n if (!result.success) {\n throw new ConfigValidationError(\n `Invalid AIDEN configuration: ${result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join(', ')}`,\n );\n }\n return result.data;\n}\n\nexport class ConfigValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n","import type { MemoryConfig, MemoryScope, MemoryScopeConfig } from '../types/index.js';\n\nexport const DEFAULT_MEMORY_SCOPE_PRECEDENCE: MemoryScope[] = [\n 'task',\n 'session',\n 'project',\n 'user',\n];\n\nexport const DEFAULT_MEMORY_SCOPES = {\n user: {\n enabled: true,\n maxSize: 'small',\n lifecycle: 'persistent',\n writePolicy: 'suggested',\n readPolicy: 'contextual',\n sensitivity: 'medium',\n summarization: 'on_limit',\n },\n project: {\n enabled: true,\n maxSize: 'medium',\n lifecycle: 'persistent',\n writePolicy: 'suggested',\n readPolicy: 'contextual',\n sensitivity: 'medium',\n summarization: 'periodic',\n revalidateBeforeUse: true,\n },\n session: {\n enabled: true,\n maxSize: 'large',\n lifecycle: 'session',\n writePolicy: 'automatic',\n readPolicy: 'contextual',\n sensitivity: 'medium',\n summarization: 'on_close',\n },\n task: {\n enabled: true,\n maxSize: 'small',\n lifecycle: 'ephemeral',\n writePolicy: 'automatic',\n readPolicy: 'always',\n sensitivity: 'low',\n summarization: 'none',\n },\n} as const satisfies Record<MemoryScope, MemoryScopeConfig>;\n\nexport const DEFAULT_MEMORY_CONFIG: MemoryConfig = {\n enabled: true,\n scopePrecedence: [...DEFAULT_MEMORY_SCOPE_PRECEDENCE],\n scopes: {\n user: { ...DEFAULT_MEMORY_SCOPES.user },\n project: { ...DEFAULT_MEMORY_SCOPES.project },\n session: { ...DEFAULT_MEMORY_SCOPES.session },\n task: { ...DEFAULT_MEMORY_SCOPES.task },\n },\n};\n\nexport function shouldReadMemoryScope(\n memory: MemoryConfig | undefined,\n scope: MemoryScope,\n): boolean {\n if (!memory?.enabled) return false;\n const scopeConfig = memory.scopes[scope];\n if (!scopeConfig?.enabled) return false;\n return scopeConfig.readPolicy !== 'never';\n}\n\nexport function shouldWriteMemoryScope(\n memory: MemoryConfig | undefined,\n scope: MemoryScope,\n): boolean {\n if (!memory?.enabled) return false;\n const scopeConfig = memory.scopes[scope];\n if (!scopeConfig?.enabled) return false;\n return scopeConfig.writePolicy !== 'never';\n}\n\nexport function getMemoryScopeConfig(\n memory: MemoryConfig | undefined,\n scope: MemoryScope,\n): MemoryScopeConfig | undefined {\n if (!memory?.enabled) return undefined;\n const scopeConfig = memory.scopes[scope];\n if (!scopeConfig?.enabled) return undefined;\n return scopeConfig;\n}\n\nexport function formatMemoryGovernanceForPrompt(memory: MemoryConfig | undefined): string {\n if (!memory?.enabled) return '';\n\n const enabledScopes = memory.scopePrecedence\n .map((scope) => ({ scope, config: getMemoryScopeConfig(memory, scope) }))\n .filter((entry): entry is { scope: MemoryScope; config: MemoryScopeConfig } =>\n Boolean(entry.config),\n );\n\n if (enabledScopes.length === 0) return '';\n\n const lines = [\n 'Memory is governed by explicit scopes. Treat memory as contextual hints, not source of truth.',\n `Scope precedence: ${enabledScopes.map(({ scope }) => scope).join(' > ')}`,\n ];\n\n for (const { scope, config } of enabledScopes) {\n const revalidation = config.revalidateBeforeUse ? ', revalidateBeforeUse=true' : '';\n lines.push(\n `${scope}: read=${config.readPolicy}, write=${config.writePolicy}, lifecycle=${config.lifecycle}, maxSize=${config.maxSize}, sensitivity=${config.sensitivity}, summarization=${config.summarization}${revalidation}`,\n );\n }\n\n return lines.join('\\n');\n}\n","import type { AidenConfig } from '../types/index.js';\nimport { DEFAULT_MEMORY_CONFIG } from '../memory/scoped-memory.js';\n\nexport const DEFAULT_CONFIG: AidenConfig = {\n project: '',\n provider: 'claude-code',\n mode: 'standard',\n lang: 'fr',\n providers: {\n 'claude-code': {\n enabled: true,\n command: 'claude',\n model: 'claude-sonnet-4-6',\n maxTokens: 100000,\n costPer1k: 0.003,\n },\n gemini: {\n enabled: true,\n command: 'gemini',\n model: 'gemini-2.5-pro',\n maxTokens: 1000000,\n costPer1k: 0.001,\n },\n copilot: {\n enabled: true,\n command: 'gh',\n model: 'copilot',\n maxTokens: 50000,\n costPer1k: 0,\n },\n opencode: {\n enabled: true,\n command: 'opencode',\n model: 'opencode',\n maxTokens: 200000,\n costPer1k: 0.002,\n },\n codex: {\n enabled: true,\n command: 'codex',\n model: 'codex-cli',\n maxTokens: 200000,\n costPer1k: 0.003,\n },\n },\n routing: {\n strategy: 'prefer',\n fallback: ['claude-code', 'gemini', 'opencode', 'codex', 'copilot'],\n },\n budget: {\n monthlyLimit: 500000,\n alertAt: 80,\n perFeature: {\n flash: 5000,\n standard: 20000,\n enterprise: 100000,\n },\n },\n hooks: {},\n rules: [],\n sanitize: true,\n memory: DEFAULT_MEMORY_CONFIG,\n};\n","import type { AidenProvider } from '../types/index.js';\n\nexport interface ProviderRegistry {\n register(provider: AidenProvider): void;\n get(name: string): AidenProvider | undefined;\n getAll(): AidenProvider[];\n getAvailable(): Promise<AidenProvider[]>;\n has(name: string): boolean;\n}\n\nexport function createProviderRegistry(): ProviderRegistry {\n const providers = new Map<string, AidenProvider>();\n\n return {\n register(provider: AidenProvider): void {\n providers.set(provider.name, provider);\n },\n\n get(name: string): AidenProvider | undefined {\n return providers.get(name);\n },\n\n getAll(): AidenProvider[] {\n return [...providers.values()];\n },\n\n async getAvailable(): Promise<AidenProvider[]> {\n const results: AidenProvider[] = [];\n for (const provider of providers.values()) {\n if (await provider.isAvailable()) {\n results.push(provider);\n }\n }\n return results;\n },\n\n has(name: string): boolean {\n return providers.has(name);\n },\n };\n}\n","import type { AidenProvider, RoutingStrategy, TaskType } from '../types/index.js';\nimport type { ProviderRegistry } from './provider-registry.js';\n\nexport interface RouterConfig {\n strategy: RoutingStrategy;\n preferredProvider?: string;\n fallbackChain: string[];\n autoRules?: Record<string, string>;\n}\n\nexport interface ProviderRouter {\n route(taskType: TaskType): Promise<AidenProvider>;\n setStrategy(strategy: RoutingStrategy): void;\n}\n\nexport class NoProviderAvailableError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NoProviderAvailableError';\n }\n}\n\nconst DEFAULT_AUTO_RULES: Record<string, string> = {\n analysis: 'claude-code',\n planning: 'claude-code',\n code_gen: 'gemini',\n code_review: 'claude-code',\n quick_fix: 'copilot',\n test_gen: 'gemini',\n documentation: 'claude-code',\n pr_review: 'copilot',\n};\n\nexport function createRouter(registry: ProviderRegistry, config: RouterConfig): ProviderRouter {\n let currentStrategy = config.strategy;\n\n return {\n async route(taskType: TaskType): Promise<AidenProvider> {\n switch (currentStrategy) {\n case 'fixed':\n return resolveFixed(registry, config.preferredProvider ?? config.fallbackChain[0]);\n\n case 'prefer':\n return resolvePrefer(registry, config.preferredProvider, config.fallbackChain);\n\n case 'auto':\n return resolveAuto(\n registry,\n taskType,\n config.autoRules ?? DEFAULT_AUTO_RULES,\n config.fallbackChain,\n );\n\n case 'cost-optimized':\n return resolveCostOptimized(registry, config.fallbackChain);\n }\n },\n\n setStrategy(strategy: RoutingStrategy): void {\n currentStrategy = strategy;\n },\n };\n}\n\nasync function resolveFixed(registry: ProviderRegistry, name: string): Promise<AidenProvider> {\n const provider = registry.get(name);\n if (!provider) {\n throw new NoProviderAvailableError(`Provider \"${name}\" not registered`);\n }\n if (!(await provider.isAvailable())) {\n throw new NoProviderAvailableError(`Provider \"${name}\" is not available`);\n }\n return provider;\n}\n\nasync function resolvePrefer(\n registry: ProviderRegistry,\n preferred: string | undefined,\n fallbackChain: string[],\n): Promise<AidenProvider> {\n // Try preferred first\n if (preferred) {\n const provider = registry.get(preferred);\n if (provider && (await provider.isAvailable())) {\n return provider;\n }\n }\n\n // Try fallback chain\n for (const name of fallbackChain) {\n const provider = registry.get(name);\n if (provider && (await provider.isAvailable())) {\n return provider;\n }\n }\n\n throw new NoProviderAvailableError('No provider available in fallback chain');\n}\n\nasync function resolveAuto(\n registry: ProviderRegistry,\n taskType: TaskType,\n autoRules: Record<string, string>,\n fallbackChain: string[],\n): Promise<AidenProvider> {\n const preferredName = autoRules[taskType];\n return resolvePrefer(registry, preferredName, fallbackChain);\n}\n\nasync function resolveCostOptimized(\n registry: ProviderRegistry,\n fallbackChain: string[],\n): Promise<AidenProvider> {\n // Try fallback chain in order (assumed sorted by cost)\n for (const name of fallbackChain) {\n const provider = registry.get(name);\n if (provider && (await provider.isAvailable())) {\n return provider;\n }\n }\n\n throw new NoProviderAvailableError('No provider available');\n}\n","import { spawn } from 'node:child_process';\n\nexport const DEFAULT_TIMEOUT_MS = 600_000;\n\nexport class ProviderError extends Error {\n constructor(provider: string, exitCode: number | null, stderr: string) {\n super(`Provider \"${provider}\" failed (exit ${exitCode}): ${stderr}`);\n this.name = 'ProviderError';\n }\n}\n\nexport class ProviderTimeoutError extends Error {\n constructor(provider: string, timeoutMs: number) {\n super(`Provider \"${provider}\" timed out after ${timeoutMs}ms`);\n this.name = 'ProviderTimeoutError';\n }\n}\n\nexport interface SubprocessOptions {\n stdin?: string;\n timeoutMs?: number;\n cwd?: string;\n}\n\nexport function executeSubprocess(\n command: string,\n args: string[],\n options?: SubprocessOptions,\n): Promise<string> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n const proc = spawn(command, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: timeoutMs,\n ...(options?.cwd && { cwd: options.cwd }),\n });\n let stdout = '';\n let stderr = '';\n\n proc.stdout.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n proc.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code, signal) => {\n if (signal === 'SIGTERM' || signal === 'SIGKILL') {\n reject(new ProviderTimeoutError(command, timeoutMs));\n } else if (code === 0) {\n resolve(stdout.trim());\n } else {\n reject(new ProviderError(command, code, stderr || stdout));\n }\n });\n\n proc.on('error', (err) => {\n reject(err);\n });\n\n if (options?.stdin) {\n proc.stdin.write(options.stdin);\n proc.stdin.end();\n } else {\n proc.stdin.end();\n }\n });\n}\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nexport interface ParsedReview {\n passed: boolean;\n score: number;\n issues: Array<{ severity: 'error' | 'warning' | 'info'; message: string }>;\n suggestions: string[];\n}\n\nexport function parseReviewOutput(output: string): ParsedReview {\n if (output.trim().length === 0) {\n return {\n passed: false,\n score: 1,\n issues: [{ severity: 'error', message: 'Provider returned an empty review output' }],\n suggestions: ['Retry the review or inspect the provider invocation/logs'],\n };\n }\n\n const scoreMatch = output.match(/SCORE:\\s*(\\d+)/i);\n const passedMatch = output.match(/PASSED:\\s*(yes|no)/i);\n\n const score = scoreMatch ? parseInt(scoreMatch[1], 10) : 5;\n const passed = passedMatch\n ? passedMatch[1].toLowerCase() === 'yes'\n : !output.toLowerCase().includes('critical');\n\n const issues: Array<{ severity: 'error' | 'warning' | 'info'; message: string }> = [];\n const issueRegex = /- \\[(error|warning|info)\\]\\s*(.+)/gi;\n let match;\n while ((match = issueRegex.exec(output)) !== null) {\n issues.push({\n severity: match[1].toLowerCase() as 'error' | 'warning' | 'info',\n message: match[2],\n });\n }\n\n return {\n passed,\n score: Math.min(Math.max(score, 1), 10),\n issues,\n suggestions: [],\n };\n}\n","import type {\n AidenProvider,\n ProviderCapabilities,\n AidenContext,\n AidenResponse,\n ReviewCriteria,\n ReviewResult,\n} from '../../types/index.js';\nimport { executeSubprocess, estimateTokens, parseReviewOutput } from '../subprocess.js';\n\nexport function createClaudeCodeAdapter(\n command: string = 'claude',\n projectDir?: string,\n): AidenProvider {\n const capabilities: ProviderCapabilities = {\n analysis: true,\n codeGeneration: true,\n codeReview: true,\n multiFile: true,\n longContext: true,\n inlineCompletion: false,\n };\n\n return {\n name: 'claude-code',\n capabilities,\n\n async generate(prompt: string, _context: AidenContext): Promise<AidenResponse> {\n const start = Date.now();\n const cwd = projectDir || process.cwd();\n const output = await executeSubprocess(\n command,\n ['-p', '--dangerously-skip-permissions', '-'],\n { stdin: prompt, cwd, timeoutMs: 600_000 },\n );\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'claude-code',\n model: 'claude-sonnet-4-6',\n durationMs: Date.now() - start,\n };\n },\n\n async review(code: string, _criteria: ReviewCriteria): Promise<ReviewResult> {\n const prompt = `Review the following code. Respond in this exact format:\nSCORE: <1-10>\nPASSED: <yes|no>\nISSUES:\n- [severity] description\nSUGGESTIONS:\n- suggestion\n\nCode:\n${code}`;\n\n const cwd = projectDir || process.cwd();\n const output = await executeSubprocess(\n command,\n ['-p', '--dangerously-skip-permissions', '-'],\n { stdin: prompt, cwd, timeoutMs: 300_000 },\n );\n const parsed = parseReviewOutput(output);\n return {\n passed: parsed.passed,\n score: parsed.score,\n issues: parsed.issues.map((i) => ({\n severity: i.severity as 'error' | 'warning' | 'info',\n file: '',\n message: i.message,\n })),\n suggestions: parsed.suggestions,\n tokensUsed: estimateTokens(prompt + output),\n };\n },\n\n async refine(artefact: string, feedback: string): Promise<AidenResponse> {\n const prompt = `Refine the following artefact based on feedback:\\n\\nArtefact:\\n${artefact}\\n\\nFeedback:\\n${feedback}`;\n const start = Date.now();\n const cwd = projectDir || process.cwd();\n const output = await executeSubprocess(\n command,\n ['-p', '--dangerously-skip-permissions', '-'],\n { stdin: prompt, cwd, timeoutMs: 300_000 },\n );\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'claude-code',\n model: 'claude-sonnet-4-6',\n durationMs: Date.now() - start,\n };\n },\n\n estimateTokens(prompt: string): number {\n return estimateTokens(prompt);\n },\n\n getCostEstimate(tokens: number): number {\n return (tokens / 1000) * 0.003;\n },\n\n async isAvailable(): Promise<boolean> {\n try {\n await executeSubprocess(command, ['--version'], { timeoutMs: 5000 });\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n","import type {\n AidenProvider,\n ProviderCapabilities,\n AidenContext,\n AidenResponse,\n ReviewCriteria,\n ReviewResult,\n} from '../../types/index.js';\nimport { executeSubprocess, estimateTokens, parseReviewOutput } from '../subprocess.js';\n\nexport function createGeminiAdapter(command: string = 'gemini'): AidenProvider {\n const capabilities: ProviderCapabilities = {\n analysis: false,\n codeGeneration: true,\n codeReview: false,\n multiFile: true,\n longContext: true,\n inlineCompletion: false,\n };\n\n return {\n name: 'gemini',\n capabilities,\n\n async generate(prompt: string, _context: AidenContext): Promise<AidenResponse> {\n const start = Date.now();\n const output = await executeSubprocess(command, ['--stdin'], { stdin: prompt });\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'gemini',\n model: 'gemini-2.5-pro',\n durationMs: Date.now() - start,\n };\n },\n\n async review(code: string, _criteria: ReviewCriteria): Promise<ReviewResult> {\n const prompt = `Review this code:\\n\\n${code}`;\n const output = await executeSubprocess(command, ['--stdin'], { stdin: prompt });\n const parsed = parseReviewOutput(output);\n return {\n passed: parsed.passed,\n score: parsed.score,\n issues: parsed.issues.map((i) => ({\n severity: i.severity as 'error' | 'warning' | 'info',\n file: '',\n message: i.message,\n })),\n suggestions: parsed.suggestions,\n tokensUsed: estimateTokens(prompt + output),\n };\n },\n\n async refine(artefact: string, feedback: string): Promise<AidenResponse> {\n const prompt = `Refine:\\n${artefact}\\n\\nFeedback:\\n${feedback}`;\n const start = Date.now();\n const output = await executeSubprocess(command, ['--stdin'], { stdin: prompt });\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'gemini',\n model: 'gemini-2.5-pro',\n durationMs: Date.now() - start,\n };\n },\n\n estimateTokens(prompt: string): number {\n return estimateTokens(prompt);\n },\n\n getCostEstimate(tokens: number): number {\n return (tokens / 1000) * 0.001;\n },\n\n async isAvailable(): Promise<boolean> {\n try {\n await executeSubprocess(command, ['--version'], { timeoutMs: 5000 });\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n","import type {\n AidenProvider,\n ProviderCapabilities,\n AidenContext,\n AidenResponse,\n ReviewCriteria,\n ReviewResult,\n} from '../../types/index.js';\nimport { executeSubprocess, estimateTokens, parseReviewOutput } from '../subprocess.js';\n\n/**\n * GitHub Copilot CLI adapter.\n *\n * Uses `gh copilot explain` for all prompts (more reliable than `suggest`\n * which is interactive). Capabilities are limited — copilot CLI is not\n * designed for agentic prompt-based workflows.\n */\nexport function createCopilotAdapter(command: string = 'gh'): AidenProvider {\n const capabilities: ProviderCapabilities = {\n analysis: false,\n codeGeneration: true,\n codeReview: false,\n multiFile: false,\n longContext: false,\n inlineCompletion: true,\n };\n\n return {\n name: 'copilot',\n capabilities,\n\n async generate(prompt: string, _context: AidenContext): Promise<AidenResponse> {\n const start = Date.now();\n // Use explain mode — more reliable for piped stdin than suggest\n const output = await executeSubprocess(command, ['copilot', 'explain'], {\n stdin: prompt,\n });\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'copilot',\n model: 'copilot',\n durationMs: Date.now() - start,\n };\n },\n\n async review(code: string, _criteria: ReviewCriteria): Promise<ReviewResult> {\n const prompt = `Review this code and list issues:\\n\\n${code}`;\n const output = await executeSubprocess(command, ['copilot', 'explain'], {\n stdin: prompt,\n });\n const parsed = parseReviewOutput(output);\n return {\n passed: parsed.passed,\n score: parsed.score,\n issues: parsed.issues.map((i) => ({\n severity: i.severity as 'error' | 'warning' | 'info',\n file: '',\n message: i.message,\n })),\n suggestions: parsed.suggestions,\n tokensUsed: estimateTokens(prompt + output),\n };\n },\n\n async refine(artefact: string, feedback: string): Promise<AidenResponse> {\n const prompt = `Refine this based on feedback:\\n\\n${artefact}\\n\\nFeedback:\\n${feedback}`;\n const start = Date.now();\n const output = await executeSubprocess(command, ['copilot', 'explain'], {\n stdin: prompt,\n });\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'copilot',\n model: 'copilot',\n durationMs: Date.now() - start,\n };\n },\n\n estimateTokens: (prompt: string) => estimateTokens(prompt),\n\n getCostEstimate(): number {\n return 0; // flat rate subscription\n },\n\n async isAvailable(): Promise<boolean> {\n try {\n await executeSubprocess(command, ['copilot', '--version'], { timeoutMs: 5000 });\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n","import type {\n AidenProvider,\n ProviderCapabilities,\n AidenContext,\n AidenResponse,\n ReviewCriteria,\n ReviewResult,\n} from '../../types/index.js';\nimport { executeSubprocess, estimateTokens, parseReviewOutput } from '../subprocess.js';\n\nexport function createOpenCodeAdapter(command: string = 'opencode'): AidenProvider {\n const capabilities: ProviderCapabilities = {\n analysis: true,\n codeGeneration: true,\n codeReview: true,\n multiFile: true,\n longContext: true,\n inlineCompletion: false,\n };\n\n return {\n name: 'opencode',\n capabilities,\n\n async generate(prompt: string, _context: AidenContext): Promise<AidenResponse> {\n const start = Date.now();\n const output = await executeSubprocess(command, ['-p', '-'], { stdin: prompt });\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'opencode',\n model: 'opencode',\n durationMs: Date.now() - start,\n };\n },\n\n async review(code: string, _criteria: ReviewCriteria): Promise<ReviewResult> {\n const prompt = `Review the following code. Respond with:\\nSCORE: <1-10>\\nPASSED: <yes|no>\\nISSUES:\\n- [severity] description\\n\\nCode:\\n${code}`;\n const output = await executeSubprocess(command, ['-p', '-'], { stdin: prompt });\n const parsed = parseReviewOutput(output);\n return {\n passed: parsed.passed,\n score: parsed.score,\n issues: parsed.issues.map((i) => ({\n severity: i.severity as 'error' | 'warning' | 'info',\n file: '',\n message: i.message,\n })),\n suggestions: parsed.suggestions,\n tokensUsed: estimateTokens(prompt + output),\n };\n },\n\n async refine(artefact: string, feedback: string): Promise<AidenResponse> {\n const prompt = `Refine the following artefact based on feedback:\\n\\nArtefact:\\n${artefact}\\n\\nFeedback:\\n${feedback}`;\n const start = Date.now();\n const output = await executeSubprocess(command, ['-p', '-'], { stdin: prompt });\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'opencode',\n model: 'opencode',\n durationMs: Date.now() - start,\n };\n },\n\n estimateTokens: (prompt: string) => estimateTokens(prompt),\n getCostEstimate: (tokens: number) => (tokens / 1000) * 0.002,\n\n async isAvailable(): Promise<boolean> {\n try {\n await executeSubprocess(command, ['--version'], { timeoutMs: 5000 });\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n","import type {\n AidenProvider,\n ProviderCapabilities,\n AidenContext,\n AidenResponse,\n ReviewCriteria,\n ReviewResult,\n} from '../../types/index.js';\nimport { executeSubprocess, estimateTokens, parseReviewOutput } from '../subprocess.js';\n\nconst GENERATE_TIMEOUT_MS = 600_000;\nconst REVIEW_TIMEOUT_MS = 300_000;\n\nexport function createCodexAdapter(command: string = 'codex', projectDir?: string): AidenProvider {\n const capabilities: ProviderCapabilities = {\n analysis: true,\n codeGeneration: true,\n codeReview: true,\n multiFile: true,\n longContext: true,\n inlineCompletion: false,\n };\n\n const cwd = projectDir || process.cwd();\n\n return {\n name: 'codex',\n capabilities,\n\n async generate(prompt: string, _context: AidenContext): Promise<AidenResponse> {\n const start = Date.now();\n const output = await executeSubprocess(\n command,\n ['exec', '--sandbox', 'workspace-write', '--cd', cwd, '-'],\n { stdin: prompt, cwd, timeoutMs: GENERATE_TIMEOUT_MS },\n );\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'codex',\n model: 'codex-cli',\n durationMs: Date.now() - start,\n };\n },\n\n async review(code: string, _criteria: ReviewCriteria): Promise<ReviewResult> {\n const prompt = `Review the following code. Respond in this exact format:\nSCORE: <1-10>\nPASSED: <yes|no>\nISSUES:\n- [severity] description\nSUGGESTIONS:\n- suggestion\n\nCode:\n${code}`;\n\n const output = await executeSubprocess(\n command,\n ['exec', '--sandbox', 'read-only', '--cd', cwd, '-'],\n {\n stdin: prompt,\n cwd,\n timeoutMs: REVIEW_TIMEOUT_MS,\n },\n );\n const parsed = parseReviewOutput(output);\n return {\n passed: parsed.passed,\n score: parsed.score,\n issues: parsed.issues.map((i) => ({\n severity: i.severity as 'error' | 'warning' | 'info',\n file: '',\n message: i.message,\n })),\n suggestions: parsed.suggestions,\n tokensUsed: estimateTokens(prompt + output),\n };\n },\n\n async refine(artefact: string, feedback: string): Promise<AidenResponse> {\n const prompt = `Refine the following artefact based on feedback:\\n\\nArtefact:\\n${artefact}\\n\\nFeedback:\\n${feedback}`;\n const start = Date.now();\n const output = await executeSubprocess(\n command,\n ['exec', '--sandbox', 'workspace-write', '--cd', cwd, '-'],\n { stdin: prompt, cwd, timeoutMs: REVIEW_TIMEOUT_MS },\n );\n return {\n content: output,\n tokensUsed: estimateTokens(prompt + output),\n provider: 'codex',\n model: 'codex-cli',\n durationMs: Date.now() - start,\n };\n },\n\n estimateTokens: (prompt: string) => estimateTokens(prompt),\n getCostEstimate: (tokens: number) => (tokens / 1000) * 0.003,\n\n async isAvailable(): Promise<boolean> {\n try {\n await executeSubprocess(command, ['--version'], { timeoutMs: 5000 });\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n","import type {\n AidenProvider,\n ProviderCapabilities,\n AidenContext,\n AidenResponse,\n ReviewCriteria,\n ReviewResult,\n} from '../../types/index.js';\nimport { estimateTokens, parseReviewOutput } from '../subprocess.js';\n\nexport interface ApiAdapterConfig {\n name?: string;\n baseUrl: string;\n apiKey?: string;\n model: string;\n maxTokens?: number;\n costPer1k?: number;\n timeoutMs?: number;\n}\n\ninterface ChatCompletionResponse {\n choices: Array<{ message: { content: string } }>;\n usage?: { total_tokens?: number };\n}\n\nexport function createApiAdapter(config: ApiAdapterConfig): AidenProvider {\n const {\n name = 'api',\n baseUrl,\n apiKey,\n model,\n maxTokens = 100000,\n costPer1k = 0.003,\n timeoutMs = 120000,\n } = config;\n\n const capabilities: ProviderCapabilities = {\n analysis: true,\n codeGeneration: true,\n codeReview: true,\n multiFile: true,\n longContext: true,\n inlineCompletion: false,\n };\n\n async function chatCompletion(\n messages: Array<{ role: string; content: string }>,\n ): Promise<{ content: string; tokensUsed: number }> {\n const url = `${baseUrl.replace(/\\/$/, '')}/chat/completions`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model,\n messages,\n max_tokens: maxTokens,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`API ${response.status}: ${body.slice(0, 200)}`);\n }\n\n const json = (await response.json()) as ChatCompletionResponse;\n const content = json.choices[0]?.message?.content ?? '';\n\n return {\n content,\n tokensUsed:\n json.usage?.total_tokens ??\n estimateTokens(messages.map((m) => m.content).join('') + content),\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n return {\n name,\n capabilities,\n\n async generate(prompt: string, _context: AidenContext): Promise<AidenResponse> {\n const start = Date.now();\n const result = await chatCompletion([{ role: 'user', content: prompt }]);\n return {\n content: result.content,\n tokensUsed: result.tokensUsed,\n provider: name,\n model,\n durationMs: Date.now() - start,\n };\n },\n\n async review(code: string, _criteria: ReviewCriteria): Promise<ReviewResult> {\n const prompt = `Review the following code. Respond with:\\nSCORE: <1-10>\\nPASSED: <yes|no>\\nISSUES:\\n- [severity] description\\nSUGGESTIONS:\\n- suggestion\\n\\nCode:\\n${code}`;\n const result = await chatCompletion([{ role: 'user', content: prompt }]);\n const parsed = parseReviewOutput(result.content);\n return {\n passed: parsed.passed,\n score: parsed.score,\n issues: parsed.issues.map((i) => ({\n severity: i.severity as 'error' | 'warning' | 'info',\n file: '',\n message: i.message,\n })),\n suggestions: parsed.suggestions,\n tokensUsed: result.tokensUsed,\n };\n },\n\n async refine(artefact: string, feedback: string): Promise<AidenResponse> {\n const prompt = `Refine this artefact:\\n\\n${artefact}\\n\\nFeedback:\\n${feedback}`;\n const start = Date.now();\n const result = await chatCompletion([{ role: 'user', content: prompt }]);\n return {\n content: result.content,\n tokensUsed: result.tokensUsed,\n provider: name,\n model,\n durationMs: Date.now() - start,\n };\n },\n\n estimateTokens: (prompt: string) => estimateTokens(prompt),\n getCostEstimate: (tokens: number) => (tokens / 1000) * costPer1k,\n\n async isAvailable(): Promise<boolean> {\n try {\n const url = `${baseUrl.replace(/\\/$/, '')}/models`;\n const headers: Record<string, string> = {};\n if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`;\n const response = await fetch(url, {\n headers,\n signal: AbortSignal.timeout(5000),\n });\n return response.ok;\n } catch {\n return false;\n }\n },\n };\n}\n","import type { ProviderConfig, AidenProvider } from '../types/index.js';\nimport { createClaudeCodeAdapter } from './adapters/claude-code.js';\nimport { createGeminiAdapter } from './adapters/gemini.js';\nimport { createCopilotAdapter } from './adapters/copilot.js';\nimport { createOpenCodeAdapter } from './adapters/opencode.js';\nimport { createCodexAdapter } from './adapters/codex.js';\nimport { createApiAdapter } from './adapters/api.js';\n\ntype CliAdapterFactory = (command?: string, projectDir?: string) => AidenProvider;\n\nconst KNOWN_ADAPTERS: Record<string, CliAdapterFactory> = {\n 'claude-code': createClaudeCodeAdapter,\n gemini: createGeminiAdapter,\n copilot: createCopilotAdapter,\n opencode: createOpenCodeAdapter,\n codex: createCodexAdapter,\n};\n\n/**\n * Instantiates a provider from its configuration.\n *\n * - If `baseUrl` is defined → API adapter (fetch, OpenAI-compatible)\n * - If the name is known (claude-code, gemini, copilot, opencode) → specific CLI adapter\n * - Otherwise → null (unknown provider without baseUrl)\n */\nexport function createProviderFromConfig(\n name: string,\n config: ProviderConfig & { baseUrl?: string; apiKey?: string },\n projectDir?: string,\n): AidenProvider | null {\n if (!config.enabled) return null;\n\n // API adapter: baseUrl defined → use fetch-based adapter\n if (config.baseUrl) {\n return createApiAdapter({\n name,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n model: config.model,\n maxTokens: config.maxTokens,\n costPer1k: config.costPer1k,\n });\n }\n\n // Known CLI adapter\n const factory = KNOWN_ADAPTERS[name];\n if (factory) {\n return factory(config.command || undefined, projectDir);\n }\n\n // Unknown name without baseUrl → skip\n return null;\n}\n","import { join } from 'node:path';\nimport type { AidenContext, FeatureContext, FeatureStatus } from '../types/index.js';\nimport { readYaml, writeYaml, fileExists } from '../utils/fs-helpers.js';\nimport { createFileLock } from '../utils/file-lock.js';\n\nconst CONTEXT_FILE = 'context.yaml';\n\nexport interface ContextStore {\n load(): Promise<AidenContext>;\n save(context: AidenContext): Promise<void>;\n getFeature(slug: string): Promise<FeatureContext | undefined>;\n updateFeature(slug: string, updates: Partial<FeatureContext>): Promise<void>;\n setFeatureState(slug: string, state: FeatureStatus): Promise<void>;\n removeFeature(slug: string): Promise<void>;\n}\n\nexport function createContextStore(memoryDir: string): ContextStore {\n const filePath = join(memoryDir, CONTEXT_FILE);\n const lock = createFileLock(filePath + '.lock');\n\n const defaultContext: AidenContext = {\n project: { name: '', techStack: [], architecture: [], ci: [] },\n activeFeatures: {},\n globalConstraints: [],\n };\n\n return {\n async load(): Promise<AidenContext> {\n if (!(await fileExists(filePath))) return { ...defaultContext };\n return readYaml<AidenContext>(filePath);\n },\n\n async save(context: AidenContext): Promise<void> {\n await writeYaml(filePath, context);\n },\n\n async getFeature(slug: string): Promise<FeatureContext | undefined> {\n const ctx = await this.load();\n return ctx.activeFeatures[slug];\n },\n\n async updateFeature(slug: string, updates: Partial<FeatureContext>): Promise<void> {\n await lock.acquire();\n try {\n const ctx = await this.load();\n const existing = ctx.activeFeatures[slug];\n if (!existing) {\n throw new FeatureNotFoundError(`Feature \"${slug}\" not found in context`);\n }\n ctx.activeFeatures[slug] = {\n ...existing,\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n await this.save(ctx);\n } finally {\n await lock.release();\n }\n },\n\n async setFeatureState(slug: string, state: FeatureStatus): Promise<void> {\n await this.updateFeature(slug, { state });\n },\n\n async removeFeature(slug: string): Promise<void> {\n await lock.acquire();\n try {\n const ctx = await this.load();\n delete ctx.activeFeatures[slug];\n await this.save(ctx);\n } finally {\n await lock.release();\n }\n },\n };\n}\n\nexport class FeatureNotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FeatureNotFoundError';\n }\n}\n","import { writeFile, unlink, stat } from 'node:fs/promises';\n\nconst STALE_THRESHOLD_MS = 30_000;\n\nexport interface FileLock {\n acquire(): Promise<void>;\n release(): Promise<void>;\n}\n\nexport class LockTimeoutError extends Error {\n constructor(lockPath: string, timeoutMs: number) {\n super(`Failed to acquire lock \"${lockPath}\" within ${timeoutMs}ms`);\n this.name = 'LockTimeoutError';\n }\n}\n\nexport function createFileLock(\n lockPath: string,\n options?: {\n timeoutMs?: number;\n retryIntervalMs?: number;\n },\n): FileLock {\n const timeoutMs = options?.timeoutMs ?? 10_000;\n const retryIntervalMs = options?.retryIntervalMs ?? 50;\n\n return {\n async acquire(): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n try {\n await writeFile(lockPath, String(process.pid), { flag: 'wx' });\n return;\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n if (await isLockStale(lockPath)) {\n try {\n await unlink(lockPath);\n } catch {\n // Another process may have removed it\n }\n continue;\n }\n await sleep(retryIntervalMs);\n } else {\n throw err;\n }\n }\n }\n throw new LockTimeoutError(lockPath, timeoutMs);\n },\n\n async release(): Promise<void> {\n try {\n await unlink(lockPath);\n } catch {\n // Lock file may already be removed\n }\n },\n };\n}\n\nasync function isLockStale(lockPath: string): Promise<boolean> {\n try {\n const info = await stat(lockPath);\n return Date.now() - info.mtimeMs > STALE_THRESHOLD_MS;\n } catch {\n return true;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { appendFile, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Decision } from '../types/index.js';\nimport { decisionSchema } from '../types/index.js';\nimport { ensureDir, fileExists } from '../utils/fs-helpers.js';\nimport { createFileLock } from '../utils/file-lock.js';\n\nconst DECISIONS_FILE = 'decisions.jsonl';\n\nexport interface DecisionsLog {\n append(decision: Decision): Promise<void>;\n readAll(): Promise<Decision[]>;\n queryByFeature(feature: string): Promise<Decision[]>;\n queryByAgent(agent: string): Promise<Decision[]>;\n}\n\nexport function createDecisionsLog(memoryDir: string): DecisionsLog {\n const filePath = join(memoryDir, DECISIONS_FILE);\n\n return {\n async append(decision: Decision): Promise<void> {\n decisionSchema.parse(decision);\n await ensureDir(memoryDir);\n const lock = createFileLock(filePath + '.lock');\n try {\n await lock.acquire();\n const line = JSON.stringify(decision) + '\\n';\n await appendFile(filePath, line, 'utf-8');\n } finally {\n await lock.release();\n }\n },\n\n async readAll(): Promise<Decision[]> {\n if (!(await fileExists(filePath))) return [];\n const content = await readFile(filePath, 'utf-8');\n return parseJsonl(content);\n },\n\n async queryByFeature(feature: string): Promise<Decision[]> {\n const all = await this.readAll();\n return all.filter((d) => d.feature === feature);\n },\n\n async queryByAgent(agent: string): Promise<Decision[]> {\n const all = await this.readAll();\n return all.filter((d) => d.agent === agent);\n },\n };\n}\n\nfunction parseJsonl(content: string): Decision[] {\n return content\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => {\n const parsed = JSON.parse(line) as Decision;\n return decisionSchema.parse(parsed);\n });\n}\n","import { appendFile, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { ensureDir, fileExists } from '../utils/fs-helpers.js';\n\nconst METRICS_FILE = 'metrics.jsonl';\n\nexport interface MetricEntry {\n ts: string;\n feature: string;\n agent: string;\n provider: string;\n tokensUsed: number;\n durationMs: number;\n cost: number;\n}\n\nexport interface FeatureMetricsSummary {\n feature: string;\n totalTokens: number;\n totalCost: number;\n totalDurationMs: number;\n entries: number;\n}\n\nexport interface MetricsCollector {\n record(entry: MetricEntry): Promise<void>;\n readAll(): Promise<MetricEntry[]>;\n getByFeature(feature: string): Promise<MetricEntry[]>;\n summarizeByFeature(): Promise<FeatureMetricsSummary[]>;\n}\n\nexport function createMetricsCollector(memoryDir: string): MetricsCollector {\n const filePath = join(memoryDir, METRICS_FILE);\n\n return {\n async record(entry: MetricEntry): Promise<void> {\n await ensureDir(memoryDir);\n const line = JSON.stringify(entry) + '\\n';\n await appendFile(filePath, line, 'utf-8');\n },\n\n async readAll(): Promise<MetricEntry[]> {\n if (!(await fileExists(filePath))) return [];\n const content = await readFile(filePath, 'utf-8');\n return content\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as MetricEntry);\n },\n\n async getByFeature(feature: string): Promise<MetricEntry[]> {\n const all = await this.readAll();\n return all.filter((e) => e.feature === feature);\n },\n\n async summarizeByFeature(): Promise<FeatureMetricsSummary[]> {\n const all = await this.readAll();\n const grouped = new Map<string, MetricEntry[]>();\n\n for (const entry of all) {\n const existing = grouped.get(entry.feature) ?? [];\n existing.push(entry);\n grouped.set(entry.feature, existing);\n }\n\n const summaries: FeatureMetricsSummary[] = [];\n for (const [feature, entries] of grouped) {\n summaries.push({\n feature,\n totalTokens: entries.reduce((sum, e) => sum + e.tokensUsed, 0),\n totalCost: entries.reduce((sum, e) => sum + e.cost, 0),\n totalDurationMs: entries.reduce((sum, e) => sum + e.durationMs, 0),\n entries: entries.length,\n });\n }\n\n return summaries;\n },\n };\n}\n","import chalk from 'chalk';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n timestamp: string;\n}\n\nexport interface Logger {\n debug(message: string, context?: Record<string, unknown>): void;\n info(message: string, context?: Record<string, unknown>): void;\n warn(message: string, context?: Record<string, unknown>): void;\n error(message: string, context?: Record<string, unknown>): void;\n setLevel(level: LogLevel): void;\n getLevel(): LogLevel;\n}\n\nexport function createLogger(\n minLevel: LogLevel = 'info',\n output: (entry: LogEntry) => void = defaultOutput,\n): Logger {\n let currentLevel = minLevel;\n\n function log(level: LogLevel, message: string, context?: Record<string, unknown>): void {\n if (LOG_LEVELS[level] < LOG_LEVELS[currentLevel]) return;\n\n const entry: LogEntry = {\n level,\n message,\n context,\n timestamp: new Date().toISOString(),\n };\n output(entry);\n }\n\n return {\n debug: (message, context) => log('debug', message, context),\n info: (message, context) => log('info', message, context),\n warn: (message, context) => log('warn', message, context),\n error: (message, context) => log('error', message, context),\n setLevel: (level) => {\n currentLevel = level;\n },\n getLevel: () => currentLevel,\n };\n}\n\nfunction defaultOutput(entry: LogEntry): void {\n const prefix = formatPrefix(entry.level);\n const ctx = entry.context ? ` ${JSON.stringify(entry.context)}` : '';\n // eslint-disable-next-line no-console\n console.log(`${prefix} ${entry.message}${ctx}`);\n}\n\nfunction formatPrefix(level: LogLevel): string {\n switch (level) {\n case 'debug':\n return chalk.gray('[DEBUG]');\n case 'info':\n return chalk.blue('[INFO]');\n case 'warn':\n return chalk.yellow('[WARN]');\n case 'error':\n return chalk.red('[ERROR]');\n }\n}\n","import { createInterface } from 'node:readline';\nimport type {\n AidenConfig,\n AidenMode,\n AidenProvider,\n FeatureContext,\n AgentRole,\n AgentOutput,\n TokenBudgetConfig,\n TaskType,\n} from '../types/index.js';\nimport type { ContextStore } from '../memory/context-store.js';\nimport type { DecisionsLog } from '../memory/decisions-log.js';\nimport type { MetricsCollector } from '../memory/metrics-collector.js';\nimport type { Logger } from '../utils/logger.js';\nimport type { ProviderRouter } from '../providers/router.js';\nimport type { ProviderRegistry } from '../providers/provider-registry.js';\nimport { LeadAgent } from '../agents/lead.js';\nimport { AnalystAgent } from '../agents/analyst.js';\nimport { PlannerAgent } from '../agents/planner.js';\nimport { DevAgent } from '../agents/dev.js';\nimport { QAAgent } from '../agents/qa.js';\nimport { DocOpsAgent } from '../agents/docops.js';\nimport type { BaseAgent, AgentDependencies, PipelineContext } from '../agents/base-agent.js';\nimport { transition } from './feature-state.js';\nimport { discoveryGateCriteria, planningGateCriteria } from './quality-gate.js';\nimport { loadRules } from '../rules/rules-loader.js';\nimport { getRulesForAgent } from '../rules/rules-injector.js';\nimport { loadSkills } from '../skills/skill-loader.js';\nimport {\n getSkillsForAgent,\n formatSkillInstructions,\n extractSkillRules,\n} from '../skills/skill-injector.js';\nimport {\n resolveAgentProfile,\n resolveAgentProfilePersona,\n formatAgentProfileInstructions,\n} from '../agents/agent-profiles.js';\nimport { slugify } from '../utils/slugify.js';\nimport { createFileLock, type FileLock } from '../utils/file-lock.js';\nimport { join } from 'node:path';\nimport { ensureDir } from '../utils/fs-helpers.js';\nimport { createHookRunner, HookBlockError, type HookRunner } from '../hooks/hook-runner.js';\nimport { TraceCollector } from './trace/trace-collector.js';\nimport { TraceStore } from './trace/trace-store.js';\nimport type { Trace, TraceListener } from './trace/trace-types.js';\nimport { TraceHookBridge } from './trace/trace-hook-bridge.js';\n\nconst MAX_QA_RETRIES = 2;\n\nexport class FeatureLockError extends Error {\n constructor(featureSlug: string) {\n super(\n `Feature \"${featureSlug}\" is already being processed by another workflow. Try again later.`,\n );\n this.name = 'FeatureLockError';\n }\n}\n\nconst AGENT_TASK_TYPE: Record<AgentRole, TaskType> = {\n lead: 'analysis',\n analyst: 'analysis',\n planner: 'planning',\n dev: 'code_gen',\n qa: 'code_review',\n docops: 'documentation',\n};\n\nexport type ApprovalHandler = (\n phase: string,\n featureSlug: string,\n agentOutput: AgentOutput,\n) => Promise<boolean>;\n\nexport interface OrchestratorDependencies {\n config: AidenConfig;\n router: ProviderRouter;\n registry: ProviderRegistry;\n contextStore: ContextStore;\n decisionsLog: DecisionsLog;\n metricsCollector: MetricsCollector;\n logger: Logger;\n aidenDir?: string;\n rulesDir?: string;\n skillsDir?: string;\n}\n\nexport interface WorkflowResult {\n feature: string;\n mode: AidenMode;\n status: 'completed' | 'blocked' | 'aborted';\n agentOutputs: AgentOutput[];\n totalTokens: number;\n totalDurationMs: number;\n trace?: Trace;\n}\n\nexport interface WorkflowOptions {\n trace?: boolean;\n traceListener?: TraceListener;\n}\n\nexport class Orchestrator {\n private readonly deps: OrchestratorDependencies;\n private readonly lead: LeadAgent;\n private readonly agents: Map<AgentRole, BaseAgent>;\n private readonly hookRunner: HookRunner;\n private approvalHandler: ApprovalHandler = defaultApprovalHandler;\n\n constructor(deps: OrchestratorDependencies) {\n this.deps = deps;\n this.hookRunner = createHookRunner(deps.config.hooks ?? {}, deps.logger);\n\n const budgetConfig: TokenBudgetConfig = deps.config.budget ?? {\n monthlyLimit: 500000,\n alertAt: 80,\n perFeature: { flash: 5000, standard: 20000, enterprise: 100000 },\n };\n\n // Use a placeholder provider for agent construction — actual provider\n // is resolved per-agent via the router before each execution\n const placeholderProvider = this.getFirstAvailableProviderSync();\n\n const agentDeps: AgentDependencies = {\n config: {\n role: 'lead',\n provider: placeholderProvider.name,\n maxRetries: 3,\n objectiveReminderInterval: 5,\n maxFileChanges: 10,\n rules: [],\n },\n provider: placeholderProvider,\n contextStore: deps.contextStore,\n decisionsLog: deps.decisionsLog,\n logger: deps.logger,\n budgetConfig,\n };\n\n this.lead = new LeadAgent(agentDeps);\n this.agents = new Map();\n this.agents.set('lead', this.lead);\n this.agents.set(\n 'analyst',\n new AnalystAgent({ ...agentDeps, config: { ...agentDeps.config, role: 'analyst' } }),\n );\n this.agents.set(\n 'planner',\n new PlannerAgent({ ...agentDeps, config: { ...agentDeps.config, role: 'planner' } }),\n );\n this.agents.set(\n 'dev',\n new DevAgent({ ...agentDeps, config: { ...agentDeps.config, role: 'dev' } }),\n );\n this.agents.set(\n 'qa',\n new QAAgent({ ...agentDeps, config: { ...agentDeps.config, role: 'qa' } }),\n );\n this.agents.set(\n 'docops',\n new DocOpsAgent({ ...agentDeps, config: { ...agentDeps.config, role: 'docops' } }),\n );\n }\n\n setApprovalHandler(handler: ApprovalHandler): void {\n this.approvalHandler = handler;\n }\n\n async runFlash(featureRequest: string, options?: WorkflowOptions): Promise<WorkflowResult> {\n return this.runWorkflow(featureRequest, 'flash', options);\n }\n\n async runStandard(featureRequest: string, options?: WorkflowOptions): Promise<WorkflowResult> {\n return this.runWorkflow(featureRequest, 'standard', options);\n }\n\n async runEnterprise(featureRequest: string, options?: WorkflowOptions): Promise<WorkflowResult> {\n return this.runWorkflow(featureRequest, 'enterprise', options);\n }\n\n async runWorkflow(\n featureRequest: string,\n mode: AidenMode,\n options?: WorkflowOptions,\n ): Promise<WorkflowResult> {\n const start = Date.now();\n const featureSlug = slugify(featureRequest);\n\n // Acquire feature-level lock\n const featureLock = await this.acquireFeatureLock(featureSlug);\n\n try {\n // Set mode on mode-aware agents\n const qaAgent = this.agents.get('qa');\n if (qaAgent && 'setMode' in qaAgent) {\n (qaAgent as import('../agents/qa.js').QAAgent).setMode(mode);\n }\n const analystAgent = this.agents.get('analyst');\n if (analystAgent && 'setMode' in analystAgent) {\n (analystAgent as import('../agents/analyst.js').AnalystAgent).setMode(mode);\n }\n\n // Create trace collector\n const traceCollector = new TraceCollector(\n featureSlug,\n mode,\n options?.trace ?? false,\n options?.traceListener,\n );\n\n return await this.executeWorkflow(featureRequest, featureSlug, mode, start, traceCollector);\n } finally {\n await featureLock.release();\n }\n }\n\n private async executeWorkflow(\n featureRequest: string,\n featureSlug: string,\n mode: AidenMode,\n start: number,\n traceCollector: TraceCollector,\n ): Promise<WorkflowResult> {\n const outputs: AgentOutput[] = [];\n const tc = traceCollector;\n const hookBridge = new TraceHookBridge(tc);\n\n this.deps.logger.info(`Starting ${mode} workflow for: ${featureRequest}`);\n\n // Create feature in context\n const feature: FeatureContext = {\n slug: featureSlug,\n name: featureRequest,\n state: 'created',\n mode,\n objective: featureRequest,\n constraints: [],\n decisions: [],\n blockers: [],\n tokensUsed: 0,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n const ctx = await this.deps.contextStore.load();\n ctx.activeFeatures[featureSlug] = feature;\n await this.deps.contextStore.save(ctx);\n\n await this.runHook(\n 'on_feature_created',\n featureSlug,\n mode,\n undefined,\n undefined,\n hookBridge,\n tc.getRootSpanId(),\n );\n\n const projectContext = await this.deps.contextStore.load();\n const workflow = this.lead.getWorkflow(mode);\n\n // Load enterprise rules once before the loop\n const rulesDir =\n this.deps.rulesDir ?? join(this.deps.aidenDir ?? process.cwd(), '.aiden', 'rules');\n const allRules = await loadRules(rulesDir);\n\n // Load skills once before the loop\n const skillsDir =\n this.deps.skillsDir ?? join(this.deps.aidenDir ?? process.cwd(), '.aiden', 'skills');\n const allSkills = await loadSkills(skillsDir);\n const activeProfile = resolveAgentProfile(\n this.deps.config.activeProfile,\n this.deps.config,\n allSkills,\n );\n const profileInstructions = formatAgentProfileInstructions(activeProfile);\n\n for (const step of workflow) {\n const agent = this.agents.get(step.agent);\n if (!agent) continue;\n\n // Trace: start phase span\n const phaseSpanId = tc.startSpan('phase', step.phase, tc.getRootSpanId(), {\n phase_name: step.phase,\n agent_planned: step.agent,\n });\n\n // Apply active agent profile persona before prompt construction.\n agent.setPersona(resolveAgentProfilePersona(activeProfile, step.agent));\n if (activeProfile) {\n tc.addEvent(phaseSpanId, 'agent_profile', undefined, {\n profile: String(activeProfile.name ?? this.deps.config.activeProfile ?? 'unknown'),\n persona_override: resolveAgentProfilePersona(activeProfile, step.agent) !== undefined,\n });\n }\n\n // Inject skills for this agent\n const agentSkills = getSkillsForAgent(step.agent, mode, allSkills);\n const skillInstructions = [profileInstructions, formatSkillInstructions(agentSkills)]\n .filter((block) => block.length > 0)\n .join('\\n\\n---\\n\\n');\n agent.injectSkillInstructions(skillInstructions);\n\n if (agentSkills.length > 0) {\n tc.addEvent(phaseSpanId, 'skill_injection', undefined, {\n skills_count: agentSkills.length,\n skill_names: agentSkills.map((s) => s.manifest.name).join(', '),\n });\n }\n\n // Merge skill rules with project rules\n const skillRules = extractSkillRules(agentSkills);\n const agentRules = getRulesForAgent(step.agent, allRules);\n agent.injectRules([...agentRules, ...skillRules]);\n\n // Route provider for this agent\n const agentProvider = await this.resolveProviderForAgent(step.agent);\n agent.setProvider(agentProvider);\n\n tc.addEvent(phaseSpanId, 'provider_routed', undefined, {\n task_type: AGENT_TASK_TYPE[step.agent],\n provider_selected: agentProvider.name,\n });\n\n // Transition state (may require intermediate states)\n const targetState = this.getStateForPhase(step.phase);\n if (targetState) {\n // If going to in_progress from planning, need to pass through ready\n if (targetState === 'in_progress' && feature.state === 'planning') {\n feature.state = transition(feature.state, 'ready');\n feature.state = transition(feature.state, 'in_progress');\n } else {\n feature.state = transition(feature.state, targetState);\n }\n feature.currentAgent = step.agent;\n await this.deps.contextStore.updateFeature(featureSlug, {\n state: feature.state,\n currentAgent: step.agent,\n });\n }\n\n this.deps.logger.info(\n `Phase: ${step.phase}, Agent: ${step.agent}, Provider: ${agentProvider.name}`,\n );\n\n await this.runHook(\n 'on_phase_start',\n featureSlug,\n mode,\n step.phase,\n step.agent,\n hookBridge,\n phaseSpanId,\n );\n\n // Execute with circuit breaker\n const cb = this.lead.getCircuitBreaker(step.agent);\n if (!cb.canExecute()) {\n this.deps.logger.warn(`Circuit breaker open for ${step.agent}, skipping`);\n tc.addEvent(phaseSpanId, 'circuit_breaker_open', `Skipping ${step.agent}`, {\n agent: step.agent,\n });\n tc.endSpan(phaseSpanId, 'skipped');\n continue;\n }\n\n try {\n // Token budget check event\n const budgetTotal = this.deps.config.budget?.perFeature?.[mode] ?? 20000;\n const budgetRemaining = budgetTotal - feature.tokensUsed;\n tc.addEvent(phaseSpanId, 'token_budget_check', undefined, {\n remaining: budgetRemaining,\n used: feature.tokensUsed,\n limit: budgetTotal,\n exceeded: budgetRemaining <= 0,\n });\n\n // Inject objective reminder before execution\n const reminder = this.lead.injectObjectiveReminder(feature, budgetTotal);\n if (reminder) {\n this.deps.logger.info('Objective reminder injected');\n tc.addEvent(phaseSpanId, 'objective_reminder_injected');\n }\n\n const pipeline: PipelineContext = {\n featureRequest,\n featureSlug,\n previousOutputs: [...outputs],\n projectContext,\n maxOutputCharsPerAgent: this.deps.config.pipeline?.maxOutputCharsPerAgent,\n objectiveReminder: reminder ?? undefined,\n lang: this.deps.config.lang,\n mode,\n memoryConfig: this.deps.config.memory,\n traceCollector: tc,\n currentPhaseSpanId: phaseSpanId,\n };\n\n // Trace: agent execution span\n const agentSpanId = tc.startSpan('agent_execution', step.agent, phaseSpanId, {\n agent_role: step.agent,\n provider: agentProvider.name,\n });\n\n let output = await agent.execute(pipeline);\n\n tc.setAttribute(agentSpanId, 'tokens_used', output.tokensUsed);\n tc.setAttribute(agentSpanId, 'duration_ms', output.durationMs);\n tc.setAttribute(agentSpanId, 'output_length', output.content.length);\n tc.endSpan(agentSpanId, 'success');\n\n cb.recordSuccess();\n outputs.push(output);\n\n await this.recordMetrics(featureSlug, feature, step.agent, agentProvider, output);\n\n // Quality gate: discovery phase\n if (step.phase === 'discovery') {\n const gateSpanId = tc.startSpan('quality_gate', 'gate:discovery', phaseSpanId);\n const gate = discoveryGateCriteria(\n output.content.length > 0,\n (output.structured?.complexity ?? 0) > 0,\n );\n const gateResult = await this.lead.checkQualityGate(gate);\n tc.setAttribute(gateSpanId, 'passed', gateResult.passed);\n tc.endSpan(gateSpanId, gateResult.passed ? 'success' : 'failure');\n\n if (!gateResult.passed) {\n this.deps.logger.warn(`Quality gate failed for ${step.phase}`);\n await this.deps.decisionsLog.append({\n ts: new Date().toISOString(),\n feature: featureSlug,\n agent: 'lead',\n type: 'quality_gate_failed',\n value: step.phase,\n reason: gateResult.criteria\n .filter((c) => !c.passed)\n .map((c) => c.message)\n .join('; '),\n });\n feature.state = transition(feature.state, 'blocked');\n feature.blockers.push(`Quality gate failed: ${step.phase}`);\n await this.deps.contextStore.updateFeature(featureSlug, {\n state: 'blocked',\n blockers: feature.blockers,\n });\n await this.runHook(\n 'on_feature_blocked',\n featureSlug,\n mode,\n undefined,\n undefined,\n hookBridge,\n phaseSpanId,\n );\n tc.endSpan(phaseSpanId, 'failure');\n const trace = tc.finalize('failed') ?? undefined;\n if (trace) await this.saveTrace(trace);\n return {\n feature: featureSlug,\n mode,\n status: 'blocked',\n agentOutputs: outputs,\n totalTokens: feature.tokensUsed,\n totalDurationMs: Date.now() - start,\n trace,\n };\n }\n }\n\n // Quality gate: planning phase\n if (step.phase === 'planning') {\n const gateSpanId = tc.startSpan('quality_gate', 'gate:planning', phaseSpanId);\n const storiesCount = output.structured?.stories?.length ?? 0;\n const gate = planningGateCriteria(output.content.length > 0, storiesCount);\n const gateResult = await this.lead.checkQualityGate(gate);\n tc.setAttribute(gateSpanId, 'passed', gateResult.passed);\n tc.setAttribute(gateSpanId, 'stories_count', storiesCount);\n tc.endSpan(gateSpanId, gateResult.passed ? 'success' : 'failure');\n\n if (!gateResult.passed) {\n this.deps.logger.warn(`Quality gate failed for ${step.phase}`);\n await this.deps.decisionsLog.append({\n ts: new Date().toISOString(),\n feature: featureSlug,\n agent: 'lead',\n type: 'quality_gate_failed',\n value: step.phase,\n reason: gateResult.criteria\n .filter((c) => !c.passed)\n .map((c) => c.message)\n .join('; '),\n });\n feature.state = transition(feature.state, 'blocked');\n feature.blockers.push(`Quality gate failed: ${step.phase}`);\n await this.deps.contextStore.updateFeature(featureSlug, {\n state: 'blocked',\n blockers: feature.blockers,\n });\n await this.runHook(\n 'on_feature_blocked',\n featureSlug,\n mode,\n undefined,\n undefined,\n hookBridge,\n phaseSpanId,\n );\n tc.endSpan(phaseSpanId, 'failure');\n const trace = tc.finalize('failed') ?? undefined;\n if (trace) await this.saveTrace(trace);\n return {\n feature: featureSlug,\n mode,\n status: 'blocked',\n agentOutputs: outputs,\n totalTokens: feature.tokensUsed,\n totalDurationMs: Date.now() - start,\n trace,\n };\n }\n }\n\n // QA feedback loop: retry Dev + QA if QA fails\n if (step.phase === 'validation' && this.isQAFailure(output)) {\n let retryCount = 0;\n while (this.isQAFailure(output) && retryCount < MAX_QA_RETRIES) {\n retryCount++;\n this.deps.logger.warn(`QA failed, retry ${retryCount}/${MAX_QA_RETRIES}`);\n\n const retrySpanId = tc.startSpan('retry', `retry:qa:${retryCount}`, phaseSpanId, {\n attempt: retryCount,\n max_retries: MAX_QA_RETRIES,\n qa_score: output.structured?.score ?? 0,\n qa_passed: false,\n });\n\n // Re-run Dev with QA feedback — resolve provider for dev\n const devAgent = this.agents.get('dev')!;\n const devProvider = await this.resolveProviderForAgent('dev');\n devAgent.setProvider(devProvider);\n\n const devRetrySpanId = tc.startSpan('agent_execution', 'dev', retrySpanId, {\n agent_role: 'dev',\n provider: devProvider.name,\n retry_attempt: retryCount,\n });\n\n const devRetryPipeline: PipelineContext = {\n featureRequest,\n featureSlug,\n previousOutputs: [...outputs],\n projectContext,\n traceCollector: tc,\n currentPhaseSpanId: retrySpanId,\n };\n const devRetry = await devAgent.execute(devRetryPipeline);\n tc.setAttribute(devRetrySpanId, 'tokens_used', devRetry.tokensUsed);\n tc.endSpan(devRetrySpanId, 'success');\n outputs.push(devRetry);\n await this.recordMetrics(featureSlug, feature, 'dev', devProvider, devRetry);\n\n // Re-run QA\n const qaRetrySpanId = tc.startSpan('agent_execution', 'qa', retrySpanId, {\n agent_role: 'qa',\n provider: agentProvider.name,\n retry_attempt: retryCount,\n });\n\n const qaRetryPipeline: PipelineContext = {\n featureRequest,\n featureSlug,\n previousOutputs: [...outputs],\n projectContext,\n traceCollector: tc,\n currentPhaseSpanId: retrySpanId,\n };\n output = await agent.execute(qaRetryPipeline);\n tc.setAttribute(qaRetrySpanId, 'tokens_used', output.tokensUsed);\n tc.setAttribute(qaRetrySpanId, 'qa_passed', !this.isQAFailure(output));\n tc.setAttribute(qaRetrySpanId, 'qa_score', output.structured?.score ?? 0);\n tc.endSpan(qaRetrySpanId, this.isQAFailure(output) ? 'failure' : 'success');\n outputs.push(output);\n await this.recordMetrics(featureSlug, feature, 'qa', agentProvider, output);\n\n tc.endSpan(retrySpanId, this.isQAFailure(output) ? 'failure' : 'success');\n }\n\n if (this.isQAFailure(output)) {\n const score = output.structured?.score ?? 0;\n const reason = `QA failed after ${MAX_QA_RETRIES} retries (score: ${score}/10)`;\n this.deps.logger.warn(reason);\n await this.deps.decisionsLog.append({\n ts: new Date().toISOString(),\n feature: featureSlug,\n agent: 'lead',\n type: 'quality_gate_failed',\n value: 'validation',\n reason,\n });\n feature.state = transition(feature.state, 'blocked');\n feature.blockers.push(reason);\n await this.deps.contextStore.updateFeature(featureSlug, {\n state: 'blocked',\n blockers: feature.blockers,\n });\n await this.runHook(\n 'on_feature_blocked',\n featureSlug,\n mode,\n undefined,\n undefined,\n hookBridge,\n phaseSpanId,\n );\n tc.addEvent(phaseSpanId, 'qa_retries_exhausted', reason, {\n retries: MAX_QA_RETRIES,\n qa_score: score,\n });\n tc.endSpan(phaseSpanId, 'failure');\n const trace = tc.finalize('failed') ?? undefined;\n if (trace) await this.saveTrace(trace);\n return {\n feature: featureSlug,\n mode,\n status: 'blocked',\n agentOutputs: outputs,\n totalTokens: feature.tokensUsed,\n totalDurationMs: Date.now() - start,\n trace,\n };\n }\n }\n\n // Enterprise approval gate\n if (mode === 'enterprise') {\n const approvalSpanId = tc.startSpan(\n 'human_approval',\n `approval:${step.phase}`,\n phaseSpanId,\n );\n const approvalStart = Date.now();\n const approved = await this.approvalHandler(step.phase, featureSlug, output);\n tc.setAttribute(approvalSpanId, 'approved', approved);\n tc.setAttribute(approvalSpanId, 'wait_time_ms', Date.now() - approvalStart);\n tc.endSpan(approvalSpanId, approved ? 'success' : 'failure');\n\n if (!approved) {\n this.deps.logger.info(`Human rejected phase ${step.phase} for ${featureSlug}`);\n await this.deps.decisionsLog.append({\n ts: new Date().toISOString(),\n feature: featureSlug,\n agent: 'lead',\n type: 'approval_rejected',\n value: step.phase,\n reason: 'Human rejected phase output',\n });\n tc.endSpan(phaseSpanId, 'failure');\n const trace = tc.finalize('aborted') ?? undefined;\n if (trace) await this.saveTrace(trace);\n return {\n feature: featureSlug,\n mode,\n status: 'aborted',\n agentOutputs: outputs,\n totalTokens: feature.tokensUsed,\n totalDurationMs: Date.now() - start,\n trace,\n };\n }\n }\n\n tc.endSpan(phaseSpanId, 'success');\n await this.runHook(\n 'on_phase_end',\n featureSlug,\n mode,\n step.phase,\n step.agent,\n hookBridge,\n phaseSpanId,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n tc.addEvent(phaseSpanId, 'agent_error', errorMsg, { agent: step.agent });\n const canRetry = this.lead.handleCircuitBreaker(step.agent, errorMsg);\n if (!canRetry) {\n tc.addEvent(phaseSpanId, 'circuit_breaker_triggered', undefined, {\n agent: step.agent,\n });\n tc.endSpan(phaseSpanId, 'failure');\n\n feature.state = transition(feature.state, 'blocked');\n feature.blockers.push(`Agent ${step.agent} failed: ${errorMsg}`);\n await this.deps.contextStore.updateFeature(featureSlug, {\n state: 'blocked',\n blockers: feature.blockers,\n });\n\n await this.runHook('on_feature_blocked', featureSlug, mode);\n\n const trace = tc.finalize('failed') ?? undefined;\n if (trace) await this.saveTrace(trace);\n return {\n feature: featureSlug,\n mode,\n status: 'blocked',\n agentOutputs: outputs,\n totalTokens: feature.tokensUsed,\n totalDurationMs: Date.now() - start,\n trace,\n };\n }\n }\n }\n\n // Mark completed\n feature.state = transition(feature.state, 'completed');\n await this.deps.contextStore.updateFeature(featureSlug, { state: 'completed' });\n\n await this.runHook(\n 'on_feature_completed',\n featureSlug,\n mode,\n undefined,\n undefined,\n hookBridge,\n tc.getRootSpanId(),\n );\n\n const trace = tc.finalize('completed') ?? undefined;\n if (trace) await this.saveTrace(trace);\n\n return {\n feature: featureSlug,\n mode,\n status: 'completed',\n agentOutputs: outputs,\n totalTokens: feature.tokensUsed,\n totalDurationMs: Date.now() - start,\n trace,\n };\n }\n\n async switchMode(\n featureSlug: string,\n newMode: AidenMode,\n traceCollector?: TraceCollector,\n ): Promise<WorkflowResult> {\n const start = Date.now();\n const feature = await this.deps.contextStore.getFeature(featureSlug);\n if (!feature) {\n throw new Error(`Feature \"${featureSlug}\" not found`);\n }\n\n const oldMode = feature.mode;\n this.deps.logger.info(`Mode switch: ${oldMode} -> ${newMode} for ${featureSlug}`);\n\n // Trace: mode_switch span\n const tc = traceCollector;\n const switchSpanId =\n tc?.startSpan('mode_switch', `switch:${oldMode}->${newMode}`, tc.getRootSpanId(), {\n from_mode: oldMode,\n to_mode: newMode,\n }) ?? '';\n tc?.setModeSwitch(oldMode, newMode, `User requested switch from ${oldMode} to ${newMode}`);\n\n await this.deps.contextStore.updateFeature(featureSlug, { mode: newMode });\n\n await this.deps.decisionsLog.append({\n ts: new Date().toISOString(),\n feature: featureSlug,\n agent: 'lead',\n type: 'mode_switch',\n value: newMode,\n reason: `Switched from ${oldMode} to ${newMode}`,\n });\n\n // Determine completed phases based on current state\n const completedPhases = this.lead.getCompletedPhases(feature.state);\n const missingSteps = this.lead.getMissingSteps(completedPhases, newMode);\n\n if (missingSteps.length === 0) {\n this.deps.logger.info(`No missing phases for mode switch to ${newMode}`);\n tc?.endSpan(switchSpanId, 'success');\n return {\n feature: featureSlug,\n mode: newMode,\n status: 'completed',\n agentOutputs: [],\n totalTokens: feature.tokensUsed,\n totalDurationMs: Date.now() - start,\n };\n }\n\n this.deps.logger.info(\n `Executing ${missingSteps.length} missing phases: ${missingSteps.map((s) => s.phase).join(', ')}`,\n );\n\n const outputs: AgentOutput[] = [];\n const projectContext = await this.deps.contextStore.load();\n\n // Load enterprise rules for missing steps\n const rulesDir =\n this.deps.rulesDir ?? join(this.deps.aidenDir ?? process.cwd(), '.aiden', 'rules');\n const allRules = await loadRules(rulesDir);\n\n // Load skills for missing steps\n const skillsDir =\n this.deps.skillsDir ?? join(this.deps.aidenDir ?? process.cwd(), '.aiden', 'skills');\n const allSkills = await loadSkills(skillsDir);\n const activeProfile = resolveAgentProfile(\n this.deps.config.activeProfile,\n this.deps.config,\n allSkills,\n );\n const profileInstructions = formatAgentProfileInstructions(activeProfile);\n\n for (const step of missingSteps) {\n const agent = this.agents.get(step.agent);\n if (!agent) continue;\n\n // Inject profile and skills for this agent\n agent.setPersona(resolveAgentProfilePersona(activeProfile, step.agent));\n const agentSkills = getSkillsForAgent(step.agent, newMode, allSkills);\n const skillInstructions = [profileInstructions, formatSkillInstructions(agentSkills)]\n .filter((block) => block.length > 0)\n .join('\\n\\n---\\n\\n');\n agent.injectSkillInstructions(skillInstructions);\n\n // Merge skill rules with project rules\n const skillRules = extractSkillRules(agentSkills);\n const agentRules = getRulesForAgent(step.agent, allRules);\n agent.injectRules([...agentRules, ...skillRules]);\n\n const agentProvider = await this.resolveProviderForAgent(step.agent);\n agent.setProvider(agentProvider);\n\n this.deps.logger.info(\n `Mode switch phase: ${step.phase}, Agent: ${step.agent}, Provider: ${agentProvider.name}`,\n );\n\n const pipeline: PipelineContext = {\n featureRequest: feature.objective,\n featureSlug,\n previousOutputs: [...outputs],\n projectContext,\n maxOutputCharsPerAgent: this.deps.config.pipeline?.maxOutputCharsPerAgent,\n };\n\n try {\n const output = await agent.execute(pipeline);\n outputs.push(output);\n await this.recordMetrics(featureSlug, feature, step.agent, agentProvider, output);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n this.deps.logger.error(`Mode switch phase ${step.phase} failed: ${errorMsg}`);\n tc?.endSpan(switchSpanId, 'failure');\n return {\n feature: featureSlug,\n mode: newMode,\n status: 'blocked',\n agentOutputs: outputs,\n totalTokens: feature.tokensUsed,\n totalDurationMs: Date.now() - start,\n };\n }\n }\n\n tc?.endSpan(switchSpanId, 'success');\n return {\n feature: featureSlug,\n mode: newMode,\n status: 'completed',\n agentOutputs: outputs,\n totalTokens: feature.tokensUsed,\n totalDurationMs: Date.now() - start,\n };\n }\n\n async resume(featureSlug: string): Promise<FeatureContext | undefined> {\n const feature = await this.deps.contextStore.getFeature(featureSlug);\n if (!feature) {\n this.deps.logger.error(`Feature \"${featureSlug}\" not found`);\n return undefined;\n }\n\n this.deps.logger.info(`Resuming feature: ${featureSlug} (state: ${feature.state})`);\n\n if (feature.state === 'blocked') {\n // Unblock: return to previous viable state\n feature.state = transition(feature.state, 'in_progress');\n await this.deps.contextStore.updateFeature(featureSlug, {\n state: feature.state,\n blockers: [],\n });\n }\n\n return feature;\n }\n\n async abort(featureSlug: string): Promise<void> {\n const feature = await this.deps.contextStore.getFeature(featureSlug);\n if (!feature) {\n this.deps.logger.error(`Feature \"${featureSlug}\" not found`);\n return;\n }\n\n this.deps.logger.info(`Aborting feature: ${featureSlug}`);\n\n await this.deps.decisionsLog.append({\n ts: new Date().toISOString(),\n feature: featureSlug,\n agent: 'lead',\n type: 'abort',\n value: feature.state,\n reason: 'User requested abort',\n });\n\n await this.deps.contextStore.removeFeature(featureSlug);\n }\n\n private async saveTrace(trace: Trace): Promise<void> {\n try {\n const baseDir = this.deps.aidenDir ?? join(process.cwd(), '.aiden');\n const tracesDir = join(baseDir, 'traces');\n const store = new TraceStore(tracesDir);\n const path = await store.save(trace);\n this.deps.logger.info(`Trace saved: ${path}`);\n } catch (err) {\n this.deps.logger.warn(\n `Failed to save trace: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n private async acquireFeatureLock(featureSlug: string): Promise<FileLock> {\n const baseCtaDir = this.deps.aidenDir ?? join(process.cwd(), '.aiden');\n const featureDir = join(baseCtaDir, 'features', featureSlug);\n await ensureDir(featureDir);\n const lock = createFileLock(join(featureDir, '.lock'), { timeoutMs: 5000 });\n try {\n await lock.acquire();\n } catch {\n throw new FeatureLockError(featureSlug);\n }\n return lock;\n }\n\n private async resolveProviderForAgent(agentRole: AgentRole): Promise<AidenProvider> {\n const taskType = AGENT_TASK_TYPE[agentRole];\n try {\n return await this.deps.router.route(taskType);\n } catch {\n // Fallback: return first available provider from registry\n this.deps.logger.warn(`Router failed for ${agentRole} (${taskType}), using fallback`);\n const available = await this.deps.registry.getAvailable();\n if (available.length === 0) {\n throw new Error(`No provider available for agent ${agentRole}`);\n }\n return available[0];\n }\n }\n\n private getFirstAvailableProviderSync(): AidenProvider {\n // Synchronous fallback: get the first registered provider for construction\n const all = this.deps.registry.getAll();\n if (all.length === 0) {\n throw new Error('No providers registered');\n }\n return all[0];\n }\n\n private isQAFailure(output: AgentOutput): boolean {\n if (output.structured?.passed !== undefined) {\n return !output.structured.passed;\n }\n const lower = output.content.toLowerCase();\n return lower.includes('failed') || lower.includes('critical issue');\n }\n\n private async recordMetrics(\n featureSlug: string,\n feature: FeatureContext,\n agent: AgentRole,\n provider: AidenProvider,\n output: AgentOutput,\n ): Promise<void> {\n feature.tokensUsed += output.tokensUsed;\n await this.deps.contextStore.updateFeature(featureSlug, {\n tokensUsed: feature.tokensUsed,\n });\n await this.deps.metricsCollector.record({\n ts: new Date().toISOString(),\n feature: featureSlug,\n agent,\n provider: provider.name,\n tokensUsed: output.tokensUsed,\n durationMs: output.durationMs,\n cost: provider.getCostEstimate(output.tokensUsed),\n });\n }\n\n private getStateForPhase(\n phase: string,\n ): 'analyzing' | 'planning' | 'ready' | 'in_progress' | 'in_review' | 'documenting' | undefined {\n switch (phase) {\n case 'discovery':\n return 'analyzing';\n case 'planning':\n return 'planning';\n case 'implementation':\n return 'in_progress';\n case 'validation':\n return 'in_review';\n case 'documentation':\n return 'documenting';\n default:\n return undefined;\n }\n }\n\n private async runHook(\n event: import('../types/index.js').HookEvent,\n featureSlug: string,\n mode: AidenMode,\n phase?: string,\n agent?: string,\n hookBridge?: TraceHookBridge,\n spanId?: string,\n ): Promise<void> {\n try {\n const results = await this.hookRunner.run(event, {\n feature: featureSlug,\n mode,\n ...(phase ? { phase } : {}),\n ...(agent ? { agent } : {}),\n });\n\n // Bridge hook results to trace\n if (hookBridge && spanId) {\n for (const result of results) {\n hookBridge.onHookExecuted(event, result, spanId);\n }\n }\n } catch (err) {\n // HookBlockError propagates; other errors are logged but not fatal\n if (err instanceof HookBlockError) {\n throw err;\n }\n this.deps.logger.warn(\n `Hook ${event} failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n\nasync function defaultApprovalHandler(\n phase: string,\n featureSlug: string,\n output: AgentOutput,\n): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const preview = output.content.slice(0, 200).replace(/\\n/g, ' ');\n\n return new Promise<boolean>((resolve) => {\n rl.question(\n `\\n[APPROVAL] Phase \"${phase}\" for \"${featureSlug}\" completed.\\n` +\n ` Agent: ${output.agent} | Tokens: ${output.tokensUsed}\\n` +\n ` Preview: ${preview}...\\n` +\n ` Approve? (y/n): `,\n (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y' || answer.trim().toLowerCase() === 'yes');\n },\n );\n });\n}\n","import type { AidenMode, TokenBudget, TokenBudgetConfig } from '../types/index.js';\n\nexport class BudgetExceededError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BudgetExceededError';\n }\n}\n\n/**\n * Computes the token budget state for a feature.\n */\nexport function computeBudget(\n tokensUsed: number,\n mode: AidenMode,\n config: TokenBudgetConfig,\n): TokenBudget {\n const totalBudget = config.perFeature[mode];\n const remaining = totalBudget - tokensUsed;\n const usagePercent = (tokensUsed / totalBudget) * 100;\n\n return {\n totalBudget,\n used: tokensUsed,\n remaining: Math.max(0, remaining),\n alertThreshold: config.alertAt,\n isOverBudget: remaining <= 0,\n isNearLimit: usagePercent >= config.alertAt,\n };\n}\n\n/**\n * Checks whether the budget allows an operation of N estimated tokens.\n * Throws BudgetExceededError if exceeded.\n */\nexport function checkBudget(\n tokensUsed: number,\n estimatedTokens: number,\n mode: AidenMode,\n config: TokenBudgetConfig,\n): TokenBudget {\n const budget = computeBudget(tokensUsed, mode, config);\n\n if (tokensUsed + estimatedTokens > budget.totalBudget) {\n throw new BudgetExceededError(\n `Budget exceeded: ${tokensUsed + estimatedTokens} > ${budget.totalBudget} (mode: ${mode})`,\n );\n }\n\n return budget;\n}\n\n/**\n * Checks the global monthly budget.\n */\nexport function checkMonthlyBudget(\n totalTokensUsed: number,\n config: TokenBudgetConfig,\n): { withinBudget: boolean; usagePercent: number } {\n const usagePercent = (totalTokensUsed / config.monthlyLimit) * 100;\n return {\n withinBudget: totalTokensUsed <= config.monthlyLimit,\n usagePercent,\n };\n}\n","/**\n * Context Compressor — semantic compression of agent outputs.\n *\n * Instead of brute-force truncation, extracts key information\n * (decisions, files, risks, constraints) and compresses outputs\n * to preserve signal while reducing token usage.\n */\n\nimport type { AgentOutput, AgentRole } from '../types/index.js';\n\nexport interface CompressedContext {\n original: string;\n compressed: string;\n ratio: number;\n preservedKeys: string[];\n}\n\n/** Section extractors keyed by agent role. */\nconst SECTION_PATTERNS: Record<string, RegExp[]> = {\n decisions: [\n /(?:DECISION|CHOSE|SELECTED|PICKED)[:.]?\\s*(.+)/gi,\n /(?:we (?:will|should|must)|decided to|going with)\\s+(.+?)(?:\\.|$)/gim,\n ],\n files: [\n /FILES_CHANGED:\\s*(.+)/i,\n /TESTS_GENERATED:\\s*(.+)/i,\n /(?:^|\\n)\\s*[-*]\\s*`?([^\\s`]+\\.[a-z]{1,5})`?\\s*[:—-]\\s*(.+)/gm,\n ],\n risks: [/RISKS?:\\s*\\n((?:\\s*-\\s*.+\\n?)+)/gi, /(?:risk|warning|concern|caveat)[:.]?\\s*(.+)/gi],\n constraints: [\n /CONSTRAINTS?:\\s*\\n((?:\\s*-\\s*.+\\n?)+)/gi,\n /(?:must not|cannot|should not|forbidden|required)\\s+(.+?)(?:\\.|$)/gim,\n ],\n complexity: [/COMPLEXITY:\\s*(\\d)/i],\n score: [/(?:SCORE|QUALITY):\\s*(\\d+)/i],\n stories: [/###\\s*Story\\s*\\d+:\\s*(.+)/gi],\n criteria: [/CRITERIA_RESULTS:\\s*\\n([\\s\\S]*?)(?=$|\\n\\n)/i],\n passed: [/(?:PASSED|FAILED|PASS|FAIL)(?:\\s*[:.]?\\s*(.*))?/i],\n};\n\n/** Per-role extraction priorities: which sections matter most for each agent. */\nconst ROLE_PRIORITIES: Record<AgentRole, string[]> = {\n lead: ['decisions', 'complexity'],\n analyst: ['complexity', 'risks', 'constraints', 'decisions'],\n planner: ['stories', 'constraints', 'decisions', 'risks'],\n dev: ['files', 'decisions', 'stories'],\n qa: ['passed', 'score', 'criteria', 'risks', 'files'],\n docops: ['files', 'decisions', 'stories'],\n};\n\n/**\n * Compress a single agent output using semantic extraction.\n *\n * Extracts key information based on the agent's role, then builds a\n * compact representation that preserves critical data while significantly\n * reducing token count.\n */\nexport function compressAgentOutput(output: AgentOutput, maxChars: number): CompressedContext {\n const original = output.content;\n\n // If already within budget, no compression needed\n if (original.length <= maxChars) {\n return { original, compressed: original, ratio: 1, preservedKeys: [] };\n }\n\n const role = output.agent;\n const priorities = ROLE_PRIORITIES[role] ?? ['decisions', 'files', 'risks'];\n const extracted = new Map<string, string[]>();\n\n // Extract structured data first (always preserved)\n if (output.structured) {\n const s = output.structured;\n if (s.complexity !== undefined) {\n setExtracted(extracted, 'complexity', [`Complexity: ${s.complexity}/5`]);\n }\n if (s.risks?.length) {\n setExtracted(\n extracted,\n 'risks',\n s.risks.map((r) => `- ${r}`),\n );\n }\n if (s.stories?.length) {\n setExtracted(\n extracted,\n 'stories',\n s.stories.map((st) => `- ${st.id}: ${st.title}`),\n );\n }\n if (s.filesChanged?.length) {\n setExtracted(\n extracted,\n 'files',\n s.filesChanged.map((f) => `- ${f}`),\n );\n }\n if (s.passed !== undefined) {\n setExtracted(extracted, 'passed', [\n `QA: ${s.passed ? 'PASSED' : 'FAILED'} (score: ${s.score ?? 'N/A'})`,\n ]);\n }\n if (s.issues?.length) {\n setExtracted(\n extracted,\n 'risks',\n s.issues.map((i) => `- [${i.severity}] ${i.message}`),\n );\n }\n if (s.docsGenerated?.length) {\n setExtracted(\n extracted,\n 'files',\n s.docsGenerated.map((d) => `- ${d}`),\n );\n }\n }\n\n // Supplement from raw text for sections not yet filled\n for (const key of priorities) {\n if (extracted.has(key) && extracted.get(key)!.length > 0) continue;\n const patterns = SECTION_PATTERNS[key];\n if (!patterns) continue;\n\n const matches: string[] = [];\n for (const pattern of patterns) {\n // Reset lastIndex for global patterns\n pattern.lastIndex = 0;\n let m;\n while ((m = pattern.exec(original)) !== null) {\n const captured = m[1]?.trim();\n if (captured && captured.length > 3) {\n matches.push(captured);\n }\n }\n }\n if (matches.length > 0) {\n setExtracted(extracted, key, matches);\n }\n }\n\n // Build compressed output\n const parts: string[] = [];\n const preservedKeys: string[] = [];\n\n for (const key of priorities) {\n const values = extracted.get(key);\n if (!values || values.length === 0) continue;\n preservedKeys.push(key);\n parts.push(`[${key.toUpperCase()}]`);\n parts.push(values.join('\\n'));\n parts.push('');\n }\n\n let compressed = parts.join('\\n').trim();\n\n // If compressed is still too large, truncate the end\n if (compressed.length > maxChars) {\n compressed = compressed.slice(0, maxChars - 15) + '\\n[...compressed]';\n }\n\n // If compression produced nothing useful, fall back to head truncation\n if (compressed.length === 0) {\n compressed = original.slice(0, maxChars - 15) + '\\n[...truncated]';\n return { original, compressed, ratio: compressed.length / original.length, preservedKeys: [] };\n }\n\n return {\n original,\n compressed,\n ratio: compressed.length / original.length,\n preservedKeys,\n };\n}\n\n/**\n * Compress previous agent outputs for pipeline injection.\n * Returns compressed versions of all outputs, respecting per-agent budget.\n */\nexport function compressPipelineOutputs(\n outputs: AgentOutput[],\n maxCharsPerAgent: number,\n): Array<{ agent: AgentRole; compressed: string; ratio: number }> {\n return outputs.map((output) => {\n const result = compressAgentOutput(output, maxCharsPerAgent);\n return {\n agent: output.agent,\n compressed: result.compressed,\n ratio: result.ratio,\n };\n });\n}\n\nfunction setExtracted(map: Map<string, string[]>, key: string, values: string[]): void {\n const existing = map.get(key) ?? [];\n map.set(key, [...existing, ...values]);\n}\n","export interface SanitizeRule {\n name: string;\n pattern: RegExp;\n replacement: string;\n}\n\nexport const DEFAULT_RULES: SanitizeRule[] = [\n {\n name: 'bearer-token',\n pattern: /Bearer\\s+[a-zA-Z0-9_\\-.]{20,}/gi,\n replacement: 'Bearer [REDACTED]',\n },\n {\n name: 'api-key-assignment',\n pattern:\n /(?:api[_-]?key|apikey|secret[_-]?key|access[_-]?token)\\s*[:=]\\s*['\"]?([a-zA-Z0-9_-]{20,})['\"]?/gi,\n replacement: '$<key>[REDACTED]',\n },\n {\n name: 'password-assignment',\n pattern: /(?:password|passwd|pwd|secret)\\s*[:=]\\s*['\"]?[^\\s'\"]{4,}['\"]?/gi,\n replacement: 'password=[REDACTED]',\n },\n {\n name: 'private-key',\n pattern:\n /-----BEGIN\\s+(?:RSA\\s+)?PRIVATE\\s+KEY-----[\\s\\S]*?-----END\\s+(?:RSA\\s+)?PRIVATE\\s+KEY-----/g,\n replacement: '[PRIVATE KEY REDACTED]',\n },\n {\n name: 'connection-string',\n pattern: /(?:mongodb|postgres|postgresql|mysql|redis|amqp):\\/\\/[^\\s'\"]+/gi,\n replacement: '[CONNECTION STRING REDACTED]',\n },\n {\n name: 'aws-access-key',\n pattern: /AKIA[0-9A-Z]{16}/g,\n replacement: '[AWS KEY REDACTED]',\n },\n {\n name: 'generic-secret-value',\n pattern: /(?:sk-|ghp_|gho_|github_pat_)[a-zA-Z0-9_-]{20,}/g,\n replacement: '[SECRET REDACTED]',\n },\n];\n\nexport interface SanitizeResult {\n sanitized: string;\n redactions: Array<{ rule: string; count: number }>;\n}\n\n/**\n * Scans a prompt and redacts sensitive patterns.\n * Returns the sanitized prompt and a report of redactions.\n */\nexport function sanitizePrompt(\n prompt: string,\n rules: SanitizeRule[] = DEFAULT_RULES,\n): SanitizeResult {\n let result = prompt;\n const redactions: Array<{ rule: string; count: number }> = [];\n\n for (const rule of rules) {\n // Reset lastIndex for global regexes\n rule.pattern.lastIndex = 0;\n const matches = result.match(rule.pattern);\n if (matches && matches.length > 0) {\n rule.pattern.lastIndex = 0;\n result = result.replace(rule.pattern, rule.replacement);\n redactions.push({ rule: rule.name, count: matches.length });\n }\n }\n\n return { sanitized: result, redactions };\n}\n","/**\n * Agent Personas — configurable agent identities that improve LLM output quality.\n *\n * Each agent has a default persona that can be overridden via config.\n * Personas inject a \"role\" and \"perspective\" into the agent's prompt,\n * giving the LLM a richer context for its responses.\n */\n\nimport type { AgentRole } from '../types/index.js';\n\nexport interface AgentPersona {\n name: string;\n role: string;\n traits: string[];\n perspective: string;\n expertise: string[];\n}\n\nconst DEFAULT_PERSONAS: Record<AgentRole, AgentPersona> = {\n lead: {\n name: 'Alex',\n role: 'Lead Engineer & Orchestrator',\n traits: ['strategic', 'decisive', 'result-oriented'],\n perspective:\n 'You focus on the big picture. Your decisions are swift and well-reasoned. You consider trade-offs between speed and quality.',\n expertise: ['project management', 'technical leadership', 'risk assessment'],\n },\n analyst: {\n name: 'Morgan',\n role: 'Senior Technical Analyst',\n traits: ['curious', 'methodical', 'questions everything'],\n perspective:\n 'You dig deep. Nothing is obvious. Every assumption is a risk until validated. You find the real problem behind the stated problem.',\n expertise: ['requirements analysis', 'domain modeling', 'risk identification'],\n },\n planner: {\n name: 'Jordan',\n role: 'Technical Architect & Planner',\n traits: ['structured', 'pragmatic', 'delivery-oriented'],\n perspective:\n 'You plan for what can actually be built. Every story must be implementable, testable, and clear enough that any dev can pick it up.',\n expertise: ['system design', 'story decomposition', 'effort estimation'],\n },\n dev: {\n name: 'Sam',\n role: 'Senior Software Engineer',\n traits: ['precise', 'test-driven', 'minimalist'],\n perspective:\n 'You write the minimum code that solves the problem correctly. Every function has tests. No placeholder code. No over-engineering.',\n expertise: ['clean code', 'testing', 'design patterns', 'performance'],\n },\n qa: {\n name: 'Riley',\n role: 'Quality Assurance Engineer',\n traits: ['skeptical', 'exhaustive', 'edge-case hunter'],\n perspective:\n 'You assume the code is broken until proven otherwise. You think about what happens when inputs are null, empty, huge, malicious, or concurrent.',\n expertise: ['test strategy', 'security review', 'edge cases', 'acceptance testing'],\n },\n docops: {\n name: 'Casey',\n role: 'Technical Writer & Documentation Engineer',\n traits: ['clear', 'concise', 'user-focused'],\n perspective:\n 'You write for the reader who has 5 minutes. Lead with the most important information. Examples over explanations. Diagrams over paragraphs.',\n expertise: ['technical writing', 'API documentation', 'changelog management'],\n },\n};\n\n/**\n * Get the persona for an agent, merging config overrides with defaults.\n */\nexport function getPersona(\n role: AgentRole,\n configOverride?: Partial<AgentPersona> | false,\n): AgentPersona | undefined {\n if (configOverride === false) return undefined;\n\n const base = DEFAULT_PERSONAS[role];\n if (!configOverride) return base;\n\n return {\n ...base,\n ...configOverride,\n traits: configOverride.traits ?? base.traits,\n expertise: configOverride.expertise ?? base.expertise,\n };\n}\n\n/**\n * Format a persona into a prompt preamble.\n */\nexport function formatPersonaPrompt(persona: AgentPersona | undefined): string {\n if (!persona) return '';\n\n return `You are ${persona.name}, a ${persona.role}.\nTraits: ${persona.traits.join(', ')}.\nExpertise: ${persona.expertise.join(', ')}.\n${persona.perspective}\n`;\n}\n\n/**\n * Get all default personas (for listing/documentation).\n */\nexport function getAllDefaultPersonas(): Record<AgentRole, AgentPersona> {\n return { ...DEFAULT_PERSONAS };\n}\n","/**\n * i18n Labels — localized labels for artefact templates and prompts.\n *\n * Used to generate artefacts in the configured language while\n * keeping code identifiers and technical terms in English.\n */\n\nexport type SupportedLanguage = 'en' | 'fr' | 'es' | 'de' | 'zh' | 'ja' | 'pt';\n\nexport interface ArtefactLabels {\n objective: string;\n constraints: string;\n risks: string;\n context: string;\n stories: string;\n acceptanceCriteria: string;\n technicalNotes: string;\n summary: string;\n changes: string;\n changelog: string;\n added: string;\n changed: string;\n fixed: string;\n recommendations: string;\n score: string;\n issues: string;\n documentation: string;\n overview: string;\n requirements: string;\n}\n\nconst LABELS: Record<SupportedLanguage, ArtefactLabels> = {\n en: {\n objective: 'Objective',\n constraints: 'Constraints',\n risks: 'Risks',\n context: 'Context',\n stories: 'Stories',\n acceptanceCriteria: 'Acceptance Criteria',\n technicalNotes: 'Technical Notes',\n summary: 'Summary',\n changes: 'Changes',\n changelog: 'Changelog',\n added: 'Added',\n changed: 'Changed',\n fixed: 'Fixed',\n recommendations: 'Recommendations',\n score: 'Score',\n issues: 'Issues',\n documentation: 'Documentation',\n overview: 'Overview',\n requirements: 'Requirements',\n },\n fr: {\n objective: 'Objectif',\n constraints: 'Contraintes',\n risks: 'Risques',\n context: 'Contexte',\n stories: 'User Stories',\n acceptanceCriteria: \"Critères d'acceptation\",\n technicalNotes: 'Notes techniques',\n summary: 'Résumé',\n changes: 'Modifications',\n changelog: 'Journal des modifications',\n added: 'Ajouté',\n changed: 'Modifié',\n fixed: 'Corrigé',\n recommendations: 'Recommandations',\n score: 'Score',\n issues: 'Problèmes',\n documentation: 'Documentation',\n overview: \"Vue d'ensemble\",\n requirements: 'Exigences',\n },\n es: {\n objective: 'Objetivo',\n constraints: 'Restricciones',\n risks: 'Riesgos',\n context: 'Contexto',\n stories: 'Historias',\n acceptanceCriteria: 'Criterios de aceptación',\n technicalNotes: 'Notas técnicas',\n summary: 'Resumen',\n changes: 'Cambios',\n changelog: 'Registro de cambios',\n added: 'Añadido',\n changed: 'Cambiado',\n fixed: 'Corregido',\n recommendations: 'Recomendaciones',\n score: 'Puntuación',\n issues: 'Incidencias',\n documentation: 'Documentación',\n overview: 'Visión general',\n requirements: 'Requisitos',\n },\n de: {\n objective: 'Ziel',\n constraints: 'Einschränkungen',\n risks: 'Risiken',\n context: 'Kontext',\n stories: 'Stories',\n acceptanceCriteria: 'Akzeptanzkriterien',\n technicalNotes: 'Technische Hinweise',\n summary: 'Zusammenfassung',\n changes: 'Änderungen',\n changelog: 'Änderungsprotokoll',\n added: 'Hinzugefügt',\n changed: 'Geändert',\n fixed: 'Behoben',\n recommendations: 'Empfehlungen',\n score: 'Bewertung',\n issues: 'Probleme',\n documentation: 'Dokumentation',\n overview: 'Überblick',\n requirements: 'Anforderungen',\n },\n zh: {\n objective: '目标',\n constraints: '约束',\n risks: '风险',\n context: '上下文',\n stories: '用户故事',\n acceptanceCriteria: '验收标准',\n technicalNotes: '技术备注',\n summary: '摘要',\n changes: '变更',\n changelog: '变更日志',\n added: '新增',\n changed: '修改',\n fixed: '修复',\n recommendations: '建议',\n score: '评分',\n issues: '问题',\n documentation: '文档',\n overview: '概述',\n requirements: '需求',\n },\n ja: {\n objective: '目的',\n constraints: '制約',\n risks: 'リスク',\n context: 'コンテキスト',\n stories: 'ストーリー',\n acceptanceCriteria: '受入基準',\n technicalNotes: '技術メモ',\n summary: '概要',\n changes: '変更',\n changelog: '変更履歴',\n added: '追加',\n changed: '変更',\n fixed: '修正',\n recommendations: '推奨事項',\n score: 'スコア',\n issues: '問題',\n documentation: 'ドキュメント',\n overview: '概要',\n requirements: '要件',\n },\n pt: {\n objective: 'Objetivo',\n constraints: 'Restrições',\n risks: 'Riscos',\n context: 'Contexto',\n stories: 'Histórias',\n acceptanceCriteria: 'Critérios de aceitação',\n technicalNotes: 'Notas técnicas',\n summary: 'Resumo',\n changes: 'Alterações',\n changelog: 'Registro de alterações',\n added: 'Adicionado',\n changed: 'Alterado',\n fixed: 'Corrigido',\n recommendations: 'Recomendações',\n score: 'Pontuação',\n issues: 'Problemas',\n documentation: 'Documentação',\n overview: 'Visão geral',\n requirements: 'Requisitos',\n },\n};\n\n/**\n * Get localized labels for the given language.\n * Falls back to English if language is not supported.\n */\nexport function getLabels(lang: string): ArtefactLabels {\n const key = lang.toLowerCase().slice(0, 2) as SupportedLanguage;\n return LABELS[key] ?? LABELS.en;\n}\n\n/**\n * Get the language instruction to inject into agent prompts.\n */\nexport function getLanguageInstruction(lang: string): string {\n if (!lang || lang === 'en') return '';\n\n const langNames: Record<string, string> = {\n fr: 'French',\n es: 'Spanish',\n de: 'German',\n zh: 'Chinese',\n ja: 'Japanese',\n pt: 'Portuguese',\n };\n\n const langName = langNames[lang.toLowerCase().slice(0, 2)] ?? lang;\n\n return `IMPORTANT: All your outputs (analysis, specs, stories, reviews, documentation) MUST be written in ${langName}. Technical terms and code identifiers remain in English.`;\n}\n\n/**\n * Check if a language is supported.\n */\nexport function isSupportedLanguage(lang: string): boolean {\n const key = lang.toLowerCase().slice(0, 2);\n return key in LABELS;\n}\n\n/**\n * Get all supported language codes.\n */\nexport function getSupportedLanguages(): SupportedLanguage[] {\n return Object.keys(LABELS) as SupportedLanguage[];\n}\n","import type {\n AgentRole,\n AgentConfig,\n AgentOutput,\n AidenProvider,\n AidenContext,\n Decision,\n TokenBudgetConfig,\n AidenMode,\n MemoryConfig,\n} from '../types/index.js';\nimport type { ContextStore } from '../memory/context-store.js';\nimport type { DecisionsLog } from '../memory/decisions-log.js';\nimport { checkBudget } from '../core/token-budget.js';\nimport { compressAgentOutput } from '../core/context-compressor.js';\nimport { sanitizePrompt } from '../providers/prompt-sanitizer.js';\nimport { getPersona, formatPersonaPrompt, type AgentPersona } from './personas.js';\nimport { getLanguageInstruction } from '../i18n/labels.js';\nimport type { Logger } from '../utils/logger.js';\nimport type { TraceCollector } from '../core/trace/trace-collector.js';\nimport { formatMemoryGovernanceForPrompt } from '../memory/scoped-memory.js';\n\nexport interface PipelineContext {\n featureRequest: string;\n featureSlug: string;\n previousOutputs: AgentOutput[];\n projectContext: AidenContext;\n maxOutputCharsPerAgent?: number;\n objectiveReminder?: string;\n lang?: string;\n mode?: AidenMode;\n memoryConfig?: MemoryConfig;\n traceCollector?: TraceCollector;\n currentPhaseSpanId?: string;\n}\n\nexport interface AgentDependencies {\n config: AgentConfig;\n provider: AidenProvider;\n contextStore: ContextStore;\n decisionsLog: DecisionsLog;\n logger: Logger;\n budgetConfig: TokenBudgetConfig;\n}\n\nexport abstract class BaseAgent {\n protected readonly config: AgentConfig;\n protected provider: AidenProvider;\n protected readonly contextStore: ContextStore;\n protected readonly decisionsLog: DecisionsLog;\n protected readonly logger: Logger;\n protected readonly budgetConfig: TokenBudgetConfig;\n protected rules: string[] = [];\n protected skillInstructions = '';\n protected retex: string[] = [];\n protected sanitizeEnabled = true;\n protected personaOverride?: Partial<AgentPersona> | false;\n\n constructor(deps: AgentDependencies) {\n this.config = deps.config;\n this.provider = deps.provider;\n this.contextStore = deps.contextStore;\n this.decisionsLog = deps.decisionsLog;\n this.logger = deps.logger;\n this.budgetConfig = deps.budgetConfig;\n }\n\n setProvider(provider: AidenProvider): void {\n this.provider = provider;\n this.logger.debug(`Provider switched for ${this.role}`, { provider: provider.name });\n }\n\n abstract execute(pipeline: PipelineContext): Promise<AgentOutput>;\n\n get role(): AgentRole {\n return this.config.role;\n }\n\n injectRules(rules: string[]): void {\n this.rules = rules;\n this.logger.debug(`Rules injected for ${this.role}`, { count: rules.length });\n }\n\n injectSkillInstructions(instructions: string): void {\n this.skillInstructions = instructions;\n this.logger.debug(`Skill instructions injected for ${this.role}`, {\n length: instructions.length,\n });\n }\n\n injectRetex(retex: string[]): void {\n this.retex = retex;\n this.logger.debug(`Retex injected for ${this.role}`, { count: retex.length });\n }\n\n setSanitize(enabled: boolean): void {\n this.sanitizeEnabled = enabled;\n }\n\n setPersona(override: Partial<AgentPersona> | false | undefined): void {\n this.personaOverride = override;\n }\n\n async checkBudget(featureSlug: string, estimatedTokens: number, mode: AidenMode): Promise<void> {\n const feature = await this.contextStore.getFeature(featureSlug);\n const tokensUsed = feature?.tokensUsed ?? 0;\n checkBudget(tokensUsed, estimatedTokens, mode, this.budgetConfig);\n }\n\n async logDecision(decision: Omit<Decision, 'ts' | 'agent'>): Promise<void> {\n await this.decisionsLog.append({\n ...decision,\n ts: new Date().toISOString(),\n agent: this.role,\n });\n }\n\n protected buildPromptFromPipeline(pipeline: PipelineContext, agentInstructions: string): string {\n const parts: string[] = [];\n\n // Inject persona preamble\n const persona = getPersona(this.role, this.personaOverride);\n const personaPrompt = formatPersonaPrompt(persona);\n if (personaPrompt) {\n parts.push(personaPrompt);\n }\n\n parts.push(agentInstructions);\n\n // Inject language instruction\n if (pipeline.lang) {\n const langInstruction = getLanguageInstruction(pipeline.lang);\n if (langInstruction) {\n parts.push(`\\n${langInstruction}`);\n }\n }\n\n if (pipeline.objectiveReminder) {\n parts.push('\\n--- OBJECTIVE REMINDER ---');\n parts.push(pipeline.objectiveReminder);\n }\n\n // Inject project context if available\n const project = pipeline.projectContext?.project;\n if (project) {\n const contextLines: string[] = [];\n contextLines.push(`Project: ${project.name}`);\n if (project.techStack?.length > 0) {\n contextLines.push(`Tech Stack: ${project.techStack.join(', ')}`);\n }\n if (project.architecture?.length > 0) {\n contextLines.push(`Architecture: ${project.architecture.join(', ')}`);\n }\n if (project.ci?.length > 0) {\n contextLines.push(`CI: ${project.ci.join(', ')}`);\n }\n if (project.packageManager) {\n contextLines.push(`Package Manager: ${project.packageManager}`);\n }\n if (project.databases && project.databases.length > 0) {\n contextLines.push(`Databases: ${project.databases.join(', ')}`);\n }\n if (project.monorepo) {\n contextLines.push(`Monorepo: ${project.monorepo}`);\n }\n parts.push('\\n--- Project Context ---');\n parts.push(contextLines.join('\\n'));\n\n // Inject conventions and patterns (Project Context v2)\n const convLines: string[] = [];\n if (project.conventions) {\n const c = project.conventions;\n if (c.naming) convLines.push(`Naming: ${c.naming}`);\n if (c.testing) convLines.push(`Testing: ${c.testing}`);\n if (c.imports) convLines.push(`Imports: ${c.imports}`);\n if (c.stateManagement) convLines.push(`State Management: ${c.stateManagement}`);\n if (c.apiPattern) convLines.push(`API Pattern: ${c.apiPattern}`);\n }\n if (project.patterns) {\n const p = project.patterns;\n if (p.errorHandling) convLines.push(`Error Handling: ${p.errorHandling}`);\n if (p.logging) convLines.push(`Logging: ${p.logging}`);\n if (p.validation) convLines.push(`Validation: ${p.validation}`);\n if (p.authentication) convLines.push(`Authentication: ${p.authentication}`);\n }\n if (convLines.length > 0) {\n parts.push('\\n--- Project Conventions ---');\n parts.push(convLines.join('\\n'));\n }\n\n if (project.criticalPaths && project.criticalPaths.length > 0) {\n parts.push('\\n--- Critical Paths (review required) ---');\n parts.push(project.criticalPaths.join('\\n'));\n }\n }\n\n const memoryGovernance = formatMemoryGovernanceForPrompt(pipeline.memoryConfig);\n if (memoryGovernance) {\n parts.push('\\n--- Memory Governance ---');\n if (pipeline.mode) {\n parts.push(`Workflow Mode: ${pipeline.mode}`);\n }\n parts.push(memoryGovernance);\n }\n\n if (this.skillInstructions) {\n parts.push('\\n--- Skills Instructions ---');\n parts.push(this.skillInstructions);\n }\n\n parts.push('\\n--- Feature Request ---');\n parts.push(pipeline.featureRequest);\n\n if (pipeline.previousOutputs.length > 0) {\n const maxChars = pipeline.maxOutputCharsPerAgent ?? 8000;\n parts.push('\\n--- Previous Agent Outputs ---');\n for (const output of pipeline.previousOutputs) {\n parts.push(`\\n[${output.agent.toUpperCase()}]:`);\n const result = compressAgentOutput(output, maxChars);\n parts.push(result.compressed);\n }\n }\n\n if (this.rules.length > 0) {\n parts.push('\\n--- Enterprise Rules ---');\n parts.push(this.rules.join('\\n'));\n }\n\n if (this.retex.length > 0) {\n parts.push('\\n--- Lessons Learned ---');\n parts.push(this.retex.join('\\n\\n'));\n }\n\n const raw = parts.join('\\n');\n\n if (this.sanitizeEnabled) {\n const { sanitized, redactions } = sanitizePrompt(raw);\n if (redactions.length > 0) {\n this.logger.warn('Sensitive data redacted from prompt', { redactions });\n }\n return sanitized;\n }\n\n return raw;\n }\n\n /**\n * Wraps provider.execute() with trace instrumentation:\n * - Emits prompt_built event\n * - Creates provider_call span\n * - Emits output_parsed event after caller processes response\n */\n protected async executeWithTrace(\n prompt: string,\n pipeline: PipelineContext,\n ): Promise<{ content: string; tokensUsed: number; durationMs: number; providerSpanId?: string }> {\n const tc = pipeline.traceCollector;\n const parentSpanId = pipeline.currentPhaseSpanId;\n\n // Event: prompt built\n tc?.addEvent(parentSpanId ?? '', 'prompt_built', undefined, {\n agent_role: this.role,\n prompt_length: prompt.length,\n has_previous_outputs: pipeline.previousOutputs.length > 0,\n has_skills: this.skillInstructions.length > 0,\n has_rules: this.rules.length > 0,\n });\n\n // Span: provider call\n const providerSpanId =\n tc?.startSpan('provider_call', `call:${this.provider.name}`, parentSpanId ?? '', {\n provider_name: this.provider.name,\n stdin_length: prompt.length,\n }) ?? '';\n\n const start = Date.now();\n try {\n const response = await this.provider.generate(prompt, pipeline.projectContext);\n const durationMs = Date.now() - start;\n\n tc?.setAttribute(providerSpanId, 'tokens_used', response.tokensUsed);\n tc?.setAttribute(providerSpanId, 'duration_ms', durationMs);\n tc?.setAttribute(providerSpanId, 'response_length', response.content.length);\n tc?.endSpan(providerSpanId, 'success');\n\n return {\n content: response.content,\n tokensUsed: response.tokensUsed,\n durationMs,\n providerSpanId,\n };\n } catch (err) {\n tc?.addEvent(\n providerSpanId,\n 'provider_error',\n err instanceof Error ? err.message : String(err),\n );\n tc?.endSpan(providerSpanId, 'failure');\n throw err;\n }\n }\n\n /** Emit an output_parsed trace event with structured data attributes */\n protected emitOutputParsed(\n pipeline: PipelineContext,\n attributes: Record<string, string | number | boolean>,\n ): void {\n const tc = pipeline.traceCollector;\n const spanId = pipeline.currentPhaseSpanId;\n if (tc && spanId) {\n tc.addEvent(spanId, 'output_parsed', undefined, {\n agent_role: this.role,\n ...attributes,\n });\n }\n }\n}\n","import type { AidenMode } from '../types/index.js';\n\nexport interface ProjectInfo {\n techStack?: string[];\n architecture?: string[];\n ci?: string[];\n databases?: string[];\n monorepo?: string;\n}\n\nexport interface ComplexitySignals {\n filesImpacted: number;\n hasNewApi: boolean;\n hasExternalDependency: boolean;\n estimatedComplexity: number; // 1-5\n complianceRequired: boolean;\n newArchitecture: boolean;\n}\n\nexport interface ModeDetectionResult {\n suggestedMode: AidenMode;\n confidence: number; // 0-1\n reason: string;\n signals: ComplexitySignals;\n}\n\n/**\n * Automatically detects the optimal mode based on complexity signals.\n * Algorithm based on section 6.2 of the specs.\n */\nexport function detectMode(signals: ComplexitySignals): ModeDetectionResult {\n // Enterprise conditions\n if (\n signals.filesImpacted > 15 ||\n signals.newArchitecture ||\n signals.complianceRequired ||\n signals.estimatedComplexity === 5\n ) {\n return {\n suggestedMode: 'enterprise',\n confidence: signals.complianceRequired || signals.newArchitecture ? 0.95 : 0.8,\n reason: buildReason('enterprise', signals),\n signals,\n };\n }\n\n // Flash conditions\n if (\n signals.filesImpacted <= 3 &&\n !signals.hasNewApi &&\n !signals.hasExternalDependency &&\n signals.estimatedComplexity <= 2\n ) {\n return {\n suggestedMode: 'flash',\n confidence: 0.9,\n reason: buildReason('flash', signals),\n signals,\n };\n }\n\n // Default: standard\n return {\n suggestedMode: 'standard',\n confidence: 0.85,\n reason: buildReason('standard', signals),\n signals,\n };\n}\n\nfunction buildReason(mode: AidenMode, signals: ComplexitySignals): string {\n switch (mode) {\n case 'flash':\n return `Low complexity (${signals.estimatedComplexity}/5), ${signals.filesImpacted} files, no new API or external dependency`;\n case 'enterprise':\n if (signals.complianceRequired) return 'Compliance required';\n if (signals.newArchitecture) return 'New architecture detected';\n if (signals.filesImpacted > 15) return `${signals.filesImpacted} files impacted (>15)`;\n return `High complexity (${signals.estimatedComplexity}/5)`;\n case 'standard':\n return `Medium complexity (${signals.estimatedComplexity}/5), ${signals.filesImpacted} files impacted`;\n }\n}\n\nconst HIGH_FILES_KEYWORDS = ['migration', 'refactor all', 'rewrite', 'overhaul', 'restructure'];\nconst MEDIUM_FILES_KEYWORDS = ['module', 'system', 'api', 'service', 'feature', 'workflow'];\nconst LOW_FILES_KEYWORDS = ['fix', 'typo', 'update', 'rename', 'bump', 'hotfix', 'patch'];\nconst API_KEYWORDS = ['new api', 'endpoint', 'route', 'rest', 'graphql', 'grpc', 'webhook'];\nconst EXTERNAL_KEYWORDS = [\n 'integrate',\n 'third-party',\n 'external',\n 'sdk',\n 'oauth',\n 'stripe',\n 'aws',\n 'azure',\n];\nconst COMPLIANCE_KEYWORDS = [\n 'rgpd',\n 'gdpr',\n 'compliance',\n 'audit',\n 'security review',\n 'hipaa',\n 'sox',\n 'pci',\n];\nconst ARCHITECTURE_KEYWORDS = [\n 'migrate',\n 'new architecture',\n 'microservice',\n 'monorepo',\n 'monolith to',\n 'redesign',\n];\n\nexport function extractSignalsFromRequest(\n request: string,\n projectInfo?: ProjectInfo,\n): ComplexitySignals {\n const lower = request.toLowerCase();\n\n // Files impacted heuristic\n let filesImpacted = 5; // default\n if (HIGH_FILES_KEYWORDS.some((kw) => lower.includes(kw))) {\n filesImpacted = 20;\n } else if (MEDIUM_FILES_KEYWORDS.some((kw) => lower.includes(kw))) {\n filesImpacted = 8;\n } else if (LOW_FILES_KEYWORDS.some((kw) => lower.includes(kw))) {\n filesImpacted = 2;\n }\n\n const hasNewApi = API_KEYWORDS.some((kw) => lower.includes(kw));\n const hasExternalDependency = EXTERNAL_KEYWORDS.some((kw) => lower.includes(kw));\n const complianceRequired = COMPLIANCE_KEYWORDS.some((kw) => lower.includes(kw));\n const newArchitecture = ARCHITECTURE_KEYWORDS.some((kw) => lower.includes(kw));\n\n // Complexity score from 1 to 5\n let estimatedComplexity = 2;\n if (hasNewApi) estimatedComplexity++;\n if (hasExternalDependency) estimatedComplexity++;\n if (complianceRequired) estimatedComplexity++;\n if (newArchitecture) estimatedComplexity++;\n if (filesImpacted > 15) estimatedComplexity++;\n if (filesImpacted <= 3) estimatedComplexity--;\n\n // Project context boost\n if (projectInfo?.techStack && projectInfo.techStack.length >= 5) {\n estimatedComplexity++;\n }\n if (projectInfo?.monorepo) {\n estimatedComplexity++;\n }\n if (projectInfo?.databases && projectInfo.databases.length > 1) {\n estimatedComplexity++;\n }\n\n estimatedComplexity = Math.min(Math.max(estimatedComplexity, 1), 5);\n\n return {\n filesImpacted,\n hasNewApi,\n hasExternalDependency,\n estimatedComplexity,\n complianceRequired,\n newArchitecture,\n };\n}\n","import type { CircuitBreakerState, CircuitBreakerStatus } from '../types/index.js';\n\nexport interface CircuitBreaker {\n getState(): CircuitBreakerState;\n recordSuccess(): void;\n recordFailure(error: string): void;\n canExecute(): boolean;\n reset(): void;\n}\n\nexport class CircuitBreakerError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CircuitBreakerError';\n }\n}\n\nexport function createCircuitBreaker(maxFailures: number = 3): CircuitBreaker {\n let status: CircuitBreakerStatus = 'closed';\n let failures = 0;\n let lastFailure: string | undefined;\n let lastError: string | undefined;\n\n return {\n getState(): CircuitBreakerState {\n return { status, failures, maxFailures, lastFailure, lastError };\n },\n\n recordSuccess(): void {\n if (status === 'half-open') {\n status = 'closed';\n failures = 0;\n lastError = undefined;\n }\n },\n\n recordFailure(error: string): void {\n failures++;\n lastFailure = new Date().toISOString();\n lastError = error;\n\n if (failures >= maxFailures) {\n status = 'open';\n }\n },\n\n canExecute(): boolean {\n if (status === 'closed') return true;\n if (status === 'half-open') return true;\n return false; // open\n },\n\n reset(): void {\n status = 'closed';\n failures = 0;\n lastFailure = undefined;\n lastError = undefined;\n },\n };\n}\n\n/**\n * Transitions an open circuit breaker to half-open to attempt recovery.\n */\nexport function attemptRecovery(cb: CircuitBreaker): boolean {\n const state = cb.getState();\n if (state.status !== 'open') return false;\n cb.reset();\n // Simulate half-open by allowing one try\n return true;\n}\n","import type { QualityGateResult, QualityGateCriterion } from '../types/index.js';\n\nexport type CriterionCheck = () => boolean | Promise<boolean>;\n\nexport interface QualityGateDefinition {\n phase: string;\n criteria: Array<{\n name: string;\n check: CriterionCheck;\n message?: string;\n }>;\n}\n\n/**\n * Runs a quality gate: checks all criteria and returns the result.\n */\nexport async function runQualityGate(\n definition: QualityGateDefinition,\n): Promise<QualityGateResult> {\n const results: QualityGateCriterion[] = [];\n\n for (const criterion of definition.criteria) {\n const passed = await criterion.check();\n results.push({\n name: criterion.name,\n passed,\n message: passed ? undefined : (criterion.message ?? `Criterion \"${criterion.name}\" failed`),\n });\n }\n\n return {\n phase: definition.phase,\n passed: results.every((r) => r.passed),\n criteria: results,\n timestamp: new Date().toISOString(),\n };\n}\n\n/**\n * Quality gate for the discovery phase: checks that a valid brief exists.\n */\nexport function discoveryGateCriteria(\n briefExists: boolean,\n hasObjective: boolean,\n): QualityGateDefinition {\n return {\n phase: 'discovery',\n criteria: [\n {\n name: 'brief_exists',\n check: () => briefExists,\n message: 'Brief must be created before proceeding',\n },\n {\n name: 'objective_clear',\n check: () => hasObjective,\n message: 'Brief must have a clear objective',\n },\n ],\n };\n}\n\n/**\n * Quality gate for the planning phase: spec and stories exist.\n */\nexport function planningGateCriteria(\n specExists: boolean,\n storiesCount: number,\n): QualityGateDefinition {\n return {\n phase: 'planning',\n criteria: [\n {\n name: 'spec_exists',\n check: () => specExists,\n message: 'Specification must be created',\n },\n {\n name: 'stories_defined',\n check: () => storiesCount > 0,\n message: 'At least one story must be defined',\n },\n ],\n };\n}\n","import type { FeatureContext } from '../types/index.js';\n\nexport interface ObjectiveReminder {\n content: string;\n feature: string;\n objective: string;\n currentStory?: string;\n constraintsRemaining: string[];\n budgetRemaining: number;\n budgetTotal: number;\n}\n\n/**\n * Generates an objective reminder for an agent.\n */\nexport function generateReminder(feature: FeatureContext, budgetTotal: number): ObjectiveReminder {\n return {\n content: formatReminder(feature, budgetTotal),\n feature: feature.slug,\n objective: feature.objective,\n currentStory: feature.currentStory,\n constraintsRemaining: feature.constraints,\n budgetRemaining: budgetTotal - feature.tokensUsed,\n budgetTotal,\n };\n}\n\n/**\n * Determines whether a reminder is needed at this step.\n */\nexport function shouldRemind(stepNumber: number, interval: number = 5): boolean {\n return stepNumber > 0 && stepNumber % interval === 0;\n}\n\nfunction formatReminder(feature: FeatureContext, budgetTotal: number): string {\n const budgetRemaining = budgetTotal - feature.tokensUsed;\n const lines = [\n 'OBJECTIVE REMINDER',\n `Feature: ${feature.name}`,\n `Objective: ${feature.objective}`,\n ];\n\n if (feature.currentStory) {\n lines.push(`Current story: ${feature.currentStory}`);\n }\n\n if (feature.constraints.length > 0) {\n lines.push(`Constraints: [${feature.constraints.join(', ')}]`);\n }\n\n lines.push(`Remaining token budget: ${budgetRemaining} / ${budgetTotal}`);\n\n return lines.join('\\n');\n}\n","import type {\n AgentOutput,\n AgentRole,\n AidenMode,\n FeatureContext,\n FeatureStatus,\n QualityGateResult,\n} from '../types/index.js';\nimport { BaseAgent, type AgentDependencies, type PipelineContext } from './base-agent.js';\nimport {\n detectMode,\n extractSignalsFromRequest,\n type ComplexitySignals,\n} from '../core/mode-detector.js';\nimport { createCircuitBreaker, type CircuitBreaker } from '../core/circuit-breaker.js';\nimport { runQualityGate, type QualityGateDefinition } from '../core/quality-gate.js';\nimport { generateReminder, shouldRemind } from '../core/objective-reminder.js';\n\nexport interface ModeAnalysis {\n suggestedMode: AidenMode;\n confidence: number;\n reason: string;\n agents: AgentRole[];\n}\n\nexport interface WorkflowStep {\n agent: AgentRole;\n phase: string;\n}\n\nconst MODE_AGENTS: Record<AidenMode, AgentRole[]> = {\n flash: ['lead', 'dev'],\n standard: ['lead', 'analyst', 'planner', 'dev', 'qa'],\n enterprise: ['lead', 'analyst', 'planner', 'dev', 'qa', 'docops'],\n};\n\nconst MODE_WORKFLOW: Record<AidenMode, WorkflowStep[]> = {\n flash: [{ agent: 'dev', phase: 'implementation' }],\n standard: [\n { agent: 'analyst', phase: 'discovery' },\n { agent: 'planner', phase: 'planning' },\n { agent: 'dev', phase: 'implementation' },\n { agent: 'qa', phase: 'validation' },\n ],\n enterprise: [\n { agent: 'analyst', phase: 'discovery' },\n { agent: 'planner', phase: 'planning' },\n { agent: 'dev', phase: 'implementation' },\n { agent: 'qa', phase: 'validation' },\n { agent: 'docops', phase: 'documentation' },\n ],\n};\n\nexport class LeadAgent extends BaseAgent {\n private circuitBreakers = new Map<string, CircuitBreaker>();\n private stepCounter = 0;\n\n constructor(deps: AgentDependencies) {\n super(deps);\n }\n\n async execute(pipeline: PipelineContext): Promise<AgentOutput> {\n const start = Date.now();\n this.logger.info(`Lead analyzing request for feature: ${pipeline.featureSlug}`);\n\n const project = pipeline.projectContext?.project;\n const projectInfo = project\n ? {\n techStack: project.techStack,\n architecture: project.architecture,\n ci: project.ci,\n }\n : undefined;\n const signals = extractSignalsFromRequest(pipeline.featureRequest, projectInfo);\n const analysis = this.analyzeRequest(signals);\n\n await this.logDecision({\n feature: pipeline.featureSlug,\n type: 'mode_selection',\n value: analysis.suggestedMode,\n reason: analysis.reason,\n });\n\n return {\n agent: 'lead',\n content: `Mode: ${analysis.suggestedMode}. Agents: ${analysis.agents.join(', ')}. Reason: ${analysis.reason}`,\n artefacts: [],\n tokensUsed: 0,\n durationMs: Date.now() - start,\n decisions: [],\n };\n }\n\n analyzeRequest(signals: ComplexitySignals): ModeAnalysis {\n const detection = detectMode(signals);\n return {\n suggestedMode: detection.suggestedMode,\n confidence: detection.confidence,\n reason: detection.reason,\n agents: this.assignAgents(detection.suggestedMode),\n };\n }\n\n assignAgents(mode: AidenMode): AgentRole[] {\n return [...MODE_AGENTS[mode]];\n }\n\n getWorkflow(mode: AidenMode): WorkflowStep[] {\n return [...MODE_WORKFLOW[mode]];\n }\n\n async checkQualityGate(definition: QualityGateDefinition): Promise<QualityGateResult> {\n const result = await runQualityGate(definition);\n this.logger.info(`Quality gate ${definition.phase}: ${result.passed ? 'PASS' : 'FAIL'}`);\n return result;\n }\n\n getCircuitBreaker(agentName: string): CircuitBreaker {\n if (!this.circuitBreakers.has(agentName)) {\n this.circuitBreakers.set(agentName, createCircuitBreaker(this.config.maxRetries));\n }\n return this.circuitBreakers.get(agentName)!;\n }\n\n handleCircuitBreaker(agentName: string, error: string): boolean {\n const cb = this.getCircuitBreaker(agentName);\n cb.recordFailure(error);\n\n if (!cb.canExecute()) {\n this.logger.warn(`Circuit breaker OPEN for ${agentName}: escalating to human`, {\n failures: cb.getState().failures,\n });\n return false; // escalate\n }\n\n return true; // can retry\n }\n\n injectObjectiveReminder(feature: FeatureContext, budgetTotal: number): string | undefined {\n this.stepCounter++;\n if (!shouldRemind(this.stepCounter, this.config.objectiveReminderInterval)) {\n return undefined;\n }\n\n const reminder = generateReminder(feature, budgetTotal);\n this.logger.info('Objective reminder injected', {\n feature: feature.slug,\n step: this.stepCounter,\n });\n return reminder.content;\n }\n\n resetStepCounter(): void {\n this.stepCounter = 0;\n }\n\n getCompletedPhases(state: FeatureStatus): string[] {\n const phaseOrder = ['discovery', 'planning', 'implementation', 'validation', 'documentation'];\n const stateToPhaseIndex: Record<string, number> = {\n created: -1,\n analyzing: 0,\n planning: 1,\n ready: 2,\n in_progress: 2,\n in_review: 3,\n documenting: 4,\n completed: 5,\n blocked: -1, // unknown — conservatively assume nothing completed\n };\n const completedUpTo = stateToPhaseIndex[state] ?? -1;\n return phaseOrder.slice(0, completedUpTo);\n }\n\n getMissingSteps(completedPhases: string[], targetMode: AidenMode): WorkflowStep[] {\n const workflow = this.getWorkflow(targetMode);\n return workflow.filter((step) => !completedPhases.includes(step.phase));\n }\n}\n","import { join } from 'node:path';\nimport type {\n ArtefactFrontmatter,\n ArtefactType,\n ArtefactStatus,\n AgentRole,\n AidenMode,\n} from '../types/index.js';\nimport { artefactFrontmatterSchema } from '../types/index.js';\nimport {\n parseFrontmatter,\n serializeFrontmatter,\n updateFrontmatter,\n} from '../utils/yaml-helpers.js';\nimport { fileExists, readText, writeText, ensureDir } from '../utils/fs-helpers.js';\n\nexport interface CreateArtefactOptions {\n type: ArtefactType;\n feature: string;\n author: AgentRole;\n provider: string;\n mode: AidenMode;\n body: string;\n tokensUsed?: number;\n baseDir: string;\n}\n\n/**\n * Creates a new artefact with YAML frontmatter.\n */\nexport async function createArtefact(options: CreateArtefactOptions): Promise<string> {\n const { type, feature, author, provider, mode, body, tokensUsed = 0, baseDir } = options;\n\n const frontmatter: ArtefactFrontmatter = {\n type,\n feature,\n version: 1,\n created: new Date().toISOString().split('T')[0],\n author,\n status: 'draft',\n provider,\n tokensUsed,\n mode,\n };\n\n const content = serializeFrontmatter(frontmatter, body);\n const filePath = getArtefactPath(baseDir, feature, type);\n\n await ensureDir(join(filePath, '..'));\n await writeText(filePath, content);\n\n return filePath;\n}\n\n/**\n * Reads an artefact and returns its frontmatter and body.\n */\nexport async function readArtefact(\n filePath: string,\n): Promise<{ frontmatter: ArtefactFrontmatter; body: string }> {\n const content = await readText(filePath);\n const { frontmatter, body } = parseFrontmatter<ArtefactFrontmatter>(content);\n artefactFrontmatterSchema.parse(frontmatter);\n return { frontmatter, body };\n}\n\n/**\n * Updates the frontmatter of an existing artefact.\n */\nexport async function updateArtefactStatus(\n filePath: string,\n status: ArtefactStatus,\n): Promise<void> {\n const content = await readText(filePath);\n const updated = updateFrontmatter(content, { status });\n await writeText(filePath, updated);\n}\n\n/**\n * Updates the body of an artefact and increments the version.\n */\nexport async function updateArtefactBody(\n filePath: string,\n newBody: string,\n additionalTokens: number = 0,\n): Promise<void> {\n const content = await readText(filePath);\n const { frontmatter } = parseFrontmatter<ArtefactFrontmatter>(content);\n const updatedFm: ArtefactFrontmatter = {\n ...frontmatter,\n version: frontmatter.version + 1,\n tokensUsed: frontmatter.tokensUsed + additionalTokens,\n };\n const updated = serializeFrontmatter(updatedFm, newBody);\n await writeText(filePath, updated);\n}\n\n/**\n * Checks whether an artefact exists.\n */\nexport async function artefactExists(\n baseDir: string,\n feature: string,\n type: ArtefactType,\n): Promise<boolean> {\n return fileExists(getArtefactPath(baseDir, feature, type));\n}\n\n/**\n * Builds the path to an artefact.\n */\nexport function getArtefactPath(baseDir: string, feature: string, type: ArtefactType): string {\n const filename = `${type}.md`;\n return join(baseDir, '.aiden', 'features', feature, filename);\n}\n","import yaml from 'js-yaml';\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/;\n\nexport interface ParsedDocument<T = Record<string, unknown>> {\n frontmatter: T;\n body: string;\n}\n\n/**\n * Parses a markdown document with YAML frontmatter.\n * Returns the parsed frontmatter and body.\n */\nexport function parseFrontmatter<T = Record<string, unknown>>(content: string): ParsedDocument<T> {\n const match = content.match(FRONTMATTER_REGEX);\n if (!match) {\n throw new FrontmatterError('No valid YAML frontmatter found');\n }\n const [, rawYaml, body] = match;\n const frontmatter = yaml.load(rawYaml) as T;\n return { frontmatter, body: body.trimStart() };\n}\n\n/**\n * Serializes a frontmatter and body into a markdown document.\n */\nexport function serializeFrontmatter<T = Record<string, unknown>>(\n frontmatter: T,\n body: string,\n): string {\n const yamlStr = yaml.dump(frontmatter, { lineWidth: 120, noRefs: true }).trimEnd();\n return `---\\n${yamlStr}\\n---\\n\\n${body}`;\n}\n\n/**\n * Updates the frontmatter of an existing document without touching the body.\n */\nexport function updateFrontmatter<T = Record<string, unknown>>(\n content: string,\n updates: Partial<T>,\n): string {\n const { frontmatter, body } = parseFrontmatter<T>(content);\n const updated = { ...frontmatter, ...updates };\n return serializeFrontmatter(updated, body);\n}\n\nexport class FrontmatterError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FrontmatterError';\n }\n}\n","import Handlebars from 'handlebars';\nimport { readFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { fileExists } from '../utils/fs-helpers.js';\nimport { slugify } from '../utils/slugify.js';\n\nconst BUILT_IN_TEMPLATES_DIR = resolve(fileURLToPath(import.meta.url), '..', 'templates');\n\n/**\n * Creates a Handlebars template engine with custom helpers.\n */\nexport function createTemplateEngine(): TemplateEngine {\n const hbs = Handlebars.create();\n\n // Custom helpers\n hbs.registerHelper('date', () => new Date().toISOString().split('T')[0]);\n hbs.registerHelper('slugify', (input: string) => slugify(input));\n hbs.registerHelper('upper', (input: string) => input.toUpperCase());\n hbs.registerHelper('lower', (input: string) => input.toLowerCase());\n hbs.registerHelper(\n 'ifEquals',\n function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this);\n },\n );\n\n return {\n render: (templateStr: string, data: Record<string, unknown>) => {\n const compiled = hbs.compile(templateStr);\n return compiled(data);\n },\n loadAndRender: async (\n templateName: string,\n data: Record<string, unknown>,\n customDir?: string,\n ) => {\n const templateStr = await loadTemplate(templateName, customDir);\n const compiled = hbs.compile(templateStr);\n return compiled(data);\n },\n registerHelper: (name: string, fn: Handlebars.HelperDelegate) => {\n hbs.registerHelper(name, fn);\n },\n };\n}\n\nexport interface TemplateEngine {\n render(templateStr: string, data: Record<string, unknown>): string;\n loadAndRender(\n templateName: string,\n data: Record<string, unknown>,\n customDir?: string,\n ): Promise<string>;\n registerHelper(name: string, fn: Handlebars.HelperDelegate): void;\n}\n\n/**\n * Loads a template from the custom directory or built-in templates.\n */\nasync function loadTemplate(templateName: string, customDir?: string): Promise<string> {\n const fileName = templateName.endsWith('.hbs') ? templateName : `${templateName}.md.hbs`;\n\n // Look first in the custom directory\n if (customDir) {\n const customPath = join(customDir, fileName);\n if (await fileExists(customPath)) {\n return readFile(customPath, 'utf-8');\n }\n }\n\n // Fallback to built-in templates\n const builtInPath = join(BUILT_IN_TEMPLATES_DIR, fileName);\n if (await fileExists(builtInPath)) {\n return readFile(builtInPath, 'utf-8');\n }\n\n throw new TemplateNotFoundError(`Template \"${templateName}\" not found`);\n}\n\nexport class TemplateNotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TemplateNotFoundError';\n }\n}\n","/**\n * Converts a feature name into a kebab-case slug.\n * Removes accents, special characters, and normalizes spaces.\n */\nexport function slugify(input: string, maxLength = 80): string {\n const slug = input\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // remove accents\n .toLowerCase()\n .trim()\n .replace(/_/g, '-') // underscores -> hyphens\n .replace(/[^a-z0-9\\s-]/g, '') // remove special characters\n .replace(/\\s+/g, '-') // spaces -> hyphens\n .replace(/-+/g, '-') // multiple hyphens -> single\n .replace(/^-|-$/g, ''); // remove leading/trailing hyphens\n\n if (slug.length <= maxLength) return slug;\n\n // Truncate at word boundary (hyphen) to avoid cut words\n const truncated = slug.slice(0, maxLength);\n const lastHyphen = truncated.lastIndexOf('-');\n return lastHyphen > 20 ? truncated.slice(0, lastHyphen) : truncated;\n}\n","/**\n * Elicitation Techniques — structured analysis methods for the Analyst agent.\n *\n * Techniques are selected based on detected complexity and mode,\n * then injected into the analyst's prompt to improve analysis quality.\n */\n\nimport type { AidenMode } from '../types/index.js';\n\nexport type TechniqueCategory = 'core' | 'risk' | 'structural' | 'creative';\n\nexport interface ElicitationTechnique {\n id: string;\n name: string;\n category: TechniqueCategory;\n minComplexity: number;\n enterpriseOnly?: boolean;\n promptTemplate: string;\n}\n\nconst TECHNIQUE_REGISTRY: ElicitationTechnique[] = [\n {\n id: 'five-whys',\n name: '5 Whys',\n category: 'core',\n minComplexity: 1,\n promptTemplate: `Apply the \"5 Whys\" technique: for the core problem behind this feature request, ask \"Why?\" 5 times to reach the root cause. This ensures we solve the actual problem, not just the symptom.`,\n },\n {\n id: 'moscow',\n name: 'MoSCoW Prioritization',\n category: 'structural',\n minComplexity: 2,\n promptTemplate: `Apply MoSCoW prioritization to the requirements:\n- **Must have**: Critical requirements that must be delivered\n- **Should have**: Important but not vital\n- **Could have**: Nice to have, if time permits\n- **Won't have**: Explicitly excluded from this scope`,\n },\n {\n id: 'assumption-mapping',\n name: 'Assumption Mapping',\n category: 'core',\n minComplexity: 2,\n promptTemplate: `List all assumptions being made about this feature (technical, business, user behavior). For each assumption, rate: certainty (high/medium/low) and impact if wrong (high/medium/low). Flag any high-impact + low-certainty assumptions as risks.`,\n },\n {\n id: 'impact-mapping',\n name: 'Impact Mapping',\n category: 'structural',\n minComplexity: 2,\n promptTemplate: `Build an impact map: Goal → Actors (who benefits) → Impacts (what changes for them) → Deliverables (what we build). This clarifies the connection between the feature and business value.`,\n },\n {\n id: 'constraint-analysis',\n name: 'Constraint Analysis',\n category: 'core',\n minComplexity: 1,\n promptTemplate: `Identify all constraints: technical (performance, compatibility, existing APIs), business (budget, timeline, compliance), and operational (deployment, monitoring, rollback). Constraints shape the solution space.`,\n },\n {\n id: 'pre-mortem',\n name: 'Pre-mortem Analysis',\n category: 'risk',\n minComplexity: 3,\n promptTemplate: `Pre-mortem: imagine this feature has been deployed and has FAILED. What went wrong? List the top 5 most likely failure scenarios and what we could do now to prevent each one.`,\n },\n {\n id: 'first-principles',\n name: 'First Principles Decomposition',\n category: 'creative',\n minComplexity: 3,\n promptTemplate: `Apply first principles thinking: strip away all assumptions about how this \"should\" be done. What are the fundamental truths? What is the simplest possible solution that satisfies the core requirements? Then build up from there.`,\n },\n {\n id: 'red-team',\n name: 'Red Team Challenge',\n category: 'risk',\n minComplexity: 4,\n promptTemplate: `Red team this feature: if you were trying to break it, exploit it, or misuse it, how would you do it? Consider: edge cases, adversarial inputs, race conditions, privilege escalation, data leaks. List the top attack vectors.`,\n },\n {\n id: 'stakeholder-analysis',\n name: 'Stakeholder Analysis',\n category: 'structural',\n minComplexity: 3,\n enterpriseOnly: true,\n promptTemplate: `Identify all stakeholders impacted by this feature: end users, internal teams, ops/SRE, compliance, management. For each: what do they need from this feature, what are their concerns, and how should we address them?`,\n },\n {\n id: 'raid-log',\n name: 'RAID Log',\n category: 'risk',\n minComplexity: 4,\n promptTemplate: `Create a RAID log for this feature:\n- **Risks**: What could go wrong?\n- **Assumptions**: What are we taking for granted?\n- **Issues**: What problems already exist?\n- **Dependencies**: What external factors do we depend on?`,\n },\n];\n\n/**\n * Select applicable techniques based on complexity and mode.\n * Flash mode: no techniques (zero ceremony).\n * Standard: techniques where minComplexity <= detected complexity.\n * Enterprise: all applicable techniques including enterprise-only.\n */\nexport function selectTechniques(complexity: number, mode: AidenMode): ElicitationTechnique[] {\n if (mode === 'flash') return [];\n\n return TECHNIQUE_REGISTRY.filter((t) => {\n if (t.minComplexity > complexity) return false;\n if (t.enterpriseOnly && mode !== 'enterprise') return false;\n return true;\n });\n}\n\n/**\n * Format selected techniques into a prompt section for the analyst.\n */\nexport function formatElicitationPrompt(techniques: ElicitationTechnique[]): string {\n if (techniques.length === 0) return '';\n\n const parts = [\n '--- Elicitation Techniques ---',\n 'Apply the following analysis techniques to deepen your understanding:\\n',\n ];\n\n for (const t of techniques) {\n parts.push(`### ${t.name}`);\n parts.push(t.promptTemplate);\n parts.push('');\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Get all registered techniques (for listing/documentation).\n */\nexport function getAllTechniques(): ElicitationTechnique[] {\n return [...TECHNIQUE_REGISTRY];\n}\n","import type { AgentOutput, AidenMode, ArtefactMeta } from '../types/index.js';\nimport { BaseAgent, type AgentDependencies, type PipelineContext } from './base-agent.js';\nimport { createArtefact } from '../artefacts/artefact.js';\nimport { createTemplateEngine } from '../artefacts/template-engine.js';\nimport { selectTechniques, formatElicitationPrompt } from './elicitation-techniques.js';\n\nexport interface AnalysisResult {\n complexity: number;\n risks: string[];\n codebaseContext: string;\n questions: string[];\n elicitation?: string[];\n}\n\n/** Mode for the current execution, used for technique selection. */\nlet currentMode: AidenMode = 'standard';\n\nexport class AnalystAgent extends BaseAgent {\n constructor(deps: AgentDependencies) {\n super(deps);\n }\n\n setMode(mode: AidenMode): void {\n currentMode = mode;\n }\n\n async execute(pipeline: PipelineContext): Promise<AgentOutput> {\n const start = Date.now();\n this.logger.info(`Analyst starting analysis for: ${pipeline.featureSlug}`);\n\n // Pre-analyze complexity heuristically for technique selection\n const heuristicComplexity = this.inferComplexity(pipeline.featureRequest);\n const techniques = selectTechniques(heuristicComplexity, currentMode);\n const elicitationSection = formatElicitationPrompt(techniques);\n\n const baseInstructions = `Analyze the following feature request. Respond in this EXACT format:\n\nCOMPLEXITY: <1-5>\nRISKS:\n- <risk description>\nQUESTIONS:\n- <clarifying question>\nCONTEXT:\n<relevant codebase context and analysis>`;\n\n const fullInstructions = elicitationSection\n ? `${baseInstructions}\\n\\n${elicitationSection}`\n : baseInstructions;\n\n const prompt = this.buildPromptFromPipeline(pipeline, fullInstructions);\n\n const response = await this.executeWithTrace(prompt, pipeline);\n\n const analysis = this.parseAnalysis(response.content);\n\n this.emitOutputParsed(pipeline, {\n complexity: analysis.complexity,\n risks_count: analysis.risks.length,\n questions_count: analysis.questions.length,\n });\n\n await this.logDecision({\n feature: pipeline.featureSlug,\n type: 'complexity',\n value: analysis.complexity,\n reason: `${analysis.risks.length} risks identified`,\n tokens: response.tokensUsed,\n });\n\n return {\n agent: 'analyst',\n content: response.content,\n artefacts: [],\n tokensUsed: response.tokensUsed,\n durationMs: Date.now() - start,\n decisions: [],\n structured: {\n complexity: analysis.complexity,\n risks: analysis.risks,\n questions: analysis.questions,\n elicitation: techniques.length > 0 ? techniques.map((t) => t.id) : undefined,\n },\n };\n }\n\n async createBrief(\n featureSlug: string,\n featureName: string,\n answers: Record<string, string>,\n baseDir: string,\n ): Promise<ArtefactMeta> {\n const engine = createTemplateEngine();\n const body = await engine.loadAndRender('brief', {\n feature_name: featureName,\n provider: this.provider.name,\n tokensUsed: 0,\n mode: 'standard',\n context: answers['context'] ?? '',\n objective: answers['objective'] ?? '',\n users: answers['users'] ?? '',\n constraints: answers['constraints'] ?? '',\n risks: answers['risks'] ?? '',\n complexity: answers['complexity'] ?? '3',\n recommended_mode: answers['recommended_mode'] ?? 'standard',\n });\n\n const path = await createArtefact({\n type: 'brief',\n feature: featureSlug,\n author: 'analyst',\n provider: this.provider.name,\n mode: 'standard',\n body,\n baseDir,\n });\n\n return { type: 'brief', path, feature: featureSlug };\n }\n\n parseAnalysis(content: string): AnalysisResult {\n const complexity = this.extractComplexity(content);\n const risks = this.extractListItems(content, 'RISKS');\n const questions = this.extractListItems(content, 'QUESTIONS');\n\n const contextMatch = content.match(\n /CONTEXT:\\s*\\n([\\s\\S]*?)(?=$|\\n(?:COMPLEXITY|RISKS|QUESTIONS):)/i,\n );\n const codebaseContext = contextMatch ? contextMatch[1].trim() : content;\n\n return { complexity, risks, codebaseContext, questions };\n }\n\n private extractComplexity(content: string): number {\n const match = content.match(/COMPLEXITY:\\s*(\\d)/i);\n if (match) {\n return Math.min(Math.max(parseInt(match[1], 10), 1), 5);\n }\n return this.inferComplexity(content);\n }\n\n private extractListItems(content: string, section: string): string[] {\n const sectionRegex = new RegExp(`${section}:\\\\s*\\\\n((?:-\\\\s*.+\\\\n?)*)`, 'i');\n const match = content.match(sectionRegex);\n if (!match) return [];\n return match[1]\n .split('\\n')\n .map((line) => line.replace(/^-\\s*/, '').trim())\n .filter((line) => line.length > 0);\n }\n\n private inferComplexity(content: string): number {\n const lower = content.toLowerCase();\n let score = 2;\n if (lower.includes('complex') || lower.includes('significant')) score++;\n if (lower.includes('migration') || lower.includes('refactor')) score++;\n if (lower.includes('simple') || lower.includes('straightforward')) score--;\n return Math.min(Math.max(score, 1), 5);\n }\n}\n","import type { AgentOutput, ArtefactMeta } from '../types/index.js';\nimport { BaseAgent, type AgentDependencies, type PipelineContext } from './base-agent.js';\nimport { createArtefact } from '../artefacts/artefact.js';\nimport { createTemplateEngine } from '../artefacts/template-engine.js';\n\nexport interface StoryDefinition {\n id: string;\n title: string;\n description: string;\n acceptanceCriteria: string[];\n estimatedTokens: number;\n}\n\nexport interface EffortEstimate {\n totalStories: number;\n totalTokens: number;\n estimatedDurationMinutes: number;\n}\n\nexport class PlannerAgent extends BaseAgent {\n constructor(deps: AgentDependencies) {\n super(deps);\n }\n\n async execute(pipeline: PipelineContext): Promise<AgentOutput> {\n const start = Date.now();\n this.logger.info(`Planner creating spec for: ${pipeline.featureSlug}`);\n\n const prompt = this.buildPromptFromPipeline(\n pipeline,\n `Based on the analysis, create a lightweight specification. Respond in this format:\n\n## Overview\n<1-2 paragraph summary>\n\n## Stories\n### Story 1: <title>\n<description>\nAcceptance criteria:\n- <criterion>\n\n### Story 2: <title>\n...\n\n## Technical Notes\n<architecture decisions, risks, dependencies>\n\n## Effort Estimate\nESTIMATED_TOKENS: <number>`,\n );\n\n const response = await this.executeWithTrace(prompt, pipeline);\n\n await this.logDecision({\n feature: pipeline.featureSlug,\n type: 'planning',\n value: 'spec_created',\n tokens: response.tokensUsed,\n });\n\n const stories = this.decomposeStories(response.content, pipeline.featureRequest);\n const effort = this.estimateEffort(stories);\n\n const tokenMatch = response.content.match(/ESTIMATED_TOKENS:\\s*(\\d+)/i);\n const estimatedTokens = tokenMatch ? parseInt(tokenMatch[1], 10) : effort.totalTokens;\n\n this.emitOutputParsed(pipeline, {\n stories_count: stories.length,\n estimated_tokens: estimatedTokens,\n });\n\n return {\n agent: 'planner',\n content: response.content,\n artefacts: [],\n tokensUsed: response.tokensUsed,\n durationMs: Date.now() - start,\n decisions: [],\n structured: {\n stories: stories.map((s) => ({ id: s.id, title: s.title, description: s.description })),\n estimatedTokens,\n },\n };\n }\n\n async createSpec(\n featureSlug: string,\n featureName: string,\n specData: Record<string, string>,\n baseDir: string,\n ): Promise<ArtefactMeta> {\n const engine = createTemplateEngine();\n const body = await engine.loadAndRender('spec', {\n feature_name: featureName,\n provider: this.provider.name,\n tokensUsed: 0,\n mode: 'standard',\n ...specData,\n });\n\n const path = await createArtefact({\n type: 'spec',\n feature: featureSlug,\n author: 'planner',\n provider: this.provider.name,\n mode: 'standard',\n body,\n baseDir,\n });\n\n return { type: 'spec', path, feature: featureSlug };\n }\n\n decomposeStories(specContent: string, featureName: string): StoryDefinition[] {\n // Try structured ### Story N: format first\n const structured = this.parseStructuredStories(specContent, featureName);\n if (structured.length > 0) return structured.slice(0, 7);\n\n // Fallback: split on ## sections\n const stories: StoryDefinition[] = [];\n const sections = specContent.split(/#{2,3}\\s+/).filter((s) => s.trim().length > 0);\n const storyCount = Math.min(Math.max(sections.length, 1), 7);\n for (let i = 0; i < storyCount; i++) {\n stories.push({\n id: `${String(i + 1).padStart(3, '0')}`,\n title: `${featureName} - Part ${i + 1}`,\n description: sections[i]?.trim() ?? `Implementation step ${i + 1}`,\n acceptanceCriteria: [`Step ${i + 1} is implemented`, `Tests pass for step ${i + 1}`],\n estimatedTokens: 3000,\n });\n }\n return stories;\n }\n\n private parseStructuredStories(specContent: string, featureName: string): StoryDefinition[] {\n const stories: StoryDefinition[] = [];\n const storyRegex = /###\\s*Story\\s*\\d+:\\s*(.+)\\n([\\s\\S]*?)(?=###\\s*Story\\s*\\d|##\\s[^#]|$)/gi;\n let match;\n let idx = 0;\n\n while ((match = storyRegex.exec(specContent)) !== null) {\n idx++;\n const title = match[1].trim();\n const body = match[2].trim();\n\n const criteria: string[] = [];\n const criteriaRegex = /^-\\s+(.+)$/gm;\n let cm;\n while ((cm = criteriaRegex.exec(body)) !== null) {\n criteria.push(cm[1].trim());\n }\n\n const descParts = body.split(/Acceptance criteria:/i);\n const description = descParts[0]?.trim() ?? body;\n\n stories.push({\n id: String(idx).padStart(3, '0'),\n title: `${featureName} - ${title}`,\n description,\n acceptanceCriteria:\n criteria.length > 0 ? criteria : [`${title} is implemented`, 'Tests pass'],\n estimatedTokens: 3000,\n });\n }\n\n return stories;\n }\n\n async createStoryArtefacts(\n featureSlug: string,\n stories: StoryDefinition[],\n baseDir: string,\n ): Promise<ArtefactMeta[]> {\n const engine = createTemplateEngine();\n const artefacts: ArtefactMeta[] = [];\n\n for (const story of stories) {\n const body = await engine.loadAndRender('story', {\n feature_name: featureSlug,\n story_title: story.title,\n description: story.description,\n acceptance_criteria: story.acceptanceCriteria.map((c) => `- [ ] ${c}`).join('\\n'),\n technical_notes: '',\n effort: 'medium',\n estimated_tokens: String(story.estimatedTokens),\n provider: this.provider.name,\n tokensUsed: 0,\n mode: 'standard',\n });\n\n const path = await createArtefact({\n type: 'story',\n feature: featureSlug,\n author: 'planner',\n provider: this.provider.name,\n mode: 'standard',\n body,\n baseDir,\n });\n\n artefacts.push({ type: 'story', path, feature: featureSlug });\n }\n\n return artefacts;\n }\n\n async createADR(\n featureSlug: string,\n decisionData: Record<string, string>,\n baseDir: string,\n ): Promise<ArtefactMeta> {\n const engine = createTemplateEngine();\n const body = await engine.loadAndRender('architecture-decision', {\n feature_name: featureSlug,\n provider: this.provider.name,\n tokensUsed: 0,\n mode: 'standard',\n ...decisionData,\n });\n\n const path = await createArtefact({\n type: 'architecture-decision',\n feature: featureSlug,\n author: 'planner',\n provider: this.provider.name,\n mode: 'standard',\n body,\n baseDir,\n });\n\n return { type: 'architecture-decision', path, feature: featureSlug };\n }\n\n estimateEffort(stories: StoryDefinition[]): EffortEstimate {\n const totalTokens = stories.reduce((sum, s) => sum + s.estimatedTokens, 0);\n return {\n totalStories: stories.length,\n totalTokens,\n estimatedDurationMinutes: Math.ceil(totalTokens / 500), // rough: 500 tokens/min\n };\n }\n}\n","import type { AgentOutput, ArtefactMeta } from '../types/index.js';\nimport { BaseAgent, type AgentDependencies, type PipelineContext } from './base-agent.js';\nimport { createArtefact } from '../artefacts/artefact.js';\nimport { createTemplateEngine } from '../artefacts/template-engine.js';\n\nexport class DevAgent extends BaseAgent {\n private stepCount = 0;\n private filesChanged: string[] = [];\n\n constructor(deps: AgentDependencies) {\n super(deps);\n }\n\n async execute(pipeline: PipelineContext): Promise<AgentOutput> {\n const start = Date.now();\n this.logger.info(`Dev implementing for: ${pipeline.featureSlug}`);\n\n const stories = pipeline.previousOutputs.find((o) => o.agent === 'planner')?.structured\n ?.stories;\n\n const storyList = stories\n ? stories.map((s) => `- ${s.id}: ${s.title}`).join('\\n')\n : 'No stories defined — implement the feature request directly';\n\n const instructions = `You are the Dev agent. Implement the feature based on the specification.\n\nREQUIREMENTS:\n- Modify files directly in the workspace when the feature requires code changes.\n- Do not merely describe a patch or print complete file contents; apply the changes.\n- Write production-quality code\n- Follow the project's existing conventions and patterns\n- Create or modify only the files necessary\n- Include unit tests for new functions/classes\n- No placeholder code — every function must be complete\n- Run the smallest relevant validation command(s) when the repository toolchain is available.\n\nSTORIES TO IMPLEMENT:\n${storyList}\n\nOUTPUT FORMAT:\nSummarize the applied changes and validation result. End with:\nFILES_CHANGED: <comma-separated paths>\nTESTS_GENERATED: <comma-separated test paths>`;\n\n const prompt = this.buildPromptFromPipeline(pipeline, instructions);\n const response = await this.executeWithTrace(prompt, pipeline);\n\n const filesChanged = this.parseFilesList(response.content, 'FILES_CHANGED');\n const testsGenerated = this.parseFilesList(response.content, 'TESTS_GENERATED');\n\n this.stepCount++;\n\n this.emitOutputParsed(pipeline, {\n files_changed: filesChanged.length > 0 ? filesChanged.length : this.getFilesChanged().length,\n tests_generated: testsGenerated.length,\n });\n\n await this.logDecision({\n feature: pipeline.featureSlug,\n type: 'implementation',\n value: `step-${this.stepCount}`,\n tokens: response.tokensUsed,\n });\n\n return {\n agent: 'dev',\n content: response.content,\n artefacts: [],\n tokensUsed: response.tokensUsed,\n durationMs: Date.now() - start,\n decisions: [],\n structured: {\n filesChanged: filesChanged.length > 0 ? filesChanged : this.getFilesChanged(),\n testsGenerated,\n },\n };\n }\n\n parseFilesList(content: string, label: string): string[] {\n const match = content.match(new RegExp(`${label}:\\\\s*(.+)`, 'i'));\n if (!match) return [];\n return match[1]\n .split(',')\n .map((f) => f.trim())\n .filter((f) => f.length > 0);\n }\n\n async createChangeSummary(\n featureSlug: string,\n featureName: string,\n changes: Record<string, string>,\n baseDir: string,\n ): Promise<ArtefactMeta> {\n const engine = createTemplateEngine();\n const body = await engine.loadAndRender('change-summary', {\n feature_name: featureName,\n provider: this.provider.name,\n tokensUsed: 0,\n mode: 'flash',\n ...changes,\n });\n\n const path = await createArtefact({\n type: 'change-summary',\n feature: featureSlug,\n author: 'dev',\n provider: this.provider.name,\n mode: 'flash',\n body,\n baseDir,\n });\n\n return { type: 'change-summary', path, feature: featureSlug };\n }\n\n trackFileChange(filePath: string): void {\n if (!this.filesChanged.includes(filePath)) {\n this.filesChanged.push(filePath);\n }\n }\n\n getFilesChanged(): string[] {\n return [...this.filesChanged];\n }\n\n private checkGuardrails(): void {\n if (this.filesChanged.length >= this.config.maxFileChanges) {\n this.logger.warn(`Max file changes reached (${this.config.maxFileChanges})`, {\n files: this.filesChanged.length,\n });\n }\n }\n\n resetState(): void {\n this.stepCount = 0;\n this.filesChanged = [];\n }\n}\n","import type { AgentOutput, AidenMode, ArtefactMeta } from '../types/index.js';\nimport { BaseAgent, type AgentDependencies, type PipelineContext } from './base-agent.js';\nimport { createArtefact } from '../artefacts/artefact.js';\nimport { createTemplateEngine } from '../artefacts/template-engine.js';\n\nexport interface QAReport {\n passed: boolean;\n score: number;\n criticalIssues: number;\n minorIssues: number;\n acceptanceCriteriaMet: number;\n acceptanceCriteriaTotal: number;\n}\n\ninterface StoryCriteria {\n storyTitle: string;\n criteria: string[];\n}\n\nexport type ReviewLayerType = 'acceptance' | 'security' | 'edge-case' | 'blind';\n\nexport interface ReviewFinding {\n severity: 'critical' | 'major' | 'minor' | 'info';\n category: string;\n description: string;\n file?: string;\n line?: number;\n suggestion?: string;\n}\n\nexport interface ReviewLayer {\n type: ReviewLayerType;\n findings: ReviewFinding[];\n}\n\n/** Which layers are active per mode. */\nconst MODE_LAYERS: Record<AidenMode, ReviewLayerType[]> = {\n flash: ['acceptance'],\n standard: ['acceptance', 'security', 'edge-case'],\n enterprise: ['acceptance', 'security', 'edge-case', 'blind'],\n};\n\nconst OWASP_PATTERNS = [\n { name: 'SQL Injection', pattern: /(\\bexec\\b|\\beval\\b|\\.query\\s*\\(.*\\+)/i },\n { name: 'XSS', pattern: /(innerHTML|document\\.write|\\.html\\s*\\()/i },\n {\n name: 'Hardcoded Secrets',\n pattern: /(password\\s*=\\s*['\"][^'\"]+|api[_-]?key\\s*=\\s*['\"][^'\"]+)/i,\n },\n { name: 'Path Traversal', pattern: /(\\.\\.\\/|\\.\\.\\\\)/i },\n { name: 'Command Injection', pattern: /(child_process\\.exec\\s*\\(.*\\+|spawn\\s*\\(.*\\+)/i },\n];\n\nexport class QAAgent extends BaseAgent {\n private mode: AidenMode = 'standard';\n\n constructor(deps: AgentDependencies) {\n super(deps);\n }\n\n setMode(mode: AidenMode): void {\n this.mode = mode;\n }\n\n /**\n * Get the active review layers for the current mode.\n */\n getActiveLayers(): ReviewLayerType[] {\n return [...MODE_LAYERS[this.mode]];\n }\n\n /**\n * Run local security scan and produce ReviewFindings.\n */\n runSecurityLayer(code: string): ReviewLayer {\n const findings: ReviewFinding[] = [];\n for (const check of OWASP_PATTERNS) {\n const match = code.match(check.pattern);\n if (match) {\n findings.push({\n severity: 'critical',\n category: 'security',\n description: `${check.name} detected`,\n suggestion: `Review: ${match[0]}`,\n });\n }\n }\n return { type: 'security', findings };\n }\n\n /**\n * Deduplicate findings by description similarity.\n */\n deduplicateFindings(layers: ReviewLayer[]): ReviewFinding[] {\n const all: ReviewFinding[] = [];\n const seen = new Set<string>();\n\n for (const layer of layers) {\n for (const finding of layer.findings) {\n const key = `${finding.category}:${finding.description}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n all.push(finding);\n }\n }\n }\n\n // Sort by severity: critical > major > minor > info\n const order: Record<string, number> = { critical: 0, major: 1, minor: 2, info: 3 };\n return all.sort((a, b) => (order[a.severity] ?? 4) - (order[b.severity] ?? 4));\n }\n\n async execute(pipeline: PipelineContext): Promise<AgentOutput> {\n const start = Date.now();\n this.logger.info(`QA reviewing for: ${pipeline.featureSlug}`);\n\n // Extract stories with acceptance criteria from planner output\n const storyCriteria = this.extractStoryCriteria(pipeline);\n\n // Extract files changed from dev output\n const devOutput = pipeline.previousOutputs.find((o) => o.agent === 'dev');\n const filesChanged = devOutput?.structured?.filesChanged ?? [];\n\n const codeToReview =\n pipeline.previousOutputs\n .filter((o) => o.agent === 'dev')\n .map((o) => o.content)\n .join('\\n') || pipeline.featureRequest;\n\n // Build review input with explicit criteria\n let reviewInput = '';\n if (storyCriteria.length > 0) {\n reviewInput += '--- ACCEPTANCE CRITERIA TO VERIFY ---\\n';\n for (const story of storyCriteria) {\n reviewInput += `\\nStory: ${story.storyTitle}\\n`;\n for (const criterion of story.criteria) {\n reviewInput += ` - ${criterion}\\n`;\n }\n }\n reviewInput += '\\nFor each criterion, state explicitly: PASS or FAIL with reason.\\n';\n reviewInput += 'Format: CRITERIA_RESULTS:\\nStory / Criterion: PASS|FAIL - reason\\n\\n';\n }\n\n if (filesChanged.length > 0) {\n reviewInput += `Files changed: ${filesChanged.join(', ')}\\n\\n`;\n }\n\n reviewInput += `Code:\\n${codeToReview}`;\n\n const activeLayers = this.getActiveLayers();\n const layers: ReviewLayer[] = [];\n\n // Trace: prompt_built event\n const tc = pipeline.traceCollector;\n const parentSpanId = pipeline.currentPhaseSpanId;\n tc?.addEvent(parentSpanId ?? '', 'prompt_built', undefined, {\n agent_role: 'qa',\n prompt_length: reviewInput.length,\n has_previous_outputs: pipeline.previousOutputs.length > 0,\n has_skills: this.skillInstructions.length > 0,\n has_rules: this.rules.length > 0,\n });\n\n // Trace: provider_call span\n const providerSpanId =\n tc?.startSpan('provider_call', `call:${this.provider.name}`, parentSpanId ?? '', {\n provider_name: this.provider.name,\n stdin_length: reviewInput.length,\n }) ?? '';\n const providerStart = Date.now();\n\n // Layer: acceptance (always active — uses provider review)\n const response = await this.provider.review(reviewInput, {\n checkSecurity: activeLayers.includes('security'),\n checkPerformance: true,\n checkStyle: true,\n checkTests: true,\n customRules: this.rules,\n });\n\n // Trace: close provider_call span\n tc?.setAttribute(providerSpanId, 'tokens_used', response.tokensUsed);\n tc?.setAttribute(providerSpanId, 'duration_ms', Date.now() - providerStart);\n tc?.endSpan(providerSpanId, 'success');\n\n const acceptanceFindings: ReviewFinding[] = response.issues.map((i) => ({\n severity: i.severity === 'error' ? 'critical' : i.severity === 'warning' ? 'major' : 'minor',\n category: 'acceptance',\n description: i.message,\n file: i.file,\n line: i.line,\n }));\n layers.push({ type: 'acceptance', findings: acceptanceFindings });\n\n // Layer: security (local OWASP scan)\n if (activeLayers.includes('security')) {\n layers.push(this.runSecurityLayer(codeToReview));\n }\n\n // Layer: edge-case (prompt-based)\n if (activeLayers.includes('edge-case')) {\n // Edge case analysis is included in the main review prompt\n const edgeCaseFindings: ReviewFinding[] = [];\n const edgeRegex = /edge[- ]?case|boundary|overflow|null|empty|race condition/gi;\n const edgeMatches = response.suggestions.join('\\n').match(edgeRegex);\n if (edgeMatches) {\n edgeCaseFindings.push({\n severity: 'minor',\n category: 'edge-case',\n description: `${edgeMatches.length} edge case concern(s) flagged in review`,\n });\n }\n layers.push({ type: 'edge-case', findings: edgeCaseFindings });\n }\n\n // Layer: blind (enterprise only — review without context)\n if (activeLayers.includes('blind')) {\n // Blind review: send code only, no brief/spec context\n try {\n const blindResult = await this.provider.review(\n `Review this code for quality issues. No context provided intentionally.\\n\\nCode:\\n${codeToReview}`,\n {\n checkSecurity: true,\n checkPerformance: true,\n checkStyle: true,\n checkTests: false,\n customRules: [],\n },\n );\n const blindFindings: ReviewFinding[] = blindResult.issues.map((i) => ({\n severity: i.severity === 'error' ? 'major' : 'minor',\n category: 'blind-review',\n description: i.message,\n file: i.file,\n line: i.line,\n }));\n layers.push({ type: 'blind', findings: blindFindings });\n } catch {\n this.logger.warn('Blind review layer failed, skipping');\n }\n }\n\n // Aggregate and deduplicate findings\n const allFindings = this.deduplicateFindings(layers);\n\n // Parse criteria results from review response if available\n const criteriaResults = this.parseCriteriaResults(response.suggestions.join('\\n'));\n\n // Trace: output_parsed event\n this.emitOutputParsed(pipeline, {\n passed: response.passed,\n score: response.score,\n issues_count: allFindings.length,\n criteria_results_count: criteriaResults.length,\n layers_count: layers.length,\n });\n\n await this.logDecision({\n feature: pipeline.featureSlug,\n type: 'review',\n value: response.passed ? 'passed' : 'failed',\n reason: `Score: ${response.score}/10, ${allFindings.length} findings across ${layers.length} layers, ${criteriaResults.length} criteria checked`,\n });\n\n return {\n agent: 'qa',\n content: response.suggestions.join('\\n'),\n artefacts: [],\n tokensUsed: response.tokensUsed,\n durationMs: Date.now() - start,\n decisions: [],\n structured: {\n passed: response.passed,\n score: response.score,\n issues: allFindings.map((f) => ({\n severity: f.severity,\n message: `[${f.category}] ${f.description}`,\n })),\n criteriaResults: criteriaResults.length > 0 ? criteriaResults : undefined,\n layers: layers.map((l) => ({ type: l.type, findingsCount: l.findings.length })),\n },\n };\n }\n\n extractStoryCriteria(pipeline: PipelineContext): StoryCriteria[] {\n const plannerOutput = pipeline.previousOutputs.find((o) => o.agent === 'planner');\n if (!plannerOutput?.structured?.stories) return [];\n\n const results: StoryCriteria[] = [];\n for (const s of plannerOutput.structured.stories) {\n const story = s as {\n id: string;\n title: string;\n description: string;\n acceptanceCriteria?: string[];\n };\n if (story.acceptanceCriteria && story.acceptanceCriteria.length > 0) {\n results.push({ storyTitle: story.title, criteria: story.acceptanceCriteria });\n }\n }\n return results;\n }\n\n parseCriteriaResults(\n content: string,\n ): Array<{ story: string; criterion: string; passed: boolean; reason?: string }> {\n const results: Array<{ story: string; criterion: string; passed: boolean; reason?: string }> =\n [];\n const section = content.match(/CRITERIA_RESULTS:\\s*\\n([\\s\\S]*?)(?=$|\\n\\n)/i);\n if (!section) return results;\n\n const lines = section[1].split('\\n').filter((l) => l.trim().length > 0);\n for (const line of lines) {\n // Format: \"Story Title / Criterion: PASS|FAIL - reason\"\n const match = line.match(/^(.+?)\\s*\\/\\s*(.+?):\\s*(PASS|FAIL)(?:\\s*-\\s*(.+))?$/i);\n if (match) {\n results.push({\n story: match[1].trim(),\n criterion: match[2].trim(),\n passed: match[3].toUpperCase() === 'PASS',\n reason: match[4]?.trim(),\n });\n }\n }\n return results;\n }\n\n securityScan(code: string): Array<{ name: string; found: boolean; line?: string }> {\n const results: Array<{ name: string; found: boolean; line?: string }> = [];\n\n for (const check of OWASP_PATTERNS) {\n const match = code.match(check.pattern);\n results.push({\n name: check.name,\n found: !!match,\n line: match ? match[0] : undefined,\n });\n }\n\n return results;\n }\n\n async createReport(\n featureSlug: string,\n featureName: string,\n report: QAReport,\n baseDir: string,\n ): Promise<ArtefactMeta> {\n const engine = createTemplateEngine();\n const body = await engine.loadAndRender('quality-report', {\n feature_name: featureName,\n provider: this.provider.name,\n tokensUsed: 0,\n mode: 'standard',\n summary: report.passed ? 'All checks passed' : 'Issues found',\n acceptance_results: `${report.acceptanceCriteriaMet}/${report.acceptanceCriteriaTotal} met`,\n test_coverage: 'N/A',\n security_results:\n report.criticalIssues === 0\n ? 'No critical issues'\n : `${report.criticalIssues} critical issues`,\n overall_score: String(report.score),\n critical_issues: String(report.criticalIssues),\n minor_issues: String(report.minorIssues),\n recommendations: report.passed\n ? 'No immediate action needed'\n : 'Review and fix critical issues',\n });\n\n const path = await createArtefact({\n type: 'quality-report',\n feature: featureSlug,\n author: 'qa',\n provider: this.provider.name,\n mode: 'standard',\n body,\n baseDir,\n });\n\n return { type: 'quality-report', path, feature: featureSlug };\n }\n}\n","import type { AgentOutput } from '../types/index.js';\nimport { BaseAgent, type AgentDependencies, type PipelineContext } from './base-agent.js';\n\nexport interface ComplianceResult {\n passed: boolean;\n missingArtefacts: string[];\n incompleteArtefacts: string[];\n}\n\nexport class DocOpsAgent extends BaseAgent {\n constructor(deps: AgentDependencies) {\n super(deps);\n }\n\n async execute(pipeline: PipelineContext): Promise<AgentOutput> {\n const start = Date.now();\n this.logger.info(`DocOps generating documentation for: ${pipeline.featureSlug}`);\n\n const instructions = `You are the DocOps agent. Generate documentation for the implemented feature.\n\nTASKS:\n1. Write a concise technical summary of what was implemented\n2. List all files changed with a one-line description for each\n3. Document any new APIs, functions, or configuration options\n4. Note any breaking changes or migration steps needed\n5. Generate a changelog entry\n\nOUTPUT FORMAT:\n## Summary\n<1-2 paragraphs>\n\n## Changes\n- <file>: <description>\n\n## Changelog Entry\n### Added/Changed/Fixed\n- <item>\n\nDOCS_GENERATED: <comma-separated doc types>`;\n\n const prompt = this.buildPromptFromPipeline(pipeline, instructions);\n const response = await this.executeWithTrace(prompt, pipeline);\n\n const docsMatch = response.content.match(/DOCS_GENERATED:\\s*(.+)/i);\n const docsGenerated = docsMatch\n ? docsMatch[1]\n .split(',')\n .map((d) => d.trim())\n .filter((d) => d.length > 0)\n : ['documentation'];\n\n await this.logDecision({\n feature: pipeline.featureSlug,\n type: 'documentation',\n value: 'docs_generated',\n tokens: response.tokensUsed,\n });\n\n return {\n agent: 'docops',\n content: response.content,\n artefacts: [],\n tokensUsed: response.tokensUsed,\n durationMs: Date.now() - start,\n decisions: [],\n structured: {\n docsGenerated,\n },\n };\n }\n\n generateChangelog(featureName: string, changes: string[]): string {\n const date = new Date().toISOString().split('T')[0];\n const lines = [\n `## [${date}] - ${featureName}`,\n '',\n '### Added',\n ...changes.map((c) => `- ${c}`),\n '',\n ];\n return lines.join('\\n');\n }\n\n checkCompliance(requiredArtefacts: string[], existingArtefacts: string[]): ComplianceResult {\n const missing = requiredArtefacts.filter((r) => !existingArtefacts.includes(r));\n return {\n passed: missing.length === 0,\n missingArtefacts: missing,\n incompleteArtefacts: [],\n };\n }\n\n generateRunbook(featureName: string, steps: string[]): string {\n const lines = [\n `# Runbook: ${featureName}`,\n '',\n '## Deployment Steps',\n '',\n ...steps.map((s, i) => `${i + 1}. ${s}`),\n '',\n '## Rollback',\n '',\n '1. Revert the deployment',\n '2. Verify service health',\n '',\n ];\n return lines.join('\\n');\n }\n}\n","import type { FeatureStatus } from '../types/index.js';\nimport { featureTransitions } from '../types/index.js';\n\nexport class InvalidTransitionError extends Error {\n constructor(from: FeatureStatus, to: FeatureStatus) {\n super(`Invalid transition: ${from} -> ${to}`);\n this.name = 'InvalidTransitionError';\n }\n}\n\n/**\n * Checks whether a state transition is valid.\n */\nexport function canTransition(from: FeatureStatus, to: FeatureStatus): boolean {\n return featureTransitions[from].includes(to);\n}\n\n/**\n * Performs a state transition, throws an error if invalid.\n */\nexport function transition(from: FeatureStatus, to: FeatureStatus): FeatureStatus {\n if (!canTransition(from, to)) {\n throw new InvalidTransitionError(from, to);\n }\n return to;\n}\n\n/**\n * Returns the possible next states from the current state.\n */\nexport function nextStates(current: FeatureStatus): FeatureStatus[] {\n return [...featureTransitions[current]];\n}\n\n/**\n * Returns the state sequence for flash mode (shortcut).\n */\nexport function flashSequence(): FeatureStatus[] {\n return ['created', 'in_progress', 'completed'];\n}\n\n/**\n * Returns the state sequence for standard mode.\n */\nexport function standardSequence(): FeatureStatus[] {\n return ['created', 'analyzing', 'planning', 'ready', 'in_progress', 'in_review', 'completed'];\n}\n\n/**\n * Returns the state sequence for enterprise mode (with documentation).\n */\nexport function enterpriseSequence(): FeatureStatus[] {\n return [\n 'created',\n 'analyzing',\n 'planning',\n 'ready',\n 'in_progress',\n 'in_review',\n 'documenting',\n 'completed',\n ];\n}\n","import { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { readText, fileExists } from '../utils/fs-helpers.js';\n\nexport interface LoadedRule {\n name: string;\n content: string;\n path: string;\n}\n\n/**\n * Loads all .md rules from a rules directory.\n */\nexport async function loadRules(rulesDir: string): Promise<LoadedRule[]> {\n if (!(await fileExists(rulesDir))) return [];\n\n const files = await readdir(rulesDir);\n const mdFiles = files.filter((f) => f.endsWith('.md'));\n\n const rules: LoadedRule[] = [];\n for (const file of mdFiles) {\n const filePath = join(rulesDir, file);\n const content = await readText(filePath);\n rules.push({\n name: file.replace('.md', ''),\n content,\n path: filePath,\n });\n }\n\n return rules;\n}\n\n/**\n * Loads specific rules by name from the directory.\n */\nexport async function loadRulesByName(\n rulesDir: string,\n ruleNames: string[],\n): Promise<LoadedRule[]> {\n const rules: LoadedRule[] = [];\n\n for (const name of ruleNames) {\n const fileName = name.endsWith('.md') ? name : `${name}.md`;\n const filePath = join(rulesDir, fileName);\n if (await fileExists(filePath)) {\n const content = await readText(filePath);\n rules.push({\n name: name.replace('.md', ''),\n content,\n path: filePath,\n });\n }\n }\n\n return rules;\n}\n","import type { AgentRole } from '../types/index.js';\nimport type { LoadedRule } from './rules-loader.js';\n\n/**\n * Maps rules to agents based on their relevance.\n */\nconst AGENT_RULE_RELEVANCE: Record<AgentRole, string[]> = {\n lead: ['coding-standards', 'architecture-principles'],\n analyst: ['coding-standards'],\n planner: ['coding-standards', 'architecture-principles', 'naming-conventions'],\n dev: ['coding-standards', 'naming-conventions', 'security-policy'],\n qa: ['coding-standards', 'security-policy'],\n docops: ['coding-standards'],\n};\n\n/**\n * Filters and injects relevant rules for a given agent.\n */\nexport function getRulesForAgent(agent: AgentRole, rules: LoadedRule[]): string[] {\n const relevantNames = AGENT_RULE_RELEVANCE[agent] ?? [];\n\n // If no filter, all rules are injected\n if (relevantNames.length === 0) {\n return rules.map((r) => r.content);\n }\n\n // Filter by relevance + always include all custom rules\n return rules\n .filter(\n (r) =>\n relevantNames.includes(r.name) ||\n !Object.values(AGENT_RULE_RELEVANCE).flat().includes(r.name),\n )\n .map((r) => r.content);\n}\n\n/**\n * Formats rules into a single string injectable into an agent's context.\n */\nexport function formatRulesForInjection(rules: string[]): string {\n if (rules.length === 0) return '';\n return rules.join('\\n\\n---\\n\\n');\n}\n","import { readdir, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { readText, readYaml, fileExists } from '../utils/fs-helpers.js';\nimport { skillManifestSchema } from '../types/index.js';\nimport type { LoadedSkill } from '../types/index.js';\n\n/**\n * Loads all skills from a skills directory.\n * Each subdirectory must contain a valid skill.yaml.\n * If aidenVersion is provided, logs warnings for incompatible skills but still loads them.\n */\nexport async function loadSkills(skillsDir: string, aidenVersion?: string): Promise<LoadedSkill[]> {\n if (!(await fileExists(skillsDir))) return [];\n\n const entries = await readdir(skillsDir);\n const skills: LoadedSkill[] = [];\n\n for (const entry of entries) {\n // Skip files starting with . (e.g. .registry-lock.json, .packs.yaml)\n if (entry.startsWith('.')) continue;\n const skillDir = join(skillsDir, entry);\n const info = await stat(skillDir);\n if (!info.isDirectory()) continue;\n\n const skill = await loadSkill(skillDir);\n if (skill) skills.push(skill);\n }\n\n // Compatibility warnings (non-blocking)\n if (aidenVersion) {\n let semverSatisfies: ((v: string, r: string) => boolean) | undefined;\n try {\n const semver = await import('semver');\n semverSatisfies = semver.satisfies;\n } catch {\n // semver not available, skip checks\n }\n if (semverSatisfies) {\n for (const skill of skills) {\n if (skill.manifest.compatibility?.aiden) {\n if (!semverSatisfies(aidenVersion, skill.manifest.compatibility.aiden)) {\n // eslint-disable-next-line no-console\n console.warn(\n `[WARN] Skill \"${skill.manifest.name}\" requires AIDEN ${skill.manifest.compatibility.aiden} ` +\n `(current: ${aidenVersion}). It may not work correctly.`,\n );\n }\n }\n }\n }\n }\n\n return skills\n .filter((s) => s.manifest.enabled)\n .sort((a, b) => b.manifest.priority - a.manifest.priority);\n}\n\n/**\n * Loads a single skill from a directory.\n * Returns null if the directory is invalid or the manifest is incorrect.\n */\nexport async function loadSkill(skillDir: string): Promise<LoadedSkill | null> {\n const manifestPath = join(skillDir, 'skill.yaml');\n if (!(await fileExists(manifestPath))) return null;\n\n let raw: unknown;\n try {\n raw = await readYaml(manifestPath);\n } catch {\n return null;\n }\n\n const parsed = skillManifestSchema.safeParse(raw);\n if (!parsed.success) return null;\n\n const instructionsPath = join(skillDir, 'instructions.md');\n const instructions = (await fileExists(instructionsPath)) ? await readText(instructionsPath) : '';\n\n const rulesDir = join(skillDir, 'rules');\n const rules: Array<{ name: string; content: string }> = [];\n if (await fileExists(rulesDir)) {\n const ruleFiles = (await readdir(rulesDir)).filter((f) => f.endsWith('.md'));\n for (const file of ruleFiles) {\n const content = await readText(join(rulesDir, file));\n rules.push({ name: file.replace('.md', ''), content });\n }\n }\n\n return {\n manifest: parsed.data,\n instructions,\n rules,\n dir: skillDir,\n };\n}\n","import type { AgentRole, AidenMode, HookConfig } from '../types/index.js';\nimport type { LoadedSkill } from '../types/index.js';\nimport { join } from 'node:path';\n\n/**\n * Filters skills applicable to a given agent and mode.\n */\nexport function getSkillsForAgent(\n agent: AgentRole,\n mode: AidenMode,\n skills: LoadedSkill[],\n): LoadedSkill[] {\n return skills.filter((s) => {\n const agentMatch = s.manifest.agents.includes(agent);\n const modeMatch = !s.manifest.modes || s.manifest.modes.includes(mode);\n return agentMatch && modeMatch;\n });\n}\n\n/**\n * Formats skill instructions into a block injectable into the prompt.\n */\nexport function formatSkillInstructions(skills: LoadedSkill[]): string {\n const blocks = skills\n .filter((s) => s.instructions.length > 0)\n .map((s) => `## Skill: ${s.manifest.name} (v${s.manifest.version})\\n${s.instructions}`);\n return blocks.join('\\n\\n---\\n\\n');\n}\n\n/**\n * Extracts all rules from skills into a flat array.\n */\nexport function extractSkillRules(skills: LoadedSkill[]): string[] {\n return skills.flatMap((s) => s.rules.map((r) => r.content));\n}\n\n/**\n * Extracts and merges hooks from all skills.\n * Relative commands (./) are resolved to an absolute path from the skill's directory.\n */\nexport function extractSkillHooks(skills: LoadedSkill[]): Record<string, HookConfig[]> {\n const merged: Record<string, HookConfig[]> = {};\n for (const skill of skills) {\n if (!skill.manifest.hooks) continue;\n for (const [event, hooks] of Object.entries(skill.manifest.hooks)) {\n if (!merged[event]) merged[event] = [];\n for (const hook of hooks) {\n merged[event].push({\n ...hook,\n command: hook.command.startsWith('./')\n ? join(skill.dir, hook.command.slice(2))\n : hook.command,\n });\n }\n }\n }\n return merged;\n}\n","import type { AgentRole, AgentProfile, AidenConfig, LoadedSkill } from '../types/index.js';\nimport type { AgentPersona } from './personas.js';\n\ntype PersonaOverride = Partial<AgentPersona> | false | undefined;\n\nfunction mergeUnique(\n left: string[] | undefined,\n right: string[] | undefined,\n): string[] | undefined {\n const merged = [...(left ?? []), ...(right ?? [])];\n if (merged.length === 0) return undefined;\n return [...new Set(merged)];\n}\n\nfunction mergeAgentOverride(base: PersonaOverride, override: PersonaOverride): PersonaOverride {\n if (override === undefined) return base;\n if (override === false) return false;\n if (base === false || base === undefined) return override;\n return { ...base, ...override };\n}\n\nfunction mergeProfiles(base: AgentProfile | undefined, override: AgentProfile): AgentProfile {\n const agents: NonNullable<AgentProfile['agents']> = { ...(base?.agents ?? {}) };\n for (const role of Object.keys(override.agents ?? {}) as AgentRole[]) {\n agents[role] = mergeAgentOverride(agents[role], override.agents?.[role]);\n }\n\n return {\n name: override.name ?? base?.name,\n description: override.description ?? base?.description,\n recommendedMode: override.recommendedMode ?? base?.recommendedMode,\n workflowPreset: override.workflowPreset ?? base?.workflowPreset,\n instructions: override.instructions ?? base?.instructions,\n skills: mergeUnique(base?.skills, override.skills),\n artefacts: mergeUnique(base?.artefacts, override.artefacts),\n agents: Object.keys(agents).length > 0 ? agents : undefined,\n };\n}\n\n/**\n * Resolves an agent profile by merging skill-provided profile defaults first,\n * then applying project/config overrides. Config wins for scalar and persona fields.\n */\nexport function resolveAgentProfile(\n profileName: string | undefined,\n config: Pick<AidenConfig, 'agentProfiles'>,\n skills: LoadedSkill[],\n): AgentProfile | undefined {\n if (!profileName) return undefined;\n\n let resolved: AgentProfile | undefined;\n for (const skill of skills) {\n const skillProfile = skill.manifest.profiles?.[profileName];\n if (skillProfile) {\n resolved = mergeProfiles(resolved, { name: profileName, ...skillProfile });\n }\n }\n\n const configProfile = config.agentProfiles?.[profileName];\n if (configProfile) {\n resolved = mergeProfiles(resolved, { name: profileName, ...configProfile });\n }\n\n return resolved ? { name: profileName, ...resolved } : undefined;\n}\n\nexport function resolveAgentProfilePersona(\n profile: AgentProfile | undefined,\n role: AgentRole,\n): Partial<AgentPersona> | false | undefined {\n const override = profile?.agents?.[role];\n if (override === undefined) return undefined;\n if (override === false) return false;\n return override;\n}\n\nexport function formatAgentProfileInstructions(profile: AgentProfile | undefined): string {\n if (!profile) return '';\n\n const parts: string[] = [`## Agent Profile: ${profile.name ?? 'unnamed'}`];\n if (profile.description) parts.push(profile.description);\n if (profile.workflowPreset) parts.push(`Workflow preset: ${profile.workflowPreset}`);\n if (profile.recommendedMode) parts.push(`Recommended mode: ${profile.recommendedMode}`);\n if (profile.instructions) parts.push(profile.instructions);\n if (profile.artefacts && profile.artefacts.length > 0) {\n parts.push(`Expected profile artefacts: ${profile.artefacts.join(', ')}`);\n }\n\n return parts.join('\\n');\n}\n","import { spawn } from 'node:child_process';\nimport type { HookConfig, HookEvent, HookResult } from '../types/index.js';\nimport type { Logger } from '../utils/logger.js';\n\nexport interface HookRunner {\n run(event: HookEvent, context: Record<string, string>): Promise<HookResult[]>;\n}\n\nexport function createHookRunner(hooks: Record<string, HookConfig[]>, logger: Logger): HookRunner {\n return {\n async run(event: HookEvent, context: Record<string, string>): Promise<HookResult[]> {\n const eventHooks = hooks[event];\n if (!eventHooks || eventHooks.length === 0) return [];\n\n const results: HookResult[] = [];\n\n for (const hook of eventHooks) {\n const command = substituteVars(hook.command, context);\n logger.debug(`Running hook: ${command}`, { event });\n\n const start = Date.now();\n try {\n const output = await executeShell(command);\n results.push({\n event,\n command: hook.command,\n success: true,\n output,\n durationMs: Date.now() - start,\n });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n logger.warn(`Hook failed: ${command}`, { error, onFailure: hook.onFailure });\n results.push({\n event,\n command: hook.command,\n success: false,\n error,\n durationMs: Date.now() - start,\n });\n\n if (hook.onFailure === 'block') {\n throw new HookBlockError(`Hook blocked execution: ${command} - ${error}`);\n }\n }\n }\n\n return results;\n },\n };\n}\n\nfunction substituteVars(command: string, context: Record<string, string>): string {\n let result = command;\n for (const [key, value] of Object.entries(context)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n return result;\n}\n\nfunction executeShell(command: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const proc = spawn('sh', ['-c', command], { stdio: ['pipe', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n\n proc.stdout.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n proc.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim());\n } else {\n reject(new Error(stderr || stdout || `Exit code ${code}`));\n }\n });\n\n proc.on('error', (err) => {\n reject(err);\n });\n });\n}\n\n/**\n * Merges multiple hook sources into a single record.\n * Hooks for the same event are concatenated, not overwritten.\n */\nexport function mergeHooks(\n ...sources: Array<Record<string, HookConfig[]>>\n): Record<string, HookConfig[]> {\n const merged: Record<string, HookConfig[]> = {};\n for (const source of sources) {\n for (const [event, hooks] of Object.entries(source)) {\n if (!merged[event]) merged[event] = [];\n merged[event].push(...hooks);\n }\n }\n return merged;\n}\n\nexport class HookBlockError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'HookBlockError';\n }\n}\n","/**\n * AIDEN Trace System — Collector\n * Collects spans and events during workflow execution.\n * No-op when disabled (zero overhead).\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { AidenMode } from '../../types/index.js';\nimport type {\n Trace,\n TraceEvent,\n TraceListener,\n TraceSpan,\n TraceStatus,\n SpanKind,\n SpanStatus,\n} from './trace-types.js';\n\nconst NOOP_SPAN_ID = '';\n\nexport class TraceCollector {\n private trace: Trace | null = null;\n private readonly enabled: boolean;\n private readonly listener?: TraceListener;\n\n constructor(featureSlug: string, mode: AidenMode, enabled: boolean, listener?: TraceListener) {\n this.enabled = enabled;\n this.listener = listener;\n\n if (!enabled) return;\n\n const traceId = randomUUID();\n const rootSpanId = randomUUID();\n const now = new Date().toISOString();\n\n this.trace = {\n id: traceId,\n featureSlug,\n mode,\n startedAt: now,\n status: 'running',\n rootSpanId,\n spans: new Map(),\n metadata: {\n aidenVersion: '1.1.0',\n providers: [],\n agentsExecuted: [],\n totalTokens: 0,\n totalCost: 0,\n retryCount: 0,\n },\n };\n\n // Create root workflow span\n const rootSpan: TraceSpan = {\n id: rootSpanId,\n parentId: null,\n kind: 'workflow',\n name: `workflow:${mode}`,\n startedAt: now,\n status: 'running',\n attributes: { feature: featureSlug, mode },\n events: [],\n children: [],\n };\n this.trace.spans.set(rootSpanId, rootSpan);\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n getRootSpanId(): string {\n return this.trace?.rootSpanId ?? NOOP_SPAN_ID;\n }\n\n startSpan(\n kind: SpanKind,\n name: string,\n parentId?: string,\n attributes?: Record<string, string | number | boolean>,\n ): string {\n if (!this.enabled || !this.trace) return NOOP_SPAN_ID;\n\n const spanId = randomUUID();\n const now = new Date().toISOString();\n\n const span: TraceSpan = {\n id: spanId,\n parentId: parentId ?? this.trace.rootSpanId,\n kind,\n name,\n startedAt: now,\n status: 'running',\n attributes: attributes ?? {},\n events: [],\n children: [],\n };\n\n this.trace.spans.set(spanId, span);\n\n // Register as child of parent\n const parent = this.trace.spans.get(span.parentId!);\n if (parent) {\n parent.children.push(spanId);\n }\n\n // Track metadata\n if (kind === 'agent_execution') {\n const agentRole = attributes?.['agent_role'];\n if (agentRole && typeof agentRole === 'string') {\n this.trace.metadata.agentsExecuted.push(agentRole);\n }\n }\n if (kind === 'provider_call') {\n const provider = attributes?.['provider'];\n if (\n provider &&\n typeof provider === 'string' &&\n !this.trace.metadata.providers.includes(provider)\n ) {\n this.trace.metadata.providers.push(provider);\n }\n }\n if (kind === 'retry') {\n this.trace.metadata.retryCount++;\n }\n\n this.listener?.onSpanStart?.(span);\n\n return spanId;\n }\n\n endSpan(spanId: string, status: SpanStatus): void {\n if (!this.enabled || !this.trace || !spanId) return;\n\n const span = this.trace.spans.get(spanId);\n if (!span) return;\n\n const now = new Date().toISOString();\n span.endedAt = now;\n span.status = status;\n span.durationMs = new Date(now).getTime() - new Date(span.startedAt).getTime();\n\n // Accumulate tokens from provider calls\n if (span.kind === 'provider_call') {\n const tokens = span.attributes['tokens_used'];\n if (typeof tokens === 'number') {\n this.trace.metadata.totalTokens += tokens;\n }\n const cost = span.attributes['cost'];\n if (typeof cost === 'number') {\n this.trace.metadata.totalCost += cost;\n }\n }\n\n this.listener?.onSpanEnd?.(span);\n }\n\n addEvent(\n spanId: string,\n name: string,\n message?: string,\n attributes?: Record<string, string | number | boolean>,\n ): void {\n if (!this.enabled || !this.trace || !spanId) return;\n\n const span = this.trace.spans.get(spanId);\n if (!span) return;\n\n const event: TraceEvent = {\n timestamp: new Date().toISOString(),\n name,\n attributes: attributes ?? {},\n message,\n };\n\n span.events.push(event);\n this.listener?.onEvent?.(spanId, event);\n }\n\n setAttribute(spanId: string, key: string, value: string | number | boolean): void {\n if (!this.enabled || !this.trace || !spanId) return;\n\n const span = this.trace.spans.get(spanId);\n if (!span) return;\n\n span.attributes[key] = value;\n }\n\n setModeSwitch(from: string, to: string, reason: string): void {\n if (!this.enabled || !this.trace) return;\n\n this.trace.metadata.modeSwitch = { from, to, reason };\n }\n\n finalize(status: TraceStatus): Trace | null {\n if (!this.enabled || !this.trace) return null;\n\n const now = new Date().toISOString();\n this.trace.endedAt = now;\n this.trace.status = status;\n this.trace.durationMs = new Date(now).getTime() - new Date(this.trace.startedAt).getTime();\n\n // Close root span\n const rootSpan = this.trace.spans.get(this.trace.rootSpanId);\n if (rootSpan && rootSpan.status === 'running') {\n rootSpan.endedAt = now;\n rootSpan.status = status === 'completed' ? 'success' : 'failure';\n rootSpan.durationMs = this.trace.durationMs;\n }\n\n this.listener?.onTraceFinalized?.(this.trace);\n\n return this.trace;\n }\n\n getTrace(): Trace | null {\n return this.trace;\n }\n}\n","/**\n * AIDEN Trace System — Store\n * Persists traces to .aiden/traces/ as JSON files.\n */\n\nimport { readdir, readFile, writeFile, mkdir, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Trace, TraceSummary, TraceSpan } from './trace-types.js';\n\nconst TRACES_DIR = '.aiden/traces';\n\ninterface SerializedTrace extends Omit<Trace, 'spans'> {\n spans: Record<string, TraceSpan>;\n}\n\nfunction serializeTrace(trace: Trace): SerializedTrace {\n return {\n ...trace,\n spans: Object.fromEntries(trace.spans),\n };\n}\n\nfunction deserializeTrace(data: SerializedTrace): Trace {\n return {\n ...data,\n spans: new Map(Object.entries(data.spans)),\n };\n}\n\nfunction traceToSummary(trace: Trace): TraceSummary {\n let agentCount = 0;\n for (const span of trace.spans.values()) {\n if (span.kind === 'agent_execution') agentCount++;\n }\n\n return {\n traceId: trace.id,\n featureSlug: trace.featureSlug,\n mode: trace.mode,\n status: trace.status,\n startedAt: trace.startedAt,\n durationMs: trace.durationMs ?? 0,\n agentCount,\n retryCount: trace.metadata.retryCount,\n };\n}\n\nexport class TraceStore {\n private readonly baseDir: string;\n\n constructor(baseDir?: string) {\n this.baseDir = baseDir ?? TRACES_DIR;\n }\n\n async save(trace: Trace): Promise<string> {\n const dir = join(this.baseDir, trace.featureSlug);\n await mkdir(dir, { recursive: true });\n\n const filePath = join(dir, `${trace.id}.json`);\n const serialized = serializeTrace(trace);\n await writeFile(filePath, JSON.stringify(serialized, null, 2), 'utf-8');\n\n return filePath;\n }\n\n async load(featureSlug: string, traceId: string): Promise<Trace> {\n const filePath = join(this.baseDir, featureSlug, `${traceId}.json`);\n const content = await readFile(filePath, 'utf-8');\n const data = JSON.parse(content) as SerializedTrace;\n return deserializeTrace(data);\n }\n\n async list(featureSlug: string): Promise<TraceSummary[]> {\n const dir = join(this.baseDir, featureSlug);\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n return [];\n }\n\n const summaries: TraceSummary[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n try {\n const content = await readFile(join(dir, file), 'utf-8');\n const data = JSON.parse(content) as SerializedTrace;\n const trace = deserializeTrace(data);\n summaries.push(traceToSummary(trace));\n } catch {\n // Skip corrupted trace files\n }\n }\n\n return summaries.sort((a, b) => b.startedAt.localeCompare(a.startedAt));\n }\n\n async listRecent(limit = 10): Promise<TraceSummary[]> {\n let featureDirs: string[];\n try {\n featureDirs = await readdir(this.baseDir);\n } catch {\n return [];\n }\n\n const allSummaries: TraceSummary[] = [];\n for (const featureDir of featureDirs) {\n const summaries = await this.list(featureDir);\n allSummaries.push(...summaries);\n }\n\n return allSummaries.sort((a, b) => b.startedAt.localeCompare(a.startedAt)).slice(0, limit);\n }\n\n async remove(featureSlug: string, traceId: string): Promise<void> {\n const filePath = join(this.baseDir, featureSlug, `${traceId}.json`);\n await rm(filePath, { force: true });\n }\n\n async clear(featureSlug?: string): Promise<void> {\n if (featureSlug) {\n const dir = join(this.baseDir, featureSlug);\n await rm(dir, { recursive: true, force: true });\n } else {\n await rm(this.baseDir, { recursive: true, force: true });\n }\n }\n\n async clearBefore(date: string): Promise<number> {\n const cutoff = new Date(date).getTime();\n let removed = 0;\n\n let featureDirs: string[];\n try {\n featureDirs = await readdir(this.baseDir);\n } catch {\n return 0;\n }\n\n for (const featureDir of featureDirs) {\n const dir = join(this.baseDir, featureDir);\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n continue;\n }\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n try {\n const content = await readFile(join(dir, file), 'utf-8');\n const data = JSON.parse(content) as SerializedTrace;\n if (new Date(data.startedAt).getTime() < cutoff) {\n await rm(join(dir, file), { force: true });\n removed++;\n }\n } catch {\n // Skip corrupted files\n }\n }\n }\n\n return removed;\n }\n}\n","/**\n * AIDEN Trace System — Hook Bridge\n * Translates HookEvents into TraceEvents for correlation.\n */\n\nimport type { HookEvent, HookResult } from '../../types/index.js';\nimport type { TraceCollector } from './trace-collector.js';\n\nexport class TraceHookBridge {\n constructor(private readonly collector: TraceCollector) {}\n\n onHookExecuted(event: HookEvent, result: HookResult, currentSpanId: string): void {\n if (!this.collector.isEnabled()) return;\n\n this.collector.addEvent(currentSpanId, `hook:${event}`, undefined, {\n hook_event: event,\n hook_command: result.command,\n hook_success: result.success,\n hook_duration_ms: result.durationMs,\n ...(result.output ? { hook_output: result.output.substring(0, 500) } : {}),\n ...(result.error ? { hook_error: result.error } : {}),\n });\n }\n}\n","/**\n * AIDEN Trace System — Timeline Formatter\n * Renders a structured, indented timeline from a trace.\n */\n\nimport type { Trace, TraceSpan, SpanKind } from './trace-types.js';\n\nexport interface TimelineOptions {\n colorize?: boolean;\n showAttributes?: boolean;\n showEvents?: boolean;\n filter?: SpanKind[];\n maxDepth?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<TimelineOptions> = {\n colorize: false,\n showAttributes: false,\n showEvents: false,\n filter: [],\n maxDepth: Infinity,\n};\n\n// ANSI colors (only used when colorize is true)\nconst COLORS = {\n reset: '\\x1b[0m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n magenta: '\\x1b[35m',\n bold: '\\x1b[1m',\n};\n\nfunction c(color: keyof typeof COLORS, text: string, enabled: boolean): string {\n return enabled ? `${COLORS[color]}${text}${COLORS.reset}` : text;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(1)}k`;\n return `${tokens}`;\n}\n\nfunction relativeTime(traceStart: number, timestamp: string): string {\n const offsetMs = new Date(timestamp).getTime() - traceStart;\n const seconds = Math.floor(offsetMs / 1000);\n const ms = offsetMs % 1000;\n const minutes = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}.${String(ms).padStart(3, '0')}`;\n}\n\nfunction kindLabel(kind: SpanKind): string {\n const labels: Record<SpanKind, string> = {\n workflow: 'WORKFLOW',\n phase: 'PHASE',\n agent_execution: 'AGENT',\n provider_call: 'PROVIDER',\n quality_gate: 'QUALITY_GATE',\n retry: 'RETRY',\n mode_switch: 'MODE_SWITCH',\n skill_injection: 'SKILL',\n hook_execution: 'HOOK',\n human_approval: 'APPROVAL',\n };\n return labels[kind] ?? kind.toUpperCase();\n}\n\nfunction statusIcon(status: string, colorEnabled: boolean): string {\n switch (status) {\n case 'success':\n return c('green', '✓', colorEnabled);\n case 'failure':\n return c('red', '✗', colorEnabled);\n case 'skipped':\n return c('yellow', '⊘', colorEnabled);\n default:\n return '▶';\n }\n}\n\nfunction treeChars(depth: number, isLast: boolean): string {\n if (depth === 0) return '';\n const pipe = '│ '.repeat(depth - 1);\n return pipe + (isLast ? '' : '│ ');\n}\n\nexport function formatTimeline(trace: Trace, opts?: TimelineOptions): string {\n const options = { ...DEFAULT_OPTIONS, ...opts };\n const lines: string[] = [];\n const traceStart = new Date(trace.startedAt).getTime();\n const colorOn = options.colorize;\n\n // Header\n const statusStr =\n trace.status === 'completed'\n ? c('green', 'COMPLETED', colorOn)\n : trace.status === 'failed'\n ? c('red', 'FAILED', colorOn)\n : c('yellow', trace.status.toUpperCase(), colorOn);\n\n lines.push(\n `${c('bold', 'TRACE', colorOn)} ${trace.id.slice(0, 8)} — ${trace.mode} \"${trace.featureSlug}\" — ${trace.durationMs ? formatDuration(trace.durationMs) : '?'} — ${statusStr}`,\n );\n lines.push('═'.repeat(60));\n lines.push('');\n\n // Render spans tree\n const rootSpan = trace.spans.get(trace.rootSpanId);\n if (rootSpan) {\n renderSpan(lines, trace, rootSpan, 0, traceStart, options);\n }\n\n // Summary\n lines.push('');\n lines.push(c('bold', 'SUMMARY', colorOn));\n lines.push('─'.repeat(40));\n\n const agents = trace.metadata.agentsExecuted;\n if (agents.length > 0) {\n const agentTimings: string[] = [];\n for (const span of trace.spans.values()) {\n if (span.kind === 'agent_execution' && span.durationMs !== undefined) {\n agentTimings.push(\n `${span.attributes['agent_role'] ?? span.name}(${formatDuration(span.durationMs)})`,\n );\n }\n }\n lines.push(`Agents: ${agentTimings.join(' → ')}`);\n }\n\n const providers = trace.metadata.providers;\n if (providers.length > 0) {\n const providerCounts: Record<string, number> = {};\n for (const span of trace.spans.values()) {\n if (span.kind === 'provider_call') {\n const prov = String(span.attributes['provider'] ?? 'unknown');\n providerCounts[prov] = (providerCounts[prov] ?? 0) + 1;\n }\n }\n const providerStrs = Object.entries(providerCounts).map(([name, count]) => `${name} ×${count}`);\n lines.push(`Providers: ${providerStrs.join(', ')}`);\n }\n\n lines.push(`Tokens: ${formatTokens(trace.metadata.totalTokens)} total`);\n\n if (trace.metadata.retryCount > 0) {\n lines.push(`Retries: ${trace.metadata.retryCount}`);\n }\n\n if (trace.metadata.modeSwitch) {\n const ms = trace.metadata.modeSwitch;\n lines.push(`Mode: ${ms.from} → ${ms.to} (${ms.reason})`);\n }\n\n // Count quality gates\n let gatesPassed = 0;\n let gatesTotal = 0;\n for (const span of trace.spans.values()) {\n if (span.kind === 'quality_gate') {\n gatesTotal++;\n if (span.attributes['passed']) gatesPassed++;\n }\n }\n if (gatesTotal > 0) {\n lines.push(`Gates: ${gatesPassed}/${gatesTotal} passed`);\n }\n\n return lines.join('\\n');\n}\n\nfunction renderSpan(\n lines: string[],\n trace: Trace,\n span: TraceSpan,\n depth: number,\n traceStart: number,\n options: Required<TimelineOptions>,\n): void {\n // Filter by kind\n if (options.filter.length > 0 && !options.filter.includes(span.kind)) {\n // Still recurse into children\n renderChildren(lines, trace, span, depth, traceStart, options);\n return;\n }\n\n // Max depth\n if (depth > options.maxDepth) return;\n\n const colorOn = options.colorize;\n const time = c('dim', `[${relativeTime(traceStart, span.startedAt)}]`, colorOn);\n const indent = treeChars(depth, false);\n const label = c('cyan', kindLabel(span.kind), colorOn);\n const name = span.name;\n\n if (span.endedAt) {\n // Closed span — show start and result on one line\n const icon = statusIcon(span.status, colorOn);\n const timing = span.durationMs !== undefined ? ` ${formatDuration(span.durationMs)}` : '';\n const attrs = formatInlineAttributes(span, options);\n lines.push(`${time} ${indent}${icon} ${label} ${name}${timing}${attrs}`);\n } else {\n // Open span\n lines.push(`${time} ${indent}▶ ${label} ${name}`);\n }\n\n // Show events\n if (options.showEvents) {\n for (const event of span.events) {\n const evtTime = c('dim', `[${relativeTime(traceStart, event.timestamp)}]`, colorOn);\n const evtIndent = treeChars(depth + 1, false);\n const evtAttrs = options.showAttributes\n ? ' ' +\n Object.entries(event.attributes)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ')\n : '';\n const msg = event.message ? `: ${event.message}` : '';\n lines.push(`${evtTime} ${evtIndent}${c('dim', '○', colorOn)} ${event.name}${msg}${evtAttrs}`);\n }\n }\n\n // Render children\n renderChildren(lines, trace, span, depth, traceStart, options);\n}\n\nfunction renderChildren(\n lines: string[],\n trace: Trace,\n span: TraceSpan,\n depth: number,\n traceStart: number,\n options: Required<TimelineOptions>,\n): void {\n const children = span.children\n .map((id) => trace.spans.get(id))\n .filter((s): s is TraceSpan => !!s)\n .sort((a, b) => a.startedAt.localeCompare(b.startedAt));\n\n for (const child of children) {\n renderSpan(lines, trace, child, depth + 1, traceStart, options);\n }\n}\n\nfunction formatInlineAttributes(span: TraceSpan, options: Required<TimelineOptions>): string {\n if (!options.showAttributes) return '';\n\n const interesting: string[] = [];\n for (const [key, value] of Object.entries(span.attributes)) {\n // Skip redundant attributes already shown in the line\n if (key === 'agent_role' || key === 'phase_name') continue;\n if (key === 'provider') interesting.push(`provider=${value}`);\n if (key === 'tokens_used') interesting.push(`tokens=${value}`);\n if (key === 'passed') interesting.push(`passed=${value}`);\n if (key === 'qa_score') interesting.push(`score=${value}`);\n if (key === 'qa_passed') interesting.push(`qa_passed=${value}`);\n if (key === 'attempt') interesting.push(`attempt=${value}`);\n if (key === 'approved') interesting.push(`approved=${value}`);\n }\n\n return interesting.length > 0\n ? ` ${c('dim', `(${interesting.join(', ')})`, options.colorize)}`\n : '';\n}\n","/**\n * AIDEN Trace System — Live Renderer\n * Implements TraceListener to render trace events in real-time to the terminal.\n */\n\nimport type { Trace, TraceEvent, TraceListener, TraceSpan, SpanKind } from './trace-types.js';\nimport { formatTimeline } from './trace-timeline.js';\n\nexport type VerboseLevel = 'normal' | 'full';\n\nexport interface LiveRendererOptions {\n verbose: VerboseLevel;\n colorize?: boolean;\n writer?: (line: string) => void;\n}\n\nconst COLORS = {\n reset: '\\x1b[0m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n bold: '\\x1b[1m',\n};\n\nfunction cc(color: keyof typeof COLORS, text: string, enabled: boolean): string {\n return enabled ? `${COLORS[color]}${text}${COLORS.reset}` : text;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction kindLabel(kind: SpanKind): string {\n const labels: Record<string, string> = {\n workflow: 'WORKFLOW',\n phase: 'PHASE',\n agent_execution: 'AGENT',\n provider_call: 'PROVIDER',\n quality_gate: 'GATE',\n retry: 'RETRY',\n mode_switch: 'MODE',\n skill_injection: 'SKILL',\n hook_execution: 'HOOK',\n human_approval: 'APPROVAL',\n };\n return labels[kind] ?? kind.toUpperCase();\n}\n\nexport class TraceLiveRenderer implements TraceListener {\n private depth = 0;\n private readonly spanDepth = new Map<string, number>();\n private readonly colorize: boolean;\n private readonly verbose: VerboseLevel;\n private readonly write: (line: string) => void;\n\n constructor(options: LiveRendererOptions) {\n this.verbose = options.verbose;\n this.colorize = options.colorize ?? true;\n this.write = options.writer ?? ((line: string) => process.stderr.write(line + '\\n'));\n }\n\n onSpanStart(span: TraceSpan): void {\n // Skip root workflow span — we show it in header\n if (span.kind === 'workflow') {\n this.spanDepth.set(span.id, 0);\n const mode = span.attributes['mode'] ?? '?';\n const feature = span.attributes['feature'] ?? '?';\n this.write(\n `${cc('bold', '▶', this.colorize)} ${cc('cyan', 'WORKFLOW', this.colorize)} ${mode} \"${feature}\"`,\n );\n return;\n }\n\n const parentDepth = span.parentId ? (this.spanDepth.get(span.parentId) ?? 0) : 0;\n const depth = parentDepth + 1;\n this.spanDepth.set(span.id, depth);\n\n const indent = '│ '.repeat(depth);\n const label = cc('cyan', kindLabel(span.kind), this.colorize);\n const provider = span.attributes['provider'] ? ` (${span.attributes['provider']})` : '';\n\n this.write(`${indent}▶ ${label} ${span.name}${provider}`);\n }\n\n onSpanEnd(span: TraceSpan): void {\n if (span.kind === 'workflow') return; // handled in onTraceFinalized\n\n const depth = this.spanDepth.get(span.id) ?? 1;\n const indent = '│ '.repeat(depth);\n const icon =\n span.status === 'success'\n ? cc('green', '✓', this.colorize)\n : span.status === 'failure'\n ? cc('red', '✗', this.colorize)\n : cc('yellow', '⊘', this.colorize);\n const timing = span.durationMs !== undefined ? ` ${formatDuration(span.durationMs)}` : '';\n\n this.write(`${indent}${icon} ${kindLabel(span.kind)} ${span.name}${timing}`);\n }\n\n onEvent(_spanId: string, event: TraceEvent): void {\n if (this.verbose !== 'full') return;\n\n // Find depth\n const depth = (this.spanDepth.get(_spanId) ?? 0) + 1;\n const indent = '│ '.repeat(depth);\n const msg = event.message ? `: ${event.message}` : '';\n const attrs =\n Object.keys(event.attributes).length > 0\n ? ' ' +\n cc(\n 'dim',\n Object.entries(event.attributes)\n .map(([k, v]) => `${k}=${v}`)\n .join(', '),\n this.colorize,\n )\n : '';\n\n this.write(`${indent}${cc('dim', '○', this.colorize)} ${event.name}${msg}${attrs}`);\n }\n\n onTraceFinalized(trace: Trace): void {\n this.write('');\n if (this.verbose === 'full') {\n // Full summary\n this.write(\n formatTimeline(trace, {\n colorize: this.colorize,\n showAttributes: false,\n showEvents: false,\n })\n .split('\\n')\n .slice(-10)\n .join('\\n'),\n );\n } else {\n const icon =\n trace.status === 'completed'\n ? cc('green', '✓', this.colorize)\n : cc('red', '✗', this.colorize);\n const timing = trace.durationMs ? formatDuration(trace.durationMs) : '?';\n const tokens = trace.metadata.totalTokens;\n this.write(`${icon} ${trace.mode} workflow ${trace.status} — ${timing}, ${tokens} tokens`);\n }\n }\n}\n","import os from 'node:os';\nimport chalk from 'chalk';\nimport { sanitizePrompt } from '../providers/prompt-sanitizer.js';\nimport type { Logger } from '../utils/logger.js';\n\nexport const DEFAULT_REPO = 'neuravim/aiden';\n\nexport const MAX_URL_LENGTH = 7500;\n\nconst TITLE_MAX = 120;\nconst STACK_MAX = 4000;\nconst MESSAGE_MAX = 400;\n\nexport interface ErrorContext {\n error: unknown;\n command?: string;\n mode?: string;\n featureSlug?: string;\n traceId?: string;\n providers?: readonly string[];\n aidenVersion?: string;\n argv?: readonly string[];\n extra?: Record<string, string | number | boolean | undefined>;\n}\n\nexport interface IssueLink {\n url: string;\n title: string;\n body: string;\n truncated: boolean;\n}\n\nexport function buildIssueUrl(ctx: ErrorContext, repo: string = DEFAULT_REPO): IssueLink {\n const { name, message, stack, code } = normalizeError(ctx.error);\n const rawTitle = `[crash] ${name}: ${firstLine(message)}`;\n const title = truncate(rawTitle, TITLE_MAX);\n const body = renderBody({ name, message, stack, code }, ctx);\n\n const { sanitized: safeTitle } = sanitizePrompt(title);\n const { sanitized: safeBody } = sanitizePrompt(body);\n\n const base = `https://github.com/${repo}/issues/new`;\n let finalBody = safeBody;\n let truncated = false;\n let url = buildUrl(base, safeTitle, finalBody);\n\n if (url.length > MAX_URL_LENGTH) {\n truncated = true;\n const overflow = url.length - MAX_URL_LENGTH;\n const target = Math.max(500, finalBody.length - overflow - 200);\n finalBody =\n finalBody.slice(0, target) +\n '\\n\\n> _…body truncated to fit GitHub URL limit — full stack & context omitted._';\n url = buildUrl(base, safeTitle, finalBody);\n }\n\n return { url, title: safeTitle, body: finalBody, truncated };\n}\n\nexport function reportCrash(\n logger: Logger,\n ctx: ErrorContext,\n repo: string = DEFAULT_REPO,\n): IssueLink {\n const { name, message } = normalizeError(ctx.error);\n const link = buildIssueUrl(ctx, repo);\n\n logger.error(`${name}: ${message}`, {\n command: ctx.command,\n mode: ctx.mode,\n featureSlug: ctx.featureSlug,\n traceId: ctx.traceId,\n });\n\n const lines = [\n '',\n chalk.red('───────────────────────────────────────────────────────────'),\n chalk.red(' Aiden crashed. Please open a pre-filled issue:'),\n chalk.cyan(` ${link.url}`),\n link.truncated\n ? chalk.dim(' (body was truncated to fit GitHub URL limit)')\n : chalk.dim(' (title, error, stack, environment are pre-filled)'),\n chalk.red('───────────────────────────────────────────────────────────'),\n '',\n ];\n // eslint-disable-next-line no-console\n console.error(lines.join('\\n'));\n\n return link;\n}\n\nfunction renderBody(\n err: { name: string; message: string; stack?: string; code?: string },\n ctx: ErrorContext,\n): string {\n const env = {\n os: `${os.platform()} ${os.release()} (${os.arch()})`,\n node: process.version,\n aiden: ctx.aidenVersion ?? 'unknown',\n command: ctx.command ?? 'unknown',\n mode: ctx.mode ?? 'n/a',\n argv: ctx.argv ? scrubArgv(ctx.argv).join(' ') : 'n/a',\n };\n\n const contextLines: string[] = [];\n if (ctx.featureSlug) contextLines.push(`- **Feature**: \\`${ctx.featureSlug}\\``);\n if (ctx.traceId) contextLines.push(`- **Trace ID**: \\`${ctx.traceId}\\``);\n if (ctx.providers && ctx.providers.length > 0) {\n contextLines.push(`- **Providers**: ${ctx.providers.map((p) => `\\`${p}\\``).join(', ')}`);\n }\n if (ctx.extra) {\n for (const [k, v] of Object.entries(ctx.extra)) {\n if (v === undefined) continue;\n contextLines.push(`- **${k}**: \\`${truncate(String(v), 300)}\\``);\n }\n }\n\n const stack = err.stack\n ? truncate(stripFirstLine(err.stack), STACK_MAX)\n : '(no stack trace available)';\n\n return [\n '## Summary',\n '',\n '<!-- Describe what you were doing when the crash happened. -->',\n '',\n '## Error',\n '',\n `- **Type**: \\`${err.name}\\``,\n err.code ? `- **Code**: \\`${err.code}\\`` : null,\n `- **Message**: ${inlineCode(truncate(err.message, MESSAGE_MAX))}`,\n '',\n '## Environment',\n '',\n `- **OS**: \\`${env.os}\\``,\n `- **Node**: \\`${env.node}\\``,\n `- **Aiden**: \\`${env.aiden}\\``,\n `- **Command**: \\`${env.command}\\``,\n `- **Mode**: \\`${env.mode}\\``,\n `- **Argv**: \\`${env.argv}\\``,\n '',\n contextLines.length > 0 ? '## Context\\n' : null,\n contextLines.length > 0 ? contextLines.join('\\n') + '\\n' : null,\n '## Stack trace',\n '',\n '```',\n stack,\n '```',\n '',\n '## Reproduction steps',\n '',\n '1. ',\n '2. ',\n '3. ',\n '',\n '---',\n '_Report auto-generated by Aiden. Secrets have been redacted automatically; please review before submitting._',\n ]\n .filter((line): line is string => line !== null)\n .join('\\n');\n}\n\nfunction normalizeError(err: unknown): {\n name: string;\n message: string;\n stack?: string;\n code?: string;\n} {\n if (err instanceof Error) {\n const maybeCode = (err as Error & { code?: unknown }).code;\n return {\n name: err.name || 'Error',\n message: err.message || String(err),\n stack: err.stack,\n code: typeof maybeCode === 'string' ? maybeCode : undefined,\n };\n }\n return { name: 'UnknownError', message: String(err) };\n}\n\nfunction buildUrl(base: string, title: string, body: string): string {\n const params = new URLSearchParams({ title, body, labels: 'bug,crash-report' });\n return `${base}?${params.toString()}`;\n}\n\nfunction scrubArgv(argv: readonly string[]): string[] {\n return argv.map((arg) => {\n if (arg.includes(os.homedir())) {\n return arg.replace(os.homedir(), '~');\n }\n return arg;\n });\n}\n\nfunction firstLine(s: string): string {\n const i = s.indexOf('\\n');\n return i === -1 ? s : s.slice(0, i);\n}\n\nfunction stripFirstLine(stack: string): string {\n // Stacks start with \"ErrorName: message\" then frames; keep only frames for readability.\n const i = stack.indexOf('\\n');\n return i === -1 ? stack : stack.slice(i + 1);\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 1) + '…';\n}\n\nfunction inlineCode(s: string): string {\n // Escape backticks inside inline code by using a fence that doesn't collide.\n if (!s.includes('`')) return `\\`${s}\\``;\n return `\\`\\`${s}\\`\\``;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { bootstrapOrchestrator } from '../bootstrap.js';\nimport { TraceLiveRenderer } from '../../core/trace/trace-live.js';\nimport { reportCrash } from '../../reporting/issue-url.js';\nimport { createLogger } from '../../utils/logger.js';\n\ndeclare const __AIDEN_VERSION__: string;\n\nexport function createStandardCommand(): Command {\n return new Command('standard')\n .description('Run a standard workflow (medium features)')\n .argument('<description>', 'Feature description')\n .option('--dry-run', 'Show what would be done without executing')\n .option('--provider <name>', 'Override provider')\n .option('--profile <name>', 'Activate an agent profile / domain playbook')\n .option('--trace', 'Enable workflow tracing')\n .option('--verbose [level]', 'Enable verbose trace output (normal|full)')\n .action(\n async (\n description: string,\n options: {\n dryRun?: boolean;\n provider?: string;\n profile?: string;\n trace?: boolean;\n verbose?: boolean | string;\n },\n ) => {\n if (options.dryRun) {\n // eslint-disable-next-line no-console\n console.log(`[DRY RUN] Standard workflow: \"${description}\"`);\n // eslint-disable-next-line no-console\n console.log('Mode: standard | Agents: lead, analyst, planner, dev, qa');\n return;\n }\n\n const spinner = ora(`Starting standard workflow: \"${description}\"`).start();\n\n try {\n const orchestrator = await bootstrapOrchestrator({\n provider: options.provider,\n mode: 'standard',\n profile: options.profile,\n });\n\n const traceEnabled = !!(options.trace || options.verbose);\n const traceListener = options.verbose\n ? new TraceLiveRenderer({\n verbose: options.verbose === 'full' ? 'full' : 'normal',\n colorize: process.stderr.isTTY ?? false,\n })\n : undefined;\n\n if (traceListener) spinner.stop();\n\n spinner.text = 'Running standard workflow...';\n const result = await orchestrator.runStandard(description, {\n trace: traceEnabled,\n traceListener,\n });\n\n if (result.status === 'completed') {\n spinner.succeed(chalk.green(`Standard workflow completed: ${result.feature}`));\n // eslint-disable-next-line no-console\n console.log(\n chalk.dim(` Tokens: ${result.totalTokens} | Duration: ${result.totalDurationMs}ms`),\n );\n // eslint-disable-next-line no-console\n console.log(chalk.dim(` Agents: ${result.agentOutputs.length} phases executed`));\n } else {\n spinner.fail(chalk.red(`Standard workflow blocked: ${result.feature}`));\n }\n } catch (err) {\n spinner.fail(chalk.red('Standard workflow failed'));\n reportCrash(createLogger('error'), {\n error: err,\n command: 'standard',\n mode: 'standard',\n aidenVersion: typeof __AIDEN_VERSION__ !== 'undefined' ? __AIDEN_VERSION__ : undefined,\n argv: process.argv.slice(2),\n extra: { description },\n });\n process.exitCode = 1;\n }\n },\n );\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { bootstrapOrchestrator } from '../bootstrap.js';\nimport { TraceLiveRenderer } from '../../core/trace/trace-live.js';\nimport { reportCrash } from '../../reporting/issue-url.js';\nimport { createLogger } from '../../utils/logger.js';\n\ndeclare const __AIDEN_VERSION__: string;\n\nexport function createEnterpriseCommand(): Command {\n return new Command('enterprise')\n .description('Run an enterprise workflow (critical features, compliance)')\n .argument('<description>', 'Feature description')\n .option('--dry-run', 'Show what would be done without executing')\n .option('--provider <name>', 'Override provider')\n .option('--profile <name>', 'Activate an agent profile / domain playbook')\n .option('--auto-approve', 'Skip human approval gates')\n .option('--trace', 'Enable workflow tracing')\n .option('--verbose [level]', 'Enable verbose trace output (normal|full)')\n .action(\n async (\n description: string,\n options: {\n dryRun?: boolean;\n provider?: string;\n profile?: string;\n autoApprove?: boolean;\n trace?: boolean;\n verbose?: boolean | string;\n },\n ) => {\n if (options.dryRun) {\n // eslint-disable-next-line no-console\n console.log(`[DRY RUN] Enterprise workflow: \"${description}\"`);\n // eslint-disable-next-line no-console\n console.log('Mode: enterprise | Agents: lead, analyst, planner, dev, qa, docops');\n // eslint-disable-next-line no-console\n console.log('Human approval gates: enabled');\n return;\n }\n\n const spinner = ora(`Starting enterprise workflow: \"${description}\"`).start();\n\n try {\n const orchestrator = await bootstrapOrchestrator({\n provider: options.provider,\n mode: 'enterprise',\n profile: options.profile,\n });\n\n if (options.autoApprove) {\n orchestrator.setApprovalHandler(async () => true);\n }\n\n const traceEnabled = !!(options.trace || options.verbose);\n const traceListener = options.verbose\n ? new TraceLiveRenderer({\n verbose: options.verbose === 'full' ? 'full' : 'normal',\n colorize: process.stderr.isTTY ?? false,\n })\n : undefined;\n\n if (traceListener) spinner.stop();\n\n spinner.text = 'Running enterprise workflow (with approval gates)...';\n const result = await orchestrator.runEnterprise(description, {\n trace: traceEnabled,\n traceListener,\n });\n\n if (result.status === 'completed') {\n spinner.succeed(chalk.green(`Enterprise workflow completed: ${result.feature}`));\n // eslint-disable-next-line no-console\n console.log(\n chalk.dim(` Tokens: ${result.totalTokens} | Duration: ${result.totalDurationMs}ms`),\n );\n // eslint-disable-next-line no-console\n console.log(chalk.dim(` Agents: ${result.agentOutputs.length} phases executed`));\n } else if (result.status === 'aborted') {\n spinner.warn(chalk.yellow(`Enterprise workflow aborted by user: ${result.feature}`));\n } else {\n spinner.fail(chalk.red(`Enterprise workflow blocked: ${result.feature}`));\n }\n } catch (err) {\n spinner.fail(chalk.red('Enterprise workflow failed'));\n reportCrash(createLogger('error'), {\n error: err,\n command: 'enterprise',\n mode: 'enterprise',\n aidenVersion: typeof __AIDEN_VERSION__ !== 'undefined' ? __AIDEN_VERSION__ : undefined,\n argv: process.argv.slice(2),\n extra: { description, autoApprove: options.autoApprove ? 'true' : 'false' },\n });\n process.exitCode = 1;\n }\n },\n );\n}\n","import { Command } from 'commander';\nimport { join } from 'node:path';\nimport { createContextStore } from '../../memory/context-store.js';\n\nexport function createStatusCommand(): Command {\n return new Command('status')\n .description('Show status of features')\n .argument('[feature-slug]', 'Specific feature to check')\n .action(async (featureSlug?: string) => {\n const memDir = join(process.cwd(), '.aiden', 'memory');\n const store = createContextStore(memDir);\n const ctx = await store.load();\n\n if (featureSlug) {\n const feature = ctx.activeFeatures[featureSlug];\n if (!feature) {\n // eslint-disable-next-line no-console\n console.log(`Feature \"${featureSlug}\" not found.`);\n return;\n }\n // eslint-disable-next-line no-console\n console.log(`Feature: ${feature.name}`);\n // eslint-disable-next-line no-console\n console.log(` State: ${feature.state}`);\n // eslint-disable-next-line no-console\n console.log(` Mode: ${feature.mode}`);\n // eslint-disable-next-line no-console\n console.log(` Tokens: ${feature.tokensUsed}`);\n return;\n }\n\n const features = Object.values(ctx.activeFeatures);\n if (features.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No active features.');\n return;\n }\n\n for (const f of features) {\n // eslint-disable-next-line no-console\n console.log(`${f.slug} [${f.state}] (${f.mode}) - ${f.name}`);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { bootstrapOrchestrator } from '../bootstrap.js';\n\nexport function createResumeCommand(): Command {\n return new Command('resume')\n .description('Resume a paused or blocked feature')\n .argument('<feature-slug>', 'Feature slug to resume')\n .option('--provider <name>', 'Override provider')\n .action(async (featureSlug: string, options: { provider?: string }) => {\n const spinner = ora(`Resuming feature: \"${featureSlug}\"`).start();\n\n try {\n const orchestrator = await bootstrapOrchestrator({\n provider: options.provider,\n });\n\n const feature = await orchestrator.resume(featureSlug);\n\n if (!feature) {\n spinner.fail(chalk.red(`Feature \"${featureSlug}\" not found`));\n process.exitCode = 1;\n return;\n }\n\n if (feature.state === 'completed') {\n spinner.info(chalk.yellow(`Feature \"${featureSlug}\" is already completed`));\n return;\n }\n\n spinner.succeed(chalk.green(`Feature \"${featureSlug}\" resumed (state: ${feature.state})`));\n\n // Re-run the workflow from current state\n const runSpinner = ora(\n `Re-running ${feature.mode} workflow from ${feature.state}...`,\n ).start();\n const result = await orchestrator.runWorkflow(feature.objective, feature.mode);\n\n if (result.status === 'completed') {\n runSpinner.succeed(chalk.green(`Workflow completed: ${result.feature}`));\n // eslint-disable-next-line no-console\n console.log(\n chalk.dim(` Tokens: ${result.totalTokens} | Duration: ${result.totalDurationMs}ms`),\n );\n } else {\n runSpinner.fail(chalk.red(`Workflow ${result.status}: ${result.feature}`));\n }\n } catch (err) {\n spinner.fail(chalk.red('Resume failed'));\n // eslint-disable-next-line no-console\n console.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { bootstrapOrchestrator } from '../bootstrap.js';\n\nexport function createAbortCommand(): Command {\n return new Command('abort')\n .description('Abort a feature (saves state before removing)')\n .argument('<feature-slug>', 'Feature slug to abort')\n .option('--provider <name>', 'Override provider')\n .action(async (featureSlug: string, options: { provider?: string }) => {\n const spinner = ora(`Aborting feature: \"${featureSlug}\"`).start();\n\n try {\n const orchestrator = await bootstrapOrchestrator({\n provider: options.provider,\n });\n\n await orchestrator.abort(featureSlug);\n\n spinner.succeed(\n chalk.green(`Feature \"${featureSlug}\" aborted and state saved to decisions log`),\n );\n } catch (err) {\n spinner.fail(chalk.red('Abort failed'));\n // eslint-disable-next-line no-console\n console.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n });\n}\n","import { Command } from 'commander';\n\nexport function createAgentCommand(): Command {\n return new Command('agent')\n .description('Invoke a specific agent directly')\n .argument('<name>', 'Agent name (analyst, planner, dev, qa, docops)')\n .argument('<prompt>', 'Prompt for the agent')\n .action(async (name: string, prompt: string) => {\n const validAgents = ['analyst', 'planner', 'dev', 'qa', 'docops'];\n if (!validAgents.includes(name)) {\n // eslint-disable-next-line no-console\n console.error(`Invalid agent: ${name}. Valid: ${validAgents.join(', ')}`);\n process.exitCode = 1;\n return;\n }\n // eslint-disable-next-line no-console\n console.log(`Invoking agent \"${name}\" with: \"${prompt}\"`);\n });\n}\n","import { Command } from 'commander';\nimport { join } from 'node:path';\nimport chalk from 'chalk';\nimport { readYaml, writeYaml, fileExists } from '../../utils/fs-helpers.js';\nimport { createMetricsCollector } from '../../memory/metrics-collector.js';\n\nconst KNOWN_PROVIDERS = ['claude-code', 'gemini', 'copilot', 'opencode', 'codex'];\n\nexport function createProviderCommand(): Command {\n const cmd = new Command('provider').description('Manage AI providers');\n\n cmd\n .command('status')\n .description('Show provider status')\n .action(async () => {\n const configPath = join(process.cwd(), '.aiden', 'aiden.config.yaml');\n if (!(await fileExists(configPath))) {\n // eslint-disable-next-line no-console\n console.log('No AIDEN config found. Run \"aiden init\" first.');\n return;\n }\n const config = await readYaml<Record<string, unknown>>(configPath);\n const providers = (config.providers ?? {}) as Record<string, Record<string, unknown>>;\n const defaultProvider = config.provider as string | undefined;\n\n // eslint-disable-next-line no-console\n console.log('Provider status:');\n for (const [name, provConfig] of Object.entries(providers)) {\n const enabled = provConfig.enabled !== false;\n const isDefault = name === defaultProvider;\n const status = enabled ? chalk.green('enabled') : chalk.dim('disabled');\n const marker = isDefault ? chalk.cyan(' (default)') : '';\n // eslint-disable-next-line no-console\n console.log(` ${name}: ${status}${marker}`);\n }\n });\n\n cmd\n .command('switch')\n .description('Switch default provider')\n .argument('<name>', 'Provider name')\n .action(async (name: string) => {\n const configPath = join(process.cwd(), '.aiden', 'aiden.config.yaml');\n if (!(await fileExists(configPath))) {\n // eslint-disable-next-line no-console\n console.log('No AIDEN config found. Run \"aiden init\" first.');\n return;\n }\n\n const config = await readYaml<Record<string, unknown>>(configPath);\n const providers = (config.providers ?? {}) as Record<string, unknown>;\n\n if (!providers[name] && !KNOWN_PROVIDERS.includes(name)) {\n // eslint-disable-next-line no-console\n console.log(chalk.red(`Unknown provider \"${name}\". Known: ${KNOWN_PROVIDERS.join(', ')}`));\n process.exitCode = 1;\n return;\n }\n\n config.provider = name;\n await writeYaml(configPath, config);\n // eslint-disable-next-line no-console\n console.log(chalk.green(`Default provider switched to: ${name}`));\n });\n\n cmd\n .command('cost')\n .description('Show cost report')\n .action(async () => {\n const memDir = join(process.cwd(), '.aiden', 'memory');\n const collector = createMetricsCollector(memDir);\n const summaries = await collector.summarizeByFeature();\n\n if (summaries.length === 0) {\n // eslint-disable-next-line no-console\n console.log('Cost report: No usage data yet.');\n return;\n }\n\n let totalCost = 0;\n let totalTokens = 0;\n\n // eslint-disable-next-line no-console\n console.log(chalk.bold('Cost Report'));\n // eslint-disable-next-line no-console\n console.log('─'.repeat(60));\n\n for (const s of summaries) {\n totalCost += s.totalCost;\n totalTokens += s.totalTokens;\n // eslint-disable-next-line no-console\n console.log(\n ` ${s.feature}: ${s.totalTokens.toLocaleString()} tokens, $${s.totalCost.toFixed(4)}`,\n );\n }\n\n // eslint-disable-next-line no-console\n console.log('─'.repeat(60));\n // eslint-disable-next-line no-console\n console.log(\n chalk.bold(` Total: ${totalTokens.toLocaleString()} tokens, $${totalCost.toFixed(4)}`),\n );\n });\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { join } from 'node:path';\nimport { createMetricsCollector } from '../../memory/metrics-collector.js';\n\nexport function createMetricsCommand(): Command {\n return new Command('metrics')\n .description('Show usage metrics')\n .option('--export <format>', 'Export format (csv)')\n .action(async (options: { export?: string }) => {\n const memDir = join(process.cwd(), '.aiden', 'memory');\n const collector = createMetricsCollector(memDir);\n const summaries = await collector.summarizeByFeature();\n\n if (summaries.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No metrics data yet.');\n return;\n }\n\n if (options.export === 'csv') {\n // eslint-disable-next-line no-console\n console.log('feature,tokens,cost,duration_ms,entries');\n for (const s of summaries) {\n // eslint-disable-next-line no-console\n console.log(\n `${s.feature},${s.totalTokens},${s.totalCost.toFixed(4)},${s.totalDurationMs},${s.entries}`,\n );\n }\n return;\n }\n\n for (const s of summaries) {\n // eslint-disable-next-line no-console\n console.log(\n `${s.feature}: ${s.totalTokens} tokens, $${s.totalCost.toFixed(4)}, ${s.entries} operations`,\n );\n }\n });\n}\n","import { Command } from 'commander';\nimport { join } from 'node:path';\nimport { readYaml, writeYaml, fileExists } from '../../utils/fs-helpers.js';\n\nexport function createConfigCommand(): Command {\n const cmd = new Command('config').description('View or modify AIDEN configuration');\n\n cmd\n .command('show')\n .description('Show current configuration')\n .action(async () => {\n const configPath = join(process.cwd(), '.aiden', 'aiden.config.yaml');\n if (!(await fileExists(configPath))) {\n // eslint-disable-next-line no-console\n console.log('No AIDEN config found. Run \"aiden init\" first.');\n return;\n }\n const config = await readYaml<Record<string, unknown>>(configPath);\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(config, null, 2));\n });\n\n cmd\n .command('get')\n .description('Get a configuration value')\n .argument('<key>', 'Configuration key (dot notation supported, e.g. providers.default)')\n .action(async (key: string) => {\n const configPath = join(process.cwd(), '.aiden', 'aiden.config.yaml');\n if (!(await fileExists(configPath))) {\n // eslint-disable-next-line no-console\n console.log('No AIDEN config found. Run \"aiden init\" first.');\n return;\n }\n const config = await readYaml<Record<string, unknown>>(configPath);\n const value = key.split('.').reduce<unknown>((obj, k) => {\n if (obj && typeof obj === 'object' && k in (obj as Record<string, unknown>)) {\n return (obj as Record<string, unknown>)[k];\n }\n return undefined;\n }, config);\n if (value === undefined) {\n // eslint-disable-next-line no-console\n console.log(`Key \"${key}\" not found in configuration.`);\n return;\n }\n // eslint-disable-next-line no-console\n console.log(typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value));\n });\n\n cmd\n .command('set')\n .description('Set a configuration value')\n .argument('<key>', 'Configuration key (dot notation supported, e.g. providers.default)')\n .argument('<value>', 'Configuration value')\n .action(async (key: string, value: string) => {\n const configPath = join(process.cwd(), '.aiden', 'aiden.config.yaml');\n if (!(await fileExists(configPath))) {\n // eslint-disable-next-line no-console\n console.log('No AIDEN config found. Run \"aiden init\" first.');\n return;\n }\n const config = await readYaml<Record<string, unknown>>(configPath);\n const keys = key.split('.');\n let target: Record<string, unknown> = config;\n for (let i = 0; i < keys.length - 1; i++) {\n if (!(keys[i] in target) || typeof target[keys[i]] !== 'object') {\n target[keys[i]] = {};\n }\n target = target[keys[i]] as Record<string, unknown>;\n }\n target[keys[keys.length - 1]] = value;\n await writeYaml(configPath, config);\n // eslint-disable-next-line no-console\n console.log(`Set ${key} = ${value}`);\n });\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { join } from 'node:path';\nimport { copyFile, unlink } from 'node:fs/promises';\nimport { loadRules } from '../../rules/rules-loader.js';\nimport { ensureDir, fileExists } from '../../utils/fs-helpers.js';\n\nexport function createRulesCommand(): Command {\n const cmd = new Command('rules').description('Manage enterprise rules');\n\n cmd\n .command('list')\n .description('List all rules')\n .action(async () => {\n const rulesDir = join(process.cwd(), '.aiden', 'rules');\n const rules = await loadRules(rulesDir);\n if (rules.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No rules configured.');\n return;\n }\n for (const rule of rules) {\n // eslint-disable-next-line no-console\n console.log(` ${rule.name} (${rule.path})`);\n }\n });\n\n cmd\n .command('add')\n .description('Add a rule file')\n .argument('<file>', 'Path to the rule .md file')\n .action(async (file: string) => {\n const rulesDir = join(process.cwd(), '.aiden', 'rules');\n await ensureDir(rulesDir);\n const fileName = file.split(/[/\\\\]/).pop() ?? file;\n const dest = join(rulesDir, fileName);\n if (await fileExists(file)) {\n await copyFile(file, dest);\n // eslint-disable-next-line no-console\n console.log(`Rule added: ${fileName}`);\n } else {\n // eslint-disable-next-line no-console\n console.error(`File not found: ${file}`);\n }\n });\n\n cmd\n .command('remove')\n .description('Remove a rule')\n .argument('<name>', 'Rule name')\n .action(async (name: string) => {\n const rulesDir = join(process.cwd(), '.aiden', 'rules');\n const fileName = name.endsWith('.md') ? name : `${name}.md`;\n const filePath = join(rulesDir, fileName);\n if (await fileExists(filePath)) {\n await unlink(filePath);\n // eslint-disable-next-line no-console\n console.log(`Rule removed: ${name}`);\n } else {\n // eslint-disable-next-line no-console\n console.error(`Rule not found: ${name}`);\n }\n });\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { join } from 'node:path';\nimport { cp, rm } from 'node:fs/promises';\nimport { loadSkills, loadSkill } from '../../skills/skill-loader.js';\nimport { ensureDir, fileExists, writeText, readYaml, writeYaml } from '../../utils/fs-helpers.js';\nimport {\n fetchRegistry,\n searchRegistry,\n getSkillInfo,\n readRegistryLock,\n getOutdatedSkills,\n checkCompatibility,\n installSkill,\n resolveSource,\n removeFromRegistryLock,\n} from '../../skills/skill-registry.js';\nimport type { RegistryEntry } from '../../types/index.js';\nimport {\n listPacks,\n resolvePack,\n installPack,\n createCustomPack,\n removeCustomPack,\n} from '../../skills/skill-packs.js';\n\nconst SKILL_TEMPLATE_YAML = `name: {{name}}\nversion: 1.0.0\ndescription: \"\"\nagents:\n - lead\n - analyst\n - planner\n - dev\n - qa\n - docops\npriority: 0\nenabled: true\nartefacts: []\n# Optional: expose one or more domain playbooks / agent profiles from this skill.\n# profiles:\n# {{name}}:\n# description: \"Domain-specific agent profile\"\n# recommendedMode: enterprise\n# skills:\n# - {{name}}\n# artefacts:\n# - assessment-report\n# agents:\n# analyst:\n# role: \"Domain Analyst\"\n# expertise: [\"Domain discovery\", \"Risk assessment\"]\n`;\n\nconst SKILL_TEMPLATE_MD = `# {{name}}\n\n<!-- Instructions injected into target agent prompts -->\n<!-- Write here the instructions specific to your skill -->\n`;\n\nfunction getSkillsDir(): string {\n return join(process.cwd(), '.aiden', 'skills');\n}\n\nfunction getAidenVersion(): string {\n // Hardcoded since package.json may not be accessible at runtime in bundled CLI\n return '0.8.0';\n}\n\nexport function createSkillsCommand(): Command {\n const cmd = new Command('skills').description('Manage AIDEN skills');\n\n // -------------------------------------------------------\n // list\n // -------------------------------------------------------\n cmd\n .command('list')\n .description('List all installed skills')\n .action(async () => {\n const skillsDir = getSkillsDir();\n const skills = await loadSkills(skillsDir);\n if (skills.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No skills installed.');\n return;\n }\n for (const skill of skills) {\n const agents = skill.manifest.agents.join(', ');\n const modes = skill.manifest.modes?.join(', ') ?? 'all';\n const status = skill.manifest.enabled ? 'enabled' : 'disabled';\n // eslint-disable-next-line no-console\n console.log(` ${skill.manifest.name} v${skill.manifest.version} [${status}]`);\n // eslint-disable-next-line no-console\n console.log(` Agents: ${agents} | Modes: ${modes}`);\n if (skill.manifest.description) {\n // eslint-disable-next-line no-console\n console.log(` ${skill.manifest.description}`);\n }\n }\n });\n\n // -------------------------------------------------------\n // init\n // -------------------------------------------------------\n cmd\n .command('init')\n .description('Create a new skill')\n .argument('<name>', 'Skill name')\n .action(async (name: string) => {\n const skillDir = join(getSkillsDir(), name);\n if (await fileExists(skillDir)) {\n // eslint-disable-next-line no-console\n console.error(`Skill \"${name}\" already exists.`);\n return;\n }\n await ensureDir(skillDir);\n await writeText(\n join(skillDir, 'skill.yaml'),\n SKILL_TEMPLATE_YAML.replace(/\\{\\{name\\}\\}/g, name),\n );\n await writeText(\n join(skillDir, 'instructions.md'),\n SKILL_TEMPLATE_MD.replace(/\\{\\{name\\}\\}/g, name),\n );\n // eslint-disable-next-line no-console\n console.log(`Skill \"${name}\" created at .aiden/skills/${name}/`);\n // eslint-disable-next-line no-console\n console.log(' Edit instructions.md to add your agent instructions.');\n // eslint-disable-next-line no-console\n console.log(' Edit skill.yaml to configure target agents and modes.');\n });\n\n // -------------------------------------------------------\n // add (legacy — local path)\n // -------------------------------------------------------\n cmd\n .command('add')\n .description('Install a skill from a local directory')\n .argument('<path>', 'Path to skill directory')\n .action(async (path: string) => {\n const skill = await loadSkill(path);\n if (!skill) {\n // eslint-disable-next-line no-console\n console.error('Invalid skill directory (missing or invalid skill.yaml).');\n return;\n }\n const dest = join(getSkillsDir(), skill.manifest.name);\n await ensureDir(getSkillsDir());\n await cp(path, dest, { recursive: true });\n // eslint-disable-next-line no-console\n console.log(`Skill \"${skill.manifest.name}\" installed.`);\n });\n\n // -------------------------------------------------------\n // install (registry / github / url / local)\n // -------------------------------------------------------\n cmd\n .command('install')\n .description('Install a skill from registry, GitHub, URL, or local path')\n .argument('<source>', 'Skill name, name@version, owner/repo, URL, or local path')\n .option('-f, --force', 'Overwrite if already installed', false)\n .action(async (source: string, opts: { force: boolean }) => {\n try {\n const resolved = resolveSource(source);\n const result = await installSkill(resolved, {\n skillsDir: getSkillsDir(),\n force: opts.force,\n });\n // eslint-disable-next-line no-console\n console.log(`Skill \"${result.manifest.name}\" v${result.manifest.version} installed.`);\n // eslint-disable-next-line no-console\n console.log(` Agents: ${result.manifest.agents.join(', ')}`);\n // eslint-disable-next-line no-console\n console.log(` Modes: ${result.manifest.modes?.join(', ') ?? 'all'}`);\n if (result.manifest.hooks && Object.keys(result.manifest.hooks).length > 0) {\n // eslint-disable-next-line no-console\n console.log(' ⚠ This skill declares hooks. Review skill.yaml before use.');\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(String(error));\n }\n });\n\n // -------------------------------------------------------\n // remove\n // -------------------------------------------------------\n cmd\n .command('remove')\n .description('Remove a skill')\n .argument('<name>', 'Skill name')\n .action(async (name: string) => {\n const skillDir = join(getSkillsDir(), name);\n if (!(await fileExists(skillDir))) {\n // eslint-disable-next-line no-console\n console.error(`Skill \"${name}\" not found.`);\n return;\n }\n await rm(skillDir, { recursive: true });\n await removeFromRegistryLock(getSkillsDir(), name);\n // eslint-disable-next-line no-console\n console.log(`Skill \"${name}\" removed.`);\n });\n\n // -------------------------------------------------------\n // enable / disable\n // -------------------------------------------------------\n cmd\n .command('enable')\n .description('Enable a skill')\n .argument('<name>', 'Skill name')\n .action(async (name: string) => {\n await toggleSkill(name, true);\n });\n\n cmd\n .command('disable')\n .description('Disable a skill')\n .argument('<name>', 'Skill name')\n .action(async (name: string) => {\n await toggleSkill(name, false);\n });\n\n // -------------------------------------------------------\n // search\n // -------------------------------------------------------\n cmd\n .command('search')\n .description('Search the skills registry')\n .argument('<query>', 'Search query')\n .option('-c, --category <category>', 'Filter by category')\n .option('-a, --agent <agent>', 'Filter by target agent')\n .option('-m, --mode <mode>', 'Filter by mode')\n .option('-l, --limit <limit>', 'Max results', '20')\n .action(\n async (\n query: string,\n opts: { category?: string; agent?: string; mode?: string; limit: string },\n ) => {\n try {\n const index = await fetchRegistry();\n const results = searchRegistry(index, query, {\n category: opts.category,\n agent: opts.agent,\n mode: opts.mode,\n limit: parseInt(opts.limit, 10),\n });\n\n if (results.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No skills found.');\n return;\n }\n\n // eslint-disable-next-line no-console\n console.log(`Found ${results.length} skill(s):\\n`);\n for (const entry of results) {\n printRegistryEntry(entry);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(String(error));\n }\n },\n );\n\n // -------------------------------------------------------\n // info\n // -------------------------------------------------------\n cmd\n .command('info')\n .description('Show details about a skill from the registry')\n .argument('<name>', 'Skill name')\n .action(async (name: string) => {\n try {\n const index = await fetchRegistry();\n const entry = getSkillInfo(index, name);\n if (!entry) {\n // Check if installed locally\n const skill = await loadSkill(join(getSkillsDir(), name));\n if (skill) {\n // eslint-disable-next-line no-console\n console.log(`${skill.manifest.name} v${skill.manifest.version} (local only)\\n`);\n // eslint-disable-next-line no-console\n console.log(` ${skill.manifest.description || 'No description'}`);\n // eslint-disable-next-line no-console\n console.log(` Agents: ${skill.manifest.agents.join(', ')}`);\n // eslint-disable-next-line no-console\n console.log(` Modes: ${skill.manifest.modes?.join(', ') ?? 'all'}`);\n return;\n }\n // eslint-disable-next-line no-console\n console.error(`Skill \"${name}\" not found in registry or locally.`);\n return;\n }\n\n // eslint-disable-next-line no-console\n console.log(`${entry.name}@${entry.version}\\n`);\n // eslint-disable-next-line no-console\n console.log(` ${entry.description}\\n`);\n // eslint-disable-next-line no-console\n console.log(` Category: ${entry.category}`);\n // eslint-disable-next-line no-console\n console.log(` Author: ${entry.author}`);\n // eslint-disable-next-line no-console\n console.log(` License: ${entry.license}`);\n // eslint-disable-next-line no-console\n console.log(` Agents: ${entry.agents.join(', ')}`);\n // eslint-disable-next-line no-console\n console.log(` Modes: ${entry.modes?.join(', ') ?? 'all'}`);\n // eslint-disable-next-line no-console\n console.log(` Min AIDEN: ${entry.minAidenVersion}`);\n if (entry.repository) {\n // eslint-disable-next-line no-console\n console.log(` Repository: ${entry.repository}`);\n }\n if (entry.downloads !== undefined) {\n // eslint-disable-next-line no-console\n console.log(` Downloads: ${entry.downloads.toLocaleString()}`);\n }\n // eslint-disable-next-line no-console\n console.log(` Published: ${entry.createdAt.slice(0, 10)}`);\n // eslint-disable-next-line no-console\n console.log(` Updated: ${entry.updatedAt.slice(0, 10)}`);\n\n // Check if installed\n const lockPath = join(getSkillsDir(), '.registry-lock.json');\n const lock = await readRegistryLock(lockPath);\n const installed = lock.skills[name];\n if (installed) {\n const upToDate = installed.version === entry.version;\n // eslint-disable-next-line no-console\n console.log(\n `\\n Installed: ${installed.version}${upToDate ? '' : ' — update available'}`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.log('\\n Installed: no');\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(String(error));\n }\n });\n\n // -------------------------------------------------------\n // outdated\n // -------------------------------------------------------\n cmd\n .command('outdated')\n .description('List skills with newer versions available')\n .action(async () => {\n try {\n const outdated = await getOutdatedSkills(getSkillsDir());\n if (outdated.length === 0) {\n // eslint-disable-next-line no-console\n console.log('All skills are up to date.');\n return;\n }\n\n // eslint-disable-next-line no-console\n console.log('Outdated skills:\\n');\n for (const s of outdated) {\n // eslint-disable-next-line no-console\n console.log(` ${s.name} ${s.installed} → ${s.latest}`);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(String(error));\n }\n });\n\n // -------------------------------------------------------\n // doctor\n // -------------------------------------------------------\n cmd\n .command('doctor')\n .description('Check compatibility of all installed skills')\n .action(async () => {\n const skillsDir = getSkillsDir();\n const lockPath = join(skillsDir, '.registry-lock.json');\n const lock = await readRegistryLock(lockPath);\n const aidenVersion = getAidenVersion();\n\n const entries = Object.entries(lock.skills);\n if (entries.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No skills in registry lock.');\n return;\n }\n\n let ok = 0;\n let warnings = 0;\n let errors = 0;\n\n for (const [name, entry] of entries) {\n const skill = await loadSkill(join(skillsDir, name));\n if (!skill) {\n // eslint-disable-next-line no-console\n console.log(` ✗ ${name}@${entry.version} — skill directory missing`);\n errors++;\n continue;\n }\n\n const result = await checkCompatibility(skill.manifest, { aidenVersion, skillsDir });\n\n if (result.issues.length === 0) {\n // eslint-disable-next-line no-console\n console.log(` ✓ ${name}@${entry.version} — compatible`);\n ok++;\n } else {\n for (const issue of result.issues) {\n if (issue.severity === 'error') {\n // eslint-disable-next-line no-console\n console.log(` ✗ ${name}@${entry.version} — ${issue.message}`);\n errors++;\n } else {\n // eslint-disable-next-line no-console\n console.log(` ⚠ ${name}@${entry.version} — ${issue.message}`);\n warnings++;\n }\n }\n }\n }\n\n // eslint-disable-next-line no-console\n console.log(`\\nSummary: ${ok} ok, ${warnings} warnings, ${errors} errors`);\n });\n\n // -------------------------------------------------------\n // pack (subcommand group)\n // -------------------------------------------------------\n const packCmd = new Command('pack').description('Manage skill packs (bundles)');\n\n packCmd\n .command('list')\n .description('List available packs')\n .action(async () => {\n const packs = await listPacks(getSkillsDir());\n if (packs.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No packs available.');\n return;\n }\n for (const pack of packs) {\n // eslint-disable-next-line no-console\n console.log(` ${pack.name} [${pack.category}]`);\n // eslint-disable-next-line no-console\n console.log(` ${pack.description}`);\n // eslint-disable-next-line no-console\n console.log(` Skills: ${pack.skills.join(', ')}`);\n }\n });\n\n packCmd\n .command('info')\n .description('Show details about a pack')\n .argument('<name>', 'Pack name')\n .action(async (name: string) => {\n try {\n const pack = await resolvePack(name, getSkillsDir());\n // eslint-disable-next-line no-console\n console.log(`${pack.name} [${pack.category}]\\n`);\n // eslint-disable-next-line no-console\n console.log(` ${pack.description}\\n`);\n // eslint-disable-next-line no-console\n console.log(' Skills:');\n for (const skill of pack.skills) {\n const installed = await fileExists(join(getSkillsDir(), skill));\n const status = installed ? '✓' : '○';\n // eslint-disable-next-line no-console\n console.log(` ${status} ${skill}`);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(String(error));\n }\n });\n\n packCmd\n .command('install')\n .description('Install all skills from a pack')\n .argument('<name>', 'Pack name')\n .action(async (name: string) => {\n try {\n const result = await installPack(name, { skillsDir: getSkillsDir() });\n\n // eslint-disable-next-line no-console\n console.log(`Pack \"${result.pack}\":\\n`);\n for (const r of result.results) {\n const icon = r.status === 'installed' ? '↓' : r.status === 'skipped' ? '✓' : '✗';\n const detail = r.reason ? ` — ${r.reason}` : '';\n // eslint-disable-next-line no-console\n console.log(` ${icon} ${r.name}${detail}`);\n }\n\n const installed = result.results.filter((r) => r.status === 'installed').length;\n const skipped = result.results.filter((r) => r.status === 'skipped').length;\n // eslint-disable-next-line no-console\n console.log(`\\n${installed} installed, ${skipped} already installed.`);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(String(error));\n }\n });\n\n packCmd\n .command('create')\n .description('Create a custom pack')\n .argument('<name>', 'Pack name')\n .requiredOption('-s, --skills <skills>', 'Comma-separated skill names')\n .option('-d, --description <desc>', 'Pack description', '')\n .action(async (name: string, opts: { skills: string; description: string }) => {\n const skills = opts.skills.split(',').map((s) => s.trim());\n await createCustomPack(name, skills, opts.description, getSkillsDir());\n // eslint-disable-next-line no-console\n console.log(`Pack \"${name}\" created with ${skills.length} skills.`);\n });\n\n packCmd\n .command('remove')\n .description('Remove a custom pack (does not remove skills)')\n .argument('<name>', 'Pack name')\n .action(async (name: string) => {\n const removed = await removeCustomPack(name, getSkillsDir());\n if (removed) {\n // eslint-disable-next-line no-console\n console.log(`Pack \"${name}\" removed.`);\n } else {\n // eslint-disable-next-line no-console\n console.error(`Pack \"${name}\" not found or is an official pack.`);\n }\n });\n\n cmd.addCommand(packCmd);\n\n return cmd;\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\nasync function toggleSkill(name: string, enabled: boolean): Promise<void> {\n const manifestPath = join(getSkillsDir(), name, 'skill.yaml');\n if (!(await fileExists(manifestPath))) {\n // eslint-disable-next-line no-console\n console.error(`Skill \"${name}\" not found.`);\n return;\n }\n const manifest = await readYaml<Record<string, unknown>>(manifestPath);\n manifest.enabled = enabled;\n await writeYaml(manifestPath, manifest);\n // eslint-disable-next-line no-console\n console.log(`Skill \"${name}\" ${enabled ? 'enabled' : 'disabled'}.`);\n}\n\nfunction printRegistryEntry(entry: RegistryEntry): void {\n // eslint-disable-next-line no-console\n console.log(` ${entry.name} v${entry.version} [${entry.category}]`);\n // eslint-disable-next-line no-console\n console.log(` ${entry.description}`);\n // eslint-disable-next-line no-console\n console.log(` Agents: ${entry.agents.join(', ')} | Tags: ${entry.tags.join(', ')}`);\n // eslint-disable-next-line no-console\n console.log('');\n}\n","/**\n * AIDEN — Skills Registry\n * Fetch, install, update, and manage skills from a remote registry.\n */\n\nimport { createHash } from 'node:crypto';\nimport { cp, readFile, rm, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { satisfies } from 'semver';\nimport { registryIndexSchema, registryLockSchema, skillManifestSchema } from '../types/index.js';\nimport type {\n RegistryEntry,\n RegistryIndex,\n RegistryLock,\n RegistryLockEntry,\n SkillManifest,\n} from '../types/index.js';\nimport { ensureDir, fileExists, readText, writeText, readYaml } from '../utils/fs-helpers.js';\nimport {\n ChecksumMismatchError,\n RegistryError,\n SkillAlreadyInstalledError,\n SkillNotFoundError,\n} from './skill-errors.js';\n\n// ============================================================\n// Constants\n// ============================================================\n\nexport const DEFAULT_REGISTRY_URL =\n 'https://raw.githubusercontent.com/astrolyn/aiden-skills/main/registry.json';\n\nexport const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24h\n\n// ============================================================\n// Source Resolution\n// ============================================================\n\nexport type SkillSource =\n | { type: 'registry'; name: string; version?: string }\n | { type: 'github'; owner: string; repo: string; ref?: string }\n | { type: 'url'; url: string }\n | { type: 'local'; path: string };\n\nexport function resolveSource(input: string): SkillSource {\n // \"owasp-check\" or \"owasp-check@2.1.0\" → registry\n if (/^[a-z0-9-]+(@\\d+\\.\\d+\\.\\d+)?$/.test(input)) {\n const [name, version] = input.split('@');\n return { type: 'registry', name, version };\n }\n\n // \"owner/repo\" → GitHub\n if (/^[a-zA-Z0-9_-]+\\/[a-zA-Z0-9_-]+$/.test(input)) {\n const [owner, repo] = input.split('/');\n return { type: 'github', owner, repo };\n }\n\n // URL → direct\n if (input.startsWith('http') || input.startsWith('git@')) {\n return { type: 'url', url: input };\n }\n\n // path → local\n return { type: 'local', path: input };\n}\n\nexport function formatSourceForLock(source: SkillSource): string {\n switch (source.type) {\n case 'registry':\n return 'registry';\n case 'github':\n return `github:${source.owner}/${source.repo}`;\n case 'url':\n return `url:${source.url}`;\n case 'local':\n return `local:${source.path}`;\n }\n}\n\n// ============================================================\n// Registry Fetch + Cache\n// ============================================================\n\nexport async function fetchRegistry(\n registryUrl?: string,\n cacheDir?: string,\n cacheTtl?: number,\n): Promise<RegistryIndex> {\n const url = registryUrl ?? DEFAULT_REGISTRY_URL;\n const cacheBase = cacheDir ?? join(process.cwd(), '.aiden', 'cache');\n const cachePath = join(cacheBase, 'registry.json');\n const ttl = cacheTtl ?? CACHE_TTL_MS;\n\n // Check local cache\n if (await isCacheValid(cachePath, ttl)) {\n const cached = await readText(cachePath);\n return registryIndexSchema.parse(JSON.parse(cached));\n }\n\n // Fetch remote\n try {\n const response = await fetch(url, { signal: AbortSignal.timeout(10_000) });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const data = await response.json();\n const index = registryIndexSchema.parse(data);\n\n // Cache locally\n await ensureDir(cacheBase);\n await writeText(cachePath, JSON.stringify(index, null, 2));\n return index;\n } catch (error) {\n // Fallback to stale cache\n if (await fileExists(cachePath)) {\n const cached = await readText(cachePath);\n return registryIndexSchema.parse(JSON.parse(cached));\n }\n throw new RegistryError(`Cannot fetch registry from ${url}: ${error}`);\n }\n}\n\nasync function isCacheValid(cachePath: string, ttlMs: number): Promise<boolean> {\n if (!(await fileExists(cachePath))) return false;\n try {\n const info = await stat(cachePath);\n return Date.now() - info.mtimeMs < ttlMs;\n } catch {\n return false;\n }\n}\n\n// ============================================================\n// Registry Search\n// ============================================================\n\nexport interface SearchOptions {\n category?: string;\n agent?: string;\n mode?: string;\n tag?: string;\n limit?: number;\n}\n\nexport function searchRegistry(\n index: RegistryIndex,\n query: string,\n options: SearchOptions = {},\n): RegistryEntry[] {\n const q = query.toLowerCase();\n let results = index.skills.filter((s) => {\n const matchesQuery =\n !q ||\n s.name.includes(q) ||\n s.description.toLowerCase().includes(q) ||\n s.tags.some((t) => t.includes(q));\n return matchesQuery;\n });\n\n if (options.category) {\n results = results.filter((s) => s.category === options.category);\n }\n if (options.agent) {\n results = results.filter((s) => s.agents.includes(options.agent as never));\n }\n if (options.mode) {\n results = results.filter((s) => !s.modes || s.modes.includes(options.mode as never));\n }\n if (options.tag) {\n results = results.filter((s) => s.tags.includes(options.tag!));\n }\n\n const limit = options.limit ?? 20;\n return results.slice(0, limit);\n}\n\n// ============================================================\n// Registry Lock\n// ============================================================\n\nexport async function readRegistryLock(lockPath: string): Promise<RegistryLock> {\n if (!(await fileExists(lockPath))) {\n return { lockVersion: 1, skills: {} };\n }\n const content = await readText(lockPath);\n return registryLockSchema.parse(JSON.parse(content));\n}\n\nexport async function writeRegistryLock(lockPath: string, lock: RegistryLock): Promise<void> {\n await ensureDir(join(lockPath, '..'));\n await writeText(lockPath, JSON.stringify(lock, null, 2));\n}\n\nexport async function updateRegistryLock(\n skillsDir: string,\n manifest: SkillManifest,\n source: SkillSource,\n checksum?: string,\n): Promise<void> {\n const lockPath = join(skillsDir, '.registry-lock.json');\n const lock = await readRegistryLock(lockPath);\n\n const existing = lock.skills[manifest.name];\n const entry: RegistryLockEntry = {\n version: manifest.version,\n installedAt: existing?.installedAt ?? new Date().toISOString(),\n updatedAt: existing ? new Date().toISOString() : undefined,\n source: formatSourceForLock(source),\n checksum,\n autoUpdate: false,\n };\n\n lock.skills[manifest.name] = entry;\n await writeRegistryLock(lockPath, lock);\n}\n\nexport async function removeFromRegistryLock(skillsDir: string, name: string): Promise<void> {\n const lockPath = join(skillsDir, '.registry-lock.json');\n const lock = await readRegistryLock(lockPath);\n delete lock.skills[name];\n await writeRegistryLock(lockPath, lock);\n}\n\n// ============================================================\n// Checksum\n// ============================================================\n\nexport function computeChecksum(data: Buffer): string {\n return createHash('sha256').update(data).digest('hex');\n}\n\nexport async function verifyFileChecksum(filePath: string, expected: string): Promise<void> {\n const content = await readFile(filePath);\n const actual = computeChecksum(content);\n if (actual !== expected) {\n const name = filePath.split(/[\\\\/]/).pop() ?? filePath;\n throw new ChecksumMismatchError(name, expected, actual);\n }\n}\n\n// ============================================================\n// Install\n// ============================================================\n\nexport interface InstallOptions {\n skillsDir?: string;\n force?: boolean;\n registryUrl?: string;\n cacheDir?: string;\n}\n\nexport interface InstalledSkill {\n manifest: SkillManifest;\n dir: string;\n source: SkillSource;\n}\n\nexport async function installSkill(\n source: SkillSource,\n options: InstallOptions = {},\n): Promise<InstalledSkill> {\n const skillsDir = options.skillsDir ?? join(process.cwd(), '.aiden', 'skills');\n\n let sourceDir: string;\n let registryEntry: RegistryEntry | undefined;\n\n switch (source.type) {\n case 'local': {\n sourceDir = source.path;\n break;\n }\n case 'registry': {\n const index = await fetchRegistry(options.registryUrl, options.cacheDir);\n const entry = findRegistryEntry(index, source.name, source.version);\n if (!entry) throw new SkillNotFoundError(source.name);\n registryEntry = entry;\n // For registry source, we download to a temp dir — but since we can't\n // do tarball fetch without extra deps, we fallback to treating the URL\n // as metadata only and require the skill files at downloadUrl.\n // In a real implementation, this would download and extract the tarball.\n throw new RegistryError(\n `Remote download from registry not yet implemented. ` +\n `Use \"aiden skills install <local-path>\" or \"aiden skills add <path>\" instead.`,\n );\n }\n case 'github': {\n throw new RegistryError(\n `GitHub install not yet implemented. ` +\n `Clone the repo and use \"aiden skills install <local-path>\" instead.`,\n );\n }\n case 'url': {\n throw new RegistryError(\n `URL install not yet implemented. ` +\n `Download manually and use \"aiden skills install <local-path>\" instead.`,\n );\n }\n }\n\n // Validate the skill directory\n const manifest = await validateSkillDir(sourceDir);\n\n // Check if already installed\n const targetDir = join(skillsDir, manifest.name);\n if ((await fileExists(targetDir)) && !options.force) {\n throw new SkillAlreadyInstalledError(manifest.name);\n }\n\n // Copy to skills dir\n await ensureDir(skillsDir);\n if (await fileExists(targetDir)) {\n await rm(targetDir, { recursive: true });\n }\n await cp(sourceDir, targetDir, { recursive: true });\n\n // Update lock\n await updateRegistryLock(skillsDir, manifest, source, registryEntry?.checksum);\n\n return { manifest, dir: targetDir, source };\n}\n\nexport async function validateSkillDir(dir: string): Promise<SkillManifest> {\n const manifestPath = join(dir, 'skill.yaml');\n if (!(await fileExists(manifestPath))) {\n throw new RegistryError(`No skill.yaml found in ${dir}`);\n }\n\n let raw: unknown;\n try {\n raw = await readYaml(manifestPath);\n } catch (error) {\n throw new RegistryError(`Invalid skill.yaml in ${dir}: ${error}`);\n }\n\n const parsed = skillManifestSchema.safeParse(raw);\n if (!parsed.success) {\n throw new RegistryError(`Invalid skill manifest: ${parsed.error.message}`);\n }\n\n return parsed.data;\n}\n\nfunction findRegistryEntry(\n index: RegistryIndex,\n name: string,\n version?: string,\n): RegistryEntry | undefined {\n return index.skills.find((s) => s.name === name && (!version || s.version === version));\n}\n\n// ============================================================\n// Update / Outdated\n// ============================================================\n\nexport interface OutdatedSkill {\n name: string;\n installed: string;\n latest: string;\n source: string;\n}\n\nexport async function getOutdatedSkills(\n skillsDir: string,\n registryUrl?: string,\n cacheDir?: string,\n): Promise<OutdatedSkill[]> {\n const lockPath = join(skillsDir, '.registry-lock.json');\n const lock = await readRegistryLock(lockPath);\n const index = await fetchRegistry(registryUrl, cacheDir);\n\n const outdated: OutdatedSkill[] = [];\n\n for (const [name, entry] of Object.entries(lock.skills)) {\n const latest = index.skills\n .filter((s) => s.name === name)\n .sort((a, b) => (a.version > b.version ? -1 : 1))[0];\n\n if (latest && latest.version !== entry.version) {\n outdated.push({\n name,\n installed: entry.version,\n latest: latest.version,\n source: entry.source,\n });\n }\n }\n\n return outdated;\n}\n\n// ============================================================\n// Compatibility Check\n// ============================================================\n\nexport interface CompatibilityIssue {\n type: 'aiden-version' | 'missing-dependency' | 'incompatible-dependency' | 'conflict';\n severity: 'error' | 'warning';\n message: string;\n}\n\nexport interface CompatibilityResult {\n compatible: boolean;\n issues: CompatibilityIssue[];\n}\n\nexport async function checkCompatibility(\n manifest: SkillManifest,\n options: { aidenVersion: string; skillsDir: string },\n): Promise<CompatibilityResult> {\n const issues: CompatibilityIssue[] = [];\n\n // Check AIDEN version\n if (manifest.compatibility?.aiden) {\n if (!satisfies(options.aidenVersion, manifest.compatibility.aiden)) {\n issues.push({\n type: 'aiden-version',\n severity: 'error',\n message: `Requires AIDEN ${manifest.compatibility.aiden}, current: ${options.aidenVersion}`,\n });\n }\n }\n\n // Check skill dependencies\n if (manifest.compatibility?.skills) {\n const lockPath = join(options.skillsDir, '.registry-lock.json');\n const lock = await readRegistryLock(lockPath);\n\n for (const [depName, depRange] of Object.entries(manifest.compatibility.skills)) {\n const installed = lock.skills[depName];\n if (!installed) {\n issues.push({\n type: 'missing-dependency',\n severity: 'warning',\n message: `Recommends \"${depName}\" ${depRange} (not installed)`,\n });\n } else if (!satisfies(installed.version, depRange)) {\n issues.push({\n type: 'incompatible-dependency',\n severity: 'warning',\n message: `Recommends \"${depName}\" ${depRange}, installed: ${installed.version}`,\n });\n }\n }\n }\n\n // Check conflicts\n if (manifest.compatibility?.conflicts) {\n const lockPath = join(options.skillsDir, '.registry-lock.json');\n const lock = await readRegistryLock(lockPath);\n\n for (const conflictName of manifest.compatibility.conflicts) {\n if (lock.skills[conflictName]) {\n issues.push({\n type: 'conflict',\n severity: 'error',\n message: `Conflicts with installed skill \"${conflictName}\"`,\n });\n }\n }\n }\n\n return {\n compatible: issues.every((i) => i.severity !== 'error'),\n issues,\n };\n}\n\n// ============================================================\n// Info\n// ============================================================\n\nexport function getSkillInfo(index: RegistryIndex, name: string): RegistryEntry | undefined {\n return index.skills.find((s) => s.name === name);\n}\n","/**\n * AIDEN — Skills Registry error classes\n */\n\nexport class RegistryError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'RegistryError';\n }\n}\n\nexport class SkillNotFoundError extends RegistryError {\n constructor(name: string) {\n super(`Skill \"${name}\" not found in registry`);\n this.name = 'SkillNotFoundError';\n }\n}\n\nexport class SkillAlreadyInstalledError extends RegistryError {\n constructor(name: string) {\n super(`Skill \"${name}\" is already installed. Use --force to overwrite.`);\n this.name = 'SkillAlreadyInstalledError';\n }\n}\n\nexport class ChecksumMismatchError extends RegistryError {\n constructor(name: string, expected: string, actual: string) {\n super(\n `Checksum mismatch for \"${name}\". Expected ${expected.slice(0, 12)}..., got ${actual.slice(0, 12)}...`,\n );\n this.name = 'ChecksumMismatchError';\n }\n}\n\nexport class IncompatibleSkillError extends RegistryError {\n constructor(name: string, reason: string) {\n super(`Skill \"${name}\" is incompatible: ${reason}`);\n this.name = 'IncompatibleSkillError';\n }\n}\n","/**\n * AIDEN — Skill Packs\n * Bundles of skills installable in one command.\n */\n\nimport { join } from 'node:path';\nimport type { SkillPack } from '../types/index.js';\nimport { fileExists, writeText, ensureDir, readYaml } from '../utils/fs-helpers.js';\nimport { RegistryError } from './skill-errors.js';\nimport { installSkill, resolveSource } from './skill-registry.js';\nimport type { InstallOptions } from './skill-registry.js';\nimport yaml from 'js-yaml';\n\n// ============================================================\n// Official Packs\n// ============================================================\n\nexport const OFFICIAL_PACKS: SkillPack[] = [\n {\n name: 'backend-essentials',\n description: 'Essential skills for backend teams — review, security, testing, API design',\n category: 'starter',\n skills: [\n 'code-review-strict',\n 'owasp-check',\n 'secret-scan',\n 'test-coverage-enforcer',\n 'api-design-restful',\n ],\n },\n {\n name: 'frontend-essentials',\n description: 'Essential skills for frontend teams — review, React, naming, dead code',\n category: 'starter',\n skills: [\n 'code-review-strict',\n 'react-best-practices',\n 'naming-conventions',\n 'dead-code-detector',\n ],\n },\n {\n name: 'compliance-full',\n description: 'Complete compliance suite — RGPD, HIPAA, ISO 27001, ADR, dependency audit',\n category: 'compliance',\n skills: ['compliance-rgpd', 'hipaa-guard', 'iso-27001', 'adr-enforcer', 'dependency-audit'],\n },\n {\n name: 'startup-fast',\n description: 'Minimal quality setup for fast-moving teams — review, secrets, changelog',\n category: 'starter',\n skills: ['code-review-strict', 'secret-scan', 'changelog-gen'],\n },\n {\n name: 'enterprise-standard',\n description: 'Standard enterprise setup — security, compliance, review, integration, ADR',\n category: 'team',\n skills: [\n 'code-review-strict',\n 'adversarial-review',\n 'owasp-check',\n 'secret-scan',\n 'test-coverage-enforcer',\n 'compliance-rgpd',\n 'adr-enforcer',\n 'slack-notify',\n ],\n },\n];\n\n// ============================================================\n// Pack Resolution\n// ============================================================\n\nexport interface PacksFile {\n packs: Record<string, { description: string; skills: string[] }>;\n}\n\nexport async function resolvePack(packName: string, skillsDir?: string): Promise<SkillPack> {\n // Check official packs first\n const official = OFFICIAL_PACKS.find((p) => p.name === packName);\n if (official) return official;\n\n // Check custom packs\n const baseDir = skillsDir ?? join(process.cwd(), '.aiden', 'skills');\n const packsPath = join(baseDir, '.packs.yaml');\n if (await fileExists(packsPath)) {\n const raw = await readYaml<PacksFile>(packsPath);\n if (raw.packs?.[packName]) {\n const entry = raw.packs[packName];\n return {\n name: packName,\n description: entry.description ?? '',\n skills: entry.skills,\n category: 'custom',\n };\n }\n }\n\n throw new RegistryError(`Pack \"${packName}\" not found`);\n}\n\nexport async function listPacks(skillsDir?: string): Promise<SkillPack[]> {\n const packs = [...OFFICIAL_PACKS];\n\n const baseDir = skillsDir ?? join(process.cwd(), '.aiden', 'skills');\n const packsPath = join(baseDir, '.packs.yaml');\n if (await fileExists(packsPath)) {\n const raw = await readYaml<PacksFile>(packsPath);\n if (raw.packs) {\n for (const [name, entry] of Object.entries(raw.packs)) {\n packs.push({\n name,\n description: entry.description ?? '',\n skills: entry.skills,\n category: 'custom',\n });\n }\n }\n }\n\n return packs;\n}\n\n// ============================================================\n// Pack Install\n// ============================================================\n\nexport interface SkillInstallResult {\n name: string;\n status: 'installed' | 'skipped' | 'failed';\n reason?: string;\n}\n\nexport interface PackInstallResult {\n pack: string;\n results: SkillInstallResult[];\n}\n\nexport async function installPack(\n packName: string,\n options: InstallOptions = {},\n): Promise<PackInstallResult> {\n const skillsDir = options.skillsDir ?? join(process.cwd(), '.aiden', 'skills');\n const pack = await resolvePack(packName, skillsDir);\n const results: SkillInstallResult[] = [];\n\n for (const skillName of pack.skills) {\n const targetDir = join(skillsDir, skillName);\n\n if (await fileExists(targetDir)) {\n results.push({ name: skillName, status: 'skipped', reason: 'already installed' });\n continue;\n }\n\n try {\n const source = resolveSource(skillName);\n await installSkill(source, { ...options, skillsDir });\n results.push({ name: skillName, status: 'installed' });\n } catch (error) {\n results.push({ name: skillName, status: 'failed', reason: String(error) });\n }\n }\n\n return { pack: pack.name, results };\n}\n\n// ============================================================\n// Custom Packs\n// ============================================================\n\nexport async function createCustomPack(\n name: string,\n skills: string[],\n description: string,\n skillsDir?: string,\n): Promise<void> {\n const baseDir = skillsDir ?? join(process.cwd(), '.aiden', 'skills');\n const packsPath = join(baseDir, '.packs.yaml');\n\n let packsFile: PacksFile = { packs: {} };\n if (await fileExists(packsPath)) {\n packsFile = await readYaml<PacksFile>(packsPath);\n if (!packsFile.packs) packsFile.packs = {};\n }\n\n packsFile.packs[name] = { description, skills };\n\n await ensureDir(baseDir);\n await writeText(packsPath, yaml.dump(packsFile, { lineWidth: 120, noRefs: true }));\n}\n\nexport async function removeCustomPack(name: string, skillsDir?: string): Promise<boolean> {\n const baseDir = skillsDir ?? join(process.cwd(), '.aiden', 'skills');\n const packsPath = join(baseDir, '.packs.yaml');\n\n if (!(await fileExists(packsPath))) return false;\n\n const packsFile = await readYaml<PacksFile>(packsPath);\n if (!packsFile.packs?.[name]) return false;\n\n delete packsFile.packs[name];\n await writeText(packsPath, yaml.dump(packsFile, { lineWidth: 120, noRefs: true }));\n return true;\n}\n","import { Command } from 'commander';\nimport { join } from 'node:path';\nimport { createRetexStore } from '../../memory/retex-store.js';\n\nexport function createRetexCommand(): Command {\n const cmd = new Command('retex').description('Manage lessons learned (retex)');\n\n cmd\n .command('list')\n .description('List all retex')\n .action(async () => {\n const store = createRetexStore(join(process.cwd(), '.aiden', 'retex'));\n const retex = await store.list();\n if (retex.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No retex recorded.');\n return;\n }\n for (const r of retex) {\n const icon = r.outcome === 'success' ? '+' : r.outcome === 'failure' ? '-' : '~';\n // eslint-disable-next-line no-console\n console.log(` [${icon}] ${r.id}: ${r.title}`);\n // eslint-disable-next-line no-console\n console.log(` Context: ${r.context.join(', ')} | ${r.createdAt}`);\n }\n });\n\n cmd\n .command('add')\n .description('Add a new retex')\n .requiredOption('--title <title>', 'Title')\n .requiredOption('--context <tags>', 'Comma-separated context tags')\n .requiredOption('--outcome <outcome>', 'success | failure | mixed')\n .requiredOption('--lesson <lesson>', 'What was learned')\n .requiredOption('--recommendation <rec>', 'What to do/avoid')\n .action(\n async (opts: {\n title: string;\n context: string;\n outcome: string;\n lesson: string;\n recommendation: string;\n }) => {\n const store = createRetexStore(join(process.cwd(), '.aiden', 'retex'));\n const retex = await store.add({\n title: opts.title,\n context: opts.context.split(',').map((s) => s.trim()),\n outcome: opts.outcome as 'success' | 'failure' | 'mixed',\n lesson: opts.lesson,\n recommendation: opts.recommendation,\n });\n // eslint-disable-next-line no-console\n console.log(`Retex added: ${retex.id} — ${retex.title}`);\n },\n );\n\n cmd\n .command('search')\n .description('Search retex by context tag')\n .argument('<tag>', 'Context tag to search')\n .action(async (tag: string) => {\n const store = createRetexStore(join(process.cwd(), '.aiden', 'retex'));\n const results = await store.getByContext([tag]);\n if (results.length === 0) {\n // eslint-disable-next-line no-console\n console.log(`No retex found for \"${tag}\".`);\n return;\n }\n for (const r of results) {\n // eslint-disable-next-line no-console\n console.log(` ${r.id}: ${r.title}`);\n // eslint-disable-next-line no-console\n console.log(` Lesson: ${r.lesson}`);\n // eslint-disable-next-line no-console\n console.log(` Recommendation: ${r.recommendation}`);\n }\n });\n\n cmd\n .command('remove')\n .description('Remove a retex')\n .argument('<id>', 'Retex ID')\n .action(async (id: string) => {\n const store = createRetexStore(join(process.cwd(), '.aiden', 'retex'));\n const removed = await store.remove(id);\n if (removed) {\n // eslint-disable-next-line no-console\n console.log(`Retex removed: ${id}`);\n } else {\n // eslint-disable-next-line no-console\n console.error(`Retex not found: ${id}`);\n }\n });\n\n return cmd;\n}\n","import { readdir, unlink } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { ensureDir, fileExists, readText, writeText } from '../utils/fs-helpers.js';\n\nexport interface Retex {\n id: string;\n title: string;\n context: string[];\n outcome: 'success' | 'failure' | 'mixed';\n lesson: string;\n recommendation: string;\n createdAt: string;\n}\n\nexport interface RetexStore {\n add(retex: Omit<Retex, 'id' | 'createdAt'>): Promise<Retex>;\n list(): Promise<Retex[]>;\n getByContext(tags: string[]): Promise<Retex[]>;\n remove(id: string): Promise<boolean>;\n}\n\nexport function createRetexStore(retexDir: string): RetexStore {\n return {\n async add(input): Promise<Retex> {\n await ensureDir(retexDir);\n const existing = await listRetexFiles(retexDir);\n const nextNum = existing.length + 1;\n const id = `retex-${String(nextNum).padStart(3, '0')}`;\n const retex: Retex = {\n ...input,\n id,\n createdAt: new Date().toISOString().slice(0, 10),\n };\n const content = serializeRetex(retex);\n await writeText(join(retexDir, `${id}.md`), content);\n return retex;\n },\n\n async list(): Promise<Retex[]> {\n if (!(await fileExists(retexDir))) return [];\n const files = await listRetexFiles(retexDir);\n const results: Retex[] = [];\n for (const file of files) {\n const content = await readText(join(retexDir, file));\n const parsed = parseRetex(content, file);\n if (parsed) results.push(parsed);\n }\n return results.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n },\n\n async getByContext(tags: string[]): Promise<Retex[]> {\n const all = await this.list();\n const lowerTags = tags.map((t) => t.toLowerCase());\n return all.filter((r) => r.context.some((c) => lowerTags.includes(c.toLowerCase())));\n },\n\n async remove(id: string): Promise<boolean> {\n const filePath = join(retexDir, `${id}.md`);\n if (!(await fileExists(filePath))) return false;\n await unlink(filePath);\n return true;\n },\n };\n}\n\nasync function listRetexFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir);\n return entries.filter((f) => f.endsWith('.md')).sort();\n}\n\nfunction serializeRetex(retex: Retex): string {\n const lines = [\n '---',\n `id: ${retex.id}`,\n `title: \"${retex.title}\"`,\n `context: [${retex.context.join(', ')}]`,\n `outcome: ${retex.outcome}`,\n `createdAt: ${retex.createdAt}`,\n '---',\n '',\n '## Lesson',\n retex.lesson,\n '',\n '## Recommendation',\n retex.recommendation,\n '',\n ];\n return lines.join('\\n');\n}\n\nfunction parseRetex(content: string, filename: string): Retex | null {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!frontmatterMatch) return null;\n\n const fm = frontmatterMatch[1];\n const id = extractField(fm, 'id') ?? filename.replace('.md', '');\n const title = extractField(fm, 'title')?.replace(/^\"|\"$/g, '') ?? '';\n const contextStr = extractField(fm, 'context') ?? '';\n const context = contextStr\n .replace(/^\\[|\\]$/g, '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n const outcome = (extractField(fm, 'outcome') ?? 'mixed') as Retex['outcome'];\n const createdAt = extractField(fm, 'createdAt') ?? '';\n\n const body = content.slice(frontmatterMatch[0].length);\n const lessonMatch = body.match(/## Lesson\\n([\\s\\S]*?)(?=\\n## |$)/);\n const recoMatch = body.match(/## Recommendation\\n([\\s\\S]*?)$/);\n\n return {\n id,\n title,\n context,\n outcome,\n lesson: lessonMatch?.[1]?.trim() ?? '',\n recommendation: recoMatch?.[1]?.trim() ?? '',\n createdAt,\n };\n}\n\nfunction extractField(fm: string, key: string): string | undefined {\n const match = fm.match(new RegExp(`^${key}:\\\\s*(.+)$`, 'm'));\n return match?.[1]?.trim();\n}\n","import { Command } from 'commander';\nimport { join, resolve } from 'node:path';\nimport { copyFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport chalk from 'chalk';\nimport { ensureDir, fileExists } from '../../utils/fs-helpers.js';\n\nconst BUILT_IN_TEMPLATES_DIR = resolve(\n fileURLToPath(import.meta.url),\n '..',\n '..',\n '..',\n 'artefacts',\n 'templates',\n);\n\nconst AVAILABLE_TEMPLATES = [\n 'brief',\n 'spec',\n 'story',\n 'review',\n 'change-summary',\n 'architecture-decision',\n 'quality-report',\n 'prfaq',\n];\n\nexport function createTemplateCommand(): Command {\n const cmd = new Command('template').description('Manage templates');\n\n cmd\n .command('customize')\n .description('Copy a built-in template for customization')\n .argument('<name>', 'Template name (brief, spec, story, review, etc.)')\n .action(async (name: string) => {\n if (!AVAILABLE_TEMPLATES.includes(name)) {\n // eslint-disable-next-line no-console\n console.log(\n chalk.red(`Unknown template \"${name}\". Available: ${AVAILABLE_TEMPLATES.join(', ')}`),\n );\n process.exitCode = 1;\n return;\n }\n\n const fileName = `${name}.md.hbs`;\n const srcPath = join(BUILT_IN_TEMPLATES_DIR, fileName);\n\n if (!(await fileExists(srcPath))) {\n // eslint-disable-next-line no-console\n console.log(chalk.red(`Built-in template \"${fileName}\" not found at ${srcPath}`));\n process.exitCode = 1;\n return;\n }\n\n const destDir = join(process.cwd(), '.aiden', 'templates');\n await ensureDir(destDir);\n const destPath = join(destDir, fileName);\n\n if (await fileExists(destPath)) {\n // eslint-disable-next-line no-console\n console.log(\n chalk.yellow(`Template \"${fileName}\" already exists in .aiden/templates/ — overwriting.`),\n );\n }\n\n await copyFile(srcPath, destPath);\n // eslint-disable-next-line no-console\n console.log(\n chalk.green(`Template \"${name}\" copied to .aiden/templates/${fileName} for customization.`),\n );\n });\n\n cmd\n .command('list')\n .description('List available templates')\n .action(async () => {\n // eslint-disable-next-line no-console\n console.log('Available templates:');\n for (const t of AVAILABLE_TEMPLATES) {\n // eslint-disable-next-line no-console\n console.log(` ${t}`);\n }\n });\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { join } from 'node:path';\nimport { TraceStore } from '../../core/trace/trace-store.js';\nimport { generateSequenceDiagram, generateFlowDiagram } from '../../core/trace/trace-diagram.js';\nimport { formatTimeline } from '../../core/trace/trace-timeline.js';\nimport type { TraceSummary } from '../../core/trace/trace-types.js';\n\nfunction getStore(): TraceStore {\n return new TraceStore(join(process.cwd(), '.aiden', 'traces'));\n}\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso);\n return d.toISOString().replace('T', ' ').slice(0, 19);\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction printTable(summaries: TraceSummary[]): void {\n if (summaries.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No traces found.');\n return;\n }\n\n // eslint-disable-next-line no-console\n console.log(\n chalk.dim(\n `${'ID'.padEnd(10)} ${'Feature'.padEnd(25)} ${'Mode'.padEnd(12)} ${'Status'.padEnd(12)} ${'Duration'.padEnd(10)} Date`,\n ),\n );\n\n for (const s of summaries) {\n const id = s.traceId.slice(0, 8);\n const status =\n s.status === 'completed'\n ? chalk.green(s.status)\n : s.status === 'failed'\n ? chalk.red(s.status)\n : chalk.yellow(s.status);\n // eslint-disable-next-line no-console\n console.log(\n `${id.padEnd(10)} ${s.featureSlug.padEnd(25).slice(0, 25)} ${s.mode.padEnd(12)} ${status.padEnd(12)} ${formatDuration(s.durationMs).padEnd(10)} ${formatDate(s.startedAt)}`,\n );\n }\n}\n\nexport function createTraceCommand(): Command {\n const trace = new Command('trace').description('Inspect workflow execution traces');\n\n trace\n .command('list')\n .description('List recent traces')\n .option('--feature <slug>', 'Filter by feature')\n .option('--limit <n>', 'Max traces to show', '10')\n .action(async (opts: { feature?: string; limit: string }) => {\n const store = getStore();\n const limit = parseInt(opts.limit, 10);\n const summaries = opts.feature\n ? await store.list(opts.feature)\n : await store.listRecent(limit);\n printTable(summaries.slice(0, limit));\n });\n\n trace\n .command('show [traceId]')\n .description('Show trace timeline')\n .option('--verbose', 'Show events and attributes')\n .option('--filter <kinds>', 'Filter span kinds (comma-separated)')\n .action(async (traceId: string | undefined, opts: { verbose?: boolean; filter?: string }) => {\n const store = getStore();\n const { trace: loadedTrace } = await resolveTrace(store, traceId);\n if (!loadedTrace) return;\n\n const filterKinds = opts.filter?.split(',').map((s) => s.trim()) ?? [];\n\n const output = formatTimeline(loadedTrace, {\n colorize: process.stdout.isTTY ?? false,\n showAttributes: opts.verbose ?? false,\n showEvents: opts.verbose ?? false,\n filter:\n filterKinds.length > 0\n ? (filterKinds as import('../../core/trace/trace-types.js').SpanKind[])\n : [],\n });\n // eslint-disable-next-line no-console\n console.log(output);\n });\n\n trace\n .command('diagram [traceId]')\n .description('Generate Mermaid sequence diagram')\n .option('--no-providers', 'Hide provider calls')\n .option('--no-gates', 'Hide quality gates')\n .option('--tokens', 'Show token counts')\n .option('--flow', 'Generate flowchart instead of sequence diagram')\n .action(\n async (\n traceId: string | undefined,\n opts: { providers?: boolean; gates?: boolean; tokens?: boolean; flow?: boolean },\n ) => {\n const store = getStore();\n const { trace: loadedTrace } = await resolveTrace(store, traceId);\n if (!loadedTrace) return;\n\n if (opts.flow) {\n // eslint-disable-next-line no-console\n console.log(generateFlowDiagram(loadedTrace));\n return;\n }\n\n const diagram = generateSequenceDiagram(loadedTrace, {\n includeProviderCalls: opts.providers !== false,\n includeQualityGates: opts.gates !== false,\n includeTokens: opts.tokens ?? false,\n });\n // eslint-disable-next-line no-console\n console.log(diagram);\n },\n );\n\n trace\n .command('export <traceId>')\n .description('Export trace data')\n .option('--format <fmt>', 'Output format: json|mermaid', 'json')\n .option('--output <path>', 'Write to file instead of stdout')\n .action(async (traceId: string, opts: { format: string; output?: string }) => {\n const store = getStore();\n const { trace: loadedTrace } = await resolveTrace(store, traceId);\n if (!loadedTrace) return;\n\n let content: string;\n if (opts.format === 'mermaid') {\n content = generateSequenceDiagram(loadedTrace);\n } else {\n content = JSON.stringify(\n loadedTrace,\n (_key, value) => {\n if (value instanceof Map) return Object.fromEntries(value);\n return value;\n },\n 2,\n );\n }\n\n if (opts.output) {\n const { writeFile } = await import('node:fs/promises');\n await writeFile(opts.output, content, 'utf-8');\n // eslint-disable-next-line no-console\n console.log(`Exported to ${opts.output}`);\n } else {\n // eslint-disable-next-line no-console\n console.log(content);\n }\n });\n\n trace\n .command('diff <traceId1> <traceId2>')\n .description('Compare two traces')\n .action(async (id1: string, id2: string) => {\n const store = getStore();\n const { trace: t1 } = await resolveTraceById(store, id1);\n const { trace: t2 } = await resolveTraceById(store, id2);\n if (!t1 || !t2) return;\n\n // eslint-disable-next-line no-console\n console.log(chalk.bold(`Comparing traces:`));\n // eslint-disable-next-line no-console\n console.log(\n ` ${id1.slice(0, 8)}: ${t1.mode}, ${formatDuration(t1.durationMs ?? 0)}, ${t1.metadata.totalTokens} tokens, ${t1.metadata.retryCount} retries`,\n );\n // eslint-disable-next-line no-console\n console.log(\n ` ${id2.slice(0, 8)}: ${t2.mode}, ${formatDuration(t2.durationMs ?? 0)}, ${t2.metadata.totalTokens} tokens, ${t2.metadata.retryCount} retries`,\n );\n\n const dDuration = (t2.durationMs ?? 0) - (t1.durationMs ?? 0);\n const dTokens = t2.metadata.totalTokens - t1.metadata.totalTokens;\n const dRetries = t2.metadata.retryCount - t1.metadata.retryCount;\n\n // eslint-disable-next-line no-console\n console.log('');\n const sign = (n: number) => (n >= 0 ? '+' : '');\n const pct = (n: number, base: number) =>\n base > 0 ? ` (${sign(n)}${((n / base) * 100).toFixed(0)}%)` : '';\n // eslint-disable-next-line no-console\n console.log(\n ` Δ duration: ${sign(dDuration)}${formatDuration(Math.abs(dDuration))}${pct(dDuration, t1.durationMs ?? 1)}`,\n );\n // eslint-disable-next-line no-console\n console.log(\n ` Δ tokens: ${sign(dTokens)}${Math.abs(dTokens)}${pct(dTokens, t1.metadata.totalTokens || 1)}`,\n );\n // eslint-disable-next-line no-console\n console.log(` Δ retries: ${sign(dRetries)}${Math.abs(dRetries)}`);\n });\n\n trace\n .command('clear')\n .description('Clear traces')\n .option('--feature <slug>', 'Clear traces for a feature')\n .option('--before <date>', 'Clear traces before date (YYYY-MM-DD)')\n .action(async (opts: { feature?: string; before?: string }) => {\n const store = getStore();\n if (opts.before) {\n const removed = await store.clearBefore(opts.before);\n // eslint-disable-next-line no-console\n console.log(`Removed ${removed} traces before ${opts.before}`);\n } else {\n await store.clear(opts.feature);\n // eslint-disable-next-line no-console\n console.log(opts.feature ? `Cleared traces for ${opts.feature}` : 'Cleared all traces');\n }\n });\n\n return trace;\n}\n\nasync function resolveTrace(\n store: TraceStore,\n traceId?: string,\n): Promise<{ trace: import('../../core/trace/trace-types.js').Trace | null; feature: string }> {\n if (traceId) {\n return resolveTraceById(store, traceId);\n }\n\n // Get most recent trace\n const recent = await store.listRecent(1);\n if (recent.length === 0) {\n // eslint-disable-next-line no-console\n console.log('No traces found. Run a workflow with --trace to create one.');\n return { trace: null, feature: '' };\n }\n\n const summary = recent[0];\n const trace = await store.load(summary.featureSlug, summary.traceId);\n return { trace, feature: summary.featureSlug };\n}\n\nasync function resolveTraceById(\n store: TraceStore,\n traceId: string,\n): Promise<{ trace: import('../../core/trace/trace-types.js').Trace | null; feature: string }> {\n // Search all features for this trace ID\n const recent = await store.listRecent(100);\n const match = recent.find((s) => s.traceId === traceId || s.traceId.startsWith(traceId));\n if (!match) {\n // eslint-disable-next-line no-console\n console.log(`Trace ${traceId} not found.`);\n return { trace: null, feature: '' };\n }\n\n const trace = await store.load(match.featureSlug, match.traceId);\n return { trace, feature: match.featureSlug };\n}\n","/**\n * AIDEN Trace System — Mermaid Diagram Generator\n * Generates sequence diagrams and flowcharts from traces.\n */\n\nimport type { Trace, TraceSpan } from './trace-types.js';\n\nexport interface DiagramOptions {\n includeProviderCalls?: boolean;\n includeQualityGates?: boolean;\n includeHooks?: boolean;\n includeTimings?: boolean;\n includeTokens?: boolean;\n collapseRetries?: boolean;\n}\n\nconst DEFAULT_OPTIONS: Required<DiagramOptions> = {\n includeProviderCalls: true,\n includeQualityGates: true,\n includeHooks: false,\n includeTimings: true,\n includeTokens: false,\n collapseRetries: true,\n};\n\nconst PHASE_COLORS: Record<string, string> = {\n discovery: 'rgb(240, 248, 255)',\n planning: 'rgb(255, 248, 240)',\n implementation: 'rgb(240, 255, 240)',\n validation: 'rgb(255, 240, 240)',\n documentation: 'rgb(248, 240, 255)',\n};\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(1)}k`;\n return `${tokens}`;\n}\n\nfunction getSpansByKind(trace: Trace, kind: string): TraceSpan[] {\n const spans: TraceSpan[] = [];\n for (const span of trace.spans.values()) {\n if (span.kind === kind) spans.push(span);\n }\n return spans;\n}\n\nfunction getChildSpans(trace: Trace, parentId: string): TraceSpan[] {\n return Array.from(trace.spans.values()).filter((s) => s.parentId === parentId);\n}\n\nexport function generateSequenceDiagram(trace: Trace, opts?: DiagramOptions): string {\n const options = { ...DEFAULT_OPTIONS, ...opts };\n const lines: string[] = ['sequenceDiagram'];\n\n // Collect participants\n const participants = collectParticipants(trace, options);\n lines.push(' participant User');\n lines.push(' participant Orchestrator');\n for (const p of participants.agents) {\n lines.push(` participant ${capitalize(p)}`);\n }\n if (options.includeProviderCalls) {\n for (const p of participants.providers) {\n lines.push(` participant ${capitalize(p)} as ${p}`);\n }\n }\n\n // Start message\n lines.push('');\n lines.push(` User->>Orchestrator: ${trace.mode} \"${truncate(trace.featureSlug, 30)}\"`);\n\n // Process phases\n const phaseSpans = getSpansByKind(trace, 'phase');\n // Sort by startedAt\n phaseSpans.sort((a, b) => a.startedAt.localeCompare(b.startedAt));\n\n for (const phase of phaseSpans) {\n const color = PHASE_COLORS[phase.name] ?? 'rgb(245, 245, 245)';\n lines.push('');\n lines.push(` rect ${color}`);\n lines.push(` Note over Orchestrator: Phase ${capitalize(phase.name)}`);\n\n const children = getChildSpans(trace, phase.id);\n children.sort((a, b) => a.startedAt.localeCompare(b.startedAt));\n\n // Track retry groups\n let inRetryBlock = false;\n\n for (const child of children) {\n if (child.kind === 'retry' && options.collapseRetries) {\n if (!inRetryBlock) {\n inRetryBlock = true;\n const maxRetries = child.attributes['max_retries'] ?? '?';\n lines.push(` loop Retry ${child.attributes['attempt'] ?? 1}/${maxRetries}`);\n }\n // Render retry children (dev + qa re-runs)\n const retryChildren = getChildSpans(trace, child.id);\n retryChildren.sort((a, b) => a.startedAt.localeCompare(b.startedAt));\n for (const rc of retryChildren) {\n renderAgentExecution(lines, trace, rc, options, ' ');\n }\n // Check if next child is also a retry\n const idx = children.indexOf(child);\n const next = children[idx + 1];\n if (!next || next.kind !== 'retry') {\n lines.push(' end');\n inRetryBlock = false;\n }\n continue;\n }\n\n if (child.kind === 'agent_execution') {\n renderAgentExecution(lines, trace, child, options, ' ');\n }\n\n if (child.kind === 'quality_gate' && options.includeQualityGates) {\n const passed = child.attributes['passed'] ? '✓' : '✗';\n lines.push(` Note over Orchestrator: Quality Gate: ${child.name} ${passed}`);\n }\n\n if (child.kind === 'human_approval') {\n const approved = child.attributes['approved'] ? '✓ approved' : '✗ rejected';\n const waitTime = child.attributes['wait_time_ms'];\n const timing =\n options.includeTimings && typeof waitTime === 'number'\n ? ` (${formatDuration(waitTime)})`\n : '';\n lines.push(` Note over Orchestrator: Human Approval: ${approved}${timing}`);\n }\n\n if (child.kind === 'mode_switch') {\n const from = child.attributes['from_mode'] ?? '?';\n const to = child.attributes['to_mode'] ?? '?';\n lines.push(` Note over Orchestrator: Mode Switch: ${from} → ${to}`);\n }\n }\n\n lines.push(' end');\n }\n\n // Final result\n const statusIcon = trace.status === 'completed' ? '✓' : '✗';\n const timing =\n options.includeTimings && trace.durationMs ? ` (${formatDuration(trace.durationMs)}` : '';\n const tokens =\n options.includeTokens && trace.metadata.totalTokens\n ? `, ${formatTokens(trace.metadata.totalTokens)} tokens`\n : '';\n const closeParen = timing ? ')' : '';\n lines.push('');\n lines.push(\n ` Orchestrator-->>User: ${statusIcon} Feature ${trace.status}${timing}${tokens}${closeParen}`,\n );\n\n return lines.join('\\n');\n}\n\nfunction renderAgentExecution(\n lines: string[],\n trace: Trace,\n span: TraceSpan,\n options: Required<DiagramOptions>,\n indent: string,\n): void {\n const agentName = capitalize(String(span.attributes['agent_role'] ?? span.name));\n const providerName = String(span.attributes['provider'] ?? 'provider');\n\n lines.push(`${indent}Orchestrator->>${agentName}: ${span.name}`);\n\n if (options.includeProviderCalls) {\n // Find provider_call children\n const providerCalls = getChildSpans(trace, span.id).filter((c) => c.kind === 'provider_call');\n for (const pc of providerCalls) {\n const tokenInfo =\n options.includeTokens && pc.attributes['tokens_used']\n ? ` (${formatTokens(Number(pc.attributes['tokens_used']))} tokens)`\n : '';\n lines.push(`${indent}${agentName}->>${capitalize(providerName)}: prompt${tokenInfo}`);\n const timing =\n options.includeTimings && pc.durationMs ? ` ${formatDuration(pc.durationMs)}` : '';\n const resultIcon = pc.status === 'success' ? '✓' : '✗';\n lines.push(`${indent}${capitalize(providerName)}-->>${agentName}: ${resultIcon}${timing}`);\n }\n }\n\n const timing =\n options.includeTimings && span.durationMs ? ` (${formatDuration(span.durationMs)})` : '';\n const statusIcon = span.status === 'success' ? '✓' : '✗';\n lines.push(`${indent}${agentName}-->>Orchestrator: ${statusIcon} done${timing}`);\n}\n\nfunction collectParticipants(\n trace: Trace,\n options: Required<DiagramOptions>,\n): { agents: string[]; providers: string[] } {\n const agents = new Set<string>();\n const providers = new Set<string>();\n\n for (const span of trace.spans.values()) {\n if (span.kind === 'agent_execution') {\n const role = span.attributes['agent_role'];\n if (typeof role === 'string') agents.add(role);\n }\n if (span.kind === 'provider_call' && options.includeProviderCalls) {\n const prov = span.attributes['provider'];\n if (typeof prov === 'string') providers.add(prov);\n }\n }\n\n return {\n agents: [...agents],\n providers: [...providers],\n };\n}\n\nexport function generateFlowDiagram(trace: Trace): string {\n const lines: string[] = ['flowchart TD'];\n const phases = getSpansByKind(trace, 'phase');\n phases.sort((a, b) => a.startedAt.localeCompare(b.startedAt));\n\n lines.push(` A[Start: ${trace.mode}]`);\n\n let prevId = 'A';\n let nodeCount = 0;\n\n for (const phase of phases) {\n nodeCount++;\n const agentId = `N${nodeCount}`;\n const agentRole = phase.attributes['agent_planned'] ?? phase.name;\n lines.push(` ${prevId} --> ${agentId}[${capitalize(String(agentRole))} Agent]`);\n\n // Check for quality gates\n const gateSpans = getChildSpans(trace, phase.id).filter((c) => c.kind === 'quality_gate');\n if (gateSpans.length > 0) {\n nodeCount++;\n const gateId = `G${nodeCount}`;\n lines.push(` ${agentId} --> ${gateId}{${capitalize(phase.name)} Gate}`);\n nodeCount++;\n const passId = `P${nodeCount}`;\n lines.push(` ${gateId} -->|Pass| ${passId}((✓))`);\n nodeCount++;\n const failId = `F${nodeCount}`;\n lines.push(` ${gateId} -->|Fail| ${failId}[Blocked]`);\n prevId = passId;\n } else {\n // Check for retries\n const retrySpans = getChildSpans(trace, phase.id).filter((c) => c.kind === 'retry');\n if (retrySpans.length > 0) {\n nodeCount++;\n const checkId = `C${nodeCount}`;\n lines.push(` ${agentId} --> ${checkId}{QA Passed?}`);\n nodeCount++;\n const yesId = `Y${nodeCount}`;\n lines.push(` ${checkId} -->|Yes| ${yesId}((✓))`);\n // Find the dev agent in the retry for loop-back\n const devInPhase = getChildSpans(trace, phase.id).find(\n (c) => c.kind === 'agent_execution' && c.attributes['agent_role'] === 'dev',\n );\n if (devInPhase) {\n lines.push(` ${checkId} -->|No, retry| ${agentId}`);\n }\n prevId = yesId;\n } else {\n prevId = agentId;\n }\n }\n }\n\n nodeCount++;\n const endStatus = trace.status === 'completed' ? '✓' : '✗';\n lines.push(` ${prevId} --> END[Done ${endStatus}]`);\n\n return lines.join('\\n');\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + '...' : s;\n}\n"],"mappings":"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","names":["Command","join","writeFile","readFile","readFile","join","writeFile","Command","chalk","join","join","join","resolve","join","writeFile","join","readFile","join","join","readFile","appendFile","readFile","join","join","appendFile","readFile","c","join","yaml","yaml","join","join","readFile","join","join","readFile","c","c","join","join","readdir","stat","join","readdir","join","stat","join","join","spawn","resolve","readdir","readFile","writeFile","mkdir","join","join","c","trace","resolve","join","COLORS","formatDuration","kindLabel","chalk","chalk","Command","chalk","Command","chalk","ora","Command","ora","chalk","Command","chalk","ora","Command","ora","chalk","Command","join","Command","join","Command","chalk","ora","Command","ora","chalk","Command","chalk","ora","Command","ora","chalk","Command","Command","join","chalk","Command","join","chalk","Command","join","Command","join","Command","join","Command","join","Command","join","unlink","Command","join","unlink","Command","join","cp","rm","readFile","rm","stat","join","join","stat","join","rm","join","yaml","join","join","Command","cp","rm","Command","join","readdir","unlink","join","join","c","unlink","readdir","Command","join","Command","join","resolve","copyFile","fileURLToPath","chalk","BUILT_IN_TEMPLATES_DIR","resolve","fileURLToPath","Command","chalk","join","copyFile","Command","chalk","join","DEFAULT_OPTIONS","formatDuration","formatTokens","truncate","timing","statusIcon","c","join","formatDuration","chalk","Command","writeFile","Command"]}
|