@fractary/codex 0.5.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/patterns/matcher.ts","../src/sync/directional-patterns.ts","../src/errors/CodexError.ts","../src/errors/ConfigurationError.ts","../src/errors/ValidationError.ts","../src/references/validator.ts","../src/references/parser.ts","../src/references/resolver.ts","../src/types/built-in.ts","../src/types/registry.ts","../src/types/custom.ts","../src/schemas/metadata.ts","../src/schemas/config.ts","../src/core/metadata/parser.ts","../src/core/patterns/index.ts","../src/core/config/organization.ts","../src/core/config/defaults.ts","../src/core/config/loader.ts","../src/core/routing/evaluator.ts","../src/core/custom/destinations.ts","../src/storage/provider.ts","../src/storage/local.ts","../src/storage/github.ts","../src/storage/http.ts","../src/storage/manager.ts","../src/cache/entry.ts","../src/cache/persistence.ts","../src/cache/manager.ts","../src/sync/types.ts","../src/sync/evaluator.ts","../src/sync/planner.ts","../src/sync/routing-scanner.ts","../src/sync/manager.ts","../src/permissions/types.ts","../src/permissions/evaluator.ts","../src/permissions/manager.ts","../src/migration/detector.ts","../src/migration/migrator.ts","../src/migration/references.ts"],"names":["micromatch","path","z","fs","matchFromCodexPattern","firstSlash","matchToCodexPattern","validateRules","defaultManager","parseReference"],"mappings":"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","file":"index.js","sourcesContent":["import micromatch from 'micromatch'\n\n/**\n * Match a pattern against a value using glob syntax\n *\n * Based on SPEC-00003: Pattern Matching\n *\n * @param pattern - Glob pattern (e.g., \"api-*\", \"core-*\")\n * @param value - Value to test (e.g., \"api-gateway\")\n * @returns true if pattern matches value\n */\nexport function matchPattern(pattern: string, value: string): boolean {\n // Special case: exact match\n if (pattern === value) return true\n\n // Use micromatch for glob pattern matching\n return micromatch.isMatch(value, pattern)\n}\n\n/**\n * Check if value matches any pattern in array\n *\n * @param patterns - Array of glob patterns\n * @param value - Value to test\n * @returns true if value matches any pattern\n */\nexport function matchAnyPattern(\n patterns: string[],\n value: string\n): boolean {\n // Special case: [*] matches everything\n if (patterns.length === 1 && patterns[0] === '*') {\n return true\n }\n\n // Empty array matches nothing\n if (patterns.length === 0) {\n return false\n }\n\n // Check each pattern\n return patterns.some(pattern => matchPattern(pattern, value))\n}\n\n/**\n * Filter values that match any pattern\n *\n * @param patterns - Array of glob patterns\n * @param values - Array of values to filter\n * @returns Values that match any pattern\n */\nexport function filterByPatterns(\n patterns: string[],\n values: string[]\n): string[] {\n return values.filter(value => matchAnyPattern(patterns, value))\n}\n\n/**\n * Evaluate include/exclude rules\n *\n * @param options - Evaluation options\n * @returns true if value should be included\n */\nexport function evaluatePatterns(options: {\n value: string\n include?: string[]\n exclude?: string[]\n}): boolean {\n const { value, include = [], exclude = [] } = options\n\n // Check exclusions first (exclusions take priority)\n if (exclude.length > 0 && matchAnyPattern(exclude, value)) {\n return false\n }\n\n // Check inclusions\n if (include.length === 0) {\n // No include patterns = include by default\n return true\n }\n\n return matchAnyPattern(include, value)\n}\n","/**\n * Pattern matching for directional sync (to-codex / from-codex)\n *\n * Provides functions to evaluate if files should sync based on directional\n * sync configuration patterns.\n */\n\nimport { matchPattern } from '../core/patterns/matcher.js'\n\n/**\n * Check if a local file path matches to_codex patterns\n *\n * Used when syncing TO codex to determine which local files should be pushed.\n */\nexport function matchToCodexPattern(filePath: string, patterns: string[]): boolean {\n if (!patterns || patterns.length === 0) {\n return false\n }\n\n return patterns.some((pattern) => matchPattern(pattern, filePath))\n}\n\n/**\n * Check if a codex file path matches from_codex patterns\n *\n * Used when syncing FROM codex to determine which codex files should be pulled.\n * Supports two pattern formats:\n * - \"project-name/path/pattern\" - matches files from specific project\n * - \"path/pattern\" - matches files from target project itself\n */\nexport function matchFromCodexPattern(\n codexFilePath: string,\n patterns: string[],\n targetProject: string\n): boolean {\n if (!patterns || patterns.length === 0) {\n return false\n }\n\n return patterns.some((pattern) => {\n // Special case: patterns starting with \"projects/\" should match directly\n // This handles codex repositories with a projects/ subdirectory structure\n if (pattern.startsWith('projects/')) {\n return matchPattern(pattern, codexFilePath)\n }\n\n // Check if pattern includes a project prefix\n // Project names contain dots (e.g., \"etl.corthion.ai\")\n // Path segments don't (e.g., \"docs\")\n const projectSeparatorIndex = pattern.indexOf('/')\n\n if (projectSeparatorIndex === -1) {\n // No slash - pattern applies to target project only\n const fullPattern = `${targetProject}/${pattern}`\n return matchPattern(fullPattern, codexFilePath)\n }\n\n // Extract first segment before slash\n const firstSegment = pattern.substring(0, projectSeparatorIndex)\n\n // Check if first segment looks like a project name (contains dots)\n if (firstSegment.includes('.')) {\n // Has dots - likely a project name, match directly\n return matchPattern(pattern, codexFilePath)\n } else {\n // No dots - likely a path segment, prepend target project\n const fullPattern = `${targetProject}/${pattern}`\n return matchPattern(fullPattern, codexFilePath)\n }\n })\n}\n\n/**\n * Extract project name from codex file path\n */\nexport function extractProjectFromCodexPath(codexFilePath: string): string | null {\n const firstSlashIndex = codexFilePath.indexOf('/')\n if (firstSlashIndex === -1) {\n return null\n }\n return codexFilePath.substring(0, firstSlashIndex)\n}\n\n/**\n * Get relative path within project from codex file path\n */\nexport function getRelativePath(codexFilePath: string): string | null {\n const firstSlashIndex = codexFilePath.indexOf('/')\n if (firstSlashIndex === -1) {\n return null\n }\n return codexFilePath.substring(firstSlashIndex + 1)\n}\n\n/**\n * Expand placeholders in patterns\n * Supports {project} placeholder which expands to the target project name\n */\nexport function expandPlaceholders(\n patterns: string[] | undefined,\n targetProject: string\n): string[] | undefined {\n if (!patterns) {\n return patterns\n }\n\n return patterns.map((pattern) => pattern.replace(/{project}/g, targetProject))\n}\n","/**\n * Base error class for all Codex SDK errors\n */\nexport class CodexError extends Error {\n constructor(\n message: string,\n options?: ErrorOptions\n ) {\n super(message, options)\n this.name = 'CodexError'\n Object.setPrototypeOf(this, CodexError.prototype)\n }\n}\n","import { CodexError } from './CodexError.js'\n\n/**\n * Error thrown when configuration is missing or invalid\n */\nexport class ConfigurationError extends CodexError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ConfigurationError'\n Object.setPrototypeOf(this, ConfigurationError.prototype)\n }\n}\n","import { CodexError } from './CodexError.js'\n\n/**\n * Error thrown when data validation fails\n */\nexport class ValidationError extends CodexError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n","/**\n * Path validation utilities for codex references\n *\n * Provides security validation to prevent directory traversal attacks\n * and other path-based security issues.\n */\n\nimport path from 'path'\n\n/**\n * Forbidden path patterns that could indicate security issues\n */\nconst FORBIDDEN_PATTERNS = [\n /^\\//, // Absolute paths\n /\\.\\./, // Parent directory traversal\n /^~/, // Home directory expansion\n /\\0/, // Null bytes\n]\n\n/**\n * Forbidden protocol prefixes\n */\nconst FORBIDDEN_PROTOCOLS = ['file:', 'http:', 'https:', 'ftp:', 'data:', 'javascript:']\n\n/**\n * Validate a path component to ensure it's safe\n *\n * @param filePath - The path to validate\n * @returns true if the path is safe, false otherwise\n */\nexport function validatePath(filePath: string): boolean {\n // Empty paths are invalid\n if (!filePath || filePath.trim() === '') {\n return false\n }\n\n // Check for forbidden patterns\n for (const pattern of FORBIDDEN_PATTERNS) {\n if (pattern.test(filePath)) {\n return false\n }\n }\n\n // Check for protocol prefixes\n const lowerPath = filePath.toLowerCase()\n for (const protocol of FORBIDDEN_PROTOCOLS) {\n if (lowerPath.startsWith(protocol)) {\n return false\n }\n }\n\n // Normalize and check for traversal after normalization\n const normalized = path.normalize(filePath)\n if (normalized.startsWith('..') || normalized.includes('/../') || normalized.includes('\\\\..\\\\')) {\n return false\n }\n\n return true\n}\n\n/**\n * Sanitize a path by removing dangerous components\n *\n * @param filePath - The path to sanitize\n * @returns The sanitized path\n */\nexport function sanitizePath(filePath: string): string {\n if (!filePath) {\n return ''\n }\n\n // Remove protocol prefixes\n let sanitized = filePath\n for (const protocol of FORBIDDEN_PROTOCOLS) {\n if (sanitized.toLowerCase().startsWith(protocol)) {\n sanitized = sanitized.slice(protocol.length)\n }\n }\n\n // Remove leading slashes (absolute paths)\n sanitized = sanitized.replace(/^\\/+/, '')\n\n // Remove home directory expansion\n sanitized = sanitized.replace(/^~\\//, '')\n\n // Normalize the path\n sanitized = path.normalize(sanitized)\n\n // Remove any remaining parent directory references\n sanitized = sanitized.replace(/\\.\\.\\//g, '').replace(/\\.\\./g, '')\n\n // Remove leading ./ if present\n sanitized = sanitized.replace(/^\\.\\//, '')\n\n // Remove null bytes\n sanitized = sanitized.replace(/\\0/g, '')\n\n return sanitized\n}\n\n/**\n * Validate an organization name\n *\n * @param org - The organization name to validate\n * @returns true if valid, false otherwise\n */\nexport function validateOrg(org: string): boolean {\n if (!org || org.trim() === '') {\n return false\n }\n\n // Org names should be alphanumeric with hyphens/underscores\n // GitHub org names: 1-39 chars, alphanumeric or hyphen, cannot start/end with hyphen\n const orgPattern = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/\n return orgPattern.test(org) && org.length <= 39\n}\n\n/**\n * Validate a project name\n *\n * @param project - The project name to validate\n * @returns true if valid, false otherwise\n */\nexport function validateProject(project: string): boolean {\n if (!project || project.trim() === '') {\n return false\n }\n\n // Project names should be alphanumeric with hyphens/underscores/dots\n // GitHub repo names: 1-100 chars, alphanumeric, hyphen, underscore, or period\n const projectPattern = /^[a-zA-Z0-9._-]+$/\n return projectPattern.test(project) && project.length <= 100 && !project.includes('..')\n}\n\n/**\n * Validate a complete URI\n *\n * @param uri - The URI to validate\n * @returns true if the URI format is valid\n */\nexport function validateUri(uri: string): boolean {\n if (!uri || !uri.startsWith('codex://')) {\n return false\n }\n\n const pathPart = uri.slice('codex://'.length)\n const parts = pathPart.split('/')\n\n // Must have at least org/project\n if (parts.length < 2) {\n return false\n }\n\n const [org, project, ...rest] = parts\n\n if (!org || !validateOrg(org)) {\n return false\n }\n\n if (!project || !validateProject(project)) {\n return false\n }\n\n // If there's a path, validate it\n if (rest.length > 0) {\n const filePath = rest.join('/')\n if (!validatePath(filePath)) {\n return false\n }\n }\n\n return true\n}\n","/**\n * URI parsing for codex references\n *\n * Parses codex:// URIs into their component parts.\n * URI format: codex://org/project/path/to/file.md\n */\n\nimport { validateUri, validatePath, sanitizePath } from './validator.js'\n\n/**\n * Parsed reference components\n */\nexport interface ParsedReference {\n /** Original URI string */\n uri: string\n /** Organization name */\n org: string\n /** Project/repository name */\n project: string\n /** File path within project (may be empty) */\n path: string\n}\n\n/**\n * Parse options\n */\nexport interface ParseOptions {\n /** Whether to sanitize the path (default: true) */\n sanitize?: boolean\n /** Whether to validate strictly (default: true) */\n strict?: boolean\n}\n\n/**\n * The codex URI prefix\n */\nexport const CODEX_URI_PREFIX = 'codex://'\n\n/**\n * Legacy reference prefix (v2 format)\n */\nexport const LEGACY_REF_PREFIX = '@codex/'\n\n/**\n * Check if a string is a valid codex URI\n *\n * @param uri - The string to check\n * @returns true if it's a valid codex:// URI\n */\nexport function isValidUri(uri: string): boolean {\n return validateUri(uri)\n}\n\n/**\n * Check if a string is a legacy reference format\n *\n * @param ref - The string to check\n * @returns true if it's a legacy @codex/ reference\n */\nexport function isLegacyReference(ref: string): boolean {\n return ref.startsWith(LEGACY_REF_PREFIX)\n}\n\n/**\n * Convert a legacy reference to the new URI format\n *\n * @param ref - Legacy reference (e.g., @codex/project/path)\n * @param defaultOrg - Default organization to use\n * @returns The converted URI or null if invalid\n */\nexport function convertLegacyReference(ref: string, defaultOrg: string): string | null {\n if (!isLegacyReference(ref)) {\n return null\n }\n\n // Remove @codex/ prefix\n const pathPart = ref.slice(LEGACY_REF_PREFIX.length)\n const parts = pathPart.split('/')\n\n if (parts.length < 1 || !parts[0]) {\n return null\n }\n\n // Legacy format: @codex/project/path -> codex://org/project/path\n const project = parts[0]\n const filePath = parts.slice(1).join('/')\n\n if (filePath) {\n return `${CODEX_URI_PREFIX}${defaultOrg}/${project}/${filePath}`\n }\n return `${CODEX_URI_PREFIX}${defaultOrg}/${project}`\n}\n\n/**\n * Parse a codex URI into its components\n *\n * @param uri - The URI to parse (e.g., codex://org/project/path/to/file.md)\n * @param options - Parse options\n * @returns The parsed reference or null if invalid\n */\nexport function parseReference(uri: string, options: ParseOptions = {}): ParsedReference | null {\n const { sanitize = true, strict = true } = options\n\n // Must start with codex://\n if (!uri.startsWith(CODEX_URI_PREFIX)) {\n return null\n }\n\n // Strict validation\n if (strict && !validateUri(uri)) {\n return null\n }\n\n // Extract the path after codex://\n const pathPart = uri.slice(CODEX_URI_PREFIX.length)\n const parts = pathPart.split('/')\n\n // Must have at least org and project\n if (parts.length < 2) {\n return null\n }\n\n const org = parts[0]\n const project = parts[1]\n let filePath = parts.slice(2).join('/')\n\n // Validate org and project are not empty\n if (!org || !project) {\n return null\n }\n\n // Sanitize path if requested\n if (sanitize && filePath) {\n if (!validatePath(filePath)) {\n filePath = sanitizePath(filePath)\n }\n }\n\n return {\n uri,\n org,\n project,\n path: filePath,\n }\n}\n\n/**\n * Build a codex URI from components\n *\n * @param org - Organization name\n * @param project - Project name\n * @param path - Optional file path\n * @returns The constructed URI\n */\nexport function buildUri(org: string, project: string, path?: string): string {\n const base = `${CODEX_URI_PREFIX}${org}/${project}`\n if (path) {\n // Ensure path doesn't start with /\n const cleanPath = path.startsWith('/') ? path.slice(1) : path\n return `${base}/${cleanPath}`\n }\n return base\n}\n\n/**\n * Extract the file extension from a URI\n *\n * @param uri - The URI to extract from\n * @returns The extension (without dot) or empty string\n */\nexport function getExtension(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastDot = parsed.path.lastIndexOf('.')\n if (lastDot === -1 || lastDot === parsed.path.length - 1) {\n return ''\n }\n\n return parsed.path.slice(lastDot + 1).toLowerCase()\n}\n\n/**\n * Get the filename from a URI\n *\n * @param uri - The URI to extract from\n * @returns The filename or empty string\n */\nexport function getFilename(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastSlash = parsed.path.lastIndexOf('/')\n if (lastSlash === -1) {\n return parsed.path\n }\n\n return parsed.path.slice(lastSlash + 1)\n}\n\n/**\n * Get the directory path from a URI\n *\n * @param uri - The URI to extract from\n * @returns The directory path or empty string\n */\nexport function getDirectory(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastSlash = parsed.path.lastIndexOf('/')\n if (lastSlash === -1) {\n return ''\n }\n\n return parsed.path.slice(0, lastSlash)\n}\n","/**\n * URI resolution for codex references\n *\n * Resolves codex:// URIs to filesystem paths, determining whether\n * the reference points to the current project (local file) or\n * needs to be fetched from cache/remote.\n */\n\nimport path from 'path'\nimport { execSync } from 'child_process'\nimport { parseReference, type ParsedReference } from './parser.js'\n\n/**\n * Resolved reference with filesystem paths\n */\nexport interface ResolvedReference extends ParsedReference {\n /** Path in the cache directory */\n cachePath: string\n /** Whether this URI refers to the current project */\n isCurrentProject: boolean\n /** Local filesystem path if current project */\n localPath?: string\n}\n\n/**\n * Options for resolving references\n */\nexport interface ResolveOptions {\n /** Base directory for cache (default: .fractary/codex/cache) */\n cacheDir?: string\n /** Override current organization detection */\n currentOrg?: string\n /** Override current project detection */\n currentProject?: string\n /** Current working directory (for git detection) */\n cwd?: string\n}\n\n/**\n * Default cache directory (v4.0 standard)\n */\nexport const DEFAULT_CACHE_DIR = '.fractary/codex/cache'\n\n/**\n * Detect the current project from git remote\n *\n * @param cwd - Current working directory\n * @returns Object with org and project, or nulls if not detected\n */\nexport function detectCurrentProject(cwd?: string): { org: string | null; project: string | null } {\n try {\n const options = cwd ? { cwd, encoding: 'utf-8' as const } : { encoding: 'utf-8' as const }\n const stdout = execSync('git remote get-url origin', options)\n const url = stdout.toString().trim()\n\n // Parse GitHub URLs (SSH and HTTPS formats)\n // git@github.com:org/repo.git\n // https://github.com/org/repo.git\n // https://github.com/org/repo\n const patterns = [\n /github\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n /gitlab\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n /bitbucket\\.org[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n ]\n\n for (const pattern of patterns) {\n const match = url.match(pattern)\n if (match && match[1] && match[2]) {\n return { org: match[1], project: match[2] }\n }\n }\n } catch {\n // Git not available or not in a git repo\n }\n\n return { org: null, project: null }\n}\n\n/**\n * Get the current organization and project\n *\n * Priority:\n * 1. Explicit options\n * 2. Environment variables (CODEX_CURRENT_ORG, CODEX_CURRENT_PROJECT)\n * 3. Git remote detection\n *\n * @param options - Resolve options\n * @returns Object with org and project\n */\nexport function getCurrentContext(options: ResolveOptions = {}): {\n org: string | null\n project: string | null\n} {\n // Priority 1: Explicit options\n if (options.currentOrg && options.currentProject) {\n return { org: options.currentOrg, project: options.currentProject }\n }\n\n // Priority 2: Environment variables\n const envOrg = process.env.CODEX_CURRENT_ORG\n const envProject = process.env.CODEX_CURRENT_PROJECT\n if (envOrg && envProject) {\n return { org: envOrg, project: envProject }\n }\n\n // Priority 3: Git detection\n return detectCurrentProject(options.cwd)\n}\n\n/**\n * Calculate the cache path for a URI\n *\n * @param org - Organization\n * @param project - Project\n * @param filePath - File path within project\n * @param cacheDir - Base cache directory\n * @returns The cache file path\n */\nexport function calculateCachePath(\n org: string,\n project: string,\n filePath: string,\n cacheDir: string\n): string {\n // Cache structure: {cacheDir}/{org}/{project}/{path}\n return path.join(cacheDir, org, project, filePath)\n}\n\n/**\n * Resolve a codex URI to filesystem paths\n *\n * @param uri - The URI to resolve\n * @param options - Resolution options\n * @returns The resolved reference or null if invalid\n */\nexport function resolveReference(\n uri: string,\n options: ResolveOptions = {}\n): ResolvedReference | null {\n const parsed = parseReference(uri)\n if (!parsed) {\n return null\n }\n\n const cacheDir = options.cacheDir || DEFAULT_CACHE_DIR\n const currentContext = getCurrentContext(options)\n\n // Calculate cache path\n const cachePath = parsed.path\n ? calculateCachePath(parsed.org, parsed.project, parsed.path, cacheDir)\n : path.join(cacheDir, parsed.org, parsed.project)\n\n // Check if this is the current project\n const isCurrentProject =\n currentContext.org === parsed.org && currentContext.project === parsed.project\n\n // Build the resolved reference\n const resolved: ResolvedReference = {\n ...parsed,\n cachePath,\n isCurrentProject,\n }\n\n // If it's the current project and there's a path, provide the local path\n if (isCurrentProject && parsed.path) {\n resolved.localPath = parsed.path\n }\n\n return resolved\n}\n\n/**\n * Resolve multiple URIs at once\n *\n * @param uris - Array of URIs to resolve\n * @param options - Resolution options\n * @returns Array of resolved references (nulls filtered out)\n */\nexport function resolveReferences(\n uris: string[],\n options: ResolveOptions = {}\n): ResolvedReference[] {\n return uris.map((uri) => resolveReference(uri, options)).filter((r): r is ResolvedReference => r !== null)\n}\n\n/**\n * Check if a URI refers to the current project\n *\n * @param uri - The URI to check\n * @param options - Resolution options\n * @returns true if the URI refers to the current project\n */\nexport function isCurrentProjectUri(uri: string, options: ResolveOptions = {}): boolean {\n const resolved = resolveReference(uri, options)\n return resolved?.isCurrentProject ?? false\n}\n\n/**\n * Get the relative cache path for a URI (without the cache directory prefix)\n *\n * @param uri - The URI\n * @returns The relative path or null if invalid\n */\nexport function getRelativeCachePath(uri: string): string | null {\n const parsed = parseReference(uri)\n if (!parsed) {\n return null\n }\n\n if (parsed.path) {\n return path.join(parsed.org, parsed.project, parsed.path)\n }\n return path.join(parsed.org, parsed.project)\n}\n","/**\n * Built-in artifact types for the Codex SDK\n *\n * These types define common artifact categories with default TTLs,\n * archival policies, and pattern matching rules.\n */\n\n/**\n * Artifact type definition\n */\nexport interface ArtifactType {\n /** Unique type name */\n name: string\n /** Human-readable description */\n description: string\n /** Glob patterns to match files of this type */\n patterns: string[]\n /** Default TTL in seconds for cached content */\n defaultTtl: number\n /** Days after which to archive (null = never) */\n archiveAfterDays: number | null\n /** Where to archive (null = don't archive) */\n archiveStorage: 'local' | 'cloud' | 'drive' | null\n /** Patterns for sync operations (optional override) */\n syncPatterns?: string[]\n /** Patterns to exclude from sync */\n excludePatterns?: string[]\n /** Default permissions (optional) */\n permissions?: {\n include: string[]\n exclude: string[]\n }\n}\n\n/**\n * TTL constants in seconds\n */\nexport const TTL = {\n ONE_HOUR: 3600,\n ONE_DAY: 86400,\n ONE_WEEK: 604800,\n TWO_WEEKS: 1209600,\n ONE_MONTH: 2592000,\n ONE_YEAR: 31536000,\n} as const\n\n/**\n * Built-in artifact types\n *\n * These cover common use cases and serve as defaults.\n * Users can override or extend these via configuration.\n */\nexport const BUILT_IN_TYPES: Record<string, ArtifactType> = {\n docs: {\n name: 'docs',\n description: 'Documentation files',\n patterns: ['docs/**', 'README.md', 'CLAUDE.md', '*.md'],\n defaultTtl: TTL.ONE_WEEK,\n archiveAfterDays: 365,\n archiveStorage: 'cloud',\n },\n\n specs: {\n name: 'specs',\n description: 'Technical specifications',\n patterns: ['specs/**', 'SPEC-*.md', '**/specs/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: null, // Never auto-archive specs\n archiveStorage: null,\n },\n\n logs: {\n name: 'logs',\n description: 'Session and workflow logs',\n patterns: ['.fractary/**/logs/**', 'logs/**', '*.log'],\n defaultTtl: TTL.ONE_DAY,\n archiveAfterDays: 30,\n archiveStorage: 'cloud',\n },\n\n standards: {\n name: 'standards',\n description: 'Organization standards and guides',\n patterns: ['standards/**', 'guides/**', '.fractary/standards/**'],\n defaultTtl: TTL.ONE_MONTH,\n archiveAfterDays: null, // Never auto-archive standards\n archiveStorage: null,\n },\n\n templates: {\n name: 'templates',\n description: 'Reusable templates',\n patterns: ['templates/**', '.templates/**', '.fractary/templates/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: 180,\n archiveStorage: 'cloud',\n },\n\n state: {\n name: 'state',\n description: 'Workflow state files',\n patterns: ['.fractary/**/state.json', '.fractary/**/state/**', '**/state.json'],\n defaultTtl: TTL.ONE_HOUR,\n archiveAfterDays: 7,\n archiveStorage: 'local',\n },\n\n config: {\n name: 'config',\n description: 'Configuration files',\n patterns: [\n '.fractary/**/*.json',\n '*.config.js',\n '*.config.ts',\n 'tsconfig.json',\n 'package.json',\n ],\n defaultTtl: TTL.ONE_DAY,\n archiveAfterDays: null,\n archiveStorage: null,\n },\n\n systems: {\n name: 'systems',\n description: 'System definitions',\n patterns: ['.fractary/systems/**', 'systems/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: null,\n archiveStorage: null,\n },\n}\n\n/**\n * Default type to use when no pattern matches\n */\nexport const DEFAULT_TYPE: ArtifactType = {\n name: 'default',\n description: 'Default type for unmatched files',\n patterns: ['**/*'],\n defaultTtl: TTL.ONE_WEEK,\n archiveAfterDays: 90,\n archiveStorage: 'cloud',\n}\n\n/**\n * Get a built-in type by name\n *\n * @param name - Type name\n * @returns The type or undefined\n */\nexport function getBuiltInType(name: string): ArtifactType | undefined {\n return BUILT_IN_TYPES[name]\n}\n\n/**\n * Get all built-in type names\n *\n * @returns Array of type names\n */\nexport function getBuiltInTypeNames(): string[] {\n return Object.keys(BUILT_IN_TYPES)\n}\n\n/**\n * Check if a name is a built-in type\n *\n * @param name - Type name to check\n * @returns true if it's a built-in type\n */\nexport function isBuiltInType(name: string): boolean {\n return name in BUILT_IN_TYPES\n}\n","/**\n * Type registry for artifact types\n *\n * Manages both built-in and custom artifact types, providing\n * type detection, TTL lookup, and registration functionality.\n */\n\nimport micromatch from 'micromatch'\nimport {\n type ArtifactType,\n BUILT_IN_TYPES,\n DEFAULT_TYPE,\n isBuiltInType,\n} from './built-in.js'\n\n/**\n * Options for creating a TypeRegistry\n */\nexport interface TypeRegistryOptions {\n /** Whether to include built-in types (default: true) */\n includeBuiltIn?: boolean\n /** Custom types to register */\n customTypes?: Record<string, Partial<ArtifactType>>\n}\n\n/**\n * Type registry for managing artifact types\n */\nexport class TypeRegistry {\n private types: Map<string, ArtifactType> = new Map()\n private patternCache: Map<string, string> = new Map()\n\n constructor(options: TypeRegistryOptions = {}) {\n const { includeBuiltIn = true, customTypes = {} } = options\n\n // Load built-in types\n if (includeBuiltIn) {\n for (const [name, type] of Object.entries(BUILT_IN_TYPES)) {\n this.types.set(name, type)\n }\n }\n\n // Load custom types\n for (const [name, partialType] of Object.entries(customTypes)) {\n this.register({\n ...DEFAULT_TYPE,\n ...partialType,\n name,\n })\n }\n }\n\n /**\n * Get a type by name\n *\n * Custom types take precedence over built-in types with the same name.\n *\n * @param name - Type name\n * @returns The type or undefined\n */\n get(name: string): ArtifactType | undefined {\n return this.types.get(name)\n }\n\n /**\n * Register a custom type\n *\n * @param type - The type to register\n */\n register(type: ArtifactType): void {\n this.types.set(type.name, type)\n // Clear pattern cache when types change\n this.patternCache.clear()\n }\n\n /**\n * Unregister a type\n *\n * Note: Built-in types can be unregistered but this is not recommended.\n *\n * @param name - Type name to unregister\n * @returns true if the type was removed\n */\n unregister(name: string): boolean {\n const result = this.types.delete(name)\n if (result) {\n this.patternCache.clear()\n }\n return result\n }\n\n /**\n * Check if a type exists\n *\n * @param name - Type name\n * @returns true if the type exists\n */\n has(name: string): boolean {\n return this.types.has(name)\n }\n\n /**\n * List all registered types\n *\n * @returns Array of all types\n */\n list(): ArtifactType[] {\n return Array.from(this.types.values())\n }\n\n /**\n * List all type names\n *\n * @returns Array of type names\n */\n listNames(): string[] {\n return Array.from(this.types.keys())\n }\n\n /**\n * Detect the type of a file based on its path\n *\n * Types are checked in order of specificity (most specific patterns first).\n * Returns 'default' if no type matches.\n *\n * @param filePath - File path to check\n * @returns The detected type name\n */\n detectType(filePath: string): string {\n // Check cache first\n const cached = this.patternCache.get(filePath)\n if (cached) {\n return cached\n }\n\n // Normalize path separators\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Check each type's patterns\n // Sort by pattern specificity (longer patterns first)\n const sortedTypes = this.list().sort((a, b) => {\n const aMaxLen = Math.max(...a.patterns.map((p) => p.length))\n const bMaxLen = Math.max(...b.patterns.map((p) => p.length))\n return bMaxLen - aMaxLen\n })\n\n for (const type of sortedTypes) {\n if (type.name === 'default') continue\n\n for (const pattern of type.patterns) {\n if (micromatch.isMatch(normalizedPath, pattern)) {\n this.patternCache.set(filePath, type.name)\n return type.name\n }\n }\n }\n\n // No match, return default\n this.patternCache.set(filePath, 'default')\n return 'default'\n }\n\n /**\n * Get the TTL for a file based on its type\n *\n * @param filePath - File path\n * @param override - Optional TTL override\n * @returns TTL in seconds\n */\n getTtl(filePath: string, override?: number): number {\n if (override !== undefined) {\n return override\n }\n\n const typeName = this.detectType(filePath)\n const type = this.get(typeName) || DEFAULT_TYPE\n return type.defaultTtl\n }\n\n /**\n * Get archive configuration for a file\n *\n * @param filePath - File path\n * @returns Archive configuration or null if archiving is disabled\n */\n getArchiveConfig(filePath: string): {\n afterDays: number\n storage: 'local' | 'cloud' | 'drive'\n } | null {\n const typeName = this.detectType(filePath)\n const type = this.get(typeName) || DEFAULT_TYPE\n\n if (type.archiveAfterDays === null || type.archiveStorage === null) {\n return null\n }\n\n return {\n afterDays: type.archiveAfterDays,\n storage: type.archiveStorage,\n }\n }\n\n /**\n * Get all files that match a type's patterns\n *\n * @param typeName - Type name\n * @param files - Array of file paths to filter\n * @returns Filtered file paths\n */\n filterByType(typeName: string, files: string[]): string[] {\n const type = this.get(typeName)\n if (!type) {\n return []\n }\n\n return files.filter((file) => {\n const normalized = file.replace(/\\\\/g, '/')\n return type.patterns.some((pattern) => micromatch.isMatch(normalized, pattern))\n })\n }\n\n /**\n * Check if a type is a built-in type\n *\n * @param name - Type name\n * @returns true if it's a built-in type\n */\n isBuiltIn(name: string): boolean {\n return isBuiltInType(name)\n }\n\n /**\n * Get the number of registered types\n */\n get size(): number {\n return this.types.size\n }\n\n /**\n * Clear pattern cache\n *\n * Call this if you need to force re-detection of types.\n */\n clearCache(): void {\n this.patternCache.clear()\n }\n}\n\n/**\n * Create a default TypeRegistry with built-in types\n *\n * @returns A new TypeRegistry instance\n */\nexport function createDefaultRegistry(): TypeRegistry {\n return new TypeRegistry()\n}\n","/**\n * Custom type loading from configuration\n *\n * Loads user-defined artifact types from configuration files\n * and validates them against the type schema.\n */\n\nimport { z } from 'zod'\nimport type { ArtifactType } from './built-in.js'\nimport { DEFAULT_TYPE, TTL } from './built-in.js'\n\n/**\n * Schema for custom type definition in config\n */\nexport const CustomTypeSchema = z.object({\n description: z.string().optional(),\n patterns: z.array(z.string()).min(1),\n defaultTtl: z.number().positive().optional(),\n archiveAfterDays: z.number().positive().nullable().optional(),\n archiveStorage: z.enum(['local', 'cloud', 'drive']).nullable().optional(),\n syncPatterns: z.array(z.string()).optional(),\n excludePatterns: z.array(z.string()).optional(),\n permissions: z\n .object({\n include: z.array(z.string()),\n exclude: z.array(z.string()),\n })\n .optional(),\n})\n\nexport type CustomTypeConfig = z.infer<typeof CustomTypeSchema>\n\n/**\n * Schema for the types section of configuration\n */\nexport const TypesConfigSchema = z.object({\n custom: z.record(z.string(), CustomTypeSchema).optional(),\n})\n\nexport type TypesConfig = z.infer<typeof TypesConfigSchema>\n\n/**\n * Validation result for custom types\n */\nexport interface ValidationResult {\n valid: boolean\n errors: Array<{\n name: string\n field: string\n message: string\n }>\n}\n\n/**\n * Parse a TTL value from config (can be number or string like \"7d\", \"1w\")\n *\n * @param value - TTL value\n * @returns TTL in seconds\n */\nexport function parseTtl(value: string | number): number {\n if (typeof value === 'number') {\n return value\n }\n\n const match = value.match(/^(\\d+)(s|m|h|d|w)$/)\n if (!match || !match[1] || !match[2]) {\n return TTL.ONE_WEEK // Default fallback\n }\n\n const num = parseInt(match[1], 10)\n const unit = match[2]\n\n switch (unit) {\n case 's':\n return num\n case 'm':\n return num * 60\n case 'h':\n return num * 3600\n case 'd':\n return num * 86400\n case 'w':\n return num * 604800\n default:\n return TTL.ONE_WEEK\n }\n}\n\n/**\n * Validate custom types configuration\n *\n * @param config - Types configuration object\n * @returns Validation result\n */\nexport function validateCustomTypes(config: unknown): ValidationResult {\n const result: ValidationResult = {\n valid: true,\n errors: [],\n }\n\n if (!config || typeof config !== 'object') {\n return result // Empty config is valid\n }\n\n const typesConfig = config as Record<string, unknown>\n const customTypes = typesConfig.custom as Record<string, unknown> | undefined\n\n if (!customTypes) {\n return result\n }\n\n for (const [name, typeConfig] of Object.entries(customTypes)) {\n // Validate name\n if (!/^[a-z][a-z0-9_-]*$/.test(name)) {\n result.valid = false\n result.errors.push({\n name,\n field: 'name',\n message: 'Type name must start with a letter and contain only lowercase letters, numbers, hyphens, and underscores',\n })\n }\n\n // Validate config against schema\n const parseResult = CustomTypeSchema.safeParse(typeConfig)\n if (!parseResult.success) {\n result.valid = false\n for (const issue of parseResult.error.issues) {\n result.errors.push({\n name,\n field: issue.path.join('.'),\n message: issue.message,\n })\n }\n }\n }\n\n return result\n}\n\n/**\n * Load custom types from configuration\n *\n * @param config - Types configuration\n * @returns Map of type name to ArtifactType\n */\nexport function loadCustomTypes(config: TypesConfig): Map<string, ArtifactType> {\n const types = new Map<string, ArtifactType>()\n\n if (!config.custom) {\n return types\n }\n\n for (const [name, typeConfig] of Object.entries(config.custom)) {\n const type: ArtifactType = {\n name,\n description: typeConfig.description || `Custom type: ${name}`,\n patterns: typeConfig.patterns,\n defaultTtl: typeConfig.defaultTtl ?? DEFAULT_TYPE.defaultTtl,\n archiveAfterDays: typeConfig.archiveAfterDays ?? DEFAULT_TYPE.archiveAfterDays,\n archiveStorage: typeConfig.archiveStorage ?? DEFAULT_TYPE.archiveStorage,\n syncPatterns: typeConfig.syncPatterns,\n excludePatterns: typeConfig.excludePatterns,\n permissions: typeConfig.permissions,\n }\n\n types.set(name, type)\n }\n\n return types\n}\n\n/**\n * Merge custom types with built-in types\n *\n * Custom types override built-in types with the same name.\n *\n * @param builtIn - Built-in types\n * @param custom - Custom types\n * @returns Merged types\n */\nexport function mergeTypes(\n builtIn: Record<string, ArtifactType>,\n custom: Map<string, ArtifactType>\n): Map<string, ArtifactType> {\n const merged = new Map<string, ArtifactType>()\n\n // Add built-in types first\n for (const [name, type] of Object.entries(builtIn)) {\n merged.set(name, type)\n }\n\n // Override/add custom types\n for (const [name, type] of custom) {\n merged.set(name, type)\n }\n\n return merged\n}\n\n/**\n * Create a partial type definition for extending a built-in type\n *\n * @param baseName - Name of the built-in type to extend\n * @param overrides - Properties to override\n * @returns Partial type definition\n */\nexport function extendType(\n baseName: string,\n overrides: Partial<Omit<ArtifactType, 'name'>>\n): Partial<ArtifactType> {\n return {\n ...overrides,\n name: baseName,\n }\n}\n","import { z } from 'zod'\n\n/**\n * Schema for document frontmatter metadata\n *\n * Based on SPEC-00002: Metadata Parsing\n */\nexport const MetadataSchema = z\n .object({\n // Organizational\n org: z.string().optional(),\n system: z.string().optional(),\n\n // Sync rules\n codex_sync_include: z.array(z.string()).optional(),\n codex_sync_exclude: z.array(z.string()).optional(),\n codex_sync_custom: z.array(z.string()).optional(),\n\n // Metadata\n title: z.string().optional(),\n description: z.string().optional(),\n visibility: z.enum(['public', 'internal', 'private']).optional(),\n audience: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n\n // Timestamps\n created: z.string().optional(), // ISO 8601 date string\n updated: z.string().optional(),\n })\n .passthrough() // Allow additional fields for extensibility\n\nexport type Metadata = z.infer<typeof MetadataSchema>\n","import { z } from 'zod'\n\n/**\n * Schema for auto-sync patterns\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport const AutoSyncPatternSchema = z.object({\n pattern: z.string(),\n include: z.array(z.string()),\n exclude: z.array(z.string()).optional(),\n})\n\nexport type AutoSyncPattern = z.infer<typeof AutoSyncPatternSchema>\n\n/**\n * Schema for sync rules configuration\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport const SyncRulesSchema = z.object({\n autoSyncPatterns: z.array(AutoSyncPatternSchema).optional(),\n preventSelfSync: z.boolean().optional(),\n preventCodexSync: z.boolean().optional(),\n allowProjectOverrides: z.boolean().optional(),\n defaultInclude: z.array(z.string()).optional(),\n defaultExclude: z.array(z.string()).optional(),\n})\n\nexport type SyncRules = z.infer<typeof SyncRulesSchema>\n\n/**\n * Schema for directional sync configuration\n *\n * Defines what files sync TO codex (push) and FROM codex (pull)\n */\nexport const DirectionalSyncSchema = z.object({\n // Patterns for files to push from this project to codex\n to_codex: z.array(z.string()).optional(),\n\n // Patterns for files to pull from codex to this project\n // Format: \"project-name/path/pattern\" or \"project-name/**\"\n from_codex: z.array(z.string()).optional(),\n\n // Org-level defaults (only in codex repository config)\n default_to_codex: z.array(z.string()).optional(),\n default_from_codex: z.array(z.string()).optional(),\n})\n\nexport type DirectionalSync = z.infer<typeof DirectionalSyncSchema>\n\n/**\n * Schema for Codex configuration\n *\n * Based on SPEC-00005: Configuration System\n */\nexport const CodexConfigSchema = z\n .object({\n organizationSlug: z.string(),\n\n directories: z\n .object({\n source: z.string().optional(),\n target: z.string().optional(),\n systems: z.string().optional(),\n })\n .optional(),\n\n rules: SyncRulesSchema.optional(),\n\n // Directional sync configuration\n sync: DirectionalSyncSchema.optional(),\n })\n .strict()\n\nexport type CodexConfig = z.infer<typeof CodexConfigSchema>\n","import yaml from 'js-yaml'\nimport { MetadataSchema, type Metadata } from '../../schemas/metadata.js'\nimport { ValidationError } from '../../errors/index.js'\n\nexport interface ParseMetadataOptions {\n strict?: boolean // Throw on validation errors (default: true)\n normalize?: boolean // Normalize line endings (default: true)\n}\n\nexport interface ParseResult {\n metadata: Metadata\n content: string // Document content without frontmatter\n raw: string // Raw frontmatter block\n}\n\n/**\n * Extracts and parses YAML frontmatter from markdown content\n *\n * Based on SPEC-00002: Metadata Parsing\n *\n * @param content - Markdown file content\n * @param options - Parsing options\n * @returns Parsed metadata and content\n * @throws ValidationError if frontmatter is malformed (in strict mode)\n */\nexport function parseMetadata(\n content: string,\n options: ParseMetadataOptions = {}\n): ParseResult {\n const { strict = true, normalize = true } = options\n\n // Normalize line endings (CRLF → LF)\n const normalizedContent = normalize\n ? content.replace(/\\r\\n/g, '\\n')\n : content\n\n // Extract frontmatter block\n const frontmatterMatch = normalizedContent.match(\n /^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/\n )\n\n if (!frontmatterMatch) {\n // No frontmatter found\n return {\n metadata: {},\n content: normalizedContent,\n raw: '',\n }\n }\n\n const rawFrontmatter = frontmatterMatch[1]!\n const documentContent = frontmatterMatch[2]!\n\n try {\n // Parse YAML\n const parsed = yaml.load(rawFrontmatter) as Record<string, unknown>\n\n // Normalize legacy formats\n const normalized = normalizeLegacyMetadata(parsed)\n\n // Validate against schema\n const metadata = strict\n ? MetadataSchema.parse(normalized)\n : MetadataSchema.safeParse(normalized).data || {}\n\n return {\n metadata,\n content: documentContent,\n raw: rawFrontmatter,\n }\n } catch (error) {\n if (strict) {\n throw new ValidationError(\n `Invalid frontmatter: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error }\n )\n }\n\n // Non-strict mode: return empty metadata\n return {\n metadata: {},\n content: documentContent,\n raw: rawFrontmatter,\n }\n }\n}\n\n/**\n * Normalize legacy frontmatter formats to standard format\n *\n * Handles:\n * - Nested codex.includes → codex_sync_include\n * - Nested codex.excludes → codex_sync_exclude\n * - Flat plural codex_sync_includes → codex_sync_include\n * - Flat plural codex_sync_excludes → codex_sync_exclude\n */\nfunction normalizeLegacyMetadata(parsed: any): any {\n const normalized: any = { ...parsed }\n\n // Handle nested codex.includes → codex_sync_include\n if (parsed.codex?.includes && !parsed.codex_sync_include) {\n normalized.codex_sync_include = parsed.codex.includes\n }\n\n // Handle nested codex.excludes → codex_sync_exclude\n if (parsed.codex?.excludes && !parsed.codex_sync_exclude) {\n normalized.codex_sync_exclude = parsed.codex.excludes\n }\n\n // Handle flat plural codex_sync_includes → codex_sync_include\n if (parsed.codex_sync_includes && !normalized.codex_sync_include) {\n normalized.codex_sync_include = parsed.codex_sync_includes\n }\n\n // Handle flat plural codex_sync_excludes → codex_sync_exclude\n if (parsed.codex_sync_excludes && !normalized.codex_sync_exclude) {\n normalized.codex_sync_exclude = parsed.codex_sync_excludes\n }\n\n return normalized\n}\n\n/**\n * Check if content has frontmatter\n */\nexport function hasFrontmatter(content: string): boolean {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n return /^---\\n[\\s\\S]*?\\n---\\n/.test(normalized)\n}\n\n/**\n * Validate metadata without parsing content\n */\nexport function validateMetadata(\n metadata: unknown\n): { valid: boolean; errors?: string[] } {\n const result = MetadataSchema.safeParse(metadata)\n\n if (result.success) {\n return { valid: true }\n }\n\n return {\n valid: false,\n errors: result.error.issues.map(issue => issue.message),\n }\n}\n\n/**\n * Extract only frontmatter (no validation)\n */\nexport function extractRawFrontmatter(content: string): string | null {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n const match = normalized.match(/^---\\n([\\s\\S]*?)\\n---\\n/)\n return match && match[1] ? match[1] : null\n}\n","export {\n matchPattern,\n matchAnyPattern,\n filterByPatterns,\n evaluatePatterns,\n} from './matcher.js'\n","import { ConfigurationError } from '../../errors/index.js'\n\nexport interface ResolveOrgOptions {\n orgSlug?: string // Explicit org slug\n repoName?: string // Repo name for auto-detection\n autoDetect?: boolean // Enable auto-detection (default: true)\n}\n\n/**\n * Resolve organization slug from multiple sources\n *\n * Based on SPEC-00005: Configuration System\n *\n * Priority:\n * 1. Explicit orgSlug parameter\n * 2. Auto-detect from repoName (if enabled)\n * 3. Environment variable (ORGANIZATION_SLUG or CODEX_ORG_SLUG)\n * 4. Throw ConfigurationError if none found\n *\n * @param options - Resolution options\n * @returns Organization slug\n * @throws ConfigurationError if slug cannot be determined\n */\nexport function resolveOrganization(\n options: ResolveOrgOptions = {}\n): string {\n const { orgSlug, repoName, autoDetect = true } = options\n\n // 1. Explicit parameter\n if (orgSlug) {\n return orgSlug\n }\n\n // 2. Auto-detect from repo name\n if (autoDetect && repoName) {\n const detected = extractOrgFromRepoName(repoName)\n if (detected) {\n return detected\n }\n }\n\n // 3. Environment variables\n const envOrg =\n process.env['ORGANIZATION_SLUG'] || process.env['CODEX_ORG_SLUG']\n\n if (envOrg) {\n return envOrg\n }\n\n // 4. Fail - required parameter missing\n throw new ConfigurationError(\n 'Organization slug could not be determined. ' +\n 'Set ORGANIZATION_SLUG environment variable or pass orgSlug option.'\n )\n}\n\n/**\n * Extract org slug from repo name pattern\n *\n * Patterns:\n * - codex.fractary.com → \"fractary\"\n * - codex.acme.ai → \"acme\"\n * - codex.my-org.io → \"my-org\"\n *\n * @param repoName - Repository name\n * @returns Organization slug or null if pattern doesn't match\n */\nexport function extractOrgFromRepoName(repoName: string): string | null {\n // Pattern: codex.{org}.{tld}\n const match = repoName.match(/^codex\\.([^.]+)\\.[^.]+$/)\n\n if (match && match[1]) {\n return match[1]\n }\n\n return null\n}\n","import type { CodexConfig, SyncRules } from '../../schemas/config.js'\n\n/**\n * Get default directory structure\n *\n * Based on SPEC-00005: Configuration System\n */\nexport function getDefaultDirectories(orgSlug: string) {\n return {\n source: `.${orgSlug}`,\n target: `.${orgSlug}`,\n systems: `.${orgSlug}/systems`,\n }\n}\n\n/**\n * Get default sync rules\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport function getDefaultRules(): SyncRules {\n return {\n autoSyncPatterns: [],\n preventSelfSync: true,\n preventCodexSync: true,\n allowProjectOverrides: true,\n defaultInclude: [],\n defaultExclude: [],\n }\n}\n\n/**\n * Get default configuration\n *\n * @param orgSlug - Organization slug\n * @returns Default CodexConfig\n */\nexport function getDefaultConfig(orgSlug: string): CodexConfig {\n return {\n organizationSlug: orgSlug,\n directories: getDefaultDirectories(orgSlug),\n rules: getDefaultRules(),\n }\n}\n","import {\n CodexConfigSchema,\n type CodexConfig,\n type SyncRules,\n} from '../../schemas/config.js'\nimport { resolveOrganization } from './organization.js'\nimport { getDefaultDirectories, getDefaultRules } from './defaults.js'\n\nexport interface LoadConfigOptions {\n organizationSlug?: string\n repoName?: string\n env?: Record<string, string | undefined> // Environment variables (default: process.env)\n}\n\n/**\n * Load and resolve configuration from all sources\n *\n * Based on SPEC-00005: Configuration System\n *\n * @param options - Loading options\n * @returns Fully resolved configuration\n */\nexport function loadConfig(options: LoadConfigOptions = {}): CodexConfig {\n // 1. Resolve organization slug\n const orgSlug = resolveOrganization({\n orgSlug: options.organizationSlug,\n repoName: options.repoName,\n })\n\n // 2. Build base config with defaults\n let config: Partial<CodexConfig> = {\n organizationSlug: orgSlug,\n directories: getDefaultDirectories(orgSlug),\n rules: getDefaultRules(),\n }\n\n // 3. Apply environment variable overrides\n const envConfig = loadConfigFromEnv(options.env || process.env)\n config = mergeConfigs(config, envConfig)\n\n // 4. Validate final configuration\n return CodexConfigSchema.parse(config)\n}\n\n/**\n * Load configuration from environment variables\n */\nfunction loadConfigFromEnv(\n env: Record<string, string | undefined>\n): Partial<CodexConfig> {\n const config: Partial<CodexConfig> = {}\n\n // Organization\n if (env['ORGANIZATION_SLUG'] || env['CODEX_ORG_SLUG']) {\n config.organizationSlug = env['ORGANIZATION_SLUG'] || env['CODEX_ORG_SLUG']\n }\n\n // Directories\n if (env['CODEX_SOURCE_DIR'] || env['CODEX_TARGET_DIR']) {\n config.directories = {\n source: env['CODEX_SOURCE_DIR'],\n target: env['CODEX_TARGET_DIR'],\n }\n }\n\n // Rules\n const rules: Partial<SyncRules> = {}\n\n if (env['CODEX_PREVENT_SELF_SYNC'] !== undefined) {\n rules.preventSelfSync = env['CODEX_PREVENT_SELF_SYNC'] === 'true'\n }\n\n if (env['CODEX_PREVENT_CODEX_SYNC'] !== undefined) {\n rules.preventCodexSync = env['CODEX_PREVENT_CODEX_SYNC'] === 'true'\n }\n\n if (env['CODEX_ALLOW_PROJECT_OVERRIDES'] !== undefined) {\n rules.allowProjectOverrides =\n env['CODEX_ALLOW_PROJECT_OVERRIDES'] === 'true'\n }\n\n if (Object.keys(rules).length > 0) {\n config.rules = rules\n }\n\n return config\n}\n\n/**\n * Deep merge two configuration objects\n * Later config overrides earlier config\n */\nfunction mergeConfigs(\n base: Partial<CodexConfig>,\n override: Partial<CodexConfig>\n): Partial<CodexConfig> {\n return {\n organizationSlug: override.organizationSlug ?? base.organizationSlug,\n\n directories: {\n ...base.directories,\n ...override.directories,\n },\n\n rules: {\n ...base.rules,\n ...override.rules,\n\n // Arrays are replaced, not merged\n autoSyncPatterns:\n override.rules?.autoSyncPatterns ?? base.rules?.autoSyncPatterns,\n defaultInclude:\n override.rules?.defaultInclude ?? base.rules?.defaultInclude,\n defaultExclude:\n override.rules?.defaultExclude ?? base.rules?.defaultExclude,\n },\n\n // Only include sync if either base or override has sync config\n ...(base.sync || override.sync\n ? {\n sync: {\n ...base.sync,\n ...override.sync,\n\n // Arrays are replaced, not merged\n to_codex: override.sync?.to_codex ?? base.sync?.to_codex,\n from_codex: override.sync?.from_codex ?? base.sync?.from_codex,\n default_to_codex:\n override.sync?.default_to_codex ?? base.sync?.default_to_codex,\n default_from_codex:\n override.sync?.default_from_codex ?? base.sync?.default_from_codex,\n },\n }\n : {}),\n }\n}\n","import type { Metadata } from '../../schemas/metadata.js'\nimport type { SyncRules, AutoSyncPattern } from '../../schemas/config.js'\nimport { matchPattern, evaluatePatterns } from '../patterns/matcher.js'\nimport { getDefaultRules } from '../config/defaults.js'\n\nexport interface ShouldSyncOptions {\n filePath: string // Path to file being evaluated\n fileMetadata: Metadata // Parsed frontmatter from file\n targetRepo: string // Repository to sync to\n sourceRepo: string // Repository file is from\n rules?: SyncRules // Optional routing rules (defaults applied)\n}\n\n/**\n * Determine if a file should be synced to a target repository\n *\n * Based on SPEC-00004: Routing & Distribution\n *\n * @param options - Evaluation options\n * @returns true if file should sync to targetRepo\n */\nexport function shouldSyncToRepo(options: ShouldSyncOptions): boolean {\n const {\n filePath,\n fileMetadata,\n targetRepo,\n sourceRepo,\n rules = getDefaultRules(),\n } = options\n\n // 1. Check special rules first\n const specialRuleResult = evaluateSpecialRules({\n filePath,\n targetRepo,\n sourceRepo,\n rules,\n })\n\n if (specialRuleResult !== null) {\n return specialRuleResult\n }\n\n // 2. Evaluate frontmatter rules\n return evaluateFrontmatterRules({\n metadata: fileMetadata,\n targetRepo,\n allowOverrides: rules.allowProjectOverrides ?? true,\n })\n}\n\n/**\n * Evaluate special routing rules\n *\n * Returns true/false if a special rule matches, null otherwise\n */\nfunction evaluateSpecialRules(options: {\n filePath: string\n targetRepo: string\n sourceRepo: string\n rules: SyncRules\n}): boolean | null {\n const { filePath, targetRepo, sourceRepo, rules } = options\n\n // Rule 1: Auto-sync patterns (highest priority)\n if (rules.autoSyncPatterns?.length) {\n const autoSyncResult = evaluateAutoSyncPatterns(\n filePath,\n targetRepo,\n rules.autoSyncPatterns\n )\n\n if (autoSyncResult !== null) {\n return autoSyncResult\n }\n }\n\n // Rule 2: Prevent self-sync\n if (rules.preventSelfSync) {\n const selfSyncResult = preventSelfSync(filePath, targetRepo, sourceRepo)\n\n if (selfSyncResult !== null) {\n return selfSyncResult\n }\n }\n\n // Rule 3: Prevent codex sync\n if (rules.preventCodexSync) {\n const codexSyncResult = preventCodexSync(targetRepo, sourceRepo)\n\n if (codexSyncResult !== null) {\n return codexSyncResult\n }\n }\n\n // No special rule applies\n return null\n}\n\n/**\n * Evaluate auto-sync patterns\n */\nfunction evaluateAutoSyncPatterns(\n filePath: string,\n targetRepo: string,\n patterns: AutoSyncPattern[]\n): boolean | null {\n for (const autoPattern of patterns) {\n // Check if file matches auto-sync pattern\n if (matchPattern(autoPattern.pattern, filePath)) {\n // File matches - evaluate repo include/exclude\n return evaluatePatterns({\n value: targetRepo,\n include: autoPattern.include,\n ...(autoPattern.exclude && { exclude: autoPattern.exclude }),\n })\n }\n }\n\n // No auto-sync pattern matched\n return null\n}\n\n/**\n * Prevent system files from syncing to their own repository\n */\nfunction preventSelfSync(\n filePath: string,\n targetRepo: string,\n _sourceRepo: string\n): boolean | null {\n // Extract system name from file path\n // Example: \".fractary/systems/api-gateway/docs/README.md\" → \"api-gateway\"\n const systemMatch = filePath.match(/systems\\/([^/]+)\\//)\n\n if (systemMatch && systemMatch[1]) {\n const systemName = systemMatch[1]\n\n if (systemName === targetRepo) {\n // Prevent: Don't sync system files to their own repo\n return false\n }\n }\n\n // Not a system file, or different system\n return null\n}\n\n/**\n * Prevent files from syncing back to the codex repository\n */\nfunction preventCodexSync(\n targetRepo: string,\n sourceRepo: string\n): boolean | null {\n // Detect if target is the codex repo\n const isCodexRepo =\n targetRepo === sourceRepo || targetRepo.startsWith('codex.')\n\n if (isCodexRepo) {\n return false\n }\n\n return null\n}\n\n/**\n * Evaluate frontmatter sync rules\n */\nfunction evaluateFrontmatterRules(options: {\n metadata: Metadata\n targetRepo: string\n allowOverrides: boolean\n}): boolean {\n const { metadata, targetRepo, allowOverrides } = options\n\n // If project overrides disabled, return false (no sync by default)\n if (!allowOverrides) {\n return false\n }\n\n const include = metadata.codex_sync_include || []\n const exclude = metadata.codex_sync_exclude || []\n\n // If no include rules, don't sync (must be explicit)\n if (include.length === 0) {\n return false\n }\n\n // Evaluate include/exclude patterns\n return evaluatePatterns({\n value: targetRepo,\n include,\n exclude,\n })\n}\n\n/**\n * Determine all repos that should receive a file\n *\n * @param options - Evaluation options\n * @returns Array of repository names that should receive this file\n */\nexport function getTargetRepos(options: {\n filePath: string\n fileMetadata: Metadata\n sourceRepo: string\n allRepos: string[]\n rules?: SyncRules\n}): string[] {\n const { filePath, fileMetadata, sourceRepo, allRepos, rules } = options\n\n return allRepos.filter(targetRepo =>\n shouldSyncToRepo({\n filePath,\n fileMetadata,\n targetRepo,\n sourceRepo,\n ...(rules && { rules }),\n })\n )\n}\n","import type { Metadata } from '../../schemas/metadata.js'\nimport { ValidationError } from '../../errors/ValidationError.js'\n\n/**\n * Represents a custom sync destination with repository and path\n */\nexport interface CustomSyncDestination {\n repo: string // Repository identifier (e.g., \"developers.fractary.com\")\n path: string // Target path within repository (e.g., \"src/content/docs/forge/\")\n}\n\n/**\n * Parse a custom destination string in format \"repo:path\"\n *\n * @param value - Custom destination string (e.g., \"developers.fractary.com:src/content/docs/forge/\")\n * @returns Parsed destination object\n * @throws ValidationError if format is invalid\n *\n * @example\n * ```typescript\n * const dest = parseCustomDestination('developers.fractary.com:src/content/docs/forge/')\n * // { repo: 'developers.fractary.com', path: 'src/content/docs/forge/' }\n * ```\n */\nexport function parseCustomDestination(value: string): CustomSyncDestination {\n if (typeof value !== 'string' || !value) {\n throw new ValidationError('Custom destination must be a non-empty string')\n }\n\n const colonIndex = value.indexOf(':')\n\n if (colonIndex === -1) {\n throw new ValidationError(\n `Invalid custom destination format: \"${value}\". Expected format: \"repo:path\"`\n )\n }\n\n const repo = value.substring(0, colonIndex).trim()\n const path = value.substring(colonIndex + 1).trim()\n\n if (!repo) {\n throw new ValidationError(\n `Invalid custom destination: repository name cannot be empty in \"${value}\"`\n )\n }\n\n if (!path) {\n throw new ValidationError(\n `Invalid custom destination: path cannot be empty in \"${value}\"`\n )\n }\n\n return { repo, path }\n}\n\n/**\n * Extract all custom sync destinations from metadata\n *\n * @param metadata - Parsed frontmatter metadata\n * @returns Array of custom sync destinations\n *\n * @example\n * ```typescript\n * const metadata = {\n * codex_sync_custom: [\n * 'developers.fractary.com:src/content/docs/forge/',\n * 'docs.example.com:api/'\n * ]\n * }\n *\n * const destinations = getCustomSyncDestinations(metadata)\n * // [\n * // { repo: 'developers.fractary.com', path: 'src/content/docs/forge/' },\n * // { repo: 'docs.example.com', path: 'api/' }\n * // ]\n * ```\n */\nexport function getCustomSyncDestinations(\n metadata: Metadata\n): CustomSyncDestination[] {\n const customDestinations = metadata.codex_sync_custom\n\n if (!customDestinations || !Array.isArray(customDestinations)) {\n return []\n }\n\n const results: CustomSyncDestination[] = []\n\n for (const destination of customDestinations) {\n try {\n const parsed = parseCustomDestination(destination)\n results.push(parsed)\n } catch (_error) {\n // Skip invalid destinations but preserve valid ones\n // Consumers can validate metadata if they want strict validation\n continue\n }\n }\n\n return results\n}\n","/**\n * Storage provider interface and types\n *\n * Defines the contract for storage providers that can fetch\n * content from various sources (local, GitHub, HTTP, etc.)\n */\n\nimport type { ResolvedReference } from '../references/index.js'\n\n/**\n * Supported storage provider types\n */\nexport type StorageProviderType = 'local' | 'github' | 'http' | 's3' | 'r2' | 'gcs' | 'drive'\n\n/**\n * Result of a fetch operation\n */\nexport interface FetchResult {\n /** Fetched content as Buffer */\n content: Buffer\n /** Content type (MIME type) */\n contentType: string\n /** Content size in bytes */\n size: number\n /** Source identifier (e.g., 'github', 'local') */\n source: string\n /** Optional metadata */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Options for fetch operations\n */\nexport interface FetchOptions {\n /** Timeout in milliseconds */\n timeout?: number\n /** Maximum number of retries */\n maxRetries?: number\n /** Authentication token */\n token?: string\n /** Branch to fetch from (for git-based providers) */\n branch?: string\n /** Whether to follow redirects */\n followRedirects?: boolean\n /** Maximum content size in bytes */\n maxSize?: number\n}\n\n/**\n * Storage provider interface\n *\n * All storage providers must implement this interface.\n */\nexport interface StorageProvider {\n /** Provider name (e.g., 'github', 'local') */\n readonly name: string\n /** Provider type */\n readonly type: StorageProviderType\n\n /**\n * Fetch content for a resolved reference\n *\n * @param reference - The resolved reference to fetch\n * @param options - Fetch options\n * @returns The fetch result\n * @throws Error if fetch fails\n */\n fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult>\n\n /**\n * Check if content exists at the reference\n *\n * @param reference - The resolved reference to check\n * @param options - Fetch options\n * @returns true if content exists\n */\n exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean>\n\n /**\n * Check if this provider can handle the given reference\n *\n * @param reference - The resolved reference\n * @returns true if this provider can handle the reference\n */\n canHandle(reference: ResolvedReference): boolean\n}\n\n/**\n * Storage provider configuration\n */\nexport interface StorageProviderConfig {\n /** Provider type */\n type: StorageProviderType\n /** Provider-specific options */\n options?: Record<string, unknown>\n /** Default timeout */\n timeout?: number\n /** Default max retries */\n maxRetries?: number\n /** Authentication configuration */\n auth?: {\n /** Environment variable containing the token */\n tokenEnv?: string\n /** Static token (not recommended) */\n token?: string\n }\n}\n\n/**\n * Default fetch options\n */\nexport const DEFAULT_FETCH_OPTIONS: Required<FetchOptions> = {\n timeout: 30000, // 30 seconds\n maxRetries: 3,\n token: '',\n branch: 'main',\n followRedirects: true,\n maxSize: 10 * 1024 * 1024, // 10MB\n}\n\n/**\n * Merge fetch options with defaults\n *\n * @param options - User-provided options\n * @returns Merged options with defaults\n */\nexport function mergeFetchOptions(options?: FetchOptions): Required<FetchOptions> {\n return {\n ...DEFAULT_FETCH_OPTIONS,\n ...options,\n }\n}\n\n/**\n * Detect content type from file extension\n *\n * @param path - File path\n * @returns MIME type\n */\nexport function detectContentType(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase()\n\n const mimeTypes: Record<string, string> = {\n md: 'text/markdown',\n markdown: 'text/markdown',\n txt: 'text/plain',\n json: 'application/json',\n yaml: 'application/x-yaml',\n yml: 'application/x-yaml',\n xml: 'application/xml',\n html: 'text/html',\n htm: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'application/typescript',\n py: 'text/x-python',\n rb: 'text/x-ruby',\n go: 'text/x-go',\n rs: 'text/x-rust',\n java: 'text/x-java',\n c: 'text/x-c',\n cpp: 'text/x-c++',\n h: 'text/x-c',\n hpp: 'text/x-c++',\n sh: 'application/x-sh',\n bash: 'application/x-sh',\n zsh: 'application/x-sh',\n pdf: 'application/pdf',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n }\n\n return mimeTypes[ext || ''] || 'application/octet-stream'\n}\n","/**\n * Local filesystem storage provider\n *\n * Fetches content from the local filesystem for current project references.\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating a LocalStorage provider\n */\nexport interface LocalStorageOptions {\n /** Base directory for resolving paths (default: process.cwd()) */\n baseDir?: string\n}\n\n/**\n * Local filesystem storage provider\n *\n * Handles fetching content from the local filesystem for references\n * that point to the current project.\n */\nexport class LocalStorage implements StorageProvider {\n readonly name = 'local'\n readonly type = 'local' as const\n\n private baseDir: string\n\n constructor(options: LocalStorageOptions = {}) {\n this.baseDir = options.baseDir || process.cwd()\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * Local provider handles references that are in the current project\n * and have a local path.\n */\n canHandle(reference: ResolvedReference): boolean {\n return reference.isCurrentProject && !!reference.localPath\n }\n\n /**\n * Fetch content from local filesystem\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n\n if (!reference.localPath) {\n throw new Error(`No local path for reference: ${reference.uri}`)\n }\n\n const fullPath = path.isAbsolute(reference.localPath)\n ? reference.localPath\n : path.join(this.baseDir, reference.localPath)\n\n // Check file exists\n try {\n await fs.access(fullPath)\n } catch {\n throw new Error(`File not found: ${fullPath}`)\n }\n\n // Check file size\n const stats = await fs.stat(fullPath)\n if (stats.size > opts.maxSize) {\n throw new Error(\n `File too large: ${stats.size} bytes (max: ${opts.maxSize} bytes)`\n )\n }\n\n // Read file content\n const content = await fs.readFile(fullPath)\n\n return {\n content,\n contentType: detectContentType(reference.localPath),\n size: content.length,\n source: 'local',\n metadata: {\n path: fullPath,\n mtime: stats.mtime.toISOString(),\n },\n }\n }\n\n /**\n * Check if file exists locally\n */\n async exists(reference: ResolvedReference): Promise<boolean> {\n if (!reference.localPath) {\n return false\n }\n\n const fullPath = path.isAbsolute(reference.localPath)\n ? reference.localPath\n : path.join(this.baseDir, reference.localPath)\n\n try {\n await fs.access(fullPath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Read file content as string\n */\n async readText(filePath: string): Promise<string> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n return fs.readFile(fullPath, 'utf-8')\n }\n\n /**\n * Write content to file\n */\n async write(filePath: string, content: string | Buffer): Promise<void> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(fullPath), { recursive: true })\n\n await fs.writeFile(fullPath, content)\n }\n\n /**\n * Delete a file\n */\n async delete(filePath: string): Promise<boolean> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n try {\n await fs.unlink(fullPath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * List files in a directory\n */\n async list(dirPath: string): Promise<string[]> {\n const fullPath = path.isAbsolute(dirPath)\n ? dirPath\n : path.join(this.baseDir, dirPath)\n\n try {\n const entries = await fs.readdir(fullPath, { withFileTypes: true })\n return entries\n .filter((e) => e.isFile())\n .map((e) => path.join(dirPath, e.name))\n } catch {\n return []\n }\n }\n}\n\n/**\n * Create a LocalStorage provider\n */\nexport function createLocalStorage(options?: LocalStorageOptions): LocalStorage {\n return new LocalStorage(options)\n}\n","/**\n * GitHub storage provider\n *\n * Fetches content from GitHub repositories using the GitHub API\n * or raw content URLs. Supports both public and private repos.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating a GitHub storage provider\n */\nexport interface GitHubStorageOptions {\n /** GitHub API token for authentication */\n token?: string\n /** Environment variable containing the token */\n tokenEnv?: string\n /** Base URL for GitHub API (default: https://api.github.com) */\n apiBaseUrl?: string\n /** Base URL for raw content (default: https://raw.githubusercontent.com) */\n rawBaseUrl?: string\n /** Default branch to use (default: main) */\n defaultBranch?: string\n}\n\n/**\n * GitHub API response for file content\n */\ninterface GitHubContentResponse {\n name: string\n path: string\n sha: string\n size: number\n type: 'file' | 'dir'\n content?: string\n encoding?: string\n download_url?: string\n}\n\n/**\n * GitHub storage provider\n *\n * Handles fetching content from GitHub repositories.\n * Uses raw.githubusercontent.com for public repos and\n * GitHub API for private repos (with authentication).\n */\nexport class GitHubStorage implements StorageProvider {\n readonly name = 'github'\n readonly type = 'github' as const\n\n private apiBaseUrl: string\n private rawBaseUrl: string\n private defaultBranch: string\n private token?: string\n\n constructor(options: GitHubStorageOptions = {}) {\n this.apiBaseUrl = options.apiBaseUrl || 'https://api.github.com'\n this.rawBaseUrl = options.rawBaseUrl || 'https://raw.githubusercontent.com'\n this.defaultBranch = options.defaultBranch || 'main'\n\n // Get token from options or environment\n this.token = options.token || (options.tokenEnv ? process.env[options.tokenEnv] : undefined)\n if (!this.token) {\n // Try common environment variables\n this.token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN\n }\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * GitHub provider handles references that are NOT in the current project\n * (those need to be fetched from GitHub).\n */\n canHandle(reference: ResolvedReference): boolean {\n return !reference.isCurrentProject\n }\n\n /**\n * Fetch content from GitHub\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const token = opts.token || this.token\n const branch = opts.branch || this.defaultBranch\n\n if (!reference.path) {\n throw new Error(`No path specified for reference: ${reference.uri}`)\n }\n\n // Try raw content first (faster, works for public repos)\n try {\n return await this.fetchRaw(reference, branch, opts, token)\n } catch (error) {\n // If raw fetch fails and we have a token, try API\n if (token) {\n return await this.fetchApi(reference, branch, opts, token)\n }\n throw error\n }\n }\n\n /**\n * Fetch using raw.githubusercontent.com\n */\n private async fetchRaw(\n reference: ResolvedReference,\n branch: string,\n opts: Required<FetchOptions>,\n token?: string\n ): Promise<FetchResult> {\n const url = `${this.rawBaseUrl}/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n }\n\n if (token) {\n headers['Authorization'] = `token ${token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), opts.timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n redirect: opts.followRedirects ? 'follow' : 'manual',\n })\n\n if (!response.ok) {\n throw new Error(`GitHub raw fetch failed: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const content = Buffer.from(arrayBuffer)\n\n if (content.length > opts.maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${opts.maxSize} bytes)`)\n }\n\n return {\n content,\n contentType: response.headers.get('content-type') || detectContentType(reference.path),\n size: content.length,\n source: 'github-raw',\n metadata: {\n url,\n branch,\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Fetch using GitHub API (for private repos)\n */\n private async fetchApi(\n reference: ResolvedReference,\n branch: string,\n opts: Required<FetchOptions>,\n token: string\n ): Promise<FetchResult> {\n const url = `${this.apiBaseUrl}/repos/${reference.org}/${reference.project}/contents/${reference.path}?ref=${branch}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n Accept: 'application/vnd.github.v3+json',\n Authorization: `token ${token}`,\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), opts.timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n throw new Error(`GitHub API fetch failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as GitHubContentResponse\n\n if (data.type !== 'file') {\n throw new Error(`Reference is not a file: ${reference.uri}`)\n }\n\n let content: Buffer\n\n if (data.content && data.encoding === 'base64') {\n // Content is base64 encoded in API response\n content = Buffer.from(data.content, 'base64')\n } else if (data.download_url) {\n // Fetch from download URL\n const downloadResponse = await fetch(data.download_url, {\n headers: { 'User-Agent': 'fractary-codex' },\n signal: controller.signal,\n })\n const arrayBuffer = await downloadResponse.arrayBuffer()\n content = Buffer.from(arrayBuffer)\n } else {\n throw new Error(`No content available for: ${reference.uri}`)\n }\n\n if (content.length > opts.maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${opts.maxSize} bytes)`)\n }\n\n return {\n content,\n contentType: detectContentType(reference.path),\n size: content.length,\n source: 'github-api',\n metadata: {\n sha: data.sha,\n url,\n branch,\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Check if file exists on GitHub\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const token = opts.token || this.token\n const branch = opts.branch || this.defaultBranch\n\n if (!reference.path) {\n return false\n }\n\n // Try HEAD request to raw URL\n const url = `${this.rawBaseUrl}/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n }\n\n if (token) {\n headers['Authorization'] = `token ${token}`\n }\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n })\n return response.ok\n } catch {\n return false\n }\n }\n\n /**\n * Get repository metadata\n */\n async getRepoInfo(\n org: string,\n project: string\n ): Promise<{\n defaultBranch: string\n private: boolean\n size: number\n } | null> {\n const url = `${this.apiBaseUrl}/repos/${org}/${project}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n Accept: 'application/vnd.github.v3+json',\n }\n\n if (this.token) {\n headers['Authorization'] = `token ${this.token}`\n }\n\n try {\n const response = await fetch(url, { headers })\n if (!response.ok) {\n return null\n }\n\n const data = (await response.json()) as {\n default_branch: string\n private: boolean\n size: number\n }\n\n return {\n defaultBranch: data.default_branch,\n private: data.private,\n size: data.size,\n }\n } catch {\n return null\n }\n }\n}\n\n/**\n * Create a GitHub storage provider\n */\nexport function createGitHubStorage(options?: GitHubStorageOptions): GitHubStorage {\n return new GitHubStorage(options)\n}\n","/**\n * HTTP storage provider\n *\n * Fetches content from HTTP/HTTPS URLs. Used for external\n * documentation, APIs, and other web resources.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating an HTTP storage provider\n */\nexport interface HttpStorageOptions {\n /** Default timeout in milliseconds */\n timeout?: number\n /** Maximum content size in bytes */\n maxSize?: number\n /** Custom headers to include in requests */\n headers?: Record<string, string>\n /** User agent string */\n userAgent?: string\n}\n\n/**\n * HTTP storage provider\n *\n * Generic provider for fetching content from HTTP/HTTPS URLs.\n * This is a fallback provider for external resources.\n */\nexport class HttpStorage implements StorageProvider {\n readonly name = 'http'\n readonly type = 'http' as const\n\n private defaultTimeout: number\n private defaultMaxSize: number\n private defaultHeaders: Record<string, string>\n\n constructor(options: HttpStorageOptions = {}) {\n this.defaultTimeout = options.timeout || 30000\n this.defaultMaxSize = options.maxSize || 10 * 1024 * 1024 // 10MB\n this.defaultHeaders = {\n 'User-Agent': options.userAgent || 'fractary-codex',\n ...options.headers,\n }\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * HTTP provider is a fallback - it can handle any reference\n * but should have lower priority than specialized providers.\n */\n canHandle(_reference: ResolvedReference): boolean {\n // HTTP provider is a fallback, so it can handle anything\n // but let other providers take precedence\n return true\n }\n\n /**\n * Fetch content from HTTP URL\n *\n * This method constructs a URL from the reference and fetches it.\n * The URL pattern is: https://raw.githubusercontent.com/{org}/{project}/{branch}/{path}\n *\n * For custom URL schemes, use the fetchUrl method directly.\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const branch = opts.branch || 'main'\n\n if (!reference.path) {\n throw new Error(`No path specified for reference: ${reference.uri}`)\n }\n\n // Construct URL (GitHub raw content as default)\n const url = `https://raw.githubusercontent.com/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n return this.fetchUrl(url, opts)\n }\n\n /**\n * Fetch content from any URL\n */\n async fetchUrl(url: string, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const timeout = opts.timeout || this.defaultTimeout\n const maxSize = opts.maxSize || this.defaultMaxSize\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n }\n\n if (opts.token) {\n headers['Authorization'] = `Bearer ${opts.token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n redirect: opts.followRedirects ? 'follow' : 'manual',\n })\n\n if (!response.ok) {\n throw new Error(`HTTP fetch failed: ${response.status} ${response.statusText}`)\n }\n\n // Check content length header first\n const contentLength = response.headers.get('content-length')\n if (contentLength && parseInt(contentLength, 10) > maxSize) {\n throw new Error(`Content too large: ${contentLength} bytes (max: ${maxSize} bytes)`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const content = Buffer.from(arrayBuffer)\n\n if (content.length > maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${maxSize} bytes)`)\n }\n\n // Extract filename from URL for content type detection\n const pathname = new URL(url).pathname\n const filename = pathname.split('/').pop() || ''\n\n return {\n content,\n contentType: response.headers.get('content-type') || detectContentType(filename),\n size: content.length,\n source: 'http',\n metadata: {\n url,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Check if URL exists (HEAD request)\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const branch = opts.branch || 'main'\n\n if (!reference.path) {\n return false\n }\n\n const url = `https://raw.githubusercontent.com/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n return this.urlExists(url, opts)\n }\n\n /**\n * Check if any URL exists\n */\n async urlExists(url: string, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const timeout = opts.timeout || this.defaultTimeout\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n }\n\n if (opts.token) {\n headers['Authorization'] = `Bearer ${opts.token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n signal: controller.signal,\n redirect: 'follow',\n })\n\n return response.ok\n } catch {\n return false\n } finally {\n clearTimeout(timeoutId)\n }\n }\n}\n\n/**\n * Create an HTTP storage provider\n */\nexport function createHttpStorage(options?: HttpStorageOptions): HttpStorage {\n return new HttpStorage(options)\n}\n","/**\n * Storage manager\n *\n * Coordinates multiple storage providers and handles fallback logic.\n * The manager tries providers in priority order until one succeeds.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport { type StorageProvider, type FetchResult, type FetchOptions, type StorageProviderType } from './provider.js'\nimport { LocalStorage, type LocalStorageOptions } from './local.js'\nimport { GitHubStorage, type GitHubStorageOptions } from './github.js'\nimport { HttpStorage, type HttpStorageOptions } from './http.js'\n\n/**\n * Storage manager configuration\n */\nexport interface StorageManagerConfig {\n /** Local storage options */\n local?: LocalStorageOptions\n /** GitHub storage options */\n github?: GitHubStorageOptions\n /** HTTP storage options */\n http?: HttpStorageOptions\n /** Provider priority order */\n priority?: StorageProviderType[]\n /** Whether to enable caching (handled by cache layer, not storage) */\n enableCaching?: boolean\n}\n\n/**\n * Storage manager\n *\n * Manages multiple storage providers and routes fetch requests\n * to the appropriate provider based on reference type and availability.\n */\nexport class StorageManager {\n private providers: Map<StorageProviderType, StorageProvider> = new Map()\n private priority: StorageProviderType[]\n\n constructor(config: StorageManagerConfig = {}) {\n // Initialize default providers\n this.providers.set('local', new LocalStorage(config.local))\n this.providers.set('github', new GitHubStorage(config.github))\n this.providers.set('http', new HttpStorage(config.http))\n\n // Set priority order (local first for current project, then github, then http)\n this.priority = config.priority || ['local', 'github', 'http']\n }\n\n /**\n * Register a custom storage provider\n */\n registerProvider(provider: StorageProvider): void {\n this.providers.set(provider.type, provider)\n }\n\n /**\n * Remove a storage provider\n */\n removeProvider(type: StorageProviderType): boolean {\n return this.providers.delete(type)\n }\n\n /**\n * Get a provider by type\n */\n getProvider(type: StorageProviderType): StorageProvider | undefined {\n return this.providers.get(type)\n }\n\n /**\n * Get all registered providers\n */\n getProviders(): StorageProvider[] {\n return Array.from(this.providers.values())\n }\n\n /**\n * Find the best provider for a reference\n */\n findProvider(reference: ResolvedReference): StorageProvider | null {\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (provider && provider.canHandle(reference)) {\n return provider\n }\n }\n return null\n }\n\n /**\n * Fetch content for a reference\n *\n * Tries providers in priority order until one succeeds.\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const errors: Error[] = []\n\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (!provider || !provider.canHandle(reference)) {\n continue\n }\n\n try {\n return await provider.fetch(reference, options)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n // Continue to next provider\n }\n }\n\n // All providers failed\n if (errors.length === 0) {\n throw new Error(`No provider can handle reference: ${reference.uri}`)\n }\n\n // Throw the first error with context about other failures\n const firstError = errors[0]\n if (firstError) {\n if (errors.length > 1) {\n throw new Error(`All providers failed for ${reference.uri}. First error: ${firstError.message}`)\n }\n throw firstError\n }\n\n throw new Error(`Unknown error fetching ${reference.uri}`)\n }\n\n /**\n * Check if content exists for a reference\n *\n * Returns true if any provider reports the content exists.\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (!provider || !provider.canHandle(reference)) {\n continue\n }\n\n try {\n if (await provider.exists(reference, options)) {\n return true\n }\n } catch {\n // Continue to next provider\n }\n }\n\n return false\n }\n\n /**\n * Fetch content using a specific provider\n */\n async fetchWith(\n type: StorageProviderType,\n reference: ResolvedReference,\n options?: FetchOptions\n ): Promise<FetchResult> {\n const provider = this.providers.get(type)\n if (!provider) {\n throw new Error(`Provider not found: ${type}`)\n }\n\n return provider.fetch(reference, options)\n }\n\n /**\n * Fetch multiple references in parallel\n */\n async fetchMany(\n references: ResolvedReference[],\n options?: FetchOptions\n ): Promise<Map<string, FetchResult | Error>> {\n const results = new Map<string, FetchResult | Error>()\n\n const promises = references.map(async (ref) => {\n try {\n const result = await this.fetch(ref, options)\n results.set(ref.uri, result)\n } catch (error) {\n results.set(ref.uri, error instanceof Error ? error : new Error(String(error)))\n }\n })\n\n await Promise.all(promises)\n return results\n }\n\n /**\n * Get provider status (for diagnostics)\n */\n getStatus(): Array<{\n type: StorageProviderType\n name: string\n priority: number\n }> {\n return this.priority.map((type, index) => {\n const provider = this.providers.get(type)\n return {\n type,\n name: provider?.name || type,\n priority: index,\n }\n })\n }\n}\n\n/**\n * Create a storage manager with default configuration\n */\nexport function createStorageManager(config?: StorageManagerConfig): StorageManager {\n return new StorageManager(config)\n}\n\n/**\n * Default storage manager instance\n */\nlet defaultManager: StorageManager | null = null\n\n/**\n * Get the default storage manager\n */\nexport function getDefaultStorageManager(): StorageManager {\n if (!defaultManager) {\n defaultManager = createStorageManager()\n }\n return defaultManager\n}\n\n/**\n * Set the default storage manager\n */\nexport function setDefaultStorageManager(manager: StorageManager): void {\n defaultManager = manager\n}\n","/**\n * Cache entry types and utilities\n *\n * Defines the structure of cache entries with metadata for\n * TTL management, freshness checking, and content versioning.\n */\n\nimport type { FetchResult } from '../storage/provider.js'\n\n/**\n * Cache entry status\n */\nexport type CacheEntryStatus = 'fresh' | 'stale' | 'expired'\n\n/**\n * Cache entry metadata\n */\nexport interface CacheEntryMetadata {\n /** Original URI */\n uri: string\n /** When the entry was cached */\n cachedAt: number\n /** When the entry expires (timestamp) */\n expiresAt: number\n /** TTL in seconds */\n ttl: number\n /** ETag for conditional requests */\n etag?: string\n /** Last-Modified header value */\n lastModified?: string\n /** Content hash for change detection */\n contentHash: string\n /** Size in bytes */\n size: number\n /** Content type */\n contentType: string\n /** Source provider that fetched the content */\n source: string\n /** Number of times this entry has been accessed */\n accessCount: number\n /** Last access timestamp */\n lastAccessedAt: number\n /** Custom metadata from provider */\n providerMetadata?: Record<string, unknown>\n}\n\n/**\n * Cache entry with content and metadata\n */\nexport interface CacheEntry {\n /** Entry metadata */\n metadata: CacheEntryMetadata\n /** Cached content */\n content: Buffer\n}\n\n/**\n * Serializable cache entry for persistence\n */\nexport interface SerializedCacheEntry {\n /** Entry metadata */\n metadata: CacheEntryMetadata\n /** Content as base64 string */\n content: string\n}\n\n/**\n * Calculate a simple hash for content\n *\n * Uses a fast, non-cryptographic hash suitable for change detection.\n */\nexport function calculateContentHash(content: Buffer): string {\n // Simple FNV-1a hash for speed\n let hash = 2166136261\n for (let i = 0; i < content.length; i++) {\n hash ^= content[i] ?? 0\n hash = Math.imul(hash, 16777619)\n }\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n\n/**\n * Create a new cache entry from fetch result\n */\nexport function createCacheEntry(uri: string, result: FetchResult, ttl: number): CacheEntry {\n const now = Date.now()\n\n const metadata: CacheEntryMetadata = {\n uri,\n cachedAt: now,\n expiresAt: now + ttl * 1000,\n ttl,\n contentHash: calculateContentHash(result.content),\n size: result.size,\n contentType: result.contentType,\n source: result.source,\n accessCount: 1,\n lastAccessedAt: now,\n providerMetadata: result.metadata,\n }\n\n // Extract ETag and Last-Modified from provider metadata if available\n if (result.metadata?.etag && typeof result.metadata.etag === 'string') {\n metadata.etag = result.metadata.etag\n }\n if (result.metadata?.lastModified && typeof result.metadata.lastModified === 'string') {\n metadata.lastModified = result.metadata.lastModified\n }\n\n return {\n metadata,\n content: result.content,\n }\n}\n\n/**\n * Get the status of a cache entry\n */\nexport function getCacheEntryStatus(entry: CacheEntry): CacheEntryStatus {\n const now = Date.now()\n\n if (now < entry.metadata.expiresAt) {\n return 'fresh'\n }\n\n // Consider stale for up to 5 minutes past expiry\n const staleWindow = 5 * 60 * 1000\n if (now < entry.metadata.expiresAt + staleWindow) {\n return 'stale'\n }\n\n return 'expired'\n}\n\n/**\n * Check if entry is still valid (fresh or stale)\n */\nexport function isCacheEntryValid(entry: CacheEntry): boolean {\n const status = getCacheEntryStatus(entry)\n return status === 'fresh' || status === 'stale'\n}\n\n/**\n * Check if entry is fresh (not expired)\n */\nexport function isCacheEntryFresh(entry: CacheEntry): boolean {\n return getCacheEntryStatus(entry) === 'fresh'\n}\n\n/**\n * Update entry access statistics\n */\nexport function touchCacheEntry(entry: CacheEntry): void {\n entry.metadata.accessCount++\n entry.metadata.lastAccessedAt = Date.now()\n}\n\n/**\n * Serialize cache entry for persistence\n */\nexport function serializeCacheEntry(entry: CacheEntry): SerializedCacheEntry {\n return {\n metadata: entry.metadata,\n content: entry.content.toString('base64'),\n }\n}\n\n/**\n * Deserialize cache entry from persistence\n */\nexport function deserializeCacheEntry(serialized: SerializedCacheEntry): CacheEntry {\n return {\n metadata: serialized.metadata,\n content: Buffer.from(serialized.content, 'base64'),\n }\n}\n\n/**\n * Calculate remaining TTL in seconds\n */\nexport function getRemainingTtl(entry: CacheEntry): number {\n const remaining = entry.metadata.expiresAt - Date.now()\n return Math.max(0, Math.floor(remaining / 1000))\n}\n\n/**\n * Check if content has changed based on hash\n */\nexport function hasContentChanged(entry: CacheEntry, newContent: Buffer): boolean {\n return entry.metadata.contentHash !== calculateContentHash(newContent)\n}\n\n/**\n * Get entry age in seconds\n */\nexport function getCacheEntryAge(entry: CacheEntry): number {\n return Math.floor((Date.now() - entry.metadata.cachedAt) / 1000)\n}\n","/**\n * Cache persistence layer\n *\n * Handles reading and writing cache entries to disk with\n * atomic writes and corruption detection.\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { CacheEntry } from './entry.js'\n\n/**\n * Options for cache persistence\n */\nexport interface CachePersistenceOptions {\n /** Base directory for cache storage */\n cacheDir: string\n /** File extension for cache files */\n extension?: string\n /** Whether to use atomic writes */\n atomicWrites?: boolean\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /** Total number of entries */\n entryCount: number\n /** Total size in bytes */\n totalSize: number\n /** Number of fresh entries */\n freshCount: number\n /** Number of stale entries */\n staleCount: number\n /** Number of expired entries */\n expiredCount: number\n}\n\n/**\n * Cache persistence layer\n *\n * Handles reading and writing cache entries to the filesystem.\n * Uses a directory structure: {cacheDir}/{org}/{project}/{path}.cache\n */\nexport class CachePersistence {\n private cacheDir: string\n private extension: string\n private atomicWrites: boolean\n\n constructor(options: CachePersistenceOptions) {\n this.cacheDir = options.cacheDir\n this.extension = options.extension || '.cache'\n this.atomicWrites = options.atomicWrites ?? true\n }\n\n /**\n * Get the cache file path for a URI\n */\n getCachePath(uri: string): string {\n // Parse the URI to extract org/project/path\n const match = uri.match(/^codex:\\/\\/([^/]+)\\/([^/]+)(?:\\/(.*))?$/)\n if (!match || !match[1] || !match[2]) {\n throw new Error(`Invalid codex URI: ${uri}`)\n }\n\n const [, org, project, filePath] = match\n const relativePath = filePath || 'index'\n\n return path.join(this.cacheDir, org, project, relativePath + this.extension)\n }\n\n /**\n * Get the metadata file path for a URI\n */\n getMetadataPath(uri: string): string {\n return this.getCachePath(uri).replace(this.extension, '.meta.json')\n }\n\n /**\n * Read a cache entry from disk\n */\n async read(uri: string): Promise<CacheEntry | null> {\n const cachePath = this.getCachePath(uri)\n const metadataPath = this.getMetadataPath(uri)\n\n try {\n // Read metadata and content in parallel\n const [metadataJson, content] = await Promise.all([\n fs.readFile(metadataPath, 'utf-8'),\n fs.readFile(cachePath),\n ])\n\n const metadata = JSON.parse(metadataJson)\n return {\n metadata,\n content,\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null\n }\n throw error\n }\n }\n\n /**\n * Write a cache entry to disk\n */\n async write(entry: CacheEntry): Promise<void> {\n const cachePath = this.getCachePath(entry.metadata.uri)\n const metadataPath = this.getMetadataPath(entry.metadata.uri)\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(cachePath), { recursive: true })\n\n if (this.atomicWrites) {\n // Write to temp files first, then rename\n const tempCachePath = cachePath + '.tmp'\n const tempMetadataPath = metadataPath + '.tmp'\n\n try {\n await Promise.all([\n fs.writeFile(tempCachePath, entry.content),\n fs.writeFile(tempMetadataPath, JSON.stringify(entry.metadata, null, 2)),\n ])\n\n await Promise.all([\n fs.rename(tempCachePath, cachePath),\n fs.rename(tempMetadataPath, metadataPath),\n ])\n } catch (error) {\n // Clean up temp files on error\n await Promise.all([\n fs.unlink(tempCachePath).catch(() => {}),\n fs.unlink(tempMetadataPath).catch(() => {}),\n ])\n throw error\n }\n } else {\n await Promise.all([\n fs.writeFile(cachePath, entry.content),\n fs.writeFile(metadataPath, JSON.stringify(entry.metadata, null, 2)),\n ])\n }\n }\n\n /**\n * Delete a cache entry\n */\n async delete(uri: string): Promise<boolean> {\n const cachePath = this.getCachePath(uri)\n const metadataPath = this.getMetadataPath(uri)\n\n try {\n await Promise.all([fs.unlink(cachePath), fs.unlink(metadataPath)])\n return true\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return false\n }\n throw error\n }\n }\n\n /**\n * Check if a cache entry exists\n */\n async exists(uri: string): Promise<boolean> {\n const cachePath = this.getCachePath(uri)\n\n try {\n await fs.access(cachePath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * List all cached URIs\n */\n async list(): Promise<string[]> {\n const uris: string[] = []\n\n try {\n const orgs = await fs.readdir(this.cacheDir)\n\n for (const org of orgs) {\n const orgPath = path.join(this.cacheDir, org)\n const orgStat = await fs.stat(orgPath)\n if (!orgStat.isDirectory()) continue\n\n const projects = await fs.readdir(orgPath)\n\n for (const project of projects) {\n const projectPath = path.join(orgPath, project)\n const projectStat = await fs.stat(projectPath)\n if (!projectStat.isDirectory()) continue\n\n // Recursively find all cache files\n const files = await this.listFilesRecursive(projectPath)\n\n for (const file of files) {\n if (file.endsWith(this.extension)) {\n // Convert path back to URI\n const relativePath = path.relative(projectPath, file)\n const filePath = relativePath.slice(0, -this.extension.length)\n uris.push(`codex://${org}/${project}/${filePath}`)\n }\n }\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return []\n }\n throw error\n }\n\n return uris\n }\n\n /**\n * Recursively list files in a directory\n */\n private async listFilesRecursive(dir: string): Promise<string[]> {\n const files: string[] = []\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n files.push(...(await this.listFilesRecursive(fullPath)))\n } else if (entry.isFile()) {\n files.push(fullPath)\n }\n }\n\n return files\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<number> {\n let count = 0\n\n try {\n const orgs = await fs.readdir(this.cacheDir)\n\n for (const org of orgs) {\n const orgPath = path.join(this.cacheDir, org)\n const stat = await fs.stat(orgPath)\n if (stat.isDirectory()) {\n await fs.rm(orgPath, { recursive: true })\n count++\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error\n }\n }\n\n return count\n }\n\n /**\n * Clear expired entries\n */\n async clearExpired(): Promise<number> {\n const uris = await this.list()\n let cleared = 0\n\n for (const uri of uris) {\n const entry = await this.read(uri)\n if (entry && entry.metadata.expiresAt < Date.now()) {\n if (await this.delete(uri)) {\n cleared++\n }\n }\n }\n\n return cleared\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const stats: CacheStats = {\n entryCount: 0,\n totalSize: 0,\n freshCount: 0,\n staleCount: 0,\n expiredCount: 0,\n }\n\n const uris = await this.list()\n const now = Date.now()\n const staleWindow = 5 * 60 * 1000\n\n for (const uri of uris) {\n const entry = await this.read(uri)\n if (entry) {\n stats.entryCount++\n stats.totalSize += entry.metadata.size\n\n if (now < entry.metadata.expiresAt) {\n stats.freshCount++\n } else if (now < entry.metadata.expiresAt + staleWindow) {\n stats.staleCount++\n } else {\n stats.expiredCount++\n }\n }\n }\n\n return stats\n }\n\n /**\n * Ensure cache directory exists\n */\n async ensureDir(): Promise<void> {\n await fs.mkdir(this.cacheDir, { recursive: true })\n }\n\n /**\n * Get cache directory path\n */\n getCacheDir(): string {\n return this.cacheDir\n }\n}\n\n/**\n * Create a cache persistence layer\n */\nexport function createCachePersistence(options: CachePersistenceOptions): CachePersistence {\n return new CachePersistence(options)\n}\n","/**\n * Cache manager\n *\n * Multi-tier cache manager that coordinates in-memory caching,\n * disk persistence, and storage providers for optimal performance.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport type { StorageManager } from '../storage/manager.js'\nimport type { FetchOptions, FetchResult } from '../storage/provider.js'\nimport {\n type CacheEntry,\n type CacheEntryMetadata,\n createCacheEntry,\n getCacheEntryStatus,\n touchCacheEntry,\n isCacheEntryFresh,\n getRemainingTtl,\n} from './entry.js'\nimport { type CachePersistence, type CacheStats, createCachePersistence } from './persistence.js'\n\n/**\n * Cache manager configuration\n */\nexport interface CacheManagerConfig {\n /** Cache directory path */\n cacheDir: string\n /** Default TTL in seconds */\n defaultTtl?: number\n /** Maximum entries in memory cache */\n maxMemoryEntries?: number\n /** Maximum memory cache size in bytes */\n maxMemorySize?: number\n /** Whether to persist cache to disk */\n enablePersistence?: boolean\n /** Whether to use stale-while-revalidate pattern */\n staleWhileRevalidate?: boolean\n /** Background refresh threshold (seconds before expiry) */\n backgroundRefreshThreshold?: number\n}\n\n/**\n * Cache lookup result\n */\nexport interface CacheLookupResult {\n /** Cache entry if found */\n entry: CacheEntry | null\n /** Whether the entry was found */\n hit: boolean\n /** Whether the entry is fresh */\n fresh: boolean\n /** Source of the entry (memory, disk, network) */\n source: 'memory' | 'disk' | 'network' | 'none'\n}\n\n/**\n * Cache manager\n *\n * Provides a multi-tier caching system with:\n * - L1: In-memory cache (fast, limited size)\n * - L2: Disk persistence (larger, survives restarts)\n * - L3: Storage providers (network fetch)\n */\nexport class CacheManager {\n private memoryCache: Map<string, CacheEntry> = new Map()\n private persistence: CachePersistence | null\n private storage: StorageManager | null = null\n private config: Required<CacheManagerConfig>\n\n // LRU tracking\n private accessOrder: string[] = []\n\n // Background refresh tracking\n private refreshPromises: Map<string, Promise<CacheEntry | null>> = new Map()\n\n constructor(config: CacheManagerConfig) {\n this.config = {\n cacheDir: config.cacheDir,\n defaultTtl: config.defaultTtl ?? 3600, // 1 hour default\n maxMemoryEntries: config.maxMemoryEntries ?? 1000,\n maxMemorySize: config.maxMemorySize ?? 50 * 1024 * 1024, // 50MB\n enablePersistence: config.enablePersistence ?? true,\n staleWhileRevalidate: config.staleWhileRevalidate ?? true,\n backgroundRefreshThreshold: config.backgroundRefreshThreshold ?? 60, // 1 minute\n }\n\n this.persistence = this.config.enablePersistence\n ? createCachePersistence({ cacheDir: this.config.cacheDir })\n : null\n }\n\n /**\n * Set the storage manager for fetching\n */\n setStorageManager(storage: StorageManager): void {\n this.storage = storage\n }\n\n /**\n * Get content for a reference\n *\n * Implements cache-first strategy with stale-while-revalidate.\n */\n async get(\n reference: ResolvedReference,\n options?: FetchOptions & { ttl?: number }\n ): Promise<FetchResult> {\n const ttl = options?.ttl ?? this.config.defaultTtl\n\n // Check memory cache\n let entry = this.memoryCache.get(reference.uri)\n\n // Check disk cache if not in memory\n if (!entry && this.persistence) {\n entry = await this.persistence.read(reference.uri) ?? undefined\n if (entry) {\n // Promote to memory cache\n this.setMemoryEntry(reference.uri, entry)\n }\n }\n\n if (entry) {\n const status = getCacheEntryStatus(entry)\n\n if (status === 'fresh') {\n touchCacheEntry(entry)\n return this.entryToResult(entry)\n }\n\n if (status === 'stale' && this.config.staleWhileRevalidate) {\n // Return stale content immediately\n touchCacheEntry(entry)\n const result = this.entryToResult(entry)\n\n // Trigger background refresh\n this.backgroundRefresh(reference, ttl, options)\n\n return result\n }\n }\n\n // Fetch from storage\n return this.fetchAndCache(reference, ttl, options)\n }\n\n /**\n * Check if content is cached\n */\n async has(uri: string): Promise<boolean> {\n if (this.memoryCache.has(uri)) {\n return true\n }\n\n if (this.persistence) {\n return this.persistence.exists(uri)\n }\n\n return false\n }\n\n /**\n * Get cache entry without fetching\n */\n async lookup(uri: string): Promise<CacheLookupResult> {\n // Check memory cache\n let entry = this.memoryCache.get(uri)\n if (entry) {\n return {\n entry,\n hit: true,\n fresh: isCacheEntryFresh(entry),\n source: 'memory',\n }\n }\n\n // Check disk cache\n if (this.persistence) {\n entry = await this.persistence.read(uri) ?? undefined\n if (entry) {\n this.setMemoryEntry(uri, entry)\n return {\n entry,\n hit: true,\n fresh: isCacheEntryFresh(entry),\n source: 'disk',\n }\n }\n }\n\n return {\n entry: null,\n hit: false,\n fresh: false,\n source: 'none',\n }\n }\n\n /**\n * Store content in cache\n */\n async set(uri: string, result: FetchResult, ttl?: number): Promise<CacheEntry> {\n const actualTtl = ttl ?? this.config.defaultTtl\n const entry = createCacheEntry(uri, result, actualTtl)\n\n // Store in memory\n this.setMemoryEntry(uri, entry)\n\n // Persist to disk\n if (this.persistence) {\n await this.persistence.write(entry)\n }\n\n return entry\n }\n\n /**\n * Invalidate a cache entry\n */\n async invalidate(uri: string): Promise<boolean> {\n let removed = false\n\n if (this.memoryCache.has(uri)) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n removed = true\n }\n\n if (this.persistence) {\n const diskRemoved = await this.persistence.delete(uri)\n removed = removed || diskRemoved\n }\n\n return removed\n }\n\n /**\n * Invalidate all entries matching a pattern\n */\n async invalidatePattern(pattern: RegExp): Promise<number> {\n let count = 0\n\n // Memory cache\n for (const uri of this.memoryCache.keys()) {\n if (pattern.test(uri)) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n count++\n }\n }\n\n // Disk cache\n if (this.persistence) {\n const uris = await this.persistence.list()\n for (const uri of uris) {\n if (pattern.test(uri)) {\n await this.persistence.delete(uri)\n count++\n }\n }\n }\n\n return count\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<void> {\n this.memoryCache.clear()\n this.accessOrder = []\n\n if (this.persistence) {\n await this.persistence.clear()\n }\n }\n\n /**\n * Clear expired entries\n */\n async clearExpired(): Promise<number> {\n let count = 0\n const now = Date.now()\n\n // Memory cache\n for (const [uri, entry] of this.memoryCache) {\n if (entry.metadata.expiresAt < now) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n count++\n }\n }\n\n // Disk cache\n if (this.persistence) {\n count += await this.persistence.clearExpired()\n }\n\n return count\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats & { memoryEntries: number; memorySize: number }> {\n let diskStats: CacheStats = {\n entryCount: 0,\n totalSize: 0,\n freshCount: 0,\n staleCount: 0,\n expiredCount: 0,\n }\n\n if (this.persistence) {\n diskStats = await this.persistence.getStats()\n }\n\n // Calculate memory stats\n let memorySize = 0\n for (const entry of this.memoryCache.values()) {\n memorySize += entry.metadata.size\n }\n\n return {\n ...diskStats,\n memoryEntries: this.memoryCache.size,\n memorySize,\n }\n }\n\n /**\n * Preload content into cache\n */\n async preload(references: ResolvedReference[], options?: FetchOptions): Promise<void> {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n\n await Promise.all(\n references.map(async (ref) => {\n try {\n await this.get(ref, options)\n } catch {\n // Ignore preload errors\n }\n })\n )\n }\n\n /**\n * Get metadata for a cached entry\n */\n async getMetadata(uri: string): Promise<CacheEntryMetadata | null> {\n const result = await this.lookup(uri)\n return result.entry?.metadata ?? null\n }\n\n /**\n * Get remaining TTL for an entry\n */\n async getTtl(uri: string): Promise<number | null> {\n const result = await this.lookup(uri)\n if (result.entry) {\n return getRemainingTtl(result.entry)\n }\n return null\n }\n\n /**\n * Fetch content and store in cache\n */\n private async fetchAndCache(\n reference: ResolvedReference,\n ttl: number,\n options?: FetchOptions\n ): Promise<FetchResult> {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n\n const result = await this.storage.fetch(reference, options)\n await this.set(reference.uri, result, ttl)\n\n return result\n }\n\n /**\n * Background refresh for stale-while-revalidate\n */\n private backgroundRefresh(\n reference: ResolvedReference,\n ttl: number,\n options?: FetchOptions\n ): void {\n const uri = reference.uri\n\n // Don't start multiple refreshes for the same URI\n if (this.refreshPromises.has(uri)) {\n return\n }\n\n const promise = this.fetchAndCache(reference, ttl, options)\n .then(() => {\n const entry = this.memoryCache.get(uri)\n return entry ?? null\n })\n .catch(() => null)\n .finally(() => {\n this.refreshPromises.delete(uri)\n })\n\n this.refreshPromises.set(uri, promise)\n }\n\n /**\n * Set entry in memory cache with LRU eviction\n */\n private setMemoryEntry(uri: string, entry: CacheEntry): void {\n // Remove from current position in access order\n this.removeFromAccessOrder(uri)\n\n // Add to end (most recently used)\n this.accessOrder.push(uri)\n this.memoryCache.set(uri, entry)\n\n // Evict if necessary\n this.evictIfNeeded()\n }\n\n /**\n * Evict entries if over limits\n */\n private evictIfNeeded(): void {\n // Check entry count\n while (this.memoryCache.size > this.config.maxMemoryEntries) {\n this.evictOldest()\n }\n\n // Check memory size\n let totalSize = 0\n for (const entry of this.memoryCache.values()) {\n totalSize += entry.metadata.size\n }\n\n while (totalSize > this.config.maxMemorySize && this.memoryCache.size > 0) {\n const evicted = this.evictOldest()\n if (evicted) {\n totalSize -= evicted.metadata.size\n } else {\n break\n }\n }\n }\n\n /**\n * Evict the oldest entry (LRU)\n */\n private evictOldest(): CacheEntry | null {\n if (this.accessOrder.length === 0) {\n return null\n }\n\n const oldest = this.accessOrder.shift()\n if (oldest) {\n const entry = this.memoryCache.get(oldest)\n this.memoryCache.delete(oldest)\n return entry ?? null\n }\n\n return null\n }\n\n /**\n * Remove URI from access order\n */\n private removeFromAccessOrder(uri: string): void {\n const index = this.accessOrder.indexOf(uri)\n if (index !== -1) {\n this.accessOrder.splice(index, 1)\n }\n }\n\n /**\n * Convert cache entry to fetch result\n */\n private entryToResult(entry: CacheEntry): FetchResult {\n return {\n content: entry.content,\n contentType: entry.metadata.contentType,\n size: entry.metadata.size,\n source: entry.metadata.source,\n metadata: entry.metadata.providerMetadata,\n }\n }\n}\n\n/**\n * Create a cache manager\n */\nexport function createCacheManager(config: CacheManagerConfig): CacheManager {\n return new CacheManager(config)\n}\n\n/**\n * Default cache manager instance\n */\nlet defaultCacheManager: CacheManager | null = null\n\n/**\n * Get the default cache manager\n */\nexport function getDefaultCacheManager(): CacheManager {\n if (!defaultCacheManager) {\n defaultCacheManager = createCacheManager({\n cacheDir: '.fractary/plugins/codex/cache',\n })\n }\n return defaultCacheManager\n}\n\n/**\n * Set the default cache manager\n */\nexport function setDefaultCacheManager(manager: CacheManager): void {\n defaultCacheManager = manager\n}\n","/**\n * Sync types\n *\n * Type definitions for the synchronization system.\n */\n\n/**\n * Sync direction\n */\nexport type SyncDirection = 'to-codex' | 'from-codex' | 'bidirectional'\n\n/**\n * Sync operation type\n */\nexport type SyncOperation = 'create' | 'update' | 'delete' | 'skip' | 'conflict'\n\n/**\n * File sync status\n */\nexport interface FileSyncStatus {\n /** File path relative to project root */\n path: string\n /** Operation to perform */\n operation: SyncOperation\n /** Size in bytes */\n size?: number\n /** Last modified timestamp */\n mtime?: number\n /** Content hash */\n hash?: string\n /** Reason for skip or conflict */\n reason?: string\n}\n\n/**\n * Sync manifest entry\n */\nexport interface SyncManifestEntry {\n /** File path */\n path: string\n /** Content hash */\n hash: string\n /** File size */\n size: number\n /** Last synced timestamp */\n syncedAt: number\n /** Source of last sync */\n source: 'local' | 'remote'\n}\n\n/**\n * Sync manifest\n *\n * Tracks the state of synced files.\n */\nexport interface SyncManifest {\n /** Manifest version */\n version: number\n /** Organization */\n org: string\n /** Project */\n project: string\n /** Last full sync timestamp */\n lastSync: number\n /** File entries */\n entries: Record<string, SyncManifestEntry>\n}\n\n/**\n * Sync plan\n *\n * A plan of operations to perform during sync.\n */\nexport interface SyncPlan {\n /** Direction of sync */\n direction: SyncDirection\n /** Source location */\n source: string\n /** Target location */\n target: string\n /** Files to sync */\n files: FileSyncStatus[]\n /** Total files to process */\n totalFiles: number\n /** Total bytes to transfer */\n totalBytes: number\n /** Estimated time in ms */\n estimatedTime?: number\n /** Conflicts that need resolution */\n conflicts: FileSyncStatus[]\n /** Files that will be skipped */\n skipped: FileSyncStatus[]\n}\n\n/**\n * Sync result\n */\nexport interface SyncResult {\n /** Whether sync completed successfully */\n success: boolean\n /** Plan that was executed */\n plan: SyncPlan\n /** Number of files synced */\n synced: number\n /** Number of files failed */\n failed: number\n /** Number of files skipped */\n skipped: number\n /** Errors encountered */\n errors: Array<{ path: string; error: string }>\n /** Duration in ms */\n duration: number\n /** Timestamp */\n timestamp: number\n}\n\n/**\n * Sync options\n */\nexport interface SyncOptions {\n /** Sync direction */\n direction?: SyncDirection\n /** Whether to perform a dry run */\n dryRun?: boolean\n /** Force overwrite on conflicts */\n force?: boolean\n /** Delete files not in source */\n delete?: boolean\n /** Patterns to include */\n include?: string[]\n /** Patterns to exclude */\n exclude?: string[]\n /** Maximum files to sync */\n maxFiles?: number\n /** Timeout in ms */\n timeout?: number\n /** Progress callback */\n onProgress?: (current: number, total: number, file: string) => void\n}\n\n/**\n * Sync rule\n */\nexport interface SyncRule {\n /** Pattern to match */\n pattern: string\n /** Whether to include (true) or exclude (false) */\n include: boolean\n /** Priority (higher = evaluated first) */\n priority?: number\n /** Sync direction this rule applies to */\n direction?: SyncDirection\n}\n\n/**\n * Sync configuration\n */\nexport interface SyncConfig {\n /** Default sync direction */\n defaultDirection: SyncDirection\n /** Sync rules */\n rules: SyncRule[]\n /** Default patterns to exclude */\n defaultExcludes: string[]\n /** Whether to delete orphaned files */\n deleteOrphans: boolean\n /** Conflict resolution strategy */\n conflictStrategy: 'newest' | 'local' | 'remote' | 'manual'\n /** Directional sync: patterns for files to push to codex */\n to_codex?: string[]\n /** Directional sync: patterns for files to pull from codex */\n from_codex?: string[]\n /** Org-level defaults for pushing to codex */\n default_to_codex?: string[]\n /** Org-level defaults for pulling from codex */\n default_from_codex?: string[]\n /** Exclude patterns (applied to both directions) */\n exclude?: string[]\n}\n\n/**\n * Default sync configuration\n */\nexport const DEFAULT_SYNC_CONFIG: SyncConfig = {\n defaultDirection: 'to-codex',\n rules: [],\n defaultExcludes: [\n '**/node_modules/**',\n '**/.git/**',\n '**/.DS_Store',\n '**/Thumbs.db',\n '**/*.log',\n '**/.env*',\n '**/dist/**',\n '**/build/**',\n '**/coverage/**',\n ],\n deleteOrphans: false,\n conflictStrategy: 'newest',\n}\n","/**\n * Sync rule evaluator\n *\n * Evaluates sync rules to determine which files should be synced.\n */\n\nimport micromatch from 'micromatch'\nimport type { SyncRule, SyncDirection } from './types.js'\n\n/**\n * Evaluation result for a single file\n */\nexport interface EvaluationResult {\n /** File path */\n path: string\n /** Whether the file should be synced */\n shouldSync: boolean\n /** Matching rule (if any) */\n matchedRule?: SyncRule\n /** Reason for the decision */\n reason: string\n}\n\n/**\n * Evaluate a file path against sync rules\n *\n * @param path - File path to evaluate\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Evaluation result\n */\nexport function evaluatePath(\n path: string,\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): EvaluationResult {\n // First check default excludes\n for (const pattern of defaultExcludes) {\n if (micromatch.isMatch(path, pattern)) {\n return {\n path,\n shouldSync: false,\n reason: `Excluded by default pattern: ${pattern}`,\n }\n }\n }\n\n // Sort rules by priority (higher first)\n const sortedRules = [...rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n\n // Find first matching rule\n for (const rule of sortedRules) {\n // Skip rules that don't apply to this direction\n if (rule.direction && rule.direction !== direction) {\n continue\n }\n\n if (micromatch.isMatch(path, rule.pattern)) {\n return {\n path,\n shouldSync: rule.include,\n matchedRule: rule,\n reason: rule.include\n ? `Included by rule: ${rule.pattern}`\n : `Excluded by rule: ${rule.pattern}`,\n }\n }\n }\n\n // Default: include if no rule matches\n return {\n path,\n shouldSync: true,\n reason: 'No matching rule, included by default',\n }\n}\n\n/**\n * Evaluate multiple paths against sync rules\n *\n * @param paths - Array of file paths\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Map of path to evaluation result\n */\nexport function evaluatePaths(\n paths: string[],\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): Map<string, EvaluationResult> {\n const results = new Map<string, EvaluationResult>()\n\n for (const path of paths) {\n results.set(path, evaluatePath(path, rules, direction, defaultExcludes))\n }\n\n return results\n}\n\n/**\n * Filter paths to get only syncable files\n *\n * @param paths - Array of file paths\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Array of paths that should be synced\n */\nexport function filterSyncablePaths(\n paths: string[],\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): string[] {\n return paths.filter(\n (path) => evaluatePath(path, rules, direction, defaultExcludes).shouldSync\n )\n}\n\n/**\n * Create sync rules from patterns\n *\n * @param include - Patterns to include\n * @param exclude - Patterns to exclude\n * @returns Array of sync rules\n */\nexport function createRulesFromPatterns(\n include: string[] = [],\n exclude: string[] = []\n): SyncRule[] {\n const rules: SyncRule[] = []\n\n // Add exclude rules with higher priority\n for (const pattern of exclude) {\n rules.push({\n pattern,\n include: false,\n priority: 100,\n })\n }\n\n // Add include rules\n for (const pattern of include) {\n rules.push({\n pattern,\n include: true,\n priority: 50,\n })\n }\n\n return rules\n}\n\n/**\n * Merge multiple sets of rules\n *\n * @param ruleSets - Arrays of rules to merge\n * @returns Merged rules array\n */\nexport function mergeRules(...ruleSets: SyncRule[][]): SyncRule[] {\n return ruleSets.flat()\n}\n\n/**\n * Get summary of evaluation results\n */\nexport interface EvaluationSummary {\n total: number\n included: number\n excluded: number\n byReason: Record<string, number>\n}\n\n/**\n * Summarize evaluation results\n *\n * @param results - Evaluation results map\n * @returns Summary of results\n */\nexport function summarizeEvaluations(\n results: Map<string, EvaluationResult>\n): EvaluationSummary {\n const summary: EvaluationSummary = {\n total: results.size,\n included: 0,\n excluded: 0,\n byReason: {},\n }\n\n for (const result of results.values()) {\n if (result.shouldSync) {\n summary.included++\n } else {\n summary.excluded++\n }\n\n summary.byReason[result.reason] = (summary.byReason[result.reason] ?? 0) + 1\n }\n\n return summary\n}\n\n/**\n * Validate sync rules\n *\n * @param rules - Rules to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateRules(rules: SyncRule[]): string[] {\n const errors: string[] = []\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]\n if (!rule) continue\n\n // Check pattern is valid\n if (!rule.pattern || rule.pattern.trim() === '') {\n errors.push(`Rule ${i}: pattern is empty`)\n continue\n }\n\n // Check pattern is valid glob\n try {\n micromatch.isMatch('test', rule.pattern)\n } catch {\n errors.push(`Rule ${i}: invalid pattern \"${rule.pattern}\"`)\n }\n\n // Check direction is valid\n if (rule.direction && !['to-codex', 'from-codex', 'bidirectional'].includes(rule.direction)) {\n errors.push(`Rule ${i}: invalid direction \"${rule.direction}\"`)\n }\n }\n\n return errors\n}\n","/**\n * Sync planner\n *\n * Creates sync plans by comparing source and target file states.\n */\n\nimport type {\n SyncPlan,\n SyncOptions,\n SyncDirection,\n FileSyncStatus,\n SyncConfig,\n} from './types.js'\nimport { evaluatePath } from './evaluator.js'\n\n/**\n * File info for comparison\n */\nexport interface FileInfo {\n path: string\n size: number\n mtime: number\n hash?: string\n}\n\n/**\n * Create a sync plan by comparing source and target files\n *\n * @param sourceFiles - Files in the source\n * @param targetFiles - Files in the target\n * @param options - Sync options\n * @param config - Sync configuration\n * @returns Sync plan\n */\nexport function createSyncPlan(\n sourceFiles: FileInfo[],\n targetFiles: FileInfo[],\n options: SyncOptions,\n config: SyncConfig\n): SyncPlan {\n const direction = options.direction ?? config.defaultDirection\n const targetMap = new Map(targetFiles.map((f) => [f.path, f]))\n const sourceMap = new Map(sourceFiles.map((f) => [f.path, f]))\n\n const files: FileSyncStatus[] = []\n const conflicts: FileSyncStatus[] = []\n const skipped: FileSyncStatus[] = []\n\n // Build include/exclude rules\n const rules = [\n ...config.rules,\n ...(options.include ?? []).map((p) => ({ pattern: p, include: true, priority: 200 })),\n ...(options.exclude ?? []).map((p) => ({ pattern: p, include: false, priority: 200 })),\n ]\n\n const excludes = [...config.defaultExcludes]\n\n // Process source files\n for (const sourceFile of sourceFiles) {\n // Evaluate if file should be synced\n const evaluation = evaluatePath(sourceFile.path, rules, direction, excludes)\n\n if (!evaluation.shouldSync) {\n skipped.push({\n path: sourceFile.path,\n operation: 'skip',\n size: sourceFile.size,\n reason: evaluation.reason,\n })\n continue\n }\n\n const targetFile = targetMap.get(sourceFile.path)\n\n if (!targetFile) {\n // File doesn't exist in target - create it\n files.push({\n path: sourceFile.path,\n operation: 'create',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n } else {\n // File exists in both - check for changes\n const isDifferent = sourceFile.hash !== targetFile.hash\n\n if (isDifferent) {\n if (options.force) {\n // Force overwrite\n files.push({\n path: sourceFile.path,\n operation: 'update',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n } else if (targetFile.mtime > sourceFile.mtime) {\n // Target is newer - conflict\n conflicts.push({\n path: sourceFile.path,\n operation: 'conflict',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n reason: 'Target file is newer than source',\n })\n } else {\n // Source is newer - update\n files.push({\n path: sourceFile.path,\n operation: 'update',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n }\n } else {\n // Files are identical - skip\n skipped.push({\n path: sourceFile.path,\n operation: 'skip',\n size: sourceFile.size,\n reason: 'Files are identical',\n })\n }\n }\n }\n\n // Handle deletions if enabled\n if (options.delete) {\n for (const targetFile of targetFiles) {\n if (!sourceMap.has(targetFile.path)) {\n // File in target but not in source\n const evaluation = evaluatePath(targetFile.path, rules, direction, excludes)\n\n if (evaluation.shouldSync) {\n files.push({\n path: targetFile.path,\n operation: 'delete',\n size: targetFile.size,\n })\n }\n }\n }\n }\n\n // Apply max files limit\n let limitedFiles = files\n if (options.maxFiles && files.length > options.maxFiles) {\n limitedFiles = files.slice(0, options.maxFiles)\n for (const file of files.slice(options.maxFiles)) {\n skipped.push({\n ...file,\n operation: 'skip',\n reason: 'Exceeded max files limit',\n })\n }\n }\n\n // Calculate totals\n const totalBytes = limitedFiles.reduce((sum, f) => sum + (f.size ?? 0), 0)\n\n return {\n direction,\n source: direction === 'from-codex' ? 'codex' : 'local',\n target: direction === 'from-codex' ? 'local' : 'codex',\n files: limitedFiles,\n totalFiles: limitedFiles.length,\n totalBytes,\n conflicts,\n skipped,\n }\n}\n\n/**\n * Estimate sync time based on file sizes\n *\n * @param plan - Sync plan\n * @param bytesPerSecond - Estimated transfer speed (default: 1MB/s)\n * @returns Estimated time in milliseconds\n */\nexport function estimateSyncTime(plan: SyncPlan, bytesPerSecond = 1024 * 1024): number {\n const transferTime = (plan.totalBytes / bytesPerSecond) * 1000\n const overheadPerFile = 50 // ms per file\n const overhead = plan.totalFiles * overheadPerFile\n\n return Math.ceil(transferTime + overhead)\n}\n\n/**\n * Create an empty sync plan\n */\nexport function createEmptySyncPlan(direction: SyncDirection = 'to-codex'): SyncPlan {\n return {\n direction,\n source: direction === 'from-codex' ? 'codex' : 'local',\n target: direction === 'from-codex' ? 'local' : 'codex',\n files: [],\n totalFiles: 0,\n totalBytes: 0,\n conflicts: [],\n skipped: [],\n }\n}\n\n/**\n * Filter plan to only include specific operations\n */\nexport function filterPlanOperations(\n plan: SyncPlan,\n operations: Array<'create' | 'update' | 'delete'>\n): SyncPlan {\n const filtered = plan.files.filter((f) =>\n operations.includes(f.operation as 'create' | 'update' | 'delete')\n )\n\n return {\n ...plan,\n files: filtered,\n totalFiles: filtered.length,\n totalBytes: filtered.reduce((sum, f) => sum + (f.size ?? 0), 0),\n }\n}\n\n/**\n * Get plan statistics\n */\nexport interface PlanStats {\n creates: number\n updates: number\n deletes: number\n skips: number\n conflicts: number\n totalBytes: number\n}\n\n/**\n * Get statistics from a sync plan\n */\nexport function getPlanStats(plan: SyncPlan): PlanStats {\n return {\n creates: plan.files.filter((f) => f.operation === 'create').length,\n updates: plan.files.filter((f) => f.operation === 'update').length,\n deletes: plan.files.filter((f) => f.operation === 'delete').length,\n skips: plan.skipped.length,\n conflicts: plan.conflicts.length,\n totalBytes: plan.totalBytes,\n }\n}\n\n/**\n * Format plan as human-readable summary\n */\nexport function formatPlanSummary(plan: SyncPlan): string {\n const stats = getPlanStats(plan)\n\n const lines = [\n `Sync Plan: ${plan.source} → ${plan.target}`,\n `Direction: ${plan.direction}`,\n '',\n `Operations:`,\n ` Create: ${stats.creates} files`,\n ` Update: ${stats.updates} files`,\n ` Delete: ${stats.deletes} files`,\n ` Skip: ${stats.skips} files`,\n '',\n ]\n\n if (stats.conflicts > 0) {\n lines.push(`⚠️ Conflicts: ${stats.conflicts} files`)\n lines.push('')\n }\n\n lines.push(`Total: ${plan.totalFiles} files (${formatBytes(stats.totalBytes)})`)\n\n return lines.join('\\n')\n}\n\n/**\n * Format bytes as human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n}\n","/**\n * Routing-aware codex scanner\n *\n * Scans entire codex repository and evaluates routing rules to determine\n * which files should sync to a target project based on frontmatter metadata.\n *\n * Based on SPEC-20260105: Routing-Aware Sync Implementation\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { Metadata } from '../schemas/metadata.js'\nimport type { SyncRules } from '../schemas/config.js'\nimport { shouldSyncToRepo } from '../core/routing/evaluator.js'\nimport { parseMetadata } from '../core/metadata/parser.js'\nimport { calculateContentHash } from '../cache/entry.js'\nimport type { LocalStorage } from '../storage/local.js'\n\n/**\n * File information with routing metadata\n */\nexport interface RoutedFileInfo {\n /** File path relative to codex root */\n path: string\n /** File size in bytes */\n size: number\n /** Last modified timestamp */\n mtime: number\n /** Content hash for change detection */\n hash: string\n /** Parsed frontmatter metadata */\n metadata: Metadata\n /** Source project in codex (e.g., \"etl.corthion.ai\") */\n sourceProject: string\n}\n\n/**\n * Options for routing-aware scan\n */\nexport interface RoutingScanOptions {\n /** Path to codex repository directory */\n codexDir: string\n /** Target project to sync to (e.g., \"lake.corthonomy.ai\") */\n targetProject: string\n /** Organization name (e.g., \"corthosai\") */\n org: string\n /** Routing rules configuration (optional, uses defaults if not provided) */\n rules?: SyncRules\n /** Storage provider for reading files */\n storage: LocalStorage\n /** Skip files without frontmatter (default: true) */\n skipNoFrontmatter?: boolean\n /** Maximum file size to process in bytes (default: 10MB) */\n maxFileSize?: number\n /** Directional from_codex patterns (takes precedence over frontmatter routing) */\n fromCodexPatterns?: string[]\n}\n\n/**\n * Statistics from a routing scan\n */\nexport interface RoutingScanStats {\n /** Total files scanned */\n totalScanned: number\n /** Files that matched routing rules */\n totalMatched: number\n /** Files skipped (no frontmatter, errors, etc.) */\n totalSkipped: number\n /** Unique source projects found */\n sourceProjects: string[]\n /** Duration of scan in milliseconds */\n durationMs: number\n /** Errors encountered (non-fatal) */\n errors: Array<{ path: string; error: string }>\n}\n\n/**\n * Result from routing-aware scan\n */\nexport interface RoutingScanResult {\n /** Files that should sync to target project */\n files: RoutedFileInfo[]\n /** Scan statistics */\n stats: RoutingScanStats\n}\n\n/**\n * Scan entire codex repository and return files that route to target project\n *\n * This is the core function that enables cross-project knowledge sharing by:\n * 1. Listing ALL files in the entire codex repository (not just target project)\n * 2. Parsing frontmatter metadata from each file\n * 3. Evaluating codex_sync_include patterns against target project\n * 4. Returning only files that match routing rules\n *\n * @example\n * ```typescript\n * const result = await scanCodexWithRouting({\n * codexDir: '/path/to/codex.corthos.ai',\n * targetProject: 'lake.corthonomy.ai',\n * org: 'corthosai',\n * storage: localStorage\n * })\n *\n * console.log(`Found ${result.files.length} files routing to lake.corthonomy.ai`)\n * console.log(`From ${result.stats.sourceProjects.length} projects`)\n * ```\n *\n * @param options - Scan options\n * @returns Files that should sync to target project with scan statistics\n */\nexport async function scanCodexWithRouting(\n options: RoutingScanOptions\n): Promise<RoutingScanResult> {\n const {\n codexDir,\n targetProject,\n org,\n rules,\n storage,\n skipNoFrontmatter = false,\n maxFileSize = 10 * 1024 * 1024, // 10MB default\n fromCodexPatterns,\n } = options\n\n const startTime = Date.now()\n const routedFiles: RoutedFileInfo[] = []\n const sourceProjectsSet = new Set<string>()\n const errors: Array<{ path: string; error: string }> = []\n let totalScanned = 0\n let totalSkipped = 0\n\n // Import directional pattern matcher and expand placeholders if using from_codex patterns\n let expandedFromCodexPatterns = fromCodexPatterns\n let matchFromCodexPattern: ((filePath: string, patterns: string[], targetProject: string) => boolean) | null = null\n\n if (fromCodexPatterns && fromCodexPatterns.length > 0) {\n const module = await import('./directional-patterns.js')\n matchFromCodexPattern = module.matchFromCodexPattern\n // Expand {project} placeholder in patterns\n expandedFromCodexPatterns = module.expandPlaceholders(fromCodexPatterns, targetProject)\n }\n\n // Step 1: List ALL files recursively in entire codex repository\n const allFiles = await listAllFilesRecursive(codexDir)\n\n // Step 2: For each file, evaluate routing\n for (const filePath of allFiles) {\n totalScanned++\n\n try {\n // Check all file types for frontmatter (not just markdown)\n // This enables syncing of JSON schemas, YAML configs, and other files with routing metadata\n\n // Get full path for reading\n const fullPath = path.join(codexDir, filePath)\n\n // Check file size before reading\n const stats = await fs.stat(fullPath)\n if (stats.size > maxFileSize) {\n totalSkipped++\n errors.push({\n path: filePath,\n error: `File too large (${stats.size} bytes, max: ${maxFileSize})`,\n })\n continue\n }\n\n // Read file content\n const content = await storage.readText(fullPath)\n\n // Parse frontmatter metadata\n const parseResult = parseMetadata(content, { strict: false })\n\n // Skip files without frontmatter if configured (only when using frontmatter-based routing)\n if (!matchFromCodexPattern && skipNoFrontmatter && Object.keys(parseResult.metadata).length === 0) {\n totalSkipped++\n continue\n }\n\n // Extract source project from path\n const sourceProject = extractProjectFromPath(filePath, org)\n\n // Determine if file should sync using either directional patterns or frontmatter routing\n let shouldSync = false\n\n if (matchFromCodexPattern && expandedFromCodexPatterns && expandedFromCodexPatterns.length > 0) {\n // Use directional from_codex patterns (takes precedence)\n shouldSync = matchFromCodexPattern(filePath, expandedFromCodexPatterns, targetProject)\n } else {\n // Fall back to frontmatter-based routing\n shouldSync = shouldSyncToRepo({\n filePath,\n fileMetadata: parseResult.metadata,\n targetRepo: targetProject,\n sourceRepo: sourceProject,\n rules,\n })\n }\n\n if (shouldSync) {\n // Calculate file metadata\n const buffer = Buffer.from(content)\n const hash = calculateContentHash(buffer)\n\n routedFiles.push({\n path: filePath,\n size: buffer.length,\n mtime: stats.mtimeMs,\n hash,\n metadata: parseResult.metadata,\n sourceProject,\n })\n\n sourceProjectsSet.add(sourceProject)\n } else {\n totalSkipped++\n }\n } catch (error) {\n // Log error but continue processing other files\n totalSkipped++\n errors.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n const durationMs = Date.now() - startTime\n\n return {\n files: routedFiles,\n stats: {\n totalScanned,\n totalMatched: routedFiles.length,\n totalSkipped,\n sourceProjects: Array.from(sourceProjectsSet).sort(),\n durationMs,\n errors,\n },\n }\n}\n\n/**\n * Extract project name from codex file path\n *\n * Supports two codex structures:\n * 1. Flat: {org}/{project}/{path/to/file.md}\n * Example: \"corthosai/etl.corthion.ai/docs/api.md\" → \"etl.corthion.ai\"\n * 2. Projects dir: projects/{project}/{path/to/file.md}\n * Example: \"projects/etl.corthion.ai/docs/api.md\" → \"etl.corthion.ai\"\n *\n * @param filePath - File path like \"corthosai/etl.corthion.ai/docs/api.md\" or \"projects/etl.corthion.ai/docs/api.md\"\n * @param org - Organization name like \"corthosai\"\n * @returns Project name like \"etl.corthion.ai\"\n */\nexport function extractProjectFromPath(filePath: string, org: string): string {\n // Normalize path separators\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Remove leading org directory if present\n const withoutOrg = normalizedPath.startsWith(`${org}/`)\n ? normalizedPath.slice(org.length + 1)\n : normalizedPath\n\n // Check if using projects/ subdirectory structure\n if (withoutOrg.startsWith('projects/')) {\n // Extract project name from projects/{project}/...\n const afterProjects = withoutOrg.slice('projects/'.length)\n const firstSlash = afterProjects.indexOf('/')\n if (firstSlash === -1) {\n // No further path segments, use entire remainder as project\n return afterProjects\n }\n return afterProjects.slice(0, firstSlash)\n }\n\n // Flat structure: extract first path segment as project name\n const firstSlash = withoutOrg.indexOf('/')\n if (firstSlash === -1) {\n // File is at root level, use entire path as project\n return withoutOrg\n }\n\n return withoutOrg.slice(0, firstSlash)\n}\n\n/**\n * Recursively list all files in directory\n *\n * @param dirPath - Directory to scan\n * @returns Array of relative file paths\n */\nexport async function listAllFilesRecursive(dirPath: string): Promise<string[]> {\n const files: string[] = []\n\n async function scanDirectory(currentPath: string, relativePath: string = ''): Promise<void> {\n try {\n const entries = await fs.readdir(currentPath, { withFileTypes: true })\n\n for (const entry of entries) {\n const entryPath = path.join(currentPath, entry.name)\n const entryRelativePath = relativePath\n ? path.join(relativePath, entry.name)\n : entry.name\n\n if (entry.isDirectory()) {\n // Skip hidden directories and common ignore patterns\n if (\n entry.name.startsWith('.') ||\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === 'build'\n ) {\n continue\n }\n\n // Recursively scan subdirectory\n await scanDirectory(entryPath, entryRelativePath)\n } else if (entry.isFile()) {\n // Add file to list\n files.push(entryRelativePath)\n }\n }\n } catch {\n // Ignore directories we can't read (permissions, etc.)\n // Silently skip - this is expected for permission issues\n }\n }\n\n await scanDirectory(dirPath)\n\n return files\n}\n\n/**\n * Group routed files by source project\n *\n * Utility function for displaying results grouped by project.\n *\n * @param files - Files from routing scan\n * @returns Map of project name to files from that project\n */\nexport function groupFilesByProject(\n files: RoutedFileInfo[]\n): Map<string, RoutedFileInfo[]> {\n const grouped = new Map<string, RoutedFileInfo[]>()\n\n for (const file of files) {\n const existing = grouped.get(file.sourceProject) || []\n existing.push(file)\n grouped.set(file.sourceProject, existing)\n }\n\n return grouped\n}\n\n/**\n * Calculate total size of routed files\n *\n * @param files - Files from routing scan\n * @returns Total size in bytes\n */\nexport function calculateTotalSize(files: RoutedFileInfo[]): number {\n return files.reduce((total, file) => total + file.size, 0)\n}\n\n/**\n * Format scan statistics for display\n *\n * @param stats - Scan statistics\n * @returns Human-readable statistics string\n */\nexport function formatScanStats(stats: RoutingScanStats): string {\n const lines: string[] = []\n\n lines.push(`Scanned: ${stats.totalScanned} files`)\n lines.push(`Matched: ${stats.totalMatched} files`)\n lines.push(`Skipped: ${stats.totalSkipped} files`)\n lines.push(`Source projects: ${stats.sourceProjects.length}`)\n lines.push(` ${stats.sourceProjects.join(', ')}`)\n lines.push(`Duration: ${stats.durationMs}ms`)\n\n if (stats.errors.length > 0) {\n lines.push(`Errors: ${stats.errors.length}`)\n stats.errors.slice(0, 5).forEach((err) => {\n lines.push(` ${err.path}: ${err.error}`)\n })\n if (stats.errors.length > 5) {\n lines.push(` ... and ${stats.errors.length - 5} more`)\n }\n }\n\n return lines.join('\\n')\n}\n","/**\n * Sync manager\n *\n * Coordinates sync operations between local files and codex repository.\n */\n\nimport type { LocalStorage } from '../storage/local.js'\nimport type {\n SyncPlan,\n SyncResult,\n SyncOptions,\n SyncConfig,\n SyncManifest,\n SyncManifestEntry,\n FileSyncStatus,\n} from './types.js'\nimport { DEFAULT_SYNC_CONFIG } from './types.js'\nimport { createSyncPlan, estimateSyncTime, type FileInfo } from './planner.js'\nimport { calculateContentHash } from '../cache/entry.js'\nimport { scanCodexWithRouting, type RoutingScanResult } from './routing-scanner.js'\n\n/**\n * Sync manager configuration\n */\nexport interface SyncManagerConfig {\n /** Local storage provider */\n localStorage: LocalStorage\n /** Sync configuration */\n config?: Partial<SyncConfig>\n /** Manifest file path */\n manifestPath?: string\n}\n\n/**\n * Sync manager\n *\n * Manages synchronization between local files and the codex repository.\n */\nexport class SyncManager {\n private localStorage: LocalStorage\n private config: SyncConfig\n private manifestPath: string\n private manifest: SyncManifest | null = null\n\n constructor(options: SyncManagerConfig) {\n this.localStorage = options.localStorage\n this.config = {\n ...DEFAULT_SYNC_CONFIG,\n ...options.config,\n }\n this.manifestPath = options.manifestPath ?? '.fractary/codex-sync-manifest.json'\n }\n\n /**\n * Load the sync manifest\n */\n async loadManifest(): Promise<SyncManifest | null> {\n try {\n const content = await this.localStorage.readText(this.manifestPath)\n this.manifest = JSON.parse(content)\n return this.manifest\n } catch {\n return null\n }\n }\n\n /**\n * Save the sync manifest\n */\n async saveManifest(manifest: SyncManifest): Promise<void> {\n this.manifest = manifest\n await this.localStorage.write(this.manifestPath, JSON.stringify(manifest, null, 2))\n }\n\n /**\n * Get or create manifest\n */\n async getOrCreateManifest(org: string, project: string): Promise<SyncManifest> {\n let manifest = await this.loadManifest()\n\n if (!manifest || manifest.org !== org || manifest.project !== project) {\n manifest = {\n version: 1,\n org,\n project,\n lastSync: 0,\n entries: {},\n }\n }\n\n return manifest\n }\n\n /**\n * List local files\n */\n async listLocalFiles(directory: string): Promise<FileInfo[]> {\n const files = await this.localStorage.list(directory)\n const fileInfos: FileInfo[] = []\n\n for (const file of files) {\n try {\n const content = await this.localStorage.readText(file)\n const buffer = Buffer.from(content)\n fileInfos.push({\n path: file,\n size: buffer.length,\n mtime: Date.now(), // Would need fs.stat for real mtime\n hash: calculateContentHash(buffer),\n })\n } catch {\n // Skip files that can't be read\n }\n }\n\n return fileInfos\n }\n\n /**\n * Create a sync plan\n *\n * @param _org - Organization (reserved for future use)\n * @param _project - Project (reserved for future use)\n * @param sourceDir - Source directory to sync from\n * @param targetFiles - Files currently in the target\n * @param options - Sync options\n */\n async createPlan(\n _org: string,\n _project: string,\n sourceDir: string,\n targetFiles: FileInfo[],\n options?: SyncOptions\n ): Promise<SyncPlan> {\n let sourceFiles = await this.listLocalFiles(sourceDir)\n\n // For to-codex direction, filter files based on to_codex config patterns\n // Use project config if available, otherwise fall back to org defaults\n if (options?.direction === 'to-codex') {\n const toCodexPatterns =\n this.config.to_codex || this.config.default_to_codex\n\n if (toCodexPatterns) {\n const { matchToCodexPattern } = await import('./directional-patterns.js')\n\n sourceFiles = sourceFiles.filter((file) =>\n matchToCodexPattern(file.path, toCodexPatterns)\n )\n }\n }\n\n const plan = createSyncPlan(\n sourceFiles,\n targetFiles,\n options ?? {},\n this.config\n )\n\n plan.estimatedTime = estimateSyncTime(plan)\n\n return plan\n }\n\n /**\n * Create a routing-aware sync plan\n *\n * Scans entire codex repository and evaluates routing rules to find all files\n * that should sync to the target project based on codex_sync_include patterns.\n *\n * This enables cross-project knowledge sharing where files from multiple\n * projects can be synced to the target based on their frontmatter metadata.\n *\n * @param org - Organization name (e.g., \"corthosai\")\n * @param project - Target project name (e.g., \"lake.corthonomy.ai\")\n * @param codexDir - Path to codex repository directory\n * @param options - Sync options\n * @returns Sync plan with routing metadata\n *\n * @example\n * ```typescript\n * const plan = await manager.createRoutingAwarePlan(\n * 'corthosai',\n * 'lake.corthonomy.ai',\n * '/path/to/codex.corthos.ai',\n * { direction: 'from-codex' }\n * )\n *\n * console.log(`Found ${plan.totalFiles} files from ${plan.metadata.scannedProjects.length} projects`)\n * ```\n */\n async createRoutingAwarePlan(\n org: string,\n project: string,\n codexDir: string,\n options?: SyncOptions\n ): Promise<SyncPlan & { routingScan?: RoutingScanResult }> {\n // Step 1: Scan entire codex with routing evaluation\n // Use project config if available, otherwise fall back to org defaults\n // If neither exist, use frontmatter routing\n const fromCodexPatterns =\n this.config.from_codex || this.config.default_from_codex\n\n const routingScan = await scanCodexWithRouting({\n codexDir,\n targetProject: project,\n org,\n rules: undefined, // Use default routing rules (preventSelfSync, preventCodexSync, etc.)\n storage: this.localStorage,\n fromCodexPatterns, // Use directional patterns if configured\n })\n\n // Step 2: Convert routed files to FileInfo format expected by planner\n const sourceFiles: FileInfo[] = routingScan.files.map((rf) => ({\n path: rf.path,\n size: rf.size,\n mtime: rf.mtime,\n hash: rf.hash,\n }))\n\n // Step 3: Get current local files for comparison\n const targetFiles = await this.listLocalFiles(process.cwd())\n\n // Step 4: Create sync plan using existing planner logic\n // IMPORTANT: Strip include/exclude patterns from options because routing scanner\n // has already filtered files based on routing rules (codex_sync_include frontmatter).\n // We only keep execution options (force, dryRun) to avoid double filtering.\n const planOptions: SyncOptions = {\n direction: options?.direction,\n force: options?.force,\n dryRun: options?.dryRun,\n // Explicitly exclude include/exclude to prevent double filtering\n // include: undefined,\n // exclude: undefined,\n }\n const plan = createSyncPlan(sourceFiles, targetFiles, planOptions, this.config)\n\n plan.estimatedTime = estimateSyncTime(plan)\n\n // Override source/target paths for from-codex routing-aware sync\n // Files should be copied from codex to cache directory preserving full paths\n plan.source = codexDir\n plan.target = '.fractary/codex/cache'\n\n // Step 5: Enhance plan with routing metadata\n return {\n ...plan,\n routingScan,\n }\n }\n\n /**\n * Execute a sync plan\n *\n * Copies files from source to target based on the plan.\n * For from-codex syncs, files are copied to .fractary/codex/cache/ preserving full paths.\n * For to-codex syncs, files are copied to the codex repository.\n */\n async executePlan(plan: SyncPlan, options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now()\n const errors: Array<{ path: string; error: string }> = []\n let synced = 0\n let failed = 0\n\n if (options?.dryRun) {\n // Dry run - just return what would happen\n return {\n success: true,\n plan,\n synced: plan.totalFiles,\n failed: 0,\n skipped: plan.skipped.length,\n errors: [],\n duration: Date.now() - startTime,\n timestamp: Date.now(),\n }\n }\n\n // Execute operations\n for (let i = 0; i < plan.files.length; i++) {\n const file = plan.files[i]\n if (!file) continue\n\n try {\n // Report progress\n if (options?.onProgress) {\n options.onProgress(i + 1, plan.totalFiles, file.path)\n }\n\n // Execute the sync operation\n if (file.operation === 'create' || file.operation === 'update') {\n // Copy file from source to target\n const sourcePath = `${plan.source}/${file.path}`\n const targetPath = `${plan.target}/${file.path}`\n\n // Ensure target directory exists\n const fs = await import('fs/promises')\n const path = await import('path')\n const targetDir = path.dirname(targetPath)\n await fs.mkdir(targetDir, { recursive: true })\n\n // Copy the file\n await fs.copyFile(sourcePath, targetPath)\n synced++\n } else if (file.operation === 'delete') {\n // Delete file from target\n const targetPath = `${plan.target}/${file.path}`\n const fs = await import('fs/promises')\n try {\n await fs.unlink(targetPath)\n synced++\n } catch (error: any) {\n // Ignore if file doesn't exist\n if (error.code !== 'ENOENT') {\n throw error\n }\n synced++\n }\n } else {\n // Skip operation\n synced++\n }\n } catch (error) {\n failed++\n errors.push({\n path: file.path,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n return {\n success: failed === 0,\n plan,\n synced,\n failed,\n skipped: plan.skipped.length,\n errors,\n duration: Date.now() - startTime,\n timestamp: Date.now(),\n }\n }\n\n /**\n * Update manifest after sync\n */\n async updateManifest(\n org: string,\n project: string,\n syncedFiles: FileSyncStatus[]\n ): Promise<void> {\n const manifest = await this.getOrCreateManifest(org, project)\n const now = Date.now()\n\n for (const file of syncedFiles) {\n if (file.operation === 'delete') {\n delete manifest.entries[file.path]\n } else if (file.operation === 'create' || file.operation === 'update') {\n manifest.entries[file.path] = {\n path: file.path,\n hash: file.hash ?? '',\n size: file.size ?? 0,\n syncedAt: now,\n source: 'local',\n }\n }\n }\n\n manifest.lastSync = now\n await this.saveManifest(manifest)\n }\n\n /**\n * Get sync status for a file\n */\n async getFileStatus(path: string): Promise<SyncManifestEntry | null> {\n const manifest = await this.loadManifest()\n return manifest?.entries[path] ?? null\n }\n\n /**\n * Check if a file is synced\n */\n async isFileSynced(path: string): Promise<boolean> {\n const status = await this.getFileStatus(path)\n return status !== null\n }\n\n /**\n * Get last sync timestamp\n */\n async getLastSyncTime(): Promise<number | null> {\n const manifest = await this.loadManifest()\n return manifest?.lastSync ?? null\n }\n\n /**\n * Clear sync manifest\n */\n async clearManifest(): Promise<void> {\n try {\n await this.localStorage.delete(this.manifestPath)\n this.manifest = null\n } catch {\n // Ignore if manifest doesn't exist\n }\n }\n\n /**\n * Get sync configuration\n */\n getConfig(): SyncConfig {\n return { ...this.config }\n }\n\n /**\n * Update sync configuration\n */\n updateConfig(updates: Partial<SyncConfig>): void {\n this.config = {\n ...this.config,\n ...updates,\n }\n }\n}\n\n/**\n * Create a sync manager\n */\nexport function createSyncManager(config: SyncManagerConfig): SyncManager {\n return new SyncManager(config)\n}\n","/**\n * Permission types\n *\n * Type definitions for the permissions system.\n */\n\n/**\n * Permission levels\n */\nexport type PermissionLevel = 'none' | 'read' | 'write' | 'admin'\n\n/**\n * Permission scope\n */\nexport type PermissionScope = 'global' | 'org' | 'project' | 'path'\n\n/**\n * Permission action\n */\nexport type PermissionAction = 'fetch' | 'cache' | 'sync' | 'invalidate' | 'manage'\n\n/**\n * Permission rule\n */\nexport interface PermissionRule {\n /** Rule ID */\n id?: string\n /** Pattern to match (glob) */\n pattern: string\n /** Actions this rule applies to */\n actions: PermissionAction[]\n /** Permission level granted */\n level: PermissionLevel\n /** Scope of the rule */\n scope: PermissionScope\n /** Organization filter (for org scope) */\n org?: string\n /** Project filter (for project scope) */\n project?: string\n /** Priority (higher = evaluated first) */\n priority?: number\n /** Description of the rule */\n description?: string\n /** Whether rule is active */\n enabled?: boolean\n}\n\n/**\n * Permission context\n *\n * Context for evaluating permissions.\n */\nexport interface PermissionContext {\n /** Current organization */\n org?: string\n /** Current project */\n project?: string\n /** Current environment */\n environment?: string\n /** User/agent identity */\n identity?: string\n /** Additional context data */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Permission check result\n */\nexport interface PermissionResult {\n /** Whether the action is allowed */\n allowed: boolean\n /** Permission level granted */\n level: PermissionLevel\n /** Matching rule (if any) */\n matchedRule?: PermissionRule\n /** Reason for the decision */\n reason: string\n}\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n /** Default permission level */\n defaultLevel: PermissionLevel\n /** Whether to allow by default when no rules match */\n defaultAllow: boolean\n /** Global permission rules */\n rules: PermissionRule[]\n /** Whether permissions are enforced */\n enforced: boolean\n}\n\n/**\n * Default permission configuration\n */\nexport const DEFAULT_PERMISSION_CONFIG: PermissionConfig = {\n defaultLevel: 'read',\n defaultAllow: true,\n rules: [],\n enforced: false,\n}\n\n/**\n * Permission levels ordered by access\n */\nexport const PERMISSION_LEVEL_ORDER: PermissionLevel[] = ['none', 'read', 'write', 'admin']\n\n/**\n * Check if a level grants another level\n */\nexport function levelGrants(granted: PermissionLevel, required: PermissionLevel): boolean {\n const grantedIndex = PERMISSION_LEVEL_ORDER.indexOf(granted)\n const requiredIndex = PERMISSION_LEVEL_ORDER.indexOf(required)\n return grantedIndex >= requiredIndex\n}\n\n/**\n * Get the higher of two permission levels\n */\nexport function maxLevel(a: PermissionLevel, b: PermissionLevel): PermissionLevel {\n const aIndex = PERMISSION_LEVEL_ORDER.indexOf(a)\n const bIndex = PERMISSION_LEVEL_ORDER.indexOf(b)\n return PERMISSION_LEVEL_ORDER[Math.max(aIndex, bIndex)] ?? 'none'\n}\n\n/**\n * Get the lower of two permission levels\n */\nexport function minLevel(a: PermissionLevel, b: PermissionLevel): PermissionLevel {\n const aIndex = PERMISSION_LEVEL_ORDER.indexOf(a)\n const bIndex = PERMISSION_LEVEL_ORDER.indexOf(b)\n return PERMISSION_LEVEL_ORDER[Math.min(aIndex, bIndex)] ?? 'none'\n}\n","/**\n * Permission evaluator\n *\n * Evaluates permission rules to determine access levels.\n */\n\nimport micromatch from 'micromatch'\nimport type {\n PermissionRule,\n PermissionContext,\n PermissionResult,\n PermissionConfig,\n PermissionLevel,\n PermissionAction,\n} from './types.js'\nimport { levelGrants } from './types.js'\n\n/**\n * Check if a rule matches the given context\n */\nexport function ruleMatchesContext(rule: PermissionRule, context: PermissionContext): boolean {\n // Check if rule is enabled\n if (rule.enabled === false) {\n return false\n }\n\n // Check scope constraints\n switch (rule.scope) {\n case 'org':\n if (rule.org && context.org !== rule.org) {\n return false\n }\n break\n case 'project':\n if (rule.org && context.org !== rule.org) {\n return false\n }\n if (rule.project && context.project !== rule.project) {\n return false\n }\n break\n }\n\n return true\n}\n\n/**\n * Check if a rule matches a path\n */\nexport function ruleMatchesPath(rule: PermissionRule, path: string): boolean {\n return micromatch.isMatch(path, rule.pattern)\n}\n\n/**\n * Check if a rule matches an action\n */\nexport function ruleMatchesAction(rule: PermissionRule, action: PermissionAction): boolean {\n return rule.actions.includes(action)\n}\n\n/**\n * Evaluate permission for a path and action\n */\nexport function evaluatePermission(\n path: string,\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): PermissionResult {\n // Sort rules by priority (higher first)\n const sortedRules = [...config.rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n\n // Find first matching rule\n for (const rule of sortedRules) {\n if (!ruleMatchesContext(rule, context)) {\n continue\n }\n\n if (!ruleMatchesPath(rule, path)) {\n continue\n }\n\n if (!ruleMatchesAction(rule, action)) {\n continue\n }\n\n // Rule matches\n return {\n allowed: rule.level !== 'none',\n level: rule.level,\n matchedRule: rule,\n reason: `Matched rule: ${rule.description ?? rule.pattern}`,\n }\n }\n\n // No rule matched - use default\n return {\n allowed: config.defaultAllow,\n level: config.defaultLevel,\n reason: config.defaultAllow ? 'Allowed by default' : 'Denied by default',\n }\n}\n\n/**\n * Check if an action is allowed for a path\n */\nexport function isAllowed(\n path: string,\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): boolean {\n const result = evaluatePermission(path, action, context, config)\n return result.allowed\n}\n\n/**\n * Check if a specific permission level is granted\n */\nexport function hasPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel,\n context: PermissionContext,\n config: PermissionConfig\n): boolean {\n const result = evaluatePermission(path, action, context, config)\n return levelGrants(result.level, requiredLevel)\n}\n\n/**\n * Evaluate permissions for multiple paths\n */\nexport function evaluatePermissions(\n paths: string[],\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): Map<string, PermissionResult> {\n const results = new Map<string, PermissionResult>()\n\n for (const path of paths) {\n results.set(path, evaluatePermission(path, action, context, config))\n }\n\n return results\n}\n\n/**\n * Filter paths by permission\n */\nexport function filterByPermission(\n paths: string[],\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig,\n requiredLevel: PermissionLevel = 'read'\n): string[] {\n return paths.filter((path) => {\n const result = evaluatePermission(path, action, context, config)\n return levelGrants(result.level, requiredLevel)\n })\n}\n\n/**\n * Validate permission rules\n */\nexport function validateRules(rules: PermissionRule[]): string[] {\n const errors: string[] = []\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]\n if (!rule) continue\n\n // Check pattern\n if (!rule.pattern || rule.pattern.trim() === '') {\n errors.push(`Rule ${i}: pattern is empty`)\n continue\n }\n\n // Validate pattern\n try {\n micromatch.isMatch('test', rule.pattern)\n } catch {\n errors.push(`Rule ${i}: invalid pattern \"${rule.pattern}\"`)\n }\n\n // Check actions\n if (!rule.actions || rule.actions.length === 0) {\n errors.push(`Rule ${i}: actions are empty`)\n }\n\n // Validate scope constraints\n if (rule.scope === 'org' && !rule.org) {\n errors.push(`Rule ${i}: org scope requires org field`)\n }\n\n if (rule.scope === 'project' && !rule.project) {\n errors.push(`Rule ${i}: project scope requires project field`)\n }\n }\n\n return errors\n}\n\n/**\n * Create a permission rule\n */\nexport function createRule(options: {\n pattern: string\n actions: PermissionAction[]\n level: PermissionLevel\n scope?: PermissionRule['scope']\n org?: string\n project?: string\n priority?: number\n description?: string\n}): PermissionRule {\n return {\n pattern: options.pattern,\n actions: options.actions,\n level: options.level,\n scope: options.scope ?? 'global',\n org: options.org,\n project: options.project,\n priority: options.priority ?? 0,\n description: options.description,\n enabled: true,\n }\n}\n\n/**\n * Create common permission rules\n */\nexport const CommonRules = {\n /** Allow all actions for docs */\n allowDocs: (): PermissionRule =>\n createRule({\n pattern: 'docs/**',\n actions: ['fetch', 'cache', 'sync'],\n level: 'read',\n description: 'Allow read access to docs',\n }),\n\n /** Deny access to private files */\n denyPrivate: (): PermissionRule =>\n createRule({\n pattern: '**/.private/**',\n actions: ['fetch', 'cache', 'sync'],\n level: 'none',\n priority: 100,\n description: 'Deny access to private files',\n }),\n\n /** Read-only access to specs */\n readOnlySpecs: (): PermissionRule =>\n createRule({\n pattern: 'specs/**',\n actions: ['fetch', 'cache'],\n level: 'read',\n description: 'Read-only access to specs',\n }),\n\n /** Admin access for management */\n adminManage: (): PermissionRule =>\n createRule({\n pattern: '**',\n actions: ['manage', 'invalidate'],\n level: 'admin',\n description: 'Admin access for management operations',\n }),\n}\n","/**\n * Permission manager\n *\n * Manages permission rules and provides a high-level API\n * for permission checks.\n */\n\nimport type {\n PermissionRule,\n PermissionContext,\n PermissionResult,\n PermissionConfig,\n PermissionLevel,\n PermissionAction,\n} from './types.js'\nimport { DEFAULT_PERMISSION_CONFIG, levelGrants } from './types.js'\nimport { evaluatePermission, validateRules, filterByPermission } from './evaluator.js'\n\n/**\n * Permission manager configuration\n */\nexport interface PermissionManagerConfig {\n /** Initial configuration */\n config?: Partial<PermissionConfig>\n /** Default context */\n defaultContext?: PermissionContext\n}\n\n/**\n * Permission manager\n *\n * Provides a centralized API for managing and checking permissions.\n */\nexport class PermissionManager {\n private config: PermissionConfig\n private defaultContext: PermissionContext\n\n constructor(options: PermissionManagerConfig = {}) {\n this.config = {\n ...DEFAULT_PERMISSION_CONFIG,\n ...options.config,\n // Create a new rules array to avoid shared state\n rules: options.config?.rules ? [...options.config.rules] : [],\n }\n this.defaultContext = options.defaultContext ?? {}\n }\n\n /**\n * Check if an action is allowed for a path\n */\n isAllowed(\n path: string,\n action: PermissionAction,\n context?: PermissionContext\n ): boolean {\n const result = this.evaluate(path, action, context)\n return result.allowed\n }\n\n /**\n * Check if a permission level is granted\n */\n hasPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel,\n context?: PermissionContext\n ): boolean {\n const result = this.evaluate(path, action, context)\n return levelGrants(result.level, requiredLevel)\n }\n\n /**\n * Evaluate permission for a path and action\n */\n evaluate(\n path: string,\n action: PermissionAction,\n context?: PermissionContext\n ): PermissionResult {\n const mergedContext = { ...this.defaultContext, ...context }\n\n // If permissions are not enforced, allow everything\n if (!this.config.enforced) {\n return {\n allowed: true,\n level: 'admin',\n reason: 'Permissions not enforced',\n }\n }\n\n return evaluatePermission(path, action, mergedContext, this.config)\n }\n\n /**\n * Filter paths by permission\n */\n filterAllowed(\n paths: string[],\n action: PermissionAction,\n context?: PermissionContext,\n requiredLevel: PermissionLevel = 'read'\n ): string[] {\n const mergedContext = { ...this.defaultContext, ...context }\n\n if (!this.config.enforced) {\n return paths\n }\n\n return filterByPermission(paths, action, mergedContext, this.config, requiredLevel)\n }\n\n /**\n * Add a permission rule\n */\n addRule(rule: PermissionRule): void {\n const errors = validateRules([rule])\n if (errors.length > 0) {\n throw new Error(`Invalid rule: ${errors.join(', ')}`)\n }\n\n this.config.rules.push(rule)\n }\n\n /**\n * Remove a permission rule by ID\n */\n removeRule(id: string): boolean {\n const index = this.config.rules.findIndex((r) => r.id === id)\n if (index === -1) {\n return false\n }\n\n this.config.rules.splice(index, 1)\n return true\n }\n\n /**\n * Get all rules\n */\n getRules(): PermissionRule[] {\n return [...this.config.rules]\n }\n\n /**\n * Clear all rules\n */\n clearRules(): void {\n this.config.rules = []\n }\n\n /**\n * Set rules (replace all)\n */\n setRules(rules: PermissionRule[]): void {\n const errors = validateRules(rules)\n if (errors.length > 0) {\n throw new Error(`Invalid rules: ${errors.join(', ')}`)\n }\n\n this.config.rules = [...rules]\n }\n\n /**\n * Get configuration\n */\n getConfig(): PermissionConfig {\n return { ...this.config, rules: [...this.config.rules] }\n }\n\n /**\n * Update configuration\n */\n updateConfig(updates: Partial<Omit<PermissionConfig, 'rules'>>): void {\n this.config = {\n ...this.config,\n ...updates,\n }\n }\n\n /**\n * Set default context\n */\n setDefaultContext(context: PermissionContext): void {\n this.defaultContext = { ...context }\n }\n\n /**\n * Get default context\n */\n getDefaultContext(): PermissionContext {\n return { ...this.defaultContext }\n }\n\n /**\n * Enable permission enforcement\n */\n enable(): void {\n this.config.enforced = true\n }\n\n /**\n * Disable permission enforcement\n */\n disable(): void {\n this.config.enforced = false\n }\n\n /**\n * Check if permissions are enforced\n */\n isEnforced(): boolean {\n return this.config.enforced\n }\n\n /**\n * Assert permission (throws if denied)\n */\n assertPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel = 'read',\n context?: PermissionContext\n ): void {\n const result = this.evaluate(path, action, context)\n\n if (!levelGrants(result.level, requiredLevel)) {\n throw new PermissionDeniedError(\n `Permission denied for ${action} on ${path}: ${result.reason}`,\n path,\n action,\n result\n )\n }\n }\n}\n\n/**\n * Permission denied error\n */\nexport class PermissionDeniedError extends Error {\n constructor(\n message: string,\n public readonly path: string,\n public readonly action: PermissionAction,\n public readonly result: PermissionResult\n ) {\n super(message)\n this.name = 'PermissionDeniedError'\n }\n}\n\n/**\n * Create a permission manager\n */\nexport function createPermissionManager(config?: PermissionManagerConfig): PermissionManager {\n return new PermissionManager(config)\n}\n\n/**\n * Default permission manager instance\n */\nlet defaultManager: PermissionManager | null = null\n\n/**\n * Get the default permission manager\n */\nexport function getDefaultPermissionManager(): PermissionManager {\n if (!defaultManager) {\n defaultManager = createPermissionManager()\n }\n return defaultManager\n}\n\n/**\n * Set the default permission manager\n */\nexport function setDefaultPermissionManager(manager: PermissionManager): void {\n defaultManager = manager\n}\n","/**\n * Version detection\n *\n * Detects configuration version for migration.\n */\n\nimport type {\n LegacyCodexConfig,\n ModernCodexConfig,\n VersionDetectionResult,\n} from './types.js'\n\n/**\n * Detect configuration version\n */\nexport function detectVersion(config: unknown): VersionDetectionResult {\n if (!config || typeof config !== 'object') {\n return {\n version: 'unknown',\n confidence: 'high',\n reason: 'Invalid configuration object',\n }\n }\n\n const obj = config as Record<string, unknown>\n\n // Check for explicit version field (v3.0)\n if (obj.version === '3.0') {\n return {\n version: '3.0',\n confidence: 'high',\n reason: 'Explicit version field found',\n }\n }\n\n // Check for v3.0 structure markers\n if (isModernConfig(config)) {\n return {\n version: '3.0',\n confidence: 'medium',\n reason: 'Modern structure detected (organization object, sync.patterns)',\n }\n }\n\n // Check for v2.x markers\n if (isLegacyConfig(config)) {\n return {\n version: '2.x',\n confidence: 'high',\n reason: 'Legacy structure detected (org/defaultOrg/codexRepo at top level)',\n }\n }\n\n // Ambiguous - check for any recognizable fields\n const knownFields = [\n 'org',\n 'defaultOrg',\n 'codexRepo',\n 'autoSync',\n 'syncRules',\n 'organization',\n 'sync',\n 'cache',\n ]\n\n const hasKnownFields = knownFields.some((field) => field in obj)\n\n if (hasKnownFields) {\n return {\n version: '2.x',\n confidence: 'low',\n reason: 'Some known fields found, assuming v2.x',\n }\n }\n\n return {\n version: 'unknown',\n confidence: 'high',\n reason: 'No recognizable configuration structure',\n }\n}\n\n/**\n * Check if config matches modern v3.0 structure\n */\nexport function isModernConfig(config: unknown): config is ModernCodexConfig {\n if (!config || typeof config !== 'object') {\n return false\n }\n\n const obj = config as Record<string, unknown>\n\n // Must have organization object with name and codexRepo\n if (!obj.organization || typeof obj.organization !== 'object') {\n return false\n }\n\n const org = obj.organization as Record<string, unknown>\n if (typeof org.name !== 'string' || typeof org.codexRepo !== 'string') {\n return false\n }\n\n // Must have sync object with patterns array\n if (!obj.sync || typeof obj.sync !== 'object') {\n return false\n }\n\n const sync = obj.sync as Record<string, unknown>\n if (!Array.isArray(sync.patterns)) {\n return false\n }\n\n return true\n}\n\n/**\n * Check if config matches legacy v2.x structure\n */\nexport function isLegacyConfig(config: unknown): config is LegacyCodexConfig {\n if (!config || typeof config !== 'object') {\n return false\n }\n\n const obj = config as Record<string, unknown>\n\n // Look for v2.x markers\n const legacyMarkers = ['org', 'defaultOrg', 'codexRepo', 'codexPath']\n const hasLegacyMarker = legacyMarkers.some(\n (marker) => marker in obj && typeof obj[marker] === 'string'\n )\n\n if (hasLegacyMarker) {\n return true\n }\n\n // Check for legacy autoSync array\n if (Array.isArray(obj.autoSync)) {\n return true\n }\n\n // Check for legacy syncRules object\n if (obj.syncRules && typeof obj.syncRules === 'object') {\n const syncRules = obj.syncRules as Record<string, unknown>\n if (Array.isArray(syncRules.include) || Array.isArray(syncRules.exclude)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Check if migration is needed\n */\nexport function needsMigration(config: unknown): boolean {\n const detection = detectVersion(config)\n return detection.version === '2.x'\n}\n\n/**\n * Get migration requirements\n */\nexport function getMigrationRequirements(config: unknown): string[] {\n const requirements: string[] = []\n\n if (!config || typeof config !== 'object') {\n requirements.push('Valid configuration object required')\n return requirements\n }\n\n const obj = config as Record<string, unknown>\n\n // Check org\n if (!obj.org && !obj.defaultOrg) {\n requirements.push('Organization name is required (org or defaultOrg)')\n }\n\n // Check codex repo\n if (!obj.codexRepo && !obj.codexPath) {\n requirements.push('Codex repository name is required (codexRepo or codexPath)')\n }\n\n return requirements\n}\n","/**\n * Configuration migrator\n *\n * Migrates v2.x configurations to v3.0 format.\n */\n\nimport type {\n LegacyCodexConfig,\n LegacyAutoSyncPattern,\n ModernCodexConfig,\n ModernSyncPattern,\n MigrationResult,\n MigrationOptions,\n} from './types.js'\nimport { detectVersion, isLegacyConfig, isModernConfig } from './detector.js'\n\n/**\n * Default migration options\n */\nexport const DEFAULT_MIGRATION_OPTIONS: MigrationOptions = {\n preserveUnknown: false,\n strict: false,\n defaultOrg: 'organization',\n defaultCodexRepo: 'codex',\n}\n\n/**\n * Migrate configuration from v2.x to v3.0\n */\nexport function migrateConfig(\n config: unknown,\n options: MigrationOptions = {}\n): MigrationResult {\n const mergedOptions = { ...DEFAULT_MIGRATION_OPTIONS, ...options }\n const result: MigrationResult = {\n success: false,\n warnings: [],\n errors: [],\n changes: [],\n }\n\n // Detect version\n const detection = detectVersion(config)\n\n if (detection.version === '3.0') {\n if (isModernConfig(config)) {\n result.success = true\n result.config = config\n result.warnings.push('Configuration is already v3.0, no migration needed')\n return result\n }\n }\n\n if (detection.version === 'unknown') {\n result.errors.push(`Cannot migrate: ${detection.reason}`)\n return result\n }\n\n if (!isLegacyConfig(config)) {\n result.errors.push('Configuration does not match expected v2.x format')\n return result\n }\n\n try {\n const migrated = performMigration(config, mergedOptions, result)\n result.config = migrated\n result.success = true\n } catch (error) {\n result.errors.push(\n `Migration failed: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n\n return result\n}\n\n/**\n * Perform the actual migration\n */\nfunction performMigration(\n legacy: LegacyCodexConfig,\n options: MigrationOptions,\n result: MigrationResult\n): ModernCodexConfig {\n // Extract org name\n const orgName = legacy.org || legacy.defaultOrg || options.defaultOrg!\n\n if (legacy.org && legacy.defaultOrg && legacy.org !== legacy.defaultOrg) {\n result.warnings.push(\n `Both 'org' and 'defaultOrg' specified with different values. Using 'org': ${legacy.org}`\n )\n }\n\n if (!legacy.org && !legacy.defaultOrg) {\n result.changes.push({\n type: 'added',\n path: 'organization.name',\n newValue: orgName,\n description: `Added default organization name: ${orgName}`,\n })\n } else {\n const fieldUsed = legacy.org ? 'org' : 'defaultOrg'\n result.changes.push({\n type: 'renamed',\n path: 'organization.name',\n oldValue: fieldUsed,\n newValue: 'organization.name',\n description: `Renamed '${fieldUsed}' to 'organization.name'`,\n })\n }\n\n // Extract codex repo\n const codexRepo = legacy.codexRepo || legacy.codexPath || options.defaultCodexRepo!\n\n if (legacy.codexRepo && legacy.codexPath && legacy.codexRepo !== legacy.codexPath) {\n result.warnings.push(\n `Both 'codexRepo' and 'codexPath' specified with different values. Using 'codexRepo': ${legacy.codexRepo}`\n )\n }\n\n if (!legacy.codexRepo && !legacy.codexPath) {\n result.changes.push({\n type: 'added',\n path: 'organization.codexRepo',\n newValue: codexRepo,\n description: `Added default codex repository: ${codexRepo}`,\n })\n } else {\n const fieldUsed = legacy.codexRepo ? 'codexRepo' : 'codexPath'\n result.changes.push({\n type: 'renamed',\n path: 'organization.codexRepo',\n oldValue: fieldUsed,\n newValue: 'organization.codexRepo',\n description: `Renamed '${fieldUsed}' to 'organization.codexRepo'`,\n })\n }\n\n // Migrate auto-sync patterns\n const patterns: ModernSyncPattern[] = []\n\n if (legacy.autoSync && legacy.autoSync.length > 0) {\n for (const legacyPattern of legacy.autoSync) {\n const modernPattern = migrateSyncPattern(legacyPattern, result)\n patterns.push(modernPattern)\n }\n\n result.changes.push({\n type: 'transformed',\n path: 'sync.patterns',\n oldValue: 'autoSync',\n newValue: 'sync.patterns',\n description: `Converted ${legacy.autoSync.length} auto-sync pattern(s) to modern format`,\n })\n }\n\n // Migrate sync rules\n const include: string[] = []\n const exclude: string[] = []\n\n if (legacy.syncRules) {\n if (legacy.syncRules.include) {\n include.push(...legacy.syncRules.include)\n result.changes.push({\n type: 'renamed',\n path: 'sync.include',\n oldValue: 'syncRules.include',\n newValue: 'sync.include',\n description: 'Moved syncRules.include to sync.include',\n })\n }\n\n if (legacy.syncRules.exclude) {\n exclude.push(...legacy.syncRules.exclude)\n result.changes.push({\n type: 'renamed',\n path: 'sync.exclude',\n oldValue: 'syncRules.exclude',\n newValue: 'sync.exclude',\n description: 'Moved syncRules.exclude to sync.exclude',\n })\n }\n }\n\n // Build modern config\n const modern: ModernCodexConfig = {\n version: '3.0',\n organization: {\n name: orgName,\n codexRepo,\n },\n sync: {\n patterns,\n include,\n exclude,\n defaultDirection: 'to-codex',\n },\n }\n\n // Migrate environments\n if (legacy.environments) {\n modern.environments = {}\n\n for (const [envName, envConfig] of Object.entries(legacy.environments)) {\n const envResult: MigrationResult = {\n success: false,\n warnings: [],\n errors: [],\n changes: [],\n }\n\n try {\n const migratedEnv = performMigration(\n { ...legacy, ...envConfig } as LegacyCodexConfig,\n { ...options },\n envResult\n )\n\n // Extract only the overrides\n modern.environments[envName] = {\n organization: migratedEnv.organization,\n sync: migratedEnv.sync,\n }\n\n result.changes.push({\n type: 'transformed',\n path: `environments.${envName}`,\n description: `Migrated environment '${envName}'`,\n })\n\n result.warnings.push(...envResult.warnings.map((w) => `[${envName}] ${w}`))\n } catch {\n result.warnings.push(`Failed to migrate environment '${envName}', skipping`)\n }\n }\n }\n\n result.changes.push({\n type: 'added',\n path: 'version',\n newValue: '3.0',\n description: 'Added version field',\n })\n\n return modern\n}\n\n/**\n * Migrate a single sync pattern\n */\nfunction migrateSyncPattern(\n legacy: LegacyAutoSyncPattern,\n result: MigrationResult\n): ModernSyncPattern {\n const modern: ModernSyncPattern = {\n pattern: legacy.pattern,\n }\n\n if (legacy.destination) {\n modern.target = legacy.destination\n }\n\n if (legacy.bidirectional) {\n modern.direction = 'bidirectional'\n }\n\n if (legacy.targets && legacy.targets.length > 0) {\n result.warnings.push(\n `Pattern '${legacy.pattern}' had multiple targets (${legacy.targets.join(', ')}). ` +\n 'In v3.0, each target should be a separate pattern.'\n )\n\n // Use first target\n if (!modern.target && legacy.targets[0]) {\n modern.target = legacy.targets[0]\n }\n }\n\n return modern\n}\n\n/**\n * Validate migrated configuration\n */\nexport function validateMigratedConfig(config: ModernCodexConfig): string[] {\n const errors: string[] = []\n\n if (config.version !== '3.0') {\n errors.push(`Invalid version: ${config.version}, expected '3.0'`)\n }\n\n if (!config.organization) {\n errors.push('Missing organization configuration')\n } else {\n if (!config.organization.name) {\n errors.push('Missing organization.name')\n }\n if (!config.organization.codexRepo) {\n errors.push('Missing organization.codexRepo')\n }\n }\n\n if (!config.sync) {\n errors.push('Missing sync configuration')\n } else {\n if (!Array.isArray(config.sync.patterns)) {\n errors.push('sync.patterns must be an array')\n }\n if (!Array.isArray(config.sync.include)) {\n errors.push('sync.include must be an array')\n }\n if (!Array.isArray(config.sync.exclude)) {\n errors.push('sync.exclude must be an array')\n }\n }\n\n return errors\n}\n\n/**\n * Generate migration report\n */\nexport function generateMigrationReport(result: MigrationResult): string {\n const lines: string[] = ['# Migration Report', '']\n\n if (result.success) {\n lines.push('Status: SUCCESS')\n } else {\n lines.push('Status: FAILED')\n }\n\n lines.push('')\n\n if (result.changes.length > 0) {\n lines.push('## Changes', '')\n\n for (const change of result.changes) {\n lines.push(`- [${change.type.toUpperCase()}] ${change.path}: ${change.description}`)\n }\n\n lines.push('')\n }\n\n if (result.warnings.length > 0) {\n lines.push('## Warnings', '')\n\n for (const warning of result.warnings) {\n lines.push(`- ${warning}`)\n }\n\n lines.push('')\n }\n\n if (result.errors.length > 0) {\n lines.push('## Errors', '')\n\n for (const error of result.errors) {\n lines.push(`- ${error}`)\n }\n\n lines.push('')\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Create empty modern config\n */\nexport function createEmptyModernConfig(\n org: string,\n codexRepo: string\n): ModernCodexConfig {\n return {\n version: '3.0',\n organization: {\n name: org,\n codexRepo,\n },\n sync: {\n patterns: [],\n include: ['**/*.md', 'CLAUDE.md'],\n exclude: ['**/node_modules/**', '**/.git/**'],\n defaultDirection: 'to-codex',\n },\n }\n}\n","/**\n * Legacy reference migration\n *\n * Converts legacy reference formats to modern codex:// URIs.\n */\n\n/**\n * Legacy reference patterns\n */\nexport const LEGACY_PATTERNS = {\n /** @codex: style references */\n CODEX_TAG: /@codex:\\s*([^\\s\\]]+)/g,\n /** [codex:...] style references */\n CODEX_BRACKET: /\\[codex:\\s*([^\\]]+)\\]/g,\n /** {{codex:...}} style references */\n CODEX_MUSTACHE: /\\{\\{codex:\\s*([^}]+)\\}\\}/g,\n /** Simple path references in specific contexts */\n SIMPLE_PATH: /codex\\/([a-zA-Z0-9_-]+\\/[a-zA-Z0-9_\\-/.]+)/g,\n}\n\n/**\n * Reference conversion result\n */\nexport interface ReferenceConversionResult {\n /** Original text */\n original: string\n /** Converted text */\n converted: string\n /** References found and converted */\n references: ConvertedReference[]\n /** Whether any changes were made */\n modified: boolean\n}\n\n/**\n * Converted reference\n */\nexport interface ConvertedReference {\n /** Original reference text */\n original: string\n /** Converted URI */\n uri: string\n /** Position in original text */\n position: number\n /** Format detected */\n format: 'codex-tag' | 'codex-bracket' | 'codex-mustache' | 'simple-path'\n}\n\n/**\n * Conversion options\n */\nexport interface ConversionOptions {\n /** Default organization */\n defaultOrg?: string\n /** Default project */\n defaultProject?: string\n /** Whether to preserve original format wrapper */\n preserveWrapper?: boolean\n}\n\n/**\n * Convert legacy references in text\n */\nexport function convertLegacyReferences(\n text: string,\n options: ConversionOptions = {}\n): ReferenceConversionResult {\n const result: ReferenceConversionResult = {\n original: text,\n converted: text,\n references: [],\n modified: false,\n }\n\n // Process each pattern type\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_TAG,\n 'codex-tag',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_BRACKET,\n 'codex-bracket',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_MUSTACHE,\n 'codex-mustache',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.SIMPLE_PATH,\n 'simple-path',\n options,\n result.references\n )\n\n result.modified = result.original !== result.converted\n\n return result\n}\n\n/**\n * Process a single pattern type\n */\nfunction processPattern(\n text: string,\n pattern: RegExp,\n format: ConvertedReference['format'],\n options: ConversionOptions,\n references: ConvertedReference[]\n): string {\n // Reset pattern lastIndex\n pattern.lastIndex = 0\n\n return text.replace(pattern, (match, captured: string, offset: number) => {\n const uri = convertToUri(captured.trim(), options)\n\n references.push({\n original: match,\n uri,\n position: offset,\n format,\n })\n\n // Return the appropriate format\n if (options.preserveWrapper) {\n switch (format) {\n case 'codex-tag':\n return `@codex: ${uri}`\n case 'codex-bracket':\n return `[${uri}]`\n case 'codex-mustache':\n return `{{${uri}}}`\n case 'simple-path':\n return uri\n }\n }\n\n return uri\n })\n}\n\n/**\n * Convert a path/reference to codex:// URI\n */\nexport function convertToUri(reference: string, options: ConversionOptions = {}): string {\n const trimmed = reference.trim()\n\n // Already a codex:// URI\n if (trimmed.startsWith('codex://')) {\n return trimmed\n }\n\n // Parse the reference to extract components\n const parts = parseReference(trimmed)\n\n // Build URI\n const org = parts.org || options.defaultOrg || '_'\n const project = parts.project || options.defaultProject || '_'\n const path = parts.path\n\n return `codex://${org}/${project}/${path}`\n}\n\n/**\n * Parse reference components\n */\ninterface ParsedReferenceComponents {\n org?: string\n project?: string\n path: string\n}\n\nfunction parseReference(reference: string): ParsedReferenceComponents {\n // Handle various formats:\n // - org/project/path\n // - project/path (org inferred)\n // - path (org and project inferred)\n // - ./path (relative)\n // - ../path (relative)\n\n const trimmed = reference.trim()\n\n // Handle relative paths\n if (trimmed.startsWith('./') || trimmed.startsWith('../')) {\n return { path: trimmed }\n }\n\n // Split by /\n const parts = trimmed.split('/')\n\n if (parts.length >= 3) {\n // Assume org/project/path format\n const [org, project, ...rest] = parts\n return {\n org: org || undefined,\n project: project || undefined,\n path: rest.join('/'),\n }\n }\n\n if (parts.length === 2) {\n // For legacy reference migration, treat 2-part paths as file paths\n // Common directory names like docs, src, specs should not be inferred as projects\n // Only explicit org/project/path format (3+ parts) will extract org/project\n\n return { path: trimmed }\n }\n\n // Single part - just the path\n return { path: trimmed }\n}\n\n/**\n * Find all legacy references in text (without converting)\n */\nexport function findLegacyReferences(text: string): ConvertedReference[] {\n const references: ConvertedReference[] = []\n\n for (const [name, pattern] of Object.entries(LEGACY_PATTERNS)) {\n pattern.lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = pattern.exec(text)) !== null) {\n const format = name\n .toLowerCase()\n .replace('_', '-') as ConvertedReference['format']\n\n references.push({\n original: match[0],\n uri: match[1] || '',\n position: match.index,\n format,\n })\n }\n }\n\n // Sort by position\n references.sort((a, b) => a.position - b.position)\n\n return references\n}\n\n/**\n * Check if text contains legacy references\n */\nexport function hasLegacyReferences(text: string): boolean {\n for (const pattern of Object.values(LEGACY_PATTERNS)) {\n pattern.lastIndex = 0\n if (pattern.test(text)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Migrate all references in a file content\n */\nexport function migrateFileReferences(\n content: string,\n options: ConversionOptions = {}\n): ReferenceConversionResult {\n return convertLegacyReferences(content, options)\n}\n\n/**\n * Generate reference migration summary\n */\nexport function generateReferenceMigrationSummary(\n results: ReferenceConversionResult[]\n): string {\n const lines: string[] = ['# Reference Migration Summary', '']\n\n let totalRefs = 0\n let modifiedFiles = 0\n\n for (const result of results) {\n if (result.modified) {\n modifiedFiles++\n }\n totalRefs += result.references.length\n }\n\n lines.push(`- Total files processed: ${results.length}`)\n lines.push(`- Files with changes: ${modifiedFiles}`)\n lines.push(`- Total references converted: ${totalRefs}`)\n lines.push('')\n\n // Group by format\n const byFormat = new Map<string, number>()\n\n for (const result of results) {\n for (const ref of result.references) {\n byFormat.set(ref.format, (byFormat.get(ref.format) || 0) + 1)\n }\n }\n\n if (byFormat.size > 0) {\n lines.push('## References by Format', '')\n\n for (const [format, count] of byFormat.entries()) {\n lines.push(`- ${format}: ${count}`)\n }\n }\n\n return lines.join('\\n')\n}\n"]}
1
+ {"version":3,"sources":["../src/core/patterns/matcher.ts","../src/sync/directional-patterns.ts","../src/errors/CodexError.ts","../src/errors/ConfigurationError.ts","../src/errors/ValidationError.ts","../src/references/validator.ts","../src/references/parser.ts","../src/references/resolver.ts","../src/types/built-in.ts","../src/types/registry.ts","../src/types/custom.ts","../src/schemas/metadata.ts","../src/schemas/config.ts","../src/core/metadata/parser.ts","../src/core/patterns/index.ts","../src/core/config/organization.ts","../src/core/config/defaults.ts","../src/core/config/loader.ts","../src/core/routing/evaluator.ts","../src/core/custom/destinations.ts","../src/storage/provider.ts","../src/storage/local.ts","../src/storage/github.ts","../src/storage/http.ts","../src/storage/manager.ts","../src/cache/entry.ts","../src/cache/persistence.ts","../src/cache/manager.ts","../src/sync/types.ts","../src/sync/evaluator.ts","../src/sync/planner.ts","../src/sync/routing-scanner.ts","../src/sync/manager.ts","../src/permissions/types.ts","../src/permissions/evaluator.ts","../src/permissions/manager.ts","../src/migration/detector.ts","../src/migration/migrator.ts","../src/migration/references.ts"],"names":["micromatch","path","z","fs","matchFromCodexPattern","firstSlash","matchToCodexPattern","validateRules","defaultManager","parseReference"],"mappings":"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","file":"index.js","sourcesContent":["import micromatch from 'micromatch'\n\n/**\n * Match a pattern against a value using glob syntax\n *\n * Based on SPEC-00003: Pattern Matching\n *\n * @param pattern - Glob pattern (e.g., \"api-*\", \"core-*\")\n * @param value - Value to test (e.g., \"api-gateway\")\n * @returns true if pattern matches value\n */\nexport function matchPattern(pattern: string, value: string): boolean {\n // Special case: exact match\n if (pattern === value) return true\n\n // Use micromatch for glob pattern matching\n return micromatch.isMatch(value, pattern)\n}\n\n/**\n * Check if value matches any pattern in array\n *\n * @param patterns - Array of glob patterns\n * @param value - Value to test\n * @returns true if value matches any pattern\n */\nexport function matchAnyPattern(\n patterns: string[],\n value: string\n): boolean {\n // Special case: [*] matches everything\n if (patterns.length === 1 && patterns[0] === '*') {\n return true\n }\n\n // Empty array matches nothing\n if (patterns.length === 0) {\n return false\n }\n\n // Check each pattern\n return patterns.some(pattern => matchPattern(pattern, value))\n}\n\n/**\n * Filter values that match any pattern\n *\n * @param patterns - Array of glob patterns\n * @param values - Array of values to filter\n * @returns Values that match any pattern\n */\nexport function filterByPatterns(\n patterns: string[],\n values: string[]\n): string[] {\n return values.filter(value => matchAnyPattern(patterns, value))\n}\n\n/**\n * Evaluate include/exclude rules\n *\n * @param options - Evaluation options\n * @returns true if value should be included\n */\nexport function evaluatePatterns(options: {\n value: string\n include?: string[]\n exclude?: string[]\n}): boolean {\n const { value, include = [], exclude = [] } = options\n\n // Check exclusions first (exclusions take priority)\n if (exclude.length > 0 && matchAnyPattern(exclude, value)) {\n return false\n }\n\n // Check inclusions\n if (include.length === 0) {\n // No include patterns = include by default\n return true\n }\n\n return matchAnyPattern(include, value)\n}\n","/**\n * Pattern matching for directional sync (to-codex / from-codex)\n *\n * Provides functions to evaluate if files should sync based on directional\n * sync configuration patterns.\n */\n\nimport { matchPattern } from '../core/patterns/matcher.js'\n\n/**\n * Check if a local file path matches to_codex patterns\n *\n * Used when syncing TO codex to determine which local files should be pushed.\n */\nexport function matchToCodexPattern(filePath: string, patterns: string[]): boolean {\n if (!patterns || patterns.length === 0) {\n return false\n }\n\n return patterns.some((pattern) => matchPattern(pattern, filePath))\n}\n\n/**\n * Check if a codex file path matches from_codex patterns\n *\n * Used when syncing FROM codex to determine which codex files should be pulled.\n * Supports two pattern formats:\n * - \"project-name/path/pattern\" - matches files from specific project\n * - \"path/pattern\" - matches files from target project itself\n */\nexport function matchFromCodexPattern(\n codexFilePath: string,\n patterns: string[],\n targetProject: string\n): boolean {\n if (!patterns || patterns.length === 0) {\n return false\n }\n\n return patterns.some((pattern) => {\n // Special case: patterns starting with \"projects/\" should match directly\n // This handles codex repositories with a projects/ subdirectory structure\n if (pattern.startsWith('projects/')) {\n return matchPattern(pattern, codexFilePath)\n }\n\n // Check if pattern includes a project prefix\n // Project names contain dots (e.g., \"etl.corthion.ai\")\n // Path segments don't (e.g., \"docs\")\n const projectSeparatorIndex = pattern.indexOf('/')\n\n if (projectSeparatorIndex === -1) {\n // No slash - pattern applies to target project only\n const fullPattern = `${targetProject}/${pattern}`\n return matchPattern(fullPattern, codexFilePath)\n }\n\n // Extract first segment before slash\n const firstSegment = pattern.substring(0, projectSeparatorIndex)\n\n // Check if first segment looks like a project name (contains dots)\n if (firstSegment.includes('.')) {\n // Has dots - likely a project name, match directly\n return matchPattern(pattern, codexFilePath)\n } else {\n // No dots - likely a path segment, prepend target project\n const fullPattern = `${targetProject}/${pattern}`\n return matchPattern(fullPattern, codexFilePath)\n }\n })\n}\n\n/**\n * Extract project name from codex file path\n */\nexport function extractProjectFromCodexPath(codexFilePath: string): string | null {\n const firstSlashIndex = codexFilePath.indexOf('/')\n if (firstSlashIndex === -1) {\n return null\n }\n return codexFilePath.substring(0, firstSlashIndex)\n}\n\n/**\n * Get relative path within project from codex file path\n */\nexport function getRelativePath(codexFilePath: string): string | null {\n const firstSlashIndex = codexFilePath.indexOf('/')\n if (firstSlashIndex === -1) {\n return null\n }\n return codexFilePath.substring(firstSlashIndex + 1)\n}\n\n/**\n * Expand placeholders in patterns\n * Supports {project} placeholder which expands to the target project name\n */\nexport function expandPlaceholders(\n patterns: string[] | undefined,\n targetProject: string\n): string[] | undefined {\n if (!patterns) {\n return patterns\n }\n\n return patterns.map((pattern) => pattern.replace(/{project}/g, targetProject))\n}\n","/**\n * Base error class for all Codex SDK errors\n */\nexport class CodexError extends Error {\n constructor(\n message: string,\n options?: ErrorOptions\n ) {\n super(message, options)\n this.name = 'CodexError'\n Object.setPrototypeOf(this, CodexError.prototype)\n }\n}\n","import { CodexError } from './CodexError.js'\n\n/**\n * Error thrown when configuration is missing or invalid\n */\nexport class ConfigurationError extends CodexError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ConfigurationError'\n Object.setPrototypeOf(this, ConfigurationError.prototype)\n }\n}\n","import { CodexError } from './CodexError.js'\n\n/**\n * Error thrown when data validation fails\n */\nexport class ValidationError extends CodexError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n","/**\n * Path validation utilities for codex references\n *\n * Provides security validation to prevent directory traversal attacks\n * and other path-based security issues.\n */\n\nimport path from 'path'\n\n/**\n * Forbidden path patterns that could indicate security issues\n */\nconst FORBIDDEN_PATTERNS = [\n /^\\//, // Absolute paths\n /\\.\\./, // Parent directory traversal\n /^~/, // Home directory expansion\n /\\0/, // Null bytes\n]\n\n/**\n * Forbidden protocol prefixes\n */\nconst FORBIDDEN_PROTOCOLS = ['file:', 'http:', 'https:', 'ftp:', 'data:', 'javascript:']\n\n/**\n * Validate a path component to ensure it's safe\n *\n * @param filePath - The path to validate\n * @returns true if the path is safe, false otherwise\n */\nexport function validatePath(filePath: string): boolean {\n // Empty paths are invalid\n if (!filePath || filePath.trim() === '') {\n return false\n }\n\n // Check for forbidden patterns\n for (const pattern of FORBIDDEN_PATTERNS) {\n if (pattern.test(filePath)) {\n return false\n }\n }\n\n // Check for protocol prefixes\n const lowerPath = filePath.toLowerCase()\n for (const protocol of FORBIDDEN_PROTOCOLS) {\n if (lowerPath.startsWith(protocol)) {\n return false\n }\n }\n\n // Normalize and check for traversal after normalization\n const normalized = path.normalize(filePath)\n if (normalized.startsWith('..') || normalized.includes('/../') || normalized.includes('\\\\..\\\\')) {\n return false\n }\n\n return true\n}\n\n/**\n * Sanitize a path by removing dangerous components\n *\n * @param filePath - The path to sanitize\n * @returns The sanitized path\n */\nexport function sanitizePath(filePath: string): string {\n if (!filePath) {\n return ''\n }\n\n // Remove protocol prefixes\n let sanitized = filePath\n for (const protocol of FORBIDDEN_PROTOCOLS) {\n if (sanitized.toLowerCase().startsWith(protocol)) {\n sanitized = sanitized.slice(protocol.length)\n }\n }\n\n // Remove leading slashes (absolute paths)\n sanitized = sanitized.replace(/^\\/+/, '')\n\n // Remove home directory expansion\n sanitized = sanitized.replace(/^~\\//, '')\n\n // Normalize the path\n sanitized = path.normalize(sanitized)\n\n // Remove any remaining parent directory references\n sanitized = sanitized.replace(/\\.\\.\\//g, '').replace(/\\.\\./g, '')\n\n // Remove leading ./ if present\n sanitized = sanitized.replace(/^\\.\\//, '')\n\n // Remove null bytes\n sanitized = sanitized.replace(/\\0/g, '')\n\n return sanitized\n}\n\n/**\n * Validate an organization name\n *\n * @param org - The organization name to validate\n * @returns true if valid, false otherwise\n */\nexport function validateOrg(org: string): boolean {\n if (!org || org.trim() === '') {\n return false\n }\n\n // Org names should be alphanumeric with hyphens/underscores\n // GitHub org names: 1-39 chars, alphanumeric or hyphen, cannot start/end with hyphen\n const orgPattern = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/\n return orgPattern.test(org) && org.length <= 39\n}\n\n/**\n * Validate a project name\n *\n * @param project - The project name to validate\n * @returns true if valid, false otherwise\n */\nexport function validateProject(project: string): boolean {\n if (!project || project.trim() === '') {\n return false\n }\n\n // Project names should be alphanumeric with hyphens/underscores/dots\n // GitHub repo names: 1-100 chars, alphanumeric, hyphen, underscore, or period\n const projectPattern = /^[a-zA-Z0-9._-]+$/\n return projectPattern.test(project) && project.length <= 100 && !project.includes('..')\n}\n\n/**\n * Validate a complete URI\n *\n * @param uri - The URI to validate\n * @returns true if the URI format is valid\n */\nexport function validateUri(uri: string): boolean {\n if (!uri || !uri.startsWith('codex://')) {\n return false\n }\n\n const pathPart = uri.slice('codex://'.length)\n const parts = pathPart.split('/')\n\n // Must have at least org/project\n if (parts.length < 2) {\n return false\n }\n\n const [org, project, ...rest] = parts\n\n if (!org || !validateOrg(org)) {\n return false\n }\n\n if (!project || !validateProject(project)) {\n return false\n }\n\n // If there's a path, validate it\n if (rest.length > 0) {\n const filePath = rest.join('/')\n if (!validatePath(filePath)) {\n return false\n }\n }\n\n return true\n}\n","/**\n * URI parsing for codex references\n *\n * Parses codex:// URIs into their component parts.\n * URI format: codex://org/project/path/to/file.md\n */\n\nimport { validateUri, validatePath, sanitizePath } from './validator.js'\n\n/**\n * Parsed reference components\n */\nexport interface ParsedReference {\n /** Original URI string */\n uri: string\n /** Organization name */\n org: string\n /** Project/repository name */\n project: string\n /** File path within project (may be empty) */\n path: string\n}\n\n/**\n * Parse options\n */\nexport interface ParseOptions {\n /** Whether to sanitize the path (default: true) */\n sanitize?: boolean\n /** Whether to validate strictly (default: true) */\n strict?: boolean\n}\n\n/**\n * The codex URI prefix\n */\nexport const CODEX_URI_PREFIX = 'codex://'\n\n/**\n * Legacy reference prefix (v2 format)\n */\nexport const LEGACY_REF_PREFIX = '@codex/'\n\n/**\n * Check if a string is a valid codex URI\n *\n * @param uri - The string to check\n * @returns true if it's a valid codex:// URI\n */\nexport function isValidUri(uri: string): boolean {\n return validateUri(uri)\n}\n\n/**\n * Check if a string is a legacy reference format\n *\n * @param ref - The string to check\n * @returns true if it's a legacy @codex/ reference\n */\nexport function isLegacyReference(ref: string): boolean {\n return ref.startsWith(LEGACY_REF_PREFIX)\n}\n\n/**\n * Convert a legacy reference to the new URI format\n *\n * @param ref - Legacy reference (e.g., @codex/project/path)\n * @param defaultOrg - Default organization to use\n * @returns The converted URI or null if invalid\n */\nexport function convertLegacyReference(ref: string, defaultOrg: string): string | null {\n if (!isLegacyReference(ref)) {\n return null\n }\n\n // Remove @codex/ prefix\n const pathPart = ref.slice(LEGACY_REF_PREFIX.length)\n const parts = pathPart.split('/')\n\n if (parts.length < 1 || !parts[0]) {\n return null\n }\n\n // Legacy format: @codex/project/path -> codex://org/project/path\n const project = parts[0]\n const filePath = parts.slice(1).join('/')\n\n if (filePath) {\n return `${CODEX_URI_PREFIX}${defaultOrg}/${project}/${filePath}`\n }\n return `${CODEX_URI_PREFIX}${defaultOrg}/${project}`\n}\n\n/**\n * Parse a codex URI into its components\n *\n * @param uri - The URI to parse (e.g., codex://org/project/path/to/file.md)\n * @param options - Parse options\n * @returns The parsed reference or null if invalid\n */\nexport function parseReference(uri: string, options: ParseOptions = {}): ParsedReference | null {\n const { sanitize = true, strict = true } = options\n\n // Must start with codex://\n if (!uri.startsWith(CODEX_URI_PREFIX)) {\n return null\n }\n\n // Strict validation\n if (strict && !validateUri(uri)) {\n return null\n }\n\n // Extract the path after codex://\n const pathPart = uri.slice(CODEX_URI_PREFIX.length)\n const parts = pathPart.split('/')\n\n // Must have at least org and project\n if (parts.length < 2) {\n return null\n }\n\n const org = parts[0]\n const project = parts[1]\n let filePath = parts.slice(2).join('/')\n\n // Validate org and project are not empty\n if (!org || !project) {\n return null\n }\n\n // Sanitize path if requested\n if (sanitize && filePath) {\n if (!validatePath(filePath)) {\n filePath = sanitizePath(filePath)\n }\n }\n\n return {\n uri,\n org,\n project,\n path: filePath,\n }\n}\n\n/**\n * Build a codex URI from components\n *\n * @param org - Organization name\n * @param project - Project name\n * @param path - Optional file path\n * @returns The constructed URI\n */\nexport function buildUri(org: string, project: string, path?: string): string {\n const base = `${CODEX_URI_PREFIX}${org}/${project}`\n if (path) {\n // Ensure path doesn't start with /\n const cleanPath = path.startsWith('/') ? path.slice(1) : path\n return `${base}/${cleanPath}`\n }\n return base\n}\n\n/**\n * Extract the file extension from a URI\n *\n * @param uri - The URI to extract from\n * @returns The extension (without dot) or empty string\n */\nexport function getExtension(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastDot = parsed.path.lastIndexOf('.')\n if (lastDot === -1 || lastDot === parsed.path.length - 1) {\n return ''\n }\n\n return parsed.path.slice(lastDot + 1).toLowerCase()\n}\n\n/**\n * Get the filename from a URI\n *\n * @param uri - The URI to extract from\n * @returns The filename or empty string\n */\nexport function getFilename(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastSlash = parsed.path.lastIndexOf('/')\n if (lastSlash === -1) {\n return parsed.path\n }\n\n return parsed.path.slice(lastSlash + 1)\n}\n\n/**\n * Get the directory path from a URI\n *\n * @param uri - The URI to extract from\n * @returns The directory path or empty string\n */\nexport function getDirectory(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastSlash = parsed.path.lastIndexOf('/')\n if (lastSlash === -1) {\n return ''\n }\n\n return parsed.path.slice(0, lastSlash)\n}\n","/**\n * URI resolution for codex references\n *\n * Resolves codex:// URIs to filesystem paths, determining whether\n * the reference points to the current project (local file) or\n * needs to be fetched from cache/remote.\n */\n\nimport path from 'path'\nimport { execSync } from 'child_process'\nimport { parseReference, type ParsedReference } from './parser.js'\n\n/**\n * Resolved reference with filesystem paths\n */\nexport interface ResolvedReference extends ParsedReference {\n /** Path in the cache directory */\n cachePath: string\n /** Whether this URI refers to the current project */\n isCurrentProject: boolean\n /** Local filesystem path if current project */\n localPath?: string\n}\n\n/**\n * Options for resolving references\n */\nexport interface ResolveOptions {\n /** Base directory for cache (default: .fractary/codex/cache) */\n cacheDir?: string\n /** Override current organization detection */\n currentOrg?: string\n /** Override current project detection */\n currentProject?: string\n /** Current working directory (for git detection) */\n cwd?: string\n}\n\n/**\n * Default cache directory (v4.0 standard)\n */\nexport const DEFAULT_CACHE_DIR = '.fractary/codex/cache'\n\n/**\n * Detect the current project from git remote\n *\n * @param cwd - Current working directory\n * @returns Object with org and project, or nulls if not detected\n */\nexport function detectCurrentProject(cwd?: string): { org: string | null; project: string | null } {\n try {\n const options = cwd ? { cwd, encoding: 'utf-8' as const } : { encoding: 'utf-8' as const }\n const stdout = execSync('git remote get-url origin', options)\n const url = stdout.toString().trim()\n\n // Parse GitHub URLs (SSH and HTTPS formats)\n // git@github.com:org/repo.git\n // https://github.com/org/repo.git\n // https://github.com/org/repo\n const patterns = [\n /github\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n /gitlab\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n /bitbucket\\.org[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n ]\n\n for (const pattern of patterns) {\n const match = url.match(pattern)\n if (match && match[1] && match[2]) {\n return { org: match[1], project: match[2] }\n }\n }\n } catch {\n // Git not available or not in a git repo\n }\n\n return { org: null, project: null }\n}\n\n/**\n * Get the current organization and project\n *\n * Priority:\n * 1. Explicit options\n * 2. Environment variables (CODEX_CURRENT_ORG, CODEX_CURRENT_PROJECT)\n * 3. Git remote detection\n *\n * @param options - Resolve options\n * @returns Object with org and project\n */\nexport function getCurrentContext(options: ResolveOptions = {}): {\n org: string | null\n project: string | null\n} {\n // Priority 1: Explicit options\n if (options.currentOrg && options.currentProject) {\n return { org: options.currentOrg, project: options.currentProject }\n }\n\n // Priority 2: Environment variables\n const envOrg = process.env.CODEX_CURRENT_ORG\n const envProject = process.env.CODEX_CURRENT_PROJECT\n if (envOrg && envProject) {\n return { org: envOrg, project: envProject }\n }\n\n // Priority 3: Git detection\n return detectCurrentProject(options.cwd)\n}\n\n/**\n * Calculate the cache path for a URI\n *\n * @param org - Organization\n * @param project - Project\n * @param filePath - File path within project\n * @param cacheDir - Base cache directory\n * @returns The cache file path\n */\nexport function calculateCachePath(\n org: string,\n project: string,\n filePath: string,\n cacheDir: string\n): string {\n // Cache structure: {cacheDir}/{org}/{project}/{path}\n return path.join(cacheDir, org, project, filePath)\n}\n\n/**\n * Resolve a codex URI to filesystem paths\n *\n * @param uri - The URI to resolve\n * @param options - Resolution options\n * @returns The resolved reference or null if invalid\n */\nexport function resolveReference(\n uri: string,\n options: ResolveOptions = {}\n): ResolvedReference | null {\n const parsed = parseReference(uri)\n if (!parsed) {\n return null\n }\n\n const cacheDir = options.cacheDir || DEFAULT_CACHE_DIR\n const currentContext = getCurrentContext(options)\n\n // Calculate cache path\n const cachePath = parsed.path\n ? calculateCachePath(parsed.org, parsed.project, parsed.path, cacheDir)\n : path.join(cacheDir, parsed.org, parsed.project)\n\n // Check if this is the current project\n const isCurrentProject =\n currentContext.org === parsed.org && currentContext.project === parsed.project\n\n // Build the resolved reference\n const resolved: ResolvedReference = {\n ...parsed,\n cachePath,\n isCurrentProject,\n }\n\n // If it's the current project and there's a path, provide the local path\n if (isCurrentProject && parsed.path) {\n resolved.localPath = parsed.path\n }\n\n return resolved\n}\n\n/**\n * Resolve multiple URIs at once\n *\n * @param uris - Array of URIs to resolve\n * @param options - Resolution options\n * @returns Array of resolved references (nulls filtered out)\n */\nexport function resolveReferences(\n uris: string[],\n options: ResolveOptions = {}\n): ResolvedReference[] {\n return uris.map((uri) => resolveReference(uri, options)).filter((r): r is ResolvedReference => r !== null)\n}\n\n/**\n * Check if a URI refers to the current project\n *\n * @param uri - The URI to check\n * @param options - Resolution options\n * @returns true if the URI refers to the current project\n */\nexport function isCurrentProjectUri(uri: string, options: ResolveOptions = {}): boolean {\n const resolved = resolveReference(uri, options)\n return resolved?.isCurrentProject ?? false\n}\n\n/**\n * Get the relative cache path for a URI (without the cache directory prefix)\n *\n * @param uri - The URI\n * @returns The relative path or null if invalid\n */\nexport function getRelativeCachePath(uri: string): string | null {\n const parsed = parseReference(uri)\n if (!parsed) {\n return null\n }\n\n if (parsed.path) {\n return path.join(parsed.org, parsed.project, parsed.path)\n }\n return path.join(parsed.org, parsed.project)\n}\n","/**\n * Built-in artifact types for the Codex SDK\n *\n * These types define common artifact categories with default TTLs,\n * archival policies, and pattern matching rules.\n */\n\n/**\n * Artifact type definition\n */\nexport interface ArtifactType {\n /** Unique type name */\n name: string\n /** Human-readable description */\n description: string\n /** Glob patterns to match files of this type */\n patterns: string[]\n /** Default TTL in seconds for cached content */\n defaultTtl: number\n /** Days after which to archive (null = never) */\n archiveAfterDays: number | null\n /** Where to archive (null = don't archive) */\n archiveStorage: 'local' | 'cloud' | 'drive' | null\n /** Patterns for sync operations (optional override) */\n syncPatterns?: string[]\n /** Patterns to exclude from sync */\n excludePatterns?: string[]\n /** Default permissions (optional) */\n permissions?: {\n include: string[]\n exclude: string[]\n }\n}\n\n/**\n * TTL constants in seconds\n */\nexport const TTL = {\n ONE_HOUR: 3600,\n ONE_DAY: 86400,\n ONE_WEEK: 604800,\n TWO_WEEKS: 1209600,\n ONE_MONTH: 2592000,\n ONE_YEAR: 31536000,\n} as const\n\n/**\n * Built-in artifact types\n *\n * These cover common use cases and serve as defaults.\n * Users can override or extend these via configuration.\n */\nexport const BUILT_IN_TYPES: Record<string, ArtifactType> = {\n docs: {\n name: 'docs',\n description: 'Documentation files',\n patterns: ['docs/**', 'README.md', 'CLAUDE.md', '*.md'],\n defaultTtl: TTL.ONE_WEEK,\n archiveAfterDays: 365,\n archiveStorage: 'cloud',\n },\n\n specs: {\n name: 'specs',\n description: 'Technical specifications',\n patterns: ['specs/**', 'SPEC-*.md', '**/specs/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: null, // Never auto-archive specs\n archiveStorage: null,\n },\n\n logs: {\n name: 'logs',\n description: 'Session and workflow logs',\n patterns: ['.fractary/**/logs/**', 'logs/**', '*.log'],\n defaultTtl: TTL.ONE_DAY,\n archiveAfterDays: 30,\n archiveStorage: 'cloud',\n },\n\n standards: {\n name: 'standards',\n description: 'Organization standards and guides',\n patterns: ['standards/**', 'guides/**', '.fractary/standards/**'],\n defaultTtl: TTL.ONE_MONTH,\n archiveAfterDays: null, // Never auto-archive standards\n archiveStorage: null,\n },\n\n templates: {\n name: 'templates',\n description: 'Reusable templates',\n patterns: ['templates/**', '.templates/**', '.fractary/templates/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: 180,\n archiveStorage: 'cloud',\n },\n\n state: {\n name: 'state',\n description: 'Workflow state files',\n patterns: ['.fractary/**/state.json', '.fractary/**/state/**', '**/state.json'],\n defaultTtl: TTL.ONE_HOUR,\n archiveAfterDays: 7,\n archiveStorage: 'local',\n },\n\n config: {\n name: 'config',\n description: 'Configuration files',\n patterns: [\n '.fractary/**/*.json',\n '*.config.js',\n '*.config.ts',\n 'tsconfig.json',\n 'package.json',\n ],\n defaultTtl: TTL.ONE_DAY,\n archiveAfterDays: null,\n archiveStorage: null,\n },\n\n systems: {\n name: 'systems',\n description: 'System definitions',\n patterns: ['.fractary/systems/**', 'systems/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: null,\n archiveStorage: null,\n },\n}\n\n/**\n * Default type to use when no pattern matches\n */\nexport const DEFAULT_TYPE: ArtifactType = {\n name: 'default',\n description: 'Default type for unmatched files',\n patterns: ['**/*'],\n defaultTtl: TTL.ONE_WEEK,\n archiveAfterDays: 90,\n archiveStorage: 'cloud',\n}\n\n/**\n * Get a built-in type by name\n *\n * @param name - Type name\n * @returns The type or undefined\n */\nexport function getBuiltInType(name: string): ArtifactType | undefined {\n return BUILT_IN_TYPES[name]\n}\n\n/**\n * Get all built-in type names\n *\n * @returns Array of type names\n */\nexport function getBuiltInTypeNames(): string[] {\n return Object.keys(BUILT_IN_TYPES)\n}\n\n/**\n * Check if a name is a built-in type\n *\n * @param name - Type name to check\n * @returns true if it's a built-in type\n */\nexport function isBuiltInType(name: string): boolean {\n return name in BUILT_IN_TYPES\n}\n","/**\n * Type registry for artifact types\n *\n * Manages both built-in and custom artifact types, providing\n * type detection, TTL lookup, and registration functionality.\n */\n\nimport micromatch from 'micromatch'\nimport {\n type ArtifactType,\n BUILT_IN_TYPES,\n DEFAULT_TYPE,\n isBuiltInType,\n} from './built-in.js'\n\n/**\n * Options for creating a TypeRegistry\n */\nexport interface TypeRegistryOptions {\n /** Whether to include built-in types (default: true) */\n includeBuiltIn?: boolean\n /** Custom types to register */\n customTypes?: Record<string, Partial<ArtifactType>>\n}\n\n/**\n * Type registry for managing artifact types\n */\nexport class TypeRegistry {\n private types: Map<string, ArtifactType> = new Map()\n private patternCache: Map<string, string> = new Map()\n\n constructor(options: TypeRegistryOptions = {}) {\n const { includeBuiltIn = true, customTypes = {} } = options\n\n // Load built-in types\n if (includeBuiltIn) {\n for (const [name, type] of Object.entries(BUILT_IN_TYPES)) {\n this.types.set(name, type)\n }\n }\n\n // Load custom types\n for (const [name, partialType] of Object.entries(customTypes)) {\n this.register({\n ...DEFAULT_TYPE,\n ...partialType,\n name,\n })\n }\n }\n\n /**\n * Get a type by name\n *\n * Custom types take precedence over built-in types with the same name.\n *\n * @param name - Type name\n * @returns The type or undefined\n */\n get(name: string): ArtifactType | undefined {\n return this.types.get(name)\n }\n\n /**\n * Register a custom type\n *\n * @param type - The type to register\n */\n register(type: ArtifactType): void {\n this.types.set(type.name, type)\n // Clear pattern cache when types change\n this.patternCache.clear()\n }\n\n /**\n * Unregister a type\n *\n * Note: Built-in types can be unregistered but this is not recommended.\n *\n * @param name - Type name to unregister\n * @returns true if the type was removed\n */\n unregister(name: string): boolean {\n const result = this.types.delete(name)\n if (result) {\n this.patternCache.clear()\n }\n return result\n }\n\n /**\n * Check if a type exists\n *\n * @param name - Type name\n * @returns true if the type exists\n */\n has(name: string): boolean {\n return this.types.has(name)\n }\n\n /**\n * List all registered types\n *\n * @returns Array of all types\n */\n list(): ArtifactType[] {\n return Array.from(this.types.values())\n }\n\n /**\n * List all type names\n *\n * @returns Array of type names\n */\n listNames(): string[] {\n return Array.from(this.types.keys())\n }\n\n /**\n * Detect the type of a file based on its path\n *\n * Types are checked in order of specificity (most specific patterns first).\n * Returns 'default' if no type matches.\n *\n * @param filePath - File path to check\n * @returns The detected type name\n */\n detectType(filePath: string): string {\n // Check cache first\n const cached = this.patternCache.get(filePath)\n if (cached) {\n return cached\n }\n\n // Normalize path separators\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Check each type's patterns\n // Sort by pattern specificity (longer patterns first)\n const sortedTypes = this.list().sort((a, b) => {\n const aMaxLen = Math.max(...a.patterns.map((p) => p.length))\n const bMaxLen = Math.max(...b.patterns.map((p) => p.length))\n return bMaxLen - aMaxLen\n })\n\n for (const type of sortedTypes) {\n if (type.name === 'default') continue\n\n for (const pattern of type.patterns) {\n if (micromatch.isMatch(normalizedPath, pattern)) {\n this.patternCache.set(filePath, type.name)\n return type.name\n }\n }\n }\n\n // No match, return default\n this.patternCache.set(filePath, 'default')\n return 'default'\n }\n\n /**\n * Get the TTL for a file based on its type\n *\n * @param filePath - File path\n * @param override - Optional TTL override\n * @returns TTL in seconds\n */\n getTtl(filePath: string, override?: number): number {\n if (override !== undefined) {\n return override\n }\n\n const typeName = this.detectType(filePath)\n const type = this.get(typeName) || DEFAULT_TYPE\n return type.defaultTtl\n }\n\n /**\n * Get archive configuration for a file\n *\n * @param filePath - File path\n * @returns Archive configuration or null if archiving is disabled\n */\n getArchiveConfig(filePath: string): {\n afterDays: number\n storage: 'local' | 'cloud' | 'drive'\n } | null {\n const typeName = this.detectType(filePath)\n const type = this.get(typeName) || DEFAULT_TYPE\n\n if (type.archiveAfterDays === null || type.archiveStorage === null) {\n return null\n }\n\n return {\n afterDays: type.archiveAfterDays,\n storage: type.archiveStorage,\n }\n }\n\n /**\n * Get all files that match a type's patterns\n *\n * @param typeName - Type name\n * @param files - Array of file paths to filter\n * @returns Filtered file paths\n */\n filterByType(typeName: string, files: string[]): string[] {\n const type = this.get(typeName)\n if (!type) {\n return []\n }\n\n return files.filter((file) => {\n const normalized = file.replace(/\\\\/g, '/')\n return type.patterns.some((pattern) => micromatch.isMatch(normalized, pattern))\n })\n }\n\n /**\n * Check if a type is a built-in type\n *\n * @param name - Type name\n * @returns true if it's a built-in type\n */\n isBuiltIn(name: string): boolean {\n return isBuiltInType(name)\n }\n\n /**\n * Get the number of registered types\n */\n get size(): number {\n return this.types.size\n }\n\n /**\n * Clear pattern cache\n *\n * Call this if you need to force re-detection of types.\n */\n clearCache(): void {\n this.patternCache.clear()\n }\n}\n\n/**\n * Create a default TypeRegistry with built-in types\n *\n * @returns A new TypeRegistry instance\n */\nexport function createDefaultRegistry(): TypeRegistry {\n return new TypeRegistry()\n}\n","/**\n * Custom type loading from configuration\n *\n * Loads user-defined artifact types from configuration files\n * and validates them against the type schema.\n */\n\nimport { z } from 'zod'\nimport type { ArtifactType } from './built-in.js'\nimport { DEFAULT_TYPE, TTL } from './built-in.js'\n\n/**\n * Schema for custom type definition in config\n */\nexport const CustomTypeSchema = z.object({\n description: z.string().optional(),\n patterns: z.array(z.string()).min(1),\n defaultTtl: z.number().positive().optional(),\n archiveAfterDays: z.number().positive().nullable().optional(),\n archiveStorage: z.enum(['local', 'cloud', 'drive']).nullable().optional(),\n syncPatterns: z.array(z.string()).optional(),\n excludePatterns: z.array(z.string()).optional(),\n permissions: z\n .object({\n include: z.array(z.string()),\n exclude: z.array(z.string()),\n })\n .optional(),\n})\n\nexport type CustomTypeConfig = z.infer<typeof CustomTypeSchema>\n\n/**\n * Schema for the types section of configuration\n */\nexport const TypesConfigSchema = z.object({\n custom: z.record(z.string(), CustomTypeSchema).optional(),\n})\n\nexport type TypesConfig = z.infer<typeof TypesConfigSchema>\n\n/**\n * Validation result for custom types\n */\nexport interface ValidationResult {\n valid: boolean\n errors: Array<{\n name: string\n field: string\n message: string\n }>\n}\n\n/**\n * Parse a TTL value from config (can be number or string like \"7d\", \"1w\")\n *\n * @param value - TTL value\n * @returns TTL in seconds\n */\nexport function parseTtl(value: string | number): number {\n if (typeof value === 'number') {\n return value\n }\n\n const match = value.match(/^(\\d+)(s|m|h|d|w)$/)\n if (!match || !match[1] || !match[2]) {\n return TTL.ONE_WEEK // Default fallback\n }\n\n const num = parseInt(match[1], 10)\n const unit = match[2]\n\n switch (unit) {\n case 's':\n return num\n case 'm':\n return num * 60\n case 'h':\n return num * 3600\n case 'd':\n return num * 86400\n case 'w':\n return num * 604800\n default:\n return TTL.ONE_WEEK\n }\n}\n\n/**\n * Validate custom types configuration\n *\n * @param config - Types configuration object\n * @returns Validation result\n */\nexport function validateCustomTypes(config: unknown): ValidationResult {\n const result: ValidationResult = {\n valid: true,\n errors: [],\n }\n\n if (!config || typeof config !== 'object') {\n return result // Empty config is valid\n }\n\n const typesConfig = config as Record<string, unknown>\n const customTypes = typesConfig.custom as Record<string, unknown> | undefined\n\n if (!customTypes) {\n return result\n }\n\n for (const [name, typeConfig] of Object.entries(customTypes)) {\n // Validate name\n if (!/^[a-z][a-z0-9_-]*$/.test(name)) {\n result.valid = false\n result.errors.push({\n name,\n field: 'name',\n message: 'Type name must start with a letter and contain only lowercase letters, numbers, hyphens, and underscores',\n })\n }\n\n // Validate config against schema\n const parseResult = CustomTypeSchema.safeParse(typeConfig)\n if (!parseResult.success) {\n result.valid = false\n for (const issue of parseResult.error.issues) {\n result.errors.push({\n name,\n field: issue.path.join('.'),\n message: issue.message,\n })\n }\n }\n }\n\n return result\n}\n\n/**\n * Load custom types from configuration\n *\n * @param config - Types configuration\n * @returns Map of type name to ArtifactType\n */\nexport function loadCustomTypes(config: TypesConfig): Map<string, ArtifactType> {\n const types = new Map<string, ArtifactType>()\n\n if (!config.custom) {\n return types\n }\n\n for (const [name, typeConfig] of Object.entries(config.custom)) {\n const type: ArtifactType = {\n name,\n description: typeConfig.description || `Custom type: ${name}`,\n patterns: typeConfig.patterns,\n defaultTtl: typeConfig.defaultTtl ?? DEFAULT_TYPE.defaultTtl,\n archiveAfterDays: typeConfig.archiveAfterDays ?? DEFAULT_TYPE.archiveAfterDays,\n archiveStorage: typeConfig.archiveStorage ?? DEFAULT_TYPE.archiveStorage,\n syncPatterns: typeConfig.syncPatterns,\n excludePatterns: typeConfig.excludePatterns,\n permissions: typeConfig.permissions,\n }\n\n types.set(name, type)\n }\n\n return types\n}\n\n/**\n * Merge custom types with built-in types\n *\n * Custom types override built-in types with the same name.\n *\n * @param builtIn - Built-in types\n * @param custom - Custom types\n * @returns Merged types\n */\nexport function mergeTypes(\n builtIn: Record<string, ArtifactType>,\n custom: Map<string, ArtifactType>\n): Map<string, ArtifactType> {\n const merged = new Map<string, ArtifactType>()\n\n // Add built-in types first\n for (const [name, type] of Object.entries(builtIn)) {\n merged.set(name, type)\n }\n\n // Override/add custom types\n for (const [name, type] of custom) {\n merged.set(name, type)\n }\n\n return merged\n}\n\n/**\n * Create a partial type definition for extending a built-in type\n *\n * @param baseName - Name of the built-in type to extend\n * @param overrides - Properties to override\n * @returns Partial type definition\n */\nexport function extendType(\n baseName: string,\n overrides: Partial<Omit<ArtifactType, 'name'>>\n): Partial<ArtifactType> {\n return {\n ...overrides,\n name: baseName,\n }\n}\n","import { z } from 'zod'\n\n/**\n * Schema for document frontmatter metadata\n *\n * Based on SPEC-00002: Metadata Parsing\n */\nexport const MetadataSchema = z\n .object({\n // Organizational\n org: z.string().optional(),\n system: z.string().optional(),\n\n // Sync rules\n codex_sync_include: z.array(z.string()).optional(),\n codex_sync_exclude: z.array(z.string()).optional(),\n codex_sync_custom: z.array(z.string()).optional(),\n\n // Metadata\n title: z.string().optional(),\n description: z.string().optional(),\n visibility: z.enum(['public', 'internal', 'private']).optional(),\n audience: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n\n // Timestamps\n created: z.string().optional(), // ISO 8601 date string\n updated: z.string().optional(),\n })\n .passthrough() // Allow additional fields for extensibility\n\nexport type Metadata = z.infer<typeof MetadataSchema>\n","import { z } from 'zod'\n\n/**\n * Schema for auto-sync patterns\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport const AutoSyncPatternSchema = z.object({\n pattern: z.string(),\n include: z.array(z.string()),\n exclude: z.array(z.string()).optional(),\n})\n\nexport type AutoSyncPattern = z.infer<typeof AutoSyncPatternSchema>\n\n/**\n * Schema for sync rules configuration\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport const SyncRulesSchema = z.object({\n autoSyncPatterns: z.array(AutoSyncPatternSchema).optional(),\n preventSelfSync: z.boolean().optional(),\n preventCodexSync: z.boolean().optional(),\n allowProjectOverrides: z.boolean().optional(),\n defaultInclude: z.array(z.string()).optional(),\n defaultExclude: z.array(z.string()).optional(),\n})\n\nexport type SyncRules = z.infer<typeof SyncRulesSchema>\n\n/**\n * Schema for directional sync configuration\n *\n * Defines what files sync TO codex (push) and FROM codex (pull)\n */\nexport const DirectionalSyncSchema = z.object({\n // Patterns for files to push from this project to codex\n to_codex: z.array(z.string()).optional(),\n\n // Patterns for files to pull from codex to this project\n // Format: \"project-name/path/pattern\" or \"project-name/**\"\n from_codex: z.array(z.string()).optional(),\n\n // Org-level defaults (only in codex repository config)\n default_to_codex: z.array(z.string()).optional(),\n default_from_codex: z.array(z.string()).optional(),\n})\n\nexport type DirectionalSync = z.infer<typeof DirectionalSyncSchema>\n\n/**\n * Schema for Codex configuration\n *\n * Based on SPEC-00005: Configuration System\n */\nexport const CodexConfigSchema = z\n .object({\n organizationSlug: z.string(),\n\n directories: z\n .object({\n source: z.string().optional(),\n target: z.string().optional(),\n systems: z.string().optional(),\n })\n .optional(),\n\n rules: SyncRulesSchema.optional(),\n\n // Directional sync configuration\n sync: DirectionalSyncSchema.optional(),\n })\n .strict()\n\nexport type CodexConfig = z.infer<typeof CodexConfigSchema>\n","import yaml from 'js-yaml'\nimport { MetadataSchema, type Metadata } from '../../schemas/metadata.js'\nimport { ValidationError } from '../../errors/index.js'\n\nexport interface ParseMetadataOptions {\n strict?: boolean // Throw on validation errors (default: true)\n normalize?: boolean // Normalize line endings (default: true)\n}\n\nexport interface ParseResult {\n metadata: Metadata\n content: string // Document content without frontmatter\n raw: string // Raw frontmatter block\n}\n\n/**\n * Extracts and parses YAML frontmatter from markdown content\n *\n * Based on SPEC-00002: Metadata Parsing\n *\n * @param content - Markdown file content\n * @param options - Parsing options\n * @returns Parsed metadata and content\n * @throws ValidationError if frontmatter is malformed (in strict mode)\n */\nexport function parseMetadata(\n content: string,\n options: ParseMetadataOptions = {}\n): ParseResult {\n const { strict = true, normalize = true } = options\n\n // Normalize line endings (CRLF → LF)\n const normalizedContent = normalize\n ? content.replace(/\\r\\n/g, '\\n')\n : content\n\n // Extract frontmatter block\n const frontmatterMatch = normalizedContent.match(\n /^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/\n )\n\n if (!frontmatterMatch) {\n // No frontmatter found\n return {\n metadata: {},\n content: normalizedContent,\n raw: '',\n }\n }\n\n const rawFrontmatter = frontmatterMatch[1]!\n const documentContent = frontmatterMatch[2]!\n\n try {\n // Parse YAML\n const parsed = yaml.load(rawFrontmatter) as Record<string, unknown>\n\n // Normalize legacy formats\n const normalized = normalizeLegacyMetadata(parsed)\n\n // Validate against schema\n const metadata = strict\n ? MetadataSchema.parse(normalized)\n : MetadataSchema.safeParse(normalized).data || {}\n\n return {\n metadata,\n content: documentContent,\n raw: rawFrontmatter,\n }\n } catch (error) {\n if (strict) {\n throw new ValidationError(\n `Invalid frontmatter: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error }\n )\n }\n\n // Non-strict mode: return empty metadata\n return {\n metadata: {},\n content: documentContent,\n raw: rawFrontmatter,\n }\n }\n}\n\n/**\n * Normalize legacy frontmatter formats to standard format\n *\n * Handles:\n * - Nested codex.includes → codex_sync_include\n * - Nested codex.excludes → codex_sync_exclude\n * - Flat plural codex_sync_includes → codex_sync_include\n * - Flat plural codex_sync_excludes → codex_sync_exclude\n */\nfunction normalizeLegacyMetadata(parsed: any): any {\n const normalized: any = { ...parsed }\n\n // Handle nested codex.includes → codex_sync_include\n if (parsed.codex?.includes && !parsed.codex_sync_include) {\n normalized.codex_sync_include = parsed.codex.includes\n }\n\n // Handle nested codex.excludes → codex_sync_exclude\n if (parsed.codex?.excludes && !parsed.codex_sync_exclude) {\n normalized.codex_sync_exclude = parsed.codex.excludes\n }\n\n // Handle flat plural codex_sync_includes → codex_sync_include\n if (parsed.codex_sync_includes && !normalized.codex_sync_include) {\n normalized.codex_sync_include = parsed.codex_sync_includes\n }\n\n // Handle flat plural codex_sync_excludes → codex_sync_exclude\n if (parsed.codex_sync_excludes && !normalized.codex_sync_exclude) {\n normalized.codex_sync_exclude = parsed.codex_sync_excludes\n }\n\n return normalized\n}\n\n/**\n * Check if content has frontmatter\n */\nexport function hasFrontmatter(content: string): boolean {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n return /^---\\n[\\s\\S]*?\\n---\\n/.test(normalized)\n}\n\n/**\n * Validate metadata without parsing content\n */\nexport function validateMetadata(\n metadata: unknown\n): { valid: boolean; errors?: string[] } {\n const result = MetadataSchema.safeParse(metadata)\n\n if (result.success) {\n return { valid: true }\n }\n\n return {\n valid: false,\n errors: result.error.issues.map(issue => issue.message),\n }\n}\n\n/**\n * Extract only frontmatter (no validation)\n */\nexport function extractRawFrontmatter(content: string): string | null {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n const match = normalized.match(/^---\\n([\\s\\S]*?)\\n---\\n/)\n return match && match[1] ? match[1] : null\n}\n","export {\n matchPattern,\n matchAnyPattern,\n filterByPatterns,\n evaluatePatterns,\n} from './matcher.js'\n","import { ConfigurationError } from '../../errors/index.js'\n\nexport interface ResolveOrgOptions {\n orgSlug?: string // Explicit org slug\n repoName?: string // Repo name for auto-detection\n autoDetect?: boolean // Enable auto-detection (default: true)\n}\n\n/**\n * Resolve organization slug from multiple sources\n *\n * Based on SPEC-00005: Configuration System\n *\n * Priority:\n * 1. Explicit orgSlug parameter\n * 2. Auto-detect from repoName (if enabled)\n * 3. Environment variable (ORGANIZATION_SLUG or CODEX_ORG_SLUG)\n * 4. Throw ConfigurationError if none found\n *\n * @param options - Resolution options\n * @returns Organization slug\n * @throws ConfigurationError if slug cannot be determined\n */\nexport function resolveOrganization(\n options: ResolveOrgOptions = {}\n): string {\n const { orgSlug, repoName, autoDetect = true } = options\n\n // 1. Explicit parameter\n if (orgSlug) {\n return orgSlug\n }\n\n // 2. Auto-detect from repo name\n if (autoDetect && repoName) {\n const detected = extractOrgFromRepoName(repoName)\n if (detected) {\n return detected\n }\n }\n\n // 3. Environment variables\n const envOrg =\n process.env['ORGANIZATION_SLUG'] || process.env['CODEX_ORG_SLUG']\n\n if (envOrg) {\n return envOrg\n }\n\n // 4. Fail - required parameter missing\n throw new ConfigurationError(\n 'Organization slug could not be determined. ' +\n 'Set ORGANIZATION_SLUG environment variable or pass orgSlug option.'\n )\n}\n\n/**\n * Extract org slug from repo name pattern\n *\n * Patterns:\n * - codex.fractary.com → \"fractary\"\n * - codex.acme.ai → \"acme\"\n * - codex.my-org.io → \"my-org\"\n *\n * @param repoName - Repository name\n * @returns Organization slug or null if pattern doesn't match\n */\nexport function extractOrgFromRepoName(repoName: string): string | null {\n // Pattern: codex.{org}.{tld}\n const match = repoName.match(/^codex\\.([^.]+)\\.[^.]+$/)\n\n if (match && match[1]) {\n return match[1]\n }\n\n return null\n}\n","import type { CodexConfig, SyncRules } from '../../schemas/config.js'\n\n/**\n * Get default directory structure\n *\n * Based on SPEC-00005: Configuration System\n */\nexport function getDefaultDirectories(orgSlug: string) {\n return {\n source: `.${orgSlug}`,\n target: `.${orgSlug}`,\n systems: `.${orgSlug}/systems`,\n }\n}\n\n/**\n * Get default sync rules\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport function getDefaultRules(): SyncRules {\n return {\n autoSyncPatterns: [],\n preventSelfSync: true,\n preventCodexSync: true,\n allowProjectOverrides: true,\n defaultInclude: [],\n defaultExclude: [],\n }\n}\n\n/**\n * Get default configuration\n *\n * @param orgSlug - Organization slug\n * @returns Default CodexConfig\n */\nexport function getDefaultConfig(orgSlug: string): CodexConfig {\n return {\n organizationSlug: orgSlug,\n directories: getDefaultDirectories(orgSlug),\n rules: getDefaultRules(),\n }\n}\n","import {\n CodexConfigSchema,\n type CodexConfig,\n type SyncRules,\n} from '../../schemas/config.js'\nimport { resolveOrganization } from './organization.js'\nimport { getDefaultDirectories, getDefaultRules } from './defaults.js'\n\nexport interface LoadConfigOptions {\n organizationSlug?: string\n repoName?: string\n env?: Record<string, string | undefined> // Environment variables (default: process.env)\n}\n\n/**\n * Load and resolve configuration from all sources\n *\n * Based on SPEC-00005: Configuration System\n *\n * @param options - Loading options\n * @returns Fully resolved configuration\n */\nexport function loadConfig(options: LoadConfigOptions = {}): CodexConfig {\n // 1. Resolve organization slug\n const orgSlug = resolveOrganization({\n orgSlug: options.organizationSlug,\n repoName: options.repoName,\n })\n\n // 2. Build base config with defaults\n let config: Partial<CodexConfig> = {\n organizationSlug: orgSlug,\n directories: getDefaultDirectories(orgSlug),\n rules: getDefaultRules(),\n }\n\n // 3. Apply environment variable overrides\n const envConfig = loadConfigFromEnv(options.env || process.env)\n config = mergeConfigs(config, envConfig)\n\n // 4. Validate final configuration\n return CodexConfigSchema.parse(config)\n}\n\n/**\n * Load configuration from environment variables\n */\nfunction loadConfigFromEnv(\n env: Record<string, string | undefined>\n): Partial<CodexConfig> {\n const config: Partial<CodexConfig> = {}\n\n // Organization\n if (env['ORGANIZATION_SLUG'] || env['CODEX_ORG_SLUG']) {\n config.organizationSlug = env['ORGANIZATION_SLUG'] || env['CODEX_ORG_SLUG']\n }\n\n // Directories\n if (env['CODEX_SOURCE_DIR'] || env['CODEX_TARGET_DIR']) {\n config.directories = {\n source: env['CODEX_SOURCE_DIR'],\n target: env['CODEX_TARGET_DIR'],\n }\n }\n\n // Rules\n const rules: Partial<SyncRules> = {}\n\n if (env['CODEX_PREVENT_SELF_SYNC'] !== undefined) {\n rules.preventSelfSync = env['CODEX_PREVENT_SELF_SYNC'] === 'true'\n }\n\n if (env['CODEX_PREVENT_CODEX_SYNC'] !== undefined) {\n rules.preventCodexSync = env['CODEX_PREVENT_CODEX_SYNC'] === 'true'\n }\n\n if (env['CODEX_ALLOW_PROJECT_OVERRIDES'] !== undefined) {\n rules.allowProjectOverrides =\n env['CODEX_ALLOW_PROJECT_OVERRIDES'] === 'true'\n }\n\n if (Object.keys(rules).length > 0) {\n config.rules = rules\n }\n\n return config\n}\n\n/**\n * Deep merge two configuration objects\n * Later config overrides earlier config\n */\nfunction mergeConfigs(\n base: Partial<CodexConfig>,\n override: Partial<CodexConfig>\n): Partial<CodexConfig> {\n return {\n organizationSlug: override.organizationSlug ?? base.organizationSlug,\n\n directories: {\n ...base.directories,\n ...override.directories,\n },\n\n rules: {\n ...base.rules,\n ...override.rules,\n\n // Arrays are replaced, not merged\n autoSyncPatterns:\n override.rules?.autoSyncPatterns ?? base.rules?.autoSyncPatterns,\n defaultInclude:\n override.rules?.defaultInclude ?? base.rules?.defaultInclude,\n defaultExclude:\n override.rules?.defaultExclude ?? base.rules?.defaultExclude,\n },\n\n // Only include sync if either base or override has sync config\n ...(base.sync || override.sync\n ? {\n sync: {\n ...base.sync,\n ...override.sync,\n\n // Arrays are replaced, not merged\n to_codex: override.sync?.to_codex ?? base.sync?.to_codex,\n from_codex: override.sync?.from_codex ?? base.sync?.from_codex,\n default_to_codex:\n override.sync?.default_to_codex ?? base.sync?.default_to_codex,\n default_from_codex:\n override.sync?.default_from_codex ?? base.sync?.default_from_codex,\n },\n }\n : {}),\n }\n}\n","import type { Metadata } from '../../schemas/metadata.js'\nimport type { SyncRules, AutoSyncPattern } from '../../schemas/config.js'\nimport { matchPattern, evaluatePatterns } from '../patterns/matcher.js'\nimport { getDefaultRules } from '../config/defaults.js'\n\nexport interface ShouldSyncOptions {\n filePath: string // Path to file being evaluated\n fileMetadata: Metadata // Parsed frontmatter from file\n targetRepo: string // Repository to sync to\n sourceRepo: string // Repository file is from\n rules?: SyncRules // Optional routing rules (defaults applied)\n}\n\n/**\n * Determine if a file should be synced to a target repository\n *\n * Based on SPEC-00004: Routing & Distribution\n *\n * @param options - Evaluation options\n * @returns true if file should sync to targetRepo\n */\nexport function shouldSyncToRepo(options: ShouldSyncOptions): boolean {\n const {\n filePath,\n fileMetadata,\n targetRepo,\n sourceRepo,\n rules = getDefaultRules(),\n } = options\n\n // 1. Check special rules first\n const specialRuleResult = evaluateSpecialRules({\n filePath,\n targetRepo,\n sourceRepo,\n rules,\n })\n\n if (specialRuleResult !== null) {\n return specialRuleResult\n }\n\n // 2. Evaluate frontmatter rules\n return evaluateFrontmatterRules({\n metadata: fileMetadata,\n targetRepo,\n allowOverrides: rules.allowProjectOverrides ?? true,\n })\n}\n\n/**\n * Evaluate special routing rules\n *\n * Returns true/false if a special rule matches, null otherwise\n */\nfunction evaluateSpecialRules(options: {\n filePath: string\n targetRepo: string\n sourceRepo: string\n rules: SyncRules\n}): boolean | null {\n const { filePath, targetRepo, sourceRepo, rules } = options\n\n // Rule 1: Auto-sync patterns (highest priority)\n if (rules.autoSyncPatterns?.length) {\n const autoSyncResult = evaluateAutoSyncPatterns(\n filePath,\n targetRepo,\n rules.autoSyncPatterns\n )\n\n if (autoSyncResult !== null) {\n return autoSyncResult\n }\n }\n\n // Rule 2: Prevent self-sync\n if (rules.preventSelfSync) {\n const selfSyncResult = preventSelfSync(filePath, targetRepo, sourceRepo)\n\n if (selfSyncResult !== null) {\n return selfSyncResult\n }\n }\n\n // Rule 3: Prevent codex sync\n if (rules.preventCodexSync) {\n const codexSyncResult = preventCodexSync(targetRepo, sourceRepo)\n\n if (codexSyncResult !== null) {\n return codexSyncResult\n }\n }\n\n // No special rule applies\n return null\n}\n\n/**\n * Evaluate auto-sync patterns\n */\nfunction evaluateAutoSyncPatterns(\n filePath: string,\n targetRepo: string,\n patterns: AutoSyncPattern[]\n): boolean | null {\n for (const autoPattern of patterns) {\n // Check if file matches auto-sync pattern\n if (matchPattern(autoPattern.pattern, filePath)) {\n // File matches - evaluate repo include/exclude\n return evaluatePatterns({\n value: targetRepo,\n include: autoPattern.include,\n ...(autoPattern.exclude && { exclude: autoPattern.exclude }),\n })\n }\n }\n\n // No auto-sync pattern matched\n return null\n}\n\n/**\n * Prevent system files from syncing to their own repository\n */\nfunction preventSelfSync(\n filePath: string,\n targetRepo: string,\n _sourceRepo: string\n): boolean | null {\n // Extract system name from file path\n // Example: \".fractary/systems/api-gateway/docs/README.md\" → \"api-gateway\"\n const systemMatch = filePath.match(/systems\\/([^/]+)\\//)\n\n if (systemMatch && systemMatch[1]) {\n const systemName = systemMatch[1]\n\n if (systemName === targetRepo) {\n // Prevent: Don't sync system files to their own repo\n return false\n }\n }\n\n // Not a system file, or different system\n return null\n}\n\n/**\n * Prevent files from syncing back to the codex repository\n */\nfunction preventCodexSync(\n targetRepo: string,\n sourceRepo: string\n): boolean | null {\n // Detect if target is the codex repo\n const isCodexRepo =\n targetRepo === sourceRepo || targetRepo.startsWith('codex.')\n\n if (isCodexRepo) {\n return false\n }\n\n return null\n}\n\n/**\n * Evaluate frontmatter sync rules\n */\nfunction evaluateFrontmatterRules(options: {\n metadata: Metadata\n targetRepo: string\n allowOverrides: boolean\n}): boolean {\n const { metadata, targetRepo, allowOverrides } = options\n\n // If project overrides disabled, return false (no sync by default)\n if (!allowOverrides) {\n return false\n }\n\n const include = metadata.codex_sync_include || []\n const exclude = metadata.codex_sync_exclude || []\n\n // If no include rules, don't sync (must be explicit)\n if (include.length === 0) {\n return false\n }\n\n // Evaluate include/exclude patterns\n return evaluatePatterns({\n value: targetRepo,\n include,\n exclude,\n })\n}\n\n/**\n * Determine all repos that should receive a file\n *\n * @param options - Evaluation options\n * @returns Array of repository names that should receive this file\n */\nexport function getTargetRepos(options: {\n filePath: string\n fileMetadata: Metadata\n sourceRepo: string\n allRepos: string[]\n rules?: SyncRules\n}): string[] {\n const { filePath, fileMetadata, sourceRepo, allRepos, rules } = options\n\n return allRepos.filter(targetRepo =>\n shouldSyncToRepo({\n filePath,\n fileMetadata,\n targetRepo,\n sourceRepo,\n ...(rules && { rules }),\n })\n )\n}\n","import type { Metadata } from '../../schemas/metadata.js'\nimport { ValidationError } from '../../errors/ValidationError.js'\n\n/**\n * Represents a custom sync destination with repository and path\n */\nexport interface CustomSyncDestination {\n repo: string // Repository identifier (e.g., \"developers.fractary.com\")\n path: string // Target path within repository (e.g., \"src/content/docs/forge/\")\n}\n\n/**\n * Parse a custom destination string in format \"repo:path\"\n *\n * @param value - Custom destination string (e.g., \"developers.fractary.com:src/content/docs/forge/\")\n * @returns Parsed destination object\n * @throws ValidationError if format is invalid\n *\n * @example\n * ```typescript\n * const dest = parseCustomDestination('developers.fractary.com:src/content/docs/forge/')\n * // { repo: 'developers.fractary.com', path: 'src/content/docs/forge/' }\n * ```\n */\nexport function parseCustomDestination(value: string): CustomSyncDestination {\n if (typeof value !== 'string' || !value) {\n throw new ValidationError('Custom destination must be a non-empty string')\n }\n\n const colonIndex = value.indexOf(':')\n\n if (colonIndex === -1) {\n throw new ValidationError(\n `Invalid custom destination format: \"${value}\". Expected format: \"repo:path\"`\n )\n }\n\n const repo = value.substring(0, colonIndex).trim()\n const path = value.substring(colonIndex + 1).trim()\n\n if (!repo) {\n throw new ValidationError(\n `Invalid custom destination: repository name cannot be empty in \"${value}\"`\n )\n }\n\n if (!path) {\n throw new ValidationError(\n `Invalid custom destination: path cannot be empty in \"${value}\"`\n )\n }\n\n return { repo, path }\n}\n\n/**\n * Extract all custom sync destinations from metadata\n *\n * @param metadata - Parsed frontmatter metadata\n * @returns Array of custom sync destinations\n *\n * @example\n * ```typescript\n * const metadata = {\n * codex_sync_custom: [\n * 'developers.fractary.com:src/content/docs/forge/',\n * 'docs.example.com:api/'\n * ]\n * }\n *\n * const destinations = getCustomSyncDestinations(metadata)\n * // [\n * // { repo: 'developers.fractary.com', path: 'src/content/docs/forge/' },\n * // { repo: 'docs.example.com', path: 'api/' }\n * // ]\n * ```\n */\nexport function getCustomSyncDestinations(\n metadata: Metadata\n): CustomSyncDestination[] {\n const customDestinations = metadata.codex_sync_custom\n\n if (!customDestinations || !Array.isArray(customDestinations)) {\n return []\n }\n\n const results: CustomSyncDestination[] = []\n\n for (const destination of customDestinations) {\n try {\n const parsed = parseCustomDestination(destination)\n results.push(parsed)\n } catch (_error) {\n // Skip invalid destinations but preserve valid ones\n // Consumers can validate metadata if they want strict validation\n continue\n }\n }\n\n return results\n}\n","/**\n * Storage provider interface and types\n *\n * Defines the contract for storage providers that can fetch\n * content from various sources (local, GitHub, HTTP, etc.)\n */\n\nimport type { ResolvedReference } from '../references/index.js'\n\n/**\n * Supported storage provider types\n */\nexport type StorageProviderType = 'local' | 'github' | 'http' | 's3' | 'r2' | 'gcs' | 'drive'\n\n/**\n * Result of a fetch operation\n */\nexport interface FetchResult {\n /** Fetched content as Buffer */\n content: Buffer\n /** Content type (MIME type) */\n contentType: string\n /** Content size in bytes */\n size: number\n /** Source identifier (e.g., 'github', 'local') */\n source: string\n /** Optional metadata */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Options for fetch operations\n */\nexport interface FetchOptions {\n /** Timeout in milliseconds */\n timeout?: number\n /** Maximum number of retries */\n maxRetries?: number\n /** Authentication token */\n token?: string\n /** Branch to fetch from (for git-based providers) */\n branch?: string\n /** Whether to follow redirects */\n followRedirects?: boolean\n /** Maximum content size in bytes */\n maxSize?: number\n}\n\n/**\n * Storage provider interface\n *\n * All storage providers must implement this interface.\n */\nexport interface StorageProvider {\n /** Provider name (e.g., 'github', 'local') */\n readonly name: string\n /** Provider type */\n readonly type: StorageProviderType\n\n /**\n * Fetch content for a resolved reference\n *\n * @param reference - The resolved reference to fetch\n * @param options - Fetch options\n * @returns The fetch result\n * @throws Error if fetch fails\n */\n fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult>\n\n /**\n * Check if content exists at the reference\n *\n * @param reference - The resolved reference to check\n * @param options - Fetch options\n * @returns true if content exists\n */\n exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean>\n\n /**\n * Check if this provider can handle the given reference\n *\n * @param reference - The resolved reference\n * @returns true if this provider can handle the reference\n */\n canHandle(reference: ResolvedReference): boolean\n}\n\n/**\n * Storage provider configuration\n */\nexport interface StorageProviderConfig {\n /** Provider type */\n type: StorageProviderType\n /** Provider-specific options */\n options?: Record<string, unknown>\n /** Default timeout */\n timeout?: number\n /** Default max retries */\n maxRetries?: number\n /** Authentication configuration */\n auth?: {\n /** Environment variable containing the token */\n tokenEnv?: string\n /** Static token (not recommended) */\n token?: string\n }\n}\n\n/**\n * Default fetch options\n */\nexport const DEFAULT_FETCH_OPTIONS: Required<FetchOptions> = {\n timeout: 30000, // 30 seconds\n maxRetries: 3,\n token: '',\n branch: 'main',\n followRedirects: true,\n maxSize: 10 * 1024 * 1024, // 10MB\n}\n\n/**\n * Merge fetch options with defaults\n *\n * @param options - User-provided options\n * @returns Merged options with defaults\n */\nexport function mergeFetchOptions(options?: FetchOptions): Required<FetchOptions> {\n return {\n ...DEFAULT_FETCH_OPTIONS,\n ...options,\n }\n}\n\n/**\n * Detect content type from file extension\n *\n * @param path - File path\n * @returns MIME type\n */\nexport function detectContentType(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase()\n\n const mimeTypes: Record<string, string> = {\n md: 'text/markdown',\n markdown: 'text/markdown',\n txt: 'text/plain',\n json: 'application/json',\n yaml: 'application/x-yaml',\n yml: 'application/x-yaml',\n xml: 'application/xml',\n html: 'text/html',\n htm: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'application/typescript',\n py: 'text/x-python',\n rb: 'text/x-ruby',\n go: 'text/x-go',\n rs: 'text/x-rust',\n java: 'text/x-java',\n c: 'text/x-c',\n cpp: 'text/x-c++',\n h: 'text/x-c',\n hpp: 'text/x-c++',\n sh: 'application/x-sh',\n bash: 'application/x-sh',\n zsh: 'application/x-sh',\n pdf: 'application/pdf',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n }\n\n return mimeTypes[ext || ''] || 'application/octet-stream'\n}\n","/**\n * Local filesystem storage provider\n *\n * Fetches content from the local filesystem for current project references.\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating a LocalStorage provider\n */\nexport interface LocalStorageOptions {\n /** Base directory for resolving paths (default: process.cwd()) */\n baseDir?: string\n}\n\n/**\n * Local filesystem storage provider\n *\n * Handles fetching content from the local filesystem for references\n * that point to the current project.\n */\nexport class LocalStorage implements StorageProvider {\n readonly name = 'local'\n readonly type = 'local' as const\n\n private baseDir: string\n\n constructor(options: LocalStorageOptions = {}) {\n this.baseDir = options.baseDir || process.cwd()\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * Local provider handles references that are in the current project\n * and have a local path.\n */\n canHandle(reference: ResolvedReference): boolean {\n return reference.isCurrentProject && !!reference.localPath\n }\n\n /**\n * Fetch content from local filesystem\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n\n if (!reference.localPath) {\n throw new Error(`No local path for reference: ${reference.uri}`)\n }\n\n const fullPath = path.isAbsolute(reference.localPath)\n ? reference.localPath\n : path.join(this.baseDir, reference.localPath)\n\n // Check file exists\n try {\n await fs.access(fullPath)\n } catch {\n throw new Error(`File not found: ${fullPath}`)\n }\n\n // Check file size\n const stats = await fs.stat(fullPath)\n if (stats.size > opts.maxSize) {\n throw new Error(\n `File too large: ${stats.size} bytes (max: ${opts.maxSize} bytes)`\n )\n }\n\n // Read file content\n const content = await fs.readFile(fullPath)\n\n return {\n content,\n contentType: detectContentType(reference.localPath),\n size: content.length,\n source: 'local',\n metadata: {\n path: fullPath,\n mtime: stats.mtime.toISOString(),\n },\n }\n }\n\n /**\n * Check if file exists locally\n */\n async exists(reference: ResolvedReference): Promise<boolean> {\n if (!reference.localPath) {\n return false\n }\n\n const fullPath = path.isAbsolute(reference.localPath)\n ? reference.localPath\n : path.join(this.baseDir, reference.localPath)\n\n try {\n await fs.access(fullPath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Read file content as string\n */\n async readText(filePath: string): Promise<string> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n return fs.readFile(fullPath, 'utf-8')\n }\n\n /**\n * Write content to file\n */\n async write(filePath: string, content: string | Buffer): Promise<void> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(fullPath), { recursive: true })\n\n await fs.writeFile(fullPath, content)\n }\n\n /**\n * Delete a file\n */\n async delete(filePath: string): Promise<boolean> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n try {\n await fs.unlink(fullPath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * List files in a directory\n */\n async list(dirPath: string): Promise<string[]> {\n const fullPath = path.isAbsolute(dirPath)\n ? dirPath\n : path.join(this.baseDir, dirPath)\n\n try {\n const entries = await fs.readdir(fullPath, { withFileTypes: true })\n return entries\n .filter((e) => e.isFile())\n .map((e) => path.join(dirPath, e.name))\n } catch {\n return []\n }\n }\n}\n\n/**\n * Create a LocalStorage provider\n */\nexport function createLocalStorage(options?: LocalStorageOptions): LocalStorage {\n return new LocalStorage(options)\n}\n","/**\n * GitHub storage provider\n *\n * Fetches content from GitHub repositories using the GitHub API\n * or raw content URLs. Supports both public and private repos.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating a GitHub storage provider\n */\nexport interface GitHubStorageOptions {\n /** GitHub API token for authentication */\n token?: string\n /** Environment variable containing the token */\n tokenEnv?: string\n /** Base URL for GitHub API (default: https://api.github.com) */\n apiBaseUrl?: string\n /** Base URL for raw content (default: https://raw.githubusercontent.com) */\n rawBaseUrl?: string\n /** Default branch to use (default: main) */\n defaultBranch?: string\n}\n\n/**\n * GitHub API response for file content\n */\ninterface GitHubContentResponse {\n name: string\n path: string\n sha: string\n size: number\n type: 'file' | 'dir'\n content?: string\n encoding?: string\n download_url?: string\n}\n\n/**\n * GitHub storage provider\n *\n * Handles fetching content from GitHub repositories.\n * Uses raw.githubusercontent.com for public repos and\n * GitHub API for private repos (with authentication).\n */\nexport class GitHubStorage implements StorageProvider {\n readonly name = 'github'\n readonly type = 'github' as const\n\n private apiBaseUrl: string\n private rawBaseUrl: string\n private defaultBranch: string\n private token?: string\n\n constructor(options: GitHubStorageOptions = {}) {\n this.apiBaseUrl = options.apiBaseUrl || 'https://api.github.com'\n this.rawBaseUrl = options.rawBaseUrl || 'https://raw.githubusercontent.com'\n this.defaultBranch = options.defaultBranch || 'main'\n\n // Get token from options or environment\n this.token = options.token || (options.tokenEnv ? process.env[options.tokenEnv] : undefined)\n if (!this.token) {\n // Try common environment variables\n this.token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN\n }\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * GitHub provider handles references that are NOT in the current project\n * (those need to be fetched from GitHub).\n */\n canHandle(reference: ResolvedReference): boolean {\n return !reference.isCurrentProject\n }\n\n /**\n * Fetch content from GitHub\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const token = opts.token || this.token\n const branch = opts.branch || this.defaultBranch\n\n if (!reference.path) {\n throw new Error(`No path specified for reference: ${reference.uri}`)\n }\n\n // Try raw content first (faster, works for public repos)\n try {\n return await this.fetchRaw(reference, branch, opts, token)\n } catch (error) {\n // If raw fetch fails and we have a token, try API\n if (token) {\n return await this.fetchApi(reference, branch, opts, token)\n }\n throw error\n }\n }\n\n /**\n * Fetch using raw.githubusercontent.com\n */\n private async fetchRaw(\n reference: ResolvedReference,\n branch: string,\n opts: Required<FetchOptions>,\n token?: string\n ): Promise<FetchResult> {\n const url = `${this.rawBaseUrl}/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n }\n\n if (token) {\n headers['Authorization'] = `token ${token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), opts.timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n redirect: opts.followRedirects ? 'follow' : 'manual',\n })\n\n if (!response.ok) {\n throw new Error(`GitHub raw fetch failed: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const content = Buffer.from(arrayBuffer)\n\n if (content.length > opts.maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${opts.maxSize} bytes)`)\n }\n\n return {\n content,\n contentType: response.headers.get('content-type') || detectContentType(reference.path),\n size: content.length,\n source: 'github-raw',\n metadata: {\n url,\n branch,\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Fetch using GitHub API (for private repos)\n */\n private async fetchApi(\n reference: ResolvedReference,\n branch: string,\n opts: Required<FetchOptions>,\n token: string\n ): Promise<FetchResult> {\n const url = `${this.apiBaseUrl}/repos/${reference.org}/${reference.project}/contents/${reference.path}?ref=${branch}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n Accept: 'application/vnd.github.v3+json',\n Authorization: `token ${token}`,\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), opts.timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n throw new Error(`GitHub API fetch failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as GitHubContentResponse\n\n if (data.type !== 'file') {\n throw new Error(`Reference is not a file: ${reference.uri}`)\n }\n\n let content: Buffer\n\n if (data.content && data.encoding === 'base64') {\n // Content is base64 encoded in API response\n content = Buffer.from(data.content, 'base64')\n } else if (data.download_url) {\n // Fetch from download URL\n const downloadResponse = await fetch(data.download_url, {\n headers: { 'User-Agent': 'fractary-codex' },\n signal: controller.signal,\n })\n const arrayBuffer = await downloadResponse.arrayBuffer()\n content = Buffer.from(arrayBuffer)\n } else {\n throw new Error(`No content available for: ${reference.uri}`)\n }\n\n if (content.length > opts.maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${opts.maxSize} bytes)`)\n }\n\n return {\n content,\n contentType: detectContentType(reference.path),\n size: content.length,\n source: 'github-api',\n metadata: {\n sha: data.sha,\n url,\n branch,\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Check if file exists on GitHub\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const token = opts.token || this.token\n const branch = opts.branch || this.defaultBranch\n\n if (!reference.path) {\n return false\n }\n\n // Try HEAD request to raw URL\n const url = `${this.rawBaseUrl}/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n }\n\n if (token) {\n headers['Authorization'] = `token ${token}`\n }\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n })\n return response.ok\n } catch {\n return false\n }\n }\n\n /**\n * Get repository metadata\n */\n async getRepoInfo(\n org: string,\n project: string\n ): Promise<{\n defaultBranch: string\n private: boolean\n size: number\n } | null> {\n const url = `${this.apiBaseUrl}/repos/${org}/${project}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n Accept: 'application/vnd.github.v3+json',\n }\n\n if (this.token) {\n headers['Authorization'] = `token ${this.token}`\n }\n\n try {\n const response = await fetch(url, { headers })\n if (!response.ok) {\n return null\n }\n\n const data = (await response.json()) as {\n default_branch: string\n private: boolean\n size: number\n }\n\n return {\n defaultBranch: data.default_branch,\n private: data.private,\n size: data.size,\n }\n } catch {\n return null\n }\n }\n}\n\n/**\n * Create a GitHub storage provider\n */\nexport function createGitHubStorage(options?: GitHubStorageOptions): GitHubStorage {\n return new GitHubStorage(options)\n}\n","/**\n * HTTP storage provider\n *\n * Fetches content from HTTP/HTTPS URLs. Used for external\n * documentation, APIs, and other web resources.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating an HTTP storage provider\n */\nexport interface HttpStorageOptions {\n /** Default timeout in milliseconds */\n timeout?: number\n /** Maximum content size in bytes */\n maxSize?: number\n /** Custom headers to include in requests */\n headers?: Record<string, string>\n /** User agent string */\n userAgent?: string\n}\n\n/**\n * HTTP storage provider\n *\n * Generic provider for fetching content from HTTP/HTTPS URLs.\n * This is a fallback provider for external resources.\n */\nexport class HttpStorage implements StorageProvider {\n readonly name = 'http'\n readonly type = 'http' as const\n\n private defaultTimeout: number\n private defaultMaxSize: number\n private defaultHeaders: Record<string, string>\n\n constructor(options: HttpStorageOptions = {}) {\n this.defaultTimeout = options.timeout || 30000\n this.defaultMaxSize = options.maxSize || 10 * 1024 * 1024 // 10MB\n this.defaultHeaders = {\n 'User-Agent': options.userAgent || 'fractary-codex',\n ...options.headers,\n }\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * HTTP provider is a fallback - it can handle any reference\n * but should have lower priority than specialized providers.\n */\n canHandle(_reference: ResolvedReference): boolean {\n // HTTP provider is a fallback, so it can handle anything\n // but let other providers take precedence\n return true\n }\n\n /**\n * Fetch content from HTTP URL\n *\n * This method constructs a URL from the reference and fetches it.\n * The URL pattern is: https://raw.githubusercontent.com/{org}/{project}/{branch}/{path}\n *\n * For custom URL schemes, use the fetchUrl method directly.\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const branch = opts.branch || 'main'\n\n if (!reference.path) {\n throw new Error(`No path specified for reference: ${reference.uri}`)\n }\n\n // Construct URL (GitHub raw content as default)\n const url = `https://raw.githubusercontent.com/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n return this.fetchUrl(url, opts)\n }\n\n /**\n * Fetch content from any URL\n */\n async fetchUrl(url: string, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const timeout = opts.timeout || this.defaultTimeout\n const maxSize = opts.maxSize || this.defaultMaxSize\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n }\n\n if (opts.token) {\n headers['Authorization'] = `Bearer ${opts.token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n redirect: opts.followRedirects ? 'follow' : 'manual',\n })\n\n if (!response.ok) {\n throw new Error(`HTTP fetch failed: ${response.status} ${response.statusText}`)\n }\n\n // Check content length header first\n const contentLength = response.headers.get('content-length')\n if (contentLength && parseInt(contentLength, 10) > maxSize) {\n throw new Error(`Content too large: ${contentLength} bytes (max: ${maxSize} bytes)`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const content = Buffer.from(arrayBuffer)\n\n if (content.length > maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${maxSize} bytes)`)\n }\n\n // Extract filename from URL for content type detection\n const pathname = new URL(url).pathname\n const filename = pathname.split('/').pop() || ''\n\n return {\n content,\n contentType: response.headers.get('content-type') || detectContentType(filename),\n size: content.length,\n source: 'http',\n metadata: {\n url,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Check if URL exists (HEAD request)\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const branch = opts.branch || 'main'\n\n if (!reference.path) {\n return false\n }\n\n const url = `https://raw.githubusercontent.com/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n return this.urlExists(url, opts)\n }\n\n /**\n * Check if any URL exists\n */\n async urlExists(url: string, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const timeout = opts.timeout || this.defaultTimeout\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n }\n\n if (opts.token) {\n headers['Authorization'] = `Bearer ${opts.token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n signal: controller.signal,\n redirect: 'follow',\n })\n\n return response.ok\n } catch {\n return false\n } finally {\n clearTimeout(timeoutId)\n }\n }\n}\n\n/**\n * Create an HTTP storage provider\n */\nexport function createHttpStorage(options?: HttpStorageOptions): HttpStorage {\n return new HttpStorage(options)\n}\n","/**\n * Storage manager\n *\n * Coordinates multiple storage providers and handles fallback logic.\n * The manager tries providers in priority order until one succeeds.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport { type StorageProvider, type FetchResult, type FetchOptions, type StorageProviderType } from './provider.js'\nimport { LocalStorage, type LocalStorageOptions } from './local.js'\nimport { GitHubStorage, type GitHubStorageOptions } from './github.js'\nimport { HttpStorage, type HttpStorageOptions } from './http.js'\n\n/**\n * Storage manager configuration\n */\nexport interface StorageManagerConfig {\n /** Local storage options */\n local?: LocalStorageOptions\n /** GitHub storage options */\n github?: GitHubStorageOptions\n /** HTTP storage options */\n http?: HttpStorageOptions\n /** Provider priority order */\n priority?: StorageProviderType[]\n /** Whether to enable caching (handled by cache layer, not storage) */\n enableCaching?: boolean\n}\n\n/**\n * Storage manager\n *\n * Manages multiple storage providers and routes fetch requests\n * to the appropriate provider based on reference type and availability.\n */\nexport class StorageManager {\n private providers: Map<StorageProviderType, StorageProvider> = new Map()\n private priority: StorageProviderType[]\n\n constructor(config: StorageManagerConfig = {}) {\n // Initialize default providers\n this.providers.set('local', new LocalStorage(config.local))\n this.providers.set('github', new GitHubStorage(config.github))\n this.providers.set('http', new HttpStorage(config.http))\n\n // Set priority order (local first for current project, then github, then http)\n this.priority = config.priority || ['local', 'github', 'http']\n }\n\n /**\n * Register a custom storage provider\n */\n registerProvider(provider: StorageProvider): void {\n this.providers.set(provider.type, provider)\n }\n\n /**\n * Remove a storage provider\n */\n removeProvider(type: StorageProviderType): boolean {\n return this.providers.delete(type)\n }\n\n /**\n * Get a provider by type\n */\n getProvider(type: StorageProviderType): StorageProvider | undefined {\n return this.providers.get(type)\n }\n\n /**\n * Get all registered providers\n */\n getProviders(): StorageProvider[] {\n return Array.from(this.providers.values())\n }\n\n /**\n * Find the best provider for a reference\n */\n findProvider(reference: ResolvedReference): StorageProvider | null {\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (provider && provider.canHandle(reference)) {\n return provider\n }\n }\n return null\n }\n\n /**\n * Fetch content for a reference\n *\n * Tries providers in priority order until one succeeds.\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const errors: Error[] = []\n\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (!provider || !provider.canHandle(reference)) {\n continue\n }\n\n try {\n return await provider.fetch(reference, options)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n // Continue to next provider\n }\n }\n\n // All providers failed\n if (errors.length === 0) {\n throw new Error(`No provider can handle reference: ${reference.uri}`)\n }\n\n // Throw the first error with context about other failures\n const firstError = errors[0]\n if (firstError) {\n if (errors.length > 1) {\n throw new Error(`All providers failed for ${reference.uri}. First error: ${firstError.message}`)\n }\n throw firstError\n }\n\n throw new Error(`Unknown error fetching ${reference.uri}`)\n }\n\n /**\n * Check if content exists for a reference\n *\n * Returns true if any provider reports the content exists.\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (!provider || !provider.canHandle(reference)) {\n continue\n }\n\n try {\n if (await provider.exists(reference, options)) {\n return true\n }\n } catch {\n // Continue to next provider\n }\n }\n\n return false\n }\n\n /**\n * Fetch content using a specific provider\n */\n async fetchWith(\n type: StorageProviderType,\n reference: ResolvedReference,\n options?: FetchOptions\n ): Promise<FetchResult> {\n const provider = this.providers.get(type)\n if (!provider) {\n throw new Error(`Provider not found: ${type}`)\n }\n\n return provider.fetch(reference, options)\n }\n\n /**\n * Fetch multiple references in parallel\n */\n async fetchMany(\n references: ResolvedReference[],\n options?: FetchOptions\n ): Promise<Map<string, FetchResult | Error>> {\n const results = new Map<string, FetchResult | Error>()\n\n const promises = references.map(async (ref) => {\n try {\n const result = await this.fetch(ref, options)\n results.set(ref.uri, result)\n } catch (error) {\n results.set(ref.uri, error instanceof Error ? error : new Error(String(error)))\n }\n })\n\n await Promise.all(promises)\n return results\n }\n\n /**\n * Get provider status (for diagnostics)\n */\n getStatus(): Array<{\n type: StorageProviderType\n name: string\n priority: number\n }> {\n return this.priority.map((type, index) => {\n const provider = this.providers.get(type)\n return {\n type,\n name: provider?.name || type,\n priority: index,\n }\n })\n }\n}\n\n/**\n * Create a storage manager with default configuration\n */\nexport function createStorageManager(config?: StorageManagerConfig): StorageManager {\n return new StorageManager(config)\n}\n\n/**\n * Default storage manager instance\n */\nlet defaultManager: StorageManager | null = null\n\n/**\n * Get the default storage manager\n */\nexport function getDefaultStorageManager(): StorageManager {\n if (!defaultManager) {\n defaultManager = createStorageManager()\n }\n return defaultManager\n}\n\n/**\n * Set the default storage manager\n */\nexport function setDefaultStorageManager(manager: StorageManager): void {\n defaultManager = manager\n}\n","/**\n * Cache entry types and utilities\n *\n * Defines the structure of cache entries with metadata for\n * TTL management, freshness checking, and content versioning.\n */\n\nimport type { FetchResult } from '../storage/provider.js'\n\n/**\n * Cache entry status\n */\nexport type CacheEntryStatus = 'fresh' | 'stale' | 'expired'\n\n/**\n * Cache entry metadata\n */\nexport interface CacheEntryMetadata {\n /** Original URI */\n uri: string\n /** When the entry was cached */\n cachedAt: number\n /** When the entry expires (timestamp) */\n expiresAt: number\n /** TTL in seconds */\n ttl: number\n /** ETag for conditional requests */\n etag?: string\n /** Last-Modified header value */\n lastModified?: string\n /** Content hash for change detection */\n contentHash: string\n /** Size in bytes */\n size: number\n /** Content type */\n contentType: string\n /** Source provider that fetched the content */\n source: string\n /** Number of times this entry has been accessed */\n accessCount: number\n /** Last access timestamp */\n lastAccessedAt: number\n /** Custom metadata from provider */\n providerMetadata?: Record<string, unknown>\n}\n\n/**\n * Cache entry with content and metadata\n */\nexport interface CacheEntry {\n /** Entry metadata */\n metadata: CacheEntryMetadata\n /** Cached content */\n content: Buffer\n}\n\n/**\n * Serializable cache entry for persistence\n */\nexport interface SerializedCacheEntry {\n /** Entry metadata */\n metadata: CacheEntryMetadata\n /** Content as base64 string */\n content: string\n}\n\n/**\n * Calculate a simple hash for content\n *\n * Uses a fast, non-cryptographic hash suitable for change detection.\n */\nexport function calculateContentHash(content: Buffer): string {\n // Simple FNV-1a hash for speed\n let hash = 2166136261\n for (let i = 0; i < content.length; i++) {\n hash ^= content[i] ?? 0\n hash = Math.imul(hash, 16777619)\n }\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n\n/**\n * Create a new cache entry from fetch result\n */\nexport function createCacheEntry(uri: string, result: FetchResult, ttl: number): CacheEntry {\n const now = Date.now()\n\n const metadata: CacheEntryMetadata = {\n uri,\n cachedAt: now,\n expiresAt: now + ttl * 1000,\n ttl,\n contentHash: calculateContentHash(result.content),\n size: result.size,\n contentType: result.contentType,\n source: result.source,\n accessCount: 1,\n lastAccessedAt: now,\n providerMetadata: result.metadata,\n }\n\n // Extract ETag and Last-Modified from provider metadata if available\n if (result.metadata?.etag && typeof result.metadata.etag === 'string') {\n metadata.etag = result.metadata.etag\n }\n if (result.metadata?.lastModified && typeof result.metadata.lastModified === 'string') {\n metadata.lastModified = result.metadata.lastModified\n }\n\n return {\n metadata,\n content: result.content,\n }\n}\n\n/**\n * Get the status of a cache entry\n */\nexport function getCacheEntryStatus(entry: CacheEntry): CacheEntryStatus {\n const now = Date.now()\n\n if (now < entry.metadata.expiresAt) {\n return 'fresh'\n }\n\n // Consider stale for up to 5 minutes past expiry\n const staleWindow = 5 * 60 * 1000\n if (now < entry.metadata.expiresAt + staleWindow) {\n return 'stale'\n }\n\n return 'expired'\n}\n\n/**\n * Check if entry is still valid (fresh or stale)\n */\nexport function isCacheEntryValid(entry: CacheEntry): boolean {\n const status = getCacheEntryStatus(entry)\n return status === 'fresh' || status === 'stale'\n}\n\n/**\n * Check if entry is fresh (not expired)\n */\nexport function isCacheEntryFresh(entry: CacheEntry): boolean {\n return getCacheEntryStatus(entry) === 'fresh'\n}\n\n/**\n * Update entry access statistics\n */\nexport function touchCacheEntry(entry: CacheEntry): void {\n entry.metadata.accessCount++\n entry.metadata.lastAccessedAt = Date.now()\n}\n\n/**\n * Serialize cache entry for persistence\n */\nexport function serializeCacheEntry(entry: CacheEntry): SerializedCacheEntry {\n return {\n metadata: entry.metadata,\n content: entry.content.toString('base64'),\n }\n}\n\n/**\n * Deserialize cache entry from persistence\n */\nexport function deserializeCacheEntry(serialized: SerializedCacheEntry): CacheEntry {\n return {\n metadata: serialized.metadata,\n content: Buffer.from(serialized.content, 'base64'),\n }\n}\n\n/**\n * Calculate remaining TTL in seconds\n */\nexport function getRemainingTtl(entry: CacheEntry): number {\n const remaining = entry.metadata.expiresAt - Date.now()\n return Math.max(0, Math.floor(remaining / 1000))\n}\n\n/**\n * Check if content has changed based on hash\n */\nexport function hasContentChanged(entry: CacheEntry, newContent: Buffer): boolean {\n return entry.metadata.contentHash !== calculateContentHash(newContent)\n}\n\n/**\n * Get entry age in seconds\n */\nexport function getCacheEntryAge(entry: CacheEntry): number {\n return Math.floor((Date.now() - entry.metadata.cachedAt) / 1000)\n}\n","/**\n * Cache persistence layer\n *\n * Handles reading and writing cache entries to disk with\n * atomic writes and corruption detection.\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { CacheEntry } from './entry.js'\n\n/**\n * Options for cache persistence\n */\nexport interface CachePersistenceOptions {\n /** Base directory for cache storage */\n cacheDir: string\n /** File extension for cache files */\n extension?: string\n /** Whether to use atomic writes */\n atomicWrites?: boolean\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /** Total number of entries */\n entryCount: number\n /** Total size in bytes */\n totalSize: number\n /** Number of fresh entries */\n freshCount: number\n /** Number of stale entries */\n staleCount: number\n /** Number of expired entries */\n expiredCount: number\n}\n\n/**\n * Cache persistence layer\n *\n * Handles reading and writing cache entries to the filesystem.\n * Uses a directory structure: {cacheDir}/{org}/{project}/{path}.cache\n */\nexport class CachePersistence {\n private cacheDir: string\n private extension: string\n private atomicWrites: boolean\n\n constructor(options: CachePersistenceOptions) {\n this.cacheDir = options.cacheDir\n this.extension = options.extension || '.cache'\n this.atomicWrites = options.atomicWrites ?? true\n }\n\n /**\n * Get the cache file path for a URI\n */\n getCachePath(uri: string): string {\n // Parse the URI to extract org/project/path\n const match = uri.match(/^codex:\\/\\/([^/]+)\\/([^/]+)(?:\\/(.*))?$/)\n if (!match || !match[1] || !match[2]) {\n throw new Error(`Invalid codex URI: ${uri}`)\n }\n\n const [, org, project, filePath] = match\n const relativePath = filePath || 'index'\n\n return path.join(this.cacheDir, org, project, relativePath + this.extension)\n }\n\n /**\n * Get the metadata file path for a URI\n */\n getMetadataPath(uri: string): string {\n return this.getCachePath(uri).replace(this.extension, '.meta.json')\n }\n\n /**\n * Read a cache entry from disk\n */\n async read(uri: string): Promise<CacheEntry | null> {\n const cachePath = this.getCachePath(uri)\n const metadataPath = this.getMetadataPath(uri)\n\n try {\n // Read metadata and content in parallel\n const [metadataJson, content] = await Promise.all([\n fs.readFile(metadataPath, 'utf-8'),\n fs.readFile(cachePath),\n ])\n\n const metadata = JSON.parse(metadataJson)\n return {\n metadata,\n content,\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null\n }\n throw error\n }\n }\n\n /**\n * Write a cache entry to disk\n */\n async write(entry: CacheEntry): Promise<void> {\n const cachePath = this.getCachePath(entry.metadata.uri)\n const metadataPath = this.getMetadataPath(entry.metadata.uri)\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(cachePath), { recursive: true })\n\n if (this.atomicWrites) {\n // Write to temp files first, then rename\n const tempCachePath = cachePath + '.tmp'\n const tempMetadataPath = metadataPath + '.tmp'\n\n try {\n await Promise.all([\n fs.writeFile(tempCachePath, entry.content),\n fs.writeFile(tempMetadataPath, JSON.stringify(entry.metadata, null, 2)),\n ])\n\n await Promise.all([\n fs.rename(tempCachePath, cachePath),\n fs.rename(tempMetadataPath, metadataPath),\n ])\n } catch (error) {\n // Clean up temp files on error\n await Promise.all([\n fs.unlink(tempCachePath).catch(() => {}),\n fs.unlink(tempMetadataPath).catch(() => {}),\n ])\n throw error\n }\n } else {\n await Promise.all([\n fs.writeFile(cachePath, entry.content),\n fs.writeFile(metadataPath, JSON.stringify(entry.metadata, null, 2)),\n ])\n }\n }\n\n /**\n * Delete a cache entry\n */\n async delete(uri: string): Promise<boolean> {\n const cachePath = this.getCachePath(uri)\n const metadataPath = this.getMetadataPath(uri)\n\n try {\n await Promise.all([fs.unlink(cachePath), fs.unlink(metadataPath)])\n return true\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return false\n }\n throw error\n }\n }\n\n /**\n * Check if a cache entry exists\n */\n async exists(uri: string): Promise<boolean> {\n const cachePath = this.getCachePath(uri)\n\n try {\n await fs.access(cachePath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * List all cached URIs\n */\n async list(): Promise<string[]> {\n const uris: string[] = []\n\n try {\n const orgs = await fs.readdir(this.cacheDir)\n\n for (const org of orgs) {\n const orgPath = path.join(this.cacheDir, org)\n const orgStat = await fs.stat(orgPath)\n if (!orgStat.isDirectory()) continue\n\n const projects = await fs.readdir(orgPath)\n\n for (const project of projects) {\n const projectPath = path.join(orgPath, project)\n const projectStat = await fs.stat(projectPath)\n if (!projectStat.isDirectory()) continue\n\n // Recursively find all cache files\n const files = await this.listFilesRecursive(projectPath)\n\n for (const file of files) {\n if (file.endsWith(this.extension)) {\n // Convert path back to URI\n const relativePath = path.relative(projectPath, file)\n const filePath = relativePath.slice(0, -this.extension.length)\n uris.push(`codex://${org}/${project}/${filePath}`)\n }\n }\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return []\n }\n throw error\n }\n\n return uris\n }\n\n /**\n * Recursively list files in a directory\n */\n private async listFilesRecursive(dir: string): Promise<string[]> {\n const files: string[] = []\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n files.push(...(await this.listFilesRecursive(fullPath)))\n } else if (entry.isFile()) {\n files.push(fullPath)\n }\n }\n\n return files\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<number> {\n let count = 0\n\n try {\n const orgs = await fs.readdir(this.cacheDir)\n\n for (const org of orgs) {\n const orgPath = path.join(this.cacheDir, org)\n const stat = await fs.stat(orgPath)\n if (stat.isDirectory()) {\n await fs.rm(orgPath, { recursive: true })\n count++\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error\n }\n }\n\n return count\n }\n\n /**\n * Clear expired entries\n */\n async clearExpired(): Promise<number> {\n const uris = await this.list()\n let cleared = 0\n\n for (const uri of uris) {\n const entry = await this.read(uri)\n if (entry && entry.metadata.expiresAt < Date.now()) {\n if (await this.delete(uri)) {\n cleared++\n }\n }\n }\n\n return cleared\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const stats: CacheStats = {\n entryCount: 0,\n totalSize: 0,\n freshCount: 0,\n staleCount: 0,\n expiredCount: 0,\n }\n\n const uris = await this.list()\n const now = Date.now()\n const staleWindow = 5 * 60 * 1000\n\n for (const uri of uris) {\n const entry = await this.read(uri)\n if (entry) {\n stats.entryCount++\n stats.totalSize += entry.metadata.size\n\n if (now < entry.metadata.expiresAt) {\n stats.freshCount++\n } else if (now < entry.metadata.expiresAt + staleWindow) {\n stats.staleCount++\n } else {\n stats.expiredCount++\n }\n }\n }\n\n return stats\n }\n\n /**\n * Ensure cache directory exists\n */\n async ensureDir(): Promise<void> {\n await fs.mkdir(this.cacheDir, { recursive: true })\n }\n\n /**\n * Get cache directory path\n */\n getCacheDir(): string {\n return this.cacheDir\n }\n}\n\n/**\n * Create a cache persistence layer\n */\nexport function createCachePersistence(options: CachePersistenceOptions): CachePersistence {\n return new CachePersistence(options)\n}\n","/**\n * Cache manager\n *\n * Multi-tier cache manager that coordinates in-memory caching,\n * disk persistence, and storage providers for optimal performance.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport type { StorageManager } from '../storage/manager.js'\nimport type { FetchOptions, FetchResult } from '../storage/provider.js'\nimport {\n type CacheEntry,\n type CacheEntryMetadata,\n createCacheEntry,\n getCacheEntryStatus,\n touchCacheEntry,\n isCacheEntryFresh,\n getRemainingTtl,\n} from './entry.js'\nimport { type CachePersistence, type CacheStats, createCachePersistence } from './persistence.js'\n\n/**\n * Cache manager configuration\n */\nexport interface CacheManagerConfig {\n /** Cache directory path */\n cacheDir: string\n /** Default TTL in seconds */\n defaultTtl?: number\n /** Maximum entries in memory cache */\n maxMemoryEntries?: number\n /** Maximum memory cache size in bytes */\n maxMemorySize?: number\n /** Whether to persist cache to disk */\n enablePersistence?: boolean\n /** Whether to use stale-while-revalidate pattern */\n staleWhileRevalidate?: boolean\n /** Background refresh threshold (seconds before expiry) */\n backgroundRefreshThreshold?: number\n}\n\n/**\n * Cache lookup result\n */\nexport interface CacheLookupResult {\n /** Cache entry if found */\n entry: CacheEntry | null\n /** Whether the entry was found */\n hit: boolean\n /** Whether the entry is fresh */\n fresh: boolean\n /** Source of the entry (memory, disk, network) */\n source: 'memory' | 'disk' | 'network' | 'none'\n}\n\n/**\n * Cache manager\n *\n * Provides a multi-tier caching system with:\n * - L1: In-memory cache (fast, limited size)\n * - L2: Disk persistence (larger, survives restarts)\n * - L3: Storage providers (network fetch)\n */\nexport class CacheManager {\n private memoryCache: Map<string, CacheEntry> = new Map()\n private persistence: CachePersistence | null\n private storage: StorageManager | null = null\n private config: Required<CacheManagerConfig>\n\n // LRU tracking\n private accessOrder: string[] = []\n\n // Background refresh tracking\n private refreshPromises: Map<string, Promise<CacheEntry | null>> = new Map()\n\n constructor(config: CacheManagerConfig) {\n this.config = {\n cacheDir: config.cacheDir,\n defaultTtl: config.defaultTtl ?? 3600, // 1 hour default\n maxMemoryEntries: config.maxMemoryEntries ?? 1000,\n maxMemorySize: config.maxMemorySize ?? 50 * 1024 * 1024, // 50MB\n enablePersistence: config.enablePersistence ?? true,\n staleWhileRevalidate: config.staleWhileRevalidate ?? true,\n backgroundRefreshThreshold: config.backgroundRefreshThreshold ?? 60, // 1 minute\n }\n\n this.persistence = this.config.enablePersistence\n ? createCachePersistence({ cacheDir: this.config.cacheDir })\n : null\n }\n\n /**\n * Set the storage manager for fetching\n */\n setStorageManager(storage: StorageManager): void {\n this.storage = storage\n }\n\n /**\n * Get content for a reference\n *\n * Implements cache-first strategy with stale-while-revalidate.\n */\n async get(\n reference: ResolvedReference,\n options?: FetchOptions & { ttl?: number }\n ): Promise<FetchResult> {\n const ttl = options?.ttl ?? this.config.defaultTtl\n\n // Check memory cache\n let entry = this.memoryCache.get(reference.uri)\n\n // Check disk cache if not in memory\n if (!entry && this.persistence) {\n entry = await this.persistence.read(reference.uri) ?? undefined\n if (entry) {\n // Promote to memory cache\n this.setMemoryEntry(reference.uri, entry)\n }\n }\n\n if (entry) {\n const status = getCacheEntryStatus(entry)\n\n if (status === 'fresh') {\n touchCacheEntry(entry)\n return this.entryToResult(entry)\n }\n\n if (status === 'stale' && this.config.staleWhileRevalidate) {\n // Return stale content immediately\n touchCacheEntry(entry)\n const result = this.entryToResult(entry)\n\n // Trigger background refresh\n this.backgroundRefresh(reference, ttl, options)\n\n return result\n }\n }\n\n // Fetch from storage\n return this.fetchAndCache(reference, ttl, options)\n }\n\n /**\n * Check if content is cached\n */\n async has(uri: string): Promise<boolean> {\n if (this.memoryCache.has(uri)) {\n return true\n }\n\n if (this.persistence) {\n return this.persistence.exists(uri)\n }\n\n return false\n }\n\n /**\n * Get cache entry without fetching\n */\n async lookup(uri: string): Promise<CacheLookupResult> {\n // Check memory cache\n let entry = this.memoryCache.get(uri)\n if (entry) {\n return {\n entry,\n hit: true,\n fresh: isCacheEntryFresh(entry),\n source: 'memory',\n }\n }\n\n // Check disk cache\n if (this.persistence) {\n entry = await this.persistence.read(uri) ?? undefined\n if (entry) {\n this.setMemoryEntry(uri, entry)\n return {\n entry,\n hit: true,\n fresh: isCacheEntryFresh(entry),\n source: 'disk',\n }\n }\n }\n\n return {\n entry: null,\n hit: false,\n fresh: false,\n source: 'none',\n }\n }\n\n /**\n * Store content in cache\n */\n async set(uri: string, result: FetchResult, ttl?: number): Promise<CacheEntry> {\n const actualTtl = ttl ?? this.config.defaultTtl\n const entry = createCacheEntry(uri, result, actualTtl)\n\n // Store in memory\n this.setMemoryEntry(uri, entry)\n\n // Persist to disk\n if (this.persistence) {\n await this.persistence.write(entry)\n }\n\n return entry\n }\n\n /**\n * Invalidate a cache entry\n */\n async invalidate(uri: string): Promise<boolean> {\n let removed = false\n\n if (this.memoryCache.has(uri)) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n removed = true\n }\n\n if (this.persistence) {\n const diskRemoved = await this.persistence.delete(uri)\n removed = removed || diskRemoved\n }\n\n return removed\n }\n\n /**\n * Invalidate all entries matching a pattern\n */\n async invalidatePattern(pattern: RegExp): Promise<number> {\n let count = 0\n\n // Memory cache\n for (const uri of this.memoryCache.keys()) {\n if (pattern.test(uri)) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n count++\n }\n }\n\n // Disk cache\n if (this.persistence) {\n const uris = await this.persistence.list()\n for (const uri of uris) {\n if (pattern.test(uri)) {\n await this.persistence.delete(uri)\n count++\n }\n }\n }\n\n return count\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<void> {\n this.memoryCache.clear()\n this.accessOrder = []\n\n if (this.persistence) {\n await this.persistence.clear()\n }\n }\n\n /**\n * Clear expired entries\n */\n async clearExpired(): Promise<number> {\n let count = 0\n const now = Date.now()\n\n // Memory cache\n for (const [uri, entry] of this.memoryCache) {\n if (entry.metadata.expiresAt < now) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n count++\n }\n }\n\n // Disk cache\n if (this.persistence) {\n count += await this.persistence.clearExpired()\n }\n\n return count\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats & { memoryEntries: number; memorySize: number }> {\n let diskStats: CacheStats = {\n entryCount: 0,\n totalSize: 0,\n freshCount: 0,\n staleCount: 0,\n expiredCount: 0,\n }\n\n if (this.persistence) {\n diskStats = await this.persistence.getStats()\n }\n\n // Calculate memory stats\n let memorySize = 0\n for (const entry of this.memoryCache.values()) {\n memorySize += entry.metadata.size\n }\n\n return {\n ...diskStats,\n memoryEntries: this.memoryCache.size,\n memorySize,\n }\n }\n\n /**\n * Preload content into cache\n */\n async preload(references: ResolvedReference[], options?: FetchOptions): Promise<void> {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n\n await Promise.all(\n references.map(async (ref) => {\n try {\n await this.get(ref, options)\n } catch {\n // Ignore preload errors\n }\n })\n )\n }\n\n /**\n * Get metadata for a cached entry\n */\n async getMetadata(uri: string): Promise<CacheEntryMetadata | null> {\n const result = await this.lookup(uri)\n return result.entry?.metadata ?? null\n }\n\n /**\n * Get remaining TTL for an entry\n */\n async getTtl(uri: string): Promise<number | null> {\n const result = await this.lookup(uri)\n if (result.entry) {\n return getRemainingTtl(result.entry)\n }\n return null\n }\n\n /**\n * Fetch content and store in cache\n */\n private async fetchAndCache(\n reference: ResolvedReference,\n ttl: number,\n options?: FetchOptions\n ): Promise<FetchResult> {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n\n const result = await this.storage.fetch(reference, options)\n await this.set(reference.uri, result, ttl)\n\n return result\n }\n\n /**\n * Background refresh for stale-while-revalidate\n */\n private backgroundRefresh(\n reference: ResolvedReference,\n ttl: number,\n options?: FetchOptions\n ): void {\n const uri = reference.uri\n\n // Don't start multiple refreshes for the same URI\n if (this.refreshPromises.has(uri)) {\n return\n }\n\n const promise = this.fetchAndCache(reference, ttl, options)\n .then(() => {\n const entry = this.memoryCache.get(uri)\n return entry ?? null\n })\n .catch(() => null)\n .finally(() => {\n this.refreshPromises.delete(uri)\n })\n\n this.refreshPromises.set(uri, promise)\n }\n\n /**\n * Set entry in memory cache with LRU eviction\n */\n private setMemoryEntry(uri: string, entry: CacheEntry): void {\n // Remove from current position in access order\n this.removeFromAccessOrder(uri)\n\n // Add to end (most recently used)\n this.accessOrder.push(uri)\n this.memoryCache.set(uri, entry)\n\n // Evict if necessary\n this.evictIfNeeded()\n }\n\n /**\n * Evict entries if over limits\n */\n private evictIfNeeded(): void {\n // Check entry count\n while (this.memoryCache.size > this.config.maxMemoryEntries) {\n this.evictOldest()\n }\n\n // Check memory size\n let totalSize = 0\n for (const entry of this.memoryCache.values()) {\n totalSize += entry.metadata.size\n }\n\n while (totalSize > this.config.maxMemorySize && this.memoryCache.size > 0) {\n const evicted = this.evictOldest()\n if (evicted) {\n totalSize -= evicted.metadata.size\n } else {\n break\n }\n }\n }\n\n /**\n * Evict the oldest entry (LRU)\n */\n private evictOldest(): CacheEntry | null {\n if (this.accessOrder.length === 0) {\n return null\n }\n\n const oldest = this.accessOrder.shift()\n if (oldest) {\n const entry = this.memoryCache.get(oldest)\n this.memoryCache.delete(oldest)\n return entry ?? null\n }\n\n return null\n }\n\n /**\n * Remove URI from access order\n */\n private removeFromAccessOrder(uri: string): void {\n const index = this.accessOrder.indexOf(uri)\n if (index !== -1) {\n this.accessOrder.splice(index, 1)\n }\n }\n\n /**\n * Convert cache entry to fetch result\n */\n private entryToResult(entry: CacheEntry): FetchResult {\n return {\n content: entry.content,\n contentType: entry.metadata.contentType,\n size: entry.metadata.size,\n source: entry.metadata.source,\n metadata: entry.metadata.providerMetadata,\n }\n }\n}\n\n/**\n * Create a cache manager\n */\nexport function createCacheManager(config: CacheManagerConfig): CacheManager {\n return new CacheManager(config)\n}\n\n/**\n * Default cache manager instance\n */\nlet defaultCacheManager: CacheManager | null = null\n\n/**\n * Get the default cache manager\n */\nexport function getDefaultCacheManager(): CacheManager {\n if (!defaultCacheManager) {\n defaultCacheManager = createCacheManager({\n cacheDir: '.fractary/plugins/codex/cache',\n })\n }\n return defaultCacheManager\n}\n\n/**\n * Set the default cache manager\n */\nexport function setDefaultCacheManager(manager: CacheManager): void {\n defaultCacheManager = manager\n}\n","/**\n * Sync types\n *\n * Type definitions for the synchronization system.\n */\n\n/**\n * Sync direction\n */\nexport type SyncDirection = 'to-codex' | 'from-codex' | 'bidirectional'\n\n/**\n * Sync operation type\n */\nexport type SyncOperation = 'create' | 'update' | 'delete' | 'skip' | 'conflict'\n\n/**\n * File sync status\n */\nexport interface FileSyncStatus {\n /** File path relative to project root */\n path: string\n /** Operation to perform */\n operation: SyncOperation\n /** Size in bytes */\n size?: number\n /** Last modified timestamp */\n mtime?: number\n /** Content hash */\n hash?: string\n /** Reason for skip or conflict */\n reason?: string\n}\n\n/**\n * Sync manifest entry\n */\nexport interface SyncManifestEntry {\n /** File path */\n path: string\n /** Content hash */\n hash: string\n /** File size */\n size: number\n /** Last synced timestamp */\n syncedAt: number\n /** Source of last sync */\n source: 'local' | 'remote'\n}\n\n/**\n * Sync manifest\n *\n * Tracks the state of synced files.\n */\nexport interface SyncManifest {\n /** Manifest version */\n version: number\n /** Organization */\n org: string\n /** Project */\n project: string\n /** Last full sync timestamp */\n lastSync: number\n /** File entries */\n entries: Record<string, SyncManifestEntry>\n}\n\n/**\n * Sync plan\n *\n * A plan of operations to perform during sync.\n */\nexport interface SyncPlan {\n /** Direction of sync */\n direction: SyncDirection\n /** Source location */\n source: string\n /** Target location */\n target: string\n /** Files to sync */\n files: FileSyncStatus[]\n /** Total files to process */\n totalFiles: number\n /** Total bytes to transfer */\n totalBytes: number\n /** Estimated time in ms */\n estimatedTime?: number\n /** Conflicts that need resolution */\n conflicts: FileSyncStatus[]\n /** Files that will be skipped */\n skipped: FileSyncStatus[]\n}\n\n/**\n * Sync result\n */\nexport interface SyncResult {\n /** Whether sync completed successfully */\n success: boolean\n /** Plan that was executed */\n plan: SyncPlan\n /** Number of files synced */\n synced: number\n /** Number of files failed */\n failed: number\n /** Number of files skipped */\n skipped: number\n /** Errors encountered */\n errors: Array<{ path: string; error: string }>\n /** Duration in ms */\n duration: number\n /** Timestamp */\n timestamp: number\n}\n\n/**\n * Sync options\n */\nexport interface SyncOptions {\n /** Sync direction */\n direction?: SyncDirection\n /** Whether to perform a dry run */\n dryRun?: boolean\n /** Force overwrite on conflicts */\n force?: boolean\n /** Delete files not in source */\n delete?: boolean\n /** Patterns to include */\n include?: string[]\n /** Patterns to exclude */\n exclude?: string[]\n /** Maximum files to sync */\n maxFiles?: number\n /** Timeout in ms */\n timeout?: number\n /** Progress callback */\n onProgress?: (current: number, total: number, file: string) => void\n}\n\n/**\n * Sync rule\n */\nexport interface SyncRule {\n /** Pattern to match */\n pattern: string\n /** Whether to include (true) or exclude (false) */\n include: boolean\n /** Priority (higher = evaluated first) */\n priority?: number\n /** Sync direction this rule applies to */\n direction?: SyncDirection\n}\n\n/**\n * Directional sync configuration (v0.7.0+)\n *\n * Provides explicit include/exclude patterns for a sync direction.\n */\nexport interface DirectionalSyncConfig {\n /** Patterns to include (required) */\n include: string[]\n /** Patterns to exclude (optional) */\n exclude?: string[]\n}\n\n/**\n * Routing configuration\n */\nexport interface RoutingConfig {\n /** Whether to use frontmatter-based routing (default: false in v0.7.0+) */\n use_frontmatter?: boolean\n}\n\n/**\n * Sync configuration\n */\nexport interface SyncConfig {\n /** Default sync direction */\n defaultDirection: SyncDirection\n /** Sync rules */\n rules: SyncRule[]\n /** Default patterns to exclude */\n defaultExcludes: string[]\n /** Whether to delete orphaned files */\n deleteOrphans: boolean\n /** Conflict resolution strategy */\n conflictStrategy: 'newest' | 'local' | 'remote' | 'manual'\n\n // New format (v0.7.0+) - Recommended\n /** Configuration for pulling from codex (new format) */\n from_codex?: DirectionalSyncConfig\n /** Configuration for pushing to codex (new format) */\n to_codex?: DirectionalSyncConfig\n /** Routing configuration */\n routing?: RoutingConfig\n\n // Legacy format (deprecated, backward compatible)\n /** @deprecated Use from_codex.include instead. Org-level defaults for pulling from codex */\n default_from_codex?: string[]\n /** @deprecated Use to_codex.include instead. Org-level defaults for pushing to codex */\n default_to_codex?: string[]\n /** @deprecated Use from_codex.exclude or to_codex.exclude instead. Global exclude patterns */\n exclude?: string[]\n}\n\n/**\n * Default sync configuration\n */\nexport const DEFAULT_SYNC_CONFIG: SyncConfig = {\n defaultDirection: 'to-codex',\n rules: [],\n defaultExcludes: [\n '**/node_modules/**',\n '**/.git/**',\n '**/.DS_Store',\n '**/Thumbs.db',\n '**/*.log',\n '**/.env*',\n '**/dist/**',\n '**/build/**',\n '**/coverage/**',\n ],\n deleteOrphans: false,\n conflictStrategy: 'newest',\n}\n","/**\n * Sync rule evaluator\n *\n * Evaluates sync rules to determine which files should be synced.\n */\n\nimport micromatch from 'micromatch'\nimport type { SyncRule, SyncDirection } from './types.js'\n\n/**\n * Evaluation result for a single file\n */\nexport interface EvaluationResult {\n /** File path */\n path: string\n /** Whether the file should be synced */\n shouldSync: boolean\n /** Matching rule (if any) */\n matchedRule?: SyncRule\n /** Reason for the decision */\n reason: string\n}\n\n/**\n * Evaluate a file path against sync rules\n *\n * @param path - File path to evaluate\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Evaluation result\n */\nexport function evaluatePath(\n path: string,\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): EvaluationResult {\n // First check default excludes\n for (const pattern of defaultExcludes) {\n if (micromatch.isMatch(path, pattern)) {\n return {\n path,\n shouldSync: false,\n reason: `Excluded by default pattern: ${pattern}`,\n }\n }\n }\n\n // Sort rules by priority (higher first)\n const sortedRules = [...rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n\n // Find first matching rule\n for (const rule of sortedRules) {\n // Skip rules that don't apply to this direction\n if (rule.direction && rule.direction !== direction) {\n continue\n }\n\n if (micromatch.isMatch(path, rule.pattern)) {\n return {\n path,\n shouldSync: rule.include,\n matchedRule: rule,\n reason: rule.include\n ? `Included by rule: ${rule.pattern}`\n : `Excluded by rule: ${rule.pattern}`,\n }\n }\n }\n\n // Default: include if no rule matches\n return {\n path,\n shouldSync: true,\n reason: 'No matching rule, included by default',\n }\n}\n\n/**\n * Evaluate multiple paths against sync rules\n *\n * @param paths - Array of file paths\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Map of path to evaluation result\n */\nexport function evaluatePaths(\n paths: string[],\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): Map<string, EvaluationResult> {\n const results = new Map<string, EvaluationResult>()\n\n for (const path of paths) {\n results.set(path, evaluatePath(path, rules, direction, defaultExcludes))\n }\n\n return results\n}\n\n/**\n * Filter paths to get only syncable files\n *\n * @param paths - Array of file paths\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Array of paths that should be synced\n */\nexport function filterSyncablePaths(\n paths: string[],\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): string[] {\n return paths.filter(\n (path) => evaluatePath(path, rules, direction, defaultExcludes).shouldSync\n )\n}\n\n/**\n * Create sync rules from patterns\n *\n * @param include - Patterns to include\n * @param exclude - Patterns to exclude\n * @returns Array of sync rules\n */\nexport function createRulesFromPatterns(\n include: string[] = [],\n exclude: string[] = []\n): SyncRule[] {\n const rules: SyncRule[] = []\n\n // Add exclude rules with higher priority\n for (const pattern of exclude) {\n rules.push({\n pattern,\n include: false,\n priority: 100,\n })\n }\n\n // Add include rules\n for (const pattern of include) {\n rules.push({\n pattern,\n include: true,\n priority: 50,\n })\n }\n\n return rules\n}\n\n/**\n * Merge multiple sets of rules\n *\n * @param ruleSets - Arrays of rules to merge\n * @returns Merged rules array\n */\nexport function mergeRules(...ruleSets: SyncRule[][]): SyncRule[] {\n return ruleSets.flat()\n}\n\n/**\n * Get summary of evaluation results\n */\nexport interface EvaluationSummary {\n total: number\n included: number\n excluded: number\n byReason: Record<string, number>\n}\n\n/**\n * Summarize evaluation results\n *\n * @param results - Evaluation results map\n * @returns Summary of results\n */\nexport function summarizeEvaluations(\n results: Map<string, EvaluationResult>\n): EvaluationSummary {\n const summary: EvaluationSummary = {\n total: results.size,\n included: 0,\n excluded: 0,\n byReason: {},\n }\n\n for (const result of results.values()) {\n if (result.shouldSync) {\n summary.included++\n } else {\n summary.excluded++\n }\n\n summary.byReason[result.reason] = (summary.byReason[result.reason] ?? 0) + 1\n }\n\n return summary\n}\n\n/**\n * Validate sync rules\n *\n * @param rules - Rules to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateRules(rules: SyncRule[]): string[] {\n const errors: string[] = []\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]\n if (!rule) continue\n\n // Check pattern is valid\n if (!rule.pattern || rule.pattern.trim() === '') {\n errors.push(`Rule ${i}: pattern is empty`)\n continue\n }\n\n // Check pattern is valid glob\n try {\n micromatch.isMatch('test', rule.pattern)\n } catch {\n errors.push(`Rule ${i}: invalid pattern \"${rule.pattern}\"`)\n }\n\n // Check direction is valid\n if (rule.direction && !['to-codex', 'from-codex', 'bidirectional'].includes(rule.direction)) {\n errors.push(`Rule ${i}: invalid direction \"${rule.direction}\"`)\n }\n }\n\n return errors\n}\n","/**\n * Sync planner\n *\n * Creates sync plans by comparing source and target file states.\n */\n\nimport type {\n SyncPlan,\n SyncOptions,\n SyncDirection,\n FileSyncStatus,\n SyncConfig,\n} from './types.js'\nimport { evaluatePath } from './evaluator.js'\n\n/**\n * File info for comparison\n */\nexport interface FileInfo {\n path: string\n size: number\n mtime: number\n hash?: string\n}\n\n/**\n * Create a sync plan by comparing source and target files\n *\n * @param sourceFiles - Files in the source\n * @param targetFiles - Files in the target\n * @param options - Sync options\n * @param config - Sync configuration\n * @returns Sync plan\n */\nexport function createSyncPlan(\n sourceFiles: FileInfo[],\n targetFiles: FileInfo[],\n options: SyncOptions,\n config: SyncConfig\n): SyncPlan {\n const direction = options.direction ?? config.defaultDirection\n const targetMap = new Map(targetFiles.map((f) => [f.path, f]))\n const sourceMap = new Map(sourceFiles.map((f) => [f.path, f]))\n\n const files: FileSyncStatus[] = []\n const conflicts: FileSyncStatus[] = []\n const skipped: FileSyncStatus[] = []\n\n // Build include/exclude rules\n const rules = [\n ...config.rules,\n ...(options.include ?? []).map((p) => ({ pattern: p, include: true, priority: 200 })),\n ...(options.exclude ?? []).map((p) => ({ pattern: p, include: false, priority: 200 })),\n ]\n\n const excludes = [...config.defaultExcludes]\n\n // Process source files\n for (const sourceFile of sourceFiles) {\n // Evaluate if file should be synced\n const evaluation = evaluatePath(sourceFile.path, rules, direction, excludes)\n\n if (!evaluation.shouldSync) {\n skipped.push({\n path: sourceFile.path,\n operation: 'skip',\n size: sourceFile.size,\n reason: evaluation.reason,\n })\n continue\n }\n\n const targetFile = targetMap.get(sourceFile.path)\n\n if (!targetFile) {\n // File doesn't exist in target - create it\n files.push({\n path: sourceFile.path,\n operation: 'create',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n } else {\n // File exists in both - check for changes\n const isDifferent = sourceFile.hash !== targetFile.hash\n\n if (isDifferent) {\n if (options.force) {\n // Force overwrite\n files.push({\n path: sourceFile.path,\n operation: 'update',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n } else if (targetFile.mtime > sourceFile.mtime) {\n // Target is newer - conflict\n conflicts.push({\n path: sourceFile.path,\n operation: 'conflict',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n reason: 'Target file is newer than source',\n })\n } else {\n // Source is newer - update\n files.push({\n path: sourceFile.path,\n operation: 'update',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n }\n } else {\n // Files are identical - skip\n skipped.push({\n path: sourceFile.path,\n operation: 'skip',\n size: sourceFile.size,\n reason: 'Files are identical',\n })\n }\n }\n }\n\n // Handle deletions if enabled\n if (options.delete) {\n for (const targetFile of targetFiles) {\n if (!sourceMap.has(targetFile.path)) {\n // File in target but not in source\n const evaluation = evaluatePath(targetFile.path, rules, direction, excludes)\n\n if (evaluation.shouldSync) {\n files.push({\n path: targetFile.path,\n operation: 'delete',\n size: targetFile.size,\n })\n }\n }\n }\n }\n\n // Apply max files limit\n let limitedFiles = files\n if (options.maxFiles && files.length > options.maxFiles) {\n limitedFiles = files.slice(0, options.maxFiles)\n for (const file of files.slice(options.maxFiles)) {\n skipped.push({\n ...file,\n operation: 'skip',\n reason: 'Exceeded max files limit',\n })\n }\n }\n\n // Calculate totals\n const totalBytes = limitedFiles.reduce((sum, f) => sum + (f.size ?? 0), 0)\n\n return {\n direction,\n source: direction === 'from-codex' ? 'codex' : 'local',\n target: direction === 'from-codex' ? 'local' : 'codex',\n files: limitedFiles,\n totalFiles: limitedFiles.length,\n totalBytes,\n conflicts,\n skipped,\n }\n}\n\n/**\n * Estimate sync time based on file sizes\n *\n * @param plan - Sync plan\n * @param bytesPerSecond - Estimated transfer speed (default: 1MB/s)\n * @returns Estimated time in milliseconds\n */\nexport function estimateSyncTime(plan: SyncPlan, bytesPerSecond = 1024 * 1024): number {\n const transferTime = (plan.totalBytes / bytesPerSecond) * 1000\n const overheadPerFile = 50 // ms per file\n const overhead = plan.totalFiles * overheadPerFile\n\n return Math.ceil(transferTime + overhead)\n}\n\n/**\n * Create an empty sync plan\n */\nexport function createEmptySyncPlan(direction: SyncDirection = 'to-codex'): SyncPlan {\n return {\n direction,\n source: direction === 'from-codex' ? 'codex' : 'local',\n target: direction === 'from-codex' ? 'local' : 'codex',\n files: [],\n totalFiles: 0,\n totalBytes: 0,\n conflicts: [],\n skipped: [],\n }\n}\n\n/**\n * Filter plan to only include specific operations\n */\nexport function filterPlanOperations(\n plan: SyncPlan,\n operations: Array<'create' | 'update' | 'delete'>\n): SyncPlan {\n const filtered = plan.files.filter((f) =>\n operations.includes(f.operation as 'create' | 'update' | 'delete')\n )\n\n return {\n ...plan,\n files: filtered,\n totalFiles: filtered.length,\n totalBytes: filtered.reduce((sum, f) => sum + (f.size ?? 0), 0),\n }\n}\n\n/**\n * Get plan statistics\n */\nexport interface PlanStats {\n creates: number\n updates: number\n deletes: number\n skips: number\n conflicts: number\n totalBytes: number\n}\n\n/**\n * Get statistics from a sync plan\n */\nexport function getPlanStats(plan: SyncPlan): PlanStats {\n return {\n creates: plan.files.filter((f) => f.operation === 'create').length,\n updates: plan.files.filter((f) => f.operation === 'update').length,\n deletes: plan.files.filter((f) => f.operation === 'delete').length,\n skips: plan.skipped.length,\n conflicts: plan.conflicts.length,\n totalBytes: plan.totalBytes,\n }\n}\n\n/**\n * Format plan as human-readable summary\n */\nexport function formatPlanSummary(plan: SyncPlan): string {\n const stats = getPlanStats(plan)\n\n const lines = [\n `Sync Plan: ${plan.source} → ${plan.target}`,\n `Direction: ${plan.direction}`,\n '',\n `Operations:`,\n ` Create: ${stats.creates} files`,\n ` Update: ${stats.updates} files`,\n ` Delete: ${stats.deletes} files`,\n ` Skip: ${stats.skips} files`,\n '',\n ]\n\n if (stats.conflicts > 0) {\n lines.push(`⚠️ Conflicts: ${stats.conflicts} files`)\n lines.push('')\n }\n\n lines.push(`Total: ${plan.totalFiles} files (${formatBytes(stats.totalBytes)})`)\n\n return lines.join('\\n')\n}\n\n/**\n * Format bytes as human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n}\n","/**\n * Routing-aware codex scanner\n *\n * Scans entire codex repository and evaluates routing rules to determine\n * which files should sync to a target project based on frontmatter metadata.\n *\n * Based on SPEC-20260105: Routing-Aware Sync Implementation\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { Metadata } from '../schemas/metadata.js'\nimport type { SyncRules } from '../schemas/config.js'\nimport { shouldSyncToRepo } from '../core/routing/evaluator.js'\nimport { parseMetadata } from '../core/metadata/parser.js'\nimport { calculateContentHash } from '../cache/entry.js'\nimport type { LocalStorage } from '../storage/local.js'\n\n/**\n * File information with routing metadata\n */\nexport interface RoutedFileInfo {\n /** File path relative to codex root */\n path: string\n /** File size in bytes */\n size: number\n /** Last modified timestamp */\n mtime: number\n /** Content hash for change detection */\n hash: string\n /** Parsed frontmatter metadata */\n metadata: Metadata\n /** Source project in codex (e.g., \"etl.corthion.ai\") */\n sourceProject: string\n}\n\n/**\n * Options for routing-aware scan\n */\nexport interface RoutingScanOptions {\n /** Path to codex repository directory */\n codexDir: string\n /** Target project to sync to (e.g., \"lake.corthonomy.ai\") */\n targetProject: string\n /** Organization name (e.g., \"corthosai\") */\n org: string\n /** Routing rules configuration (optional, uses defaults if not provided) */\n rules?: SyncRules\n /** Storage provider for reading files */\n storage: LocalStorage\n /** Skip files without frontmatter (default: true) */\n skipNoFrontmatter?: boolean\n /** Maximum file size to process in bytes (default: 10MB) */\n maxFileSize?: number\n /** Directional from_codex patterns (takes precedence over frontmatter routing) */\n fromCodexPatterns?: string[]\n /** Routing configuration (controls frontmatter parsing) */\n routing?: { use_frontmatter?: boolean }\n}\n\n/**\n * Statistics from a routing scan\n */\nexport interface RoutingScanStats {\n /** Total files scanned */\n totalScanned: number\n /** Files that matched routing rules */\n totalMatched: number\n /** Files skipped (no frontmatter, errors, etc.) */\n totalSkipped: number\n /** Unique source projects found */\n sourceProjects: string[]\n /** Duration of scan in milliseconds */\n durationMs: number\n /** Errors encountered (non-fatal) */\n errors: Array<{ path: string; error: string }>\n}\n\n/**\n * Result from routing-aware scan\n */\nexport interface RoutingScanResult {\n /** Files that should sync to target project */\n files: RoutedFileInfo[]\n /** Scan statistics */\n stats: RoutingScanStats\n}\n\n/**\n * Scan entire codex repository and return files that route to target project\n *\n * This is the core function that enables cross-project knowledge sharing by:\n * 1. Listing ALL files in the entire codex repository (not just target project)\n * 2. Parsing frontmatter metadata from each file\n * 3. Evaluating codex_sync_include patterns against target project\n * 4. Returning only files that match routing rules\n *\n * @example\n * ```typescript\n * const result = await scanCodexWithRouting({\n * codexDir: '/path/to/codex.corthos.ai',\n * targetProject: 'lake.corthonomy.ai',\n * org: 'corthosai',\n * storage: localStorage\n * })\n *\n * console.log(`Found ${result.files.length} files routing to lake.corthonomy.ai`)\n * console.log(`From ${result.stats.sourceProjects.length} projects`)\n * ```\n *\n * @param options - Scan options\n * @returns Files that should sync to target project with scan statistics\n */\nexport async function scanCodexWithRouting(\n options: RoutingScanOptions\n): Promise<RoutingScanResult> {\n const {\n codexDir,\n targetProject,\n org,\n rules,\n storage,\n skipNoFrontmatter = false,\n maxFileSize = 10 * 1024 * 1024, // 10MB default\n fromCodexPatterns,\n } = options\n\n const startTime = Date.now()\n const routedFiles: RoutedFileInfo[] = []\n const sourceProjectsSet = new Set<string>()\n const errors: Array<{ path: string; error: string }> = []\n let totalScanned = 0\n let totalSkipped = 0\n\n // Import directional pattern matcher and expand placeholders if using from_codex patterns\n let expandedFromCodexPatterns = fromCodexPatterns\n let matchFromCodexPattern: ((filePath: string, patterns: string[], targetProject: string) => boolean) | null = null\n\n if (fromCodexPatterns && fromCodexPatterns.length > 0) {\n const module = await import('./directional-patterns.js')\n matchFromCodexPattern = module.matchFromCodexPattern\n // Expand {project} placeholder in patterns\n expandedFromCodexPatterns = module.expandPlaceholders(fromCodexPatterns, targetProject)\n }\n\n // Step 1: List ALL files recursively in entire codex repository\n const allFiles = await listAllFilesRecursive(codexDir)\n\n // Step 2: For each file, evaluate routing\n for (const filePath of allFiles) {\n totalScanned++\n\n try {\n // Check all file types for frontmatter (not just markdown)\n // This enables syncing of JSON schemas, YAML configs, and other files with routing metadata\n\n // Get full path for reading\n const fullPath = path.join(codexDir, filePath)\n\n // Check file size before reading\n const stats = await fs.stat(fullPath)\n if (stats.size > maxFileSize) {\n totalSkipped++\n errors.push({\n path: filePath,\n error: `File too large (${stats.size} bytes, max: ${maxFileSize})`,\n })\n continue\n }\n\n // Read file content\n const content = await storage.readText(fullPath)\n\n // Extract source project from path (needed for both pattern matching and routing)\n const sourceProject = extractProjectFromPath(filePath, org)\n\n // Determine if file should sync using either directional patterns or frontmatter routing\n let shouldSync = false\n let parseResult: ReturnType<typeof parseMetadata> | null = null\n\n // Check if we should use frontmatter routing (v0.7.0+)\n // Default is FALSE - frontmatter routing is deprecated\n const useFrontmatter = options.routing?.use_frontmatter === true\n\n if (matchFromCodexPattern && expandedFromCodexPatterns && expandedFromCodexPatterns.length > 0) {\n // Use directional from_codex patterns (takes precedence, no frontmatter needed)\n shouldSync = matchFromCodexPattern(filePath, expandedFromCodexPatterns, targetProject)\n\n // Still parse metadata for the file info, but don't use for routing\n parseResult = parseMetadata(content, { strict: false })\n } else if (useFrontmatter) {\n // Parse frontmatter for routing (legacy behavior, deprecated)\n parseResult = parseMetadata(content, { strict: false })\n\n // Add deprecation warning if frontmatter routing is detected\n if (parseResult.metadata.codex_sync_include) {\n console.warn(\n `[DEPRECATION] File ${filePath} uses codex_sync_include frontmatter. ` +\n `This feature will be removed in v1.0. Use config.yaml patterns instead.`\n )\n }\n\n // Skip files without frontmatter if configured\n if (skipNoFrontmatter && Object.keys(parseResult.metadata).length === 0) {\n totalSkipped++\n continue\n }\n\n // Fall back to frontmatter-based routing\n shouldSync = shouldSyncToRepo({\n filePath,\n fileMetadata: parseResult.metadata,\n targetRepo: targetProject,\n sourceRepo: sourceProject,\n rules,\n })\n } else {\n // Neither config patterns nor frontmatter routing enabled - skip\n totalSkipped++\n continue\n }\n\n if (shouldSync) {\n // Calculate file metadata\n const buffer = Buffer.from(content)\n const hash = calculateContentHash(buffer)\n\n routedFiles.push({\n path: filePath,\n size: buffer.length,\n mtime: stats.mtimeMs,\n hash,\n metadata: parseResult?.metadata ?? {},\n sourceProject,\n })\n\n sourceProjectsSet.add(sourceProject)\n } else {\n totalSkipped++\n }\n } catch (error) {\n // Log error but continue processing other files\n totalSkipped++\n errors.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n const durationMs = Date.now() - startTime\n\n return {\n files: routedFiles,\n stats: {\n totalScanned,\n totalMatched: routedFiles.length,\n totalSkipped,\n sourceProjects: Array.from(sourceProjectsSet).sort(),\n durationMs,\n errors,\n },\n }\n}\n\n/**\n * Extract project name from codex file path\n *\n * Supports two codex structures:\n * 1. Flat: {org}/{project}/{path/to/file.md}\n * Example: \"corthosai/etl.corthion.ai/docs/api.md\" → \"etl.corthion.ai\"\n * 2. Projects dir: projects/{project}/{path/to/file.md}\n * Example: \"projects/etl.corthion.ai/docs/api.md\" → \"etl.corthion.ai\"\n *\n * @param filePath - File path like \"corthosai/etl.corthion.ai/docs/api.md\" or \"projects/etl.corthion.ai/docs/api.md\"\n * @param org - Organization name like \"corthosai\"\n * @returns Project name like \"etl.corthion.ai\"\n */\nexport function extractProjectFromPath(filePath: string, org: string): string {\n // Normalize path separators\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Remove leading org directory if present\n const withoutOrg = normalizedPath.startsWith(`${org}/`)\n ? normalizedPath.slice(org.length + 1)\n : normalizedPath\n\n // Check if using projects/ subdirectory structure\n if (withoutOrg.startsWith('projects/')) {\n // Extract project name from projects/{project}/...\n const afterProjects = withoutOrg.slice('projects/'.length)\n const firstSlash = afterProjects.indexOf('/')\n if (firstSlash === -1) {\n // No further path segments, use entire remainder as project\n return afterProjects\n }\n return afterProjects.slice(0, firstSlash)\n }\n\n // Flat structure: extract first path segment as project name\n const firstSlash = withoutOrg.indexOf('/')\n if (firstSlash === -1) {\n // File is at root level, use entire path as project\n return withoutOrg\n }\n\n return withoutOrg.slice(0, firstSlash)\n}\n\n/**\n * Recursively list all files in directory\n *\n * @param dirPath - Directory to scan\n * @returns Array of relative file paths\n */\nexport async function listAllFilesRecursive(dirPath: string): Promise<string[]> {\n const files: string[] = []\n\n async function scanDirectory(currentPath: string, relativePath: string = ''): Promise<void> {\n try {\n const entries = await fs.readdir(currentPath, { withFileTypes: true })\n\n for (const entry of entries) {\n const entryPath = path.join(currentPath, entry.name)\n const entryRelativePath = relativePath\n ? path.join(relativePath, entry.name)\n : entry.name\n\n if (entry.isDirectory()) {\n // Skip hidden directories and common ignore patterns\n if (\n entry.name.startsWith('.') ||\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === 'build'\n ) {\n continue\n }\n\n // Recursively scan subdirectory\n await scanDirectory(entryPath, entryRelativePath)\n } else if (entry.isFile()) {\n // Add file to list\n files.push(entryRelativePath)\n }\n }\n } catch {\n // Ignore directories we can't read (permissions, etc.)\n // Silently skip - this is expected for permission issues\n }\n }\n\n await scanDirectory(dirPath)\n\n return files\n}\n\n/**\n * Group routed files by source project\n *\n * Utility function for displaying results grouped by project.\n *\n * @param files - Files from routing scan\n * @returns Map of project name to files from that project\n */\nexport function groupFilesByProject(\n files: RoutedFileInfo[]\n): Map<string, RoutedFileInfo[]> {\n const grouped = new Map<string, RoutedFileInfo[]>()\n\n for (const file of files) {\n const existing = grouped.get(file.sourceProject) || []\n existing.push(file)\n grouped.set(file.sourceProject, existing)\n }\n\n return grouped\n}\n\n/**\n * Calculate total size of routed files\n *\n * @param files - Files from routing scan\n * @returns Total size in bytes\n */\nexport function calculateTotalSize(files: RoutedFileInfo[]): number {\n return files.reduce((total, file) => total + file.size, 0)\n}\n\n/**\n * Format scan statistics for display\n *\n * @param stats - Scan statistics\n * @returns Human-readable statistics string\n */\nexport function formatScanStats(stats: RoutingScanStats): string {\n const lines: string[] = []\n\n lines.push(`Scanned: ${stats.totalScanned} files`)\n lines.push(`Matched: ${stats.totalMatched} files`)\n lines.push(`Skipped: ${stats.totalSkipped} files`)\n lines.push(`Source projects: ${stats.sourceProjects.length}`)\n lines.push(` ${stats.sourceProjects.join(', ')}`)\n lines.push(`Duration: ${stats.durationMs}ms`)\n\n if (stats.errors.length > 0) {\n lines.push(`Errors: ${stats.errors.length}`)\n stats.errors.slice(0, 5).forEach((err) => {\n lines.push(` ${err.path}: ${err.error}`)\n })\n if (stats.errors.length > 5) {\n lines.push(` ... and ${stats.errors.length - 5} more`)\n }\n }\n\n return lines.join('\\n')\n}\n","/**\n * Sync manager\n *\n * Coordinates sync operations between local files and codex repository.\n */\n\nimport type { LocalStorage } from '../storage/local.js'\nimport type {\n SyncPlan,\n SyncResult,\n SyncOptions,\n SyncConfig,\n SyncManifest,\n SyncManifestEntry,\n FileSyncStatus,\n} from './types.js'\nimport { DEFAULT_SYNC_CONFIG } from './types.js'\nimport { createSyncPlan, estimateSyncTime, type FileInfo } from './planner.js'\nimport { calculateContentHash } from '../cache/entry.js'\nimport { scanCodexWithRouting, type RoutingScanResult } from './routing-scanner.js'\n\n/**\n * Sync manager configuration\n */\nexport interface SyncManagerConfig {\n /** Local storage provider */\n localStorage: LocalStorage\n /** Sync configuration */\n config?: Partial<SyncConfig>\n /** Manifest file path */\n manifestPath?: string\n}\n\n/**\n * Sync manager\n *\n * Manages synchronization between local files and the codex repository.\n */\nexport class SyncManager {\n private localStorage: LocalStorage\n private config: SyncConfig\n private manifestPath: string\n private manifest: SyncManifest | null = null\n\n constructor(options: SyncManagerConfig) {\n this.localStorage = options.localStorage\n this.config = {\n ...DEFAULT_SYNC_CONFIG,\n ...options.config,\n }\n this.manifestPath = options.manifestPath ?? '.fractary/codex-sync-manifest.json'\n }\n\n /**\n * Resolve from_codex include patterns (v0.7.0+)\n *\n * Supports both new format (from_codex.include) and legacy format (default_from_codex).\n * New format takes precedence.\n */\n private resolveFromCodexPatterns(): string[] {\n // New format takes precedence\n if (this.config.from_codex?.include) {\n return this.config.from_codex.include\n }\n\n // Fall back to legacy format\n return this.config.default_from_codex || []\n }\n\n /**\n * Resolve to_codex include patterns (v0.7.0+)\n *\n * Supports both new format (to_codex.include) and legacy format (default_to_codex).\n * New format takes precedence.\n */\n private resolveToCodexPatterns(): string[] {\n // New format takes precedence\n if (this.config.to_codex?.include) {\n return this.config.to_codex.include\n }\n\n // Fall back to legacy format\n return this.config.default_to_codex || []\n }\n\n /**\n * Load the sync manifest\n */\n async loadManifest(): Promise<SyncManifest | null> {\n try {\n const content = await this.localStorage.readText(this.manifestPath)\n this.manifest = JSON.parse(content)\n return this.manifest\n } catch {\n return null\n }\n }\n\n /**\n * Save the sync manifest\n */\n async saveManifest(manifest: SyncManifest): Promise<void> {\n this.manifest = manifest\n await this.localStorage.write(this.manifestPath, JSON.stringify(manifest, null, 2))\n }\n\n /**\n * Get or create manifest\n */\n async getOrCreateManifest(org: string, project: string): Promise<SyncManifest> {\n let manifest = await this.loadManifest()\n\n if (!manifest || manifest.org !== org || manifest.project !== project) {\n manifest = {\n version: 1,\n org,\n project,\n lastSync: 0,\n entries: {},\n }\n }\n\n return manifest\n }\n\n /**\n * List local files\n */\n async listLocalFiles(directory: string): Promise<FileInfo[]> {\n const files = await this.localStorage.list(directory)\n const fileInfos: FileInfo[] = []\n\n for (const file of files) {\n try {\n const content = await this.localStorage.readText(file)\n const buffer = Buffer.from(content)\n fileInfos.push({\n path: file,\n size: buffer.length,\n mtime: Date.now(), // Would need fs.stat for real mtime\n hash: calculateContentHash(buffer),\n })\n } catch {\n // Skip files that can't be read\n }\n }\n\n return fileInfos\n }\n\n /**\n * Create a sync plan\n *\n * @param _org - Organization (reserved for future use)\n * @param _project - Project (reserved for future use)\n * @param sourceDir - Source directory to sync from\n * @param targetFiles - Files currently in the target\n * @param options - Sync options\n */\n async createPlan(\n _org: string,\n _project: string,\n sourceDir: string,\n targetFiles: FileInfo[],\n options?: SyncOptions\n ): Promise<SyncPlan> {\n let sourceFiles = await this.listLocalFiles(sourceDir)\n\n // For to-codex direction, filter files based on to_codex config patterns\n if (options?.direction === 'to-codex') {\n const toCodexPatterns = this.resolveToCodexPatterns()\n\n if (toCodexPatterns.length > 0) {\n const { matchToCodexPattern } = await import('./directional-patterns.js')\n\n sourceFiles = sourceFiles.filter((file) =>\n matchToCodexPattern(file.path, toCodexPatterns)\n )\n }\n }\n\n const plan = createSyncPlan(\n sourceFiles,\n targetFiles,\n options ?? {},\n this.config\n )\n\n plan.estimatedTime = estimateSyncTime(plan)\n\n return plan\n }\n\n /**\n * Create a routing-aware sync plan\n *\n * Scans entire codex repository and evaluates routing rules to find all files\n * that should sync to the target project based on codex_sync_include patterns.\n *\n * This enables cross-project knowledge sharing where files from multiple\n * projects can be synced to the target based on their frontmatter metadata.\n *\n * @param org - Organization name (e.g., \"corthosai\")\n * @param project - Target project name (e.g., \"lake.corthonomy.ai\")\n * @param codexDir - Path to codex repository directory\n * @param options - Sync options\n * @returns Sync plan with routing metadata\n *\n * @example\n * ```typescript\n * const plan = await manager.createRoutingAwarePlan(\n * 'corthosai',\n * 'lake.corthonomy.ai',\n * '/path/to/codex.corthos.ai',\n * { direction: 'from-codex' }\n * )\n *\n * console.log(`Found ${plan.totalFiles} files from ${plan.metadata.scannedProjects.length} projects`)\n * ```\n */\n async createRoutingAwarePlan(\n org: string,\n project: string,\n codexDir: string,\n options?: SyncOptions\n ): Promise<SyncPlan & { routingScan?: RoutingScanResult }> {\n // Step 1: Scan entire codex with routing evaluation\n // Resolve patterns using new helper functions (supports both new and legacy formats)\n const fromCodexPatterns = this.resolveFromCodexPatterns()\n\n const routingScan = await scanCodexWithRouting({\n codexDir,\n targetProject: project,\n org,\n rules: undefined, // Use default routing rules (preventSelfSync, preventCodexSync, etc.)\n storage: this.localStorage,\n fromCodexPatterns: fromCodexPatterns.length > 0 ? fromCodexPatterns : undefined,\n routing: this.config.routing, // Pass routing config for frontmatter control\n })\n\n // Step 2: Convert routed files to FileInfo format expected by planner\n const sourceFiles: FileInfo[] = routingScan.files.map((rf) => ({\n path: rf.path,\n size: rf.size,\n mtime: rf.mtime,\n hash: rf.hash,\n }))\n\n // Step 3: Get current local files for comparison\n const targetFiles = await this.listLocalFiles(process.cwd())\n\n // Step 4: Create sync plan using existing planner logic\n // IMPORTANT: Strip include/exclude patterns from options because routing scanner\n // has already filtered files based on routing rules (codex_sync_include frontmatter).\n // We only keep execution options (force, dryRun) to avoid double filtering.\n const planOptions: SyncOptions = {\n direction: options?.direction,\n force: options?.force,\n dryRun: options?.dryRun,\n // Explicitly exclude include/exclude to prevent double filtering\n // include: undefined,\n // exclude: undefined,\n }\n const plan = createSyncPlan(sourceFiles, targetFiles, planOptions, this.config)\n\n plan.estimatedTime = estimateSyncTime(plan)\n\n // Override source/target paths for from-codex routing-aware sync\n // Files should be copied from codex to cache directory preserving full paths\n plan.source = codexDir\n plan.target = '.fractary/codex/cache'\n\n // Step 5: Enhance plan with routing metadata\n return {\n ...plan,\n routingScan,\n }\n }\n\n /**\n * Execute a sync plan\n *\n * Copies files from source to target based on the plan.\n * For from-codex syncs, files are copied to .fractary/codex/cache/ preserving full paths.\n * For to-codex syncs, files are copied to the codex repository.\n */\n async executePlan(plan: SyncPlan, options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now()\n const errors: Array<{ path: string; error: string }> = []\n let synced = 0\n let failed = 0\n\n if (options?.dryRun) {\n // Dry run - just return what would happen\n return {\n success: true,\n plan,\n synced: plan.totalFiles,\n failed: 0,\n skipped: plan.skipped.length,\n errors: [],\n duration: Date.now() - startTime,\n timestamp: Date.now(),\n }\n }\n\n // Execute operations\n for (let i = 0; i < plan.files.length; i++) {\n const file = plan.files[i]\n if (!file) continue\n\n try {\n // Report progress\n if (options?.onProgress) {\n options.onProgress(i + 1, plan.totalFiles, file.path)\n }\n\n // Execute the sync operation\n if (file.operation === 'create' || file.operation === 'update') {\n // Copy file from source to target\n const sourcePath = `${plan.source}/${file.path}`\n const targetPath = `${plan.target}/${file.path}`\n\n // Ensure target directory exists\n const fs = await import('fs/promises')\n const path = await import('path')\n const targetDir = path.dirname(targetPath)\n await fs.mkdir(targetDir, { recursive: true })\n\n // Copy the file\n await fs.copyFile(sourcePath, targetPath)\n synced++\n } else if (file.operation === 'delete') {\n // Delete file from target\n const targetPath = `${plan.target}/${file.path}`\n const fs = await import('fs/promises')\n try {\n await fs.unlink(targetPath)\n synced++\n } catch (error: any) {\n // Ignore if file doesn't exist\n if (error.code !== 'ENOENT') {\n throw error\n }\n synced++\n }\n } else {\n // Skip operation\n synced++\n }\n } catch (error) {\n failed++\n errors.push({\n path: file.path,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n return {\n success: failed === 0,\n plan,\n synced,\n failed,\n skipped: plan.skipped.length,\n errors,\n duration: Date.now() - startTime,\n timestamp: Date.now(),\n }\n }\n\n /**\n * Update manifest after sync\n */\n async updateManifest(\n org: string,\n project: string,\n syncedFiles: FileSyncStatus[]\n ): Promise<void> {\n const manifest = await this.getOrCreateManifest(org, project)\n const now = Date.now()\n\n for (const file of syncedFiles) {\n if (file.operation === 'delete') {\n delete manifest.entries[file.path]\n } else if (file.operation === 'create' || file.operation === 'update') {\n manifest.entries[file.path] = {\n path: file.path,\n hash: file.hash ?? '',\n size: file.size ?? 0,\n syncedAt: now,\n source: 'local',\n }\n }\n }\n\n manifest.lastSync = now\n await this.saveManifest(manifest)\n }\n\n /**\n * Get sync status for a file\n */\n async getFileStatus(path: string): Promise<SyncManifestEntry | null> {\n const manifest = await this.loadManifest()\n return manifest?.entries[path] ?? null\n }\n\n /**\n * Check if a file is synced\n */\n async isFileSynced(path: string): Promise<boolean> {\n const status = await this.getFileStatus(path)\n return status !== null\n }\n\n /**\n * Get last sync timestamp\n */\n async getLastSyncTime(): Promise<number | null> {\n const manifest = await this.loadManifest()\n return manifest?.lastSync ?? null\n }\n\n /**\n * Clear sync manifest\n */\n async clearManifest(): Promise<void> {\n try {\n await this.localStorage.delete(this.manifestPath)\n this.manifest = null\n } catch {\n // Ignore if manifest doesn't exist\n }\n }\n\n /**\n * Get sync configuration\n */\n getConfig(): SyncConfig {\n return { ...this.config }\n }\n\n /**\n * Update sync configuration\n */\n updateConfig(updates: Partial<SyncConfig>): void {\n this.config = {\n ...this.config,\n ...updates,\n }\n }\n}\n\n/**\n * Create a sync manager\n */\nexport function createSyncManager(config: SyncManagerConfig): SyncManager {\n return new SyncManager(config)\n}\n","/**\n * Permission types\n *\n * Type definitions for the permissions system.\n */\n\n/**\n * Permission levels\n */\nexport type PermissionLevel = 'none' | 'read' | 'write' | 'admin'\n\n/**\n * Permission scope\n */\nexport type PermissionScope = 'global' | 'org' | 'project' | 'path'\n\n/**\n * Permission action\n */\nexport type PermissionAction = 'fetch' | 'cache' | 'sync' | 'invalidate' | 'manage'\n\n/**\n * Permission rule\n */\nexport interface PermissionRule {\n /** Rule ID */\n id?: string\n /** Pattern to match (glob) */\n pattern: string\n /** Actions this rule applies to */\n actions: PermissionAction[]\n /** Permission level granted */\n level: PermissionLevel\n /** Scope of the rule */\n scope: PermissionScope\n /** Organization filter (for org scope) */\n org?: string\n /** Project filter (for project scope) */\n project?: string\n /** Priority (higher = evaluated first) */\n priority?: number\n /** Description of the rule */\n description?: string\n /** Whether rule is active */\n enabled?: boolean\n}\n\n/**\n * Permission context\n *\n * Context for evaluating permissions.\n */\nexport interface PermissionContext {\n /** Current organization */\n org?: string\n /** Current project */\n project?: string\n /** Current environment */\n environment?: string\n /** User/agent identity */\n identity?: string\n /** Additional context data */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Permission check result\n */\nexport interface PermissionResult {\n /** Whether the action is allowed */\n allowed: boolean\n /** Permission level granted */\n level: PermissionLevel\n /** Matching rule (if any) */\n matchedRule?: PermissionRule\n /** Reason for the decision */\n reason: string\n}\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n /** Default permission level */\n defaultLevel: PermissionLevel\n /** Whether to allow by default when no rules match */\n defaultAllow: boolean\n /** Global permission rules */\n rules: PermissionRule[]\n /** Whether permissions are enforced */\n enforced: boolean\n}\n\n/**\n * Default permission configuration\n */\nexport const DEFAULT_PERMISSION_CONFIG: PermissionConfig = {\n defaultLevel: 'read',\n defaultAllow: true,\n rules: [],\n enforced: false,\n}\n\n/**\n * Permission levels ordered by access\n */\nexport const PERMISSION_LEVEL_ORDER: PermissionLevel[] = ['none', 'read', 'write', 'admin']\n\n/**\n * Check if a level grants another level\n */\nexport function levelGrants(granted: PermissionLevel, required: PermissionLevel): boolean {\n const grantedIndex = PERMISSION_LEVEL_ORDER.indexOf(granted)\n const requiredIndex = PERMISSION_LEVEL_ORDER.indexOf(required)\n return grantedIndex >= requiredIndex\n}\n\n/**\n * Get the higher of two permission levels\n */\nexport function maxLevel(a: PermissionLevel, b: PermissionLevel): PermissionLevel {\n const aIndex = PERMISSION_LEVEL_ORDER.indexOf(a)\n const bIndex = PERMISSION_LEVEL_ORDER.indexOf(b)\n return PERMISSION_LEVEL_ORDER[Math.max(aIndex, bIndex)] ?? 'none'\n}\n\n/**\n * Get the lower of two permission levels\n */\nexport function minLevel(a: PermissionLevel, b: PermissionLevel): PermissionLevel {\n const aIndex = PERMISSION_LEVEL_ORDER.indexOf(a)\n const bIndex = PERMISSION_LEVEL_ORDER.indexOf(b)\n return PERMISSION_LEVEL_ORDER[Math.min(aIndex, bIndex)] ?? 'none'\n}\n","/**\n * Permission evaluator\n *\n * Evaluates permission rules to determine access levels.\n */\n\nimport micromatch from 'micromatch'\nimport type {\n PermissionRule,\n PermissionContext,\n PermissionResult,\n PermissionConfig,\n PermissionLevel,\n PermissionAction,\n} from './types.js'\nimport { levelGrants } from './types.js'\n\n/**\n * Check if a rule matches the given context\n */\nexport function ruleMatchesContext(rule: PermissionRule, context: PermissionContext): boolean {\n // Check if rule is enabled\n if (rule.enabled === false) {\n return false\n }\n\n // Check scope constraints\n switch (rule.scope) {\n case 'org':\n if (rule.org && context.org !== rule.org) {\n return false\n }\n break\n case 'project':\n if (rule.org && context.org !== rule.org) {\n return false\n }\n if (rule.project && context.project !== rule.project) {\n return false\n }\n break\n }\n\n return true\n}\n\n/**\n * Check if a rule matches a path\n */\nexport function ruleMatchesPath(rule: PermissionRule, path: string): boolean {\n return micromatch.isMatch(path, rule.pattern)\n}\n\n/**\n * Check if a rule matches an action\n */\nexport function ruleMatchesAction(rule: PermissionRule, action: PermissionAction): boolean {\n return rule.actions.includes(action)\n}\n\n/**\n * Evaluate permission for a path and action\n */\nexport function evaluatePermission(\n path: string,\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): PermissionResult {\n // Sort rules by priority (higher first)\n const sortedRules = [...config.rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n\n // Find first matching rule\n for (const rule of sortedRules) {\n if (!ruleMatchesContext(rule, context)) {\n continue\n }\n\n if (!ruleMatchesPath(rule, path)) {\n continue\n }\n\n if (!ruleMatchesAction(rule, action)) {\n continue\n }\n\n // Rule matches\n return {\n allowed: rule.level !== 'none',\n level: rule.level,\n matchedRule: rule,\n reason: `Matched rule: ${rule.description ?? rule.pattern}`,\n }\n }\n\n // No rule matched - use default\n return {\n allowed: config.defaultAllow,\n level: config.defaultLevel,\n reason: config.defaultAllow ? 'Allowed by default' : 'Denied by default',\n }\n}\n\n/**\n * Check if an action is allowed for a path\n */\nexport function isAllowed(\n path: string,\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): boolean {\n const result = evaluatePermission(path, action, context, config)\n return result.allowed\n}\n\n/**\n * Check if a specific permission level is granted\n */\nexport function hasPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel,\n context: PermissionContext,\n config: PermissionConfig\n): boolean {\n const result = evaluatePermission(path, action, context, config)\n return levelGrants(result.level, requiredLevel)\n}\n\n/**\n * Evaluate permissions for multiple paths\n */\nexport function evaluatePermissions(\n paths: string[],\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): Map<string, PermissionResult> {\n const results = new Map<string, PermissionResult>()\n\n for (const path of paths) {\n results.set(path, evaluatePermission(path, action, context, config))\n }\n\n return results\n}\n\n/**\n * Filter paths by permission\n */\nexport function filterByPermission(\n paths: string[],\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig,\n requiredLevel: PermissionLevel = 'read'\n): string[] {\n return paths.filter((path) => {\n const result = evaluatePermission(path, action, context, config)\n return levelGrants(result.level, requiredLevel)\n })\n}\n\n/**\n * Validate permission rules\n */\nexport function validateRules(rules: PermissionRule[]): string[] {\n const errors: string[] = []\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]\n if (!rule) continue\n\n // Check pattern\n if (!rule.pattern || rule.pattern.trim() === '') {\n errors.push(`Rule ${i}: pattern is empty`)\n continue\n }\n\n // Validate pattern\n try {\n micromatch.isMatch('test', rule.pattern)\n } catch {\n errors.push(`Rule ${i}: invalid pattern \"${rule.pattern}\"`)\n }\n\n // Check actions\n if (!rule.actions || rule.actions.length === 0) {\n errors.push(`Rule ${i}: actions are empty`)\n }\n\n // Validate scope constraints\n if (rule.scope === 'org' && !rule.org) {\n errors.push(`Rule ${i}: org scope requires org field`)\n }\n\n if (rule.scope === 'project' && !rule.project) {\n errors.push(`Rule ${i}: project scope requires project field`)\n }\n }\n\n return errors\n}\n\n/**\n * Create a permission rule\n */\nexport function createRule(options: {\n pattern: string\n actions: PermissionAction[]\n level: PermissionLevel\n scope?: PermissionRule['scope']\n org?: string\n project?: string\n priority?: number\n description?: string\n}): PermissionRule {\n return {\n pattern: options.pattern,\n actions: options.actions,\n level: options.level,\n scope: options.scope ?? 'global',\n org: options.org,\n project: options.project,\n priority: options.priority ?? 0,\n description: options.description,\n enabled: true,\n }\n}\n\n/**\n * Create common permission rules\n */\nexport const CommonRules = {\n /** Allow all actions for docs */\n allowDocs: (): PermissionRule =>\n createRule({\n pattern: 'docs/**',\n actions: ['fetch', 'cache', 'sync'],\n level: 'read',\n description: 'Allow read access to docs',\n }),\n\n /** Deny access to private files */\n denyPrivate: (): PermissionRule =>\n createRule({\n pattern: '**/.private/**',\n actions: ['fetch', 'cache', 'sync'],\n level: 'none',\n priority: 100,\n description: 'Deny access to private files',\n }),\n\n /** Read-only access to specs */\n readOnlySpecs: (): PermissionRule =>\n createRule({\n pattern: 'specs/**',\n actions: ['fetch', 'cache'],\n level: 'read',\n description: 'Read-only access to specs',\n }),\n\n /** Admin access for management */\n adminManage: (): PermissionRule =>\n createRule({\n pattern: '**',\n actions: ['manage', 'invalidate'],\n level: 'admin',\n description: 'Admin access for management operations',\n }),\n}\n","/**\n * Permission manager\n *\n * Manages permission rules and provides a high-level API\n * for permission checks.\n */\n\nimport type {\n PermissionRule,\n PermissionContext,\n PermissionResult,\n PermissionConfig,\n PermissionLevel,\n PermissionAction,\n} from './types.js'\nimport { DEFAULT_PERMISSION_CONFIG, levelGrants } from './types.js'\nimport { evaluatePermission, validateRules, filterByPermission } from './evaluator.js'\n\n/**\n * Permission manager configuration\n */\nexport interface PermissionManagerConfig {\n /** Initial configuration */\n config?: Partial<PermissionConfig>\n /** Default context */\n defaultContext?: PermissionContext\n}\n\n/**\n * Permission manager\n *\n * Provides a centralized API for managing and checking permissions.\n */\nexport class PermissionManager {\n private config: PermissionConfig\n private defaultContext: PermissionContext\n\n constructor(options: PermissionManagerConfig = {}) {\n this.config = {\n ...DEFAULT_PERMISSION_CONFIG,\n ...options.config,\n // Create a new rules array to avoid shared state\n rules: options.config?.rules ? [...options.config.rules] : [],\n }\n this.defaultContext = options.defaultContext ?? {}\n }\n\n /**\n * Check if an action is allowed for a path\n */\n isAllowed(\n path: string,\n action: PermissionAction,\n context?: PermissionContext\n ): boolean {\n const result = this.evaluate(path, action, context)\n return result.allowed\n }\n\n /**\n * Check if a permission level is granted\n */\n hasPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel,\n context?: PermissionContext\n ): boolean {\n const result = this.evaluate(path, action, context)\n return levelGrants(result.level, requiredLevel)\n }\n\n /**\n * Evaluate permission for a path and action\n */\n evaluate(\n path: string,\n action: PermissionAction,\n context?: PermissionContext\n ): PermissionResult {\n const mergedContext = { ...this.defaultContext, ...context }\n\n // If permissions are not enforced, allow everything\n if (!this.config.enforced) {\n return {\n allowed: true,\n level: 'admin',\n reason: 'Permissions not enforced',\n }\n }\n\n return evaluatePermission(path, action, mergedContext, this.config)\n }\n\n /**\n * Filter paths by permission\n */\n filterAllowed(\n paths: string[],\n action: PermissionAction,\n context?: PermissionContext,\n requiredLevel: PermissionLevel = 'read'\n ): string[] {\n const mergedContext = { ...this.defaultContext, ...context }\n\n if (!this.config.enforced) {\n return paths\n }\n\n return filterByPermission(paths, action, mergedContext, this.config, requiredLevel)\n }\n\n /**\n * Add a permission rule\n */\n addRule(rule: PermissionRule): void {\n const errors = validateRules([rule])\n if (errors.length > 0) {\n throw new Error(`Invalid rule: ${errors.join(', ')}`)\n }\n\n this.config.rules.push(rule)\n }\n\n /**\n * Remove a permission rule by ID\n */\n removeRule(id: string): boolean {\n const index = this.config.rules.findIndex((r) => r.id === id)\n if (index === -1) {\n return false\n }\n\n this.config.rules.splice(index, 1)\n return true\n }\n\n /**\n * Get all rules\n */\n getRules(): PermissionRule[] {\n return [...this.config.rules]\n }\n\n /**\n * Clear all rules\n */\n clearRules(): void {\n this.config.rules = []\n }\n\n /**\n * Set rules (replace all)\n */\n setRules(rules: PermissionRule[]): void {\n const errors = validateRules(rules)\n if (errors.length > 0) {\n throw new Error(`Invalid rules: ${errors.join(', ')}`)\n }\n\n this.config.rules = [...rules]\n }\n\n /**\n * Get configuration\n */\n getConfig(): PermissionConfig {\n return { ...this.config, rules: [...this.config.rules] }\n }\n\n /**\n * Update configuration\n */\n updateConfig(updates: Partial<Omit<PermissionConfig, 'rules'>>): void {\n this.config = {\n ...this.config,\n ...updates,\n }\n }\n\n /**\n * Set default context\n */\n setDefaultContext(context: PermissionContext): void {\n this.defaultContext = { ...context }\n }\n\n /**\n * Get default context\n */\n getDefaultContext(): PermissionContext {\n return { ...this.defaultContext }\n }\n\n /**\n * Enable permission enforcement\n */\n enable(): void {\n this.config.enforced = true\n }\n\n /**\n * Disable permission enforcement\n */\n disable(): void {\n this.config.enforced = false\n }\n\n /**\n * Check if permissions are enforced\n */\n isEnforced(): boolean {\n return this.config.enforced\n }\n\n /**\n * Assert permission (throws if denied)\n */\n assertPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel = 'read',\n context?: PermissionContext\n ): void {\n const result = this.evaluate(path, action, context)\n\n if (!levelGrants(result.level, requiredLevel)) {\n throw new PermissionDeniedError(\n `Permission denied for ${action} on ${path}: ${result.reason}`,\n path,\n action,\n result\n )\n }\n }\n}\n\n/**\n * Permission denied error\n */\nexport class PermissionDeniedError extends Error {\n constructor(\n message: string,\n public readonly path: string,\n public readonly action: PermissionAction,\n public readonly result: PermissionResult\n ) {\n super(message)\n this.name = 'PermissionDeniedError'\n }\n}\n\n/**\n * Create a permission manager\n */\nexport function createPermissionManager(config?: PermissionManagerConfig): PermissionManager {\n return new PermissionManager(config)\n}\n\n/**\n * Default permission manager instance\n */\nlet defaultManager: PermissionManager | null = null\n\n/**\n * Get the default permission manager\n */\nexport function getDefaultPermissionManager(): PermissionManager {\n if (!defaultManager) {\n defaultManager = createPermissionManager()\n }\n return defaultManager\n}\n\n/**\n * Set the default permission manager\n */\nexport function setDefaultPermissionManager(manager: PermissionManager): void {\n defaultManager = manager\n}\n","/**\n * Version detection\n *\n * Detects configuration version for migration.\n */\n\nimport type {\n LegacyCodexConfig,\n ModernCodexConfig,\n VersionDetectionResult,\n} from './types.js'\n\n/**\n * Detect configuration version\n */\nexport function detectVersion(config: unknown): VersionDetectionResult {\n if (!config || typeof config !== 'object') {\n return {\n version: 'unknown',\n confidence: 'high',\n reason: 'Invalid configuration object',\n }\n }\n\n const obj = config as Record<string, unknown>\n\n // Check for explicit version field (v3.0)\n if (obj.version === '3.0') {\n return {\n version: '3.0',\n confidence: 'high',\n reason: 'Explicit version field found',\n }\n }\n\n // Check for v3.0 structure markers\n if (isModernConfig(config)) {\n return {\n version: '3.0',\n confidence: 'medium',\n reason: 'Modern structure detected (organization object, sync.patterns)',\n }\n }\n\n // Check for v2.x markers\n if (isLegacyConfig(config)) {\n return {\n version: '2.x',\n confidence: 'high',\n reason: 'Legacy structure detected (org/defaultOrg/codexRepo at top level)',\n }\n }\n\n // Ambiguous - check for any recognizable fields\n const knownFields = [\n 'org',\n 'defaultOrg',\n 'codexRepo',\n 'autoSync',\n 'syncRules',\n 'organization',\n 'sync',\n 'cache',\n ]\n\n const hasKnownFields = knownFields.some((field) => field in obj)\n\n if (hasKnownFields) {\n return {\n version: '2.x',\n confidence: 'low',\n reason: 'Some known fields found, assuming v2.x',\n }\n }\n\n return {\n version: 'unknown',\n confidence: 'high',\n reason: 'No recognizable configuration structure',\n }\n}\n\n/**\n * Check if config matches modern v3.0 structure\n */\nexport function isModernConfig(config: unknown): config is ModernCodexConfig {\n if (!config || typeof config !== 'object') {\n return false\n }\n\n const obj = config as Record<string, unknown>\n\n // Must have organization object with name and codexRepo\n if (!obj.organization || typeof obj.organization !== 'object') {\n return false\n }\n\n const org = obj.organization as Record<string, unknown>\n if (typeof org.name !== 'string' || typeof org.codexRepo !== 'string') {\n return false\n }\n\n // Must have sync object with patterns array\n if (!obj.sync || typeof obj.sync !== 'object') {\n return false\n }\n\n const sync = obj.sync as Record<string, unknown>\n if (!Array.isArray(sync.patterns)) {\n return false\n }\n\n return true\n}\n\n/**\n * Check if config matches legacy v2.x structure\n */\nexport function isLegacyConfig(config: unknown): config is LegacyCodexConfig {\n if (!config || typeof config !== 'object') {\n return false\n }\n\n const obj = config as Record<string, unknown>\n\n // Look for v2.x markers\n const legacyMarkers = ['org', 'defaultOrg', 'codexRepo', 'codexPath']\n const hasLegacyMarker = legacyMarkers.some(\n (marker) => marker in obj && typeof obj[marker] === 'string'\n )\n\n if (hasLegacyMarker) {\n return true\n }\n\n // Check for legacy autoSync array\n if (Array.isArray(obj.autoSync)) {\n return true\n }\n\n // Check for legacy syncRules object\n if (obj.syncRules && typeof obj.syncRules === 'object') {\n const syncRules = obj.syncRules as Record<string, unknown>\n if (Array.isArray(syncRules.include) || Array.isArray(syncRules.exclude)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Check if migration is needed\n */\nexport function needsMigration(config: unknown): boolean {\n const detection = detectVersion(config)\n return detection.version === '2.x'\n}\n\n/**\n * Get migration requirements\n */\nexport function getMigrationRequirements(config: unknown): string[] {\n const requirements: string[] = []\n\n if (!config || typeof config !== 'object') {\n requirements.push('Valid configuration object required')\n return requirements\n }\n\n const obj = config as Record<string, unknown>\n\n // Check org\n if (!obj.org && !obj.defaultOrg) {\n requirements.push('Organization name is required (org or defaultOrg)')\n }\n\n // Check codex repo\n if (!obj.codexRepo && !obj.codexPath) {\n requirements.push('Codex repository name is required (codexRepo or codexPath)')\n }\n\n return requirements\n}\n","/**\n * Configuration migrator\n *\n * Migrates v2.x configurations to v3.0 format.\n */\n\nimport type {\n LegacyCodexConfig,\n LegacyAutoSyncPattern,\n ModernCodexConfig,\n ModernSyncPattern,\n MigrationResult,\n MigrationOptions,\n} from './types.js'\nimport { detectVersion, isLegacyConfig, isModernConfig } from './detector.js'\n\n/**\n * Default migration options\n */\nexport const DEFAULT_MIGRATION_OPTIONS: MigrationOptions = {\n preserveUnknown: false,\n strict: false,\n defaultOrg: 'organization',\n defaultCodexRepo: 'codex',\n}\n\n/**\n * Migrate configuration from v2.x to v3.0\n */\nexport function migrateConfig(\n config: unknown,\n options: MigrationOptions = {}\n): MigrationResult {\n const mergedOptions = { ...DEFAULT_MIGRATION_OPTIONS, ...options }\n const result: MigrationResult = {\n success: false,\n warnings: [],\n errors: [],\n changes: [],\n }\n\n // Detect version\n const detection = detectVersion(config)\n\n if (detection.version === '3.0') {\n if (isModernConfig(config)) {\n result.success = true\n result.config = config\n result.warnings.push('Configuration is already v3.0, no migration needed')\n return result\n }\n }\n\n if (detection.version === 'unknown') {\n result.errors.push(`Cannot migrate: ${detection.reason}`)\n return result\n }\n\n if (!isLegacyConfig(config)) {\n result.errors.push('Configuration does not match expected v2.x format')\n return result\n }\n\n try {\n const migrated = performMigration(config, mergedOptions, result)\n result.config = migrated\n result.success = true\n } catch (error) {\n result.errors.push(\n `Migration failed: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n\n return result\n}\n\n/**\n * Perform the actual migration\n */\nfunction performMigration(\n legacy: LegacyCodexConfig,\n options: MigrationOptions,\n result: MigrationResult\n): ModernCodexConfig {\n // Extract org name\n const orgName = legacy.org || legacy.defaultOrg || options.defaultOrg!\n\n if (legacy.org && legacy.defaultOrg && legacy.org !== legacy.defaultOrg) {\n result.warnings.push(\n `Both 'org' and 'defaultOrg' specified with different values. Using 'org': ${legacy.org}`\n )\n }\n\n if (!legacy.org && !legacy.defaultOrg) {\n result.changes.push({\n type: 'added',\n path: 'organization.name',\n newValue: orgName,\n description: `Added default organization name: ${orgName}`,\n })\n } else {\n const fieldUsed = legacy.org ? 'org' : 'defaultOrg'\n result.changes.push({\n type: 'renamed',\n path: 'organization.name',\n oldValue: fieldUsed,\n newValue: 'organization.name',\n description: `Renamed '${fieldUsed}' to 'organization.name'`,\n })\n }\n\n // Extract codex repo\n const codexRepo = legacy.codexRepo || legacy.codexPath || options.defaultCodexRepo!\n\n if (legacy.codexRepo && legacy.codexPath && legacy.codexRepo !== legacy.codexPath) {\n result.warnings.push(\n `Both 'codexRepo' and 'codexPath' specified with different values. Using 'codexRepo': ${legacy.codexRepo}`\n )\n }\n\n if (!legacy.codexRepo && !legacy.codexPath) {\n result.changes.push({\n type: 'added',\n path: 'organization.codexRepo',\n newValue: codexRepo,\n description: `Added default codex repository: ${codexRepo}`,\n })\n } else {\n const fieldUsed = legacy.codexRepo ? 'codexRepo' : 'codexPath'\n result.changes.push({\n type: 'renamed',\n path: 'organization.codexRepo',\n oldValue: fieldUsed,\n newValue: 'organization.codexRepo',\n description: `Renamed '${fieldUsed}' to 'organization.codexRepo'`,\n })\n }\n\n // Migrate auto-sync patterns\n const patterns: ModernSyncPattern[] = []\n\n if (legacy.autoSync && legacy.autoSync.length > 0) {\n for (const legacyPattern of legacy.autoSync) {\n const modernPattern = migrateSyncPattern(legacyPattern, result)\n patterns.push(modernPattern)\n }\n\n result.changes.push({\n type: 'transformed',\n path: 'sync.patterns',\n oldValue: 'autoSync',\n newValue: 'sync.patterns',\n description: `Converted ${legacy.autoSync.length} auto-sync pattern(s) to modern format`,\n })\n }\n\n // Migrate sync rules\n const include: string[] = []\n const exclude: string[] = []\n\n if (legacy.syncRules) {\n if (legacy.syncRules.include) {\n include.push(...legacy.syncRules.include)\n result.changes.push({\n type: 'renamed',\n path: 'sync.include',\n oldValue: 'syncRules.include',\n newValue: 'sync.include',\n description: 'Moved syncRules.include to sync.include',\n })\n }\n\n if (legacy.syncRules.exclude) {\n exclude.push(...legacy.syncRules.exclude)\n result.changes.push({\n type: 'renamed',\n path: 'sync.exclude',\n oldValue: 'syncRules.exclude',\n newValue: 'sync.exclude',\n description: 'Moved syncRules.exclude to sync.exclude',\n })\n }\n }\n\n // Build modern config\n const modern: ModernCodexConfig = {\n version: '3.0',\n organization: {\n name: orgName,\n codexRepo,\n },\n sync: {\n patterns,\n include,\n exclude,\n defaultDirection: 'to-codex',\n },\n }\n\n // Migrate environments\n if (legacy.environments) {\n modern.environments = {}\n\n for (const [envName, envConfig] of Object.entries(legacy.environments)) {\n const envResult: MigrationResult = {\n success: false,\n warnings: [],\n errors: [],\n changes: [],\n }\n\n try {\n const migratedEnv = performMigration(\n { ...legacy, ...envConfig } as LegacyCodexConfig,\n { ...options },\n envResult\n )\n\n // Extract only the overrides\n modern.environments[envName] = {\n organization: migratedEnv.organization,\n sync: migratedEnv.sync,\n }\n\n result.changes.push({\n type: 'transformed',\n path: `environments.${envName}`,\n description: `Migrated environment '${envName}'`,\n })\n\n result.warnings.push(...envResult.warnings.map((w) => `[${envName}] ${w}`))\n } catch {\n result.warnings.push(`Failed to migrate environment '${envName}', skipping`)\n }\n }\n }\n\n result.changes.push({\n type: 'added',\n path: 'version',\n newValue: '3.0',\n description: 'Added version field',\n })\n\n return modern\n}\n\n/**\n * Migrate a single sync pattern\n */\nfunction migrateSyncPattern(\n legacy: LegacyAutoSyncPattern,\n result: MigrationResult\n): ModernSyncPattern {\n const modern: ModernSyncPattern = {\n pattern: legacy.pattern,\n }\n\n if (legacy.destination) {\n modern.target = legacy.destination\n }\n\n if (legacy.bidirectional) {\n modern.direction = 'bidirectional'\n }\n\n if (legacy.targets && legacy.targets.length > 0) {\n result.warnings.push(\n `Pattern '${legacy.pattern}' had multiple targets (${legacy.targets.join(', ')}). ` +\n 'In v3.0, each target should be a separate pattern.'\n )\n\n // Use first target\n if (!modern.target && legacy.targets[0]) {\n modern.target = legacy.targets[0]\n }\n }\n\n return modern\n}\n\n/**\n * Validate migrated configuration\n */\nexport function validateMigratedConfig(config: ModernCodexConfig): string[] {\n const errors: string[] = []\n\n if (config.version !== '3.0') {\n errors.push(`Invalid version: ${config.version}, expected '3.0'`)\n }\n\n if (!config.organization) {\n errors.push('Missing organization configuration')\n } else {\n if (!config.organization.name) {\n errors.push('Missing organization.name')\n }\n if (!config.organization.codexRepo) {\n errors.push('Missing organization.codexRepo')\n }\n }\n\n if (!config.sync) {\n errors.push('Missing sync configuration')\n } else {\n if (!Array.isArray(config.sync.patterns)) {\n errors.push('sync.patterns must be an array')\n }\n if (!Array.isArray(config.sync.include)) {\n errors.push('sync.include must be an array')\n }\n if (!Array.isArray(config.sync.exclude)) {\n errors.push('sync.exclude must be an array')\n }\n }\n\n return errors\n}\n\n/**\n * Generate migration report\n */\nexport function generateMigrationReport(result: MigrationResult): string {\n const lines: string[] = ['# Migration Report', '']\n\n if (result.success) {\n lines.push('Status: SUCCESS')\n } else {\n lines.push('Status: FAILED')\n }\n\n lines.push('')\n\n if (result.changes.length > 0) {\n lines.push('## Changes', '')\n\n for (const change of result.changes) {\n lines.push(`- [${change.type.toUpperCase()}] ${change.path}: ${change.description}`)\n }\n\n lines.push('')\n }\n\n if (result.warnings.length > 0) {\n lines.push('## Warnings', '')\n\n for (const warning of result.warnings) {\n lines.push(`- ${warning}`)\n }\n\n lines.push('')\n }\n\n if (result.errors.length > 0) {\n lines.push('## Errors', '')\n\n for (const error of result.errors) {\n lines.push(`- ${error}`)\n }\n\n lines.push('')\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Create empty modern config\n */\nexport function createEmptyModernConfig(\n org: string,\n codexRepo: string\n): ModernCodexConfig {\n return {\n version: '3.0',\n organization: {\n name: org,\n codexRepo,\n },\n sync: {\n patterns: [],\n include: ['**/*.md', 'CLAUDE.md'],\n exclude: ['**/node_modules/**', '**/.git/**'],\n defaultDirection: 'to-codex',\n },\n }\n}\n","/**\n * Legacy reference migration\n *\n * Converts legacy reference formats to modern codex:// URIs.\n */\n\n/**\n * Legacy reference patterns\n */\nexport const LEGACY_PATTERNS = {\n /** @codex: style references */\n CODEX_TAG: /@codex:\\s*([^\\s\\]]+)/g,\n /** [codex:...] style references */\n CODEX_BRACKET: /\\[codex:\\s*([^\\]]+)\\]/g,\n /** {{codex:...}} style references */\n CODEX_MUSTACHE: /\\{\\{codex:\\s*([^}]+)\\}\\}/g,\n /** Simple path references in specific contexts */\n SIMPLE_PATH: /codex\\/([a-zA-Z0-9_-]+\\/[a-zA-Z0-9_\\-/.]+)/g,\n}\n\n/**\n * Reference conversion result\n */\nexport interface ReferenceConversionResult {\n /** Original text */\n original: string\n /** Converted text */\n converted: string\n /** References found and converted */\n references: ConvertedReference[]\n /** Whether any changes were made */\n modified: boolean\n}\n\n/**\n * Converted reference\n */\nexport interface ConvertedReference {\n /** Original reference text */\n original: string\n /** Converted URI */\n uri: string\n /** Position in original text */\n position: number\n /** Format detected */\n format: 'codex-tag' | 'codex-bracket' | 'codex-mustache' | 'simple-path'\n}\n\n/**\n * Conversion options\n */\nexport interface ConversionOptions {\n /** Default organization */\n defaultOrg?: string\n /** Default project */\n defaultProject?: string\n /** Whether to preserve original format wrapper */\n preserveWrapper?: boolean\n}\n\n/**\n * Convert legacy references in text\n */\nexport function convertLegacyReferences(\n text: string,\n options: ConversionOptions = {}\n): ReferenceConversionResult {\n const result: ReferenceConversionResult = {\n original: text,\n converted: text,\n references: [],\n modified: false,\n }\n\n // Process each pattern type\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_TAG,\n 'codex-tag',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_BRACKET,\n 'codex-bracket',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_MUSTACHE,\n 'codex-mustache',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.SIMPLE_PATH,\n 'simple-path',\n options,\n result.references\n )\n\n result.modified = result.original !== result.converted\n\n return result\n}\n\n/**\n * Process a single pattern type\n */\nfunction processPattern(\n text: string,\n pattern: RegExp,\n format: ConvertedReference['format'],\n options: ConversionOptions,\n references: ConvertedReference[]\n): string {\n // Reset pattern lastIndex\n pattern.lastIndex = 0\n\n return text.replace(pattern, (match, captured: string, offset: number) => {\n const uri = convertToUri(captured.trim(), options)\n\n references.push({\n original: match,\n uri,\n position: offset,\n format,\n })\n\n // Return the appropriate format\n if (options.preserveWrapper) {\n switch (format) {\n case 'codex-tag':\n return `@codex: ${uri}`\n case 'codex-bracket':\n return `[${uri}]`\n case 'codex-mustache':\n return `{{${uri}}}`\n case 'simple-path':\n return uri\n }\n }\n\n return uri\n })\n}\n\n/**\n * Convert a path/reference to codex:// URI\n */\nexport function convertToUri(reference: string, options: ConversionOptions = {}): string {\n const trimmed = reference.trim()\n\n // Already a codex:// URI\n if (trimmed.startsWith('codex://')) {\n return trimmed\n }\n\n // Parse the reference to extract components\n const parts = parseReference(trimmed)\n\n // Build URI\n const org = parts.org || options.defaultOrg || '_'\n const project = parts.project || options.defaultProject || '_'\n const path = parts.path\n\n return `codex://${org}/${project}/${path}`\n}\n\n/**\n * Parse reference components\n */\ninterface ParsedReferenceComponents {\n org?: string\n project?: string\n path: string\n}\n\nfunction parseReference(reference: string): ParsedReferenceComponents {\n // Handle various formats:\n // - org/project/path\n // - project/path (org inferred)\n // - path (org and project inferred)\n // - ./path (relative)\n // - ../path (relative)\n\n const trimmed = reference.trim()\n\n // Handle relative paths\n if (trimmed.startsWith('./') || trimmed.startsWith('../')) {\n return { path: trimmed }\n }\n\n // Split by /\n const parts = trimmed.split('/')\n\n if (parts.length >= 3) {\n // Assume org/project/path format\n const [org, project, ...rest] = parts\n return {\n org: org || undefined,\n project: project || undefined,\n path: rest.join('/'),\n }\n }\n\n if (parts.length === 2) {\n // For legacy reference migration, treat 2-part paths as file paths\n // Common directory names like docs, src, specs should not be inferred as projects\n // Only explicit org/project/path format (3+ parts) will extract org/project\n\n return { path: trimmed }\n }\n\n // Single part - just the path\n return { path: trimmed }\n}\n\n/**\n * Find all legacy references in text (without converting)\n */\nexport function findLegacyReferences(text: string): ConvertedReference[] {\n const references: ConvertedReference[] = []\n\n for (const [name, pattern] of Object.entries(LEGACY_PATTERNS)) {\n pattern.lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = pattern.exec(text)) !== null) {\n const format = name\n .toLowerCase()\n .replace('_', '-') as ConvertedReference['format']\n\n references.push({\n original: match[0],\n uri: match[1] || '',\n position: match.index,\n format,\n })\n }\n }\n\n // Sort by position\n references.sort((a, b) => a.position - b.position)\n\n return references\n}\n\n/**\n * Check if text contains legacy references\n */\nexport function hasLegacyReferences(text: string): boolean {\n for (const pattern of Object.values(LEGACY_PATTERNS)) {\n pattern.lastIndex = 0\n if (pattern.test(text)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Migrate all references in a file content\n */\nexport function migrateFileReferences(\n content: string,\n options: ConversionOptions = {}\n): ReferenceConversionResult {\n return convertLegacyReferences(content, options)\n}\n\n/**\n * Generate reference migration summary\n */\nexport function generateReferenceMigrationSummary(\n results: ReferenceConversionResult[]\n): string {\n const lines: string[] = ['# Reference Migration Summary', '']\n\n let totalRefs = 0\n let modifiedFiles = 0\n\n for (const result of results) {\n if (result.modified) {\n modifiedFiles++\n }\n totalRefs += result.references.length\n }\n\n lines.push(`- Total files processed: ${results.length}`)\n lines.push(`- Files with changes: ${modifiedFiles}`)\n lines.push(`- Total references converted: ${totalRefs}`)\n lines.push('')\n\n // Group by format\n const byFormat = new Map<string, number>()\n\n for (const result of results) {\n for (const ref of result.references) {\n byFormat.set(ref.format, (byFormat.get(ref.format) || 0) + 1)\n }\n }\n\n if (byFormat.size > 0) {\n lines.push('## References by Format', '')\n\n for (const [format, count] of byFormat.entries()) {\n lines.push(`- ${format}: ${count}`)\n }\n }\n\n return lines.join('\\n')\n}\n"]}