nocaap 0.0.2 → 0.0.3

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/utils/paths.ts","../src/utils/logger.ts","../src/schemas/index.ts","../src/core/config.ts","../src/core/global-config.ts","../src/core/git-engine.ts","../src/core/registry.ts","../src/core/indexer.ts","../src/commands/setup.ts","../src/commands/add.ts","../src/commands/update.ts","../src/commands/list.ts","../src/commands/remove.ts","../src/core/settings.ts","../src/commands/config.ts","../src/utils/providers.ts","../src/core/github.ts","../src/commands/push.ts","../src/core/vector-store.ts","../src/core/embeddings.ts","../src/core/fusion.ts","../src/core/search-engine.ts","../src/core/mcp-server.ts","../src/commands/serve.ts","../src/core/chunker.ts","../src/commands/index-search.ts","../src/index.ts"],"names":["fs","pkg","CONFIG_FILE","os","message","path","confirm","search","checkbox","r","detectProvider","vectorResults","z","matter","extractTitle","embeddingSettings","__filename","__dirname","dirname","join"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * src/utils/paths.ts\n* Path normalization utilities using upath\n * Ensures Windows compatibility by converting all paths to POSIX style\n */\nimport upath from 'upath';\nimport path from 'node:path';\nimport fs from 'fs-extra';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport const CONTEXT_DIR = '.context';\nexport const PACKAGES_DIR = 'packages';\nexport const CONFIG_FILE = 'context.config.json';\nexport const LOCK_FILE = 'context.lock';\nexport const INDEX_FILE = 'INDEX.md';\n\n// =============================================================================\n// Path Normalization\n// =============================================================================\n\n/**\n * Convert any path to POSIX style (forward slashes)\n * Critical for Windows compatibility with Git\n */\nexport function toUnix(filePath: string): string {\n return upath.toUnix(filePath);\n}\n\n/**\n * Normalize a path (resolve . and .., remove trailing slashes)\n */\nexport function normalize(filePath: string): string {\n return upath.normalize(filePath);\n}\n\n/**\n * Join path segments and normalize to POSIX\n */\nexport function join(...segments: string[]): string {\n return upath.join(...segments);\n}\n\n/**\n * Resolve path segments to an absolute path (POSIX style)\n */\nexport function resolve(...segments: string[]): string {\n return toUnix(path.resolve(...segments));\n}\n\n/**\n * Get the directory name from a path\n */\nexport function dirname(filePath: string): string {\n return upath.dirname(filePath);\n}\n\n/**\n * Get the base name from a path\n */\nexport function basename(filePath: string, ext?: string): string {\n return upath.basename(filePath, ext);\n}\n\n/**\n * Get the extension from a path\n */\nexport function extname(filePath: string): string {\n return upath.extname(filePath);\n}\n\n// =============================================================================\n// Project Path Helpers\n// =============================================================================\n\n/**\n * Get the .context directory path for a project\n */\nexport function getContextDir(projectRoot: string): string {\n return join(projectRoot, CONTEXT_DIR);\n}\n\n/**\n * Get the packages directory path\n */\nexport function getPackagesDir(projectRoot: string): string {\n return join(getContextDir(projectRoot), PACKAGES_DIR);\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(projectRoot: string): string {\n return join(getContextDir(projectRoot), CONFIG_FILE);\n}\n\n/**\n * Get the lockfile path\n */\nexport function getLockfilePath(projectRoot: string): string {\n return join(getContextDir(projectRoot), LOCK_FILE);\n}\n\n/**\n * Get the INDEX.md file path\n */\nexport function getIndexPath(projectRoot: string): string {\n return join(getContextDir(projectRoot), INDEX_FILE);\n}\n\n/**\n * Get a specific package directory path\n */\nexport function getPackagePath(projectRoot: string, alias: string): string {\n return join(getPackagesDir(projectRoot), alias);\n}\n\n// =============================================================================\n// Path Validation\n// =============================================================================\n\n/**\n * Check if a path is absolute\n */\nexport function isAbsolute(filePath: string): boolean {\n return upath.isAbsolute(filePath);\n}\n\n/**\n * Get relative path from one path to another\n */\nexport function relative(from: string, to: string): string {\n return upath.relative(from, to);\n}\n\n/**\n * Ensure a path is within a given directory (security check)\n */\nexport function isWithin(parent: string, child: string): boolean {\n const resolvedParent = resolve(parent);\n const resolvedChild = resolve(child);\n\n // Ensure we're comparing full path segments\n const normalizedParent = resolvedParent.endsWith('/')\n ? resolvedParent\n : `${resolvedParent}/`;\n\n return resolvedChild === resolvedParent || resolvedChild.startsWith(normalizedParent);\n}\n\n// =============================================================================\n// Filesystem Helpers\n// =============================================================================\n\n/**\n * Ensure a directory exists, creating it if necessary\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\n/**\n * Check if a path exists\n */\nexport async function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n","/**\n* src/utils/logger.ts \n* Logger utilities with Chalk + Ora wrappers\n */\nimport chalk from 'chalk';\nimport ora from 'ora';\n\n// =============================================================================\n// Chalk Wrappers\n// =============================================================================\n\nexport const log = {\n /** Info message (blue) */\n info: (message: string) => console.log(chalk.blue('ℹ'), message),\n\n /** Success message (green) */\n success: (message: string) => console.log(chalk.green('✔'), message),\n\n /** Warning message (yellow) */\n warn: (message: string) => console.log(chalk.yellow('⚠'), message),\n\n /** Error message (red) */\n error: (message: string) => console.log(chalk.red('✖'), message),\n\n /** Debug message (gray) - only when NOCAAP_DEBUG=true */\n debug: (message: string) => {\n if (process.env.NOCAAP_DEBUG === 'true') {\n console.log(chalk.gray('🔍'), chalk.gray(message));\n }\n },\n\n /** Plain message */\n plain: (message: string) => console.log(message),\n\n /** Styled title */\n title: (message: string) => console.log(chalk.bold.cyan(`\\n${message}\\n`)),\n\n /** Dim helper text */\n dim: (message: string) => console.log(chalk.dim(message)),\n\n /** Empty line for spacing */\n newline: () => console.log(),\n\n /** Horizontal rule */\n hr: () => console.log(chalk.dim('─'.repeat(50))),\n};\n\n// =============================================================================\n// Styled Text Helpers\n// =============================================================================\n\nexport const style = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n code: (text: string) => chalk.cyan(`\\`${text}\\``),\n path: (text: string) => chalk.yellow(text),\n url: (text: string) => chalk.blue.underline(text),\n success: (text: string) => chalk.green(text),\n error: (text: string) => chalk.red(text),\n warn: (text: string) => chalk.yellow(text),\n};\n\n// =============================================================================\n// Ora Spinner Wrappers\n// =============================================================================\n\nexport interface SpinnerInstance {\n start: (text?: string) => SpinnerInstance;\n stop: () => SpinnerInstance;\n succeed: (text?: string) => SpinnerInstance;\n fail: (text?: string) => SpinnerInstance;\n warn: (text?: string) => SpinnerInstance;\n info: (text?: string) => SpinnerInstance;\n text: string;\n}\n\n/**\n * Create a spinner instance\n */\nexport function createSpinner(text?: string): SpinnerInstance {\n const spinner = ora({\n text,\n color: 'cyan',\n });\n\n const instance: SpinnerInstance = {\n start(newText?: string) {\n spinner.start(newText);\n return instance;\n },\n stop() {\n spinner.stop();\n return instance;\n },\n succeed(newText?: string) {\n spinner.succeed(newText);\n return instance;\n },\n fail(newText?: string) {\n spinner.fail(newText);\n return instance;\n },\n warn(newText?: string) {\n spinner.warn(newText);\n return instance;\n },\n info(newText?: string) {\n spinner.info(newText);\n return instance;\n },\n get text() {\n return spinner.text;\n },\n set text(value: string) {\n spinner.text = value;\n },\n };\n\n return instance;\n}\n\n/**\n * Run an async task with a spinner\n */\nexport async function withSpinner<T>(\n text: string,\n task: () => Promise<T>,\n options?: {\n successText?: string;\n failText?: string;\n }\n): Promise<T> {\n const spinner = ora(text).start();\n\n try {\n const result = await task();\n spinner.succeed(options?.successText || text);\n return result;\n } catch (error) {\n spinner.fail(options?.failText || text);\n throw error;\n }\n}\n\n","/**\n * src/schemas/index.ts\n * Zod validation schemas for nocaap data structures\n */\nimport { z } from 'zod';\n\n// =============================================================================\n// Registry Schema (nocaap-registry.json)\n// =============================================================================\n\nconst gitUrlPattern = /^(git@|https:\\/\\/|git:\\/\\/).+/;\n\nexport const ContextEntrySchema = z.object({\n name: z.string().min(1, 'Context name is required'),\n description: z.string(),\n repo: z.string()\n .min(1, 'Repository URL is required')\n .refine(\n (url) => gitUrlPattern.test(url),\n 'Must be a valid Git URL (git@, https://, or git://)'\n ),\n path: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\n\nexport const RegistrySchema = z.object({\n name: z.string().optional(),\n contexts: z.array(ContextEntrySchema),\n imports: z.array(z.string().url()).optional(),\n});\n\n// =============================================================================\n// Config Schema (.context/context.config.json)\n// =============================================================================\n\nexport const PackageEntrySchema = z.object({\n alias: z.string().min(1, 'Alias is required'),\n source: z.string().min(1, 'Source URL is required'),\n path: z.string().optional(),\n version: z.string().default('main'),\n});\n\n// Settings sub-schemas (all optional for backward compatibility)\nexport const SearchSettingsSchema = z.object({\n fulltextWeight: z.number().min(0).max(1).optional(),\n vectorWeight: z.number().min(0).max(1).optional(),\n rrfK: z.number().int().positive().optional(),\n}).optional();\n\nexport const PushSettingsSchema = z.object({\n baseBranch: z.string().optional(),\n}).optional();\n\nexport const IndexSettingsSchema = z.object({\n semantic: z.boolean().optional(),\n provider: z.enum(['ollama', 'openai', 'tfjs', 'auto']).optional(),\n}).optional();\n\nexport const EmbeddingSettingsSchema = z.object({\n provider: z.enum(['ollama', 'openai', 'tfjs', 'auto']).optional(),\n ollamaModel: z.string().optional(),\n ollamaBaseUrl: z.string().url().optional(),\n}).optional();\n\nexport const ConfigSchema = z.object({\n registryUrl: z.string().url().optional(),\n packages: z.array(PackageEntrySchema),\n search: SearchSettingsSchema,\n push: PushSettingsSchema,\n index: IndexSettingsSchema,\n});\n\n// =============================================================================\n// Lockfile Schema (.context/context.lock)\n// =============================================================================\n\nexport const LockEntrySchema = z.object({\n commitHash: z.string().min(1, 'Commit hash is required'),\n sparsePath: z.string(),\n updatedAt: z.string().datetime(),\n});\n\nexport const LockfileSchema = z.record(z.string(), LockEntrySchema);\n\n// =============================================================================\n// Global Config Schema (~/.nocaap/config.json)\n// =============================================================================\n\nexport const GlobalConfigSchema = z.object({\n defaultRegistry: z.string().url().optional(),\n updatedAt: z.string().datetime().optional(),\n push: PushSettingsSchema,\n embedding: EmbeddingSettingsSchema,\n});\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\nexport type ContextEntry = z.infer<typeof ContextEntrySchema>;\nexport type Registry = z.infer<typeof RegistrySchema>;\nexport type PackageEntry = z.infer<typeof PackageEntrySchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type LockEntry = z.infer<typeof LockEntrySchema>;\nexport type Lockfile = z.infer<typeof LockfileSchema>;\nexport type GlobalConfig = z.infer<typeof GlobalConfigSchema>;\n\n// Settings types (unwrapped from optional for convenience)\nexport type SearchSettings = z.infer<typeof SearchSettingsSchema>;\nexport type PushSettings = z.infer<typeof PushSettingsSchema>;\nexport type IndexSettings = z.infer<typeof IndexSettingsSchema>;\nexport type EmbeddingSettings = z.infer<typeof EmbeddingSettingsSchema>;\n\n// =============================================================================\n// Validation Helpers\n// =============================================================================\n\nexport function validateRegistry(data: unknown): Registry {\n return RegistrySchema.parse(data);\n}\n\nexport function validateConfig(data: unknown): Config {\n return ConfigSchema.parse(data);\n}\n\nexport function validateLockfile(data: unknown): Lockfile {\n return LockfileSchema.parse(data);\n}\n\n// =============================================================================\n// Safe Validation Helpers\n// =============================================================================\n\nexport type ValidationResult<T> =\n | { success: true; data: T }\n | { success: false; error: z.ZodError };\n\nexport function safeValidate<T>(\n schema: z.ZodType<T>,\n data: unknown\n): ValidationResult<T> {\n const result = schema.safeParse(data);\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error };\n}\n\nexport function safeValidateRegistry(data: unknown): ValidationResult<Registry> {\n return safeValidate(RegistrySchema, data);\n}\n\nexport function safeValidateConfig(data: unknown): ValidationResult<Config> {\n const result = ConfigSchema.safeParse(data);\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error };\n}\n\nexport function safeValidateLockfile(data: unknown): ValidationResult<Lockfile> {\n return safeValidate(LockfileSchema, data);\n}\n\nexport function validateGlobalConfig(data: unknown): GlobalConfig {\n return GlobalConfigSchema.parse(data);\n}\n\nexport function safeValidateGlobalConfig(data: unknown): ValidationResult<GlobalConfig> {\n return safeValidate(GlobalConfigSchema, data);\n}\n\n","/**\n * src/core/config.ts\n * Manages reading/writing the local .context/ directory files\n */\nimport fs from 'fs-extra';\nimport * as paths from '../utils/paths.js';\nimport {\n type Config,\n type Lockfile,\n type LockEntry,\n type PackageEntry,\n type SearchSettings,\n type PushSettings,\n type IndexSettings,\n safeValidateConfig,\n safeValidateLockfile,\n} from '../schemas/index.js';\n\n// Re-export settings types for convenience\nexport type { SearchSettings, PushSettings, IndexSettings };\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Directory Initialization\n// =============================================================================\n\n/**\n * Initialize the .context directory structure\n * Creates: .context/, .context/packages/, context.config.json, context.lock\n * Also updates .gitignore to exclude packages/\n */\nexport async function initContextDir(projectRoot: string): Promise<void> {\n const contextDir = paths.getContextDir(projectRoot);\n const packagesDir = paths.getPackagesDir(projectRoot);\n const configPath = paths.getConfigPath(projectRoot);\n const lockfilePath = paths.getLockfilePath(projectRoot);\n\n log.debug(`Initializing context directory at ${contextDir}`);\n\n // Create directories\n await paths.ensureDir(contextDir);\n await paths.ensureDir(packagesDir);\n\n // Create default config if it doesn't exist\n if (!(await paths.exists(configPath))) {\n const defaultConfig: Config = { packages: [] };\n await fs.writeJson(configPath, defaultConfig, { spaces: 2 });\n log.debug(`Created default config at ${configPath}`);\n }\n\n // Create empty lockfile if it doesn't exist\n if (!(await paths.exists(lockfilePath))) {\n const defaultLockfile: Lockfile = {};\n await fs.writeJson(lockfilePath, defaultLockfile, { spaces: 2 });\n log.debug(`Created default lockfile at ${lockfilePath}`);\n }\n\n // Auto-update .gitignore to exclude packages/\n await updateGitignore(projectRoot);\n}\n\n// =============================================================================\n// Config File Operations\n// =============================================================================\n\n/**\n * Check if a config file exists in the project\n */\nexport async function configExists(projectRoot: string): Promise<boolean> {\n const configPath = paths.getConfigPath(projectRoot);\n return paths.exists(configPath);\n}\n\n/**\n * Read the config file from the project\n * Returns null if the file doesn't exist\n */\nexport async function readConfig(projectRoot: string): Promise<Config | null> {\n const configPath = paths.getConfigPath(projectRoot);\n\n if (!(await paths.exists(configPath))) {\n log.debug(`Config file not found at ${configPath}`);\n return null;\n }\n\n try {\n const data = await fs.readJson(configPath);\n const result = safeValidateConfig(data);\n\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid config file: ${errorMessages}`);\n }\n\n log.debug(`Read config from ${configPath}`);\n return result.data;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Failed to parse config file: Invalid JSON at ${configPath}`);\n }\n throw error;\n }\n}\n\n/**\n * Write the config file to the project\n */\nexport async function writeConfig(projectRoot: string, config: Config): Promise<void> {\n const configPath = paths.getConfigPath(projectRoot);\n\n // Validate before writing\n const result = safeValidateConfig(config);\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid config data: ${errorMessages}`);\n }\n\n await fs.writeJson(configPath, config, { spaces: 2 });\n log.debug(`Wrote config to ${configPath}`);\n}\n\n// =============================================================================\n// Lockfile Operations\n// =============================================================================\n\n/**\n * Read the lockfile from the project\n * Returns empty object if the file doesn't exist (safe default)\n */\nexport async function readLockfile(projectRoot: string): Promise<Lockfile> {\n const lockfilePath = paths.getLockfilePath(projectRoot);\n\n if (!(await paths.exists(lockfilePath))) {\n log.debug(`Lockfile not found at ${lockfilePath}, returning empty lockfile`);\n return {};\n }\n\n try {\n const data = await fs.readJson(lockfilePath);\n const result = safeValidateLockfile(data);\n\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid lockfile: ${errorMessages}`);\n }\n\n log.debug(`Read lockfile from ${lockfilePath}`);\n return result.data;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Failed to parse lockfile: Invalid JSON at ${lockfilePath}`);\n }\n throw error;\n }\n}\n\n/**\n * Write the lockfile to the project\n */\nexport async function writeLockfile(projectRoot: string, lockfile: Lockfile): Promise<void> {\n const lockfilePath = paths.getLockfilePath(projectRoot);\n\n // Validate before writing\n const result = safeValidateLockfile(lockfile);\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid lockfile data: ${errorMessages}`);\n }\n\n await fs.writeJson(lockfilePath, lockfile, { spaces: 2 });\n log.debug(`Wrote lockfile to ${lockfilePath}`);\n}\n\n/**\n * Update a single entry in the lockfile\n * Reads current lockfile, updates the entry, and writes back atomically\n */\nexport async function updateLockEntry(\n projectRoot: string,\n alias: string,\n entry: LockEntry\n): Promise<void> {\n const lockfile = await readLockfile(projectRoot);\n\n // Update the entry with current timestamp\n lockfile[alias] = {\n ...entry,\n updatedAt: new Date().toISOString(),\n };\n\n await writeLockfile(projectRoot, lockfile);\n log.debug(`Updated lock entry for alias '${alias}'`);\n}\n\n/**\n * Remove a lock entry by alias\n */\nexport async function removeLockEntry(projectRoot: string, alias: string): Promise<void> {\n const lockfile = await readLockfile(projectRoot);\n\n if (alias in lockfile) {\n delete lockfile[alias];\n await writeLockfile(projectRoot, lockfile);\n log.debug(`Removed lock entry for alias '${alias}'`);\n }\n}\n\n/**\n * Get a single lock entry by alias\n * Returns undefined if not found\n */\nexport async function getLockEntry(\n projectRoot: string,\n alias: string\n): Promise<LockEntry | undefined> {\n const lockfile = await readLockfile(projectRoot);\n return lockfile[alias];\n}\n\n// =============================================================================\n// Package Helpers\n// =============================================================================\n\n/**\n * Add or update a package in the config\n */\nexport async function upsertPackage(\n projectRoot: string,\n pkg: PackageEntry\n): Promise<void> {\n const config = (await readConfig(projectRoot)) ?? { packages: [] };\n\n const existingIndex = config.packages.findIndex((p) => p.alias === pkg.alias);\n\n if (existingIndex >= 0) {\n config.packages[existingIndex] = pkg;\n log.debug(`Updated package '${pkg.alias}' in config`);\n } else {\n config.packages.push(pkg);\n log.debug(`Added package '${pkg.alias}' to config`);\n }\n\n await writeConfig(projectRoot, config);\n}\n\n/**\n * Remove a package from the config by alias\n */\nexport async function removePackage(projectRoot: string, alias: string): Promise<boolean> {\n const config = await readConfig(projectRoot);\n if (!config) return false;\n\n const initialLength = config.packages.length;\n config.packages = config.packages.filter((p) => p.alias !== alias);\n\n if (config.packages.length < initialLength) {\n await writeConfig(projectRoot, config);\n log.debug(`Removed package '${alias}' from config`);\n return true;\n }\n\n return false;\n}\n\n/**\n * Get a package entry from config by alias\n */\nexport async function getPackage(\n projectRoot: string,\n alias: string\n): Promise<PackageEntry | undefined> {\n const config = await readConfig(projectRoot);\n return config?.packages.find((p) => p.alias === alias);\n}\n\n// =============================================================================\n// Auto-Integration Helpers\n// =============================================================================\n\nconst GITIGNORE_ENTRY = '.context/packages/';\nconst GITIGNORE_COMMENT = '# nocaap packages';\n\n/**\n * Ensure .context/packages/ is in .gitignore\n */\nexport async function updateGitignore(projectRoot: string): Promise<boolean> {\n const gitignorePath = paths.join(projectRoot, '.gitignore');\n\n try {\n if (await paths.exists(gitignorePath)) {\n const content = await fs.readFile(gitignorePath, 'utf-8');\n if (content.includes(GITIGNORE_ENTRY)) {\n log.debug('.gitignore already contains nocaap entry');\n return false; // Already exists\n }\n // Append to existing file\n const newContent = content.endsWith('\\n') ? content : content + '\\n';\n await fs.writeFile(gitignorePath, `${newContent}\\n${GITIGNORE_COMMENT}\\n${GITIGNORE_ENTRY}\\n`);\n } else {\n // Create new .gitignore\n await fs.writeFile(gitignorePath, `${GITIGNORE_COMMENT}\\n${GITIGNORE_ENTRY}\\n`);\n }\n log.debug('Updated .gitignore with nocaap entry');\n return true;\n } catch (error) {\n log.debug(`Failed to update .gitignore: ${error}`);\n return false;\n }\n}\n\nconst CLAUDE_MD_CONTENT = `\n## Project Context\nThis project uses nocaap for organizational context.\nRead \\`.context/INDEX.md\\` for standards, guidelines, and documentation.\n`;\n\n/**\n * Add nocaap instruction to CLAUDE.md\n */\nexport async function updateClaudeMd(projectRoot: string): Promise<boolean> {\n const claudeMdPath = paths.join(projectRoot, 'CLAUDE.md');\n\n try {\n if (await paths.exists(claudeMdPath)) {\n const content = await fs.readFile(claudeMdPath, 'utf-8');\n if (content.includes('.context/INDEX.md')) {\n log.debug('CLAUDE.md already contains nocaap reference');\n return false;\n }\n // Append to existing file\n const newContent = content.endsWith('\\n') ? content : content + '\\n';\n await fs.writeFile(claudeMdPath, `${newContent}${CLAUDE_MD_CONTENT}`);\n } else {\n // Create new CLAUDE.md\n await fs.writeFile(claudeMdPath, `# CLAUDE.md${CLAUDE_MD_CONTENT}`);\n }\n log.debug('Updated CLAUDE.md with nocaap reference');\n return true;\n } catch (error) {\n log.debug(`Failed to update CLAUDE.md: ${error}`);\n return false;\n }\n}\n\n// =============================================================================\n// Project Settings Helpers\n// =============================================================================\n\n/**\n * Get search settings from project config\n */\nexport async function getSearchSettings(projectRoot: string): Promise<SearchSettings | undefined> {\n const config = await readConfig(projectRoot);\n return config?.search;\n}\n\n/**\n * Set search settings in project config\n */\nexport async function setSearchSettings(\n projectRoot: string,\n settings: SearchSettings\n): Promise<void> {\n const config = (await readConfig(projectRoot)) ?? { packages: [] };\n config.search = settings;\n await writeConfig(projectRoot, config);\n log.debug('Updated project search settings');\n}\n\n/**\n * Get push settings from project config\n */\nexport async function getPushSettings(projectRoot: string): Promise<PushSettings | undefined> {\n const config = await readConfig(projectRoot);\n return config?.push;\n}\n\n/**\n * Set push settings in project config\n */\nexport async function setPushSettings(\n projectRoot: string,\n settings: PushSettings\n): Promise<void> {\n const config = (await readConfig(projectRoot)) ?? { packages: [] };\n config.push = settings;\n await writeConfig(projectRoot, config);\n log.debug('Updated project push settings');\n}\n\n/**\n * Get index settings from project config\n */\nexport async function getIndexSettings(projectRoot: string): Promise<IndexSettings | undefined> {\n const config = await readConfig(projectRoot);\n return config?.index;\n}\n\n/**\n * Set index settings in project config\n */\nexport async function setIndexSettings(\n projectRoot: string,\n settings: IndexSettings\n): Promise<void> {\n const config = (await readConfig(projectRoot)) ?? { packages: [] };\n config.index = settings;\n await writeConfig(projectRoot, config);\n log.debug('Updated project index settings');\n}\n","/**\n * src/core/global-config.ts\n * Manages global nocaap configuration (~/.nocaap/config.json)\n */\nimport fs from 'fs-extra';\nimport os from 'os';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\nimport {\n type GlobalConfig,\n type PushSettings,\n type EmbeddingSettings,\n safeValidateGlobalConfig,\n} from '../schemas/index.js';\n\n// Re-export the type for backward compatibility\nexport type { GlobalConfig };\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst NOCAAP_DIR = '.nocaap';\nconst CONFIG_FILE = 'config.json';\n\n// =============================================================================\n// Path Helpers\n// =============================================================================\n\n/**\n * Get the global nocaap config directory path (~/.nocaap)\n */\nexport function getGlobalConfigDir(): string {\n return paths.join(os.homedir(), NOCAAP_DIR);\n}\n\n/**\n * Get the global config file path (~/.nocaap/config.json)\n */\nexport function getGlobalConfigPath(): string {\n return paths.join(getGlobalConfigDir(), CONFIG_FILE);\n}\n\n// =============================================================================\n// Config Operations\n// =============================================================================\n\n/**\n * Read the global config file\n * Returns empty object if file doesn't exist\n */\nexport async function getGlobalConfig(): Promise<GlobalConfig> {\n const configPath = getGlobalConfigPath();\n\n if (!(await paths.exists(configPath))) {\n log.debug(`Global config not found at ${configPath}`);\n return {};\n }\n\n try {\n const data = await fs.readJson(configPath);\n const result = safeValidateGlobalConfig(data);\n\n if (!result.success) {\n log.debug(`Invalid global config, using defaults: ${result.error.message}`);\n return {};\n }\n\n log.debug(`Read global config from ${configPath}`);\n return result.data;\n } catch (error) {\n log.debug(`Failed to read global config: ${error}`);\n return {};\n }\n}\n\n/**\n * Write the global config file\n */\nexport async function setGlobalConfig(config: GlobalConfig): Promise<void> {\n const configDir = getGlobalConfigDir();\n const configPath = getGlobalConfigPath();\n\n // Ensure directory exists\n await fs.ensureDir(configDir);\n\n // Add timestamp\n config.updatedAt = new Date().toISOString();\n\n await fs.writeJson(configPath, config, { spaces: 2 });\n log.debug(`Wrote global config to ${configPath}`);\n}\n\n// =============================================================================\n// Registry Helpers\n// =============================================================================\n\n/**\n * Get the default registry URL\n * Priority: Environment variable > Global config\n */\nexport async function getDefaultRegistry(): Promise<string | undefined> {\n // Check environment variable first\n const envRegistry = process.env.NOCAAP_DEFAULT_REGISTRY;\n if (envRegistry) {\n log.debug(`Using registry from NOCAAP_DEFAULT_REGISTRY env var`);\n return envRegistry;\n }\n\n // Fall back to global config\n const config = await getGlobalConfig();\n return config.defaultRegistry;\n}\n\n/**\n * Set the default registry URL in global config\n */\nexport async function setDefaultRegistry(url: string): Promise<void> {\n const config = await getGlobalConfig();\n config.defaultRegistry = url;\n await setGlobalConfig(config);\n log.debug(`Set default registry to ${url}`);\n}\n\n/**\n * Clear the default registry URL from global config\n */\nexport async function clearDefaultRegistry(): Promise<void> {\n const config = await getGlobalConfig();\n delete config.defaultRegistry;\n await setGlobalConfig(config);\n log.debug('Cleared default registry');\n}\n\n/**\n * Check if a default registry is configured\n */\nexport async function hasDefaultRegistry(): Promise<boolean> {\n const registry = await getDefaultRegistry();\n return !!registry;\n}\n\n// =============================================================================\n// Push Settings Helpers\n// =============================================================================\n\n/**\n * Get push settings from global config\n */\nexport async function getGlobalPushSettings(): Promise<PushSettings | undefined> {\n const config = await getGlobalConfig();\n return config.push;\n}\n\n/**\n * Set push settings in global config\n */\nexport async function setGlobalPushSettings(settings: PushSettings): Promise<void> {\n const config = await getGlobalConfig();\n config.push = settings;\n await setGlobalConfig(config);\n log.debug('Updated global push settings');\n}\n\n// =============================================================================\n// Embedding Settings Helpers\n// =============================================================================\n\n/**\n * Get embedding settings from global config\n */\nexport async function getGlobalEmbeddingSettings(): Promise<EmbeddingSettings | undefined> {\n const config = await getGlobalConfig();\n return config.embedding;\n}\n\n/**\n * Set embedding settings in global config\n */\nexport async function setGlobalEmbeddingSettings(settings: EmbeddingSettings): Promise<void> {\n const config = await getGlobalConfig();\n config.embedding = settings;\n await setGlobalConfig(config);\n log.debug('Updated global embedding settings');\n}\n\n","/**\n * src/core/git-engine.ts\n * Git operations with partial clones and sparse checkout\n */\nimport simpleGit, { type SimpleGit, type SimpleGitOptions } from 'simple-git';\nimport fs from 'fs-extra';\nimport os from 'os';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Git Instance Factory\n// =============================================================================\n\n/**\n * Create a simple-git instance with sensible defaults\n */\nfunction createGit(baseDir?: string): SimpleGit {\n const options: Partial<SimpleGitOptions> = {\n baseDir: baseDir ? paths.toUnix(baseDir) : undefined,\n binary: 'git',\n maxConcurrentProcesses: 6,\n trimmed: true,\n timeout: {\n block: 60000, // 60 seconds for any single operation\n },\n };\n\n return simpleGit(options);\n}\n\n// =============================================================================\n// Access Verification\n// =============================================================================\n\n/**\n * Check if user has read access to a repository\n * Uses `git ls-remote` which respects SSH keys\n * @returns true if accessible, false if auth fails or repo doesn't exist\n */\nexport async function checkAccess(repoUrl: string): Promise<boolean> {\n log.debug(`Checking access to ${repoUrl}`);\n\n try {\n const git = createGit();\n // ls-remote will fail if no access - we just need it to not throw\n await git.listRemote([repoUrl, 'HEAD']);\n log.debug(`Access confirmed for ${repoUrl}`);\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Access denied or repo not found: ${repoUrl} - ${message}`);\n return false;\n }\n}\n\n/**\n * Detect the default branch of a repository (main, master, etc.)\n * Uses `git ls-remote --symref` to query the remote HEAD reference\n * @returns The default branch name, or 'main' as fallback\n */\nexport async function getDefaultBranch(repoUrl: string): Promise<string> {\n log.debug(`Detecting default branch for ${repoUrl}`);\n\n try {\n const git = createGit();\n // ls-remote --symref shows the symbolic ref for HEAD\n const result = await git.listRemote(['--symref', repoUrl, 'HEAD']);\n \n // Parse output like: \"ref: refs/heads/main\\tHEAD\"\n const match = result.match(/ref:\\s+refs\\/heads\\/([^\\t\\s]+)/);\n if (match && match[1]) {\n log.debug(`Default branch detected: ${match[1]}`);\n return match[1];\n }\n\n // Fallback: try to detect from available branches\n const branchesResult = await git.listRemote(['--heads', repoUrl]);\n \n // Check for common branch names in order of preference\n const commonBranches = ['main', 'master', 'develop', 'trunk'];\n for (const branch of commonBranches) {\n if (branchesResult.includes(`refs/heads/${branch}`)) {\n log.debug(`Default branch fallback: ${branch}`);\n return branch;\n }\n }\n\n log.debug('Could not detect default branch, using \"main\"');\n return 'main';\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to detect default branch: ${message}, using \"main\"`);\n return 'main';\n }\n}\n\n// =============================================================================\n// Clone Operations\n// =============================================================================\n\nexport interface CloneOptions {\n /** Git repository URL (SSH or HTTPS) */\n repoUrl: string;\n /** Target directory for the clone */\n targetDir: string;\n /** Optional path within repo for sparse checkout */\n sparsePath?: string;\n /** Branch or tag to checkout (default: default branch) */\n branch?: string;\n}\n\nexport interface CloneResult {\n /** The HEAD commit hash after clone */\n commitHash: string;\n}\n\n/**\n * Perform a sparse checkout clone\n * Uses --filter=blob:none --sparse --depth 1 for minimal download\n *\n * Clone sequence:\n * 1. Auto-detect default branch if not specified\n * 2. git clone --filter=blob:none --sparse --depth 1 --branch <branch> <url> <target>\n * 3. cd <target> && git sparse-checkout set --no-cone <path>\n */\nexport async function sparseClone(options: CloneOptions): Promise<CloneResult> {\n const { repoUrl, targetDir, sparsePath } = options;\n const normalizedTarget = paths.toUnix(targetDir);\n\n log.debug(`Sparse cloning ${repoUrl} to ${normalizedTarget}`);\n\n // Auto-detect default branch if not specified\n const branch = options.branch || await getDefaultBranch(repoUrl);\n\n // Check if target already exists\n if (await paths.exists(normalizedTarget)) {\n // Check if it's dirty before removing\n if (await isGitRepo(normalizedTarget)) {\n if (await isDirty(normalizedTarget)) {\n throw new Error(\n `Target directory has uncommitted changes: ${normalizedTarget}. ` +\n 'Please commit or discard changes before re-cloning.'\n );\n }\n }\n // Safe to remove - either not a git repo or clean\n log.debug(`Removing existing directory: ${normalizedTarget}`);\n await fs.remove(normalizedTarget);\n }\n\n // Ensure parent directory exists\n await paths.ensureDir(paths.dirname(normalizedTarget));\n\n // Build clone arguments\n const cloneArgs = [\n '--filter=blob:none', // Partial clone - no blobs initially\n '--sparse', // Enable sparse checkout\n '--depth', '1', // Shallow clone - no history\n '--branch', branch, // Always specify branch (auto-detected if not provided)\n ];\n\n cloneArgs.push(repoUrl, normalizedTarget);\n\n // Step 1: Perform the clone\n const git = createGit();\n try {\n await git.clone(repoUrl, normalizedTarget, cloneArgs.slice(0, -2)); // simple-git handles url and target separately\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to clone ${repoUrl}: ${message}`);\n }\n\n // Step 2: Set sparse-checkout path if specified\n if (sparsePath) {\n const repoGit = createGit(normalizedTarget);\n // Normalize path and strip leading slashes (git sparse-checkout prefers no leading slash)\n const normalizedSparsePath = paths.toUnix(sparsePath).replace(/^\\/+/, '');\n\n try {\n // Use --no-cone mode to ONLY include the specified path\n // Cone mode (default) includes root-level files which we don't want\n await repoGit.raw(['sparse-checkout', 'set', '--no-cone', normalizedSparsePath]);\n log.debug(`Set sparse-checkout path: ${normalizedSparsePath}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to set sparse-checkout path '${sparsePath}': ${message}`);\n }\n\n // Warn if the sparse path resulted in no files\n const sparseFullPath = paths.join(normalizedTarget, normalizedSparsePath);\n if (!(await paths.exists(sparseFullPath))) {\n log.warn(`Sparse path '${sparsePath}' does not exist in the repository`);\n } else {\n // Step 3: Flatten the directory structure\n // Move contents from sparse subdirectory to package root\n log.debug(`Flattening sparse path: ${sparseFullPath} -> ${normalizedTarget}`);\n\n const items = await fs.readdir(sparseFullPath);\n for (const item of items) {\n const srcPath = paths.join(sparseFullPath, item);\n const destPath = paths.join(normalizedTarget, item);\n await fs.move(srcPath, destPath, { overwrite: true });\n }\n\n // Remove the now-empty sparse directory chain\n const topLevelDir = normalizedSparsePath.split('/')[0];\n if (topLevelDir) {\n const topLevelPath = paths.join(normalizedTarget, topLevelDir);\n await fs.remove(topLevelPath);\n log.debug(`Removed empty sparse directory: ${topLevelPath}`);\n }\n }\n }\n\n // Get the commit hash\n const commitHash = await getHeadCommit(normalizedTarget);\n\n log.debug(`Clone complete. HEAD: ${commitHash}`);\n\n return { commitHash };\n}\n\n// =============================================================================\n// Repository State\n// =============================================================================\n\n/**\n * Check if a directory is a git repository\n */\nexport async function isGitRepo(dirPath: string): Promise<boolean> {\n const gitDir = paths.join(dirPath, '.git');\n return paths.exists(gitDir);\n}\n\n/**\n * Check if a repository has uncommitted changes\n * CRITICAL: Must check before any destructive operation\n * @returns true if there are uncommitted changes, false if clean\n */\nexport async function isDirty(repoPath: string): Promise<boolean> {\n const normalizedPath = paths.toUnix(repoPath);\n log.debug(`Checking dirty state for ${normalizedPath}`);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n const status = await git.status();\n\n // Use built-in isClean() method for reliable dirty check\n const isDirtyState = !status.isClean();\n\n log.debug(`Repository ${normalizedPath} is ${isDirtyState ? 'dirty' : 'clean'}`);\n return isDirtyState;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to check repository status: ${message}`);\n }\n}\n\n/**\n * Get the current HEAD commit hash\n */\nexport async function getHeadCommit(repoPath: string): Promise<string> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n const hash = await git.revparse(['HEAD']);\n return hash.trim();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to get HEAD commit: ${message}`);\n }\n}\n\n/**\n * Get the remote URL for a repository\n */\nexport async function getRemoteUrl(repoPath: string): Promise<string | null> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n return null;\n }\n\n try {\n const git = createGit(normalizedPath);\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === 'origin');\n return origin?.refs?.fetch ?? null;\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// Update Operations\n// =============================================================================\n\n/**\n * Pull latest changes from remote\n * @throws Error if repository is dirty\n */\nexport async function pull(repoPath: string): Promise<CloneResult> {\n const normalizedPath = paths.toUnix(repoPath);\n log.debug(`Pulling updates for ${normalizedPath}`);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n // CRITICAL: Check for dirty state before pulling\n if (await isDirty(normalizedPath)) {\n throw new Error(\n `Cannot pull: repository has uncommitted changes at ${normalizedPath}. ` +\n 'Please commit or discard changes first.'\n );\n }\n\n try {\n const git = createGit(normalizedPath);\n await git.pull();\n const commitHash = await getHeadCommit(normalizedPath);\n\n log.debug(`Pull complete. HEAD: ${commitHash}`);\n return { commitHash };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to pull updates: ${message}`);\n }\n}\n\n/**\n * Fetch and reset to latest remote HEAD\n * More aggressive than pull - discards local state\n * @throws Error if repository is dirty\n */\nexport async function fetchAndReset(repoPath: string): Promise<CloneResult> {\n const normalizedPath = paths.toUnix(repoPath);\n log.debug(`Fetch and reset for ${normalizedPath}`);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n // CRITICAL: Check for dirty state\n if (await isDirty(normalizedPath)) {\n throw new Error(\n `Cannot reset: repository has uncommitted changes at ${normalizedPath}. ` +\n 'Please commit or discard changes first.'\n );\n }\n\n try {\n const git = createGit(normalizedPath);\n\n // Fetch latest from origin\n await git.fetch(['origin']);\n\n // Get the current branch\n const branch = await git.revparse(['--abbrev-ref', 'HEAD']);\n\n // Reset to origin/<branch>\n await git.reset(['--hard', `origin/${branch.trim()}`]);\n\n const commitHash = await getHeadCommit(normalizedPath);\n\n log.debug(`Reset complete. HEAD: ${commitHash}`);\n return { commitHash };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to fetch and reset: ${message}`);\n }\n}\n\n// =============================================================================\n// Cleanup\n// =============================================================================\n\n/**\n * Safely remove a package directory\n * @throws Error if directory has uncommitted changes\n */\nexport async function removePackage(packagePath: string): Promise<void> {\n const normalizedPath = paths.toUnix(packagePath);\n log.debug(`Removing package at ${normalizedPath}`);\n\n if (!(await paths.exists(normalizedPath))) {\n log.debug(`Package directory does not exist: ${normalizedPath}`);\n return;\n }\n\n // If it's a git repo, check for dirty state\n if (await isGitRepo(normalizedPath)) {\n if (await isDirty(normalizedPath)) {\n throw new Error(\n `Cannot remove: package has uncommitted changes at ${normalizedPath}. ` +\n 'Please commit or discard changes first.'\n );\n }\n }\n\n await fs.remove(normalizedPath);\n log.debug(`Removed package directory: ${normalizedPath}`);\n}\n\n// =============================================================================\n// Sparse Checkout Utilities\n// =============================================================================\n\n/**\n * Get the current sparse-checkout paths\n */\nexport async function getSparseCheckoutPaths(repoPath: string): Promise<string[]> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n const result = await git.raw(['sparse-checkout', 'list']);\n return result\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n } catch {\n // If sparse-checkout not configured, return empty array\n return [];\n }\n}\n\n/**\n * Update the sparse-checkout path for an existing repo\n */\nexport async function updateSparseCheckout(\n repoPath: string,\n sparsePath: string\n): Promise<void> {\n const normalizedPath = paths.toUnix(repoPath);\n // Strip leading slashes for git sparse-checkout compatibility\n const normalizedSparsePath = paths.toUnix(sparsePath).replace(/^\\/+/, '');\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n // Use --no-cone mode to ONLY include the specified path (no root files)\n await git.raw(['sparse-checkout', 'set', '--no-cone', normalizedSparsePath]);\n log.debug(`Updated sparse-checkout to: ${normalizedSparsePath}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to update sparse-checkout: ${message}`);\n }\n}\n\n// =============================================================================\n// Push Support Utilities\n// =============================================================================\n\n/**\n * Get the latest commit hash from a remote repository\n * Uses `git ls-remote` to query without cloning\n */\nexport async function getRemoteCommitHash(\n repoUrl: string,\n branch?: string\n): Promise<string> {\n log.debug(`Getting remote commit hash for ${repoUrl}`);\n\n try {\n const git = createGit();\n const ref = branch ? `refs/heads/${branch}` : 'HEAD';\n const result = await git.listRemote([repoUrl, ref]);\n\n // Parse the commit hash from output like \"abc123\\trefs/heads/main\"\n const match = result.match(/^([a-f0-9]+)/);\n if (!match || !match[1]) {\n throw new Error('Could not parse commit hash from remote');\n }\n\n const commitHash = match[1];\n log.debug(`Remote commit hash: ${commitHash}`);\n return commitHash;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to get remote commit hash: ${message}`);\n }\n}\n\nexport interface TempCloneResult {\n /** Path to the temporary clone directory */\n tempDir: string;\n /** Cleanup function to remove the temp directory */\n cleanup: () => Promise<void>;\n}\n\n/**\n * Clone a repository to a temporary directory\n * Returns path and cleanup function\n *\n * Uses shallow clone (--depth 1) for speed\n */\nexport async function cloneToTemp(\n repoUrl: string,\n branch?: string\n): Promise<TempCloneResult> {\n // Create unique temp directory\n const tempBase = paths.join(os.tmpdir(), 'nocaap-push');\n await paths.ensureDir(tempBase);\n const tempDir = await fs.mkdtemp(paths.join(tempBase, 'repo-'));\n\n log.debug(`Cloning ${repoUrl} to temp directory: ${tempDir}`);\n\n try {\n const git = createGit();\n\n // Build clone arguments\n const cloneArgs = ['--depth', '1'];\n if (branch) {\n cloneArgs.push('--branch', branch);\n }\n\n await git.clone(repoUrl, tempDir, cloneArgs);\n\n log.debug(`Temp clone complete: ${tempDir}`);\n\n // Return path and cleanup function\n return {\n tempDir,\n cleanup: async () => {\n log.debug(`Cleaning up temp directory: ${tempDir}`);\n await fs.remove(tempDir);\n },\n };\n } catch (error) {\n // Clean up on failure\n await fs.remove(tempDir);\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to clone to temp directory: ${message}`);\n }\n}\n\n/**\n * Create a new branch in a repository\n */\nexport async function createBranch(repoPath: string, branchName: string): Promise<void> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n await git.checkoutLocalBranch(branchName);\n log.debug(`Created and checked out branch: ${branchName}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to create branch: ${message}`);\n }\n}\n\n/**\n * Commit all changes in a repository\n */\nexport async function commitAll(repoPath: string, message: string): Promise<string> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n\n // Stage all changes\n await git.add('-A');\n\n // Commit\n const result = await git.commit(message);\n\n log.debug(`Committed changes: ${result.commit}`);\n return result.commit;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to commit: ${message}`);\n }\n}\n\n/**\n * Push a branch to origin\n * @throws Error if push fails (e.g., no write access)\n */\nexport async function pushBranch(\n repoPath: string,\n branchName: string\n): Promise<void> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n await git.push('origin', branchName, ['--set-upstream']);\n log.debug(`Pushed branch ${branchName} to origin`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n // Check for permission denied\n if (\n message.includes('Permission denied') ||\n message.includes('403') ||\n message.includes('authentication failed')\n ) {\n throw new Error(\n `Permission denied. You don't have write access to this repository.\\n` +\n 'Consider forking the repository and pushing to your fork.'\n );\n }\n\n throw new Error(`Failed to push: ${message}`);\n }\n}\n","/**\n * src/core/registry.ts\n * Fetches and parses the registry with federation support\n * Supports smart URL detection with HTTP-first, SSH-fallback for private repos\n */\nimport fs from 'fs-extra';\nimport os from 'os';\nimport {\n safeValidateRegistry,\n type Registry,\n type ContextEntry,\n} from '../schemas/index.js';\nimport { log } from '../utils/logger.js';\nimport * as paths from '../utils/paths.js';\nimport { sparseClone, getDefaultBranch, checkAccess } from './git-engine.js';\n\nconst DEFAULT_MAX_DEPTH = 3;\nconst DEFAULT_TIMEOUT_MS = 10000; // 10 seconds\n\n// =============================================================================\n// Smart URL Normalization\n// =============================================================================\n\ninterface NormalizedRegistryUrl {\n /** Original URL provided by user */\n original: string;\n /** Git SSH URL for cloning (empty if not applicable) */\n gitUrl: string;\n /** Path to registry file within repo */\n filePath: string;\n /** HTTP URL to try first (for public repos) */\n httpUrl: string | null;\n /** Provider (github, gitlab, bitbucket, unknown) */\n provider: 'github' | 'gitlab' | 'bitbucket' | 'unknown';\n /** Branch name (if detected from URL) */\n branch: string | null;\n}\n\n/**\n * Normalize any GitHub/GitLab URL into a consistent format\n * \n * Accepts:\n * - https://github.com/org/repo\n * - https://github.com/org/repo/blob/main/path/to/file.json\n * - https://raw.githubusercontent.com/org/repo/main/file.json\n * - git@github.com:org/repo.git\n * - git@github.com:org/repo.git#path/to/file.json\n */\nexport function normalizeRegistryUrl(url: string): NormalizedRegistryUrl {\n const original = url.trim();\n \n // Default file path\n let filePath = 'nocaap-registry.json';\n let gitUrl = '';\n let httpUrl: string | null = null;\n let provider: 'github' | 'gitlab' | 'bitbucket' | 'unknown' = 'unknown';\n let branch: string | null = null;\n\n // Pattern 1: Git SSH with optional file path\n // git@github.com:org/repo.git#path/to/file.json\n if (original.startsWith('git@') || original.startsWith('ssh://')) {\n const hashIndex = original.indexOf('#');\n if (hashIndex !== -1) {\n gitUrl = original.substring(0, hashIndex);\n filePath = original.substring(hashIndex + 1);\n } else {\n gitUrl = original.endsWith('.git') ? original : `${original}.git`;\n }\n \n // Detect provider\n if (original.includes('github.com')) provider = 'github';\n else if (original.includes('gitlab.com')) provider = 'gitlab';\n else if (original.includes('bitbucket.org')) provider = 'bitbucket';\n\n // Try to construct HTTP URL for public repos (GitHub)\n if (provider === 'github') {\n const match = gitUrl.match(/git@github\\.com:(.+?)(?:\\.git)?$/);\n if (match) {\n httpUrl = `https://raw.githubusercontent.com/${match[1]}/main/${filePath}`;\n }\n }\n\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 2: GitHub raw URL\n // https://raw.githubusercontent.com/org/repo/branch/path/to/file.json\n const rawGitHubMatch = original.match(\n /^https:\\/\\/raw\\.githubusercontent\\.com\\/([^/]+)\\/([^/]+)\\/([^/]+)\\/(.+)$/\n );\n if (rawGitHubMatch) {\n const [, org, repo, branchName, path] = rawGitHubMatch;\n gitUrl = `git@github.com:${org}/${repo}.git`;\n filePath = path!;\n httpUrl = original;\n provider = 'github';\n branch = branchName ?? null;\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 3: GitHub blob URL\n // https://github.com/org/repo/blob/main/path/to/file.json\n const blobMatch = original.match(\n /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/blob\\/([^/]+)\\/(.+)$/\n );\n if (blobMatch) {\n const [, org, repo, branchName, path] = blobMatch;\n gitUrl = `git@github.com:${org}/${repo}.git`;\n filePath = path!;\n httpUrl = `https://raw.githubusercontent.com/${org}/${repo}/${branchName}/${path}`;\n provider = 'github';\n branch = branchName ?? null;\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 4: GitHub repo URL (no file specified)\n // https://github.com/org/repo\n // https://github.com/org/repo/\n const repoMatch = original.match(\n /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(\\/)?$/\n );\n if (repoMatch && repoMatch[1] && repoMatch[2]) {\n const org = repoMatch[1];\n const repo = repoMatch[2];\n // Remove .git suffix if present\n const cleanRepo = repo.replace(/\\.git$/, '');\n gitUrl = `git@github.com:${org}/${cleanRepo}.git`;\n filePath = 'nocaap-registry.json';\n httpUrl = `https://raw.githubusercontent.com/${org}/${cleanRepo}/main/${filePath}`;\n provider = 'github';\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 5: GitLab URL\n // https://gitlab.com/org/repo\n // https://gitlab.com/org/repo/-/blob/main/file.json\n const gitlabMatch = original.match(\n /^https:\\/\\/gitlab\\.com\\/([^/]+)\\/([^/]+)/\n );\n if (gitlabMatch && gitlabMatch[1] && gitlabMatch[2]) {\n const org = gitlabMatch[1];\n const repo = gitlabMatch[2];\n const cleanRepo = repo.replace(/\\.git$/, '');\n gitUrl = `git@gitlab.com:${org}/${cleanRepo}.git`;\n provider = 'gitlab';\n \n // Check if it's a file URL\n const gitlabFileMatch = original.match(\n /^https:\\/\\/gitlab\\.com\\/([^/]+)\\/([^/]+)\\/-\\/blob\\/([^/]+)\\/(.+)$/\n );\n if (gitlabFileMatch && gitlabFileMatch[3] && gitlabFileMatch[4]) {\n filePath = gitlabFileMatch[4];\n branch = gitlabFileMatch[3];\n httpUrl = `https://gitlab.com/${org}/${cleanRepo}/-/raw/${branch}/${filePath}`;\n } else {\n httpUrl = `https://gitlab.com/${org}/${cleanRepo}/-/raw/main/${filePath}`;\n }\n \n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 6: Bitbucket URL\n const bitbucketMatch = original.match(\n /^https:\\/\\/bitbucket\\.org\\/([^/]+)\\/([^/]+)/\n );\n if (bitbucketMatch && bitbucketMatch[1] && bitbucketMatch[2]) {\n const org = bitbucketMatch[1];\n const repo = bitbucketMatch[2];\n const cleanRepo = repo.replace(/\\.git$/, '');\n gitUrl = `git@bitbucket.org:${org}/${cleanRepo}.git`;\n provider = 'bitbucket';\n httpUrl = `https://bitbucket.org/${org}/${cleanRepo}/raw/main/${filePath}`;\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 7: Plain HTTP URL (assume it's a direct link to JSON)\n if (original.startsWith('http://') || original.startsWith('https://')) {\n // Can't determine git URL, just use HTTP\n return {\n original,\n gitUrl: '',\n filePath: '',\n httpUrl: original,\n provider: 'unknown',\n branch: null,\n };\n }\n\n // Unknown format - throw helpful error\n throw new Error(\n `Unrecognized registry URL format: ${original}\\n\\n` +\n `Supported formats:\\n` +\n ` https://github.com/org/repo\\n` +\n ` https://github.com/org/repo/blob/main/nocaap-registry.json\\n` +\n ` https://raw.githubusercontent.com/org/repo/main/file.json\\n` +\n ` git@github.com:org/repo.git\\n` +\n ` git@github.com:org/repo.git#path/to/registry.json`\n );\n}\n\n// =============================================================================\n// Git-Based Registry Fetch\n// =============================================================================\n\n/**\n * Fetch registry by cloning the repo (uses SSH keys)\n * Perfect for private repositories - maintains \"Zero Auth\" principle\n */\nasync function fetchRegistryViaGit(\n repoUrl: string, \n filePath: string,\n branchHint?: string | null\n): Promise<Registry> {\n log.debug(`Fetching registry via Git: ${repoUrl} -> ${filePath}`);\n\n // First check access\n let hasAccess: boolean;\n try {\n hasAccess = await checkAccess(repoUrl);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n // Check if Git is installed\n if (message.includes('ENOENT') || message.includes('not found')) {\n throw new Error(\n `Git is not installed or not in PATH.\\n\\n` +\n 'To use private repositories, you need:\\n' +\n ' 1. Git installed (https://git-scm.com)\\n' +\n ' 2. SSH keys configured for your Git host'\n );\n }\n throw new Error(`Failed to check repository access: ${message}`);\n }\n\n if (!hasAccess) {\n throw new Error(\n `Cannot access repository via SSH: ${repoUrl}\\n\\n` +\n 'Please check:\\n' +\n ' • You have SSH keys configured (run: ssh -T git@github.com)\\n' +\n ' • You have read access to the repository\\n' +\n ' • The repository URL is correct'\n );\n }\n\n // Create temp directory\n const tempDir = paths.join(os.tmpdir(), `nocaap-registry-${Date.now()}`);\n \n try {\n // Determine the sparse path (directory containing the file)\n const fileDir = paths.dirname(filePath);\n const sparsePath = fileDir === '.' || fileDir === '' ? undefined : fileDir;\n \n // Use branch hint if provided, otherwise detect\n const branch = branchHint || await getDefaultBranch(repoUrl);\n \n // Clone with sparse checkout (just the directory containing the registry file)\n await sparseClone({\n repoUrl,\n targetDir: tempDir,\n sparsePath,\n branch,\n });\n\n // Read the registry file\n const registryPath = paths.join(tempDir, filePath);\n \n if (!(await paths.exists(registryPath))) {\n throw new Error(\n `Registry file not found: ${filePath}\\n\\n` +\n 'Please check:\\n' +\n ' • The file path is correct\\n' +\n ' • The file exists in the repository\\n' +\n ` • Try: git@...#${filePath}`\n );\n }\n\n const content = await fs.readFile(registryPath, 'utf-8');\n \n let data: unknown;\n try {\n data = JSON.parse(content);\n } catch {\n throw new Error(`Invalid JSON in registry file: ${filePath}`);\n }\n\n const result = safeValidateRegistry(data);\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid registry schema: ${errorMessages}`);\n }\n\n log.debug(`Successfully fetched registry via Git with ${result.data.contexts.length} contexts`);\n return result.data;\n } finally {\n // Cleanup temp directory\n await fs.remove(tempDir).catch(() => {\n log.debug(`Failed to cleanup temp directory: ${tempDir}`);\n });\n }\n}\n\n// =============================================================================\n// HTTP-Based Registry Fetch\n// =============================================================================\n\n/** Custom error class for HTTP fetch failures that may warrant SSH fallback */\nclass HttpFetchError extends Error {\n constructor(\n message: string,\n public readonly status: number | null,\n public readonly shouldTrySSH: boolean\n ) {\n super(message);\n this.name = 'HttpFetchError';\n }\n}\n\n/**\n * Fetch registry via HTTP (for public repos or URLs with tokens)\n * @throws HttpFetchError with shouldTrySSH=true if SSH fallback is recommended\n */\nasync function fetchRegistryViaHttp(url: string): Promise<Registry> {\n log.debug(`Fetching registry via HTTP: ${url}`);\n\n let response: Response;\n try {\n // Add timeout to prevent hanging on slow/unresponsive servers\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT_MS);\n\n response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new HttpFetchError(\n `Registry fetch timed out after ${DEFAULT_TIMEOUT_MS / 1000}s`,\n null,\n false\n );\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new HttpFetchError(`Network error: ${message}`, null, false);\n }\n\n if (!response.ok) {\n const isGitHub = url.includes('githubusercontent.com') || url.includes('github.com');\n const isGitLab = url.includes('gitlab.com');\n \n // 404/403 on GitHub/GitLab often means private repo - suggest SSH\n const shouldTrySSH = (response.status === 404 || response.status === 403) && \n (isGitHub || isGitLab);\n \n throw new HttpFetchError(\n `HTTP ${response.status} ${response.statusText}`,\n response.status,\n shouldTrySSH\n );\n }\n\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n throw new HttpFetchError('Invalid JSON response', null, false);\n }\n\n const result = safeValidateRegistry(data);\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid registry schema: ${errorMessages}`);\n }\n\n log.debug(`Successfully fetched registry via HTTP with ${result.data.contexts.length} contexts`);\n return result.data;\n}\n\n// =============================================================================\n// Main Fetch Function with Smart Fallback\n// =============================================================================\n\n/**\n * Fetch a registry with smart URL detection and fallback\n * \n * Flow:\n * 1. Parse and normalize the URL (detect GitHub, GitLab, etc.)\n * 2. Try HTTP first if available (fast, works for public repos)\n * 3. If HTTP fails with 404/403, try Git SSH (works for private repos)\n * 4. Provide helpful error messages at each step\n * \n * @example\n * // All of these work - just paste what you copy from GitHub:\n * fetchRegistry('https://github.com/org/repo')\n * fetchRegistry('https://github.com/org/repo/blob/main/nocaap-registry.json')\n * fetchRegistry('https://raw.githubusercontent.com/org/repo/main/file.json')\n * fetchRegistry('git@github.com:org/repo.git')\n */\nexport async function fetchRegistry(registryUrl: string): Promise<Registry> {\n const normalized = normalizeRegistryUrl(registryUrl);\n \n log.debug(`Normalized registry URL: ${JSON.stringify(normalized, null, 2)}`);\n\n // If it's explicitly a Git URL (no HTTP available), go directly to Git\n if (!normalized.httpUrl && normalized.gitUrl) {\n log.debug('No HTTP URL available, using Git directly');\n return fetchRegistryViaGit(normalized.gitUrl, normalized.filePath, normalized.branch);\n }\n\n // Try HTTP first if available (faster for public repos)\n if (normalized.httpUrl) {\n try {\n log.debug(`Trying HTTP fetch: ${normalized.httpUrl}`);\n const registry = await fetchRegistryViaHttp(normalized.httpUrl);\n return registry;\n } catch (error) {\n // If HTTP failed and we have a Git URL, consider SSH fallback\n if (error instanceof HttpFetchError && error.shouldTrySSH && normalized.gitUrl) {\n log.debug(`HTTP failed (${error.status}), trying SSH fallback`);\n \n try {\n return await fetchRegistryViaGit(\n normalized.gitUrl, \n normalized.filePath,\n normalized.branch\n );\n } catch (sshError) {\n // Both failed - provide comprehensive error message\n const sshMessage = sshError instanceof Error ? sshError.message : 'Unknown error';\n throw new Error(\n `Could not fetch registry from: ${registryUrl}\\n\\n` +\n `HTTP attempt: ${error.message}\\n` +\n `SSH attempt: ${sshMessage}\\n\\n` +\n 'Possible solutions:\\n' +\n ' • Check the URL is correct\\n' +\n ' • For private repos: ensure SSH keys are configured\\n' +\n ' • Run: ssh -T git@github.com (to test SSH access)'\n );\n }\n }\n \n // HTTP failed and no SSH fallback available\n if (error instanceof HttpFetchError) {\n const hint = error.shouldTrySSH \n ? '\\n\\nThis might be a private repository. Try using SSH:\\n' +\n ` nocaap config registry ${normalized.gitUrl || 'git@github.com:org/repo.git'}`\n : '';\n throw new Error(\n `Failed to fetch registry: ${error.message}${hint}`\n );\n }\n \n throw error;\n }\n }\n\n // No HTTP URL and no Git URL - shouldn't happen but handle gracefully\n throw new Error(`Could not determine how to fetch registry from: ${registryUrl}`);\n}\n\n// =============================================================================\n// Federated Registry Fetch\n// =============================================================================\n\nexport interface FetchOptions {\n /** Set of already visited URLs (for circular dependency detection) */\n visited?: Set<string>;\n /** Maximum recursion depth for imports (default: 3) */\n maxDepth?: number;\n /** Current recursion depth (internal use) */\n currentDepth?: number;\n}\n\n/**\n * Fetch registry with federation support (resolves `imports` recursively)\n * - Tracks visited URLs to prevent circular imports\n * - Has max depth limit to prevent infinite recursion\n * - Merges all imported registries into a single result\n * - Supports both HTTP and Git URLs for imports\n */\nexport async function fetchRegistryWithImports(\n url: string,\n options?: FetchOptions\n): Promise<Registry> {\n const visited = options?.visited ?? new Set<string>();\n const maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n const currentDepth = options?.currentDepth ?? 0;\n\n // Normalize URL for comparison (remove trailing slash and hash)\n const normalizedUrl = url.replace(/\\/$/, '').replace(/#.*$/, '');\n\n // Check for circular imports\n if (visited.has(normalizedUrl)) {\n log.warn(`Circular import detected, skipping: ${url}`);\n return { contexts: [] };\n }\n\n // Check max depth\n if (currentDepth >= maxDepth) {\n log.warn(`Max import depth (${maxDepth}) exceeded, skipping: ${url}`);\n return { contexts: [] };\n }\n\n // Mark as visited\n visited.add(normalizedUrl);\n\n // Fetch this registry (auto-detects HTTP vs Git URL with fallback)\n const registry = await fetchRegistry(url);\n\n // If no imports, return as-is\n if (!registry.imports || registry.imports.length === 0) {\n return registry;\n }\n\n log.debug(`Registry has ${registry.imports.length} imports, fetching...`);\n\n // Fetch all imported registries in parallel\n const importPromises = registry.imports.map(async (importUrl) => {\n try {\n return await fetchRegistryWithImports(importUrl, {\n visited,\n maxDepth,\n currentDepth: currentDepth + 1,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.warn(`Failed to fetch imported registry ${importUrl}: ${message}`);\n return { contexts: [] } as Registry;\n }\n });\n\n const importedRegistries = await Promise.all(importPromises);\n\n // Merge all registries (current + imported)\n return mergeRegistries([registry, ...importedRegistries]);\n}\n\n// =============================================================================\n// Registry Merging\n// =============================================================================\n\n/**\n * Create a unique key for deduplication based on repo + path\n */\nfunction getContextKey(context: ContextEntry): string {\n const path = context.path ?? '';\n return `${context.repo}::${path}`;\n}\n\n/**\n * Merge multiple registries into one, deduplicating contexts by repo+path\n * Later registries take precedence over earlier ones for duplicates\n * Preserves the name of the first (root) registry\n */\nexport function mergeRegistries(registries: Registry[]): Registry {\n const contextMap = new Map<string, ContextEntry>();\n\n for (const registry of registries) {\n for (const context of registry.contexts) {\n const key = getContextKey(context);\n // Later entries overwrite earlier ones\n contextMap.set(key, context);\n }\n }\n\n const mergedContexts = Array.from(contextMap.values());\n\n log.debug(`Merged ${registries.length} registries into ${mergedContexts.length} unique contexts`);\n\n return {\n name: registries[0]?.name, // Preserve root registry name\n contexts: mergedContexts,\n // Don't include imports in merged result (they've been resolved)\n };\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Find a context entry by name (case-insensitive)\n */\nexport function findContextByName(\n registry: Registry,\n name: string\n): ContextEntry | undefined {\n const lowerName = name.toLowerCase();\n return registry.contexts.find(\n (ctx) => ctx.name.toLowerCase() === lowerName\n );\n}\n\n/**\n * Find contexts by tag\n */\nexport function findContextsByTag(\n registry: Registry,\n tag: string\n): ContextEntry[] {\n const lowerTag = tag.toLowerCase();\n return registry.contexts.filter(\n (ctx) => ctx.tags?.some((t) => t.toLowerCase() === lowerTag)\n );\n}\n\n/**\n * Get all unique tags from a registry\n */\nexport function getAllTags(registry: Registry): string[] {\n const tagSet = new Set<string>();\n \n for (const context of registry.contexts) {\n if (context.tags) {\n for (const tag of context.tags) {\n tagSet.add(tag);\n }\n }\n }\n\n return Array.from(tagSet).sort();\n}\n","/**\n * src/core/indexer.ts\n * Generates the AI-optimized INDEX.md file\n */\nimport fs from 'fs-extra';\nimport matter from 'gray-matter';\nimport * as paths from '../utils/paths.js';\nimport { readConfig } from './config.js';\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Rough estimate: ~4 characters per token */\nconst CHARS_PER_TOKEN = 4;\n\n/** Warning threshold for token budget */\nconst TOKEN_BUDGET_WARNING = 8000;\n\n/** Maximum lines to extract for preview */\nconst MAX_PREVIEW_LINES = 5;\n\n/** Supported documentation file extensions */\nconst DOC_EXTENSIONS = ['.md', '.mdx'];\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface DocMeta {\n /** Document title (from frontmatter or filename) */\n title: string;\n /** Document summary (from frontmatter) */\n summary?: string;\n /** Document type (from frontmatter, e.g., \"guide\", \"api\") */\n type?: string;\n /** Document tags (from frontmatter) */\n tags?: string[];\n /** Path relative to .context/ directory */\n relativePath: string;\n /** Preview text (first 5 lines if no summary) */\n preview: string;\n}\n\nexport interface IndexResult {\n /** The INDEX.md markdown content */\n content: string;\n /** Number of files indexed */\n fileCount: number;\n /** Approximate token count */\n tokenEstimate: number;\n /** Warnings (e.g., \"Exceeds 8k token budget\") */\n warnings: string[];\n}\n\ninterface PackageIndex {\n alias: string;\n files: DocMeta[];\n}\n\n// =============================================================================\n// File Parsing\n// =============================================================================\n\n/**\n * Parse a single documentation file and extract metadata\n */\nexport async function parseDocFile(filePath: string, basePath: string): Promise<DocMeta> {\n const normalizedPath = paths.toUnix(filePath);\n const relativePath = paths.relative(basePath, normalizedPath);\n\n log.debug(`Parsing doc file: ${relativePath}`);\n\n const content = await fs.readFile(normalizedPath, 'utf-8');\n\n // Parse frontmatter\n const { data: frontmatter, content: body } = matter(content);\n\n // Extract title: frontmatter > first H1 > filename\n const title = extractTitle(frontmatter, body, normalizedPath);\n\n // Extract summary from frontmatter (support both 'summary' and 'description')\n const summary = (frontmatter.summary ?? frontmatter.description) as string | undefined;\n\n // Extract type from frontmatter\n const type = frontmatter.type as string | undefined;\n\n // Extract tags from frontmatter\n const tags = Array.isArray(frontmatter.tags)\n ? frontmatter.tags.filter((t): t is string => typeof t === 'string')\n : undefined;\n\n // Generate preview: use summary or first N non-empty lines\n const preview = summary || extractPreview(body);\n\n return {\n title,\n summary,\n type,\n tags,\n relativePath,\n preview,\n };\n}\n\n/**\n * Extract title from frontmatter, first H1, or filename\n */\nfunction extractTitle(\n frontmatter: Record<string, unknown>,\n body: string,\n filePath: string\n): string {\n // 1. Try frontmatter title\n if (typeof frontmatter.title === 'string' && frontmatter.title.trim()) {\n return frontmatter.title.trim();\n }\n\n // 2. Try first H1 heading\n const h1Match = body.match(/^#\\s+(.+)$/m);\n if (h1Match?.[1]) {\n return h1Match[1].trim();\n }\n\n // 3. Fall back to filename (without extension)\n const filename = paths.basename(filePath, paths.extname(filePath));\n // Convert kebab-case or snake_case to Title Case\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Extract preview from first N non-empty, non-heading lines\n * Truncates at word boundary for cleaner output\n */\nfunction extractPreview(body: string): string {\n const lines = body.split('\\n');\n const previewLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip empty lines and headings\n if (!trimmed || trimmed.startsWith('#')) {\n continue;\n }\n\n // Skip frontmatter delimiters\n if (trimmed === '---') {\n continue;\n }\n\n previewLines.push(trimmed);\n\n if (previewLines.length >= MAX_PREVIEW_LINES) {\n break;\n }\n }\n\n let preview = previewLines.join(' ');\n\n // Truncate at word boundary if too long\n if (preview.length > 300) {\n preview = preview.slice(0, 300);\n const lastSpace = preview.lastIndexOf(' ');\n // Don't truncate too aggressively (keep at least 200 chars)\n if (lastSpace > 200) {\n preview = preview.slice(0, lastSpace);\n }\n preview += '...';\n }\n\n return preview;\n}\n\n// =============================================================================\n// Directory Scanning\n// =============================================================================\n\n/**\n * Recursively find all documentation files in a directory\n */\nasync function findDocFiles(dirPath: string): Promise<string[]> {\n const results: string[] = [];\n\n if (!(await paths.exists(dirPath))) {\n return results;\n }\n\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = paths.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip hidden directories and node_modules\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\n continue;\n }\n const subFiles = await findDocFiles(fullPath);\n results.push(...subFiles);\n } else if (entry.isFile()) {\n const ext = paths.extname(entry.name).toLowerCase();\n if (DOC_EXTENSIONS.includes(ext)) {\n results.push(fullPath);\n }\n }\n }\n\n return results;\n}\n\n// =============================================================================\n// Index Generation\n// =============================================================================\n\n/**\n * Scan all packages and generate INDEX.md content\n */\nexport async function generateIndex(projectRoot: string): Promise<IndexResult> {\n const contextDir = paths.getContextDir(projectRoot);\n const warnings: string[] = [];\n\n log.debug(`Generating index for ${projectRoot}`);\n\n // Read config to get package aliases\n const config = await readConfig(projectRoot);\n if (!config || config.packages.length === 0) {\n log.debug('No packages configured, generating empty index');\n return {\n content: generateEmptyIndex(),\n fileCount: 0,\n tokenEstimate: 0,\n warnings: ['No packages configured'],\n };\n }\n\n // Scan each package directory\n const packageIndexes: PackageIndex[] = [];\n let totalFiles = 0;\n\n for (const pkg of config.packages) {\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n\n if (!(await paths.exists(packagePath))) {\n log.debug(`Package directory not found: ${pkg.alias}`);\n warnings.push(`Package '${pkg.alias}' directory not found`);\n continue;\n }\n\n const docFiles = await findDocFiles(packagePath);\n\n if (docFiles.length === 0) {\n log.debug(`No documentation files found in package: ${pkg.alias}`);\n warnings.push(`No .md/.mdx files found in '${pkg.alias}'`);\n continue;\n }\n\n // Parse each doc file\n const fileMetas: DocMeta[] = [];\n for (const filePath of docFiles) {\n try {\n const meta = await parseDocFile(filePath, contextDir);\n fileMetas.push(meta);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to parse ${filePath}: ${message}`);\n warnings.push(`Failed to parse: ${paths.relative(contextDir, filePath)}`);\n }\n }\n\n // Sort files alphabetically by title\n fileMetas.sort((a, b) => a.title.localeCompare(b.title));\n\n packageIndexes.push({\n alias: pkg.alias,\n files: fileMetas,\n });\n\n totalFiles += fileMetas.length;\n }\n\n // Sort packages alphabetically\n packageIndexes.sort((a, b) => a.alias.localeCompare(b.alias));\n\n // Generate markdown content\n const content = generateIndexMarkdown(packageIndexes);\n\n // Estimate tokens\n const tokenEstimate = Math.ceil(content.length / CHARS_PER_TOKEN);\n\n // Check token budget\n if (tokenEstimate > TOKEN_BUDGET_WARNING) {\n warnings.push(\n `INDEX.md exceeds recommended token budget: ~${tokenEstimate.toLocaleString()} tokens ` +\n `(recommended: <${TOKEN_BUDGET_WARNING.toLocaleString()})`\n );\n }\n\n log.debug(\n `Index generated: ${totalFiles} files, ~${tokenEstimate.toLocaleString()} tokens`\n );\n\n return {\n content,\n fileCount: totalFiles,\n tokenEstimate,\n warnings,\n };\n}\n\n/**\n * Generate empty INDEX.md content\n */\nfunction generateEmptyIndex(): string {\n const timestamp = new Date().toISOString();\n return `# Context Index\n\n> Auto-generated by nocaap. Last updated: ${timestamp}\n\nNo packages configured. Run \\`nocaap setup\\` or \\`nocaap add <repo>\\` to add context packages.\n`;\n}\n\n/**\n * Generate INDEX.md markdown from package indexes\n */\nfunction generateIndexMarkdown(packages: PackageIndex[]): string {\n const timestamp = new Date().toISOString();\n\n const lines: string[] = [\n '# Context Index',\n '',\n `> Auto-generated by nocaap. Last updated: ${timestamp}`,\n '',\n ];\n\n // Add table of contents if multiple packages\n if (packages.length > 1) {\n lines.push('## Table of Contents');\n lines.push('');\n for (const pkg of packages) {\n // Create anchor-friendly ID (lowercase, hyphens)\n const anchorId = pkg.alias.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n lines.push(`- [${pkg.alias}](#${anchorId}) (${pkg.files.length} files)`);\n }\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n for (const pkg of packages) {\n // Package header\n lines.push(`## ${pkg.alias} (${pkg.files.length} files)`);\n lines.push('');\n\n for (const file of pkg.files) {\n // File entry\n lines.push(`### ${file.title}`);\n lines.push('');\n lines.push(`**Path:** \\`${file.relativePath}\\``);\n\n if (file.type) {\n lines.push(`**Type:** ${file.type}`);\n }\n\n if (file.tags && file.tags.length > 0) {\n lines.push(`**Tags:** ${file.tags.join(', ')}`);\n }\n\n lines.push('');\n lines.push(file.preview);\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n\n// =============================================================================\n// Index File Operations\n// =============================================================================\n\n/**\n * Generate and write INDEX.md file\n */\nexport async function writeIndex(projectRoot: string): Promise<IndexResult> {\n const result = await generateIndex(projectRoot);\n const indexPath = paths.getIndexPath(projectRoot);\n\n await fs.writeFile(indexPath, result.content, 'utf-8');\n log.debug(`Wrote INDEX.md to ${indexPath}`);\n\n return result;\n}\n\n/**\n * Read existing INDEX.md content\n */\nexport async function readIndex(projectRoot: string): Promise<string | null> {\n const indexPath = paths.getIndexPath(projectRoot);\n\n if (!(await paths.exists(indexPath))) {\n return null;\n }\n\n return fs.readFile(indexPath, 'utf-8');\n}\n\n/**\n * Generate and write INDEX.md with progress logging\n */\nexport async function generateIndexWithProgress(projectRoot: string): Promise<IndexResult> {\n log.info('Regenerating INDEX.md...');\n\n const result = await writeIndex(projectRoot);\n\n if (result.fileCount === 0) {\n log.warn('No documentation files found');\n } else {\n log.success(\n `Generated INDEX.md: ${result.fileCount} files, ~${result.tokenEstimate.toLocaleString()} tokens`\n );\n }\n\n // Log any warnings\n for (const warning of result.warnings) {\n log.warn(warning);\n }\n\n return result;\n}\n","/**\n * src/commands/setup.ts\n * Interactive setup wizard to configure context packages\n */\nimport { checkbox, input, confirm } from '@inquirer/prompts';\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner, style } from '../utils/logger.js';\nimport {\n initContextDir,\n configExists,\n readConfig,\n writeConfig,\n upsertPackage,\n updateLockEntry,\n updateClaudeMd,\n} from '../core/config.js';\nimport {\n getDefaultRegistry,\n setDefaultRegistry,\n} from '../core/global-config.js';\nimport { fetchRegistryWithImports } from '../core/registry.js';\nimport { checkAccess, sparseClone } from '../core/git-engine.js';\nimport { generateIndexWithProgress } from '../core/indexer.js';\nimport type { Registry, ContextEntry } from '../schemas/index.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SetupOptions {\n /** Registry URL to fetch contexts from */\n registry?: string;\n}\n\ninterface AccessCheckResult {\n context: ContextEntry;\n hasAccess: boolean;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_REGISTRY_PROMPT = 'Enter your organization\\'s registry URL:';\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Interactive setup wizard\n *\n * Flow:\n * 1. Get registry URL (from option or prompt)\n * 2. Fetch registry with federation support\n * 3. Check access to each context (SSH check)\n * 4. Display interactive selection\n * 5. Clone selected contexts\n * 6. Generate INDEX.md\n */\nexport async function setupCommand(options: SetupOptions): Promise<void> {\n const projectRoot = process.cwd();\n\n log.title('nocaap Setup Wizard');\n log.newline();\n\n // Check if already initialized\n if (await configExists(projectRoot)) {\n const config = await readConfig(projectRoot);\n if (config && config.packages.length > 0) {\n log.warn('nocaap is already configured in this project.');\n log.dim(` ${config.packages.length} package(s) installed`);\n log.newline();\n\n const shouldContinue = await confirm({\n message: 'Do you want to add more packages?',\n default: true,\n });\n\n if (!shouldContinue) {\n log.info('Setup cancelled.');\n return;\n }\n }\n }\n\n // Step 1: Get registry URL (from CLI option > global config > prompt)\n let registryUrl = options.registry;\n\n if (!registryUrl) {\n // Check global config / env var\n const defaultRegistry = await getDefaultRegistry();\n\n if (defaultRegistry) {\n log.info(`Using default registry: ${style.url(defaultRegistry)}`);\n log.dim('(from global config - run `nocaap config registry` to change)');\n log.newline();\n\n const useDefault = await confirm({\n message: 'Use this registry?',\n default: true,\n });\n\n if (useDefault) {\n registryUrl = defaultRegistry;\n }\n }\n }\n\n // If still no registry, prompt for it\n if (!registryUrl) {\n registryUrl = await input({\n message: DEFAULT_REGISTRY_PROMPT,\n validate: (value) => {\n if (!value.trim()) {\n return 'Registry URL is required';\n }\n try {\n new URL(value);\n return true;\n } catch {\n return 'Please enter a valid URL';\n }\n },\n });\n\n // Offer to save as default\n log.newline();\n const saveAsDefault = await confirm({\n message: 'Save this as your default registry?',\n default: true,\n });\n\n if (saveAsDefault) {\n await setDefaultRegistry(registryUrl);\n log.success('Saved to global config!');\n }\n }\n\n log.newline();\n\n // Step 2: Fetch registry\n const fetchSpinner = createSpinner('Fetching registry...').start();\n\n let registry: Registry;\n try {\n registry = await fetchRegistryWithImports(registryUrl);\n fetchSpinner.succeed(\n `Fetched registry: ${registry.contexts.length} context(s) available`\n );\n } catch (error) {\n fetchSpinner.fail('Failed to fetch registry');\n throw error;\n }\n\n if (registry.contexts.length === 0) {\n log.warn('No contexts found in registry.');\n return;\n }\n\n log.newline();\n\n // Step 3: Check access to each context\n const accessSpinner = createSpinner('Checking repository access...').start();\n\n const accessResults: AccessCheckResult[] = [];\n for (const context of registry.contexts) {\n const hasAccess = await checkAccess(context.repo);\n accessResults.push({ context, hasAccess });\n }\n\n const accessibleContexts = accessResults.filter((r) => r.hasAccess);\n const inaccessibleContexts = accessResults.filter((r) => !r.hasAccess);\n\n accessSpinner.succeed(\n `Access check complete: ${accessibleContexts.length} accessible, ${inaccessibleContexts.length} restricted`\n );\n\n if (inaccessibleContexts.length > 0) {\n log.newline();\n log.dim('Restricted contexts (no access):');\n for (const { context } of inaccessibleContexts) {\n log.dim(` - ${context.name}`);\n }\n }\n\n if (accessibleContexts.length === 0) {\n log.newline();\n log.error('No accessible contexts found. Check your SSH keys and permissions.');\n return;\n }\n\n log.newline();\n\n // Step 4: Interactive selection\n // Get already installed packages to mark them\n const currentConfig = await readConfig(projectRoot);\n const installedAliases = new Set(\n currentConfig?.packages.map(p => p.alias) ?? []\n );\n\n // Build choices with installed status\n const choices = accessibleContexts.map(({ context }) => {\n const alias = generateAlias(context);\n const isInstalled = installedAliases.has(alias);\n\n return {\n name: isInstalled\n ? `${formatContextChoice(context)} ${style.dim('[already installed]')}`\n : formatContextChoice(context),\n value: context.name,\n checked: false,\n disabled: isInstalled ? 'Already installed' : false,\n };\n });\n\n // Show count of already installed\n const installedCount = [...installedAliases].filter(alias =>\n accessibleContexts.some(({ context }) => generateAlias(context) === alias)\n ).length;\n\n if (installedCount > 0) {\n log.info(`${installedCount} package(s) already installed (shown as disabled)`);\n log.newline();\n }\n\n const selectedNames = await checkbox({\n message: 'Select contexts to install:',\n choices,\n pageSize: 15,\n });\n\n if (selectedNames.length === 0) {\n log.warn('No contexts selected. Setup cancelled.');\n return;\n }\n\n log.newline();\n\n // Step 5: Initialize .context/ directory\n if (!(await configExists(projectRoot))) {\n const initSpinner = createSpinner('Initializing .context/ directory...').start();\n await initContextDir(projectRoot);\n initSpinner.succeed('Initialized .context/ directory');\n }\n\n // Save registry URL to config\n const configToUpdate = (await readConfig(projectRoot)) ?? { packages: [] };\n configToUpdate.registryUrl = registryUrl;\n await writeConfig(projectRoot, configToUpdate);\n\n log.newline();\n\n // Step 6: Clone selected contexts\n log.info(`Installing ${selectedNames.length} context(s)...`);\n log.newline();\n\n let successCount = 0;\n let failCount = 0;\n\n for (const name of selectedNames) {\n const context = accessibleContexts.find((r) => r.context.name === name)?.context;\n if (!context) continue;\n\n const alias = generateAlias(context);\n\n // Double-check: skip if already installed\n if (installedAliases.has(alias)) {\n log.dim(`Skipping ${alias} (already installed)`);\n continue;\n }\n\n const spinner = createSpinner(`Installing ${style.bold(context.name)}...`).start();\n\n try {\n const targetDir = paths.getPackagePath(projectRoot, alias);\n\n const { commitHash } = await sparseClone({\n repoUrl: context.repo,\n targetDir,\n sparsePath: context.path,\n });\n\n // Update config\n await upsertPackage(projectRoot, {\n alias,\n source: context.repo,\n path: context.path,\n version: 'main',\n });\n\n // Update lockfile\n await updateLockEntry(projectRoot, alias, {\n commitHash,\n sparsePath: context.path || '',\n updatedAt: new Date().toISOString(),\n });\n\n spinner.succeed(`Installed ${context.name} → ${alias}`);\n successCount++;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n spinner.fail(`Failed to install ${context.name}: ${message}`);\n failCount++;\n }\n }\n\n log.newline();\n\n // Step 7: Generate INDEX.md\n if (successCount > 0) {\n await generateIndexWithProgress(projectRoot);\n }\n\n // Step 8: Offer CLAUDE.md integration\n if (successCount > 0) {\n log.newline();\n log.hr();\n log.newline();\n\n const addClaude = await confirm({\n message: 'Add nocaap reference to CLAUDE.md?',\n default: true,\n });\n\n if (addClaude) {\n const updated = await updateClaudeMd(projectRoot);\n if (updated) {\n log.success('Added nocaap reference to CLAUDE.md');\n } else {\n log.dim('CLAUDE.md already configured');\n }\n }\n }\n\n // Summary\n log.newline();\n log.hr();\n log.newline();\n\n if (successCount > 0) {\n log.success(`Setup complete! ${successCount} context(s) installed.`);\n log.newline();\n log.info('Next steps:');\n log.dim(' 1. Review .context/INDEX.md for available documentation');\n log.dim(' 2. Run `nocaap update` to pull latest changes');\n }\n\n if (failCount > 0) {\n log.newline();\n log.warn(`${failCount} context(s) failed to install.`);\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Format a context entry for display in the selection list\n */\nfunction formatContextChoice(context: ContextEntry): string {\n let display = context.name;\n\n if (context.description) {\n display += ` - ${context.description}`;\n }\n\n if (context.tags && context.tags.length > 0) {\n display += ` [${context.tags.join(', ')}]`;\n }\n\n return display;\n}\n\n/**\n * Generate a valid alias from a context entry\n * Prefers the leaf folder from path, falls back to name\n */\nfunction generateAlias(context: ContextEntry): string {\n // Prefer leaf folder from path (e.g., \"/capabilities\" -> \"capabilities\")\n if (context.path) {\n const leafFolder = context.path.split('/').filter(Boolean).pop();\n if (leafFolder) {\n return leafFolder\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 50);\n }\n }\n\n // Fallback to name\n return context.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with hyphens\n .replace(/^-+|-+$/g, '') // Remove leading/trailing hyphens\n .slice(0, 50); // Limit length\n}\n","/**\n * src/commands/add.ts\n * Add a context package from a Git repository\n */\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner } from '../utils/logger.js';\nimport {\n initContextDir,\n upsertPackage,\n updateLockEntry,\n configExists,\n} from '../core/config.js';\nimport { checkAccess, sparseClone } from '../core/git-engine.js';\nimport { generateIndexWithProgress } from '../core/indexer.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AddOptions {\n /** Sparse checkout path within the repo */\n path?: string;\n /** Local alias for the package */\n alias?: string;\n /** Branch or tag to checkout */\n branch?: string;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Extract a default alias from a Git URL\n * e.g., \"git@github.com:acme/docs.git\" -> \"docs\"\n * e.g., \"https://github.com/acme/my-standards\" -> \"my-standards\"\n */\nfunction extractAliasFromUrl(url: string): string {\n // Remove trailing .git\n const cleaned = url.replace(/\\.git$/, '');\n\n // Extract the last segment\n const segments = cleaned.split(/[/:]/);\n const lastSegment = segments[segments.length - 1];\n\n // Clean up any remaining characters\n return lastSegment?.replace(/[^a-zA-Z0-9-_]/g, '') || 'context';\n}\n\n/**\n * Generate alias from path or URL\n * Prefers leaf folder from path, falls back to URL extraction\n */\nfunction deriveAlias(url: string, path?: string): string {\n // Prefer leaf folder from path (e.g., \"/capabilities\" -> \"capabilities\")\n if (path) {\n const leafFolder = path.split('/').filter(Boolean).pop();\n if (leafFolder) {\n return leafFolder\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 50);\n }\n }\n // Fallback to URL extraction\n return extractAliasFromUrl(url);\n}\n\n/**\n * Validate alias format\n */\nfunction validateAlias(alias: string): boolean {\n // Must be alphanumeric with hyphens/underscores, 1-50 chars\n return /^[a-zA-Z0-9][a-zA-Z0-9-_]{0,49}$/.test(alias);\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Add a context package from a Git repository\n *\n * Flow:\n * 1. Validate inputs\n * 2. Check repository access\n * 3. Initialize .context/ if needed\n * 4. Clone with sparse checkout\n * 5. Update config and lockfile\n * 6. Regenerate INDEX.md\n */\nexport async function addCommand(\n repo: string,\n options: AddOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n // Derive alias from path (preferred) or URL if not provided\n const alias = options.alias || deriveAlias(repo, options.path);\n\n log.title('Adding context package');\n log.info(`Repository: ${repo}`);\n log.info(`Alias: ${alias}`);\n if (options.path) {\n log.info(`Path: ${options.path}`);\n }\n if (options.branch && options.branch !== 'main') {\n log.info(`Branch: ${options.branch}`);\n }\n log.newline();\n\n // Validate alias\n if (!validateAlias(alias)) {\n throw new Error(\n `Invalid alias '${alias}'. Must be alphanumeric (can include - or _), 1-50 characters.`\n );\n }\n\n // Step 1: Check repository access\n const accessSpinner = createSpinner('Checking repository access...').start();\n\n const hasAccess = await checkAccess(repo);\n if (!hasAccess) {\n accessSpinner.fail('Repository access denied');\n throw new Error(\n `Cannot access repository: ${repo}\\n` +\n 'Please check:\\n' +\n ' - The URL is correct\\n' +\n ' - You have SSH keys configured (for git@ URLs)\\n' +\n ' - You have read access to the repository'\n );\n }\n accessSpinner.succeed('Repository access confirmed');\n\n // Step 2: Initialize .context/ directory if needed\n if (!(await configExists(projectRoot))) {\n const initSpinner = createSpinner('Initializing .context/ directory...').start();\n await initContextDir(projectRoot);\n initSpinner.succeed('Initialized .context/ directory');\n }\n\n // Step 3: Clone the repository\n const targetDir = paths.getPackagePath(projectRoot, alias);\n const cloneSpinner = createSpinner('Cloning repository...').start();\n\n try {\n const { commitHash } = await sparseClone({\n repoUrl: repo,\n targetDir,\n sparsePath: options.path,\n branch: options.branch,\n });\n\n cloneSpinner.succeed(`Cloned to .context/packages/${alias}`);\n\n // Step 4: Update config\n const configSpinner = createSpinner('Updating configuration...').start();\n\n await upsertPackage(projectRoot, {\n alias,\n source: repo,\n path: options.path,\n version: options.branch || 'main',\n });\n\n // Step 5: Update lockfile\n await updateLockEntry(projectRoot, alias, {\n commitHash,\n sparsePath: options.path || '',\n updatedAt: new Date().toISOString(),\n });\n\n configSpinner.succeed('Configuration updated');\n\n // Step 6: Regenerate INDEX.md\n log.newline();\n await generateIndexWithProgress(projectRoot);\n\n // Done!\n log.newline();\n log.success(`Package '${alias}' added successfully!`);\n log.dim(` Location: .context/packages/${alias}`);\n log.dim(` Commit: ${commitHash.slice(0, 8)}`);\n } catch (error) {\n cloneSpinner.fail('Clone failed');\n throw error;\n }\n}\n","/**\n * src/commands/update.ts\n * Update context packages from remote repositories\n */\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner, style } from '../utils/logger.js';\nimport {\n readConfig,\n updateLockEntry,\n getLockEntry,\n} from '../core/config.js';\nimport {\n pull,\n getHeadCommit,\n isDirty,\n isGitRepo,\n} from '../core/git-engine.js';\nimport { generateIndexWithProgress } from '../core/indexer.js';\nimport type { PackageEntry } from '../schemas/index.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UpdateOptions {\n /** Force update even if clean */\n force?: boolean;\n}\n\ninterface UpdateResult {\n alias: string;\n status: 'updated' | 'up-to-date' | 'skipped' | 'error';\n oldCommit?: string;\n newCommit?: string;\n error?: string;\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Update context packages and regenerate index\n *\n * Flow:\n * 1. Read config and lockfile\n * 2. For each package (or specified alias):\n * a. Check if dirty (abort if dirty)\n * b. Pull latest changes\n * c. Update lockfile\n * 3. Regenerate INDEX.md\n */\nexport async function updateCommand(\n alias: string | undefined,\n options: UpdateOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n log.title('Updating context packages');\n\n // Read config\n const config = await readConfig(projectRoot);\n if (!config || config.packages.length === 0) {\n throw new Error(\n 'No packages configured. Run `nocaap setup` or `nocaap add <repo>` first.'\n );\n }\n\n // Filter to specific package if alias provided\n const packagesToUpdate = alias\n ? config.packages.filter((p) => p.alias === alias)\n : config.packages;\n\n if (alias && packagesToUpdate.length === 0) {\n throw new Error(`Package '${alias}' not found in configuration.`);\n }\n\n log.info(`Updating ${packagesToUpdate.length} package(s)...`);\n log.newline();\n\n // Update each package\n const results: UpdateResult[] = [];\n\n for (const pkg of packagesToUpdate) {\n const result = await updatePackage(projectRoot, pkg, options);\n results.push(result);\n }\n\n // Summary\n log.newline();\n log.hr();\n log.newline();\n\n const updated = results.filter((r) => r.status === 'updated');\n const upToDate = results.filter((r) => r.status === 'up-to-date');\n const skipped = results.filter((r) => r.status === 'skipped');\n const errors = results.filter((r) => r.status === 'error');\n\n if (updated.length > 0) {\n log.success(`${updated.length} package(s) updated`);\n for (const r of updated) {\n log.dim(` ${r.alias}: ${r.oldCommit?.slice(0, 8)} → ${r.newCommit?.slice(0, 8)}`);\n }\n }\n\n if (upToDate.length > 0) {\n log.info(`${upToDate.length} package(s) already up-to-date`);\n }\n\n if (skipped.length > 0) {\n log.warn(`${skipped.length} package(s) skipped`);\n for (const r of skipped) {\n log.dim(` ${r.alias}: ${r.error}`);\n }\n }\n\n if (errors.length > 0) {\n log.error(`${errors.length} package(s) failed`);\n for (const r of errors) {\n log.dim(` ${r.alias}: ${r.error}`);\n }\n }\n\n // Regenerate INDEX.md if any updates occurred\n if (updated.length > 0) {\n log.newline();\n await generateIndexWithProgress(projectRoot);\n }\n\n // Exit with error if any failures\n if (errors.length > 0) {\n throw new Error(`${errors.length} package(s) failed to update`);\n }\n}\n\n/**\n * Update a single package\n */\nasync function updatePackage(\n projectRoot: string,\n pkg: PackageEntry,\n options: UpdateOptions\n): Promise<UpdateResult> {\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n const spinner = createSpinner(`Updating ${style.bold(pkg.alias)}...`).start();\n\n try {\n // Check if package directory exists\n if (!(await paths.exists(packagePath))) {\n spinner.warn(`${pkg.alias}: Package directory not found`);\n return {\n alias: pkg.alias,\n status: 'skipped',\n error: 'Directory not found',\n };\n }\n\n // Check if it's a git repo\n if (!(await isGitRepo(packagePath))) {\n spinner.warn(`${pkg.alias}: Not a git repository`);\n return {\n alias: pkg.alias,\n status: 'skipped',\n error: 'Not a git repository',\n };\n }\n\n // Check for dirty state\n if (await isDirty(packagePath)) {\n spinner.warn(`${pkg.alias}: Has uncommitted changes`);\n return {\n alias: pkg.alias,\n status: 'skipped',\n error: 'Uncommitted changes (commit or discard first)',\n };\n }\n\n // Check for config drift (sparse path changed)\n const lockEntry = await getLockEntry(projectRoot, pkg.alias);\n if (lockEntry && lockEntry.sparsePath !== (pkg.path || '')) {\n spinner.warn(`${pkg.alias}: Sparse path changed in config`);\n log.dim(` Config: ${pkg.path || '(root)'}`);\n log.dim(` Locked: ${lockEntry.sparsePath || '(root)'}`);\n return {\n alias: pkg.alias,\n status: 'skipped',\n error: 'Sparse path changed (run `nocaap remove` then `nocaap add` to re-clone)',\n };\n }\n\n // Get current commit\n const oldCommit = await getHeadCommit(packagePath);\n\n // Pull latest\n const { commitHash: newCommit } = await pull(packagePath);\n\n // Check if actually updated\n if (oldCommit === newCommit && !options.force) {\n spinner.info(`${pkg.alias}: Already up-to-date`);\n return {\n alias: pkg.alias,\n status: 'up-to-date',\n oldCommit,\n newCommit,\n };\n }\n\n // Update lockfile\n await updateLockEntry(projectRoot, pkg.alias, {\n commitHash: newCommit,\n sparsePath: pkg.path || '',\n updatedAt: new Date().toISOString(),\n });\n\n spinner.succeed(`${pkg.alias}: Updated`);\n return {\n alias: pkg.alias,\n status: 'updated',\n oldCommit,\n newCommit,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n spinner.fail(`${pkg.alias}: Failed`);\n return {\n alias: pkg.alias,\n status: 'error',\n error: message,\n };\n }\n}\n","/**\n * src/commands/list.ts\n * List installed context packages\n */\nimport * as paths from '../utils/paths.js';\nimport { log, style } from '../utils/logger.js';\nimport { readConfig, readLockfile } from '../core/config.js';\nimport { isGitRepo, isDirty } from '../core/git-engine.js';\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * List all installed context packages with their status\n */\nexport async function listCommand(): Promise<void> {\n const projectRoot = process.cwd();\n\n // Read config and lockfile\n const config = await readConfig(projectRoot);\n const lockfile = await readLockfile(projectRoot);\n\n if (!config || config.packages.length === 0) {\n log.info('No packages installed.');\n log.dim('Run `nocaap setup` or `nocaap add <repo>` to get started.');\n return;\n }\n\n log.title('Installed Packages');\n\n if (config.registryUrl) {\n log.dim(`Registry: ${config.registryUrl}`);\n log.newline();\n }\n\n for (const pkg of config.packages) {\n const lock = lockfile[pkg.alias];\n const commit = lock?.commitHash?.slice(0, 8) ?? 'unknown';\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n\n // Check package status\n let statusIndicator = style.success('●');\n let statusText = '';\n\n if (!(await paths.exists(packagePath))) {\n statusIndicator = style.error('○');\n statusText = ' (missing)';\n } else if (await isGitRepo(packagePath)) {\n try {\n if (await isDirty(packagePath)) {\n statusIndicator = style.warn('●');\n statusText = ' (modified)';\n }\n } catch {\n // Ignore errors checking dirty state\n }\n }\n\n // Display package info\n log.plain(`${statusIndicator} ${style.bold(pkg.alias)}${statusText}`);\n log.dim(` Source: ${pkg.source}`);\n if (pkg.path) {\n log.dim(` Path: ${pkg.path}`);\n }\n log.dim(` Branch: ${pkg.version || 'main'}`);\n log.dim(` Commit: ${commit}`);\n if (lock?.updatedAt) {\n const updated = new Date(lock.updatedAt).toLocaleDateString();\n log.dim(` Updated: ${updated}`);\n }\n log.newline();\n }\n\n // Summary\n log.hr();\n log.dim(`${config.packages.length} package(s) installed`);\n}\n\n","/**\n * src/commands/remove.ts\n * Remove a context package\n */\nimport { confirm } from '@inquirer/prompts';\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner } from '../utils/logger.js';\nimport {\n removePackage as removePackageFromConfig,\n removeLockEntry,\n getPackage,\n} from '../core/config.js';\nimport { isDirty, isGitRepo } from '../core/git-engine.js';\nimport { generateIndexWithProgress } from '../core/indexer.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RemoveOptions {\n /** Force removal even if dirty */\n force?: boolean;\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Remove a context package\n *\n * Flow:\n * 1. Verify package exists in config\n * 2. Check for uncommitted changes (unless --force)\n * 3. Remove package directory\n * 4. Remove from config and lockfile\n * 5. Regenerate INDEX.md\n */\nexport async function removeCommand(\n alias: string,\n options: RemoveOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n log.title('Removing context package');\n\n // Check if package exists in config\n const pkg = await getPackage(projectRoot, alias);\n if (!pkg) {\n throw new Error(\n `Package '${alias}' not found in configuration.\\n` +\n 'Run `nocaap list` to see installed packages.'\n );\n }\n\n log.info(`Package: ${alias}`);\n log.dim(` Source: ${pkg.source}`);\n if (pkg.path) {\n log.dim(` Path: ${pkg.path}`);\n }\n log.newline();\n\n const packagePath = paths.getPackagePath(projectRoot, alias);\n\n // Check for dirty state (unless --force)\n if (!options.force && (await paths.exists(packagePath))) {\n if (await isGitRepo(packagePath)) {\n try {\n if (await isDirty(packagePath)) {\n log.warn('Package has uncommitted changes.');\n log.newline();\n\n const shouldContinue = await confirm({\n message: 'Remove anyway? Local changes will be lost.',\n default: false,\n });\n\n if (!shouldContinue) {\n log.info('Removal cancelled.');\n return;\n }\n }\n } catch {\n // Ignore errors checking dirty state\n }\n }\n }\n\n // Remove package directory\n const dirSpinner = createSpinner('Removing package directory...').start();\n\n try {\n if (await paths.exists(packagePath)) {\n // Use fs.remove directly to bypass dirty check (we already confirmed)\n const fs = await import('fs-extra');\n await fs.default.remove(packagePath);\n }\n dirSpinner.succeed('Removed package directory');\n } catch (error) {\n dirSpinner.fail('Failed to remove directory');\n throw error;\n }\n\n // Remove from config\n const configSpinner = createSpinner('Updating configuration...').start();\n\n try {\n await removePackageFromConfig(projectRoot, alias);\n await removeLockEntry(projectRoot, alias);\n configSpinner.succeed('Configuration updated');\n } catch (error) {\n configSpinner.fail('Failed to update configuration');\n throw error;\n }\n\n // Regenerate INDEX.md\n log.newline();\n await generateIndexWithProgress(projectRoot);\n\n // Done!\n log.newline();\n log.success(`Package '${alias}' removed successfully.`);\n}\n\n","/**\n * src/core/settings.ts\n * Resolves merged configuration from all sources\n * Priority: CLI overrides > Project config > Global config > Defaults\n */\nimport {\n getGlobalPushSettings,\n getGlobalEmbeddingSettings,\n} from './global-config.js';\nimport {\n getSearchSettings,\n getPushSettings,\n getIndexSettings,\n} from './config.js';\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ResolvedSearchSettings {\n fulltextWeight: number;\n vectorWeight: number;\n rrfK: number;\n}\n\nexport interface ResolvedPushSettings {\n baseBranch?: string;\n}\n\nexport interface ResolvedEmbeddingSettings {\n provider: 'ollama' | 'openai' | 'tfjs' | 'auto';\n ollamaModel: string;\n ollamaBaseUrl: string;\n}\n\nexport interface ResolvedIndexSettings {\n semantic: boolean;\n provider: 'ollama' | 'openai' | 'tfjs' | 'auto';\n}\n\nexport interface ResolvedSettings {\n search: ResolvedSearchSettings;\n push: ResolvedPushSettings;\n embedding: ResolvedEmbeddingSettings;\n index: ResolvedIndexSettings;\n}\n\n/** Partial version for CLI overrides */\nexport interface SettingsOverrides {\n search?: Partial<ResolvedSearchSettings>;\n push?: Partial<ResolvedPushSettings>;\n embedding?: Partial<ResolvedEmbeddingSettings>;\n index?: Partial<ResolvedIndexSettings>;\n}\n\n// =============================================================================\n// Default Values\n// =============================================================================\n\nconst DEFAULTS: ResolvedSettings = {\n search: {\n fulltextWeight: 0.4,\n vectorWeight: 0.6,\n rrfK: 60,\n },\n push: {},\n embedding: {\n provider: 'auto',\n ollamaModel: 'nomic-embed-text',\n ollamaBaseUrl: 'http://localhost:11434',\n },\n index: {\n semantic: false,\n provider: 'auto',\n },\n};\n\n/**\n * Get the default settings (useful for reference)\n */\nexport function getDefaults(): ResolvedSettings {\n return structuredClone(DEFAULTS);\n}\n\n// =============================================================================\n// Settings Resolver\n// =============================================================================\n\n/**\n * Resolve all settings by merging: defaults < global < project < cli overrides\n */\nexport async function resolveSettings(\n projectRoot: string,\n cliOverrides?: SettingsOverrides\n): Promise<ResolvedSettings> {\n log.debug('Resolving settings...');\n\n // Start with defaults\n const resolved = structuredClone(DEFAULTS);\n\n // Layer 1: Global config (embedding and push only)\n const globalPush = await getGlobalPushSettings();\n const globalEmbedding = await getGlobalEmbeddingSettings();\n\n if (globalPush?.baseBranch) {\n resolved.push.baseBranch = globalPush.baseBranch;\n log.debug(`Using global push.baseBranch: ${globalPush.baseBranch}`);\n }\n\n if (globalEmbedding) {\n if (globalEmbedding.provider) {\n resolved.embedding.provider = globalEmbedding.provider;\n }\n if (globalEmbedding.ollamaModel) {\n resolved.embedding.ollamaModel = globalEmbedding.ollamaModel;\n }\n if (globalEmbedding.ollamaBaseUrl) {\n resolved.embedding.ollamaBaseUrl = globalEmbedding.ollamaBaseUrl;\n }\n log.debug('Applied global embedding settings');\n }\n\n // Layer 2: Project config\n const projectSearch = await getSearchSettings(projectRoot);\n const projectPush = await getPushSettings(projectRoot);\n const projectIndex = await getIndexSettings(projectRoot);\n\n if (projectSearch) {\n if (projectSearch.fulltextWeight !== undefined) {\n resolved.search.fulltextWeight = projectSearch.fulltextWeight;\n }\n if (projectSearch.vectorWeight !== undefined) {\n resolved.search.vectorWeight = projectSearch.vectorWeight;\n }\n if (projectSearch.rrfK !== undefined) {\n resolved.search.rrfK = projectSearch.rrfK;\n }\n log.debug('Applied project search settings');\n }\n\n if (projectPush?.baseBranch) {\n resolved.push.baseBranch = projectPush.baseBranch;\n log.debug(`Using project push.baseBranch: ${projectPush.baseBranch}`);\n }\n\n if (projectIndex) {\n if (projectIndex.semantic !== undefined) {\n resolved.index.semantic = projectIndex.semantic;\n }\n if (projectIndex.provider !== undefined) {\n resolved.index.provider = projectIndex.provider;\n }\n log.debug('Applied project index settings');\n }\n\n // Layer 3: CLI overrides (highest priority)\n if (cliOverrides) {\n applyOverrides(resolved, cliOverrides);\n log.debug('Applied CLI overrides');\n }\n\n return resolved;\n}\n\n// =============================================================================\n// Convenience Resolvers\n// =============================================================================\n\n/**\n * Resolve just search settings (for search-engine.ts)\n */\nexport async function resolveSearchSettings(\n projectRoot: string,\n cliOverrides?: Partial<ResolvedSearchSettings>\n): Promise<ResolvedSearchSettings> {\n const all = await resolveSettings(projectRoot, cliOverrides ? { search: cliOverrides } : undefined);\n return all.search;\n}\n\n/**\n * Resolve just embedding settings (for embeddings.ts)\n */\nexport async function resolveEmbeddingSettings(\n projectRoot: string,\n cliOverrides?: Partial<ResolvedEmbeddingSettings>\n): Promise<ResolvedEmbeddingSettings> {\n const all = await resolveSettings(projectRoot, cliOverrides ? { embedding: cliOverrides } : undefined);\n return all.embedding;\n}\n\n/**\n * Resolve just push settings\n */\nexport async function resolvePushSettings(\n projectRoot: string,\n cliOverrides?: Partial<ResolvedPushSettings>\n): Promise<ResolvedPushSettings> {\n const all = await resolveSettings(projectRoot, cliOverrides ? { push: cliOverrides } : undefined);\n return all.push;\n}\n\n/**\n * Resolve just index settings\n */\nexport async function resolveIndexSettings(\n projectRoot: string,\n cliOverrides?: Partial<ResolvedIndexSettings>\n): Promise<ResolvedIndexSettings> {\n const all = await resolveSettings(projectRoot, cliOverrides ? { index: cliOverrides } : undefined);\n return all.index;\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\n/**\n * Apply CLI overrides to resolved settings (mutates target)\n */\nfunction applyOverrides(\n target: ResolvedSettings,\n overrides: SettingsOverrides\n): void {\n if (overrides.search) {\n if (overrides.search.fulltextWeight !== undefined) {\n target.search.fulltextWeight = overrides.search.fulltextWeight;\n }\n if (overrides.search.vectorWeight !== undefined) {\n target.search.vectorWeight = overrides.search.vectorWeight;\n }\n if (overrides.search.rrfK !== undefined) {\n target.search.rrfK = overrides.search.rrfK;\n }\n }\n\n if (overrides.push) {\n if (overrides.push.baseBranch !== undefined) {\n target.push.baseBranch = overrides.push.baseBranch;\n }\n }\n\n if (overrides.embedding) {\n if (overrides.embedding.provider !== undefined) {\n target.embedding.provider = overrides.embedding.provider;\n }\n if (overrides.embedding.ollamaModel !== undefined) {\n target.embedding.ollamaModel = overrides.embedding.ollamaModel;\n }\n if (overrides.embedding.ollamaBaseUrl !== undefined) {\n target.embedding.ollamaBaseUrl = overrides.embedding.ollamaBaseUrl;\n }\n }\n\n if (overrides.index) {\n if (overrides.index.semantic !== undefined) {\n target.index.semantic = overrides.index.semantic;\n }\n if (overrides.index.provider !== undefined) {\n target.index.provider = overrides.index.provider;\n }\n }\n}\n","/**\n * src/commands/config.ts\n * Manage nocaap configuration (global and project)\n */\nimport { log, style } from '../utils/logger.js';\nimport {\n getGlobalConfig,\n setGlobalConfig,\n getGlobalConfigPath,\n} from '../core/global-config.js';\nimport { readConfig, writeConfig, configExists } from '../core/config.js';\nimport { resolveSettings } from '../core/settings.js';\nimport * as paths from '../utils/paths.js';\nimport type { GlobalConfig } from '../schemas/index.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ConfigOptions {\n list?: boolean;\n global?: boolean;\n project?: boolean;\n}\n\n// Valid config keys with their descriptions\nconst CONFIG_KEYS: Record<string, { scope: 'global' | 'project' | 'both'; desc: string }> = {\n 'registry': { scope: 'global', desc: 'Default registry URL' },\n 'push.baseBranch': { scope: 'both', desc: 'Default PR target branch' },\n 'embedding.provider': { scope: 'global', desc: 'Embedding provider (ollama|openai|tfjs|auto)' },\n 'embedding.ollamaModel': { scope: 'global', desc: 'Ollama model name' },\n 'embedding.ollamaBaseUrl': { scope: 'global', desc: 'Ollama server URL' },\n 'search.fulltextWeight': { scope: 'project', desc: 'BM25 weight (0-1)' },\n 'search.vectorWeight': { scope: 'project', desc: 'Vector weight (0-1)' },\n 'search.rrfK': { scope: 'project', desc: 'RRF smoothing constant' },\n 'index.semantic': { scope: 'project', desc: 'Enable semantic indexing by default' },\n 'index.provider': { scope: 'project', desc: 'Index embedding provider' },\n};\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * View or set configuration\n *\n * Usage:\n * nocaap config - Show all config (alias for list)\n * nocaap config list - Show all config\n * nocaap config list --global - Show global config only\n * nocaap config list --project - Show project config only\n * nocaap config get <key> - Get a specific value\n * nocaap config set <key> <value> - Set a value (global by default)\n * nocaap config set --project <k> <v> - Set project-level value\n * nocaap config unset <key> - Remove a value\n */\nexport async function configCommand(\n key: string | undefined,\n value: string | undefined,\n options: ConfigOptions\n): Promise<void> {\n // If --list flag or no arguments, show all config\n if (options.list || !key) {\n await showConfig(options);\n return;\n }\n\n // Handle subcommands\n switch (key) {\n case 'list':\n await showConfig(options);\n break;\n case 'get':\n if (!value) {\n log.error('Usage: nocaap config get <key>');\n showAvailableKeys();\n return;\n }\n await getConfigValue(value);\n break;\n case 'set':\n // value is actually the key in this case, we need to get the real value\n log.error('Usage: nocaap config set <key> <value>');\n log.dim('Example: nocaap config set push.baseBranch develop');\n break;\n case 'unset':\n if (!value) {\n log.error('Usage: nocaap config unset <key>');\n showAvailableKeys();\n return;\n }\n await unsetConfigValue(value, options);\n break;\n default:\n // Assume key=value format: nocaap config push.baseBranch develop\n if (value !== undefined) {\n await setConfigValue(key, value, options);\n } else {\n await getConfigValue(key);\n }\n }\n}\n\n/**\n * Handle \"nocaap config set <key> <value>\" via index.ts\n */\nexport async function configSetCommand(\n key: string,\n value: string,\n options: ConfigOptions\n): Promise<void> {\n await setConfigValue(key, value, options);\n}\n\n// =============================================================================\n// Config Operations\n// =============================================================================\n\n/**\n * Show all configuration\n */\nasync function showConfig(options: ConfigOptions): Promise<void> {\n const projectRoot = process.cwd();\n const showGlobal = !options.project;\n const showProject = !options.global;\n\n log.title('Configuration');\n log.newline();\n\n // Global config\n if (showGlobal) {\n const globalPath = getGlobalConfigPath();\n log.info(style.bold('Global') + style.dim(` (${globalPath})`));\n\n const globalConfig = await getGlobalConfig();\n if (Object.keys(globalConfig).length === 0) {\n log.dim(' (empty)');\n } else {\n printConfigObject(globalConfig, ' ');\n }\n log.newline();\n }\n\n // Project config\n if (showProject) {\n const hasProject = await configExists(projectRoot);\n const projectPath = paths.getConfigPath(projectRoot);\n\n log.info(style.bold('Project') + style.dim(` (${projectPath})`));\n\n if (!hasProject) {\n log.dim(' (no project config - run nocaap setup first)');\n } else {\n const projectConfig = await readConfig(projectRoot);\n if (projectConfig) {\n // Show only the settings fields, not packages\n const { search, push, index } = projectConfig;\n const settings = { search, push, index };\n const hasSettings = Object.values(settings).some(v => v !== undefined);\n\n if (hasSettings) {\n printConfigObject(settings, ' ');\n } else {\n log.dim(' (no settings configured)');\n }\n }\n }\n log.newline();\n }\n\n // Show effective settings if both scopes shown\n if (showGlobal && showProject) {\n try {\n const resolved = await resolveSettings(projectRoot);\n log.info(style.bold('Effective Settings') + style.dim(' (merged)'));\n printConfigObject(resolved as unknown as Record<string, unknown>, ' ');\n } catch {\n // Project may not exist\n }\n }\n}\n\n/**\n * Get a specific config value\n */\nasync function getConfigValue(key: string): Promise<void> {\n const projectRoot = process.cwd();\n\n // Validate key\n if (!CONFIG_KEYS[key] && key !== 'registry') {\n log.error(`Unknown config key: ${style.code(key)}`);\n showAvailableKeys();\n return;\n }\n\n // Get effective value from resolved settings\n try {\n const resolved = await resolveSettings(projectRoot);\n const value = getNestedValue(resolved as unknown as Record<string, unknown>, key);\n\n if (value !== undefined) {\n log.info(`${key}: ${formatValue(value)}`);\n } else {\n log.info(`${key}: ${style.dim('(not set)')}`);\n }\n } catch {\n // Try global config only\n const globalConfig = await getGlobalConfig();\n const value = getNestedValue(globalConfig, key);\n\n if (value !== undefined) {\n log.info(`${key}: ${formatValue(value)}`);\n } else {\n log.info(`${key}: ${style.dim('(not set)')}`);\n }\n }\n}\n\n/**\n * Set a config value\n */\nasync function setConfigValue(\n key: string,\n value: string,\n options: ConfigOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n // Validate key\n const keyInfo = CONFIG_KEYS[key];\n if (!keyInfo && key !== 'registry') {\n log.error(`Unknown config key: ${style.code(key)}`);\n showAvailableKeys();\n return;\n }\n\n // Determine scope\n const scope = options.project ? 'project' : 'global';\n\n // Validate scope\n if (keyInfo && scope === 'project' && keyInfo.scope === 'global') {\n log.error(`Key '${key}' can only be set globally.`);\n log.dim('Run without --project flag.');\n return;\n }\n if (keyInfo && scope === 'global' && keyInfo.scope === 'project') {\n log.error(`Key '${key}' can only be set at project level.`);\n log.dim('Use --project flag.');\n return;\n }\n\n // Parse and validate value\n const parsedValue = parseValue(key, value);\n\n if (scope === 'global') {\n await setGlobalValue(key, parsedValue);\n log.success(`Set ${style.code(key)} = ${formatValue(parsedValue)} (global)`);\n } else {\n await setProjectValue(projectRoot, key, parsedValue);\n log.success(`Set ${style.code(key)} = ${formatValue(parsedValue)} (project)`);\n }\n}\n\n/**\n * Unset a config value\n */\nasync function unsetConfigValue(key: string, options: ConfigOptions): Promise<void> {\n const projectRoot = process.cwd();\n const scope = options.project ? 'project' : 'global';\n\n if (scope === 'global') {\n const config = await getGlobalConfig();\n deleteNestedValue(config, key);\n await setGlobalConfig(config);\n log.success(`Removed ${style.code(key)} from global config`);\n } else {\n const config = await readConfig(projectRoot);\n if (config) {\n deleteNestedValue(config, key);\n await writeConfig(projectRoot, config);\n log.success(`Removed ${style.code(key)} from project config`);\n } else {\n log.warn('No project config found');\n }\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Set a value in global config\n */\nasync function setGlobalValue(key: string, value: unknown): Promise<void> {\n const config = await getGlobalConfig();\n\n // Handle registry specially for backward compatibility\n if (key === 'registry') {\n config.defaultRegistry = value as string;\n } else {\n setNestedValue(config, key, value);\n }\n\n await setGlobalConfig(config);\n}\n\n/**\n * Set a value in project config\n */\nasync function setProjectValue(projectRoot: string, key: string, value: unknown): Promise<void> {\n const config = await readConfig(projectRoot);\n\n if (!config) {\n log.error('No project config found. Run `nocaap setup` first.');\n return;\n }\n\n setNestedValue(config, key, value);\n await writeConfig(projectRoot, config);\n}\n\n/**\n * Parse a string value to appropriate type\n */\nfunction parseValue(key: string, value: string): unknown {\n // Boolean\n if (value === 'true') return true;\n if (value === 'false') return false;\n\n // Number (for weights and rrfK)\n if (key.includes('Weight') || key === 'search.rrfK') {\n const num = parseFloat(value);\n if (isNaN(num)) {\n throw new Error(`Invalid number: ${value}`);\n }\n // Validate range for weights\n if (key.includes('Weight') && (num < 0 || num > 1)) {\n throw new Error(`Weight must be between 0 and 1`);\n }\n return num;\n }\n\n return value;\n}\n\n/**\n * Format a value for display\n */\nfunction formatValue(value: unknown): string {\n if (typeof value === 'string') return style.code(value);\n if (typeof value === 'number') return style.code(value.toString());\n if (typeof value === 'boolean') return style.code(value ? 'true' : 'false');\n return String(value);\n}\n\n/**\n * Get nested value from object using dot notation\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n // Handle registry alias\n if (path === 'registry') {\n return (obj as GlobalConfig).defaultRegistry;\n }\n\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Set nested value in object using dot notation\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (!(part in current) || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1]!;\n current[lastPart] = value;\n}\n\n/**\n * Delete nested value from object using dot notation\n */\nfunction deleteNestedValue(obj: Record<string, unknown>, path: string): void {\n const parts = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (!(part in current) || typeof current[part] !== 'object') {\n return; // Path doesn't exist\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1]!;\n delete current[lastPart];\n}\n\n/**\n * Print a config object recursively\n */\nfunction printConfigObject(obj: Record<string, unknown>, indent: string): void {\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n log.info(`${indent}${style.bold(key)}:`);\n printConfigObject(value as Record<string, unknown>, indent + ' ');\n } else {\n log.info(`${indent}${key}: ${formatValue(value)}`);\n }\n }\n}\n\n/**\n * Show available config keys\n */\nfunction showAvailableKeys(): void {\n log.newline();\n log.info('Available keys:');\n for (const [key, info] of Object.entries(CONFIG_KEYS)) {\n const scopeTag = info.scope === 'both' ? '' : ` [${info.scope}]`;\n log.dim(` ${key}${scopeTag} - ${info.desc}`);\n }\n}\n","/**\n * src/utils/providers.ts\n * Git provider detection and URL parsing utilities\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type Provider = 'github' | 'gitlab' | 'bitbucket' | 'unknown';\n\nexport interface RepoInfo {\n provider: Provider;\n owner: string;\n repo: string;\n}\n\n// =============================================================================\n// Provider Detection\n// =============================================================================\n\n/**\n * Detect the Git provider from a repository URL\n */\nexport function detectProvider(url: string): Provider {\n const normalized = url.toLowerCase();\n\n if (normalized.includes('github.com') || normalized.includes('github:')) {\n return 'github';\n }\n if (normalized.includes('gitlab.com') || normalized.includes('gitlab:')) {\n return 'gitlab';\n }\n if (normalized.includes('bitbucket.org') || normalized.includes('bitbucket:')) {\n return 'bitbucket';\n }\n\n return 'unknown';\n}\n\n// =============================================================================\n// URL Parsing\n// =============================================================================\n\n/**\n * Parse a Git URL into provider, owner, and repo components\n *\n * Supports:\n * - git@github.com:owner/repo.git\n * - https://github.com/owner/repo.git\n * - https://github.com/owner/repo\n */\nexport function parseRepoInfo(url: string): RepoInfo {\n const provider = detectProvider(url);\n\n // Remove trailing .git\n const cleaned = url.replace(/\\.git$/, '');\n\n // Try SSH format: git@provider:owner/repo\n const sshMatch = cleaned.match(/git@[^:]+:([^/]+)\\/(.+)/);\n if (sshMatch && sshMatch[1] && sshMatch[2]) {\n return {\n provider,\n owner: sshMatch[1],\n repo: sshMatch[2],\n };\n }\n\n // Try HTTPS format: https://provider/owner/repo\n const httpsMatch = cleaned.match(/https?:\\/\\/[^/]+\\/([^/]+)\\/(.+)/);\n if (httpsMatch && httpsMatch[1] && httpsMatch[2]) {\n return {\n provider,\n owner: httpsMatch[1],\n repo: httpsMatch[2],\n };\n }\n\n // Fallback: return empty strings\n return {\n provider,\n owner: '',\n repo: '',\n };\n}\n\n// =============================================================================\n// PR URL Generation\n// =============================================================================\n\n/**\n * Build a \"create PR\" URL for manual browser navigation\n * Used as fallback when gh CLI and API are unavailable\n */\nexport function buildNewPrUrl(info: RepoInfo, branch: string, baseBranch: string = 'main'): string {\n const { provider, owner, repo } = info;\n\n switch (provider) {\n case 'github':\n // GitHub compare URL that opens PR creation\n return `https://github.com/${owner}/${repo}/compare/${baseBranch}...${branch}?expand=1`;\n\n case 'gitlab':\n // GitLab merge request creation URL (target_branch is the base)\n return `https://gitlab.com/${owner}/${repo}/-/merge_requests/new?merge_request[source_branch]=${branch}&merge_request[target_branch]=${baseBranch}`;\n\n case 'bitbucket':\n // Bitbucket PR creation URL\n return `https://bitbucket.org/${owner}/${repo}/pull-requests/new?source=${branch}&dest=${baseBranch}`;\n\n default:\n // Generic fallback - just return the repo URL\n return `https://github.com/${owner}/${repo}`;\n }\n}\n\n/**\n * Build a direct link to an existing PR\n */\nexport function buildPrLink(info: RepoInfo, prNumber: number): string {\n const { provider, owner, repo } = info;\n\n switch (provider) {\n case 'github':\n return `https://github.com/${owner}/${repo}/pull/${prNumber}`;\n\n case 'gitlab':\n return `https://gitlab.com/${owner}/${repo}/-/merge_requests/${prNumber}`;\n\n case 'bitbucket':\n return `https://bitbucket.org/${owner}/${repo}/pull-requests/${prNumber}`;\n\n default:\n return '';\n }\n}\n","/**\n * src/core/github.ts\n * GitHub PR creation utilities with cascading fallbacks\n */\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { log } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type PrMethod = 'gh' | 'api' | 'manual';\n\nexport interface PrResult {\n /** The PR URL if created successfully */\n url: string | null;\n /** The method that was used */\n method: PrMethod;\n /** Whether the PR was created successfully */\n success: boolean;\n /** Error message if failed */\n error?: string;\n}\n\n// =============================================================================\n// Detection\n// =============================================================================\n\n/**\n * Check if the gh CLI is available and authenticated\n */\nexport async function isGhAvailable(): Promise<boolean> {\n try {\n await execAsync('gh auth status');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if GITHUB_TOKEN environment variable is set\n */\nexport function hasGitHubToken(): boolean {\n return Boolean(process.env.GITHUB_TOKEN);\n}\n\n/**\n * Detect the best available method for PR creation\n */\nexport async function detectPrMethod(): Promise<PrMethod> {\n // Try gh CLI first (best UX)\n if (await isGhAvailable()) {\n log.debug('gh CLI available and authenticated');\n return 'gh';\n }\n\n // Try GitHub API via token\n if (hasGitHubToken()) {\n log.debug('GITHUB_TOKEN available for API');\n return 'api';\n }\n\n // Fallback to manual URL\n log.debug('No automated PR method available, will use manual URL');\n return 'manual';\n}\n\n// =============================================================================\n// PR Creation via gh CLI\n// =============================================================================\n\n/**\n * Create a PR using the gh CLI\n * Requires gh to be installed and authenticated\n *\n * @param repoDir - The local repository directory (temp clone)\n * @param branch - The branch name for the PR\n * @param title - The PR title\n * @param body - The PR body/description\n * @returns The PR URL if successful, null otherwise\n */\nexport async function createPrViaGh(\n repoDir: string,\n branch: string,\n title: string,\n body: string\n): Promise<string | null> {\n log.debug(`Creating PR via gh CLI in ${repoDir}`);\n\n try {\n // gh pr create outputs the PR URL on success\n const { stdout } = await execAsync(\n `gh pr create --title \"${escapeShell(title)}\" --body \"${escapeShell(body)}\" --head \"${branch}\"`,\n { cwd: repoDir }\n );\n\n const url = stdout.trim();\n log.debug(`PR created via gh: ${url}`);\n return url;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`gh pr create failed: ${message}`);\n return null;\n }\n}\n\n// =============================================================================\n// PR Creation via GitHub API\n// =============================================================================\n\n/**\n * Create a PR using the GitHub REST API\n * Requires GITHUB_TOKEN environment variable\n *\n * @param owner - Repository owner\n * @param repo - Repository name\n * @param branch - The head branch for the PR\n * @param baseBranch - The base branch (usually main)\n * @param title - The PR title\n * @param body - The PR body/description\n * @returns The PR URL if successful, null otherwise\n */\nexport async function createPrViaApi(\n owner: string,\n repo: string,\n branch: string,\n baseBranch: string,\n title: string,\n body: string\n): Promise<string | null> {\n const token = process.env.GITHUB_TOKEN;\n if (!token) {\n log.debug('No GITHUB_TOKEN available for API');\n return null;\n }\n\n log.debug(`Creating PR via GitHub API for ${owner}/${repo}`);\n\n try {\n const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/pulls`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n body: JSON.stringify({\n title,\n body,\n head: branch,\n base: baseBranch,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n log.debug(`GitHub API error: ${response.status} - ${JSON.stringify(errorData)}`);\n return null;\n }\n\n const data = (await response.json()) as { html_url?: string };\n const url = data.html_url || null;\n\n if (url) {\n log.debug(`PR created via API: ${url}`);\n }\n\n return url;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`GitHub API request failed: ${message}`);\n return null;\n }\n}\n\n// =============================================================================\n// Cascading PR Creation\n// =============================================================================\n\nexport interface CreatePrOptions {\n /** Local repository directory (temp clone) */\n repoDir: string;\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Feature branch name */\n branch: string;\n /** Base branch (usually main) */\n baseBranch: string;\n /** PR title */\n title: string;\n /** PR body/description */\n body: string;\n /** Manual PR URL for fallback */\n manualUrl: string;\n}\n\n/**\n * Create a PR using the best available method\n * Cascades: gh CLI → GitHub API → manual URL\n */\nexport async function createPr(options: CreatePrOptions): Promise<PrResult> {\n const method = await detectPrMethod();\n\n switch (method) {\n case 'gh': {\n const url = await createPrViaGh(\n options.repoDir,\n options.branch,\n options.title,\n options.body\n );\n\n if (url) {\n return { url, method: 'gh', success: true };\n }\n\n // gh failed, try API\n log.debug('gh CLI failed, trying GitHub API');\n if (hasGitHubToken()) {\n const apiUrl = await createPrViaApi(\n options.owner,\n options.repo,\n options.branch,\n options.baseBranch,\n options.title,\n options.body\n );\n\n if (apiUrl) {\n return { url: apiUrl, method: 'api', success: true };\n }\n }\n\n // Both failed, return manual URL\n return {\n url: options.manualUrl,\n method: 'manual',\n success: false,\n error: 'Could not create PR automatically. Please create it manually.',\n };\n }\n\n case 'api': {\n const url = await createPrViaApi(\n options.owner,\n options.repo,\n options.branch,\n options.baseBranch,\n options.title,\n options.body\n );\n\n if (url) {\n return { url, method: 'api', success: true };\n }\n\n // API failed, return manual URL\n return {\n url: options.manualUrl,\n method: 'manual',\n success: false,\n error: 'Could not create PR via API. Please create it manually.',\n };\n }\n\n case 'manual':\n default:\n return {\n url: options.manualUrl,\n method: 'manual',\n success: false,\n error: 'No automated PR creation method available.',\n };\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Escape a string for safe use in shell commands\n */\nfunction escapeShell(str: string): string {\n return str.replace(/\"/g, '\\\\\"').replace(/\\$/g, '\\\\$').replace(/`/g, '\\\\`');\n}\n","/**\n * src/commands/push.ts\n * Push local context changes back upstream as a PR\n */\nimport { checkbox } from '@inquirer/prompts';\nimport fs from 'fs-extra';\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner, style } from '../utils/logger.js';\nimport { readConfig, readLockfile } from '../core/config.js';\nimport { resolvePushSettings } from '../core/settings.js';\nimport {\n cloneToTemp,\n getRemoteCommitHash,\n createBranch,\n commitAll,\n pushBranch,\n getDefaultBranch,\n} from '../core/git-engine.js';\nimport { parseRepoInfo, buildNewPrUrl } from '../utils/providers.js';\nimport { createPr } from '../core/github.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface PushOptions {\n /** Custom commit message */\n message?: string;\n /** Push all packages with changes */\n all?: boolean;\n}\n\ninterface PackageInfo {\n alias: string;\n source: string;\n path?: string;\n localCommit: string;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Get the date string for branch naming (YYYYMMDD)\n */\nfunction getDateString(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}${month}${day}`;\n}\n\n/**\n * Generate branch name: nocaap/{alias}-{YYYYMMDD}\n */\nfunction generateBranchName(alias: string): string {\n return `nocaap/${alias}-${getDateString()}`;\n}\n\n/**\n * Check if a package has local changes by comparing directory contents\n * Since we flatten the sparse checkout, we compare against a fresh clone\n */\nasync function _hasLocalChanges(\n packagePath: string,\n _repoUrl: string,\n _sparsePath?: string\n): Promise<boolean> {\n // For now, we do a simple check: if the package directory exists and has files\n // A more sophisticated check would compare file hashes\n // For MVP, we assume any package might have changes and let git diff handle it\n return paths.exists(packagePath);\n}\n\n/**\n * Get list of all configured packages with their info\n */\nasync function getAllPackages(projectRoot: string): Promise<PackageInfo[]> {\n const config = await readConfig(projectRoot);\n const lockfile = await readLockfile(projectRoot);\n\n if (!config) {\n return [];\n }\n\n return config.packages.map((pkg) => ({\n alias: pkg.alias,\n source: pkg.source,\n path: pkg.path,\n localCommit: lockfile[pkg.alias]?.commitHash || '',\n }));\n}\n\n/**\n * Interactive package picker for push\n */\nasync function selectPackagesToPush(packages: PackageInfo[]): Promise<string[]> {\n if (packages.length === 0) {\n return [];\n }\n\n const choices = packages.map((pkg) => ({\n name: `${pkg.alias} (${pkg.source})`,\n value: pkg.alias,\n checked: false,\n }));\n\n const selected = await checkbox({\n message: 'Select packages to push:',\n choices,\n pageSize: 15,\n });\n\n return selected;\n}\n\n// =============================================================================\n// Single Package Push\n// =============================================================================\n\n/**\n * Push a single package to upstream\n */\nasync function pushSinglePackage(\n projectRoot: string,\n pkg: PackageInfo,\n commitMessage: string\n): Promise<{ success: boolean; prUrl?: string; error?: string }> {\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n const branchName = generateBranchName(pkg.alias);\n const repoInfo = parseRepoInfo(pkg.source);\n\n // Resolve push settings (uses configured baseBranch if set, otherwise auto-detect)\n const pushSettings = await resolvePushSettings(projectRoot);\n const baseBranch = pushSettings.baseBranch ?? await getDefaultBranch(pkg.source);\n log.debug(`Using base branch: ${baseBranch}`);\n\n // Step 1: Check for upstream divergence\n const checkSpinner = createSpinner('Checking upstream...').start();\n\n try {\n const remoteCommit = await getRemoteCommitHash(pkg.source, baseBranch);\n\n if (remoteCommit !== pkg.localCommit) {\n checkSpinner.fail('Upstream has diverged');\n return {\n success: false,\n error: `Upstream has changed. Run 'nocaap update ${pkg.alias}' first.`,\n };\n }\n checkSpinner.succeed('Upstream in sync');\n } catch (error) {\n checkSpinner.fail('Failed to check upstream');\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { success: false, error: msg };\n }\n\n // Step 2: Clone to temp\n const cloneSpinner = createSpinner('Cloning upstream...').start();\n let tempDir: string;\n let cleanup: () => Promise<void>;\n\n try {\n const result = await cloneToTemp(pkg.source, baseBranch);\n tempDir = result.tempDir;\n cleanup = result.cleanup;\n cloneSpinner.succeed('Cloned to temp directory');\n } catch (error) {\n cloneSpinner.fail('Clone failed');\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { success: false, error: msg };\n }\n\n try {\n // Step 3: Create feature branch\n const branchSpinner = createSpinner('Creating branch...').start();\n await createBranch(tempDir, branchName);\n branchSpinner.succeed(`Created branch: ${branchName}`);\n\n // Step 4: Copy files to sparse path location\n const copySpinner = createSpinner('Copying changes...').start();\n const targetPath = pkg.path\n ? paths.join(tempDir, pkg.path.replace(/^\\/+/, ''))\n : tempDir;\n\n // Ensure target directory exists and copy files\n await paths.ensureDir(targetPath);\n\n // Copy all files from package to target (excluding .git)\n const items = await fs.readdir(packagePath);\n for (const item of items) {\n if (item === '.git') continue;\n const srcPath = paths.join(packagePath, item);\n const destPath = paths.join(targetPath, item);\n await fs.copy(srcPath, destPath, { overwrite: true });\n }\n copySpinner.succeed('Changes copied');\n\n // Step 5: Commit\n const commitSpinner = createSpinner('Committing...').start();\n try {\n await commitAll(tempDir, commitMessage);\n commitSpinner.succeed('Changes committed');\n } catch (error) {\n // If commit fails (no changes), that's actually a success case\n const msg = error instanceof Error ? error.message : '';\n if (msg.includes('nothing to commit')) {\n commitSpinner.warn('No changes to commit');\n await cleanup();\n return { success: true, error: 'No changes detected' };\n }\n throw error;\n }\n\n // Step 6: Push\n const pushSpinner = createSpinner('Pushing to remote...').start();\n try {\n await pushBranch(tempDir, branchName);\n pushSpinner.succeed('Pushed to remote');\n } catch (error) {\n pushSpinner.fail('Push failed');\n throw error;\n }\n\n // Step 7: Create PR\n const prSpinner = createSpinner('Creating PR...').start();\n const manualUrl = buildNewPrUrl(repoInfo, branchName, baseBranch);\n\n const prResult = await createPr({\n repoDir: tempDir,\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n branch: branchName,\n baseBranch,\n title: `Update ${pkg.alias} context via nocaap`,\n body: `This PR was created automatically by nocaap.\\n\\n**Commit message:** ${commitMessage}`,\n manualUrl,\n });\n\n if (prResult.success) {\n prSpinner.succeed('PR created');\n } else {\n prSpinner.warn('PR not created automatically');\n }\n\n // Cleanup\n await cleanup();\n\n return {\n success: true,\n prUrl: prResult.url || manualUrl,\n };\n } catch (error) {\n // Cleanup on error\n await cleanup();\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { success: false, error: msg };\n }\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Push command - push local changes to upstream as a PR\n *\n * Variants:\n * - nocaap push → Interactive picker\n * - nocaap push <alias> → Push specific package\n * - nocaap push --all → Push all packages\n */\nexport async function pushCommand(\n alias: string | undefined,\n options: PushOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n log.title('nocaap Push');\n log.newline();\n\n // Get all configured packages\n const allPackages = await getAllPackages(projectRoot);\n\n if (allPackages.length === 0) {\n log.error('No packages configured. Run `nocaap setup` or `nocaap add` first.');\n return;\n }\n\n // Determine which packages to push\n let packagesToPush: PackageInfo[];\n\n if (options.all) {\n // Push all packages\n packagesToPush = allPackages;\n log.info(`Pushing all ${packagesToPush.length} package(s)...`);\n } else if (alias) {\n // Push specific package\n const pkg = allPackages.find((p) => p.alias === alias);\n if (!pkg) {\n log.error(`Package '${alias}' not found in config.`);\n log.dim('Available packages:');\n for (const p of allPackages) {\n log.dim(` - ${p.alias}`);\n }\n return;\n }\n packagesToPush = [pkg];\n } else {\n // Interactive picker\n log.info('Select packages to push:');\n log.newline();\n\n const selectedAliases = await selectPackagesToPush(allPackages);\n\n if (selectedAliases.length === 0) {\n log.warn('No packages selected. Push cancelled.');\n return;\n }\n\n packagesToPush = allPackages.filter((p) => selectedAliases.includes(p.alias));\n }\n\n log.newline();\n\n // Default commit message\n const defaultMessage =\n packagesToPush.length === 1 && packagesToPush[0]\n ? `Update ${packagesToPush[0].alias} context via nocaap`\n : 'Update context via nocaap';\n\n const commitMessage = options.message || defaultMessage;\n\n // Push each package\n const results: Array<{ alias: string; success: boolean; prUrl?: string; error?: string }> = [];\n\n for (const pkg of packagesToPush) {\n log.hr();\n log.newline();\n log.info(`Pushing ${style.bold(pkg.alias)}...`);\n log.dim(` Source: ${pkg.source}`);\n if (pkg.path) {\n log.dim(` Path: ${pkg.path}`);\n }\n log.newline();\n\n const result = await pushSinglePackage(projectRoot, pkg, commitMessage);\n results.push({ alias: pkg.alias, ...result });\n\n if (result.success && result.prUrl) {\n log.newline();\n log.success(`PR created for ${pkg.alias}:`);\n log.info(` ${style.url(result.prUrl)}`);\n } else if (result.error) {\n log.newline();\n log.error(`Failed: ${result.error}`);\n }\n }\n\n // Summary\n log.newline();\n log.hr();\n log.newline();\n\n const successCount = results.filter((r) => r.success).length;\n const failCount = results.filter((r) => !r.success).length;\n\n if (successCount > 0) {\n log.success(`${successCount} package(s) pushed successfully.`);\n\n // List PR URLs\n const withPrs = results.filter((r) => r.success && r.prUrl);\n if (withPrs.length > 0) {\n log.newline();\n log.info('Pull Requests:');\n for (const r of withPrs) {\n log.dim(` ${r.alias}: ${r.prUrl}`);\n }\n }\n }\n\n if (failCount > 0) {\n log.newline();\n log.warn(`${failCount} package(s) failed.`);\n for (const r of results.filter((r) => !r.success)) {\n log.dim(` ${r.alias}: ${r.error}`);\n }\n }\n}\n","/**\n * src/core/vector-store.ts\n * LanceDB wrapper for vector storage and search\n */\nimport fs from 'fs-extra';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\nimport type { EmbeddingMetadata } from './embeddings.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface VectorChunk {\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n vector: number[];\n}\n\nexport interface VectorResult {\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n score: number;\n}\n\ninterface StoredVectorMetadata {\n embedding: EmbeddingMetadata;\n chunkCount: number;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst VECTOR_DIR = 'vectors.lance';\nconst VECTOR_TABLE = 'chunks';\nconst METADATA_FILE = 'vector-metadata.json';\n\n// =============================================================================\n// Vector Store Class\n// =============================================================================\n\nexport class VectorStore {\n private db: unknown = null;\n private table: unknown = null;\n private projectRoot: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n }\n\n /**\n * Get the vector store directory path\n */\n private getVectorPath(): string {\n return paths.join(paths.getContextDir(this.projectRoot), VECTOR_DIR);\n }\n\n /**\n * Get the metadata file path\n */\n private getMetadataPath(): string {\n return paths.join(paths.getContextDir(this.projectRoot), METADATA_FILE);\n }\n\n /**\n * Check if a vector index exists\n */\n async exists(): Promise<boolean> {\n return paths.exists(this.getVectorPath());\n }\n\n /**\n * Initialize the vector store connection\n */\n async initialize(): Promise<boolean> {\n const vectorPath = this.getVectorPath();\n\n if (!(await paths.exists(vectorPath))) {\n log.debug('No vector index found');\n return false;\n }\n\n try {\n // Dynamic import for optional dependency\n const lancedb = await import('@lancedb/lancedb');\n this.db = await lancedb.connect(vectorPath);\n\n // Check if table exists\n const tableNames = await (this.db as { tableNames(): Promise<string[]> }).tableNames();\n if (tableNames.includes(VECTOR_TABLE)) {\n this.table = await (this.db as { openTable(name: string): Promise<unknown> }).openTable(VECTOR_TABLE);\n log.debug('Loaded existing vector index');\n return true;\n }\n\n return false;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to initialize vector store: ${message}`);\n return false;\n }\n }\n\n /**\n * Create a new vector index from chunks\n */\n async createIndex(chunks: VectorChunk[], metadata: EmbeddingMetadata): Promise<void> {\n const vectorPath = this.getVectorPath();\n\n try {\n // Dynamic import for optional dependency\n const lancedb = await import('@lancedb/lancedb');\n\n // Remove existing index if present\n if (await paths.exists(vectorPath)) {\n await fs.remove(vectorPath);\n }\n\n // Connect to new database\n this.db = await lancedb.connect(vectorPath);\n\n // Create table with chunks\n this.table = await (this.db as { createTable(name: string, data: unknown[]): Promise<unknown> })\n .createTable(VECTOR_TABLE, chunks);\n\n // Save metadata\n const storedMetadata: StoredVectorMetadata = {\n embedding: metadata,\n chunkCount: chunks.length,\n };\n await fs.writeJson(this.getMetadataPath(), storedMetadata, { spaces: 2 });\n\n log.debug(`Created vector index with ${chunks.length} chunks`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to create vector index: ${message}`);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(queryVector: number[], limit: number = 10): Promise<VectorResult[]> {\n if (!this.table) {\n throw new Error('Vector store not initialized');\n }\n\n try {\n // LanceDB vector search\n const results = await (this.table as {\n vectorSearch(vector: number[]): {\n limit(n: number): { toArray(): Promise<Array<{\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n _distance?: number;\n }>> };\n };\n }).vectorSearch(queryVector).limit(limit).toArray();\n\n return results.map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n title: r.title,\n // Convert distance to similarity score (lower distance = higher similarity)\n score: r._distance ? 1 / (1 + r._distance) : 1,\n }));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Vector search failed: ${message}`);\n }\n }\n\n /**\n * Get stored metadata\n */\n async getMetadata(): Promise<StoredVectorMetadata | null> {\n const metadataPath = this.getMetadataPath();\n\n if (!(await paths.exists(metadataPath))) {\n return null;\n }\n\n try {\n return await fs.readJson(metadataPath);\n } catch {\n return null;\n }\n }\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get the vector store directory path\n */\nexport function getVectorStorePath(projectRoot: string): string {\n return paths.join(paths.getContextDir(projectRoot), VECTOR_DIR);\n}\n\n/**\n * Check if a vector index exists\n */\nexport async function vectorIndexExists(projectRoot: string): Promise<boolean> {\n return paths.exists(getVectorStorePath(projectRoot));\n}\n","/**\n * src/core/embeddings.ts\n * Embedding provider detection and generation for semantic search\n */\nimport { log } from '../utils/logger.js';\nimport type { ResolvedEmbeddingSettings } from './settings.js';\n\n// =============================================================================\n// Module State\n// =============================================================================\n\n/** Embedding settings injected from config (or defaults) */\nlet embeddingSettings: ResolvedEmbeddingSettings | null = null;\n\n/**\n * Set embedding settings from configuration\n * Should be called before generating embeddings\n */\nexport function setEmbeddingSettings(settings: ResolvedEmbeddingSettings): void {\n embeddingSettings = settings;\n log.debug(`Embedding settings: provider=${settings.provider}, model=${settings.ollamaModel}`);\n}\n\n/**\n * Get the configured Ollama base URL (or default)\n */\nfunction getOllamaBaseUrl(): string {\n return embeddingSettings?.ollamaBaseUrl ?? 'http://localhost:11434';\n}\n\n/**\n * Get the configured Ollama model (or default)\n */\nfunction getOllamaModel(): string {\n return embeddingSettings?.ollamaModel ?? PROVIDER_CONFIG.ollama.model;\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type EmbeddingProvider = 'ollama' | 'openai' | 'tfjs' | 'auto';\n\nexport interface EmbeddingResult {\n vectors: number[][];\n model: string;\n dimensions: number;\n provider: EmbeddingProvider;\n}\n\nexport interface EmbeddingMetadata {\n provider: EmbeddingProvider;\n model: string;\n dimensions: number;\n createdAt: string;\n}\n\n// =============================================================================\n// Provider Configuration\n// =============================================================================\n\nconst PROVIDER_CONFIG = {\n ollama: {\n model: 'nomic-embed-text',\n dimensions: 768,\n batchSize: 50,\n },\n openai: {\n model: 'text-embedding-3-small',\n dimensions: 1536,\n batchSize: 100,\n },\n tfjs: {\n model: 'Xenova/all-MiniLM-L6-v2',\n dimensions: 384,\n batchSize: 32,\n },\n} as const;\n\n// =============================================================================\n// Provider Detection\n// =============================================================================\n\n/**\n * Detect the best available embedding provider\n * Priority: Ollama → OpenAI → Transformers.js\n */\nexport async function detectProvider(): Promise<Exclude<EmbeddingProvider, 'auto'>> {\n // 1. Check for Ollama\n if (await isOllamaAvailable()) {\n log.debug('Detected Ollama with embedding model');\n return 'ollama';\n }\n\n // 2. Check for OpenAI API key\n if (process.env.OPENAI_API_KEY) {\n log.debug('Detected OpenAI API key');\n return 'openai';\n }\n\n // 3. Fall back to Transformers.js\n log.debug('Using Transformers.js embeddings (fallback)');\n return 'tfjs';\n}\n\n/**\n * Check if Ollama is running with an embedding model\n */\nasync function isOllamaAvailable(): Promise<boolean> {\n try {\n const baseUrl = getOllamaBaseUrl();\n const response = await fetch(`${baseUrl}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n\n if (!response.ok) return false;\n\n const data = await response.json() as { models?: Array<{ name: string }> };\n const hasEmbedModel = data.models?.some((m) =>\n m.name.includes('nomic-embed') ||\n m.name.includes('mxbai-embed') ||\n m.name.includes('all-minilm')\n );\n\n return hasEmbedModel ?? false;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// Embedding Generation\n// =============================================================================\n\n/**\n * Generate embeddings for an array of texts\n */\nexport async function generateEmbeddings(\n texts: string[],\n provider: EmbeddingProvider\n): Promise<EmbeddingResult> {\n const resolvedProvider = provider === 'auto' ? await detectProvider() : provider;\n\n log.debug(`Generating ${texts.length} embeddings with ${resolvedProvider}`);\n\n switch (resolvedProvider) {\n case 'ollama':\n return generateOllamaEmbeddings(texts);\n case 'openai':\n return generateOpenAIEmbeddings(texts);\n case 'tfjs':\n return generateTfjsEmbeddings(texts);\n default:\n throw new Error(`Unknown provider: ${resolvedProvider}`);\n }\n}\n\n/**\n * Generate a single embedding for a query\n */\nexport async function generateQueryEmbedding(\n query: string,\n provider: EmbeddingProvider\n): Promise<number[]> {\n const result = await generateEmbeddings([query], provider);\n return result.vectors[0]!;\n}\n\n// =============================================================================\n// Ollama Provider\n// =============================================================================\n\nasync function generateOllamaEmbeddings(texts: string[]): Promise<EmbeddingResult> {\n const config = PROVIDER_CONFIG.ollama;\n const model = getOllamaModel();\n const vectors: number[][] = [];\n\n // Process in batches\n for (let i = 0; i < texts.length; i += config.batchSize) {\n const batch = texts.slice(i, i + config.batchSize);\n\n try {\n // Dynamic import to handle optional dependency\n const ollama = await import('ollama');\n const response = await ollama.default.embed({\n model,\n input: batch,\n });\n\n vectors.push(...response.embeddings);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Ollama embedding failed: ${message}`);\n }\n }\n\n return {\n vectors,\n model,\n dimensions: config.dimensions,\n provider: 'ollama',\n };\n}\n\n// =============================================================================\n// OpenAI Provider\n// =============================================================================\n\nasync function generateOpenAIEmbeddings(texts: string[]): Promise<EmbeddingResult> {\n const config = PROVIDER_CONFIG.openai;\n const apiKey = process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error('OPENAI_API_KEY environment variable is required');\n }\n\n const vectors: number[][] = [];\n\n // Process in batches\n for (let i = 0; i < texts.length; i += config.batchSize) {\n const batch = texts.slice(i, i + config.batchSize);\n\n const response = await fetch('https://api.openai.com/v1/embeddings', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: config.model,\n input: batch,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI embedding failed: ${error}`);\n }\n\n const data = await response.json() as {\n data: Array<{ embedding: number[] }>;\n };\n\n vectors.push(...data.data.map((d) => d.embedding));\n }\n\n return {\n vectors,\n model: config.model,\n dimensions: config.dimensions,\n provider: 'openai',\n };\n}\n\n// =============================================================================\n// Transformers.js Provider\n// =============================================================================\n\nasync function generateTfjsEmbeddings(texts: string[]): Promise<EmbeddingResult> {\n const config = PROVIDER_CONFIG.tfjs;\n\n try {\n // Dynamic import for Transformers.js\n const { pipeline } = await import('@xenova/transformers');\n\n // Initialize the embedding pipeline\n const embedder = await pipeline('feature-extraction', config.model);\n\n const vectors: number[][] = [];\n\n // Process in batches\n for (let i = 0; i < texts.length; i += config.batchSize) {\n const batch = texts.slice(i, i + config.batchSize);\n\n for (const text of batch) {\n const output = await embedder(text, {\n pooling: 'mean',\n normalize: true,\n });\n\n // Extract the embedding vector\n vectors.push(Array.from(output.data as Float32Array));\n }\n }\n\n return {\n vectors,\n model: config.model,\n dimensions: config.dimensions,\n provider: 'tfjs',\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Transformers.js embedding failed: ${message}`);\n }\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get provider configuration\n */\nexport function getProviderConfig(provider: Exclude<EmbeddingProvider, 'auto'>) {\n return PROVIDER_CONFIG[provider];\n}\n","/**\n * src/core/fusion.ts\n * Reciprocal Rank Fusion (RRF) algorithm for combining search results\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RankedResult {\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n score: number;\n}\n\nexport interface FusionResult {\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n score: number;\n sources: {\n fulltext?: number;\n vector?: number;\n };\n}\n\n/** Configuration options for RRF */\nexport interface RRFOptions {\n /** Smoothing constant (default: 60, empirically optimal) */\n k?: number;\n /** Weight for fulltext/BM25 results (default: 0.4) */\n fulltextWeight?: number;\n /** Weight for vector/semantic results (default: 0.6) */\n vectorWeight?: number;\n}\n\n// =============================================================================\n// Reciprocal Rank Fusion\n// =============================================================================\n\n/**\n * Combine BM25 (full-text) and vector search results using weighted RRF\n *\n * Formula: RRF(d) = Σ weight * (1/(k + rank(d)))\n *\n * Where k is a constant (typically 60) that controls how much higher-ranked\n * documents are weighted relative to lower-ranked ones.\n *\n * RRF is rank-based (not score-based) which makes it robust to different\n * scoring scales between BM25 and vector similarity.\n *\n * @param fulltextResults - Results from BM25 full-text search\n * @param vectorResults - Results from vector similarity search\n * @param options - RRF configuration options\n * @returns Combined and re-ranked results\n */\nexport function reciprocalRankFusion(\n fulltextResults: RankedResult[],\n vectorResults: RankedResult[],\n options: RRFOptions = {}\n): FusionResult[] {\n const { k = 60, fulltextWeight = 0.4, vectorWeight = 0.6 } = options;\n\n const scores = new Map<string, {\n score: number;\n doc: RankedResult;\n sources: { fulltext?: number; vector?: number };\n }>();\n\n // Process fulltext results WITH weight\n fulltextResults.forEach((doc, rank) => {\n const rrfScore = fulltextWeight * (1 / (k + rank + 1));\n const existing = scores.get(doc.id);\n\n if (existing) {\n existing.score += rrfScore;\n existing.sources.fulltext = rank + 1;\n } else {\n scores.set(doc.id, {\n score: rrfScore,\n doc,\n sources: { fulltext: rank + 1 },\n });\n }\n });\n\n // Process vector results WITH weight\n vectorResults.forEach((doc, rank) => {\n const rrfScore = vectorWeight * (1 / (k + rank + 1));\n const existing = scores.get(doc.id);\n\n if (existing) {\n existing.score += rrfScore;\n existing.sources.vector = rank + 1;\n } else {\n scores.set(doc.id, {\n score: rrfScore,\n doc,\n sources: { vector: rank + 1 },\n });\n }\n });\n\n // Sort by combined score (descending)\n return Array.from(scores.values())\n .sort((a, b) => b.score - a.score)\n .map(({ doc, score, sources }) => ({\n id: doc.id,\n content: doc.content,\n path: doc.path,\n package: doc.package,\n title: doc.title,\n score,\n sources,\n }));\n}\n\n/**\n * Normalize scores to 0-1 range\n */\nexport function normalizeScores(results: FusionResult[]): FusionResult[] {\n if (results.length === 0) return results;\n\n const maxScore = Math.max(...results.map((r) => r.score));\n if (maxScore === 0) return results;\n\n return results.map((r) => ({\n ...r,\n score: r.score / maxScore,\n }));\n}\n","/**\n * src/core/search-engine.ts\n * Orama-based search engine for full-text search over context packages\n * Extended with hybrid search (BM25 + vector) via Reciprocal Rank Fusion\n */\nimport fs from 'fs-extra';\nimport { create, insertMultiple, search, type Orama } from '@orama/orama';\nimport { persist, restore } from '@orama/plugin-data-persistence';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\nimport type { Chunk } from './chunker.js';\nimport { VectorStore } from './vector-store.js';\nimport { generateQueryEmbedding, type EmbeddingProvider } from './embeddings.js';\nimport { reciprocalRankFusion, normalizeScores, type RankedResult } from './fusion.js';\nimport { resolveSearchSettings, type ResolvedSearchSettings } from './settings.js';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Search index file name */\nexport const SEARCH_INDEX_FILE = 'index.orama.json';\n\n/** Default search limit */\nconst DEFAULT_LIMIT = 10;\n\n/** Index version for future compatibility */\nconst INDEX_VERSION = '1.0.0';\n\n/** Default RRF settings (used when settings can't be resolved) */\nconst DEFAULT_SEARCH_SETTINGS: ResolvedSearchSettings = {\n fulltextWeight: 0.4,\n vectorWeight: 0.6,\n rrfK: 60,\n};\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Orama document schema matching our chunks */\ninterface OramaDocument {\n id: string;\n content: string;\n path: string;\n package: string;\n headings: string[];\n title: string;\n summary: string;\n type: string;\n tags: string[];\n}\n\n/** Search result type */\nexport interface SearchResult {\n id: string;\n content: string;\n path: string;\n package: string;\n headings: string[];\n title: string;\n score: number;\n}\n\n/** Search mode for hybrid search */\nexport type SearchMode = 'fulltext' | 'semantic' | 'hybrid';\n\n/** Hybrid search result with source info */\nexport interface HybridSearchResult extends SearchResult {\n sources?: {\n fulltext?: number;\n vector?: number;\n };\n}\n\n/** Index metadata for versioning */\ninterface IndexMetadata {\n version: string;\n createdAt: string;\n chunkCount: number;\n packages: string[];\n}\n\n/** Stored index format */\ninterface StoredIndex {\n metadata: IndexMetadata;\n data: unknown;\n}\n\n// =============================================================================\n// Schema Definition\n// =============================================================================\n\nconst oramaSchema = {\n id: 'string',\n content: 'string',\n path: 'string',\n package: 'string',\n headings: 'string[]',\n title: 'string',\n summary: 'string',\n type: 'string',\n tags: 'string[]',\n} as const;\n\n// =============================================================================\n// Query Processing Helpers\n// =============================================================================\n\n/** Stop words to exclude from path matching */\nconst STOP_WORDS = new Set([\n 'what', 'is', 'the', 'a', 'an', 'how', 'do', 'does', 'are', 'was',\n 'were', 'been', 'being', 'have', 'has', 'had', 'having', 'who',\n 'which', 'where', 'when', 'why', 'can', 'could', 'would', 'should',\n 'of', 'on', 'in', 'to', 'for', 'with', 'by', 'from', 'at', 'about',\n]);\n\n/**\n * Extract meaningful keywords from query for path boosting\n */\nfunction extractQueryKeywords(query: string): string[] {\n return query\n .toLowerCase()\n .split(/\\s+/)\n .filter(word => word.length > 2 && !STOP_WORDS.has(word));\n}\n\n// =============================================================================\n// Search Engine Class\n// =============================================================================\n\nexport class SearchEngine {\n private db: Orama<typeof oramaSchema> | null = null;\n private metadata: IndexMetadata | null = null;\n private vectorStore: VectorStore | null = null;\n private projectRoot: string | null = null;\n private embeddingProvider: EmbeddingProvider = 'auto';\n private searchSettings: ResolvedSearchSettings = DEFAULT_SEARCH_SETTINGS;\n\n /**\n * Check if the search engine has been initialized\n */\n isInitialized(): boolean {\n return this.db !== null;\n }\n\n /**\n * Create a new search index from chunks\n */\n async createIndex(chunks: Chunk[]): Promise<void> {\n log.debug(`Creating search index with ${chunks.length} chunks`);\n\n this.db = await create({ schema: oramaSchema });\n\n // Convert chunks to Orama documents\n const documents: OramaDocument[] = chunks.map((chunk) => ({\n id: chunk.id,\n content: chunk.content,\n path: chunk.path,\n package: chunk.package,\n headings: chunk.headings,\n title: chunk.metadata.title,\n summary: chunk.metadata.summary ?? '',\n type: chunk.metadata.type ?? '',\n tags: chunk.metadata.tags,\n }));\n\n // Batch insert for performance\n await insertMultiple(this.db, documents, 500);\n\n // Extract unique packages\n const packages = [...new Set(chunks.map((c) => c.package))];\n\n this.metadata = {\n version: INDEX_VERSION,\n createdAt: new Date().toISOString(),\n chunkCount: chunks.length,\n packages,\n };\n\n log.debug(`Search index created with ${chunks.length} documents`);\n }\n\n /**\n * Save the index to a JSON file\n */\n async saveIndex(projectRoot: string): Promise<void> {\n if (!this.db || !this.metadata) {\n throw new Error('No index to save. Call createIndex first.');\n }\n\n const indexPath = paths.join(paths.getContextDir(projectRoot), SEARCH_INDEX_FILE);\n\n // Persist database to JSON format\n const data = await persist(this.db, 'json');\n\n const storedIndex: StoredIndex = {\n metadata: this.metadata,\n data,\n };\n\n await fs.writeJson(indexPath, storedIndex, { spaces: 2 });\n log.debug(`Saved search index to ${indexPath}`);\n }\n\n /**\n * Load an existing index from file\n */\n async loadIndex(projectRoot: string): Promise<boolean> {\n const indexPath = paths.join(paths.getContextDir(projectRoot), SEARCH_INDEX_FILE);\n this.projectRoot = projectRoot;\n\n if (!(await paths.exists(indexPath))) {\n log.debug('No existing search index found');\n return false;\n }\n\n try {\n const storedIndex: StoredIndex = await fs.readJson(indexPath);\n\n // Restore database from JSON (type assertion is safe since we created with same schema)\n this.db = await restore('json', storedIndex.data as string) as Orama<typeof oramaSchema>;\n this.metadata = storedIndex.metadata;\n\n log.debug(`Loaded search index: ${this.metadata.chunkCount} chunks`);\n\n // Try to initialize vector store if it exists\n await this.initializeVectorStore();\n\n // Load search settings from config\n try {\n this.searchSettings = await resolveSearchSettings(projectRoot);\n log.debug(`Search settings: fulltext=${this.searchSettings.fulltextWeight}, vector=${this.searchSettings.vectorWeight}, k=${this.searchSettings.rrfK}`);\n } catch {\n log.debug('Could not resolve search settings, using defaults');\n this.searchSettings = DEFAULT_SEARCH_SETTINGS;\n }\n\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to load search index: ${message}`);\n return false;\n }\n }\n\n /**\n * Initialize the vector store if available\n */\n private async initializeVectorStore(): Promise<boolean> {\n if (!this.projectRoot) return false;\n\n try {\n const store = new VectorStore(this.projectRoot);\n const initialized = await store.initialize();\n\n if (initialized) {\n this.vectorStore = store;\n const metadata = await store.getMetadata();\n if (metadata) {\n this.embeddingProvider = metadata.embedding.provider;\n log.debug(`Loaded vector store (${metadata.embedding.model})`);\n }\n return true;\n }\n\n // No vector index found\n this.vectorStore = null;\n return false;\n } catch {\n log.debug('Vector store not available');\n this.vectorStore = null;\n return false;\n }\n }\n\n /**\n * Check if vector search is available\n */\n hasVectorSearch(): boolean {\n return this.vectorStore !== null;\n }\n\n /**\n * Search the index\n */\n async search(options: {\n query: string;\n packages?: string[];\n tags?: string[];\n limit?: number;\n }): Promise<SearchResult[]> {\n if (!this.db) {\n throw new Error('Search engine not initialized. Call loadIndex or createIndex first.');\n }\n\n const { query, packages, tags, limit = DEFAULT_LIMIT } = options;\n\n // Build filter if needed\n let where: Record<string, unknown> | undefined;\n\n if (packages?.length || tags?.length) {\n where = {};\n if (packages?.length) {\n where.package = packages;\n }\n if (tags?.length) {\n where.tags = { containsAll: tags };\n }\n }\n\n const results = await search(this.db, {\n term: query,\n properties: ['content', 'title', 'summary', 'headings'],\n limit,\n where,\n });\n\n return results.hits.map((hit) => ({\n id: hit.document.id,\n content: hit.document.content,\n path: hit.document.path,\n package: hit.document.package,\n headings: hit.document.headings,\n title: hit.document.title,\n score: hit.score,\n }));\n }\n\n /**\n * Get index metadata\n */\n getMetadata(): IndexMetadata | null {\n return this.metadata;\n }\n\n /**\n * Get list of indexed packages\n */\n getPackages(): string[] {\n return this.metadata?.packages ?? [];\n }\n\n /**\n * Hybrid search combining fulltext (BM25) and vector (semantic) search\n */\n async hybridSearch(options: {\n query: string;\n mode?: SearchMode;\n packages?: string[];\n limit?: number;\n }): Promise<HybridSearchResult[]> {\n const { query, mode = 'fulltext', packages, limit = DEFAULT_LIMIT } = options;\n\n // Fulltext-only mode\n if (mode === 'fulltext') {\n return this.search({ query, packages, limit });\n }\n\n // Semantic or hybrid mode requires vector store\n if (!this.vectorStore) {\n if (mode === 'semantic') {\n throw new Error('Vector search not available. Run \"nocaap index --semantic\" first.');\n }\n // Fall back to fulltext for hybrid if no vector store\n log.debug('Vector store not available, falling back to fulltext search');\n return this.search({ query, packages, limit });\n }\n\n // Generate query embedding\n const queryVector = await generateQueryEmbedding(query, this.embeddingProvider);\n\n // Semantic-only mode\n if (mode === 'semantic') {\n const vectorResults = await this.vectorStore.search(queryVector, limit);\n return vectorResults.map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n headings: [],\n title: r.title,\n score: r.score,\n sources: { vector: 1 },\n }));\n }\n\n // Hybrid mode: combine BM25 and vector results with RRF\n const [fulltextResults, vectorResults] = await Promise.all([\n this.search({ query, packages, limit: limit * 2 }),\n this.vectorStore.search(queryVector, limit * 2),\n ]);\n\n // Convert to RankedResult format for fusion\n const ftRanked: RankedResult[] = fulltextResults.map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n title: r.title,\n score: r.score,\n }));\n\n const vecRanked: RankedResult[] = vectorResults.map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n title: r.title,\n score: r.score,\n }));\n\n // Apply Reciprocal Rank Fusion with weighted scoring from config\n const fused = reciprocalRankFusion(ftRanked, vecRanked, {\n fulltextWeight: this.searchSettings.fulltextWeight,\n vectorWeight: this.searchSettings.vectorWeight,\n k: this.searchSettings.rrfK,\n });\n\n // Apply path-based boost (keywords in query matching folder/file names)\n const queryKeywords = extractQueryKeywords(query);\n for (const result of fused) {\n const pathLower = result.path.toLowerCase();\n let boost = 1.0;\n for (const keyword of queryKeywords) {\n if (pathLower.includes(keyword)) {\n boost *= 1.15; // 15% boost per keyword match in path\n }\n }\n result.score *= boost;\n }\n\n // Boost index documents (README.md, index.md)\n for (const result of fused) {\n const pathLower = result.path.toLowerCase();\n if (pathLower.endsWith('readme.md') || pathLower.endsWith('index.md')) {\n result.score *= 1.25; // 25% boost for index documents\n }\n }\n\n // Re-sort after boosting\n fused.sort((a, b) => b.score - a.score);\n\n const normalized = normalizeScores(fused);\n\n // Convert back to HybridSearchResult format\n return normalized.slice(0, limit).map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n headings: [],\n title: r.title,\n score: r.score,\n sources: r.sources,\n }));\n }\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get the search index file path\n */\nexport function getSearchIndexPath(projectRoot: string): string {\n return paths.join(paths.getContextDir(projectRoot), SEARCH_INDEX_FILE);\n}\n\n/**\n * Check if a search index exists\n */\nexport async function searchIndexExists(projectRoot: string): Promise<boolean> {\n return paths.exists(getSearchIndexPath(projectRoot));\n}\n","/**\n * src/core/mcp-server.ts\n * MCP server implementation for AI agent access to organizational context\n */\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport fs from 'fs-extra';\nimport { z } from 'zod';\nimport { SearchEngine, searchIndexExists, type SearchMode } from './search-engine.js';\nimport { readConfig } from './config.js';\nimport { readIndex } from './indexer.js';\nimport * as paths from '../utils/paths.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface McpServerOptions {\n projectRoot: string;\n}\n\n// =============================================================================\n// MCP Server Factory\n// =============================================================================\n\n/**\n * Create and configure the nocaap MCP server\n */\nexport async function createMcpServer(options: McpServerOptions): Promise<McpServer> {\n const { projectRoot } = options;\n const contextDir = paths.getContextDir(projectRoot);\n\n // Initialize search engine\n const searchEngine = new SearchEngine();\n const hasIndex = await searchIndexExists(projectRoot);\n if (hasIndex) {\n await searchEngine.loadIndex(projectRoot);\n }\n\n // Create MCP server\n const server = new McpServer({\n name: 'nocaap',\n version: '1.0.0',\n });\n\n // ==========================================================================\n // Resources\n // ==========================================================================\n\n // INDEX.md resource - the AI-optimized context index\n server.registerResource(\n 'index',\n 'nocaap://index',\n {\n title: 'Context Index',\n description:\n 'Complete index of organizational knowledge with document summaries. ' +\n 'Includes team directory, product specs, engineering docs, and company strategy.',\n mimeType: 'text/markdown',\n },\n async (uri) => {\n const indexContent = await readIndex(projectRoot);\n return {\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: indexContent ?? 'No INDEX.md found. Run `nocaap update` to generate.',\n }],\n };\n }\n );\n\n // Manifest resource - installed packages metadata\n server.registerResource(\n 'manifest',\n 'nocaap://manifest',\n {\n title: 'Package Manifest',\n description: 'Configuration showing installed knowledge packages and their sources.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const config = await readConfig(projectRoot);\n const manifest = {\n packages: config?.packages ?? [],\n searchIndexAvailable: hasIndex,\n packagesPath: paths.getPackagesDir(projectRoot),\n };\n return {\n contents: [{\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest, null, 2),\n }],\n };\n }\n );\n\n // ==========================================================================\n // Tools\n // ==========================================================================\n\n // Search tool - supports fulltext, semantic, and hybrid modes\n server.registerTool(\n 'search',\n {\n title: 'Search Context',\n description:\n 'Search organizational knowledge including team directory, product documentation, ' +\n 'engineering guidelines, company strategy, and project context. ' +\n 'Use for questions about people, products, processes, or internal information. ' +\n 'Returns ranked results with snippets - use get_document for full content.',\n inputSchema: {\n query: z.string().describe('Search query'),\n mode: z.enum(['fulltext', 'semantic', 'hybrid']).optional()\n .describe('Search mode (default: fulltext, or hybrid if vector index exists)'),\n packages: z.array(z.string()).optional().describe('Filter to specific packages'),\n tags: z.array(z.string()).optional().describe('Filter by document tags'),\n limit: z.number().optional().describe('Maximum results (default: 10)'),\n },\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async ({ query, mode, packages, tags, limit }) => {\n if (!searchEngine.isInitialized()) {\n return {\n content: [{\n type: 'text',\n text: 'Search index not available. Run `nocaap index` to build it.',\n }],\n };\n }\n\n // Determine search mode - default to hybrid if vector search is available\n const searchMode: SearchMode = mode ?? (searchEngine.hasVectorSearch() ? 'hybrid' : 'fulltext');\n\n try {\n const results = await searchEngine.hybridSearch({\n query,\n mode: searchMode,\n packages,\n limit: limit ?? 10,\n });\n\n const formattedResults = results.map((r, i) => ({\n rank: i + 1,\n path: r.path,\n package: r.package,\n title: r.title,\n headings: r.headings,\n score: r.score,\n sources: r.sources,\n snippet: r.content.slice(0, 200) + (r.content.length > 200 ? '...' : ''),\n }));\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n mode: searchMode,\n vectorSearchAvailable: searchEngine.hasVectorSearch(),\n results: formattedResults,\n }, null, 2),\n }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: [{\n type: 'text',\n text: `Search error: ${message}`,\n }],\n };\n }\n }\n );\n\n // Get document tool - retrieve full document content\n server.registerTool(\n 'get_document',\n {\n title: 'Get Document',\n description:\n 'Retrieve full documentation by path (from search results). ' +\n 'Use after searching to get complete details about team members, products, ' +\n 'engineering decisions, or any organizational knowledge.',\n inputSchema: {\n path: z.string().describe('Relative path to document (from search results)'),\n },\n },\n async ({ path: docPath }) => {\n // Normalize and validate path\n const normalizedPath = paths.toUnix(docPath);\n const fullPath = paths.join(contextDir, normalizedPath);\n\n // Security check: ensure path is within context dir\n if (!paths.isWithin(contextDir, fullPath)) {\n return {\n content: [{\n type: 'text',\n text: `Error: Path is outside context directory`,\n }],\n };\n }\n\n if (!(await paths.exists(fullPath))) {\n return {\n content: [{\n type: 'text',\n text: `Document not found: ${docPath}`,\n }],\n };\n }\n\n const content = await fs.readFile(fullPath, 'utf-8');\n return {\n content: [{\n type: 'text',\n text: content,\n }],\n };\n }\n );\n\n // Get section tool - retrieve a specific section by heading\n server.registerTool(\n 'get_section',\n {\n title: 'Get Section',\n description:\n 'Retrieve a specific section from a document by heading. ' +\n 'Useful for extracting targeted information like \"Key Accomplishments\" or ' +\n '\"Technical Architecture\" without loading the entire document.',\n inputSchema: {\n path: z.string().describe('Relative path to document'),\n heading: z.string().describe('The heading text to find'),\n },\n },\n async ({ path: docPath, heading }) => {\n const normalizedPath = paths.toUnix(docPath);\n const fullPath = paths.join(contextDir, normalizedPath);\n\n if (!paths.isWithin(contextDir, fullPath)) {\n return {\n content: [{\n type: 'text',\n text: `Error: Path is outside context directory`,\n }],\n };\n }\n\n if (!(await paths.exists(fullPath))) {\n return {\n content: [{\n type: 'text',\n text: `Document not found: ${docPath}`,\n }],\n };\n }\n\n const content = await fs.readFile(fullPath, 'utf-8');\n const section = extractSection(content, heading);\n\n if (!section) {\n return {\n content: [{\n type: 'text',\n text: `Section not found: \"${heading}\"`,\n }],\n };\n }\n\n return {\n content: [{\n type: 'text',\n text: section,\n }],\n };\n }\n );\n\n // List contexts tool - list installed packages\n server.registerTool(\n 'list_contexts',\n {\n title: 'List Contexts',\n description:\n 'List available knowledge domains and packages. ' +\n 'Shows what organizational context is installed (team info, products, engineering docs, etc.). ' +\n 'Use to discover what information is available before searching.',\n inputSchema: {\n tags: z.array(z.string()).optional().describe('Filter by tags (not yet implemented)'),\n },\n },\n async () => {\n const config = await readConfig(projectRoot);\n\n if (!config || config.packages.length === 0) {\n return {\n content: [{\n type: 'text',\n text: 'No context packages installed.',\n }],\n };\n }\n\n const packages = config.packages.map((pkg) => ({\n alias: pkg.alias,\n source: pkg.source,\n path: pkg.path ?? '/',\n version: pkg.version ?? 'main',\n }));\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(packages, null, 2),\n }],\n };\n }\n );\n\n // Get overview tool - returns the full INDEX.md for context discovery\n server.registerTool(\n 'get_overview',\n {\n title: 'Get Context Overview',\n description:\n 'Get a structured overview of all available organizational knowledge. ' +\n 'Returns package names, document titles, and content summaries. ' +\n 'RECOMMENDED: Call this first to understand what context is available before searching.',\n inputSchema: {},\n },\n async () => {\n const indexContent = await readIndex(projectRoot);\n if (!indexContent) {\n return {\n content: [{\n type: 'text',\n text: 'No context index available. Run `nocaap index` to generate.',\n }],\n };\n }\n return {\n content: [{\n type: 'text',\n text: indexContent,\n }],\n };\n }\n );\n\n return server;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Extract a section from markdown content by heading\n */\nfunction extractSection(content: string, heading: string): string | null {\n const lines = content.split('\\n');\n const headingLower = heading.toLowerCase();\n\n let capturing = false;\n let captureLevel = 0;\n const sectionLines: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n\n if (headingMatch && headingMatch[1] && headingMatch[2]) {\n const level = headingMatch[1].length;\n const text = headingMatch[2].trim().toLowerCase();\n\n if (capturing) {\n // Stop if we hit a heading of same or higher level\n if (level <= captureLevel) {\n break;\n }\n } else if (text === headingLower) {\n // Start capturing from this heading\n capturing = true;\n captureLevel = level;\n }\n }\n\n if (capturing) {\n sectionLines.push(line);\n }\n }\n\n return sectionLines.length > 0 ? sectionLines.join('\\n') : null;\n}\n\n// =============================================================================\n// Server Runner\n// =============================================================================\n\n/**\n * Start the MCP server with stdio transport\n */\nexport async function startMcpServer(options: McpServerOptions): Promise<void> {\n const server = await createMcpServer(options);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","/**\n * src/commands/serve.ts\n * Start the nocaap MCP server\n */\nimport { startMcpServer } from '../core/mcp-server.js';\nimport * as paths from '../utils/paths.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ServeOptions {\n printConfig?: boolean;\n root?: string;\n}\n\n// =============================================================================\n// Claude Desktop Config\n// =============================================================================\n\ninterface ClaudeDesktopConfig {\n mcpServers: {\n [name: string]: {\n command: string;\n args: string[];\n };\n };\n}\n\n/**\n * Generate Claude Desktop configuration JSON\n */\nfunction generateClaudeDesktopConfig(): ClaudeDesktopConfig {\n return {\n mcpServers: {\n nocaap: {\n command: 'nocaap',\n args: ['serve'],\n },\n },\n };\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Start the MCP server or print Claude Desktop config\n */\nexport async function serveCommand(options: ServeOptions = {}): Promise<void> {\n // Use --root option if provided, otherwise use current working directory\n const projectRoot = options.root ?? process.cwd();\n\n // Handle --print-config flag\n if (options.printConfig) {\n const config = generateClaudeDesktopConfig();\n console.log(JSON.stringify(config, null, 2));\n return;\n }\n\n // Check if .context directory exists\n const contextDir = paths.getContextDir(projectRoot);\n if (!(await paths.exists(contextDir))) {\n throw new Error(\n 'No .context directory found. Run `nocaap setup` or `nocaap add` first.'\n );\n }\n\n // Note: Don't output anything to stdout - MCP uses stdio for JSON-RPC communication\n // Any console.log() calls will corrupt the protocol\n // Warnings can go to stderr if absolutely necessary\n\n // Start the MCP server (blocks until terminated)\n await startMcpServer({ projectRoot });\n}\n","/**\n * src/core/chunker.ts\n * Converts markdown files into searchable chunks for Orama indexing\n */\nimport fs from 'fs-extra';\nimport matter from 'gray-matter';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Target chunk size in characters (~500 for Transformers.js compatibility) */\nconst TARGET_CHUNK_SIZE = 500;\n\n/** Minimum chunk size to avoid tiny fragments */\nconst MIN_CHUNK_SIZE = 100;\n\n/** Maximum size for README/index files (kept as single authoritative chunk) */\nconst README_MAX_SIZE = 2000;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ChunkMetadata {\n title: string;\n summary?: string;\n type?: string;\n tags: string[];\n}\n\nexport interface Chunk {\n /** Unique ID for this chunk */\n id: string;\n /** The text content of the chunk */\n content: string;\n /** Path to the source file relative to .context/ */\n path: string;\n /** Package alias this chunk belongs to */\n package: string;\n /** Heading hierarchy (e.g., [\"Getting Started\", \"Installation\"]) */\n headings: string[];\n /** Metadata extracted from frontmatter */\n metadata: ChunkMetadata;\n}\n\nexport interface ChunkResult {\n chunks: Chunk[];\n fileCount: number;\n chunkCount: number;\n}\n\n// =============================================================================\n// Markdown Parsing\n// =============================================================================\n\n/**\n * Extract heading hierarchy from heading line\n */\nfunction parseHeading(line: string): { level: number; text: string } | null {\n const match = line.match(/^(#{1,6})\\s+(.+)$/);\n if (!match || !match[1] || !match[2]) return null;\n return {\n level: match[1].length,\n text: match[2].trim(),\n };\n}\n\n/**\n * Split markdown content by H2 sections\n * Returns sections with their heading hierarchy\n */\nfunction splitByH2Sections(\n body: string,\n documentTitle: string\n): Array<{ headings: string[]; content: string }> {\n const lines = body.split('\\n');\n const sections: Array<{ headings: string[]; content: string }> = [];\n\n let currentHeadings: string[] = [documentTitle];\n let currentContent: string[] = [];\n let h1Seen = false;\n\n for (const line of lines) {\n const heading = parseHeading(line);\n\n if (heading) {\n // Skip the first H1 as it's usually the document title\n if (heading.level === 1 && !h1Seen) {\n h1Seen = true;\n continue;\n }\n\n // On H2, save current section and start new one\n if (heading.level === 2) {\n if (currentContent.length > 0) {\n const content = currentContent.join('\\n').trim();\n if (content.length >= MIN_CHUNK_SIZE) {\n sections.push({\n headings: [...currentHeadings],\n content,\n });\n }\n }\n currentHeadings = [documentTitle, heading.text];\n currentContent = [];\n continue;\n }\n\n // Track H3+ headings in hierarchy\n if (heading.level >= 3 && currentHeadings.length >= 2) {\n currentHeadings = [\n currentHeadings[0]!,\n currentHeadings[1]!,\n heading.text,\n ];\n }\n }\n\n currentContent.push(line);\n }\n\n // Don't forget the last section\n if (currentContent.length > 0) {\n const content = currentContent.join('\\n').trim();\n if (content.length >= MIN_CHUNK_SIZE) {\n sections.push({\n headings: [...currentHeadings],\n content,\n });\n }\n }\n\n // If no sections were created, create one from entire content\n if (sections.length === 0 && body.trim().length >= MIN_CHUNK_SIZE) {\n sections.push({\n headings: [documentTitle],\n content: body.trim(),\n });\n }\n\n return sections;\n}\n\n/**\n * Further split a section if it exceeds target chunk size\n */\nfunction splitLargeSection(\n section: { headings: string[]; content: string }\n): Array<{ headings: string[]; content: string }> {\n if (section.content.length <= TARGET_CHUNK_SIZE) {\n return [section];\n }\n\n // Split by paragraphs (double newlines)\n const paragraphs = section.content.split(/\\n\\n+/);\n const chunks: Array<{ headings: string[]; content: string }> = [];\n let currentChunk = '';\n\n for (const para of paragraphs) {\n if (currentChunk.length + para.length + 2 > TARGET_CHUNK_SIZE) {\n if (currentChunk.trim().length >= MIN_CHUNK_SIZE) {\n chunks.push({\n headings: section.headings,\n content: currentChunk.trim(),\n });\n }\n currentChunk = para;\n } else {\n currentChunk += (currentChunk ? '\\n\\n' : '') + para;\n }\n }\n\n // Don't forget the last chunk\n if (currentChunk.trim().length >= MIN_CHUNK_SIZE) {\n chunks.push({\n headings: section.headings,\n content: currentChunk.trim(),\n });\n }\n\n return chunks.length > 0 ? chunks : [section];\n}\n\n// =============================================================================\n// Main Chunking Function\n// =============================================================================\n\n/**\n * Chunk a single markdown file into searchable pieces\n */\nexport async function chunkFile(\n filePath: string,\n packageAlias: string,\n contextDir: string\n): Promise<Chunk[]> {\n const normalizedPath = paths.toUnix(filePath);\n const relativePath = paths.relative(contextDir, normalizedPath);\n\n log.debug(`Chunking file: ${relativePath}`);\n\n const fileContent = await fs.readFile(normalizedPath, 'utf-8');\n const { data: frontmatter, content: body } = matter(fileContent);\n\n // Extract metadata\n const title = extractTitle(frontmatter, body, normalizedPath);\n const summary = (frontmatter.summary ?? frontmatter.description) as string | undefined;\n const type = frontmatter.type as string | undefined;\n const tags = Array.isArray(frontmatter.tags)\n ? frontmatter.tags.filter((t): t is string => typeof t === 'string')\n : [];\n\n const metadata: ChunkMetadata = { title, summary, type, tags };\n\n // Check if this is a README/index file - keep as single authoritative chunk\n const filename = paths.basename(normalizedPath).toLowerCase();\n const isIndexFile = filename === 'readme.md' || filename === 'index.md';\n\n if (isIndexFile) {\n // Keep README/index files as single chunk to preserve overview context\n const content = body.trim().slice(0, README_MAX_SIZE);\n return [{\n id: `${relativePath}#0`,\n content,\n path: relativePath,\n package: packageAlias,\n headings: [title],\n metadata: { ...metadata, type: metadata.type ?? 'index' },\n }];\n }\n\n // Split into sections for regular files\n const sections = splitByH2Sections(body, title);\n\n // Further split large sections\n const allChunks: Array<{ headings: string[]; content: string }> = [];\n for (const section of sections) {\n allChunks.push(...splitLargeSection(section));\n }\n\n // Convert to Chunk objects with unique IDs\n return allChunks.map((chunk, index) => ({\n id: `${relativePath}#${index}`,\n content: chunk.content,\n path: relativePath,\n package: packageAlias,\n headings: chunk.headings,\n metadata,\n }));\n}\n\n/**\n * Extract title from frontmatter, first H1, or filename\n */\nfunction extractTitle(\n frontmatter: Record<string, unknown>,\n body: string,\n filePath: string\n): string {\n if (typeof frontmatter.title === 'string' && frontmatter.title.trim()) {\n return frontmatter.title.trim();\n }\n\n const h1Match = body.match(/^#\\s+(.+)$/m);\n if (h1Match?.[1]) {\n return h1Match[1].trim();\n }\n\n const filename = paths.basename(filePath, paths.extname(filePath));\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Chunk all markdown files in a package directory\n */\nexport async function chunkPackage(\n packagePath: string,\n packageAlias: string,\n contextDir: string\n): Promise<Chunk[]> {\n const chunks: Chunk[] = [];\n\n if (!(await paths.exists(packagePath))) {\n log.debug(`Package path does not exist: ${packagePath}`);\n return chunks;\n }\n\n const files = await findMarkdownFiles(packagePath);\n\n for (const file of files) {\n try {\n const fileChunks = await chunkFile(file, packageAlias, contextDir);\n chunks.push(...fileChunks);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to chunk ${file}: ${message}`);\n }\n }\n\n return chunks;\n}\n\n/**\n * Recursively find all markdown files in a directory\n */\nasync function findMarkdownFiles(dirPath: string): Promise<string[]> {\n const results: string[] = [];\n\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = paths.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\n continue;\n }\n const subFiles = await findMarkdownFiles(fullPath);\n results.push(...subFiles);\n } else if (entry.isFile()) {\n const ext = paths.extname(entry.name).toLowerCase();\n if (ext === '.md' || ext === '.mdx') {\n results.push(fullPath);\n }\n }\n }\n\n return results;\n}\n","/**\n * src/commands/index-search.ts\n * Build the search index from markdown files in context packages\n * Supports both fulltext (Orama/BM25) and semantic (vector) search\n */\nimport { readConfig } from '../core/config.js';\nimport { chunkPackage } from '../core/chunker.js';\nimport { SearchEngine, getSearchIndexPath } from '../core/search-engine.js';\nimport { VectorStore, getVectorStorePath } from '../core/vector-store.js';\nimport {\n detectProvider,\n generateEmbeddings,\n getProviderConfig,\n setEmbeddingSettings,\n type EmbeddingProvider,\n} from '../core/embeddings.js';\nimport { resolveEmbeddingSettings } from '../core/settings.js';\nimport * as paths from '../utils/paths.js';\nimport { log, withSpinner } from '../utils/logger.js';\nimport type { Chunk } from '../core/chunker.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface IndexSearchOptions {\n semantic?: boolean;\n provider?: EmbeddingProvider;\n}\n\nexport interface IndexSearchResult {\n chunkCount: number;\n fileCount: number;\n packages: string[];\n indexPath: string;\n vectorIndexPath?: string;\n embeddingProvider?: string;\n embeddingModel?: string;\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Build the search index from all installed packages\n */\nexport async function indexSearchCommand(\n options: IndexSearchOptions = {}\n): Promise<IndexSearchResult> {\n const { semantic = false, provider = 'auto' } = options;\n const projectRoot = process.cwd();\n const contextDir = paths.getContextDir(projectRoot);\n\n // Check if .context directory exists\n if (!(await paths.exists(contextDir))) {\n throw new Error(\n 'No .context directory found. Run `nocaap setup` or `nocaap add` first.'\n );\n }\n\n // Read config to get installed packages\n const config = await readConfig(projectRoot);\n if (!config || config.packages.length === 0) {\n throw new Error(\n 'No packages configured. Run `nocaap setup` or `nocaap add` first.'\n );\n }\n\n // Load embedding settings from config (for semantic indexing)\n if (semantic) {\n const embeddingSettings = await resolveEmbeddingSettings(projectRoot);\n setEmbeddingSettings(embeddingSettings);\n }\n\n log.info(`Building search index for ${config.packages.length} package(s)...`);\n\n // Collect chunks from all packages\n const allChunks: Chunk[] = [];\n let totalFiles = 0;\n const indexedPackages: string[] = [];\n\n for (const pkg of config.packages) {\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n\n if (!(await paths.exists(packagePath))) {\n log.warn(`Package directory not found: ${pkg.alias}`);\n continue;\n }\n\n const chunks = await withSpinner(\n `Chunking ${pkg.alias}...`,\n async () => chunkPackage(packagePath, pkg.alias, contextDir),\n { successText: `Chunked ${pkg.alias}` }\n );\n\n if (chunks.length > 0) {\n allChunks.push(...chunks);\n indexedPackages.push(pkg.alias);\n\n // Estimate files from unique paths\n const uniquePaths = new Set(chunks.map((c) => c.path));\n totalFiles += uniquePaths.size;\n } else {\n log.warn(`No content found in package: ${pkg.alias}`);\n }\n }\n\n if (allChunks.length === 0) {\n throw new Error('No content to index. Check your package directories.');\n }\n\n // Create and save the fulltext search index\n const searchEngine = new SearchEngine();\n\n await withSpinner(\n 'Building fulltext index...',\n async () => {\n await searchEngine.createIndex(allChunks);\n await searchEngine.saveIndex(projectRoot);\n },\n { successText: 'Fulltext index built' }\n );\n\n const indexPath = getSearchIndexPath(projectRoot);\n const result: IndexSearchResult = {\n chunkCount: allChunks.length,\n fileCount: totalFiles,\n packages: indexedPackages,\n indexPath,\n };\n\n // Build semantic/vector index if requested\n if (semantic) {\n result.vectorIndexPath = getVectorStorePath(projectRoot);\n await buildVectorIndex(allChunks, projectRoot, provider, result);\n }\n\n log.success(\n `Indexed ${allChunks.length} chunks from ${totalFiles} files across ${indexedPackages.length} package(s)`\n );\n\n if (result.embeddingProvider) {\n log.info(`Semantic search enabled (${result.embeddingProvider}/${result.embeddingModel})`);\n }\n\n return result;\n}\n\n// =============================================================================\n// Vector Index Builder\n// =============================================================================\n\n/**\n * Build vector index for semantic search\n */\nasync function buildVectorIndex(\n chunks: Chunk[],\n projectRoot: string,\n providerOption: EmbeddingProvider,\n result: IndexSearchResult\n): Promise<void> {\n // Detect or validate provider\n const resolvedProvider = providerOption === 'auto'\n ? await withSpinner(\n 'Detecting embedding provider...',\n async () => detectProvider(),\n { successText: 'Provider detected' }\n )\n : providerOption;\n\n const config = getProviderConfig(resolvedProvider);\n result.embeddingProvider = resolvedProvider;\n result.embeddingModel = config.model;\n\n log.info(`Using ${resolvedProvider} (${config.model}, ${config.dimensions}d)`);\n\n // Extract text content from chunks\n const texts = chunks.map((c) => c.content);\n\n // Generate embeddings\n const embeddingResult = await withSpinner(\n `Generating embeddings for ${chunks.length} chunks...`,\n async () => generateEmbeddings(texts, resolvedProvider),\n { successText: 'Embeddings generated' }\n );\n\n // Prepare vector chunks\n const vectorChunks = chunks.map((chunk, i) => ({\n id: chunk.id,\n content: chunk.content,\n path: chunk.path,\n package: chunk.package,\n title: chunk.metadata.title,\n vector: embeddingResult.vectors[i]!,\n }));\n\n // Create vector store\n const vectorStore = new VectorStore(projectRoot);\n\n await withSpinner(\n 'Creating vector index...',\n async () => {\n await vectorStore.createIndex(vectorChunks, {\n provider: resolvedProvider,\n model: embeddingResult.model,\n dimensions: embeddingResult.dimensions,\n createdAt: new Date().toISOString(),\n });\n },\n { successText: 'Vector index created' }\n );\n}\n","/**\n * src/index.ts\n * nocaap CLI entry point\n */\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { Command } from 'commander';\nimport { setupCommand } from './commands/setup.js';\nimport { addCommand } from './commands/add.js';\nimport { updateCommand } from './commands/update.js';\nimport { listCommand } from './commands/list.js';\nimport { removeCommand } from './commands/remove.js';\nimport { configCommand } from './commands/config.js';\nimport { pushCommand } from './commands/push.js';\nimport { serveCommand } from './commands/serve.js';\nimport { indexSearchCommand } from './commands/index-search.js';\nimport { generateIndexWithProgress } from './core/indexer.js';\nimport { log } from './utils/logger.js';\n\n// Read version from package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));\n\n// =============================================================================\n// CLI Setup\n// =============================================================================\n\nconst program = new Command();\n\nprogram\n .name('nocaap')\n .description(\n 'Normalized Organizational Context-as-a-Package\\n\\n' +\n 'Standardize your AI agent context across teams.\\n' +\n 'Run `nocaap setup` to get started.'\n )\n .version(pkg.version);\n\n// =============================================================================\n// Setup Command\n// =============================================================================\n\nprogram\n .command('setup')\n .description('Interactive setup wizard to configure context packages')\n .option('-r, --registry <url>', 'Registry URL to fetch contexts from')\n .action(async (options) => {\n try {\n await setupCommand({ registry: options.registry });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Add Command\n// =============================================================================\n\nprogram\n .command('add <repo>')\n .description('Add a context package from a Git repository')\n .option('-p, --path <path>', 'Sparse checkout path within the repo')\n .option('-a, --alias <name>', 'Local alias for the package')\n .option('-b, --branch <branch>', 'Branch or tag to checkout', 'main')\n .action(async (repo, options) => {\n try {\n await addCommand(repo, {\n path: options.path,\n alias: options.alias,\n branch: options.branch,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Update Command\n// =============================================================================\n\nprogram\n .command('update [alias]')\n .description('Update context packages and regenerate index')\n .option('--force', 'Force update even if clean')\n .action(async (alias, options) => {\n try {\n await updateCommand(alias, { force: options.force });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// List Command\n// =============================================================================\n\nprogram\n .command('list')\n .alias('ls')\n .description('List installed context packages')\n .action(async () => {\n try {\n await listCommand();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Remove Command\n// =============================================================================\n\nprogram\n .command('remove <alias>')\n .alias('rm')\n .description('Remove a context package')\n .option('--force', 'Force removal even if dirty')\n .action(async (alias, options) => {\n try {\n await removeCommand(alias, { force: options.force });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Config Command\n// =============================================================================\n\nprogram\n .command('config [key] [value]')\n .description('Manage nocaap configuration')\n .option('-l, --list', 'Show all configuration')\n .option('-g, --global', 'Use global config scope')\n .option('-p, --project', 'Use project config scope')\n .action(async (key, value, options) => {\n try {\n await configCommand(key, value, {\n list: options.list,\n global: options.global,\n project: options.project,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Push Command\n// =============================================================================\n\nprogram\n .command('push [alias]')\n .description('Push local changes to upstream as a PR')\n .option('-m, --message <message>', 'Commit message')\n .option('-a, --all', 'Push all packages with changes')\n .action(async (alias, options) => {\n try {\n await pushCommand(alias, {\n message: options.message,\n all: options.all,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Index Command\n// =============================================================================\n\nprogram\n .command('index')\n .description('Build INDEX.md and search index for AI agent access')\n .option('--semantic', 'Enable semantic search with vector embeddings')\n .option(\n '--provider <provider>',\n 'Embedding provider: ollama | openai | tfjs | auto',\n 'auto'\n )\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n // Generate INDEX.md first\n await generateIndexWithProgress(projectRoot);\n // Then build search index (with optional semantic)\n await indexSearchCommand({\n semantic: options.semantic,\n provider: options.provider,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Serve Command\n// =============================================================================\n\nprogram\n .command('serve')\n .description('Start the MCP server for AI agent access')\n .option('--print-config', 'Print Claude Desktop configuration JSON')\n .option('--root <path>', 'Project root directory (default: current directory)')\n .action(async (options) => {\n try {\n await serveCommand({ printConfig: options.printConfig, root: options.root });\n } catch (error) {\n // IMPORTANT: Use stderr for errors in serve command\n // MCP uses stdout for JSON-RPC, so any stdout output corrupts the protocol\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Parse and Execute\n// =============================================================================\n\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/utils/paths.ts","../src/utils/logger.ts","../src/schemas/index.ts","../src/core/config.ts","../src/core/global-config.ts","../src/core/chunker.ts","../src/core/vector-store.ts","../src/core/embeddings.ts","../src/core/fusion.ts","../src/core/settings.ts","../src/core/search-engine.ts","../src/commands/index-search.ts","../src/commands/wizard/index-wizard.ts","../src/index.ts","../src/commands/setup.ts","../src/core/registry.ts","../src/core/git-engine.ts","../src/core/indexer.ts","../src/commands/add.ts","../src/commands/update.ts","../src/commands/list.ts","../src/commands/remove.ts","../src/commands/config.ts","../src/commands/push.ts","../src/utils/providers.ts","../src/core/github.ts","../src/commands/serve.ts","../src/core/mcp-server.ts"],"names":["path","fs","pkg","CONFIG_FILE","matter","extractTitle","vectorResults","embeddingSettings","os","message","confirm","runIndexWizard","search","detectProvider","checkbox","z","__filename","fileURLToPath","__dirname","dirname","join"],"mappings":"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","file":"index.js","sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * src/utils/paths.ts\n* Path normalization utilities using upath\n * Ensures Windows compatibility by converting all paths to POSIX style\n */\nimport upath from 'upath';\nimport path from 'node:path';\nimport fs from 'fs-extra';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport const CONTEXT_DIR = '.context';\nexport const PACKAGES_DIR = 'packages';\nexport const CONFIG_FILE = 'context.config.json';\nexport const LOCK_FILE = 'context.lock';\nexport const INDEX_FILE = 'INDEX.md';\n\n// =============================================================================\n// Path Normalization\n// =============================================================================\n\n/**\n * Convert any path to POSIX style (forward slashes)\n * Critical for Windows compatibility with Git\n */\nexport function toUnix(filePath: string): string {\n return upath.toUnix(filePath);\n}\n\n/**\n * Normalize a path (resolve . and .., remove trailing slashes)\n */\nexport function normalize(filePath: string): string {\n return upath.normalize(filePath);\n}\n\n/**\n * Join path segments and normalize to POSIX\n */\nexport function join(...segments: string[]): string {\n return upath.join(...segments);\n}\n\n/**\n * Resolve path segments to an absolute path (POSIX style)\n */\nexport function resolve(...segments: string[]): string {\n return toUnix(path.resolve(...segments));\n}\n\n/**\n * Get the directory name from a path\n */\nexport function dirname(filePath: string): string {\n return upath.dirname(filePath);\n}\n\n/**\n * Get the base name from a path\n */\nexport function basename(filePath: string, ext?: string): string {\n return upath.basename(filePath, ext);\n}\n\n/**\n * Get the extension from a path\n */\nexport function extname(filePath: string): string {\n return upath.extname(filePath);\n}\n\n// =============================================================================\n// Project Path Helpers\n// =============================================================================\n\n/**\n * Get the .context directory path for a project\n */\nexport function getContextDir(projectRoot: string): string {\n return join(projectRoot, CONTEXT_DIR);\n}\n\n/**\n * Get the packages directory path\n */\nexport function getPackagesDir(projectRoot: string): string {\n return join(getContextDir(projectRoot), PACKAGES_DIR);\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(projectRoot: string): string {\n return join(getContextDir(projectRoot), CONFIG_FILE);\n}\n\n/**\n * Get the lockfile path\n */\nexport function getLockfilePath(projectRoot: string): string {\n return join(getContextDir(projectRoot), LOCK_FILE);\n}\n\n/**\n * Get the INDEX.md file path\n */\nexport function getIndexPath(projectRoot: string): string {\n return join(getContextDir(projectRoot), INDEX_FILE);\n}\n\n/**\n * Get a specific package directory path\n */\nexport function getPackagePath(projectRoot: string, alias: string): string {\n return join(getPackagesDir(projectRoot), alias);\n}\n\n// =============================================================================\n// Path Validation\n// =============================================================================\n\n/**\n * Check if a path is absolute\n */\nexport function isAbsolute(filePath: string): boolean {\n return upath.isAbsolute(filePath);\n}\n\n/**\n * Get relative path from one path to another\n */\nexport function relative(from: string, to: string): string {\n return upath.relative(from, to);\n}\n\n/**\n * Ensure a path is within a given directory (security check)\n */\nexport function isWithin(parent: string, child: string): boolean {\n const resolvedParent = resolve(parent);\n const resolvedChild = resolve(child);\n\n // Ensure we're comparing full path segments\n const normalizedParent = resolvedParent.endsWith('/')\n ? resolvedParent\n : `${resolvedParent}/`;\n\n return resolvedChild === resolvedParent || resolvedChild.startsWith(normalizedParent);\n}\n\n// =============================================================================\n// Filesystem Helpers\n// =============================================================================\n\n/**\n * Ensure a directory exists, creating it if necessary\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\n/**\n * Check if a path exists\n */\nexport async function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n","/**\n* src/utils/logger.ts \n* Logger utilities with Chalk + Ora wrappers\n */\nimport chalk from 'chalk';\nimport ora from 'ora';\n\n// =============================================================================\n// Chalk Wrappers\n// =============================================================================\n\nexport const log = {\n /** Info message (blue) */\n info: (message: string) => console.log(chalk.blue('ℹ'), message),\n\n /** Success message (green) */\n success: (message: string) => console.log(chalk.green('✔'), message),\n\n /** Warning message (yellow) */\n warn: (message: string) => console.log(chalk.yellow('⚠'), message),\n\n /** Error message (red) */\n error: (message: string) => console.log(chalk.red('✖'), message),\n\n /** Debug message (gray) - only when NOCAAP_DEBUG=true */\n debug: (message: string) => {\n if (process.env.NOCAAP_DEBUG === 'true') {\n console.log(chalk.gray('🔍'), chalk.gray(message));\n }\n },\n\n /** Plain message */\n plain: (message: string) => console.log(message),\n\n /** Styled title */\n title: (message: string) => console.log(chalk.bold.cyan(`\\n${message}\\n`)),\n\n /** Dim helper text */\n dim: (message: string) => console.log(chalk.dim(message)),\n\n /** Empty line for spacing */\n newline: () => console.log(),\n\n /** Horizontal rule */\n hr: () => console.log(chalk.dim('─'.repeat(50))),\n};\n\n// =============================================================================\n// Styled Text Helpers\n// =============================================================================\n\nexport const style = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n code: (text: string) => chalk.cyan(`\\`${text}\\``),\n path: (text: string) => chalk.yellow(text),\n url: (text: string) => chalk.blue.underline(text),\n success: (text: string) => chalk.green(text),\n error: (text: string) => chalk.red(text),\n warn: (text: string) => chalk.yellow(text),\n};\n\n// =============================================================================\n// Ora Spinner Wrappers\n// =============================================================================\n\nexport interface SpinnerInstance {\n start: (text?: string) => SpinnerInstance;\n stop: () => SpinnerInstance;\n succeed: (text?: string) => SpinnerInstance;\n fail: (text?: string) => SpinnerInstance;\n warn: (text?: string) => SpinnerInstance;\n info: (text?: string) => SpinnerInstance;\n text: string;\n}\n\n/**\n * Create a spinner instance\n */\nexport function createSpinner(text?: string): SpinnerInstance {\n const spinner = ora({\n text,\n color: 'cyan',\n });\n\n const instance: SpinnerInstance = {\n start(newText?: string) {\n spinner.start(newText);\n return instance;\n },\n stop() {\n spinner.stop();\n return instance;\n },\n succeed(newText?: string) {\n spinner.succeed(newText);\n return instance;\n },\n fail(newText?: string) {\n spinner.fail(newText);\n return instance;\n },\n warn(newText?: string) {\n spinner.warn(newText);\n return instance;\n },\n info(newText?: string) {\n spinner.info(newText);\n return instance;\n },\n get text() {\n return spinner.text;\n },\n set text(value: string) {\n spinner.text = value;\n },\n };\n\n return instance;\n}\n\n/**\n * Run an async task with a spinner\n */\nexport async function withSpinner<T>(\n text: string,\n task: () => Promise<T>,\n options?: {\n successText?: string;\n failText?: string;\n }\n): Promise<T> {\n const spinner = ora(text).start();\n\n try {\n const result = await task();\n spinner.succeed(options?.successText || text);\n return result;\n } catch (error) {\n spinner.fail(options?.failText || text);\n throw error;\n }\n}\n\n","/**\n * src/schemas/index.ts\n * Zod validation schemas for nocaap data structures\n */\nimport { z } from 'zod';\n\n// =============================================================================\n// Registry Schema (nocaap-registry.json)\n// =============================================================================\n\nconst gitUrlPattern = /^(git@|https:\\/\\/|git:\\/\\/).+/;\n\nexport const ContextEntrySchema = z.object({\n name: z.string().min(1, 'Context name is required'),\n description: z.string(),\n repo: z.string()\n .min(1, 'Repository URL is required')\n .refine(\n (url) => gitUrlPattern.test(url),\n 'Must be a valid Git URL (git@, https://, or git://)'\n ),\n path: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\n\nexport const RegistrySchema = z.object({\n name: z.string().optional(),\n contexts: z.array(ContextEntrySchema),\n imports: z.array(z.string().url()).optional(),\n});\n\n// =============================================================================\n// Config Schema (.context/context.config.json)\n// =============================================================================\n\nexport const PackageEntrySchema = z.object({\n alias: z.string().min(1, 'Alias is required'),\n source: z.string().min(1, 'Source URL is required'),\n path: z.string().optional(),\n version: z.string().default('main'),\n});\n\n// Settings sub-schemas (all optional for backward compatibility)\nexport const SearchSettingsSchema = z.object({\n fulltextWeight: z.number().min(0).max(1).optional(),\n vectorWeight: z.number().min(0).max(1).optional(),\n rrfK: z.number().int().positive().optional(),\n}).optional();\n\nexport const PushSettingsSchema = z.object({\n baseBranch: z.string().optional(),\n}).optional();\n\nexport const IndexSettingsSchema = z.object({\n semantic: z.boolean().optional(),\n provider: z.enum(['ollama', 'openai', 'tfjs', 'auto']).optional(),\n}).optional();\n\nexport const EmbeddingSettingsSchema = z.object({\n provider: z.enum(['ollama', 'openai', 'tfjs', 'auto']).optional(),\n ollamaModel: z.string().optional(),\n ollamaBaseUrl: z.string().url().optional(),\n}).optional();\n\nexport const ConfigSchema = z.object({\n registryUrl: z.string().url().optional(),\n packages: z.array(PackageEntrySchema),\n search: SearchSettingsSchema,\n push: PushSettingsSchema,\n index: IndexSettingsSchema,\n});\n\n// =============================================================================\n// Lockfile Schema (.context/context.lock)\n// =============================================================================\n\nexport const LockEntrySchema = z.object({\n commitHash: z.string().min(1, 'Commit hash is required'),\n sparsePath: z.string(),\n updatedAt: z.string().datetime(),\n});\n\nexport const LockfileSchema = z.record(z.string(), LockEntrySchema);\n\n// =============================================================================\n// Global Config Schema (~/.nocaap/config.json)\n// =============================================================================\n\nexport const GlobalConfigSchema = z.object({\n defaultRegistry: z.string().url().optional(),\n updatedAt: z.string().datetime().optional(),\n push: PushSettingsSchema,\n embedding: EmbeddingSettingsSchema,\n});\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\nexport type ContextEntry = z.infer<typeof ContextEntrySchema>;\nexport type Registry = z.infer<typeof RegistrySchema>;\nexport type PackageEntry = z.infer<typeof PackageEntrySchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type LockEntry = z.infer<typeof LockEntrySchema>;\nexport type Lockfile = z.infer<typeof LockfileSchema>;\nexport type GlobalConfig = z.infer<typeof GlobalConfigSchema>;\n\n// Settings types (unwrapped from optional for convenience)\nexport type SearchSettings = z.infer<typeof SearchSettingsSchema>;\nexport type PushSettings = z.infer<typeof PushSettingsSchema>;\nexport type IndexSettings = z.infer<typeof IndexSettingsSchema>;\nexport type EmbeddingSettings = z.infer<typeof EmbeddingSettingsSchema>;\n\n// =============================================================================\n// Validation Helpers\n// =============================================================================\n\nexport function validateRegistry(data: unknown): Registry {\n return RegistrySchema.parse(data);\n}\n\nexport function validateConfig(data: unknown): Config {\n return ConfigSchema.parse(data);\n}\n\nexport function validateLockfile(data: unknown): Lockfile {\n return LockfileSchema.parse(data);\n}\n\n// =============================================================================\n// Safe Validation Helpers\n// =============================================================================\n\nexport type ValidationResult<T> =\n | { success: true; data: T }\n | { success: false; error: z.ZodError };\n\nexport function safeValidate<T>(\n schema: z.ZodType<T>,\n data: unknown\n): ValidationResult<T> {\n const result = schema.safeParse(data);\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error };\n}\n\nexport function safeValidateRegistry(data: unknown): ValidationResult<Registry> {\n return safeValidate(RegistrySchema, data);\n}\n\nexport function safeValidateConfig(data: unknown): ValidationResult<Config> {\n const result = ConfigSchema.safeParse(data);\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error };\n}\n\nexport function safeValidateLockfile(data: unknown): ValidationResult<Lockfile> {\n return safeValidate(LockfileSchema, data);\n}\n\nexport function validateGlobalConfig(data: unknown): GlobalConfig {\n return GlobalConfigSchema.parse(data);\n}\n\nexport function safeValidateGlobalConfig(data: unknown): ValidationResult<GlobalConfig> {\n return safeValidate(GlobalConfigSchema, data);\n}\n\n","/**\n * src/core/config.ts\n * Manages reading/writing the local .context/ directory files\n */\nimport fs from 'fs-extra';\nimport * as paths from '../utils/paths.js';\nimport {\n type Config,\n type Lockfile,\n type LockEntry,\n type PackageEntry,\n type SearchSettings,\n type PushSettings,\n type IndexSettings,\n safeValidateConfig,\n safeValidateLockfile,\n} from '../schemas/index.js';\n\n// Re-export settings types for convenience\nexport type { SearchSettings, PushSettings, IndexSettings };\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Directory Initialization\n// =============================================================================\n\n/**\n * Initialize the .context directory structure\n * Creates: .context/, .context/packages/, context.config.json, context.lock\n * Also updates .gitignore to exclude packages/\n */\nexport async function initContextDir(projectRoot: string): Promise<void> {\n const contextDir = paths.getContextDir(projectRoot);\n const packagesDir = paths.getPackagesDir(projectRoot);\n const configPath = paths.getConfigPath(projectRoot);\n const lockfilePath = paths.getLockfilePath(projectRoot);\n\n log.debug(`Initializing context directory at ${contextDir}`);\n\n // Create directories\n await paths.ensureDir(contextDir);\n await paths.ensureDir(packagesDir);\n\n // Create default config if it doesn't exist\n if (!(await paths.exists(configPath))) {\n const defaultConfig: Config = { packages: [] };\n await fs.writeJson(configPath, defaultConfig, { spaces: 2 });\n log.debug(`Created default config at ${configPath}`);\n }\n\n // Create empty lockfile if it doesn't exist\n if (!(await paths.exists(lockfilePath))) {\n const defaultLockfile: Lockfile = {};\n await fs.writeJson(lockfilePath, defaultLockfile, { spaces: 2 });\n log.debug(`Created default lockfile at ${lockfilePath}`);\n }\n\n // Auto-update .gitignore to exclude packages/\n await updateGitignore(projectRoot);\n}\n\n// =============================================================================\n// Config File Operations\n// =============================================================================\n\n/**\n * Check if a config file exists in the project\n */\nexport async function configExists(projectRoot: string): Promise<boolean> {\n const configPath = paths.getConfigPath(projectRoot);\n return paths.exists(configPath);\n}\n\n/**\n * Read the config file from the project\n * Returns null if the file doesn't exist\n */\nexport async function readConfig(projectRoot: string): Promise<Config | null> {\n const configPath = paths.getConfigPath(projectRoot);\n\n if (!(await paths.exists(configPath))) {\n log.debug(`Config file not found at ${configPath}`);\n return null;\n }\n\n try {\n const data = await fs.readJson(configPath);\n const result = safeValidateConfig(data);\n\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid config file: ${errorMessages}`);\n }\n\n log.debug(`Read config from ${configPath}`);\n return result.data;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Failed to parse config file: Invalid JSON at ${configPath}`);\n }\n throw error;\n }\n}\n\n/**\n * Write the config file to the project\n */\nexport async function writeConfig(projectRoot: string, config: Config): Promise<void> {\n const configPath = paths.getConfigPath(projectRoot);\n\n // Validate before writing\n const result = safeValidateConfig(config);\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid config data: ${errorMessages}`);\n }\n\n await fs.writeJson(configPath, config, { spaces: 2 });\n log.debug(`Wrote config to ${configPath}`);\n}\n\n// =============================================================================\n// Lockfile Operations\n// =============================================================================\n\n/**\n * Read the lockfile from the project\n * Returns empty object if the file doesn't exist (safe default)\n */\nexport async function readLockfile(projectRoot: string): Promise<Lockfile> {\n const lockfilePath = paths.getLockfilePath(projectRoot);\n\n if (!(await paths.exists(lockfilePath))) {\n log.debug(`Lockfile not found at ${lockfilePath}, returning empty lockfile`);\n return {};\n }\n\n try {\n const data = await fs.readJson(lockfilePath);\n const result = safeValidateLockfile(data);\n\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid lockfile: ${errorMessages}`);\n }\n\n log.debug(`Read lockfile from ${lockfilePath}`);\n return result.data;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Failed to parse lockfile: Invalid JSON at ${lockfilePath}`);\n }\n throw error;\n }\n}\n\n/**\n * Write the lockfile to the project\n */\nexport async function writeLockfile(projectRoot: string, lockfile: Lockfile): Promise<void> {\n const lockfilePath = paths.getLockfilePath(projectRoot);\n\n // Validate before writing\n const result = safeValidateLockfile(lockfile);\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid lockfile data: ${errorMessages}`);\n }\n\n await fs.writeJson(lockfilePath, lockfile, { spaces: 2 });\n log.debug(`Wrote lockfile to ${lockfilePath}`);\n}\n\n/**\n * Update a single entry in the lockfile\n * Reads current lockfile, updates the entry, and writes back atomically\n */\nexport async function updateLockEntry(\n projectRoot: string,\n alias: string,\n entry: LockEntry\n): Promise<void> {\n const lockfile = await readLockfile(projectRoot);\n\n // Update the entry with current timestamp\n lockfile[alias] = {\n ...entry,\n updatedAt: new Date().toISOString(),\n };\n\n await writeLockfile(projectRoot, lockfile);\n log.debug(`Updated lock entry for alias '${alias}'`);\n}\n\n/**\n * Remove a lock entry by alias\n */\nexport async function removeLockEntry(projectRoot: string, alias: string): Promise<void> {\n const lockfile = await readLockfile(projectRoot);\n\n if (alias in lockfile) {\n delete lockfile[alias];\n await writeLockfile(projectRoot, lockfile);\n log.debug(`Removed lock entry for alias '${alias}'`);\n }\n}\n\n/**\n * Get a single lock entry by alias\n * Returns undefined if not found\n */\nexport async function getLockEntry(\n projectRoot: string,\n alias: string\n): Promise<LockEntry | undefined> {\n const lockfile = await readLockfile(projectRoot);\n return lockfile[alias];\n}\n\n// =============================================================================\n// Package Helpers\n// =============================================================================\n\n/**\n * Add or update a package in the config\n */\nexport async function upsertPackage(\n projectRoot: string,\n pkg: PackageEntry\n): Promise<void> {\n const config = (await readConfig(projectRoot)) ?? { packages: [] };\n\n const existingIndex = config.packages.findIndex((p) => p.alias === pkg.alias);\n\n if (existingIndex >= 0) {\n config.packages[existingIndex] = pkg;\n log.debug(`Updated package '${pkg.alias}' in config`);\n } else {\n config.packages.push(pkg);\n log.debug(`Added package '${pkg.alias}' to config`);\n }\n\n await writeConfig(projectRoot, config);\n}\n\n/**\n * Remove a package from the config by alias\n */\nexport async function removePackage(projectRoot: string, alias: string): Promise<boolean> {\n const config = await readConfig(projectRoot);\n if (!config) return false;\n\n const initialLength = config.packages.length;\n config.packages = config.packages.filter((p) => p.alias !== alias);\n\n if (config.packages.length < initialLength) {\n await writeConfig(projectRoot, config);\n log.debug(`Removed package '${alias}' from config`);\n return true;\n }\n\n return false;\n}\n\n/**\n * Get a package entry from config by alias\n */\nexport async function getPackage(\n projectRoot: string,\n alias: string\n): Promise<PackageEntry | undefined> {\n const config = await readConfig(projectRoot);\n return config?.packages.find((p) => p.alias === alias);\n}\n\n// =============================================================================\n// Auto-Integration Helpers\n// =============================================================================\n\nconst GITIGNORE_ENTRY = '.context/packages/';\nconst GITIGNORE_COMMENT = '# nocaap packages';\n\n/**\n * Ensure .context/packages/ is in .gitignore\n */\nexport async function updateGitignore(projectRoot: string): Promise<boolean> {\n const gitignorePath = paths.join(projectRoot, '.gitignore');\n\n try {\n if (await paths.exists(gitignorePath)) {\n const content = await fs.readFile(gitignorePath, 'utf-8');\n if (content.includes(GITIGNORE_ENTRY)) {\n log.debug('.gitignore already contains nocaap entry');\n return false; // Already exists\n }\n // Append to existing file\n const newContent = content.endsWith('\\n') ? content : content + '\\n';\n await fs.writeFile(gitignorePath, `${newContent}\\n${GITIGNORE_COMMENT}\\n${GITIGNORE_ENTRY}\\n`);\n } else {\n // Create new .gitignore\n await fs.writeFile(gitignorePath, `${GITIGNORE_COMMENT}\\n${GITIGNORE_ENTRY}\\n`);\n }\n log.debug('Updated .gitignore with nocaap entry');\n return true;\n } catch (error) {\n log.debug(`Failed to update .gitignore: ${error}`);\n return false;\n }\n}\n\nconst CLAUDE_MD_CONTENT = `\n## Project Context\nThis project uses nocaap for organizational context.\nRead \\`.context/INDEX.md\\` for standards, guidelines, and documentation.\n`;\n\n/**\n * Add nocaap instruction to CLAUDE.md\n */\nexport async function updateClaudeMd(projectRoot: string): Promise<boolean> {\n const claudeMdPath = paths.join(projectRoot, 'CLAUDE.md');\n\n try {\n if (await paths.exists(claudeMdPath)) {\n const content = await fs.readFile(claudeMdPath, 'utf-8');\n if (content.includes('.context/INDEX.md')) {\n log.debug('CLAUDE.md already contains nocaap reference');\n return false;\n }\n // Append to existing file\n const newContent = content.endsWith('\\n') ? content : content + '\\n';\n await fs.writeFile(claudeMdPath, `${newContent}${CLAUDE_MD_CONTENT}`);\n } else {\n // Create new CLAUDE.md\n await fs.writeFile(claudeMdPath, `# CLAUDE.md${CLAUDE_MD_CONTENT}`);\n }\n log.debug('Updated CLAUDE.md with nocaap reference');\n return true;\n } catch (error) {\n log.debug(`Failed to update CLAUDE.md: ${error}`);\n return false;\n }\n}\n\n// =============================================================================\n// Project Settings Helpers\n// =============================================================================\n\n/**\n * Get search settings from project config\n */\nexport async function getSearchSettings(projectRoot: string): Promise<SearchSettings | undefined> {\n const config = await readConfig(projectRoot);\n return config?.search;\n}\n\n/**\n * Set search settings in project config\n */\nexport async function setSearchSettings(\n projectRoot: string,\n settings: SearchSettings\n): Promise<void> {\n const config = (await readConfig(projectRoot)) ?? { packages: [] };\n config.search = settings;\n await writeConfig(projectRoot, config);\n log.debug('Updated project search settings');\n}\n\n/**\n * Get push settings from project config\n */\nexport async function getPushSettings(projectRoot: string): Promise<PushSettings | undefined> {\n const config = await readConfig(projectRoot);\n return config?.push;\n}\n\n/**\n * Set push settings in project config\n */\nexport async function setPushSettings(\n projectRoot: string,\n settings: PushSettings\n): Promise<void> {\n const config = (await readConfig(projectRoot)) ?? { packages: [] };\n config.push = settings;\n await writeConfig(projectRoot, config);\n log.debug('Updated project push settings');\n}\n\n/**\n * Get index settings from project config\n */\nexport async function getIndexSettings(projectRoot: string): Promise<IndexSettings | undefined> {\n const config = await readConfig(projectRoot);\n return config?.index;\n}\n\n/**\n * Set index settings in project config\n */\nexport async function setIndexSettings(\n projectRoot: string,\n settings: IndexSettings\n): Promise<void> {\n const config = (await readConfig(projectRoot)) ?? { packages: [] };\n config.index = settings;\n await writeConfig(projectRoot, config);\n log.debug('Updated project index settings');\n}\n","/**\n * src/core/global-config.ts\n * Manages global nocaap configuration (~/.nocaap/config.json)\n */\nimport fs from 'fs-extra';\nimport os from 'os';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\nimport {\n type GlobalConfig,\n type PushSettings,\n type EmbeddingSettings,\n safeValidateGlobalConfig,\n} from '../schemas/index.js';\n\n// Re-export the type for backward compatibility\nexport type { GlobalConfig };\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst NOCAAP_DIR = '.nocaap';\nconst CONFIG_FILE = 'config.json';\n\n// =============================================================================\n// Path Helpers\n// =============================================================================\n\n/**\n * Get the global nocaap config directory path (~/.nocaap)\n */\nexport function getGlobalConfigDir(): string {\n return paths.join(os.homedir(), NOCAAP_DIR);\n}\n\n/**\n * Get the global config file path (~/.nocaap/config.json)\n */\nexport function getGlobalConfigPath(): string {\n return paths.join(getGlobalConfigDir(), CONFIG_FILE);\n}\n\n// =============================================================================\n// Config Operations\n// =============================================================================\n\n/**\n * Read the global config file\n * Returns empty object if file doesn't exist\n */\nexport async function getGlobalConfig(): Promise<GlobalConfig> {\n const configPath = getGlobalConfigPath();\n\n if (!(await paths.exists(configPath))) {\n log.debug(`Global config not found at ${configPath}`);\n return {};\n }\n\n try {\n const data = await fs.readJson(configPath);\n const result = safeValidateGlobalConfig(data);\n\n if (!result.success) {\n log.debug(`Invalid global config, using defaults: ${result.error.message}`);\n return {};\n }\n\n log.debug(`Read global config from ${configPath}`);\n return result.data;\n } catch (error) {\n log.debug(`Failed to read global config: ${error}`);\n return {};\n }\n}\n\n/**\n * Write the global config file\n */\nexport async function setGlobalConfig(config: GlobalConfig): Promise<void> {\n const configDir = getGlobalConfigDir();\n const configPath = getGlobalConfigPath();\n\n // Ensure directory exists\n await fs.ensureDir(configDir);\n\n // Add timestamp\n config.updatedAt = new Date().toISOString();\n\n await fs.writeJson(configPath, config, { spaces: 2 });\n log.debug(`Wrote global config to ${configPath}`);\n}\n\n// =============================================================================\n// Registry Helpers\n// =============================================================================\n\n/**\n * Get the default registry URL\n * Priority: Environment variable > Global config\n */\nexport async function getDefaultRegistry(): Promise<string | undefined> {\n // Check environment variable first\n const envRegistry = process.env.NOCAAP_DEFAULT_REGISTRY;\n if (envRegistry) {\n log.debug(`Using registry from NOCAAP_DEFAULT_REGISTRY env var`);\n return envRegistry;\n }\n\n // Fall back to global config\n const config = await getGlobalConfig();\n return config.defaultRegistry;\n}\n\n/**\n * Set the default registry URL in global config\n */\nexport async function setDefaultRegistry(url: string): Promise<void> {\n const config = await getGlobalConfig();\n config.defaultRegistry = url;\n await setGlobalConfig(config);\n log.debug(`Set default registry to ${url}`);\n}\n\n/**\n * Clear the default registry URL from global config\n */\nexport async function clearDefaultRegistry(): Promise<void> {\n const config = await getGlobalConfig();\n delete config.defaultRegistry;\n await setGlobalConfig(config);\n log.debug('Cleared default registry');\n}\n\n/**\n * Check if a default registry is configured\n */\nexport async function hasDefaultRegistry(): Promise<boolean> {\n const registry = await getDefaultRegistry();\n return !!registry;\n}\n\n// =============================================================================\n// Push Settings Helpers\n// =============================================================================\n\n/**\n * Get push settings from global config\n */\nexport async function getGlobalPushSettings(): Promise<PushSettings | undefined> {\n const config = await getGlobalConfig();\n return config.push;\n}\n\n/**\n * Set push settings in global config\n */\nexport async function setGlobalPushSettings(settings: PushSettings): Promise<void> {\n const config = await getGlobalConfig();\n config.push = settings;\n await setGlobalConfig(config);\n log.debug('Updated global push settings');\n}\n\n// =============================================================================\n// Embedding Settings Helpers\n// =============================================================================\n\n/**\n * Get embedding settings from global config\n */\nexport async function getGlobalEmbeddingSettings(): Promise<EmbeddingSettings | undefined> {\n const config = await getGlobalConfig();\n return config.embedding;\n}\n\n/**\n * Set embedding settings in global config\n */\nexport async function setGlobalEmbeddingSettings(settings: EmbeddingSettings): Promise<void> {\n const config = await getGlobalConfig();\n config.embedding = settings;\n await setGlobalConfig(config);\n log.debug('Updated global embedding settings');\n}\n\n","/**\n * src/core/chunker.ts\n * Converts markdown files into searchable chunks for Orama indexing\n */\nimport fs from 'fs-extra';\nimport matter from 'gray-matter';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Target chunk size in characters (~500 for Transformers.js compatibility) */\nconst TARGET_CHUNK_SIZE = 500;\n\n/** Minimum chunk size to avoid tiny fragments */\nconst MIN_CHUNK_SIZE = 100;\n\n/** Maximum size for README/index files (kept as single authoritative chunk) */\nconst README_MAX_SIZE = 2000;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ChunkMetadata {\n title: string;\n summary?: string;\n type?: string;\n tags: string[];\n}\n\nexport interface Chunk {\n /** Unique ID for this chunk */\n id: string;\n /** The text content of the chunk */\n content: string;\n /** Path to the source file relative to .context/ */\n path: string;\n /** Package alias this chunk belongs to */\n package: string;\n /** Heading hierarchy (e.g., [\"Getting Started\", \"Installation\"]) */\n headings: string[];\n /** Metadata extracted from frontmatter */\n metadata: ChunkMetadata;\n}\n\nexport interface ChunkResult {\n chunks: Chunk[];\n fileCount: number;\n chunkCount: number;\n}\n\n// =============================================================================\n// Markdown Parsing\n// =============================================================================\n\n/**\n * Extract heading hierarchy from heading line\n */\nfunction parseHeading(line: string): { level: number; text: string } | null {\n const match = line.match(/^(#{1,6})\\s+(.+)$/);\n if (!match || !match[1] || !match[2]) return null;\n return {\n level: match[1].length,\n text: match[2].trim(),\n };\n}\n\n/**\n * Split markdown content by H2 sections\n * Returns sections with their heading hierarchy\n */\nfunction splitByH2Sections(\n body: string,\n documentTitle: string\n): Array<{ headings: string[]; content: string }> {\n const lines = body.split('\\n');\n const sections: Array<{ headings: string[]; content: string }> = [];\n\n let currentHeadings: string[] = [documentTitle];\n let currentContent: string[] = [];\n let h1Seen = false;\n\n for (const line of lines) {\n const heading = parseHeading(line);\n\n if (heading) {\n // Skip the first H1 as it's usually the document title\n if (heading.level === 1 && !h1Seen) {\n h1Seen = true;\n continue;\n }\n\n // On H2, save current section and start new one\n if (heading.level === 2) {\n if (currentContent.length > 0) {\n const content = currentContent.join('\\n').trim();\n if (content.length >= MIN_CHUNK_SIZE) {\n sections.push({\n headings: [...currentHeadings],\n content,\n });\n }\n }\n currentHeadings = [documentTitle, heading.text];\n currentContent = [];\n continue;\n }\n\n // Track H3+ headings in hierarchy\n if (heading.level >= 3 && currentHeadings.length >= 2) {\n currentHeadings = [\n currentHeadings[0]!,\n currentHeadings[1]!,\n heading.text,\n ];\n }\n }\n\n currentContent.push(line);\n }\n\n // Don't forget the last section\n if (currentContent.length > 0) {\n const content = currentContent.join('\\n').trim();\n if (content.length >= MIN_CHUNK_SIZE) {\n sections.push({\n headings: [...currentHeadings],\n content,\n });\n }\n }\n\n // If no sections were created, create one from entire content\n if (sections.length === 0 && body.trim().length >= MIN_CHUNK_SIZE) {\n sections.push({\n headings: [documentTitle],\n content: body.trim(),\n });\n }\n\n return sections;\n}\n\n/**\n * Further split a section if it exceeds target chunk size\n */\nfunction splitLargeSection(\n section: { headings: string[]; content: string }\n): Array<{ headings: string[]; content: string }> {\n if (section.content.length <= TARGET_CHUNK_SIZE) {\n return [section];\n }\n\n // Split by paragraphs (double newlines)\n const paragraphs = section.content.split(/\\n\\n+/);\n const chunks: Array<{ headings: string[]; content: string }> = [];\n let currentChunk = '';\n\n for (const para of paragraphs) {\n if (currentChunk.length + para.length + 2 > TARGET_CHUNK_SIZE) {\n if (currentChunk.trim().length >= MIN_CHUNK_SIZE) {\n chunks.push({\n headings: section.headings,\n content: currentChunk.trim(),\n });\n }\n currentChunk = para;\n } else {\n currentChunk += (currentChunk ? '\\n\\n' : '') + para;\n }\n }\n\n // Don't forget the last chunk\n if (currentChunk.trim().length >= MIN_CHUNK_SIZE) {\n chunks.push({\n headings: section.headings,\n content: currentChunk.trim(),\n });\n }\n\n return chunks.length > 0 ? chunks : [section];\n}\n\n// =============================================================================\n// Main Chunking Function\n// =============================================================================\n\n/**\n * Chunk a single markdown file into searchable pieces\n */\nexport async function chunkFile(\n filePath: string,\n packageAlias: string,\n contextDir: string\n): Promise<Chunk[]> {\n const normalizedPath = paths.toUnix(filePath);\n const relativePath = paths.relative(contextDir, normalizedPath);\n\n log.debug(`Chunking file: ${relativePath}`);\n\n const fileContent = await fs.readFile(normalizedPath, 'utf-8');\n const { data: frontmatter, content: body } = matter(fileContent);\n\n // Extract metadata\n const title = extractTitle(frontmatter, body, normalizedPath);\n const summary = (frontmatter.summary ?? frontmatter.description) as string | undefined;\n const type = frontmatter.type as string | undefined;\n const tags = Array.isArray(frontmatter.tags)\n ? frontmatter.tags.filter((t): t is string => typeof t === 'string')\n : [];\n\n const metadata: ChunkMetadata = { title, summary, type, tags };\n\n // Check if this is a README/index file - keep as single authoritative chunk\n const filename = paths.basename(normalizedPath).toLowerCase();\n const isIndexFile = filename === 'readme.md' || filename === 'index.md';\n\n if (isIndexFile) {\n // Keep README/index files as single chunk to preserve overview context\n const content = body.trim().slice(0, README_MAX_SIZE);\n return [{\n id: `${relativePath}#0`,\n content,\n path: relativePath,\n package: packageAlias,\n headings: [title],\n metadata: { ...metadata, type: metadata.type ?? 'index' },\n }];\n }\n\n // Split into sections for regular files\n const sections = splitByH2Sections(body, title);\n\n // Further split large sections\n const allChunks: Array<{ headings: string[]; content: string }> = [];\n for (const section of sections) {\n allChunks.push(...splitLargeSection(section));\n }\n\n // Convert to Chunk objects with unique IDs\n return allChunks.map((chunk, index) => ({\n id: `${relativePath}#${index}`,\n content: chunk.content,\n path: relativePath,\n package: packageAlias,\n headings: chunk.headings,\n metadata,\n }));\n}\n\n/**\n * Extract title from frontmatter, first H1, or filename\n */\nfunction extractTitle(\n frontmatter: Record<string, unknown>,\n body: string,\n filePath: string\n): string {\n if (typeof frontmatter.title === 'string' && frontmatter.title.trim()) {\n return frontmatter.title.trim();\n }\n\n const h1Match = body.match(/^#\\s+(.+)$/m);\n if (h1Match?.[1]) {\n return h1Match[1].trim();\n }\n\n const filename = paths.basename(filePath, paths.extname(filePath));\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Chunk all markdown files in a package directory\n */\nexport async function chunkPackage(\n packagePath: string,\n packageAlias: string,\n contextDir: string\n): Promise<Chunk[]> {\n const chunks: Chunk[] = [];\n\n if (!(await paths.exists(packagePath))) {\n log.debug(`Package path does not exist: ${packagePath}`);\n return chunks;\n }\n\n const files = await findMarkdownFiles(packagePath);\n\n for (const file of files) {\n try {\n const fileChunks = await chunkFile(file, packageAlias, contextDir);\n chunks.push(...fileChunks);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to chunk ${file}: ${message}`);\n }\n }\n\n return chunks;\n}\n\n/**\n * Recursively find all markdown files in a directory\n */\nasync function findMarkdownFiles(dirPath: string): Promise<string[]> {\n const results: string[] = [];\n\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = paths.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\n continue;\n }\n const subFiles = await findMarkdownFiles(fullPath);\n results.push(...subFiles);\n } else if (entry.isFile()) {\n const ext = paths.extname(entry.name).toLowerCase();\n if (ext === '.md' || ext === '.mdx') {\n results.push(fullPath);\n }\n }\n }\n\n return results;\n}\n","/**\n * src/core/vector-store.ts\n * LanceDB wrapper for vector storage and search\n */\nimport fs from 'fs-extra';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\nimport type { EmbeddingMetadata } from './embeddings.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface VectorChunk {\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n vector: number[];\n}\n\nexport interface VectorResult {\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n score: number;\n}\n\ninterface StoredVectorMetadata {\n embedding: EmbeddingMetadata;\n chunkCount: number;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst VECTOR_DIR = 'vectors.lance';\nconst VECTOR_TABLE = 'chunks';\nconst METADATA_FILE = 'vector-metadata.json';\n\n// =============================================================================\n// Vector Store Class\n// =============================================================================\n\nexport class VectorStore {\n private db: unknown = null;\n private table: unknown = null;\n private projectRoot: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n }\n\n /**\n * Get the vector store directory path\n */\n private getVectorPath(): string {\n return paths.join(paths.getContextDir(this.projectRoot), VECTOR_DIR);\n }\n\n /**\n * Get the metadata file path\n */\n private getMetadataPath(): string {\n return paths.join(paths.getContextDir(this.projectRoot), METADATA_FILE);\n }\n\n /**\n * Check if a vector index exists\n */\n async exists(): Promise<boolean> {\n return paths.exists(this.getVectorPath());\n }\n\n /**\n * Initialize the vector store connection\n */\n async initialize(): Promise<boolean> {\n const vectorPath = this.getVectorPath();\n\n if (!(await paths.exists(vectorPath))) {\n log.debug('No vector index found');\n return false;\n }\n\n try {\n // Dynamic import for optional dependency\n const lancedb = await import('@lancedb/lancedb');\n this.db = await lancedb.connect(vectorPath);\n\n // Check if table exists\n const tableNames = await (this.db as { tableNames(): Promise<string[]> }).tableNames();\n if (tableNames.includes(VECTOR_TABLE)) {\n this.table = await (this.db as { openTable(name: string): Promise<unknown> }).openTable(VECTOR_TABLE);\n log.debug('Loaded existing vector index');\n return true;\n }\n\n return false;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to initialize vector store: ${message}`);\n return false;\n }\n }\n\n /**\n * Create a new vector index from chunks\n */\n async createIndex(chunks: VectorChunk[], metadata: EmbeddingMetadata): Promise<void> {\n const vectorPath = this.getVectorPath();\n\n try {\n // Dynamic import for optional dependency\n const lancedb = await import('@lancedb/lancedb');\n\n // Remove existing index if present\n if (await paths.exists(vectorPath)) {\n await fs.remove(vectorPath);\n }\n\n // Connect to new database\n this.db = await lancedb.connect(vectorPath);\n\n // Create table with chunks\n this.table = await (this.db as { createTable(name: string, data: unknown[]): Promise<unknown> })\n .createTable(VECTOR_TABLE, chunks);\n\n // Save metadata\n const storedMetadata: StoredVectorMetadata = {\n embedding: metadata,\n chunkCount: chunks.length,\n };\n await fs.writeJson(this.getMetadataPath(), storedMetadata, { spaces: 2 });\n\n log.debug(`Created vector index with ${chunks.length} chunks`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to create vector index: ${message}`);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(queryVector: number[], limit: number = 10): Promise<VectorResult[]> {\n if (!this.table) {\n throw new Error('Vector store not initialized');\n }\n\n try {\n // LanceDB vector search\n const results = await (this.table as {\n vectorSearch(vector: number[]): {\n limit(n: number): { toArray(): Promise<Array<{\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n _distance?: number;\n }>> };\n };\n }).vectorSearch(queryVector).limit(limit).toArray();\n\n return results.map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n title: r.title,\n // Convert distance to similarity score (lower distance = higher similarity)\n score: r._distance ? 1 / (1 + r._distance) : 1,\n }));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Vector search failed: ${message}`);\n }\n }\n\n /**\n * Get stored metadata\n */\n async getMetadata(): Promise<StoredVectorMetadata | null> {\n const metadataPath = this.getMetadataPath();\n\n if (!(await paths.exists(metadataPath))) {\n return null;\n }\n\n try {\n return await fs.readJson(metadataPath);\n } catch {\n return null;\n }\n }\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get the vector store directory path\n */\nexport function getVectorStorePath(projectRoot: string): string {\n return paths.join(paths.getContextDir(projectRoot), VECTOR_DIR);\n}\n\n/**\n * Check if a vector index exists\n */\nexport async function vectorIndexExists(projectRoot: string): Promise<boolean> {\n return paths.exists(getVectorStorePath(projectRoot));\n}\n","/**\n * src/core/embeddings.ts\n * Embedding provider detection and generation for semantic search\n */\nimport { log } from '../utils/logger.js';\nimport type { ResolvedEmbeddingSettings } from './settings.js';\n\n// =============================================================================\n// Module State\n// =============================================================================\n\n/** Embedding settings injected from config (or defaults) */\nlet embeddingSettings: ResolvedEmbeddingSettings | null = null;\n\n/**\n * Set embedding settings from configuration\n * Should be called before generating embeddings\n */\nexport function setEmbeddingSettings(settings: ResolvedEmbeddingSettings): void {\n embeddingSettings = settings;\n log.debug(`Embedding settings: provider=${settings.provider}, model=${settings.ollamaModel}`);\n}\n\n/**\n * Get the configured Ollama base URL (or default)\n */\nfunction getOllamaBaseUrl(): string {\n return embeddingSettings?.ollamaBaseUrl ?? 'http://localhost:11434';\n}\n\n/**\n * Get the configured Ollama model (or default)\n */\nfunction getOllamaModel(): string {\n return embeddingSettings?.ollamaModel ?? PROVIDER_CONFIG.ollama.model;\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type EmbeddingProvider = 'ollama' | 'openai' | 'tfjs' | 'auto';\n\nexport interface EmbeddingResult {\n vectors: number[][];\n model: string;\n dimensions: number;\n provider: EmbeddingProvider;\n}\n\nexport interface EmbeddingMetadata {\n provider: EmbeddingProvider;\n model: string;\n dimensions: number;\n createdAt: string;\n}\n\n// =============================================================================\n// Provider Configuration\n// =============================================================================\n\nconst PROVIDER_CONFIG = {\n ollama: {\n model: 'nomic-embed-text',\n dimensions: 768,\n batchSize: 50,\n },\n openai: {\n model: 'text-embedding-3-small',\n dimensions: 1536,\n batchSize: 100,\n },\n tfjs: {\n model: 'Xenova/all-MiniLM-L6-v2',\n dimensions: 384,\n batchSize: 32,\n },\n} as const;\n\n// =============================================================================\n// Provider Detection\n// =============================================================================\n\n/**\n * Detect the best available embedding provider\n * Priority: Ollama → OpenAI → Transformers.js\n */\nexport async function detectProvider(): Promise<Exclude<EmbeddingProvider, 'auto'>> {\n // 1. Check for Ollama\n if (await isOllamaAvailable()) {\n log.debug('Detected Ollama with embedding model');\n return 'ollama';\n }\n\n // 2. Check for OpenAI API key\n if (process.env.OPENAI_API_KEY) {\n log.debug('Detected OpenAI API key');\n return 'openai';\n }\n\n // 3. Fall back to Transformers.js\n log.debug('Using Transformers.js embeddings (fallback)');\n return 'tfjs';\n}\n\n/**\n * Check if Ollama is running with an embedding model\n */\nasync function isOllamaAvailable(): Promise<boolean> {\n try {\n const baseUrl = getOllamaBaseUrl();\n const response = await fetch(`${baseUrl}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n\n if (!response.ok) return false;\n\n const data = await response.json() as { models?: Array<{ name: string }> };\n const hasEmbedModel = data.models?.some((m) =>\n m.name.includes('nomic-embed') ||\n m.name.includes('mxbai-embed') ||\n m.name.includes('all-minilm')\n );\n\n return hasEmbedModel ?? false;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// Embedding Generation\n// =============================================================================\n\n/**\n * Generate embeddings for an array of texts\n */\nexport async function generateEmbeddings(\n texts: string[],\n provider: EmbeddingProvider\n): Promise<EmbeddingResult> {\n const resolvedProvider = provider === 'auto' ? await detectProvider() : provider;\n\n log.debug(`Generating ${texts.length} embeddings with ${resolvedProvider}`);\n\n switch (resolvedProvider) {\n case 'ollama':\n return generateOllamaEmbeddings(texts);\n case 'openai':\n return generateOpenAIEmbeddings(texts);\n case 'tfjs':\n return generateTfjsEmbeddings(texts);\n default:\n throw new Error(`Unknown provider: ${resolvedProvider}`);\n }\n}\n\n/**\n * Generate a single embedding for a query\n */\nexport async function generateQueryEmbedding(\n query: string,\n provider: EmbeddingProvider\n): Promise<number[]> {\n const result = await generateEmbeddings([query], provider);\n return result.vectors[0]!;\n}\n\n// =============================================================================\n// Ollama Provider\n// =============================================================================\n\nasync function generateOllamaEmbeddings(texts: string[]): Promise<EmbeddingResult> {\n const config = PROVIDER_CONFIG.ollama;\n const model = getOllamaModel();\n const vectors: number[][] = [];\n\n // Process in batches\n for (let i = 0; i < texts.length; i += config.batchSize) {\n const batch = texts.slice(i, i + config.batchSize);\n\n try {\n // Dynamic import to handle optional dependency\n const ollama = await import('ollama');\n const response = await ollama.default.embed({\n model,\n input: batch,\n });\n\n vectors.push(...response.embeddings);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Ollama embedding failed: ${message}`);\n }\n }\n\n return {\n vectors,\n model,\n dimensions: config.dimensions,\n provider: 'ollama',\n };\n}\n\n// =============================================================================\n// OpenAI Provider\n// =============================================================================\n\nasync function generateOpenAIEmbeddings(texts: string[]): Promise<EmbeddingResult> {\n const config = PROVIDER_CONFIG.openai;\n const apiKey = process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error('OPENAI_API_KEY environment variable is required');\n }\n\n const vectors: number[][] = [];\n\n // Process in batches\n for (let i = 0; i < texts.length; i += config.batchSize) {\n const batch = texts.slice(i, i + config.batchSize);\n\n const response = await fetch('https://api.openai.com/v1/embeddings', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: config.model,\n input: batch,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI embedding failed: ${error}`);\n }\n\n const data = await response.json() as {\n data: Array<{ embedding: number[] }>;\n };\n\n vectors.push(...data.data.map((d) => d.embedding));\n }\n\n return {\n vectors,\n model: config.model,\n dimensions: config.dimensions,\n provider: 'openai',\n };\n}\n\n// =============================================================================\n// Transformers.js Provider\n// =============================================================================\n\nasync function generateTfjsEmbeddings(texts: string[]): Promise<EmbeddingResult> {\n const config = PROVIDER_CONFIG.tfjs;\n\n try {\n // Dynamic import for Transformers.js\n const { pipeline } = await import('@xenova/transformers');\n\n // Initialize the embedding pipeline\n const embedder = await pipeline('feature-extraction', config.model);\n\n const vectors: number[][] = [];\n\n // Process in batches\n for (let i = 0; i < texts.length; i += config.batchSize) {\n const batch = texts.slice(i, i + config.batchSize);\n\n for (const text of batch) {\n const output = await embedder(text, {\n pooling: 'mean',\n normalize: true,\n });\n\n // Extract the embedding vector\n vectors.push(Array.from(output.data as Float32Array));\n }\n }\n\n return {\n vectors,\n model: config.model,\n dimensions: config.dimensions,\n provider: 'tfjs',\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Transformers.js embedding failed: ${message}`);\n }\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get provider configuration\n */\nexport function getProviderConfig(provider: Exclude<EmbeddingProvider, 'auto'>) {\n return PROVIDER_CONFIG[provider];\n}\n","/**\n * src/core/fusion.ts\n * Reciprocal Rank Fusion (RRF) algorithm for combining search results\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RankedResult {\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n score: number;\n}\n\nexport interface FusionResult {\n id: string;\n content: string;\n path: string;\n package: string;\n title: string;\n score: number;\n sources: {\n fulltext?: number;\n vector?: number;\n };\n}\n\n/** Configuration options for RRF */\nexport interface RRFOptions {\n /** Smoothing constant (default: 60, empirically optimal) */\n k?: number;\n /** Weight for fulltext/BM25 results (default: 0.4) */\n fulltextWeight?: number;\n /** Weight for vector/semantic results (default: 0.6) */\n vectorWeight?: number;\n}\n\n// =============================================================================\n// Reciprocal Rank Fusion\n// =============================================================================\n\n/**\n * Combine BM25 (full-text) and vector search results using weighted RRF\n *\n * Formula: RRF(d) = Σ weight * (1/(k + rank(d)))\n *\n * Where k is a constant (typically 60) that controls how much higher-ranked\n * documents are weighted relative to lower-ranked ones.\n *\n * RRF is rank-based (not score-based) which makes it robust to different\n * scoring scales between BM25 and vector similarity.\n *\n * @param fulltextResults - Results from BM25 full-text search\n * @param vectorResults - Results from vector similarity search\n * @param options - RRF configuration options\n * @returns Combined and re-ranked results\n */\nexport function reciprocalRankFusion(\n fulltextResults: RankedResult[],\n vectorResults: RankedResult[],\n options: RRFOptions = {}\n): FusionResult[] {\n const { k = 60, fulltextWeight = 0.4, vectorWeight = 0.6 } = options;\n\n const scores = new Map<string, {\n score: number;\n doc: RankedResult;\n sources: { fulltext?: number; vector?: number };\n }>();\n\n // Process fulltext results WITH weight\n fulltextResults.forEach((doc, rank) => {\n const rrfScore = fulltextWeight * (1 / (k + rank + 1));\n const existing = scores.get(doc.id);\n\n if (existing) {\n existing.score += rrfScore;\n existing.sources.fulltext = rank + 1;\n } else {\n scores.set(doc.id, {\n score: rrfScore,\n doc,\n sources: { fulltext: rank + 1 },\n });\n }\n });\n\n // Process vector results WITH weight\n vectorResults.forEach((doc, rank) => {\n const rrfScore = vectorWeight * (1 / (k + rank + 1));\n const existing = scores.get(doc.id);\n\n if (existing) {\n existing.score += rrfScore;\n existing.sources.vector = rank + 1;\n } else {\n scores.set(doc.id, {\n score: rrfScore,\n doc,\n sources: { vector: rank + 1 },\n });\n }\n });\n\n // Sort by combined score (descending)\n return Array.from(scores.values())\n .sort((a, b) => b.score - a.score)\n .map(({ doc, score, sources }) => ({\n id: doc.id,\n content: doc.content,\n path: doc.path,\n package: doc.package,\n title: doc.title,\n score,\n sources,\n }));\n}\n\n/**\n * Normalize scores to 0-1 range\n */\nexport function normalizeScores(results: FusionResult[]): FusionResult[] {\n if (results.length === 0) return results;\n\n const maxScore = Math.max(...results.map((r) => r.score));\n if (maxScore === 0) return results;\n\n return results.map((r) => ({\n ...r,\n score: r.score / maxScore,\n }));\n}\n","/**\n * src/core/settings.ts\n * Resolves merged configuration from all sources\n * Priority: CLI overrides > Project config > Global config > Defaults\n */\nimport {\n getGlobalPushSettings,\n getGlobalEmbeddingSettings,\n} from './global-config.js';\nimport {\n getSearchSettings,\n getPushSettings,\n getIndexSettings,\n} from './config.js';\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ResolvedSearchSettings {\n fulltextWeight: number;\n vectorWeight: number;\n rrfK: number;\n}\n\nexport interface ResolvedPushSettings {\n baseBranch?: string;\n}\n\nexport interface ResolvedEmbeddingSettings {\n provider: 'ollama' | 'openai' | 'tfjs' | 'auto';\n ollamaModel: string;\n ollamaBaseUrl: string;\n}\n\nexport interface ResolvedIndexSettings {\n semantic: boolean;\n provider: 'ollama' | 'openai' | 'tfjs' | 'auto';\n}\n\nexport interface ResolvedSettings {\n search: ResolvedSearchSettings;\n push: ResolvedPushSettings;\n embedding: ResolvedEmbeddingSettings;\n index: ResolvedIndexSettings;\n}\n\n/** Partial version for CLI overrides */\nexport interface SettingsOverrides {\n search?: Partial<ResolvedSearchSettings>;\n push?: Partial<ResolvedPushSettings>;\n embedding?: Partial<ResolvedEmbeddingSettings>;\n index?: Partial<ResolvedIndexSettings>;\n}\n\n// =============================================================================\n// Default Values\n// =============================================================================\n\nconst DEFAULTS: ResolvedSettings = {\n search: {\n fulltextWeight: 0.4,\n vectorWeight: 0.6,\n rrfK: 60,\n },\n push: {},\n embedding: {\n provider: 'auto',\n ollamaModel: 'nomic-embed-text',\n ollamaBaseUrl: 'http://localhost:11434',\n },\n index: {\n semantic: false,\n provider: 'auto',\n },\n};\n\n/**\n * Get the default settings (useful for reference)\n */\nexport function getDefaults(): ResolvedSettings {\n return structuredClone(DEFAULTS);\n}\n\n// =============================================================================\n// Settings Resolver\n// =============================================================================\n\n/**\n * Resolve all settings by merging: defaults < global < project < cli overrides\n */\nexport async function resolveSettings(\n projectRoot: string,\n cliOverrides?: SettingsOverrides\n): Promise<ResolvedSettings> {\n log.debug('Resolving settings...');\n\n // Start with defaults\n const resolved = structuredClone(DEFAULTS);\n\n // Layer 1: Global config (embedding and push only)\n const globalPush = await getGlobalPushSettings();\n const globalEmbedding = await getGlobalEmbeddingSettings();\n\n if (globalPush?.baseBranch) {\n resolved.push.baseBranch = globalPush.baseBranch;\n log.debug(`Using global push.baseBranch: ${globalPush.baseBranch}`);\n }\n\n if (globalEmbedding) {\n if (globalEmbedding.provider) {\n resolved.embedding.provider = globalEmbedding.provider;\n }\n if (globalEmbedding.ollamaModel) {\n resolved.embedding.ollamaModel = globalEmbedding.ollamaModel;\n }\n if (globalEmbedding.ollamaBaseUrl) {\n resolved.embedding.ollamaBaseUrl = globalEmbedding.ollamaBaseUrl;\n }\n log.debug('Applied global embedding settings');\n }\n\n // Layer 2: Project config\n const projectSearch = await getSearchSettings(projectRoot);\n const projectPush = await getPushSettings(projectRoot);\n const projectIndex = await getIndexSettings(projectRoot);\n\n if (projectSearch) {\n if (projectSearch.fulltextWeight !== undefined) {\n resolved.search.fulltextWeight = projectSearch.fulltextWeight;\n }\n if (projectSearch.vectorWeight !== undefined) {\n resolved.search.vectorWeight = projectSearch.vectorWeight;\n }\n if (projectSearch.rrfK !== undefined) {\n resolved.search.rrfK = projectSearch.rrfK;\n }\n log.debug('Applied project search settings');\n }\n\n if (projectPush?.baseBranch) {\n resolved.push.baseBranch = projectPush.baseBranch;\n log.debug(`Using project push.baseBranch: ${projectPush.baseBranch}`);\n }\n\n if (projectIndex) {\n if (projectIndex.semantic !== undefined) {\n resolved.index.semantic = projectIndex.semantic;\n }\n if (projectIndex.provider !== undefined) {\n resolved.index.provider = projectIndex.provider;\n }\n log.debug('Applied project index settings');\n }\n\n // Layer 3: CLI overrides (highest priority)\n if (cliOverrides) {\n applyOverrides(resolved, cliOverrides);\n log.debug('Applied CLI overrides');\n }\n\n return resolved;\n}\n\n// =============================================================================\n// Convenience Resolvers\n// =============================================================================\n\n/**\n * Resolve just search settings (for search-engine.ts)\n */\nexport async function resolveSearchSettings(\n projectRoot: string,\n cliOverrides?: Partial<ResolvedSearchSettings>\n): Promise<ResolvedSearchSettings> {\n const all = await resolveSettings(projectRoot, cliOverrides ? { search: cliOverrides } : undefined);\n return all.search;\n}\n\n/**\n * Resolve just embedding settings (for embeddings.ts)\n */\nexport async function resolveEmbeddingSettings(\n projectRoot: string,\n cliOverrides?: Partial<ResolvedEmbeddingSettings>\n): Promise<ResolvedEmbeddingSettings> {\n const all = await resolveSettings(projectRoot, cliOverrides ? { embedding: cliOverrides } : undefined);\n return all.embedding;\n}\n\n/**\n * Resolve just push settings\n */\nexport async function resolvePushSettings(\n projectRoot: string,\n cliOverrides?: Partial<ResolvedPushSettings>\n): Promise<ResolvedPushSettings> {\n const all = await resolveSettings(projectRoot, cliOverrides ? { push: cliOverrides } : undefined);\n return all.push;\n}\n\n/**\n * Resolve just index settings\n */\nexport async function resolveIndexSettings(\n projectRoot: string,\n cliOverrides?: Partial<ResolvedIndexSettings>\n): Promise<ResolvedIndexSettings> {\n const all = await resolveSettings(projectRoot, cliOverrides ? { index: cliOverrides } : undefined);\n return all.index;\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\n/**\n * Apply CLI overrides to resolved settings (mutates target)\n */\nfunction applyOverrides(\n target: ResolvedSettings,\n overrides: SettingsOverrides\n): void {\n if (overrides.search) {\n if (overrides.search.fulltextWeight !== undefined) {\n target.search.fulltextWeight = overrides.search.fulltextWeight;\n }\n if (overrides.search.vectorWeight !== undefined) {\n target.search.vectorWeight = overrides.search.vectorWeight;\n }\n if (overrides.search.rrfK !== undefined) {\n target.search.rrfK = overrides.search.rrfK;\n }\n }\n\n if (overrides.push) {\n if (overrides.push.baseBranch !== undefined) {\n target.push.baseBranch = overrides.push.baseBranch;\n }\n }\n\n if (overrides.embedding) {\n if (overrides.embedding.provider !== undefined) {\n target.embedding.provider = overrides.embedding.provider;\n }\n if (overrides.embedding.ollamaModel !== undefined) {\n target.embedding.ollamaModel = overrides.embedding.ollamaModel;\n }\n if (overrides.embedding.ollamaBaseUrl !== undefined) {\n target.embedding.ollamaBaseUrl = overrides.embedding.ollamaBaseUrl;\n }\n }\n\n if (overrides.index) {\n if (overrides.index.semantic !== undefined) {\n target.index.semantic = overrides.index.semantic;\n }\n if (overrides.index.provider !== undefined) {\n target.index.provider = overrides.index.provider;\n }\n }\n}\n","/**\n * src/core/search-engine.ts\n * Orama-based search engine for full-text search over context packages\n * Extended with hybrid search (BM25 + vector) via Reciprocal Rank Fusion\n */\nimport fs from 'fs-extra';\nimport { create, insertMultiple, search, type Orama } from '@orama/orama';\nimport { persist, restore } from '@orama/plugin-data-persistence';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\nimport type { Chunk } from './chunker.js';\nimport { VectorStore } from './vector-store.js';\nimport { generateQueryEmbedding, type EmbeddingProvider } from './embeddings.js';\nimport { reciprocalRankFusion, normalizeScores, type RankedResult } from './fusion.js';\nimport { resolveSearchSettings, type ResolvedSearchSettings } from './settings.js';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Search index file name */\nexport const SEARCH_INDEX_FILE = 'index.orama.json';\n\n/** Default search limit */\nconst DEFAULT_LIMIT = 10;\n\n/** Index version for future compatibility */\nconst INDEX_VERSION = '1.0.0';\n\n/** Default RRF settings (used when settings can't be resolved) */\nconst DEFAULT_SEARCH_SETTINGS: ResolvedSearchSettings = {\n fulltextWeight: 0.4,\n vectorWeight: 0.6,\n rrfK: 60,\n};\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Orama document schema matching our chunks */\ninterface OramaDocument {\n id: string;\n content: string;\n path: string;\n package: string;\n headings: string[];\n title: string;\n summary: string;\n type: string;\n tags: string[];\n}\n\n/** Search result type */\nexport interface SearchResult {\n id: string;\n content: string;\n path: string;\n package: string;\n headings: string[];\n title: string;\n score: number;\n}\n\n/** Search mode for hybrid search */\nexport type SearchMode = 'fulltext' | 'semantic' | 'hybrid';\n\n/** Hybrid search result with source info */\nexport interface HybridSearchResult extends SearchResult {\n sources?: {\n fulltext?: number;\n vector?: number;\n };\n}\n\n/** Index metadata for versioning */\ninterface IndexMetadata {\n version: string;\n createdAt: string;\n chunkCount: number;\n packages: string[];\n}\n\n/** Stored index format */\ninterface StoredIndex {\n metadata: IndexMetadata;\n data: unknown;\n}\n\n// =============================================================================\n// Schema Definition\n// =============================================================================\n\nconst oramaSchema = {\n id: 'string',\n content: 'string',\n path: 'string',\n package: 'string',\n headings: 'string[]',\n title: 'string',\n summary: 'string',\n type: 'string',\n tags: 'string[]',\n} as const;\n\n// =============================================================================\n// Query Processing Helpers\n// =============================================================================\n\n/** Stop words to exclude from path matching */\nconst STOP_WORDS = new Set([\n 'what', 'is', 'the', 'a', 'an', 'how', 'do', 'does', 'are', 'was',\n 'were', 'been', 'being', 'have', 'has', 'had', 'having', 'who',\n 'which', 'where', 'when', 'why', 'can', 'could', 'would', 'should',\n 'of', 'on', 'in', 'to', 'for', 'with', 'by', 'from', 'at', 'about',\n]);\n\n/**\n * Extract meaningful keywords from query for path boosting\n */\nfunction extractQueryKeywords(query: string): string[] {\n return query\n .toLowerCase()\n .split(/\\s+/)\n .filter(word => word.length > 2 && !STOP_WORDS.has(word));\n}\n\n// =============================================================================\n// Search Engine Class\n// =============================================================================\n\nexport class SearchEngine {\n private db: Orama<typeof oramaSchema> | null = null;\n private metadata: IndexMetadata | null = null;\n private vectorStore: VectorStore | null = null;\n private projectRoot: string | null = null;\n private embeddingProvider: EmbeddingProvider = 'auto';\n private searchSettings: ResolvedSearchSettings = DEFAULT_SEARCH_SETTINGS;\n\n /**\n * Check if the search engine has been initialized\n */\n isInitialized(): boolean {\n return this.db !== null;\n }\n\n /**\n * Create a new search index from chunks\n */\n async createIndex(chunks: Chunk[]): Promise<void> {\n log.debug(`Creating search index with ${chunks.length} chunks`);\n\n this.db = await create({ schema: oramaSchema });\n\n // Convert chunks to Orama documents\n const documents: OramaDocument[] = chunks.map((chunk) => ({\n id: chunk.id,\n content: chunk.content,\n path: chunk.path,\n package: chunk.package,\n headings: chunk.headings,\n title: chunk.metadata.title,\n summary: chunk.metadata.summary ?? '',\n type: chunk.metadata.type ?? '',\n tags: chunk.metadata.tags,\n }));\n\n // Batch insert for performance\n await insertMultiple(this.db, documents, 500);\n\n // Extract unique packages\n const packages = [...new Set(chunks.map((c) => c.package))];\n\n this.metadata = {\n version: INDEX_VERSION,\n createdAt: new Date().toISOString(),\n chunkCount: chunks.length,\n packages,\n };\n\n log.debug(`Search index created with ${chunks.length} documents`);\n }\n\n /**\n * Save the index to a JSON file\n */\n async saveIndex(projectRoot: string): Promise<void> {\n if (!this.db || !this.metadata) {\n throw new Error('No index to save. Call createIndex first.');\n }\n\n const indexPath = paths.join(paths.getContextDir(projectRoot), SEARCH_INDEX_FILE);\n\n // Persist database to JSON format\n const data = await persist(this.db, 'json');\n\n const storedIndex: StoredIndex = {\n metadata: this.metadata,\n data,\n };\n\n await fs.writeJson(indexPath, storedIndex, { spaces: 2 });\n log.debug(`Saved search index to ${indexPath}`);\n }\n\n /**\n * Load an existing index from file\n */\n async loadIndex(projectRoot: string): Promise<boolean> {\n const indexPath = paths.join(paths.getContextDir(projectRoot), SEARCH_INDEX_FILE);\n this.projectRoot = projectRoot;\n\n if (!(await paths.exists(indexPath))) {\n log.debug('No existing search index found');\n return false;\n }\n\n try {\n const storedIndex: StoredIndex = await fs.readJson(indexPath);\n\n // Restore database from JSON (type assertion is safe since we created with same schema)\n this.db = await restore('json', storedIndex.data as string) as Orama<typeof oramaSchema>;\n this.metadata = storedIndex.metadata;\n\n log.debug(`Loaded search index: ${this.metadata.chunkCount} chunks`);\n\n // Try to initialize vector store if it exists\n await this.initializeVectorStore();\n\n // Load search settings from config\n try {\n this.searchSettings = await resolveSearchSettings(projectRoot);\n log.debug(`Search settings: fulltext=${this.searchSettings.fulltextWeight}, vector=${this.searchSettings.vectorWeight}, k=${this.searchSettings.rrfK}`);\n } catch {\n log.debug('Could not resolve search settings, using defaults');\n this.searchSettings = DEFAULT_SEARCH_SETTINGS;\n }\n\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to load search index: ${message}`);\n return false;\n }\n }\n\n /**\n * Initialize the vector store if available\n */\n private async initializeVectorStore(): Promise<boolean> {\n if (!this.projectRoot) return false;\n\n try {\n const store = new VectorStore(this.projectRoot);\n const initialized = await store.initialize();\n\n if (initialized) {\n this.vectorStore = store;\n const metadata = await store.getMetadata();\n if (metadata) {\n this.embeddingProvider = metadata.embedding.provider;\n log.debug(`Loaded vector store (${metadata.embedding.model})`);\n }\n return true;\n }\n\n // No vector index found\n this.vectorStore = null;\n return false;\n } catch {\n log.debug('Vector store not available');\n this.vectorStore = null;\n return false;\n }\n }\n\n /**\n * Check if vector search is available\n */\n hasVectorSearch(): boolean {\n return this.vectorStore !== null;\n }\n\n /**\n * Search the index\n */\n async search(options: {\n query: string;\n packages?: string[];\n tags?: string[];\n limit?: number;\n }): Promise<SearchResult[]> {\n if (!this.db) {\n throw new Error('Search engine not initialized. Call loadIndex or createIndex first.');\n }\n\n const { query, packages, tags, limit = DEFAULT_LIMIT } = options;\n\n // Build filter if needed\n let where: Record<string, unknown> | undefined;\n\n if (packages?.length || tags?.length) {\n where = {};\n if (packages?.length) {\n where.package = packages;\n }\n if (tags?.length) {\n where.tags = { containsAll: tags };\n }\n }\n\n const results = await search(this.db, {\n term: query,\n properties: ['content', 'title', 'summary', 'headings'],\n limit,\n where,\n });\n\n return results.hits.map((hit) => ({\n id: hit.document.id,\n content: hit.document.content,\n path: hit.document.path,\n package: hit.document.package,\n headings: hit.document.headings,\n title: hit.document.title,\n score: hit.score,\n }));\n }\n\n /**\n * Get index metadata\n */\n getMetadata(): IndexMetadata | null {\n return this.metadata;\n }\n\n /**\n * Get list of indexed packages\n */\n getPackages(): string[] {\n return this.metadata?.packages ?? [];\n }\n\n /**\n * Hybrid search combining fulltext (BM25) and vector (semantic) search\n */\n async hybridSearch(options: {\n query: string;\n mode?: SearchMode;\n packages?: string[];\n limit?: number;\n }): Promise<HybridSearchResult[]> {\n const { query, mode = 'fulltext', packages, limit = DEFAULT_LIMIT } = options;\n\n // Fulltext-only mode\n if (mode === 'fulltext') {\n return this.search({ query, packages, limit });\n }\n\n // Semantic or hybrid mode requires vector store\n if (!this.vectorStore) {\n if (mode === 'semantic') {\n throw new Error('Vector search not available. Run \"nocaap index --semantic\" first.');\n }\n // Fall back to fulltext for hybrid if no vector store\n log.debug('Vector store not available, falling back to fulltext search');\n return this.search({ query, packages, limit });\n }\n\n // Generate query embedding\n const queryVector = await generateQueryEmbedding(query, this.embeddingProvider);\n\n // Semantic-only mode\n if (mode === 'semantic') {\n const vectorResults = await this.vectorStore.search(queryVector, limit);\n return vectorResults.map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n headings: [],\n title: r.title,\n score: r.score,\n sources: { vector: 1 },\n }));\n }\n\n // Hybrid mode: combine BM25 and vector results with RRF\n const [fulltextResults, vectorResults] = await Promise.all([\n this.search({ query, packages, limit: limit * 2 }),\n this.vectorStore.search(queryVector, limit * 2),\n ]);\n\n // Convert to RankedResult format for fusion\n const ftRanked: RankedResult[] = fulltextResults.map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n title: r.title,\n score: r.score,\n }));\n\n const vecRanked: RankedResult[] = vectorResults.map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n title: r.title,\n score: r.score,\n }));\n\n // Apply Reciprocal Rank Fusion with weighted scoring from config\n const fused = reciprocalRankFusion(ftRanked, vecRanked, {\n fulltextWeight: this.searchSettings.fulltextWeight,\n vectorWeight: this.searchSettings.vectorWeight,\n k: this.searchSettings.rrfK,\n });\n\n // Apply path-based boost (keywords in query matching folder/file names)\n const queryKeywords = extractQueryKeywords(query);\n for (const result of fused) {\n const pathLower = result.path.toLowerCase();\n let boost = 1.0;\n for (const keyword of queryKeywords) {\n if (pathLower.includes(keyword)) {\n boost *= 1.15; // 15% boost per keyword match in path\n }\n }\n result.score *= boost;\n }\n\n // Boost index documents (README.md, index.md)\n for (const result of fused) {\n const pathLower = result.path.toLowerCase();\n if (pathLower.endsWith('readme.md') || pathLower.endsWith('index.md')) {\n result.score *= 1.25; // 25% boost for index documents\n }\n }\n\n // Re-sort after boosting\n fused.sort((a, b) => b.score - a.score);\n\n const normalized = normalizeScores(fused);\n\n // Convert back to HybridSearchResult format\n return normalized.slice(0, limit).map((r) => ({\n id: r.id,\n content: r.content,\n path: r.path,\n package: r.package,\n headings: [],\n title: r.title,\n score: r.score,\n sources: r.sources,\n }));\n }\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get the search index file path\n */\nexport function getSearchIndexPath(projectRoot: string): string {\n return paths.join(paths.getContextDir(projectRoot), SEARCH_INDEX_FILE);\n}\n\n/**\n * Check if a search index exists\n */\nexport async function searchIndexExists(projectRoot: string): Promise<boolean> {\n return paths.exists(getSearchIndexPath(projectRoot));\n}\n","/**\n * src/commands/index-search.ts\n * Build the search index from markdown files in context packages\n * Supports both fulltext (Orama/BM25) and semantic (vector) search\n */\nimport { readConfig } from '../core/config.js';\nimport { chunkPackage } from '../core/chunker.js';\nimport { SearchEngine, getSearchIndexPath } from '../core/search-engine.js';\nimport { VectorStore, getVectorStorePath } from '../core/vector-store.js';\nimport {\n detectProvider,\n generateEmbeddings,\n getProviderConfig,\n setEmbeddingSettings,\n type EmbeddingProvider,\n} from '../core/embeddings.js';\nimport { resolveEmbeddingSettings } from '../core/settings.js';\nimport * as paths from '../utils/paths.js';\nimport { log, withSpinner } from '../utils/logger.js';\nimport type { Chunk } from '../core/chunker.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface IndexSearchOptions {\n semantic?: boolean;\n provider?: EmbeddingProvider;\n}\n\nexport interface IndexSearchResult {\n chunkCount: number;\n fileCount: number;\n packages: string[];\n indexPath: string;\n vectorIndexPath?: string;\n embeddingProvider?: string;\n embeddingModel?: string;\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Build the search index from all installed packages\n */\nexport async function indexSearchCommand(\n options: IndexSearchOptions = {}\n): Promise<IndexSearchResult> {\n const { semantic = false, provider = 'auto' } = options;\n const projectRoot = process.cwd();\n const contextDir = paths.getContextDir(projectRoot);\n\n // Check if .context directory exists\n if (!(await paths.exists(contextDir))) {\n throw new Error(\n 'No .context directory found. Run `nocaap setup` or `nocaap add` first.'\n );\n }\n\n // Read config to get installed packages\n const config = await readConfig(projectRoot);\n if (!config || config.packages.length === 0) {\n throw new Error(\n 'No packages configured. Run `nocaap setup` or `nocaap add` first.'\n );\n }\n\n // Load embedding settings from config (for semantic indexing)\n if (semantic) {\n const embeddingSettings = await resolveEmbeddingSettings(projectRoot);\n setEmbeddingSettings(embeddingSettings);\n }\n\n log.info(`Building search index for ${config.packages.length} package(s)...`);\n\n // Collect chunks from all packages\n const allChunks: Chunk[] = [];\n let totalFiles = 0;\n const indexedPackages: string[] = [];\n\n for (const pkg of config.packages) {\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n\n if (!(await paths.exists(packagePath))) {\n log.warn(`Package directory not found: ${pkg.alias}`);\n continue;\n }\n\n const chunks = await withSpinner(\n `Chunking ${pkg.alias}...`,\n async () => chunkPackage(packagePath, pkg.alias, contextDir),\n { successText: `Chunked ${pkg.alias}` }\n );\n\n if (chunks.length > 0) {\n allChunks.push(...chunks);\n indexedPackages.push(pkg.alias);\n\n // Estimate files from unique paths\n const uniquePaths = new Set(chunks.map((c) => c.path));\n totalFiles += uniquePaths.size;\n } else {\n log.warn(`No content found in package: ${pkg.alias}`);\n }\n }\n\n if (allChunks.length === 0) {\n throw new Error('No content to index. Check your package directories.');\n }\n\n // Create and save the fulltext search index\n const searchEngine = new SearchEngine();\n\n await withSpinner(\n 'Building fulltext index...',\n async () => {\n await searchEngine.createIndex(allChunks);\n await searchEngine.saveIndex(projectRoot);\n },\n { successText: 'Fulltext index built' }\n );\n\n const indexPath = getSearchIndexPath(projectRoot);\n const result: IndexSearchResult = {\n chunkCount: allChunks.length,\n fileCount: totalFiles,\n packages: indexedPackages,\n indexPath,\n };\n\n // Build semantic/vector index if requested\n if (semantic) {\n result.vectorIndexPath = getVectorStorePath(projectRoot);\n await buildVectorIndex(allChunks, projectRoot, provider, result);\n }\n\n log.success(\n `Indexed ${allChunks.length} chunks from ${totalFiles} files across ${indexedPackages.length} package(s)`\n );\n\n if (result.embeddingProvider) {\n log.info(`Semantic search enabled (${result.embeddingProvider}/${result.embeddingModel})`);\n }\n\n return result;\n}\n\n// =============================================================================\n// Vector Index Builder\n// =============================================================================\n\n/**\n * Build vector index for semantic search\n */\nasync function buildVectorIndex(\n chunks: Chunk[],\n projectRoot: string,\n providerOption: EmbeddingProvider,\n result: IndexSearchResult\n): Promise<void> {\n // Detect or validate provider\n const resolvedProvider = providerOption === 'auto'\n ? await withSpinner(\n 'Detecting embedding provider...',\n async () => detectProvider(),\n { successText: 'Provider detected' }\n )\n : providerOption;\n\n const config = getProviderConfig(resolvedProvider);\n result.embeddingProvider = resolvedProvider;\n result.embeddingModel = config.model;\n\n log.info(`Using ${resolvedProvider} (${config.model}, ${config.dimensions}d)`);\n\n // Extract text content from chunks\n const texts = chunks.map((c) => c.content);\n\n // Generate embeddings\n const embeddingResult = await withSpinner(\n `Generating embeddings for ${chunks.length} chunks...`,\n async () => generateEmbeddings(texts, resolvedProvider),\n { successText: 'Embeddings generated' }\n );\n\n // Prepare vector chunks\n const vectorChunks = chunks.map((chunk, i) => ({\n id: chunk.id,\n content: chunk.content,\n path: chunk.path,\n package: chunk.package,\n title: chunk.metadata.title,\n vector: embeddingResult.vectors[i]!,\n }));\n\n // Create vector store\n const vectorStore = new VectorStore(projectRoot);\n\n await withSpinner(\n 'Creating vector index...',\n async () => {\n await vectorStore.createIndex(vectorChunks, {\n provider: resolvedProvider,\n model: embeddingResult.model,\n dimensions: embeddingResult.dimensions,\n createdAt: new Date().toISOString(),\n });\n },\n { successText: 'Vector index created' }\n );\n}\n","/**\n * src/commands/wizard/index-wizard.ts\n * Post-setup indexing wizard - guides users through building a search index\n */\nimport { confirm } from '@inquirer/prompts';\nimport { log, style, withSpinner } from '../../utils/logger.js';\nimport { indexSearchCommand, type IndexSearchResult } from '../index-search.js';\nimport { detectProvider, getProviderConfig } from '../../core/embeddings.js';\nimport type { EmbeddingProvider } from '../../core/embeddings.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface IndexWizardOptions {\n /** Project root directory */\n projectRoot: string;\n /** Skip interactive prompts (for CI/scripting) */\n skipPrompts?: boolean;\n}\n\nexport interface IndexWizardResult {\n /** Whether indexing was performed */\n indexed: boolean;\n /** Whether semantic search was enabled */\n semantic: boolean;\n /** Number of chunks indexed */\n chunkCount?: number;\n /** Embedding provider used (if semantic) */\n provider?: string;\n}\n\n// =============================================================================\n// Wizard Implementation\n// =============================================================================\n\n/**\n * Run the post-setup indexing wizard\n * Prompts user to build search index with optional semantic search\n */\nexport async function runIndexWizard(\n options: IndexWizardOptions\n): Promise<IndexWizardResult> {\n const { skipPrompts = false } = options;\n\n // Step 1: Ask if user wants to build search index\n if (!skipPrompts) {\n const wantIndex = await confirm({\n message: 'Would you like to build a search index now?',\n default: true,\n });\n\n if (!wantIndex) {\n log.dim('Skipped indexing. Run `nocaap index` later to enable search.');\n return { indexed: false, semantic: false };\n }\n }\n\n // Step 2: Ask about semantic search\n let useSemantic = false;\n if (!skipPrompts) {\n useSemantic = await confirm({\n message: 'Enable semantic search? (understands meaning, not just keywords)',\n default: false,\n });\n }\n\n // Step 3: Detect provider if semantic enabled\n let resolvedProvider: Exclude<EmbeddingProvider, 'auto'> | undefined;\n if (useSemantic) {\n resolvedProvider = await withSpinner(\n 'Detecting embedding providers...',\n async () => detectProvider(),\n { successText: 'Provider detected' }\n );\n\n const config = getProviderConfig(resolvedProvider);\n log.info(`Using ${style.bold(config.model)} for embeddings`);\n }\n\n // Step 4: Build the index\n log.newline();\n let result: IndexSearchResult;\n\n try {\n result = await indexSearchCommand({\n semantic: useSemantic,\n provider: useSemantic ? resolvedProvider : undefined,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.error(`Failed to build index: ${message}`);\n return { indexed: false, semantic: false };\n }\n\n // Step 5: Return result\n return {\n indexed: true,\n semantic: useSemantic,\n chunkCount: result.chunkCount,\n provider: result.embeddingProvider,\n };\n}\n","/**\n * src/index.ts\n * nocaap CLI entry point\n */\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { Command } from 'commander';\nimport { setupCommand } from './commands/setup.js';\nimport { addCommand } from './commands/add.js';\nimport { updateCommand } from './commands/update.js';\nimport { listCommand } from './commands/list.js';\nimport { removeCommand } from './commands/remove.js';\nimport { configCommand } from './commands/config.js';\nimport { pushCommand } from './commands/push.js';\nimport { serveCommand } from './commands/serve.js';\nimport { indexSearchCommand } from './commands/index-search.js';\nimport { generateIndexWithProgress } from './core/indexer.js';\nimport { log } from './utils/logger.js';\n\n// Read version from package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));\n\n// =============================================================================\n// CLI Setup\n// =============================================================================\n\nconst program = new Command();\n\nprogram\n .name('nocaap')\n .description(\n 'Normalized Organizational Context-as-a-Package\\n\\n' +\n 'Standardize your AI agent context across teams.\\n' +\n 'Run `nocaap setup` to get started.'\n )\n .version(pkg.version);\n\n// =============================================================================\n// Setup Command\n// =============================================================================\n\nprogram\n .command('setup')\n .description('Interactive setup wizard to configure context packages')\n .option('-r, --registry <url>', 'Registry URL to fetch contexts from')\n .action(async (options) => {\n try {\n await setupCommand({ registry: options.registry });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Add Command\n// =============================================================================\n\nprogram\n .command('add <repo>')\n .description('Add a context package from a Git repository')\n .option('-p, --path <path>', 'Sparse checkout path within the repo')\n .option('-a, --alias <name>', 'Local alias for the package')\n .option('-b, --branch <branch>', 'Branch or tag to checkout', 'main')\n .action(async (repo, options) => {\n try {\n await addCommand(repo, {\n path: options.path,\n alias: options.alias,\n branch: options.branch,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Update Command\n// =============================================================================\n\nprogram\n .command('update [alias]')\n .description('Update context packages and regenerate index')\n .option('--force', 'Force update even if clean')\n .action(async (alias, options) => {\n try {\n await updateCommand(alias, { force: options.force });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// List Command\n// =============================================================================\n\nprogram\n .command('list')\n .alias('ls')\n .description('List installed context packages')\n .action(async () => {\n try {\n await listCommand();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Remove Command\n// =============================================================================\n\nprogram\n .command('remove <alias>')\n .alias('rm')\n .description('Remove a context package')\n .option('--force', 'Force removal even if dirty')\n .action(async (alias, options) => {\n try {\n await removeCommand(alias, { force: options.force });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Config Command\n// =============================================================================\n\nprogram\n .command('config [key] [value]')\n .description('Manage nocaap configuration')\n .option('-l, --list', 'Show all configuration')\n .option('-g, --global', 'Use global config scope')\n .option('-p, --project', 'Use project config scope')\n .action(async (key, value, options) => {\n try {\n await configCommand(key, value, {\n list: options.list,\n global: options.global,\n project: options.project,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Push Command\n// =============================================================================\n\nprogram\n .command('push [alias]')\n .description('Push local changes to upstream as a PR')\n .option('-m, --message <message>', 'Commit message')\n .option('-a, --all', 'Push all packages with changes')\n .action(async (alias, options) => {\n try {\n await pushCommand(alias, {\n message: options.message,\n all: options.all,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Index Command\n// =============================================================================\n\nprogram\n .command('index')\n .description('Build INDEX.md and search index for AI agent access')\n .option('--semantic', 'Enable semantic search with vector embeddings')\n .option(\n '--provider <provider>',\n 'Embedding provider: ollama | openai | tfjs | auto',\n 'auto'\n )\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n // Generate INDEX.md first\n await generateIndexWithProgress(projectRoot);\n // Then build search index (with optional semantic)\n await indexSearchCommand({\n semantic: options.semantic,\n provider: options.provider,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Serve Command\n// =============================================================================\n\nprogram\n .command('serve')\n .description('Start the MCP server for AI agent access')\n .option('--print-config', 'Print Claude Desktop configuration JSON')\n .option('--root <path>', 'Project root directory (default: current directory)')\n .action(async (options) => {\n try {\n await serveCommand({ printConfig: options.printConfig, root: options.root });\n } catch (error) {\n // IMPORTANT: Use stderr for errors in serve command\n // MCP uses stdout for JSON-RPC, so any stdout output corrupts the protocol\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Parse and Execute\n// =============================================================================\n\nprogram.parse();\n","/**\n * src/commands/setup.ts\n * Interactive setup wizard to configure context packages\n */\nimport { checkbox, input, confirm } from '@inquirer/prompts';\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner, style } from '../utils/logger.js';\nimport {\n initContextDir,\n configExists,\n readConfig,\n writeConfig,\n upsertPackage,\n updateLockEntry,\n updateClaudeMd,\n} from '../core/config.js';\nimport {\n getDefaultRegistry,\n setDefaultRegistry,\n} from '../core/global-config.js';\nimport { fetchRegistryWithImports } from '../core/registry.js';\nimport { checkAccess, sparseClone } from '../core/git-engine.js';\nimport { generateIndexWithProgress } from '../core/indexer.js';\nimport type { Registry, ContextEntry } from '../schemas/index.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SetupOptions {\n /** Registry URL to fetch contexts from */\n registry?: string;\n}\n\ninterface AccessCheckResult {\n context: ContextEntry;\n hasAccess: boolean;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_REGISTRY_PROMPT = 'Enter your organization\\'s registry URL:';\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Interactive setup wizard\n *\n * Flow:\n * 1. Get registry URL (from option or prompt)\n * 2. Fetch registry with federation support\n * 3. Check access to each context (SSH check)\n * 4. Display interactive selection\n * 5. Clone selected contexts\n * 6. Generate INDEX.md\n */\nexport async function setupCommand(options: SetupOptions): Promise<void> {\n const projectRoot = process.cwd();\n\n log.title('nocaap Setup Wizard');\n log.newline();\n\n // Check if already initialized\n if (await configExists(projectRoot)) {\n const config = await readConfig(projectRoot);\n if (config && config.packages.length > 0) {\n log.warn('nocaap is already configured in this project.');\n log.dim(` ${config.packages.length} package(s) installed`);\n log.newline();\n\n const shouldContinue = await confirm({\n message: 'Do you want to add more packages?',\n default: true,\n });\n\n if (!shouldContinue) {\n log.info('Setup cancelled.');\n return;\n }\n }\n }\n\n // Step 1: Get registry URL (from CLI option > global config > prompt)\n let registryUrl = options.registry;\n\n if (!registryUrl) {\n // Check global config / env var\n const defaultRegistry = await getDefaultRegistry();\n\n if (defaultRegistry) {\n log.info(`Using default registry: ${style.url(defaultRegistry)}`);\n log.dim('(from global config - run `nocaap config registry` to change)');\n log.newline();\n\n const useDefault = await confirm({\n message: 'Use this registry?',\n default: true,\n });\n\n if (useDefault) {\n registryUrl = defaultRegistry;\n }\n }\n }\n\n // If still no registry, prompt for it\n if (!registryUrl) {\n registryUrl = await input({\n message: DEFAULT_REGISTRY_PROMPT,\n validate: (value) => {\n if (!value.trim()) {\n return 'Registry URL is required';\n }\n try {\n new URL(value);\n return true;\n } catch {\n return 'Please enter a valid URL';\n }\n },\n });\n\n // Offer to save as default\n log.newline();\n const saveAsDefault = await confirm({\n message: 'Save this as your default registry?',\n default: true,\n });\n\n if (saveAsDefault) {\n await setDefaultRegistry(registryUrl);\n log.success('Saved to global config!');\n }\n }\n\n log.newline();\n\n // Step 2: Fetch registry\n const fetchSpinner = createSpinner('Fetching registry...').start();\n\n let registry: Registry;\n try {\n registry = await fetchRegistryWithImports(registryUrl);\n fetchSpinner.succeed(\n `Fetched registry: ${registry.contexts.length} context(s) available`\n );\n } catch (error) {\n fetchSpinner.fail('Failed to fetch registry');\n throw error;\n }\n\n if (registry.contexts.length === 0) {\n log.warn('No contexts found in registry.');\n return;\n }\n\n log.newline();\n\n // Step 3: Check access to each context\n const accessSpinner = createSpinner('Checking repository access...').start();\n\n const accessResults: AccessCheckResult[] = [];\n for (const context of registry.contexts) {\n const hasAccess = await checkAccess(context.repo);\n accessResults.push({ context, hasAccess });\n }\n\n const accessibleContexts = accessResults.filter((r) => r.hasAccess);\n const inaccessibleContexts = accessResults.filter((r) => !r.hasAccess);\n\n accessSpinner.succeed(\n `Access check complete: ${accessibleContexts.length} accessible, ${inaccessibleContexts.length} restricted`\n );\n\n if (inaccessibleContexts.length > 0) {\n log.newline();\n log.dim('Restricted contexts (no access):');\n for (const { context } of inaccessibleContexts) {\n log.dim(` - ${context.name}`);\n }\n }\n\n if (accessibleContexts.length === 0) {\n log.newline();\n log.error('No accessible contexts found. Check your SSH keys and permissions.');\n return;\n }\n\n log.newline();\n\n // Step 4: Interactive selection\n // Get already installed packages to mark them\n const currentConfig = await readConfig(projectRoot);\n const installedAliases = new Set(\n currentConfig?.packages.map(p => p.alias) ?? []\n );\n\n // Build choices with installed status\n const choices = accessibleContexts.map(({ context }) => {\n const alias = generateAlias(context);\n const isInstalled = installedAliases.has(alias);\n\n return {\n name: isInstalled\n ? `${formatContextChoice(context)} ${style.dim('[already installed]')}`\n : formatContextChoice(context),\n value: context.name,\n checked: false,\n disabled: isInstalled ? 'Already installed' : false,\n };\n });\n\n // Show count of already installed\n const installedCount = [...installedAliases].filter(alias =>\n accessibleContexts.some(({ context }) => generateAlias(context) === alias)\n ).length;\n\n if (installedCount > 0) {\n log.info(`${installedCount} package(s) already installed (shown as disabled)`);\n log.newline();\n }\n\n const selectedNames = await checkbox({\n message: 'Select contexts to install:',\n choices,\n pageSize: 15,\n });\n\n if (selectedNames.length === 0) {\n log.warn('No contexts selected. Setup cancelled.');\n return;\n }\n\n log.newline();\n\n // Step 5: Initialize .context/ directory\n if (!(await configExists(projectRoot))) {\n const initSpinner = createSpinner('Initializing .context/ directory...').start();\n await initContextDir(projectRoot);\n initSpinner.succeed('Initialized .context/ directory');\n }\n\n // Save registry URL to config\n const configToUpdate = (await readConfig(projectRoot)) ?? { packages: [] };\n configToUpdate.registryUrl = registryUrl;\n await writeConfig(projectRoot, configToUpdate);\n\n log.newline();\n\n // Step 6: Clone selected contexts\n log.info(`Installing ${selectedNames.length} context(s)...`);\n log.newline();\n\n let successCount = 0;\n let failCount = 0;\n\n for (const name of selectedNames) {\n const context = accessibleContexts.find((r) => r.context.name === name)?.context;\n if (!context) continue;\n\n const alias = generateAlias(context);\n\n // Double-check: skip if already installed\n if (installedAliases.has(alias)) {\n log.dim(`Skipping ${alias} (already installed)`);\n continue;\n }\n\n const spinner = createSpinner(`Installing ${style.bold(context.name)}...`).start();\n\n try {\n const targetDir = paths.getPackagePath(projectRoot, alias);\n\n const { commitHash } = await sparseClone({\n repoUrl: context.repo,\n targetDir,\n sparsePath: context.path,\n });\n\n // Update config\n await upsertPackage(projectRoot, {\n alias,\n source: context.repo,\n path: context.path,\n version: 'main',\n });\n\n // Update lockfile\n await updateLockEntry(projectRoot, alias, {\n commitHash,\n sparsePath: context.path || '',\n updatedAt: new Date().toISOString(),\n });\n\n spinner.succeed(`Installed ${context.name} → ${alias}`);\n successCount++;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n spinner.fail(`Failed to install ${context.name}: ${message}`);\n failCount++;\n }\n }\n\n log.newline();\n\n // Step 7: Generate INDEX.md\n if (successCount > 0) {\n await generateIndexWithProgress(projectRoot);\n }\n\n // Step 7.5: Post-setup indexing wizard\n if (successCount > 0) {\n log.newline();\n log.hr();\n\n const { runIndexWizard } = await import('./wizard/index-wizard.js');\n await runIndexWizard({ projectRoot });\n }\n\n // Step 8: Offer CLAUDE.md integration\n if (successCount > 0) {\n log.newline();\n log.hr();\n log.newline();\n\n const addClaude = await confirm({\n message: 'Add nocaap reference to CLAUDE.md?',\n default: true,\n });\n\n if (addClaude) {\n const updated = await updateClaudeMd(projectRoot);\n if (updated) {\n log.success('Added nocaap reference to CLAUDE.md');\n } else {\n log.dim('CLAUDE.md already configured');\n }\n }\n }\n\n // Summary\n log.newline();\n log.hr();\n log.newline();\n\n if (successCount > 0) {\n log.success(`Setup complete! ${successCount} context(s) installed.`);\n log.newline();\n log.info('Next steps:');\n log.dim(' 1. Review .context/INDEX.md for available documentation');\n log.dim(' 2. Run `nocaap update` to pull latest changes');\n }\n\n if (failCount > 0) {\n log.newline();\n log.warn(`${failCount} context(s) failed to install.`);\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Format a context entry for display in the selection list\n */\nfunction formatContextChoice(context: ContextEntry): string {\n let display = context.name;\n\n if (context.description) {\n display += ` - ${context.description}`;\n }\n\n if (context.tags && context.tags.length > 0) {\n display += ` [${context.tags.join(', ')}]`;\n }\n\n return display;\n}\n\n/**\n * Generate a valid alias from a context entry\n * Prefers the leaf folder from path, falls back to name\n */\nfunction generateAlias(context: ContextEntry): string {\n // Prefer leaf folder from path (e.g., \"/capabilities\" -> \"capabilities\")\n if (context.path) {\n const leafFolder = context.path.split('/').filter(Boolean).pop();\n if (leafFolder) {\n return leafFolder\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 50);\n }\n }\n\n // Fallback to name\n return context.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with hyphens\n .replace(/^-+|-+$/g, '') // Remove leading/trailing hyphens\n .slice(0, 50); // Limit length\n}\n","/**\n * src/core/registry.ts\n * Fetches and parses the registry with federation support\n * Supports smart URL detection with HTTP-first, SSH-fallback for private repos\n */\nimport fs from 'fs-extra';\nimport os from 'os';\nimport {\n safeValidateRegistry,\n type Registry,\n type ContextEntry,\n} from '../schemas/index.js';\nimport { log } from '../utils/logger.js';\nimport * as paths from '../utils/paths.js';\nimport { sparseClone, getDefaultBranch, checkAccess } from './git-engine.js';\n\nconst DEFAULT_MAX_DEPTH = 3;\nconst DEFAULT_TIMEOUT_MS = 10000; // 10 seconds\n\n// =============================================================================\n// Smart URL Normalization\n// =============================================================================\n\ninterface NormalizedRegistryUrl {\n /** Original URL provided by user */\n original: string;\n /** Git SSH URL for cloning (empty if not applicable) */\n gitUrl: string;\n /** Path to registry file within repo */\n filePath: string;\n /** HTTP URL to try first (for public repos) */\n httpUrl: string | null;\n /** Provider (github, gitlab, bitbucket, unknown) */\n provider: 'github' | 'gitlab' | 'bitbucket' | 'unknown';\n /** Branch name (if detected from URL) */\n branch: string | null;\n}\n\n/**\n * Normalize any GitHub/GitLab URL into a consistent format\n * \n * Accepts:\n * - https://github.com/org/repo\n * - https://github.com/org/repo/blob/main/path/to/file.json\n * - https://raw.githubusercontent.com/org/repo/main/file.json\n * - git@github.com:org/repo.git\n * - git@github.com:org/repo.git#path/to/file.json\n */\nexport function normalizeRegistryUrl(url: string): NormalizedRegistryUrl {\n const original = url.trim();\n \n // Default file path\n let filePath = 'nocaap-registry.json';\n let gitUrl = '';\n let httpUrl: string | null = null;\n let provider: 'github' | 'gitlab' | 'bitbucket' | 'unknown' = 'unknown';\n let branch: string | null = null;\n\n // Pattern 1: Git SSH with optional file path\n // git@github.com:org/repo.git#path/to/file.json\n if (original.startsWith('git@') || original.startsWith('ssh://')) {\n const hashIndex = original.indexOf('#');\n if (hashIndex !== -1) {\n gitUrl = original.substring(0, hashIndex);\n filePath = original.substring(hashIndex + 1);\n } else {\n gitUrl = original.endsWith('.git') ? original : `${original}.git`;\n }\n \n // Detect provider\n if (original.includes('github.com')) provider = 'github';\n else if (original.includes('gitlab.com')) provider = 'gitlab';\n else if (original.includes('bitbucket.org')) provider = 'bitbucket';\n\n // Try to construct HTTP URL for public repos (GitHub)\n if (provider === 'github') {\n const match = gitUrl.match(/git@github\\.com:(.+?)(?:\\.git)?$/);\n if (match) {\n httpUrl = `https://raw.githubusercontent.com/${match[1]}/main/${filePath}`;\n }\n }\n\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 2: GitHub raw URL\n // https://raw.githubusercontent.com/org/repo/branch/path/to/file.json\n const rawGitHubMatch = original.match(\n /^https:\\/\\/raw\\.githubusercontent\\.com\\/([^/]+)\\/([^/]+)\\/([^/]+)\\/(.+)$/\n );\n if (rawGitHubMatch) {\n const [, org, repo, branchName, path] = rawGitHubMatch;\n gitUrl = `git@github.com:${org}/${repo}.git`;\n filePath = path!;\n httpUrl = original;\n provider = 'github';\n branch = branchName ?? null;\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 3: GitHub blob URL\n // https://github.com/org/repo/blob/main/path/to/file.json\n const blobMatch = original.match(\n /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/blob\\/([^/]+)\\/(.+)$/\n );\n if (blobMatch) {\n const [, org, repo, branchName, path] = blobMatch;\n gitUrl = `git@github.com:${org}/${repo}.git`;\n filePath = path!;\n httpUrl = `https://raw.githubusercontent.com/${org}/${repo}/${branchName}/${path}`;\n provider = 'github';\n branch = branchName ?? null;\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 4: GitHub repo URL (no file specified)\n // https://github.com/org/repo\n // https://github.com/org/repo/\n const repoMatch = original.match(\n /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(\\/)?$/\n );\n if (repoMatch && repoMatch[1] && repoMatch[2]) {\n const org = repoMatch[1];\n const repo = repoMatch[2];\n // Remove .git suffix if present\n const cleanRepo = repo.replace(/\\.git$/, '');\n gitUrl = `git@github.com:${org}/${cleanRepo}.git`;\n filePath = 'nocaap-registry.json';\n httpUrl = `https://raw.githubusercontent.com/${org}/${cleanRepo}/main/${filePath}`;\n provider = 'github';\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 5: GitLab URL\n // https://gitlab.com/org/repo\n // https://gitlab.com/org/repo/-/blob/main/file.json\n const gitlabMatch = original.match(\n /^https:\\/\\/gitlab\\.com\\/([^/]+)\\/([^/]+)/\n );\n if (gitlabMatch && gitlabMatch[1] && gitlabMatch[2]) {\n const org = gitlabMatch[1];\n const repo = gitlabMatch[2];\n const cleanRepo = repo.replace(/\\.git$/, '');\n gitUrl = `git@gitlab.com:${org}/${cleanRepo}.git`;\n provider = 'gitlab';\n \n // Check if it's a file URL\n const gitlabFileMatch = original.match(\n /^https:\\/\\/gitlab\\.com\\/([^/]+)\\/([^/]+)\\/-\\/blob\\/([^/]+)\\/(.+)$/\n );\n if (gitlabFileMatch && gitlabFileMatch[3] && gitlabFileMatch[4]) {\n filePath = gitlabFileMatch[4];\n branch = gitlabFileMatch[3];\n httpUrl = `https://gitlab.com/${org}/${cleanRepo}/-/raw/${branch}/${filePath}`;\n } else {\n httpUrl = `https://gitlab.com/${org}/${cleanRepo}/-/raw/main/${filePath}`;\n }\n \n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 6: Bitbucket URL\n const bitbucketMatch = original.match(\n /^https:\\/\\/bitbucket\\.org\\/([^/]+)\\/([^/]+)/\n );\n if (bitbucketMatch && bitbucketMatch[1] && bitbucketMatch[2]) {\n const org = bitbucketMatch[1];\n const repo = bitbucketMatch[2];\n const cleanRepo = repo.replace(/\\.git$/, '');\n gitUrl = `git@bitbucket.org:${org}/${cleanRepo}.git`;\n provider = 'bitbucket';\n httpUrl = `https://bitbucket.org/${org}/${cleanRepo}/raw/main/${filePath}`;\n return { original, gitUrl, filePath, httpUrl, provider, branch };\n }\n\n // Pattern 7: Plain HTTP URL (assume it's a direct link to JSON)\n if (original.startsWith('http://') || original.startsWith('https://')) {\n // Can't determine git URL, just use HTTP\n return {\n original,\n gitUrl: '',\n filePath: '',\n httpUrl: original,\n provider: 'unknown',\n branch: null,\n };\n }\n\n // Unknown format - throw helpful error\n throw new Error(\n `Unrecognized registry URL format: ${original}\\n\\n` +\n `Supported formats:\\n` +\n ` https://github.com/org/repo\\n` +\n ` https://github.com/org/repo/blob/main/nocaap-registry.json\\n` +\n ` https://raw.githubusercontent.com/org/repo/main/file.json\\n` +\n ` git@github.com:org/repo.git\\n` +\n ` git@github.com:org/repo.git#path/to/registry.json`\n );\n}\n\n// =============================================================================\n// Git-Based Registry Fetch\n// =============================================================================\n\n/**\n * Fetch registry by cloning the repo (uses SSH keys)\n * Perfect for private repositories - maintains \"Zero Auth\" principle\n */\nasync function fetchRegistryViaGit(\n repoUrl: string, \n filePath: string,\n branchHint?: string | null\n): Promise<Registry> {\n log.debug(`Fetching registry via Git: ${repoUrl} -> ${filePath}`);\n\n // First check access\n let hasAccess: boolean;\n try {\n hasAccess = await checkAccess(repoUrl);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n // Check if Git is installed\n if (message.includes('ENOENT') || message.includes('not found')) {\n throw new Error(\n `Git is not installed or not in PATH.\\n\\n` +\n 'To use private repositories, you need:\\n' +\n ' 1. Git installed (https://git-scm.com)\\n' +\n ' 2. SSH keys configured for your Git host'\n );\n }\n throw new Error(`Failed to check repository access: ${message}`);\n }\n\n if (!hasAccess) {\n throw new Error(\n `Cannot access repository via SSH: ${repoUrl}\\n\\n` +\n 'Please check:\\n' +\n ' • You have SSH keys configured (run: ssh -T git@github.com)\\n' +\n ' • You have read access to the repository\\n' +\n ' • The repository URL is correct'\n );\n }\n\n // Create temp directory\n const tempDir = paths.join(os.tmpdir(), `nocaap-registry-${Date.now()}`);\n \n try {\n // Determine the sparse path (directory containing the file)\n const fileDir = paths.dirname(filePath);\n const sparsePath = fileDir === '.' || fileDir === '' ? undefined : fileDir;\n \n // Use branch hint if provided, otherwise detect\n const branch = branchHint || await getDefaultBranch(repoUrl);\n \n // Clone with sparse checkout (just the directory containing the registry file)\n await sparseClone({\n repoUrl,\n targetDir: tempDir,\n sparsePath,\n branch,\n });\n\n // Read the registry file\n const registryPath = paths.join(tempDir, filePath);\n \n if (!(await paths.exists(registryPath))) {\n throw new Error(\n `Registry file not found: ${filePath}\\n\\n` +\n 'Please check:\\n' +\n ' • The file path is correct\\n' +\n ' • The file exists in the repository\\n' +\n ` • Try: git@...#${filePath}`\n );\n }\n\n const content = await fs.readFile(registryPath, 'utf-8');\n \n let data: unknown;\n try {\n data = JSON.parse(content);\n } catch {\n throw new Error(`Invalid JSON in registry file: ${filePath}`);\n }\n\n const result = safeValidateRegistry(data);\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid registry schema: ${errorMessages}`);\n }\n\n log.debug(`Successfully fetched registry via Git with ${result.data.contexts.length} contexts`);\n return result.data;\n } finally {\n // Cleanup temp directory\n await fs.remove(tempDir).catch(() => {\n log.debug(`Failed to cleanup temp directory: ${tempDir}`);\n });\n }\n}\n\n// =============================================================================\n// HTTP-Based Registry Fetch\n// =============================================================================\n\n/** Custom error class for HTTP fetch failures that may warrant SSH fallback */\nclass HttpFetchError extends Error {\n constructor(\n message: string,\n public readonly status: number | null,\n public readonly shouldTrySSH: boolean\n ) {\n super(message);\n this.name = 'HttpFetchError';\n }\n}\n\n/**\n * Fetch registry via HTTP (for public repos or URLs with tokens)\n * @throws HttpFetchError with shouldTrySSH=true if SSH fallback is recommended\n */\nasync function fetchRegistryViaHttp(url: string): Promise<Registry> {\n log.debug(`Fetching registry via HTTP: ${url}`);\n\n let response: Response;\n try {\n // Add timeout to prevent hanging on slow/unresponsive servers\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT_MS);\n\n response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new HttpFetchError(\n `Registry fetch timed out after ${DEFAULT_TIMEOUT_MS / 1000}s`,\n null,\n false\n );\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new HttpFetchError(`Network error: ${message}`, null, false);\n }\n\n if (!response.ok) {\n const isGitHub = url.includes('githubusercontent.com') || url.includes('github.com');\n const isGitLab = url.includes('gitlab.com');\n \n // 404/403 on GitHub/GitLab often means private repo - suggest SSH\n const shouldTrySSH = (response.status === 404 || response.status === 403) && \n (isGitHub || isGitLab);\n \n throw new HttpFetchError(\n `HTTP ${response.status} ${response.statusText}`,\n response.status,\n shouldTrySSH\n );\n }\n\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n throw new HttpFetchError('Invalid JSON response', null, false);\n }\n\n const result = safeValidateRegistry(data);\n if (!result.success) {\n const errorMessages = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new Error(`Invalid registry schema: ${errorMessages}`);\n }\n\n log.debug(`Successfully fetched registry via HTTP with ${result.data.contexts.length} contexts`);\n return result.data;\n}\n\n// =============================================================================\n// Main Fetch Function with Smart Fallback\n// =============================================================================\n\n/**\n * Fetch a registry with smart URL detection and fallback\n * \n * Flow:\n * 1. Parse and normalize the URL (detect GitHub, GitLab, etc.)\n * 2. Try HTTP first if available (fast, works for public repos)\n * 3. If HTTP fails with 404/403, try Git SSH (works for private repos)\n * 4. Provide helpful error messages at each step\n * \n * @example\n * // All of these work - just paste what you copy from GitHub:\n * fetchRegistry('https://github.com/org/repo')\n * fetchRegistry('https://github.com/org/repo/blob/main/nocaap-registry.json')\n * fetchRegistry('https://raw.githubusercontent.com/org/repo/main/file.json')\n * fetchRegistry('git@github.com:org/repo.git')\n */\nexport async function fetchRegistry(registryUrl: string): Promise<Registry> {\n const normalized = normalizeRegistryUrl(registryUrl);\n \n log.debug(`Normalized registry URL: ${JSON.stringify(normalized, null, 2)}`);\n\n // If it's explicitly a Git URL (no HTTP available), go directly to Git\n if (!normalized.httpUrl && normalized.gitUrl) {\n log.debug('No HTTP URL available, using Git directly');\n return fetchRegistryViaGit(normalized.gitUrl, normalized.filePath, normalized.branch);\n }\n\n // Try HTTP first if available (faster for public repos)\n if (normalized.httpUrl) {\n try {\n log.debug(`Trying HTTP fetch: ${normalized.httpUrl}`);\n const registry = await fetchRegistryViaHttp(normalized.httpUrl);\n return registry;\n } catch (error) {\n // If HTTP failed and we have a Git URL, consider SSH fallback\n if (error instanceof HttpFetchError && error.shouldTrySSH && normalized.gitUrl) {\n log.debug(`HTTP failed (${error.status}), trying SSH fallback`);\n \n try {\n return await fetchRegistryViaGit(\n normalized.gitUrl, \n normalized.filePath,\n normalized.branch\n );\n } catch (sshError) {\n // Both failed - provide comprehensive error message\n const sshMessage = sshError instanceof Error ? sshError.message : 'Unknown error';\n throw new Error(\n `Could not fetch registry from: ${registryUrl}\\n\\n` +\n `HTTP attempt: ${error.message}\\n` +\n `SSH attempt: ${sshMessage}\\n\\n` +\n 'Possible solutions:\\n' +\n ' • Check the URL is correct\\n' +\n ' • For private repos: ensure SSH keys are configured\\n' +\n ' • Run: ssh -T git@github.com (to test SSH access)'\n );\n }\n }\n \n // HTTP failed and no SSH fallback available\n if (error instanceof HttpFetchError) {\n const hint = error.shouldTrySSH \n ? '\\n\\nThis might be a private repository. Try using SSH:\\n' +\n ` nocaap config registry ${normalized.gitUrl || 'git@github.com:org/repo.git'}`\n : '';\n throw new Error(\n `Failed to fetch registry: ${error.message}${hint}`\n );\n }\n \n throw error;\n }\n }\n\n // No HTTP URL and no Git URL - shouldn't happen but handle gracefully\n throw new Error(`Could not determine how to fetch registry from: ${registryUrl}`);\n}\n\n// =============================================================================\n// Federated Registry Fetch\n// =============================================================================\n\nexport interface FetchOptions {\n /** Set of already visited URLs (for circular dependency detection) */\n visited?: Set<string>;\n /** Maximum recursion depth for imports (default: 3) */\n maxDepth?: number;\n /** Current recursion depth (internal use) */\n currentDepth?: number;\n}\n\n/**\n * Fetch registry with federation support (resolves `imports` recursively)\n * - Tracks visited URLs to prevent circular imports\n * - Has max depth limit to prevent infinite recursion\n * - Merges all imported registries into a single result\n * - Supports both HTTP and Git URLs for imports\n */\nexport async function fetchRegistryWithImports(\n url: string,\n options?: FetchOptions\n): Promise<Registry> {\n const visited = options?.visited ?? new Set<string>();\n const maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n const currentDepth = options?.currentDepth ?? 0;\n\n // Normalize URL for comparison (remove trailing slash and hash)\n const normalizedUrl = url.replace(/\\/$/, '').replace(/#.*$/, '');\n\n // Check for circular imports\n if (visited.has(normalizedUrl)) {\n log.warn(`Circular import detected, skipping: ${url}`);\n return { contexts: [] };\n }\n\n // Check max depth\n if (currentDepth >= maxDepth) {\n log.warn(`Max import depth (${maxDepth}) exceeded, skipping: ${url}`);\n return { contexts: [] };\n }\n\n // Mark as visited\n visited.add(normalizedUrl);\n\n // Fetch this registry (auto-detects HTTP vs Git URL with fallback)\n const registry = await fetchRegistry(url);\n\n // If no imports, return as-is\n if (!registry.imports || registry.imports.length === 0) {\n return registry;\n }\n\n log.debug(`Registry has ${registry.imports.length} imports, fetching...`);\n\n // Fetch all imported registries in parallel\n const importPromises = registry.imports.map(async (importUrl) => {\n try {\n return await fetchRegistryWithImports(importUrl, {\n visited,\n maxDepth,\n currentDepth: currentDepth + 1,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.warn(`Failed to fetch imported registry ${importUrl}: ${message}`);\n return { contexts: [] } as Registry;\n }\n });\n\n const importedRegistries = await Promise.all(importPromises);\n\n // Merge all registries (current + imported)\n return mergeRegistries([registry, ...importedRegistries]);\n}\n\n// =============================================================================\n// Registry Merging\n// =============================================================================\n\n/**\n * Create a unique key for deduplication based on repo + path\n */\nfunction getContextKey(context: ContextEntry): string {\n const path = context.path ?? '';\n return `${context.repo}::${path}`;\n}\n\n/**\n * Merge multiple registries into one, deduplicating contexts by repo+path\n * Later registries take precedence over earlier ones for duplicates\n * Preserves the name of the first (root) registry\n */\nexport function mergeRegistries(registries: Registry[]): Registry {\n const contextMap = new Map<string, ContextEntry>();\n\n for (const registry of registries) {\n for (const context of registry.contexts) {\n const key = getContextKey(context);\n // Later entries overwrite earlier ones\n contextMap.set(key, context);\n }\n }\n\n const mergedContexts = Array.from(contextMap.values());\n\n log.debug(`Merged ${registries.length} registries into ${mergedContexts.length} unique contexts`);\n\n return {\n name: registries[0]?.name, // Preserve root registry name\n contexts: mergedContexts,\n // Don't include imports in merged result (they've been resolved)\n };\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Find a context entry by name (case-insensitive)\n */\nexport function findContextByName(\n registry: Registry,\n name: string\n): ContextEntry | undefined {\n const lowerName = name.toLowerCase();\n return registry.contexts.find(\n (ctx) => ctx.name.toLowerCase() === lowerName\n );\n}\n\n/**\n * Find contexts by tag\n */\nexport function findContextsByTag(\n registry: Registry,\n tag: string\n): ContextEntry[] {\n const lowerTag = tag.toLowerCase();\n return registry.contexts.filter(\n (ctx) => ctx.tags?.some((t) => t.toLowerCase() === lowerTag)\n );\n}\n\n/**\n * Get all unique tags from a registry\n */\nexport function getAllTags(registry: Registry): string[] {\n const tagSet = new Set<string>();\n \n for (const context of registry.contexts) {\n if (context.tags) {\n for (const tag of context.tags) {\n tagSet.add(tag);\n }\n }\n }\n\n return Array.from(tagSet).sort();\n}\n","/**\n * src/core/git-engine.ts\n * Git operations with partial clones and sparse checkout\n */\nimport simpleGit, { type SimpleGit, type SimpleGitOptions } from 'simple-git';\nimport fs from 'fs-extra';\nimport os from 'os';\nimport * as paths from '../utils/paths.js';\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Git Instance Factory\n// =============================================================================\n\n/**\n * Create a simple-git instance with sensible defaults\n */\nfunction createGit(baseDir?: string): SimpleGit {\n const options: Partial<SimpleGitOptions> = {\n baseDir: baseDir ? paths.toUnix(baseDir) : undefined,\n binary: 'git',\n maxConcurrentProcesses: 6,\n trimmed: true,\n timeout: {\n block: 60000, // 60 seconds for any single operation\n },\n };\n\n return simpleGit(options);\n}\n\n// =============================================================================\n// Access Verification\n// =============================================================================\n\n/**\n * Check if user has read access to a repository\n * Uses `git ls-remote` which respects SSH keys\n * @returns true if accessible, false if auth fails or repo doesn't exist\n */\nexport async function checkAccess(repoUrl: string): Promise<boolean> {\n log.debug(`Checking access to ${repoUrl}`);\n\n try {\n const git = createGit();\n // ls-remote will fail if no access - we just need it to not throw\n await git.listRemote([repoUrl, 'HEAD']);\n log.debug(`Access confirmed for ${repoUrl}`);\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Access denied or repo not found: ${repoUrl} - ${message}`);\n return false;\n }\n}\n\n/**\n * Detect the default branch of a repository (main, master, etc.)\n * Uses `git ls-remote --symref` to query the remote HEAD reference\n * @returns The default branch name, or 'main' as fallback\n */\nexport async function getDefaultBranch(repoUrl: string): Promise<string> {\n log.debug(`Detecting default branch for ${repoUrl}`);\n\n try {\n const git = createGit();\n // ls-remote --symref shows the symbolic ref for HEAD\n const result = await git.listRemote(['--symref', repoUrl, 'HEAD']);\n \n // Parse output like: \"ref: refs/heads/main\\tHEAD\"\n const match = result.match(/ref:\\s+refs\\/heads\\/([^\\t\\s]+)/);\n if (match && match[1]) {\n log.debug(`Default branch detected: ${match[1]}`);\n return match[1];\n }\n\n // Fallback: try to detect from available branches\n const branchesResult = await git.listRemote(['--heads', repoUrl]);\n \n // Check for common branch names in order of preference\n const commonBranches = ['main', 'master', 'develop', 'trunk'];\n for (const branch of commonBranches) {\n if (branchesResult.includes(`refs/heads/${branch}`)) {\n log.debug(`Default branch fallback: ${branch}`);\n return branch;\n }\n }\n\n log.debug('Could not detect default branch, using \"main\"');\n return 'main';\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to detect default branch: ${message}, using \"main\"`);\n return 'main';\n }\n}\n\n// =============================================================================\n// Clone Operations\n// =============================================================================\n\nexport interface CloneOptions {\n /** Git repository URL (SSH or HTTPS) */\n repoUrl: string;\n /** Target directory for the clone */\n targetDir: string;\n /** Optional path within repo for sparse checkout */\n sparsePath?: string;\n /** Branch or tag to checkout (default: default branch) */\n branch?: string;\n}\n\nexport interface CloneResult {\n /** The HEAD commit hash after clone */\n commitHash: string;\n}\n\n/**\n * Perform a sparse checkout clone\n * Uses --filter=blob:none --sparse --depth 1 for minimal download\n *\n * Clone sequence:\n * 1. Auto-detect default branch if not specified\n * 2. git clone --filter=blob:none --sparse --depth 1 --branch <branch> <url> <target>\n * 3. cd <target> && git sparse-checkout set --no-cone <path>\n */\nexport async function sparseClone(options: CloneOptions): Promise<CloneResult> {\n const { repoUrl, targetDir, sparsePath } = options;\n const normalizedTarget = paths.toUnix(targetDir);\n\n log.debug(`Sparse cloning ${repoUrl} to ${normalizedTarget}`);\n\n // Auto-detect default branch if not specified\n const branch = options.branch || await getDefaultBranch(repoUrl);\n\n // Check if target already exists\n if (await paths.exists(normalizedTarget)) {\n // Check if it's dirty before removing\n if (await isGitRepo(normalizedTarget)) {\n if (await isDirty(normalizedTarget)) {\n throw new Error(\n `Target directory has uncommitted changes: ${normalizedTarget}. ` +\n 'Please commit or discard changes before re-cloning.'\n );\n }\n }\n // Safe to remove - either not a git repo or clean\n log.debug(`Removing existing directory: ${normalizedTarget}`);\n await fs.remove(normalizedTarget);\n }\n\n // Ensure parent directory exists\n await paths.ensureDir(paths.dirname(normalizedTarget));\n\n // Build clone arguments\n const cloneArgs = [\n '--filter=blob:none', // Partial clone - no blobs initially\n '--sparse', // Enable sparse checkout\n '--depth', '1', // Shallow clone - no history\n '--branch', branch, // Always specify branch (auto-detected if not provided)\n ];\n\n cloneArgs.push(repoUrl, normalizedTarget);\n\n // Step 1: Perform the clone\n const git = createGit();\n try {\n await git.clone(repoUrl, normalizedTarget, cloneArgs.slice(0, -2)); // simple-git handles url and target separately\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to clone ${repoUrl}: ${message}`);\n }\n\n // Step 2: Set sparse-checkout path if specified\n if (sparsePath) {\n const repoGit = createGit(normalizedTarget);\n // Normalize path and strip leading slashes (git sparse-checkout prefers no leading slash)\n const normalizedSparsePath = paths.toUnix(sparsePath).replace(/^\\/+/, '');\n\n try {\n // Use --no-cone mode to ONLY include the specified path\n // Cone mode (default) includes root-level files which we don't want\n await repoGit.raw(['sparse-checkout', 'set', '--no-cone', normalizedSparsePath]);\n log.debug(`Set sparse-checkout path: ${normalizedSparsePath}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to set sparse-checkout path '${sparsePath}': ${message}`);\n }\n\n // Warn if the sparse path resulted in no files\n const sparseFullPath = paths.join(normalizedTarget, normalizedSparsePath);\n if (!(await paths.exists(sparseFullPath))) {\n log.warn(`Sparse path '${sparsePath}' does not exist in the repository`);\n } else {\n // Step 3: Flatten the directory structure\n // Move contents from sparse subdirectory to package root\n log.debug(`Flattening sparse path: ${sparseFullPath} -> ${normalizedTarget}`);\n\n const items = await fs.readdir(sparseFullPath);\n for (const item of items) {\n const srcPath = paths.join(sparseFullPath, item);\n const destPath = paths.join(normalizedTarget, item);\n await fs.move(srcPath, destPath, { overwrite: true });\n }\n\n // Remove the now-empty sparse directory chain\n const topLevelDir = normalizedSparsePath.split('/')[0];\n if (topLevelDir) {\n const topLevelPath = paths.join(normalizedTarget, topLevelDir);\n await fs.remove(topLevelPath);\n log.debug(`Removed empty sparse directory: ${topLevelPath}`);\n }\n }\n }\n\n // Get the commit hash\n const commitHash = await getHeadCommit(normalizedTarget);\n\n log.debug(`Clone complete. HEAD: ${commitHash}`);\n\n return { commitHash };\n}\n\n// =============================================================================\n// Repository State\n// =============================================================================\n\n/**\n * Check if a directory is a git repository\n */\nexport async function isGitRepo(dirPath: string): Promise<boolean> {\n const gitDir = paths.join(dirPath, '.git');\n return paths.exists(gitDir);\n}\n\n/**\n * Check if a repository has uncommitted changes\n * CRITICAL: Must check before any destructive operation\n * @returns true if there are uncommitted changes, false if clean\n */\nexport async function isDirty(repoPath: string): Promise<boolean> {\n const normalizedPath = paths.toUnix(repoPath);\n log.debug(`Checking dirty state for ${normalizedPath}`);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n const status = await git.status();\n\n // Use built-in isClean() method for reliable dirty check\n const isDirtyState = !status.isClean();\n\n log.debug(`Repository ${normalizedPath} is ${isDirtyState ? 'dirty' : 'clean'}`);\n return isDirtyState;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to check repository status: ${message}`);\n }\n}\n\n/**\n * Get the current HEAD commit hash\n */\nexport async function getHeadCommit(repoPath: string): Promise<string> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n const hash = await git.revparse(['HEAD']);\n return hash.trim();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to get HEAD commit: ${message}`);\n }\n}\n\n/**\n * Get the remote URL for a repository\n */\nexport async function getRemoteUrl(repoPath: string): Promise<string | null> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n return null;\n }\n\n try {\n const git = createGit(normalizedPath);\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === 'origin');\n return origin?.refs?.fetch ?? null;\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// Update Operations\n// =============================================================================\n\n/**\n * Pull latest changes from remote\n * @throws Error if repository is dirty\n */\nexport async function pull(repoPath: string): Promise<CloneResult> {\n const normalizedPath = paths.toUnix(repoPath);\n log.debug(`Pulling updates for ${normalizedPath}`);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n // CRITICAL: Check for dirty state before pulling\n if (await isDirty(normalizedPath)) {\n throw new Error(\n `Cannot pull: repository has uncommitted changes at ${normalizedPath}. ` +\n 'Please commit or discard changes first.'\n );\n }\n\n try {\n const git = createGit(normalizedPath);\n await git.pull();\n const commitHash = await getHeadCommit(normalizedPath);\n\n log.debug(`Pull complete. HEAD: ${commitHash}`);\n return { commitHash };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to pull updates: ${message}`);\n }\n}\n\n/**\n * Fetch and reset to latest remote HEAD\n * More aggressive than pull - discards local state\n * @throws Error if repository is dirty\n */\nexport async function fetchAndReset(repoPath: string): Promise<CloneResult> {\n const normalizedPath = paths.toUnix(repoPath);\n log.debug(`Fetch and reset for ${normalizedPath}`);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n // CRITICAL: Check for dirty state\n if (await isDirty(normalizedPath)) {\n throw new Error(\n `Cannot reset: repository has uncommitted changes at ${normalizedPath}. ` +\n 'Please commit or discard changes first.'\n );\n }\n\n try {\n const git = createGit(normalizedPath);\n\n // Fetch latest from origin\n await git.fetch(['origin']);\n\n // Get the current branch\n const branch = await git.revparse(['--abbrev-ref', 'HEAD']);\n\n // Reset to origin/<branch>\n await git.reset(['--hard', `origin/${branch.trim()}`]);\n\n const commitHash = await getHeadCommit(normalizedPath);\n\n log.debug(`Reset complete. HEAD: ${commitHash}`);\n return { commitHash };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to fetch and reset: ${message}`);\n }\n}\n\n// =============================================================================\n// Cleanup\n// =============================================================================\n\n/**\n * Safely remove a package directory\n * @throws Error if directory has uncommitted changes\n */\nexport async function removePackage(packagePath: string): Promise<void> {\n const normalizedPath = paths.toUnix(packagePath);\n log.debug(`Removing package at ${normalizedPath}`);\n\n if (!(await paths.exists(normalizedPath))) {\n log.debug(`Package directory does not exist: ${normalizedPath}`);\n return;\n }\n\n // If it's a git repo, check for dirty state\n if (await isGitRepo(normalizedPath)) {\n if (await isDirty(normalizedPath)) {\n throw new Error(\n `Cannot remove: package has uncommitted changes at ${normalizedPath}. ` +\n 'Please commit or discard changes first.'\n );\n }\n }\n\n await fs.remove(normalizedPath);\n log.debug(`Removed package directory: ${normalizedPath}`);\n}\n\n// =============================================================================\n// Sparse Checkout Utilities\n// =============================================================================\n\n/**\n * Get the current sparse-checkout paths\n */\nexport async function getSparseCheckoutPaths(repoPath: string): Promise<string[]> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n const result = await git.raw(['sparse-checkout', 'list']);\n return result\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n } catch {\n // If sparse-checkout not configured, return empty array\n return [];\n }\n}\n\n/**\n * Update the sparse-checkout path for an existing repo\n */\nexport async function updateSparseCheckout(\n repoPath: string,\n sparsePath: string\n): Promise<void> {\n const normalizedPath = paths.toUnix(repoPath);\n // Strip leading slashes for git sparse-checkout compatibility\n const normalizedSparsePath = paths.toUnix(sparsePath).replace(/^\\/+/, '');\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n // Use --no-cone mode to ONLY include the specified path (no root files)\n await git.raw(['sparse-checkout', 'set', '--no-cone', normalizedSparsePath]);\n log.debug(`Updated sparse-checkout to: ${normalizedSparsePath}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to update sparse-checkout: ${message}`);\n }\n}\n\n// =============================================================================\n// Push Support Utilities\n// =============================================================================\n\n/**\n * Get the latest commit hash from a remote repository\n * Uses `git ls-remote` to query without cloning\n */\nexport async function getRemoteCommitHash(\n repoUrl: string,\n branch?: string\n): Promise<string> {\n log.debug(`Getting remote commit hash for ${repoUrl}`);\n\n try {\n const git = createGit();\n const ref = branch ? `refs/heads/${branch}` : 'HEAD';\n const result = await git.listRemote([repoUrl, ref]);\n\n // Parse the commit hash from output like \"abc123\\trefs/heads/main\"\n const match = result.match(/^([a-f0-9]+)/);\n if (!match || !match[1]) {\n throw new Error('Could not parse commit hash from remote');\n }\n\n const commitHash = match[1];\n log.debug(`Remote commit hash: ${commitHash}`);\n return commitHash;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to get remote commit hash: ${message}`);\n }\n}\n\nexport interface TempCloneResult {\n /** Path to the temporary clone directory */\n tempDir: string;\n /** Cleanup function to remove the temp directory */\n cleanup: () => Promise<void>;\n}\n\n/**\n * Clone a repository to a temporary directory\n * Returns path and cleanup function\n *\n * Uses shallow clone (--depth 1) for speed\n */\nexport async function cloneToTemp(\n repoUrl: string,\n branch?: string\n): Promise<TempCloneResult> {\n // Create unique temp directory\n const tempBase = paths.join(os.tmpdir(), 'nocaap-push');\n await paths.ensureDir(tempBase);\n const tempDir = await fs.mkdtemp(paths.join(tempBase, 'repo-'));\n\n log.debug(`Cloning ${repoUrl} to temp directory: ${tempDir}`);\n\n try {\n const git = createGit();\n\n // Build clone arguments\n const cloneArgs = ['--depth', '1'];\n if (branch) {\n cloneArgs.push('--branch', branch);\n }\n\n await git.clone(repoUrl, tempDir, cloneArgs);\n\n log.debug(`Temp clone complete: ${tempDir}`);\n\n // Return path and cleanup function\n return {\n tempDir,\n cleanup: async () => {\n log.debug(`Cleaning up temp directory: ${tempDir}`);\n await fs.remove(tempDir);\n },\n };\n } catch (error) {\n // Clean up on failure\n await fs.remove(tempDir);\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to clone to temp directory: ${message}`);\n }\n}\n\n/**\n * Create a new branch in a repository\n */\nexport async function createBranch(repoPath: string, branchName: string): Promise<void> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n await git.checkoutLocalBranch(branchName);\n log.debug(`Created and checked out branch: ${branchName}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to create branch: ${message}`);\n }\n}\n\n/**\n * Commit all changes in a repository\n */\nexport async function commitAll(repoPath: string, message: string): Promise<string> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n\n // Stage all changes\n await git.add('-A');\n\n // Commit\n const result = await git.commit(message);\n\n log.debug(`Committed changes: ${result.commit}`);\n return result.commit;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to commit: ${message}`);\n }\n}\n\n/**\n * Push a branch to origin\n * @throws Error if push fails (e.g., no write access)\n */\nexport async function pushBranch(\n repoPath: string,\n branchName: string\n): Promise<void> {\n const normalizedPath = paths.toUnix(repoPath);\n\n if (!(await isGitRepo(normalizedPath))) {\n throw new Error(`Not a git repository: ${normalizedPath}`);\n }\n\n try {\n const git = createGit(normalizedPath);\n await git.push('origin', branchName, ['--set-upstream']);\n log.debug(`Pushed branch ${branchName} to origin`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n // Check for permission denied\n if (\n message.includes('Permission denied') ||\n message.includes('403') ||\n message.includes('authentication failed')\n ) {\n throw new Error(\n `Permission denied. You don't have write access to this repository.\\n` +\n 'Consider forking the repository and pushing to your fork.'\n );\n }\n\n throw new Error(`Failed to push: ${message}`);\n }\n}\n","/**\n * src/core/indexer.ts\n * Generates the AI-optimized INDEX.md file\n */\nimport fs from 'fs-extra';\nimport matter from 'gray-matter';\nimport * as paths from '../utils/paths.js';\nimport { readConfig } from './config.js';\nimport { log } from '../utils/logger.js';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Rough estimate: ~4 characters per token */\nconst CHARS_PER_TOKEN = 4;\n\n/** Warning threshold for token budget */\nconst TOKEN_BUDGET_WARNING = 8000;\n\n/** Maximum lines to extract for preview */\nconst MAX_PREVIEW_LINES = 5;\n\n/** Supported documentation file extensions */\nconst DOC_EXTENSIONS = ['.md', '.mdx'];\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface DocMeta {\n /** Document title (from frontmatter or filename) */\n title: string;\n /** Document summary (from frontmatter) */\n summary?: string;\n /** Document type (from frontmatter, e.g., \"guide\", \"api\") */\n type?: string;\n /** Document tags (from frontmatter) */\n tags?: string[];\n /** Path relative to .context/ directory */\n relativePath: string;\n /** Preview text (first 5 lines if no summary) */\n preview: string;\n}\n\nexport interface IndexResult {\n /** The INDEX.md markdown content */\n content: string;\n /** Number of files indexed */\n fileCount: number;\n /** Approximate token count */\n tokenEstimate: number;\n /** Warnings (e.g., \"Exceeds 8k token budget\") */\n warnings: string[];\n}\n\ninterface PackageIndex {\n alias: string;\n files: DocMeta[];\n}\n\n// =============================================================================\n// File Parsing\n// =============================================================================\n\n/**\n * Parse a single documentation file and extract metadata\n */\nexport async function parseDocFile(filePath: string, basePath: string): Promise<DocMeta> {\n const normalizedPath = paths.toUnix(filePath);\n const relativePath = paths.relative(basePath, normalizedPath);\n\n log.debug(`Parsing doc file: ${relativePath}`);\n\n const content = await fs.readFile(normalizedPath, 'utf-8');\n\n // Parse frontmatter\n const { data: frontmatter, content: body } = matter(content);\n\n // Extract title: frontmatter > first H1 > filename\n const title = extractTitle(frontmatter, body, normalizedPath);\n\n // Extract summary from frontmatter (support both 'summary' and 'description')\n const summary = (frontmatter.summary ?? frontmatter.description) as string | undefined;\n\n // Extract type from frontmatter\n const type = frontmatter.type as string | undefined;\n\n // Extract tags from frontmatter\n const tags = Array.isArray(frontmatter.tags)\n ? frontmatter.tags.filter((t): t is string => typeof t === 'string')\n : undefined;\n\n // Generate preview: use summary or first N non-empty lines\n const preview = summary || extractPreview(body);\n\n return {\n title,\n summary,\n type,\n tags,\n relativePath,\n preview,\n };\n}\n\n/**\n * Extract title from frontmatter, first H1, or filename\n */\nfunction extractTitle(\n frontmatter: Record<string, unknown>,\n body: string,\n filePath: string\n): string {\n // 1. Try frontmatter title\n if (typeof frontmatter.title === 'string' && frontmatter.title.trim()) {\n return frontmatter.title.trim();\n }\n\n // 2. Try first H1 heading\n const h1Match = body.match(/^#\\s+(.+)$/m);\n if (h1Match?.[1]) {\n return h1Match[1].trim();\n }\n\n // 3. Fall back to filename (without extension)\n const filename = paths.basename(filePath, paths.extname(filePath));\n // Convert kebab-case or snake_case to Title Case\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Extract preview from first N non-empty, non-heading lines\n * Truncates at word boundary for cleaner output\n */\nfunction extractPreview(body: string): string {\n const lines = body.split('\\n');\n const previewLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip empty lines and headings\n if (!trimmed || trimmed.startsWith('#')) {\n continue;\n }\n\n // Skip frontmatter delimiters\n if (trimmed === '---') {\n continue;\n }\n\n previewLines.push(trimmed);\n\n if (previewLines.length >= MAX_PREVIEW_LINES) {\n break;\n }\n }\n\n let preview = previewLines.join(' ');\n\n // Truncate at word boundary if too long\n if (preview.length > 300) {\n preview = preview.slice(0, 300);\n const lastSpace = preview.lastIndexOf(' ');\n // Don't truncate too aggressively (keep at least 200 chars)\n if (lastSpace > 200) {\n preview = preview.slice(0, lastSpace);\n }\n preview += '...';\n }\n\n return preview;\n}\n\n// =============================================================================\n// Directory Scanning\n// =============================================================================\n\n/**\n * Recursively find all documentation files in a directory\n */\nasync function findDocFiles(dirPath: string): Promise<string[]> {\n const results: string[] = [];\n\n if (!(await paths.exists(dirPath))) {\n return results;\n }\n\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = paths.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip hidden directories and node_modules\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\n continue;\n }\n const subFiles = await findDocFiles(fullPath);\n results.push(...subFiles);\n } else if (entry.isFile()) {\n const ext = paths.extname(entry.name).toLowerCase();\n if (DOC_EXTENSIONS.includes(ext)) {\n results.push(fullPath);\n }\n }\n }\n\n return results;\n}\n\n// =============================================================================\n// Index Generation\n// =============================================================================\n\n/**\n * Scan all packages and generate INDEX.md content\n */\nexport async function generateIndex(projectRoot: string): Promise<IndexResult> {\n const contextDir = paths.getContextDir(projectRoot);\n const warnings: string[] = [];\n\n log.debug(`Generating index for ${projectRoot}`);\n\n // Read config to get package aliases\n const config = await readConfig(projectRoot);\n if (!config || config.packages.length === 0) {\n log.debug('No packages configured, generating empty index');\n return {\n content: generateEmptyIndex(),\n fileCount: 0,\n tokenEstimate: 0,\n warnings: ['No packages configured'],\n };\n }\n\n // Scan each package directory\n const packageIndexes: PackageIndex[] = [];\n let totalFiles = 0;\n\n for (const pkg of config.packages) {\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n\n if (!(await paths.exists(packagePath))) {\n log.debug(`Package directory not found: ${pkg.alias}`);\n warnings.push(`Package '${pkg.alias}' directory not found`);\n continue;\n }\n\n const docFiles = await findDocFiles(packagePath);\n\n if (docFiles.length === 0) {\n log.debug(`No documentation files found in package: ${pkg.alias}`);\n warnings.push(`No .md/.mdx files found in '${pkg.alias}'`);\n continue;\n }\n\n // Parse each doc file\n const fileMetas: DocMeta[] = [];\n for (const filePath of docFiles) {\n try {\n const meta = await parseDocFile(filePath, contextDir);\n fileMetas.push(meta);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`Failed to parse ${filePath}: ${message}`);\n warnings.push(`Failed to parse: ${paths.relative(contextDir, filePath)}`);\n }\n }\n\n // Sort files alphabetically by title\n fileMetas.sort((a, b) => a.title.localeCompare(b.title));\n\n packageIndexes.push({\n alias: pkg.alias,\n files: fileMetas,\n });\n\n totalFiles += fileMetas.length;\n }\n\n // Sort packages alphabetically\n packageIndexes.sort((a, b) => a.alias.localeCompare(b.alias));\n\n // Generate markdown content\n const content = generateIndexMarkdown(packageIndexes);\n\n // Estimate tokens\n const tokenEstimate = Math.ceil(content.length / CHARS_PER_TOKEN);\n\n // Check token budget\n if (tokenEstimate > TOKEN_BUDGET_WARNING) {\n warnings.push(\n `INDEX.md exceeds recommended token budget: ~${tokenEstimate.toLocaleString()} tokens ` +\n `(recommended: <${TOKEN_BUDGET_WARNING.toLocaleString()})`\n );\n }\n\n log.debug(\n `Index generated: ${totalFiles} files, ~${tokenEstimate.toLocaleString()} tokens`\n );\n\n return {\n content,\n fileCount: totalFiles,\n tokenEstimate,\n warnings,\n };\n}\n\n/**\n * Generate empty INDEX.md content\n */\nfunction generateEmptyIndex(): string {\n const timestamp = new Date().toISOString();\n return `# Context Index\n\n> Auto-generated by nocaap. Last updated: ${timestamp}\n\nNo packages configured. Run \\`nocaap setup\\` or \\`nocaap add <repo>\\` to add context packages.\n`;\n}\n\n/**\n * Generate INDEX.md markdown from package indexes\n */\nfunction generateIndexMarkdown(packages: PackageIndex[]): string {\n const timestamp = new Date().toISOString();\n\n const lines: string[] = [\n '# Context Index',\n '',\n `> Auto-generated by nocaap. Last updated: ${timestamp}`,\n '',\n ];\n\n // Add table of contents if multiple packages\n if (packages.length > 1) {\n lines.push('## Table of Contents');\n lines.push('');\n for (const pkg of packages) {\n // Create anchor-friendly ID (lowercase, hyphens)\n const anchorId = pkg.alias.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n lines.push(`- [${pkg.alias}](#${anchorId}) (${pkg.files.length} files)`);\n }\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n for (const pkg of packages) {\n // Package header\n lines.push(`## ${pkg.alias} (${pkg.files.length} files)`);\n lines.push('');\n\n for (const file of pkg.files) {\n // File entry\n lines.push(`### ${file.title}`);\n lines.push('');\n lines.push(`**Path:** \\`${file.relativePath}\\``);\n\n if (file.type) {\n lines.push(`**Type:** ${file.type}`);\n }\n\n if (file.tags && file.tags.length > 0) {\n lines.push(`**Tags:** ${file.tags.join(', ')}`);\n }\n\n lines.push('');\n lines.push(file.preview);\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n\n// =============================================================================\n// Index File Operations\n// =============================================================================\n\n/**\n * Generate and write INDEX.md file\n */\nexport async function writeIndex(projectRoot: string): Promise<IndexResult> {\n const result = await generateIndex(projectRoot);\n const indexPath = paths.getIndexPath(projectRoot);\n\n await fs.writeFile(indexPath, result.content, 'utf-8');\n log.debug(`Wrote INDEX.md to ${indexPath}`);\n\n return result;\n}\n\n/**\n * Read existing INDEX.md content\n */\nexport async function readIndex(projectRoot: string): Promise<string | null> {\n const indexPath = paths.getIndexPath(projectRoot);\n\n if (!(await paths.exists(indexPath))) {\n return null;\n }\n\n return fs.readFile(indexPath, 'utf-8');\n}\n\n/**\n * Generate and write INDEX.md with progress logging\n */\nexport async function generateIndexWithProgress(projectRoot: string): Promise<IndexResult> {\n log.info('Regenerating INDEX.md...');\n\n const result = await writeIndex(projectRoot);\n\n if (result.fileCount === 0) {\n log.warn('No documentation files found');\n } else {\n log.success(\n `Generated INDEX.md: ${result.fileCount} files, ~${result.tokenEstimate.toLocaleString()} tokens`\n );\n }\n\n // Log any warnings\n for (const warning of result.warnings) {\n log.warn(warning);\n }\n\n return result;\n}\n","/**\n * src/commands/add.ts\n * Add a context package from a Git repository\n */\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner } from '../utils/logger.js';\nimport {\n initContextDir,\n upsertPackage,\n updateLockEntry,\n configExists,\n} from '../core/config.js';\nimport { checkAccess, sparseClone } from '../core/git-engine.js';\nimport { generateIndexWithProgress } from '../core/indexer.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AddOptions {\n /** Sparse checkout path within the repo */\n path?: string;\n /** Local alias for the package */\n alias?: string;\n /** Branch or tag to checkout */\n branch?: string;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Extract a default alias from a Git URL\n * e.g., \"git@github.com:acme/docs.git\" -> \"docs\"\n * e.g., \"https://github.com/acme/my-standards\" -> \"my-standards\"\n */\nfunction extractAliasFromUrl(url: string): string {\n // Remove trailing .git\n const cleaned = url.replace(/\\.git$/, '');\n\n // Extract the last segment\n const segments = cleaned.split(/[/:]/);\n const lastSegment = segments[segments.length - 1];\n\n // Clean up any remaining characters\n return lastSegment?.replace(/[^a-zA-Z0-9-_]/g, '') || 'context';\n}\n\n/**\n * Generate alias from path or URL\n * Prefers leaf folder from path, falls back to URL extraction\n */\nfunction deriveAlias(url: string, path?: string): string {\n // Prefer leaf folder from path (e.g., \"/capabilities\" -> \"capabilities\")\n if (path) {\n const leafFolder = path.split('/').filter(Boolean).pop();\n if (leafFolder) {\n return leafFolder\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 50);\n }\n }\n // Fallback to URL extraction\n return extractAliasFromUrl(url);\n}\n\n/**\n * Validate alias format\n */\nfunction validateAlias(alias: string): boolean {\n // Must be alphanumeric with hyphens/underscores, 1-50 chars\n return /^[a-zA-Z0-9][a-zA-Z0-9-_]{0,49}$/.test(alias);\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Add a context package from a Git repository\n *\n * Flow:\n * 1. Validate inputs\n * 2. Check repository access\n * 3. Initialize .context/ if needed\n * 4. Clone with sparse checkout\n * 5. Update config and lockfile\n * 6. Regenerate INDEX.md\n */\nexport async function addCommand(\n repo: string,\n options: AddOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n // Derive alias from path (preferred) or URL if not provided\n const alias = options.alias || deriveAlias(repo, options.path);\n\n log.title('Adding context package');\n log.info(`Repository: ${repo}`);\n log.info(`Alias: ${alias}`);\n if (options.path) {\n log.info(`Path: ${options.path}`);\n }\n if (options.branch && options.branch !== 'main') {\n log.info(`Branch: ${options.branch}`);\n }\n log.newline();\n\n // Validate alias\n if (!validateAlias(alias)) {\n throw new Error(\n `Invalid alias '${alias}'. Must be alphanumeric (can include - or _), 1-50 characters.`\n );\n }\n\n // Step 1: Check repository access\n const accessSpinner = createSpinner('Checking repository access...').start();\n\n const hasAccess = await checkAccess(repo);\n if (!hasAccess) {\n accessSpinner.fail('Repository access denied');\n throw new Error(\n `Cannot access repository: ${repo}\\n` +\n 'Please check:\\n' +\n ' - The URL is correct\\n' +\n ' - You have SSH keys configured (for git@ URLs)\\n' +\n ' - You have read access to the repository'\n );\n }\n accessSpinner.succeed('Repository access confirmed');\n\n // Step 2: Initialize .context/ directory if needed\n if (!(await configExists(projectRoot))) {\n const initSpinner = createSpinner('Initializing .context/ directory...').start();\n await initContextDir(projectRoot);\n initSpinner.succeed('Initialized .context/ directory');\n }\n\n // Step 3: Clone the repository\n const targetDir = paths.getPackagePath(projectRoot, alias);\n const cloneSpinner = createSpinner('Cloning repository...').start();\n\n try {\n const { commitHash } = await sparseClone({\n repoUrl: repo,\n targetDir,\n sparsePath: options.path,\n branch: options.branch,\n });\n\n cloneSpinner.succeed(`Cloned to .context/packages/${alias}`);\n\n // Step 4: Update config\n const configSpinner = createSpinner('Updating configuration...').start();\n\n await upsertPackage(projectRoot, {\n alias,\n source: repo,\n path: options.path,\n version: options.branch || 'main',\n });\n\n // Step 5: Update lockfile\n await updateLockEntry(projectRoot, alias, {\n commitHash,\n sparsePath: options.path || '',\n updatedAt: new Date().toISOString(),\n });\n\n configSpinner.succeed('Configuration updated');\n\n // Step 6: Regenerate INDEX.md\n log.newline();\n await generateIndexWithProgress(projectRoot);\n\n // Done!\n log.newline();\n log.success(`Package '${alias}' added successfully!`);\n log.dim(` Location: .context/packages/${alias}`);\n log.dim(` Commit: ${commitHash.slice(0, 8)}`);\n } catch (error) {\n cloneSpinner.fail('Clone failed');\n throw error;\n }\n}\n","/**\n * src/commands/update.ts\n * Update context packages from remote repositories\n */\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner, style } from '../utils/logger.js';\nimport {\n readConfig,\n updateLockEntry,\n getLockEntry,\n} from '../core/config.js';\nimport {\n pull,\n getHeadCommit,\n isDirty,\n isGitRepo,\n} from '../core/git-engine.js';\nimport { generateIndexWithProgress } from '../core/indexer.js';\nimport type { PackageEntry } from '../schemas/index.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UpdateOptions {\n /** Force update even if clean */\n force?: boolean;\n}\n\ninterface UpdateResult {\n alias: string;\n status: 'updated' | 'up-to-date' | 'skipped' | 'error';\n oldCommit?: string;\n newCommit?: string;\n error?: string;\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Update context packages and regenerate index\n *\n * Flow:\n * 1. Read config and lockfile\n * 2. For each package (or specified alias):\n * a. Check if dirty (abort if dirty)\n * b. Pull latest changes\n * c. Update lockfile\n * 3. Regenerate INDEX.md\n */\nexport async function updateCommand(\n alias: string | undefined,\n options: UpdateOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n log.title('Updating context packages');\n\n // Read config\n const config = await readConfig(projectRoot);\n if (!config || config.packages.length === 0) {\n throw new Error(\n 'No packages configured. Run `nocaap setup` or `nocaap add <repo>` first.'\n );\n }\n\n // Filter to specific package if alias provided\n const packagesToUpdate = alias\n ? config.packages.filter((p) => p.alias === alias)\n : config.packages;\n\n if (alias && packagesToUpdate.length === 0) {\n throw new Error(`Package '${alias}' not found in configuration.`);\n }\n\n log.info(`Updating ${packagesToUpdate.length} package(s)...`);\n log.newline();\n\n // Update each package\n const results: UpdateResult[] = [];\n\n for (const pkg of packagesToUpdate) {\n const result = await updatePackage(projectRoot, pkg, options);\n results.push(result);\n }\n\n // Summary\n log.newline();\n log.hr();\n log.newline();\n\n const updated = results.filter((r) => r.status === 'updated');\n const upToDate = results.filter((r) => r.status === 'up-to-date');\n const skipped = results.filter((r) => r.status === 'skipped');\n const errors = results.filter((r) => r.status === 'error');\n\n if (updated.length > 0) {\n log.success(`${updated.length} package(s) updated`);\n for (const r of updated) {\n log.dim(` ${r.alias}: ${r.oldCommit?.slice(0, 8)} → ${r.newCommit?.slice(0, 8)}`);\n }\n }\n\n if (upToDate.length > 0) {\n log.info(`${upToDate.length} package(s) already up-to-date`);\n }\n\n if (skipped.length > 0) {\n log.warn(`${skipped.length} package(s) skipped`);\n for (const r of skipped) {\n log.dim(` ${r.alias}: ${r.error}`);\n }\n }\n\n if (errors.length > 0) {\n log.error(`${errors.length} package(s) failed`);\n for (const r of errors) {\n log.dim(` ${r.alias}: ${r.error}`);\n }\n }\n\n // Regenerate INDEX.md if any updates occurred\n if (updated.length > 0) {\n log.newline();\n await generateIndexWithProgress(projectRoot);\n }\n\n // Exit with error if any failures\n if (errors.length > 0) {\n throw new Error(`${errors.length} package(s) failed to update`);\n }\n}\n\n/**\n * Update a single package\n */\nasync function updatePackage(\n projectRoot: string,\n pkg: PackageEntry,\n options: UpdateOptions\n): Promise<UpdateResult> {\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n const spinner = createSpinner(`Updating ${style.bold(pkg.alias)}...`).start();\n\n try {\n // Check if package directory exists\n if (!(await paths.exists(packagePath))) {\n spinner.warn(`${pkg.alias}: Package directory not found`);\n return {\n alias: pkg.alias,\n status: 'skipped',\n error: 'Directory not found',\n };\n }\n\n // Check if it's a git repo\n if (!(await isGitRepo(packagePath))) {\n spinner.warn(`${pkg.alias}: Not a git repository`);\n return {\n alias: pkg.alias,\n status: 'skipped',\n error: 'Not a git repository',\n };\n }\n\n // Check for dirty state\n if (await isDirty(packagePath)) {\n spinner.warn(`${pkg.alias}: Has uncommitted changes`);\n return {\n alias: pkg.alias,\n status: 'skipped',\n error: 'Uncommitted changes (commit or discard first)',\n };\n }\n\n // Check for config drift (sparse path changed)\n const lockEntry = await getLockEntry(projectRoot, pkg.alias);\n if (lockEntry && lockEntry.sparsePath !== (pkg.path || '')) {\n spinner.warn(`${pkg.alias}: Sparse path changed in config`);\n log.dim(` Config: ${pkg.path || '(root)'}`);\n log.dim(` Locked: ${lockEntry.sparsePath || '(root)'}`);\n return {\n alias: pkg.alias,\n status: 'skipped',\n error: 'Sparse path changed (run `nocaap remove` then `nocaap add` to re-clone)',\n };\n }\n\n // Get current commit\n const oldCommit = await getHeadCommit(packagePath);\n\n // Pull latest\n const { commitHash: newCommit } = await pull(packagePath);\n\n // Check if actually updated\n if (oldCommit === newCommit && !options.force) {\n spinner.info(`${pkg.alias}: Already up-to-date`);\n return {\n alias: pkg.alias,\n status: 'up-to-date',\n oldCommit,\n newCommit,\n };\n }\n\n // Update lockfile\n await updateLockEntry(projectRoot, pkg.alias, {\n commitHash: newCommit,\n sparsePath: pkg.path || '',\n updatedAt: new Date().toISOString(),\n });\n\n spinner.succeed(`${pkg.alias}: Updated`);\n return {\n alias: pkg.alias,\n status: 'updated',\n oldCommit,\n newCommit,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n spinner.fail(`${pkg.alias}: Failed`);\n return {\n alias: pkg.alias,\n status: 'error',\n error: message,\n };\n }\n}\n","/**\n * src/commands/list.ts\n * List installed context packages\n */\nimport * as paths from '../utils/paths.js';\nimport { log, style } from '../utils/logger.js';\nimport { readConfig, readLockfile } from '../core/config.js';\nimport { isGitRepo, isDirty } from '../core/git-engine.js';\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * List all installed context packages with their status\n */\nexport async function listCommand(): Promise<void> {\n const projectRoot = process.cwd();\n\n // Read config and lockfile\n const config = await readConfig(projectRoot);\n const lockfile = await readLockfile(projectRoot);\n\n if (!config || config.packages.length === 0) {\n log.info('No packages installed.');\n log.dim('Run `nocaap setup` or `nocaap add <repo>` to get started.');\n return;\n }\n\n log.title('Installed Packages');\n\n if (config.registryUrl) {\n log.dim(`Registry: ${config.registryUrl}`);\n log.newline();\n }\n\n for (const pkg of config.packages) {\n const lock = lockfile[pkg.alias];\n const commit = lock?.commitHash?.slice(0, 8) ?? 'unknown';\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n\n // Check package status\n let statusIndicator = style.success('●');\n let statusText = '';\n\n if (!(await paths.exists(packagePath))) {\n statusIndicator = style.error('○');\n statusText = ' (missing)';\n } else if (await isGitRepo(packagePath)) {\n try {\n if (await isDirty(packagePath)) {\n statusIndicator = style.warn('●');\n statusText = ' (modified)';\n }\n } catch {\n // Ignore errors checking dirty state\n }\n }\n\n // Display package info\n log.plain(`${statusIndicator} ${style.bold(pkg.alias)}${statusText}`);\n log.dim(` Source: ${pkg.source}`);\n if (pkg.path) {\n log.dim(` Path: ${pkg.path}`);\n }\n log.dim(` Branch: ${pkg.version || 'main'}`);\n log.dim(` Commit: ${commit}`);\n if (lock?.updatedAt) {\n const updated = new Date(lock.updatedAt).toLocaleDateString();\n log.dim(` Updated: ${updated}`);\n }\n log.newline();\n }\n\n // Summary\n log.hr();\n log.dim(`${config.packages.length} package(s) installed`);\n}\n\n","/**\n * src/commands/remove.ts\n * Remove a context package\n */\nimport { confirm } from '@inquirer/prompts';\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner } from '../utils/logger.js';\nimport {\n removePackage as removePackageFromConfig,\n removeLockEntry,\n getPackage,\n} from '../core/config.js';\nimport { isDirty, isGitRepo } from '../core/git-engine.js';\nimport { generateIndexWithProgress } from '../core/indexer.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RemoveOptions {\n /** Force removal even if dirty */\n force?: boolean;\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Remove a context package\n *\n * Flow:\n * 1. Verify package exists in config\n * 2. Check for uncommitted changes (unless --force)\n * 3. Remove package directory\n * 4. Remove from config and lockfile\n * 5. Regenerate INDEX.md\n */\nexport async function removeCommand(\n alias: string,\n options: RemoveOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n log.title('Removing context package');\n\n // Check if package exists in config\n const pkg = await getPackage(projectRoot, alias);\n if (!pkg) {\n throw new Error(\n `Package '${alias}' not found in configuration.\\n` +\n 'Run `nocaap list` to see installed packages.'\n );\n }\n\n log.info(`Package: ${alias}`);\n log.dim(` Source: ${pkg.source}`);\n if (pkg.path) {\n log.dim(` Path: ${pkg.path}`);\n }\n log.newline();\n\n const packagePath = paths.getPackagePath(projectRoot, alias);\n\n // Check for dirty state (unless --force)\n if (!options.force && (await paths.exists(packagePath))) {\n if (await isGitRepo(packagePath)) {\n try {\n if (await isDirty(packagePath)) {\n log.warn('Package has uncommitted changes.');\n log.newline();\n\n const shouldContinue = await confirm({\n message: 'Remove anyway? Local changes will be lost.',\n default: false,\n });\n\n if (!shouldContinue) {\n log.info('Removal cancelled.');\n return;\n }\n }\n } catch {\n // Ignore errors checking dirty state\n }\n }\n }\n\n // Remove package directory\n const dirSpinner = createSpinner('Removing package directory...').start();\n\n try {\n if (await paths.exists(packagePath)) {\n // Use fs.remove directly to bypass dirty check (we already confirmed)\n const fs = await import('fs-extra');\n await fs.default.remove(packagePath);\n }\n dirSpinner.succeed('Removed package directory');\n } catch (error) {\n dirSpinner.fail('Failed to remove directory');\n throw error;\n }\n\n // Remove from config\n const configSpinner = createSpinner('Updating configuration...').start();\n\n try {\n await removePackageFromConfig(projectRoot, alias);\n await removeLockEntry(projectRoot, alias);\n configSpinner.succeed('Configuration updated');\n } catch (error) {\n configSpinner.fail('Failed to update configuration');\n throw error;\n }\n\n // Regenerate INDEX.md\n log.newline();\n await generateIndexWithProgress(projectRoot);\n\n // Done!\n log.newline();\n log.success(`Package '${alias}' removed successfully.`);\n}\n\n","/**\n * src/commands/config.ts\n * Manage nocaap configuration (global and project)\n */\nimport { log, style } from '../utils/logger.js';\nimport {\n getGlobalConfig,\n setGlobalConfig,\n getGlobalConfigPath,\n} from '../core/global-config.js';\nimport { readConfig, writeConfig, configExists } from '../core/config.js';\nimport { resolveSettings } from '../core/settings.js';\nimport * as paths from '../utils/paths.js';\nimport type { GlobalConfig } from '../schemas/index.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ConfigOptions {\n list?: boolean;\n global?: boolean;\n project?: boolean;\n}\n\n// Valid config keys with their descriptions\nconst CONFIG_KEYS: Record<string, { scope: 'global' | 'project' | 'both'; desc: string }> = {\n 'registry': { scope: 'global', desc: 'Default registry URL' },\n 'push.baseBranch': { scope: 'both', desc: 'Default PR target branch' },\n 'embedding.provider': { scope: 'global', desc: 'Embedding provider (ollama|openai|tfjs|auto)' },\n 'embedding.ollamaModel': { scope: 'global', desc: 'Ollama model name' },\n 'embedding.ollamaBaseUrl': { scope: 'global', desc: 'Ollama server URL' },\n 'search.fulltextWeight': { scope: 'project', desc: 'BM25 weight (0-1)' },\n 'search.vectorWeight': { scope: 'project', desc: 'Vector weight (0-1)' },\n 'search.rrfK': { scope: 'project', desc: 'RRF smoothing constant' },\n 'index.semantic': { scope: 'project', desc: 'Enable semantic indexing by default' },\n 'index.provider': { scope: 'project', desc: 'Index embedding provider' },\n};\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * View or set configuration\n *\n * Usage:\n * nocaap config - Show all config (alias for list)\n * nocaap config list - Show all config\n * nocaap config list --global - Show global config only\n * nocaap config list --project - Show project config only\n * nocaap config get <key> - Get a specific value\n * nocaap config set <key> <value> - Set a value (global by default)\n * nocaap config set --project <k> <v> - Set project-level value\n * nocaap config unset <key> - Remove a value\n */\nexport async function configCommand(\n key: string | undefined,\n value: string | undefined,\n options: ConfigOptions\n): Promise<void> {\n // If --list flag or no arguments, show all config\n if (options.list || !key) {\n await showConfig(options);\n return;\n }\n\n // Handle subcommands\n switch (key) {\n case 'list':\n await showConfig(options);\n break;\n case 'get':\n if (!value) {\n log.error('Usage: nocaap config get <key>');\n showAvailableKeys();\n return;\n }\n await getConfigValue(value);\n break;\n case 'set':\n // value is actually the key in this case, we need to get the real value\n log.error('Usage: nocaap config set <key> <value>');\n log.dim('Example: nocaap config set push.baseBranch develop');\n break;\n case 'unset':\n if (!value) {\n log.error('Usage: nocaap config unset <key>');\n showAvailableKeys();\n return;\n }\n await unsetConfigValue(value, options);\n break;\n default:\n // Assume key=value format: nocaap config push.baseBranch develop\n if (value !== undefined) {\n await setConfigValue(key, value, options);\n } else {\n await getConfigValue(key);\n }\n }\n}\n\n/**\n * Handle \"nocaap config set <key> <value>\" via index.ts\n */\nexport async function configSetCommand(\n key: string,\n value: string,\n options: ConfigOptions\n): Promise<void> {\n await setConfigValue(key, value, options);\n}\n\n// =============================================================================\n// Config Operations\n// =============================================================================\n\n/**\n * Show all configuration\n */\nasync function showConfig(options: ConfigOptions): Promise<void> {\n const projectRoot = process.cwd();\n const showGlobal = !options.project;\n const showProject = !options.global;\n\n log.title('Configuration');\n log.newline();\n\n // Global config\n if (showGlobal) {\n const globalPath = getGlobalConfigPath();\n log.info(style.bold('Global') + style.dim(` (${globalPath})`));\n\n const globalConfig = await getGlobalConfig();\n if (Object.keys(globalConfig).length === 0) {\n log.dim(' (empty)');\n } else {\n printConfigObject(globalConfig, ' ');\n }\n log.newline();\n }\n\n // Project config\n if (showProject) {\n const hasProject = await configExists(projectRoot);\n const projectPath = paths.getConfigPath(projectRoot);\n\n log.info(style.bold('Project') + style.dim(` (${projectPath})`));\n\n if (!hasProject) {\n log.dim(' (no project config - run nocaap setup first)');\n } else {\n const projectConfig = await readConfig(projectRoot);\n if (projectConfig) {\n // Show only the settings fields, not packages\n const { search, push, index } = projectConfig;\n const settings = { search, push, index };\n const hasSettings = Object.values(settings).some(v => v !== undefined);\n\n if (hasSettings) {\n printConfigObject(settings, ' ');\n } else {\n log.dim(' (no settings configured)');\n }\n }\n }\n log.newline();\n }\n\n // Show effective settings if both scopes shown\n if (showGlobal && showProject) {\n try {\n const resolved = await resolveSettings(projectRoot);\n log.info(style.bold('Effective Settings') + style.dim(' (merged)'));\n printConfigObject(resolved as unknown as Record<string, unknown>, ' ');\n } catch {\n // Project may not exist\n }\n }\n}\n\n/**\n * Get a specific config value\n */\nasync function getConfigValue(key: string): Promise<void> {\n const projectRoot = process.cwd();\n\n // Validate key\n if (!CONFIG_KEYS[key] && key !== 'registry') {\n log.error(`Unknown config key: ${style.code(key)}`);\n showAvailableKeys();\n return;\n }\n\n // Get effective value from resolved settings\n try {\n const resolved = await resolveSettings(projectRoot);\n const value = getNestedValue(resolved as unknown as Record<string, unknown>, key);\n\n if (value !== undefined) {\n log.info(`${key}: ${formatValue(value)}`);\n } else {\n log.info(`${key}: ${style.dim('(not set)')}`);\n }\n } catch {\n // Try global config only\n const globalConfig = await getGlobalConfig();\n const value = getNestedValue(globalConfig, key);\n\n if (value !== undefined) {\n log.info(`${key}: ${formatValue(value)}`);\n } else {\n log.info(`${key}: ${style.dim('(not set)')}`);\n }\n }\n}\n\n/**\n * Set a config value\n */\nasync function setConfigValue(\n key: string,\n value: string,\n options: ConfigOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n // Validate key\n const keyInfo = CONFIG_KEYS[key];\n if (!keyInfo && key !== 'registry') {\n log.error(`Unknown config key: ${style.code(key)}`);\n showAvailableKeys();\n return;\n }\n\n // Determine scope\n const scope = options.project ? 'project' : 'global';\n\n // Validate scope\n if (keyInfo && scope === 'project' && keyInfo.scope === 'global') {\n log.error(`Key '${key}' can only be set globally.`);\n log.dim('Run without --project flag.');\n return;\n }\n if (keyInfo && scope === 'global' && keyInfo.scope === 'project') {\n log.error(`Key '${key}' can only be set at project level.`);\n log.dim('Use --project flag.');\n return;\n }\n\n // Parse and validate value\n const parsedValue = parseValue(key, value);\n\n if (scope === 'global') {\n await setGlobalValue(key, parsedValue);\n log.success(`Set ${style.code(key)} = ${formatValue(parsedValue)} (global)`);\n } else {\n await setProjectValue(projectRoot, key, parsedValue);\n log.success(`Set ${style.code(key)} = ${formatValue(parsedValue)} (project)`);\n }\n}\n\n/**\n * Unset a config value\n */\nasync function unsetConfigValue(key: string, options: ConfigOptions): Promise<void> {\n const projectRoot = process.cwd();\n const scope = options.project ? 'project' : 'global';\n\n if (scope === 'global') {\n const config = await getGlobalConfig();\n deleteNestedValue(config, key);\n await setGlobalConfig(config);\n log.success(`Removed ${style.code(key)} from global config`);\n } else {\n const config = await readConfig(projectRoot);\n if (config) {\n deleteNestedValue(config, key);\n await writeConfig(projectRoot, config);\n log.success(`Removed ${style.code(key)} from project config`);\n } else {\n log.warn('No project config found');\n }\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Set a value in global config\n */\nasync function setGlobalValue(key: string, value: unknown): Promise<void> {\n const config = await getGlobalConfig();\n\n // Handle registry specially for backward compatibility\n if (key === 'registry') {\n config.defaultRegistry = value as string;\n } else {\n setNestedValue(config, key, value);\n }\n\n await setGlobalConfig(config);\n}\n\n/**\n * Set a value in project config\n */\nasync function setProjectValue(projectRoot: string, key: string, value: unknown): Promise<void> {\n const config = await readConfig(projectRoot);\n\n if (!config) {\n log.error('No project config found. Run `nocaap setup` first.');\n return;\n }\n\n setNestedValue(config, key, value);\n await writeConfig(projectRoot, config);\n}\n\n/**\n * Parse a string value to appropriate type\n */\nfunction parseValue(key: string, value: string): unknown {\n // Boolean\n if (value === 'true') return true;\n if (value === 'false') return false;\n\n // Number (for weights and rrfK)\n if (key.includes('Weight') || key === 'search.rrfK') {\n const num = parseFloat(value);\n if (isNaN(num)) {\n throw new Error(`Invalid number: ${value}`);\n }\n // Validate range for weights\n if (key.includes('Weight') && (num < 0 || num > 1)) {\n throw new Error(`Weight must be between 0 and 1`);\n }\n return num;\n }\n\n return value;\n}\n\n/**\n * Format a value for display\n */\nfunction formatValue(value: unknown): string {\n if (typeof value === 'string') return style.code(value);\n if (typeof value === 'number') return style.code(value.toString());\n if (typeof value === 'boolean') return style.code(value ? 'true' : 'false');\n return String(value);\n}\n\n/**\n * Get nested value from object using dot notation\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n // Handle registry alias\n if (path === 'registry') {\n return (obj as GlobalConfig).defaultRegistry;\n }\n\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Set nested value in object using dot notation\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (!(part in current) || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1]!;\n current[lastPart] = value;\n}\n\n/**\n * Delete nested value from object using dot notation\n */\nfunction deleteNestedValue(obj: Record<string, unknown>, path: string): void {\n const parts = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (!(part in current) || typeof current[part] !== 'object') {\n return; // Path doesn't exist\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1]!;\n delete current[lastPart];\n}\n\n/**\n * Print a config object recursively\n */\nfunction printConfigObject(obj: Record<string, unknown>, indent: string): void {\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n log.info(`${indent}${style.bold(key)}:`);\n printConfigObject(value as Record<string, unknown>, indent + ' ');\n } else {\n log.info(`${indent}${key}: ${formatValue(value)}`);\n }\n }\n}\n\n/**\n * Show available config keys\n */\nfunction showAvailableKeys(): void {\n log.newline();\n log.info('Available keys:');\n for (const [key, info] of Object.entries(CONFIG_KEYS)) {\n const scopeTag = info.scope === 'both' ? '' : ` [${info.scope}]`;\n log.dim(` ${key}${scopeTag} - ${info.desc}`);\n }\n}\n","/**\n * src/commands/push.ts\n * Push local context changes back upstream as a PR\n */\nimport { checkbox } from '@inquirer/prompts';\nimport fs from 'fs-extra';\nimport * as paths from '../utils/paths.js';\nimport { log, createSpinner, style } from '../utils/logger.js';\nimport { readConfig, readLockfile } from '../core/config.js';\nimport { resolvePushSettings } from '../core/settings.js';\nimport {\n cloneToTemp,\n getRemoteCommitHash,\n createBranch,\n commitAll,\n pushBranch,\n getDefaultBranch,\n isDirty,\n} from '../core/git-engine.js';\nimport { parseRepoInfo, buildNewPrUrl } from '../utils/providers.js';\nimport { createPr } from '../core/github.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface PushOptions {\n /** Custom commit message */\n message?: string;\n /** Push all packages with changes */\n all?: boolean;\n}\n\ninterface PackageInfo {\n alias: string;\n source: string;\n path?: string;\n localCommit: string;\n}\n\ntype PushStatus = 'pushed' | 'skipped' | 'failed';\ntype SkipReason = 'no_changes' | 'nothing_to_commit';\n\ninterface PushResult {\n status: PushStatus;\n prUrl?: string;\n error?: string;\n skipReason?: SkipReason;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Get the date string for branch naming (YYYYMMDD)\n */\nfunction getDateString(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}${month}${day}`;\n}\n\n/**\n * Generate branch name: nocaap/{alias}-{YYYYMMDD}\n */\nfunction generateBranchName(alias: string): string {\n return `nocaap/${alias}-${getDateString()}`;\n}\n\n/**\n * Get list of all configured packages with their info\n */\nasync function getAllPackages(projectRoot: string): Promise<PackageInfo[]> {\n const config = await readConfig(projectRoot);\n const lockfile = await readLockfile(projectRoot);\n\n if (!config) {\n return [];\n }\n\n return config.packages.map((pkg) => ({\n alias: pkg.alias,\n source: pkg.source,\n path: pkg.path,\n localCommit: lockfile[pkg.alias]?.commitHash || '',\n }));\n}\n\n/**\n * Interactive package picker for push\n */\nasync function selectPackagesToPush(packages: PackageInfo[]): Promise<string[]> {\n if (packages.length === 0) {\n return [];\n }\n\n const choices = packages.map((pkg) => ({\n name: `${pkg.alias} (${pkg.source})`,\n value: pkg.alias,\n checked: false,\n }));\n\n const selected = await checkbox({\n message: 'Select packages to push:',\n choices,\n pageSize: 15,\n });\n\n return selected;\n}\n\n// =============================================================================\n// Single Package Push\n// =============================================================================\n\n/**\n * Push a single package to upstream\n */\nasync function pushSinglePackage(\n projectRoot: string,\n pkg: PackageInfo,\n commitMessage: string\n): Promise<PushResult> {\n const packagePath = paths.getPackagePath(projectRoot, pkg.alias);\n const branchName = generateBranchName(pkg.alias);\n const repoInfo = parseRepoInfo(pkg.source);\n\n // Resolve push settings (uses configured baseBranch if set, otherwise auto-detect)\n const pushSettings = await resolvePushSettings(projectRoot);\n const baseBranch = pushSettings.baseBranch ?? await getDefaultBranch(pkg.source);\n log.debug(`Using base branch: ${baseBranch}`);\n\n // Step 1: Check for upstream divergence\n const checkSpinner = createSpinner('Checking upstream...').start();\n\n try {\n const remoteCommit = await getRemoteCommitHash(pkg.source, baseBranch);\n\n if (remoteCommit !== pkg.localCommit) {\n checkSpinner.fail('Upstream has diverged');\n return {\n status: 'failed',\n error: `Upstream has changed. Run 'nocaap update ${pkg.alias}' first.`,\n };\n }\n checkSpinner.succeed('Upstream in sync');\n } catch (error) {\n checkSpinner.fail('Failed to check upstream');\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { status: 'failed', error: msg };\n }\n\n // Step 2: Clone to temp\n const cloneSpinner = createSpinner('Cloning upstream...').start();\n let tempDir: string;\n let cleanup: () => Promise<void>;\n\n try {\n const result = await cloneToTemp(pkg.source, baseBranch);\n tempDir = result.tempDir;\n cleanup = result.cleanup;\n cloneSpinner.succeed('Cloned to temp directory');\n } catch (error) {\n cloneSpinner.fail('Clone failed');\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { status: 'failed', error: msg };\n }\n\n try {\n // Step 3: Copy files to sparse path location\n const copySpinner = createSpinner('Copying changes...').start();\n const sparsePath = pkg.path\n ? paths.toUnix(pkg.path).replace(/^\\/+/, '')\n : '';\n const sparseSegments = sparsePath.split('/').filter(Boolean);\n\n if (sparseSegments.includes('..')) {\n throw new Error(\n `Invalid package path '${pkg.path}': path traversal segments are not allowed`\n );\n }\n\n const targetPath = sparsePath\n ? paths.join(tempDir, sparsePath)\n : tempDir;\n if (!paths.isWithin(tempDir, targetPath)) {\n throw new Error(`Resolved target path escapes temp clone root: ${targetPath}`);\n }\n\n // Determine source: handle both flat and non-flat package layouts\n // Flat = files at package root (post-flattening by sparseClone)\n // Non-flat = files retain original directory structure\n let sourcePath = packagePath;\n if (sparsePath) {\n const sparseSubdir = paths.join(packagePath, sparsePath);\n if (!paths.isWithin(packagePath, sparseSubdir)) {\n throw new Error(\n `Resolved source path escapes package directory: ${sparseSubdir}`\n );\n }\n const stat = await fs.stat(sparseSubdir).catch(() => null);\n if (stat?.isDirectory()) {\n sourcePath = sparseSubdir;\n log.debug(`Package is non-flat, using sparse subdir: ${sparseSubdir}`);\n }\n }\n if (!paths.isWithin(packagePath, sourcePath)) {\n throw new Error(\n `Resolved source path escapes package directory: ${sourcePath}`\n );\n }\n\n await paths.ensureDir(targetPath);\n\n // Mirror target: clear existing contents so deletions are reflected\n if (sparsePath && targetPath !== tempDir) {\n const existing = await fs.readdir(targetPath).catch(() => []);\n for (const item of existing) {\n await fs.remove(paths.join(targetPath, item));\n }\n }\n\n // Copy all files from source to target (excluding .git)\n const items = await fs.readdir(sourcePath);\n for (const item of items) {\n if (item === '.git') continue;\n const srcPath = paths.join(sourcePath, item);\n const destPath = paths.join(targetPath, item);\n await fs.copy(srcPath, destPath, { overwrite: true });\n }\n copySpinner.succeed('Changes copied');\n\n // Step 4: Check for actual changes before branching\n const hasChanges = await isDirty(tempDir);\n if (!hasChanges) {\n await cleanup();\n return { status: 'skipped', skipReason: 'no_changes' };\n }\n\n // Step 5: Create feature branch (only if changes exist)\n const branchSpinner = createSpinner('Creating branch...').start();\n await createBranch(tempDir, branchName);\n branchSpinner.succeed(`Created branch: ${branchName}`);\n\n // Step 6: Commit\n const commitSpinner = createSpinner('Committing...').start();\n try {\n await commitAll(tempDir, commitMessage);\n commitSpinner.succeed('Changes committed');\n } catch (error) {\n // Defensive fallback: isDirty should catch this, but just in case\n const msg = error instanceof Error ? error.message : '';\n if (msg.includes('nothing to commit')) {\n commitSpinner.warn('No changes to commit');\n await cleanup();\n return { status: 'skipped', skipReason: 'nothing_to_commit' };\n }\n throw error;\n }\n\n // Step 7: Push\n const pushSpinner = createSpinner('Pushing to remote...').start();\n try {\n await pushBranch(tempDir, branchName);\n pushSpinner.succeed('Pushed to remote');\n } catch (error) {\n pushSpinner.fail('Push failed');\n throw error;\n }\n\n // Step 8: Create PR\n const prSpinner = createSpinner('Creating PR...').start();\n const manualUrl = buildNewPrUrl(repoInfo, branchName, baseBranch);\n\n const prResult = await createPr({\n repoDir: tempDir,\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n branch: branchName,\n baseBranch,\n title: `Update ${pkg.alias} context via nocaap`,\n body: `This PR was created automatically by nocaap.\\n\\n**Commit message:** ${commitMessage}`,\n manualUrl,\n });\n\n if (prResult.success) {\n prSpinner.succeed('PR created');\n } else {\n prSpinner.warn('PR not created automatically');\n }\n\n await cleanup();\n\n return {\n status: 'pushed',\n prUrl: prResult.url || manualUrl,\n };\n } catch (error) {\n await cleanup();\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { status: 'failed', error: msg };\n }\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Push command - push local changes to upstream as a PR\n *\n * Variants:\n * - nocaap push → Interactive picker\n * - nocaap push <alias> → Push specific package\n * - nocaap push --all → Push all packages\n */\nexport async function pushCommand(\n alias: string | undefined,\n options: PushOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n log.title('nocaap Push');\n log.newline();\n\n // Get all configured packages\n const allPackages = await getAllPackages(projectRoot);\n\n if (allPackages.length === 0) {\n log.error('No packages configured. Run `nocaap setup` or `nocaap add` first.');\n return;\n }\n\n // Determine which packages to push\n let packagesToPush: PackageInfo[];\n\n if (options.all) {\n // Push all packages\n packagesToPush = allPackages;\n log.info(`Pushing all ${packagesToPush.length} package(s)...`);\n } else if (alias) {\n // Push specific package\n const pkg = allPackages.find((p) => p.alias === alias);\n if (!pkg) {\n log.error(`Package '${alias}' not found in config.`);\n log.dim('Available packages:');\n for (const p of allPackages) {\n log.dim(` - ${p.alias}`);\n }\n return;\n }\n packagesToPush = [pkg];\n } else {\n // Interactive picker\n log.info('Select packages to push:');\n log.newline();\n\n const selectedAliases = await selectPackagesToPush(allPackages);\n\n if (selectedAliases.length === 0) {\n log.warn('No packages selected. Push cancelled.');\n return;\n }\n\n packagesToPush = allPackages.filter((p) => selectedAliases.includes(p.alias));\n }\n\n log.newline();\n\n // Default commit message\n const defaultMessage =\n packagesToPush.length === 1 && packagesToPush[0]\n ? `Update ${packagesToPush[0].alias} context via nocaap`\n : 'Update context via nocaap';\n\n const commitMessage = options.message || defaultMessage;\n\n // Push each package\n const results: Array<{ alias: string } & PushResult> = [];\n\n for (const pkg of packagesToPush) {\n log.hr();\n log.newline();\n log.info(`Pushing ${style.bold(pkg.alias)}...`);\n log.dim(` Source: ${pkg.source}`);\n if (pkg.path) {\n log.dim(` Path: ${pkg.path}`);\n }\n log.newline();\n\n const result = await pushSinglePackage(projectRoot, pkg, commitMessage);\n results.push({ alias: pkg.alias, ...result });\n\n if (result.status === 'pushed' && result.prUrl) {\n log.newline();\n log.success(`PR created for ${pkg.alias}:`);\n log.info(` ${style.url(result.prUrl)}`);\n } else if (result.status === 'skipped') {\n log.newline();\n log.info(`${pkg.alias}: No changes to push`);\n } else if (result.status === 'failed') {\n log.newline();\n log.error(`Failed: ${result.error}`);\n }\n }\n\n // Summary\n log.newline();\n log.hr();\n log.newline();\n\n const pushed = results.filter((r) => r.status === 'pushed');\n const skipped = results.filter((r) => r.status === 'skipped');\n const failed = results.filter((r) => r.status === 'failed');\n\n if (pushed.length > 0) {\n log.success(`${pushed.length} package(s) pushed successfully.`);\n\n const withPrs = pushed.filter((r) => r.prUrl);\n if (withPrs.length > 0) {\n log.newline();\n log.info('Pull Requests:');\n for (const r of withPrs) {\n log.dim(` ${r.alias}: ${r.prUrl}`);\n }\n }\n }\n\n if (skipped.length > 0) {\n log.newline();\n log.info(`${skipped.length} package(s) skipped (no changes).`);\n for (const r of skipped) {\n log.dim(` ${r.alias}: ${r.skipReason}`);\n }\n }\n\n if (failed.length > 0) {\n log.newline();\n log.warn(`${failed.length} package(s) failed.`);\n for (const r of failed) {\n log.dim(` ${r.alias}: ${r.error}`);\n }\n }\n}\n","/**\n * src/utils/providers.ts\n * Git provider detection and URL parsing utilities\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type Provider = 'github' | 'gitlab' | 'bitbucket' | 'unknown';\n\nexport interface RepoInfo {\n provider: Provider;\n owner: string;\n repo: string;\n}\n\n// =============================================================================\n// Provider Detection\n// =============================================================================\n\n/**\n * Detect the Git provider from a repository URL\n */\nexport function detectProvider(url: string): Provider {\n const normalized = url.toLowerCase();\n\n if (normalized.includes('github.com') || normalized.includes('github:')) {\n return 'github';\n }\n if (normalized.includes('gitlab.com') || normalized.includes('gitlab:')) {\n return 'gitlab';\n }\n if (normalized.includes('bitbucket.org') || normalized.includes('bitbucket:')) {\n return 'bitbucket';\n }\n\n return 'unknown';\n}\n\n// =============================================================================\n// URL Parsing\n// =============================================================================\n\n/**\n * Parse a Git URL into provider, owner, and repo components\n *\n * Supports:\n * - git@github.com:owner/repo.git\n * - https://github.com/owner/repo.git\n * - https://github.com/owner/repo\n */\nexport function parseRepoInfo(url: string): RepoInfo {\n const provider = detectProvider(url);\n\n // Remove trailing .git\n const cleaned = url.replace(/\\.git$/, '');\n\n // Try SSH format: git@provider:owner/repo\n const sshMatch = cleaned.match(/git@[^:]+:([^/]+)\\/(.+)/);\n if (sshMatch && sshMatch[1] && sshMatch[2]) {\n return {\n provider,\n owner: sshMatch[1],\n repo: sshMatch[2],\n };\n }\n\n // Try HTTPS format: https://provider/owner/repo\n const httpsMatch = cleaned.match(/https?:\\/\\/[^/]+\\/([^/]+)\\/(.+)/);\n if (httpsMatch && httpsMatch[1] && httpsMatch[2]) {\n return {\n provider,\n owner: httpsMatch[1],\n repo: httpsMatch[2],\n };\n }\n\n // Fallback: return empty strings\n return {\n provider,\n owner: '',\n repo: '',\n };\n}\n\n// =============================================================================\n// PR URL Generation\n// =============================================================================\n\n/**\n * Build a \"create PR\" URL for manual browser navigation\n * Used as fallback when gh CLI and API are unavailable\n */\nexport function buildNewPrUrl(info: RepoInfo, branch: string, baseBranch: string = 'main'): string {\n const { provider, owner, repo } = info;\n\n switch (provider) {\n case 'github':\n // GitHub compare URL that opens PR creation\n return `https://github.com/${owner}/${repo}/compare/${baseBranch}...${branch}?expand=1`;\n\n case 'gitlab':\n // GitLab merge request creation URL (target_branch is the base)\n return `https://gitlab.com/${owner}/${repo}/-/merge_requests/new?merge_request[source_branch]=${branch}&merge_request[target_branch]=${baseBranch}`;\n\n case 'bitbucket':\n // Bitbucket PR creation URL\n return `https://bitbucket.org/${owner}/${repo}/pull-requests/new?source=${branch}&dest=${baseBranch}`;\n\n default:\n // Generic fallback - just return the repo URL\n return `https://github.com/${owner}/${repo}`;\n }\n}\n\n/**\n * Build a direct link to an existing PR\n */\nexport function buildPrLink(info: RepoInfo, prNumber: number): string {\n const { provider, owner, repo } = info;\n\n switch (provider) {\n case 'github':\n return `https://github.com/${owner}/${repo}/pull/${prNumber}`;\n\n case 'gitlab':\n return `https://gitlab.com/${owner}/${repo}/-/merge_requests/${prNumber}`;\n\n case 'bitbucket':\n return `https://bitbucket.org/${owner}/${repo}/pull-requests/${prNumber}`;\n\n default:\n return '';\n }\n}\n","/**\n * src/core/github.ts\n * GitHub PR creation utilities with cascading fallbacks\n */\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { log } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type PrMethod = 'gh' | 'api' | 'manual';\n\nexport interface PrResult {\n /** The PR URL if created successfully */\n url: string | null;\n /** The method that was used */\n method: PrMethod;\n /** Whether the PR was created successfully */\n success: boolean;\n /** Error message if failed */\n error?: string;\n}\n\n// =============================================================================\n// Detection\n// =============================================================================\n\n/**\n * Check if the gh CLI is available and authenticated\n */\nexport async function isGhAvailable(): Promise<boolean> {\n try {\n await execAsync('gh auth status');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if GITHUB_TOKEN environment variable is set\n */\nexport function hasGitHubToken(): boolean {\n return Boolean(process.env.GITHUB_TOKEN);\n}\n\n/**\n * Detect the best available method for PR creation\n */\nexport async function detectPrMethod(): Promise<PrMethod> {\n // Try gh CLI first (best UX)\n if (await isGhAvailable()) {\n log.debug('gh CLI available and authenticated');\n return 'gh';\n }\n\n // Try GitHub API via token\n if (hasGitHubToken()) {\n log.debug('GITHUB_TOKEN available for API');\n return 'api';\n }\n\n // Fallback to manual URL\n log.debug('No automated PR method available, will use manual URL');\n return 'manual';\n}\n\n// =============================================================================\n// PR Creation via gh CLI\n// =============================================================================\n\n/**\n * Create a PR using the gh CLI\n * Requires gh to be installed and authenticated\n *\n * @param repoDir - The local repository directory (temp clone)\n * @param branch - The branch name for the PR\n * @param title - The PR title\n * @param body - The PR body/description\n * @returns The PR URL if successful, null otherwise\n */\nexport async function createPrViaGh(\n repoDir: string,\n branch: string,\n title: string,\n body: string\n): Promise<string | null> {\n log.debug(`Creating PR via gh CLI in ${repoDir}`);\n\n try {\n // gh pr create outputs the PR URL on success\n const { stdout } = await execAsync(\n `gh pr create --title \"${escapeShell(title)}\" --body \"${escapeShell(body)}\" --head \"${branch}\"`,\n { cwd: repoDir }\n );\n\n const url = stdout.trim();\n log.debug(`PR created via gh: ${url}`);\n return url;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`gh pr create failed: ${message}`);\n return null;\n }\n}\n\n// =============================================================================\n// PR Creation via GitHub API\n// =============================================================================\n\n/**\n * Create a PR using the GitHub REST API\n * Requires GITHUB_TOKEN environment variable\n *\n * @param owner - Repository owner\n * @param repo - Repository name\n * @param branch - The head branch for the PR\n * @param baseBranch - The base branch (usually main)\n * @param title - The PR title\n * @param body - The PR body/description\n * @returns The PR URL if successful, null otherwise\n */\nexport async function createPrViaApi(\n owner: string,\n repo: string,\n branch: string,\n baseBranch: string,\n title: string,\n body: string\n): Promise<string | null> {\n const token = process.env.GITHUB_TOKEN;\n if (!token) {\n log.debug('No GITHUB_TOKEN available for API');\n return null;\n }\n\n log.debug(`Creating PR via GitHub API for ${owner}/${repo}`);\n\n try {\n const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/pulls`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n body: JSON.stringify({\n title,\n body,\n head: branch,\n base: baseBranch,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n log.debug(`GitHub API error: ${response.status} - ${JSON.stringify(errorData)}`);\n return null;\n }\n\n const data = (await response.json()) as { html_url?: string };\n const url = data.html_url || null;\n\n if (url) {\n log.debug(`PR created via API: ${url}`);\n }\n\n return url;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n log.debug(`GitHub API request failed: ${message}`);\n return null;\n }\n}\n\n// =============================================================================\n// Cascading PR Creation\n// =============================================================================\n\nexport interface CreatePrOptions {\n /** Local repository directory (temp clone) */\n repoDir: string;\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Feature branch name */\n branch: string;\n /** Base branch (usually main) */\n baseBranch: string;\n /** PR title */\n title: string;\n /** PR body/description */\n body: string;\n /** Manual PR URL for fallback */\n manualUrl: string;\n}\n\n/**\n * Create a PR using the best available method\n * Cascades: gh CLI → GitHub API → manual URL\n */\nexport async function createPr(options: CreatePrOptions): Promise<PrResult> {\n const method = await detectPrMethod();\n\n switch (method) {\n case 'gh': {\n const url = await createPrViaGh(\n options.repoDir,\n options.branch,\n options.title,\n options.body\n );\n\n if (url) {\n return { url, method: 'gh', success: true };\n }\n\n // gh failed, try API\n log.debug('gh CLI failed, trying GitHub API');\n if (hasGitHubToken()) {\n const apiUrl = await createPrViaApi(\n options.owner,\n options.repo,\n options.branch,\n options.baseBranch,\n options.title,\n options.body\n );\n\n if (apiUrl) {\n return { url: apiUrl, method: 'api', success: true };\n }\n }\n\n // Both failed, return manual URL\n return {\n url: options.manualUrl,\n method: 'manual',\n success: false,\n error: 'Could not create PR automatically. Please create it manually.',\n };\n }\n\n case 'api': {\n const url = await createPrViaApi(\n options.owner,\n options.repo,\n options.branch,\n options.baseBranch,\n options.title,\n options.body\n );\n\n if (url) {\n return { url, method: 'api', success: true };\n }\n\n // API failed, return manual URL\n return {\n url: options.manualUrl,\n method: 'manual',\n success: false,\n error: 'Could not create PR via API. Please create it manually.',\n };\n }\n\n case 'manual':\n default:\n return {\n url: options.manualUrl,\n method: 'manual',\n success: false,\n error: 'No automated PR creation method available.',\n };\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Escape a string for safe use in shell commands\n */\nfunction escapeShell(str: string): string {\n return str.replace(/\"/g, '\\\\\"').replace(/\\$/g, '\\\\$').replace(/`/g, '\\\\`');\n}\n","/**\n * src/commands/serve.ts\n * Start the nocaap MCP server\n */\nimport { startMcpServer } from '../core/mcp-server.js';\nimport * as paths from '../utils/paths.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ServeOptions {\n printConfig?: boolean;\n root?: string;\n}\n\n// =============================================================================\n// Claude Desktop Config\n// =============================================================================\n\ninterface ClaudeDesktopConfig {\n mcpServers: {\n [name: string]: {\n command: string;\n args: string[];\n };\n };\n}\n\n/**\n * Generate Claude Desktop configuration JSON\n */\nfunction generateClaudeDesktopConfig(): ClaudeDesktopConfig {\n return {\n mcpServers: {\n nocaap: {\n command: 'nocaap',\n args: ['serve'],\n },\n },\n };\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * Start the MCP server or print Claude Desktop config\n */\nexport async function serveCommand(options: ServeOptions = {}): Promise<void> {\n // Use --root option if provided, otherwise use current working directory\n const projectRoot = options.root ?? process.cwd();\n\n // Handle --print-config flag\n if (options.printConfig) {\n const config = generateClaudeDesktopConfig();\n console.log(JSON.stringify(config, null, 2));\n return;\n }\n\n // Check if .context directory exists\n const contextDir = paths.getContextDir(projectRoot);\n if (!(await paths.exists(contextDir))) {\n throw new Error(\n 'No .context directory found. Run `nocaap setup` or `nocaap add` first.'\n );\n }\n\n // Note: Don't output anything to stdout - MCP uses stdio for JSON-RPC communication\n // Any console.log() calls will corrupt the protocol\n // Warnings can go to stderr if absolutely necessary\n\n // Start the MCP server (blocks until terminated)\n await startMcpServer({ projectRoot });\n}\n","/**\n * src/core/mcp-server.ts\n * MCP server implementation for AI agent access to organizational context\n */\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport fs from 'fs-extra';\nimport { z } from 'zod';\nimport { SearchEngine, searchIndexExists, type SearchMode } from './search-engine.js';\nimport { readConfig } from './config.js';\nimport { readIndex } from './indexer.js';\nimport * as paths from '../utils/paths.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface McpServerOptions {\n projectRoot: string;\n}\n\n// =============================================================================\n// MCP Server Factory\n// =============================================================================\n\n/**\n * Create and configure the nocaap MCP server\n */\nexport async function createMcpServer(options: McpServerOptions): Promise<McpServer> {\n const { projectRoot } = options;\n const contextDir = paths.getContextDir(projectRoot);\n\n // Initialize search engine\n const searchEngine = new SearchEngine();\n const hasIndex = await searchIndexExists(projectRoot);\n if (hasIndex) {\n await searchEngine.loadIndex(projectRoot);\n }\n\n // Create MCP server\n const server = new McpServer({\n name: 'nocaap',\n version: '1.0.0',\n });\n\n // ==========================================================================\n // Resources\n // ==========================================================================\n\n // INDEX.md resource - the AI-optimized context index\n server.registerResource(\n 'index',\n 'nocaap://index',\n {\n title: 'Context Index',\n description:\n 'Complete index of organizational knowledge with document summaries. ' +\n 'Includes team directory, product specs, engineering docs, and company strategy.',\n mimeType: 'text/markdown',\n },\n async (uri) => {\n const indexContent = await readIndex(projectRoot);\n return {\n contents: [{\n uri: uri.href,\n mimeType: 'text/markdown',\n text: indexContent ?? 'No INDEX.md found. Run `nocaap update` to generate.',\n }],\n };\n }\n );\n\n // Manifest resource - installed packages metadata\n server.registerResource(\n 'manifest',\n 'nocaap://manifest',\n {\n title: 'Package Manifest',\n description: 'Configuration showing installed knowledge packages and their sources.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const config = await readConfig(projectRoot);\n const manifest = {\n packages: config?.packages ?? [],\n searchIndexAvailable: hasIndex,\n packagesPath: paths.getPackagesDir(projectRoot),\n };\n return {\n contents: [{\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(manifest, null, 2),\n }],\n };\n }\n );\n\n // ==========================================================================\n // Tools\n // ==========================================================================\n\n // Search tool - supports fulltext, semantic, and hybrid modes\n server.registerTool(\n 'search',\n {\n title: 'Search Context',\n description:\n 'Search organizational knowledge including team directory, product documentation, ' +\n 'engineering guidelines, company strategy, and project context. ' +\n 'Use for questions about people, products, processes, or internal information. ' +\n 'Returns ranked results with snippets - use get_document for full content.',\n inputSchema: {\n query: z.string().describe('Search query'),\n mode: z.enum(['fulltext', 'semantic', 'hybrid']).optional()\n .describe('Search mode (default: fulltext, or hybrid if vector index exists)'),\n packages: z.array(z.string()).optional().describe('Filter to specific packages'),\n tags: z.array(z.string()).optional().describe('Filter by document tags'),\n limit: z.number().optional().describe('Maximum results (default: 10)'),\n },\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async ({ query, mode, packages, tags, limit }) => {\n if (!searchEngine.isInitialized()) {\n return {\n content: [{\n type: 'text',\n text: 'Search index not available. Run `nocaap index` to build it.',\n }],\n };\n }\n\n // Determine search mode - default to hybrid if vector search is available\n const searchMode: SearchMode = mode ?? (searchEngine.hasVectorSearch() ? 'hybrid' : 'fulltext');\n\n try {\n const results = await searchEngine.hybridSearch({\n query,\n mode: searchMode,\n packages,\n limit: limit ?? 10,\n });\n\n const formattedResults = results.map((r, i) => ({\n rank: i + 1,\n path: r.path,\n package: r.package,\n title: r.title,\n headings: r.headings,\n score: r.score,\n sources: r.sources,\n snippet: r.content.slice(0, 200) + (r.content.length > 200 ? '...' : ''),\n }));\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n mode: searchMode,\n vectorSearchAvailable: searchEngine.hasVectorSearch(),\n results: formattedResults,\n }, null, 2),\n }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: [{\n type: 'text',\n text: `Search error: ${message}`,\n }],\n };\n }\n }\n );\n\n // Get document tool - retrieve full document content\n server.registerTool(\n 'get_document',\n {\n title: 'Get Document',\n description:\n 'Retrieve full documentation by path (from search results). ' +\n 'Use after searching to get complete details about team members, products, ' +\n 'engineering decisions, or any organizational knowledge.',\n inputSchema: {\n path: z.string().describe('Relative path to document (from search results)'),\n },\n },\n async ({ path: docPath }) => {\n // Normalize and validate path\n const normalizedPath = paths.toUnix(docPath);\n const fullPath = paths.join(contextDir, normalizedPath);\n\n // Security check: ensure path is within context dir\n if (!paths.isWithin(contextDir, fullPath)) {\n return {\n content: [{\n type: 'text',\n text: `Error: Path is outside context directory`,\n }],\n };\n }\n\n if (!(await paths.exists(fullPath))) {\n return {\n content: [{\n type: 'text',\n text: `Document not found: ${docPath}`,\n }],\n };\n }\n\n const content = await fs.readFile(fullPath, 'utf-8');\n return {\n content: [{\n type: 'text',\n text: content,\n }],\n };\n }\n );\n\n // Get section tool - retrieve a specific section by heading\n server.registerTool(\n 'get_section',\n {\n title: 'Get Section',\n description:\n 'Retrieve a specific section from a document by heading. ' +\n 'Useful for extracting targeted information like \"Key Accomplishments\" or ' +\n '\"Technical Architecture\" without loading the entire document.',\n inputSchema: {\n path: z.string().describe('Relative path to document'),\n heading: z.string().describe('The heading text to find'),\n },\n },\n async ({ path: docPath, heading }) => {\n const normalizedPath = paths.toUnix(docPath);\n const fullPath = paths.join(contextDir, normalizedPath);\n\n if (!paths.isWithin(contextDir, fullPath)) {\n return {\n content: [{\n type: 'text',\n text: `Error: Path is outside context directory`,\n }],\n };\n }\n\n if (!(await paths.exists(fullPath))) {\n return {\n content: [{\n type: 'text',\n text: `Document not found: ${docPath}`,\n }],\n };\n }\n\n const content = await fs.readFile(fullPath, 'utf-8');\n const section = extractSection(content, heading);\n\n if (!section) {\n return {\n content: [{\n type: 'text',\n text: `Section not found: \"${heading}\"`,\n }],\n };\n }\n\n return {\n content: [{\n type: 'text',\n text: section,\n }],\n };\n }\n );\n\n // List contexts tool - list installed packages\n server.registerTool(\n 'list_contexts',\n {\n title: 'List Contexts',\n description:\n 'List available knowledge domains and packages. ' +\n 'Shows what organizational context is installed (team info, products, engineering docs, etc.). ' +\n 'Use to discover what information is available before searching.',\n inputSchema: {\n tags: z.array(z.string()).optional().describe('Filter by tags (not yet implemented)'),\n },\n },\n async () => {\n const config = await readConfig(projectRoot);\n\n if (!config || config.packages.length === 0) {\n return {\n content: [{\n type: 'text',\n text: 'No context packages installed.',\n }],\n };\n }\n\n const packages = config.packages.map((pkg) => ({\n alias: pkg.alias,\n source: pkg.source,\n path: pkg.path ?? '/',\n version: pkg.version ?? 'main',\n }));\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(packages, null, 2),\n }],\n };\n }\n );\n\n // Get overview tool - returns the full INDEX.md for context discovery\n server.registerTool(\n 'get_overview',\n {\n title: 'Get Context Overview',\n description:\n 'Get a structured overview of all available organizational knowledge. ' +\n 'Returns package names, document titles, and content summaries. ' +\n 'RECOMMENDED: Call this first to understand what context is available before searching.',\n inputSchema: {},\n },\n async () => {\n const indexContent = await readIndex(projectRoot);\n if (!indexContent) {\n return {\n content: [{\n type: 'text',\n text: 'No context index available. Run `nocaap index` to generate.',\n }],\n };\n }\n return {\n content: [{\n type: 'text',\n text: indexContent,\n }],\n };\n }\n );\n\n return server;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Extract a section from markdown content by heading\n */\nfunction extractSection(content: string, heading: string): string | null {\n const lines = content.split('\\n');\n const headingLower = heading.toLowerCase();\n\n let capturing = false;\n let captureLevel = 0;\n const sectionLines: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n\n if (headingMatch && headingMatch[1] && headingMatch[2]) {\n const level = headingMatch[1].length;\n const text = headingMatch[2].trim().toLowerCase();\n\n if (capturing) {\n // Stop if we hit a heading of same or higher level\n if (level <= captureLevel) {\n break;\n }\n } else if (text === headingLower) {\n // Start capturing from this heading\n capturing = true;\n captureLevel = level;\n }\n }\n\n if (capturing) {\n sectionLines.push(line);\n }\n }\n\n return sectionLines.length > 0 ? sectionLines.join('\\n') : null;\n}\n\n// =============================================================================\n// Server Runner\n// =============================================================================\n\n/**\n * Start the MCP server with stdio transport\n */\nexport async function startMcpServer(options: McpServerOptions): Promise<void> {\n const server = await createMcpServer(options);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"]}