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":["../../src/plugin/utils/notifications.ts","../../src/plugin/hooks/session-hooks.ts","../../src/plugin/hooks/tool-hooks.ts","../../src/plugin/hooks/compaction-hook.ts","../../src/shared/constants.ts","../../src/plugin/tools/config.ts","../../src/plugin/tools/get-context.ts","../../src/plugin/utils/bmad-finder.ts","../../src/plugin/utils/context-builder.ts","../../src/plugin/utils/yaml-handler.ts","../../src/plugin/tools/get-story.ts","../../src/plugin/tools/parallel.ts","../../src/plugin/tools/update-status.ts","../../src/plugin/tools/index.ts","../../src/plugin/tracker/story-tracker.ts","../../src/shared/schemas.ts","../../src/plugin/utils/config-loader.ts","../../src/plugin/index.ts"],"names":["tool","join","parseYaml","existsSync","readFile","lockData","stringifyYaml","dirname","mkdir","writeFile"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Cross-platform notification utility\n *\n * Sends desktop notifications on macOS/Linux, falls back to console on Windows.\n */\n\nimport { platform } from \"node:os\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\n\ntype ShellExecutor = PluginInput[\"$\"];\n\n/**\n * Send a desktop notification\n *\n * Platform support:\n * - macOS: Uses osascript (built-in)\n * - Linux: Uses notify-send (requires libnotify)\n * - Windows: Falls back to console.log\n *\n * @param message - The notification message\n * @param title - The notification title\n * @param $ - Shell executor from plugin context\n */\nexport async function sendNotification(\n message: string,\n title: string,\n $: ShellExecutor\n): Promise<void> {\n const os = platform();\n\n try {\n if (os === \"darwin\") {\n // macOS - use osascript (built-in)\n await $`osascript -e ${`display notification \"${escapeAppleScript(message)}\" with title \"${escapeAppleScript(title)}\"`}`;\n } else if (os === \"linux\") {\n // Linux - use notify-send (requires libnotify)\n await $`notify-send ${title} ${message}`;\n } else {\n // Windows and others - fall back to console\n logNotification(title, message);\n }\n } catch {\n // Silently fall back to console if notification fails\n logNotification(title, message);\n }\n}\n\n/**\n * Escape special characters for AppleScript strings\n */\nfunction escapeAppleScript(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Log notification to console as fallback\n */\nfunction logNotification(title: string, message: string): void {\n console.log(`[${title}] ${message}`);\n}\n","/**\n * Session event hooks\n *\n * Handles session lifecycle events like idle, created, and error.\n */\n\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { AthenaConfig } from \"../../shared/types.js\";\nimport type { StoryTracker } from \"../tracker/story-tracker.js\";\nimport { sendNotification } from \"../utils/notifications.js\";\n\n/**\n * Generic event type for session events\n */\ninterface SessionEvent {\n type?: string;\n error?: unknown;\n}\n\n/**\n * Create session event handler\n *\n * Handles:\n * - session.idle: Reminds about in-progress story when session goes idle\n * - session.created: Logs resume of tracked story\n * - session.error: Logs errors during story implementation\n */\nexport function createSessionHooks(ctx: PluginInput, tracker: StoryTracker, config: AthenaConfig) {\n return async ({ event }: { event: SessionEvent }) => {\n // Event type is in event.type for most events\n const eventType = (event as { type?: string }).type;\n\n switch (eventType) {\n case \"session.idle\":\n await handleSessionIdle(ctx, tracker, config);\n break;\n\n case \"session.created\":\n handleSessionCreated(tracker);\n break;\n\n case \"session.error\":\n handleSessionError(event, tracker);\n break;\n }\n };\n}\n\n/**\n * Handle session going idle\n *\n * If a story is in progress, send a reminder notification\n */\nasync function handleSessionIdle(\n ctx: PluginInput,\n tracker: StoryTracker,\n config: AthenaConfig\n): Promise<void> {\n const currentStory = tracker.getCurrentStory();\n\n if (currentStory && currentStory.status === \"in_progress\") {\n // Story is in progress but session went idle\n if (config.features?.notifications) {\n await sendNotification(\n `Story ${currentStory.id} in progress. Remember to update status when complete!`,\n \"OpenCode Athena\",\n ctx.$\n );\n }\n }\n}\n\n/**\n * Handle session creation\n *\n * Log if resuming with an active story\n */\nfunction handleSessionCreated(tracker: StoryTracker): void {\n const currentStory = tracker.getCurrentStory();\n\n if (currentStory) {\n console.log(`[Athena] Resuming with Story ${currentStory.id} (${currentStory.status})`);\n }\n}\n\n/**\n * Handle session errors\n *\n * Log errors that occur during story implementation\n */\nfunction handleSessionError(event: SessionEvent, tracker: StoryTracker): void {\n const currentStory = tracker.getCurrentStory();\n\n if (currentStory && event.error) {\n console.error(`[Athena] Error during Story ${currentStory.id}:`, event.error);\n }\n}\n","/**\n * Tool execution hooks (STUB)\n *\n * TODO: Potential use cases for tool hooks in Athena:\n *\n * 1. Auto-status on test pass:\n * - After Bash tool runs tests successfully\n * - Prompt to mark story as completed\n *\n * 2. Context injection on file read:\n * - When reading story files\n * - Inject implementation instructions\n *\n * 3. BMAD file protection:\n * - Before Write/Edit on docs/ files (BMAD artifacts)\n * - Warn or block direct modifications\n *\n * 4. Story progress tracking:\n * - Track which files are modified during story implementation\n * - Generate change summary for completion\n *\n * See oh-my-opencode for examples:\n * - comment-checker: Checks for excessive comments after Write/Edit\n * - tool-output-truncator: Truncates large outputs\n * - agent-usage-reminder: Reminds to use specialized agents\n */\n\nimport type { AthenaConfig } from \"../../shared/types.js\";\nimport type { StoryTracker } from \"../tracker/story-tracker.js\";\n\ninterface BeforeHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface BeforeHookOutput {\n args: unknown;\n}\n\ninterface AfterHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface AfterHookOutput {\n title: string;\n output: string;\n metadata: unknown;\n}\n\n/**\n * Create tool execution hooks\n *\n * Currently returns stubs. See TODO comments for future implementation ideas.\n */\nexport function createToolHooks(_tracker: StoryTracker, _config: AthenaConfig) {\n return {\n /**\n * Called before a tool executes\n * Can modify args or throw to block execution\n */\n before: async (_input: BeforeHookInput, _output: BeforeHookOutput): Promise<void> => {\n // TODO: Implement tool.execute.before hooks\n // Currently a no-op stub\n },\n\n /**\n * Called after a tool executes\n * Can modify output or append messages\n */\n after: async (_input: AfterHookInput, _output: AfterHookOutput): Promise<void> => {\n // TODO: Implement tool.execute.after hooks\n // Currently a no-op stub\n },\n };\n}\n","/**\n * Session compaction hook\n *\n * Preserves BMAD story context when the session is compacted.\n */\n\nimport type { StoryTracker } from \"../tracker/story-tracker.js\";\n\ninterface CompactionInput {\n sessionID: string;\n}\n\ninterface CompactionOutput {\n context: string[];\n}\n\n/**\n * Create the compaction hook\n *\n * This hook is called before session compaction starts.\n * It injects the current BMAD story context into the compaction prompt\n * so the agent retains awareness of the story being implemented.\n */\nexport function createCompactionHook(tracker: StoryTracker) {\n return async (_input: CompactionInput, output: CompactionOutput): Promise<void> => {\n const storyContext = await tracker.getCurrentStoryContext();\n\n if (storyContext) {\n output.context.push(`## OpenCode Athena - Current BMAD Story Context\n\n${storyContext}\n\nIMPORTANT: You are implementing a BMAD story. Use athena_get_story to reload full context if needed. Use athena_update_status to update the story status when complete.\n`);\n }\n };\n}\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 * athena_config tool\n *\n * View current Athena configuration.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport { VERSION } from \"../../shared/constants.js\";\nimport type { AthenaConfig } from \"../../shared/types.js\";\n\n/**\n * Create the athena_config tool\n */\nexport function createConfigTool(config: AthenaConfig): ToolDefinition {\n return tool({\n description: `View the current OpenCode Athena configuration.\n\nShows:\n- Version information\n- Subscription settings (Claude, OpenAI, Google)\n- Model assignments for each agent role\n- BMAD integration settings\n- Enabled features and MCP servers`,\n\n args: {\n section: tool.schema\n .enum([\"all\", \"subscriptions\", \"models\", \"bmad\", \"features\", \"mcps\"])\n .optional()\n .describe(\"Specific section to view (default: all)\"),\n },\n\n async execute(args): Promise<string> {\n const section = args.section || \"all\";\n\n if (section === \"all\") {\n return JSON.stringify(\n {\n athenaVersion: VERSION,\n configVersion: config.version,\n subscriptions: config.subscriptions,\n models: config.models,\n bmad: config.bmad,\n features: config.features,\n mcps: config.mcps,\n },\n null,\n 2\n );\n }\n\n // Return specific section\n const sectionData: Record<string, unknown> = {\n subscriptions: config.subscriptions,\n models: config.models,\n bmad: config.bmad,\n features: config.features,\n mcps: config.mcps,\n };\n\n return JSON.stringify(\n {\n section,\n data: sectionData[section] || null,\n },\n null,\n 2\n );\n },\n });\n}\n","/**\n * athena_get_context tool\n *\n * Quick access to current story context from tracker.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { AthenaConfig } from \"../../shared/types.js\";\nimport type { StoryTracker } from \"../tracker/story-tracker.js\";\n\n/**\n * Create the athena_get_context tool\n */\nexport function createGetContextTool(tracker: StoryTracker, _config: AthenaConfig): ToolDefinition {\n return tool({\n description: `Get the current story context without reloading from files.\n\nReturns the cached context from the story tracker including:\n- Current story ID and status\n- When the story was started\n- Recent activity history\n\nUse this for quick status checks. Use athena_get_story to reload full context from files.`,\n\n args: {},\n\n async execute(): Promise<string> {\n const currentStory = tracker.getCurrentStory();\n\n if (!currentStory) {\n return JSON.stringify({\n status: \"no_active_story\",\n message: \"No story is currently being tracked. Use athena_get_story to load a story.\",\n });\n }\n\n const context = await tracker.getCurrentStoryContext();\n const history = tracker.getHistory().slice(-10);\n\n return JSON.stringify(\n {\n currentStory: {\n id: currentStory.id,\n status: currentStory.status,\n startedAt: currentStory.startedAt,\n completedAt: currentStory.completedAt,\n },\n contextSummary: context,\n recentHistory: history,\n sessionId: tracker.getSessionId(),\n },\n null,\n 2\n );\n },\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\n\nconst BMAD_DIR_NAMES = [\"docs\", \".bmad\", \"bmad\"] as const;\n\nconst BMAD_V6_DEFAULTS = {\n planningArtifacts: \"docs/project-planning-artifacts\",\n implementationArtifacts: \"docs/implementation-artifacts\",\n projectKnowledge: \"docs\",\n} as const;\n\nconst LEGACY_PATHS = {\n docsDir: \"docs\",\n storiesDir: \"docs/stories\",\n sprintArtifacts: \"docs/sprint-artifacts\",\n} as const;\n\ninterface BmadConfig {\n planning_artifacts?: string;\n implementation_artifacts?: string;\n sprint_artifacts?: string;\n project_knowledge?: string;\n output_folder?: string;\n}\n\ninterface BmadPaths {\n projectRoot: string;\n bmadDir: string | null;\n planningDir: string;\n implementationDir: string;\n storiesDir: string;\n sprintStatus: string;\n architecture: string;\n prd: string;\n epics: string;\n}\n\nexport async function findBmadDir(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const visited = new Set<string>();\n\n while (currentDir && !visited.has(currentDir)) {\n visited.add(currentDir);\n\n for (const dirName of BMAD_DIR_NAMES) {\n const bmadPath = join(currentDir, dirName);\n if (existsSync(bmadPath)) {\n return bmadPath;\n }\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n\n currentDir = parentDir;\n }\n\n return null;\n}\n\nasync function readBmadConfig(bmadDir: string): Promise<BmadConfig | null> {\n const configPath = join(bmadDir, \"bmm\", \"config.yaml\");\n if (!existsSync(configPath)) {\n return null;\n }\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n return parseYaml(content) as BmadConfig;\n } catch {\n return null;\n }\n}\n\nfunction searchForFile(projectRoot: string, filename: string, searchPaths: string[]): string {\n for (const searchPath of searchPaths) {\n const fullPath = join(projectRoot, searchPath, filename);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n\n return join(projectRoot, searchPaths[0], filename);\n}\n\nexport async function getBmadPaths(startDir: string): Promise<BmadPaths> {\n const bmadDir = await findBmadDir(startDir);\n const projectRoot = bmadDir ? dirname(bmadDir) : startDir;\n\n let config: BmadConfig | null = null;\n if (bmadDir) {\n config = await readBmadConfig(bmadDir);\n }\n\n const planningDir =\n config?.planning_artifacts || join(projectRoot, BMAD_V6_DEFAULTS.planningArtifacts);\n\n const implementationDir =\n config?.implementation_artifacts ||\n config?.sprint_artifacts ||\n join(projectRoot, BMAD_V6_DEFAULTS.implementationArtifacts);\n\n const storiesDir = join(implementationDir, \"stories\");\n\n const sprintStatusSearchPaths = [\n config?.implementation_artifacts || BMAD_V6_DEFAULTS.implementationArtifacts,\n config?.sprint_artifacts || \"docs/sprint-artifacts\",\n LEGACY_PATHS.sprintArtifacts,\n LEGACY_PATHS.docsDir,\n ];\n const sprintStatus = searchForFile(projectRoot, \"sprint-status.yaml\", sprintStatusSearchPaths);\n\n const architectureSearchPaths = [\n config?.planning_artifacts || BMAD_V6_DEFAULTS.planningArtifacts,\n LEGACY_PATHS.docsDir,\n ];\n const architecture = searchForFile(projectRoot, \"architecture.md\", architectureSearchPaths);\n\n const prdSearchPaths = [\n config?.planning_artifacts || BMAD_V6_DEFAULTS.planningArtifacts,\n LEGACY_PATHS.docsDir,\n ];\n const prd = searchForFile(projectRoot, \"PRD.md\", prdSearchPaths);\n\n const epicsSearchPaths = [\n config?.planning_artifacts || BMAD_V6_DEFAULTS.planningArtifacts,\n LEGACY_PATHS.docsDir,\n ];\n const epics = searchForFile(projectRoot, \"epics.md\", epicsSearchPaths);\n\n return {\n projectRoot,\n bmadDir,\n planningDir,\n implementationDir,\n storiesDir,\n sprintStatus,\n architecture,\n prd,\n epics,\n };\n}\n","/**\n * Context builder for BMAD story implementation\n *\n * Extracts relevant sections from architecture and PRD documents\n * based on story content keywords.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\n\n/**\n * Extract relevant architecture sections based on story content\n *\n * Always includes:\n * - Tech Stack section\n * - Patterns/Conventions section\n *\n * Conditionally includes based on keywords:\n * - Data Model section (if story mentions data/database/model/schema)\n * - API section (if story mentions api/endpoint/route)\n *\n * @param archPath - Path to architecture.md\n * @param storyContent - Content of the story file\n * @returns Extracted architecture sections\n */\nexport async function extractRelevantArchitecture(\n archPath: string,\n storyContent: string\n): Promise<string> {\n if (!existsSync(archPath)) {\n return \"\";\n }\n\n try {\n const archContent = await readFile(archPath, \"utf-8\");\n const sections: string[] = [];\n\n // Always include tech stack section\n const techStackMatch = archContent.match(/## Tech(?:nology)? Stack[\\s\\S]*?(?=\\n## |$)/i);\n if (techStackMatch) {\n sections.push(techStackMatch[0].trim());\n }\n\n // Always include patterns/conventions section\n const patternsMatch = archContent.match(\n /## (?:Patterns|Conventions|Standards|Coding Standards)[\\s\\S]*?(?=\\n## |$)/i\n );\n if (patternsMatch) {\n sections.push(patternsMatch[0].trim());\n }\n\n // Include data model section if story mentions data/database\n if (/data|database|model|schema|entity/i.test(storyContent)) {\n const dataMatch = archContent.match(\n /## (?:Data Model|Database|Schema|Data Layer)[\\s\\S]*?(?=\\n## |$)/i\n );\n if (dataMatch) {\n sections.push(dataMatch[0].trim());\n }\n }\n\n // Include API section if story mentions API/endpoint\n if (/api|endpoint|route|rest|graphql/i.test(storyContent)) {\n const apiMatch = archContent.match(\n /## (?:API|Endpoints|Routes|REST|GraphQL)[\\s\\S]*?(?=\\n## |$)/i\n );\n if (apiMatch) {\n sections.push(apiMatch[0].trim());\n }\n }\n\n // Include UI/component section if story mentions UI\n if (/ui|component|view|page|screen|frontend/i.test(storyContent)) {\n const uiMatch = archContent.match(\n /## (?:UI|Components|Views|Frontend|User Interface)[\\s\\S]*?(?=\\n## |$)/i\n );\n if (uiMatch) {\n sections.push(uiMatch[0].trim());\n }\n }\n\n return sections.length > 0\n ? sections.join(\"\\n\\n---\\n\\n\")\n : \"See full architecture document for details.\";\n } catch (error) {\n console.warn(\"[Athena] Failed to read architecture file:\", error);\n return \"\";\n }\n}\n\n/**\n * Extract relevant PRD sections based on story content\n *\n * Looks for functional requirement (FR) references in the story\n * and extracts those sections from the PRD.\n *\n * @param prdPath - Path to PRD.md\n * @param storyContent - Content of the story file\n * @returns Extracted PRD sections\n */\nexport async function extractRelevantPRD(prdPath: string, storyContent: string): Promise<string> {\n if (!existsSync(prdPath)) {\n return \"\";\n }\n\n try {\n const prdContent = await readFile(prdPath, \"utf-8\");\n\n // Extract FR references from story (e.g., FR-1, FR1, FR-001)\n const frMatches = storyContent.match(/FR-?\\d+/gi);\n\n if (!frMatches || frMatches.length === 0) {\n return \"\";\n }\n\n // Deduplicate FR references\n const uniqueFRs = [...new Set(frMatches.map((fr) => fr.toUpperCase()))];\n const sections: string[] = [];\n\n for (const fr of uniqueFRs) {\n // Try to find the FR section in the PRD\n // Match patterns like \"### FR-1\" or \"#### FR1\" or \"### FR-001: Title\"\n const normalizedFR = fr.replace(\"-\", \"-?\");\n const regex = new RegExp(`###+ ${normalizedFR}[:\\\\s][\\\\s\\\\S]*?(?=\\\\n###+ |$)`, \"i\");\n const match = prdContent.match(regex);\n\n if (match) {\n sections.push(match[0].trim());\n }\n }\n\n return sections.join(\"\\n\\n\");\n } catch (error) {\n console.warn(\"[Athena] Failed to read PRD file:\", error);\n return \"\";\n }\n}\n\n/**\n * Generate implementation instructions for a story\n *\n * @param storyId - The story ID\n * @returns Markdown instructions for implementing the story\n */\nexport function generateImplementationInstructions(storyId: string): string {\n return `\n## Implementation Instructions for Story ${storyId}\n\nYou are implementing this story using OpenCode Athena's full capabilities.\n\n### Available Subagents\n- **@oracle** - Use for complex debugging, architectural decisions, or strategic code choices\n- **@librarian** - Use for finding implementation examples, researching patterns, exploring documentation\n- **@explore** - Use for fast codebase searches and pattern matching\n- **@frontend-ui-ux-engineer** - Use for UI component implementation (if applicable)\n\n### Available Tools\n- **LSP Tools** - Use lsp_rename, lsp_find_references, lsp_code_actions for refactoring\n- **AST-Grep** - Use ast_grep_search and ast_grep_replace for structural code changes\n\n### Quality Standards\n1. Meet ALL acceptance criteria listed in the story\n2. Follow architecture patterns exactly as specified\n3. Keep comments minimal - code should be self-documenting\n4. Run tests before marking complete\n5. Ensure no regressions in existing functionality\n\n### Completion\nWhen implementation is complete:\n1. Call **athena_update_status** with status \"completed\" and a completion summary\n2. The sprint-status.yaml will be automatically updated\n3. Report what was implemented and any decisions made\n\n### If You Get Stuck\n- Call @oracle for debugging help\n- Call @librarian to find similar implementations\n- Check the architecture document for patterns\n`.trim();\n}\n","/**\n * YAML file handler for sprint-status.yaml\n *\n * Provides read/write utilities with error handling and file locking\n * for safe concurrent access during parallel story execution.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport type { SprintStatus } from \"../../shared/types.js\";\n\n/**\n * Lock file extension\n */\nconst LOCK_EXT = \".lock\";\n\n/**\n * Maximum time to wait for a lock (in milliseconds)\n */\nconst LOCK_TIMEOUT = 10000;\n\n/**\n * Time between lock acquisition attempts (in milliseconds)\n */\nconst LOCK_RETRY_INTERVAL = 50;\n\n/**\n * Maximum age of a stale lock file (in milliseconds)\n * If a lock is older than this, it's considered stale and can be removed\n */\nconst STALE_LOCK_AGE = 30000;\n\n/**\n * Acquire a lock for a file\n *\n * Uses a simple lock file approach with stale lock detection.\n * This is a best-effort lock suitable for single-machine scenarios.\n *\n * @param filePath - Path to the file to lock\n * @returns Release function to call when done\n * @throws Error if lock cannot be acquired within timeout\n */\nasync function acquireLock(filePath: string): Promise<() => Promise<void>> {\n const lockPath = `${filePath}${LOCK_EXT}`;\n const startTime = Date.now();\n const lockId = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n while (Date.now() - startTime < LOCK_TIMEOUT) {\n try {\n // Check for existing lock\n if (existsSync(lockPath)) {\n // Check if lock is stale\n const lockContent = await readFile(lockPath, \"utf-8\").catch(() => null);\n if (lockContent) {\n try {\n const lockData = JSON.parse(lockContent);\n const lockAge = Date.now() - lockData.timestamp;\n if (lockAge > STALE_LOCK_AGE) {\n // Lock is stale, remove it\n await rm(lockPath, { force: true });\n }\n } catch {\n // Invalid lock file, remove it\n await rm(lockPath, { force: true });\n }\n }\n }\n\n // Try to create lock file with exclusive flag\n // Note: 'wx' flag means write + exclusive (fail if exists)\n const lockData = JSON.stringify({\n id: lockId,\n pid: process.pid,\n timestamp: Date.now(),\n });\n\n await writeFile(lockPath, lockData, { flag: \"wx\" });\n\n // Lock acquired successfully\n return async () => {\n // Only release if we still own the lock\n try {\n const currentContent = await readFile(lockPath, \"utf-8\").catch(() => null);\n if (currentContent) {\n const currentData = JSON.parse(currentContent);\n if (currentData.id === lockId) {\n await rm(lockPath, { force: true });\n }\n }\n } catch {\n // Ignore errors during unlock\n }\n };\n } catch (error: unknown) {\n // Check if it's an EEXIST error (lock file already exists)\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code !== \"EEXIST\") {\n throw error;\n }\n // Lock exists, wait and retry\n await sleep(LOCK_RETRY_INTERVAL);\n }\n }\n\n throw new Error(`Failed to acquire lock for ${filePath} within ${LOCK_TIMEOUT}ms`);\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Read and parse a YAML file\n *\n * @param filePath - Path to the YAML file\n * @returns Parsed content or null if file doesn't exist or parse fails\n */\nexport async function readYamlFile<T = unknown>(filePath: string): Promise<T | null> {\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n return parseYaml(content) as T;\n } catch (error) {\n console.warn(`[Athena] Failed to parse YAML file ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Write data to a YAML file (without locking)\n *\n * @param filePath - Path to the YAML file\n * @param data - Data to write\n */\nexport async function writeYamlFile<T = unknown>(filePath: string, data: T): Promise<void> {\n const content = stringifyYaml(data, {\n indent: 2,\n lineWidth: 120,\n });\n await writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Read sprint status from YAML file\n *\n * @param filePath - Path to sprint-status.yaml\n * @returns SprintStatus object with defaults applied\n */\nexport async function readSprintStatus(filePath: string): Promise<SprintStatus | null> {\n const raw = await readYamlFile<Partial<SprintStatus>>(filePath);\n\n if (!raw) {\n return null;\n }\n\n // Apply defaults for missing arrays\n return {\n completed_stories: [],\n pending_stories: [],\n in_progress_stories: [],\n blocked_stories: [],\n ...raw,\n };\n}\n\n/**\n * Write sprint status to YAML file with file locking\n *\n * This function uses file locking to prevent race conditions when\n * multiple parallel story executions try to update the same file.\n *\n * @param filePath - Path to sprint-status.yaml\n * @param status - SprintStatus object to write\n */\nexport async function writeSprintStatus(filePath: string, status: SprintStatus): Promise<void> {\n // Ensure directory exists\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n // Acquire lock before reading and writing\n const releaseLock = await acquireLock(filePath);\n\n try {\n // Re-read the current state to merge changes\n // This handles the case where another process updated between our read and write\n const currentStatus = await readSprintStatus(filePath);\n\n let statusToWrite = status;\n\n if (currentStatus) {\n // Check for concurrent modification using last_modified\n if (\n status.last_modified &&\n currentStatus.last_modified &&\n currentStatus.last_modified !== status.last_modified\n ) {\n // Another process modified the file - merge the changes\n statusToWrite = mergeSprintStatus(currentStatus, status);\n }\n }\n\n // Update last_modified timestamp\n statusToWrite.last_modified = new Date().toISOString();\n await writeYamlFile(filePath, statusToWrite);\n } finally {\n await releaseLock();\n }\n}\n\n/**\n * Merge two sprint status objects when concurrent modification is detected\n *\n * This function intelligently merges changes from both versions,\n * preferring the newer status for each story.\n *\n * @param current - The current state from disk\n * @param incoming - The state we're trying to write\n * @returns Merged sprint status\n */\nfunction mergeSprintStatus(current: SprintStatus, incoming: SprintStatus): SprintStatus {\n // Start with current state\n const merged: SprintStatus = { ...current };\n\n // Merge story_updates - newer timestamps win\n merged.story_updates = { ...current.story_updates };\n if (incoming.story_updates) {\n for (const [storyId, update] of Object.entries(incoming.story_updates)) {\n const currentUpdate = merged.story_updates?.[storyId];\n if (!currentUpdate || new Date(update.updated_at) > new Date(currentUpdate.updated_at)) {\n merged.story_updates = merged.story_updates || {};\n merged.story_updates[storyId] = update;\n }\n }\n }\n\n // Rebuild status arrays from story_updates\n // This ensures consistency between arrays and story_updates\n if (merged.story_updates) {\n const statusArrays = {\n completed_stories: new Set<string>(),\n pending_stories: new Set<string>(),\n in_progress_stories: new Set<string>(),\n blocked_stories: new Set<string>(),\n stories_needing_review: new Set<string>(),\n };\n\n // Add all stories from current arrays first (to catch stories without updates)\n for (const story of current.completed_stories || []) {\n statusArrays.completed_stories.add(story);\n }\n for (const story of current.pending_stories || []) {\n statusArrays.pending_stories.add(story);\n }\n for (const story of current.in_progress_stories || []) {\n statusArrays.in_progress_stories.add(story);\n }\n for (const story of current.blocked_stories || []) {\n statusArrays.blocked_stories.add(story);\n }\n\n // Update arrays based on story_updates\n for (const [storyId, update] of Object.entries(merged.story_updates)) {\n // Remove from all arrays first\n statusArrays.completed_stories.delete(storyId);\n statusArrays.pending_stories.delete(storyId);\n statusArrays.in_progress_stories.delete(storyId);\n statusArrays.blocked_stories.delete(storyId);\n statusArrays.stories_needing_review.delete(storyId);\n\n // Add to appropriate array\n switch (update.status) {\n case \"completed\":\n statusArrays.completed_stories.add(storyId);\n break;\n case \"pending\":\n statusArrays.pending_stories.add(storyId);\n break;\n case \"in_progress\":\n statusArrays.in_progress_stories.add(storyId);\n break;\n case \"blocked\":\n statusArrays.blocked_stories.add(storyId);\n break;\n case \"needs_review\":\n statusArrays.in_progress_stories.add(storyId);\n statusArrays.stories_needing_review.add(storyId);\n break;\n }\n }\n\n merged.completed_stories = [...statusArrays.completed_stories];\n merged.pending_stories = [...statusArrays.pending_stories];\n merged.in_progress_stories = [...statusArrays.in_progress_stories];\n merged.blocked_stories = [...statusArrays.blocked_stories];\n merged.stories_needing_review = [...statusArrays.stories_needing_review];\n }\n\n // Keep the most recent current_story\n if (incoming.current_story !== undefined) {\n merged.current_story = incoming.current_story;\n }\n\n return merged;\n}\n","/**\n * athena_get_story tool\n *\n * Loads the current BMAD story context for implementation.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { AthenaConfig, GetStoryResult, SprintStatus } from \"../../shared/types.js\";\nimport type { StoryTracker } from \"../tracker/story-tracker.js\";\nimport { getBmadPaths } from \"../utils/bmad-finder.js\";\nimport {\n extractRelevantArchitecture,\n extractRelevantPRD,\n generateImplementationInstructions,\n} from \"../utils/context-builder.js\";\nimport { readSprintStatus } from \"../utils/yaml-handler.js\";\n\n/**\n * Create the athena_get_story tool\n */\nexport function createGetStoryTool(\n ctx: PluginInput,\n tracker: StoryTracker,\n _config: AthenaConfig\n): ToolDefinition {\n return tool({\n description: `Load the current BMAD story context for implementation.\n\nReturns:\n- Story file content with requirements and acceptance criteria\n- Relevant architecture sections\n- Sprint progress information\n- Implementation instructions for using Sisyphus and subagents\n\nUse this tool before starting story implementation to get full context.`,\n\n args: {\n storyId: tool.schema\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 async execute(args): Promise<string> {\n const result = await getStoryContext(ctx, tracker, args.storyId);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n/**\n * Get story context implementation\n */\nasync function getStoryContext(\n ctx: PluginInput,\n tracker: StoryTracker,\n requestedStoryId?: string\n): Promise<GetStoryResult> {\n const paths = await getBmadPaths(ctx.directory);\n if (!paths.bmadDir) {\n return {\n error: \"No BMAD directory found\",\n suggestion: \"Run 'npx bmad-method@alpha install' to set up BMAD in this project.\",\n };\n }\n\n // Read sprint status\n const sprint = await readSprintStatus(paths.sprintStatus);\n if (!sprint) {\n return {\n error: \"No sprint-status.yaml found\",\n suggestion: \"Run the sprint-planning workflow with BMAD's SM agent first.\",\n };\n }\n\n // Determine which story to load\n const storyId = requestedStoryId || findNextPendingStory(sprint);\n if (!storyId) {\n return {\n error: \"No pending stories found\",\n sprintProgress: {\n completed: sprint.completed_stories.length,\n total:\n sprint.completed_stories.length +\n sprint.pending_stories.length +\n sprint.in_progress_stories.length,\n },\n suggestion: \"All stories in current sprint are complete!\",\n };\n }\n\n // Load story file\n const storyContent = await loadStoryFile(paths.storiesDir, storyId);\n if (!storyContent) {\n return {\n error: `Story file not found for ${storyId}`,\n suggestion: \"Run 'create-story' workflow with BMAD's SM agent.\",\n };\n }\n\n // Load architecture context\n const archContent = await extractRelevantArchitecture(paths.architecture, storyContent);\n\n // Load PRD context\n const prdContent = await extractRelevantPRD(paths.prd, storyContent);\n\n // Update tracker with \"loading\" transitional state\n // The story will be promoted to \"in_progress\" when athena_update_status is called\n await tracker.setCurrentStory(storyId, {\n content: storyContent,\n status: \"loading\",\n startedAt: new Date().toISOString(),\n });\n\n return {\n storyId,\n story: storyContent,\n architecture: archContent || \"No architecture document found.\",\n prd: prdContent || \"No PRD document found.\",\n sprint: {\n currentEpic: sprint.current_epic || \"Unknown\",\n completedStories: sprint.completed_stories.length,\n pendingStories: sprint.pending_stories.length,\n blockedStories: sprint.blocked_stories.length,\n },\n instructions: generateImplementationInstructions(storyId),\n };\n}\n\n/**\n * Find the next pending story from sprint status\n */\nfunction findNextPendingStory(sprint: SprintStatus): string | null {\n // First check if there's a designated current story\n if (sprint.current_story) {\n return sprint.current_story;\n }\n\n // Then check in_progress stories\n if (sprint.in_progress_stories.length > 0) {\n return sprint.in_progress_stories[0];\n }\n\n // Finally check pending stories\n if (sprint.pending_stories.length > 0) {\n return sprint.pending_stories[0];\n }\n\n return null;\n}\n\n/**\n * Load story file content\n * Tries multiple naming conventions:\n * - story-{epic}-{number}.md (e.g., story-2-3.md)\n * - story-{id}.md (e.g., story-2.3.md)\n * - {id}.md (e.g., 2.3.md)\n */\nasync function loadStoryFile(storiesDir: string, storyId: string): Promise<string | null> {\n // Generate possible file names\n const possibleNames = [\n `story-${storyId.replace(\".\", \"-\")}.md`, // story-2-3.md\n `story-${storyId}.md`, // story-2.3.md\n `${storyId}.md`, // 2.3.md\n ];\n\n for (const fileName of possibleNames) {\n const filePath = join(storiesDir, fileName);\n if (existsSync(filePath)) {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n // File not readable, try next path\n }\n }\n }\n\n return null;\n}\n","/**\n * athena_parallel tool (STUB)\n *\n * Multi-story parallel execution using background agents.\n *\n * TODO: This tool depends on oh-my-opencode's background agent feature.\n * Implementation should:\n * 1. Validate that stories are independent (no file conflicts)\n * 2. Mark all stories as in_progress\n * 3. Spawn background agents for each story\n * 4. Coordinate completion and status updates\n *\n * See: https://github.com/code-yeongyu/oh-my-opencode for background agent API\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\n\n/**\n * Create the athena_parallel tool (stub)\n */\nexport function createParallelTool(): ToolDefinition {\n return tool({\n description: `Execute multiple independent stories in parallel using background agents.\n\nNOTE: This feature is not yet implemented. It requires integration with oh-my-opencode's background agent system.\n\nWhen implemented, this tool will:\n1. Validate that the specified stories have no file conflicts\n2. Mark all stories as in_progress in sprint-status.yaml\n3. Spawn background agents to implement each story\n4. Coordinate completion and report results`,\n\n args: {\n storyIds: tool.schema\n .array(tool.schema.string())\n .describe(\"Array of story IDs to execute in parallel\"),\n waitForCompletion: tool.schema\n .boolean()\n .optional()\n .describe(\"Whether to wait for all stories to complete (default: true)\"),\n },\n\n async execute(args): Promise<string> {\n // TODO: Implement parallel story execution with oh-my-opencode background agents\n return JSON.stringify(\n {\n error: \"Not implemented\",\n message:\n \"Parallel story execution is not yet implemented. This feature requires integration with oh-my-opencode's background agent system.\",\n requestedStories: args.storyIds,\n suggestion: \"For now, implement stories sequentially using /athena-dev for each story.\",\n },\n null,\n 2\n );\n },\n });\n}\n","/**\n * athena_update_status tool\n *\n * Updates the BMAD sprint status for a story.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { AthenaConfig, StoryStatus, UpdateStatusResult } from \"../../shared/types.js\";\nimport type { StoryTracker } from \"../tracker/story-tracker.js\";\nimport { getBmadPaths } from \"../utils/bmad-finder.js\";\nimport { sendNotification } from \"../utils/notifications.js\";\nimport { readSprintStatus, writeSprintStatus } from \"../utils/yaml-handler.js\";\n\n/**\n * Create the athena_update_status tool\n */\nexport function createUpdateStatusTool(\n ctx: PluginInput,\n tracker: StoryTracker,\n config: AthenaConfig\n): ToolDefinition {\n return tool({\n description: `Update the BMAD sprint status for a story.\n\nCall this tool when:\n- Starting a story (status: \"in_progress\")\n- Completing a story (status: \"completed\") - requires completionSummary\n- Blocking on an issue (status: \"blocked\") - requires notes explaining blocker\n- Requesting review (status: \"needs_review\")\n\nThe sprint-status.yaml file will be automatically updated.`,\n\n args: {\n storyId: tool.schema.string().describe(\"The story ID (e.g., '2.3')\"),\n status: tool.schema\n .enum([\"in_progress\", \"completed\", \"blocked\", \"needs_review\"])\n .describe(\"The new status for the story\"),\n notes: tool.schema\n .string()\n .optional()\n .describe(\"Notes about the status change (required for 'blocked' status)\"),\n completionSummary: tool.schema\n .string()\n .optional()\n .describe(\"Summary of what was implemented (required for 'completed' status)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await updateStoryStatus(ctx, tracker, config, args);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\ninterface UpdateStatusArgs {\n storyId: string;\n status: \"in_progress\" | \"completed\" | \"blocked\" | \"needs_review\";\n notes?: string;\n completionSummary?: string;\n}\n\n/**\n * Update story status implementation\n */\nasync function updateStoryStatus(\n ctx: PluginInput,\n tracker: StoryTracker,\n config: AthenaConfig,\n args: UpdateStatusArgs\n): Promise<UpdateStatusResult> {\n const { storyId, status, notes, completionSummary } = args;\n\n // Validation\n if (status === \"completed\" && !completionSummary) {\n return {\n error: \"completionSummary is required when marking a story completed\",\n };\n }\n if (status === \"blocked\" && !notes) {\n return {\n error: \"notes are required when blocking a story (explain the blocker)\",\n };\n }\n\n const paths = await getBmadPaths(ctx.directory);\n if (!paths.bmadDir) {\n return { error: \"No BMAD directory found\" };\n }\n\n if (!existsSync(paths.sprintStatus)) {\n return { error: \"No sprint-status.yaml found\" };\n }\n\n const sprint = await readSprintStatus(paths.sprintStatus);\n if (!sprint) {\n return { error: \"Failed to read sprint-status.yaml\" };\n }\n\n const now = new Date().toISOString();\n\n // Remove story from all status arrays\n removeFromAllArrays(sprint, storyId);\n\n // Add to appropriate array based on new status (with deduplication)\n switch (status) {\n case \"in_progress\":\n addToArrayIfNotPresent(sprint.in_progress_stories, storyId);\n sprint.current_story = storyId;\n break;\n\n case \"completed\":\n addToArrayIfNotPresent(sprint.completed_stories, storyId);\n if (sprint.current_story === storyId) {\n sprint.current_story = null;\n }\n break;\n\n case \"blocked\":\n addToArrayIfNotPresent(sprint.blocked_stories, storyId);\n if (sprint.current_story === storyId) {\n sprint.current_story = null;\n }\n break;\n\n case \"needs_review\":\n addToArrayIfNotPresent(sprint.in_progress_stories, storyId);\n sprint.stories_needing_review = sprint.stories_needing_review || [];\n addToArrayIfNotPresent(sprint.stories_needing_review, storyId);\n break;\n }\n\n // Update story metadata\n sprint.story_updates = sprint.story_updates || {};\n sprint.story_updates[storyId] = {\n status: status as StoryStatus,\n updated_at: now,\n ...(notes && { notes }),\n ...(completionSummary && { completion_summary: completionSummary }),\n };\n\n // Write updated sprint status\n await writeSprintStatus(paths.sprintStatus, sprint);\n\n // Update tracker\n await tracker.updateStoryStatus(storyId, status as StoryStatus);\n\n // Send notification if enabled and story completed\n if (config.features?.notifications && status === \"completed\") {\n await sendNotification(`Story ${storyId} completed!`, \"OpenCode Athena\", ctx.$);\n }\n\n // Calculate sprint progress\n const totalStories =\n sprint.completed_stories.length +\n sprint.pending_stories.length +\n sprint.in_progress_stories.length +\n sprint.blocked_stories.length;\n\n const percentComplete =\n totalStories > 0 ? Math.round((sprint.completed_stories.length / totalStories) * 100) : 0;\n\n return {\n success: true,\n storyId,\n newStatus: status as StoryStatus,\n updatedAt: now,\n sprintProgress: {\n completed: sprint.completed_stories.length,\n inProgress: sprint.in_progress_stories.length,\n pending: sprint.pending_stories.length,\n blocked: sprint.blocked_stories.length,\n total: totalStories,\n percentComplete,\n },\n nextStory: status === \"completed\" ? sprint.pending_stories[0] || null : null,\n };\n}\n\n/**\n * Remove a story from all status arrays and deduplicate\n */\nfunction removeFromAllArrays(\n sprint: {\n completed_stories: string[];\n pending_stories: string[];\n in_progress_stories: string[];\n blocked_stories: string[];\n stories_needing_review?: string[];\n },\n storyId: string\n): void {\n // Remove the story and deduplicate arrays to prevent duplicates\n sprint.completed_stories = [...new Set(sprint.completed_stories.filter((s) => s !== storyId))];\n sprint.pending_stories = [...new Set(sprint.pending_stories.filter((s) => s !== storyId))];\n sprint.in_progress_stories = [\n ...new Set(sprint.in_progress_stories.filter((s) => s !== storyId)),\n ];\n sprint.blocked_stories = [...new Set(sprint.blocked_stories.filter((s) => s !== storyId))];\n if (sprint.stories_needing_review) {\n sprint.stories_needing_review = [\n ...new Set(sprint.stories_needing_review.filter((s) => s !== storyId)),\n ];\n }\n}\n\n/**\n * Add a story to an array if not already present\n */\nfunction addToArrayIfNotPresent(array: string[], storyId: string): void {\n if (!array.includes(storyId)) {\n array.push(storyId);\n }\n}\n","/**\n * Plugin tools index\n *\n * Factory function that creates all Athena tools.\n */\n\nimport type { PluginInput, ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { AthenaConfig } from \"../../shared/types.js\";\nimport type { StoryTracker } from \"../tracker/story-tracker.js\";\nimport { createConfigTool } from \"./config.js\";\nimport { createGetContextTool } from \"./get-context.js\";\nimport { createGetStoryTool } from \"./get-story.js\";\nimport { createParallelTool } from \"./parallel.js\";\nimport { createUpdateStatusTool } from \"./update-status.js\";\n\n/**\n * Create all Athena tools\n *\n * @param ctx - Plugin context from OpenCode\n * @param tracker - Story tracker instance\n * @param config - Athena configuration\n * @returns Object containing all tool definitions\n */\nexport function createTools(\n ctx: PluginInput,\n tracker: StoryTracker,\n config: AthenaConfig\n): Record<string, ToolDefinition> {\n return {\n athena_get_story: createGetStoryTool(ctx, tracker, config),\n athena_update_status: createUpdateStatusTool(ctx, tracker, config),\n athena_get_context: createGetContextTool(tracker, config),\n athena_parallel: createParallelTool(),\n athena_config: createConfigTool(config),\n };\n}\n","/**\n * Story Tracker\n *\n * Tracks the current story state and persists it across sessions.\n * State is stored in ~/.config/opencode/athena-state.json\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { CONFIG_PATHS } from \"../../shared/constants.js\";\nimport type { TrackedStory, TrackerState, TrackerStatus } from \"../../shared/types.js\";\n\n/**\n * Story tracker that persists state across sessions.\n *\n * Features:\n * - Tracks current story being implemented\n * - Maintains history of story status changes\n * - Persists state to disk for session recovery\n * - Scoped to project directory\n */\nexport class StoryTracker {\n private state: TrackerState;\n private stateFilePath: string;\n private projectDir: string;\n\n constructor(projectDir: string) {\n this.projectDir = projectDir;\n this.stateFilePath = CONFIG_PATHS.stateFile;\n this.state = {\n currentStory: null,\n sessionId: crypto.randomUUID(),\n projectDir,\n history: [],\n };\n }\n\n /**\n * Initialize the tracker by loading existing state\n */\n async initialize(): Promise<void> {\n if (existsSync(this.stateFilePath)) {\n try {\n const content = await readFile(this.stateFilePath, \"utf-8\");\n const savedState = JSON.parse(content) as TrackerState;\n\n // Only restore if same project directory\n if (savedState.projectDir === this.projectDir) {\n this.state = {\n ...savedState,\n sessionId: crypto.randomUUID(), // Always generate new session ID\n };\n }\n } catch {\n // Ignore errors, start with fresh state\n }\n }\n }\n\n /**\n * Set the current story being worked on\n */\n async setCurrentStory(storyId: string, data: Omit<TrackedStory, \"id\">): Promise<void> {\n this.state.currentStory = { id: storyId, ...data };\n this.addHistoryEntry(storyId, data.status);\n await this.saveState();\n }\n\n /**\n * Update the status of a story\n */\n async updateStoryStatus(storyId: string, status: TrackerStatus): Promise<void> {\n if (this.state.currentStory?.id === storyId) {\n this.state.currentStory.status = status;\n if (status === \"completed\") {\n this.state.currentStory.completedAt = new Date().toISOString();\n }\n }\n this.addHistoryEntry(storyId, status);\n await this.saveState();\n }\n\n /**\n * Get the current story being tracked\n */\n getCurrentStory(): TrackedStory | null {\n return this.state.currentStory;\n }\n\n /**\n * Get a formatted context string for the current story\n * Used for compaction hooks to preserve context\n */\n async getCurrentStoryContext(): Promise<string | null> {\n if (!this.state.currentStory) {\n return null;\n }\n\n const story = this.state.currentStory;\n const recentHistory = this.state.history\n .slice(-5)\n .map((h) => `- ${h.storyId}: ${h.status} at ${h.timestamp}`)\n .join(\"\\n\");\n\n return `\nCurrent Story: ${story.id}\nStatus: ${story.status}\nStarted: ${story.startedAt}\n${story.completedAt ? `Completed: ${story.completedAt}` : \"\"}\n\nRecent Activity:\n${recentHistory}\n`.trim();\n }\n\n /**\n * Clear the current story (e.g., when completed or cancelled)\n */\n async clearCurrentStory(): Promise<void> {\n this.state.currentStory = null;\n await this.saveState();\n }\n\n /**\n * Get the current session ID\n */\n getSessionId(): string {\n return this.state.sessionId;\n }\n\n /**\n * Get the history of status changes\n */\n getHistory(): TrackerState[\"history\"] {\n return this.state.history;\n }\n\n /**\n * Add an entry to the history\n */\n private addHistoryEntry(storyId: string, status: string): void {\n this.state.history.push({\n storyId,\n status,\n timestamp: new Date().toISOString(),\n });\n\n // Keep history bounded (last 100 entries)\n if (this.state.history.length > 100) {\n this.state.history = this.state.history.slice(-100);\n }\n }\n\n /**\n * Save state to disk\n */\n private async saveState(): Promise<void> {\n try {\n const dir = dirname(this.stateFilePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(this.stateFilePath, JSON.stringify(this.state, null, 2), \"utf-8\");\n } catch (error) {\n console.warn(\"[Athena] Failed to save tracker state:\", error);\n }\n }\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 * Configuration loader for Athena plugin\n *\n * Loads AthenaConfig from project-local or global config files.\n * Project config takes priority over global config.\n * Uses Zod validation for type safety and clear error messages.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { CONFIG_PATHS, DEFAULTS } from \"../../shared/constants.js\";\nimport { AthenaConfigSchema } from \"../../shared/schemas.js\";\nimport type { AthenaConfig } from \"../../shared/types.js\";\n\n/**\n * Load Athena configuration from available config files.\n *\n * Priority order:\n * 1. Project-local: [projectDir]/.opencode/athena.json\n * 2. Global: ~/.config/opencode/athena.json\n * 3. Default values if no config found\n *\n * @param projectDir - The project directory to search for local config\n * @returns The merged Athena configuration\n */\nexport async function loadAthenaConfig(projectDir: string): Promise<AthenaConfig> {\n // Try project-local config first\n const localConfigPath = join(projectDir, \".opencode\", \"athena.json\");\n const localConfig = await loadConfigFile(localConfigPath);\n\n // Try global config\n const globalConfig = await loadConfigFile(CONFIG_PATHS.globalAthenaConfig);\n\n // Merge configs: local overrides global, both override defaults\n const merged = mergeConfigs(getDefaultConfig(), globalConfig, localConfig);\n\n // Validate the final merged config\n return validateConfig(merged);\n}\n\n/**\n * Load and parse a JSON config file\n */\nasync function loadConfigFile(filePath: string): Promise<Partial<AthenaConfig> | null> {\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const parsed = JSON.parse(content);\n\n // Perform partial validation to catch obvious errors early\n // We don't require all fields since this is a partial config\n return validatePartialConfig(parsed, filePath);\n } catch (error) {\n if (error instanceof SyntaxError) {\n console.warn(`[Athena] Invalid JSON in config file ${filePath}:`, error.message);\n } else {\n console.warn(`[Athena] Failed to load config from ${filePath}:`, error);\n }\n return null;\n }\n}\n\n/**\n * Validate a partial config file and return it with warnings for invalid fields\n */\nfunction validatePartialConfig(config: unknown, filePath: string): Partial<AthenaConfig> | null {\n if (typeof config !== \"object\" || config === null) {\n console.warn(`[Athena] Config file ${filePath} must be an object`);\n return null;\n }\n\n const result: Partial<AthenaConfig> = {};\n const configObj = config as Record<string, unknown>;\n\n // Validate and copy each top-level field\n if (\"version\" in configObj && typeof configObj.version === \"string\") {\n result.version = configObj.version;\n }\n\n if (\"$schema\" in configObj && typeof configObj.$schema === \"string\") {\n result.$schema = configObj.$schema;\n }\n\n // Validate subscriptions\n if (\"subscriptions\" in configObj && typeof configObj.subscriptions === \"object\") {\n const subs = configObj.subscriptions as Record<string, unknown>;\n result.subscriptions = {} as AthenaConfig[\"subscriptions\"];\n\n if (subs.claude && typeof subs.claude === \"object\") {\n const claude = subs.claude as Record<string, unknown>;\n result.subscriptions.claude = {\n enabled: typeof claude.enabled === \"boolean\" ? claude.enabled : false,\n tier: isValidTier(claude.tier) ? claude.tier : \"none\",\n };\n }\n\n if (subs.openai && typeof subs.openai === \"object\") {\n const openai = subs.openai as Record<string, unknown>;\n result.subscriptions.openai = {\n enabled: typeof openai.enabled === \"boolean\" ? openai.enabled : false,\n };\n }\n\n if (subs.google && typeof subs.google === \"object\") {\n const google = subs.google as Record<string, unknown>;\n result.subscriptions.google = {\n enabled: typeof google.enabled === \"boolean\" ? google.enabled : false,\n authMethod: isValidAuthMethod(google.authMethod) ? google.authMethod : \"none\",\n };\n }\n }\n\n // Validate models\n if (\"models\" in configObj && typeof configObj.models === \"object\") {\n const models = configObj.models as Record<string, unknown>;\n result.models = {} as AthenaConfig[\"models\"];\n\n for (const key of [\n \"sisyphus\",\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ]) {\n if (key in models && typeof models[key] === \"string\") {\n (result.models as Record<string, string>)[key] = models[key] as string;\n }\n }\n }\n\n // Validate bmad\n if (\"bmad\" in configObj && typeof configObj.bmad === \"object\") {\n const bmad = configObj.bmad as Record<string, unknown>;\n result.bmad = {} as AthenaConfig[\"bmad\"];\n\n if (isValidTrack(bmad.defaultTrack)) {\n result.bmad.defaultTrack = bmad.defaultTrack;\n }\n if (typeof bmad.autoStatusUpdate === \"boolean\") {\n result.bmad.autoStatusUpdate = bmad.autoStatusUpdate;\n }\n if (typeof bmad.parallelStoryLimit === \"number\") {\n result.bmad.parallelStoryLimit = Math.max(0, Math.min(10, bmad.parallelStoryLimit));\n }\n }\n\n // Validate features\n if (\"features\" in configObj && typeof configObj.features === \"object\") {\n const features = configObj.features as Record<string, unknown>;\n result.features = {} as AthenaConfig[\"features\"];\n\n for (const key of [\n \"bmadBridge\",\n \"autoStatus\",\n \"parallelExecution\",\n \"notifications\",\n \"contextMonitor\",\n \"commentChecker\",\n \"lspTools\",\n ]) {\n if (key in features && typeof features[key] === \"boolean\") {\n (result.features as Record<string, boolean>)[key] = features[key] as boolean;\n }\n }\n }\n\n // Validate mcps\n if (\"mcps\" in configObj && typeof configObj.mcps === \"object\") {\n const mcps = configObj.mcps as Record<string, unknown>;\n result.mcps = {} as AthenaConfig[\"mcps\"];\n\n for (const key of [\"context7\", \"exa\", \"grepApp\"]) {\n if (key in mcps && typeof mcps[key] === \"boolean\") {\n (result.mcps as Record<string, boolean>)[key] = mcps[key] as boolean;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Type guard for valid Claude tier\n */\nfunction isValidTier(value: unknown): value is \"max5x\" | \"max20x\" | \"pro\" | \"none\" {\n return typeof value === \"string\" && [\"max5x\", \"max20x\", \"pro\", \"none\"].includes(value);\n}\n\n/**\n * Type guard for valid Google auth method\n */\nfunction isValidAuthMethod(value: unknown): value is \"antigravity\" | \"personal\" | \"api\" | \"none\" {\n return typeof value === \"string\" && [\"antigravity\", \"personal\", \"api\", \"none\"].includes(value);\n}\n\n/**\n * Type guard for valid BMAD track\n */\nfunction isValidTrack(value: unknown): value is \"quick-flow\" | \"bmad-method\" | \"enterprise\" {\n return typeof value === \"string\" && [\"quick-flow\", \"bmad-method\", \"enterprise\"].includes(value);\n}\n\n/**\n * Validate the final merged config using Zod schema\n */\nfunction validateConfig(config: AthenaConfig): AthenaConfig {\n const result = AthenaConfigSchema.safeParse(config);\n\n if (!result.success) {\n // Log validation errors but don't fail - use defaults for invalid fields\n console.warn(\"[Athena] Configuration validation warnings:\");\n for (const error of result.error.errors) {\n console.warn(` - ${error.path.join(\".\")}: ${error.message}`);\n }\n\n // Return the original config since we already have defaults\n // The individual fields will be used even if some are invalid\n return config;\n }\n\n return result.data;\n}\n\n/**\n * Get default configuration values\n */\nfunction getDefaultConfig(): AthenaConfig {\n return {\n version: \"0.0.1\",\n subscriptions: {\n claude: { enabled: false, tier: \"none\" },\n openai: { enabled: false },\n google: { enabled: false, authMethod: \"none\" },\n },\n models: {\n sisyphus: \"anthropic/claude-sonnet-4\",\n oracle: \"anthropic/claude-sonnet-4\",\n librarian: \"anthropic/claude-sonnet-4\",\n },\n bmad: {\n defaultTrack: DEFAULTS.defaultTrack,\n autoStatusUpdate: DEFAULTS.autoStatusUpdate,\n parallelStoryLimit: DEFAULTS.parallelStoryLimit,\n },\n features: { ...DEFAULTS.features },\n mcps: { ...DEFAULTS.mcps },\n };\n}\n\n/**\n * Deep merge multiple config objects\n * Later configs override earlier ones\n */\nfunction mergeConfigs(...configs: (Partial<AthenaConfig> | null)[]): AthenaConfig {\n const result = getDefaultConfig();\n\n for (const config of configs) {\n if (!config) continue;\n\n // Merge top-level primitives\n if (config.version) result.version = config.version;\n\n // Merge subscriptions\n if (config.subscriptions) {\n if (config.subscriptions.claude) {\n result.subscriptions.claude = {\n ...result.subscriptions.claude,\n ...config.subscriptions.claude,\n };\n }\n if (config.subscriptions.openai) {\n result.subscriptions.openai = {\n ...result.subscriptions.openai,\n ...config.subscriptions.openai,\n };\n }\n if (config.subscriptions.google) {\n result.subscriptions.google = {\n ...result.subscriptions.google,\n ...config.subscriptions.google,\n };\n }\n }\n\n // Merge models\n if (config.models) {\n result.models = { ...result.models, ...config.models };\n }\n\n // Merge bmad settings\n if (config.bmad) {\n result.bmad = { ...result.bmad, ...config.bmad };\n }\n\n // Merge features\n if (config.features) {\n result.features = { ...result.features, ...config.features };\n }\n\n // Merge mcps\n if (config.mcps) {\n result.mcps = { ...result.mcps, ...config.mcps };\n }\n }\n\n return result;\n}\n","/**\n * OpenCode Athena Plugin\n *\n * The main OpenCode plugin that provides BMAD integration tools and hooks.\n */\n\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport { createCompactionHook, createSessionHooks, createToolHooks } from \"./hooks/index.js\";\nimport { createTools } from \"./tools/index.js\";\nimport { StoryTracker } from \"./tracker/story-tracker.js\";\nimport { loadAthenaConfig } from \"./utils/config-loader.js\";\n\n/**\n * OpenCode Athena plugin factory.\n *\n * Provides:\n * - Custom tools for BMAD story management\n * - Session hooks for context tracking\n * - Tool execution hooks for status updates\n * - Compaction hooks to preserve BMAD context\n */\nexport const OpenCodeAthena: Plugin = async (ctx) => {\n const { directory } = ctx;\n\n // Load Athena configuration (project-local takes priority over global)\n const config = await loadAthenaConfig(directory);\n\n // Initialize story tracker for session state persistence\n const tracker = new StoryTracker(directory);\n await tracker.initialize();\n\n // Create tools\n const tools = createTools(ctx, tracker, config);\n\n // Create hooks\n const sessionHooks = createSessionHooks(ctx, tracker, config);\n const toolHooks = createToolHooks(tracker, config);\n const compactionHook = createCompactionHook(tracker);\n\n return {\n // Custom tools for BMAD integration\n tool: tools,\n\n // Session event handlers\n event: sessionHooks,\n\n // Tool execution hooks (stubs for now)\n \"tool.execute.before\": toolHooks.before,\n \"tool.execute.after\": toolHooks.after,\n\n // Compaction hook to preserve BMAD context\n \"experimental.session.compacting\": compactionHook,\n };\n};\n\n// Default export for OpenCode plugin loader\nexport default OpenCodeAthena;\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "opencode-athena",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Strategic wisdom meets practical execution - Unified oh-my-opencode + BMAD METHOD toolkit for OpenCode",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"opencode",
|
|
7
|
+
"ai",
|
|
8
|
+
"agents",
|
|
9
|
+
"bmad",
|
|
10
|
+
"oh-my-opencode",
|
|
11
|
+
"agentic",
|
|
12
|
+
"development",
|
|
13
|
+
"toolkit",
|
|
14
|
+
"cli",
|
|
15
|
+
"athena"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/ZebulonRouseFrantzich/opencode-athena#readme",
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/ZebulonRouseFrantzich/opencode-athena/issues"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/ZebulonRouseFrantzich/opencode-athena.git"
|
|
24
|
+
},
|
|
25
|
+
"license": "MIT-0",
|
|
26
|
+
"author": "ZebulonRouseFrantzich",
|
|
27
|
+
"type": "module",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"import": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./plugin": {
|
|
34
|
+
"types": "./dist/plugin/index.d.ts",
|
|
35
|
+
"import": "./dist/plugin/index.js"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"main": "./dist/index.js",
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"bin": {
|
|
41
|
+
"opencode-athena": "./dist/cli/index.js",
|
|
42
|
+
"athena": "./dist/cli/index.js"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"commands",
|
|
47
|
+
"config"
|
|
48
|
+
],
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsup",
|
|
51
|
+
"dev": "tsup --watch",
|
|
52
|
+
"lint": "biome check src",
|
|
53
|
+
"lint:fix": "biome check --write src",
|
|
54
|
+
"format": "biome format --write src",
|
|
55
|
+
"check": "biome check --write src",
|
|
56
|
+
"test": "vitest",
|
|
57
|
+
"test:coverage": "vitest --coverage",
|
|
58
|
+
"typecheck": "tsc --noEmit",
|
|
59
|
+
"prepublishOnly": "npm run build"
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"@inquirer/prompts": "^7.10.1",
|
|
63
|
+
"chalk": "^5.6.2",
|
|
64
|
+
"commander": "^12.1.0",
|
|
65
|
+
"ora": "^8.2.0",
|
|
66
|
+
"yaml": "^2.8.2",
|
|
67
|
+
"zod": "^3.25.76"
|
|
68
|
+
},
|
|
69
|
+
"devDependencies": {
|
|
70
|
+
"@biomejs/biome": "^1.9.4",
|
|
71
|
+
"@opencode-ai/plugin": "^1.0.184",
|
|
72
|
+
"@types/node": "^22.19.3",
|
|
73
|
+
"tsup": "^8.5.1",
|
|
74
|
+
"typescript": "^5.9.3",
|
|
75
|
+
"vitest": "^2.1.9"
|
|
76
|
+
},
|
|
77
|
+
"peerDependencies": {
|
|
78
|
+
"@opencode-ai/plugin": ">=0.1.0"
|
|
79
|
+
},
|
|
80
|
+
"engines": {
|
|
81
|
+
"node": ">=20.0.0"
|
|
82
|
+
}
|
|
83
|
+
}
|