opencode-athena 0.0.1
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 +18 -0
- package/README.md +178 -0
- package/commands/athena-debug.md +338 -0
- package/commands/athena-dev.md +322 -0
- package/commands/athena-info.md +325 -0
- package/commands/athena-parallel.md +266 -0
- package/commands/athena-research.md +326 -0
- package/commands/athena-review.md +441 -0
- package/commands/athena-status.md +279 -0
- package/config/presets/enterprise.json +37 -0
- package/config/presets/minimal.json +34 -0
- package/config/presets/solo-quick.json +34 -0
- package/config/presets/standard.json +37 -0
- package/config/schemas/athena.schema.json +128 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +2185 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +628 -0
- package/dist/index.js +1360 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/index.d.ts +20 -0
- package/dist/plugin/index.js +1343 -0
- package/dist/plugin/index.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../src/cli/questions/models.ts","../../src/cli/index.ts","../../src/shared/constants.ts","../../src/cli/commands/doctor.ts","../../src/cli/utils/file-manager.ts","../../src/cli/utils/logger.ts","../../src/cli/utils/prerequisites.ts","../../src/cli/utils/validators.ts","../../src/shared/schemas.ts","../../src/cli/commands/info.ts","../../src/cli/commands/install.ts","../../src/cli/generators/config-generator.ts","../../src/cli/generators/athena-config.ts","../../src/cli/questions/features.ts","../../src/cli/generators/omo-config.ts","../../src/cli/generators/opencode-config.ts","../../src/cli/questions/index.ts","../../src/cli/questions/subscriptions.ts","../../src/cli/questions/methodology.ts","../../src/cli/questions/advanced.ts","../../src/cli/utils/preset-loader.ts","../../src/cli/commands/uninstall.ts","../../src/cli/commands/update.ts"],"names":["select","fileURLToPath","join","path","chalk","execAsync","promisify","exec","existsSync","readFileSync","info","ora","confirm","checkbox","dirname"],"mappings":"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","file":"index.js","sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Model selection questions\n *\n * Allow users to select specific models for each agent role.\n */\n\nimport { select } from \"@inquirer/prompts\";\nimport type { ModelAnswers, ModelChoice, SubscriptionAnswers } from \"../../shared/types.js\";\n\n/**\n * Default values for model questions\n */\nexport interface ModelDefaults {\n sisyphus?: string;\n oracle?: string;\n librarian?: string;\n frontend?: string;\n documentWriter?: string;\n multimodalLooker?: string;\n}\n\n/**\n * Available models by provider\n */\nconst AVAILABLE_MODELS: ModelChoice[] = [\n // Anthropic models\n {\n id: \"anthropic/claude-sonnet-4-5\",\n name: \"Claude Sonnet 4.5\",\n provider: \"anthropic\",\n description: \"Latest Sonnet - balanced performance and speed\",\n },\n {\n id: \"anthropic/claude-opus-4-5\",\n name: \"Claude Opus 4.5\",\n provider: \"anthropic\",\n description: \"Most capable Claude model\",\n },\n {\n id: \"anthropic/claude-sonnet-4-5-thinking\",\n name: \"Claude Sonnet 4.5 (Thinking)\",\n provider: \"anthropic\",\n description: \"Sonnet with extended thinking enabled\",\n },\n {\n id: \"anthropic/claude-opus-4-5-thinking\",\n name: \"Claude Opus 4.5 (Thinking)\",\n provider: \"anthropic\",\n description: \"Opus with extended thinking enabled\",\n },\n\n // OpenAI models\n {\n id: \"openai/gpt-4o\",\n name: \"GPT-4o\",\n provider: \"openai\",\n description: \"Fast multimodal model\",\n },\n {\n id: \"openai/gpt-5.1\",\n name: \"GPT-5.1\",\n provider: \"openai\",\n description: \"Latest GPT model\",\n },\n {\n id: \"openai/gpt-5.1-high\",\n name: \"GPT-5.1 High\",\n provider: \"openai\",\n description: \"GPT-5.1 with high reasoning effort\",\n },\n\n // Google models\n {\n id: \"google/gemini-2.5-pro\",\n name: \"Gemini 2.5 Pro\",\n provider: \"google\",\n description: \"Latest Gemini Pro model\",\n },\n {\n id: \"google/gemini-2.5-flash\",\n name: \"Gemini 2.5 Flash\",\n provider: \"google\",\n description: \"Fast Gemini model\",\n },\n {\n id: \"google/gemini-2.0-flash\",\n name: \"Gemini 2.0 Flash\",\n provider: \"google\",\n description: \"Previous generation fast model\",\n },\n];\n\n/**\n * Filter models based on enabled providers\n */\nexport function getAvailableModels(subscriptions: SubscriptionAnswers): ModelChoice[] {\n return AVAILABLE_MODELS.filter((model) => {\n if (model.provider === \"anthropic\" && !subscriptions.hasClaude) return false;\n if (model.provider === \"openai\" && !subscriptions.hasOpenAI) return false;\n if (model.provider === \"google\" && !subscriptions.hasGoogle) return false;\n return true;\n });\n}\n\n/**\n * Check if a model is available given the subscriptions\n */\nfunction isModelAvailable(modelId: string, availableModels: ModelChoice[]): boolean {\n return availableModels.some((m) => m.id === modelId);\n}\n\n/**\n * Get a fallback model when preset model is not available\n *\n * @param presetModel - The model from the preset\n * @param role - The agent role\n * @param subscriptions - The user's subscriptions\n * @param availableModels - List of available models\n * @returns A valid model ID, either the preset one or a fallback\n */\nfunction getValidModelOrFallback(\n presetModel: string | undefined,\n role: string,\n subscriptions: SubscriptionAnswers,\n availableModels: ModelChoice[]\n): string | undefined {\n // If preset model is available, use it\n if (presetModel && isModelAvailable(presetModel, availableModels)) {\n return presetModel;\n }\n\n // Otherwise use the role-based suggestion\n return getSuggestedModel(role, subscriptions, availableModels);\n}\n\n/**\n * Create choices for a select prompt\n */\nfunction createModelChoices(models: ModelChoice[]) {\n return models.map((model) => ({\n name: `${model.name} - ${model.description}`,\n value: model.id,\n }));\n}\n\n/**\n * Get a suggested default model for a role based on subscriptions\n */\nfunction getSuggestedModel(\n role: string,\n _subscriptions: SubscriptionAnswers,\n availableModels: ModelChoice[]\n): string | undefined {\n // Default suggestions based on role\n const suggestions: Record<string, string[]> = {\n sisyphus: [\n \"anthropic/claude-opus-4-5-thinking\",\n \"anthropic/claude-sonnet-4-5-thinking\",\n \"openai/gpt-5.1-high\",\n \"google/gemini-2.5-pro\",\n ],\n oracle: [\n \"openai/gpt-5.1-high\",\n \"anthropic/claude-opus-4-5-thinking\",\n \"anthropic/claude-sonnet-4-5-thinking\",\n \"google/gemini-2.5-pro\",\n ],\n librarian: [\"anthropic/claude-sonnet-4-5\", \"openai/gpt-4o\", \"google/gemini-2.5-flash\"],\n frontend: [\"anthropic/claude-sonnet-4-5\", \"google/gemini-2.5-pro\", \"openai/gpt-4o\"],\n documentWriter: [\"google/gemini-2.5-pro\", \"anthropic/claude-sonnet-4-5\", \"openai/gpt-4o\"],\n multimodalLooker: [\"google/gemini-2.5-flash\", \"openai/gpt-4o\", \"anthropic/claude-sonnet-4-5\"],\n };\n\n const roleDefaults = suggestions[role] || [];\n const availableIds = availableModels.map((m) => m.id);\n\n for (const modelId of roleDefaults) {\n if (availableIds.includes(modelId)) {\n return modelId;\n }\n }\n\n return availableModels[0]?.id;\n}\n\n/**\n * Gather model selections from user\n *\n * @param subscriptions - The user's provider subscriptions\n * @param defaults - Optional default values from a preset\n */\nexport async function gatherModels(\n subscriptions: SubscriptionAnswers,\n defaults?: ModelDefaults\n): Promise<ModelAnswers> {\n const availableModels = getAvailableModels(subscriptions);\n\n if (availableModels.length === 0) {\n throw new Error(\n \"No models available. Please enable at least one provider (Claude, OpenAI, or Google).\"\n );\n }\n\n const choices = createModelChoices(availableModels);\n\n // Get valid defaults (either from preset if available, or fallback)\n const sisyphusDefault = getValidModelOrFallback(\n defaults?.sisyphus,\n \"sisyphus\",\n subscriptions,\n availableModels\n );\n const oracleDefault = getValidModelOrFallback(\n defaults?.oracle,\n \"oracle\",\n subscriptions,\n availableModels\n );\n const librarianDefault = getValidModelOrFallback(\n defaults?.librarian,\n \"librarian\",\n subscriptions,\n availableModels\n );\n\n // Required agents\n const sisyphus = await select({\n message: \"Model for Sisyphus (main orchestrator - implements stories)?\",\n choices,\n default: sisyphusDefault,\n });\n\n const oracle = await select({\n message: \"Model for Oracle (debugging and complex reasoning)?\",\n choices,\n default: oracleDefault,\n });\n\n const librarian = await select({\n message: \"Model for Librarian (research and documentation lookup)?\",\n choices,\n default: librarianDefault,\n });\n\n // Optional agents - use defaults with fallback\n const frontend = getValidModelOrFallback(\n defaults?.frontend,\n \"frontend\",\n subscriptions,\n availableModels\n );\n const documentWriter = getValidModelOrFallback(\n defaults?.documentWriter,\n \"documentWriter\",\n subscriptions,\n availableModels\n );\n const multimodalLooker = getValidModelOrFallback(\n defaults?.multimodalLooker,\n \"multimodalLooker\",\n subscriptions,\n availableModels\n );\n\n return {\n sisyphus,\n oracle,\n librarian,\n frontend,\n documentWriter,\n multimodalLooker,\n };\n}\n\n/**\n * Get the list of available models (for display purposes)\n */\nexport function getModelList(subscriptions: SubscriptionAnswers): ModelChoice[] {\n return getAvailableModels(subscriptions);\n}\n\n/**\n * Validate that preset models are compatible with given subscriptions.\n * Returns warnings for any models that won't be available.\n */\nexport function validatePresetModels(\n presetModels: ModelDefaults,\n subscriptions: SubscriptionAnswers\n): string[] {\n const warnings: string[] = [];\n const availableModels = getAvailableModels(subscriptions);\n\n const checkModel = (model: string | undefined, role: string) => {\n if (model && !isModelAvailable(model, availableModels)) {\n warnings.push(\n `Preset model for ${role} (${model}) is not available with your subscriptions. A fallback will be used.`\n );\n }\n };\n\n checkModel(presetModels.sisyphus, \"Sisyphus\");\n checkModel(presetModels.oracle, \"Oracle\");\n checkModel(presetModels.librarian, \"Librarian\");\n checkModel(presetModels.frontend, \"Frontend\");\n checkModel(presetModels.documentWriter, \"Document Writer\");\n checkModel(presetModels.multimodalLooker, \"Multimodal Looker\");\n\n return warnings;\n}\n","/**\n * OpenCode Athena CLI\n *\n * Interactive installer and management tool for OpenCode Athena.\n */\n\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { DISPLAY_NAME, TAGLINE, VERSION } from \"../shared/constants.js\";\nimport { doctor } from \"./commands/doctor.js\";\nimport { info } from \"./commands/info.js\";\nimport { install } from \"./commands/install.js\";\nimport { uninstall } from \"./commands/uninstall.js\";\nimport { update } from \"./commands/update.js\";\nimport { listPresets } from \"./utils/preset-loader.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"opencode-athena\")\n .description(\n `${chalk.cyan(DISPLAY_NAME)} - ${TAGLINE}\\nUnified oh-my-opencode + BMAD METHOD toolkit for OpenCode`\n )\n .version(VERSION);\n\nprogram\n .command(\"install\")\n .description(\"Install and configure OpenCode Athena\")\n .option(\n \"-p, --preset <preset>\",\n \"Use a preset configuration (minimal, standard, enterprise, solo-quick)\",\n \"standard\"\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\", false)\n .option(\"--advanced\", \"Show advanced configuration options\", false)\n .option(\"--global\", \"Install globally (default)\", true)\n .option(\"--local\", \"Install to current project only\", false)\n .option(\"--list-presets\", \"List available presets and exit\", false)\n .action(async (options) => {\n // Handle --list-presets flag\n if (options.listPresets) {\n displayPresets();\n return;\n }\n await install(options);\n });\n\nprogram\n .command(\"update\")\n .description(\"Update OpenCode Athena to latest version\")\n .option(\"--check\", \"Check for updates without installing\", false)\n .action(update);\n\nprogram\n .command(\"doctor\")\n .description(\"Diagnose and fix common issues\")\n .option(\"--fix\", \"Automatically fix issues\", false)\n .action(doctor);\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove OpenCode Athena\")\n .option(\"--keep-config\", \"Keep configuration files\", false)\n .option(\"--keep-deps\", \"Keep npm dependencies\", false)\n .action(uninstall);\n\nprogram.command(\"info\").description(\"Show current configuration and status\").action(info);\n\n/**\n * Display available presets in a formatted way\n */\nfunction displayPresets(): void {\n console.log(chalk.bold.cyan(\"\\nAvailable Presets:\\n\"));\n\n const presets = listPresets();\n\n for (const preset of presets) {\n console.log(chalk.bold(` ${preset.name}`));\n console.log(chalk.gray(` ${preset.description}`));\n console.log();\n }\n\n console.log(chalk.gray(\"Usage: opencode-athena install --preset <name>\"));\n console.log(chalk.gray(\" opencode-athena install --preset standard --yes\\n\"));\n}\n\nprogram.parse();\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n/**\n * Current version of OpenCode Athena\n * Updated during release process\n */\nexport const VERSION = \"0.0.1\";\n\n/**\n * Package name for CLI display\n */\nexport const PACKAGE_NAME = \"opencode-athena\";\n\n/**\n * CLI display name\n */\nexport const DISPLAY_NAME = \"OpenCode Athena\";\n\n/**\n * Tagline for CLI header\n */\nexport const TAGLINE = \"Strategic wisdom meets practical execution\";\n\n/**\n * Configuration paths\n */\nexport const CONFIG_PATHS = {\n /** Global OpenCode config directory */\n globalConfigDir: join(homedir(), \".config\", \"opencode\"),\n\n /** Global Athena config file */\n globalAthenaConfig: join(homedir(), \".config\", \"opencode\", \"athena.json\"),\n\n /** Global OpenCode config file */\n globalOpencodeConfig: join(homedir(), \".config\", \"opencode\", \"opencode.json\"),\n\n /** Global oh-my-opencode config file */\n globalOmoConfig: join(homedir(), \".config\", \"opencode\", \"oh-my-opencode.json\"),\n\n /** Commands directory */\n commandsDir: join(homedir(), \".config\", \"opencode\", \"command\"),\n\n /** Plugin directory */\n pluginDir: join(homedir(), \".config\", \"opencode\", \"plugin\"),\n\n /** Athena state file (for story tracking) */\n stateFile: join(homedir(), \".config\", \"opencode\", \"athena-state.json\"),\n} as const;\n\n/**\n * Project-specific paths (relative to project root)\n */\nexport const PROJECT_PATHS = {\n /** Local Athena config */\n localConfig: \".opencode/athena.json\",\n\n /** BMAD directory */\n bmadDir: \"docs\",\n\n /** BMAD docs directory (deprecated - same as bmadDir in v6) */\n bmadDocsDir: \"docs\",\n\n /** Sprint status file */\n sprintStatus: \"docs/implementation-artifacts/sprint-status.yaml\",\n\n /** Stories directory */\n storiesDir: \"docs/implementation-artifacts/stories\",\n\n /** Architecture document */\n architecture: \"docs/project-planning-artifacts/architecture.md\",\n\n /** PRD document */\n prd: \"docs/project-planning-artifacts/PRD.md\",\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULTS = {\n /** Default BMAD track for new projects */\n defaultTrack: \"bmad-method\" as const,\n\n /** Whether to auto-update sprint status */\n autoStatusUpdate: true,\n\n /** Maximum parallel stories */\n parallelStoryLimit: 3,\n\n /** Default features enabled */\n features: {\n bmadBridge: true,\n autoStatus: true,\n parallelExecution: true,\n notifications: true,\n contextMonitor: true,\n commentChecker: true,\n lspTools: true,\n },\n\n /** Default MCPs enabled */\n mcps: {\n context7: true,\n exa: true,\n grepApp: true,\n },\n} as const;\n\n/**\n * Minimum compatible versions\n */\nexport const MIN_VERSIONS = {\n node: \"20.0.0\",\n opencode: \"1.0.132\",\n} as const;\n","/**\n * Doctor command\n *\n * Diagnose and fix common issues with OpenCode Athena installation.\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { CONFIG_PATHS } from \"../../shared/constants.js\";\nimport type { DoctorOptions } from \"../../shared/types.js\";\nimport { FileManager } from \"../utils/file-manager.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { checkOhMyOpenCode, checkPrerequisites, validateJsonFile } from \"../utils/prerequisites.js\";\nimport { validateAthenaConfig, validateJsonConfig } from \"../utils/validators.js\";\n\ninterface DiagnosticResult {\n name: string;\n status: \"pass\" | \"warn\" | \"fail\";\n message: string;\n fix?: () => Promise<void>;\n}\n\n/**\n * Main doctor command handler\n */\nexport async function doctor(options: DoctorOptions): Promise<void> {\n logger.banner();\n logger.section(\"Running Diagnostics\");\n\n const results: DiagnosticResult[] = [];\n const fileManager = new FileManager();\n\n // Check 1: Node.js version\n const prereqs = await checkPrerequisites();\n\n results.push({\n name: \"Node.js\",\n status: prereqs.node.installed ? (prereqs.node.compatible ? \"pass\" : \"warn\") : \"fail\",\n message: prereqs.node.installed\n ? prereqs.node.compatible\n ? `Version ${prereqs.node.version} is compatible`\n : `Version ${prereqs.node.version} detected, 20+ recommended`\n : \"Not installed\",\n });\n\n // Check 2: OpenCode installation\n results.push({\n name: \"OpenCode\",\n status: prereqs.opencode.installed ? (prereqs.opencode.compatible ? \"pass\" : \"warn\") : \"fail\",\n message: prereqs.opencode.installed\n ? prereqs.opencode.compatible\n ? `Version ${prereqs.opencode.version} is compatible`\n : `Version ${prereqs.opencode.version} detected, 1.0.132+ recommended`\n : \"Not installed\",\n });\n\n // Check 3: Athena config exists and is valid\n const athenaConfigValid = validateJsonFile(CONFIG_PATHS.globalAthenaConfig);\n if (athenaConfigValid.valid) {\n const config = fileManager.readJsonFile(CONFIG_PATHS.globalAthenaConfig);\n const schemaValidation = validateAthenaConfig(config);\n results.push({\n name: \"Athena Config\",\n status: schemaValidation.valid ? \"pass\" : \"warn\",\n message: schemaValidation.valid\n ? \"Valid configuration\"\n : `Schema issues: ${schemaValidation.errors.join(\", \")}`,\n });\n } else {\n results.push({\n name: \"Athena Config\",\n status: \"fail\",\n message: athenaConfigValid.error || \"Not found\",\n fix: async () => {\n logger.info(\"Run 'opencode-athena install' to create configuration\");\n },\n });\n }\n\n // Check 4: OpenCode config exists and is valid\n const opencodeConfigValid = validateJsonConfig(CONFIG_PATHS.globalOpencodeConfig);\n results.push({\n name: \"OpenCode Config\",\n status: opencodeConfigValid.valid ? \"pass\" : \"fail\",\n message: opencodeConfigValid.valid ? \"Valid JSON\" : opencodeConfigValid.errors[0] || \"Invalid\",\n });\n\n // Check 5: oh-my-opencode config exists and is valid\n const omoConfigValid = validateJsonConfig(CONFIG_PATHS.globalOmoConfig);\n results.push({\n name: \"oh-my-opencode Config\",\n status: omoConfigValid.valid ? \"pass\" : \"warn\",\n message: omoConfigValid.valid ? \"Valid JSON\" : omoConfigValid.errors[0] || \"Not found\",\n });\n\n // Check 6: oh-my-opencode is installed\n const omoInstalled = await checkOhMyOpenCode();\n results.push({\n name: \"oh-my-opencode Plugin\",\n status: omoInstalled.installed ? \"pass\" : \"fail\",\n message: omoInstalled.installed ? `Version ${omoInstalled.version}` : \"Not installed\",\n fix: async () => {\n const spinner = ora(\"Installing oh-my-opencode...\").start();\n try {\n await fileManager.installDependencies([\"oh-my-opencode\"]);\n spinner.succeed(\"oh-my-opencode installed\");\n } catch (err) {\n spinner.fail(\"Failed to install oh-my-opencode\");\n throw err;\n }\n },\n });\n\n // Check 7: Commands directory exists\n const commandsDirExists = fileManager.exists(CONFIG_PATHS.commandsDir);\n results.push({\n name: \"Commands Directory\",\n status: commandsDirExists ? \"pass\" : \"warn\",\n message: commandsDirExists ? \"Exists\" : \"Not found\",\n fix: async () => {\n const spinner = ora(\"Creating commands directory...\").start();\n try {\n await fileManager.ensureDir(CONFIG_PATHS.commandsDir);\n await fileManager.copyCommands();\n spinner.succeed(\"Commands directory created and populated\");\n } catch (err) {\n spinner.fail(\"Failed to create commands directory\");\n throw err;\n }\n },\n });\n\n // Display results\n logger.section(\"Diagnostic Results\");\n\n let hasFailures = false;\n let hasWarnings = false;\n const fixableIssues: DiagnosticResult[] = [];\n\n for (const result of results) {\n let icon: string;\n let color: (s: string) => string;\n\n switch (result.status) {\n case \"pass\":\n icon = \"✓\";\n color = chalk.green;\n break;\n case \"warn\":\n icon = \"!\";\n color = chalk.yellow;\n hasWarnings = true;\n break;\n case \"fail\":\n icon = \"✖\";\n color = chalk.red;\n hasFailures = true;\n if (result.fix) {\n fixableIssues.push(result);\n }\n break;\n }\n\n console.log(` ${color(icon)} ${result.name}: ${result.message}`);\n }\n\n console.log();\n\n // Summary\n if (hasFailures) {\n logger.error(\"Some checks failed.\");\n\n if (fixableIssues.length > 0 && options.fix) {\n logger.section(\"Applying Fixes\");\n\n for (const issue of fixableIssues) {\n if (issue.fix) {\n try {\n await issue.fix();\n } catch (err) {\n logger.error(\n `Failed to fix ${issue.name}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n }\n\n logger.blank();\n logger.info(\"Run 'opencode-athena doctor' again to verify fixes.\");\n } else if (fixableIssues.length > 0) {\n logger.info(`Run ${chalk.cyan(\"opencode-athena doctor --fix\")} to attempt automatic fixes.`);\n }\n } else if (hasWarnings) {\n logger.warn(\"Some checks have warnings, but Athena should work.\");\n } else {\n logger.success(\"All checks passed! OpenCode Athena is healthy.\");\n }\n}\n","/**\n * File Manager\n *\n * Handles file read/write operations for the CLI installer.\n */\n\nimport { exec } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { copyFile, mkdir, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { promisify } from \"node:util\";\nimport { CONFIG_PATHS } from \"../../shared/constants.js\";\nimport type { GeneratedFile } from \"../../shared/types.js\";\n\nconst execAsync = promisify(exec);\n\n/**\n * Get the package root directory (where commands/ and config/ live)\n * Handles both bundled and unbundled scenarios.\n */\nfunction getPackageRoot(): string {\n const currentFileDir = dirname(fileURLToPath(import.meta.url));\n\n // After tsup bundling: dist/cli/index.js -> 2 levels up to package root\n const bundledRoot = join(currentFileDir, \"..\", \"..\");\n if (existsSync(join(bundledRoot, \"commands\"))) {\n return bundledRoot;\n }\n\n // Unbundled development: src/cli/utils/file-manager.ts -> 3 levels up\n const devRoot = join(currentFileDir, \"..\", \"..\", \"..\");\n if (existsSync(join(devRoot, \"commands\"))) {\n return devRoot;\n }\n\n // Fallback to bundled root even if commands dir doesn't exist\n return bundledRoot;\n}\n\nexport class FileManager {\n private configDir: string;\n\n constructor(configDir?: string) {\n this.configDir = configDir || CONFIG_PATHS.globalConfigDir;\n }\n\n /**\n * Get the configuration directory path\n */\n getConfigDir(): string {\n return this.configDir;\n }\n\n /**\n * Ensure a directory exists\n */\n async ensureDir(dir: string): Promise<void> {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n }\n\n /**\n * Write multiple files atomically\n */\n async writeFiles(files: GeneratedFile[]): Promise<void> {\n for (const file of files) {\n const dir = dirname(file.path);\n await this.ensureDir(dir);\n await writeFile(file.path, file.content, \"utf-8\");\n }\n }\n\n /**\n * Read a JSON configuration file\n */\n readJsonFile<T = Record<string, unknown>>(path: string): T | null {\n if (!existsSync(path)) {\n return null;\n }\n\n try {\n const content = readFileSync(path, \"utf-8\");\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n }\n\n /**\n * Write a JSON configuration file\n */\n async writeJsonFile(path: string, data: unknown): Promise<void> {\n const dir = dirname(path);\n await this.ensureDir(dir);\n await writeFile(path, JSON.stringify(data, null, 2), \"utf-8\");\n }\n\n /**\n * Check if a file exists\n */\n exists(path: string): boolean {\n return existsSync(path);\n }\n\n /**\n * Install npm dependencies in the config directory\n */\n async installDependencies(packages: string[]): Promise<void> {\n if (packages.length === 0) return;\n\n // Ensure config directory exists\n await this.ensureDir(this.configDir);\n\n // Check if package.json exists, create if not\n const packageJsonPath = join(this.configDir, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n await writeFile(\n packageJsonPath,\n JSON.stringify(\n {\n name: \"opencode-config\",\n private: true,\n type: \"module\",\n },\n null,\n 2\n )\n );\n }\n\n // Install packages\n const packageList = packages.join(\" \");\n await execAsync(`npm install ${packageList}`, {\n cwd: this.configDir,\n timeout: 120000,\n });\n }\n\n /**\n * Uninstall npm dependencies from the config directory\n */\n async uninstallDependencies(packages: string[]): Promise<void> {\n if (packages.length === 0) return;\n\n const packageList = packages.join(\" \");\n try {\n await execAsync(`npm uninstall ${packageList}`, {\n cwd: this.configDir,\n timeout: 60000,\n });\n } catch {\n // Ignore errors if packages aren't installed\n }\n }\n\n /**\n * Copy bridge commands from package to config directory\n */\n async copyCommands(): Promise<string[]> {\n const commandsDir = CONFIG_PATHS.commandsDir;\n await this.ensureDir(commandsDir);\n\n const packageRoot = getPackageRoot();\n const sourceCommandsDir = join(packageRoot, \"commands\");\n\n const copiedFiles: string[] = [];\n\n if (existsSync(sourceCommandsDir)) {\n const files = await readdir(sourceCommandsDir);\n for (const file of files) {\n if (file.endsWith(\".md\")) {\n const sourcePath = join(sourceCommandsDir, file);\n const destPath = join(commandsDir, file);\n await copyFile(sourcePath, destPath);\n copiedFiles.push(file);\n }\n }\n }\n\n return copiedFiles;\n }\n\n /**\n * Remove bridge commands from config directory\n */\n async removeCommands(): Promise<string[]> {\n const commandsDir = CONFIG_PATHS.commandsDir;\n const removedFiles: string[] = [];\n\n if (!existsSync(commandsDir)) {\n return removedFiles;\n }\n\n const files = await readdir(commandsDir);\n for (const file of files) {\n if (file.startsWith(\"athena-\") && file.endsWith(\".md\")) {\n const filePath = join(commandsDir, file);\n await rm(filePath);\n removedFiles.push(file);\n }\n }\n\n return removedFiles;\n }\n\n /**\n * Remove Athena configuration files\n */\n async removeConfigFiles(): Promise<string[]> {\n const removedFiles: string[] = [];\n\n const filesToRemove = [CONFIG_PATHS.globalAthenaConfig, CONFIG_PATHS.stateFile];\n\n for (const file of filesToRemove) {\n if (existsSync(file)) {\n await rm(file);\n removedFiles.push(file);\n }\n }\n\n return removedFiles;\n }\n\n /**\n * Remove Athena from opencode.json plugin list\n */\n async removeFromOpencodeConfig(): Promise<boolean> {\n const opencodeConfig = this.readJsonFile<{\n plugin?: string[];\n [key: string]: unknown;\n }>(CONFIG_PATHS.globalOpencodeConfig);\n\n if (!opencodeConfig || !opencodeConfig.plugin) {\n return false;\n }\n\n const athenaPlugins = [\n \"opencode-athena\",\n \"oh-my-opencode\",\n \"opencode-antigravity-auth\",\n \"opencode-openai-codex-auth\",\n ];\n\n const originalLength = opencodeConfig.plugin.length;\n opencodeConfig.plugin = opencodeConfig.plugin.filter(\n (p) => !athenaPlugins.some((ap) => p.includes(ap))\n );\n\n if (opencodeConfig.plugin.length !== originalLength) {\n await this.writeJsonFile(CONFIG_PATHS.globalOpencodeConfig, opencodeConfig);\n return true;\n }\n\n return false;\n }\n\n /**\n * Backup a file before modifying\n */\n async backupFile(path: string): Promise<string | null> {\n if (!existsSync(path)) {\n return null;\n }\n\n const backupPath = `${path}.backup`;\n await copyFile(path, backupPath);\n return backupPath;\n }\n\n /**\n * Restore a file from backup\n */\n async restoreFromBackup(backupPath: string): Promise<void> {\n const originalPath = backupPath.replace(/\\.backup$/, \"\");\n if (existsSync(backupPath)) {\n await copyFile(backupPath, originalPath);\n await rm(backupPath);\n }\n }\n}\n","/**\n * Logger utility for CLI output\n *\n * Provides colored, consistent logging for the CLI.\n */\n\nimport chalk from \"chalk\";\n\nexport const logger = {\n /**\n * Log an informational message\n */\n info: (message: string): void => {\n console.log(chalk.blue(\"i\"), message);\n },\n\n /**\n * Log a success message\n */\n success: (message: string): void => {\n console.log(chalk.green(\"✓\"), message);\n },\n\n /**\n * Log a warning message\n */\n warn: (message: string): void => {\n console.log(chalk.yellow(\"!\"), message);\n },\n\n /**\n * Log an error message\n */\n error: (message: string): void => {\n console.log(chalk.red(\"✖\"), message);\n },\n\n /**\n * Log a debug message (only when DEBUG env var is set)\n */\n debug: (message: string): void => {\n if (process.env.DEBUG) {\n console.log(chalk.gray(\"[debug]\"), message);\n }\n },\n\n /**\n * Log a step in a process\n */\n step: (step: number, total: number, message: string): void => {\n console.log(chalk.cyan(`[${step}/${total}]`), message);\n },\n\n /**\n * Log a blank line\n */\n blank: (): void => {\n console.log();\n },\n\n /**\n * Log a section header\n */\n section: (title: string): void => {\n console.log();\n console.log(chalk.bold(title));\n console.log();\n },\n\n /**\n * Log a key-value pair\n */\n keyValue: (key: string, value: string, indent = 0): void => {\n const padding = \" \".repeat(indent);\n console.log(`${padding}${chalk.gray(`${key}:`)} ${value}`);\n },\n\n /**\n * Log a list item\n */\n listItem: (item: string, indent = 0): void => {\n const padding = \" \".repeat(indent);\n console.log(`${padding}${chalk.gray(\"-\")} ${item}`);\n },\n\n /**\n * Display the Athena banner\n */\n banner: (): void => {\n console.log(\n chalk.cyan(`\n╔═══════════════════════════════════════════════════════════════╗\n║ OPENCODE ATHENA ║\n║ Strategic Wisdom Meets Practical Execution ║\n╠═══════════════════════════════════════════════════════════════╣\n║ Unifying oh-my-opencode + BMAD METHOD for OpenCode ║\n╚═══════════════════════════════════════════════════════════════╝\n`)\n );\n },\n\n /**\n * Display a success banner\n */\n successBanner: (message: string): void => {\n const line = \"═\".repeat(message.length + 4);\n console.log(\n chalk.green(`\n╔${line}╗\n║ ${message} ║\n╚${line}╝\n`)\n );\n },\n};\n","/**\n * Prerequisites checker\n *\n * Validates that required dependencies and versions are available.\n */\n\nimport { exec } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { promisify } from \"node:util\";\nimport { CONFIG_PATHS, MIN_VERSIONS } from \"../../shared/constants.js\";\nimport type { Prerequisites } from \"../../shared/types.js\";\n\nconst execAsync = promisify(exec);\n\n/**\n * Parse a semantic version string into components\n */\nfunction parseVersion(version: string): { major: number; minor: number; patch: number } | null {\n const match = version.match(/^v?(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) return null;\n return {\n major: Number.parseInt(match[1], 10),\n minor: Number.parseInt(match[2], 10),\n patch: Number.parseInt(match[3], 10),\n };\n}\n\n/**\n * Compare two semantic versions\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nfunction compareVersions(a: string, b: string): number {\n const parsedA = parseVersion(a);\n const parsedB = parseVersion(b);\n\n if (!parsedA || !parsedB) return 0;\n\n if (parsedA.major !== parsedB.major) {\n return parsedA.major < parsedB.major ? -1 : 1;\n }\n if (parsedA.minor !== parsedB.minor) {\n return parsedA.minor < parsedB.minor ? -1 : 1;\n }\n if (parsedA.patch !== parsedB.patch) {\n return parsedA.patch < parsedB.patch ? -1 : 1;\n }\n return 0;\n}\n\n/**\n * Check Node.js version\n */\nasync function checkNode(): Promise<Prerequisites[\"node\"]> {\n try {\n const { stdout } = await execAsync(\"node --version\");\n const version = stdout.trim().replace(/^v/, \"\");\n const compatible = compareVersions(version, MIN_VERSIONS.node) >= 0;\n return { installed: true, version, compatible };\n } catch {\n return { installed: false, compatible: false };\n }\n}\n\n/**\n * Check OpenCode installation and version\n */\nasync function checkOpenCode(): Promise<Prerequisites[\"opencode\"]> {\n try {\n const { stdout } = await execAsync(\"opencode --version\");\n const version = stdout.trim();\n const compatible = compareVersions(version, MIN_VERSIONS.opencode) >= 0;\n return { installed: true, version, compatible };\n } catch {\n return { installed: false, compatible: false };\n }\n}\n\n/**\n * Check existing Athena installation\n */\nasync function checkAthena(): Promise<Prerequisites[\"athena\"]> {\n if (!existsSync(CONFIG_PATHS.globalAthenaConfig)) {\n return { installed: false };\n }\n\n try {\n const content = readFileSync(CONFIG_PATHS.globalAthenaConfig, \"utf-8\");\n const config = JSON.parse(content);\n return {\n installed: true,\n version: config.version,\n };\n } catch {\n return { installed: true };\n }\n}\n\n/**\n * Check all prerequisites\n */\nexport async function checkPrerequisites(): Promise<Prerequisites> {\n const [node, opencode, athena] = await Promise.all([checkNode(), checkOpenCode(), checkAthena()]);\n\n return { node, opencode, athena };\n}\n\n/**\n * Check if oh-my-opencode is installed\n */\nexport async function checkOhMyOpenCode(): Promise<{ installed: boolean; version?: string }> {\n try {\n const { stdout } = await execAsync(\"npm list oh-my-opencode --json\", {\n cwd: CONFIG_PATHS.globalConfigDir,\n });\n const data = JSON.parse(stdout);\n const version = data.dependencies?.[\"oh-my-opencode\"]?.version;\n return { installed: !!version, version };\n } catch {\n return { installed: false };\n }\n}\n\n/**\n * Get installed plugin versions from OpenCode config directory\n */\nexport async function getInstalledPlugins(): Promise<Record<string, string>> {\n try {\n const { stdout } = await execAsync(\"npm list --depth=0 --json\", {\n cwd: CONFIG_PATHS.globalConfigDir,\n });\n const data = JSON.parse(stdout);\n const deps = data.dependencies || {};\n const result: Record<string, string> = {};\n for (const [name, info] of Object.entries(deps)) {\n result[name] = (info as { version?: string }).version || \"unknown\";\n }\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * Check if a specific npm package is outdated\n */\nexport async function checkPackageUpdate(\n packageName: string\n): Promise<{ current?: string; latest?: string; updateAvailable: boolean }> {\n try {\n const { stdout } = await execAsync(`npm outdated ${packageName} --json`, {\n cwd: CONFIG_PATHS.globalConfigDir,\n });\n const data = JSON.parse(stdout);\n const info = data[packageName];\n if (info) {\n return {\n current: info.current,\n latest: info.latest,\n updateAvailable: info.current !== info.latest,\n };\n }\n return { updateAvailable: false };\n } catch {\n // npm outdated returns exit code 1 if packages are outdated\n // Try to parse the output anyway\n return { updateAvailable: false };\n }\n}\n\n/**\n * Validate that a config file is valid JSON\n */\nexport function validateJsonFile(path: string): { valid: boolean; error?: string } {\n if (!existsSync(path)) {\n return { valid: false, error: \"File does not exist\" };\n }\n\n try {\n const content = readFileSync(path, \"utf-8\");\n JSON.parse(content);\n return { valid: true };\n } catch (err) {\n return {\n valid: false,\n error: err instanceof Error ? err.message : \"Invalid JSON\",\n };\n }\n}\n","/**\n * Input validators\n *\n * Validation functions for CLI inputs and configuration.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport { AthenaConfigSchema, SprintStatusSchema } from \"../../shared/schemas.js\";\nimport type { AthenaConfig } from \"../../shared/types.js\";\n\n/**\n * Validation result structure\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate an Athena configuration object\n */\nexport function validateAthenaConfig(config: unknown): ValidationResult {\n const result: ValidationResult = { valid: true, errors: [], warnings: [] };\n\n const parseResult = AthenaConfigSchema.safeParse(config);\n\n if (!parseResult.success) {\n result.valid = false;\n for (const issue of parseResult.error.issues) {\n result.errors.push(`${issue.path.join(\".\")}: ${issue.message}`);\n }\n }\n\n return result;\n}\n\n/**\n * Validate a sprint-status.yaml file\n */\nexport function validateSprintStatus(path: string): ValidationResult {\n const result: ValidationResult = { valid: true, errors: [], warnings: [] };\n\n if (!existsSync(path)) {\n result.valid = false;\n result.errors.push(\"File does not exist\");\n return result;\n }\n\n try {\n const content = readFileSync(path, \"utf-8\");\n const data = parseYaml(content);\n const parseResult = SprintStatusSchema.safeParse(data);\n\n if (!parseResult.success) {\n result.valid = false;\n for (const issue of parseResult.error.issues) {\n result.errors.push(`${issue.path.join(\".\")}: ${issue.message}`);\n }\n }\n } catch (err) {\n result.valid = false;\n result.errors.push(err instanceof Error ? err.message : \"Invalid YAML\");\n }\n\n return result;\n}\n\n/**\n * Validate a JSON configuration file\n */\nexport function validateJsonConfig(path: string): ValidationResult {\n const result: ValidationResult = { valid: true, errors: [], warnings: [] };\n\n if (!existsSync(path)) {\n result.valid = false;\n result.errors.push(\"File does not exist\");\n return result;\n }\n\n try {\n const content = readFileSync(path, \"utf-8\");\n JSON.parse(content);\n } catch (err) {\n result.valid = false;\n result.errors.push(err instanceof Error ? err.message : \"Invalid JSON\");\n }\n\n return result;\n}\n\n/**\n * Validate model selection based on available providers\n */\nexport function validateModelForProvider(\n model: string,\n providers: { claude: boolean; openai: boolean; google: boolean }\n): ValidationResult {\n const result: ValidationResult = { valid: true, errors: [], warnings: [] };\n\n const modelLower = model.toLowerCase();\n\n // Check if model matches an enabled provider\n const claudeModels = [\"claude\", \"opus\", \"sonnet\", \"haiku\"];\n const openaiModels = [\"gpt\", \"o1\", \"o3\"];\n const googleModels = [\"gemini\", \"palm\"];\n\n const isClaude = claudeModels.some((m) => modelLower.includes(m));\n const isOpenAI = openaiModels.some((m) => modelLower.includes(m));\n const isGoogle = googleModels.some((m) => modelLower.includes(m));\n\n if (isClaude && !providers.claude) {\n result.valid = false;\n result.errors.push(\"Claude model selected but Claude provider is not enabled\");\n }\n\n if (isOpenAI && !providers.openai) {\n result.valid = false;\n result.errors.push(\"OpenAI model selected but OpenAI provider is not enabled\");\n }\n\n if (isGoogle && !providers.google) {\n result.valid = false;\n result.errors.push(\"Google model selected but Google provider is not enabled\");\n }\n\n return result;\n}\n\n/**\n * Check if Athena config has all required agent models configured\n */\nexport function validateAgentModels(config: AthenaConfig): ValidationResult {\n const result: ValidationResult = { valid: true, errors: [], warnings: [] };\n\n const requiredAgents = [\"sisyphus\", \"oracle\", \"librarian\"];\n\n const models = (config as AthenaConfig & { models?: Record<string, string> }).models || {};\n\n for (const agent of requiredAgents) {\n if (!models[agent]) {\n result.warnings.push(`No model configured for agent: ${agent}`);\n }\n }\n\n return result;\n}\n\n/**\n * Validate a preset name\n */\nexport function isValidPreset(preset: string): boolean {\n const validPresets = [\"minimal\", \"standard\", \"enterprise\", \"solo-quick\"];\n return validPresets.includes(preset);\n}\n\n/**\n * Validate story ID format\n */\nexport function isValidStoryId(storyId: string): boolean {\n // Accepts formats like \"2.3\", \"1.1\", \"10.15\", etc.\n return /^\\d+\\.\\d+$/.test(storyId);\n}\n\n/**\n * Sanitize a string for use in filenames\n */\nexport function sanitizeFilename(name: string): string {\n return name\n .replace(/[^a-zA-Z0-9_-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .toLowerCase();\n}\n","import { z } from \"zod\";\n\n/**\n * Zod validation schemas for OpenCode Athena\n */\n\n// ============================================================================\n// Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for subscription configuration\n */\nexport const SubscriptionSchema = z.object({\n claude: z.object({\n enabled: z.boolean(),\n tier: z.enum([\"max5x\", \"max20x\", \"pro\", \"none\"]),\n }),\n openai: z.object({\n enabled: z.boolean(),\n }),\n google: z.object({\n enabled: z.boolean(),\n authMethod: z.enum([\"antigravity\", \"personal\", \"api\", \"none\"]),\n }),\n});\n\n/**\n * Schema for BMAD configuration\n */\nexport const BmadConfigSchema = z.object({\n defaultTrack: z.enum([\"quick-flow\", \"bmad-method\", \"enterprise\"]),\n autoStatusUpdate: z.boolean(),\n parallelStoryLimit: z.number().int().min(0).max(10),\n});\n\n/**\n * Schema for feature flags\n */\nexport const FeaturesSchema = z.object({\n bmadBridge: z.boolean(),\n autoStatus: z.boolean(),\n parallelExecution: z.boolean(),\n notifications: z.boolean(),\n contextMonitor: z.boolean(),\n commentChecker: z.boolean(),\n lspTools: z.boolean(),\n});\n\n/**\n * Schema for MCP configuration\n */\nexport const McpsSchema = z.object({\n context7: z.boolean(),\n exa: z.boolean(),\n grepApp: z.boolean(),\n});\n\n/**\n * Schema for agent model assignments\n */\nexport const ModelsSchema = z.object({\n sisyphus: z.string().describe(\"Model for main orchestrator agent\"),\n oracle: z.string().describe(\"Model for debugging/reasoning agent\"),\n librarian: z.string().describe(\"Model for research/documentation agent\"),\n frontend: z.string().optional().describe(\"Model for UI/UX agent\"),\n documentWriter: z.string().optional().describe(\"Model for documentation generation agent\"),\n multimodalLooker: z.string().optional().describe(\"Model for image analysis agent\"),\n});\n\n/**\n * Complete Athena configuration schema\n */\nexport const AthenaConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.string(),\n subscriptions: SubscriptionSchema,\n models: ModelsSchema,\n bmad: BmadConfigSchema,\n features: FeaturesSchema,\n mcps: McpsSchema,\n});\n\n// ============================================================================\n// Tool Argument Schemas\n// ============================================================================\n\n/**\n * Schema for athena_get_story arguments\n */\nexport const GetStoryArgsSchema = z.object({\n storyId: z\n .string()\n .optional()\n .describe(\n \"Specific story ID (e.g., '2.3'). If omitted, loads the next pending story from sprint-status.yaml.\"\n ),\n});\n\n/**\n * Schema for athena_update_status arguments\n */\nexport const UpdateStatusArgsSchema = z.object({\n storyId: z.string().describe(\"The story ID (e.g., '2.3')\"),\n status: z\n .enum([\"in_progress\", \"completed\", \"blocked\", \"needs_review\"])\n .describe(\"The new status for the story\"),\n notes: z\n .string()\n .optional()\n .describe(\"Notes about the status change (required for 'blocked' status)\"),\n completionSummary: z\n .string()\n .optional()\n .describe(\"Summary of what was implemented (required for 'completed' status)\"),\n});\n\n/**\n * Schema for athena_get_context arguments\n */\nexport const GetContextArgsSchema = z.object({\n includeArchitecture: z.boolean().optional().default(true),\n includePrd: z.boolean().optional().default(false),\n includeSprintStatus: z.boolean().optional().default(true),\n});\n\n/**\n * Schema for athena_parallel arguments\n */\nexport const ParallelArgsSchema = z.object({\n storyIds: z.array(z.string()).describe(\"Array of story IDs to implement in parallel\"),\n maxConcurrent: z.number().int().min(1).max(5).optional().default(3),\n});\n\n/**\n * Schema for athena_config arguments\n */\nexport const ConfigArgsSchema = z.object({\n action: z.enum([\"get\", \"set\", \"reset\"]).describe(\"Configuration action to perform\"),\n key: z\n .string()\n .optional()\n .describe(\"Configuration key (dot notation, e.g., 'bmad.autoStatusUpdate')\"),\n value: z.unknown().optional().describe(\"Value to set (for 'set' action)\"),\n});\n\n// ============================================================================\n// Sprint Status Schema\n// ============================================================================\n\n/**\n * Story status enum for sprint tracking\n */\nexport const StoryStatusEnum = z.enum([\n \"pending\",\n \"in_progress\",\n \"completed\",\n \"blocked\",\n \"needs_review\",\n]);\n\n/**\n * Tracker status enum (includes transitional states)\n */\nexport const TrackerStatusEnum = z.enum([\n \"pending\",\n \"in_progress\",\n \"completed\",\n \"blocked\",\n \"needs_review\",\n \"loading\",\n]);\n\n/**\n * Schema for sprint-status.yaml content\n */\nexport const SprintStatusSchema = z.object({\n sprint_number: z.number().int().optional(),\n current_epic: z.string().optional(),\n current_story: z.string().nullable().optional(),\n completed_stories: z.array(z.string()).default([]),\n pending_stories: z.array(z.string()).default([]),\n in_progress_stories: z.array(z.string()).default([]),\n blocked_stories: z.array(z.string()).default([]),\n stories_needing_review: z.array(z.string()).optional(),\n story_updates: z\n .record(\n z.object({\n status: StoryStatusEnum,\n updated_at: z.string(),\n notes: z.string().optional(),\n completion_summary: z.string().optional(),\n })\n )\n .optional(),\n last_modified: z.string().optional(),\n});\n\n// ============================================================================\n// Type Exports (inferred from schemas)\n// ============================================================================\n\nexport type SubscriptionConfig = z.infer<typeof SubscriptionSchema>;\nexport type BmadConfig = z.infer<typeof BmadConfigSchema>;\nexport type FeaturesConfig = z.infer<typeof FeaturesSchema>;\nexport type McpsConfig = z.infer<typeof McpsSchema>;\nexport type ModelsConfig = z.infer<typeof ModelsSchema>;\nexport type AthenaConfigValidated = z.infer<typeof AthenaConfigSchema>;\nexport type SprintStatusValidated = z.infer<typeof SprintStatusSchema>;\n","/**\n * Info command\n *\n * Display current configuration and status.\n */\n\nimport chalk from \"chalk\";\nimport { CONFIG_PATHS, VERSION } from \"../../shared/constants.js\";\nimport type { AthenaConfig } from \"../../shared/types.js\";\nimport { FileManager } from \"../utils/file-manager.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { checkPrerequisites, getInstalledPlugins } from \"../utils/prerequisites.js\";\n\n/**\n * Main info command handler\n */\nexport async function info(): Promise<void> {\n logger.banner();\n\n const fileManager = new FileManager();\n\n // Load Athena config\n const athenaConfig = fileManager.readJsonFile<AthenaConfig>(CONFIG_PATHS.globalAthenaConfig);\n\n if (!athenaConfig) {\n logger.warn(\"OpenCode Athena is not installed.\");\n logger.info(`Run ${chalk.cyan(\"opencode-athena install\")} to get started.`);\n return;\n }\n\n // Version info\n logger.section(\"Version Information\");\n logger.keyValue(\"Athena Version\", athenaConfig.version || VERSION);\n\n // Prerequisites\n logger.section(\"Prerequisites\");\n const prereqs = await checkPrerequisites();\n\n const nodeStatus = prereqs.node.installed\n ? prereqs.node.compatible\n ? chalk.green(\"✓\")\n : chalk.yellow(\"!\")\n : chalk.red(\"✖\");\n logger.keyValue(\"Node.js\", `${nodeStatus} ${prereqs.node.version || \"not found\"}`);\n\n const opencodeStatus = prereqs.opencode.installed\n ? prereqs.opencode.compatible\n ? chalk.green(\"✓\")\n : chalk.yellow(\"!\")\n : chalk.red(\"✖\");\n logger.keyValue(\"OpenCode\", `${opencodeStatus} ${prereqs.opencode.version || \"not found\"}`);\n\n // Subscriptions\n logger.section(\"Configured Providers\");\n\n const claudeStatus = athenaConfig.subscriptions.claude.enabled\n ? chalk.green(\"enabled\")\n : chalk.gray(\"disabled\");\n logger.keyValue(\n \"Claude\",\n `${claudeStatus}${athenaConfig.subscriptions.claude.tier !== \"none\" ? ` (${athenaConfig.subscriptions.claude.tier})` : \"\"}`\n );\n\n const openaiStatus = athenaConfig.subscriptions.openai.enabled\n ? chalk.green(\"enabled\")\n : chalk.gray(\"disabled\");\n logger.keyValue(\"OpenAI\", openaiStatus);\n\n const googleStatus = athenaConfig.subscriptions.google.enabled\n ? chalk.green(\"enabled\")\n : chalk.gray(\"disabled\");\n logger.keyValue(\n \"Google\",\n `${googleStatus}${athenaConfig.subscriptions.google.authMethod !== \"none\" ? ` (${athenaConfig.subscriptions.google.authMethod})` : \"\"}`\n );\n\n // Models\n logger.section(\"Agent Models\");\n logger.keyValue(\"Sisyphus\", athenaConfig.models.sisyphus);\n logger.keyValue(\"Oracle\", athenaConfig.models.oracle);\n logger.keyValue(\"Librarian\", athenaConfig.models.librarian);\n if (athenaConfig.models.frontend) {\n logger.keyValue(\"Frontend\", athenaConfig.models.frontend);\n }\n if (athenaConfig.models.documentWriter) {\n logger.keyValue(\"Doc Writer\", athenaConfig.models.documentWriter);\n }\n if (athenaConfig.models.multimodalLooker) {\n logger.keyValue(\"Multimodal\", athenaConfig.models.multimodalLooker);\n }\n\n // BMAD settings\n logger.section(\"BMAD Settings\");\n logger.keyValue(\"Default Track\", athenaConfig.bmad.defaultTrack);\n logger.keyValue(\"Auto Status Update\", athenaConfig.bmad.autoStatusUpdate ? \"yes\" : \"no\");\n logger.keyValue(\"Parallel Story Limit\", athenaConfig.bmad.parallelStoryLimit.toString());\n\n // Features\n logger.section(\"Features\");\n const features = athenaConfig.features;\n const featureList = [\n { name: \"BMAD Bridge\", enabled: features.bmadBridge },\n { name: \"Auto Status\", enabled: features.autoStatus },\n { name: \"Parallel Exec\", enabled: features.parallelExecution },\n { name: \"Notifications\", enabled: features.notifications },\n { name: \"Context Monitor\", enabled: features.contextMonitor },\n { name: \"Comment Checker\", enabled: features.commentChecker },\n { name: \"LSP Tools\", enabled: features.lspTools },\n ];\n\n for (const feature of featureList) {\n const status = feature.enabled ? chalk.green(\"on\") : chalk.gray(\"off\");\n logger.keyValue(feature.name, status);\n }\n\n // MCPs\n logger.section(\"MCP Servers\");\n const mcps = athenaConfig.mcps;\n logger.keyValue(\"context7\", mcps.context7 ? chalk.green(\"on\") : chalk.gray(\"off\"));\n logger.keyValue(\"exa\", mcps.exa ? chalk.green(\"on\") : chalk.gray(\"off\"));\n logger.keyValue(\"grep_app\", mcps.grepApp ? chalk.green(\"on\") : chalk.gray(\"off\"));\n\n // Installed plugins\n logger.section(\"Installed Plugins\");\n const plugins = await getInstalledPlugins();\n\n if (Object.keys(plugins).length === 0) {\n logger.info(\"No plugins installed in OpenCode config directory\");\n } else {\n for (const [name, version] of Object.entries(plugins)) {\n logger.keyValue(name, version);\n }\n }\n\n // Configuration paths\n logger.section(\"Configuration Paths\");\n logger.keyValue(\"Config Dir\", CONFIG_PATHS.globalConfigDir);\n logger.keyValue(\"Athena Config\", CONFIG_PATHS.globalAthenaConfig);\n logger.keyValue(\"Commands Dir\", CONFIG_PATHS.commandsDir);\n\n console.log();\n}\n","/**\n * Install command\n *\n * Interactive installer for OpenCode Athena.\n * Supports presets for quick configuration.\n */\n\nimport { confirm, select } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { DEFAULTS } from \"../../shared/constants.js\";\nimport type { InstallAnswers, InstallOptions, SubscriptionAnswers } from \"../../shared/types.js\";\nimport { ConfigGenerator } from \"../generators/config-generator.js\";\nimport {\n gatherAdvanced,\n gatherFeatures,\n gatherMethodology,\n gatherModels,\n gatherSubscriptions,\n validatePresetModels,\n} from \"../questions/index.js\";\nimport { FileManager } from \"../utils/file-manager.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { checkPrerequisites } from \"../utils/prerequisites.js\";\nimport {\n PRESET_NAMES,\n type PresetConfig,\n type PresetDefaults,\n formatPresetSummary,\n isValidPresetName,\n listPresets,\n loadPreset,\n presetToDefaults,\n} from \"../utils/preset-loader.js\";\n\n/**\n * Main install command handler\n */\nexport async function install(options: InstallOptions): Promise<void> {\n // Display banner\n logger.banner();\n\n // Step 1: Check prerequisites\n const spinner = ora(\"Checking prerequisites...\").start();\n\n const prereqs = await checkPrerequisites();\n\n if (!prereqs.node.installed) {\n spinner.fail(\"Node.js not found\");\n logger.error(\"Please install Node.js 20+ first: https://nodejs.org/\");\n process.exit(1);\n }\n\n if (!prereqs.node.compatible) {\n spinner.warn(`Node.js ${prereqs.node.version} detected. Recommended: 20+`);\n }\n\n if (!prereqs.opencode.installed) {\n spinner.fail(\"OpenCode not found\");\n logger.error(\"Please install OpenCode first: https://opencode.ai/docs\");\n process.exit(1);\n }\n\n if (!prereqs.opencode.compatible) {\n spinner.warn(`OpenCode ${prereqs.opencode.version} detected. Recommended: 1.0.132+`);\n } else {\n spinner.succeed(`OpenCode ${prereqs.opencode.version || \"\"} detected`);\n }\n\n // Check for existing installation\n if (prereqs.athena.installed && !options.yes) {\n const overwrite = await confirm({\n message: `OpenCode Athena ${prereqs.athena.version || \"\"} is already installed. Overwrite configuration?`,\n default: false,\n });\n if (!overwrite) {\n logger.info(\"Installation cancelled.\");\n process.exit(0);\n }\n }\n\n // Step 2: Handle preset loading\n let preset: PresetConfig | null = null;\n let presetDefaults: PresetDefaults | null = null;\n let presetName: string | null = null;\n\n // Validate and load preset from --preset flag\n if (options.preset && options.preset !== \"none\") {\n if (!isValidPresetName(options.preset)) {\n logger.error(`Invalid preset: \"${options.preset}\"`);\n logger.info(`Valid presets: ${PRESET_NAMES.join(\", \")}`);\n process.exit(1);\n }\n\n try {\n preset = loadPreset(options.preset);\n presetDefaults = presetToDefaults(preset);\n presetName = options.preset;\n logger.success(`Loaded preset: ${options.preset}`);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n }\n\n // If no preset specified via flag, ask interactively (unless --yes)\n if (!preset && !options.yes) {\n const selectedPreset = await askForPreset();\n if (selectedPreset) {\n preset = selectedPreset.preset;\n presetDefaults = presetToDefaults(preset);\n presetName = selectedPreset.name;\n }\n }\n\n // Step 3: Always gather subscription information (regardless of preset)\n logger.section(\"LLM Subscriptions\");\n\n const subscriptions = await gatherSubscriptions();\n\n // Step 4: If preset loaded, show summary and ask if they want to customize\n let shouldCustomize = true;\n\n if (preset && presetDefaults && presetName) {\n // Check if preset models are compatible with subscriptions\n const modelWarnings = validatePresetModels(presetDefaults.models, subscriptions);\n if (modelWarnings.length > 0) {\n console.log(chalk.yellow(\"\\nPreset model compatibility warnings:\"));\n for (const warning of modelWarnings) {\n console.log(chalk.yellow(` - ${warning}`));\n }\n console.log();\n }\n\n // Show preset summary\n console.log(chalk.bold(\"\\nPreset Configuration:\\n\"));\n console.log(chalk.gray(formatPresetSummary(preset, presetName)));\n console.log();\n\n // Ask if they want to customize (unless --yes flag)\n if (options.yes) {\n shouldCustomize = false;\n logger.info(\"Using preset defaults (--yes flag)\");\n } else {\n shouldCustomize = await confirm({\n message: \"Would you like to customize these settings?\",\n default: false,\n });\n }\n }\n\n // Step 5: Gather configuration (with preset defaults if available)\n let models: InstallAnswers[\"models\"];\n let methodology: InstallAnswers[\"methodology\"];\n let features: InstallAnswers[\"features\"];\n let advanced: InstallAnswers[\"advanced\"];\n\n if (!shouldCustomize && presetDefaults) {\n // Use preset defaults directly (validated against subscriptions)\n logger.section(\"Applying Preset Configuration\");\n\n // For models, we still need to validate and potentially substitute\n const availableModels = await import(\"../questions/models.js\").then((m) =>\n m.getAvailableModels(subscriptions)\n );\n\n // Fail early if no models are available\n if (availableModels.length === 0) {\n logger.error(\n \"No models available. Please enable at least one provider (Claude, OpenAI, or Google).\"\n );\n process.exit(1);\n }\n\n models = {\n sisyphus: getValidModelOrFirst(presetDefaults.models.sisyphus, availableModels),\n oracle: getValidModelOrFirst(presetDefaults.models.oracle, availableModels),\n librarian: getValidModelOrFirst(presetDefaults.models.librarian, availableModels),\n frontend: getValidModelOrFirst(presetDefaults.models.frontend, availableModels),\n documentWriter: getValidModelOrFirst(presetDefaults.models.documentWriter, availableModels),\n multimodalLooker: getValidModelOrFirst(\n presetDefaults.models.multimodalLooker,\n availableModels\n ),\n };\n\n methodology = presetDefaults.methodology;\n features = presetDefaults.features;\n advanced = presetDefaults.advanced;\n\n logger.success(\"Preset configuration applied\");\n } else {\n // Interactive configuration (with preset defaults if available)\n\n // Model selection\n logger.section(\"Model Selection\");\n models = await gatherModels(subscriptions, presetDefaults?.models);\n\n // Methodology preferences\n logger.section(\"Methodology Preferences\");\n methodology = await gatherMethodology(presetDefaults?.methodology);\n\n // Feature selection\n logger.section(\"Feature Selection\");\n features = await gatherFeatures(presetDefaults?.features);\n\n // Advanced options (optional, unless --advanced flag)\n if (options.advanced) {\n logger.section(\"Advanced Configuration\");\n advanced = await gatherAdvanced(presetDefaults?.advanced);\n } else {\n advanced = presetDefaults?.advanced ?? {\n parallelStoryLimit: DEFAULTS.parallelStoryLimit,\n experimental: [],\n };\n }\n }\n\n // Step 6: Generate configuration\n logger.section(\"Generating Configuration\");\n\n const answers: InstallAnswers = {\n subscriptions,\n models,\n methodology,\n features,\n advanced,\n installLocation: options.local ? \"local\" : \"global\",\n };\n\n const generator = new ConfigGenerator(answers);\n const files = await generator.generate();\n\n // Step 7: Preview files\n console.log(chalk.bold(\"Files to be created/modified:\\n\"));\n for (const file of files) {\n const action = file.exists ? chalk.yellow(\"update\") : chalk.green(\"create\");\n console.log(chalk.gray(` [${action}] ${file.path}`));\n }\n console.log();\n\n // Step 8: Confirm installation\n if (!options.yes) {\n const proceed = await confirm({\n message: \"Proceed with installation?\",\n default: true,\n });\n\n if (!proceed) {\n logger.info(\"Installation cancelled.\");\n process.exit(0);\n }\n }\n\n // Step 9: Install\n const installSpinner = ora(\"Installing OpenCode Athena...\").start();\n\n try {\n const fileManager = new FileManager(generator.getConfigDir());\n\n // Write configuration files\n await fileManager.writeFiles(files);\n installSpinner.text = \"Configuration files written...\";\n\n // Install npm dependencies\n const packages = generator.getRequiredPackages();\n if (packages.length > 0) {\n installSpinner.text = `Installing dependencies: ${packages.join(\", \")}...`;\n await fileManager.installDependencies(packages);\n }\n\n // Copy command files\n installSpinner.text = \"Installing commands...\";\n const copiedCommands = await fileManager.copyCommands();\n\n installSpinner.succeed(\"Installation complete!\");\n\n if (copiedCommands.length > 0) {\n logger.info(`Installed ${copiedCommands.length} bridge commands`);\n }\n } catch (error) {\n installSpinner.fail(\"Installation failed\");\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n // Step 10: Print next steps\n printNextSteps(subscriptions);\n}\n\n/**\n * Ask user if they want to start from a preset\n */\nasync function askForPreset(): Promise<{ preset: PresetConfig; name: string } | null> {\n const presets = listPresets();\n\n const choices = [\n { name: \"No preset - Configure everything manually\", value: \"none\" },\n ...presets.map((p) => ({\n name: `${p.name} - ${p.description}`,\n value: p.name,\n })),\n ];\n\n const selected = await select({\n message: \"Start from a preset?\",\n choices,\n default: \"standard\",\n });\n\n if (selected === \"none\") {\n return null;\n }\n\n try {\n const preset = loadPreset(selected);\n return { preset, name: selected };\n } catch (error) {\n logger.warn(`Failed to load preset: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n}\n\n/**\n * Get a valid model ID or fall back to the first available model\n */\nfunction getValidModelOrFirst(\n modelId: string | undefined,\n availableModels: Array<{ id: string }>\n): string {\n if (modelId && availableModels.some((m) => m.id === modelId)) {\n return modelId;\n }\n return availableModels[0]?.id ?? \"\";\n}\n\n/**\n * Print next steps after installation\n */\nfunction printNextSteps(subscriptions: SubscriptionAnswers): void {\n const steps: string[] = [];\n\n if (subscriptions.hasClaude) {\n steps.push(`Run: ${chalk.cyan(\"opencode auth login\")} -> Select Anthropic -> Claude Pro/Max`);\n }\n\n if (subscriptions.hasOpenAI) {\n steps.push(`Run: ${chalk.cyan(\"opencode auth login\")} -> Select OpenAI -> ChatGPT Plus/Pro`);\n }\n\n if (subscriptions.hasGoogle) {\n steps.push(`Run: ${chalk.cyan(\"opencode auth login\")} -> Select Google -> OAuth with Google`);\n }\n\n logger.successBanner(\"OPENCODE ATHENA INSTALLED SUCCESSFULLY!\");\n\n console.log(chalk.bold(\"Next Steps:\\n\"));\n steps.forEach((step, i) => {\n console.log(` ${i + 1}. ${step}`);\n });\n\n console.log(chalk.bold(\"\\nThen start OpenCode and try:\\n\"));\n console.log(` ${chalk.cyan(\"/athena-dev\")} Implement a BMAD story with Sisyphus`);\n console.log(` ${chalk.cyan(\"/athena-status\")} Check sprint status`);\n console.log(` ${chalk.cyan(\"/athena-info\")} View toolkit configuration`);\n\n console.log(chalk.bold(\"\\nFor BMAD project setup:\\n\"));\n console.log(` ${chalk.cyan(\"npx bmad-method@alpha install\")} Install BMAD in your project`);\n\n console.log(\n chalk.gray(\"\\nDocumentation: https://github.com/ZebulonRouseFrantzich/opencode-athena\")\n );\n console.log();\n}\n","/**\n * Config Generator\n *\n * Orchestrates generation of all configuration files.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { CONFIG_PATHS } from \"../../shared/constants.js\";\nimport type { GeneratedFile, InstallAnswers } from \"../../shared/types.js\";\nimport { generateAthenaConfig } from \"./athena-config.js\";\nimport { generateOmoConfig } from \"./omo-config.js\";\nimport { generateOpencodeConfig, getRequiredPlugins } from \"./opencode-config.js\";\n\nexport class ConfigGenerator {\n private answers: InstallAnswers;\n private configDir: string;\n\n constructor(answers: InstallAnswers) {\n this.answers = answers;\n this.configDir =\n answers.installLocation === \"local\"\n ? join(process.cwd(), \".opencode\")\n : CONFIG_PATHS.globalConfigDir;\n }\n\n /**\n * Get the configuration directory path\n */\n getConfigDir(): string {\n return this.configDir;\n }\n\n /**\n * Generate all configuration files\n */\n async generate(): Promise<GeneratedFile[]> {\n const files: GeneratedFile[] = [];\n\n // Generate opencode.json\n const opencodeConfig = await generateOpencodeConfig(this.answers, this.configDir);\n files.push({\n path: join(this.configDir, \"opencode.json\"),\n content: JSON.stringify(opencodeConfig, null, 2),\n exists: existsSync(join(this.configDir, \"opencode.json\")),\n });\n\n // Generate oh-my-opencode.json\n const omoConfig = generateOmoConfig(this.answers);\n files.push({\n path: join(this.configDir, \"oh-my-opencode.json\"),\n content: JSON.stringify(omoConfig, null, 2),\n exists: existsSync(join(this.configDir, \"oh-my-opencode.json\")),\n });\n\n // Generate athena.json\n const athenaConfig = generateAthenaConfig(this.answers);\n files.push({\n path: join(this.configDir, \"athena.json\"),\n content: JSON.stringify(athenaConfig, null, 2),\n exists: existsSync(join(this.configDir, \"athena.json\")),\n });\n\n return files;\n }\n\n /**\n * Get the list of npm packages to install\n */\n getRequiredPackages(): string[] {\n return getRequiredPlugins(this.answers);\n }\n}\n","/**\n * Athena config generator\n *\n * Generates the athena.json configuration file.\n */\n\nimport { VERSION } from \"../../shared/constants.js\";\nimport type { InstallAnswers } from \"../../shared/types.js\";\nimport { featuresToFlags, mcpsToFlags } from \"../questions/features.js\";\n\n/**\n * Generate athena.json configuration\n */\nexport function generateAthenaConfig(answers: InstallAnswers): Record<string, unknown> {\n const { subscriptions, models, methodology, features, advanced } = answers;\n\n return {\n $schema:\n \"https://raw.githubusercontent.com/ZebulonRouseFrantzich/opencode-athena/main/config/schemas/athena.schema.json\",\n version: VERSION,\n subscriptions: {\n claude: {\n enabled: subscriptions.hasClaude,\n tier: subscriptions.claudeTier,\n },\n openai: {\n enabled: subscriptions.hasOpenAI,\n },\n google: {\n enabled: subscriptions.hasGoogle,\n authMethod: subscriptions.googleAuth,\n },\n },\n models: {\n sisyphus: models.sisyphus,\n oracle: models.oracle,\n librarian: models.librarian,\n frontend: models.frontend,\n documentWriter: models.documentWriter,\n multimodalLooker: models.multimodalLooker,\n },\n bmad: {\n defaultTrack: methodology.defaultTrack,\n autoStatusUpdate: methodology.autoStatusUpdate,\n parallelStoryLimit: advanced.parallelStoryLimit ?? 3,\n },\n features: featuresToFlags(features.enabledFeatures),\n mcps: mcpsToFlags(features.mcps),\n };\n}\n","/**\n * Feature questions\n *\n * Gather feature toggle preferences.\n */\n\nimport { checkbox } from \"@inquirer/prompts\";\nimport type { FeatureAnswers } from \"../../shared/types.js\";\n\n/**\n * Default values for feature questions\n */\nexport interface FeatureDefaults {\n enabledFeatures?: string[];\n mcps?: string[];\n}\n\n/**\n * Available features with descriptions\n */\nconst AVAILABLE_FEATURES = [\n {\n name: \"BMAD Bridge Commands (/athena-dev, /athena-review, etc.)\",\n value: \"bmad-bridge\",\n },\n {\n name: \"Auto Sprint Status Updates - Update sprint-status.yaml automatically\",\n value: \"auto-status\",\n },\n {\n name: \"Parallel Story Execution - Work on multiple stories simultaneously\",\n value: \"parallel\",\n },\n {\n name: \"Session Notifications - Desktop notifications for completions\",\n value: \"notifications\",\n },\n {\n name: \"Context Window Monitoring - Track context usage\",\n value: \"context-monitor\",\n },\n {\n name: \"Comment Checker - Ensure code is not over-commented\",\n value: \"comment-checker\",\n },\n {\n name: \"LSP Refactoring Tools - Enable lsp_rename, lsp_find_references, etc.\",\n value: \"lsp-tools\",\n },\n];\n\n/**\n * All feature values for reference\n */\nconst ALL_FEATURE_VALUES = AVAILABLE_FEATURES.map((f) => f.value);\n\n/**\n * Available MCP servers with descriptions\n */\nconst AVAILABLE_MCPS = [\n {\n name: \"context7 - Documentation lookup and context retrieval\",\n value: \"context7\",\n },\n {\n name: \"websearch_exa - Web search capabilities\",\n value: \"exa\",\n },\n {\n name: \"grep_app - GitHub code search\",\n value: \"grep_app\",\n },\n];\n\n/**\n * All MCP values for reference\n */\nconst ALL_MCP_VALUES = AVAILABLE_MCPS.map((m) => m.value);\n\n/**\n * Create choices with checked state based on defaults\n */\nfunction createFeatureChoices(defaults?: string[]) {\n // If no defaults provided, check all by default\n const enabledSet = new Set(defaults ?? ALL_FEATURE_VALUES);\n\n return AVAILABLE_FEATURES.map((feature) => ({\n ...feature,\n checked: enabledSet.has(feature.value),\n }));\n}\n\n/**\n * Create MCP choices with checked state based on defaults\n */\nfunction createMcpChoices(defaults?: string[]) {\n // If no defaults provided, check all by default\n const enabledSet = new Set(defaults ?? ALL_MCP_VALUES);\n\n return AVAILABLE_MCPS.map((mcp) => ({\n ...mcp,\n checked: enabledSet.has(mcp.value),\n }));\n}\n\n/**\n * Gather feature selections from user\n *\n * @param defaults - Optional default values from a preset\n */\nexport async function gatherFeatures(defaults?: FeatureDefaults): Promise<FeatureAnswers> {\n const enabledFeatures = await checkbox({\n message: \"Select features to enable:\",\n choices: createFeatureChoices(defaults?.enabledFeatures),\n });\n\n const mcps = await checkbox({\n message: \"Select MCP servers to enable:\",\n choices: createMcpChoices(defaults?.mcps),\n });\n\n return {\n enabledFeatures,\n mcps,\n };\n}\n\n/**\n * Get feature flags from enabled features array\n */\nexport function featuresToFlags(enabledFeatures: string[]): Record<string, boolean> {\n return {\n bmadBridge: enabledFeatures.includes(\"bmad-bridge\"),\n autoStatus: enabledFeatures.includes(\"auto-status\"),\n parallelExecution: enabledFeatures.includes(\"parallel\"),\n notifications: enabledFeatures.includes(\"notifications\"),\n contextMonitor: enabledFeatures.includes(\"context-monitor\"),\n commentChecker: enabledFeatures.includes(\"comment-checker\"),\n lspTools: enabledFeatures.includes(\"lsp-tools\"),\n };\n}\n\n/**\n * Get MCP flags from enabled MCPs array\n */\nexport function mcpsToFlags(mcps: string[]): Record<string, boolean> {\n return {\n context7: mcps.includes(\"context7\"),\n exa: mcps.includes(\"exa\"),\n grepApp: mcps.includes(\"grep_app\"),\n };\n}\n","/**\n * oh-my-opencode config generator\n *\n * Generates the oh-my-opencode.json configuration file.\n */\n\nimport type { InstallAnswers } from \"../../shared/types.js\";\n\n/**\n * Generate oh-my-opencode.json configuration\n */\nexport function generateOmoConfig(answers: InstallAnswers): Record<string, unknown> {\n const { subscriptions, models, features, advanced } = answers;\n\n const config: Record<string, unknown> = {\n $schema:\n \"https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json\",\n };\n\n // Google auth toggle - if using antigravity, disable built-in auth\n if (subscriptions.hasGoogle && subscriptions.googleAuth === \"antigravity\") {\n config.google_auth = false;\n }\n\n // Agent model configuration\n config.agents = {\n // Main orchestrator\n Sisyphus: {\n model: models.sisyphus,\n },\n // Debugging/reasoning agent\n oracle: {\n model: models.oracle,\n },\n // Research agent\n librarian: {\n model: models.librarian,\n },\n // UI/UX agent\n \"frontend-ui-ux-engineer\": {\n model: models.frontend || models.sisyphus,\n },\n // Documentation agent\n \"document-writer\": {\n model: models.documentWriter || models.librarian,\n },\n // Image analysis agent\n \"multimodal-looker\": {\n model: models.multimodalLooker || models.librarian,\n },\n };\n\n // Disabled hooks based on features\n const disabledHooks: string[] = [];\n\n if (!features.enabledFeatures.includes(\"context-monitor\")) {\n disabledHooks.push(\"context-window-monitor\");\n }\n if (!features.enabledFeatures.includes(\"comment-checker\")) {\n disabledHooks.push(\"comment-checker\");\n }\n if (!features.enabledFeatures.includes(\"notifications\")) {\n disabledHooks.push(\"session-notification\", \"background-notification\");\n }\n\n if (disabledHooks.length > 0) {\n config.disabled_hooks = disabledHooks;\n }\n\n // Disabled MCPs\n const allMcps = [\"context7\", \"websearch_exa\", \"grep_app\"];\n const enabledMcpIds = features.mcps.map((mcp) => {\n // Map feature names to MCP names\n if (mcp === \"exa\") return \"websearch_exa\";\n return mcp;\n });\n const disabledMcps = allMcps.filter((mcp) => !enabledMcpIds.includes(mcp));\n\n if (disabledMcps.length > 0) {\n config.disabled_mcps = disabledMcps;\n }\n\n // Experimental features\n if (advanced.experimental && advanced.experimental.length > 0) {\n config.experimental = {};\n\n if (advanced.experimental.includes(\"aggressive-truncation\")) {\n (config.experimental as Record<string, unknown>).aggressive_truncation = true;\n }\n if (advanced.experimental.includes(\"auto-resume\")) {\n (config.experimental as Record<string, unknown>).auto_resume = true;\n }\n }\n\n return config;\n}\n","/**\n * OpenCode config generator\n *\n * Generates and updates the opencode.json configuration file.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { InstallAnswers } from \"../../shared/types.js\";\n\n/**\n * Generate opencode.json configuration\n */\nexport async function generateOpencodeConfig(\n answers: InstallAnswers,\n configDir: string\n): Promise<Record<string, unknown>> {\n // Load existing config if present\n const configPath = join(configDir, \"opencode.json\");\n let existingConfig: Record<string, unknown> = {};\n\n if (existsSync(configPath)) {\n try {\n const content = readFileSync(configPath, \"utf-8\");\n existingConfig = JSON.parse(content);\n } catch {\n // Ignore parse errors, start fresh\n }\n }\n\n // Build plugin array\n const plugins: string[] = [\"opencode-athena/plugin\", \"oh-my-opencode\"];\n\n if (answers.subscriptions.hasGoogle && answers.subscriptions.googleAuth === \"antigravity\") {\n plugins.push(\"opencode-antigravity-auth\");\n }\n\n if (answers.subscriptions.hasOpenAI) {\n plugins.push(\"opencode-openai-codex-auth\");\n }\n\n // Merge with existing config\n const existingPlugins = (existingConfig.plugin as string[]) || [];\n const mergedPlugins = [...new Set([...existingPlugins, ...plugins])];\n\n const config: Record<string, unknown> = {\n ...existingConfig,\n $schema: existingConfig.$schema || \"https://opencode.ai/config.json\",\n plugin: mergedPlugins,\n };\n\n // Add provider configs if Claude subscription\n if (answers.subscriptions.hasClaude) {\n const existingProvider = (existingConfig.provider as Record<string, unknown>) || {};\n const existingAnthropic = (existingProvider.anthropic as Record<string, unknown>) || {};\n const existingAnthropicModels = (existingAnthropic.models as Record<string, unknown>) || {};\n\n config.provider = {\n ...existingProvider,\n anthropic: {\n ...existingAnthropic,\n models: {\n ...existingAnthropicModels,\n // Add thinking model variants\n \"claude-opus-4-5-thinking\": {\n id: \"claude-opus-4-5\",\n options: {\n thinking: {\n type: \"enabled\",\n budgetTokens: 32000,\n },\n },\n },\n \"claude-sonnet-4-5-thinking\": {\n id: \"claude-sonnet-4-5\",\n options: {\n thinking: {\n type: \"enabled\",\n budgetTokens: 10000,\n },\n },\n },\n },\n },\n };\n }\n\n // Add OpenAI provider config if present\n if (answers.subscriptions.hasOpenAI) {\n const existingProvider = (config.provider as Record<string, unknown>) || {};\n const existingOpenAI = (existingProvider.openai as Record<string, unknown>) || {};\n const existingOpenAIModels = (existingOpenAI.models as Record<string, unknown>) || {};\n\n config.provider = {\n ...existingProvider,\n openai: {\n ...existingOpenAI,\n models: {\n ...existingOpenAIModels,\n // Add reasoning effort configurations\n \"gpt-5.1-high\": {\n id: \"gpt-5.1\",\n options: {\n reasoningEffort: \"high\",\n reasoningSummary: \"auto\",\n },\n },\n },\n },\n };\n }\n\n return config;\n}\n\n/**\n * Get the list of plugins to install based on answers\n */\nexport function getRequiredPlugins(answers: InstallAnswers): string[] {\n const plugins: string[] = [\"opencode-athena\", \"oh-my-opencode\"];\n\n if (answers.subscriptions.hasGoogle && answers.subscriptions.googleAuth === \"antigravity\") {\n plugins.push(\"opencode-antigravity-auth\");\n }\n\n if (answers.subscriptions.hasOpenAI) {\n plugins.push(\"opencode-openai-codex-auth\");\n }\n\n return plugins;\n}\n","/**\n * Questions index\n *\n * Re-exports all question gathering functions and types.\n */\n\nexport { gatherSubscriptions } from \"./subscriptions.js\";\nexport {\n gatherModels,\n getModelList,\n getAvailableModels,\n validatePresetModels,\n type ModelDefaults,\n} from \"./models.js\";\nexport { gatherMethodology, type MethodologyDefaults } from \"./methodology.js\";\nexport {\n gatherFeatures,\n featuresToFlags,\n mcpsToFlags,\n type FeatureDefaults,\n} from \"./features.js\";\nexport { gatherAdvanced, type AdvancedDefaults } from \"./advanced.js\";\n","/**\n * Subscription questions\n *\n * Gather information about which LLM providers the user has access to.\n */\n\nimport { confirm, select } from \"@inquirer/prompts\";\nimport type { SubscriptionAnswers } from \"../../shared/types.js\";\n\n/**\n * Gather subscription information from user\n */\nexport async function gatherSubscriptions(): Promise<SubscriptionAnswers> {\n const hasClaude = await confirm({\n message: \"Do you have a Claude Pro/Max subscription?\",\n default: true,\n });\n\n let claudeTier: SubscriptionAnswers[\"claudeTier\"] = \"none\";\n if (hasClaude) {\n claudeTier = await select({\n message: \"Which Claude tier?\",\n choices: [\n { name: \"Max 5x - 5x more usage than Pro\", value: \"max5x\" as const },\n { name: \"Max 20x - 20x more usage than Pro\", value: \"max20x\" as const },\n { name: \"Pro - Standard Pro subscription\", value: \"pro\" as const },\n ],\n });\n }\n\n const hasOpenAI = await confirm({\n message: \"Do you have a ChatGPT Plus/Pro subscription?\",\n default: true,\n });\n\n const hasGoogle = await confirm({\n message: \"Will you use Google/Gemini models?\",\n default: true,\n });\n\n let googleAuth: SubscriptionAnswers[\"googleAuth\"] = \"none\";\n if (hasGoogle) {\n googleAuth = await select({\n message: \"Google authentication method?\",\n choices: [\n {\n name: \"Google Workspace (Antigravity OAuth) - Recommended for Workspace users\",\n value: \"antigravity\" as const,\n },\n {\n name: \"Personal Google Account\",\n value: \"personal\" as const,\n },\n {\n name: \"API Key - Direct API access\",\n value: \"api\" as const,\n },\n ],\n });\n }\n\n return {\n hasClaude,\n claudeTier,\n hasOpenAI,\n hasGoogle,\n googleAuth,\n };\n}\n","/**\n * Methodology questions\n *\n * Gather BMAD methodology preferences.\n */\n\nimport { confirm, select } from \"@inquirer/prompts\";\nimport type { MethodologyAnswers } from \"../../shared/types.js\";\n\n/**\n * Default values for methodology questions\n */\nexport interface MethodologyDefaults {\n defaultTrack?: \"quick-flow\" | \"bmad-method\" | \"enterprise\";\n autoStatusUpdate?: boolean;\n}\n\n/**\n * Gather methodology preferences from user\n *\n * @param defaults - Optional default values from a preset\n */\nexport async function gatherMethodology(\n defaults?: MethodologyDefaults\n): Promise<MethodologyAnswers> {\n const defaultTrack = await select({\n message: \"Default BMAD track for new projects?\",\n choices: [\n {\n name: \"Quick Flow - Fast implementation for small features and bug fixes\",\n value: \"quick-flow\" as const,\n },\n {\n name: \"BMad Method - Full planning for products and platforms (recommended)\",\n value: \"bmad-method\" as const,\n },\n {\n name: \"Enterprise - Extended planning with compliance and scale considerations\",\n value: \"enterprise\" as const,\n },\n ],\n default: defaults?.defaultTrack ?? \"bmad-method\",\n });\n\n const autoStatusUpdate = await confirm({\n message: \"Automatically update sprint-status.yaml when stories complete?\",\n default: defaults?.autoStatusUpdate ?? true,\n });\n\n return {\n defaultTrack,\n autoStatusUpdate,\n };\n}\n","/**\n * Advanced questions\n *\n * Gather advanced configuration options.\n */\n\nimport { checkbox, select } from \"@inquirer/prompts\";\nimport type { AdvancedAnswers } from \"../../shared/types.js\";\n\n/**\n * Default values for advanced questions\n */\nexport interface AdvancedDefaults {\n parallelStoryLimit?: number;\n experimental?: string[];\n}\n\n/**\n * Gather advanced options from user\n *\n * @param defaults - Optional default values from a preset\n */\nexport async function gatherAdvanced(defaults?: AdvancedDefaults): Promise<AdvancedAnswers> {\n const parallelStoryLimit = await select({\n message: \"Maximum parallel stories?\",\n choices: [\n { name: \"1 (sequential - one story at a time)\", value: 1 },\n { name: \"2\", value: 2 },\n { name: \"3 (recommended)\", value: 3 },\n { name: \"5\", value: 5 },\n { name: \"Unlimited (0)\", value: 0 },\n ],\n default: defaults?.parallelStoryLimit ?? 3,\n });\n\n // Determine which experimental features are checked by default\n const experimentalDefaults = new Set(defaults?.experimental ?? []);\n\n const experimental = await checkbox({\n message: \"Enable experimental features?\",\n choices: [\n {\n name: \"Aggressive Truncation - More aggressive context management\",\n value: \"aggressive-truncation\",\n checked: experimentalDefaults.has(\"aggressive-truncation\"),\n },\n {\n name: \"Auto Resume - Automatically resume interrupted sessions\",\n value: \"auto-resume\",\n checked: experimentalDefaults.has(\"auto-resume\"),\n },\n ],\n });\n\n return {\n parallelStoryLimit,\n experimental,\n };\n}\n","/**\n * Preset Loader Utility\n *\n * Loads and processes preset configuration files for the CLI installer.\n * Presets provide default values for features, models, and settings.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AdvancedAnswers,\n FeatureAnswers,\n MethodologyAnswers,\n ModelAnswers,\n} from \"../../shared/types.js\";\n\n/**\n * Preset configuration structure (matches preset JSON files)\n */\nexport interface PresetConfig {\n $schema?: string;\n version: string;\n description: string;\n /** Recommended subscriptions - for documentation only, not used as defaults */\n subscriptions: {\n claude: { enabled: boolean; tier: string };\n openai: { enabled: boolean };\n google: { enabled: boolean; authMethod: string };\n };\n models: {\n sisyphus: string;\n oracle: string;\n librarian: string;\n frontend?: string;\n documentWriter?: string;\n multimodalLooker?: string;\n };\n bmad: {\n defaultTrack: \"quick-flow\" | \"bmad-method\" | \"enterprise\";\n autoStatusUpdate: boolean;\n parallelStoryLimit: number;\n };\n features: {\n bmadBridge: boolean;\n autoStatus: boolean;\n parallelExecution: boolean;\n notifications: boolean;\n contextMonitor: boolean;\n commentChecker: boolean;\n lspTools: boolean;\n };\n mcps: {\n context7: boolean;\n exa: boolean;\n grepApp: boolean;\n };\n}\n\n/**\n * Preset summary for display purposes\n */\nexport interface PresetSummary {\n name: string;\n description: string;\n path: string;\n}\n\n/**\n * Defaults derived from a preset\n */\nexport interface PresetDefaults {\n models: ModelAnswers;\n methodology: MethodologyAnswers;\n features: FeatureAnswers;\n advanced: AdvancedAnswers;\n}\n\n/**\n * Valid preset names\n */\nexport const PRESET_NAMES = [\"minimal\", \"standard\", \"enterprise\", \"solo-quick\"] as const;\nexport type PresetName = (typeof PRESET_NAMES)[number];\n\n/**\n * Get the path to the presets directory.\n * Handles both development and bundled scenarios.\n */\nfunction getPresetsDir(): string {\n const currentFileDir = dirname(fileURLToPath(import.meta.url));\n\n // After tsup bundling: dist/cli/index.js -> 2 levels up to package root\n const bundledRoot = join(currentFileDir, \"..\", \"..\");\n const bundledPresetsDir = join(bundledRoot, \"config\", \"presets\");\n if (existsSync(bundledPresetsDir)) {\n return bundledPresetsDir;\n }\n\n // Unbundled development: src/cli/utils/preset-loader.ts -> 3 levels up\n const devRoot = join(currentFileDir, \"..\", \"..\", \"..\");\n const devPresetsDir = join(devRoot, \"config\", \"presets\");\n if (existsSync(devPresetsDir)) {\n return devPresetsDir;\n }\n\n // Fallback: check if we're in node_modules\n const nodeModulesPath = currentFileDir.split(\"node_modules\")[0];\n if (nodeModulesPath !== currentFileDir) {\n const packagePresetsDir = join(\n nodeModulesPath,\n \"node_modules\",\n \"opencode-athena\",\n \"config\",\n \"presets\"\n );\n if (existsSync(packagePresetsDir)) {\n return packagePresetsDir;\n }\n }\n\n throw new Error(\n `Could not find presets directory. Searched:\\n - ${bundledPresetsDir}\\n - ${devPresetsDir}`\n );\n}\n\n/**\n * Check if a preset name is valid\n */\nexport function isValidPresetName(name: string): name is PresetName {\n return PRESET_NAMES.includes(name as PresetName);\n}\n\n/**\n * Load a preset configuration by name\n *\n * @param name - The preset name (minimal, standard, enterprise, solo-quick)\n * @returns The parsed preset configuration\n * @throws Error if preset is not found or invalid\n */\nexport function loadPreset(name: string): PresetConfig {\n if (!isValidPresetName(name)) {\n const validNames = PRESET_NAMES.join(\", \");\n throw new Error(`Invalid preset name: \"${name}\". Valid presets are: ${validNames}`);\n }\n\n const presetsDir = getPresetsDir();\n const presetPath = join(presetsDir, `${name}.json`);\n\n if (!existsSync(presetPath)) {\n throw new Error(\n `Preset file not found: ${presetPath}\\nThis may indicate a corrupted installation. Try reinstalling opencode-athena.`\n );\n }\n\n try {\n const content = readFileSync(presetPath, \"utf-8\");\n const preset = JSON.parse(content) as PresetConfig;\n\n // Validate required fields\n if (!preset.version || !preset.models || !preset.bmad || !preset.features) {\n throw new Error(`Preset \"${name}\" is missing required fields`);\n }\n\n return preset;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Invalid JSON in preset file: ${presetPath}\\nError: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * List all available presets with their descriptions\n *\n * @returns Array of preset summaries\n */\nexport function listPresets(): PresetSummary[] {\n const presetsDir = getPresetsDir();\n const summaries: PresetSummary[] = [];\n\n for (const name of PRESET_NAMES) {\n const presetPath = join(presetsDir, `${name}.json`);\n\n if (existsSync(presetPath)) {\n try {\n const content = readFileSync(presetPath, \"utf-8\");\n const preset = JSON.parse(content) as PresetConfig;\n summaries.push({\n name,\n description: preset.description || `${name} preset`,\n path: presetPath,\n });\n } catch {\n // Skip invalid presets\n summaries.push({\n name,\n description: `${name} preset (unable to read)`,\n path: presetPath,\n });\n }\n }\n }\n\n return summaries;\n}\n\n/**\n * Convert a preset configuration to default values for the install wizard.\n *\n * Note: Subscriptions are NOT included - they are always gathered from the user.\n *\n * @param preset - The preset configuration\n * @returns Default values for models, methodology, features, and advanced settings\n */\nexport function presetToDefaults(preset: PresetConfig): PresetDefaults {\n return {\n models: {\n sisyphus: preset.models.sisyphus,\n oracle: preset.models.oracle,\n librarian: preset.models.librarian,\n frontend: preset.models.frontend,\n documentWriter: preset.models.documentWriter,\n multimodalLooker: preset.models.multimodalLooker,\n },\n methodology: {\n defaultTrack: preset.bmad.defaultTrack,\n autoStatusUpdate: preset.bmad.autoStatusUpdate,\n },\n features: {\n enabledFeatures: flagsToFeatures(preset.features),\n mcps: flagsToMcps(preset.mcps),\n },\n advanced: {\n parallelStoryLimit: preset.bmad.parallelStoryLimit,\n experimental: [],\n },\n };\n}\n\n/**\n * Convert feature flags object to enabled features array.\n * Reverse of featuresToFlags() in features.ts\n */\nfunction flagsToFeatures(flags: PresetConfig[\"features\"]): string[] {\n const features: string[] = [];\n\n if (flags.bmadBridge) features.push(\"bmad-bridge\");\n if (flags.autoStatus) features.push(\"auto-status\");\n if (flags.parallelExecution) features.push(\"parallel\");\n if (flags.notifications) features.push(\"notifications\");\n if (flags.contextMonitor) features.push(\"context-monitor\");\n if (flags.commentChecker) features.push(\"comment-checker\");\n if (flags.lspTools) features.push(\"lsp-tools\");\n\n return features;\n}\n\n/**\n * Convert MCP flags object to enabled MCPs array.\n * Reverse of mcpsToFlags() in features.ts\n */\nfunction flagsToMcps(mcps: PresetConfig[\"mcps\"]): string[] {\n const result: string[] = [];\n\n if (mcps.context7) result.push(\"context7\");\n if (mcps.exa) result.push(\"exa\");\n if (mcps.grepApp) result.push(\"grep_app\");\n\n return result;\n}\n\n/**\n * Get a formatted summary of a preset for display\n *\n * @param preset - The preset configuration\n * @param name - The preset name\n * @returns Formatted string describing the preset\n */\nexport function formatPresetSummary(preset: PresetConfig, name: string): string {\n const lines: string[] = [];\n\n lines.push(`Preset: ${name}`);\n lines.push(`Description: ${preset.description}`);\n lines.push(\"\");\n lines.push(\"Models:\");\n lines.push(` Sisyphus: ${preset.models.sisyphus}`);\n lines.push(` Oracle: ${preset.models.oracle}`);\n lines.push(` Librarian: ${preset.models.librarian}`);\n\n lines.push(\"\");\n lines.push(\"BMAD Settings:\");\n lines.push(` Default Track: ${preset.bmad.defaultTrack}`);\n lines.push(` Auto Status Update: ${preset.bmad.autoStatusUpdate ? \"Yes\" : \"No\"}`);\n lines.push(` Parallel Story Limit: ${preset.bmad.parallelStoryLimit}`);\n\n lines.push(\"\");\n lines.push(\"Features:\");\n const enabledFeatures = flagsToFeatures(preset.features);\n if (enabledFeatures.length > 0) {\n lines.push(` Enabled: ${enabledFeatures.join(\", \")}`);\n } else {\n lines.push(\" Enabled: none\");\n }\n\n lines.push(\"\");\n lines.push(\"MCP Servers:\");\n const enabledMcps = flagsToMcps(preset.mcps);\n if (enabledMcps.length > 0) {\n lines.push(` Enabled: ${enabledMcps.join(\", \")}`);\n } else {\n lines.push(\" Enabled: none\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Uninstall command\n *\n * Remove OpenCode Athena configuration and dependencies.\n */\n\nimport { confirm } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport type { UninstallOptions } from \"../../shared/types.js\";\nimport { FileManager } from \"../utils/file-manager.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Main uninstall command handler\n */\nexport async function uninstall(options: UninstallOptions): Promise<void> {\n logger.banner();\n\n logger.warn(\"This will remove OpenCode Athena from your system.\");\n console.log();\n\n // Confirm uninstall\n const proceed = await confirm({\n message: \"Are you sure you want to uninstall OpenCode Athena?\",\n default: false,\n });\n\n if (!proceed) {\n logger.info(\"Uninstall cancelled.\");\n return;\n }\n\n logger.section(\"Uninstalling OpenCode Athena\");\n\n const fileManager = new FileManager();\n\n // Step 1: Remove bridge commands\n const commandsSpinner = ora(\"Removing bridge commands...\").start();\n try {\n const removedCommands = await fileManager.removeCommands();\n if (removedCommands.length > 0) {\n commandsSpinner.succeed(`Removed ${removedCommands.length} bridge command(s)`);\n } else {\n commandsSpinner.info(\"No bridge commands found\");\n }\n } catch (err) {\n commandsSpinner.fail(\"Failed to remove bridge commands\");\n logger.error(err instanceof Error ? err.message : String(err));\n }\n\n // Step 2: Remove config files (unless --keep-config)\n if (!options.keepConfig) {\n const configSpinner = ora(\"Removing configuration files...\").start();\n try {\n const removedFiles = await fileManager.removeConfigFiles();\n if (removedFiles.length > 0) {\n configSpinner.succeed(`Removed ${removedFiles.length} configuration file(s)`);\n } else {\n configSpinner.info(\"No Athena configuration files found\");\n }\n } catch (err) {\n configSpinner.fail(\"Failed to remove configuration files\");\n logger.error(err instanceof Error ? err.message : String(err));\n }\n } else {\n logger.info(\"Keeping configuration files (--keep-config)\");\n }\n\n // Step 3: Remove from opencode.json\n const opencodeSpinner = ora(\"Updating opencode.json...\").start();\n try {\n const updated = await fileManager.removeFromOpencodeConfig();\n if (updated) {\n opencodeSpinner.succeed(\"Removed Athena plugins from opencode.json\");\n } else {\n opencodeSpinner.info(\"No Athena plugins found in opencode.json\");\n }\n } catch (err) {\n opencodeSpinner.fail(\"Failed to update opencode.json\");\n logger.error(err instanceof Error ? err.message : String(err));\n }\n\n // Step 4: Remove npm dependencies (unless --keep-deps)\n if (!options.keepDeps) {\n const depsSpinner = ora(\"Removing npm dependencies...\").start();\n try {\n const packagesToRemove = [\n \"oh-my-opencode\",\n \"opencode-antigravity-auth\",\n \"opencode-openai-codex-auth\",\n ];\n await fileManager.uninstallDependencies(packagesToRemove);\n depsSpinner.succeed(\"Removed npm dependencies\");\n } catch (_err) {\n depsSpinner.warn(\"Some dependencies could not be removed\");\n }\n } else {\n logger.info(\"Keeping npm dependencies (--keep-deps)\");\n }\n\n console.log();\n logger.success(\"OpenCode Athena has been uninstalled.\");\n\n if (options.keepConfig) {\n logger.info(\"Configuration files were preserved.\");\n logger.info(`Run ${chalk.cyan(\"opencode-athena install\")} to reinstall with existing config.`);\n }\n\n console.log();\n}\n","/**\n * Update command\n *\n * Check for and apply updates to OpenCode Athena and its dependencies.\n */\n\nimport { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { confirm } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { VERSION } from \"../../shared/constants.js\";\nimport type { UpdateOptions } from \"../../shared/types.js\";\nimport { FileManager } from \"../utils/file-manager.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { getInstalledPlugins } from \"../utils/prerequisites.js\";\n\nconst execAsync = promisify(exec);\n\ninterface PackageUpdate {\n name: string;\n current: string;\n latest: string;\n updateAvailable: boolean;\n}\n\n/**\n * Check npm registry for latest version of a package\n */\nasync function getLatestVersion(packageName: string): Promise<string | null> {\n try {\n const { stdout } = await execAsync(`npm view ${packageName} version`);\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Get update information for a package\n */\nasync function checkPackageUpdate(name: string, currentVersion: string): Promise<PackageUpdate> {\n const latest = await getLatestVersion(name);\n return {\n name,\n current: currentVersion,\n latest: latest || currentVersion,\n updateAvailable: latest !== null && latest !== currentVersion,\n };\n}\n\n/**\n * Main update command handler\n */\nexport async function update(options: UpdateOptions): Promise<void> {\n logger.banner();\n logger.section(\"Checking for Updates\");\n\n const spinner = ora(\"Checking package versions...\").start();\n\n // Get installed plugins\n const installedPlugins = await getInstalledPlugins();\n\n // Check for updates\n const packagesToCheck = [\n \"oh-my-opencode\",\n \"opencode-antigravity-auth\",\n \"opencode-openai-codex-auth\",\n ];\n\n const updates: PackageUpdate[] = [];\n\n // Check opencode-athena itself\n const athenaLatest = await getLatestVersion(\"opencode-athena\");\n if (athenaLatest) {\n updates.push({\n name: \"opencode-athena\",\n current: VERSION,\n latest: athenaLatest,\n updateAvailable: athenaLatest !== VERSION,\n });\n }\n\n // Check installed plugins\n for (const pkgName of packagesToCheck) {\n const currentVersion = installedPlugins[pkgName];\n if (currentVersion) {\n const updateInfo = await checkPackageUpdate(pkgName, currentVersion);\n updates.push(updateInfo);\n }\n }\n\n spinner.stop();\n\n // Display results\n logger.section(\"Package Versions\");\n\n const updatesAvailable = updates.filter((u) => u.updateAvailable);\n\n for (const pkg of updates) {\n const status = pkg.updateAvailable\n ? chalk.yellow(`${pkg.current} -> ${pkg.latest}`)\n : chalk.green(pkg.current);\n logger.keyValue(pkg.name, status);\n }\n\n console.log();\n\n if (updatesAvailable.length === 0) {\n logger.success(\"All packages are up to date!\");\n return;\n }\n\n logger.info(`${updatesAvailable.length} update(s) available`);\n\n // If check only, stop here\n if (options.check) {\n console.log();\n logger.info(`Run ${chalk.cyan(\"opencode-athena update\")} (without --check) to apply updates.`);\n return;\n }\n\n // Confirm update\n const proceed = await confirm({\n message: `Update ${updatesAvailable.length} package(s)?`,\n default: true,\n });\n\n if (!proceed) {\n logger.info(\"Update cancelled.\");\n return;\n }\n\n // Apply updates\n logger.section(\"Applying Updates\");\n\n const fileManager = new FileManager();\n\n // Update opencode-athena if needed\n const athenaUpdate = updatesAvailable.find((u) => u.name === \"opencode-athena\");\n if (athenaUpdate) {\n const athenaSpinner = ora(\"Updating opencode-athena...\").start();\n try {\n await execAsync(\"npm install -g opencode-athena@latest\");\n athenaSpinner.succeed(`opencode-athena updated to ${athenaUpdate.latest}`);\n } catch (err) {\n athenaSpinner.fail(\"Failed to update opencode-athena\");\n logger.error(err instanceof Error ? err.message : String(err));\n }\n }\n\n // Update plugins\n const pluginUpdates = updatesAvailable.filter((u) => u.name !== \"opencode-athena\");\n if (pluginUpdates.length > 0) {\n const pluginSpinner = ora(\"Updating plugins...\").start();\n try {\n const packages = pluginUpdates.map((u) => `${u.name}@latest`);\n await fileManager.installDependencies(packages);\n pluginSpinner.succeed(`Updated ${pluginUpdates.length} plugin(s)`);\n } catch (err) {\n pluginSpinner.fail(\"Failed to update plugins\");\n logger.error(err instanceof Error ? err.message : String(err));\n }\n }\n\n // Copy latest commands\n const commandsSpinner = ora(\"Updating bridge commands...\").start();\n try {\n await fileManager.copyCommands();\n commandsSpinner.succeed(\"Bridge commands updated\");\n } catch (_err) {\n commandsSpinner.warn(\"Could not update bridge commands\");\n }\n\n console.log();\n logger.success(\"Update complete!\");\n logger.info(\"Restart OpenCode to use the updated version.\");\n}\n"]}
|