@deimoscloud/coreai 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/loader.ts","../src/agents/types.ts","../src/agents/loader.ts","../src/agents/resolver.ts","../src/agents/compiler.ts","../src/adapters/types.ts","../src/adapters/factory.ts","../src/adapters/mcp/client.ts","../src/adapters/native/github.ts","../src/cache/types.ts","../src/cache/provider.ts","../src/cache/manager.ts","../src/context/loader.ts","../src/commands/context.ts","../src/commands/registry.ts","../src/commands/loader.ts","../src/commands/runner.ts","../src/skills/generator.ts","../src/skills/templates.ts","../src/knowledge-library/manager.ts","../src/index.ts"],"sourcesContent":["/**\n * Configuration Loader\n *\n * Handles config file discovery, parsing, validation, and defaults.\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { dirname, join, resolve } from 'path';\nimport { parse as parseYaml } from 'yaml';\nimport Ajv, { type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport type { CoreAIConfig, ResolvedCoreAIConfig } from './types.js';\n\n// Import schema as JSON\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst configSchema = require('../../schemas/coreai.config.schema.json') as object;\n\nconst CONFIG_FILE_NAME = 'coreai.config.yaml';\nconst CONFIG_FILE_NAMES = [CONFIG_FILE_NAME, 'coreai.config.yml'];\n\nexport class ConfigError extends Error {\n constructor(\n message: string,\n public readonly code: ConfigErrorCode,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\nexport type ConfigErrorCode = 'NOT_FOUND' | 'PARSE_ERROR' | 'VALIDATION_ERROR' | 'READ_ERROR';\n\n/**\n * Default team agents\n */\nconst DEFAULT_AGENTS = [\n 'backend-engineer',\n 'frontend-engineer',\n 'devops-engineer',\n 'engineering-manager',\n];\n\n/**\n * Find the config file by walking up the directory tree\n */\nexport function findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = resolve(startDir);\n const root = dirname(currentDir);\n\n while (currentDir !== root) {\n for (const fileName of CONFIG_FILE_NAMES) {\n const configPath = join(currentDir, fileName);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n // Check root directory\n for (const fileName of CONFIG_FILE_NAMES) {\n const configPath = join(currentDir, fileName);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n return null;\n}\n\n/**\n * Parse YAML content into an object\n */\nexport function parseConfig(content: string, filePath?: string): unknown {\n try {\n return parseYaml(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown parse error';\n throw new ConfigError(\n `Failed to parse YAML${filePath ? ` in ${filePath}` : ''}: ${message}`,\n 'PARSE_ERROR',\n error\n );\n }\n}\n\n/**\n * Validate config against JSON schema\n */\nexport function validateConfig(config: unknown): CoreAIConfig {\n const ajv = new Ajv.default({ allErrors: true, strict: false });\n addFormats.default(ajv);\n\n const validate = ajv.compile<CoreAIConfig>(configSchema);\n const valid = validate(config);\n\n if (!valid) {\n const errors: ErrorObject[] = validate.errors ?? [];\n const errorMessages = errors.map((err: ErrorObject) => {\n const path = err.instancePath || 'root';\n return `${path}: ${err.message ?? 'unknown error'}`;\n });\n\n throw new ConfigError(\n `Configuration validation failed:\\n - ${errorMessages.join('\\n - ')}`,\n 'VALIDATION_ERROR',\n errors\n );\n }\n\n return config as CoreAIConfig;\n}\n\n/**\n * Apply default values to config\n */\nexport function applyDefaults(config: CoreAIConfig): ResolvedCoreAIConfig {\n return {\n ...config,\n project: {\n name: config.project?.name ?? 'unnamed',\n type: config.project?.type ?? 'software',\n root: config.project?.root ?? process.cwd(),\n },\n team: {\n agents: config.team?.agents ?? DEFAULT_AGENTS,\n },\n };\n}\n\n/**\n * Load and validate configuration from a file path\n */\nexport function loadConfigFromFile(filePath: string): ResolvedCoreAIConfig {\n let content: string;\n\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown read error';\n throw new ConfigError(\n `Failed to read config file ${filePath}: ${message}`,\n 'READ_ERROR',\n error\n );\n }\n\n const parsed = parseConfig(content, filePath);\n const validated = validateConfig(parsed);\n return applyDefaults(validated);\n}\n\n/**\n * Load configuration by searching for config file\n */\nexport function loadConfig(startDir?: string): ResolvedCoreAIConfig {\n const configPath = findConfigFile(startDir);\n\n if (!configPath) {\n throw new ConfigError(\n `Configuration file not found. Create a ${CONFIG_FILE_NAME} file or run 'coreai init'.`,\n 'NOT_FOUND'\n );\n }\n\n return loadConfigFromFile(configPath);\n}\n\n/**\n * Check if a config file exists in the given directory or parent directories\n */\nexport function configExists(startDir?: string): boolean {\n return findConfigFile(startDir) !== null;\n}\n\n/**\n * Get the path to the config file, or null if not found\n */\nexport function getConfigPath(startDir?: string): string | null {\n return findConfigFile(startDir);\n}\n","/**\n * CoreAI Agent Types\n *\n * TypeScript types corresponding to the JSON schema at schemas/agent.schema.json\n */\n\nexport type AgentType = 'ic-engineer' | 'manager' | 'specialist' | 'coordinator';\n\nexport type WorkflowType =\n | 'ticket-implementation'\n | 'bug-investigation'\n | 'code-review'\n | 'planning-estimation';\n\nexport interface AgentExpertise {\n primary?: string[];\n tech_stack?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentPrinciples {\n code_quality?: string[];\n testing?: string[];\n security?: string[];\n performance?: string[];\n [key: string]: string[] | undefined;\n}\n\nexport interface AgentBehaviors {\n workflow?: WorkflowType;\n quality_gates?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentContextSources {\n shared?: string[];\n personal?: string[];\n}\n\nexport interface AgentCommunication {\n inbox?: string;\n outbox?: string;\n}\n\n/**\n * Default Claude Code tools available to agents\n */\nexport const DEFAULT_AGENT_TOOLS = ['Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep'] as const;\n\n/**\n * Raw agent definition as loaded from YAML (before variable resolution)\n */\nexport interface AgentDefinition {\n role: string;\n type: AgentType;\n display_name: string;\n description: string;\n responsibilities?: string[];\n expertise?: AgentExpertise;\n skills?: string[];\n principles?: AgentPrinciples;\n behaviors?: AgentBehaviors;\n context_sources?: AgentContextSources;\n communication?: AgentCommunication;\n /**\n * Claude Code tools available to this agent.\n * If not specified, defaults to: Read, Write, Edit, Bash, Glob, Grep\n */\n tools?: string[];\n}\n\n/**\n * Agent definition after variable resolution\n */\nexport interface ResolvedAgentDefinition extends AgentDefinition {\n // After resolution, these fields may have expanded values\n expertise?: AgentExpertise & {\n tech_stack?: Record<string, unknown>;\n };\n behaviors?: AgentBehaviors & {\n quality_gates?: Record<string, unknown>;\n };\n}\n\n/**\n * Agent source location\n */\nexport type AgentSource = 'core' | 'custom' | 'override';\n\n/**\n * Agent metadata including source information\n */\nexport interface AgentMetadata {\n definition: AgentDefinition;\n source: AgentSource;\n filePath: string;\n}\n","/**\n * Agent Loader\n *\n * Handles loading and validating agent YAML definitions.\n */\n\nimport { existsSync, readdirSync, readFileSync } from 'fs';\nimport { basename, extname, join } from 'path';\nimport { parse as parseYaml } from 'yaml';\nimport Ajv, { type ErrorObject } from 'ajv';\nimport type { AgentDefinition, AgentMetadata, AgentSource } from './types.js';\n\n// Import schema as JSON\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst agentSchema = require('../../schemas/agent.schema.json') as object;\n\nexport class AgentError extends Error {\n constructor(\n message: string,\n public readonly code: AgentErrorCode,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'AgentError';\n }\n}\n\nexport type AgentErrorCode = 'NOT_FOUND' | 'PARSE_ERROR' | 'VALIDATION_ERROR' | 'READ_ERROR';\n\n/**\n * Parse YAML content into an agent definition\n */\nexport function parseAgentYaml(content: string, filePath?: string): unknown {\n try {\n return parseYaml(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown parse error';\n throw new AgentError(\n `Failed to parse agent YAML${filePath ? ` in ${filePath}` : ''}: ${message}`,\n 'PARSE_ERROR',\n error\n );\n }\n}\n\n/**\n * Validate parsed YAML against agent schema\n */\nexport function validateAgentDefinition(agent: unknown): AgentDefinition {\n const ajv = new Ajv.default({ allErrors: true, strict: false });\n const validate = ajv.compile<AgentDefinition>(agentSchema);\n const valid = validate(agent);\n\n if (!valid) {\n const errors: ErrorObject[] = validate.errors ?? [];\n const errorMessages = errors.map((err: ErrorObject) => {\n const path = err.instancePath || 'root';\n return `${path}: ${err.message ?? 'unknown error'}`;\n });\n\n throw new AgentError(\n `Agent validation failed:\\n - ${errorMessages.join('\\n - ')}`,\n 'VALIDATION_ERROR',\n errors\n );\n }\n\n return agent as AgentDefinition;\n}\n\n/**\n * Load and validate an agent definition from a file\n */\nexport function loadAgentFromFile(filePath: string): AgentDefinition {\n if (!existsSync(filePath)) {\n throw new AgentError(`Agent file not found: ${filePath}`, 'NOT_FOUND');\n }\n\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown read error';\n throw new AgentError(`Failed to read agent file ${filePath}: ${message}`, 'READ_ERROR', error);\n }\n\n const parsed = parseAgentYaml(content, filePath);\n return validateAgentDefinition(parsed);\n}\n\n/**\n * List all YAML files in a directory\n */\nfunction listYamlFiles(dir: string): string[] {\n if (!existsSync(dir)) {\n return [];\n }\n\n return readdirSync(dir)\n .filter((file) => {\n const ext = extname(file).toLowerCase();\n return ext === '.yaml' || ext === '.yml';\n })\n .map((file) => join(dir, file));\n}\n\n/**\n * Load all agents from a directory\n */\nexport function loadAgentsFromDirectory(\n dir: string,\n source: AgentSource\n): Map<string, AgentMetadata> {\n const agents = new Map<string, AgentMetadata>();\n const files = listYamlFiles(dir);\n\n for (const filePath of files) {\n try {\n const definition = loadAgentFromFile(filePath);\n agents.set(definition.role, {\n definition,\n source,\n filePath,\n });\n } catch (error) {\n // Log warning but continue loading other agents\n const fileName = basename(filePath);\n console.warn(`Warning: Failed to load agent from ${fileName}: ${(error as Error).message}`);\n }\n }\n\n return agents;\n}\n\n/**\n * Get the agent role name from a filename\n */\nexport function getRoleFromFilename(filePath: string): string {\n const fileName = basename(filePath);\n const ext = extname(fileName);\n return fileName.slice(0, -ext.length);\n}\n","/**\n * Variable Resolution System\n *\n * Resolves variable placeholders in agent definitions.\n * Supports: ${config.*}, ${agent.*}, ${remote.*}\n */\n\nimport type { CoreAIConfig } from '../config/types.js';\nimport type { AgentDefinition } from './types.js';\n\n/**\n * Context for variable resolution\n */\nexport interface ResolutionContext {\n config?: CoreAIConfig;\n agent?: AgentDefinition;\n}\n\n/**\n * Options for variable resolution\n */\nexport interface ResolutionOptions {\n /**\n * If true, throw an error for unresolved variables.\n * If false, leave unresolved variables as-is.\n * Default: false\n */\n strict?: boolean;\n}\n\n/**\n * Error thrown when variable resolution fails\n */\nexport class ResolutionError extends Error {\n constructor(\n message: string,\n public readonly variable: string,\n public readonly path?: string\n ) {\n super(message);\n this.name = 'ResolutionError';\n }\n}\n\n/**\n * Pattern to match variable placeholders: ${namespace.path.to.value}\n */\nconst VARIABLE_PATTERN = /\\$\\{([a-z_][a-z0-9_]*(?:\\.[a-z_][a-z0-9_]*)*)\\}/gi;\n\n/**\n * Get a nested value from an object using dot notation\n */\nfunction getNestedValue(obj: unknown, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n if (typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n/**\n * Resolve a single variable reference\n */\nfunction resolveVariable(\n variable: string,\n context: ResolutionContext,\n options: ResolutionOptions\n): string | undefined {\n const parts = variable.split('.');\n const namespace = parts[0];\n const path = parts.slice(1).join('.');\n\n let value: unknown;\n\n switch (namespace) {\n case 'config':\n if (!context.config) {\n if (options.strict) {\n throw new ResolutionError(\n `Cannot resolve \\${${variable}}: no config context provided`,\n variable\n );\n }\n return undefined;\n }\n value = getNestedValue(context.config, path);\n break;\n\n case 'agent':\n if (!context.agent) {\n if (options.strict) {\n throw new ResolutionError(\n `Cannot resolve \\${${variable}}: no agent context provided`,\n variable\n );\n }\n return undefined;\n }\n value = getNestedValue(context.agent, path);\n break;\n\n case 'remote':\n // Remote is a shortcut for integration URLs\n value = resolveRemoteVariable(path, context, options);\n break;\n\n default:\n if (options.strict) {\n throw new ResolutionError(`Unknown variable namespace: ${namespace}`, variable);\n }\n return undefined;\n }\n\n if (value === undefined) {\n if (options.strict) {\n throw new ResolutionError(`Cannot resolve \\${${variable}}: path not found`, variable, path);\n }\n return undefined;\n }\n\n // Convert value to string representation\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n // For objects/arrays, return JSON representation\n return JSON.stringify(value);\n}\n\n/**\n * Resolve remote.* variables (shortcuts to integration URLs)\n */\nfunction resolveRemoteVariable(\n path: string,\n context: ResolutionContext,\n options: ResolutionOptions\n): string | undefined {\n if (!context.config?.integrations) {\n if (options.strict) {\n throw new ResolutionError(\n `Cannot resolve \\${remote.${path}}: no integrations configured`,\n `remote.${path}`\n );\n }\n return undefined;\n }\n\n const integrations = context.config.integrations;\n\n // Map remote shortcuts to integration paths\n switch (path) {\n case 'documentation':\n return (\n integrations.documentation?.config?.base_url ??\n integrations.documentation?.config?.base_path\n );\n\n case 'issues':\n return integrations.issue_tracker?.config?.base_url;\n\n case 'git':\n return integrations.git?.config?.repo;\n\n case 'state':\n return integrations.state?.config?.base_path ?? integrations.state?.config?.bucket;\n\n default:\n // Try to resolve as nested path under integrations\n return getNestedValue(integrations, path) as string | undefined;\n }\n}\n\n/**\n * Resolve all variables in a string\n */\nexport function resolveString(\n input: string,\n context: ResolutionContext,\n options: ResolutionOptions = {}\n): string {\n return input.replace(VARIABLE_PATTERN, (match, variable: string) => {\n const resolved = resolveVariable(variable, context, options);\n return resolved !== undefined ? resolved : match;\n });\n}\n\n/**\n * Check if a string contains variable placeholders\n */\nexport function hasVariables(input: string): boolean {\n // Create new regex to avoid state issues with global flag\n const pattern = /\\$\\{([a-z_][a-z0-9_]*(?:\\.[a-z_][a-z0-9_]*)*)\\}/i;\n return pattern.test(input);\n}\n\n/**\n * Extract all variable references from a string\n */\nexport function extractVariables(input: string): string[] {\n const matches = input.matchAll(VARIABLE_PATTERN);\n return Array.from(matches, (m) => m[1]).filter((v): v is string => v !== undefined);\n}\n\n/**\n * Recursively resolve all variables in an object\n */\nexport function resolveObject<T>(\n obj: T,\n context: ResolutionContext,\n options: ResolutionOptions = {}\n): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n return resolveString(obj, context, options) as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveObject(item, context, options)) as T;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = resolveObject(value, context, options);\n }\n return result as T;\n }\n\n return obj;\n}\n\n/**\n * Resolve all variables in an agent definition\n */\nexport function resolveAgentDefinition(\n agent: AgentDefinition,\n config?: CoreAIConfig,\n options: ResolutionOptions = {}\n): AgentDefinition {\n const context: ResolutionContext = {\n agent,\n };\n if (config) {\n context.config = config;\n }\n\n return resolveObject(agent, context, options);\n}\n","/**\n * Agent Compiler\n *\n * Transforms YAML agent definitions into Claude-compatible Markdown files.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport type { CoreAIConfig } from '../config/types.js';\nimport type { AgentDefinition, AgentMetadata, AgentSource } from './types.js';\nimport { DEFAULT_AGENT_TOOLS } from './types.js';\nimport { loadAgentsFromDirectory } from './loader.js';\nimport { resolveAgentDefinition } from './resolver.js';\n\n/**\n * Options for compiling agents\n */\nexport interface CompileOptions {\n /**\n * Output directory for compiled markdown files.\n * Default: .claude/agents\n */\n outputDir?: string;\n\n /**\n * Core agents directory (built-in agents).\n * Default: uses package's agents/ directory\n */\n coreAgentsDir?: string;\n\n /**\n * Custom agents directory (project-specific agents).\n * Default: coreai/agents in project root\n */\n customAgentsDir?: string;\n\n /**\n * Project root directory.\n * Default: process.cwd()\n */\n projectRoot?: string;\n\n /**\n * Filter function to select which agents to compile.\n * Returns true to include the agent, false to exclude.\n */\n filter?: (agent: AgentDefinition) => boolean;\n\n /**\n * MCP server names to include as tools.\n * These will be added to the agent's tools as mcp__<server-name>.\n * Example: ['github', 'postgres'] -> 'mcp__github, mcp__postgres'\n */\n mcpServers?: string[];\n}\n\n/**\n * Result of compiling agents\n */\nexport interface CompileResult {\n /**\n * Successfully compiled agents\n */\n compiled: {\n role: string;\n source: AgentSource;\n outputPath: string;\n }[];\n\n /**\n * Agents that failed to compile\n */\n errors: {\n role: string;\n source: AgentSource;\n error: string;\n }[];\n}\n\n/**\n * Build the tools string for agent frontmatter\n *\n * @param agent - Agent definition (may have custom tools)\n * @param mcpServers - Optional MCP server names to include\n * @returns Comma-separated list of tools\n */\nexport function buildAgentTools(agent: AgentDefinition, mcpServers?: string[]): string {\n // Start with agent-specific tools or defaults\n const tools: string[] = agent.tools\n ? [...agent.tools]\n : [...DEFAULT_AGENT_TOOLS];\n\n // Add MCP tools if servers are specified\n if (mcpServers && mcpServers.length > 0) {\n for (const server of mcpServers) {\n tools.push(`mcp__${server}`);\n }\n }\n\n return tools.join(', ');\n}\n\n/**\n * Generate markdown content from a resolved agent definition\n *\n * The output includes YAML frontmatter required by Claude Code for subagent detection.\n * See: https://code.claude.com/docs/en/sub-agents\n *\n * @param agent - Resolved agent definition\n * @param mcpServers - Optional MCP server names to include as tools\n */\nexport function generateAgentMarkdown(agent: AgentDefinition, mcpServers?: string[]): string {\n const lines: string[] = [];\n\n // Build tools string\n const tools = buildAgentTools(agent, mcpServers);\n\n // YAML frontmatter (required by Claude Code for subagent detection)\n lines.push('---');\n lines.push(`name: ${agent.role}`);\n // Flatten description to single line for YAML frontmatter\n lines.push(`description: ${agent.description.replace(/\\n/g, ' ').trim()}`);\n lines.push(`tools: ${tools}`);\n lines.push('---');\n lines.push('');\n\n // Header\n lines.push(`# ${agent.display_name}`);\n lines.push('');\n lines.push(`**Role:** ${agent.role}`);\n lines.push(`**Type:** ${agent.type}`);\n lines.push('');\n\n // Description\n lines.push('## Description');\n lines.push('');\n lines.push(agent.description.trim());\n lines.push('');\n\n // Responsibilities\n if (agent.responsibilities && agent.responsibilities.length > 0) {\n lines.push('## Responsibilities');\n lines.push('');\n for (const responsibility of agent.responsibilities) {\n lines.push(`- ${responsibility}`);\n }\n lines.push('');\n }\n\n // Expertise\n if (agent.expertise) {\n lines.push('## Expertise');\n lines.push('');\n\n if (agent.expertise.primary && agent.expertise.primary.length > 0) {\n lines.push('### Primary Areas');\n lines.push('');\n for (const area of agent.expertise.primary) {\n lines.push(`- ${area}`);\n }\n lines.push('');\n }\n\n if (agent.expertise.tech_stack) {\n lines.push('### Tech Stack');\n lines.push('');\n const techStack = agent.expertise.tech_stack;\n if (typeof techStack === 'string') {\n lines.push(techStack);\n } else if (typeof techStack === 'object') {\n lines.push('```json');\n lines.push(JSON.stringify(techStack, null, 2));\n lines.push('```');\n }\n lines.push('');\n }\n }\n\n // Skills\n if (agent.skills && agent.skills.length > 0) {\n lines.push('## Skills');\n lines.push('');\n for (const skill of agent.skills) {\n lines.push(`- ${skill}`);\n }\n lines.push('');\n }\n\n // Principles\n if (agent.principles) {\n lines.push('## Principles');\n lines.push('');\n\n for (const [category, items] of Object.entries(agent.principles)) {\n if (items && Array.isArray(items) && items.length > 0) {\n const title = formatTitle(category);\n lines.push(`### ${title}`);\n lines.push('');\n for (const item of items) {\n lines.push(`- ${item}`);\n }\n lines.push('');\n }\n }\n }\n\n // Behaviors\n if (agent.behaviors) {\n lines.push('## Behaviors');\n lines.push('');\n\n if (agent.behaviors.workflow) {\n lines.push(`**Workflow:** ${agent.behaviors.workflow}`);\n lines.push('');\n }\n\n if (agent.behaviors.quality_gates) {\n lines.push('### Quality Gates');\n lines.push('');\n const gates = agent.behaviors.quality_gates;\n if (typeof gates === 'string') {\n lines.push(gates);\n } else if (typeof gates === 'object') {\n lines.push('```json');\n lines.push(JSON.stringify(gates, null, 2));\n lines.push('```');\n }\n lines.push('');\n }\n }\n\n // Context Sources\n if (agent.context_sources) {\n lines.push('## Context Sources');\n lines.push('');\n\n if (agent.context_sources.shared && agent.context_sources.shared.length > 0) {\n lines.push('### Shared');\n lines.push('');\n for (const source of agent.context_sources.shared) {\n lines.push(`- ${source}`);\n }\n lines.push('');\n }\n\n if (agent.context_sources.personal && agent.context_sources.personal.length > 0) {\n lines.push('### Personal');\n lines.push('');\n for (const source of agent.context_sources.personal) {\n lines.push(`- ${source}`);\n }\n lines.push('');\n }\n }\n\n // Communication\n if (agent.communication) {\n lines.push('## Communication');\n lines.push('');\n if (agent.communication.inbox) {\n lines.push(`**Inbox:** ${agent.communication.inbox}`);\n }\n if (agent.communication.outbox) {\n lines.push(`**Outbox:** ${agent.communication.outbox}`);\n }\n lines.push('');\n }\n\n // Footer\n lines.push('---');\n lines.push('');\n lines.push('*Generated by CoreAI*');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Format a snake_case or kebab-case string as a title\n */\nfunction formatTitle(str: string): string {\n return str.replace(/[_-]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Compile a single agent to markdown\n *\n * @param agent - Agent definition to compile\n * @param config - Optional CoreAI config for variable resolution\n * @param mcpServers - Optional MCP server names to include as tools\n */\nexport function compileAgent(\n agent: AgentDefinition,\n config?: CoreAIConfig,\n mcpServers?: string[]\n): string {\n const resolved = resolveAgentDefinition(agent, config);\n return generateAgentMarkdown(resolved, mcpServers);\n}\n\n/**\n * Load all agents from core and custom directories\n */\nexport function loadAllAgents(options: CompileOptions = {}): Map<string, AgentMetadata> {\n const agents = new Map<string, AgentMetadata>();\n\n // Load core agents\n if (options.coreAgentsDir && existsSync(options.coreAgentsDir)) {\n const coreAgents = loadAgentsFromDirectory(options.coreAgentsDir, 'core');\n for (const [role, metadata] of coreAgents) {\n agents.set(role, metadata);\n }\n }\n\n // Load custom agents (can override core agents)\n if (options.customAgentsDir && existsSync(options.customAgentsDir)) {\n const customAgents = loadAgentsFromDirectory(options.customAgentsDir, 'custom');\n for (const [role, metadata] of customAgents) {\n // Check if this is overriding a core agent\n if (agents.has(role)) {\n metadata.source = 'override';\n }\n agents.set(role, metadata);\n }\n }\n\n return agents;\n}\n\n/**\n * Filter agents based on team configuration\n */\nexport function filterAgentsByTeam(\n agents: Map<string, AgentMetadata>,\n config?: CoreAIConfig\n): Map<string, AgentMetadata> {\n if (!config?.team?.agents || config.team.agents.length === 0) {\n // No team filter, return all agents\n return agents;\n }\n\n const filtered = new Map<string, AgentMetadata>();\n for (const role of config.team.agents) {\n const metadata = agents.get(role);\n if (metadata) {\n filtered.set(role, metadata);\n }\n }\n\n return filtered;\n}\n\n/**\n * Compile all agents and write to output directory\n */\nexport function compileAgents(config?: CoreAIConfig, options: CompileOptions = {}): CompileResult {\n const projectRoot = options.projectRoot ?? process.cwd();\n const outputDir = options.outputDir ?? join(projectRoot, '.claude', 'agents');\n const customAgentsDir = options.customAgentsDir ?? join(projectRoot, 'coreai', 'agents');\n\n const result: CompileResult = {\n compiled: [],\n errors: [],\n };\n\n // Load all agents\n const allAgents = loadAllAgents({\n ...options,\n customAgentsDir,\n });\n\n // Filter by team if configured\n const agents = filterAgentsByTeam(allAgents, config);\n\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Compile each agent\n for (const [role, metadata] of agents) {\n // Apply custom filter if provided\n if (options.filter && !options.filter(metadata.definition)) {\n continue;\n }\n\n try {\n const markdown = compileAgent(metadata.definition, config, options.mcpServers);\n const outputPath = join(outputDir, `${role}.md`);\n\n writeFileSync(outputPath, markdown, 'utf-8');\n\n result.compiled.push({\n role,\n source: metadata.source,\n outputPath,\n });\n } catch (error) {\n result.errors.push({\n role,\n source: metadata.source,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n\n/**\n * Get the default core agents directory\n */\nexport function getCoreAgentsDir(): string {\n // Navigate from dist/agents/compiler.js to agents/\n return join(dirname(dirname(dirname(import.meta.url.replace('file://', '')))), 'agents');\n}\n","/**\n * Adapter Types\n *\n * Common types used across all adapters.\n */\n\n/**\n * The type of adapter\n */\nexport type AdapterType = 'issue_tracker' | 'git' | 'documentation' | 'state';\n\n/**\n * How the adapter connects to the service\n */\nexport type AdapterImplementation = 'mcp' | 'native' | 'mock';\n\n/**\n * Base metadata for all adapters\n */\nexport interface AdapterInfo {\n /**\n * Type of adapter\n */\n type: AdapterType;\n\n /**\n * Provider name (e.g., 'github', 'jira', 'confluence')\n */\n provider: string;\n\n /**\n * How this adapter is implemented\n */\n implementation: AdapterImplementation;\n\n /**\n * Whether the adapter is currently connected/available\n */\n connected: boolean;\n}\n\n/**\n * Common issue status values\n */\nexport type IssueStatus =\n | 'backlog'\n | 'todo'\n | 'in_progress'\n | 'in_review'\n | 'done'\n | 'closed'\n | string;\n\n/**\n * Common pull request status values\n */\nexport type PullRequestStatus = 'open' | 'merged' | 'closed' | 'draft';\n\n/**\n * Common review decision values\n */\nexport type ReviewDecision = 'approve' | 'request_changes' | 'comment';\n\n/**\n * Issue data structure\n */\nexport interface Issue {\n id: string;\n key: string;\n title: string;\n description?: string;\n status: IssueStatus;\n assignee?: string;\n reporter?: string;\n labels?: string[];\n priority?: string;\n created_at?: string;\n updated_at?: string;\n url?: string;\n}\n\n/**\n * Data for creating an issue\n */\nexport interface CreateIssueData {\n title: string;\n description?: string;\n assignee?: string;\n labels?: string[];\n priority?: string;\n type?: string;\n}\n\n/**\n * Data for updating an issue\n */\nexport interface UpdateIssueData {\n title?: string;\n description?: string;\n assignee?: string;\n labels?: string[];\n priority?: string;\n status?: IssueStatus;\n}\n\n/**\n * Query parameters for listing issues\n */\nexport interface IssueQuery {\n assignee?: string;\n status?: IssueStatus | IssueStatus[];\n labels?: string[];\n limit?: number;\n offset?: number;\n}\n\n/**\n * Pull request data structure\n */\nexport interface PullRequest {\n id: string;\n number: number;\n title: string;\n description?: string;\n status: PullRequestStatus;\n author?: string;\n source_branch: string;\n target_branch: string;\n created_at?: string;\n updated_at?: string;\n merged_at?: string;\n url?: string;\n reviewers?: string[];\n}\n\n/**\n * Data for creating a pull request\n */\nexport interface CreatePullRequestData {\n title: string;\n description?: string;\n source_branch: string;\n target_branch: string;\n draft?: boolean;\n reviewers?: string[];\n}\n\n/**\n * Query parameters for listing pull requests\n */\nexport interface PullRequestQuery {\n status?: PullRequestStatus | PullRequestStatus[];\n author?: string;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Review data for a pull request\n */\nexport interface Review {\n id: string;\n pull_request_id: string;\n author: string;\n decision: ReviewDecision;\n body?: string;\n created_at?: string;\n}\n\n/**\n * Data for creating a review\n */\nexport interface CreateReviewData {\n decision: ReviewDecision;\n body?: string;\n comments?: ReviewComment[];\n}\n\n/**\n * Comment on a specific line in a review\n */\nexport interface ReviewComment {\n path: string;\n line: number;\n body: string;\n}\n\n/**\n * Documentation page data structure\n */\nexport interface DocumentationPage {\n id: string;\n title: string;\n content?: string;\n path?: string;\n url?: string;\n parent_id?: string;\n created_at?: string;\n updated_at?: string;\n}\n\n/**\n * Query parameters for searching documentation\n */\nexport interface DocumentationQuery {\n query: string;\n space?: string;\n limit?: number;\n}\n\n/**\n * File/directory entry for state provider\n */\nexport interface StateEntry {\n path: string;\n name: string;\n type: 'file' | 'directory';\n size?: number;\n modified_at?: string;\n}\n\n/**\n * Options for state operations\n */\nexport interface StateOptions {\n /**\n * Create parent directories if they don't exist\n */\n recursive?: boolean;\n\n /**\n * Encoding for text content\n */\n encoding?: BufferEncoding;\n}\n\n/**\n * Adapter error with context\n */\nexport class AdapterError extends Error {\n public readonly code: AdapterErrorCode;\n public readonly adapter?: AdapterInfo;\n\n constructor(message: string, code: AdapterErrorCode, adapter?: AdapterInfo, cause?: Error) {\n super(message, { cause });\n this.name = 'AdapterError';\n this.code = code;\n if (adapter) {\n this.adapter = adapter;\n }\n }\n}\n\n/**\n * Error codes for adapter operations\n */\nexport type AdapterErrorCode =\n | 'not_found'\n | 'unauthorized'\n | 'forbidden'\n | 'rate_limited'\n | 'network_error'\n | 'invalid_request'\n | 'not_implemented'\n | 'connection_failed'\n | 'provider_error'\n | 'operation_failed'\n | 'invalid_operation'\n | 'not_connected'\n | 'invalid_config';\n","/**\n * Adapter Factory\n *\n * Creates and manages adapter instances based on configuration.\n */\n\nimport type { CoreAIConfig, AdapterStrategy } from '../config/types.js';\nimport type { AdapterType, AdapterInfo, AdapterImplementation } from './types.js';\nimport { AdapterError } from './types.js';\nimport type {\n IssueTrackerAdapter,\n GitProviderAdapter,\n DocumentationProviderAdapter,\n StateProviderAdapter,\n Adapter,\n} from './interfaces.js';\n\n/**\n * Options for creating an adapter\n */\nexport interface AdapterFactoryOptions {\n /**\n * Override the strategy from config\n */\n strategy?: AdapterStrategy;\n\n /**\n * Force a specific implementation\n */\n implementation?: AdapterImplementation;\n}\n\n/**\n * Registry of adapter creators\n */\ninterface AdapterCreator<T extends Adapter> {\n mcp?: (config: CoreAIConfig) => Promise<T>;\n native?: (config: CoreAIConfig) => Promise<T>;\n mock?: (config: CoreAIConfig) => Promise<T>;\n}\n\n/**\n * Adapter Factory\n *\n * Creates adapter instances based on configuration and available implementations.\n */\nexport class AdapterFactory {\n private config: CoreAIConfig;\n private adapters = new Map<AdapterType, Adapter>();\n\n /**\n * Registry of adapter creators by type\n */\n private creators: {\n issue_tracker: AdapterCreator<IssueTrackerAdapter>;\n git: AdapterCreator<GitProviderAdapter>;\n documentation: AdapterCreator<DocumentationProviderAdapter>;\n state: AdapterCreator<StateProviderAdapter>;\n } = {\n issue_tracker: {},\n git: {},\n documentation: {},\n state: {},\n };\n\n constructor(config: CoreAIConfig) {\n this.config = config;\n }\n\n /**\n * Register an adapter creator\n */\n registerCreator<T extends AdapterType>(\n type: T,\n implementation: AdapterImplementation,\n creator: (config: CoreAIConfig) => Promise<Adapter>\n ): void {\n const typeCreators = this.creators[type] as AdapterCreator<Adapter>;\n typeCreators[implementation] = creator;\n }\n\n /**\n * Get an issue tracker adapter\n */\n async getIssueTracker(options?: AdapterFactoryOptions): Promise<IssueTrackerAdapter> {\n return this.getAdapter('issue_tracker', options) as Promise<IssueTrackerAdapter>;\n }\n\n /**\n * Get a git provider adapter\n */\n async getGitProvider(options?: AdapterFactoryOptions): Promise<GitProviderAdapter> {\n return this.getAdapter('git', options) as Promise<GitProviderAdapter>;\n }\n\n /**\n * Get a documentation provider adapter\n */\n async getDocumentationProvider(\n options?: AdapterFactoryOptions\n ): Promise<DocumentationProviderAdapter> {\n return this.getAdapter('documentation', options) as Promise<DocumentationProviderAdapter>;\n }\n\n /**\n * Get a state provider adapter\n */\n async getStateProvider(options?: AdapterFactoryOptions): Promise<StateProviderAdapter> {\n return this.getAdapter('state', options) as Promise<StateProviderAdapter>;\n }\n\n /**\n * Get an adapter by type\n */\n async getAdapter(type: AdapterType, options?: AdapterFactoryOptions): Promise<Adapter> {\n // Check if we already have this adapter cached\n const cached = this.adapters.get(type);\n if (cached && cached.isConnected()) {\n return cached;\n }\n\n // Determine the strategy\n const strategy = this.getStrategy(type, options);\n\n // Get the implementation to use\n const implementation = options?.implementation ?? this.selectImplementation(type, strategy);\n\n // Create the adapter\n const adapter = await this.createAdapter(type, implementation);\n\n // Cache it\n this.adapters.set(type, adapter);\n\n return adapter;\n }\n\n /**\n * Check if an adapter type is configured\n */\n hasIntegration(type: AdapterType): boolean {\n const integrations = this.config.integrations;\n if (!integrations) return false;\n\n switch (type) {\n case 'issue_tracker':\n return !!integrations.issue_tracker?.provider;\n case 'git':\n return !!integrations.git?.provider;\n case 'documentation':\n return !!integrations.documentation?.provider;\n case 'state':\n return !!integrations.state?.provider;\n default:\n return false;\n }\n }\n\n /**\n * Get information about a configured integration\n */\n getIntegrationInfo(type: AdapterType): { provider: string; strategy: AdapterStrategy } | null {\n const integrations = this.config.integrations;\n if (!integrations) return null;\n\n let integration;\n switch (type) {\n case 'issue_tracker':\n integration = integrations.issue_tracker;\n break;\n case 'git':\n integration = integrations.git;\n break;\n case 'documentation':\n integration = integrations.documentation;\n break;\n case 'state':\n integration = integrations.state;\n break;\n }\n\n if (!integration?.provider) return null;\n\n return {\n provider: integration.provider,\n strategy: integration.strategy ?? 'auto',\n };\n }\n\n /**\n * Disconnect and clear all cached adapters\n */\n async disconnectAll(): Promise<void> {\n const disconnects: Promise<void>[] = [];\n\n for (const adapter of this.adapters.values()) {\n if (adapter.isConnected()) {\n disconnects.push(adapter.disconnect());\n }\n }\n\n await Promise.all(disconnects);\n this.adapters.clear();\n }\n\n /**\n * Get the strategy for an adapter type\n */\n private getStrategy(type: AdapterType, options?: AdapterFactoryOptions): AdapterStrategy {\n if (options?.strategy) {\n return options.strategy;\n }\n\n const info = this.getIntegrationInfo(type);\n return info?.strategy ?? 'auto';\n }\n\n /**\n * Select the implementation based on strategy and availability\n */\n private selectImplementation(\n type: AdapterType,\n strategy: AdapterStrategy\n ): AdapterImplementation {\n const creators = this.creators[type];\n\n switch (strategy) {\n case 'mcp':\n if (creators.mcp) return 'mcp';\n throw new AdapterError(\n `MCP adapter not available for ${type}`,\n 'not_implemented',\n undefined\n );\n\n case 'native':\n if (creators.native) return 'native';\n throw new AdapterError(\n `Native adapter not available for ${type}`,\n 'not_implemented',\n undefined\n );\n\n case 'auto':\n default:\n // Prefer MCP, fall back to native\n if (creators.mcp) return 'mcp';\n if (creators.native) return 'native';\n if (creators.mock) return 'mock';\n\n throw new AdapterError(\n `No adapter implementation available for ${type}`,\n 'not_implemented',\n undefined\n );\n }\n }\n\n /**\n * Create an adapter instance\n */\n private async createAdapter(\n type: AdapterType,\n implementation: AdapterImplementation\n ): Promise<Adapter> {\n const creators = this.creators[type];\n const creator = creators[implementation];\n\n if (!creator) {\n throw new AdapterError(\n `No ${implementation} adapter creator registered for ${type}`,\n 'not_implemented',\n undefined\n );\n }\n\n const adapter = await creator(this.config);\n await adapter.connect();\n\n return adapter;\n }\n}\n\n/**\n * Create an adapter factory from configuration\n */\nexport function createAdapterFactory(config: CoreAIConfig): AdapterFactory {\n return new AdapterFactory(config);\n}\n\n/**\n * Create adapter info helper\n */\nexport function createAdapterInfo(\n type: AdapterType,\n provider: string,\n implementation: AdapterImplementation,\n connected = false\n): AdapterInfo {\n return {\n type,\n provider,\n implementation,\n connected,\n };\n}\n","/**\n * MCP Client Wrapper\n *\n * Provides a simplified interface for connecting to and communicating with MCP servers.\n */\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type {\n McpServerConfig,\n McpServerInfo,\n McpTool,\n McpResource,\n McpToolResult,\n McpCapabilities,\n McpContent,\n StdioServerConfig,\n} from './types.js';\nimport { McpError } from './types.js';\n\n/**\n * Options for creating an MCP client\n */\nexport interface McpClientOptions {\n /**\n * Client name to report to servers\n */\n clientName?: string;\n\n /**\n * Client version to report to servers\n */\n clientVersion?: string;\n\n /**\n * Timeout for operations in milliseconds\n */\n timeout?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<McpClientOptions> = {\n clientName: 'coreai',\n clientVersion: '0.1.0',\n timeout: 30000,\n};\n\n/**\n * MCP Client Wrapper\n *\n * Manages a connection to a single MCP server and provides\n * a simplified API for tool calls, resource access, etc.\n */\nexport class McpClient {\n private client: Client | null = null;\n private transport: Transport | null = null;\n private _serverInfo: McpServerInfo | null = null;\n private options: Required<McpClientOptions>;\n private serverName: string;\n private config: McpServerConfig;\n\n constructor(serverName: string, config: McpServerConfig, options?: McpClientOptions) {\n this.serverName = serverName;\n this.config = config;\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Connect to the MCP server\n */\n async connect(): Promise<void> {\n if (this.client && this.isConnected()) {\n return;\n }\n\n try {\n // Create the appropriate transport\n this.transport = await this.createTransport();\n\n // Create the MCP client\n this.client = new Client(\n {\n name: this.options.clientName,\n version: this.options.clientVersion,\n },\n {\n capabilities: {\n roots: { listChanged: true },\n },\n }\n );\n\n // Connect to the server\n await this.client.connect(this.transport);\n\n // Store server info\n const serverVersion = this.client.getServerVersion();\n const serverCapabilities = this.client.getServerCapabilities();\n\n const info: McpServerInfo = {\n name: this.serverName,\n connected: true,\n };\n\n if (serverVersion?.version) {\n info.version = serverVersion.version;\n }\n\n const caps = this.parseCapabilities(serverCapabilities);\n if (caps) {\n info.capabilities = caps;\n }\n\n const instructions = this.client.getInstructions();\n if (instructions) {\n info.instructions = instructions;\n }\n\n this._serverInfo = info;\n } catch (error) {\n throw new McpError(\n `Failed to connect to MCP server \"${this.serverName}\": ${error instanceof Error ? error.message : String(error)}`,\n 'connection_failed',\n this.serverName,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Disconnect from the MCP server\n */\n async disconnect(): Promise<void> {\n if (this.transport) {\n await this.transport.close();\n this.transport = null;\n }\n\n this.client = null;\n\n if (this._serverInfo) {\n this._serverInfo.connected = false;\n }\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this._serverInfo?.connected ?? false;\n }\n\n /**\n * Get server information\n */\n getServerInfo(): McpServerInfo | null {\n return this._serverInfo;\n }\n\n /**\n * List available tools from the server\n */\n async listTools(): Promise<McpTool[]> {\n const client = this.ensureConnected();\n\n const result = await client.listTools();\n\n return result.tools.map((tool) => {\n // Build inputSchema with only defined properties\n const inputSchema: McpTool['inputSchema'] = { type: 'object' };\n if (tool.inputSchema.properties) {\n inputSchema.properties = tool.inputSchema.properties as Record<string, unknown>;\n }\n if (tool.inputSchema.required) {\n inputSchema.required = tool.inputSchema.required;\n }\n\n const mapped: McpTool = {\n name: tool.name,\n inputSchema,\n };\n\n if (tool.description) {\n mapped.description = tool.description;\n }\n\n if (tool.annotations) {\n const annotations: McpTool['annotations'] = {};\n if (tool.annotations.title) annotations.title = tool.annotations.title;\n if (tool.annotations.readOnlyHint !== undefined)\n annotations.readOnlyHint = tool.annotations.readOnlyHint;\n if (tool.annotations.destructiveHint !== undefined)\n annotations.destructiveHint = tool.annotations.destructiveHint;\n if (tool.annotations.idempotentHint !== undefined)\n annotations.idempotentHint = tool.annotations.idempotentHint;\n if (Object.keys(annotations).length > 0) {\n mapped.annotations = annotations;\n }\n }\n\n return mapped;\n });\n }\n\n /**\n * Call a tool on the server\n */\n async callTool(name: string, args?: Record<string, unknown>): Promise<McpToolResult> {\n const client = this.ensureConnected();\n\n try {\n const result = await client.callTool({\n name,\n arguments: args,\n });\n\n // Handle the different result formats\n if ('content' in result && Array.isArray(result.content)) {\n const content: McpContent[] = [];\n\n for (const c of result.content) {\n if (typeof c === 'object' && c !== null && 'type' in c) {\n const item = c as { type: string; [key: string]: unknown };\n if (item.type === 'text' && typeof item.text === 'string') {\n content.push({ type: 'text', text: item.text });\n } else if (\n item.type === 'image' &&\n typeof item.data === 'string' &&\n typeof item.mimeType === 'string'\n ) {\n content.push({ type: 'image', data: item.data, mimeType: item.mimeType });\n } else if (item.type === 'resource' && typeof item.resource === 'object') {\n const res = item.resource as {\n uri: string;\n text?: string;\n blob?: string;\n mimeType?: string;\n };\n const resourceContent: {\n uri: string;\n text?: string;\n blob?: string;\n mimeType?: string;\n } = {\n uri: res.uri,\n };\n if (res.text) resourceContent.text = res.text;\n if (res.blob) resourceContent.blob = res.blob;\n if (res.mimeType) resourceContent.mimeType = res.mimeType;\n content.push({\n type: 'resource',\n resource: resourceContent,\n });\n } else {\n // Default to text for unknown types\n content.push({ type: 'text', text: JSON.stringify(c) });\n }\n }\n }\n\n const toolResult: McpToolResult = { content };\n\n if (typeof result.isError === 'boolean') {\n toolResult.isError = result.isError;\n }\n\n if (typeof result.structuredContent === 'object' && result.structuredContent !== null) {\n toolResult.structuredContent = result.structuredContent as Record<string, unknown>;\n }\n\n return toolResult;\n }\n\n // Handle legacy toolResult format\n if ('toolResult' in result) {\n return {\n content: [{ type: 'text', text: JSON.stringify(result.toolResult) }],\n };\n }\n\n return {\n content: [],\n };\n } catch (error) {\n throw new McpError(\n `Failed to call tool \"${name}\": ${error instanceof Error ? error.message : String(error)}`,\n 'protocol_error',\n this.serverName,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * List available resources from the server\n */\n async listResources(): Promise<McpResource[]> {\n const client = this.ensureConnected();\n\n const result = await client.listResources();\n\n return result.resources.map((resource) => {\n const mapped: McpResource = {\n uri: resource.uri,\n name: resource.name,\n };\n if (resource.description) {\n mapped.description = resource.description;\n }\n if (resource.mimeType) {\n mapped.mimeType = resource.mimeType;\n }\n return mapped;\n });\n }\n\n /**\n * Read a resource from the server\n */\n async readResource(uri: string): Promise<string> {\n const client = this.ensureConnected();\n\n const result = await client.readResource({ uri });\n\n // Return the first text content, or blob as base64\n for (const content of result.contents) {\n if ('text' in content) {\n return content.text;\n }\n if ('blob' in content) {\n return content.blob;\n }\n }\n\n return '';\n }\n\n /**\n * Create the appropriate transport for the server config\n */\n private async createTransport(): Promise<Transport> {\n if (this.config.transport === 'stdio') {\n return this.createStdioTransport(this.config);\n }\n\n // HTTP/SSE transports would be added here\n throw new McpError(\n `Unsupported transport type: ${this.config.transport}`,\n 'invalid_config',\n this.serverName\n );\n }\n\n /**\n * Create a stdio transport for local MCP servers\n */\n private createStdioTransport(config: StdioServerConfig): Transport {\n const params: {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n } = {\n command: config.command,\n };\n\n if (config.args) {\n params.args = config.args;\n }\n if (config.env) {\n params.env = config.env;\n }\n if (config.cwd) {\n params.cwd = config.cwd;\n }\n\n return new StdioClientTransport(params);\n }\n\n /**\n * Parse server capabilities into our format\n */\n private parseCapabilities(capabilities?: Record<string, unknown>): McpCapabilities | undefined {\n if (!capabilities) return undefined;\n\n return {\n tools: !!capabilities.tools,\n resources: !!capabilities.resources,\n prompts: !!capabilities.prompts,\n logging: !!capabilities.logging,\n };\n }\n\n /**\n * Ensure the client is connected and return the client instance\n */\n private ensureConnected(): Client {\n if (!this.client || !this.isConnected()) {\n throw new McpError(\n `Not connected to MCP server \"${this.serverName}\"`,\n 'connection_closed',\n this.serverName\n );\n }\n return this.client;\n }\n\n /**\n * Set server info (for mock/testing purposes)\n */\n protected setServerInfo(info: McpServerInfo): void {\n this._serverInfo = info;\n }\n}\n\n/**\n * Create a mock MCP client for testing\n */\nexport function createMockMcpClient(\n serverName: string,\n tools: McpTool[] = [],\n resources: McpResource[] = []\n): McpClient {\n // Create a client with in-memory transport for testing\n const client = new McpClient(serverName, { transport: 'stdio', command: 'mock' });\n\n // Store mock data\n const mockTools = tools;\n const mockResources = resources;\n\n // Override connect to set up mock state\n client.connect = async function (this: McpClient) {\n const info: McpServerInfo = {\n name: serverName,\n version: '1.0.0',\n connected: true,\n capabilities: { tools: true, resources: true },\n };\n (this as McpClient & { setServerInfo(info: McpServerInfo): void }).setServerInfo(info);\n };\n\n client.listTools = async function () {\n return mockTools;\n };\n\n client.listResources = async function () {\n return mockResources;\n };\n\n return client;\n}\n","/**\n * Native GitHub Adapter\n *\n * Implements GitProviderAdapter using the GitHub CLI (gh).\n * Requires the gh CLI to be installed and authenticated.\n */\n\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport type { GitProviderAdapter } from '../interfaces.js';\nimport type {\n AdapterInfo,\n PullRequest,\n PullRequestQuery,\n CreatePullRequestData,\n Review,\n CreateReviewData,\n PullRequestStatus,\n ReviewDecision,\n} from '../types.js';\nimport { AdapterError } from '../types.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Options for creating a GitHub adapter\n */\nexport interface GitHubAdapterOptions {\n /**\n * Repository in owner/repo format\n */\n repository: string;\n\n /**\n * Path to gh CLI (default: 'gh')\n */\n ghPath?: string;\n}\n\n/**\n * Native GitHub adapter using gh CLI\n */\nexport class GitHubAdapter implements GitProviderAdapter {\n private repository: string;\n private ghPath: string;\n private connected = false;\n private owner: string;\n private repo: string;\n\n constructor(options: GitHubAdapterOptions) {\n this.repository = options.repository;\n this.ghPath = options.ghPath ?? 'gh';\n\n const [owner, repo] = this.repository.split('/');\n if (!owner || !repo) {\n throw new AdapterError(\n `Invalid repository format: ${this.repository}. Expected owner/repo`,\n 'invalid_config',\n this.getInfo()\n );\n }\n this.owner = owner;\n this.repo = repo;\n }\n\n /**\n * Get adapter info\n */\n getInfo(): AdapterInfo {\n return {\n type: 'git',\n provider: 'github',\n implementation: 'native',\n connected: this.connected,\n };\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Connect (verify gh CLI is available and authenticated)\n */\n async connect(): Promise<void> {\n try {\n // Check gh is installed and authenticated\n await this.gh(['auth', 'status']);\n\n // Verify we can access the repository\n await this.gh(['repo', 'view', this.repository, '--json', 'name']);\n\n this.connected = true;\n } catch (error) {\n throw new AdapterError(\n `Failed to connect to GitHub: ${error instanceof Error ? error.message : String(error)}`,\n 'connection_failed',\n this.getInfo(),\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Disconnect\n */\n async disconnect(): Promise<void> {\n this.connected = false;\n }\n\n /**\n * Get a pull request by number\n */\n async getPullRequest(idOrNumber: string | number): Promise<PullRequest> {\n this.ensureConnected();\n\n try {\n const result = await this.gh([\n 'pr',\n 'view',\n String(idOrNumber),\n '-R',\n this.repository,\n '--json',\n 'number,title,body,state,author,headRefName,baseRefName,createdAt,updatedAt,mergedAt,url,reviewRequests',\n ]);\n\n const data = JSON.parse(result);\n return this.mapPullRequest(data);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n throw new AdapterError(\n `Pull request #${idOrNumber} not found`,\n 'not_found',\n this.getInfo()\n );\n }\n throw this.wrapError(error, `Failed to get pull request #${idOrNumber}`);\n }\n }\n\n /**\n * List pull requests\n */\n async listPullRequests(query?: PullRequestQuery): Promise<PullRequest[]> {\n this.ensureConnected();\n\n try {\n const args = [\n 'pr',\n 'list',\n '-R',\n this.repository,\n '--json',\n 'number,title,body,state,author,headRefName,baseRefName,createdAt,updatedAt,url',\n ];\n\n // Map status to gh CLI state\n if (query?.status) {\n const states = Array.isArray(query.status) ? query.status : [query.status];\n const ghStates = states\n .map((s) => this.mapStatusToGh(s))\n .filter((s): s is string => s !== undefined);\n if (ghStates.length > 0 && ghStates[0]) {\n args.push('--state', ghStates[0]);\n }\n }\n\n if (query?.author) {\n args.push('--author', query.author);\n }\n\n if (query?.limit) {\n args.push('--limit', String(query.limit));\n }\n\n const result = await this.gh(args);\n const data = JSON.parse(result) as unknown[];\n\n return data.map((pr) => this.mapPullRequest(pr as Record<string, unknown>));\n } catch (error) {\n throw this.wrapError(error, 'Failed to list pull requests');\n }\n }\n\n /**\n * Create a pull request\n */\n async createPullRequest(data: CreatePullRequestData): Promise<PullRequest> {\n this.ensureConnected();\n\n try {\n const args = [\n 'pr',\n 'create',\n '-R',\n this.repository,\n '--head',\n data.source_branch,\n '--base',\n data.target_branch,\n '--title',\n data.title,\n ];\n\n if (data.description) {\n args.push('--body', data.description);\n }\n\n if (data.draft) {\n args.push('--draft');\n }\n\n if (data.reviewers && data.reviewers.length > 0) {\n args.push('--reviewer', data.reviewers.join(','));\n }\n\n // Create and get the PR details\n const createResult = await this.gh(args);\n\n // Parse the URL from the output to get the PR number\n const urlMatch = createResult.match(/https:\\/\\/github\\.com\\/[^/]+\\/[^/]+\\/pull\\/(\\d+)/);\n if (urlMatch?.[1]) {\n return this.getPullRequest(parseInt(urlMatch[1], 10));\n }\n\n // Fallback: list to find the just-created PR\n const prs = await this.listPullRequests({ limit: 1 });\n const firstPr = prs[0];\n if (firstPr) {\n return firstPr;\n }\n\n throw new Error('Failed to retrieve created pull request');\n } catch (error) {\n throw this.wrapError(error, 'Failed to create pull request');\n }\n }\n\n /**\n * Update a pull request\n */\n async updatePullRequest(\n idOrNumber: string | number,\n data: Partial<CreatePullRequestData>\n ): Promise<PullRequest> {\n this.ensureConnected();\n\n try {\n const args = ['pr', 'edit', String(idOrNumber), '-R', this.repository];\n\n if (data.title) {\n args.push('--title', data.title);\n }\n\n if (data.description !== undefined) {\n args.push('--body', data.description);\n }\n\n if (data.target_branch) {\n args.push('--base', data.target_branch);\n }\n\n if (data.reviewers && data.reviewers.length > 0) {\n args.push('--add-reviewer', data.reviewers.join(','));\n }\n\n await this.gh(args);\n\n return this.getPullRequest(idOrNumber);\n } catch (error) {\n throw this.wrapError(error, `Failed to update pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Merge a pull request\n */\n async mergePullRequest(\n idOrNumber: string | number,\n options?: { method?: 'merge' | 'squash' | 'rebase'; message?: string }\n ): Promise<void> {\n this.ensureConnected();\n\n try {\n const args = ['pr', 'merge', String(idOrNumber), '-R', this.repository];\n\n const method = options?.method ?? 'merge';\n args.push(`--${method}`);\n\n if (options?.message) {\n args.push('--body', options.message);\n }\n\n // Auto-confirm the merge\n args.push('--delete-branch=false');\n\n await this.gh(args);\n } catch (error) {\n throw this.wrapError(error, `Failed to merge pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Close a pull request\n */\n async closePullRequest(idOrNumber: string | number): Promise<void> {\n this.ensureConnected();\n\n try {\n await this.gh(['pr', 'close', String(idOrNumber), '-R', this.repository]);\n } catch (error) {\n throw this.wrapError(error, `Failed to close pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Add a review to a pull request\n */\n async addReview(idOrNumber: string | number, review: CreateReviewData): Promise<Review> {\n this.ensureConnected();\n\n try {\n const args = ['pr', 'review', String(idOrNumber), '-R', this.repository];\n\n // Map decision to gh CLI flag\n switch (review.decision) {\n case 'approve':\n args.push('--approve');\n break;\n case 'request_changes':\n args.push('--request-changes');\n break;\n case 'comment':\n args.push('--comment');\n break;\n }\n\n if (review.body) {\n args.push('--body', review.body);\n }\n\n await this.gh(args);\n\n // Return the review data (gh doesn't return review ID)\n const reviewResult: Review = {\n id: `review-${Date.now()}`,\n pull_request_id: String(idOrNumber),\n author: 'current-user',\n decision: review.decision,\n body: review.body ?? '',\n created_at: new Date().toISOString(),\n };\n return reviewResult;\n } catch (error) {\n throw this.wrapError(error, `Failed to add review to pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Get reviews for a pull request\n */\n async getReviews(idOrNumber: string | number): Promise<Review[]> {\n this.ensureConnected();\n\n try {\n const result = await this.gh([\n 'pr',\n 'view',\n String(idOrNumber),\n '-R',\n this.repository,\n '--json',\n 'reviews',\n ]);\n\n const data = JSON.parse(result);\n const reviews = data.reviews || [];\n\n return reviews.map((r: Record<string, unknown>) => ({\n id: String(r.id || `review-${Date.now()}`),\n pull_request_id: String(idOrNumber),\n author: (r.author as { login?: string })?.login || 'unknown',\n decision: this.mapGhStateToDecision(String(r.state || 'COMMENTED')),\n body: String(r.body || ''),\n created_at: String(r.submittedAt || new Date().toISOString()),\n }));\n } catch (error) {\n throw this.wrapError(error, `Failed to get reviews for pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Request reviewers for a pull request\n */\n async requestReviewers(idOrNumber: string | number, reviewers: string[]): Promise<void> {\n this.ensureConnected();\n\n try {\n await this.gh([\n 'pr',\n 'edit',\n String(idOrNumber),\n '-R',\n this.repository,\n '--add-reviewer',\n reviewers.join(','),\n ]);\n } catch (error) {\n throw this.wrapError(error, `Failed to request reviewers for pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Add a comment to a pull request\n */\n async addPullRequestComment(idOrNumber: string | number, comment: string): Promise<void> {\n this.ensureConnected();\n\n try {\n await this.gh([\n 'pr',\n 'comment',\n String(idOrNumber),\n '-R',\n this.repository,\n '--body',\n comment,\n ]);\n } catch (error) {\n throw this.wrapError(error, `Failed to add comment to pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Get the diff for a pull request\n */\n async getPullRequestDiff(idOrNumber: string | number): Promise<string> {\n this.ensureConnected();\n\n try {\n return await this.gh(['pr', 'diff', String(idOrNumber), '-R', this.repository]);\n } catch (error) {\n throw this.wrapError(error, `Failed to get diff for pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Get files changed in a pull request\n */\n async getPullRequestFiles(idOrNumber: string | number): Promise<string[]> {\n this.ensureConnected();\n\n try {\n const result = await this.gh([\n 'pr',\n 'view',\n String(idOrNumber),\n '-R',\n this.repository,\n '--json',\n 'files',\n ]);\n\n const data = JSON.parse(result);\n const files = data.files || [];\n\n return files.map((f: { path?: string }) => f.path || '');\n } catch (error) {\n throw this.wrapError(error, `Failed to get files for pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Execute gh CLI command\n */\n private async gh(args: string[]): Promise<string> {\n try {\n const { stdout } = await execFileAsync(this.ghPath, args, {\n maxBuffer: 10 * 1024 * 1024, // 10MB\n });\n return stdout;\n } catch (error) {\n const execError = error as { stderr?: string; message?: string };\n throw new Error(execError.stderr || execError.message || 'Unknown gh error');\n }\n }\n\n /**\n * Ensure adapter is connected\n */\n private ensureConnected(): void {\n if (!this.connected) {\n throw new AdapterError(\n 'GitHub adapter is not connected. Call connect() first.',\n 'not_connected',\n this.getInfo()\n );\n }\n }\n\n /**\n * Map gh PR data to PullRequest type\n */\n private mapPullRequest(data: Record<string, unknown>): PullRequest {\n const pr: PullRequest = {\n id: String(data.number),\n number: Number(data.number),\n title: String(data.title || ''),\n source_branch: String(data.headRefName || ''),\n target_branch: String(data.baseRefName || ''),\n status: this.mapGhStateToPrStatus(String(data.state || 'OPEN')),\n };\n\n if (data.body) {\n pr.description = String(data.body);\n }\n\n if (data.author && typeof data.author === 'object') {\n const login = (data.author as { login?: string }).login;\n if (login) {\n pr.author = login;\n }\n }\n\n if (data.createdAt) {\n pr.created_at = String(data.createdAt);\n }\n\n if (data.updatedAt) {\n pr.updated_at = String(data.updatedAt);\n }\n\n if (data.mergedAt) {\n pr.merged_at = String(data.mergedAt);\n }\n\n if (data.url) {\n pr.url = String(data.url);\n }\n\n if (data.reviewRequests && Array.isArray(data.reviewRequests)) {\n pr.reviewers = data.reviewRequests\n .map((r: { login?: string }) => r.login || '')\n .filter(Boolean);\n }\n\n return pr;\n }\n\n /**\n * Map gh state to PullRequestStatus\n */\n private mapGhStateToPrStatus(state: string): PullRequestStatus {\n switch (state.toUpperCase()) {\n case 'OPEN':\n return 'open';\n case 'CLOSED':\n return 'closed';\n case 'MERGED':\n return 'merged';\n default:\n return 'open';\n }\n }\n\n /**\n * Map PullRequestStatus to gh CLI state\n */\n private mapStatusToGh(status: PullRequestStatus): string | undefined {\n switch (status) {\n case 'open':\n return 'open';\n case 'closed':\n return 'closed';\n case 'merged':\n return 'merged';\n default:\n return undefined;\n }\n }\n\n /**\n * Map gh review state to ReviewDecision\n */\n private mapGhStateToDecision(state: string): ReviewDecision {\n switch (state.toUpperCase()) {\n case 'APPROVED':\n return 'approve';\n case 'CHANGES_REQUESTED':\n return 'request_changes';\n case 'COMMENTED':\n default:\n return 'comment';\n }\n }\n\n /**\n * Check if error is a not found error\n */\n private isNotFoundError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes('Could not resolve') || message.includes('not found');\n }\n\n /**\n * Wrap error in AdapterError\n */\n private wrapError(error: unknown, message: string): AdapterError {\n return new AdapterError(\n `${message}: ${error instanceof Error ? error.message : String(error)}`,\n 'operation_failed',\n this.getInfo(),\n error instanceof Error ? error : undefined\n );\n }\n}\n\n/**\n * Create a GitHub adapter\n */\nexport function createGitHubAdapter(options: GitHubAdapterOptions): GitHubAdapter {\n return new GitHubAdapter(options);\n}\n","/**\n * Cache Types\n *\n * Type definitions for the shared context cache system.\n */\n\n/**\n * Source type for cached content\n */\nexport type CacheSource = 'confluence' | 'github' | 'notion' | 'local' | 'custom';\n\n/**\n * Cache entry status\n */\nexport type CacheStatus = 'valid' | 'stale' | 'expired' | 'error';\n\n/**\n * Metadata for a cached entry\n */\nexport interface CacheMetadata {\n /**\n * Unique key for this cache entry\n */\n key: string;\n\n /**\n * Source provider (e.g., 'confluence', 'github')\n */\n source: CacheSource;\n\n /**\n * Original source URL or identifier\n */\n sourceUrl: string;\n\n /**\n * When the content was cached\n */\n cachedAt: string;\n\n /**\n * When the content expires (ISO date string)\n */\n expiresAt: string;\n\n /**\n * ETag or version hash from source (for conditional fetching)\n */\n etag?: string;\n\n /**\n * Content hash for integrity checking\n */\n contentHash: string;\n\n /**\n * Size in bytes\n */\n size: number;\n\n /**\n * Content type (e.g., 'text/markdown', 'application/json')\n */\n contentType: string;\n\n /**\n * Original title or name\n */\n title?: string;\n\n /**\n * Last modified timestamp from source\n */\n lastModified?: string;\n\n /**\n * Custom tags for categorization\n */\n tags?: string[];\n}\n\n/**\n * A cached content entry\n */\nexport interface CacheEntry<T = string> {\n /**\n * Entry metadata\n */\n metadata: CacheMetadata;\n\n /**\n * The cached content\n */\n content: T;\n}\n\n/**\n * Options for cache operations\n */\nexport interface CacheOptions {\n /**\n * Time-to-live in seconds (default: 3600 = 1 hour)\n */\n ttl?: number;\n\n /**\n * Force refresh even if cached\n */\n forceRefresh?: boolean;\n\n /**\n * Skip cache and fetch directly\n */\n skipCache?: boolean;\n\n /**\n * Custom tags to apply\n */\n tags?: string[];\n}\n\n/**\n * Options for listing cache entries\n */\nexport interface CacheListOptions {\n /**\n * Filter by source\n */\n source?: CacheSource;\n\n /**\n * Filter by tag\n */\n tag?: string;\n\n /**\n * Filter by status\n */\n status?: CacheStatus;\n\n /**\n * Maximum entries to return\n */\n limit?: number;\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /**\n * Total number of entries\n */\n totalEntries: number;\n\n /**\n * Total size in bytes\n */\n totalSize: number;\n\n /**\n * Number of valid entries\n */\n validEntries: number;\n\n /**\n * Number of stale entries\n */\n staleEntries: number;\n\n /**\n * Number of expired entries\n */\n expiredEntries: number;\n\n /**\n * Entries by source\n */\n bySource: Record<CacheSource, number>;\n\n /**\n * Oldest entry timestamp\n */\n oldestEntry?: string;\n\n /**\n * Newest entry timestamp\n */\n newestEntry?: string;\n}\n\n/**\n * Result of a sync operation\n */\nexport interface SyncResult {\n /**\n * Number of entries added\n */\n added: number;\n\n /**\n * Number of entries updated\n */\n updated: number;\n\n /**\n * Number of entries removed\n */\n removed: number;\n\n /**\n * Number of entries that failed to sync\n */\n failed: number;\n\n /**\n * Error messages for failed entries\n */\n errors: { key: string; error: string }[];\n\n /**\n * Duration of sync in milliseconds\n */\n duration: number;\n}\n\n/**\n * Cache error codes\n */\nexport type CacheErrorCode =\n | 'not_found'\n | 'expired'\n | 'invalid_key'\n | 'write_failed'\n | 'read_failed'\n | 'fetch_failed'\n | 'invalid_config'\n | 'storage_full';\n\n/**\n * Cache-specific error\n */\nexport class CacheError extends Error {\n constructor(\n message: string,\n public readonly code: CacheErrorCode,\n public readonly key?: string,\n public override readonly cause?: Error\n ) {\n super(message);\n this.name = 'CacheError';\n }\n}\n\n/**\n * Default cache directory paths\n */\nexport const CACHE_PATHS = {\n /**\n * Root cache directory (relative to project root)\n */\n ROOT: '.coreai/cache',\n\n /**\n * Content storage directory\n */\n CONTENT: '.coreai/cache/content',\n\n /**\n * Metadata storage directory\n */\n METADATA: '.coreai/cache/metadata',\n\n /**\n * Index file for fast lookups\n */\n INDEX: '.coreai/cache/index.json',\n\n /**\n * Lock file for concurrent access\n */\n LOCK: '.coreai/cache/.lock',\n} as const;\n\n/**\n * Default cache configuration\n */\nexport const DEFAULT_CACHE_CONFIG = {\n /**\n * Default TTL in seconds (1 hour)\n */\n ttl: 3600,\n\n /**\n * Maximum cache size in bytes (100MB)\n */\n maxSize: 100 * 1024 * 1024,\n\n /**\n * Maximum number of entries\n */\n maxEntries: 1000,\n\n /**\n * Enable automatic cleanup of expired entries\n */\n autoCleanup: true,\n\n /**\n * Cleanup interval in seconds (1 hour)\n */\n cleanupInterval: 3600,\n} as const;\n","/**\n * File-based Cache Provider\n *\n * Implements CacheProvider using the local filesystem.\n * Stores content in files with separate metadata JSON files.\n */\n\nimport { promises as fs } from 'fs';\nimport { join, dirname } from 'path';\nimport { createHash } from 'crypto';\nimport type {\n CacheEntry,\n CacheMetadata,\n CacheOptions,\n CacheListOptions,\n CacheStats,\n CacheStatus,\n CacheSource,\n} from './types.js';\nimport { CacheError, CACHE_PATHS, DEFAULT_CACHE_CONFIG } from './types.js';\nimport type { CacheProvider } from './interfaces.js';\n\n/**\n * No-op function for ignoring errors\n */\nfunction noop(): void {\n // Intentionally empty\n}\n\n/**\n * Options for creating a file cache provider\n */\nexport interface FileCacheProviderOptions {\n /**\n * Base path for cache storage (project root)\n */\n basePath: string;\n\n /**\n * Default TTL in seconds\n */\n ttl?: number;\n\n /**\n * Maximum cache size in bytes\n */\n maxSize?: number;\n\n /**\n * Maximum number of entries\n */\n maxEntries?: number;\n}\n\n/**\n * Cache index structure for fast lookups\n */\ninterface CacheIndex {\n version: number;\n entries: Record<string, CacheIndexEntry>;\n stats: {\n totalSize: number;\n entryCount: number;\n lastCleanup: string | null;\n };\n}\n\n/**\n * Index entry for quick access\n */\ninterface CacheIndexEntry {\n key: string;\n source: CacheSource;\n cachedAt: string;\n expiresAt: string;\n size: number;\n contentFile: string;\n metadataFile: string;\n}\n\nconst INDEX_VERSION = 1;\n\n/**\n * File-based cache provider implementation\n */\nexport class FileCacheProvider implements CacheProvider {\n private basePath: string;\n private cachePath: string;\n private contentPath: string;\n private metadataPath: string;\n private indexPath: string;\n private ttl: number;\n private maxSize: number;\n private maxEntries: number;\n private initialized = false;\n private index: CacheIndex | null = null;\n\n constructor(options: FileCacheProviderOptions) {\n this.basePath = options.basePath;\n this.cachePath = join(this.basePath, CACHE_PATHS.ROOT);\n this.contentPath = join(this.basePath, CACHE_PATHS.CONTENT);\n this.metadataPath = join(this.basePath, CACHE_PATHS.METADATA);\n this.indexPath = join(this.basePath, CACHE_PATHS.INDEX);\n this.ttl = options.ttl ?? DEFAULT_CACHE_CONFIG.ttl;\n this.maxSize = options.maxSize ?? DEFAULT_CACHE_CONFIG.maxSize;\n this.maxEntries = options.maxEntries ?? DEFAULT_CACHE_CONFIG.maxEntries;\n }\n\n /**\n * Initialize the cache (create directories, load index)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Create cache directories\n await fs.mkdir(this.contentPath, { recursive: true });\n await fs.mkdir(this.metadataPath, { recursive: true });\n\n // Load or create index\n this.index = await this.loadIndex();\n\n // Save index to ensure file exists\n await this.saveIndex();\n\n this.initialized = true;\n } catch (error) {\n throw new CacheError(\n `Failed to initialize cache: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Check if the cache is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get a cached entry by key\n */\n async get<T = string>(key: string, options?: CacheOptions): Promise<CacheEntry<T> | null> {\n this.ensureInitialized();\n\n if (options?.skipCache) {\n return null;\n }\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n return null;\n }\n\n // Check expiration (unless force refresh)\n if (!options?.forceRefresh) {\n const status = this.getEntryStatus(indexEntry);\n if (status === 'expired') {\n return null;\n }\n }\n\n try {\n // Read metadata\n const metadataContent = await fs.readFile(indexEntry.metadataFile, 'utf-8');\n const metadata: CacheMetadata = JSON.parse(metadataContent);\n\n // Read content\n const contentRaw = await fs.readFile(indexEntry.contentFile, 'utf-8');\n let content: T;\n\n // Try to parse as JSON if content type indicates it\n if (metadata.contentType.includes('json')) {\n content = JSON.parse(contentRaw) as T;\n } else {\n content = contentRaw as T;\n }\n\n return { metadata, content };\n } catch {\n // Entry exists in index but files are missing - clean up\n await this.delete(key);\n return null;\n }\n }\n\n /**\n * Get the content only (convenience method)\n */\n async getContent<T = string>(key: string, options?: CacheOptions): Promise<T | null> {\n const entry = await this.get<T>(key, options);\n return entry?.content ?? null;\n }\n\n /**\n * Set a cache entry\n */\n async set<T = string>(\n key: string,\n content: T,\n metadata: Partial<CacheMetadata>,\n options?: CacheOptions\n ): Promise<void> {\n this.ensureInitialized();\n\n const now = new Date();\n const ttl = options?.ttl ?? this.ttl;\n const expiresAt = new Date(now.getTime() + ttl * 1000);\n\n // Serialize content\n const contentStr = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n const contentHash = this.hashContent(contentStr);\n const size = Buffer.byteLength(contentStr, 'utf-8');\n\n // Generate file paths\n const safeKey = this.sanitizeKey(key);\n const contentFile = join(this.contentPath, `${safeKey}.cache`);\n const metadataFile = join(this.metadataPath, `${safeKey}.json`);\n\n // Build full metadata\n const fullMetadata: CacheMetadata = {\n key,\n source: metadata.source ?? 'custom',\n sourceUrl: metadata.sourceUrl ?? '',\n cachedAt: now.toISOString(),\n expiresAt: expiresAt.toISOString(),\n contentHash,\n size,\n contentType:\n metadata.contentType ?? (typeof content === 'string' ? 'text/plain' : 'application/json'),\n };\n // Conditionally add optional properties\n if (metadata.etag) {\n fullMetadata.etag = metadata.etag;\n }\n if (metadata.title) {\n fullMetadata.title = metadata.title;\n }\n if (metadata.lastModified) {\n fullMetadata.lastModified = metadata.lastModified;\n }\n const tags = options?.tags ?? metadata.tags;\n if (tags) {\n fullMetadata.tags = tags;\n }\n\n try {\n // Ensure directories exist\n await fs.mkdir(dirname(contentFile), { recursive: true });\n await fs.mkdir(dirname(metadataFile), { recursive: true });\n\n // Write files\n await fs.writeFile(contentFile, contentStr, 'utf-8');\n await fs.writeFile(metadataFile, JSON.stringify(fullMetadata, null, 2), 'utf-8');\n\n // Update index\n if (this.index) {\n // Remove old size from stats if updating\n const oldEntry = this.index.entries[key];\n if (oldEntry) {\n this.index.stats.totalSize -= oldEntry.size;\n } else {\n this.index.stats.entryCount++;\n }\n\n this.index.entries[key] = {\n key,\n source: fullMetadata.source,\n cachedAt: fullMetadata.cachedAt,\n expiresAt: fullMetadata.expiresAt,\n size,\n contentFile,\n metadataFile,\n };\n this.index.stats.totalSize += size;\n\n await this.saveIndex();\n }\n } catch (error) {\n throw new CacheError(\n `Failed to write cache entry: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n key,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Check if a key exists in the cache\n */\n async has(key: string): Promise<boolean> {\n this.ensureInitialized();\n return key in (this.index?.entries ?? {});\n }\n\n /**\n * Delete a cache entry\n */\n async delete(key: string): Promise<boolean> {\n this.ensureInitialized();\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n return false;\n }\n\n try {\n // Delete files (ignore if already missing)\n await fs.unlink(indexEntry.contentFile).catch(noop);\n await fs.unlink(indexEntry.metadataFile).catch(noop);\n\n // Update index\n if (this.index) {\n this.index.stats.totalSize -= indexEntry.size;\n this.index.stats.entryCount--;\n // Remove entry from index using destructuring\n const { [key]: _removed, ...remaining } = this.index.entries;\n this.index.entries = remaining;\n await this.saveIndex();\n }\n\n return true;\n } catch (error) {\n throw new CacheError(\n `Failed to delete cache entry: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n key,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get the status of a cache entry\n */\n async getStatus(key: string): Promise<CacheStatus | null> {\n this.ensureInitialized();\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n return null;\n }\n\n return this.getEntryStatus(indexEntry);\n }\n\n /**\n * Get metadata for a cache entry\n */\n async getMetadata(key: string): Promise<CacheMetadata | null> {\n this.ensureInitialized();\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n return null;\n }\n\n try {\n const content = await fs.readFile(indexEntry.metadataFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n /**\n * Update metadata for a cache entry\n */\n async updateMetadata(key: string, metadata: Partial<CacheMetadata>): Promise<void> {\n this.ensureInitialized();\n\n const existing = await this.getMetadata(key);\n if (!existing) {\n throw new CacheError(`Cache entry not found: ${key}`, 'not_found', key);\n }\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n throw new CacheError(`Cache entry not found: ${key}`, 'not_found', key);\n }\n\n const updated: CacheMetadata = {\n ...existing,\n ...metadata,\n key: existing.key, // Can't change key\n };\n\n try {\n await fs.writeFile(indexEntry.metadataFile, JSON.stringify(updated, null, 2), 'utf-8');\n\n // Update index if relevant fields changed\n if (this.index && indexEntry) {\n if (metadata.source) indexEntry.source = metadata.source;\n if (metadata.expiresAt) indexEntry.expiresAt = metadata.expiresAt;\n await this.saveIndex();\n }\n } catch (error) {\n throw new CacheError(\n `Failed to update metadata: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n key,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * List cache entries\n */\n async list(options?: CacheListOptions): Promise<CacheMetadata[]> {\n this.ensureInitialized();\n\n if (!this.index) return [];\n\n let entries = Object.values(this.index.entries);\n\n // Apply filters\n if (options?.source) {\n entries = entries.filter((e) => e.source === options.source);\n }\n\n if (options?.status) {\n entries = entries.filter((e) => this.getEntryStatus(e) === options.status);\n }\n\n // Load full metadata for tag filtering and return\n const metadataPromises = entries.map(async (e) => {\n const metadata = await this.getMetadata(e.key);\n return metadata;\n });\n\n let results = (await Promise.all(metadataPromises)).filter(\n (m): m is CacheMetadata => m !== null\n );\n\n // Filter by tag if specified\n if (options?.tag) {\n const tag = options.tag;\n results = results.filter((m) => m.tags?.includes(tag));\n }\n\n // Apply limit\n if (options?.limit && results.length > options.limit) {\n results = results.slice(0, options.limit);\n }\n\n return results;\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats> {\n this.ensureInitialized();\n\n if (!this.index) {\n return {\n totalEntries: 0,\n totalSize: 0,\n validEntries: 0,\n staleEntries: 0,\n expiredEntries: 0,\n bySource: {\n confluence: 0,\n github: 0,\n notion: 0,\n local: 0,\n custom: 0,\n },\n };\n }\n\n const entries = Object.values(this.index.entries);\n const bySource: Record<CacheSource, number> = {\n confluence: 0,\n github: 0,\n notion: 0,\n local: 0,\n custom: 0,\n };\n\n let validEntries = 0;\n let staleEntries = 0;\n let expiredEntries = 0;\n let oldestEntry: string | undefined;\n let newestEntry: string | undefined;\n\n for (const entry of entries) {\n bySource[entry.source]++;\n\n const status = this.getEntryStatus(entry);\n if (status === 'valid') validEntries++;\n else if (status === 'stale') staleEntries++;\n else if (status === 'expired') expiredEntries++;\n\n if (!oldestEntry || entry.cachedAt < oldestEntry) {\n oldestEntry = entry.cachedAt;\n }\n if (!newestEntry || entry.cachedAt > newestEntry) {\n newestEntry = entry.cachedAt;\n }\n }\n\n const stats: CacheStats = {\n totalEntries: this.index.stats.entryCount,\n totalSize: this.index.stats.totalSize,\n validEntries,\n staleEntries,\n expiredEntries,\n bySource,\n };\n\n if (oldestEntry) stats.oldestEntry = oldestEntry;\n if (newestEntry) stats.newestEntry = newestEntry;\n\n return stats;\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<number> {\n this.ensureInitialized();\n\n if (!this.index) return 0;\n\n const count = this.index.stats.entryCount;\n\n try {\n // Delete all content and metadata files\n await fs.rm(this.contentPath, { recursive: true, force: true });\n await fs.rm(this.metadataPath, { recursive: true, force: true });\n\n // Recreate directories\n await fs.mkdir(this.contentPath, { recursive: true });\n await fs.mkdir(this.metadataPath, { recursive: true });\n\n // Reset index\n this.index = this.createEmptyIndex();\n await this.saveIndex();\n\n return count;\n } catch (error) {\n throw new CacheError(\n `Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Clear expired entries only\n */\n async clearExpired(): Promise<number> {\n this.ensureInitialized();\n\n if (!this.index) return 0;\n\n const expiredKeys = Object.entries(this.index.entries)\n .filter(([, entry]) => this.getEntryStatus(entry) === 'expired')\n .map(([key]) => key);\n\n for (const key of expiredKeys) {\n await this.delete(key);\n }\n\n if (this.index) {\n this.index.stats.lastCleanup = new Date().toISOString();\n await this.saveIndex();\n }\n\n return expiredKeys.length;\n }\n\n /**\n * Clear entries by source\n */\n async clearBySource(source: string): Promise<number> {\n this.ensureInitialized();\n\n if (!this.index) return 0;\n\n const keys = Object.entries(this.index.entries)\n .filter(([, entry]) => entry.source === source)\n .map(([key]) => key);\n\n for (const key of keys) {\n await this.delete(key);\n }\n\n return keys.length;\n }\n\n /**\n * Clear entries by tag\n */\n async clearByTag(tag: string): Promise<number> {\n this.ensureInitialized();\n\n const entries = await this.list({ tag });\n for (const entry of entries) {\n await this.delete(entry.key);\n }\n\n return entries.length;\n }\n\n // Private helpers\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new CacheError('Cache not initialized. Call initialize() first.', 'invalid_config');\n }\n }\n\n private async loadIndex(): Promise<CacheIndex> {\n try {\n const content = await fs.readFile(this.indexPath, 'utf-8');\n const index = JSON.parse(content) as CacheIndex;\n\n // Validate version\n if (index.version !== INDEX_VERSION) {\n // Index version mismatch - rebuild\n return this.rebuildIndex();\n }\n\n return index;\n } catch {\n // Index doesn't exist or is invalid - create new one\n return this.createEmptyIndex();\n }\n }\n\n private async saveIndex(): Promise<void> {\n if (!this.index) return;\n\n try {\n await fs.writeFile(this.indexPath, JSON.stringify(this.index, null, 2), 'utf-8');\n } catch (error) {\n throw new CacheError(\n `Failed to save cache index: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private createEmptyIndex(): CacheIndex {\n return {\n version: INDEX_VERSION,\n entries: {},\n stats: {\n totalSize: 0,\n entryCount: 0,\n lastCleanup: null,\n },\n };\n }\n\n private async rebuildIndex(): Promise<CacheIndex> {\n const index = this.createEmptyIndex();\n\n try {\n const metadataFiles = await fs.readdir(this.metadataPath);\n\n for (const file of metadataFiles) {\n if (!file.endsWith('.json')) continue;\n\n try {\n const metadataPath = join(this.metadataPath, file);\n const content = await fs.readFile(metadataPath, 'utf-8');\n const metadata: CacheMetadata = JSON.parse(content);\n\n const safeKey = this.sanitizeKey(metadata.key);\n const contentFile = join(this.contentPath, `${safeKey}.cache`);\n\n // Verify content file exists\n await fs.access(contentFile);\n\n index.entries[metadata.key] = {\n key: metadata.key,\n source: metadata.source,\n cachedAt: metadata.cachedAt,\n expiresAt: metadata.expiresAt,\n size: metadata.size,\n contentFile,\n metadataFile: metadataPath,\n };\n\n index.stats.totalSize += metadata.size;\n index.stats.entryCount++;\n } catch {\n // Skip invalid entries\n }\n }\n } catch {\n // Metadata directory doesn't exist or is empty\n }\n\n return index;\n }\n\n private getEntryStatus(entry: CacheIndexEntry): CacheStatus {\n const now = new Date();\n const expiresAt = new Date(entry.expiresAt);\n const cachedAt = new Date(entry.cachedAt);\n\n if (now > expiresAt) {\n return 'expired';\n }\n\n // Consider stale if more than 80% of TTL has passed\n const totalTtl = expiresAt.getTime() - cachedAt.getTime();\n const elapsed = now.getTime() - cachedAt.getTime();\n if (elapsed > totalTtl * 0.8) {\n return 'stale';\n }\n\n return 'valid';\n }\n\n private sanitizeKey(key: string): string {\n // Create a safe filename from the key\n return createHash('sha256').update(key).digest('hex').substring(0, 32);\n }\n\n private hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n }\n}\n\n/**\n * Create a file cache provider\n */\nexport function createFileCacheProvider(options: FileCacheProviderOptions): FileCacheProvider {\n return new FileCacheProvider(options);\n}\n","/**\n * Cache Manager\n *\n * Higher-level cache management that combines caching with remote fetching.\n * Implements cache-first resolution with remote fallback strategy.\n */\n\nimport type { CacheEntry, CacheMetadata, CacheOptions, CacheSource, SyncResult } from './types.js';\nimport { CacheError } from './types.js';\nimport type {\n CacheProvider,\n CacheManager as ICacheManager,\n RemoteFetcher,\n FetchOptions,\n SyncOptions,\n} from './interfaces.js';\n\n/**\n * Options for creating a cache manager\n */\nexport interface CacheManagerOptions {\n /**\n * The underlying cache provider\n */\n cache: CacheProvider;\n\n /**\n * Default TTL in seconds\n */\n defaultTtl?: number;\n\n /**\n * Default source for new entries\n */\n defaultSource?: CacheSource;\n}\n\n/**\n * Cache manager implementation\n *\n * Provides cache-first resolution strategy:\n * 1. Check cache for valid entry\n * 2. If cached and valid, return cached content\n * 3. If stale or missing, fetch from remote\n * 4. Cache the fetched content\n * 5. Return the content\n */\nexport class CacheManager implements ICacheManager {\n private cache: CacheProvider;\n private fetchers = new Map<string, RemoteFetcher>();\n private defaultTtl: number;\n private defaultSource: CacheSource;\n\n constructor(options: CacheManagerOptions) {\n this.cache = options.cache;\n this.defaultTtl = options.defaultTtl ?? 3600;\n this.defaultSource = options.defaultSource ?? 'custom';\n }\n\n /**\n * Get content with cache-first strategy\n */\n async getWithFallback<T = string>(\n key: string,\n url: string,\n options?: CacheOptions & FetchOptions\n ): Promise<CacheEntry<T>> {\n // Try cache first (unless skipCache is set)\n if (!options?.skipCache && !options?.forceRefresh) {\n const cached = await this.cache.get<T>(key);\n if (cached) {\n const status = await this.cache.getStatus(key);\n // Return if valid (not stale or expired)\n if (status === 'valid') {\n return cached;\n }\n // If stale, try to refresh but fall back to stale if fetch fails\n if (status === 'stale') {\n try {\n return await this.fetchAndCache<T>(key, url, options);\n } catch {\n // Return stale content on fetch failure\n return cached;\n }\n }\n }\n }\n\n // Cache miss or forceRefresh - fetch from remote\n return this.fetchAndCache<T>(key, url, options);\n }\n\n /**\n * Sync all entries from a source\n */\n async syncSource(source: string, options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now();\n const result: SyncResult = {\n added: 0,\n updated: 0,\n removed: 0,\n failed: 0,\n errors: [],\n duration: 0,\n };\n\n // Get all entries from this source\n const entries = await this.cache.list({ source: source as CacheSource });\n\n // Sync each entry\n const concurrency = options?.concurrency ?? 5;\n const chunks = this.chunkArray(entries, concurrency);\n\n for (const chunk of chunks) {\n const promises = chunk.map(async (entry) => {\n try {\n const fetcher = this.fetchers.get(source);\n if (!fetcher) {\n throw new Error(`No fetcher registered for source: ${source}`);\n }\n\n // Check if content has changed\n const hasChanged = await fetcher.hasChanged(entry.sourceUrl, entry.etag);\n\n if (hasChanged || options?.force) {\n // Fetch and update\n const fetchOptions: FetchOptions = {};\n if (entry.etag) {\n fetchOptions.etag = entry.etag;\n }\n const { content, metadata } = await fetcher.fetch(entry.sourceUrl, fetchOptions);\n\n await this.cache.set(entry.key, content, {\n ...entry,\n ...metadata,\n });\n\n result.updated++;\n }\n } catch (error) {\n result.failed++;\n result.errors.push({\n key: entry.key,\n error: error instanceof Error ? error.message : String(error),\n });\n\n if (!options?.continueOnError) {\n throw error;\n }\n }\n });\n\n await Promise.all(promises);\n }\n\n // Report final progress\n if (options?.onProgress) {\n options.onProgress(entries.length, entries.length);\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n /**\n * Sync specific entries\n */\n async syncEntries(keys: string[], options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now();\n const result: SyncResult = {\n added: 0,\n updated: 0,\n removed: 0,\n failed: 0,\n errors: [],\n duration: 0,\n };\n\n const concurrency = options?.concurrency ?? 5;\n const chunks = this.chunkArray(keys, concurrency);\n\n for (const chunk of chunks) {\n const promises = chunk.map(async (key) => {\n try {\n const metadata = await this.cache.getMetadata(key);\n if (!metadata) {\n result.failed++;\n result.errors.push({ key, error: 'Entry not found in cache' });\n return;\n }\n\n const fetcher = this.fetchers.get(metadata.source);\n if (!fetcher) {\n result.failed++;\n result.errors.push({ key, error: `No fetcher for source: ${metadata.source}` });\n return;\n }\n\n // Check if content has changed\n const hasChanged = await fetcher.hasChanged(metadata.sourceUrl, metadata.etag);\n\n if (hasChanged || options?.force) {\n const fetchOpts: FetchOptions = {};\n if (metadata.etag) {\n fetchOpts.etag = metadata.etag;\n }\n const { content, metadata: newMeta } = await fetcher.fetch(\n metadata.sourceUrl,\n fetchOpts\n );\n\n await this.cache.set(key, content, {\n ...metadata,\n ...newMeta,\n });\n\n result.updated++;\n }\n } catch (error) {\n result.failed++;\n result.errors.push({\n key,\n error: error instanceof Error ? error.message : String(error),\n });\n\n if (!options?.continueOnError) {\n throw error;\n }\n }\n });\n\n await Promise.all(promises);\n }\n\n // Report final progress\n if (options?.onProgress) {\n options.onProgress(keys.length, keys.length);\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n /**\n * Register a fetcher for a source\n */\n registerFetcher(source: string, fetcher: RemoteFetcher): void {\n this.fetchers.set(source, fetcher);\n }\n\n /**\n * Get the underlying cache provider\n */\n getCache(): CacheProvider {\n return this.cache;\n }\n\n /**\n * Check if a fetcher is registered for a source\n */\n hasFetcher(source: string): boolean {\n return this.fetchers.has(source);\n }\n\n /**\n * Get all registered sources\n */\n getRegisteredSources(): string[] {\n return Array.from(this.fetchers.keys());\n }\n\n // Private helpers\n\n private async fetchAndCache<T>(\n key: string,\n url: string,\n options?: CacheOptions & FetchOptions\n ): Promise<CacheEntry<T>> {\n // Determine source from URL\n const source = this.getSourceFromUrl(url);\n const fetcher = this.fetchers.get(source);\n\n if (!fetcher) {\n throw new CacheError(\n `No fetcher registered for source: ${source}. Register one with registerFetcher().`,\n 'fetch_failed',\n key\n );\n }\n\n try {\n // Fetch from remote\n const fetchOpts: FetchOptions = {};\n if (options?.timeout) {\n fetchOpts.timeout = options.timeout;\n }\n if (options?.headers) {\n fetchOpts.headers = options.headers;\n }\n const { content, metadata } = await fetcher.fetch(url, fetchOpts);\n\n // Build full metadata\n const fullMetadata: Partial<CacheMetadata> = {\n source: source as CacheSource,\n sourceUrl: url,\n contentType: metadata.contentType ?? 'text/plain',\n };\n if (metadata.etag) {\n fullMetadata.etag = metadata.etag;\n }\n if (metadata.title) {\n fullMetadata.title = metadata.title;\n }\n if (metadata.lastModified) {\n fullMetadata.lastModified = metadata.lastModified;\n }\n if (options?.tags) {\n fullMetadata.tags = options.tags;\n }\n\n // Cache the content\n const cacheOpts: CacheOptions = {\n ttl: options?.ttl ?? this.defaultTtl,\n };\n if (options?.tags) {\n cacheOpts.tags = options.tags;\n }\n await this.cache.set(key, content, fullMetadata, cacheOpts);\n\n // Return the entry\n const entry = await this.cache.get<T>(key);\n if (!entry) {\n throw new CacheError('Failed to retrieve cached entry after write', 'read_failed', key);\n }\n\n return entry;\n } catch (error) {\n if (error instanceof CacheError) {\n throw error;\n }\n throw new CacheError(\n `Failed to fetch content: ${error instanceof Error ? error.message : String(error)}`,\n 'fetch_failed',\n key,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private getSourceFromUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const hostname = parsed.hostname.toLowerCase();\n\n // Map common hostnames to sources\n if (hostname.includes('confluence') || hostname.includes('atlassian.net')) {\n return 'confluence';\n }\n if (hostname.includes('github.com') || hostname.includes('github')) {\n return 'github';\n }\n if (hostname.includes('notion.so') || hostname.includes('notion')) {\n return 'notion';\n }\n\n // Default to custom\n return this.defaultSource;\n } catch {\n // Invalid URL, might be a file path\n return 'local';\n }\n }\n\n private chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n }\n}\n\n/**\n * Create a cache manager\n */\nexport function createCacheManager(options: CacheManagerOptions): CacheManager {\n return new CacheManager(options);\n}\n","/**\n * Context Loader\n *\n * Loads shared context from remote documentation providers with cache-first resolution.\n * Handles first-run scenarios when cache is empty.\n */\n\nimport type { CacheManager, CacheOptions, FetchOptions } from '../cache/index.js';\nimport type { CacheEntry, CacheMetadata } from '../cache/types.js';\n\n/**\n * Context source definition\n */\nexport interface ContextSource {\n /**\n * Unique identifier for this context\n */\n key: string;\n\n /**\n * Remote URL to fetch from\n */\n url: string;\n\n /**\n * Optional title for the context\n */\n title?: string;\n\n /**\n * Optional tags for categorization\n */\n tags?: string[];\n\n /**\n * Whether this context is required (fail if cannot load)\n */\n required?: boolean;\n}\n\n/**\n * Context load result\n */\nexport interface ContextLoadResult {\n /**\n * Successfully loaded contexts\n */\n loaded: {\n key: string;\n content: string;\n fromCache: boolean;\n metadata: CacheMetadata;\n }[];\n\n /**\n * Failed contexts\n */\n failed: {\n key: string;\n error: string;\n required: boolean;\n }[];\n\n /**\n * Total duration in milliseconds\n */\n duration: number;\n}\n\n/**\n * Options for the context loader\n */\nexport interface ContextLoaderOptions {\n /**\n * The cache manager to use\n */\n cacheManager: CacheManager;\n\n /**\n * Default TTL for cached contexts (seconds)\n */\n defaultTtl?: number;\n\n /**\n * Whether to fail on any required context failure\n */\n failOnRequired?: boolean;\n\n /**\n * Maximum concurrent fetches\n */\n concurrency?: number;\n}\n\n/**\n * Options for loading contexts\n */\nexport interface LoadOptions extends CacheOptions, FetchOptions {\n /**\n * Continue loading other contexts if one fails\n */\n continueOnError?: boolean;\n\n /**\n * Progress callback\n */\n onProgress?: (loaded: number, total: number, current: string) => void;\n}\n\n/**\n * Context Loader\n *\n * Provides cache-first context resolution with graceful degradation\n * for first-run scenarios when the cache is empty.\n */\nexport class ContextLoader {\n private cacheManager: CacheManager;\n private defaultTtl: number;\n private failOnRequired: boolean;\n private concurrency: number;\n\n constructor(options: ContextLoaderOptions) {\n this.cacheManager = options.cacheManager;\n this.defaultTtl = options.defaultTtl ?? 3600;\n this.failOnRequired = options.failOnRequired ?? true;\n this.concurrency = options.concurrency ?? 5;\n }\n\n /**\n * Load a single context\n */\n async load(source: ContextSource, options?: LoadOptions): Promise<CacheEntry<string>> {\n try {\n const cacheOptions: CacheOptions & FetchOptions = {\n ...options,\n ttl: options?.ttl ?? this.defaultTtl,\n };\n if (source.tags) {\n cacheOptions.tags = source.tags;\n }\n const entry = await this.cacheManager.getWithFallback<string>(\n source.key,\n source.url,\n cacheOptions\n );\n\n return entry;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (source.required && this.failOnRequired) {\n throw new Error(`Failed to load required context \"${source.key}\": ${message}`);\n }\n\n throw error;\n }\n }\n\n /**\n * Load multiple contexts\n */\n async loadMany(sources: ContextSource[], options?: LoadOptions): Promise<ContextLoadResult> {\n const startTime = Date.now();\n const result: ContextLoadResult = {\n loaded: [],\n failed: [],\n duration: 0,\n };\n\n // Track which entries were loaded from cache vs fetched\n const cacheStatuses = new Map<string, boolean>();\n\n // Check cache status for all keys first\n for (const source of sources) {\n const status = await this.cacheManager.getCache().getStatus(source.key);\n cacheStatuses.set(source.key, status === 'valid');\n }\n\n // Process in chunks for concurrency control\n const chunks = this.chunkArray(sources, this.concurrency);\n\n let completed = 0;\n for (const chunk of chunks) {\n const promises = chunk.map(async (source) => {\n try {\n const itemCacheOptions: CacheOptions & FetchOptions = {\n ...options,\n ttl: options?.ttl ?? this.defaultTtl,\n };\n if (source.tags) {\n itemCacheOptions.tags = source.tags;\n }\n const entry = await this.cacheManager.getWithFallback<string>(\n source.key,\n source.url,\n itemCacheOptions\n );\n\n result.loaded.push({\n key: source.key,\n content: entry.content,\n fromCache: cacheStatuses.get(source.key) ?? false,\n metadata: entry.metadata,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n result.failed.push({\n key: source.key,\n error: message,\n required: source.required ?? false,\n });\n\n if (source.required && this.failOnRequired && !options?.continueOnError) {\n throw new Error(`Failed to load required context \"${source.key}\": ${message}`);\n }\n }\n });\n\n await Promise.all(promises);\n\n completed += chunk.length;\n if (options?.onProgress) {\n const currentKey = chunk[chunk.length - 1]?.key ?? '';\n options.onProgress(completed, sources.length, currentKey);\n }\n }\n\n result.duration = Date.now() - startTime;\n\n // Check for required failures\n if (this.failOnRequired && !options?.continueOnError) {\n const requiredFailures = result.failed.filter((f) => f.required);\n if (requiredFailures.length > 0) {\n throw new Error(\n `Failed to load ${requiredFailures.length} required context(s): ${requiredFailures.map((f) => f.key).join(', ')}`\n );\n }\n }\n\n return result;\n }\n\n /**\n * Load contexts by tag\n */\n async loadByTag(tag: string, _options?: LoadOptions): Promise<ContextLoadResult> {\n const startTime = Date.now();\n const result: ContextLoadResult = {\n loaded: [],\n failed: [],\n duration: 0,\n };\n\n // Get all cached entries with this tag\n const entries = await this.cacheManager.getCache().list({ tag });\n\n for (const entry of entries) {\n try {\n const cached = await this.cacheManager.getCache().get<string>(entry.key);\n if (cached) {\n result.loaded.push({\n key: entry.key,\n content: cached.content,\n fromCache: true,\n metadata: cached.metadata,\n });\n }\n } catch (error) {\n result.failed.push({\n key: entry.key,\n error: error instanceof Error ? error.message : String(error),\n required: false,\n });\n }\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n /**\n * Refresh all contexts (sync from remote)\n */\n async refresh(sources: ContextSource[], options?: LoadOptions): Promise<ContextLoadResult> {\n return this.loadMany(sources, {\n ...options,\n forceRefresh: true,\n });\n }\n\n /**\n * Check if all required contexts are available (cached or fetchable)\n */\n async checkAvailability(\n sources: ContextSource[]\n ): Promise<{ available: string[]; missing: string[]; errors: string[] }> {\n const available: string[] = [];\n const missing: string[] = [];\n const errors: string[] = [];\n\n for (const source of sources) {\n try {\n // Check if cached\n const hasCached = await this.cacheManager.getCache().has(source.key);\n if (hasCached) {\n available.push(source.key);\n continue;\n }\n\n // Check if fetcher is available\n const url = new URL(source.url);\n const source_type = this.getSourceFromHostname(url.hostname);\n if (this.cacheManager.hasFetcher(source_type)) {\n missing.push(source.key); // Can be fetched but not cached\n } else {\n errors.push(`${source.key}: No fetcher for ${source_type}`);\n }\n } catch (error) {\n errors.push(`${source.key}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return { available, missing, errors };\n }\n\n /**\n * Get the cache manager\n */\n getCacheManager(): CacheManager {\n return this.cacheManager;\n }\n\n // Private helpers\n\n private getSourceFromHostname(hostname: string): string {\n const lower = hostname.toLowerCase();\n if (lower.includes('confluence') || lower.includes('atlassian.net')) return 'confluence';\n if (lower.includes('github.com') || lower.includes('github')) return 'github';\n if (lower.includes('notion.so') || lower.includes('notion')) return 'notion';\n return 'custom';\n }\n\n private chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n }\n}\n\n/**\n * Create a context loader\n */\nexport function createContextLoader(options: ContextLoaderOptions): ContextLoader {\n return new ContextLoader(options);\n}\n","/**\n * Command Context\n *\n * Runtime context for command execution with graceful degradation support.\n */\n\nimport type { ResolvedCoreAIConfig } from '../config/types.js';\nimport type { AdapterType } from '../adapters/types.js';\nimport type { AdapterFactory } from '../adapters/factory.js';\nimport { createAdapterFactory } from '../adapters/factory.js';\nimport { loadConfig, configExists } from '../config/loader.js';\nimport type { CommandContext } from './types.js';\n\n/**\n * Options for creating a command context\n */\nexport interface CreateContextOptions {\n /**\n * Project root directory\n */\n projectRoot?: string;\n\n /**\n * Pre-loaded configuration (if already loaded)\n */\n config?: ResolvedCoreAIConfig;\n\n /**\n * Pre-created adapter factory (if already created)\n */\n adapterFactory?: AdapterFactory;\n}\n\n/**\n * Create a command execution context\n *\n * Handles configuration loading and adapter factory creation with graceful fallbacks.\n */\nexport function createCommandContext(options: CreateContextOptions = {}): CommandContext {\n const projectRoot = options.projectRoot ?? process.cwd();\n\n // Load config if not provided\n let config: ResolvedCoreAIConfig | null = options.config ?? null;\n if (!config && configExists(projectRoot)) {\n try {\n config = loadConfig(projectRoot);\n } catch {\n // Config loading failed, continue without config\n config = null;\n }\n }\n\n // Create adapter factory if config is available and factory not provided\n let adapterFactory: AdapterFactory | null = options.adapterFactory ?? null;\n if (!adapterFactory && config) {\n try {\n adapterFactory = createAdapterFactory(config);\n } catch {\n // Factory creation failed, continue without adapters\n adapterFactory = null;\n }\n }\n\n return {\n config,\n adapterFactory,\n projectRoot,\n\n hasIntegration(type: AdapterType): boolean {\n if (!adapterFactory) return false;\n return adapterFactory.hasIntegration(type);\n },\n\n async getAdapterSafe<T>(type: AdapterType): Promise<T | null> {\n if (!adapterFactory) return null;\n if (!adapterFactory.hasIntegration(type)) return null;\n\n try {\n const adapter = await adapterFactory.getAdapter(type);\n return adapter as T;\n } catch {\n // Adapter creation failed, return null for graceful degradation\n return null;\n }\n },\n };\n}\n\n/**\n * Cleanup resources in a command context\n */\nexport async function cleanupContext(context: CommandContext): Promise<void> {\n if (context.adapterFactory) {\n await context.adapterFactory.disconnectAll();\n }\n}\n\n/**\n * Execute a function with automatic context cleanup\n */\nexport async function withContext<T>(\n options: CreateContextOptions,\n fn: (context: CommandContext) => Promise<T>\n): Promise<T> {\n const context = createCommandContext(options);\n try {\n return await fn(context);\n } finally {\n await cleanupContext(context);\n }\n}\n","/**\n * Command Registry\n *\n * Central registry for command registration and discovery.\n */\n\nimport type {\n CommandDefinition,\n CommandMetadata,\n MarkdownCommand,\n RegistryEntry,\n CommandCategory,\n IntegrationDependency,\n} from './types.js';\nimport type { AdapterFactory } from '../adapters/factory.js';\n\n/**\n * Command Registry\n *\n * Manages registration and lookup of commands.\n */\nexport class CommandRegistry {\n private commands = new Map<string, RegistryEntry>();\n private adapterFactory: AdapterFactory | null = null;\n\n /**\n * Set the adapter factory for dependency checking\n */\n setAdapterFactory(factory: AdapterFactory | null): void {\n this.adapterFactory = factory;\n // Re-evaluate availability of all commands\n this.updateAvailability();\n }\n\n /**\n * Register a programmatic command\n */\n register(definition: CommandDefinition): void {\n const metadata: CommandMetadata = {\n name: definition.name,\n description: definition.description,\n category: definition.category,\n dependencies: definition.dependencies ?? [],\n sourcePath: '<programmatic>',\n available: true,\n };\n\n // Check availability\n this.checkAvailability(metadata);\n\n this.commands.set(definition.name, {\n metadata,\n definition,\n source: 'programmatic',\n });\n }\n\n /**\n * Register a markdown command\n */\n registerMarkdown(command: MarkdownCommand): void {\n // Check availability\n this.checkAvailability(command.metadata);\n\n this.commands.set(command.metadata.name, {\n metadata: command.metadata,\n markdownCommand: command,\n source: 'markdown',\n });\n }\n\n /**\n * Register multiple commands\n */\n registerAll(definitions: CommandDefinition[]): void {\n for (const def of definitions) {\n this.register(def);\n }\n }\n\n /**\n * Register multiple markdown commands\n */\n registerAllMarkdown(commands: MarkdownCommand[]): void {\n for (const cmd of commands) {\n this.registerMarkdown(cmd);\n }\n }\n\n /**\n * Unregister a command\n */\n unregister(name: string): boolean {\n return this.commands.delete(name);\n }\n\n /**\n * Get a command by name\n */\n get(name: string): RegistryEntry | undefined {\n return this.commands.get(name);\n }\n\n /**\n * Check if a command exists\n */\n has(name: string): boolean {\n return this.commands.has(name);\n }\n\n /**\n * Get all registered commands\n */\n getAll(): RegistryEntry[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * Get available commands (dependencies satisfied)\n */\n getAvailable(): RegistryEntry[] {\n return this.getAll().filter((entry) => entry.metadata.available);\n }\n\n /**\n * Get unavailable commands\n */\n getUnavailable(): RegistryEntry[] {\n return this.getAll().filter((entry) => !entry.metadata.available);\n }\n\n /**\n * Get commands by category\n */\n getByCategory(category: CommandCategory): RegistryEntry[] {\n return this.getAll().filter((entry) => entry.metadata.category === category);\n }\n\n /**\n * Get command names\n */\n getNames(): string[] {\n return Array.from(this.commands.keys());\n }\n\n /**\n * Clear all registered commands\n */\n clear(): void {\n this.commands.clear();\n }\n\n /**\n * Get the number of registered commands\n */\n get size(): number {\n return this.commands.size;\n }\n\n /**\n * Check and update availability for a command metadata\n */\n private checkAvailability(metadata: CommandMetadata): void {\n const missingDeps = this.getMissingDependencies(metadata.dependencies);\n\n if (missingDeps.length > 0) {\n const requiredMissing = missingDeps.filter((d) => d.required);\n if (requiredMissing.length > 0) {\n metadata.available = false;\n metadata.unavailableReason = `Missing required integrations: ${requiredMissing.map((d) => d.type).join(', ')}`;\n } else {\n // Optional deps missing, still available but may degrade\n metadata.available = true;\n }\n } else {\n metadata.available = true;\n delete metadata.unavailableReason;\n }\n }\n\n /**\n * Get missing dependencies\n */\n private getMissingDependencies(dependencies: IntegrationDependency[]): IntegrationDependency[] {\n const factory = this.adapterFactory;\n if (!factory) {\n // No adapter factory, assume all required deps are missing\n return dependencies.filter((d) => d.required);\n }\n\n return dependencies.filter((dep) => !factory.hasIntegration(dep.type));\n }\n\n /**\n * Update availability for all commands\n */\n private updateAvailability(): void {\n for (const entry of this.commands.values()) {\n this.checkAvailability(entry.metadata);\n }\n }\n\n /**\n * Get dependency status for a command\n */\n getDependencyStatus(name: string): {\n satisfied: IntegrationDependency[];\n missing: IntegrationDependency[];\n } | null {\n const entry = this.commands.get(name);\n if (!entry) return null;\n\n const deps = entry.metadata.dependencies;\n const missing = this.getMissingDependencies(deps);\n const satisfied = deps.filter((d) => !missing.includes(d));\n\n return { satisfied, missing };\n }\n}\n\n/**\n * Create a new command registry\n */\nexport function createCommandRegistry(): CommandRegistry {\n return new CommandRegistry();\n}\n\n/**\n * Global command registry instance\n */\nlet globalRegistry: CommandRegistry | null = null;\n\n/**\n * Get or create the global command registry\n */\nexport function getGlobalRegistry(): CommandRegistry {\n if (!globalRegistry) {\n globalRegistry = new CommandRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Reset the global registry (primarily for testing)\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry = null;\n}\n","/**\n * Command Loader\n *\n * Loads commands from markdown files in the coreai/commands/ directory.\n */\n\nimport { promises as fs } from 'fs';\nimport { join, basename, dirname, relative } from 'path';\nimport type {\n CommandMetadata,\n MarkdownCommand,\n CommandCategory,\n IntegrationDependency,\n CommandLoaderOptions,\n CommandLoadResult,\n} from './types.js';\nimport type { AdapterType } from '../adapters/types.js';\n\n/**\n * Frontmatter data from markdown file\n */\ninterface CommandFrontmatter {\n description?: string;\n 'argument-hint'?: string;\n requires?: string[];\n optional?: string[];\n}\n\n/**\n * Parse YAML-like frontmatter from markdown content\n */\nfunction parseFrontmatter(content: string): { frontmatter: CommandFrontmatter; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]*)$/);\n\n if (!match) {\n return { frontmatter: {}, body: content };\n }\n\n const frontmatterText = match[1] ?? '';\n const body = match[2] ?? '';\n\n // Simple YAML-like parsing (key: value)\n const frontmatter: CommandFrontmatter = {};\n const lines = frontmatterText.split(/\\r?\\n/);\n\n for (const line of lines) {\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n\n const key = line.slice(0, colonIndex).trim();\n let value = line.slice(colonIndex + 1).trim();\n\n // Handle arrays (simple format: [item1, item2])\n if (value.startsWith('[') && value.endsWith(']')) {\n const arrayContent = value.slice(1, -1);\n const items = arrayContent.split(',').map((s) => s.trim().replace(/['\"]/g, ''));\n (frontmatter as Record<string, unknown>)[key] = items;\n } else {\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n (frontmatter as Record<string, unknown>)[key] = value;\n }\n }\n\n return { frontmatter, body };\n}\n\n/**\n * Parse markdown sections\n */\nfunction parseSections(body: string): MarkdownCommand['sections'] {\n const sections: MarkdownCommand['sections'] = {};\n\n // Extract title (first h1)\n const titleMatch = body.match(/^#\\s+(.+)$/m);\n if (titleMatch?.[1]) {\n sections.title = titleMatch[1].trim();\n }\n\n // Extract instructions section\n const instructionsMatch = body.match(/##\\s*Instructions?\\s*\\n([\\s\\S]*?)(?=\\n##|$)/i);\n if (instructionsMatch?.[1]) {\n sections.instructions = instructionsMatch[1].trim();\n }\n\n // Extract fallbacks section\n const fallbacksMatch = body.match(/##\\s*Fallbacks?\\s*\\n([\\s\\S]*?)(?=\\n##|$)/i);\n if (fallbacksMatch?.[1]) {\n sections.fallbacks = fallbacksMatch[1].trim();\n }\n\n // Extract output format section\n const outputMatch = body.match(/##\\s*Output\\s*(Format)?\\s*\\n([\\s\\S]*?)(?=\\n##|$)/i);\n if (outputMatch?.[2]) {\n sections.outputFormat = outputMatch[2].trim();\n }\n\n return sections;\n}\n\n/**\n * Map integration name to adapter type\n */\nfunction mapIntegrationToAdapterType(integration: string): AdapterType | null {\n const mapping: Record<string, AdapterType> = {\n // Issue tracker mappings\n jira: 'issue_tracker',\n issue_tracker: 'issue_tracker',\n issues: 'issue_tracker',\n linear: 'issue_tracker',\n github_issues: 'issue_tracker',\n\n // Git provider mappings\n git: 'git',\n github: 'git',\n gitlab: 'git',\n bitbucket: 'git',\n\n // Documentation mappings\n docs: 'documentation',\n documentation: 'documentation',\n confluence: 'documentation',\n notion: 'documentation',\n wiki: 'documentation',\n\n // State mappings\n state: 'state',\n filesystem: 'state',\n };\n\n return mapping[integration.toLowerCase()] ?? null;\n}\n\n/**\n * Parse integration dependencies from frontmatter\n */\nfunction parseDependencies(frontmatter: CommandFrontmatter): IntegrationDependency[] {\n const dependencies: IntegrationDependency[] = [];\n\n // Required dependencies\n if (frontmatter.requires && Array.isArray(frontmatter.requires)) {\n for (const req of frontmatter.requires) {\n const type = mapIntegrationToAdapterType(req);\n if (type) {\n dependencies.push({\n type,\n required: true,\n description: `Requires ${req} integration`,\n });\n }\n }\n }\n\n // Optional dependencies\n if (frontmatter.optional && Array.isArray(frontmatter.optional)) {\n for (const opt of frontmatter.optional) {\n const type = mapIntegrationToAdapterType(opt);\n if (type) {\n dependencies.push({\n type,\n required: false,\n description: `Optionally uses ${opt} integration`,\n });\n }\n }\n }\n\n return dependencies;\n}\n\n/**\n * Derive command name from file path\n */\nfunction deriveCommandName(filePath: string, baseDir: string): string {\n const relativePath = relative(baseDir, filePath);\n const name = basename(filePath, '.md');\n\n // Include parent directory for nested commands (e.g., core/check-inbox -> check-inbox)\n // But not for simple structure\n const dir = dirname(relativePath);\n if (dir === '.' || dir === 'core' || dir === 'optional') {\n return name;\n }\n\n // For deeper nesting, include the subdirectory\n return name;\n}\n\n/**\n * Derive category from file path\n */\nfunction deriveCategoryFromPath(filePath: string, baseDir: string): CommandCategory {\n const relativePath = relative(baseDir, filePath);\n const parts = relativePath.split('/');\n\n if (parts.includes('optional')) {\n return 'optional';\n }\n if (parts.includes('core')) {\n return 'core';\n }\n\n // Default to custom for project-specific commands\n return 'custom';\n}\n\n/**\n * Load a single command from a markdown file\n */\nexport async function loadCommandFromFile(\n filePath: string,\n baseDir: string,\n categoryOverride?: CommandCategory\n): Promise<MarkdownCommand> {\n const content = await fs.readFile(filePath, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n const sections = parseSections(body);\n\n const name = deriveCommandName(filePath, baseDir);\n const category = categoryOverride ?? deriveCategoryFromPath(filePath, baseDir);\n const dependencies = parseDependencies(frontmatter);\n\n const metadata: CommandMetadata = {\n name,\n description: frontmatter.description ?? sections.title ?? name,\n category,\n dependencies,\n sourcePath: filePath,\n available: true, // Will be updated by registry\n };\n if (frontmatter['argument-hint']) {\n metadata.argumentHint = frontmatter['argument-hint'];\n }\n\n return {\n metadata,\n content: body,\n sections,\n };\n}\n\n/**\n * Find all markdown files in a directory\n */\nasync function findMarkdownFiles(dir: string, recursive: boolean): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory() && recursive) {\n const subFiles = await findMarkdownFiles(fullPath, recursive);\n files.push(...subFiles);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n files.push(fullPath);\n }\n }\n } catch (error) {\n // Directory doesn't exist or can't be read\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n return files;\n}\n\n/**\n * Load commands from a directory\n */\nexport async function loadCommandsFromDirectory(\n options: CommandLoaderOptions\n): Promise<CommandLoadResult> {\n const result: CommandLoadResult = {\n loaded: [],\n errors: [],\n };\n\n const files = await findMarkdownFiles(options.directory, options.recursive ?? true);\n\n for (const filePath of files) {\n try {\n const command = await loadCommandFromFile(filePath, options.directory, options.category);\n\n // Apply filter if provided\n if (options.filter && !options.filter(command.metadata)) {\n continue;\n }\n\n result.loaded.push(command);\n } catch (error) {\n result.errors.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n\n/**\n * Load commands from the default CoreAI commands directory\n */\nexport async function loadCoreAICommands(projectRoot: string): Promise<CommandLoadResult> {\n const commandsDir = join(projectRoot, 'coreai', 'commands');\n return loadCommandsFromDirectory({\n directory: commandsDir,\n category: 'core', // Will be overridden by path derivation\n recursive: true,\n });\n}\n\n/**\n * Load commands from both core and custom directories\n */\nexport async function loadAllCommands(\n coreCommandsDir: string,\n customCommandsDir?: string\n): Promise<CommandLoadResult> {\n const result: CommandLoadResult = {\n loaded: [],\n errors: [],\n };\n\n // Load core commands\n const coreResult = await loadCommandsFromDirectory({\n directory: coreCommandsDir,\n category: 'core',\n recursive: true,\n });\n result.loaded.push(...coreResult.loaded);\n result.errors.push(...coreResult.errors);\n\n // Load custom commands if directory specified\n if (customCommandsDir) {\n const customResult = await loadCommandsFromDirectory({\n directory: customCommandsDir,\n category: 'custom',\n recursive: true,\n });\n result.loaded.push(...customResult.loaded);\n result.errors.push(...customResult.errors);\n }\n\n return result;\n}\n","/**\n * Command Runner\n *\n * Executes commands with graceful degradation support.\n */\n\nimport type {\n CommandDefinition,\n CommandResult,\n CommandContext,\n BaseCommandOptions,\n IntegrationDependency,\n} from './types.js';\nimport type { CommandRegistry } from './registry.js';\nimport { createCommandContext, cleanupContext, type CreateContextOptions } from './context.js';\n\n/**\n * Options for running a command\n */\nexport interface RunCommandOptions extends BaseCommandOptions {\n /**\n * Pre-created command context\n */\n context?: CommandContext;\n\n /**\n * Whether to clean up context after execution\n */\n cleanupAfter?: boolean;\n}\n\n/**\n * Run a registered command\n */\nexport async function runCommand<TResult = unknown>(\n registry: CommandRegistry,\n name: string,\n args: string[],\n options: RunCommandOptions = {}\n): Promise<CommandResult<TResult>> {\n const entry = registry.get(name);\n\n if (!entry) {\n return {\n success: false,\n error: `Command not found: ${name}`,\n };\n }\n\n if (!entry.metadata.available) {\n return {\n success: false,\n error: entry.metadata.unavailableReason ?? 'Command is unavailable',\n };\n }\n\n if (!entry.definition) {\n return {\n success: false,\n error: `Command ${name} is a markdown command and cannot be executed programmatically`,\n };\n }\n\n // Create or use provided context\n const contextOptions: CreateContextOptions = {};\n if (options.projectRoot) {\n contextOptions.projectRoot = options.projectRoot;\n }\n const context = options.context ?? createCommandContext(contextOptions);\n\n try {\n const result = (await entry.definition.handler(\n args,\n options,\n context\n )) as CommandResult<TResult>;\n\n // Add skipped steps for optional integrations that aren't available\n if (entry.metadata.dependencies) {\n // Find optional deps that can't be accessed in the current context\n const optionalDeps = entry.metadata.dependencies.filter((d) => !d.required);\n const optionalUnavailable = optionalDeps.filter((d) => !context.hasIntegration(d.type));\n\n if (optionalUnavailable.length > 0) {\n result.skippedSteps = result.skippedSteps ?? [];\n for (const dep of optionalUnavailable) {\n result.skippedSteps.push({\n step: `${dep.type} integration`,\n reason: dep.description ?? `${dep.type} not configured`,\n });\n }\n }\n }\n\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n } finally {\n if (options.cleanupAfter !== false && !options.context) {\n await cleanupContext(context);\n }\n }\n}\n\n/**\n * Execute a step with graceful degradation\n *\n * If the required integration is not available, returns a skip result instead of failing.\n */\nexport async function executeWithDegradation<T>(\n context: CommandContext,\n dependency: IntegrationDependency,\n step: () => Promise<T>,\n fallback?: () => Promise<T>\n): Promise<{ result: T | null; skipped: boolean; reason?: string }> {\n if (!context.hasIntegration(dependency.type)) {\n if (dependency.required) {\n throw new Error(`Required integration missing: ${dependency.type}`);\n }\n\n // Optional integration missing, try fallback or skip\n if (fallback) {\n try {\n const result = await fallback();\n return { result, skipped: false };\n } catch {\n return {\n result: null,\n skipped: true,\n reason: dependency.description ?? `${dependency.type} not available`,\n };\n }\n }\n\n return {\n result: null,\n skipped: true,\n reason: dependency.description ?? `${dependency.type} not available`,\n };\n }\n\n // Integration available, execute step\n const result = await step();\n return { result, skipped: false };\n}\n\n/**\n * Create a command handler with automatic degradation tracking\n */\nexport function createDegradingHandler<TOptions extends BaseCommandOptions, TResult>(\n handler: (\n args: string[],\n options: TOptions,\n context: CommandContext,\n track: StepTracker\n ) => Promise<TResult>\n): CommandDefinition<TOptions, TResult>['handler'] {\n return async (args, options, context) => {\n const tracker = new StepTracker();\n\n try {\n const data = await handler(args, options, context, tracker);\n return {\n success: true,\n data,\n warnings: tracker.warnings,\n skippedSteps: tracker.skippedSteps,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n warnings: tracker.warnings,\n skippedSteps: tracker.skippedSteps,\n };\n }\n };\n}\n\n/**\n * Tracks skipped steps and warnings during command execution\n */\nexport class StepTracker {\n readonly skippedSteps: { step: string; reason: string }[] = [];\n readonly warnings: string[] = [];\n\n /**\n * Record a skipped step\n */\n skip(step: string, reason: string): void {\n this.skippedSteps.push({ step, reason });\n }\n\n /**\n * Record a warning\n */\n warn(message: string): void {\n this.warnings.push(message);\n }\n\n /**\n * Execute a step with optional fallback\n */\n async tryStep<T>(\n stepName: string,\n context: CommandContext,\n dependency: IntegrationDependency,\n step: () => Promise<T>,\n fallback?: () => Promise<T>\n ): Promise<T | null> {\n const result = await executeWithDegradation(context, dependency, step, fallback);\n\n if (result.skipped) {\n this.skip(stepName, result.reason ?? 'Integration not available');\n }\n\n return result.result;\n }\n}\n","/**\n * Skill Generator\n *\n * Generates Claude skills from templates based on project configuration.\n * Skills are output to .claude/commands/ directory.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { join, basename } from 'path';\nimport type { ResolvedCoreAIConfig } from '../config/types.js';\nimport type {\n SkillTemplate,\n SkillVariables,\n GenerateSkillsOptions,\n GenerateSkillsResult,\n GeneratedSkill,\n SkillDependency,\n} from './types.js';\nimport { builtInSkills } from './templates.js';\n\n/**\n * Extract variables from config for template substitution\n */\nexport function extractVariables(config?: ResolvedCoreAIConfig | null): SkillVariables {\n const vars: SkillVariables = {};\n\n if (!config) {\n return vars;\n }\n\n // Project variables\n vars.PROJECT_NAME = config.project.name;\n vars.PROJECT_ROOT = config.project.root;\n if (config.project.type) {\n vars.PROJECT_TYPE = config.project.type;\n }\n\n // Issue tracker variables\n if (config.integrations?.issue_tracker) {\n const tracker = config.integrations.issue_tracker;\n if (tracker.config?.project_key) {\n vars.JIRA_PROJECT = tracker.config.project_key;\n }\n if (tracker.config?.base_url) {\n vars.JIRA_URL = tracker.config.base_url;\n }\n }\n\n // Git variables\n if (config.integrations?.git) {\n const git = config.integrations.git;\n if (git.config?.repo) {\n vars.GITHUB_REPO = git.config.repo;\n }\n if (git.config?.owner) {\n vars.GITHUB_OWNER = git.config.owner;\n }\n if (git.config?.default_branch) {\n vars.DEFAULT_BRANCH = git.config.default_branch;\n }\n }\n\n // Documentation variables\n if (config.integrations?.documentation) {\n const docs = config.integrations.documentation;\n if (docs.config?.space_key) {\n vars.CONFLUENCE_SPACE = docs.config.space_key;\n }\n if (docs.config?.base_url) {\n vars.CONFLUENCE_URL = docs.config.base_url;\n }\n if (docs.config?.base_path) {\n vars.DOCS_PATH = docs.config.base_path;\n }\n }\n\n // Quality gate commands\n if (config.quality_gates) {\n const gates = config.quality_gates;\n // Map common gate names to variables\n const gateMappings: Record<string, keyof SkillVariables> = {\n lint: 'LINT_CMD',\n test: 'TEST_CMD',\n build: 'BUILD_CMD',\n static_analysis: 'STATIC_ANALYSIS_CMD',\n staticAnalysis: 'STATIC_ANALYSIS_CMD',\n };\n\n for (const [gateName, gate] of Object.entries(gates)) {\n const varName = gateMappings[gateName];\n if (varName) {\n vars[varName] = gate.command;\n }\n }\n }\n\n // Tech stack\n if (config.tech_stack?.primary_language) {\n vars.PRIMARY_LANGUAGE = config.tech_stack.primary_language;\n }\n\n return vars;\n}\n\n/**\n * Substitute variables in template content\n */\nexport function substituteVariables(content: string, variables: SkillVariables): string {\n let result = content;\n\n for (const [key, value] of Object.entries(variables)) {\n if (value !== undefined) {\n // Replace {{VARIABLE}} pattern\n const pattern = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n result = result.replace(pattern, value);\n }\n }\n\n return result;\n}\n\n/**\n * Check if a skill's dependencies are satisfied\n */\nexport function checkDependencies(\n skill: SkillTemplate,\n config?: ResolvedCoreAIConfig | null\n): { satisfied: boolean; missing: SkillDependency[] } {\n if (!skill.dependencies || skill.dependencies.length === 0) {\n return { satisfied: true, missing: [] };\n }\n\n const missing: SkillDependency[] = [];\n\n for (const dep of skill.dependencies) {\n if (!dep.required) {\n // Optional dependencies don't block skill generation\n continue;\n }\n\n // Check if the integration is configured\n let hasIntegration = false;\n\n if (config?.integrations) {\n switch (dep.type) {\n case 'issue_tracker':\n hasIntegration = !!config.integrations.issue_tracker;\n break;\n case 'git':\n hasIntegration = !!config.integrations.git;\n break;\n case 'documentation':\n hasIntegration = !!config.integrations.documentation;\n break;\n case 'state':\n hasIntegration = !!config.integrations.state;\n break;\n }\n }\n\n if (!hasIntegration) {\n missing.push(dep);\n }\n }\n\n return {\n satisfied: missing.length === 0,\n missing,\n };\n}\n\n/**\n * Load custom skill templates from a directory\n */\nexport function loadCustomTemplates(templatesDir: string): SkillTemplate[] {\n const templates: SkillTemplate[] = [];\n\n if (!existsSync(templatesDir)) {\n return templates;\n }\n\n const files = readdirSync(templatesDir);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const filePath = join(templatesDir, file);\n const stat = statSync(filePath);\n if (!stat.isFile()) continue;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const template = parseSkillTemplate(file, content);\n templates.push(template);\n } catch {\n // Skip invalid templates\n }\n }\n\n return templates;\n}\n\n/**\n * Parse a skill template from markdown content\n */\nfunction parseSkillTemplate(filename: string, content: string): SkillTemplate {\n const name = basename(filename, '.md');\n\n // Parse frontmatter\n const frontmatterMatch = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]*)$/);\n\n let description = name;\n let argumentHint: string | undefined;\n const dependencies: SkillDependency[] = [];\n\n if (frontmatterMatch) {\n const frontmatter = frontmatterMatch[1] ?? '';\n const lines = frontmatter.split(/\\r?\\n/);\n\n for (const line of lines) {\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n\n const key = line.slice(0, colonIndex).trim();\n let value = line.slice(colonIndex + 1).trim();\n\n // Remove quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n switch (key) {\n case 'description':\n description = value;\n break;\n case 'argument-hint':\n argumentHint = value;\n break;\n case 'requires':\n if (value.startsWith('[') && value.endsWith(']')) {\n const items = value\n .slice(1, -1)\n .split(',')\n .map((s) => s.trim().replace(/['\"]/g, ''));\n for (const item of items) {\n if (item) {\n dependencies.push({\n type: mapIntegrationName(item),\n required: true,\n });\n }\n }\n }\n break;\n case 'optional':\n if (value.startsWith('[') && value.endsWith(']')) {\n const items = value\n .slice(1, -1)\n .split(',')\n .map((s) => s.trim().replace(/['\"]/g, ''));\n for (const item of items) {\n if (item) {\n dependencies.push({\n type: mapIntegrationName(item),\n required: false,\n });\n }\n }\n }\n break;\n }\n }\n }\n\n const template: SkillTemplate = {\n name,\n description,\n category: 'custom',\n content,\n };\n\n if (argumentHint) {\n template.argumentHint = argumentHint;\n }\n\n if (dependencies.length > 0) {\n template.dependencies = dependencies;\n }\n\n return template;\n}\n\n/**\n * Map integration name to adapter type\n */\nfunction mapIntegrationName(name: string): 'issue_tracker' | 'git' | 'documentation' | 'state' {\n const lower = name.toLowerCase();\n\n if (['jira', 'linear', 'issue_tracker', 'issues', 'github-issues'].includes(lower)) {\n return 'issue_tracker';\n }\n if (['git', 'github', 'gitlab', 'bitbucket'].includes(lower)) {\n return 'git';\n }\n if (['docs', 'documentation', 'confluence', 'notion', 'wiki'].includes(lower)) {\n return 'documentation';\n }\n\n return 'state';\n}\n\n/**\n * Generate skills from templates\n */\nexport function generateSkills(\n config: ResolvedCoreAIConfig | undefined,\n options: GenerateSkillsOptions = {}\n): GenerateSkillsResult {\n const projectRoot = options.projectRoot ?? process.cwd();\n const outputDir = options.outputDir ?? join(projectRoot, '.claude', 'commands');\n const includeCoreSkills = options.includeCoreSkills ?? true;\n const includeOptionalSkills = options.includeOptionalSkills ?? true;\n const overwrite = options.overwrite ?? false;\n\n const result: GenerateSkillsResult = {\n generated: [],\n errors: [],\n variables: {},\n };\n\n // Extract variables from config\n const variables = extractVariables(config);\n\n // Merge custom variables\n if (options.variables) {\n Object.assign(variables, options.variables);\n }\n\n result.variables = variables;\n\n // Collect templates to generate\n let templates: SkillTemplate[] = [];\n\n // Add built-in skills\n if (includeCoreSkills) {\n templates.push(...builtInSkills.filter((s) => s.category === 'core'));\n }\n if (includeOptionalSkills) {\n templates.push(...builtInSkills.filter((s) => s.category === 'optional'));\n }\n\n // Add custom templates\n if (options.customTemplatesDir && existsSync(options.customTemplatesDir)) {\n templates.push(...loadCustomTemplates(options.customTemplatesDir));\n }\n\n // Filter to specific skills if requested\n if (options.skills && options.skills.length > 0) {\n const skillsToInclude = options.skills;\n templates = templates.filter((t) => skillsToInclude.includes(t.name));\n }\n\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate each skill\n for (const template of templates) {\n try {\n const generated = generateSkill(template, variables, config, outputDir, overwrite);\n result.generated.push(generated);\n } catch (error) {\n result.errors.push({\n name: template.name,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n\n/**\n * Generate a single skill from a template\n */\nfunction generateSkill(\n template: SkillTemplate,\n variables: SkillVariables,\n config: ResolvedCoreAIConfig | undefined,\n outputDir: string,\n overwrite: boolean\n): GeneratedSkill {\n const outputPath = join(outputDir, `${template.name}.md`);\n\n // Check if file exists and we shouldn't overwrite\n if (existsSync(outputPath) && !overwrite) {\n return {\n name: template.name,\n category: template.category,\n outputPath,\n action: 'skipped',\n skipReason: 'File already exists',\n };\n }\n\n // Check dependencies\n const { satisfied, missing } = checkDependencies(template, config);\n\n if (!satisfied) {\n const missingTypes = missing.map((d) => d.type).join(', ');\n return {\n name: template.name,\n category: template.category,\n outputPath,\n action: 'skipped',\n skipReason: `Missing required integrations: ${missingTypes}`,\n };\n }\n\n // Substitute variables in content\n const content = substituteVariables(template.content, variables);\n\n // Check if content changed (for update vs create)\n const isUpdate = existsSync(outputPath);\n\n // Write the skill file\n writeFileSync(outputPath, content, 'utf-8');\n\n return {\n name: template.name,\n category: template.category,\n outputPath,\n action: isUpdate ? 'updated' : 'created',\n };\n}\n\n/**\n * Format skill generation result for display\n */\nexport function formatGenerateResult(result: GenerateSkillsResult): string {\n const lines: string[] = [];\n\n const created = result.generated.filter((g) => g.action === 'created');\n const updated = result.generated.filter((g) => g.action === 'updated');\n const skipped = result.generated.filter((g) => g.action === 'skipped');\n\n if (created.length > 0) {\n lines.push(`Created ${created.length} skill(s):`);\n for (const skill of created) {\n lines.push(` ✓ ${skill.name}`);\n }\n lines.push('');\n }\n\n if (updated.length > 0) {\n lines.push(`Updated ${updated.length} skill(s):`);\n for (const skill of updated) {\n lines.push(` ✓ ${skill.name}`);\n }\n lines.push('');\n }\n\n if (skipped.length > 0) {\n lines.push(`Skipped ${skipped.length} skill(s):`);\n for (const skill of skipped) {\n lines.push(` - ${skill.name}: ${skill.skipReason}`);\n }\n lines.push('');\n }\n\n if (result.errors.length > 0) {\n lines.push(`Failed to generate ${result.errors.length} skill(s):`);\n for (const error of result.errors) {\n lines.push(` ✗ ${error.name}: ${error.error}`);\n }\n lines.push('');\n }\n\n const total = created.length + updated.length;\n if (total > 0) {\n lines.push(`Generated ${total} skill(s) to .claude/commands/`);\n } else if (result.generated.length === 0 && result.errors.length === 0) {\n lines.push('No skills to generate.');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Built-in Skill Templates\n *\n * Core skill templates that are included with CoreAI.\n * These templates use {{VARIABLE}} placeholders for substitution.\n */\n\nimport type { SkillTemplate } from './types.js';\n\n/**\n * Check inbox skill - process incoming messages\n */\nexport const checkInboxSkill: SkillTemplate = {\n name: 'check-inbox',\n description: 'Check your inbox for pending tasks and messages',\n category: 'core',\n content: `---\ndescription: Check your inbox for pending tasks and messages\n---\n\n# Check Inbox\n\nCheck the inbox at \\`KnowledgeLibrary/{{AGENT_NAME}}/inbox/\\` for new messages.\n\n## Instructions\n\n1. Read all unprocessed messages in the inbox directory\n2. For each message:\n - Parse the frontmatter (type, from, date, priority)\n - Understand the request or task\n - Take appropriate action based on message type\n3. After processing, move message to \\`inbox/processed/\\`\n4. Update your context file at \\`KnowledgeLibrary/{{AGENT_NAME}}/context/current.txt\\`\n\n## Message Types\n\n- **task-assignment**: New work assigned to you\n- **completion-report**: Another agent completed work\n- **review-request**: Code review needed\n- **feedback**: Response to your previous work\n\n## Output Format\n\nReport what messages were processed and actions taken.\n`,\n};\n\n/**\n * Delegate skill - assign tasks to other agents\n */\nexport const delegateSkill: SkillTemplate = {\n name: 'delegate',\n description: 'Delegate a task to another agent via inbox messaging',\n argumentHint: '<task-description> to <agent-name>',\n category: 'core',\n content: `---\ndescription: Delegate a task to another agent via inbox messaging\nargument-hint: <task-description> to <agent-name>\n---\n\n# Delegate Task\n\nDelegate work to another agent using the inbox-based messaging system.\n\n## CRITICAL: Do NOT use the Task tool\n\nAgent-to-agent delegation MUST use file-based messaging, not the Task tool.\nThe Task tool spawns subagents that lose MCP access.\n\n## Instructions\n\n1. Parse the delegation request to identify:\n - The task to delegate\n - The target agent\n\n2. Create a message file in the target agent's inbox:\n - Path: \\`KnowledgeLibrary/<target-agent>/inbox/\\`\n - Filename: \\`YYYYMMDD_HHMM-{{AGENT_NAME}}-<subject>.md\\`\n\n3. Use this message format:\n\\`\\`\\`markdown\n---\ntype: task-assignment\nfrom: {{AGENT_NAME}}\nto: <target-agent>\ndate: YYYY-MM-DD HH:MM\npriority: P2\n---\n\n## Task Assignment\n\n### Description\n<Clear description of what needs to be done>\n\n### Context\n<Any relevant context or background>\n\n### Expected Deliverables\n1. <Deliverable 1>\n2. <Deliverable 2>\n\n### Success Criteria\n- <Criterion 1>\n- <Criterion 2>\n\\`\\`\\`\n\n4. Tell the user to invoke the target agent:\n \"Please invoke @<target-agent> to process this task.\"\n\n## Output\n\nConfirm the delegation message was created and instruct user to invoke the agent.\n`,\n};\n\n/**\n * Git commit skill - quality-gated commits\n */\nexport const gitCommitSkill: SkillTemplate = {\n name: 'git-commit',\n description: 'Create a quality-gated git commit',\n argumentHint: '<commit-message>',\n category: 'core',\n dependencies: [{ type: 'git', required: false, description: 'For commit operations' }],\n content: `---\ndescription: Create a quality-gated git commit\nargument-hint: <commit-message>\noptional: [git]\n---\n\n# Git Commit\n\nCreate a git commit after passing all quality gates.\n\n## Quality Gates\n\nRun these checks before committing:\n\n1. **Lint**: \\`{{LINT_CMD}}\\`\n2. **Tests**: \\`{{TEST_CMD}}\\`\n3. **Build**: \\`{{BUILD_CMD}}\\`\n\n## Instructions\n\n1. Stage the relevant files with \\`git add\\`\n2. Run all quality gate commands\n3. If any gate fails:\n - Fix the issues\n - Re-run the failed gate\n - Continue only when all pass\n4. Create the commit with the provided message\n5. Format: Include ticket reference if applicable\n\n## Commit Message Format\n\n\\`\\`\\`\n<type>(<scope>): <description>\n\n[optional body]\n\n[optional footer]\n\\`\\`\\`\n\nTypes: feat, fix, docs, style, refactor, test, chore\n\n## Fallbacks\n\nIf quality gate commands are not configured:\n- Ask the user what commands to run\n- Or skip gates with user confirmation\n`,\n};\n\n/**\n * PR create skill - create pull requests\n */\nexport const prCreateSkill: SkillTemplate = {\n name: 'pr-create',\n description: 'Create a pull request with proper format',\n argumentHint: '[branch-name]',\n category: 'core',\n dependencies: [{ type: 'git', required: true, description: 'For PR creation' }],\n content: `---\ndescription: Create a pull request with proper format\nargument-hint: [branch-name]\nrequires: [git]\n---\n\n# Create Pull Request\n\nCreate a well-formatted pull request for the current branch.\n\n## Instructions\n\n1. Ensure all changes are committed\n2. Push the branch to remote\n3. Create PR with proper format:\n\n\\`\\`\\`markdown\n## Summary\n<Brief description of changes>\n\n## Changes\n- <Change 1>\n- <Change 2>\n\n## Test Plan\n- [ ] <Test case 1>\n- [ ] <Test case 2>\n\n## Related Issues\nCloses {{JIRA_PROJECT}}-XXX\n\\`\\`\\`\n\n4. Request reviewers if specified\n\n## Using GitHub CLI\n\n\\`\\`\\`bash\ngh pr create --title \"<title>\" --body \"<body>\"\n\\`\\`\\`\n\n## Output\n\nProvide the PR URL and summary of what was created.\n`,\n};\n\n/**\n * Review skill - code review delegation\n */\nexport const reviewSkill: SkillTemplate = {\n name: 'review',\n description: 'Request or perform a code review',\n argumentHint: '<pr-number-or-url>',\n category: 'core',\n dependencies: [{ type: 'git', required: true, description: 'For PR review' }],\n content: `---\ndescription: Request or perform a code review\nargument-hint: <pr-number-or-url>\nrequires: [git]\n---\n\n# Code Review\n\nReview a pull request or delegate review to a specialist.\n\n## Instructions\n\n### If you are reviewing:\n\n1. Fetch the PR details and diff\n2. Review for:\n - Code quality and style\n - Logic errors or bugs\n - Security concerns\n - Test coverage\n - Documentation\n3. Provide feedback with specific line references\n4. Approve, request changes, or comment\n\n### If delegating to a reviewer:\n\n1. Identify the appropriate reviewer based on the changes\n2. Create a review request message in their inbox\n3. Include PR link and context\n\n## Review Checklist\n\n- [ ] Code follows project conventions\n- [ ] No obvious bugs or edge cases\n- [ ] Tests cover the changes\n- [ ] Documentation updated if needed\n- [ ] No security vulnerabilities\n\n## Output\n\nProvide review summary with actionable feedback.\n`,\n};\n\n/**\n * Sprint status skill - check sprint progress\n */\nexport const sprintStatusSkill: SkillTemplate = {\n name: 'sprint-status',\n description: 'Get current sprint status and progress',\n category: 'optional',\n dependencies: [{ type: 'issue_tracker', required: true, description: 'For sprint data' }],\n content: `---\ndescription: Get current sprint status and progress\nrequires: [issue_tracker]\n---\n\n# Sprint Status\n\nGet the current sprint status and team progress.\n\n## Instructions\n\n1. Query the active sprint for project {{JIRA_PROJECT}}\n2. Gather metrics:\n - Total story points committed\n - Points completed\n - Points in progress\n - Points remaining\n3. List tickets by status\n4. Identify blockers or at-risk items\n\n## Output Format\n\n\\`\\`\\`\nSprint: <sprint-name>\nProgress: XX/YY points (ZZ%)\n\n## Completed\n- [{{JIRA_PROJECT}}-123] Task name (3 pts)\n\n## In Progress\n- [{{JIRA_PROJECT}}-124] Task name (5 pts) - @assignee\n\n## To Do\n- [{{JIRA_PROJECT}}-125] Task name (2 pts)\n\n## Blocked\n- [{{JIRA_PROJECT}}-126] Task name - Reason\n\\`\\`\\`\n\n## Fallbacks\n\nIf issue tracker is unavailable:\n- Report that sprint data cannot be fetched\n- Suggest checking the issue tracker directly at {{JIRA_URL}}\n`,\n};\n\n/**\n * Jira create skill - create Jira tickets\n */\nexport const jiraCreateSkill: SkillTemplate = {\n name: 'jira-create',\n description: 'Create a new Jira ticket',\n argumentHint: '<ticket-type> <summary>',\n category: 'optional',\n dependencies: [{ type: 'issue_tracker', required: true, description: 'For ticket creation' }],\n content: `---\ndescription: Create a new Jira ticket\nargument-hint: <ticket-type> <summary>\nrequires: [issue_tracker]\n---\n\n# Create Jira Ticket\n\nCreate a new ticket in project {{JIRA_PROJECT}}.\n\n## Instructions\n\n1. Parse the ticket type and summary from arguments\n2. Gather additional details:\n - Description\n - Priority\n - Labels\n - Components (if applicable)\n3. Create the ticket via the issue tracker integration\n4. Return the ticket key and URL\n\n## Ticket Types\n\n- **Story**: User-facing feature\n- **Bug**: Defect to fix\n- **Task**: Technical work\n- **Spike**: Research/investigation\n\n## Output\n\n\\`\\`\\`\nCreated: {{JIRA_PROJECT}}-XXX\nURL: {{JIRA_URL}}/browse/{{JIRA_PROJECT}}-XXX\nSummary: <summary>\nType: <type>\n\\`\\`\\`\n\n## Fallbacks\n\nIf issue tracker is unavailable:\n- Provide the user with manual creation instructions\n- Include all details they should enter\n`,\n};\n\n/**\n * Jira transition skill - update ticket status\n */\nexport const jiraTransitionSkill: SkillTemplate = {\n name: 'jira-transition',\n description: 'Transition a Jira ticket to a new status',\n argumentHint: '<ticket-key> to <status>',\n category: 'optional',\n dependencies: [{ type: 'issue_tracker', required: true, description: 'For ticket transitions' }],\n content: `---\ndescription: Transition a Jira ticket to a new status\nargument-hint: <ticket-key> to <status>\nrequires: [issue_tracker]\n---\n\n# Transition Jira Ticket\n\nUpdate the status of a ticket in {{JIRA_PROJECT}}.\n\n## Status Mapping\n\n| Workflow Status | Jira Status |\n|-----------------|-------------|\n| BACKLOG | Backlog |\n| IN_PROGRESS | In Progress |\n| PR_CREATED | In Review |\n| IN_REVIEW | In Review |\n| APPROVED | Ready to Merge |\n| MERGED | Done |\n| DONE | Done |\n\n## Instructions\n\n1. Parse ticket key and target status\n2. Validate the transition is allowed\n3. Add a comment explaining the transition\n4. Execute the transition\n\n## Transition Comment Format\n\n\\`\\`\\`\nStatus updated to <status>.\n<optional context about why>\n\\`\\`\\`\n\n## Fallbacks\n\nIf issue tracker is unavailable:\n- Instruct user to manually transition at {{JIRA_URL}}\n- Provide the target status name\n`,\n};\n\n/**\n * Docs update skill - update documentation\n */\nexport const docsUpdateSkill: SkillTemplate = {\n name: 'docs-update',\n description: 'Update project documentation',\n argumentHint: '<doc-path-or-topic>',\n category: 'optional',\n dependencies: [{ type: 'documentation', required: false, description: 'For remote docs' }],\n content: `---\ndescription: Update project documentation\nargument-hint: <doc-path-or-topic>\noptional: [documentation]\n---\n\n# Update Documentation\n\nUpdate project documentation for a specific topic or file.\n\n## Instructions\n\n1. Identify the documentation to update:\n - Local: \\`{{DOCS_PATH}}/\\`\n - Remote: {{CONFLUENCE_SPACE}} (if configured)\n\n2. Make the necessary updates:\n - Keep formatting consistent\n - Update examples if code changed\n - Add/update version information\n\n3. For remote documentation:\n - Use the documentation integration\n - Or provide content for manual update\n\n## Documentation Types\n\n- **README**: Project overview and setup\n- **API Docs**: Endpoint documentation\n- **Architecture**: Design decisions\n- **Runbooks**: Operational procedures\n\n## Fallbacks\n\nIf documentation integration is unavailable:\n- Create/update local markdown files\n- Provide instructions for manual remote update\n`,\n};\n\n/**\n * All built-in skill templates\n */\nexport const builtInSkills: SkillTemplate[] = [\n checkInboxSkill,\n delegateSkill,\n gitCommitSkill,\n prCreateSkill,\n reviewSkill,\n sprintStatusSkill,\n jiraCreateSkill,\n jiraTransitionSkill,\n docsUpdateSkill,\n];\n\n/**\n * Get a skill template by name\n */\nexport function getSkillTemplate(name: string): SkillTemplate | undefined {\n return builtInSkills.find((s) => s.name === name);\n}\n\n/**\n * Get all skill templates of a category\n */\nexport function getSkillsByCategory(category: 'core' | 'optional'): SkillTemplate[] {\n return builtInSkills.filter((s) => s.category === category);\n}\n","/**\n * KnowledgeLibrary Manager\n *\n * Manages the KnowledgeLibrary directory structure and agent state.\n */\n\nimport {\n existsSync,\n mkdirSync,\n writeFileSync,\n readFileSync,\n readdirSync,\n renameSync,\n statSync,\n} from 'fs';\nimport { join, basename } from 'path';\nimport type {\n AgentDirectories,\n AgentKnowledgeState,\n InitKnowledgeLibraryOptions,\n InitKnowledgeLibraryResult,\n KnowledgeLibraryState,\n Message,\n MessageMetadata,\n ReadMessagesOptions,\n WriteMessageOptions,\n AgentContext,\n} from './types.js';\n\n/**\n * Default KnowledgeLibrary base path\n */\nexport const DEFAULT_KNOWLEDGE_LIBRARY_PATH = 'KnowledgeLibrary';\n\n/**\n * Standard files in a KnowledgeLibrary\n */\nexport const STANDARD_FILES = {\n context: 'context.txt',\n architecture: 'architecture.txt',\n prd: 'prd.txt',\n} as const;\n\n/**\n * Standard directories for each agent\n */\nexport const AGENT_DIRECTORIES = [\n 'inbox',\n 'inbox/processed',\n 'outbox',\n 'context',\n 'control',\n 'history',\n 'tech',\n] as const;\n\n/**\n * Standard files in an agent's control directory\n */\nexport const CONTROL_FILES = {\n objectives: 'objectives.txt',\n decisions: 'decisions.txt',\n dependencies: 'dependencies.txt',\n} as const;\n\n/**\n * Get the path to an agent's directories\n */\nexport function getAgentDirectories(basePath: string, agentName: string): AgentDirectories {\n const root = join(basePath, agentName);\n return {\n root,\n inbox: join(root, 'inbox'),\n inboxProcessed: join(root, 'inbox', 'processed'),\n outbox: join(root, 'outbox'),\n context: join(root, 'context'),\n control: join(root, 'control'),\n history: join(root, 'history'),\n tech: join(root, 'tech'),\n };\n}\n\n/**\n * Initialize the KnowledgeLibrary base structure\n */\nexport function initKnowledgeLibrary(\n options: InitKnowledgeLibraryOptions = {}\n): InitKnowledgeLibraryResult {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const createDefaults = options.createDefaults ?? true;\n\n const createdDirs: string[] = [];\n const createdFiles: string[] = [];\n\n try {\n // Create base directory\n if (!existsSync(basePath)) {\n mkdirSync(basePath, { recursive: true });\n createdDirs.push(basePath);\n }\n\n // Create default global files if requested\n if (createDefaults) {\n // context.txt\n const contextPath = join(basePath, STANDARD_FILES.context);\n if (!existsSync(contextPath)) {\n writeFileSync(\n contextPath,\n `# Project Context\n\n## Current Sprint\n- Sprint: [Sprint name/number]\n- Goals: [Sprint goals]\n- Deadline: [Sprint deadline]\n\n## Priorities\n1. [Priority 1]\n2. [Priority 2]\n3. [Priority 3]\n\n## Notes\n[Project-wide notes and context]\n`,\n 'utf-8'\n );\n createdFiles.push(contextPath);\n }\n\n // architecture.txt\n const architecturePath = join(basePath, STANDARD_FILES.architecture);\n if (!existsSync(architecturePath)) {\n writeFileSync(\n architecturePath,\n `# Architecture Notes\n\n## Technical Decisions\n[Record major technical decisions here]\n\n## System Overview\n[High-level system architecture]\n\n## Key Components\n[Important system components]\n`,\n 'utf-8'\n );\n createdFiles.push(architecturePath);\n }\n\n // prd.txt\n const prdPath = join(basePath, STANDARD_FILES.prd);\n if (!existsSync(prdPath)) {\n writeFileSync(\n prdPath,\n `# Product Requirements Document\n\n## Overview\n[Product overview]\n\n## Goals\n[Product goals]\n\n## Features\n[Feature list]\n\n## Requirements\n[Detailed requirements]\n`,\n 'utf-8'\n );\n createdFiles.push(prdPath);\n }\n }\n\n return {\n success: true,\n createdDirs,\n createdFiles,\n };\n } catch (error) {\n return {\n success: false,\n createdDirs,\n createdFiles,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Initialize an agent's KnowledgeLibrary directories\n */\nexport function initAgentKnowledgeLibrary(\n agentName: string,\n options: InitKnowledgeLibraryOptions = {}\n): InitKnowledgeLibraryResult {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const createDefaults = options.createDefaults ?? true;\n\n const createdDirs: string[] = [];\n const createdFiles: string[] = [];\n\n try {\n // Ensure base KnowledgeLibrary exists\n if (!existsSync(basePath)) {\n const baseResult = initKnowledgeLibrary(options);\n if (!baseResult.success) {\n return baseResult;\n }\n createdDirs.push(...baseResult.createdDirs);\n createdFiles.push(...baseResult.createdFiles);\n }\n\n // Get agent directories\n const dirs = getAgentDirectories(basePath, agentName);\n\n // Create all agent directories\n for (const dir of AGENT_DIRECTORIES) {\n const dirPath = join(dirs.root, dir);\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true });\n createdDirs.push(dirPath);\n }\n }\n\n // Create default files if requested\n if (createDefaults) {\n // context/current.txt\n const currentContextPath = join(dirs.context, 'current.txt');\n if (!existsSync(currentContextPath)) {\n writeFileSync(\n currentContextPath,\n `# ${agentName} Current Context\n\n## Status\n- State: idle\n- Current Task: None\n- Last Updated: ${new Date().toISOString()}\n\n## Notes\n[Agent-specific context notes]\n`,\n 'utf-8'\n );\n createdFiles.push(currentContextPath);\n }\n\n // control/objectives.txt\n const objectivesPath = join(dirs.control, CONTROL_FILES.objectives);\n if (!existsSync(objectivesPath)) {\n writeFileSync(\n objectivesPath,\n `# ${agentName} Objectives\n\n## Current Objectives\n[None]\n\n## Success Criteria\n[Define success criteria for objectives]\n`,\n 'utf-8'\n );\n createdFiles.push(objectivesPath);\n }\n\n // control/decisions.txt\n const decisionsPath = join(dirs.control, CONTROL_FILES.decisions);\n if (!existsSync(decisionsPath)) {\n writeFileSync(\n decisionsPath,\n `# ${agentName} Decision Log\n\n## Decisions\n[Record important decisions here]\n\nFormat:\n- Date: YYYY-MM-DD\n- Decision: [What was decided]\n- Reasoning: [Why]\n- Related: [Ticket or task reference]\n`,\n 'utf-8'\n );\n createdFiles.push(decisionsPath);\n }\n\n // control/dependencies.txt\n const dependenciesPath = join(dirs.control, CONTROL_FILES.dependencies);\n if (!existsSync(dependenciesPath)) {\n writeFileSync(\n dependenciesPath,\n `# ${agentName} Dependencies\n\n## Blocked By\n[Tasks/agents blocking this agent]\n\n## Blocking\n[Tasks/agents this agent is blocking]\n\nLast Updated: ${new Date().toISOString()}\n`,\n 'utf-8'\n );\n createdFiles.push(dependenciesPath);\n }\n }\n\n return {\n success: true,\n createdDirs,\n createdFiles,\n };\n } catch (error) {\n return {\n success: false,\n createdDirs,\n createdFiles,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Check if a KnowledgeLibrary exists for an agent\n */\nexport function agentKnowledgeLibraryExists(\n agentName: string,\n options: { projectRoot?: string; basePath?: string } = {}\n): boolean {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const agentRoot = join(basePath, agentName);\n\n return existsSync(agentRoot) && existsSync(join(agentRoot, 'inbox'));\n}\n\n/**\n * Get the KnowledgeLibrary state for an agent\n */\nexport function getAgentKnowledgeState(\n agentName: string,\n options: { projectRoot?: string; basePath?: string } = {}\n): AgentKnowledgeState {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, agentName);\n\n const initialized = agentKnowledgeLibraryExists(agentName, options);\n\n // Get pending messages\n const pendingMessages = initialized ? readInboxMessages(agentName, options) : [];\n\n // Get context\n let context: AgentContext | undefined;\n const currentContextPath = join(dirs.context, 'current.txt');\n if (existsSync(currentContextPath)) {\n const content = readFileSync(currentContextPath, 'utf-8');\n context = parseContextFile(content);\n }\n\n const state: AgentKnowledgeState = {\n agentName,\n directories: dirs,\n pendingMessages,\n initialized,\n };\n\n if (context) {\n state.context = context;\n }\n\n return state;\n}\n\n/**\n * Parse a context file into AgentContext\n */\nfunction parseContextFile(content: string): AgentContext {\n const context: AgentContext = {\n lastUpdated: new Date(),\n };\n\n // Simple parsing - look for key patterns\n const statusMatch = content.match(/State:\\s*(.+)/i);\n if (statusMatch && statusMatch[1]) {\n context.status = statusMatch[1].trim();\n }\n\n const taskMatch = content.match(/Current Task:\\s*(.+)/i);\n if (taskMatch && taskMatch[1] && taskMatch[1].trim() !== 'None') {\n context.currentTask = taskMatch[1].trim();\n }\n\n const ticketMatch = content.match(/Current Ticket:\\s*([A-Z]+-\\d+)/i);\n if (ticketMatch && ticketMatch[1]) {\n context.currentTicket = ticketMatch[1];\n }\n\n const updatedMatch = content.match(/Last Updated:\\s*(.+)/i);\n if (updatedMatch) {\n const dateStr = updatedMatch[1]?.trim();\n if (dateStr) {\n const parsed = new Date(dateStr);\n if (!isNaN(parsed.getTime())) {\n context.lastUpdated = parsed;\n }\n }\n }\n\n return context;\n}\n\n/**\n * Generate a message filename\n */\nexport function generateMessageFilename(from: string, subject: string): string {\n const now = new Date();\n const timestamp = now.toISOString().replace(/[-:T]/g, '').slice(0, 12); // YYYYMMDDHHMM\n const sanitizedSubject = subject\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .slice(0, 30);\n return `${timestamp}-${from}-${sanitizedSubject}.md`;\n}\n\n/**\n * Parse message frontmatter\n */\nfunction parseMessageFrontmatter(content: string): {\n metadata: Partial<MessageMetadata>;\n body: string;\n} {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]*)$/);\n\n if (!match) {\n return { metadata: {}, body: content };\n }\n\n const frontmatter = match[1] ?? '';\n const body = match[2] ?? '';\n const metadata: Partial<MessageMetadata> = {};\n\n for (const line of frontmatter.split(/\\r?\\n/)) {\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n\n switch (key) {\n case 'type':\n metadata.type = value as MessageMetadata['type'];\n break;\n case 'from':\n metadata.from = value;\n break;\n case 'to':\n metadata.to = value;\n break;\n case 'date':\n metadata.date = new Date(value);\n break;\n case 'ticket':\n metadata.ticket = value;\n break;\n case 'priority':\n if (value === 'P0' || value === 'P1' || value === 'P2' || value === 'P3') {\n metadata.priority = value;\n }\n break;\n case 'subject':\n metadata.subject = value;\n break;\n }\n }\n\n return { metadata, body };\n}\n\n/**\n * Read inbox messages for an agent\n */\nexport function readInboxMessages(\n agentName: string,\n options: { projectRoot?: string; basePath?: string } & ReadMessagesOptions = {}\n): Message[] {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, agentName);\n\n const messages: Message[] = [];\n\n // Read inbox\n if (existsSync(dirs.inbox)) {\n const files = readdirSync(dirs.inbox).filter(\n (f) => f.endsWith('.md') && statSync(join(dirs.inbox, f)).isFile()\n );\n\n for (const file of files) {\n const filePath = join(dirs.inbox, file);\n const rawContent = readFileSync(filePath, 'utf-8');\n const { metadata, body } = parseMessageFrontmatter(rawContent);\n\n // Apply filters\n if (options.type && metadata.type !== options.type) continue;\n if (options.from && metadata.from !== options.from) continue;\n if (options.priority && metadata.priority !== options.priority) continue;\n\n messages.push({\n filename: file,\n path: filePath,\n metadata: metadata as MessageMetadata,\n rawContent,\n body,\n });\n }\n }\n\n // Include processed if requested\n if (options.includeProcessed && existsSync(dirs.inboxProcessed)) {\n const files = readdirSync(dirs.inboxProcessed).filter(\n (f) => f.endsWith('.md') && statSync(join(dirs.inboxProcessed, f)).isFile()\n );\n\n for (const file of files) {\n const filePath = join(dirs.inboxProcessed, file);\n const rawContent = readFileSync(filePath, 'utf-8');\n const { metadata, body } = parseMessageFrontmatter(rawContent);\n\n // Apply filters\n if (options.type && metadata.type !== options.type) continue;\n if (options.from && metadata.from !== options.from) continue;\n if (options.priority && metadata.priority !== options.priority) continue;\n\n messages.push({\n filename: file,\n path: filePath,\n metadata: metadata as MessageMetadata,\n rawContent,\n body,\n });\n }\n }\n\n // Sort by date (newest first)\n messages.sort((a, b) => {\n const dateA = a.metadata.date?.getTime() ?? 0;\n const dateB = b.metadata.date?.getTime() ?? 0;\n return dateB - dateA;\n });\n\n // Apply limit\n if (options.limit && messages.length > options.limit) {\n return messages.slice(0, options.limit);\n }\n\n return messages;\n}\n\n/**\n * Write a message to an agent's inbox\n */\nexport function writeInboxMessage(\n options: WriteMessageOptions & { projectRoot?: string; basePath?: string }\n): { success: boolean; path?: string; error?: string } {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, options.to);\n\n try {\n // Ensure agent inbox exists\n if (!existsSync(dirs.inbox)) {\n mkdirSync(dirs.inbox, { recursive: true });\n }\n\n // Generate filename\n const filename = generateMessageFilename(options.from, options.subject);\n const filePath = join(dirs.inbox, filename);\n\n // Format message\n const now = new Date();\n const content = formatMessage(options, now);\n\n // Write file\n writeFileSync(filePath, content, 'utf-8');\n\n // Also copy to sender's outbox\n const senderDirs = getAgentDirectories(basePath, options.from);\n if (existsSync(senderDirs.outbox)) {\n writeFileSync(join(senderDirs.outbox, filename), content, 'utf-8');\n }\n\n return { success: true, path: filePath };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Format a message with frontmatter\n */\nfunction formatMessage(options: WriteMessageOptions, date: Date): string {\n let frontmatter = `---\ntype: ${options.type}\nfrom: ${options.from}\nto: ${options.to}\ndate: ${date.toISOString().slice(0, 16).replace('T', ' ')}`;\n\n if (options.ticket) {\n frontmatter += `\\nticket: ${options.ticket}`;\n }\n\n if (options.priority) {\n frontmatter += `\\npriority: ${options.priority}`;\n }\n\n frontmatter += `\\nsubject: ${options.subject}`;\n\n frontmatter += `\\n---\n\n## ${options.subject}\n\n${options.body}`;\n\n return frontmatter;\n}\n\n/**\n * Mark a message as processed (move to processed folder)\n */\nexport function markMessageProcessed(\n agentName: string,\n messageFilename: string,\n options: { projectRoot?: string; basePath?: string } = {}\n): { success: boolean; error?: string } {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, agentName);\n\n const sourcePath = join(dirs.inbox, messageFilename);\n const destPath = join(dirs.inboxProcessed, messageFilename);\n\n try {\n if (!existsSync(sourcePath)) {\n return { success: false, error: `Message not found: ${messageFilename}` };\n }\n\n if (!existsSync(dirs.inboxProcessed)) {\n mkdirSync(dirs.inboxProcessed, { recursive: true });\n }\n\n renameSync(sourcePath, destPath);\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Get global KnowledgeLibrary state\n */\nexport function getKnowledgeLibraryState(\n options: { projectRoot?: string; basePath?: string } = {}\n): KnowledgeLibraryState | null {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n\n if (!existsSync(basePath)) {\n return null;\n }\n\n // Get list of agents\n const agents: string[] = [];\n const entries = readdirSync(basePath);\n for (const entry of entries) {\n const entryPath = join(basePath, entry);\n if (statSync(entryPath).isDirectory() && existsSync(join(entryPath, 'inbox'))) {\n agents.push(entry);\n }\n }\n\n return {\n basePath,\n contextPath: join(basePath, STANDARD_FILES.context),\n architecturePath: join(basePath, STANDARD_FILES.architecture),\n prdPath: join(basePath, STANDARD_FILES.prd),\n agents,\n };\n}\n\n/**\n * Update agent context\n */\nexport function updateAgentContext(\n agentName: string,\n context: Partial<AgentContext>,\n options: { projectRoot?: string; basePath?: string } = {}\n): { success: boolean; error?: string } {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, agentName);\n const contextPath = join(dirs.context, 'current.txt');\n\n try {\n const now = new Date();\n const content = `# ${agentName} Current Context\n\n## Status\n- State: ${context.status ?? 'idle'}\n- Current Task: ${context.currentTask ?? 'None'}\n${context.currentTicket ? `- Current Ticket: ${context.currentTicket}` : ''}- Last Updated: ${now.toISOString()}\n\n## Notes\n${context.notes ?? '[Agent-specific context notes]'}\n`;\n\n if (!existsSync(dirs.context)) {\n mkdirSync(dirs.context, { recursive: true });\n }\n\n writeFileSync(contextPath, content, 'utf-8');\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Format KnowledgeLibrary state for display\n */\nexport function formatKnowledgeLibraryState(state: KnowledgeLibraryState | null): string {\n if (!state) {\n return 'KnowledgeLibrary not initialized.';\n }\n\n const lines: string[] = [];\n lines.push(`KnowledgeLibrary: ${state.basePath}\\n`);\n\n lines.push('Global files:');\n lines.push(` - ${basename(state.contextPath)}`);\n lines.push(` - ${basename(state.architecturePath)}`);\n lines.push(` - ${basename(state.prdPath)}`);\n lines.push('');\n\n if (state.agents.length > 0) {\n lines.push(`Agents (${state.agents.length}):`);\n for (const agent of state.agents) {\n lines.push(` - ${agent}`);\n }\n } else {\n lines.push('No agents initialized.');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format agent knowledge state for display\n */\nexport function formatAgentKnowledgeState(state: AgentKnowledgeState): string {\n const lines: string[] = [];\n\n lines.push(`Agent: ${state.agentName}`);\n lines.push(`Status: ${state.initialized ? 'Initialized' : 'Not initialized'}`);\n lines.push('');\n\n if (state.context) {\n lines.push('Context:');\n lines.push(` State: ${state.context.status ?? 'unknown'}`);\n if (state.context.currentTask) {\n lines.push(` Current Task: ${state.context.currentTask}`);\n }\n if (state.context.currentTicket) {\n lines.push(` Current Ticket: ${state.context.currentTicket}`);\n }\n lines.push(` Last Updated: ${state.context.lastUpdated.toISOString()}`);\n lines.push('');\n }\n\n if (state.pendingMessages.length > 0) {\n lines.push(`Pending Messages (${state.pendingMessages.length}):`);\n for (const msg of state.pendingMessages) {\n const type = msg.metadata.type ?? 'unknown';\n const from = msg.metadata.from ?? 'unknown';\n const subject = msg.metadata.subject ?? msg.filename;\n lines.push(` - [${type}] from ${from}: ${subject}`);\n }\n } else {\n lines.push('No pending messages.');\n }\n\n return lines.join('\\n');\n}\n","/**\n * CoreAI - A configurable, team-ready AI agent orchestration platform.\n *\n * This is the main library export for programmatic usage.\n */\n\nexport const VERSION = '0.1.0';\n\n// Configuration\nexport {\n loadConfig,\n loadConfigFromFile,\n findConfigFile,\n configExists,\n getConfigPath,\n ConfigError,\n} from './config/index.js';\n\nexport type {\n CoreAIConfig,\n ResolvedCoreAIConfig,\n ProjectConfig,\n TeamConfig,\n IntegrationsConfig,\n QualityGatesConfig,\n TechStackConfig,\n CacheConfig,\n ConfigErrorCode,\n} from './config/index.js';\n\n// Agents\nexport {\n loadAgentFromFile,\n loadAgentsFromDirectory,\n parseAgentYaml,\n validateAgentDefinition,\n getRoleFromFilename,\n AgentError,\n resolveString,\n resolveObject,\n resolveAgentDefinition,\n hasVariables,\n extractVariables,\n ResolutionError,\n generateAgentMarkdown,\n compileAgent,\n compileAgents,\n loadAllAgents,\n filterAgentsByTeam,\n getCoreAgentsDir,\n} from './agents/index.js';\n\nexport type {\n AgentDefinition,\n ResolvedAgentDefinition,\n AgentType,\n WorkflowType,\n AgentMetadata,\n AgentSource,\n AgentErrorCode,\n ResolutionContext,\n ResolutionOptions,\n CompileOptions,\n CompileResult,\n} from './agents/index.js';\n\n// Adapters\nexport {\n AdapterFactory,\n createAdapterFactory,\n createAdapterInfo,\n AdapterError,\n} from './adapters/index.js';\n\nexport type {\n AdapterType,\n AdapterImplementation,\n AdapterInfo,\n AdapterFactoryOptions,\n AdapterErrorCode,\n BaseAdapter,\n IssueTrackerAdapter,\n GitProviderAdapter,\n DocumentationProviderAdapter,\n StateProviderAdapter,\n Adapter,\n Issue,\n IssueQuery,\n IssueStatus,\n CreateIssueData,\n UpdateIssueData,\n PullRequest,\n PullRequestQuery,\n PullRequestStatus,\n CreatePullRequestData,\n Review,\n CreateReviewData,\n ReviewDecision,\n ReviewComment,\n DocumentationPage,\n DocumentationQuery,\n StateEntry,\n StateOptions,\n} from './adapters/index.js';\n\n// Cache\nexport {\n CacheError,\n CACHE_PATHS,\n DEFAULT_CACHE_CONFIG,\n FileCacheProvider,\n createFileCacheProvider,\n FileCacheManager,\n createCacheManager,\n} from './cache/index.js';\n\nexport type {\n CacheSource,\n CacheStatus,\n CacheMetadata,\n CacheEntry,\n CacheOptions,\n CacheListOptions,\n CacheStats,\n SyncResult,\n CacheErrorCode,\n CacheProvider,\n RemoteFetcher,\n FetchOptions,\n CacheManager,\n SyncOptions,\n FileCacheProviderOptions,\n CacheManagerOptions,\n} from './cache/index.js';\n\n// Context\nexport { ContextLoader, createContextLoader } from './context/index.js';\n\nexport type {\n ContextSource,\n ContextLoadResult,\n ContextLoaderOptions,\n LoadOptions,\n} from './context/index.js';\n\n// Commands\nexport {\n CommandRegistry,\n createCommandRegistry,\n getGlobalRegistry,\n resetGlobalRegistry,\n createCommandContext,\n cleanupContext,\n withContext,\n loadCommandFromFile,\n loadCommandsFromDirectory,\n loadCoreAICommands,\n loadAllCommands,\n runCommand,\n executeWithDegradation,\n createDegradingHandler,\n StepTracker,\n} from './commands/index.js';\n\nexport type {\n CommandCategory,\n IntegrationDependency,\n CommandMetadata,\n CommandContext,\n BaseCommandOptions,\n CommandResult,\n CommandHandler,\n CommandDefinition,\n CommandOptionDefinition,\n CommandArgumentDefinition,\n MarkdownCommand,\n RegistryEntry,\n CommandLoaderOptions,\n CommandLoadResult,\n CreateContextOptions,\n RunCommandOptions,\n} from './commands/index.js';\n\n// Skills\nexport {\n extractVariables as extractSkillVariables,\n substituteVariables,\n checkDependencies,\n loadCustomTemplates,\n generateSkills,\n formatGenerateResult,\n builtInSkills,\n} from './skills/index.js';\n\nexport type {\n SkillTemplate,\n SkillVariables,\n SkillCategory,\n SkillDependency,\n GenerateSkillsOptions,\n GenerateSkillsResult,\n GeneratedSkill,\n SkillError,\n} from './skills/index.js';\n\n// KnowledgeLibrary\nexport {\n DEFAULT_KNOWLEDGE_LIBRARY_PATH,\n STANDARD_FILES,\n AGENT_DIRECTORIES,\n CONTROL_FILES,\n getAgentDirectories,\n initKnowledgeLibrary,\n initAgentKnowledgeLibrary,\n agentKnowledgeLibraryExists,\n getAgentKnowledgeState,\n generateMessageFilename,\n readInboxMessages,\n writeInboxMessage,\n markMessageProcessed,\n getKnowledgeLibraryState,\n updateAgentContext,\n formatKnowledgeLibraryState,\n formatAgentKnowledgeState,\n} from './knowledge-library/index.js';\n\nexport type {\n MessageType,\n MessagePriority,\n MessageMetadata,\n Message,\n AgentContext,\n Objective,\n Decision,\n Dependency,\n AgentControl,\n AgentDirectories,\n AgentKnowledgeState,\n InitKnowledgeLibraryOptions,\n InitKnowledgeLibraryResult,\n ReadMessagesOptions,\n WriteMessageOptions,\n KnowledgeLibraryState,\n} from './knowledge-library/index.js';\n"],"mappings":"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","names":["require","existsSync","readFileSync","join","parseYaml","Ajv","createRequire","require","existsSync","join","dirname","existsSync","join","dirname","join","dirname","join","dirname","fs","join","basename","dirname","result","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","join","basename","extractVariables","existsSync","readdirSync","join","readFileSync","basename","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","statSync","join","basename"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config/loader.ts","../src/agents/types.ts","../src/agents/loader.ts","../src/agents/resolver.ts","../src/agents/compiler.ts","../src/adapters/types.ts","../src/adapters/factory.ts","../src/adapters/mcp/client.ts","../src/adapters/native/github.ts","../src/cache/types.ts","../src/cache/provider.ts","../src/cache/manager.ts","../src/context/loader.ts","../src/commands/context.ts","../src/commands/registry.ts","../src/commands/loader.ts","../src/commands/runner.ts","../src/skills/generator.ts","../src/skills/templates.ts","../src/knowledge-library/manager.ts"],"sourcesContent":["/**\n * CoreAI - A configurable, team-ready AI agent orchestration platform.\n *\n * This is the main library export for programmatic usage.\n */\n\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst packageJson = require('../package.json');\n\nexport const VERSION: string = packageJson.version;\n\n// Configuration\nexport {\n loadConfig,\n loadConfigFromFile,\n findConfigFile,\n configExists,\n getConfigPath,\n ConfigError,\n} from './config/index.js';\n\nexport type {\n CoreAIConfig,\n ResolvedCoreAIConfig,\n ProjectConfig,\n TeamConfig,\n IntegrationsConfig,\n QualityGatesConfig,\n TechStackConfig,\n CacheConfig,\n ConfigErrorCode,\n} from './config/index.js';\n\n// Agents\nexport {\n loadAgentFromFile,\n loadAgentsFromDirectory,\n parseAgentYaml,\n validateAgentDefinition,\n getRoleFromFilename,\n AgentError,\n resolveString,\n resolveObject,\n resolveAgentDefinition,\n hasVariables,\n extractVariables,\n ResolutionError,\n generateAgentMarkdown,\n compileAgent,\n compileAgents,\n loadAllAgents,\n filterAgentsByTeam,\n getCoreAgentsDir,\n} from './agents/index.js';\n\nexport type {\n AgentDefinition,\n ResolvedAgentDefinition,\n AgentType,\n WorkflowType,\n AgentMetadata,\n AgentSource,\n AgentErrorCode,\n ResolutionContext,\n ResolutionOptions,\n CompileOptions,\n CompileResult,\n} from './agents/index.js';\n\n// Adapters\nexport {\n AdapterFactory,\n createAdapterFactory,\n createAdapterInfo,\n AdapterError,\n} from './adapters/index.js';\n\nexport type {\n AdapterType,\n AdapterImplementation,\n AdapterInfo,\n AdapterFactoryOptions,\n AdapterErrorCode,\n BaseAdapter,\n IssueTrackerAdapter,\n GitProviderAdapter,\n DocumentationProviderAdapter,\n StateProviderAdapter,\n Adapter,\n Issue,\n IssueQuery,\n IssueStatus,\n CreateIssueData,\n UpdateIssueData,\n PullRequest,\n PullRequestQuery,\n PullRequestStatus,\n CreatePullRequestData,\n Review,\n CreateReviewData,\n ReviewDecision,\n ReviewComment,\n DocumentationPage,\n DocumentationQuery,\n StateEntry,\n StateOptions,\n} from './adapters/index.js';\n\n// Cache\nexport {\n CacheError,\n CACHE_PATHS,\n DEFAULT_CACHE_CONFIG,\n FileCacheProvider,\n createFileCacheProvider,\n FileCacheManager,\n createCacheManager,\n} from './cache/index.js';\n\nexport type {\n CacheSource,\n CacheStatus,\n CacheMetadata,\n CacheEntry,\n CacheOptions,\n CacheListOptions,\n CacheStats,\n SyncResult,\n CacheErrorCode,\n CacheProvider,\n RemoteFetcher,\n FetchOptions,\n CacheManager,\n SyncOptions,\n FileCacheProviderOptions,\n CacheManagerOptions,\n} from './cache/index.js';\n\n// Context\nexport { ContextLoader, createContextLoader } from './context/index.js';\n\nexport type {\n ContextSource,\n ContextLoadResult,\n ContextLoaderOptions,\n LoadOptions,\n} from './context/index.js';\n\n// Commands\nexport {\n CommandRegistry,\n createCommandRegistry,\n getGlobalRegistry,\n resetGlobalRegistry,\n createCommandContext,\n cleanupContext,\n withContext,\n loadCommandFromFile,\n loadCommandsFromDirectory,\n loadCoreAICommands,\n loadAllCommands,\n runCommand,\n executeWithDegradation,\n createDegradingHandler,\n StepTracker,\n} from './commands/index.js';\n\nexport type {\n CommandCategory,\n IntegrationDependency,\n CommandMetadata,\n CommandContext,\n BaseCommandOptions,\n CommandResult,\n CommandHandler,\n CommandDefinition,\n CommandOptionDefinition,\n CommandArgumentDefinition,\n MarkdownCommand,\n RegistryEntry,\n CommandLoaderOptions,\n CommandLoadResult,\n CreateContextOptions,\n RunCommandOptions,\n} from './commands/index.js';\n\n// Skills\nexport {\n extractVariables as extractSkillVariables,\n substituteVariables,\n checkDependencies,\n loadCustomTemplates,\n generateSkills,\n formatGenerateResult,\n builtInSkills,\n} from './skills/index.js';\n\nexport type {\n SkillTemplate,\n SkillVariables,\n SkillCategory,\n SkillDependency,\n GenerateSkillsOptions,\n GenerateSkillsResult,\n GeneratedSkill,\n SkillError,\n} from './skills/index.js';\n\n// KnowledgeLibrary\nexport {\n DEFAULT_KNOWLEDGE_LIBRARY_PATH,\n STANDARD_FILES,\n AGENT_DIRECTORIES,\n CONTROL_FILES,\n getAgentDirectories,\n initKnowledgeLibrary,\n initAgentKnowledgeLibrary,\n agentKnowledgeLibraryExists,\n getAgentKnowledgeState,\n generateMessageFilename,\n readInboxMessages,\n writeInboxMessage,\n markMessageProcessed,\n getKnowledgeLibraryState,\n updateAgentContext,\n formatKnowledgeLibraryState,\n formatAgentKnowledgeState,\n} from './knowledge-library/index.js';\n\nexport type {\n MessageType,\n MessagePriority,\n MessageMetadata,\n Message,\n AgentContext,\n Objective,\n Decision,\n Dependency,\n AgentControl,\n AgentDirectories,\n AgentKnowledgeState,\n InitKnowledgeLibraryOptions,\n InitKnowledgeLibraryResult,\n ReadMessagesOptions,\n WriteMessageOptions,\n KnowledgeLibraryState,\n} from './knowledge-library/index.js';\n","/**\n * Configuration Loader\n *\n * Handles config file discovery, parsing, validation, and defaults.\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { dirname, join, resolve } from 'path';\nimport { parse as parseYaml } from 'yaml';\nimport Ajv, { type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport type { CoreAIConfig, ResolvedCoreAIConfig } from './types.js';\n\n// Import schema as JSON\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst configSchema = require('../../schemas/coreai.config.schema.json') as object;\n\nconst CONFIG_FILE_NAME = 'coreai.config.yaml';\nconst CONFIG_FILE_NAMES = [CONFIG_FILE_NAME, 'coreai.config.yml'];\n\nexport class ConfigError extends Error {\n constructor(\n message: string,\n public readonly code: ConfigErrorCode,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\nexport type ConfigErrorCode = 'NOT_FOUND' | 'PARSE_ERROR' | 'VALIDATION_ERROR' | 'READ_ERROR';\n\n/**\n * Default team agents\n */\nconst DEFAULT_AGENTS = [\n 'backend-engineer',\n 'frontend-engineer',\n 'devops-engineer',\n 'engineering-manager',\n];\n\n/**\n * Find the config file by walking up the directory tree\n */\nexport function findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = resolve(startDir);\n const root = dirname(currentDir);\n\n while (currentDir !== root) {\n for (const fileName of CONFIG_FILE_NAMES) {\n const configPath = join(currentDir, fileName);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n // Check root directory\n for (const fileName of CONFIG_FILE_NAMES) {\n const configPath = join(currentDir, fileName);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n return null;\n}\n\n/**\n * Parse YAML content into an object\n */\nexport function parseConfig(content: string, filePath?: string): unknown {\n try {\n return parseYaml(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown parse error';\n throw new ConfigError(\n `Failed to parse YAML${filePath ? ` in ${filePath}` : ''}: ${message}`,\n 'PARSE_ERROR',\n error\n );\n }\n}\n\n/**\n * Validate config against JSON schema\n */\nexport function validateConfig(config: unknown): CoreAIConfig {\n const ajv = new Ajv.default({ allErrors: true, strict: false });\n addFormats.default(ajv);\n\n const validate = ajv.compile<CoreAIConfig>(configSchema);\n const valid = validate(config);\n\n if (!valid) {\n const errors: ErrorObject[] = validate.errors ?? [];\n const errorMessages = errors.map((err: ErrorObject) => {\n const path = err.instancePath || 'root';\n return `${path}: ${err.message ?? 'unknown error'}`;\n });\n\n throw new ConfigError(\n `Configuration validation failed:\\n - ${errorMessages.join('\\n - ')}`,\n 'VALIDATION_ERROR',\n errors\n );\n }\n\n return config as CoreAIConfig;\n}\n\n/**\n * Apply default values to config\n */\nexport function applyDefaults(config: CoreAIConfig): ResolvedCoreAIConfig {\n return {\n ...config,\n project: {\n name: config.project?.name ?? 'unnamed',\n type: config.project?.type ?? 'software',\n root: config.project?.root ?? process.cwd(),\n },\n team: {\n agents: config.team?.agents ?? DEFAULT_AGENTS,\n },\n };\n}\n\n/**\n * Load and validate configuration from a file path\n */\nexport function loadConfigFromFile(filePath: string): ResolvedCoreAIConfig {\n let content: string;\n\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown read error';\n throw new ConfigError(\n `Failed to read config file ${filePath}: ${message}`,\n 'READ_ERROR',\n error\n );\n }\n\n const parsed = parseConfig(content, filePath);\n const validated = validateConfig(parsed);\n return applyDefaults(validated);\n}\n\n/**\n * Load configuration by searching for config file\n */\nexport function loadConfig(startDir?: string): ResolvedCoreAIConfig {\n const configPath = findConfigFile(startDir);\n\n if (!configPath) {\n throw new ConfigError(\n `Configuration file not found. Create a ${CONFIG_FILE_NAME} file or run 'coreai init'.`,\n 'NOT_FOUND'\n );\n }\n\n return loadConfigFromFile(configPath);\n}\n\n/**\n * Check if a config file exists in the given directory or parent directories\n */\nexport function configExists(startDir?: string): boolean {\n return findConfigFile(startDir) !== null;\n}\n\n/**\n * Get the path to the config file, or null if not found\n */\nexport function getConfigPath(startDir?: string): string | null {\n return findConfigFile(startDir);\n}\n","/**\n * CoreAI Agent Types\n *\n * TypeScript types corresponding to the JSON schema at schemas/agent.schema.json\n */\n\nexport type AgentType = 'ic-engineer' | 'manager' | 'specialist' | 'coordinator';\n\nexport type WorkflowType =\n | 'ticket-implementation'\n | 'bug-investigation'\n | 'code-review'\n | 'planning-estimation';\n\nexport interface AgentExpertise {\n primary?: string[];\n tech_stack?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentPrinciples {\n code_quality?: string[];\n testing?: string[];\n security?: string[];\n performance?: string[];\n [key: string]: string[] | undefined;\n}\n\nexport interface AgentBehaviors {\n workflow?: WorkflowType;\n quality_gates?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentContextSources {\n shared?: string[];\n personal?: string[];\n}\n\nexport interface AgentCommunication {\n inbox?: string;\n outbox?: string;\n}\n\n/**\n * Default Claude Code tools available to agents\n */\nexport const DEFAULT_AGENT_TOOLS = ['Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep'] as const;\n\n/**\n * Raw agent definition as loaded from YAML (before variable resolution)\n */\nexport interface AgentDefinition {\n role: string;\n type: AgentType;\n display_name: string;\n description: string;\n responsibilities?: string[];\n expertise?: AgentExpertise;\n skills?: string[];\n principles?: AgentPrinciples;\n behaviors?: AgentBehaviors;\n context_sources?: AgentContextSources;\n communication?: AgentCommunication;\n /**\n * Claude Code tools available to this agent.\n * If not specified, defaults to: Read, Write, Edit, Bash, Glob, Grep\n */\n tools?: string[];\n}\n\n/**\n * Agent definition after variable resolution\n */\nexport interface ResolvedAgentDefinition extends AgentDefinition {\n // After resolution, these fields may have expanded values\n expertise?: AgentExpertise & {\n tech_stack?: Record<string, unknown>;\n };\n behaviors?: AgentBehaviors & {\n quality_gates?: Record<string, unknown>;\n };\n}\n\n/**\n * Agent source location\n */\nexport type AgentSource = 'core' | 'custom' | 'override';\n\n/**\n * Agent metadata including source information\n */\nexport interface AgentMetadata {\n definition: AgentDefinition;\n source: AgentSource;\n filePath: string;\n}\n","/**\n * Agent Loader\n *\n * Handles loading and validating agent YAML definitions.\n */\n\nimport { existsSync, readdirSync, readFileSync } from 'fs';\nimport { basename, extname, join } from 'path';\nimport { parse as parseYaml } from 'yaml';\nimport Ajv, { type ErrorObject } from 'ajv';\nimport type { AgentDefinition, AgentMetadata, AgentSource } from './types.js';\n\n// Import schema as JSON\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst agentSchema = require('../../schemas/agent.schema.json') as object;\n\nexport class AgentError extends Error {\n constructor(\n message: string,\n public readonly code: AgentErrorCode,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'AgentError';\n }\n}\n\nexport type AgentErrorCode = 'NOT_FOUND' | 'PARSE_ERROR' | 'VALIDATION_ERROR' | 'READ_ERROR';\n\n/**\n * Parse YAML content into an agent definition\n */\nexport function parseAgentYaml(content: string, filePath?: string): unknown {\n try {\n return parseYaml(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown parse error';\n throw new AgentError(\n `Failed to parse agent YAML${filePath ? ` in ${filePath}` : ''}: ${message}`,\n 'PARSE_ERROR',\n error\n );\n }\n}\n\n/**\n * Validate parsed YAML against agent schema\n */\nexport function validateAgentDefinition(agent: unknown): AgentDefinition {\n const ajv = new Ajv.default({ allErrors: true, strict: false });\n const validate = ajv.compile<AgentDefinition>(agentSchema);\n const valid = validate(agent);\n\n if (!valid) {\n const errors: ErrorObject[] = validate.errors ?? [];\n const errorMessages = errors.map((err: ErrorObject) => {\n const path = err.instancePath || 'root';\n return `${path}: ${err.message ?? 'unknown error'}`;\n });\n\n throw new AgentError(\n `Agent validation failed:\\n - ${errorMessages.join('\\n - ')}`,\n 'VALIDATION_ERROR',\n errors\n );\n }\n\n return agent as AgentDefinition;\n}\n\n/**\n * Load and validate an agent definition from a file\n */\nexport function loadAgentFromFile(filePath: string): AgentDefinition {\n if (!existsSync(filePath)) {\n throw new AgentError(`Agent file not found: ${filePath}`, 'NOT_FOUND');\n }\n\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown read error';\n throw new AgentError(`Failed to read agent file ${filePath}: ${message}`, 'READ_ERROR', error);\n }\n\n const parsed = parseAgentYaml(content, filePath);\n return validateAgentDefinition(parsed);\n}\n\n/**\n * List all YAML files in a directory\n */\nfunction listYamlFiles(dir: string): string[] {\n if (!existsSync(dir)) {\n return [];\n }\n\n return readdirSync(dir)\n .filter((file) => {\n const ext = extname(file).toLowerCase();\n return ext === '.yaml' || ext === '.yml';\n })\n .map((file) => join(dir, file));\n}\n\n/**\n * Load all agents from a directory\n */\nexport function loadAgentsFromDirectory(\n dir: string,\n source: AgentSource\n): Map<string, AgentMetadata> {\n const agents = new Map<string, AgentMetadata>();\n const files = listYamlFiles(dir);\n\n for (const filePath of files) {\n try {\n const definition = loadAgentFromFile(filePath);\n agents.set(definition.role, {\n definition,\n source,\n filePath,\n });\n } catch (error) {\n // Log warning but continue loading other agents\n const fileName = basename(filePath);\n console.warn(`Warning: Failed to load agent from ${fileName}: ${(error as Error).message}`);\n }\n }\n\n return agents;\n}\n\n/**\n * Get the agent role name from a filename\n */\nexport function getRoleFromFilename(filePath: string): string {\n const fileName = basename(filePath);\n const ext = extname(fileName);\n return fileName.slice(0, -ext.length);\n}\n","/**\n * Variable Resolution System\n *\n * Resolves variable placeholders in agent definitions.\n * Supports: ${config.*}, ${agent.*}, ${remote.*}\n */\n\nimport type { CoreAIConfig } from '../config/types.js';\nimport type { AgentDefinition } from './types.js';\n\n/**\n * Context for variable resolution\n */\nexport interface ResolutionContext {\n config?: CoreAIConfig;\n agent?: AgentDefinition;\n}\n\n/**\n * Options for variable resolution\n */\nexport interface ResolutionOptions {\n /**\n * If true, throw an error for unresolved variables.\n * If false, leave unresolved variables as-is.\n * Default: false\n */\n strict?: boolean;\n}\n\n/**\n * Error thrown when variable resolution fails\n */\nexport class ResolutionError extends Error {\n constructor(\n message: string,\n public readonly variable: string,\n public readonly path?: string\n ) {\n super(message);\n this.name = 'ResolutionError';\n }\n}\n\n/**\n * Pattern to match variable placeholders: ${namespace.path.to.value}\n */\nconst VARIABLE_PATTERN = /\\$\\{([a-z_][a-z0-9_]*(?:\\.[a-z_][a-z0-9_]*)*)\\}/gi;\n\n/**\n * Get a nested value from an object using dot notation\n */\nfunction getNestedValue(obj: unknown, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n if (typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n/**\n * Resolve a single variable reference\n */\nfunction resolveVariable(\n variable: string,\n context: ResolutionContext,\n options: ResolutionOptions\n): string | undefined {\n const parts = variable.split('.');\n const namespace = parts[0];\n const path = parts.slice(1).join('.');\n\n let value: unknown;\n\n switch (namespace) {\n case 'config':\n if (!context.config) {\n if (options.strict) {\n throw new ResolutionError(\n `Cannot resolve \\${${variable}}: no config context provided`,\n variable\n );\n }\n return undefined;\n }\n value = getNestedValue(context.config, path);\n break;\n\n case 'agent':\n if (!context.agent) {\n if (options.strict) {\n throw new ResolutionError(\n `Cannot resolve \\${${variable}}: no agent context provided`,\n variable\n );\n }\n return undefined;\n }\n value = getNestedValue(context.agent, path);\n break;\n\n case 'remote':\n // Remote is a shortcut for integration URLs\n value = resolveRemoteVariable(path, context, options);\n break;\n\n default:\n if (options.strict) {\n throw new ResolutionError(`Unknown variable namespace: ${namespace}`, variable);\n }\n return undefined;\n }\n\n if (value === undefined) {\n if (options.strict) {\n throw new ResolutionError(`Cannot resolve \\${${variable}}: path not found`, variable, path);\n }\n return undefined;\n }\n\n // Convert value to string representation\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n // For objects/arrays, return JSON representation\n return JSON.stringify(value);\n}\n\n/**\n * Resolve remote.* variables (shortcuts to integration URLs)\n */\nfunction resolveRemoteVariable(\n path: string,\n context: ResolutionContext,\n options: ResolutionOptions\n): string | undefined {\n if (!context.config?.integrations) {\n if (options.strict) {\n throw new ResolutionError(\n `Cannot resolve \\${remote.${path}}: no integrations configured`,\n `remote.${path}`\n );\n }\n return undefined;\n }\n\n const integrations = context.config.integrations;\n\n // Map remote shortcuts to integration paths\n switch (path) {\n case 'documentation':\n return (\n integrations.documentation?.config?.base_url ??\n integrations.documentation?.config?.base_path\n );\n\n case 'issues':\n return integrations.issue_tracker?.config?.base_url;\n\n case 'git':\n return integrations.git?.config?.repo;\n\n case 'state':\n return integrations.state?.config?.base_path ?? integrations.state?.config?.bucket;\n\n default:\n // Try to resolve as nested path under integrations\n return getNestedValue(integrations, path) as string | undefined;\n }\n}\n\n/**\n * Resolve all variables in a string\n */\nexport function resolveString(\n input: string,\n context: ResolutionContext,\n options: ResolutionOptions = {}\n): string {\n return input.replace(VARIABLE_PATTERN, (match, variable: string) => {\n const resolved = resolveVariable(variable, context, options);\n return resolved !== undefined ? resolved : match;\n });\n}\n\n/**\n * Check if a string contains variable placeholders\n */\nexport function hasVariables(input: string): boolean {\n // Create new regex to avoid state issues with global flag\n const pattern = /\\$\\{([a-z_][a-z0-9_]*(?:\\.[a-z_][a-z0-9_]*)*)\\}/i;\n return pattern.test(input);\n}\n\n/**\n * Extract all variable references from a string\n */\nexport function extractVariables(input: string): string[] {\n const matches = input.matchAll(VARIABLE_PATTERN);\n return Array.from(matches, (m) => m[1]).filter((v): v is string => v !== undefined);\n}\n\n/**\n * Recursively resolve all variables in an object\n */\nexport function resolveObject<T>(\n obj: T,\n context: ResolutionContext,\n options: ResolutionOptions = {}\n): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n return resolveString(obj, context, options) as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveObject(item, context, options)) as T;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = resolveObject(value, context, options);\n }\n return result as T;\n }\n\n return obj;\n}\n\n/**\n * Resolve all variables in an agent definition\n */\nexport function resolveAgentDefinition(\n agent: AgentDefinition,\n config?: CoreAIConfig,\n options: ResolutionOptions = {}\n): AgentDefinition {\n const context: ResolutionContext = {\n agent,\n };\n if (config) {\n context.config = config;\n }\n\n return resolveObject(agent, context, options);\n}\n","/**\n * Agent Compiler\n *\n * Transforms YAML agent definitions into Claude-compatible Markdown files.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport type { CoreAIConfig } from '../config/types.js';\nimport type { AgentDefinition, AgentMetadata, AgentSource } from './types.js';\nimport { DEFAULT_AGENT_TOOLS } from './types.js';\nimport { loadAgentsFromDirectory } from './loader.js';\nimport { resolveAgentDefinition } from './resolver.js';\n\n/**\n * Options for compiling agents\n */\nexport interface CompileOptions {\n /**\n * Output directory for compiled markdown files.\n * Default: .claude/agents\n */\n outputDir?: string;\n\n /**\n * Core agents directory (built-in agents).\n * Default: uses package's agents/ directory\n */\n coreAgentsDir?: string;\n\n /**\n * Custom agents directory (project-specific agents).\n * Default: coreai/agents in project root\n */\n customAgentsDir?: string;\n\n /**\n * Project root directory.\n * Default: process.cwd()\n */\n projectRoot?: string;\n\n /**\n * Filter function to select which agents to compile.\n * Returns true to include the agent, false to exclude.\n */\n filter?: (agent: AgentDefinition) => boolean;\n\n /**\n * MCP server names to include as tools.\n * These will be added to the agent's tools as mcp__<server-name>.\n * Example: ['github', 'postgres'] -> 'mcp__github, mcp__postgres'\n */\n mcpServers?: string[];\n}\n\n/**\n * Result of compiling agents\n */\nexport interface CompileResult {\n /**\n * Successfully compiled agents\n */\n compiled: {\n role: string;\n source: AgentSource;\n outputPath: string;\n }[];\n\n /**\n * Agents that failed to compile\n */\n errors: {\n role: string;\n source: AgentSource;\n error: string;\n }[];\n}\n\n/**\n * Build the tools string for agent frontmatter\n *\n * @param agent - Agent definition (may have custom tools)\n * @param mcpServers - Optional MCP server names to include\n * @returns Comma-separated list of tools\n */\nexport function buildAgentTools(agent: AgentDefinition, mcpServers?: string[]): string {\n // Start with agent-specific tools or defaults\n const tools: string[] = agent.tools\n ? [...agent.tools]\n : [...DEFAULT_AGENT_TOOLS];\n\n // Add MCP tools if servers are specified\n if (mcpServers && mcpServers.length > 0) {\n for (const server of mcpServers) {\n tools.push(`mcp__${server}`);\n }\n }\n\n return tools.join(', ');\n}\n\n/**\n * Generate markdown content from a resolved agent definition\n *\n * The output includes YAML frontmatter required by Claude Code for subagent detection.\n * See: https://code.claude.com/docs/en/sub-agents\n *\n * @param agent - Resolved agent definition\n * @param mcpServers - Optional MCP server names to include as tools\n */\nexport function generateAgentMarkdown(agent: AgentDefinition, mcpServers?: string[]): string {\n const lines: string[] = [];\n\n // Build tools string\n const tools = buildAgentTools(agent, mcpServers);\n\n // YAML frontmatter (required by Claude Code for subagent detection)\n lines.push('---');\n lines.push(`name: ${agent.role}`);\n // Flatten description to single line for YAML frontmatter\n lines.push(`description: ${agent.description.replace(/\\n/g, ' ').trim()}`);\n lines.push(`tools: ${tools}`);\n lines.push('---');\n lines.push('');\n\n // Header\n lines.push(`# ${agent.display_name}`);\n lines.push('');\n lines.push(`**Role:** ${agent.role}`);\n lines.push(`**Type:** ${agent.type}`);\n lines.push('');\n\n // Description\n lines.push('## Description');\n lines.push('');\n lines.push(agent.description.trim());\n lines.push('');\n\n // Responsibilities\n if (agent.responsibilities && agent.responsibilities.length > 0) {\n lines.push('## Responsibilities');\n lines.push('');\n for (const responsibility of agent.responsibilities) {\n lines.push(`- ${responsibility}`);\n }\n lines.push('');\n }\n\n // Expertise\n if (agent.expertise) {\n lines.push('## Expertise');\n lines.push('');\n\n if (agent.expertise.primary && agent.expertise.primary.length > 0) {\n lines.push('### Primary Areas');\n lines.push('');\n for (const area of agent.expertise.primary) {\n lines.push(`- ${area}`);\n }\n lines.push('');\n }\n\n if (agent.expertise.tech_stack) {\n lines.push('### Tech Stack');\n lines.push('');\n const techStack = agent.expertise.tech_stack;\n if (typeof techStack === 'string') {\n lines.push(techStack);\n } else if (typeof techStack === 'object') {\n lines.push('```json');\n lines.push(JSON.stringify(techStack, null, 2));\n lines.push('```');\n }\n lines.push('');\n }\n }\n\n // Skills\n if (agent.skills && agent.skills.length > 0) {\n lines.push('## Skills');\n lines.push('');\n for (const skill of agent.skills) {\n lines.push(`- ${skill}`);\n }\n lines.push('');\n }\n\n // Principles\n if (agent.principles) {\n lines.push('## Principles');\n lines.push('');\n\n for (const [category, items] of Object.entries(agent.principles)) {\n if (items && Array.isArray(items) && items.length > 0) {\n const title = formatTitle(category);\n lines.push(`### ${title}`);\n lines.push('');\n for (const item of items) {\n lines.push(`- ${item}`);\n }\n lines.push('');\n }\n }\n }\n\n // Behaviors\n if (agent.behaviors) {\n lines.push('## Behaviors');\n lines.push('');\n\n if (agent.behaviors.workflow) {\n lines.push(`**Workflow:** ${agent.behaviors.workflow}`);\n lines.push('');\n }\n\n if (agent.behaviors.quality_gates) {\n lines.push('### Quality Gates');\n lines.push('');\n const gates = agent.behaviors.quality_gates;\n if (typeof gates === 'string') {\n lines.push(gates);\n } else if (typeof gates === 'object') {\n lines.push('```json');\n lines.push(JSON.stringify(gates, null, 2));\n lines.push('```');\n }\n lines.push('');\n }\n }\n\n // Context Sources\n if (agent.context_sources) {\n lines.push('## Context Sources');\n lines.push('');\n\n if (agent.context_sources.shared && agent.context_sources.shared.length > 0) {\n lines.push('### Shared');\n lines.push('');\n for (const source of agent.context_sources.shared) {\n lines.push(`- ${source}`);\n }\n lines.push('');\n }\n\n if (agent.context_sources.personal && agent.context_sources.personal.length > 0) {\n lines.push('### Personal');\n lines.push('');\n for (const source of agent.context_sources.personal) {\n lines.push(`- ${source}`);\n }\n lines.push('');\n }\n }\n\n // Communication\n if (agent.communication) {\n lines.push('## Communication');\n lines.push('');\n if (agent.communication.inbox) {\n lines.push(`**Inbox:** ${agent.communication.inbox}`);\n }\n if (agent.communication.outbox) {\n lines.push(`**Outbox:** ${agent.communication.outbox}`);\n }\n lines.push('');\n }\n\n // Footer\n lines.push('---');\n lines.push('');\n lines.push('*Generated by CoreAI*');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Format a snake_case or kebab-case string as a title\n */\nfunction formatTitle(str: string): string {\n return str.replace(/[_-]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Compile a single agent to markdown\n *\n * @param agent - Agent definition to compile\n * @param config - Optional CoreAI config for variable resolution\n * @param mcpServers - Optional MCP server names to include as tools\n */\nexport function compileAgent(\n agent: AgentDefinition,\n config?: CoreAIConfig,\n mcpServers?: string[]\n): string {\n const resolved = resolveAgentDefinition(agent, config);\n return generateAgentMarkdown(resolved, mcpServers);\n}\n\n/**\n * Load all agents from core and custom directories\n */\nexport function loadAllAgents(options: CompileOptions = {}): Map<string, AgentMetadata> {\n const agents = new Map<string, AgentMetadata>();\n\n // Load core agents\n if (options.coreAgentsDir && existsSync(options.coreAgentsDir)) {\n const coreAgents = loadAgentsFromDirectory(options.coreAgentsDir, 'core');\n for (const [role, metadata] of coreAgents) {\n agents.set(role, metadata);\n }\n }\n\n // Load custom agents (can override core agents)\n if (options.customAgentsDir && existsSync(options.customAgentsDir)) {\n const customAgents = loadAgentsFromDirectory(options.customAgentsDir, 'custom');\n for (const [role, metadata] of customAgents) {\n // Check if this is overriding a core agent\n if (agents.has(role)) {\n metadata.source = 'override';\n }\n agents.set(role, metadata);\n }\n }\n\n return agents;\n}\n\n/**\n * Filter agents based on team configuration\n */\nexport function filterAgentsByTeam(\n agents: Map<string, AgentMetadata>,\n config?: CoreAIConfig\n): Map<string, AgentMetadata> {\n if (!config?.team?.agents || config.team.agents.length === 0) {\n // No team filter, return all agents\n return agents;\n }\n\n const filtered = new Map<string, AgentMetadata>();\n for (const role of config.team.agents) {\n const metadata = agents.get(role);\n if (metadata) {\n filtered.set(role, metadata);\n }\n }\n\n return filtered;\n}\n\n/**\n * Compile all agents and write to output directory\n */\nexport function compileAgents(config?: CoreAIConfig, options: CompileOptions = {}): CompileResult {\n const projectRoot = options.projectRoot ?? process.cwd();\n const outputDir = options.outputDir ?? join(projectRoot, '.claude', 'agents');\n const customAgentsDir = options.customAgentsDir ?? join(projectRoot, 'coreai', 'agents');\n\n const result: CompileResult = {\n compiled: [],\n errors: [],\n };\n\n // Load all agents\n const allAgents = loadAllAgents({\n ...options,\n customAgentsDir,\n });\n\n // Filter by team if configured\n const agents = filterAgentsByTeam(allAgents, config);\n\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Compile each agent\n for (const [role, metadata] of agents) {\n // Apply custom filter if provided\n if (options.filter && !options.filter(metadata.definition)) {\n continue;\n }\n\n try {\n const markdown = compileAgent(metadata.definition, config, options.mcpServers);\n const outputPath = join(outputDir, `${role}.md`);\n\n writeFileSync(outputPath, markdown, 'utf-8');\n\n result.compiled.push({\n role,\n source: metadata.source,\n outputPath,\n });\n } catch (error) {\n result.errors.push({\n role,\n source: metadata.source,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n\n/**\n * Get the default core agents directory\n */\nexport function getCoreAgentsDir(): string {\n // Navigate from dist/agents/compiler.js to agents/\n return join(dirname(dirname(dirname(import.meta.url.replace('file://', '')))), 'agents');\n}\n","/**\n * Adapter Types\n *\n * Common types used across all adapters.\n */\n\n/**\n * The type of adapter\n */\nexport type AdapterType = 'issue_tracker' | 'git' | 'documentation' | 'state';\n\n/**\n * How the adapter connects to the service\n */\nexport type AdapterImplementation = 'mcp' | 'native' | 'mock';\n\n/**\n * Base metadata for all adapters\n */\nexport interface AdapterInfo {\n /**\n * Type of adapter\n */\n type: AdapterType;\n\n /**\n * Provider name (e.g., 'github', 'jira', 'confluence')\n */\n provider: string;\n\n /**\n * How this adapter is implemented\n */\n implementation: AdapterImplementation;\n\n /**\n * Whether the adapter is currently connected/available\n */\n connected: boolean;\n}\n\n/**\n * Common issue status values\n */\nexport type IssueStatus =\n | 'backlog'\n | 'todo'\n | 'in_progress'\n | 'in_review'\n | 'done'\n | 'closed'\n | string;\n\n/**\n * Common pull request status values\n */\nexport type PullRequestStatus = 'open' | 'merged' | 'closed' | 'draft';\n\n/**\n * Common review decision values\n */\nexport type ReviewDecision = 'approve' | 'request_changes' | 'comment';\n\n/**\n * Issue data structure\n */\nexport interface Issue {\n id: string;\n key: string;\n title: string;\n description?: string;\n status: IssueStatus;\n assignee?: string;\n reporter?: string;\n labels?: string[];\n priority?: string;\n created_at?: string;\n updated_at?: string;\n url?: string;\n}\n\n/**\n * Data for creating an issue\n */\nexport interface CreateIssueData {\n title: string;\n description?: string;\n assignee?: string;\n labels?: string[];\n priority?: string;\n type?: string;\n}\n\n/**\n * Data for updating an issue\n */\nexport interface UpdateIssueData {\n title?: string;\n description?: string;\n assignee?: string;\n labels?: string[];\n priority?: string;\n status?: IssueStatus;\n}\n\n/**\n * Query parameters for listing issues\n */\nexport interface IssueQuery {\n assignee?: string;\n status?: IssueStatus | IssueStatus[];\n labels?: string[];\n limit?: number;\n offset?: number;\n}\n\n/**\n * Pull request data structure\n */\nexport interface PullRequest {\n id: string;\n number: number;\n title: string;\n description?: string;\n status: PullRequestStatus;\n author?: string;\n source_branch: string;\n target_branch: string;\n created_at?: string;\n updated_at?: string;\n merged_at?: string;\n url?: string;\n reviewers?: string[];\n}\n\n/**\n * Data for creating a pull request\n */\nexport interface CreatePullRequestData {\n title: string;\n description?: string;\n source_branch: string;\n target_branch: string;\n draft?: boolean;\n reviewers?: string[];\n}\n\n/**\n * Query parameters for listing pull requests\n */\nexport interface PullRequestQuery {\n status?: PullRequestStatus | PullRequestStatus[];\n author?: string;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Review data for a pull request\n */\nexport interface Review {\n id: string;\n pull_request_id: string;\n author: string;\n decision: ReviewDecision;\n body?: string;\n created_at?: string;\n}\n\n/**\n * Data for creating a review\n */\nexport interface CreateReviewData {\n decision: ReviewDecision;\n body?: string;\n comments?: ReviewComment[];\n}\n\n/**\n * Comment on a specific line in a review\n */\nexport interface ReviewComment {\n path: string;\n line: number;\n body: string;\n}\n\n/**\n * Documentation page data structure\n */\nexport interface DocumentationPage {\n id: string;\n title: string;\n content?: string;\n path?: string;\n url?: string;\n parent_id?: string;\n created_at?: string;\n updated_at?: string;\n}\n\n/**\n * Query parameters for searching documentation\n */\nexport interface DocumentationQuery {\n query: string;\n space?: string;\n limit?: number;\n}\n\n/**\n * File/directory entry for state provider\n */\nexport interface StateEntry {\n path: string;\n name: string;\n type: 'file' | 'directory';\n size?: number;\n modified_at?: string;\n}\n\n/**\n * Options for state operations\n */\nexport interface StateOptions {\n /**\n * Create parent directories if they don't exist\n */\n recursive?: boolean;\n\n /**\n * Encoding for text content\n */\n encoding?: BufferEncoding;\n}\n\n/**\n * Adapter error with context\n */\nexport class AdapterError extends Error {\n public readonly code: AdapterErrorCode;\n public readonly adapter?: AdapterInfo;\n\n constructor(message: string, code: AdapterErrorCode, adapter?: AdapterInfo, cause?: Error) {\n super(message, { cause });\n this.name = 'AdapterError';\n this.code = code;\n if (adapter) {\n this.adapter = adapter;\n }\n }\n}\n\n/**\n * Error codes for adapter operations\n */\nexport type AdapterErrorCode =\n | 'not_found'\n | 'unauthorized'\n | 'forbidden'\n | 'rate_limited'\n | 'network_error'\n | 'invalid_request'\n | 'not_implemented'\n | 'connection_failed'\n | 'provider_error'\n | 'operation_failed'\n | 'invalid_operation'\n | 'not_connected'\n | 'invalid_config';\n","/**\n * Adapter Factory\n *\n * Creates and manages adapter instances based on configuration.\n */\n\nimport type { CoreAIConfig, AdapterStrategy } from '../config/types.js';\nimport type { AdapterType, AdapterInfo, AdapterImplementation } from './types.js';\nimport { AdapterError } from './types.js';\nimport type {\n IssueTrackerAdapter,\n GitProviderAdapter,\n DocumentationProviderAdapter,\n StateProviderAdapter,\n Adapter,\n} from './interfaces.js';\n\n/**\n * Options for creating an adapter\n */\nexport interface AdapterFactoryOptions {\n /**\n * Override the strategy from config\n */\n strategy?: AdapterStrategy;\n\n /**\n * Force a specific implementation\n */\n implementation?: AdapterImplementation;\n}\n\n/**\n * Registry of adapter creators\n */\ninterface AdapterCreator<T extends Adapter> {\n mcp?: (config: CoreAIConfig) => Promise<T>;\n native?: (config: CoreAIConfig) => Promise<T>;\n mock?: (config: CoreAIConfig) => Promise<T>;\n}\n\n/**\n * Adapter Factory\n *\n * Creates adapter instances based on configuration and available implementations.\n */\nexport class AdapterFactory {\n private config: CoreAIConfig;\n private adapters = new Map<AdapterType, Adapter>();\n\n /**\n * Registry of adapter creators by type\n */\n private creators: {\n issue_tracker: AdapterCreator<IssueTrackerAdapter>;\n git: AdapterCreator<GitProviderAdapter>;\n documentation: AdapterCreator<DocumentationProviderAdapter>;\n state: AdapterCreator<StateProviderAdapter>;\n } = {\n issue_tracker: {},\n git: {},\n documentation: {},\n state: {},\n };\n\n constructor(config: CoreAIConfig) {\n this.config = config;\n }\n\n /**\n * Register an adapter creator\n */\n registerCreator<T extends AdapterType>(\n type: T,\n implementation: AdapterImplementation,\n creator: (config: CoreAIConfig) => Promise<Adapter>\n ): void {\n const typeCreators = this.creators[type] as AdapterCreator<Adapter>;\n typeCreators[implementation] = creator;\n }\n\n /**\n * Get an issue tracker adapter\n */\n async getIssueTracker(options?: AdapterFactoryOptions): Promise<IssueTrackerAdapter> {\n return this.getAdapter('issue_tracker', options) as Promise<IssueTrackerAdapter>;\n }\n\n /**\n * Get a git provider adapter\n */\n async getGitProvider(options?: AdapterFactoryOptions): Promise<GitProviderAdapter> {\n return this.getAdapter('git', options) as Promise<GitProviderAdapter>;\n }\n\n /**\n * Get a documentation provider adapter\n */\n async getDocumentationProvider(\n options?: AdapterFactoryOptions\n ): Promise<DocumentationProviderAdapter> {\n return this.getAdapter('documentation', options) as Promise<DocumentationProviderAdapter>;\n }\n\n /**\n * Get a state provider adapter\n */\n async getStateProvider(options?: AdapterFactoryOptions): Promise<StateProviderAdapter> {\n return this.getAdapter('state', options) as Promise<StateProviderAdapter>;\n }\n\n /**\n * Get an adapter by type\n */\n async getAdapter(type: AdapterType, options?: AdapterFactoryOptions): Promise<Adapter> {\n // Check if we already have this adapter cached\n const cached = this.adapters.get(type);\n if (cached && cached.isConnected()) {\n return cached;\n }\n\n // Determine the strategy\n const strategy = this.getStrategy(type, options);\n\n // Get the implementation to use\n const implementation = options?.implementation ?? this.selectImplementation(type, strategy);\n\n // Create the adapter\n const adapter = await this.createAdapter(type, implementation);\n\n // Cache it\n this.adapters.set(type, adapter);\n\n return adapter;\n }\n\n /**\n * Check if an adapter type is configured\n */\n hasIntegration(type: AdapterType): boolean {\n const integrations = this.config.integrations;\n if (!integrations) return false;\n\n switch (type) {\n case 'issue_tracker':\n return !!integrations.issue_tracker?.provider;\n case 'git':\n return !!integrations.git?.provider;\n case 'documentation':\n return !!integrations.documentation?.provider;\n case 'state':\n return !!integrations.state?.provider;\n default:\n return false;\n }\n }\n\n /**\n * Get information about a configured integration\n */\n getIntegrationInfo(type: AdapterType): { provider: string; strategy: AdapterStrategy } | null {\n const integrations = this.config.integrations;\n if (!integrations) return null;\n\n let integration;\n switch (type) {\n case 'issue_tracker':\n integration = integrations.issue_tracker;\n break;\n case 'git':\n integration = integrations.git;\n break;\n case 'documentation':\n integration = integrations.documentation;\n break;\n case 'state':\n integration = integrations.state;\n break;\n }\n\n if (!integration?.provider) return null;\n\n return {\n provider: integration.provider,\n strategy: integration.strategy ?? 'auto',\n };\n }\n\n /**\n * Disconnect and clear all cached adapters\n */\n async disconnectAll(): Promise<void> {\n const disconnects: Promise<void>[] = [];\n\n for (const adapter of this.adapters.values()) {\n if (adapter.isConnected()) {\n disconnects.push(adapter.disconnect());\n }\n }\n\n await Promise.all(disconnects);\n this.adapters.clear();\n }\n\n /**\n * Get the strategy for an adapter type\n */\n private getStrategy(type: AdapterType, options?: AdapterFactoryOptions): AdapterStrategy {\n if (options?.strategy) {\n return options.strategy;\n }\n\n const info = this.getIntegrationInfo(type);\n return info?.strategy ?? 'auto';\n }\n\n /**\n * Select the implementation based on strategy and availability\n */\n private selectImplementation(\n type: AdapterType,\n strategy: AdapterStrategy\n ): AdapterImplementation {\n const creators = this.creators[type];\n\n switch (strategy) {\n case 'mcp':\n if (creators.mcp) return 'mcp';\n throw new AdapterError(\n `MCP adapter not available for ${type}`,\n 'not_implemented',\n undefined\n );\n\n case 'native':\n if (creators.native) return 'native';\n throw new AdapterError(\n `Native adapter not available for ${type}`,\n 'not_implemented',\n undefined\n );\n\n case 'auto':\n default:\n // Prefer MCP, fall back to native\n if (creators.mcp) return 'mcp';\n if (creators.native) return 'native';\n if (creators.mock) return 'mock';\n\n throw new AdapterError(\n `No adapter implementation available for ${type}`,\n 'not_implemented',\n undefined\n );\n }\n }\n\n /**\n * Create an adapter instance\n */\n private async createAdapter(\n type: AdapterType,\n implementation: AdapterImplementation\n ): Promise<Adapter> {\n const creators = this.creators[type];\n const creator = creators[implementation];\n\n if (!creator) {\n throw new AdapterError(\n `No ${implementation} adapter creator registered for ${type}`,\n 'not_implemented',\n undefined\n );\n }\n\n const adapter = await creator(this.config);\n await adapter.connect();\n\n return adapter;\n }\n}\n\n/**\n * Create an adapter factory from configuration\n */\nexport function createAdapterFactory(config: CoreAIConfig): AdapterFactory {\n return new AdapterFactory(config);\n}\n\n/**\n * Create adapter info helper\n */\nexport function createAdapterInfo(\n type: AdapterType,\n provider: string,\n implementation: AdapterImplementation,\n connected = false\n): AdapterInfo {\n return {\n type,\n provider,\n implementation,\n connected,\n };\n}\n","/**\n * MCP Client Wrapper\n *\n * Provides a simplified interface for connecting to and communicating with MCP servers.\n */\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type {\n McpServerConfig,\n McpServerInfo,\n McpTool,\n McpResource,\n McpToolResult,\n McpCapabilities,\n McpContent,\n StdioServerConfig,\n} from './types.js';\nimport { McpError } from './types.js';\n\n/**\n * Options for creating an MCP client\n */\nexport interface McpClientOptions {\n /**\n * Client name to report to servers\n */\n clientName?: string;\n\n /**\n * Client version to report to servers\n */\n clientVersion?: string;\n\n /**\n * Timeout for operations in milliseconds\n */\n timeout?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<McpClientOptions> = {\n clientName: 'coreai',\n clientVersion: '0.1.0',\n timeout: 30000,\n};\n\n/**\n * MCP Client Wrapper\n *\n * Manages a connection to a single MCP server and provides\n * a simplified API for tool calls, resource access, etc.\n */\nexport class McpClient {\n private client: Client | null = null;\n private transport: Transport | null = null;\n private _serverInfo: McpServerInfo | null = null;\n private options: Required<McpClientOptions>;\n private serverName: string;\n private config: McpServerConfig;\n\n constructor(serverName: string, config: McpServerConfig, options?: McpClientOptions) {\n this.serverName = serverName;\n this.config = config;\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Connect to the MCP server\n */\n async connect(): Promise<void> {\n if (this.client && this.isConnected()) {\n return;\n }\n\n try {\n // Create the appropriate transport\n this.transport = await this.createTransport();\n\n // Create the MCP client\n this.client = new Client(\n {\n name: this.options.clientName,\n version: this.options.clientVersion,\n },\n {\n capabilities: {\n roots: { listChanged: true },\n },\n }\n );\n\n // Connect to the server\n await this.client.connect(this.transport);\n\n // Store server info\n const serverVersion = this.client.getServerVersion();\n const serverCapabilities = this.client.getServerCapabilities();\n\n const info: McpServerInfo = {\n name: this.serverName,\n connected: true,\n };\n\n if (serverVersion?.version) {\n info.version = serverVersion.version;\n }\n\n const caps = this.parseCapabilities(serverCapabilities);\n if (caps) {\n info.capabilities = caps;\n }\n\n const instructions = this.client.getInstructions();\n if (instructions) {\n info.instructions = instructions;\n }\n\n this._serverInfo = info;\n } catch (error) {\n throw new McpError(\n `Failed to connect to MCP server \"${this.serverName}\": ${error instanceof Error ? error.message : String(error)}`,\n 'connection_failed',\n this.serverName,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Disconnect from the MCP server\n */\n async disconnect(): Promise<void> {\n if (this.transport) {\n await this.transport.close();\n this.transport = null;\n }\n\n this.client = null;\n\n if (this._serverInfo) {\n this._serverInfo.connected = false;\n }\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this._serverInfo?.connected ?? false;\n }\n\n /**\n * Get server information\n */\n getServerInfo(): McpServerInfo | null {\n return this._serverInfo;\n }\n\n /**\n * List available tools from the server\n */\n async listTools(): Promise<McpTool[]> {\n const client = this.ensureConnected();\n\n const result = await client.listTools();\n\n return result.tools.map((tool) => {\n // Build inputSchema with only defined properties\n const inputSchema: McpTool['inputSchema'] = { type: 'object' };\n if (tool.inputSchema.properties) {\n inputSchema.properties = tool.inputSchema.properties as Record<string, unknown>;\n }\n if (tool.inputSchema.required) {\n inputSchema.required = tool.inputSchema.required;\n }\n\n const mapped: McpTool = {\n name: tool.name,\n inputSchema,\n };\n\n if (tool.description) {\n mapped.description = tool.description;\n }\n\n if (tool.annotations) {\n const annotations: McpTool['annotations'] = {};\n if (tool.annotations.title) annotations.title = tool.annotations.title;\n if (tool.annotations.readOnlyHint !== undefined)\n annotations.readOnlyHint = tool.annotations.readOnlyHint;\n if (tool.annotations.destructiveHint !== undefined)\n annotations.destructiveHint = tool.annotations.destructiveHint;\n if (tool.annotations.idempotentHint !== undefined)\n annotations.idempotentHint = tool.annotations.idempotentHint;\n if (Object.keys(annotations).length > 0) {\n mapped.annotations = annotations;\n }\n }\n\n return mapped;\n });\n }\n\n /**\n * Call a tool on the server\n */\n async callTool(name: string, args?: Record<string, unknown>): Promise<McpToolResult> {\n const client = this.ensureConnected();\n\n try {\n const result = await client.callTool({\n name,\n arguments: args,\n });\n\n // Handle the different result formats\n if ('content' in result && Array.isArray(result.content)) {\n const content: McpContent[] = [];\n\n for (const c of result.content) {\n if (typeof c === 'object' && c !== null && 'type' in c) {\n const item = c as { type: string; [key: string]: unknown };\n if (item.type === 'text' && typeof item.text === 'string') {\n content.push({ type: 'text', text: item.text });\n } else if (\n item.type === 'image' &&\n typeof item.data === 'string' &&\n typeof item.mimeType === 'string'\n ) {\n content.push({ type: 'image', data: item.data, mimeType: item.mimeType });\n } else if (item.type === 'resource' && typeof item.resource === 'object') {\n const res = item.resource as {\n uri: string;\n text?: string;\n blob?: string;\n mimeType?: string;\n };\n const resourceContent: {\n uri: string;\n text?: string;\n blob?: string;\n mimeType?: string;\n } = {\n uri: res.uri,\n };\n if (res.text) resourceContent.text = res.text;\n if (res.blob) resourceContent.blob = res.blob;\n if (res.mimeType) resourceContent.mimeType = res.mimeType;\n content.push({\n type: 'resource',\n resource: resourceContent,\n });\n } else {\n // Default to text for unknown types\n content.push({ type: 'text', text: JSON.stringify(c) });\n }\n }\n }\n\n const toolResult: McpToolResult = { content };\n\n if (typeof result.isError === 'boolean') {\n toolResult.isError = result.isError;\n }\n\n if (typeof result.structuredContent === 'object' && result.structuredContent !== null) {\n toolResult.structuredContent = result.structuredContent as Record<string, unknown>;\n }\n\n return toolResult;\n }\n\n // Handle legacy toolResult format\n if ('toolResult' in result) {\n return {\n content: [{ type: 'text', text: JSON.stringify(result.toolResult) }],\n };\n }\n\n return {\n content: [],\n };\n } catch (error) {\n throw new McpError(\n `Failed to call tool \"${name}\": ${error instanceof Error ? error.message : String(error)}`,\n 'protocol_error',\n this.serverName,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * List available resources from the server\n */\n async listResources(): Promise<McpResource[]> {\n const client = this.ensureConnected();\n\n const result = await client.listResources();\n\n return result.resources.map((resource) => {\n const mapped: McpResource = {\n uri: resource.uri,\n name: resource.name,\n };\n if (resource.description) {\n mapped.description = resource.description;\n }\n if (resource.mimeType) {\n mapped.mimeType = resource.mimeType;\n }\n return mapped;\n });\n }\n\n /**\n * Read a resource from the server\n */\n async readResource(uri: string): Promise<string> {\n const client = this.ensureConnected();\n\n const result = await client.readResource({ uri });\n\n // Return the first text content, or blob as base64\n for (const content of result.contents) {\n if ('text' in content) {\n return content.text;\n }\n if ('blob' in content) {\n return content.blob;\n }\n }\n\n return '';\n }\n\n /**\n * Create the appropriate transport for the server config\n */\n private async createTransport(): Promise<Transport> {\n if (this.config.transport === 'stdio') {\n return this.createStdioTransport(this.config);\n }\n\n // HTTP/SSE transports would be added here\n throw new McpError(\n `Unsupported transport type: ${this.config.transport}`,\n 'invalid_config',\n this.serverName\n );\n }\n\n /**\n * Create a stdio transport for local MCP servers\n */\n private createStdioTransport(config: StdioServerConfig): Transport {\n const params: {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n } = {\n command: config.command,\n };\n\n if (config.args) {\n params.args = config.args;\n }\n if (config.env) {\n params.env = config.env;\n }\n if (config.cwd) {\n params.cwd = config.cwd;\n }\n\n return new StdioClientTransport(params);\n }\n\n /**\n * Parse server capabilities into our format\n */\n private parseCapabilities(capabilities?: Record<string, unknown>): McpCapabilities | undefined {\n if (!capabilities) return undefined;\n\n return {\n tools: !!capabilities.tools,\n resources: !!capabilities.resources,\n prompts: !!capabilities.prompts,\n logging: !!capabilities.logging,\n };\n }\n\n /**\n * Ensure the client is connected and return the client instance\n */\n private ensureConnected(): Client {\n if (!this.client || !this.isConnected()) {\n throw new McpError(\n `Not connected to MCP server \"${this.serverName}\"`,\n 'connection_closed',\n this.serverName\n );\n }\n return this.client;\n }\n\n /**\n * Set server info (for mock/testing purposes)\n */\n protected setServerInfo(info: McpServerInfo): void {\n this._serverInfo = info;\n }\n}\n\n/**\n * Create a mock MCP client for testing\n */\nexport function createMockMcpClient(\n serverName: string,\n tools: McpTool[] = [],\n resources: McpResource[] = []\n): McpClient {\n // Create a client with in-memory transport for testing\n const client = new McpClient(serverName, { transport: 'stdio', command: 'mock' });\n\n // Store mock data\n const mockTools = tools;\n const mockResources = resources;\n\n // Override connect to set up mock state\n client.connect = async function (this: McpClient) {\n const info: McpServerInfo = {\n name: serverName,\n version: '1.0.0',\n connected: true,\n capabilities: { tools: true, resources: true },\n };\n (this as McpClient & { setServerInfo(info: McpServerInfo): void }).setServerInfo(info);\n };\n\n client.listTools = async function () {\n return mockTools;\n };\n\n client.listResources = async function () {\n return mockResources;\n };\n\n return client;\n}\n","/**\n * Native GitHub Adapter\n *\n * Implements GitProviderAdapter using the GitHub CLI (gh).\n * Requires the gh CLI to be installed and authenticated.\n */\n\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport type { GitProviderAdapter } from '../interfaces.js';\nimport type {\n AdapterInfo,\n PullRequest,\n PullRequestQuery,\n CreatePullRequestData,\n Review,\n CreateReviewData,\n PullRequestStatus,\n ReviewDecision,\n} from '../types.js';\nimport { AdapterError } from '../types.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Options for creating a GitHub adapter\n */\nexport interface GitHubAdapterOptions {\n /**\n * Repository in owner/repo format\n */\n repository: string;\n\n /**\n * Path to gh CLI (default: 'gh')\n */\n ghPath?: string;\n}\n\n/**\n * Native GitHub adapter using gh CLI\n */\nexport class GitHubAdapter implements GitProviderAdapter {\n private repository: string;\n private ghPath: string;\n private connected = false;\n private owner: string;\n private repo: string;\n\n constructor(options: GitHubAdapterOptions) {\n this.repository = options.repository;\n this.ghPath = options.ghPath ?? 'gh';\n\n const [owner, repo] = this.repository.split('/');\n if (!owner || !repo) {\n throw new AdapterError(\n `Invalid repository format: ${this.repository}. Expected owner/repo`,\n 'invalid_config',\n this.getInfo()\n );\n }\n this.owner = owner;\n this.repo = repo;\n }\n\n /**\n * Get adapter info\n */\n getInfo(): AdapterInfo {\n return {\n type: 'git',\n provider: 'github',\n implementation: 'native',\n connected: this.connected,\n };\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Connect (verify gh CLI is available and authenticated)\n */\n async connect(): Promise<void> {\n try {\n // Check gh is installed and authenticated\n await this.gh(['auth', 'status']);\n\n // Verify we can access the repository\n await this.gh(['repo', 'view', this.repository, '--json', 'name']);\n\n this.connected = true;\n } catch (error) {\n throw new AdapterError(\n `Failed to connect to GitHub: ${error instanceof Error ? error.message : String(error)}`,\n 'connection_failed',\n this.getInfo(),\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Disconnect\n */\n async disconnect(): Promise<void> {\n this.connected = false;\n }\n\n /**\n * Get a pull request by number\n */\n async getPullRequest(idOrNumber: string | number): Promise<PullRequest> {\n this.ensureConnected();\n\n try {\n const result = await this.gh([\n 'pr',\n 'view',\n String(idOrNumber),\n '-R',\n this.repository,\n '--json',\n 'number,title,body,state,author,headRefName,baseRefName,createdAt,updatedAt,mergedAt,url,reviewRequests',\n ]);\n\n const data = JSON.parse(result);\n return this.mapPullRequest(data);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n throw new AdapterError(\n `Pull request #${idOrNumber} not found`,\n 'not_found',\n this.getInfo()\n );\n }\n throw this.wrapError(error, `Failed to get pull request #${idOrNumber}`);\n }\n }\n\n /**\n * List pull requests\n */\n async listPullRequests(query?: PullRequestQuery): Promise<PullRequest[]> {\n this.ensureConnected();\n\n try {\n const args = [\n 'pr',\n 'list',\n '-R',\n this.repository,\n '--json',\n 'number,title,body,state,author,headRefName,baseRefName,createdAt,updatedAt,url',\n ];\n\n // Map status to gh CLI state\n if (query?.status) {\n const states = Array.isArray(query.status) ? query.status : [query.status];\n const ghStates = states\n .map((s) => this.mapStatusToGh(s))\n .filter((s): s is string => s !== undefined);\n if (ghStates.length > 0 && ghStates[0]) {\n args.push('--state', ghStates[0]);\n }\n }\n\n if (query?.author) {\n args.push('--author', query.author);\n }\n\n if (query?.limit) {\n args.push('--limit', String(query.limit));\n }\n\n const result = await this.gh(args);\n const data = JSON.parse(result) as unknown[];\n\n return data.map((pr) => this.mapPullRequest(pr as Record<string, unknown>));\n } catch (error) {\n throw this.wrapError(error, 'Failed to list pull requests');\n }\n }\n\n /**\n * Create a pull request\n */\n async createPullRequest(data: CreatePullRequestData): Promise<PullRequest> {\n this.ensureConnected();\n\n try {\n const args = [\n 'pr',\n 'create',\n '-R',\n this.repository,\n '--head',\n data.source_branch,\n '--base',\n data.target_branch,\n '--title',\n data.title,\n ];\n\n if (data.description) {\n args.push('--body', data.description);\n }\n\n if (data.draft) {\n args.push('--draft');\n }\n\n if (data.reviewers && data.reviewers.length > 0) {\n args.push('--reviewer', data.reviewers.join(','));\n }\n\n // Create and get the PR details\n const createResult = await this.gh(args);\n\n // Parse the URL from the output to get the PR number\n const urlMatch = createResult.match(/https:\\/\\/github\\.com\\/[^/]+\\/[^/]+\\/pull\\/(\\d+)/);\n if (urlMatch?.[1]) {\n return this.getPullRequest(parseInt(urlMatch[1], 10));\n }\n\n // Fallback: list to find the just-created PR\n const prs = await this.listPullRequests({ limit: 1 });\n const firstPr = prs[0];\n if (firstPr) {\n return firstPr;\n }\n\n throw new Error('Failed to retrieve created pull request');\n } catch (error) {\n throw this.wrapError(error, 'Failed to create pull request');\n }\n }\n\n /**\n * Update a pull request\n */\n async updatePullRequest(\n idOrNumber: string | number,\n data: Partial<CreatePullRequestData>\n ): Promise<PullRequest> {\n this.ensureConnected();\n\n try {\n const args = ['pr', 'edit', String(idOrNumber), '-R', this.repository];\n\n if (data.title) {\n args.push('--title', data.title);\n }\n\n if (data.description !== undefined) {\n args.push('--body', data.description);\n }\n\n if (data.target_branch) {\n args.push('--base', data.target_branch);\n }\n\n if (data.reviewers && data.reviewers.length > 0) {\n args.push('--add-reviewer', data.reviewers.join(','));\n }\n\n await this.gh(args);\n\n return this.getPullRequest(idOrNumber);\n } catch (error) {\n throw this.wrapError(error, `Failed to update pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Merge a pull request\n */\n async mergePullRequest(\n idOrNumber: string | number,\n options?: { method?: 'merge' | 'squash' | 'rebase'; message?: string }\n ): Promise<void> {\n this.ensureConnected();\n\n try {\n const args = ['pr', 'merge', String(idOrNumber), '-R', this.repository];\n\n const method = options?.method ?? 'merge';\n args.push(`--${method}`);\n\n if (options?.message) {\n args.push('--body', options.message);\n }\n\n // Auto-confirm the merge\n args.push('--delete-branch=false');\n\n await this.gh(args);\n } catch (error) {\n throw this.wrapError(error, `Failed to merge pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Close a pull request\n */\n async closePullRequest(idOrNumber: string | number): Promise<void> {\n this.ensureConnected();\n\n try {\n await this.gh(['pr', 'close', String(idOrNumber), '-R', this.repository]);\n } catch (error) {\n throw this.wrapError(error, `Failed to close pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Add a review to a pull request\n */\n async addReview(idOrNumber: string | number, review: CreateReviewData): Promise<Review> {\n this.ensureConnected();\n\n try {\n const args = ['pr', 'review', String(idOrNumber), '-R', this.repository];\n\n // Map decision to gh CLI flag\n switch (review.decision) {\n case 'approve':\n args.push('--approve');\n break;\n case 'request_changes':\n args.push('--request-changes');\n break;\n case 'comment':\n args.push('--comment');\n break;\n }\n\n if (review.body) {\n args.push('--body', review.body);\n }\n\n await this.gh(args);\n\n // Return the review data (gh doesn't return review ID)\n const reviewResult: Review = {\n id: `review-${Date.now()}`,\n pull_request_id: String(idOrNumber),\n author: 'current-user',\n decision: review.decision,\n body: review.body ?? '',\n created_at: new Date().toISOString(),\n };\n return reviewResult;\n } catch (error) {\n throw this.wrapError(error, `Failed to add review to pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Get reviews for a pull request\n */\n async getReviews(idOrNumber: string | number): Promise<Review[]> {\n this.ensureConnected();\n\n try {\n const result = await this.gh([\n 'pr',\n 'view',\n String(idOrNumber),\n '-R',\n this.repository,\n '--json',\n 'reviews',\n ]);\n\n const data = JSON.parse(result);\n const reviews = data.reviews || [];\n\n return reviews.map((r: Record<string, unknown>) => ({\n id: String(r.id || `review-${Date.now()}`),\n pull_request_id: String(idOrNumber),\n author: (r.author as { login?: string })?.login || 'unknown',\n decision: this.mapGhStateToDecision(String(r.state || 'COMMENTED')),\n body: String(r.body || ''),\n created_at: String(r.submittedAt || new Date().toISOString()),\n }));\n } catch (error) {\n throw this.wrapError(error, `Failed to get reviews for pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Request reviewers for a pull request\n */\n async requestReviewers(idOrNumber: string | number, reviewers: string[]): Promise<void> {\n this.ensureConnected();\n\n try {\n await this.gh([\n 'pr',\n 'edit',\n String(idOrNumber),\n '-R',\n this.repository,\n '--add-reviewer',\n reviewers.join(','),\n ]);\n } catch (error) {\n throw this.wrapError(error, `Failed to request reviewers for pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Add a comment to a pull request\n */\n async addPullRequestComment(idOrNumber: string | number, comment: string): Promise<void> {\n this.ensureConnected();\n\n try {\n await this.gh([\n 'pr',\n 'comment',\n String(idOrNumber),\n '-R',\n this.repository,\n '--body',\n comment,\n ]);\n } catch (error) {\n throw this.wrapError(error, `Failed to add comment to pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Get the diff for a pull request\n */\n async getPullRequestDiff(idOrNumber: string | number): Promise<string> {\n this.ensureConnected();\n\n try {\n return await this.gh(['pr', 'diff', String(idOrNumber), '-R', this.repository]);\n } catch (error) {\n throw this.wrapError(error, `Failed to get diff for pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Get files changed in a pull request\n */\n async getPullRequestFiles(idOrNumber: string | number): Promise<string[]> {\n this.ensureConnected();\n\n try {\n const result = await this.gh([\n 'pr',\n 'view',\n String(idOrNumber),\n '-R',\n this.repository,\n '--json',\n 'files',\n ]);\n\n const data = JSON.parse(result);\n const files = data.files || [];\n\n return files.map((f: { path?: string }) => f.path || '');\n } catch (error) {\n throw this.wrapError(error, `Failed to get files for pull request #${idOrNumber}`);\n }\n }\n\n /**\n * Execute gh CLI command\n */\n private async gh(args: string[]): Promise<string> {\n try {\n const { stdout } = await execFileAsync(this.ghPath, args, {\n maxBuffer: 10 * 1024 * 1024, // 10MB\n });\n return stdout;\n } catch (error) {\n const execError = error as { stderr?: string; message?: string };\n throw new Error(execError.stderr || execError.message || 'Unknown gh error');\n }\n }\n\n /**\n * Ensure adapter is connected\n */\n private ensureConnected(): void {\n if (!this.connected) {\n throw new AdapterError(\n 'GitHub adapter is not connected. Call connect() first.',\n 'not_connected',\n this.getInfo()\n );\n }\n }\n\n /**\n * Map gh PR data to PullRequest type\n */\n private mapPullRequest(data: Record<string, unknown>): PullRequest {\n const pr: PullRequest = {\n id: String(data.number),\n number: Number(data.number),\n title: String(data.title || ''),\n source_branch: String(data.headRefName || ''),\n target_branch: String(data.baseRefName || ''),\n status: this.mapGhStateToPrStatus(String(data.state || 'OPEN')),\n };\n\n if (data.body) {\n pr.description = String(data.body);\n }\n\n if (data.author && typeof data.author === 'object') {\n const login = (data.author as { login?: string }).login;\n if (login) {\n pr.author = login;\n }\n }\n\n if (data.createdAt) {\n pr.created_at = String(data.createdAt);\n }\n\n if (data.updatedAt) {\n pr.updated_at = String(data.updatedAt);\n }\n\n if (data.mergedAt) {\n pr.merged_at = String(data.mergedAt);\n }\n\n if (data.url) {\n pr.url = String(data.url);\n }\n\n if (data.reviewRequests && Array.isArray(data.reviewRequests)) {\n pr.reviewers = data.reviewRequests\n .map((r: { login?: string }) => r.login || '')\n .filter(Boolean);\n }\n\n return pr;\n }\n\n /**\n * Map gh state to PullRequestStatus\n */\n private mapGhStateToPrStatus(state: string): PullRequestStatus {\n switch (state.toUpperCase()) {\n case 'OPEN':\n return 'open';\n case 'CLOSED':\n return 'closed';\n case 'MERGED':\n return 'merged';\n default:\n return 'open';\n }\n }\n\n /**\n * Map PullRequestStatus to gh CLI state\n */\n private mapStatusToGh(status: PullRequestStatus): string | undefined {\n switch (status) {\n case 'open':\n return 'open';\n case 'closed':\n return 'closed';\n case 'merged':\n return 'merged';\n default:\n return undefined;\n }\n }\n\n /**\n * Map gh review state to ReviewDecision\n */\n private mapGhStateToDecision(state: string): ReviewDecision {\n switch (state.toUpperCase()) {\n case 'APPROVED':\n return 'approve';\n case 'CHANGES_REQUESTED':\n return 'request_changes';\n case 'COMMENTED':\n default:\n return 'comment';\n }\n }\n\n /**\n * Check if error is a not found error\n */\n private isNotFoundError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes('Could not resolve') || message.includes('not found');\n }\n\n /**\n * Wrap error in AdapterError\n */\n private wrapError(error: unknown, message: string): AdapterError {\n return new AdapterError(\n `${message}: ${error instanceof Error ? error.message : String(error)}`,\n 'operation_failed',\n this.getInfo(),\n error instanceof Error ? error : undefined\n );\n }\n}\n\n/**\n * Create a GitHub adapter\n */\nexport function createGitHubAdapter(options: GitHubAdapterOptions): GitHubAdapter {\n return new GitHubAdapter(options);\n}\n","/**\n * Cache Types\n *\n * Type definitions for the shared context cache system.\n */\n\n/**\n * Source type for cached content\n */\nexport type CacheSource = 'confluence' | 'github' | 'notion' | 'local' | 'custom';\n\n/**\n * Cache entry status\n */\nexport type CacheStatus = 'valid' | 'stale' | 'expired' | 'error';\n\n/**\n * Metadata for a cached entry\n */\nexport interface CacheMetadata {\n /**\n * Unique key for this cache entry\n */\n key: string;\n\n /**\n * Source provider (e.g., 'confluence', 'github')\n */\n source: CacheSource;\n\n /**\n * Original source URL or identifier\n */\n sourceUrl: string;\n\n /**\n * When the content was cached\n */\n cachedAt: string;\n\n /**\n * When the content expires (ISO date string)\n */\n expiresAt: string;\n\n /**\n * ETag or version hash from source (for conditional fetching)\n */\n etag?: string;\n\n /**\n * Content hash for integrity checking\n */\n contentHash: string;\n\n /**\n * Size in bytes\n */\n size: number;\n\n /**\n * Content type (e.g., 'text/markdown', 'application/json')\n */\n contentType: string;\n\n /**\n * Original title or name\n */\n title?: string;\n\n /**\n * Last modified timestamp from source\n */\n lastModified?: string;\n\n /**\n * Custom tags for categorization\n */\n tags?: string[];\n}\n\n/**\n * A cached content entry\n */\nexport interface CacheEntry<T = string> {\n /**\n * Entry metadata\n */\n metadata: CacheMetadata;\n\n /**\n * The cached content\n */\n content: T;\n}\n\n/**\n * Options for cache operations\n */\nexport interface CacheOptions {\n /**\n * Time-to-live in seconds (default: 3600 = 1 hour)\n */\n ttl?: number;\n\n /**\n * Force refresh even if cached\n */\n forceRefresh?: boolean;\n\n /**\n * Skip cache and fetch directly\n */\n skipCache?: boolean;\n\n /**\n * Custom tags to apply\n */\n tags?: string[];\n}\n\n/**\n * Options for listing cache entries\n */\nexport interface CacheListOptions {\n /**\n * Filter by source\n */\n source?: CacheSource;\n\n /**\n * Filter by tag\n */\n tag?: string;\n\n /**\n * Filter by status\n */\n status?: CacheStatus;\n\n /**\n * Maximum entries to return\n */\n limit?: number;\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /**\n * Total number of entries\n */\n totalEntries: number;\n\n /**\n * Total size in bytes\n */\n totalSize: number;\n\n /**\n * Number of valid entries\n */\n validEntries: number;\n\n /**\n * Number of stale entries\n */\n staleEntries: number;\n\n /**\n * Number of expired entries\n */\n expiredEntries: number;\n\n /**\n * Entries by source\n */\n bySource: Record<CacheSource, number>;\n\n /**\n * Oldest entry timestamp\n */\n oldestEntry?: string;\n\n /**\n * Newest entry timestamp\n */\n newestEntry?: string;\n}\n\n/**\n * Result of a sync operation\n */\nexport interface SyncResult {\n /**\n * Number of entries added\n */\n added: number;\n\n /**\n * Number of entries updated\n */\n updated: number;\n\n /**\n * Number of entries removed\n */\n removed: number;\n\n /**\n * Number of entries that failed to sync\n */\n failed: number;\n\n /**\n * Error messages for failed entries\n */\n errors: { key: string; error: string }[];\n\n /**\n * Duration of sync in milliseconds\n */\n duration: number;\n}\n\n/**\n * Cache error codes\n */\nexport type CacheErrorCode =\n | 'not_found'\n | 'expired'\n | 'invalid_key'\n | 'write_failed'\n | 'read_failed'\n | 'fetch_failed'\n | 'invalid_config'\n | 'storage_full';\n\n/**\n * Cache-specific error\n */\nexport class CacheError extends Error {\n constructor(\n message: string,\n public readonly code: CacheErrorCode,\n public readonly key?: string,\n public override readonly cause?: Error\n ) {\n super(message);\n this.name = 'CacheError';\n }\n}\n\n/**\n * Default cache directory paths\n */\nexport const CACHE_PATHS = {\n /**\n * Root cache directory (relative to project root)\n */\n ROOT: '.coreai/cache',\n\n /**\n * Content storage directory\n */\n CONTENT: '.coreai/cache/content',\n\n /**\n * Metadata storage directory\n */\n METADATA: '.coreai/cache/metadata',\n\n /**\n * Index file for fast lookups\n */\n INDEX: '.coreai/cache/index.json',\n\n /**\n * Lock file for concurrent access\n */\n LOCK: '.coreai/cache/.lock',\n} as const;\n\n/**\n * Default cache configuration\n */\nexport const DEFAULT_CACHE_CONFIG = {\n /**\n * Default TTL in seconds (1 hour)\n */\n ttl: 3600,\n\n /**\n * Maximum cache size in bytes (100MB)\n */\n maxSize: 100 * 1024 * 1024,\n\n /**\n * Maximum number of entries\n */\n maxEntries: 1000,\n\n /**\n * Enable automatic cleanup of expired entries\n */\n autoCleanup: true,\n\n /**\n * Cleanup interval in seconds (1 hour)\n */\n cleanupInterval: 3600,\n} as const;\n","/**\n * File-based Cache Provider\n *\n * Implements CacheProvider using the local filesystem.\n * Stores content in files with separate metadata JSON files.\n */\n\nimport { promises as fs } from 'fs';\nimport { join, dirname } from 'path';\nimport { createHash } from 'crypto';\nimport type {\n CacheEntry,\n CacheMetadata,\n CacheOptions,\n CacheListOptions,\n CacheStats,\n CacheStatus,\n CacheSource,\n} from './types.js';\nimport { CacheError, CACHE_PATHS, DEFAULT_CACHE_CONFIG } from './types.js';\nimport type { CacheProvider } from './interfaces.js';\n\n/**\n * No-op function for ignoring errors\n */\nfunction noop(): void {\n // Intentionally empty\n}\n\n/**\n * Options for creating a file cache provider\n */\nexport interface FileCacheProviderOptions {\n /**\n * Base path for cache storage (project root)\n */\n basePath: string;\n\n /**\n * Default TTL in seconds\n */\n ttl?: number;\n\n /**\n * Maximum cache size in bytes\n */\n maxSize?: number;\n\n /**\n * Maximum number of entries\n */\n maxEntries?: number;\n}\n\n/**\n * Cache index structure for fast lookups\n */\ninterface CacheIndex {\n version: number;\n entries: Record<string, CacheIndexEntry>;\n stats: {\n totalSize: number;\n entryCount: number;\n lastCleanup: string | null;\n };\n}\n\n/**\n * Index entry for quick access\n */\ninterface CacheIndexEntry {\n key: string;\n source: CacheSource;\n cachedAt: string;\n expiresAt: string;\n size: number;\n contentFile: string;\n metadataFile: string;\n}\n\nconst INDEX_VERSION = 1;\n\n/**\n * File-based cache provider implementation\n */\nexport class FileCacheProvider implements CacheProvider {\n private basePath: string;\n private cachePath: string;\n private contentPath: string;\n private metadataPath: string;\n private indexPath: string;\n private ttl: number;\n private maxSize: number;\n private maxEntries: number;\n private initialized = false;\n private index: CacheIndex | null = null;\n\n constructor(options: FileCacheProviderOptions) {\n this.basePath = options.basePath;\n this.cachePath = join(this.basePath, CACHE_PATHS.ROOT);\n this.contentPath = join(this.basePath, CACHE_PATHS.CONTENT);\n this.metadataPath = join(this.basePath, CACHE_PATHS.METADATA);\n this.indexPath = join(this.basePath, CACHE_PATHS.INDEX);\n this.ttl = options.ttl ?? DEFAULT_CACHE_CONFIG.ttl;\n this.maxSize = options.maxSize ?? DEFAULT_CACHE_CONFIG.maxSize;\n this.maxEntries = options.maxEntries ?? DEFAULT_CACHE_CONFIG.maxEntries;\n }\n\n /**\n * Initialize the cache (create directories, load index)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Create cache directories\n await fs.mkdir(this.contentPath, { recursive: true });\n await fs.mkdir(this.metadataPath, { recursive: true });\n\n // Load or create index\n this.index = await this.loadIndex();\n\n // Save index to ensure file exists\n await this.saveIndex();\n\n this.initialized = true;\n } catch (error) {\n throw new CacheError(\n `Failed to initialize cache: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Check if the cache is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get a cached entry by key\n */\n async get<T = string>(key: string, options?: CacheOptions): Promise<CacheEntry<T> | null> {\n this.ensureInitialized();\n\n if (options?.skipCache) {\n return null;\n }\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n return null;\n }\n\n // Check expiration (unless force refresh)\n if (!options?.forceRefresh) {\n const status = this.getEntryStatus(indexEntry);\n if (status === 'expired') {\n return null;\n }\n }\n\n try {\n // Read metadata\n const metadataContent = await fs.readFile(indexEntry.metadataFile, 'utf-8');\n const metadata: CacheMetadata = JSON.parse(metadataContent);\n\n // Read content\n const contentRaw = await fs.readFile(indexEntry.contentFile, 'utf-8');\n let content: T;\n\n // Try to parse as JSON if content type indicates it\n if (metadata.contentType.includes('json')) {\n content = JSON.parse(contentRaw) as T;\n } else {\n content = contentRaw as T;\n }\n\n return { metadata, content };\n } catch {\n // Entry exists in index but files are missing - clean up\n await this.delete(key);\n return null;\n }\n }\n\n /**\n * Get the content only (convenience method)\n */\n async getContent<T = string>(key: string, options?: CacheOptions): Promise<T | null> {\n const entry = await this.get<T>(key, options);\n return entry?.content ?? null;\n }\n\n /**\n * Set a cache entry\n */\n async set<T = string>(\n key: string,\n content: T,\n metadata: Partial<CacheMetadata>,\n options?: CacheOptions\n ): Promise<void> {\n this.ensureInitialized();\n\n const now = new Date();\n const ttl = options?.ttl ?? this.ttl;\n const expiresAt = new Date(now.getTime() + ttl * 1000);\n\n // Serialize content\n const contentStr = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n const contentHash = this.hashContent(contentStr);\n const size = Buffer.byteLength(contentStr, 'utf-8');\n\n // Generate file paths\n const safeKey = this.sanitizeKey(key);\n const contentFile = join(this.contentPath, `${safeKey}.cache`);\n const metadataFile = join(this.metadataPath, `${safeKey}.json`);\n\n // Build full metadata\n const fullMetadata: CacheMetadata = {\n key,\n source: metadata.source ?? 'custom',\n sourceUrl: metadata.sourceUrl ?? '',\n cachedAt: now.toISOString(),\n expiresAt: expiresAt.toISOString(),\n contentHash,\n size,\n contentType:\n metadata.contentType ?? (typeof content === 'string' ? 'text/plain' : 'application/json'),\n };\n // Conditionally add optional properties\n if (metadata.etag) {\n fullMetadata.etag = metadata.etag;\n }\n if (metadata.title) {\n fullMetadata.title = metadata.title;\n }\n if (metadata.lastModified) {\n fullMetadata.lastModified = metadata.lastModified;\n }\n const tags = options?.tags ?? metadata.tags;\n if (tags) {\n fullMetadata.tags = tags;\n }\n\n try {\n // Ensure directories exist\n await fs.mkdir(dirname(contentFile), { recursive: true });\n await fs.mkdir(dirname(metadataFile), { recursive: true });\n\n // Write files\n await fs.writeFile(contentFile, contentStr, 'utf-8');\n await fs.writeFile(metadataFile, JSON.stringify(fullMetadata, null, 2), 'utf-8');\n\n // Update index\n if (this.index) {\n // Remove old size from stats if updating\n const oldEntry = this.index.entries[key];\n if (oldEntry) {\n this.index.stats.totalSize -= oldEntry.size;\n } else {\n this.index.stats.entryCount++;\n }\n\n this.index.entries[key] = {\n key,\n source: fullMetadata.source,\n cachedAt: fullMetadata.cachedAt,\n expiresAt: fullMetadata.expiresAt,\n size,\n contentFile,\n metadataFile,\n };\n this.index.stats.totalSize += size;\n\n await this.saveIndex();\n }\n } catch (error) {\n throw new CacheError(\n `Failed to write cache entry: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n key,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Check if a key exists in the cache\n */\n async has(key: string): Promise<boolean> {\n this.ensureInitialized();\n return key in (this.index?.entries ?? {});\n }\n\n /**\n * Delete a cache entry\n */\n async delete(key: string): Promise<boolean> {\n this.ensureInitialized();\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n return false;\n }\n\n try {\n // Delete files (ignore if already missing)\n await fs.unlink(indexEntry.contentFile).catch(noop);\n await fs.unlink(indexEntry.metadataFile).catch(noop);\n\n // Update index\n if (this.index) {\n this.index.stats.totalSize -= indexEntry.size;\n this.index.stats.entryCount--;\n // Remove entry from index using destructuring\n const { [key]: _removed, ...remaining } = this.index.entries;\n this.index.entries = remaining;\n await this.saveIndex();\n }\n\n return true;\n } catch (error) {\n throw new CacheError(\n `Failed to delete cache entry: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n key,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get the status of a cache entry\n */\n async getStatus(key: string): Promise<CacheStatus | null> {\n this.ensureInitialized();\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n return null;\n }\n\n return this.getEntryStatus(indexEntry);\n }\n\n /**\n * Get metadata for a cache entry\n */\n async getMetadata(key: string): Promise<CacheMetadata | null> {\n this.ensureInitialized();\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n return null;\n }\n\n try {\n const content = await fs.readFile(indexEntry.metadataFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n /**\n * Update metadata for a cache entry\n */\n async updateMetadata(key: string, metadata: Partial<CacheMetadata>): Promise<void> {\n this.ensureInitialized();\n\n const existing = await this.getMetadata(key);\n if (!existing) {\n throw new CacheError(`Cache entry not found: ${key}`, 'not_found', key);\n }\n\n const indexEntry = this.index?.entries[key];\n if (!indexEntry) {\n throw new CacheError(`Cache entry not found: ${key}`, 'not_found', key);\n }\n\n const updated: CacheMetadata = {\n ...existing,\n ...metadata,\n key: existing.key, // Can't change key\n };\n\n try {\n await fs.writeFile(indexEntry.metadataFile, JSON.stringify(updated, null, 2), 'utf-8');\n\n // Update index if relevant fields changed\n if (this.index && indexEntry) {\n if (metadata.source) indexEntry.source = metadata.source;\n if (metadata.expiresAt) indexEntry.expiresAt = metadata.expiresAt;\n await this.saveIndex();\n }\n } catch (error) {\n throw new CacheError(\n `Failed to update metadata: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n key,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * List cache entries\n */\n async list(options?: CacheListOptions): Promise<CacheMetadata[]> {\n this.ensureInitialized();\n\n if (!this.index) return [];\n\n let entries = Object.values(this.index.entries);\n\n // Apply filters\n if (options?.source) {\n entries = entries.filter((e) => e.source === options.source);\n }\n\n if (options?.status) {\n entries = entries.filter((e) => this.getEntryStatus(e) === options.status);\n }\n\n // Load full metadata for tag filtering and return\n const metadataPromises = entries.map(async (e) => {\n const metadata = await this.getMetadata(e.key);\n return metadata;\n });\n\n let results = (await Promise.all(metadataPromises)).filter(\n (m): m is CacheMetadata => m !== null\n );\n\n // Filter by tag if specified\n if (options?.tag) {\n const tag = options.tag;\n results = results.filter((m) => m.tags?.includes(tag));\n }\n\n // Apply limit\n if (options?.limit && results.length > options.limit) {\n results = results.slice(0, options.limit);\n }\n\n return results;\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats> {\n this.ensureInitialized();\n\n if (!this.index) {\n return {\n totalEntries: 0,\n totalSize: 0,\n validEntries: 0,\n staleEntries: 0,\n expiredEntries: 0,\n bySource: {\n confluence: 0,\n github: 0,\n notion: 0,\n local: 0,\n custom: 0,\n },\n };\n }\n\n const entries = Object.values(this.index.entries);\n const bySource: Record<CacheSource, number> = {\n confluence: 0,\n github: 0,\n notion: 0,\n local: 0,\n custom: 0,\n };\n\n let validEntries = 0;\n let staleEntries = 0;\n let expiredEntries = 0;\n let oldestEntry: string | undefined;\n let newestEntry: string | undefined;\n\n for (const entry of entries) {\n bySource[entry.source]++;\n\n const status = this.getEntryStatus(entry);\n if (status === 'valid') validEntries++;\n else if (status === 'stale') staleEntries++;\n else if (status === 'expired') expiredEntries++;\n\n if (!oldestEntry || entry.cachedAt < oldestEntry) {\n oldestEntry = entry.cachedAt;\n }\n if (!newestEntry || entry.cachedAt > newestEntry) {\n newestEntry = entry.cachedAt;\n }\n }\n\n const stats: CacheStats = {\n totalEntries: this.index.stats.entryCount,\n totalSize: this.index.stats.totalSize,\n validEntries,\n staleEntries,\n expiredEntries,\n bySource,\n };\n\n if (oldestEntry) stats.oldestEntry = oldestEntry;\n if (newestEntry) stats.newestEntry = newestEntry;\n\n return stats;\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<number> {\n this.ensureInitialized();\n\n if (!this.index) return 0;\n\n const count = this.index.stats.entryCount;\n\n try {\n // Delete all content and metadata files\n await fs.rm(this.contentPath, { recursive: true, force: true });\n await fs.rm(this.metadataPath, { recursive: true, force: true });\n\n // Recreate directories\n await fs.mkdir(this.contentPath, { recursive: true });\n await fs.mkdir(this.metadataPath, { recursive: true });\n\n // Reset index\n this.index = this.createEmptyIndex();\n await this.saveIndex();\n\n return count;\n } catch (error) {\n throw new CacheError(\n `Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Clear expired entries only\n */\n async clearExpired(): Promise<number> {\n this.ensureInitialized();\n\n if (!this.index) return 0;\n\n const expiredKeys = Object.entries(this.index.entries)\n .filter(([, entry]) => this.getEntryStatus(entry) === 'expired')\n .map(([key]) => key);\n\n for (const key of expiredKeys) {\n await this.delete(key);\n }\n\n if (this.index) {\n this.index.stats.lastCleanup = new Date().toISOString();\n await this.saveIndex();\n }\n\n return expiredKeys.length;\n }\n\n /**\n * Clear entries by source\n */\n async clearBySource(source: string): Promise<number> {\n this.ensureInitialized();\n\n if (!this.index) return 0;\n\n const keys = Object.entries(this.index.entries)\n .filter(([, entry]) => entry.source === source)\n .map(([key]) => key);\n\n for (const key of keys) {\n await this.delete(key);\n }\n\n return keys.length;\n }\n\n /**\n * Clear entries by tag\n */\n async clearByTag(tag: string): Promise<number> {\n this.ensureInitialized();\n\n const entries = await this.list({ tag });\n for (const entry of entries) {\n await this.delete(entry.key);\n }\n\n return entries.length;\n }\n\n // Private helpers\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new CacheError('Cache not initialized. Call initialize() first.', 'invalid_config');\n }\n }\n\n private async loadIndex(): Promise<CacheIndex> {\n try {\n const content = await fs.readFile(this.indexPath, 'utf-8');\n const index = JSON.parse(content) as CacheIndex;\n\n // Validate version\n if (index.version !== INDEX_VERSION) {\n // Index version mismatch - rebuild\n return this.rebuildIndex();\n }\n\n return index;\n } catch {\n // Index doesn't exist or is invalid - create new one\n return this.createEmptyIndex();\n }\n }\n\n private async saveIndex(): Promise<void> {\n if (!this.index) return;\n\n try {\n await fs.writeFile(this.indexPath, JSON.stringify(this.index, null, 2), 'utf-8');\n } catch (error) {\n throw new CacheError(\n `Failed to save cache index: ${error instanceof Error ? error.message : String(error)}`,\n 'write_failed',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private createEmptyIndex(): CacheIndex {\n return {\n version: INDEX_VERSION,\n entries: {},\n stats: {\n totalSize: 0,\n entryCount: 0,\n lastCleanup: null,\n },\n };\n }\n\n private async rebuildIndex(): Promise<CacheIndex> {\n const index = this.createEmptyIndex();\n\n try {\n const metadataFiles = await fs.readdir(this.metadataPath);\n\n for (const file of metadataFiles) {\n if (!file.endsWith('.json')) continue;\n\n try {\n const metadataPath = join(this.metadataPath, file);\n const content = await fs.readFile(metadataPath, 'utf-8');\n const metadata: CacheMetadata = JSON.parse(content);\n\n const safeKey = this.sanitizeKey(metadata.key);\n const contentFile = join(this.contentPath, `${safeKey}.cache`);\n\n // Verify content file exists\n await fs.access(contentFile);\n\n index.entries[metadata.key] = {\n key: metadata.key,\n source: metadata.source,\n cachedAt: metadata.cachedAt,\n expiresAt: metadata.expiresAt,\n size: metadata.size,\n contentFile,\n metadataFile: metadataPath,\n };\n\n index.stats.totalSize += metadata.size;\n index.stats.entryCount++;\n } catch {\n // Skip invalid entries\n }\n }\n } catch {\n // Metadata directory doesn't exist or is empty\n }\n\n return index;\n }\n\n private getEntryStatus(entry: CacheIndexEntry): CacheStatus {\n const now = new Date();\n const expiresAt = new Date(entry.expiresAt);\n const cachedAt = new Date(entry.cachedAt);\n\n if (now > expiresAt) {\n return 'expired';\n }\n\n // Consider stale if more than 80% of TTL has passed\n const totalTtl = expiresAt.getTime() - cachedAt.getTime();\n const elapsed = now.getTime() - cachedAt.getTime();\n if (elapsed > totalTtl * 0.8) {\n return 'stale';\n }\n\n return 'valid';\n }\n\n private sanitizeKey(key: string): string {\n // Create a safe filename from the key\n return createHash('sha256').update(key).digest('hex').substring(0, 32);\n }\n\n private hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n }\n}\n\n/**\n * Create a file cache provider\n */\nexport function createFileCacheProvider(options: FileCacheProviderOptions): FileCacheProvider {\n return new FileCacheProvider(options);\n}\n","/**\n * Cache Manager\n *\n * Higher-level cache management that combines caching with remote fetching.\n * Implements cache-first resolution with remote fallback strategy.\n */\n\nimport type { CacheEntry, CacheMetadata, CacheOptions, CacheSource, SyncResult } from './types.js';\nimport { CacheError } from './types.js';\nimport type {\n CacheProvider,\n CacheManager as ICacheManager,\n RemoteFetcher,\n FetchOptions,\n SyncOptions,\n} from './interfaces.js';\n\n/**\n * Options for creating a cache manager\n */\nexport interface CacheManagerOptions {\n /**\n * The underlying cache provider\n */\n cache: CacheProvider;\n\n /**\n * Default TTL in seconds\n */\n defaultTtl?: number;\n\n /**\n * Default source for new entries\n */\n defaultSource?: CacheSource;\n}\n\n/**\n * Cache manager implementation\n *\n * Provides cache-first resolution strategy:\n * 1. Check cache for valid entry\n * 2. If cached and valid, return cached content\n * 3. If stale or missing, fetch from remote\n * 4. Cache the fetched content\n * 5. Return the content\n */\nexport class CacheManager implements ICacheManager {\n private cache: CacheProvider;\n private fetchers = new Map<string, RemoteFetcher>();\n private defaultTtl: number;\n private defaultSource: CacheSource;\n\n constructor(options: CacheManagerOptions) {\n this.cache = options.cache;\n this.defaultTtl = options.defaultTtl ?? 3600;\n this.defaultSource = options.defaultSource ?? 'custom';\n }\n\n /**\n * Get content with cache-first strategy\n */\n async getWithFallback<T = string>(\n key: string,\n url: string,\n options?: CacheOptions & FetchOptions\n ): Promise<CacheEntry<T>> {\n // Try cache first (unless skipCache is set)\n if (!options?.skipCache && !options?.forceRefresh) {\n const cached = await this.cache.get<T>(key);\n if (cached) {\n const status = await this.cache.getStatus(key);\n // Return if valid (not stale or expired)\n if (status === 'valid') {\n return cached;\n }\n // If stale, try to refresh but fall back to stale if fetch fails\n if (status === 'stale') {\n try {\n return await this.fetchAndCache<T>(key, url, options);\n } catch {\n // Return stale content on fetch failure\n return cached;\n }\n }\n }\n }\n\n // Cache miss or forceRefresh - fetch from remote\n return this.fetchAndCache<T>(key, url, options);\n }\n\n /**\n * Sync all entries from a source\n */\n async syncSource(source: string, options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now();\n const result: SyncResult = {\n added: 0,\n updated: 0,\n removed: 0,\n failed: 0,\n errors: [],\n duration: 0,\n };\n\n // Get all entries from this source\n const entries = await this.cache.list({ source: source as CacheSource });\n\n // Sync each entry\n const concurrency = options?.concurrency ?? 5;\n const chunks = this.chunkArray(entries, concurrency);\n\n for (const chunk of chunks) {\n const promises = chunk.map(async (entry) => {\n try {\n const fetcher = this.fetchers.get(source);\n if (!fetcher) {\n throw new Error(`No fetcher registered for source: ${source}`);\n }\n\n // Check if content has changed\n const hasChanged = await fetcher.hasChanged(entry.sourceUrl, entry.etag);\n\n if (hasChanged || options?.force) {\n // Fetch and update\n const fetchOptions: FetchOptions = {};\n if (entry.etag) {\n fetchOptions.etag = entry.etag;\n }\n const { content, metadata } = await fetcher.fetch(entry.sourceUrl, fetchOptions);\n\n await this.cache.set(entry.key, content, {\n ...entry,\n ...metadata,\n });\n\n result.updated++;\n }\n } catch (error) {\n result.failed++;\n result.errors.push({\n key: entry.key,\n error: error instanceof Error ? error.message : String(error),\n });\n\n if (!options?.continueOnError) {\n throw error;\n }\n }\n });\n\n await Promise.all(promises);\n }\n\n // Report final progress\n if (options?.onProgress) {\n options.onProgress(entries.length, entries.length);\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n /**\n * Sync specific entries\n */\n async syncEntries(keys: string[], options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now();\n const result: SyncResult = {\n added: 0,\n updated: 0,\n removed: 0,\n failed: 0,\n errors: [],\n duration: 0,\n };\n\n const concurrency = options?.concurrency ?? 5;\n const chunks = this.chunkArray(keys, concurrency);\n\n for (const chunk of chunks) {\n const promises = chunk.map(async (key) => {\n try {\n const metadata = await this.cache.getMetadata(key);\n if (!metadata) {\n result.failed++;\n result.errors.push({ key, error: 'Entry not found in cache' });\n return;\n }\n\n const fetcher = this.fetchers.get(metadata.source);\n if (!fetcher) {\n result.failed++;\n result.errors.push({ key, error: `No fetcher for source: ${metadata.source}` });\n return;\n }\n\n // Check if content has changed\n const hasChanged = await fetcher.hasChanged(metadata.sourceUrl, metadata.etag);\n\n if (hasChanged || options?.force) {\n const fetchOpts: FetchOptions = {};\n if (metadata.etag) {\n fetchOpts.etag = metadata.etag;\n }\n const { content, metadata: newMeta } = await fetcher.fetch(\n metadata.sourceUrl,\n fetchOpts\n );\n\n await this.cache.set(key, content, {\n ...metadata,\n ...newMeta,\n });\n\n result.updated++;\n }\n } catch (error) {\n result.failed++;\n result.errors.push({\n key,\n error: error instanceof Error ? error.message : String(error),\n });\n\n if (!options?.continueOnError) {\n throw error;\n }\n }\n });\n\n await Promise.all(promises);\n }\n\n // Report final progress\n if (options?.onProgress) {\n options.onProgress(keys.length, keys.length);\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n /**\n * Register a fetcher for a source\n */\n registerFetcher(source: string, fetcher: RemoteFetcher): void {\n this.fetchers.set(source, fetcher);\n }\n\n /**\n * Get the underlying cache provider\n */\n getCache(): CacheProvider {\n return this.cache;\n }\n\n /**\n * Check if a fetcher is registered for a source\n */\n hasFetcher(source: string): boolean {\n return this.fetchers.has(source);\n }\n\n /**\n * Get all registered sources\n */\n getRegisteredSources(): string[] {\n return Array.from(this.fetchers.keys());\n }\n\n // Private helpers\n\n private async fetchAndCache<T>(\n key: string,\n url: string,\n options?: CacheOptions & FetchOptions\n ): Promise<CacheEntry<T>> {\n // Determine source from URL\n const source = this.getSourceFromUrl(url);\n const fetcher = this.fetchers.get(source);\n\n if (!fetcher) {\n throw new CacheError(\n `No fetcher registered for source: ${source}. Register one with registerFetcher().`,\n 'fetch_failed',\n key\n );\n }\n\n try {\n // Fetch from remote\n const fetchOpts: FetchOptions = {};\n if (options?.timeout) {\n fetchOpts.timeout = options.timeout;\n }\n if (options?.headers) {\n fetchOpts.headers = options.headers;\n }\n const { content, metadata } = await fetcher.fetch(url, fetchOpts);\n\n // Build full metadata\n const fullMetadata: Partial<CacheMetadata> = {\n source: source as CacheSource,\n sourceUrl: url,\n contentType: metadata.contentType ?? 'text/plain',\n };\n if (metadata.etag) {\n fullMetadata.etag = metadata.etag;\n }\n if (metadata.title) {\n fullMetadata.title = metadata.title;\n }\n if (metadata.lastModified) {\n fullMetadata.lastModified = metadata.lastModified;\n }\n if (options?.tags) {\n fullMetadata.tags = options.tags;\n }\n\n // Cache the content\n const cacheOpts: CacheOptions = {\n ttl: options?.ttl ?? this.defaultTtl,\n };\n if (options?.tags) {\n cacheOpts.tags = options.tags;\n }\n await this.cache.set(key, content, fullMetadata, cacheOpts);\n\n // Return the entry\n const entry = await this.cache.get<T>(key);\n if (!entry) {\n throw new CacheError('Failed to retrieve cached entry after write', 'read_failed', key);\n }\n\n return entry;\n } catch (error) {\n if (error instanceof CacheError) {\n throw error;\n }\n throw new CacheError(\n `Failed to fetch content: ${error instanceof Error ? error.message : String(error)}`,\n 'fetch_failed',\n key,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private getSourceFromUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const hostname = parsed.hostname.toLowerCase();\n\n // Map common hostnames to sources\n if (hostname.includes('confluence') || hostname.includes('atlassian.net')) {\n return 'confluence';\n }\n if (hostname.includes('github.com') || hostname.includes('github')) {\n return 'github';\n }\n if (hostname.includes('notion.so') || hostname.includes('notion')) {\n return 'notion';\n }\n\n // Default to custom\n return this.defaultSource;\n } catch {\n // Invalid URL, might be a file path\n return 'local';\n }\n }\n\n private chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n }\n}\n\n/**\n * Create a cache manager\n */\nexport function createCacheManager(options: CacheManagerOptions): CacheManager {\n return new CacheManager(options);\n}\n","/**\n * Context Loader\n *\n * Loads shared context from remote documentation providers with cache-first resolution.\n * Handles first-run scenarios when cache is empty.\n */\n\nimport type { CacheManager, CacheOptions, FetchOptions } from '../cache/index.js';\nimport type { CacheEntry, CacheMetadata } from '../cache/types.js';\n\n/**\n * Context source definition\n */\nexport interface ContextSource {\n /**\n * Unique identifier for this context\n */\n key: string;\n\n /**\n * Remote URL to fetch from\n */\n url: string;\n\n /**\n * Optional title for the context\n */\n title?: string;\n\n /**\n * Optional tags for categorization\n */\n tags?: string[];\n\n /**\n * Whether this context is required (fail if cannot load)\n */\n required?: boolean;\n}\n\n/**\n * Context load result\n */\nexport interface ContextLoadResult {\n /**\n * Successfully loaded contexts\n */\n loaded: {\n key: string;\n content: string;\n fromCache: boolean;\n metadata: CacheMetadata;\n }[];\n\n /**\n * Failed contexts\n */\n failed: {\n key: string;\n error: string;\n required: boolean;\n }[];\n\n /**\n * Total duration in milliseconds\n */\n duration: number;\n}\n\n/**\n * Options for the context loader\n */\nexport interface ContextLoaderOptions {\n /**\n * The cache manager to use\n */\n cacheManager: CacheManager;\n\n /**\n * Default TTL for cached contexts (seconds)\n */\n defaultTtl?: number;\n\n /**\n * Whether to fail on any required context failure\n */\n failOnRequired?: boolean;\n\n /**\n * Maximum concurrent fetches\n */\n concurrency?: number;\n}\n\n/**\n * Options for loading contexts\n */\nexport interface LoadOptions extends CacheOptions, FetchOptions {\n /**\n * Continue loading other contexts if one fails\n */\n continueOnError?: boolean;\n\n /**\n * Progress callback\n */\n onProgress?: (loaded: number, total: number, current: string) => void;\n}\n\n/**\n * Context Loader\n *\n * Provides cache-first context resolution with graceful degradation\n * for first-run scenarios when the cache is empty.\n */\nexport class ContextLoader {\n private cacheManager: CacheManager;\n private defaultTtl: number;\n private failOnRequired: boolean;\n private concurrency: number;\n\n constructor(options: ContextLoaderOptions) {\n this.cacheManager = options.cacheManager;\n this.defaultTtl = options.defaultTtl ?? 3600;\n this.failOnRequired = options.failOnRequired ?? true;\n this.concurrency = options.concurrency ?? 5;\n }\n\n /**\n * Load a single context\n */\n async load(source: ContextSource, options?: LoadOptions): Promise<CacheEntry<string>> {\n try {\n const cacheOptions: CacheOptions & FetchOptions = {\n ...options,\n ttl: options?.ttl ?? this.defaultTtl,\n };\n if (source.tags) {\n cacheOptions.tags = source.tags;\n }\n const entry = await this.cacheManager.getWithFallback<string>(\n source.key,\n source.url,\n cacheOptions\n );\n\n return entry;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (source.required && this.failOnRequired) {\n throw new Error(`Failed to load required context \"${source.key}\": ${message}`);\n }\n\n throw error;\n }\n }\n\n /**\n * Load multiple contexts\n */\n async loadMany(sources: ContextSource[], options?: LoadOptions): Promise<ContextLoadResult> {\n const startTime = Date.now();\n const result: ContextLoadResult = {\n loaded: [],\n failed: [],\n duration: 0,\n };\n\n // Track which entries were loaded from cache vs fetched\n const cacheStatuses = new Map<string, boolean>();\n\n // Check cache status for all keys first\n for (const source of sources) {\n const status = await this.cacheManager.getCache().getStatus(source.key);\n cacheStatuses.set(source.key, status === 'valid');\n }\n\n // Process in chunks for concurrency control\n const chunks = this.chunkArray(sources, this.concurrency);\n\n let completed = 0;\n for (const chunk of chunks) {\n const promises = chunk.map(async (source) => {\n try {\n const itemCacheOptions: CacheOptions & FetchOptions = {\n ...options,\n ttl: options?.ttl ?? this.defaultTtl,\n };\n if (source.tags) {\n itemCacheOptions.tags = source.tags;\n }\n const entry = await this.cacheManager.getWithFallback<string>(\n source.key,\n source.url,\n itemCacheOptions\n );\n\n result.loaded.push({\n key: source.key,\n content: entry.content,\n fromCache: cacheStatuses.get(source.key) ?? false,\n metadata: entry.metadata,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n result.failed.push({\n key: source.key,\n error: message,\n required: source.required ?? false,\n });\n\n if (source.required && this.failOnRequired && !options?.continueOnError) {\n throw new Error(`Failed to load required context \"${source.key}\": ${message}`);\n }\n }\n });\n\n await Promise.all(promises);\n\n completed += chunk.length;\n if (options?.onProgress) {\n const currentKey = chunk[chunk.length - 1]?.key ?? '';\n options.onProgress(completed, sources.length, currentKey);\n }\n }\n\n result.duration = Date.now() - startTime;\n\n // Check for required failures\n if (this.failOnRequired && !options?.continueOnError) {\n const requiredFailures = result.failed.filter((f) => f.required);\n if (requiredFailures.length > 0) {\n throw new Error(\n `Failed to load ${requiredFailures.length} required context(s): ${requiredFailures.map((f) => f.key).join(', ')}`\n );\n }\n }\n\n return result;\n }\n\n /**\n * Load contexts by tag\n */\n async loadByTag(tag: string, _options?: LoadOptions): Promise<ContextLoadResult> {\n const startTime = Date.now();\n const result: ContextLoadResult = {\n loaded: [],\n failed: [],\n duration: 0,\n };\n\n // Get all cached entries with this tag\n const entries = await this.cacheManager.getCache().list({ tag });\n\n for (const entry of entries) {\n try {\n const cached = await this.cacheManager.getCache().get<string>(entry.key);\n if (cached) {\n result.loaded.push({\n key: entry.key,\n content: cached.content,\n fromCache: true,\n metadata: cached.metadata,\n });\n }\n } catch (error) {\n result.failed.push({\n key: entry.key,\n error: error instanceof Error ? error.message : String(error),\n required: false,\n });\n }\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n /**\n * Refresh all contexts (sync from remote)\n */\n async refresh(sources: ContextSource[], options?: LoadOptions): Promise<ContextLoadResult> {\n return this.loadMany(sources, {\n ...options,\n forceRefresh: true,\n });\n }\n\n /**\n * Check if all required contexts are available (cached or fetchable)\n */\n async checkAvailability(\n sources: ContextSource[]\n ): Promise<{ available: string[]; missing: string[]; errors: string[] }> {\n const available: string[] = [];\n const missing: string[] = [];\n const errors: string[] = [];\n\n for (const source of sources) {\n try {\n // Check if cached\n const hasCached = await this.cacheManager.getCache().has(source.key);\n if (hasCached) {\n available.push(source.key);\n continue;\n }\n\n // Check if fetcher is available\n const url = new URL(source.url);\n const source_type = this.getSourceFromHostname(url.hostname);\n if (this.cacheManager.hasFetcher(source_type)) {\n missing.push(source.key); // Can be fetched but not cached\n } else {\n errors.push(`${source.key}: No fetcher for ${source_type}`);\n }\n } catch (error) {\n errors.push(`${source.key}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return { available, missing, errors };\n }\n\n /**\n * Get the cache manager\n */\n getCacheManager(): CacheManager {\n return this.cacheManager;\n }\n\n // Private helpers\n\n private getSourceFromHostname(hostname: string): string {\n const lower = hostname.toLowerCase();\n if (lower.includes('confluence') || lower.includes('atlassian.net')) return 'confluence';\n if (lower.includes('github.com') || lower.includes('github')) return 'github';\n if (lower.includes('notion.so') || lower.includes('notion')) return 'notion';\n return 'custom';\n }\n\n private chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n }\n}\n\n/**\n * Create a context loader\n */\nexport function createContextLoader(options: ContextLoaderOptions): ContextLoader {\n return new ContextLoader(options);\n}\n","/**\n * Command Context\n *\n * Runtime context for command execution with graceful degradation support.\n */\n\nimport type { ResolvedCoreAIConfig } from '../config/types.js';\nimport type { AdapterType } from '../adapters/types.js';\nimport type { AdapterFactory } from '../adapters/factory.js';\nimport { createAdapterFactory } from '../adapters/factory.js';\nimport { loadConfig, configExists } from '../config/loader.js';\nimport type { CommandContext } from './types.js';\n\n/**\n * Options for creating a command context\n */\nexport interface CreateContextOptions {\n /**\n * Project root directory\n */\n projectRoot?: string;\n\n /**\n * Pre-loaded configuration (if already loaded)\n */\n config?: ResolvedCoreAIConfig;\n\n /**\n * Pre-created adapter factory (if already created)\n */\n adapterFactory?: AdapterFactory;\n}\n\n/**\n * Create a command execution context\n *\n * Handles configuration loading and adapter factory creation with graceful fallbacks.\n */\nexport function createCommandContext(options: CreateContextOptions = {}): CommandContext {\n const projectRoot = options.projectRoot ?? process.cwd();\n\n // Load config if not provided\n let config: ResolvedCoreAIConfig | null = options.config ?? null;\n if (!config && configExists(projectRoot)) {\n try {\n config = loadConfig(projectRoot);\n } catch {\n // Config loading failed, continue without config\n config = null;\n }\n }\n\n // Create adapter factory if config is available and factory not provided\n let adapterFactory: AdapterFactory | null = options.adapterFactory ?? null;\n if (!adapterFactory && config) {\n try {\n adapterFactory = createAdapterFactory(config);\n } catch {\n // Factory creation failed, continue without adapters\n adapterFactory = null;\n }\n }\n\n return {\n config,\n adapterFactory,\n projectRoot,\n\n hasIntegration(type: AdapterType): boolean {\n if (!adapterFactory) return false;\n return adapterFactory.hasIntegration(type);\n },\n\n async getAdapterSafe<T>(type: AdapterType): Promise<T | null> {\n if (!adapterFactory) return null;\n if (!adapterFactory.hasIntegration(type)) return null;\n\n try {\n const adapter = await adapterFactory.getAdapter(type);\n return adapter as T;\n } catch {\n // Adapter creation failed, return null for graceful degradation\n return null;\n }\n },\n };\n}\n\n/**\n * Cleanup resources in a command context\n */\nexport async function cleanupContext(context: CommandContext): Promise<void> {\n if (context.adapterFactory) {\n await context.adapterFactory.disconnectAll();\n }\n}\n\n/**\n * Execute a function with automatic context cleanup\n */\nexport async function withContext<T>(\n options: CreateContextOptions,\n fn: (context: CommandContext) => Promise<T>\n): Promise<T> {\n const context = createCommandContext(options);\n try {\n return await fn(context);\n } finally {\n await cleanupContext(context);\n }\n}\n","/**\n * Command Registry\n *\n * Central registry for command registration and discovery.\n */\n\nimport type {\n CommandDefinition,\n CommandMetadata,\n MarkdownCommand,\n RegistryEntry,\n CommandCategory,\n IntegrationDependency,\n} from './types.js';\nimport type { AdapterFactory } from '../adapters/factory.js';\n\n/**\n * Command Registry\n *\n * Manages registration and lookup of commands.\n */\nexport class CommandRegistry {\n private commands = new Map<string, RegistryEntry>();\n private adapterFactory: AdapterFactory | null = null;\n\n /**\n * Set the adapter factory for dependency checking\n */\n setAdapterFactory(factory: AdapterFactory | null): void {\n this.adapterFactory = factory;\n // Re-evaluate availability of all commands\n this.updateAvailability();\n }\n\n /**\n * Register a programmatic command\n */\n register(definition: CommandDefinition): void {\n const metadata: CommandMetadata = {\n name: definition.name,\n description: definition.description,\n category: definition.category,\n dependencies: definition.dependencies ?? [],\n sourcePath: '<programmatic>',\n available: true,\n };\n\n // Check availability\n this.checkAvailability(metadata);\n\n this.commands.set(definition.name, {\n metadata,\n definition,\n source: 'programmatic',\n });\n }\n\n /**\n * Register a markdown command\n */\n registerMarkdown(command: MarkdownCommand): void {\n // Check availability\n this.checkAvailability(command.metadata);\n\n this.commands.set(command.metadata.name, {\n metadata: command.metadata,\n markdownCommand: command,\n source: 'markdown',\n });\n }\n\n /**\n * Register multiple commands\n */\n registerAll(definitions: CommandDefinition[]): void {\n for (const def of definitions) {\n this.register(def);\n }\n }\n\n /**\n * Register multiple markdown commands\n */\n registerAllMarkdown(commands: MarkdownCommand[]): void {\n for (const cmd of commands) {\n this.registerMarkdown(cmd);\n }\n }\n\n /**\n * Unregister a command\n */\n unregister(name: string): boolean {\n return this.commands.delete(name);\n }\n\n /**\n * Get a command by name\n */\n get(name: string): RegistryEntry | undefined {\n return this.commands.get(name);\n }\n\n /**\n * Check if a command exists\n */\n has(name: string): boolean {\n return this.commands.has(name);\n }\n\n /**\n * Get all registered commands\n */\n getAll(): RegistryEntry[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * Get available commands (dependencies satisfied)\n */\n getAvailable(): RegistryEntry[] {\n return this.getAll().filter((entry) => entry.metadata.available);\n }\n\n /**\n * Get unavailable commands\n */\n getUnavailable(): RegistryEntry[] {\n return this.getAll().filter((entry) => !entry.metadata.available);\n }\n\n /**\n * Get commands by category\n */\n getByCategory(category: CommandCategory): RegistryEntry[] {\n return this.getAll().filter((entry) => entry.metadata.category === category);\n }\n\n /**\n * Get command names\n */\n getNames(): string[] {\n return Array.from(this.commands.keys());\n }\n\n /**\n * Clear all registered commands\n */\n clear(): void {\n this.commands.clear();\n }\n\n /**\n * Get the number of registered commands\n */\n get size(): number {\n return this.commands.size;\n }\n\n /**\n * Check and update availability for a command metadata\n */\n private checkAvailability(metadata: CommandMetadata): void {\n const missingDeps = this.getMissingDependencies(metadata.dependencies);\n\n if (missingDeps.length > 0) {\n const requiredMissing = missingDeps.filter((d) => d.required);\n if (requiredMissing.length > 0) {\n metadata.available = false;\n metadata.unavailableReason = `Missing required integrations: ${requiredMissing.map((d) => d.type).join(', ')}`;\n } else {\n // Optional deps missing, still available but may degrade\n metadata.available = true;\n }\n } else {\n metadata.available = true;\n delete metadata.unavailableReason;\n }\n }\n\n /**\n * Get missing dependencies\n */\n private getMissingDependencies(dependencies: IntegrationDependency[]): IntegrationDependency[] {\n const factory = this.adapterFactory;\n if (!factory) {\n // No adapter factory, assume all required deps are missing\n return dependencies.filter((d) => d.required);\n }\n\n return dependencies.filter((dep) => !factory.hasIntegration(dep.type));\n }\n\n /**\n * Update availability for all commands\n */\n private updateAvailability(): void {\n for (const entry of this.commands.values()) {\n this.checkAvailability(entry.metadata);\n }\n }\n\n /**\n * Get dependency status for a command\n */\n getDependencyStatus(name: string): {\n satisfied: IntegrationDependency[];\n missing: IntegrationDependency[];\n } | null {\n const entry = this.commands.get(name);\n if (!entry) return null;\n\n const deps = entry.metadata.dependencies;\n const missing = this.getMissingDependencies(deps);\n const satisfied = deps.filter((d) => !missing.includes(d));\n\n return { satisfied, missing };\n }\n}\n\n/**\n * Create a new command registry\n */\nexport function createCommandRegistry(): CommandRegistry {\n return new CommandRegistry();\n}\n\n/**\n * Global command registry instance\n */\nlet globalRegistry: CommandRegistry | null = null;\n\n/**\n * Get or create the global command registry\n */\nexport function getGlobalRegistry(): CommandRegistry {\n if (!globalRegistry) {\n globalRegistry = new CommandRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Reset the global registry (primarily for testing)\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry = null;\n}\n","/**\n * Command Loader\n *\n * Loads commands from markdown files in the coreai/commands/ directory.\n */\n\nimport { promises as fs } from 'fs';\nimport { join, basename, dirname, relative } from 'path';\nimport type {\n CommandMetadata,\n MarkdownCommand,\n CommandCategory,\n IntegrationDependency,\n CommandLoaderOptions,\n CommandLoadResult,\n} from './types.js';\nimport type { AdapterType } from '../adapters/types.js';\n\n/**\n * Frontmatter data from markdown file\n */\ninterface CommandFrontmatter {\n description?: string;\n 'argument-hint'?: string;\n requires?: string[];\n optional?: string[];\n}\n\n/**\n * Parse YAML-like frontmatter from markdown content\n */\nfunction parseFrontmatter(content: string): { frontmatter: CommandFrontmatter; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]*)$/);\n\n if (!match) {\n return { frontmatter: {}, body: content };\n }\n\n const frontmatterText = match[1] ?? '';\n const body = match[2] ?? '';\n\n // Simple YAML-like parsing (key: value)\n const frontmatter: CommandFrontmatter = {};\n const lines = frontmatterText.split(/\\r?\\n/);\n\n for (const line of lines) {\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n\n const key = line.slice(0, colonIndex).trim();\n let value = line.slice(colonIndex + 1).trim();\n\n // Handle arrays (simple format: [item1, item2])\n if (value.startsWith('[') && value.endsWith(']')) {\n const arrayContent = value.slice(1, -1);\n const items = arrayContent.split(',').map((s) => s.trim().replace(/['\"]/g, ''));\n (frontmatter as Record<string, unknown>)[key] = items;\n } else {\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n (frontmatter as Record<string, unknown>)[key] = value;\n }\n }\n\n return { frontmatter, body };\n}\n\n/**\n * Parse markdown sections\n */\nfunction parseSections(body: string): MarkdownCommand['sections'] {\n const sections: MarkdownCommand['sections'] = {};\n\n // Extract title (first h1)\n const titleMatch = body.match(/^#\\s+(.+)$/m);\n if (titleMatch?.[1]) {\n sections.title = titleMatch[1].trim();\n }\n\n // Extract instructions section\n const instructionsMatch = body.match(/##\\s*Instructions?\\s*\\n([\\s\\S]*?)(?=\\n##|$)/i);\n if (instructionsMatch?.[1]) {\n sections.instructions = instructionsMatch[1].trim();\n }\n\n // Extract fallbacks section\n const fallbacksMatch = body.match(/##\\s*Fallbacks?\\s*\\n([\\s\\S]*?)(?=\\n##|$)/i);\n if (fallbacksMatch?.[1]) {\n sections.fallbacks = fallbacksMatch[1].trim();\n }\n\n // Extract output format section\n const outputMatch = body.match(/##\\s*Output\\s*(Format)?\\s*\\n([\\s\\S]*?)(?=\\n##|$)/i);\n if (outputMatch?.[2]) {\n sections.outputFormat = outputMatch[2].trim();\n }\n\n return sections;\n}\n\n/**\n * Map integration name to adapter type\n */\nfunction mapIntegrationToAdapterType(integration: string): AdapterType | null {\n const mapping: Record<string, AdapterType> = {\n // Issue tracker mappings\n jira: 'issue_tracker',\n issue_tracker: 'issue_tracker',\n issues: 'issue_tracker',\n linear: 'issue_tracker',\n github_issues: 'issue_tracker',\n\n // Git provider mappings\n git: 'git',\n github: 'git',\n gitlab: 'git',\n bitbucket: 'git',\n\n // Documentation mappings\n docs: 'documentation',\n documentation: 'documentation',\n confluence: 'documentation',\n notion: 'documentation',\n wiki: 'documentation',\n\n // State mappings\n state: 'state',\n filesystem: 'state',\n };\n\n return mapping[integration.toLowerCase()] ?? null;\n}\n\n/**\n * Parse integration dependencies from frontmatter\n */\nfunction parseDependencies(frontmatter: CommandFrontmatter): IntegrationDependency[] {\n const dependencies: IntegrationDependency[] = [];\n\n // Required dependencies\n if (frontmatter.requires && Array.isArray(frontmatter.requires)) {\n for (const req of frontmatter.requires) {\n const type = mapIntegrationToAdapterType(req);\n if (type) {\n dependencies.push({\n type,\n required: true,\n description: `Requires ${req} integration`,\n });\n }\n }\n }\n\n // Optional dependencies\n if (frontmatter.optional && Array.isArray(frontmatter.optional)) {\n for (const opt of frontmatter.optional) {\n const type = mapIntegrationToAdapterType(opt);\n if (type) {\n dependencies.push({\n type,\n required: false,\n description: `Optionally uses ${opt} integration`,\n });\n }\n }\n }\n\n return dependencies;\n}\n\n/**\n * Derive command name from file path\n */\nfunction deriveCommandName(filePath: string, baseDir: string): string {\n const relativePath = relative(baseDir, filePath);\n const name = basename(filePath, '.md');\n\n // Include parent directory for nested commands (e.g., core/check-inbox -> check-inbox)\n // But not for simple structure\n const dir = dirname(relativePath);\n if (dir === '.' || dir === 'core' || dir === 'optional') {\n return name;\n }\n\n // For deeper nesting, include the subdirectory\n return name;\n}\n\n/**\n * Derive category from file path\n */\nfunction deriveCategoryFromPath(filePath: string, baseDir: string): CommandCategory {\n const relativePath = relative(baseDir, filePath);\n const parts = relativePath.split('/');\n\n if (parts.includes('optional')) {\n return 'optional';\n }\n if (parts.includes('core')) {\n return 'core';\n }\n\n // Default to custom for project-specific commands\n return 'custom';\n}\n\n/**\n * Load a single command from a markdown file\n */\nexport async function loadCommandFromFile(\n filePath: string,\n baseDir: string,\n categoryOverride?: CommandCategory\n): Promise<MarkdownCommand> {\n const content = await fs.readFile(filePath, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n const sections = parseSections(body);\n\n const name = deriveCommandName(filePath, baseDir);\n const category = categoryOverride ?? deriveCategoryFromPath(filePath, baseDir);\n const dependencies = parseDependencies(frontmatter);\n\n const metadata: CommandMetadata = {\n name,\n description: frontmatter.description ?? sections.title ?? name,\n category,\n dependencies,\n sourcePath: filePath,\n available: true, // Will be updated by registry\n };\n if (frontmatter['argument-hint']) {\n metadata.argumentHint = frontmatter['argument-hint'];\n }\n\n return {\n metadata,\n content: body,\n sections,\n };\n}\n\n/**\n * Find all markdown files in a directory\n */\nasync function findMarkdownFiles(dir: string, recursive: boolean): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory() && recursive) {\n const subFiles = await findMarkdownFiles(fullPath, recursive);\n files.push(...subFiles);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n files.push(fullPath);\n }\n }\n } catch (error) {\n // Directory doesn't exist or can't be read\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n return files;\n}\n\n/**\n * Load commands from a directory\n */\nexport async function loadCommandsFromDirectory(\n options: CommandLoaderOptions\n): Promise<CommandLoadResult> {\n const result: CommandLoadResult = {\n loaded: [],\n errors: [],\n };\n\n const files = await findMarkdownFiles(options.directory, options.recursive ?? true);\n\n for (const filePath of files) {\n try {\n const command = await loadCommandFromFile(filePath, options.directory, options.category);\n\n // Apply filter if provided\n if (options.filter && !options.filter(command.metadata)) {\n continue;\n }\n\n result.loaded.push(command);\n } catch (error) {\n result.errors.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n\n/**\n * Load commands from the default CoreAI commands directory\n */\nexport async function loadCoreAICommands(projectRoot: string): Promise<CommandLoadResult> {\n const commandsDir = join(projectRoot, 'coreai', 'commands');\n return loadCommandsFromDirectory({\n directory: commandsDir,\n category: 'core', // Will be overridden by path derivation\n recursive: true,\n });\n}\n\n/**\n * Load commands from both core and custom directories\n */\nexport async function loadAllCommands(\n coreCommandsDir: string,\n customCommandsDir?: string\n): Promise<CommandLoadResult> {\n const result: CommandLoadResult = {\n loaded: [],\n errors: [],\n };\n\n // Load core commands\n const coreResult = await loadCommandsFromDirectory({\n directory: coreCommandsDir,\n category: 'core',\n recursive: true,\n });\n result.loaded.push(...coreResult.loaded);\n result.errors.push(...coreResult.errors);\n\n // Load custom commands if directory specified\n if (customCommandsDir) {\n const customResult = await loadCommandsFromDirectory({\n directory: customCommandsDir,\n category: 'custom',\n recursive: true,\n });\n result.loaded.push(...customResult.loaded);\n result.errors.push(...customResult.errors);\n }\n\n return result;\n}\n","/**\n * Command Runner\n *\n * Executes commands with graceful degradation support.\n */\n\nimport type {\n CommandDefinition,\n CommandResult,\n CommandContext,\n BaseCommandOptions,\n IntegrationDependency,\n} from './types.js';\nimport type { CommandRegistry } from './registry.js';\nimport { createCommandContext, cleanupContext, type CreateContextOptions } from './context.js';\n\n/**\n * Options for running a command\n */\nexport interface RunCommandOptions extends BaseCommandOptions {\n /**\n * Pre-created command context\n */\n context?: CommandContext;\n\n /**\n * Whether to clean up context after execution\n */\n cleanupAfter?: boolean;\n}\n\n/**\n * Run a registered command\n */\nexport async function runCommand<TResult = unknown>(\n registry: CommandRegistry,\n name: string,\n args: string[],\n options: RunCommandOptions = {}\n): Promise<CommandResult<TResult>> {\n const entry = registry.get(name);\n\n if (!entry) {\n return {\n success: false,\n error: `Command not found: ${name}`,\n };\n }\n\n if (!entry.metadata.available) {\n return {\n success: false,\n error: entry.metadata.unavailableReason ?? 'Command is unavailable',\n };\n }\n\n if (!entry.definition) {\n return {\n success: false,\n error: `Command ${name} is a markdown command and cannot be executed programmatically`,\n };\n }\n\n // Create or use provided context\n const contextOptions: CreateContextOptions = {};\n if (options.projectRoot) {\n contextOptions.projectRoot = options.projectRoot;\n }\n const context = options.context ?? createCommandContext(contextOptions);\n\n try {\n const result = (await entry.definition.handler(\n args,\n options,\n context\n )) as CommandResult<TResult>;\n\n // Add skipped steps for optional integrations that aren't available\n if (entry.metadata.dependencies) {\n // Find optional deps that can't be accessed in the current context\n const optionalDeps = entry.metadata.dependencies.filter((d) => !d.required);\n const optionalUnavailable = optionalDeps.filter((d) => !context.hasIntegration(d.type));\n\n if (optionalUnavailable.length > 0) {\n result.skippedSteps = result.skippedSteps ?? [];\n for (const dep of optionalUnavailable) {\n result.skippedSteps.push({\n step: `${dep.type} integration`,\n reason: dep.description ?? `${dep.type} not configured`,\n });\n }\n }\n }\n\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n } finally {\n if (options.cleanupAfter !== false && !options.context) {\n await cleanupContext(context);\n }\n }\n}\n\n/**\n * Execute a step with graceful degradation\n *\n * If the required integration is not available, returns a skip result instead of failing.\n */\nexport async function executeWithDegradation<T>(\n context: CommandContext,\n dependency: IntegrationDependency,\n step: () => Promise<T>,\n fallback?: () => Promise<T>\n): Promise<{ result: T | null; skipped: boolean; reason?: string }> {\n if (!context.hasIntegration(dependency.type)) {\n if (dependency.required) {\n throw new Error(`Required integration missing: ${dependency.type}`);\n }\n\n // Optional integration missing, try fallback or skip\n if (fallback) {\n try {\n const result = await fallback();\n return { result, skipped: false };\n } catch {\n return {\n result: null,\n skipped: true,\n reason: dependency.description ?? `${dependency.type} not available`,\n };\n }\n }\n\n return {\n result: null,\n skipped: true,\n reason: dependency.description ?? `${dependency.type} not available`,\n };\n }\n\n // Integration available, execute step\n const result = await step();\n return { result, skipped: false };\n}\n\n/**\n * Create a command handler with automatic degradation tracking\n */\nexport function createDegradingHandler<TOptions extends BaseCommandOptions, TResult>(\n handler: (\n args: string[],\n options: TOptions,\n context: CommandContext,\n track: StepTracker\n ) => Promise<TResult>\n): CommandDefinition<TOptions, TResult>['handler'] {\n return async (args, options, context) => {\n const tracker = new StepTracker();\n\n try {\n const data = await handler(args, options, context, tracker);\n return {\n success: true,\n data,\n warnings: tracker.warnings,\n skippedSteps: tracker.skippedSteps,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n warnings: tracker.warnings,\n skippedSteps: tracker.skippedSteps,\n };\n }\n };\n}\n\n/**\n * Tracks skipped steps and warnings during command execution\n */\nexport class StepTracker {\n readonly skippedSteps: { step: string; reason: string }[] = [];\n readonly warnings: string[] = [];\n\n /**\n * Record a skipped step\n */\n skip(step: string, reason: string): void {\n this.skippedSteps.push({ step, reason });\n }\n\n /**\n * Record a warning\n */\n warn(message: string): void {\n this.warnings.push(message);\n }\n\n /**\n * Execute a step with optional fallback\n */\n async tryStep<T>(\n stepName: string,\n context: CommandContext,\n dependency: IntegrationDependency,\n step: () => Promise<T>,\n fallback?: () => Promise<T>\n ): Promise<T | null> {\n const result = await executeWithDegradation(context, dependency, step, fallback);\n\n if (result.skipped) {\n this.skip(stepName, result.reason ?? 'Integration not available');\n }\n\n return result.result;\n }\n}\n","/**\n * Skill Generator\n *\n * Generates Claude skills from templates based on project configuration.\n * Skills are output to .claude/commands/ directory.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { join, basename } from 'path';\nimport type { ResolvedCoreAIConfig } from '../config/types.js';\nimport type {\n SkillTemplate,\n SkillVariables,\n GenerateSkillsOptions,\n GenerateSkillsResult,\n GeneratedSkill,\n SkillDependency,\n} from './types.js';\nimport { builtInSkills } from './templates.js';\n\n/**\n * Extract variables from config for template substitution\n */\nexport function extractVariables(config?: ResolvedCoreAIConfig | null): SkillVariables {\n const vars: SkillVariables = {};\n\n if (!config) {\n return vars;\n }\n\n // Project variables\n vars.PROJECT_NAME = config.project.name;\n vars.PROJECT_ROOT = config.project.root;\n if (config.project.type) {\n vars.PROJECT_TYPE = config.project.type;\n }\n\n // Issue tracker variables\n if (config.integrations?.issue_tracker) {\n const tracker = config.integrations.issue_tracker;\n if (tracker.config?.project_key) {\n vars.JIRA_PROJECT = tracker.config.project_key;\n }\n if (tracker.config?.base_url) {\n vars.JIRA_URL = tracker.config.base_url;\n }\n }\n\n // Git variables\n if (config.integrations?.git) {\n const git = config.integrations.git;\n if (git.config?.repo) {\n vars.GITHUB_REPO = git.config.repo;\n }\n if (git.config?.owner) {\n vars.GITHUB_OWNER = git.config.owner;\n }\n if (git.config?.default_branch) {\n vars.DEFAULT_BRANCH = git.config.default_branch;\n }\n }\n\n // Documentation variables\n if (config.integrations?.documentation) {\n const docs = config.integrations.documentation;\n if (docs.config?.space_key) {\n vars.CONFLUENCE_SPACE = docs.config.space_key;\n }\n if (docs.config?.base_url) {\n vars.CONFLUENCE_URL = docs.config.base_url;\n }\n if (docs.config?.base_path) {\n vars.DOCS_PATH = docs.config.base_path;\n }\n }\n\n // Quality gate commands\n if (config.quality_gates) {\n const gates = config.quality_gates;\n // Map common gate names to variables\n const gateMappings: Record<string, keyof SkillVariables> = {\n lint: 'LINT_CMD',\n test: 'TEST_CMD',\n build: 'BUILD_CMD',\n static_analysis: 'STATIC_ANALYSIS_CMD',\n staticAnalysis: 'STATIC_ANALYSIS_CMD',\n };\n\n for (const [gateName, gate] of Object.entries(gates)) {\n const varName = gateMappings[gateName];\n if (varName) {\n vars[varName] = gate.command;\n }\n }\n }\n\n // Tech stack\n if (config.tech_stack?.primary_language) {\n vars.PRIMARY_LANGUAGE = config.tech_stack.primary_language;\n }\n\n return vars;\n}\n\n/**\n * Substitute variables in template content\n */\nexport function substituteVariables(content: string, variables: SkillVariables): string {\n let result = content;\n\n for (const [key, value] of Object.entries(variables)) {\n if (value !== undefined) {\n // Replace {{VARIABLE}} pattern\n const pattern = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n result = result.replace(pattern, value);\n }\n }\n\n return result;\n}\n\n/**\n * Check if a skill's dependencies are satisfied\n */\nexport function checkDependencies(\n skill: SkillTemplate,\n config?: ResolvedCoreAIConfig | null\n): { satisfied: boolean; missing: SkillDependency[] } {\n if (!skill.dependencies || skill.dependencies.length === 0) {\n return { satisfied: true, missing: [] };\n }\n\n const missing: SkillDependency[] = [];\n\n for (const dep of skill.dependencies) {\n if (!dep.required) {\n // Optional dependencies don't block skill generation\n continue;\n }\n\n // Check if the integration is configured\n let hasIntegration = false;\n\n if (config?.integrations) {\n switch (dep.type) {\n case 'issue_tracker':\n hasIntegration = !!config.integrations.issue_tracker;\n break;\n case 'git':\n hasIntegration = !!config.integrations.git;\n break;\n case 'documentation':\n hasIntegration = !!config.integrations.documentation;\n break;\n case 'state':\n hasIntegration = !!config.integrations.state;\n break;\n }\n }\n\n if (!hasIntegration) {\n missing.push(dep);\n }\n }\n\n return {\n satisfied: missing.length === 0,\n missing,\n };\n}\n\n/**\n * Load custom skill templates from a directory\n */\nexport function loadCustomTemplates(templatesDir: string): SkillTemplate[] {\n const templates: SkillTemplate[] = [];\n\n if (!existsSync(templatesDir)) {\n return templates;\n }\n\n const files = readdirSync(templatesDir);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const filePath = join(templatesDir, file);\n const stat = statSync(filePath);\n if (!stat.isFile()) continue;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const template = parseSkillTemplate(file, content);\n templates.push(template);\n } catch {\n // Skip invalid templates\n }\n }\n\n return templates;\n}\n\n/**\n * Parse a skill template from markdown content\n */\nfunction parseSkillTemplate(filename: string, content: string): SkillTemplate {\n const name = basename(filename, '.md');\n\n // Parse frontmatter\n const frontmatterMatch = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]*)$/);\n\n let description = name;\n let argumentHint: string | undefined;\n const dependencies: SkillDependency[] = [];\n\n if (frontmatterMatch) {\n const frontmatter = frontmatterMatch[1] ?? '';\n const lines = frontmatter.split(/\\r?\\n/);\n\n for (const line of lines) {\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n\n const key = line.slice(0, colonIndex).trim();\n let value = line.slice(colonIndex + 1).trim();\n\n // Remove quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n switch (key) {\n case 'description':\n description = value;\n break;\n case 'argument-hint':\n argumentHint = value;\n break;\n case 'requires':\n if (value.startsWith('[') && value.endsWith(']')) {\n const items = value\n .slice(1, -1)\n .split(',')\n .map((s) => s.trim().replace(/['\"]/g, ''));\n for (const item of items) {\n if (item) {\n dependencies.push({\n type: mapIntegrationName(item),\n required: true,\n });\n }\n }\n }\n break;\n case 'optional':\n if (value.startsWith('[') && value.endsWith(']')) {\n const items = value\n .slice(1, -1)\n .split(',')\n .map((s) => s.trim().replace(/['\"]/g, ''));\n for (const item of items) {\n if (item) {\n dependencies.push({\n type: mapIntegrationName(item),\n required: false,\n });\n }\n }\n }\n break;\n }\n }\n }\n\n const template: SkillTemplate = {\n name,\n description,\n category: 'custom',\n content,\n };\n\n if (argumentHint) {\n template.argumentHint = argumentHint;\n }\n\n if (dependencies.length > 0) {\n template.dependencies = dependencies;\n }\n\n return template;\n}\n\n/**\n * Map integration name to adapter type\n */\nfunction mapIntegrationName(name: string): 'issue_tracker' | 'git' | 'documentation' | 'state' {\n const lower = name.toLowerCase();\n\n if (['jira', 'linear', 'issue_tracker', 'issues', 'github-issues'].includes(lower)) {\n return 'issue_tracker';\n }\n if (['git', 'github', 'gitlab', 'bitbucket'].includes(lower)) {\n return 'git';\n }\n if (['docs', 'documentation', 'confluence', 'notion', 'wiki'].includes(lower)) {\n return 'documentation';\n }\n\n return 'state';\n}\n\n/**\n * Generate skills from templates\n */\nexport function generateSkills(\n config: ResolvedCoreAIConfig | undefined,\n options: GenerateSkillsOptions = {}\n): GenerateSkillsResult {\n const projectRoot = options.projectRoot ?? process.cwd();\n const outputDir = options.outputDir ?? join(projectRoot, '.claude', 'commands');\n const includeCoreSkills = options.includeCoreSkills ?? true;\n const includeOptionalSkills = options.includeOptionalSkills ?? true;\n const overwrite = options.overwrite ?? false;\n\n const result: GenerateSkillsResult = {\n generated: [],\n errors: [],\n variables: {},\n };\n\n // Extract variables from config\n const variables = extractVariables(config);\n\n // Merge custom variables\n if (options.variables) {\n Object.assign(variables, options.variables);\n }\n\n result.variables = variables;\n\n // Collect templates to generate\n let templates: SkillTemplate[] = [];\n\n // Add built-in skills\n if (includeCoreSkills) {\n templates.push(...builtInSkills.filter((s) => s.category === 'core'));\n }\n if (includeOptionalSkills) {\n templates.push(...builtInSkills.filter((s) => s.category === 'optional'));\n }\n\n // Add custom templates\n if (options.customTemplatesDir && existsSync(options.customTemplatesDir)) {\n templates.push(...loadCustomTemplates(options.customTemplatesDir));\n }\n\n // Filter to specific skills if requested\n if (options.skills && options.skills.length > 0) {\n const skillsToInclude = options.skills;\n templates = templates.filter((t) => skillsToInclude.includes(t.name));\n }\n\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate each skill\n for (const template of templates) {\n try {\n const generated = generateSkill(template, variables, config, outputDir, overwrite);\n result.generated.push(generated);\n } catch (error) {\n result.errors.push({\n name: template.name,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n\n/**\n * Generate a single skill from a template\n */\nfunction generateSkill(\n template: SkillTemplate,\n variables: SkillVariables,\n config: ResolvedCoreAIConfig | undefined,\n outputDir: string,\n overwrite: boolean\n): GeneratedSkill {\n const outputPath = join(outputDir, `${template.name}.md`);\n\n // Check if file exists and we shouldn't overwrite\n if (existsSync(outputPath) && !overwrite) {\n return {\n name: template.name,\n category: template.category,\n outputPath,\n action: 'skipped',\n skipReason: 'File already exists',\n };\n }\n\n // Check dependencies\n const { satisfied, missing } = checkDependencies(template, config);\n\n if (!satisfied) {\n const missingTypes = missing.map((d) => d.type).join(', ');\n return {\n name: template.name,\n category: template.category,\n outputPath,\n action: 'skipped',\n skipReason: `Missing required integrations: ${missingTypes}`,\n };\n }\n\n // Substitute variables in content\n const content = substituteVariables(template.content, variables);\n\n // Check if content changed (for update vs create)\n const isUpdate = existsSync(outputPath);\n\n // Write the skill file\n writeFileSync(outputPath, content, 'utf-8');\n\n return {\n name: template.name,\n category: template.category,\n outputPath,\n action: isUpdate ? 'updated' : 'created',\n };\n}\n\n/**\n * Format skill generation result for display\n */\nexport function formatGenerateResult(result: GenerateSkillsResult): string {\n const lines: string[] = [];\n\n const created = result.generated.filter((g) => g.action === 'created');\n const updated = result.generated.filter((g) => g.action === 'updated');\n const skipped = result.generated.filter((g) => g.action === 'skipped');\n\n if (created.length > 0) {\n lines.push(`Created ${created.length} skill(s):`);\n for (const skill of created) {\n lines.push(` ✓ ${skill.name}`);\n }\n lines.push('');\n }\n\n if (updated.length > 0) {\n lines.push(`Updated ${updated.length} skill(s):`);\n for (const skill of updated) {\n lines.push(` ✓ ${skill.name}`);\n }\n lines.push('');\n }\n\n if (skipped.length > 0) {\n lines.push(`Skipped ${skipped.length} skill(s):`);\n for (const skill of skipped) {\n lines.push(` - ${skill.name}: ${skill.skipReason}`);\n }\n lines.push('');\n }\n\n if (result.errors.length > 0) {\n lines.push(`Failed to generate ${result.errors.length} skill(s):`);\n for (const error of result.errors) {\n lines.push(` ✗ ${error.name}: ${error.error}`);\n }\n lines.push('');\n }\n\n const total = created.length + updated.length;\n if (total > 0) {\n lines.push(`Generated ${total} skill(s) to .claude/commands/`);\n } else if (result.generated.length === 0 && result.errors.length === 0) {\n lines.push('No skills to generate.');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Built-in Skill Templates\n *\n * Core skill templates that are included with CoreAI.\n * These templates use {{VARIABLE}} placeholders for substitution.\n */\n\nimport type { SkillTemplate } from './types.js';\n\n/**\n * Check inbox skill - process incoming messages\n */\nexport const checkInboxSkill: SkillTemplate = {\n name: 'check-inbox',\n description: 'Check your inbox for pending tasks and messages',\n category: 'core',\n content: `---\ndescription: Check your inbox for pending tasks and messages\n---\n\n# Check Inbox\n\nCheck the inbox at \\`KnowledgeLibrary/{{AGENT_NAME}}/inbox/\\` for new messages.\n\n## Instructions\n\n1. Read all unprocessed messages in the inbox directory\n2. For each message:\n - Parse the frontmatter (type, from, date, priority)\n - Understand the request or task\n - Take appropriate action based on message type\n3. After processing, move message to \\`inbox/processed/\\`\n4. Update your context file at \\`KnowledgeLibrary/{{AGENT_NAME}}/context/current.txt\\`\n\n## Message Types\n\n- **task-assignment**: New work assigned to you\n- **completion-report**: Another agent completed work\n- **review-request**: Code review needed\n- **feedback**: Response to your previous work\n\n## Output Format\n\nReport what messages were processed and actions taken.\n`,\n};\n\n/**\n * Delegate skill - assign tasks to other agents\n */\nexport const delegateSkill: SkillTemplate = {\n name: 'delegate',\n description: 'Delegate a task to another agent via inbox messaging',\n argumentHint: '<task-description> to <agent-name>',\n category: 'core',\n content: `---\ndescription: Delegate a task to another agent via inbox messaging\nargument-hint: <task-description> to <agent-name>\n---\n\n# Delegate Task\n\nDelegate work to another agent using the inbox-based messaging system.\n\n## CRITICAL: Do NOT use the Task tool\n\nAgent-to-agent delegation MUST use file-based messaging, not the Task tool.\nThe Task tool spawns subagents that lose MCP access.\n\n## Instructions\n\n1. Parse the delegation request to identify:\n - The task to delegate\n - The target agent\n\n2. Create a message file in the target agent's inbox:\n - Path: \\`KnowledgeLibrary/<target-agent>/inbox/\\`\n - Filename: \\`YYYYMMDD_HHMM-{{AGENT_NAME}}-<subject>.md\\`\n\n3. Use this message format:\n\\`\\`\\`markdown\n---\ntype: task-assignment\nfrom: {{AGENT_NAME}}\nto: <target-agent>\ndate: YYYY-MM-DD HH:MM\npriority: P2\n---\n\n## Task Assignment\n\n### Description\n<Clear description of what needs to be done>\n\n### Context\n<Any relevant context or background>\n\n### Expected Deliverables\n1. <Deliverable 1>\n2. <Deliverable 2>\n\n### Success Criteria\n- <Criterion 1>\n- <Criterion 2>\n\\`\\`\\`\n\n4. Tell the user to invoke the target agent:\n \"Please invoke @<target-agent> to process this task.\"\n\n## Output\n\nConfirm the delegation message was created and instruct user to invoke the agent.\n`,\n};\n\n/**\n * Git commit skill - quality-gated commits\n */\nexport const gitCommitSkill: SkillTemplate = {\n name: 'git-commit',\n description: 'Create a quality-gated git commit',\n argumentHint: '<commit-message>',\n category: 'core',\n dependencies: [{ type: 'git', required: false, description: 'For commit operations' }],\n content: `---\ndescription: Create a quality-gated git commit\nargument-hint: <commit-message>\noptional: [git]\n---\n\n# Git Commit\n\nCreate a git commit after passing all quality gates.\n\n## Quality Gates\n\nRun these checks before committing:\n\n1. **Lint**: \\`{{LINT_CMD}}\\`\n2. **Tests**: \\`{{TEST_CMD}}\\`\n3. **Build**: \\`{{BUILD_CMD}}\\`\n\n## Instructions\n\n1. Stage the relevant files with \\`git add\\`\n2. Run all quality gate commands\n3. If any gate fails:\n - Fix the issues\n - Re-run the failed gate\n - Continue only when all pass\n4. Create the commit with the provided message\n5. Format: Include ticket reference if applicable\n\n## Commit Message Format\n\n\\`\\`\\`\n<type>(<scope>): <description>\n\n[optional body]\n\n[optional footer]\n\\`\\`\\`\n\nTypes: feat, fix, docs, style, refactor, test, chore\n\n## Fallbacks\n\nIf quality gate commands are not configured:\n- Ask the user what commands to run\n- Or skip gates with user confirmation\n`,\n};\n\n/**\n * PR create skill - create pull requests\n */\nexport const prCreateSkill: SkillTemplate = {\n name: 'pr-create',\n description: 'Create a pull request with proper format',\n argumentHint: '[branch-name]',\n category: 'core',\n dependencies: [{ type: 'git', required: true, description: 'For PR creation' }],\n content: `---\ndescription: Create a pull request with proper format\nargument-hint: [branch-name]\nrequires: [git]\n---\n\n# Create Pull Request\n\nCreate a well-formatted pull request for the current branch.\n\n## Instructions\n\n1. Ensure all changes are committed\n2. Push the branch to remote\n3. Create PR with proper format:\n\n\\`\\`\\`markdown\n## Summary\n<Brief description of changes>\n\n## Changes\n- <Change 1>\n- <Change 2>\n\n## Test Plan\n- [ ] <Test case 1>\n- [ ] <Test case 2>\n\n## Related Issues\nCloses {{JIRA_PROJECT}}-XXX\n\\`\\`\\`\n\n4. Request reviewers if specified\n\n## Using GitHub CLI\n\n\\`\\`\\`bash\ngh pr create --title \"<title>\" --body \"<body>\"\n\\`\\`\\`\n\n## Output\n\nProvide the PR URL and summary of what was created.\n`,\n};\n\n/**\n * Review skill - code review delegation\n */\nexport const reviewSkill: SkillTemplate = {\n name: 'review',\n description: 'Request or perform a code review',\n argumentHint: '<pr-number-or-url>',\n category: 'core',\n dependencies: [{ type: 'git', required: true, description: 'For PR review' }],\n content: `---\ndescription: Request or perform a code review\nargument-hint: <pr-number-or-url>\nrequires: [git]\n---\n\n# Code Review\n\nReview a pull request or delegate review to a specialist.\n\n## Instructions\n\n### If you are reviewing:\n\n1. Fetch the PR details and diff\n2. Review for:\n - Code quality and style\n - Logic errors or bugs\n - Security concerns\n - Test coverage\n - Documentation\n3. Provide feedback with specific line references\n4. Approve, request changes, or comment\n\n### If delegating to a reviewer:\n\n1. Identify the appropriate reviewer based on the changes\n2. Create a review request message in their inbox\n3. Include PR link and context\n\n## Review Checklist\n\n- [ ] Code follows project conventions\n- [ ] No obvious bugs or edge cases\n- [ ] Tests cover the changes\n- [ ] Documentation updated if needed\n- [ ] No security vulnerabilities\n\n## Output\n\nProvide review summary with actionable feedback.\n`,\n};\n\n/**\n * Sprint status skill - check sprint progress\n */\nexport const sprintStatusSkill: SkillTemplate = {\n name: 'sprint-status',\n description: 'Get current sprint status and progress',\n category: 'optional',\n dependencies: [{ type: 'issue_tracker', required: true, description: 'For sprint data' }],\n content: `---\ndescription: Get current sprint status and progress\nrequires: [issue_tracker]\n---\n\n# Sprint Status\n\nGet the current sprint status and team progress.\n\n## Instructions\n\n1. Query the active sprint for project {{JIRA_PROJECT}}\n2. Gather metrics:\n - Total story points committed\n - Points completed\n - Points in progress\n - Points remaining\n3. List tickets by status\n4. Identify blockers or at-risk items\n\n## Output Format\n\n\\`\\`\\`\nSprint: <sprint-name>\nProgress: XX/YY points (ZZ%)\n\n## Completed\n- [{{JIRA_PROJECT}}-123] Task name (3 pts)\n\n## In Progress\n- [{{JIRA_PROJECT}}-124] Task name (5 pts) - @assignee\n\n## To Do\n- [{{JIRA_PROJECT}}-125] Task name (2 pts)\n\n## Blocked\n- [{{JIRA_PROJECT}}-126] Task name - Reason\n\\`\\`\\`\n\n## Fallbacks\n\nIf issue tracker is unavailable:\n- Report that sprint data cannot be fetched\n- Suggest checking the issue tracker directly at {{JIRA_URL}}\n`,\n};\n\n/**\n * Jira create skill - create Jira tickets\n */\nexport const jiraCreateSkill: SkillTemplate = {\n name: 'jira-create',\n description: 'Create a new Jira ticket',\n argumentHint: '<ticket-type> <summary>',\n category: 'optional',\n dependencies: [{ type: 'issue_tracker', required: true, description: 'For ticket creation' }],\n content: `---\ndescription: Create a new Jira ticket\nargument-hint: <ticket-type> <summary>\nrequires: [issue_tracker]\n---\n\n# Create Jira Ticket\n\nCreate a new ticket in project {{JIRA_PROJECT}}.\n\n## Instructions\n\n1. Parse the ticket type and summary from arguments\n2. Gather additional details:\n - Description\n - Priority\n - Labels\n - Components (if applicable)\n3. Create the ticket via the issue tracker integration\n4. Return the ticket key and URL\n\n## Ticket Types\n\n- **Story**: User-facing feature\n- **Bug**: Defect to fix\n- **Task**: Technical work\n- **Spike**: Research/investigation\n\n## Output\n\n\\`\\`\\`\nCreated: {{JIRA_PROJECT}}-XXX\nURL: {{JIRA_URL}}/browse/{{JIRA_PROJECT}}-XXX\nSummary: <summary>\nType: <type>\n\\`\\`\\`\n\n## Fallbacks\n\nIf issue tracker is unavailable:\n- Provide the user with manual creation instructions\n- Include all details they should enter\n`,\n};\n\n/**\n * Jira transition skill - update ticket status\n */\nexport const jiraTransitionSkill: SkillTemplate = {\n name: 'jira-transition',\n description: 'Transition a Jira ticket to a new status',\n argumentHint: '<ticket-key> to <status>',\n category: 'optional',\n dependencies: [{ type: 'issue_tracker', required: true, description: 'For ticket transitions' }],\n content: `---\ndescription: Transition a Jira ticket to a new status\nargument-hint: <ticket-key> to <status>\nrequires: [issue_tracker]\n---\n\n# Transition Jira Ticket\n\nUpdate the status of a ticket in {{JIRA_PROJECT}}.\n\n## Status Mapping\n\n| Workflow Status | Jira Status |\n|-----------------|-------------|\n| BACKLOG | Backlog |\n| IN_PROGRESS | In Progress |\n| PR_CREATED | In Review |\n| IN_REVIEW | In Review |\n| APPROVED | Ready to Merge |\n| MERGED | Done |\n| DONE | Done |\n\n## Instructions\n\n1. Parse ticket key and target status\n2. Validate the transition is allowed\n3. Add a comment explaining the transition\n4. Execute the transition\n\n## Transition Comment Format\n\n\\`\\`\\`\nStatus updated to <status>.\n<optional context about why>\n\\`\\`\\`\n\n## Fallbacks\n\nIf issue tracker is unavailable:\n- Instruct user to manually transition at {{JIRA_URL}}\n- Provide the target status name\n`,\n};\n\n/**\n * Docs update skill - update documentation\n */\nexport const docsUpdateSkill: SkillTemplate = {\n name: 'docs-update',\n description: 'Update project documentation',\n argumentHint: '<doc-path-or-topic>',\n category: 'optional',\n dependencies: [{ type: 'documentation', required: false, description: 'For remote docs' }],\n content: `---\ndescription: Update project documentation\nargument-hint: <doc-path-or-topic>\noptional: [documentation]\n---\n\n# Update Documentation\n\nUpdate project documentation for a specific topic or file.\n\n## Instructions\n\n1. Identify the documentation to update:\n - Local: \\`{{DOCS_PATH}}/\\`\n - Remote: {{CONFLUENCE_SPACE}} (if configured)\n\n2. Make the necessary updates:\n - Keep formatting consistent\n - Update examples if code changed\n - Add/update version information\n\n3. For remote documentation:\n - Use the documentation integration\n - Or provide content for manual update\n\n## Documentation Types\n\n- **README**: Project overview and setup\n- **API Docs**: Endpoint documentation\n- **Architecture**: Design decisions\n- **Runbooks**: Operational procedures\n\n## Fallbacks\n\nIf documentation integration is unavailable:\n- Create/update local markdown files\n- Provide instructions for manual remote update\n`,\n};\n\n/**\n * All built-in skill templates\n */\nexport const builtInSkills: SkillTemplate[] = [\n checkInboxSkill,\n delegateSkill,\n gitCommitSkill,\n prCreateSkill,\n reviewSkill,\n sprintStatusSkill,\n jiraCreateSkill,\n jiraTransitionSkill,\n docsUpdateSkill,\n];\n\n/**\n * Get a skill template by name\n */\nexport function getSkillTemplate(name: string): SkillTemplate | undefined {\n return builtInSkills.find((s) => s.name === name);\n}\n\n/**\n * Get all skill templates of a category\n */\nexport function getSkillsByCategory(category: 'core' | 'optional'): SkillTemplate[] {\n return builtInSkills.filter((s) => s.category === category);\n}\n","/**\n * KnowledgeLibrary Manager\n *\n * Manages the KnowledgeLibrary directory structure and agent state.\n */\n\nimport {\n existsSync,\n mkdirSync,\n writeFileSync,\n readFileSync,\n readdirSync,\n renameSync,\n statSync,\n} from 'fs';\nimport { join, basename } from 'path';\nimport type {\n AgentDirectories,\n AgentKnowledgeState,\n InitKnowledgeLibraryOptions,\n InitKnowledgeLibraryResult,\n KnowledgeLibraryState,\n Message,\n MessageMetadata,\n ReadMessagesOptions,\n WriteMessageOptions,\n AgentContext,\n} from './types.js';\n\n/**\n * Default KnowledgeLibrary base path\n */\nexport const DEFAULT_KNOWLEDGE_LIBRARY_PATH = 'KnowledgeLibrary';\n\n/**\n * Standard files in a KnowledgeLibrary\n */\nexport const STANDARD_FILES = {\n context: 'context.txt',\n architecture: 'architecture.txt',\n prd: 'prd.txt',\n} as const;\n\n/**\n * Standard directories for each agent\n */\nexport const AGENT_DIRECTORIES = [\n 'inbox',\n 'inbox/processed',\n 'outbox',\n 'context',\n 'control',\n 'history',\n 'tech',\n] as const;\n\n/**\n * Standard files in an agent's control directory\n */\nexport const CONTROL_FILES = {\n objectives: 'objectives.txt',\n decisions: 'decisions.txt',\n dependencies: 'dependencies.txt',\n} as const;\n\n/**\n * Get the path to an agent's directories\n */\nexport function getAgentDirectories(basePath: string, agentName: string): AgentDirectories {\n const root = join(basePath, agentName);\n return {\n root,\n inbox: join(root, 'inbox'),\n inboxProcessed: join(root, 'inbox', 'processed'),\n outbox: join(root, 'outbox'),\n context: join(root, 'context'),\n control: join(root, 'control'),\n history: join(root, 'history'),\n tech: join(root, 'tech'),\n };\n}\n\n/**\n * Initialize the KnowledgeLibrary base structure\n */\nexport function initKnowledgeLibrary(\n options: InitKnowledgeLibraryOptions = {}\n): InitKnowledgeLibraryResult {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const createDefaults = options.createDefaults ?? true;\n\n const createdDirs: string[] = [];\n const createdFiles: string[] = [];\n\n try {\n // Create base directory\n if (!existsSync(basePath)) {\n mkdirSync(basePath, { recursive: true });\n createdDirs.push(basePath);\n }\n\n // Create default global files if requested\n if (createDefaults) {\n // context.txt\n const contextPath = join(basePath, STANDARD_FILES.context);\n if (!existsSync(contextPath)) {\n writeFileSync(\n contextPath,\n `# Project Context\n\n## Current Sprint\n- Sprint: [Sprint name/number]\n- Goals: [Sprint goals]\n- Deadline: [Sprint deadline]\n\n## Priorities\n1. [Priority 1]\n2. [Priority 2]\n3. [Priority 3]\n\n## Notes\n[Project-wide notes and context]\n`,\n 'utf-8'\n );\n createdFiles.push(contextPath);\n }\n\n // architecture.txt\n const architecturePath = join(basePath, STANDARD_FILES.architecture);\n if (!existsSync(architecturePath)) {\n writeFileSync(\n architecturePath,\n `# Architecture Notes\n\n## Technical Decisions\n[Record major technical decisions here]\n\n## System Overview\n[High-level system architecture]\n\n## Key Components\n[Important system components]\n`,\n 'utf-8'\n );\n createdFiles.push(architecturePath);\n }\n\n // prd.txt\n const prdPath = join(basePath, STANDARD_FILES.prd);\n if (!existsSync(prdPath)) {\n writeFileSync(\n prdPath,\n `# Product Requirements Document\n\n## Overview\n[Product overview]\n\n## Goals\n[Product goals]\n\n## Features\n[Feature list]\n\n## Requirements\n[Detailed requirements]\n`,\n 'utf-8'\n );\n createdFiles.push(prdPath);\n }\n }\n\n return {\n success: true,\n createdDirs,\n createdFiles,\n };\n } catch (error) {\n return {\n success: false,\n createdDirs,\n createdFiles,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Initialize an agent's KnowledgeLibrary directories\n */\nexport function initAgentKnowledgeLibrary(\n agentName: string,\n options: InitKnowledgeLibraryOptions = {}\n): InitKnowledgeLibraryResult {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const createDefaults = options.createDefaults ?? true;\n\n const createdDirs: string[] = [];\n const createdFiles: string[] = [];\n\n try {\n // Ensure base KnowledgeLibrary exists\n if (!existsSync(basePath)) {\n const baseResult = initKnowledgeLibrary(options);\n if (!baseResult.success) {\n return baseResult;\n }\n createdDirs.push(...baseResult.createdDirs);\n createdFiles.push(...baseResult.createdFiles);\n }\n\n // Get agent directories\n const dirs = getAgentDirectories(basePath, agentName);\n\n // Create all agent directories\n for (const dir of AGENT_DIRECTORIES) {\n const dirPath = join(dirs.root, dir);\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true });\n createdDirs.push(dirPath);\n }\n }\n\n // Create default files if requested\n if (createDefaults) {\n // context/current.txt\n const currentContextPath = join(dirs.context, 'current.txt');\n if (!existsSync(currentContextPath)) {\n writeFileSync(\n currentContextPath,\n `# ${agentName} Current Context\n\n## Status\n- State: idle\n- Current Task: None\n- Last Updated: ${new Date().toISOString()}\n\n## Notes\n[Agent-specific context notes]\n`,\n 'utf-8'\n );\n createdFiles.push(currentContextPath);\n }\n\n // control/objectives.txt\n const objectivesPath = join(dirs.control, CONTROL_FILES.objectives);\n if (!existsSync(objectivesPath)) {\n writeFileSync(\n objectivesPath,\n `# ${agentName} Objectives\n\n## Current Objectives\n[None]\n\n## Success Criteria\n[Define success criteria for objectives]\n`,\n 'utf-8'\n );\n createdFiles.push(objectivesPath);\n }\n\n // control/decisions.txt\n const decisionsPath = join(dirs.control, CONTROL_FILES.decisions);\n if (!existsSync(decisionsPath)) {\n writeFileSync(\n decisionsPath,\n `# ${agentName} Decision Log\n\n## Decisions\n[Record important decisions here]\n\nFormat:\n- Date: YYYY-MM-DD\n- Decision: [What was decided]\n- Reasoning: [Why]\n- Related: [Ticket or task reference]\n`,\n 'utf-8'\n );\n createdFiles.push(decisionsPath);\n }\n\n // control/dependencies.txt\n const dependenciesPath = join(dirs.control, CONTROL_FILES.dependencies);\n if (!existsSync(dependenciesPath)) {\n writeFileSync(\n dependenciesPath,\n `# ${agentName} Dependencies\n\n## Blocked By\n[Tasks/agents blocking this agent]\n\n## Blocking\n[Tasks/agents this agent is blocking]\n\nLast Updated: ${new Date().toISOString()}\n`,\n 'utf-8'\n );\n createdFiles.push(dependenciesPath);\n }\n }\n\n return {\n success: true,\n createdDirs,\n createdFiles,\n };\n } catch (error) {\n return {\n success: false,\n createdDirs,\n createdFiles,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Check if a KnowledgeLibrary exists for an agent\n */\nexport function agentKnowledgeLibraryExists(\n agentName: string,\n options: { projectRoot?: string; basePath?: string } = {}\n): boolean {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const agentRoot = join(basePath, agentName);\n\n return existsSync(agentRoot) && existsSync(join(agentRoot, 'inbox'));\n}\n\n/**\n * Get the KnowledgeLibrary state for an agent\n */\nexport function getAgentKnowledgeState(\n agentName: string,\n options: { projectRoot?: string; basePath?: string } = {}\n): AgentKnowledgeState {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, agentName);\n\n const initialized = agentKnowledgeLibraryExists(agentName, options);\n\n // Get pending messages\n const pendingMessages = initialized ? readInboxMessages(agentName, options) : [];\n\n // Get context\n let context: AgentContext | undefined;\n const currentContextPath = join(dirs.context, 'current.txt');\n if (existsSync(currentContextPath)) {\n const content = readFileSync(currentContextPath, 'utf-8');\n context = parseContextFile(content);\n }\n\n const state: AgentKnowledgeState = {\n agentName,\n directories: dirs,\n pendingMessages,\n initialized,\n };\n\n if (context) {\n state.context = context;\n }\n\n return state;\n}\n\n/**\n * Parse a context file into AgentContext\n */\nfunction parseContextFile(content: string): AgentContext {\n const context: AgentContext = {\n lastUpdated: new Date(),\n };\n\n // Simple parsing - look for key patterns\n const statusMatch = content.match(/State:\\s*(.+)/i);\n if (statusMatch && statusMatch[1]) {\n context.status = statusMatch[1].trim();\n }\n\n const taskMatch = content.match(/Current Task:\\s*(.+)/i);\n if (taskMatch && taskMatch[1] && taskMatch[1].trim() !== 'None') {\n context.currentTask = taskMatch[1].trim();\n }\n\n const ticketMatch = content.match(/Current Ticket:\\s*([A-Z]+-\\d+)/i);\n if (ticketMatch && ticketMatch[1]) {\n context.currentTicket = ticketMatch[1];\n }\n\n const updatedMatch = content.match(/Last Updated:\\s*(.+)/i);\n if (updatedMatch) {\n const dateStr = updatedMatch[1]?.trim();\n if (dateStr) {\n const parsed = new Date(dateStr);\n if (!isNaN(parsed.getTime())) {\n context.lastUpdated = parsed;\n }\n }\n }\n\n return context;\n}\n\n/**\n * Generate a message filename\n */\nexport function generateMessageFilename(from: string, subject: string): string {\n const now = new Date();\n const timestamp = now.toISOString().replace(/[-:T]/g, '').slice(0, 12); // YYYYMMDDHHMM\n const sanitizedSubject = subject\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .slice(0, 30);\n return `${timestamp}-${from}-${sanitizedSubject}.md`;\n}\n\n/**\n * Parse message frontmatter\n */\nfunction parseMessageFrontmatter(content: string): {\n metadata: Partial<MessageMetadata>;\n body: string;\n} {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]*)$/);\n\n if (!match) {\n return { metadata: {}, body: content };\n }\n\n const frontmatter = match[1] ?? '';\n const body = match[2] ?? '';\n const metadata: Partial<MessageMetadata> = {};\n\n for (const line of frontmatter.split(/\\r?\\n/)) {\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n\n switch (key) {\n case 'type':\n metadata.type = value as MessageMetadata['type'];\n break;\n case 'from':\n metadata.from = value;\n break;\n case 'to':\n metadata.to = value;\n break;\n case 'date':\n metadata.date = new Date(value);\n break;\n case 'ticket':\n metadata.ticket = value;\n break;\n case 'priority':\n if (value === 'P0' || value === 'P1' || value === 'P2' || value === 'P3') {\n metadata.priority = value;\n }\n break;\n case 'subject':\n metadata.subject = value;\n break;\n }\n }\n\n return { metadata, body };\n}\n\n/**\n * Read inbox messages for an agent\n */\nexport function readInboxMessages(\n agentName: string,\n options: { projectRoot?: string; basePath?: string } & ReadMessagesOptions = {}\n): Message[] {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, agentName);\n\n const messages: Message[] = [];\n\n // Read inbox\n if (existsSync(dirs.inbox)) {\n const files = readdirSync(dirs.inbox).filter(\n (f) => f.endsWith('.md') && statSync(join(dirs.inbox, f)).isFile()\n );\n\n for (const file of files) {\n const filePath = join(dirs.inbox, file);\n const rawContent = readFileSync(filePath, 'utf-8');\n const { metadata, body } = parseMessageFrontmatter(rawContent);\n\n // Apply filters\n if (options.type && metadata.type !== options.type) continue;\n if (options.from && metadata.from !== options.from) continue;\n if (options.priority && metadata.priority !== options.priority) continue;\n\n messages.push({\n filename: file,\n path: filePath,\n metadata: metadata as MessageMetadata,\n rawContent,\n body,\n });\n }\n }\n\n // Include processed if requested\n if (options.includeProcessed && existsSync(dirs.inboxProcessed)) {\n const files = readdirSync(dirs.inboxProcessed).filter(\n (f) => f.endsWith('.md') && statSync(join(dirs.inboxProcessed, f)).isFile()\n );\n\n for (const file of files) {\n const filePath = join(dirs.inboxProcessed, file);\n const rawContent = readFileSync(filePath, 'utf-8');\n const { metadata, body } = parseMessageFrontmatter(rawContent);\n\n // Apply filters\n if (options.type && metadata.type !== options.type) continue;\n if (options.from && metadata.from !== options.from) continue;\n if (options.priority && metadata.priority !== options.priority) continue;\n\n messages.push({\n filename: file,\n path: filePath,\n metadata: metadata as MessageMetadata,\n rawContent,\n body,\n });\n }\n }\n\n // Sort by date (newest first)\n messages.sort((a, b) => {\n const dateA = a.metadata.date?.getTime() ?? 0;\n const dateB = b.metadata.date?.getTime() ?? 0;\n return dateB - dateA;\n });\n\n // Apply limit\n if (options.limit && messages.length > options.limit) {\n return messages.slice(0, options.limit);\n }\n\n return messages;\n}\n\n/**\n * Write a message to an agent's inbox\n */\nexport function writeInboxMessage(\n options: WriteMessageOptions & { projectRoot?: string; basePath?: string }\n): { success: boolean; path?: string; error?: string } {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, options.to);\n\n try {\n // Ensure agent inbox exists\n if (!existsSync(dirs.inbox)) {\n mkdirSync(dirs.inbox, { recursive: true });\n }\n\n // Generate filename\n const filename = generateMessageFilename(options.from, options.subject);\n const filePath = join(dirs.inbox, filename);\n\n // Format message\n const now = new Date();\n const content = formatMessage(options, now);\n\n // Write file\n writeFileSync(filePath, content, 'utf-8');\n\n // Also copy to sender's outbox\n const senderDirs = getAgentDirectories(basePath, options.from);\n if (existsSync(senderDirs.outbox)) {\n writeFileSync(join(senderDirs.outbox, filename), content, 'utf-8');\n }\n\n return { success: true, path: filePath };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Format a message with frontmatter\n */\nfunction formatMessage(options: WriteMessageOptions, date: Date): string {\n let frontmatter = `---\ntype: ${options.type}\nfrom: ${options.from}\nto: ${options.to}\ndate: ${date.toISOString().slice(0, 16).replace('T', ' ')}`;\n\n if (options.ticket) {\n frontmatter += `\\nticket: ${options.ticket}`;\n }\n\n if (options.priority) {\n frontmatter += `\\npriority: ${options.priority}`;\n }\n\n frontmatter += `\\nsubject: ${options.subject}`;\n\n frontmatter += `\\n---\n\n## ${options.subject}\n\n${options.body}`;\n\n return frontmatter;\n}\n\n/**\n * Mark a message as processed (move to processed folder)\n */\nexport function markMessageProcessed(\n agentName: string,\n messageFilename: string,\n options: { projectRoot?: string; basePath?: string } = {}\n): { success: boolean; error?: string } {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, agentName);\n\n const sourcePath = join(dirs.inbox, messageFilename);\n const destPath = join(dirs.inboxProcessed, messageFilename);\n\n try {\n if (!existsSync(sourcePath)) {\n return { success: false, error: `Message not found: ${messageFilename}` };\n }\n\n if (!existsSync(dirs.inboxProcessed)) {\n mkdirSync(dirs.inboxProcessed, { recursive: true });\n }\n\n renameSync(sourcePath, destPath);\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Get global KnowledgeLibrary state\n */\nexport function getKnowledgeLibraryState(\n options: { projectRoot?: string; basePath?: string } = {}\n): KnowledgeLibraryState | null {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n\n if (!existsSync(basePath)) {\n return null;\n }\n\n // Get list of agents\n const agents: string[] = [];\n const entries = readdirSync(basePath);\n for (const entry of entries) {\n const entryPath = join(basePath, entry);\n if (statSync(entryPath).isDirectory() && existsSync(join(entryPath, 'inbox'))) {\n agents.push(entry);\n }\n }\n\n return {\n basePath,\n contextPath: join(basePath, STANDARD_FILES.context),\n architecturePath: join(basePath, STANDARD_FILES.architecture),\n prdPath: join(basePath, STANDARD_FILES.prd),\n agents,\n };\n}\n\n/**\n * Update agent context\n */\nexport function updateAgentContext(\n agentName: string,\n context: Partial<AgentContext>,\n options: { projectRoot?: string; basePath?: string } = {}\n): { success: boolean; error?: string } {\n const projectRoot = options.projectRoot ?? process.cwd();\n const basePath = join(projectRoot, options.basePath ?? DEFAULT_KNOWLEDGE_LIBRARY_PATH);\n const dirs = getAgentDirectories(basePath, agentName);\n const contextPath = join(dirs.context, 'current.txt');\n\n try {\n const now = new Date();\n const content = `# ${agentName} Current Context\n\n## Status\n- State: ${context.status ?? 'idle'}\n- Current Task: ${context.currentTask ?? 'None'}\n${context.currentTicket ? `- Current Ticket: ${context.currentTicket}` : ''}- Last Updated: ${now.toISOString()}\n\n## Notes\n${context.notes ?? '[Agent-specific context notes]'}\n`;\n\n if (!existsSync(dirs.context)) {\n mkdirSync(dirs.context, { recursive: true });\n }\n\n writeFileSync(contextPath, content, 'utf-8');\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Format KnowledgeLibrary state for display\n */\nexport function formatKnowledgeLibraryState(state: KnowledgeLibraryState | null): string {\n if (!state) {\n return 'KnowledgeLibrary not initialized.';\n }\n\n const lines: string[] = [];\n lines.push(`KnowledgeLibrary: ${state.basePath}\\n`);\n\n lines.push('Global files:');\n lines.push(` - ${basename(state.contextPath)}`);\n lines.push(` - ${basename(state.architecturePath)}`);\n lines.push(` - ${basename(state.prdPath)}`);\n lines.push('');\n\n if (state.agents.length > 0) {\n lines.push(`Agents (${state.agents.length}):`);\n for (const agent of state.agents) {\n lines.push(` - ${agent}`);\n }\n } else {\n lines.push('No agents initialized.');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format agent knowledge state for display\n */\nexport function formatAgentKnowledgeState(state: AgentKnowledgeState): string {\n const lines: string[] = [];\n\n lines.push(`Agent: ${state.agentName}`);\n lines.push(`Status: ${state.initialized ? 'Initialized' : 'Not initialized'}`);\n lines.push('');\n\n if (state.context) {\n lines.push('Context:');\n lines.push(` State: ${state.context.status ?? 'unknown'}`);\n if (state.context.currentTask) {\n lines.push(` Current Task: ${state.context.currentTask}`);\n }\n if (state.context.currentTicket) {\n lines.push(` Current Ticket: ${state.context.currentTicket}`);\n }\n lines.push(` Last Updated: ${state.context.lastUpdated.toISOString()}`);\n lines.push('');\n }\n\n if (state.pendingMessages.length > 0) {\n lines.push(`Pending Messages (${state.pendingMessages.length}):`);\n for (const msg of state.pendingMessages) {\n const type = msg.metadata.type ?? 'unknown';\n const from = msg.metadata.from ?? 'unknown';\n const subject = msg.metadata.subject ?? msg.filename;\n lines.push(` - [${type}] from ${from}: ${subject}`);\n }\n } else {\n lines.push('No pending messages.');\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":["createRequire","require","existsSync","readFileSync","join","parseYaml","Ajv","createRequire","require","existsSync","join","dirname","existsSync","join","dirname","join","dirname","join","dirname","fs","join","basename","dirname","result","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","join","basename","extractVariables","existsSync","readdirSync","join","readFileSync","basename","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","statSync","join","basename","require","createRequire"]}