nocaap 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +214 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2491 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +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/commands/config.ts","../src/utils/providers.ts","../src/core/github.ts","../src/commands/push.ts","../src/index.ts"],"names":["fs","CONFIG_FILE","os","message","path","confirm","checkbox","r"],"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, { type 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\nexport const ConfigSchema = z.object({\n registryUrl: z.string().url().optional(),\n packages: z.array(PackageEntrySchema),\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// 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>;\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\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 safeValidateConfig,\n safeValidateLockfile,\n} from '../schemas/index.js';\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 (auto-generated)';\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 CURSOR_RULES_CONTENT = `# nocaap Context\nThis project uses nocaap for organizational context.\nRead .context/INDEX.md for available documentation.\n`;\n\n/**\n * Add nocaap instruction to Cursor rules\n */\nexport async function updateCursorRules(projectRoot: string): Promise<boolean> {\n // Try .cursor/rules first (newer format), then .cursorrules\n const cursorDir = paths.join(projectRoot, '.cursor');\n const cursorRulesPath = paths.join(cursorDir, 'rules');\n const legacyCursorRulesPath = paths.join(projectRoot, '.cursorrules');\n\n try {\n // Check if already configured\n for (const rulePath of [cursorRulesPath, legacyCursorRulesPath]) {\n if (await paths.exists(rulePath)) {\n const content = await fs.readFile(rulePath, 'utf-8');\n if (content.includes('.context/INDEX.md')) {\n log.debug('Cursor rules already contain nocaap reference');\n return false;\n }\n }\n }\n\n // Prefer .cursor/rules directory format\n if (await paths.exists(cursorDir)) {\n if (await paths.exists(cursorRulesPath)) {\n const content = await fs.readFile(cursorRulesPath, 'utf-8');\n const newContent = content.endsWith('\\n') ? content : content + '\\n';\n await fs.writeFile(cursorRulesPath, `${newContent}\\n${CURSOR_RULES_CONTENT}`);\n } else {\n await fs.writeFile(cursorRulesPath, CURSOR_RULES_CONTENT);\n }\n log.debug('Updated .cursor/rules with nocaap reference');\n return true;\n }\n\n // Fall back to .cursorrules if .cursor/ doesn't exist\n if (await paths.exists(legacyCursorRulesPath)) {\n const content = await fs.readFile(legacyCursorRulesPath, 'utf-8');\n const newContent = content.endsWith('\\n') ? content : content + '\\n';\n await fs.writeFile(legacyCursorRulesPath, `${newContent}\\n${CURSOR_RULES_CONTENT}`);\n } else {\n await fs.writeFile(legacyCursorRulesPath, CURSOR_RULES_CONTENT);\n }\n log.debug('Updated .cursorrules with nocaap reference');\n return true;\n } catch (error) {\n log.debug(`Failed to update Cursor rules: ${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 * 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';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst NOCAAP_DIR = '.nocaap';\nconst CONFIG_FILE = 'config.json';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface GlobalConfig {\n /** Default registry URL for `nocaap setup` */\n defaultRegistry?: string;\n /** Last updated timestamp */\n updatedAt?: string;\n}\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 log.debug(`Read global config from ${configPath}`);\n return data as GlobalConfig;\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 * 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 packagesDir = paths.getPackagesDir(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 updateCursorRules,\n updateClaudeMd,\n} from '../core/config.js';\nimport {\n getDefaultRegistry,\n setDefaultRegistry,\n} from '../core/global-config.js';\nimport {\n fetchRegistryWithImports,\n findContextByName,\n} 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 const choices = accessibleContexts.map(({ context }) => ({\n name: formatContextChoice(context),\n value: context.name,\n checked: false,\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 existingConfig = (await readConfig(projectRoot)) ?? { packages: [] };\n existingConfig.registryUrl = registryUrl;\n await writeConfig(projectRoot, existingConfig);\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 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 IDE integrations\n if (successCount > 0) {\n log.newline();\n log.hr();\n log.newline();\n log.info('IDE Integration (optional)');\n log.newline();\n\n // Cursor integration\n const addCursor = await confirm({\n message: 'Add nocaap reference to Cursor rules?',\n default: true,\n });\n\n if (addCursor) {\n const updated = await updateCursorRules(projectRoot);\n if (updated) {\n log.success('Added nocaap reference to Cursor rules');\n } else {\n log.dim('Cursor rules already configured');\n }\n }\n\n // Claude integration\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 readLockfile,\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, LockEntry } 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 readConfig,\n removePackage as removePackageFromConfig,\n removeLockEntry,\n getPackage,\n} from '../core/config.js';\nimport { removePackage as removePackageDir, 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 global nocaap configuration\n */\nimport { log, style } from '../utils/logger.js';\nimport {\n getGlobalConfig,\n getGlobalConfigPath,\n getDefaultRegistry,\n setDefaultRegistry,\n clearDefaultRegistry,\n} from '../core/global-config.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type ConfigKey = 'registry';\n\nexport interface ConfigOptions {\n list?: boolean;\n clear?: boolean;\n}\n\n// =============================================================================\n// Command Implementation\n// =============================================================================\n\n/**\n * View or set global configuration\n *\n * Usage:\n * nocaap config registry - View current registry\n * nocaap config registry <url> - Set registry URL\n * nocaap config registry --clear - Clear registry URL\n * nocaap config --list - Show all config\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 && !value)) {\n await showAllConfig();\n return;\n }\n\n // Handle specific keys\n switch (key) {\n case 'registry':\n await handleRegistryConfig(value, options.clear);\n break;\n default:\n log.error(`Unknown config key: ${style.code(key ?? '')}`);\n log.newline();\n log.info('Available keys:');\n log.dim(' registry - Default registry URL for `nocaap setup`');\n break;\n }\n}\n\n// =============================================================================\n// Handlers\n// =============================================================================\n\n/**\n * Show all global config\n */\nasync function showAllConfig(): Promise<void> {\n const config = await getGlobalConfig();\n const configPath = getGlobalConfigPath();\n\n log.title('Global Configuration');\n log.dim(`Location: ${configPath}`);\n log.newline();\n\n if (Object.keys(config).length === 0 || !config.defaultRegistry) {\n log.info('No configuration set.');\n log.newline();\n log.dim(\"Set your organization's registry:\");\n log.dim(' nocaap config registry <url>');\n return;\n }\n\n if (config.defaultRegistry) {\n log.info(`${style.bold('registry')}: ${config.defaultRegistry}`);\n }\n\n if (config.updatedAt) {\n log.newline();\n log.dim(`Last updated: ${new Date(config.updatedAt).toLocaleString()}`);\n }\n}\n\n/**\n * Handle registry config (view/set/clear)\n */\nasync function handleRegistryConfig(\n value: string | undefined,\n clear?: boolean\n): Promise<void> {\n // Clear registry\n if (clear) {\n await clearDefaultRegistry();\n log.success('Default registry cleared.');\n return;\n }\n\n // Set registry\n if (value) {\n // Validate URL before setting\n try {\n new URL(value);\n } catch {\n throw new Error(\n `Invalid URL: ${value}\\n` +\n 'Please provide a valid URL, e.g.:\\n' +\n ' https://raw.githubusercontent.com/your-org/hub/main/nocaap-registry.json'\n );\n }\n\n await setDefaultRegistry(value);\n log.success('Default registry set!');\n log.newline();\n log.info(`Registry: ${style.url(value)}`);\n log.newline();\n log.dim('Now you can run `nocaap setup` without the --registry flag.');\n return;\n }\n\n // View registry\n const registry = await getDefaultRegistry();\n if (registry) {\n // Check if from env var\n const envVar = process.env.NOCAAP_DEFAULT_REGISTRY;\n\n log.info(`Default registry: ${style.url(registry)}`);\n\n if (envVar) {\n log.dim(' (from NOCAAP_DEFAULT_REGISTRY environment variable)');\n } else {\n log.dim(' (from global config)');\n }\n } else {\n log.info('No default registry configured.');\n log.newline();\n log.dim('Set one with:');\n log.dim(' nocaap config registry <url>');\n log.newline();\n log.dim('Example:');\n log.dim(\n ' nocaap config registry https://raw.githubusercontent.com/your-org/hub/main/nocaap-registry.json'\n );\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): 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/main...${branch}?expand=1`;\n\n case 'gitlab':\n // GitLab merge request creation URL\n return `https://gitlab.com/${owner}/${repo}/-/merge_requests/new?merge_request[source_branch]=${branch}`;\n\n case 'bitbucket':\n // Bitbucket PR creation URL\n return `https://bitbucket.org/${owner}/${repo}/pull-requests/new?source=${branch}`;\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, getPackage, getLockEntry } from '../core/config.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 // Step 1: Check for upstream divergence\n const checkSpinner = createSpinner('Checking upstream...').start();\n\n try {\n const defaultBranch = await getDefaultBranch(pkg.source);\n const remoteCommit = await getRemoteCommitHash(pkg.source, defaultBranch);\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 defaultBranch = await getDefaultBranch(pkg.source);\n const result = await cloneToTemp(pkg.source, defaultBranch);\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 defaultBranch = await getDefaultBranch(pkg.source);\n const manualUrl = buildNewPrUrl(repoInfo, branchName);\n\n const prResult = await createPr({\n repoDir: tempDir,\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n branch: branchName,\n baseBranch: defaultBranch,\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/index.ts\n * nocaap CLI entry point\n */\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 { generateIndexWithProgress } from './core/indexer.js';\nimport { log } from './utils/logger.js';\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('0.1.0');\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 global nocaap configuration')\n .option('-l, --list', 'Show all configuration')\n .option('--clear', 'Clear the specified config key')\n .action(async (key, value, options) => {\n try {\n await configCommand(key, value, {\n list: options.list,\n clear: options.clear,\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// Generate Command\n// =============================================================================\n\nprogram\n .command('generate')\n .alias('index')\n .description('Regenerate INDEX.md without updating packages')\n .action(async () => {\n try {\n const projectRoot = process.cwd();\n await generateIndexWithProgress(projectRoot);\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// Parse and Execute\n// =============================================================================\n\nprogram.parse();\n"]}
|