mindlink 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +6 -6
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/utils/version.ts","../src/commands/init.ts","../src/utils/paths.ts","../src/utils/banner.ts","../src/utils/agents.ts","../src/utils/registry.ts","../src/utils/content.ts","../src/commands/status.ts","../src/utils/parser.ts","../src/commands/log.ts","../src/commands/clear.ts","../src/commands/reset.ts","../src/commands/config.ts","../src/commands/sync.ts","../src/commands/update.ts","../src/commands/summary.ts","../src/commands/uninstall.ts","../src/commands/export.ts","../src/commands/import.ts","../src/commands/doctor.ts","../src/commands/version.ts","../src/commands/diff.ts","../src/commands/verify.ts","../src/commands/profile.ts","../src/commands/prune.ts","../src/commands/mcp.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { VERSION } from './utils/version.js';\nimport { initCommand } from './commands/init.js';\nimport { statusCommand } from './commands/status.js';\nimport { logCommand } from './commands/log.js';\nimport { clearCommand } from './commands/clear.js';\nimport { resetCommand } from './commands/reset.js';\nimport { configCommand } from './commands/config.js';\nimport { syncCommand } from './commands/sync.js';\nimport { updateCommand } from './commands/update.js';\nimport { summaryCommand } from './commands/summary.js';\nimport { uninstallCommand } from './commands/uninstall.js';\nimport { exportCommand } from './commands/export.js';\nimport { importCommand } from './commands/import.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { versionCommand } from './commands/version.js';\nimport { diffCommand } from './commands/diff.js';\nimport { verifyCommand } from './commands/verify.js';\nimport { profileCommand } from './commands/profile.js';\nimport { pruneCommand } from './commands/prune.js';\nimport { mcpCommand } from './commands/mcp.js';\n\nconst program = new Command();\n\nprogram\n .name('mindlink')\n .description('Give your AI a brain.')\n .version(VERSION, '-v, --version');\n\nprogram.addCommand(initCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(logCommand);\nprogram.addCommand(clearCommand);\nprogram.addCommand(resetCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(syncCommand);\nprogram.addCommand(updateCommand);\nprogram.addCommand(summaryCommand);\nprogram.addCommand(uninstallCommand);\nprogram.addCommand(exportCommand);\nprogram.addCommand(importCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(versionCommand);\nprogram.addCommand(diffCommand);\nprogram.addCommand(verifyCommand);\nprogram.addCommand(profileCommand);\nprogram.addCommand(pruneCommand);\nprogram.addCommand(mcpCommand);\n\n// \"Did you mean?\" on unknown commands\nprogram.on('command:*', (operands: string[]) => {\n const unknown = operands[0];\n const known = ['init', 'status', 'log', 'clear', 'reset', 'config', 'sync', 'update', 'summary', 'uninstall', 'export', 'import', 'doctor', 'version', 'diff', 'verify', 'profile', 'prune', 'mcp'];\n\n // Simple Levenshtein-based suggestion\n function levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, (_, i) =>\n Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0))\n );\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] = a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n }\n\n const closest = known\n .map(cmd => ({ cmd, dist: levenshtein(unknown, cmd) }))\n .sort((a, b) => a.dist - b.dist)[0];\n\n console.log('');\n console.log(` ${chalk.red('✗')} Unknown command: ${chalk.bold(unknown)}`);\n if (closest && closest.dist <= 3) {\n console.log(` Did you mean ${chalk.cyan('mindlink ' + closest.cmd)}?`);\n }\n console.log(` Run ${chalk.cyan('mindlink --help')} to see all commands.`);\n console.log('');\n process.exit(1);\n});\n\nprogram.parse();\n","export const VERSION = '2.0.1';\n","import { Command } from 'commander';\nimport {\n intro,\n multiselect,\n select,\n spinner,\n note,\n cancel,\n isCancel,\n} from '@clack/prompts';\nimport chalk from 'chalk';\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n appendFileSync,\n readdirSync,\n} from 'fs';\nimport { execSync } from 'child_process';\nimport { join, resolve, dirname, basename } from 'path';\nimport { BRAIN_TEMPLATES_DIR, AGENT_TEMPLATES_DIR, HOOKS_TEMPLATES_DIR, BRAIN_DIR, GLOBAL_USER_PROFILE_PATH, GLOBAL_WINDSURF_MCP_PATH } from '../utils/paths.js';\nimport { printBanner } from '../utils/banner.js';\nimport { AGENTS } from '../utils/agents.js';\nimport { registerProject } from '../utils/registry.js';\nimport { sectionHasRealContent } from '../utils/content.js';\n\ninterface ProjectInfo {\n name: string;\n description: string;\n stack: string;\n recentActivity: string;\n topDirs: string;\n date: string;\n}\n\nfunction detectProjectInfo(projectPath: string): ProjectInfo {\n const date = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n\n let name = basename(projectPath);\n let description = '';\n let stack = '';\n let recentActivity = '';\n let topDirs = '';\n\n // Try package.json\n const pkgPath = join(projectPath, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n if (pkg.name) name = pkg.name;\n if (pkg.description) description = pkg.description;\n // Derive stack from package.json deps\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n const layers: string[] = ['Node.js'];\n if (deps['typescript'] || deps['ts-node'] || deps['tsup']) layers.push('TypeScript');\n if (deps['react'] || deps['next']) layers.push(deps['next'] ? 'Next.js' : 'React');\n if (deps['express'] || deps['fastify'] || deps['koa']) layers.push('Express/Fastify');\n if (deps['vite']) layers.push('Vite');\n stack = layers.join(' + ');\n } catch {}\n }\n\n // Detect stack from manifest files (if no package.json)\n if (!stack) {\n if (existsSync(join(projectPath, 'Cargo.toml'))) stack = 'Rust';\n else if (existsSync(join(projectPath, 'go.mod'))) stack = 'Go';\n else if (existsSync(join(projectPath, 'pyproject.toml')) || existsSync(join(projectPath, 'requirements.txt'))) stack = 'Python';\n else if (existsSync(join(projectPath, 'pom.xml'))) stack = 'Java (Maven)';\n else if (existsSync(join(projectPath, 'build.gradle')) || existsSync(join(projectPath, 'build.gradle.kts'))) stack = 'Kotlin/Java (Gradle)';\n else if (existsSync(join(projectPath, 'composer.json'))) stack = 'PHP';\n else if (existsSync(join(projectPath, 'Gemfile'))) stack = 'Ruby';\n }\n\n // Read README for description if not found yet\n if (!description) {\n const readmePath = join(projectPath, 'README.md');\n if (existsSync(readmePath)) {\n try {\n const lines = readFileSync(readmePath, 'utf8').split('\\n');\n // Find first non-heading, non-empty line as description\n for (const line of lines.slice(0, 30)) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('!') && !trimmed.startsWith('<') && trimmed.length > 10) {\n description = trimmed.replace(/\\*\\*/g, '').slice(0, 120);\n break;\n }\n }\n } catch {}\n }\n }\n\n // Get recent git activity\n try {\n const log = execSync('git log --oneline -5', { cwd: projectPath, encoding: 'utf8', stdio: ['pipe','pipe','pipe'] }).trim();\n if (log) {\n recentActivity = log.split('\\n').slice(0, 3).join(' · ');\n }\n } catch {}\n\n // Top-level dirs (skip hidden, node_modules, dist, etc.)\n const SKIP_DIRS = new Set(['.git', 'node_modules', 'dist', 'build', '.brain', 'binaries', '.cache', 'coverage', '.next', 'out']);\n try {\n const entries = readdirSync(projectPath, { withFileTypes: true });\n const dirs = entries\n .filter(e => e.isDirectory() && !SKIP_DIRS.has(e.name) && !e.name.startsWith('.'))\n .map(e => e.name)\n .slice(0, 6);\n if (dirs.length > 0) topDirs = dirs.join(', ');\n } catch {}\n\n return { name, description, stack, recentActivity, topDirs, date };\n}\n\n/** Returns true if MEMORY.md has at least one real (non-comment, non-heading, non-empty) line */\nfunction memoryHasRealContent(memoryPath: string): boolean {\n try {\n const lines = readFileSync(memoryPath, 'utf8').split('\\n');\n return lines.some(line => {\n const t = line.trim();\n return t.length > 0 && !t.startsWith('#') && !t.startsWith('<!--') && !t.startsWith('>') && !t.startsWith('|') && t !== '---';\n });\n } catch {\n return false;\n }\n}\n\n/** Inject global user profile into the ## User Profile section of MEMORY.md */\nfunction injectUserProfile(memoryContent: string, profileContent: string): string {\n // Strip the profile file header (# MindLink — Global User Profile + > lines)\n const profileLines = profileContent.split('\\n');\n const contentStart = profileLines.findIndex(l => {\n const t = l.trim();\n return t.length > 0 && !t.startsWith('#') && !t.startsWith('>') && !t.startsWith('<!--');\n });\n const profileBody = contentStart >= 0 ? profileLines.slice(contentStart).join('\\n').trim() : '';\n if (!profileBody) return memoryContent;\n\n // Find ## User Profile section and inject after its heading + comments\n const lines = memoryContent.split('\\n');\n let insertAt = -1;\n let inProfile = false;\n let profileHeadingLevel = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^(#{1,6})\\s+(.+)/);\n if (match) {\n const level = match[1].length;\n const title = match[2].replace(/<!--.*?-->/g, '').trim();\n if (title.toLowerCase() === 'user profile') {\n inProfile = true;\n profileHeadingLevel = level;\n continue;\n }\n if (inProfile && level <= profileHeadingLevel) {\n // Next section — insert before this line\n insertAt = i;\n break;\n }\n }\n if (inProfile && insertAt < 0 && i === lines.length - 1) {\n insertAt = lines.length;\n }\n }\n\n if (insertAt < 0) return memoryContent;\n\n // Insert profile body before the next section (or end of file)\n lines.splice(insertAt, 0, profileBody, '');\n return lines.join('\\n');\n}\n\nfunction buildMemoryMd(templateContent: string, info: ProjectInfo): string {\n let content = templateContent;\n\n // Inject project name + description under \"What this project is\"\n const whatLine = info.description\n ? `**${info.name}** — ${info.description}`\n : `**${info.name}**`;\n content = content.replace(\n /### What this project is\\n<!--[^]*?-->/,\n `### What this project is\\n${whatLine}\\n<!-- 2–3 lines: what it does, who it's for, what problem it solves -->`\n );\n\n // Inject detected stack under \"Stack\"\n if (info.stack) {\n content = content.replace(\n /### Stack\\n<!--[^]*?-->/,\n `### Stack\\n${info.stack}\\n<!-- Add layers: Frontend, Backend, Infra, etc. -->`\n );\n }\n\n // Inject top dirs and recent activity under \"Current focus\"\n const focusLines: string[] = [];\n if (info.topDirs) focusLines.push(`Directories: ${info.topDirs}`);\n if (info.recentActivity) focusLines.push(`Recent commits: ${info.recentActivity}`);\n const focusBlock = focusLines.length > 0\n ? focusLines.join('\\n') + `\\n<!-- Initialized ${info.date} — update to reflect the current active focus -->`\n : `<!-- Initialized ${info.date} — ask your AI to fill this in after your first session -->`;\n content = content.replace(\n /### Current focus\\n<!--[^]*?-->/,\n `### Current focus\\n${focusBlock}`\n );\n\n return content;\n}\n\nconst BRAIN_FILES = [\n { templateFile: 'MEMORY.md', label: '.brain/MEMORY.md', desc: 'permanent project facts' },\n { templateFile: 'SESSION.md', label: '.brain/SESSION.md', desc: 'current session state' },\n { templateFile: 'SHARED.md', label: '.brain/SHARED.md', desc: 'shared across sessions' },\n { templateFile: 'LOG.md', label: '.brain/LOG.md', desc: 'full session history' },\n];\n\nconst DEFAULT_MAX_LOG_ENTRIES = 50;\n\n\nexport const initCommand = new Command('init')\n .description('Set up memory for the current project')\n .option('-y, --yes', 'Skip all prompts, use defaults')\n .addHelpText('after', `\nExamples:\n mindlink init\n mindlink init --yes\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n printBanner();\n\n // --- Already initialized? ---\n if (existsSync(brainDir)) {\n const memoryPath = join(brainDir, 'MEMORY.md');\n const hasMemory = existsSync(memoryPath) && memoryHasRealContent(memoryPath);\n\n // Team onboarding mode: .brain/ exists with real content but no agent files for this user\n if (!opts.yes && hasMemory) {\n const hasAnyAgentFile = AGENTS.some(a => existsSync(join(projectPath, a.destFile)));\n if (!hasAnyAgentFile) {\n console.log('');\n console.log(` ${chalk.cyan('◉')} MindLink memory found in this project.`);\n console.log(` ${chalk.dim('MEMORY.md has content — this looks like a team project.')}`);\n console.log('');\n\n const action = await select({\n message: 'What would you like to do?',\n options: [\n { value: 'restore', label: 'Set up agent files', hint: 'recommended for new team members — writes CLAUDE.md, .cursorrules, etc.' },\n { value: 'reinit', label: 'Full re-init', hint: 'recreate everything, reconfigure settings' },\n { value: 'exit', label: 'Cancel', hint: '' },\n ],\n });\n\n if (isCancel(action) || action === 'exit') { process.exit(0); }\n\n if (action === 'restore') {\n // Just write agent instruction files — skip all config prompts\n const agentChoices = AGENTS.map(a => ({\n value: a.value,\n label: `${a.label.padEnd(18)} ${chalk.dim(a.hint)}`,\n hint: a.selected ? 'recommended' : undefined,\n }));\n const agentResult = await multiselect({\n message: 'Which AI agents do you use?',\n options: agentChoices,\n initialValues: AGENTS.filter(a => a.selected).map(a => a.value),\n required: false,\n });\n if (isCancel(agentResult)) { cancel('Cancelled.'); process.exit(0); }\n\n const toRestore = agentResult as string[];\n const restored: string[] = [];\n for (const agentValue of toRestore) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n restored.push(agent.destFile);\n }\n if (toRestore.includes('claude')) {\n const hookDest = join(projectPath, '.claude', 'settings.json');\n if (!existsSync(hookDest)) {\n mkdirSync(dirname(hookDest), { recursive: true });\n const settings = JSON.parse(readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n writeFileSync(hookDest, JSON.stringify(settings, null, 2));\n restored.push('.claude/settings.json');\n }\n const mcpJsonDest = join(projectPath, '.mcp.json');\n if (!existsSync(mcpJsonDest)) {\n const mcpJson = {\n mcpServers: {\n mindlink: { type: 'stdio', command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(mcpJsonDest, JSON.stringify(mcpJson, null, 2));\n restored.push('.mcp.json');\n }\n }\n\n // Write config.json if missing — needed so mindlink update tracks this project\n const configPath = join(brainDir, 'config.json');\n if (!existsSync(configPath)) {\n const config = {\n gitTracking: true,\n autoSync: true,\n agents: toRestore,\n maxLogEntries: DEFAULT_MAX_LOG_ENTRIES,\n };\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n restored.push('.brain/config.json');\n }\n\n // Register with project registry so update/sync can find it\n try { registerProject(projectPath); } catch {}\n\n console.log('');\n for (const f of restored) console.log(` ${chalk.green('✓')} ${f}`);\n console.log('');\n console.log(` ${chalk.green('✓')} Agent files ready. Start a new session — your AI is already briefed.`);\n console.log('');\n process.exit(0);\n }\n\n // action === 'reinit' — fall through to normal init flow below\n // Remove brainDir so the rest of init proceeds fresh\n // (we don't remove it — we'll overwrite files in place)\n } else {\n // Already fully initialized for this user\n if (opts.yes) {\n console.log(` ${chalk.red('✗')} Already initialized at this path.`);\n console.log(` Run ${chalk.cyan('mindlink config')} to change settings.`);\n console.log('');\n process.exit(1);\n }\n\n const action = await select({\n message: '.brain/ already exists at this path. What would you like to do?',\n options: [\n { value: 'config', label: 'Change settings', hint: 'mindlink config' },\n { value: 'status', label: 'View current status', hint: 'mindlink status' },\n { value: 'exit', label: 'Nothing — exit', hint: '' },\n ],\n });\n\n if (isCancel(action) || action === 'exit') { process.exit(0); }\n if (action === 'status') {\n try { execSync('mindlink status', { cwd: projectPath, stdio: 'inherit' }); } catch {}\n }\n if (action === 'config') {\n console.log(` Run ${chalk.cyan('mindlink config')} to change settings.`);\n }\n console.log('');\n process.exit(0);\n }\n } else if (opts.yes) {\n // --yes flag on already-initialized project: error out\n console.log(` ${chalk.red('✗')} Already initialized at this path.`);\n console.log(` Run ${chalk.cyan('mindlink config')} to change settings.`);\n console.log('');\n process.exit(1);\n } else if (!hasMemory) {\n // .brain/ exists but is empty — treat as re-init, fall through\n } else {\n const action = await select({\n message: '.brain/ already exists at this path. What would you like to do?',\n options: [\n { value: 'config', label: 'Change settings', hint: 'mindlink config' },\n { value: 'status', label: 'View current status', hint: 'mindlink status' },\n { value: 'exit', label: 'Nothing — exit', hint: '' },\n ],\n });\n if (isCancel(action) || action === 'exit') { process.exit(0); }\n if (action === 'status') {\n try { execSync('mindlink status', { cwd: projectPath, stdio: 'inherit' }); } catch {}\n }\n if (action === 'config') {\n console.log(` Run ${chalk.cyan('mindlink config')} to change settings.`);\n }\n console.log('');\n process.exit(0);\n }\n }\n\n intro(chalk.bold('Initializing memory for this project:'));\n console.log(` ${chalk.dim(projectPath)}`);\n console.log(` ${chalk.dim('This creates a .brain/ folder scoped to this project only.')}`);\n console.log(` ${chalk.dim('Run mindlink init once per project — never needs to be run again.')}`);\n console.log('');\n\n // Windows warning: hooks are bash scripts, won't run on Windows\n if (process.platform === 'win32') {\n console.log(` ${chalk.yellow('⚠')} ${chalk.bold('Windows detected')}`);\n console.log(` Claude Code hooks use bash and won't run on Windows.`);\n console.log(` Memory enforcement (Stop hook, session timestamps) will be disabled.`);\n console.log(` All other features work normally.`);\n console.log('');\n }\n\n // --- Prompt 1: Agent selection ---\n let selectedAgents: string[];\n\n if (opts.yes) {\n selectedAgents = AGENTS.filter(a => a.selected).map(a => a.value);\n } else {\n const agentChoices = AGENTS.map(a => ({\n value: a.value,\n label: `${a.label.padEnd(18)} ${chalk.dim(a.hint)}`,\n hint: a.selected ? 'recommended' : undefined,\n }));\n\n const agentResult = await multiselect({\n message: 'Which AI agents do you use?',\n options: agentChoices,\n initialValues: AGENTS.filter(a => a.selected).map(a => a.value),\n required: false,\n });\n\n if (isCancel(agentResult)) { cancel('Cancelled.'); process.exit(0); }\n selectedAgents = agentResult as string[];\n console.log(` ${chalk.dim('↩ Add or remove agents anytime: mindlink config → Agent instruction files')}`);\n console.log('');\n }\n\n // --- Prompt 2: Git tracking ---\n let gitTracking: boolean;\n\n if (opts.yes) {\n gitTracking = true;\n } else {\n console.log(` ${chalk.dim('.brain/ is your AI\\'s memory — MEMORY.md, SESSION.md, SHARED.md, LOG.md.')}`);\n console.log(` ${chalk.dim('Plain Markdown files. Commit them to share with your team, or keep them local.')}`);\n console.log('');\n const gitResult = await select({\n message: 'Should .brain/ be committed to git?',\n options: [\n { value: 'enable', label: 'Enable', hint: 'team shares the same AI memory' },\n { value: 'disable', label: 'Disable', hint: 'add to .gitignore — personal memory only' },\n ],\n });\n if (isCancel(gitResult)) { cancel('Cancelled.'); process.exit(0); }\n gitTracking = gitResult === 'enable';\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Git tracking')}`);\n console.log('');\n }\n\n // --- Prompt 3: Auto-sync ---\n let autoSync: boolean;\n\n if (opts.yes) {\n autoSync = true;\n } else {\n const syncResult = await select({\n message: 'Auto-sync between sessions?',\n options: [\n { value: 'enable', label: 'Enable', hint: 'watch for changes, sync automatically (recommended)' },\n { value: 'disable', label: 'Disable', hint: 'run mindlink sync manually when needed' },\n ],\n });\n if (isCancel(syncResult)) { cancel('Cancelled.'); process.exit(0); }\n autoSync = syncResult === 'enable';\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Auto-sync')}`);\n console.log('');\n }\n\n // --- Create files ---\n const s = spinner();\n s.start('Creating memory files...');\n\n const created: string[] = [];\n const errors: string[] = [];\n\n try {\n mkdirSync(brainDir, { recursive: true });\n try { registerProject(projectPath); } catch {}\n\n const projectInfo = detectProjectInfo(projectPath);\n\n // .brain/ template files\n for (const file of BRAIN_FILES) {\n const dest = join(brainDir, file.templateFile);\n const templateContent = readFileSync(join(BRAIN_TEMPLATES_DIR, file.templateFile), 'utf8');\n const content = file.templateFile === 'MEMORY.md'\n ? buildMemoryMd(templateContent, projectInfo)\n : templateContent;\n writeFileSync(dest, content);\n created.push(`${file.label.padEnd(32)} ${chalk.dim(file.desc)}`);\n }\n\n // Import global user profile into User Profile section if it exists\n const memoryDest = join(brainDir, 'MEMORY.md');\n if (existsSync(GLOBAL_USER_PROFILE_PATH)) {\n const profileContent = readFileSync(GLOBAL_USER_PROFILE_PATH, 'utf8');\n if (sectionHasRealContent(profileContent, 'MindLink — Global User Profile') ||\n profileContent.split('\\n').some(l => { const t = l.trim(); return t.length > 0 && !t.startsWith('#') && !t.startsWith('>') && !t.startsWith('<!--'); })) {\n const injected = injectUserProfile(readFileSync(memoryDest, 'utf8'), profileContent);\n writeFileSync(memoryDest, injected);\n created.push(`User Profile imported from ~/.mindlink/USER.md`);\n }\n }\n\n // Agent instruction files\n for (const agentValue of selectedAgents) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n created.push(`${agent.destFile.padEnd(32)} ${chalk.dim(agent.label)}`);\n }\n\n // .claude/settings.json hook for Claude Code (hooks + permissions only)\n if (selectedAgents.includes('claude')) {\n const hookDest = join(projectPath, '.claude', 'settings.json');\n if (!existsSync(hookDest)) {\n mkdirSync(dirname(hookDest), { recursive: true });\n const settings = JSON.parse(readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n writeFileSync(hookDest, JSON.stringify(settings, null, 2));\n created.push(`.claude/settings.json${' '.repeat(14)} ${chalk.dim('Claude Code hooks')}`);\n }\n // .mcp.json — Claude Code CLI reads MCP servers from here (not settings.json)\n const mcpJsonDest = join(projectPath, '.mcp.json');\n if (!existsSync(mcpJsonDest)) {\n const mcpJson = {\n mcpServers: {\n mindlink: { type: 'stdio', command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(mcpJsonDest, JSON.stringify(mcpJson, null, 2));\n created.push(`.mcp.json${' '.repeat(24)} ${chalk.dim('Claude Code MCP server')}`);\n }\n }\n\n // Cursor: .cursor/mcp.json (project-level MCP config)\n if (selectedAgents.includes('cursor')) {\n const cursorMcpDest = join(projectPath, '.cursor', 'mcp.json');\n if (!existsSync(cursorMcpDest)) {\n mkdirSync(join(projectPath, '.cursor'), { recursive: true });\n const cursorMcp = { mcpServers: { mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(cursorMcpDest, JSON.stringify(cursorMcp, null, 2));\n created.push(`.cursor/mcp.json${' '.repeat(20)} ${chalk.dim('Cursor MCP server')}`);\n }\n }\n\n // Continue.dev: .continue/mcpServers/mindlink.json (project-level MCP config)\n if (selectedAgents.includes('continue')) {\n const continueMcpDest = join(projectPath, '.continue', 'mcpServers', 'mindlink.json');\n if (!existsSync(continueMcpDest)) {\n mkdirSync(join(projectPath, '.continue', 'mcpServers'), { recursive: true });\n const continueMcp = { mcpServers: { mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(continueMcpDest, JSON.stringify(continueMcp, null, 2));\n created.push(`.continue/mcpServers/mindlink.json ${chalk.dim('Continue MCP server')}`);\n }\n }\n\n // GitHub Copilot: .vscode/mcp.json (project-level MCP config)\n if (selectedAgents.includes('copilot')) {\n const copilotMcpDest = join(projectPath, '.vscode', 'mcp.json');\n if (!existsSync(copilotMcpDest)) {\n mkdirSync(join(projectPath, '.vscode'), { recursive: true });\n const copilotMcp = { mcpServers: { mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(copilotMcpDest, JSON.stringify(copilotMcp, null, 2));\n created.push(`.vscode/mcp.json${' '.repeat(19)} ${chalk.dim('GitHub Copilot MCP server')}`);\n }\n }\n\n // Kiro: .kiro/settings/mcp.json (project-level MCP config, separate from steering file)\n if (selectedAgents.includes('kiro')) {\n const kiroMcpDest = join(projectPath, '.kiro', 'settings', 'mcp.json');\n if (!existsSync(kiroMcpDest)) {\n mkdirSync(join(projectPath, '.kiro', 'settings'), { recursive: true });\n const kiroMcp = { mcpServers: { mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(kiroMcpDest, JSON.stringify(kiroMcp, null, 2));\n created.push(`.kiro/settings/mcp.json${' '.repeat(13)} ${chalk.dim('Kiro MCP server')}`);\n }\n }\n\n // Windsurf: ~/.codeium/windsurf/mcp_config.json (global config — merge, no project path)\n // Windsurf only supports global MCP config; project resolution uses cwd walk-up at runtime.\n if (selectedAgents.includes('windsurf')) {\n try {\n mkdirSync(dirname(GLOBAL_WINDSURF_MCP_PATH), { recursive: true });\n let existingWindsurf: Record<string, unknown> = {};\n if (existsSync(GLOBAL_WINDSURF_MCP_PATH)) {\n try { existingWindsurf = JSON.parse(readFileSync(GLOBAL_WINDSURF_MCP_PATH, 'utf8')); } catch {}\n }\n const mergedWindsurf = {\n ...existingWindsurf,\n mcpServers: {\n ...(typeof existingWindsurf.mcpServers === 'object' && existingWindsurf.mcpServers !== null\n ? existingWindsurf.mcpServers as Record<string, unknown>\n : {}),\n mindlink: { command: 'mindlink', args: ['mcp'] },\n },\n };\n writeFileSync(GLOBAL_WINDSURF_MCP_PATH, JSON.stringify(mergedWindsurf, null, 2));\n created.push(`~/.codeium/windsurf/mcp_config.json ${chalk.dim('Windsurf MCP server (global)')}`);\n } catch {}\n }\n\n // .gitignore\n if (!gitTracking) {\n const gitignorePath = join(projectPath, '.gitignore');\n const entry = '\\n# MindLink memory (personal — not shared with team)\\n.brain/\\n';\n if (existsSync(gitignorePath)) {\n const current = readFileSync(gitignorePath, 'utf8');\n if (!current.includes('.brain/')) appendFileSync(gitignorePath, entry);\n } else {\n writeFileSync(gitignorePath, entry.trim() + '\\n');\n }\n created.push(`.gitignore${' '.repeat(23)} ${chalk.dim('.brain/ excluded')}`);\n }\n\n // Save config (includes maxLogEntries for log rotation)\n const config = {\n gitTracking,\n autoSync,\n agents: selectedAgents,\n maxLogEntries: DEFAULT_MAX_LOG_ENTRIES,\n };\n writeFileSync(join(brainDir, 'config.json'), JSON.stringify(config, null, 2));\n\n } catch (err: unknown) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n\n s.stop('Done.');\n console.log('');\n\n for (const line of created) {\n console.log(` ${chalk.green('✓')} ${line}`);\n }\n if (errors.length > 0) {\n console.log('');\n for (const err of errors) console.log(` ${chalk.red('✗')} ${err}`);\n }\n\n // Cline hint — MCP config can't be auto-written (VS Code internal storage)\n if (selectedAgents.includes('cline')) {\n console.log(` ${chalk.yellow('→')} Cline: add the MCP server manually in Cline's settings UI (MCP Servers tab)`);\n console.log(` ${chalk.dim('Command: mindlink Args: mcp Env: MINDLINK_PROJECT_PATH=' + projectPath)}`);\n console.log('');\n }\n\n // Hint about global profile if not yet set up\n if (!existsSync(GLOBAL_USER_PROFILE_PATH)) {\n console.log(` ${chalk.dim('→')} Run ${chalk.cyan('mindlink profile')} to set up a global user profile — imported into every new project automatically.`);\n console.log('');\n }\n\n note(\n `Your AI finally has a brain.\\n\\nEvery new session wakes up knowing the project, past decisions,\\ncurrent task, and what other sessions have shared. No more\\nre-explaining from scratch. No more goldfish moments.\\n\\nLike any good brain, it remembers what matters and quietly\\nlets go of the old stuff — that's what MEMORY.md is for:\\npromote anything important there and it stays forever.\\n\\nStart a new AI session — it'll hit the ground running.\\n\\nRun ${chalk.cyan('mindlink help')} to see all commands.`,\n '◉ MindLink active'\n );\n console.log('');\n });\n","import { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { homedir } from 'os';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Root of dist/ — templates live at dist/templates/\nexport const TEMPLATES_DIR = join(__dirname, 'templates');\n\nexport const BRAIN_TEMPLATES_DIR = join(TEMPLATES_DIR, 'brain');\nexport const AGENT_TEMPLATES_DIR = join(TEMPLATES_DIR, 'agents');\nexport const HOOKS_TEMPLATES_DIR = join(TEMPLATES_DIR, 'hooks');\n\nexport const BRAIN_DIR = '.brain';\n\n// Global MindLink directory — cross-project user profile lives here\nexport const GLOBAL_MINDLINK_DIR = join(homedir(), '.mindlink');\nexport const GLOBAL_USER_PROFILE_PATH = join(GLOBAL_MINDLINK_DIR, 'USER.md');\n\n// Windsurf global MCP config (Windsurf only supports global, not project-level)\nexport const GLOBAL_WINDSURF_MCP_PATH = join(homedir(), '.codeium', 'windsurf', 'mcp_config.json');\n","import chalk from 'chalk';\n\nexport function printBanner(): void {\n console.log('');\n console.log(chalk.dim(' ≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋'));\n console.log(` ${chalk.cyan('◉')} ${chalk.bold('M I N D L I N K')}`);\n console.log(chalk.dim(' ≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋'));\n console.log('');\n}\n","export interface AgentDef {\n value: string;\n label: string;\n hint: string;\n templateFile: string;\n destFile: string;\n selected: boolean;\n}\n\nexport const AGENTS: AgentDef[] = [\n { value: 'claude', label: 'Claude Code', hint: 'CLAUDE.md', templateFile: 'CLAUDE.md', destFile: 'CLAUDE.md', selected: true },\n { value: 'cursor', label: 'Cursor', hint: 'CURSOR.md', templateFile: 'CURSOR.md', destFile: 'CURSOR.md', selected: true },\n { value: 'codex', label: 'Codex / OpenAI', hint: 'AGENTS.md', templateFile: 'AGENTS.md', destFile: 'AGENTS.md', selected: true },\n { value: 'gemini', label: 'Gemini CLI', hint: 'GEMINI.md', templateFile: 'GEMINI.md', destFile: 'GEMINI.md', selected: true },\n { value: 'copilot', label: 'GitHub Copilot', hint: '.github/copilot-instructions.md', templateFile: 'copilot-instructions.md', destFile: '.github/copilot-instructions.md', selected: true },\n { value: 'windsurf', label: 'Windsurf', hint: '.windsurfrules', templateFile: '.windsurfrules', destFile: '.windsurfrules', selected: true },\n { value: 'cline', label: 'Cline', hint: '.clinerules', templateFile: '.clinerules', destFile: '.clinerules', selected: false },\n { value: 'aider', label: 'Aider', hint: 'CONVENTIONS.md', templateFile: 'CONVENTIONS.md', destFile: 'CONVENTIONS.md', selected: false },\n { value: 'zed', label: 'Zed', hint: '.rules', templateFile: '.rules', destFile: '.rules', selected: false },\n { value: 'kiro', label: 'Kiro', hint: '.kiro/steering/mindlink.md', templateFile: 'kiro-steering.md', destFile: '.kiro/steering/mindlink.md', selected: false },\n { value: 'continue', label: 'Continue.dev', hint: '.continue/rules/mindlink.md', templateFile: 'continue-rules.md', destFile: '.continue/rules/mindlink.md', selected: false },\n { value: 'trae', label: 'Trae', hint: '.trae/rules/mindlink.md', templateFile: 'trae-rules.md', destFile: '.trae/rules/mindlink.md', selected: false },\n];\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nconst REGISTRY_DIR = join(homedir(), '.mindlink');\nconst REGISTRY_PATH = join(REGISTRY_DIR, 'projects.json');\n\nfunction load(): string[] {\n try {\n return JSON.parse(readFileSync(REGISTRY_PATH, 'utf8'));\n } catch {\n return [];\n }\n}\n\nfunction save(paths: string[]): void {\n mkdirSync(REGISTRY_DIR, { recursive: true });\n writeFileSync(REGISTRY_PATH, JSON.stringify(paths, null, 2));\n}\n\nexport function registerProject(projectPath: string): void {\n const paths = load();\n if (!paths.includes(projectPath)) {\n paths.push(projectPath);\n save(paths);\n }\n}\n\nexport function getRegisteredProjects(): string[] {\n return load();\n}\n\nexport function pruneRegistry(isValid: (p: string) => boolean): void {\n const paths = load();\n const pruned = paths.filter(isValid);\n if (pruned.length !== paths.length) save(pruned);\n}\n","/**\n * Returns true if a markdown section (by heading name) has at least one real\n * (non-comment, non-heading, non-empty, non-horizontal-rule, non-table-divider) line.\n */\nexport function sectionHasRealContent(markdown: string, heading: string): boolean {\n const lines = markdown.split('\\n');\n let inSection = false;\n let headingLevel = 0;\n\n for (const line of lines) {\n const match = line.match(/^(#{1,6})\\s+(.+)/);\n\n if (match) {\n const level = match[1].length;\n const title = match[2].replace(/<!--.*?-->/g, '').trim();\n\n if (title.toLowerCase() === heading.toLowerCase()) {\n inSection = true;\n headingLevel = level;\n continue;\n }\n\n if (inSection && level <= headingLevel) {\n break;\n }\n }\n\n if (inSection) {\n const t = line.trim();\n if (\n t.length > 0 &&\n !t.startsWith('#') &&\n !t.startsWith('<!--') &&\n !t.startsWith('>') &&\n !t.startsWith('|') &&\n t !== '---'\n ) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Replace the body of a markdown section (identified by heading name) with new content.\n * The heading line itself is preserved. Returns the modified markdown.\n * If the section is not found, returns the original content unchanged.\n */\nexport function replaceSection(markdown: string, heading: string, newBody: string): string {\n const lines = markdown.split('\\n');\n let headingIdx = -1;\n let nextSectionIdx = lines.length;\n let headingLevel = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^(#{1,6})\\s+(.+)/);\n if (match) {\n const level = match[1].length;\n const title = match[2].replace(/<!--.*?-->/g, '').trim();\n if (headingIdx < 0 && title.toLowerCase() === heading.toLowerCase()) {\n headingIdx = i;\n headingLevel = level;\n } else if (headingIdx >= 0 && level <= headingLevel) {\n nextSectionIdx = i;\n break;\n }\n }\n }\n\n if (headingIdx < 0) return markdown;\n\n const before = lines.slice(0, headingIdx + 1);\n const after = lines.slice(nextSectionIdx);\n return [...before, '', newBody.trim(), '', ...after].join('\\n');\n}\n\n/**\n * Counts real (non-comment, non-heading, non-empty, non-horizontal-rule) lines in a markdown string.\n */\nexport function countRealLines(markdown: string): number {\n return markdown.split('\\n').filter(line => {\n const t = line.trim();\n return (\n t.length > 0 &&\n !t.startsWith('#') &&\n !t.startsWith('<!--') &&\n !t.startsWith('>') &&\n t !== '---'\n );\n }).length;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport { join, resolve } from 'path';\nimport {\n extractSection,\n extractBullets,\n countLogEntries,\n lastLogDate,\n countDecisions,\n relativeTime,\n} from '../utils/parser.js';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nexport const statusCommand = new Command('status')\n .description('Show last session summary and what\\'s next')\n .option('--json', 'Output as JSON')\n .addHelpText('after', `\nExamples:\n mindlink status\n mindlink status --json\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n // Not initialized?\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const sessionPath = join(brainDir, 'SESSION.md');\n const logPath = join(brainDir, 'LOG.md');\n const memoryPath = join(brainDir, 'MEMORY.md');\n\n const sessionMd = existsSync(sessionPath) ? readFileSync(sessionPath, 'utf8') : '';\n const logMd = existsSync(logPath) ? readFileSync(logPath, 'utf8') : '';\n const memoryMd = existsSync(memoryPath) ? readFileSync(memoryPath, 'utf8') : '';\n\n // Parse SESSION.md — strip comment placeholders\n const rawTask = extractSection(sessionMd, 'Current Task');\n const currentTask = rawTask.startsWith('<!--') ? '' : rawTask;\n const inProgress = extractBullets(extractSection(sessionMd, 'In Progress'));\n const decisions = extractBullets(extractSection(sessionMd, 'Decisions Made This Session'));\n const blockers = extractBullets(extractSection(sessionMd, 'Blockers'));\n const upNext = extractBullets(extractSection(sessionMd, 'Up Next'));\n\n // Parse LOG.md\n const sessionCount = countLogEntries(logMd);\n const lastSession = lastLogDate(logMd);\n\n // Parse MEMORY.md\n const decisionCount = countDecisions(memoryMd);\n\n // Last updated\n const lastUpdated = existsSync(sessionPath)\n ? relativeTime(statSync(sessionPath).mtime)\n : 'never';\n\n const isEmpty =\n !currentTask &&\n inProgress.length === 0 &&\n decisions.length === 0 &&\n blockers.length === 0 &&\n upNext.length === 0 &&\n sessionCount === 0;\n\n // ── JSON output ───────────────────────────────────────────────────────────\n if (opts.json) {\n console.log(JSON.stringify({\n currentTask,\n inProgress,\n decisions,\n blockers,\n upNext,\n stats: { sessionsLogged: sessionCount, decisionsMade: decisionCount, lastUpdated },\n }, null, 2));\n return;\n }\n\n // ── Human output ──────────────────────────────────────────────────────────\n console.log('');\n\n if (isEmpty) {\n console.log(` ${chalk.dim('No sessions logged yet.')}`);\n console.log(` Start an AI session — it will read ${chalk.cyan('.brain/')} automatically.`);\n console.log('');\n return;\n }\n\n // Last session date\n if (lastSession) {\n console.log(` ${chalk.bold('Last session')} ${chalk.dim('—')} ${lastSession}`);\n console.log('');\n }\n\n // Current task\n if (currentTask && !currentTask.startsWith('<!--')) {\n console.log(` ${chalk.bold('Current task')}`);\n console.log(` ${chalk.cyan('◎')} ${currentTask}`);\n console.log('');\n }\n\n // In progress\n if (inProgress.length > 0) {\n console.log(` ${chalk.bold('In progress')}`);\n for (const item of inProgress) {\n console.log(` ${chalk.yellow('●')} ${item}`);\n }\n console.log('');\n }\n\n // Decisions this session\n if (decisions.length > 0) {\n console.log(` ${chalk.bold('Decided this session')}`);\n for (const item of decisions) {\n console.log(` ${chalk.green('✓')} ${item}`);\n }\n console.log('');\n }\n\n // Blockers\n if (blockers.length > 0) {\n console.log(` ${chalk.bold('Blockers')}`);\n for (const item of blockers) {\n console.log(` ${chalk.red('✗')} ${item}`);\n }\n console.log('');\n }\n\n // Up next\n if (upNext.length > 0) {\n console.log(` ${chalk.bold('Up next')}`);\n for (const item of upNext) {\n console.log(` ${chalk.dim('→')} ${item}`);\n }\n console.log('');\n }\n\n // Stats\n console.log(` ${chalk.dim('─────────────────────────────')}`);\n console.log(` ${chalk.dim('Sessions logged')} ${String(sessionCount).padStart(4)}`);\n console.log(` ${chalk.dim('Decisions made')} ${String(decisionCount).padStart(4)}`);\n console.log(` ${chalk.dim('Last updated')} ${lastUpdated}`);\n console.log('');\n console.log(` Run ${chalk.cyan('mindlink log')} to see full history.`);\n console.log('');\n });\n","/**\n * Extract the content of a markdown section by heading name.\n * Returns lines under the heading until the next heading of same/higher level.\n */\nexport function extractSection(markdown: string, heading: string): string {\n const lines = markdown.split('\\n');\n let inSection = false;\n let headingLevel = 0;\n const result: string[] = [];\n\n for (const line of lines) {\n const match = line.match(/^(#{1,6})\\s+(.+)/);\n\n if (match) {\n const level = match[1].length;\n const title = match[2].trim();\n\n if (title.toLowerCase() === heading.toLowerCase()) {\n inSection = true;\n headingLevel = level;\n continue;\n }\n\n if (inSection && level <= headingLevel) {\n break;\n }\n }\n\n if (inSection) {\n result.push(line);\n }\n }\n\n return result.join('\\n').trim();\n}\n\n/**\n * Extract bullet list items from a markdown string.\n * Returns non-empty, non-comment lines that start with - or *.\n */\nexport function extractBullets(text: string): string[] {\n return text\n .split('\\n')\n .filter(l => /^[-*]\\s+/.test(l.trim()))\n .map(l => l.replace(/^[-*]\\s+/, '').trim())\n .filter(l => l.length > 0 && !l.startsWith('<!--'));\n}\n\n/**\n * Count how many top-level log entries exist in LOG.md.\n * Each entry starts with a ## heading.\n */\nexport function countLogEntries(markdown: string): number {\n return (markdown.match(/^##\\s+/gm) ?? []).length;\n}\n\n/**\n * Get the date of the last log entry in LOG.md.\n */\nexport function lastLogDate(markdown: string): string | null {\n const matches = markdown.match(/^##\\s+(.+)/m);\n return matches ? matches[1].trim() : null;\n}\n\n/**\n * Count how many rows exist in the Key Decisions table in MEMORY.md.\n * Skips the header and divider rows.\n */\nexport function countDecisions(markdown: string): number {\n const section = extractSection(markdown, 'Key Decisions');\n return section\n .split('\\n')\n .filter(l => l.startsWith('|') && !l.includes('---') && !l.toLowerCase().includes('decision'))\n .filter(l => {\n const cols = l.split('|').map(c => c.trim()).filter(Boolean);\n return cols.some(c => c.length > 0);\n }).length;\n}\n\n/**\n * Parse LOG.md into individual session entry objects.\n * Each entry starts with a ## heading.\n */\nexport interface LogEntry {\n heading: string;\n body: string;\n}\n\nexport function parseLogEntries(markdown: string): LogEntry[] {\n const blocks = markdown.split(/(?=^## )/m).filter(b => b.trimStart().startsWith('## '));\n return blocks.map(block => {\n const newline = block.indexOf('\\n');\n const heading = newline === -1 ? block.slice(3).trim() : block.slice(3, newline).trim();\n const body = newline === -1 ? '' : block.slice(newline + 1).trim();\n return { heading, body };\n });\n}\n\n/**\n * Get relative time string from a file's last modified date.\n */\nexport function relativeTime(date: Date): string {\n const diff = Date.now() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 2) return 'just now';\n if (minutes < 60) return `${minutes} minutes ago`;\n if (hours < 24) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n return `${days} day${days > 1 ? 's' : ''} ago`;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { parseLogEntries } from '../utils/parser.js';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nexport const logCommand = new Command('log')\n .description('Print session history')\n .option('--all', 'Show full history')\n .option('--limit <n>', 'Show last N sessions', '10')\n .option('--since <date>', 'Show sessions from a date (matched against heading text)')\n .option('--json', 'Output as JSON')\n .addHelpText('after', `\nExamples:\n mindlink log\n mindlink log --all\n mindlink log --limit 20\n mindlink log --since \"Apr 1\"\n mindlink log --json\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const logPath = join(brainDir, 'LOG.md');\n const logMd = existsSync(logPath) ? readFileSync(logPath, 'utf8') : '';\n\n let entries = parseLogEntries(logMd);\n\n if (entries.length === 0) {\n console.log('');\n console.log(` ${chalk.dim('No sessions logged yet.')}`);\n console.log(` ${chalk.dim('Your AI will append an entry here at the end of each session.')}`);\n console.log('');\n return;\n }\n\n // Filter by --since\n if (opts.since) {\n const since = opts.since.toLowerCase();\n entries = entries.filter(e => e.heading.toLowerCase().includes(since));\n }\n\n // Limit (unless --all)\n const limit = opts.all ? entries.length : parseInt(opts.limit, 10);\n const total = entries.length;\n const shown = entries.slice(0, limit);\n\n // ── JSON output ───────────────────────────────────────────────────────────\n if (opts.json) {\n console.log(JSON.stringify(shown, null, 2));\n return;\n }\n\n // ── Human output ──────────────────────────────────────────────────────────\n console.log('');\n\n if (!opts.all) {\n const rest = total - shown.length;\n const hint = rest > 0 ? ` ${chalk.dim(`${rest} more — run mindlink log --all to see everything`)}` : '';\n console.log(` ${chalk.dim(`Showing last ${shown.length} of ${total} session${total !== 1 ? 's' : ''}`)}${hint ? '' : ''}`);\n if (rest > 0) console.log(` ${chalk.dim(`${rest} more — run mindlink log --all to see everything`)}`);\n console.log('');\n }\n\n for (const entry of shown) {\n console.log(` ${chalk.bold('──')} ${chalk.cyan(entry.heading)} ${'─'.repeat(Math.max(0, 40 - entry.heading.length))}`);\n if (entry.body) {\n const lines = entry.body.split('\\n');\n for (const line of lines) {\n console.log(` ${chalk.dim(line)}`);\n }\n }\n console.log('');\n }\n\n // Check for archive files and show friendly notice\n const archiveFiles = readdirSync(brainDir).filter(f => /^LOG-\\d{4}-\\d{2}-\\d{2}\\.md$/.test(f)).sort();\n if (archiveFiles.length > 0) {\n console.log(` ${chalk.dim('─'.repeat(44))}`);\n console.log(` ${chalk.dim('Like all human brains, MindLink forgets old sessions')}`);\n console.log(` ${chalk.dim('that haven\\'t come up in a while — that\\'s by design.')}`);\n console.log(` ${chalk.dim(`Older entries archived to: ${archiveFiles.join(', ')}`)}`);\n console.log(` ${chalk.dim('Anything that truly matters belongs in MEMORY.md.')}`);\n console.log('');\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync, unlinkSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR, BRAIN_TEMPLATES_DIR } from '../utils/paths.js';\n\nexport const clearCommand = new Command('clear')\n .description('Reset SESSION.md for a fresh session start')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText('after', `\nWhat it does:\n Resets SESSION.md to a blank template — wipes current task, in-progress items,\n blockers, and up-next. MEMORY.md, LOG.md, and SHARED.md are untouched.\n\nNot what you need?\n mindlink reset — wipe ALL memory files back to blank (scorched earth)\n mindlink uninstall — remove MindLink from this project entirely\n\nExamples:\n mindlink clear\n mindlink clear --yes\n `)\n .action(async (_opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log('');\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n console.log('');\n\n try {\n const templatePath = join(BRAIN_TEMPLATES_DIR, 'SESSION.md');\n const destPath = join(brainDir, 'SESSION.md');\n writeFileSync(destPath, readFileSync(templatePath, 'utf8'));\n // Clean up ephemeral session timestamp used by Stop hook\n const tsDest = join(brainDir, '.session_ts');\n if (existsSync(tsDest)) unlinkSync(tsDest);\n } catch (err: unknown) {\n console.log(` ${chalk.red('✗')} ${err instanceof Error ? err.message : String(err)}`);\n console.log('');\n process.exit(1);\n }\n\n console.log(` ${chalk.green('✓')} SESSION.md cleared. Ready for a clean session.`);\n console.log(` ${chalk.dim('MEMORY.md, LOG.md, and SHARED.md are untouched.')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { confirm, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR, BRAIN_TEMPLATES_DIR } from '../utils/paths.js';\n\nconst BRAIN_FILES = ['MEMORY.md', 'SESSION.md', 'SHARED.md', 'LOG.md'];\n\nexport const resetCommand = new Command('reset')\n .description('Wipe all .brain/ memory files and start completely fresh')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText('after', `\nWhat it does:\n Resets MEMORY.md, SESSION.md, SHARED.md, and LOG.md to blank templates.\n Your settings (config.json) and agent instruction files are untouched.\n\nNot what you need?\n mindlink clear — reset SESSION.md only (lighter option)\n mindlink uninstall — remove MindLink from this project entirely\n\nExamples:\n mindlink reset\n mindlink reset --yes\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n console.log('');\n\n if (!opts.yes) {\n console.log(` ${chalk.yellow('!')} This will wipe ALL .brain/ memory files and start fresh.`);\n console.log(` ${chalk.dim('MEMORY.md, SESSION.md, SHARED.md, and LOG.md → reset to blank templates.')}`);\n console.log(` ${chalk.dim('Settings and agent instruction files are untouched.')}`);\n console.log('');\n console.log(` ${chalk.dim('Lighter option: mindlink clear — resets SESSION.md only')}`);\n console.log(` ${chalk.dim('Remove entirely: mindlink uninstall — removes MindLink from this project')}`);\n console.log('');\n\n const confirmed = await confirm({\n message: 'Reset everything? This cannot be undone (unless .brain/ is tracked by git).',\n });\n\n if (isCancel(confirmed) || !confirmed) {\n cancel('Cancelled.');\n process.exit(0);\n }\n console.log('');\n }\n\n const errors: string[] = [];\n\n for (const file of BRAIN_FILES) {\n try {\n const templatePath = join(BRAIN_TEMPLATES_DIR, file);\n const destPath = join(brainDir, file);\n if (existsSync(templatePath)) {\n writeFileSync(destPath, readFileSync(templatePath, 'utf8'));\n }\n } catch (err: unknown) {\n errors.push(`${file}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (errors.length > 0) {\n for (const err of errors) console.log(` ${chalk.red('✗')} ${err}`);\n console.log('');\n process.exit(1);\n }\n\n console.log(` ${chalk.green('✓')} .brain/ reset. All memory files are blank.`);\n console.log(` ${chalk.dim('Your AI will wake up with no memory of past sessions.')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { select, multiselect, text, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n appendFileSync,\n mkdirSync,\n unlinkSync,\n} from 'fs';\nimport { join, resolve, dirname } from 'path';\nimport { BRAIN_DIR, AGENT_TEMPLATES_DIR, HOOKS_TEMPLATES_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\n\ninterface BrainConfig {\n gitTracking: boolean;\n autoSync: boolean;\n agents: string[];\n maxLogEntries: number;\n}\n\nfunction readConfig(brainDir: string): BrainConfig {\n return JSON.parse(readFileSync(join(brainDir, 'config.json'), 'utf8'));\n}\n\nfunction saveConfig(brainDir: string, config: BrainConfig): void {\n writeFileSync(join(brainDir, 'config.json'), JSON.stringify(config, null, 2));\n}\n\nfunction enableGitTracking(projectPath: string): void {\n const gitignorePath = join(projectPath, '.gitignore');\n if (!existsSync(gitignorePath)) return;\n const content = readFileSync(gitignorePath, 'utf8');\n // Remove the mindlink .brain/ block\n const cleaned = content\n .replace(/\\n# MindLink memory[^\\n]*\\n\\.brain\\/\\n?/g, '')\n .replace(/\\n?\\.brain\\/\\n?/g, '\\n');\n writeFileSync(gitignorePath, cleaned.trimEnd() + '\\n');\n}\n\nfunction disableGitTracking(projectPath: string): void {\n const gitignorePath = join(projectPath, '.gitignore');\n const entry = '\\n# MindLink memory (personal — not shared with team)\\n.brain/\\n';\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf8');\n if (!content.includes('.brain/')) appendFileSync(gitignorePath, entry);\n } else {\n writeFileSync(gitignorePath, entry.trim() + '\\n');\n }\n}\n\nfunction addAgentFile(projectPath: string, agentValue: string): string | null {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) return null;\n const destPath = join(projectPath, agent.destFile);\n if (existsSync(destPath)) return null; // already there\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n return agent.destFile;\n}\n\nfunction removeAgentFile(projectPath: string, agentValue: string): string | null {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) return null;\n const destPath = join(projectPath, agent.destFile);\n if (!existsSync(destPath)) return null;\n unlinkSync(destPath);\n return agent.destFile;\n}\n\nfunction addClaudeHook(projectPath: string): boolean {\n const hookDest = join(projectPath, '.claude', 'settings.json');\n if (existsSync(hookDest)) return false;\n mkdirSync(dirname(hookDest), { recursive: true });\n writeFileSync(hookDest, readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n return true;\n}\n\nexport const configCommand = new Command('config')\n .description('Change settings for the current project')\n .addHelpText('after', `\nExamples:\n mindlink config\n `)\n .action(async () => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n // Non-TTY: just print current settings and exit\n if (!process.stdin.isTTY) {\n const cfg = readConfig(brainDir);\n const agentLabels = cfg.agents\n .map((v: string) => AGENTS.find(a => a.value === v)?.hint ?? v)\n .join(', ');\n console.log(JSON.stringify({ ...cfg, agentFiles: agentLabels }, null, 2));\n return;\n }\n\n let config = readConfig(brainDir);\n\n // ── Main menu loop ────────────────────────────────────────────────────────\n while (true) {\n console.log('');\n console.log(` ${chalk.bold('Current settings')} ${chalk.dim('·')} ${chalk.dim(projectPath)}`);\n console.log('');\n console.log(` Git tracking : ${config.gitTracking ? chalk.green('enabled') : chalk.dim('disabled')} ${chalk.dim(config.gitTracking ? '(team shares memory)' : '(.brain/ excluded from git)')}`);\n console.log(` Auto-sync : ${config.autoSync ? chalk.green('enabled') : chalk.dim('disabled')} ${chalk.dim(config.autoSync ? '(watch mode)' : '(run mindlink sync manually)')}`);\n console.log(` Max log entries: ${chalk.dim(String(config.maxLogEntries))} ${chalk.dim('(archive rotation threshold)')}`);\n\n const agentLabels = config.agents\n .map(v => AGENTS.find(a => a.value === v)?.hint ?? v)\n .join(', ');\n console.log(` Agent files : ${chalk.dim(agentLabels || 'none')}`);\n console.log('');\n\n const action = await select({\n message: 'What would you like to change?',\n options: [\n { value: 'git', label: 'Git tracking' },\n { value: 'sync', label: 'Auto-sync' },\n { value: 'memory', label: 'Memory settings', hint: 'log rotation threshold' },\n { value: 'agents', label: 'Agent instruction files' },\n { value: 'exit', label: 'Exit' },\n ],\n });\n\n if (isCancel(action) || action === 'exit') break;\n\n // ── Git tracking ───────────────────────────────────────────────────────\n if (action === 'git') {\n const choice = await select({\n message: 'Git tracking — should .brain/ be committed to git?',\n options: [\n { value: 'enable', label: 'Enable', hint: 'commit memory (share with your team)' },\n { value: 'disable', label: 'Disable', hint: 'add to .gitignore (keep memory personal)' },\n { value: 'back', label: '↩ Back' },\n ],\n initialValue: config.gitTracking ? 'enable' : 'disable',\n });\n\n if (isCancel(choice) || choice === 'back') continue;\n\n const newValue = choice === 'enable';\n if (newValue === config.gitTracking) {\n console.log(` ${chalk.dim('No change.')}`);\n continue;\n }\n\n if (newValue) {\n enableGitTracking(projectPath);\n console.log(` ${chalk.green('✓')} Git tracking enabled. .brain/ will be committed.`);\n } else {\n disableGitTracking(projectPath);\n console.log(` ${chalk.green('✓')} .gitignore updated. .brain/ will no longer be tracked.`);\n }\n\n config.gitTracking = newValue;\n saveConfig(brainDir, config);\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Git tracking')}`);\n }\n\n // ── Auto-sync ──────────────────────────────────────────────────────────\n if (action === 'sync') {\n const choice = await select({\n message: 'Auto-sync mode',\n options: [\n { value: 'enable', label: 'Enable', hint: 'watch for changes, sync automatically' },\n { value: 'disable', label: 'Disable', hint: 'run mindlink sync manually' },\n { value: 'back', label: '↩ Back' },\n ],\n initialValue: config.autoSync ? 'enable' : 'disable',\n });\n\n if (isCancel(choice) || choice === 'back') continue;\n\n const newValue = choice === 'enable';\n if (newValue === config.autoSync) {\n console.log(` ${chalk.dim('No change.')}`);\n continue;\n }\n\n config.autoSync = newValue;\n saveConfig(brainDir, config);\n console.log(` ${chalk.green('✓')} Auto-sync ${newValue ? 'enabled' : 'disabled'}.`);\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Auto-sync')}`);\n }\n\n // ── Memory settings ───────────────────────────────────────────────────\n if (action === 'memory') {\n console.log('');\n console.log(` ${chalk.dim('How many session entries to keep in LOG.md before archiving older ones.')}`);\n console.log(` ${chalk.dim('Archived entries move to LOG-YYYY-MM-DD.md — never deleted.')}`);\n console.log(` ${chalk.dim('Lower = lighter context for your AI. Higher = more history visible.')}`);\n console.log('');\n\n const input = await text({\n message: `Max log entries before archiving (current: ${config.maxLogEntries})`,\n placeholder: String(config.maxLogEntries),\n validate(value) {\n const n = parseInt(value, 10);\n if (isNaN(n) || n < 1) return 'Enter a number greater than 0';\n },\n });\n\n if (isCancel(input)) continue;\n\n const newValue = parseInt(input as string, 10);\n if (newValue === config.maxLogEntries) {\n console.log(` ${chalk.dim('No change.')}`);\n continue;\n }\n\n config.maxLogEntries = newValue;\n saveConfig(brainDir, config);\n console.log(` ${chalk.green('✓')} Max log entries set to ${newValue}.`);\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Memory settings')}`);\n }\n\n // ── Agent files ────────────────────────────────────────────────────────\n if (action === 'agents') {\n const agentChoices = AGENTS.map(a => ({\n value: a.value,\n label: `${a.label.padEnd(18)} ${chalk.dim(a.hint)}`,\n hint: a.selected ? 'recommended' : undefined,\n }));\n\n const result = await multiselect({\n message: 'Which AI agents do you use?',\n options: agentChoices,\n initialValues: config.agents,\n required: false,\n });\n\n if (isCancel(result)) continue;\n\n const newAgents = result as string[];\n const added = newAgents.filter(v => !config.agents.includes(v));\n const removed = config.agents.filter(v => !newAgents.includes(v));\n\n const addedFiles: string[] = [];\n const removedFiles: string[] = [];\n\n for (const v of added) {\n const f = addAgentFile(projectPath, v);\n if (f) addedFiles.push(f);\n if (v === 'claude') {\n if (addClaudeHook(projectPath)) addedFiles.push('.claude/settings.json');\n }\n }\n\n for (const v of removed) {\n const f = removeAgentFile(projectPath, v);\n if (f) removedFiles.push(f);\n }\n\n config.agents = newAgents;\n saveConfig(brainDir, config);\n\n if (addedFiles.length === 0 && removedFiles.length === 0) {\n console.log(` ${chalk.dim('No change.')}`);\n } else {\n for (const f of addedFiles) console.log(` ${chalk.green('✓')} ${f} added.`);\n for (const f of removedFiles) console.log(` ${chalk.dim('✗')} ${f} removed.`);\n }\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Agent instruction files')}`);\n }\n }\n\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport { join, resolve, basename } from 'path';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nfunction timestamp(): string {\n const d = new Date();\n const month = d.toLocaleString('default', { month: 'short' });\n const day = d.getDate();\n const time = d.toTimeString().slice(0, 5);\n return `${month} ${day} ${time}`;\n}\n\nfunction describeFile(filePath: string): string {\n if (!existsSync(filePath)) return chalk.dim('(missing)');\n const stat = statSync(filePath);\n const kb = (stat.size / 1024).toFixed(1);\n const content = readFileSync(filePath, 'utf8');\n const entries = (content.match(/^## /gm) ?? []).length;\n const name = basename(filePath);\n if (name === 'LOG.md') return entries > 0 ? `${entries} session${entries !== 1 ? 's' : ''}` : chalk.dim('empty');\n if (name === 'SHARED.md') {\n const lines = content.split('\\n').filter(l => l.trim() && !l.startsWith('#') && !l.startsWith('<!--') && !l.startsWith('>') && l !== '---').length;\n return lines > 0 ? `${lines} line${lines !== 1 ? 's' : ''}` : chalk.dim('empty');\n }\n if (name === 'SESSION.md') {\n const hasTask = content.includes('## Current Task') && !content.includes('<!-- ');\n return hasTask ? chalk.green('active') : chalk.dim('idle');\n }\n return `${kb} KB`;\n}\n\nexport const syncCommand = new Command('sync')\n .description('Sync shared context between sessions')\n .option('--once', 'Sync once and exit (default: watch mode)')\n .addHelpText('after', `\nExamples:\n mindlink sync\n mindlink sync --once\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const sharedPath = join(brainDir, 'SHARED.md');\n const sessionPath = join(brainDir, 'SESSION.md');\n const logPath = join(brainDir, 'LOG.md');\n const memoryPath = join(brainDir, 'MEMORY.md');\n\n // ── --once mode ───────────────────────────────────────────────────────────\n if (opts.once) {\n console.log('');\n console.log(` ${chalk.dim('Checking shared context...')}`);\n console.log('');\n\n const files = [\n { label: 'SHARED.md ', path: sharedPath },\n { label: 'SESSION.md ', path: sessionPath },\n { label: 'LOG.md ', path: logPath },\n { label: 'MEMORY.md ', path: memoryPath },\n ];\n\n for (const { label, path } of files) {\n const desc = describeFile(path);\n const mtime = existsSync(path) ? statSync(path).mtime : null;\n const age = mtime\n ? (() => {\n const diff = Date.now() - mtime.getTime();\n const min = Math.floor(diff / 60000);\n const hr = Math.floor(diff / 3600000);\n if (min < 2) return 'just now';\n if (min < 60) return `${min}m ago`;\n return `${hr}h ago`;\n })()\n : '';\n console.log(` ${chalk.dim(label)} ${desc} ${chalk.dim(age)}`);\n }\n\n console.log('');\n console.log(` ${chalk.green('✓')} All sessions share the same .brain/ folder.`);\n console.log(` ${chalk.dim('Any session that writes to SHARED.md is immediately visible to all others.')}`);\n console.log('');\n return;\n }\n\n // ── Watch mode ────────────────────────────────────────────────────────────\n // Dynamic import so chokidar is only loaded when needed\n const { watch } = await import('chokidar');\n\n console.log('');\n console.log(` ${chalk.dim('Watching for changes...')} ${chalk.dim('(Ctrl+C to stop)')}`);\n console.log('');\n\n const watcher = watch(brainDir, {\n ignoreInitial: true,\n ignored: /(^|[/\\\\])\\../,\n persistent: true,\n awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },\n });\n\n watcher.on('change', (filePath: string) => {\n const name = basename(filePath);\n const stat = statSync(filePath);\n const kb = (stat.size / 1024).toFixed(1);\n console.log(` ${chalk.dim('[' + timestamp() + ']')} ${chalk.cyan(name)} updated ${chalk.dim(kb + ' KB')} ${chalk.green('→ synced ✓')}`);\n });\n\n watcher.on('add', (filePath: string) => {\n const name = basename(filePath);\n console.log(` ${chalk.dim('[' + timestamp() + ']')} ${chalk.cyan(name)} created ${chalk.green('→ synced ✓')}`);\n });\n\n watcher.on('error', (err: unknown) => {\n console.log(` ${chalk.red('✗')} Watch error: ${err instanceof Error ? err.message : String(err)}`);\n });\n\n // Keep process alive\n process.on('SIGINT', () => {\n watcher.close();\n console.log('');\n console.log(` ${chalk.dim('Stopped.')}`);\n console.log('');\n process.exit(0);\n });\n });\n","import { Command } from 'commander';\nimport { select, isCancel, cancel, spinner } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { AGENT_TEMPLATES_DIR, HOOKS_TEMPLATES_DIR, BRAIN_TEMPLATES_DIR, BRAIN_DIR, GLOBAL_USER_PROFILE_PATH, GLOBAL_WINDSURF_MCP_PATH } from '../utils/paths.js';\nimport { replaceSection } from '../utils/content.js';\nimport { AGENTS } from '../utils/agents.js';\nimport { getRegisteredProjects, pruneRegistry } from '../utils/registry.js';\nimport { VERSION } from '../utils/version.js';\n\n// Brain files that must exist in every initialized project.\n// If a future version adds a new brain file, add it here — update will create it for existing projects.\nconst REQUIRED_BRAIN_FILES = ['MEMORY.md', 'SESSION.md', 'SHARED.md', 'LOG.md'];\n\nasync function latestVersion(): Promise<string | null> {\n try {\n const { default: https } = await import('https');\n return new Promise((resolve) => {\n const req = https.get(\n 'https://registry.npmjs.org/mindlink/latest',\n { headers: { 'User-Agent': 'mindlink-cli' } },\n (res) => {\n let data = '';\n res.on('data', (chunk: Buffer) => { data += chunk; });\n res.on('end', () => {\n try {\n const parsed = JSON.parse(data);\n resolve(parsed.version ?? null);\n } catch {\n resolve(null);\n }\n });\n }\n );\n req.on('error', () => resolve(null));\n req.setTimeout(8000, () => { req.destroy(); resolve(null); });\n });\n } catch {\n return null;\n }\n}\n\nfunction semverGt(a: string, b: string): boolean {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n if ((pa[i] ?? 0) > (pb[i] ?? 0)) return true;\n if ((pa[i] ?? 0) < (pb[i] ?? 0)) return false;\n }\n return false;\n}\n\nexport const updateCommand = new Command('update')\n .description('Update mindlink to the latest version')\n .addHelpText('after', `\nExamples:\n mindlink update\n `)\n .action(async () => {\n const current = VERSION;\n\n // Deferred exit code for non-TTY mode — set here, applied after agent refresh below\n let nonTtyExitCode: number | null = null;\n\n if (!process.stdin.isTTY) {\n // Non-TTY: check version and report JSON, then fall through to agent refresh below\n const latest = await latestVersion();\n if (!latest) {\n console.log(JSON.stringify({ current, latest: null, upToDate: null }));\n nonTtyExitCode = 1; // registry unreachable — still refresh agents\n } else {\n const upToDate = !semverGt(latest, current);\n console.log(JSON.stringify({ current, latest, upToDate }));\n if (!upToDate) nonTtyExitCode = 2; // exit 2 = update available\n }\n // fall through to refresh agent files\n } else {\n // TTY: interactive version check + optional install\n const s = spinner();\n s.start('Checking for updates...');\n\n const latest = await latestVersion();\n\n if (!latest) {\n s.stop('Could not reach npm registry.');\n console.log('');\n console.log(` ${chalk.red('✗')} Could not check for updates. Check your internet connection.`);\n console.log(` ${chalk.dim('Latest releases: github.com/404-not-found/mindlink/releases')}`);\n console.log('');\n process.exit(1);\n }\n\n s.stop('Done.');\n console.log('');\n console.log(` Current version : ${chalk.dim(current)}`);\n console.log(` Latest version : ${semverGt(latest, current) ? chalk.green(latest) : chalk.dim(latest)}`);\n console.log('');\n\n if (!semverGt(latest, current)) {\n console.log(` ${chalk.green('✓')} You're on the latest version (${current}).`);\n console.log('');\n } else {\n const action = await select({\n message: `Update to ${latest}?`,\n options: [\n { value: 'update', label: `Update to ${latest}` },\n { value: 'skip', label: 'Skip this version' },\n { value: 'cancel', label: 'Cancel' },\n ],\n });\n\n if (isCancel(action) || action === 'cancel' || action === 'skip') {\n if (action === 'skip') {\n console.log(` ${chalk.dim('Skipped. Run mindlink update again to install later.')}`);\n } else {\n cancel('Cancelled.');\n }\n console.log('');\n return;\n }\n\n // Install\n const s2 = spinner();\n s2.start(`Installing mindlink@${latest}...`);\n\n try {\n execSync(`npm install -g mindlink@${latest}`, { stdio: 'pipe' });\n s2.stop('Done.');\n console.log('');\n console.log(` ${chalk.green('✓')} Updated to ${latest}.`);\n console.log(` ${chalk.dim('See what\\'s new: github.com/404-not-found/mindlink/releases')}`);\n } catch (err: unknown) {\n s2.stop('Failed.');\n console.log('');\n console.log(` ${chalk.red('✗')} Update failed.`);\n console.log(` ${chalk.dim('Try: npm install -g mindlink@' + latest)}`);\n if (err instanceof Error && err.message.includes('EACCES')) {\n console.log(` ${chalk.dim('Permission error — try: sudo npm install -g mindlink@' + latest)}`);\n }\n process.exit(1);\n }\n }\n }\n\n // Always refresh agent instruction files across all registered projects\n // Also include cwd if it has .brain/ — catches projects not in the registry (e.g. initialized before registry existed)\n const cwd = process.cwd();\n const validProjects = getRegisteredProjects().filter(p => existsSync(join(p, BRAIN_DIR, 'config.json')));\n // Prune stale entries while we're here\n pruneRegistry(p => existsSync(join(p, BRAIN_DIR, 'config.json')));\n const cwdHasBrain = existsSync(join(cwd, BRAIN_DIR, 'config.json'));\n const projects = cwdHasBrain && !validProjects.includes(cwd)\n ? [cwd, ...validProjects]\n : validProjects;\n\n if (projects.length > 0) {\n console.log('');\n console.log(` Refreshing agent files in ${projects.length} project${projects.length > 1 ? 's' : ''}...`);\n console.log('');\n for (const projectPath of projects) {\n const configPath = join(projectPath, BRAIN_DIR, 'config.json');\n let config: { agents?: string[] } = {};\n try { config = JSON.parse(readFileSync(configPath, 'utf8')); } catch {}\n\n const agentValues: string[] = config.agents ?? AGENTS.filter(a => a.selected).map(a => a.value);\n const refreshed: string[] = [];\n\n // Ensure all required brain files exist (forward compat: creates new files added in future versions)\n for (const brainFile of REQUIRED_BRAIN_FILES) {\n const dest = join(projectPath, BRAIN_DIR, brainFile);\n if (!existsSync(dest)) {\n try {\n const template = join(BRAIN_TEMPLATES_DIR, brainFile);\n if (existsSync(template)) {\n writeFileSync(dest, readFileSync(template, 'utf8'));\n refreshed.push(`.brain/${brainFile}`);\n }\n } catch {}\n }\n }\n\n for (const agentValue of agentValues) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n try {\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n refreshed.push(agent.destFile);\n } catch {}\n }\n\n if (agentValues.includes('claude')) {\n // .claude/settings.json — hooks + permissions only (no mcpServers)\n const hookDest = join(projectPath, '.claude', 'settings.json');\n try {\n mkdirSync(join(projectPath, '.claude'), { recursive: true });\n const template = JSON.parse(readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n let existing: Record<string, unknown> = {};\n if (existsSync(hookDest)) {\n try { existing = JSON.parse(readFileSync(hookDest, 'utf8')); } catch {}\n }\n // Remove stale mcpServers from settings.json (Claude Code CLI uses .mcp.json now)\n const { mcpServers: _removed, ...existingWithoutMcp } = existing as Record<string, unknown> & { mcpServers?: unknown };\n void _removed;\n const merged = {\n ...existingWithoutMcp,\n hooks: template.hooks,\n permissions: template.permissions,\n };\n writeFileSync(hookDest, JSON.stringify(merged, null, 2));\n refreshed.push('.claude/settings.json');\n } catch {}\n // .mcp.json — Claude Code CLI reads MCP servers from here\n const mcpJsonDest = join(projectPath, '.mcp.json');\n try {\n let existing: Record<string, unknown> = {};\n if (existsSync(mcpJsonDest)) {\n try { existing = JSON.parse(readFileSync(mcpJsonDest, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(typeof existing.mcpServers === 'object' && existing.mcpServers !== null ? existing.mcpServers as Record<string, unknown> : {}),\n mindlink: { type: 'stdio', command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(mcpJsonDest, JSON.stringify(merged, null, 2));\n refreshed.push('.mcp.json');\n } catch {}\n }\n\n // Cursor: refresh .cursor/mcp.json (merge — preserve user's other servers)\n if (agentValues.includes('cursor')) {\n const cursorMcpDest = join(projectPath, '.cursor', 'mcp.json');\n try {\n mkdirSync(join(projectPath, '.cursor'), { recursive: true });\n let existing: Record<string, unknown> = {};\n if (existsSync(cursorMcpDest)) {\n try { existing = JSON.parse(readFileSync(cursorMcpDest, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(typeof existing.mcpServers === 'object' && existing.mcpServers !== null ? existing.mcpServers as Record<string, unknown> : {}),\n mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(cursorMcpDest, JSON.stringify(merged, null, 2));\n refreshed.push('.cursor/mcp.json');\n } catch {}\n }\n\n // Continue.dev: refresh .continue/mcpServers/mindlink.json\n if (agentValues.includes('continue')) {\n const continueMcpDest = join(projectPath, '.continue', 'mcpServers', 'mindlink.json');\n try {\n mkdirSync(join(projectPath, '.continue', 'mcpServers'), { recursive: true });\n const continueMcp = { mcpServers: { mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(continueMcpDest, JSON.stringify(continueMcp, null, 2));\n refreshed.push('.continue/mcpServers/mindlink.json');\n } catch {}\n }\n\n // GitHub Copilot: refresh .vscode/mcp.json (merge — preserve user's other servers)\n if (agentValues.includes('copilot')) {\n const copilotMcpDest = join(projectPath, '.vscode', 'mcp.json');\n try {\n mkdirSync(join(projectPath, '.vscode'), { recursive: true });\n let existing: Record<string, unknown> = {};\n if (existsSync(copilotMcpDest)) {\n try { existing = JSON.parse(readFileSync(copilotMcpDest, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(typeof existing.mcpServers === 'object' && existing.mcpServers !== null ? existing.mcpServers as Record<string, unknown> : {}),\n mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(copilotMcpDest, JSON.stringify(merged, null, 2));\n refreshed.push('.vscode/mcp.json');\n } catch {}\n }\n\n // Kiro: refresh .kiro/settings/mcp.json (merge — preserve user's other servers)\n if (agentValues.includes('kiro')) {\n const kiroMcpDest = join(projectPath, '.kiro', 'settings', 'mcp.json');\n try {\n mkdirSync(join(projectPath, '.kiro', 'settings'), { recursive: true });\n let existing: Record<string, unknown> = {};\n if (existsSync(kiroMcpDest)) {\n try { existing = JSON.parse(readFileSync(kiroMcpDest, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(typeof existing.mcpServers === 'object' && existing.mcpServers !== null ? existing.mcpServers as Record<string, unknown> : {}),\n mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(kiroMcpDest, JSON.stringify(merged, null, 2));\n refreshed.push('.kiro/settings/mcp.json');\n } catch {}\n }\n\n // Windsurf: refresh ~/.codeium/windsurf/mcp_config.json (global, no project path)\n if (agentValues.includes('windsurf')) {\n try {\n mkdirSync(dirname(GLOBAL_WINDSURF_MCP_PATH), { recursive: true });\n let existing: Record<string, unknown> = {};\n if (existsSync(GLOBAL_WINDSURF_MCP_PATH)) {\n try { existing = JSON.parse(readFileSync(GLOBAL_WINDSURF_MCP_PATH, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(typeof existing.mcpServers === 'object' && existing.mcpServers !== null ? existing.mcpServers as Record<string, unknown> : {}),\n mindlink: { command: 'mindlink', args: ['mcp'] },\n },\n };\n writeFileSync(GLOBAL_WINDSURF_MCP_PATH, JSON.stringify(merged, null, 2));\n refreshed.push('~/.codeium/windsurf/mcp_config.json');\n } catch {}\n }\n\n // Apply MEMORY.md migrations — non-destructively inject any new sections added in this version\n const memoryPath = join(projectPath, BRAIN_DIR, 'MEMORY.md');\n if (existsSync(memoryPath)) {\n try {\n let content = readFileSync(memoryPath, 'utf8');\n let memoryChanged = false;\n\n // Each migration: { marker: string to check for presence, inject: content to add, before: anchor string }\n // Applied in order — all are non-destructive (only run if marker is absent)\n const migrations: Array<{ marker: string; block: string; before: string }> = [\n {\n // v1.1.5: Add ## User Profile section\n marker: '## User Profile',\n block:\n `## User Profile <!-- READ EVERY SESSION — personal facts about the user -->\\n\\n` +\n `<!-- Job, company, level, years of experience, immigration status -->\\n` +\n `<!-- Age, health, physical details -->\\n` +\n `<!-- Family, relationships, major life events -->\\n` +\n `<!-- Long-term goals: career, financial, personal -->\\n` +\n `<!-- Strong opinions, values, preferences -->\\n` +\n `<!-- Update in place — do not append; consolidate when it grows -->\\n\\n\\n` +\n `---\\n\\n`,\n before: '## Important Context',\n },\n // Future migrations go here — same pattern:\n // { marker: '## New Section', block: '## New Section\\n\\n<!-- ... -->\\n\\n\\n---\\n\\n', before: '## Some Existing Section' },\n ];\n\n for (const m of migrations) {\n if (!content.includes(m.marker) && content.includes(m.before)) {\n content = content.replace(m.before, m.block + m.before);\n memoryChanged = true;\n }\n }\n\n if (memoryChanged) {\n writeFileSync(memoryPath, content);\n refreshed.push('.brain/MEMORY.md');\n }\n } catch {}\n }\n\n // Sync global user profile into User Profile section (if profile exists and has content)\n if (existsSync(GLOBAL_USER_PROFILE_PATH) && existsSync(memoryPath)) {\n try {\n const profileRaw = readFileSync(GLOBAL_USER_PROFILE_PATH, 'utf8');\n // Strip profile file header lines (# heading, > blockquotes, leading blank lines)\n const profileLines = profileRaw.split('\\n');\n const bodyStart = profileLines.findIndex(l => {\n const t = l.trim();\n return t.length > 0 && !t.startsWith('#') && !t.startsWith('>') && !t.startsWith('<!--');\n });\n const profileBody = bodyStart >= 0 ? profileLines.slice(bodyStart).join('\\n').trim() : '';\n if (profileBody) {\n const memContent = readFileSync(memoryPath, 'utf8');\n const updated = replaceSection(memContent, 'User Profile', profileBody);\n if (updated !== memContent) {\n writeFileSync(memoryPath, updated);\n if (!refreshed.includes('.brain/MEMORY.md')) refreshed.push('.brain/MEMORY.md (profile synced)');\n }\n }\n } catch {}\n }\n\n console.log(` ${chalk.bold(projectPath)}`);\n for (const f of refreshed) {\n console.log(` ${chalk.green('✓')} ${f}`);\n }\n }\n console.log('');\n console.log(` ${chalk.dim('All agent files are up to date.')}`);\n }\n\n console.log('');\n\n // Apply deferred exit code from non-TTY version check (after agent refresh ran)\n if (nonTtyExitCode !== null) process.exit(nonTtyExitCode);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport {\n extractSection,\n extractBullets,\n countLogEntries,\n lastLogDate,\n parseLogEntries,\n} from '../utils/parser.js';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nexport const summaryCommand = new Command('summary')\n .description('Print a full briefing of what your AI knows — great for sharing or reviewing context')\n .option('--json', 'Output as JSON')\n .addHelpText('after', `\nExamples:\n mindlink summary\n mindlink summary --json\n\nTip: your AI agent can run this itself — ask it to run \"mindlink summary\"\nto get a full briefing on the current project state.\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const memoryPath = join(brainDir, 'MEMORY.md');\n const sessionPath = join(brainDir, 'SESSION.md');\n const logPath = join(brainDir, 'LOG.md');\n const sharedPath = join(brainDir, 'SHARED.md');\n\n const memoryMd = existsSync(memoryPath) ? readFileSync(memoryPath, 'utf8') : '';\n const sessionMd = existsSync(sessionPath) ? readFileSync(sessionPath, 'utf8') : '';\n const logMd = existsSync(logPath) ? readFileSync(logPath, 'utf8') : '';\n const sharedMd = existsSync(sharedPath) ? readFileSync(sharedPath, 'utf8') : '';\n\n // Parse memory\n const projectOverview = extractSection(memoryMd, 'Project Overview') ||\n extractSection(memoryMd, 'Project Identity') ||\n extractSection(memoryMd, 'What Is This Project');\n const techStack = extractSection(memoryMd, 'Tech Stack') ||\n extractSection(memoryMd, 'Stack');\n const decisions = extractBullets(\n extractSection(memoryMd, 'Key Decisions') ||\n extractSection(memoryMd, 'Decisions')\n );\n\n // Parse session\n const rawTask = extractSection(sessionMd, 'Current Task');\n const task = rawTask.startsWith('<!--') ? '' : rawTask;\n const inProg = extractBullets(extractSection(sessionMd, 'In Progress'));\n const upNext = extractBullets(extractSection(sessionMd, 'Up Next'));\n const blockers = extractBullets(extractSection(sessionMd, 'Blockers'));\n\n // Parse log\n const sessionCount = countLogEntries(logMd);\n const lastDate = lastLogDate(logMd);\n const recentLogs = parseLogEntries(logMd).slice(0, 3);\n\n // Parse shared\n const sharedLines = sharedMd\n .split('\\n')\n .filter(l => l.trim() && !l.startsWith('#') && !l.startsWith('<!--') && !l.startsWith('>') && l !== '---')\n .slice(0, 10);\n\n // ── JSON ─────────────────────────────────────────────────────────────────\n if (opts.json) {\n console.log(JSON.stringify({\n project: { overview: projectOverview, techStack, decisions },\n session: { currentTask: task, inProgress: inProg, upNext, blockers },\n log: { totalSessions: sessionCount, lastSession: lastDate, recent: recentLogs },\n shared: sharedLines,\n }, null, 2));\n return;\n }\n\n // ── Human ─────────────────────────────────────────────────────────────────\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink Memory Summary')} ${chalk.dim('·')} ${chalk.dim(projectPath)}`);\n console.log('');\n\n // Project\n if (projectOverview) {\n console.log(` ${chalk.bold('Project')}`);\n for (const line of projectOverview.split('\\n').filter(Boolean)) {\n console.log(` ${chalk.dim(line)}`);\n }\n console.log('');\n }\n\n if (techStack) {\n console.log(` ${chalk.bold('Tech stack')}`);\n for (const line of techStack.split('\\n').filter(Boolean)) {\n console.log(` ${chalk.dim(line)}`);\n }\n console.log('');\n }\n\n if (decisions.length > 0) {\n console.log(` ${chalk.bold('Key decisions')}`);\n for (const d of decisions.slice(0, 5)) {\n console.log(` ${chalk.dim('·')} ${d}`);\n }\n if (decisions.length > 5) {\n console.log(` ${chalk.dim(` …and ${decisions.length - 5} more in MEMORY.md`)}`);\n }\n console.log('');\n }\n\n // Current session\n if (task || inProg.length > 0 || upNext.length > 0) {\n console.log(` ${chalk.bold('Current session')}`);\n if (task) console.log(` ${chalk.cyan('◎')} ${task}`);\n for (const item of inProg) console.log(` ${chalk.yellow('●')} ${item}`);\n for (const item of blockers) console.log(` ${chalk.red('✗')} ${item}`);\n for (const item of upNext) console.log(` ${chalk.dim('→')} ${item}`);\n console.log('');\n }\n\n // Shared context\n if (sharedLines.length > 0) {\n console.log(` ${chalk.bold('Shared context')} ${chalk.dim('(from other sessions)')}`);\n for (const line of sharedLines) {\n console.log(` ${chalk.dim(line)}`);\n }\n console.log('');\n }\n\n // History\n if (recentLogs.length > 0) {\n console.log(` ${chalk.bold('Recent sessions')} ${chalk.dim(`(${sessionCount} total)`)}`);\n for (const entry of recentLogs) {\n console.log(` ${chalk.dim('──')} ${chalk.cyan(entry.heading)}`);\n if (entry.body) {\n const preview = entry.body.split('\\n').filter(Boolean)[0] ?? '';\n if (preview) console.log(` ${chalk.dim(preview.slice(0, 72))}`);\n }\n }\n console.log('');\n }\n\n if (!projectOverview && !task && sessionCount === 0 && sharedLines.length === 0) {\n console.log(` ${chalk.dim('Memory files are blank — your AI hasn\\'t written anything yet.')}`);\n console.log(` ${chalk.dim('Start a session and let it run — it will fill these in automatically.')}`);\n console.log('');\n }\n\n console.log(` ${chalk.dim('─────────────────────────────────────────────────')}`);\n console.log(` ${chalk.dim('Powered by MindLink — github.com/404-not-found/mindlink')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { select, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, rmSync, unlinkSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\n\nexport const uninstallCommand = new Command('uninstall')\n .description('Remove MindLink from the current project')\n .option('-y, --yes', 'Skip confirmation and remove all project files')\n .addHelpText('after', `\nWhat gets removed:\n - .brain/ folder (all memory files)\n - Agent instruction files (CLAUDE.md, CURSOR.md, etc.)\n - .claude/settings.json hook (if it was created by MindLink)\n\nWhat stays:\n - The mindlink CLI itself (run: npm uninstall -g mindlink)\n - Any files MindLink did not create\n\nNot what you need?\n mindlink clear — reset SESSION.md only (fresh session, keep everything else)\n mindlink reset — wipe memory back to blank (keep MindLink installed)\n\nExamples:\n mindlink uninstall\n mindlink uninstall --yes\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Nothing to uninstall here.`);\n console.log('');\n process.exit(1);\n }\n\n // Read config to know which agent files to remove\n let agents: string[] = [];\n try {\n const cfg = JSON.parse(readFileSync(join(brainDir, 'config.json'), 'utf8'));\n agents = cfg.agents ?? [];\n } catch {\n // config unreadable — use all agents as a safe default\n agents = AGENTS.map(a => a.value);\n }\n\n console.log('');\n\n if (!opts.yes) {\n console.log(` ${chalk.yellow('!')} This will remove MindLink from this project:`);\n console.log(` ${chalk.dim('· .brain/ (all memory files)')}`);\n for (const v of agents) {\n const agent = AGENTS.find(a => a.value === v);\n if (agent) console.log(` ${chalk.dim('· ' + agent.destFile)}`);\n }\n if (agents.includes('claude')) {\n console.log(` ${chalk.dim('· .claude/settings.json (hook)')}`);\n }\n console.log('');\n console.log(` ${chalk.dim('The mindlink CLI itself is NOT removed.')}`);\n console.log(` ${chalk.dim('To remove the CLI: npm uninstall -g mindlink')}`);\n console.log('');\n console.log(` ${chalk.dim('Lighter options:')}`);\n console.log(` ${chalk.dim(' mindlink clear — fresh session only (keeps all memory)')}`);\n console.log(` ${chalk.dim(' mindlink reset — wipe memory (keeps MindLink installed)')}`);\n console.log('');\n\n const action = await select({\n message: 'Remove MindLink from this project?',\n options: [\n { value: 'remove', label: 'Yes, remove everything listed above' },\n { value: 'cancel', label: 'Cancel' },\n ],\n });\n\n if (isCancel(action) || action === 'cancel') {\n cancel('Cancelled.');\n console.log('');\n return;\n }\n console.log('');\n }\n\n const removed: string[] = [];\n const errors: string[] = [];\n\n // Remove .brain/\n try {\n rmSync(brainDir, { recursive: true, force: true });\n removed.push('.brain/');\n } catch (err: unknown) {\n errors.push(`.brain/: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Remove agent instruction files\n for (const v of agents) {\n const agent = AGENTS.find(a => a.value === v);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n if (existsSync(destPath)) {\n try {\n unlinkSync(destPath);\n removed.push(agent.destFile);\n } catch (err: unknown) {\n errors.push(`${agent.destFile}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n\n // Remove .claude/settings.json (only if agent was claude)\n if (agents.includes('claude')) {\n const hookPath = join(projectPath, '.claude', 'settings.json');\n if (existsSync(hookPath)) {\n try {\n unlinkSync(hookPath);\n removed.push('.claude/settings.json');\n } catch {\n // non-fatal — user may have customised this file\n }\n }\n }\n\n for (const f of removed) console.log(` ${chalk.green('✓')} ${f} removed.`);\n for (const e of errors) console.log(` ${chalk.red('✗')} ${e}`);\n\n console.log('');\n console.log(` ${chalk.dim('MindLink removed from this project.')}`);\n console.log(` ${chalk.dim('To remove the CLI itself: npm uninstall -g mindlink')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { text, confirm, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readdirSync } from 'fs';\nimport { join, resolve, basename } from 'path';\nimport AdmZip from 'adm-zip';\nimport { BRAIN_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\n\nexport const exportCommand = new Command('export')\n .description('Export .brain/ memory to a shareable zip file')\n .option('--output <path>', 'Directory or full path to save the zip file')\n .option('--include-agents', 'Also include agent instruction files (CLAUDE.md, CURSOR.md, etc.)')\n .addHelpText('after', `\nWhat gets exported:\n - .brain/MEMORY.md — permanent project facts\n - .brain/SESSION.md — current session state\n - .brain/SHARED.md — shared context across sessions\n - .brain/LOG.md — full session history\n - .brain/config.json — settings (excluded by default; use --include-agents for agent files)\n\nUse cases:\n Onboard a new teammate — send them the zip; they run: mindlink import brain.zip\n Back up before reset — export first, then mindlink reset\n Share project context — hand off to a consultant without giving repo access\n\nExamples:\n mindlink export\n mindlink export --output ~/Desktop\n mindlink export --output ~/Desktop/my-app-brain.zip\n mindlink export --include-agents\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log('');\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n console.log('');\n\n // --- Determine output path ---\n const projectName = basename(projectPath);\n const date = new Date().toISOString().slice(0, 10);\n const defaultFilename = `${projectName}-brain-${date}.zip`;\n\n let outputPath: string;\n\n if (opts.output) {\n // If they gave a directory, append default filename\n const given = resolve(opts.output);\n if (existsSync(given) && !given.endsWith('.zip')) {\n outputPath = join(given, defaultFilename);\n } else {\n outputPath = given;\n }\n } else if (process.stdin.isTTY) {\n // Interactive: prompt for location\n const answer = await text({\n message: 'Where should the zip be saved?',\n placeholder: projectPath,\n initialValue: projectPath,\n\n });\n\n if (isCancel(answer)) { cancel('Cancelled.'); process.exit(0); }\n\n const dest = resolve(answer as string);\n // If the answer is a directory (or ends without .zip), append default filename\n if (!dest.endsWith('.zip')) {\n outputPath = join(dest, defaultFilename);\n } else {\n outputPath = dest;\n }\n } else {\n // Non-interactive: drop in cwd\n outputPath = join(projectPath, defaultFilename);\n }\n\n // --- Build zip ---\n const zip = new AdmZip();\n\n // Core .brain/ files\n const brainFiles = ['MEMORY.md', 'SESSION.md', 'SHARED.md', 'LOG.md'];\n const included: string[] = [];\n const skipped: string[] = [];\n\n for (const file of brainFiles) {\n const filePath = join(brainDir, file);\n if (existsSync(filePath)) {\n zip.addLocalFile(filePath, '.brain');\n included.push(`.brain/${file}`);\n } else {\n skipped.push(`.brain/${file}`);\n }\n }\n\n // Also include any LOG archive files\n const archiveFiles = readdirSync(brainDir).filter(f => /^LOG-\\d{4}-\\d{2}-\\d{2}\\.md$/.test(f));\n for (const file of archiveFiles) {\n zip.addLocalFile(join(brainDir, file), '.brain');\n included.push(`.brain/${file}`);\n }\n\n // Agent instruction files (optional)\n if (opts.includeAgents) {\n for (const agent of AGENTS) {\n const agentPath = join(projectPath, agent.destFile);\n if (existsSync(agentPath)) {\n const dir = agent.destFile.includes('/') ? agent.destFile.split('/').slice(0, -1).join('/') : '';\n zip.addLocalFile(agentPath, dir);\n included.push(agent.destFile);\n }\n }\n }\n\n // Write zip\n try {\n zip.writeZip(outputPath);\n } catch (err: unknown) {\n console.log(` ${chalk.red('✗')} Could not write zip: ${err instanceof Error ? err.message : String(err)}`);\n console.log('');\n process.exit(1);\n }\n\n // --- Output ---\n for (const f of included) console.log(` ${chalk.green('✓')} ${f}`);\n if (skipped.length > 0) {\n for (const f of skipped) console.log(` ${chalk.dim('–')} ${f} ${chalk.dim('(not found, skipped)')}`);\n }\n console.log('');\n console.log(` ${chalk.green('✓')} Exported to: ${chalk.bold(outputPath)}`);\n console.log('');\n console.log(` ${chalk.dim('To import on another machine or project:')}`);\n console.log(` ${chalk.cyan(`mindlink import ${basename(outputPath)}`)}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { select, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, mkdirSync } from 'fs';\nimport { join, resolve, extname } from 'path';\nimport AdmZip from 'adm-zip';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nexport const importCommand = new Command('import')\n .description('Import a MindLink memory zip into the current project')\n .argument('<file>', 'Path to the .zip file exported by mindlink export')\n .option('-y, --yes', 'Skip confirmation and overwrite existing memory')\n .addHelpText('after', `\nWhat gets imported:\n All .brain/ files found in the zip (MEMORY.md, SESSION.md, SHARED.md, LOG.md,\n and any LOG archive files). Agent instruction files are also imported if the zip\n contains them.\n\nIf .brain/ already exists, you will be asked whether to:\n Merge — import only files that don't exist yet (keeps your current memory)\n Overwrite — replace everything (use when onboarding from a teammate's export)\n Cancel — do nothing\n\nUse cases:\n Onboard on a new machine — copy the zip, run: mindlink import brain.zip\n Restore from backup — mindlink import my-app-brain-2026-04-10.zip\n Accept a colleague's brain — merge their context into your project\n\nExamples:\n mindlink import my-app-brain-2026-04-10.zip\n mindlink import ~/Desktop/my-app-brain-2026-04-10.zip --yes\n `)\n .action(async (file, opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n const zipPath = resolve(file);\n\n console.log('');\n\n if (!existsSync(zipPath)) {\n console.log(` ${chalk.red('✗')} File not found: ${zipPath}`);\n console.log('');\n process.exit(1);\n }\n\n if (extname(zipPath) !== '.zip') {\n console.log(` ${chalk.red('✗')} Expected a .zip file. Got: ${zipPath}`);\n console.log('');\n process.exit(1);\n }\n\n // --- Load and validate zip ---\n let zip: AdmZip;\n try {\n zip = new AdmZip(zipPath);\n } catch (err: unknown) {\n console.log(` ${chalk.red('✗')} Could not read zip: ${err instanceof Error ? err.message : String(err)}`);\n console.log('');\n process.exit(1);\n }\n\n const entries = zip.getEntries();\n const brainEntries = entries.filter(e => e.entryName.startsWith('.brain/') && !e.isDirectory);\n\n if (brainEntries.length === 0) {\n console.log(` ${chalk.red('✗')} This zip doesn't contain any .brain/ files.`);\n console.log(` Make sure it was created with ${chalk.cyan('mindlink export')}.`);\n console.log('');\n process.exit(1);\n }\n\n // --- Handle existing .brain/ ---\n let mode: 'merge' | 'overwrite' = 'overwrite';\n\n if (existsSync(brainDir)) {\n if (opts.yes) {\n mode = 'overwrite';\n } else {\n console.log(` ${chalk.yellow('!')} .brain/ already exists in this project.`);\n console.log('');\n\n const action = await select({\n message: 'How should the import handle existing memory?',\n options: [\n { value: 'merge', label: 'Merge', hint: 'add files that don\\'t exist yet — keep your current memory' },\n { value: 'overwrite', label: 'Overwrite', hint: 'replace everything with the imported version' },\n { value: 'cancel', label: 'Cancel', hint: '' },\n ],\n });\n\n if (isCancel(action) || action === 'cancel') {\n cancel('Cancelled.');\n console.log('');\n return;\n }\n\n mode = action as 'merge' | 'overwrite';\n console.log('');\n }\n }\n\n // --- Extract ---\n mkdirSync(brainDir, { recursive: true });\n\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory) continue;\n\n const destPath = join(projectPath, entry.entryName);\n const destDir = join(projectPath, entry.entryName.split('/').slice(0, -1).join('/'));\n\n if (mode === 'merge' && existsSync(destPath)) {\n skipped.push(entry.entryName);\n continue;\n }\n\n mkdirSync(destDir, { recursive: true });\n zip.extractEntryTo(entry, destDir, false, true);\n written.push(entry.entryName);\n }\n\n // --- Output ---\n for (const f of written) console.log(` ${chalk.green('✓')} ${f}`);\n for (const f of skipped) console.log(` ${chalk.dim('–')} ${f} ${chalk.dim('(already exists, kept)')}`);\n console.log('');\n\n if (written.length === 0) {\n console.log(` ${chalk.dim('Nothing imported — all files already exist (merge mode).')}`);\n } else {\n console.log(` ${chalk.green('✓')} Brain transplant complete. Your AI wakes up knowing everything.`);\n if (!existsSync(join(brainDir, '../CLAUDE.md')) && !existsSync(join(brainDir, '../CURSOR.md'))) {\n console.log(` ${chalk.dim('No agent instruction files found — run mindlink init to wire them up.')}`);\n }\n }\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync, readdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\nimport { extractSection, parseLogEntries, relativeTime } from '../utils/parser.js';\n\nconst CORE_LINE_LIMIT = 50;\nconst CORE_WARN_THRESHOLD = 40;\n\ntype CheckStatus = 'ok' | 'warn' | 'fail' | 'info';\n\ninterface Check {\n status: CheckStatus;\n label: string;\n detail?: string;\n}\n\nfunction ok(label: string, detail?: string): Check { return { status: 'ok', label, detail }; }\nfunction warn(label: string, detail?: string): Check { return { status: 'warn', label, detail }; }\nfunction fail(label: string, detail?: string): Check { return { status: 'fail', label, detail }; }\nfunction info(label: string, detail?: string): Check { return { status: 'info', label, detail }; }\n\nfunction icon(status: CheckStatus): string {\n switch (status) {\n case 'ok': return chalk.green('✓');\n case 'warn': return chalk.yellow('!');\n case 'fail': return chalk.red('✗');\n case 'info': return chalk.dim('·');\n }\n}\n\nexport const doctorCommand = new Command('doctor')\n .description('Check that your MindLink setup is healthy')\n .addHelpText('after', `\nWhat gets checked:\n .brain/ — exists and contains all expected files\n MEMORY.md — Core has content; warns if Core is getting too long to reliably read\n SESSION.md — has content (agent is updating it)\n LOG.md — session count, how far back history goes, warns when oldest sessions near rotation\n Agent files — instruction files exist per your config.json\n Hook — .claude/settings.json exists (if Claude Code is configured)\n\nExamples:\n mindlink doctor\n `)\n .action(() => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink Doctor')}`);\n console.log(` ${chalk.dim(projectPath)}`);\n console.log('');\n\n const checks: Check[] = [];\n let failCount = 0;\n let warnCount = 0;\n\n // ── 1. .brain/ exists ───────────────────────────────────────────────────\n if (!existsSync(brainDir)) {\n checks.push(fail('.brain/ missing', `Run ${chalk.cyan('mindlink init')} to get started.`));\n printChecks(checks);\n process.exit(1);\n }\n checks.push(ok('.brain/ found'));\n\n // ── 2. config.json ──────────────────────────────────────────────────────\n const configPath = join(brainDir, 'config.json');\n let config: { agents?: string[]; gitTracking?: boolean; autoSync?: boolean; maxLogEntries?: number } = {};\n if (!existsSync(configPath)) {\n checks.push(warn('config.json missing', `Run ${chalk.cyan('mindlink config')} to repair.`));\n } else {\n try {\n config = JSON.parse(readFileSync(configPath, 'utf8'));\n checks.push(ok('config.json valid'));\n } catch {\n checks.push(warn('config.json unreadable', 'File may be corrupted — delete and re-run mindlink init.'));\n }\n }\n\n // ── 3. MEMORY.md ────────────────────────────────────────────────────────\n const memoryPath = join(brainDir, 'MEMORY.md');\n if (!existsSync(memoryPath)) {\n checks.push(fail('MEMORY.md missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const memoryMd = readFileSync(memoryPath, 'utf8');\n const coreSection = extractSection(memoryMd, 'Core');\n const coreLines = coreSection.split('\\n').filter(l => l.trim().length > 0 && !l.startsWith('<!--')).length;\n\n if (coreLines === 0) {\n checks.push(warn('MEMORY.md Core is empty', 'Your AI has no permanent facts yet. It will fill this in automatically at the start of the next session.'));\n } else if (coreLines >= CORE_LINE_LIMIT) {\n checks.push(warn(\n 'MEMORY.md Core is getting too long',\n 'Ask your AI to consolidate — Core is read every session start, so keep it tight.'\n ));\n } else if (coreLines >= CORE_WARN_THRESHOLD) {\n checks.push(warn(\n 'MEMORY.md Core is getting long',\n 'Consider asking your AI to consolidate — Core is read on every session start.'\n ));\n } else {\n checks.push(ok('MEMORY.md Core has content'));\n }\n }\n\n // ── 4. SESSION.md ───────────────────────────────────────────────────────\n const sessionPath = join(brainDir, 'SESSION.md');\n if (!existsSync(sessionPath)) {\n checks.push(fail('SESSION.md missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const sessionMd = readFileSync(sessionPath, 'utf8');\n const hasContent = sessionMd.split('\\n').some(l => l.trim().length > 0 && !l.startsWith('<!--') && !l.startsWith('#'));\n const mtime = statSync(sessionPath).mtime;\n const age = relativeTime(mtime);\n\n if (!hasContent) {\n checks.push(warn('SESSION.md has no content yet', 'Start an AI session — it will fill this in automatically.'));\n } else {\n checks.push(ok(`SESSION.md — updated ${age}`));\n }\n }\n\n // ── 5. LOG.md ───────────────────────────────────────────────────────────\n const logPath = join(brainDir, 'LOG.md');\n if (!existsSync(logPath)) {\n checks.push(fail('LOG.md missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const logMd = readFileSync(logPath, 'utf8');\n const entries = parseLogEntries(logMd);\n const entryCount = entries.length;\n const maxEntries: number = (config as any).maxLogEntries ?? 50;\n\n if (entryCount === 0) {\n checks.push(info('LOG.md — no sessions yet, start your first AI session'));\n } else {\n // Newest entry = last in file (append order)\n const newestHeading = entries[entries.length - 1].heading;\n const oldestHeading = entries[0].heading;\n const remaining = maxEntries - entryCount;\n\n if (remaining <= 3 && remaining > 0) {\n checks.push(warn(\n `LOG.md — ${entryCount}/${maxEntries} sessions, ${remaining} until oldest start archiving`,\n `Oldest session on record: ${oldestHeading} — it will be archived soon. Important decisions belong in MEMORY.md where they never rotate out.`\n ));\n } else if (remaining <= 0) {\n checks.push(warn(\n `LOG.md — at ${maxEntries}-session limit, oldest are being archived`,\n `Oldest session on record: ${oldestHeading}. Anything important should be in MEMORY.md.`\n ));\n } else {\n checks.push(ok(`LOG.md — ${entryCount} sessions logged (last: ${newestHeading}, going back to: ${oldestHeading})`));\n }\n }\n\n // Archive files\n const archives = readdirSync(brainDir).filter(f => /^LOG-\\d{4}-\\d{2}\\.md$/.test(f));\n if (archives.length > 0) {\n checks.push(info(`${archives.length} archive file${archives.length !== 1 ? 's' : ''} — old sessions are stored in LOG-*.md, not gone`));\n }\n }\n\n // ── 6. Agent instruction files ──────────────────────────────────────────\n const configuredAgents: string[] = config.agents ?? [];\n if (configuredAgents.length === 0) {\n checks.push(warn('No agents configured', `Run ${chalk.cyan('mindlink config')} → Agent instruction files.`));\n } else {\n for (const agentValue of configuredAgents) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n if (!existsSync(destPath)) {\n checks.push(fail(`${agent.destFile} missing`, `Run ${chalk.cyan('mindlink config')} → Agent instruction files to recreate.`));\n } else {\n checks.push(ok(`${agent.destFile} — ${agent.label}`));\n }\n }\n }\n\n // ── 7. Claude Code hook ──────────────────────────────────────────────────\n if (configuredAgents.includes('claude')) {\n const hookPath = join(projectPath, '.claude', 'settings.json');\n if (!existsSync(hookPath)) {\n checks.push(warn(\n '.claude/settings.json missing',\n `Claude Code won't auto-reload after context compaction. Run ${chalk.cyan('mindlink config')} → Agent instruction files to restore.`\n ));\n } else {\n try {\n const settings = JSON.parse(readFileSync(hookPath, 'utf8'));\n const hasHook = settings?.hooks?.UserPromptSubmit != null;\n if (!hasHook) {\n checks.push(warn('.claude/settings.json exists but MindLink hook not found', 'Hook may have been removed — check the file manually.'));\n } else {\n checks.push(ok('.claude/settings.json — UserPromptSubmit hook active'));\n }\n } catch {\n checks.push(warn('.claude/settings.json is not valid JSON', 'Fix or delete it to restore the hook.'));\n }\n }\n }\n\n // ── 8. Git tracking notice ───────────────────────────────────────────────\n if (config.gitTracking === false) {\n checks.push(info('.brain/ is excluded from git (personal memory only)'));\n } else if (config.gitTracking === true) {\n checks.push(info('.brain/ is committed to git (shared team memory)'));\n }\n\n // ── Summary ──────────────────────────────────────────────────────────────\n for (const c of checks) {\n if (c.status === 'fail') failCount++;\n if (c.status === 'warn') warnCount++;\n }\n\n printChecks(checks);\n\n if (failCount > 0) {\n console.log(` ${chalk.red.bold(`${failCount} problem${failCount !== 1 ? 's' : ''} found`)} — fix the issues above and re-run ${chalk.cyan('mindlink doctor')}.`);\n } else if (warnCount > 0) {\n console.log(` ${chalk.yellow.bold(`${warnCount} warning${warnCount !== 1 ? 's' : ''}`)}, no critical issues. Your AI will still work.`);\n } else {\n console.log(` ${chalk.green.bold('All good.')} Your AI has a healthy brain.`);\n }\n console.log('');\n\n if (failCount > 0) process.exit(1);\n });\n\nfunction printChecks(checks: Check[]): void {\n for (const c of checks) {\n const prefix = ` ${icon(c.status)} `;\n console.log(`${prefix}${c.label}`);\n if (c.detail) {\n console.log(` ${chalk.dim(c.detail)}`);\n }\n }\n console.log('');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { VERSION } from '../utils/version.js';\n\nexport const versionCommand = new Command('version')\n .description('Show the current MindLink version')\n .action(() => {\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink')} v${VERSION}`);\n console.log('');\n console.log(` ${chalk.dim('Run')} ${chalk.cyan('mindlink update')} ${chalk.dim('to check for a newer version.')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { execSync } from 'child_process';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nconst BRAIN_FILES = ['MEMORY.md', 'SESSION.md', 'LOG.md', 'SHARED.md'];\n\nfunction relativeTime(ms: number): string {\n const secs = Math.floor(ms / 1000);\n if (secs < 60) return `${secs}s ago`;\n const mins = Math.floor(secs / 60);\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n return `${Math.floor(hours / 24)}d ago`;\n}\n\n/** Try to get git diff for a file since the last commit (or HEAD~1). Returns null if not in git. */\nfunction getGitDiff(filePath: string, since?: string): string | null {\n try {\n const dir = resolve(filePath, '..');\n // Check if in git\n execSync('git rev-parse --is-inside-work-tree', { cwd: dir, stdio: 'pipe' });\n const ref = since || 'HEAD~1';\n const diff = execSync(`git diff ${ref} -- \"${filePath}\"`, {\n cwd: dir,\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return diff || null;\n } catch {\n return null;\n }\n}\n\n/** Summarize additions/removals from a unified diff string */\nfunction parseDiffSummary(diff: string): { added: string[]; removed: string[] } {\n const added: string[] = [];\n const removed: string[] = [];\n for (const line of diff.split('\\n')) {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n const t = line.slice(1).trim();\n if (t && !t.startsWith('<!--') && !t.startsWith('#') && t !== '---') added.push(t);\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n const t = line.slice(1).trim();\n if (t && !t.startsWith('<!--') && !t.startsWith('#') && t !== '---') removed.push(t);\n }\n }\n return { added, removed };\n}\n\nexport const diffCommand = new Command('diff')\n .description('Show what changed in .brain/ since last session')\n .option('--since <ref>', 'Git ref or date to diff against (default: last mindlink clear or HEAD~1)')\n .option('--json', 'Output as JSON')\n .addHelpText('after', `\nWhat it does:\n Shows what changed in each .brain/ file since your last session.\n Uses git diff when .brain/ is tracked; falls back to file modification times.\n\nExamples:\n mindlink diff\n mindlink diff --since HEAD~3\n mindlink diff --since \"2026-04-10\"\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log('');\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const results: Record<string, {\n exists: boolean;\n mtime?: number;\n diff?: string | null;\n added?: string[];\n removed?: string[];\n sizeLines?: number;\n }> = {};\n\n // Get session start timestamp (from .session_ts if available)\n const sessionTsPath = join(brainDir, '.session_ts');\n const sessionTs = existsSync(sessionTsPath)\n ? parseInt(readFileSync(sessionTsPath, 'utf8').trim(), 10) * 1000\n : null;\n\n const now = Date.now();\n const isGitTracked = (() => {\n try {\n execSync('git rev-parse --is-inside-work-tree', { cwd: projectPath, stdio: 'pipe' });\n // Check if .brain/ is tracked\n const tracked = execSync('git ls-files --error-unmatch .brain/MEMORY.md', {\n cwd: projectPath, stdio: 'pipe',\n });\n return true;\n } catch {\n return false;\n }\n })();\n\n for (const file of BRAIN_FILES) {\n const filePath = join(brainDir, file);\n if (!existsSync(filePath)) {\n results[file] = { exists: false };\n continue;\n }\n const stat = statSync(filePath);\n const mtime = stat.mtimeMs;\n const content = readFileSync(filePath, 'utf8');\n const sizeLines = content.split('\\n').length;\n\n let diff: string | null = null;\n let added: string[] = [];\n let removed: string[] = [];\n\n if (isGitTracked) {\n diff = getGitDiff(filePath, opts.since);\n if (diff) {\n const summary = parseDiffSummary(diff);\n added = summary.added.slice(0, 5);\n removed = summary.removed.slice(0, 5);\n }\n }\n\n results[file] = { exists: true, mtime, diff, added, removed, sizeLines };\n }\n\n if (opts.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n console.log('');\n console.log(` ${chalk.bold('.brain/ changes')}`);\n if (sessionTs) {\n console.log(` ${chalk.dim(`Session started ${relativeTime(now - sessionTs)}`)}`);\n }\n if (isGitTracked) {\n const sinceRef = opts.since || 'HEAD~1';\n console.log(` ${chalk.dim(`Git diff against: ${sinceRef}`)}`);\n } else {\n console.log(` ${chalk.dim('.brain/ is not git-tracked — showing modification times only')}`);\n }\n console.log('');\n\n for (const file of BRAIN_FILES) {\n const r = results[file];\n if (!r.exists) {\n console.log(` ${chalk.dim('—')} ${file} ${chalk.dim('(not found)')}`);\n continue;\n }\n\n const age = r.mtime ? relativeTime(now - r.mtime) : '';\n const changedThisSession = sessionTs && r.mtime ? r.mtime > sessionTs : false;\n const indicator = changedThisSession ? chalk.green('●') : chalk.dim('○');\n const label = changedThisSession ? chalk.green(file) : chalk.dim(file);\n\n console.log(` ${indicator} ${label} ${chalk.dim(`${r.sizeLines} lines · modified ${age}`)}`);\n\n if (isGitTracked && r.diff) {\n for (const line of (r.added ?? []).slice(0, 3)) {\n console.log(` ${chalk.green('+')} ${line.length > 80 ? line.slice(0, 80) + '…' : line}`);\n }\n for (const line of (r.removed ?? []).slice(0, 3)) {\n console.log(` ${chalk.red('-')} ${line.length > 80 ? line.slice(0, 80) + '…' : line}`);\n }\n } else if (!isGitTracked && changedThisSession) {\n console.log(` ${chalk.dim('(content diff unavailable — commit .brain/ to git for line-level diff)')}`);\n } else if (isGitTracked && !r.diff) {\n console.log(` ${chalk.dim('no changes since last commit')}`);\n }\n }\n\n console.log('');\n\n const changedCount = BRAIN_FILES.filter(f => {\n const r = results[f];\n return r.exists && sessionTs && r.mtime && r.mtime > sessionTs;\n }).length;\n\n if (changedCount === 0) {\n console.log(` ${chalk.dim('No .brain/ files were modified this session.')}`);\n if (sessionTs) {\n console.log(` ${chalk.dim('If the session just started, this is expected.')}`);\n }\n } else {\n console.log(` ${chalk.green('✓')} ${changedCount} file${changedCount !== 1 ? 's' : ''} updated this session.`);\n }\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync, mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR, AGENT_TEMPLATES_DIR, HOOKS_TEMPLATES_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\nimport { sectionHasRealContent, countRealLines } from '../utils/content.js';\n\nconst SESSION_WARN_DAYS = 3;\nconst SESSION_FAIL_DAYS = 7;\nconst MEMORY_WARN_LINES = 100;\nconst MEMORY_FAIL_LINES = 200;\n\nexport interface CheckResult {\n id: string;\n label: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n fixable: boolean;\n}\n\nfunction pass(id: string, label: string, message: string): CheckResult {\n return { id, label, status: 'pass', message, fixable: false };\n}\nfunction warn(id: string, label: string, message: string, fixable = false): CheckResult {\n return { id, label, status: 'warn', message, fixable };\n}\nfunction fail(id: string, label: string, message: string, fixable = false): CheckResult {\n return { id, label, status: 'fail', message, fixable };\n}\n\nfunction icon(status: 'pass' | 'warn' | 'fail'): string {\n switch (status) {\n case 'pass': return chalk.green('✓');\n case 'warn': return chalk.yellow('⚠');\n case 'fail': return chalk.red('✗');\n }\n}\n\nexport function runChecks(projectPath: string): CheckResult[] {\n const brainDir = join(projectPath, BRAIN_DIR);\n const results: CheckResult[] = [];\n\n if (!existsSync(brainDir)) {\n results.push(fail('brain_missing', '.brain/ missing', `Run ${chalk.cyan('mindlink init')} to set up memory.`));\n return results;\n }\n\n // ── config ──────────────────────────────────────────────────────────────────\n const configPath = join(brainDir, 'config.json');\n let config: { agents?: string[] } = {};\n if (existsSync(configPath)) {\n try { config = JSON.parse(readFileSync(configPath, 'utf8')); } catch {}\n }\n\n // ── 1. core ──────────────────────────────────────────────────────────────────\n const memoryPath = join(brainDir, 'MEMORY.md');\n if (!existsSync(memoryPath)) {\n results.push(fail('core', 'Core section', `MEMORY.md is missing — run ${chalk.cyan('mindlink init')}.`));\n } else {\n const memMd = readFileSync(memoryPath, 'utf8');\n if (!sectionHasRealContent(memMd, 'Core')) {\n results.push(fail('core', 'Core section — empty', 'Start a session and tell your AI to fill in the Core section.'));\n } else {\n results.push(pass('core', 'Core section — filled', ''));\n }\n }\n\n // ── 2. user_profile ──────────────────────────────────────────────────────────\n if (existsSync(memoryPath)) {\n const memMd = readFileSync(memoryPath, 'utf8');\n if (!sectionHasRealContent(memMd, 'User Profile')) {\n results.push(fail('user_profile', 'User Profile — empty', `Run ${chalk.cyan('mindlink profile')} to set up your global profile and import it here.`));\n } else {\n results.push(pass('user_profile', 'User Profile — filled', ''));\n }\n }\n\n // ── 3. session_fresh ────────────────────────────────────────────────────────\n const sessionPath = join(brainDir, 'SESSION.md');\n if (!existsSync(sessionPath)) {\n results.push(fail('session_fresh', 'SESSION.md — missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const ageDays = (Date.now() - statSync(sessionPath).mtime.getTime()) / 86400000;\n const hasContent = readFileSync(sessionPath, 'utf8')\n .split('\\n')\n .some(l => l.trim().length > 0 && !l.startsWith('#') && !l.startsWith('<!--'));\n\n if (!hasContent) {\n results.push(warn('session_fresh', 'SESSION.md — no content yet', 'Start a session — your AI will fill this in automatically.'));\n } else if (ageDays > SESSION_FAIL_DAYS) {\n const days = Math.floor(ageDays);\n results.push(fail('session_fresh', `SESSION.md — last updated ${days} days ago`, 'SESSION.md has not been updated in a week. Your AI may not be writing session state. Check that it is completing the REQUIRED session-end steps.'));\n } else if (ageDays > SESSION_WARN_DAYS) {\n const days = Math.floor(ageDays);\n results.push(warn('session_fresh', `SESSION.md — last updated ${days} days ago`, 'SESSION.md is getting stale. If you have active sessions, your AI should be updating this after each response.'));\n } else {\n const mins = Math.floor((Date.now() - statSync(sessionPath).mtime.getTime()) / 60000);\n const age = mins < 60 ? `${mins}m ago` : mins < 1440 ? `${Math.floor(mins / 60)}h ago` : `${Math.floor(mins / 1440)}d ago`;\n results.push(pass('session_fresh', `SESSION.md — updated ${age}`, ''));\n }\n }\n\n // ── 4. log_present ───────────────────────────────────────────────────────────\n const logPath = join(brainDir, 'LOG.md');\n if (!existsSync(logPath)) {\n results.push(fail('log_present', 'LOG.md — missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const entries = (readFileSync(logPath, 'utf8').match(/^##\\s+/gm) ?? []).length;\n if (entries === 0) {\n results.push(pass('log_present', 'LOG.md — no sessions yet', ''));\n } else {\n results.push(pass('log_present', `LOG.md — ${entries} session${entries !== 1 ? 's' : ''} logged`, ''));\n }\n }\n\n // ── 5. memory_size ───────────────────────────────────────────────────────────\n if (existsSync(memoryPath)) {\n const memMd = readFileSync(memoryPath, 'utf8');\n const lines = countRealLines(memMd);\n if (lines > MEMORY_FAIL_LINES) {\n results.push(fail('memory_size', `MEMORY.md — ${lines} lines (target: under ${MEMORY_FAIL_LINES})`, `Run ${chalk.cyan('mindlink prune')} to consolidate stale entries.`));\n } else if (lines > MEMORY_WARN_LINES) {\n results.push(warn('memory_size', `MEMORY.md — ${lines} lines (getting long)`, `Consider running ${chalk.cyan('mindlink prune')} to retire old entries.`));\n } else {\n results.push(pass('memory_size', `MEMORY.md — ${lines} line${lines !== 1 ? 's' : ''} (healthy)`, ''));\n }\n }\n\n // ── 6. agent_files ───────────────────────────────────────────────────────────\n const configuredAgents: string[] = config.agents ?? [];\n if (configuredAgents.length === 0) {\n results.push(warn('agent_files', 'No agents configured', `Run ${chalk.cyan('mindlink config')} → Agent instruction files.`, false));\n } else {\n const missing: string[] = [];\n for (const agentValue of configuredAgents) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n if (!existsSync(join(projectPath, agent.destFile))) missing.push(agent.destFile);\n }\n if (missing.length === configuredAgents.length) {\n results.push(fail('agent_files', 'Agent files — none present', `All configured agent files are missing. Run ${chalk.cyan('mindlink verify --fix')} to regenerate.`, true));\n } else if (missing.length > 0) {\n results.push(warn('agent_files', `Agent files — ${missing.length} missing: ${missing.join(', ')}`, `Run ${chalk.cyan('mindlink verify --fix')} to regenerate.`, true));\n } else {\n results.push(pass('agent_files', `Agent files — all ${configuredAgents.length} present`, ''));\n }\n }\n\n return results;\n}\n\nfunction applyFix(projectPath: string, results: CheckResult[]): void {\n const brainDir = join(projectPath, BRAIN_DIR);\n const configPath = join(brainDir, 'config.json');\n let config: { agents?: string[] } = {};\n if (existsSync(configPath)) {\n try { config = JSON.parse(readFileSync(configPath, 'utf8')); } catch {}\n }\n\n const fixable = results.filter(r => r.fixable && r.status !== 'pass');\n if (fixable.length === 0) {\n console.log(` ${chalk.dim('Nothing to auto-fix. Address the issues above manually.')}`);\n return;\n }\n\n let fixed = 0;\n for (const r of fixable) {\n if (r.id === 'agent_files') {\n const configuredAgents: string[] = config.agents ?? [];\n for (const agentValue of configuredAgents) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n if (!existsSync(destPath)) {\n try {\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n console.log(` ${chalk.green('✓')} Regenerated ${agent.destFile}`);\n fixed++;\n } catch (err) {\n console.log(` ${chalk.red('✗')} Failed to regenerate ${agent.destFile}: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n // Also restore .claude/settings.json if claude is configured\n if (configuredAgents.includes('claude')) {\n const hookPath = join(projectPath, '.claude', 'settings.json');\n if (!existsSync(hookPath)) {\n try {\n mkdirSync(dirname(hookPath), { recursive: true });\n writeFileSync(hookPath, readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n console.log(` ${chalk.green('✓')} Regenerated .claude/settings.json`);\n fixed++;\n } catch {}\n }\n }\n }\n }\n\n // Print non-fixable guidance\n for (const r of results) {\n if (r.status === 'fail' || r.status === 'warn') {\n if (r.id === 'core' || r.id === 'user_profile') {\n console.log(` ${chalk.dim('→')} ${r.id === 'core' ? 'Core' : 'User Profile'}: start a session and tell your AI to fill this in.`);\n } else if (r.id === 'memory_size') {\n console.log(` ${chalk.dim('→')} MEMORY.md too large: run ${chalk.cyan('mindlink prune')} to consolidate.`);\n }\n }\n }\n\n if (fixed > 0) console.log('');\n}\n\nexport const verifyCommand = new Command('verify')\n .description('Check that .brain/ memory is healthy and up-to-date')\n .option('--json', 'Output results as JSON')\n .option('--fix', 'Auto-fix recoverable issues (regenerate missing agent files)')\n .addHelpText('after', `\nWhat is checked:\n Core — MEMORY.md Core section has real content\n User Profile — MEMORY.md User Profile has real content\n SESSION.md — was updated recently (warn >3 days, fail >7 days)\n LOG.md — present and readable\n MEMORY.md size — line count (warn >100, fail >200)\n Agent files — all files from config.json are present on disk\n\nExamples:\n mindlink verify\n mindlink verify --json\n mindlink verify --fix\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const results = runChecks(projectPath);\n\n if (opts.json) {\n console.log(JSON.stringify({ ok: results.every(r => r.status === 'pass'), checks: results }, null, 2));\n const hasFailure = results.some(r => r.status === 'fail');\n process.exit(hasFailure ? 1 : 0);\n }\n\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink Verify')}`);\n console.log(` ${chalk.dim(projectPath)}`);\n console.log('');\n\n for (const r of results) {\n console.log(` ${icon(r.status)} ${r.label}`);\n if (r.message) console.log(` ${chalk.dim(r.message)}`);\n }\n console.log('');\n\n const failCount = results.filter(r => r.status === 'fail').length;\n const warnCount = results.filter(r => r.status === 'warn').length;\n const fixableCount = results.filter(r => r.fixable && r.status !== 'pass').length;\n\n if (opts.fix) {\n applyFix(projectPath, results);\n }\n\n if (failCount > 0) {\n console.log(` ${chalk.red.bold(`${failCount} error${failCount !== 1 ? 's' : ''}`)}, ${warnCount} warning${warnCount !== 1 ? 's' : ''}.`);\n if (!opts.fix && fixableCount > 0) {\n console.log(` ${chalk.dim(`Run ${chalk.cyan('mindlink verify --fix')} to auto-repair ${fixableCount} issue${fixableCount !== 1 ? 's' : ''}.`)}`);\n }\n } else if (warnCount > 0) {\n console.log(` ${chalk.yellow.bold(`${warnCount} warning${warnCount !== 1 ? 's' : ''}`)}, no critical errors.`);\n } else {\n console.log(` ${chalk.green.bold('All good.')} Your AI's memory is healthy.`);\n }\n console.log('');\n\n if (failCount > 0) process.exit(1);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { execSync } from 'child_process';\nimport { GLOBAL_MINDLINK_DIR, GLOBAL_USER_PROFILE_PATH } from '../utils/paths.js';\n\nconst PROFILE_TEMPLATE = `# MindLink — Global User Profile\n\n> This file is imported into every new project's MEMORY.md on \\`mindlink init\\`.\n> Edit it with \\`mindlink profile\\`. Run \\`mindlink update\\` to sync changes to all projects.\n\n<!-- Role, company, title, level, years of experience -->\n<!-- Primary languages and tools -->\n<!-- Communication style and preferences -->\n<!-- Editor, OS, shell setup -->\n<!-- Added: ${new Date().toISOString().slice(0, 10)} -->\n`;\n\nfunction ensureProfileExists(): void {\n if (!existsSync(GLOBAL_MINDLINK_DIR)) {\n mkdirSync(GLOBAL_MINDLINK_DIR, { recursive: true });\n }\n if (!existsSync(GLOBAL_USER_PROFILE_PATH)) {\n writeFileSync(GLOBAL_USER_PROFILE_PATH, PROFILE_TEMPLATE);\n }\n}\n\nexport const profileCommand = new Command('profile')\n .description('Manage your global user profile (imported into every new project)')\n .option('--show', 'Print current profile to stdout')\n .option('--path', 'Print profile file path only')\n .addHelpText('after', `\nYour profile is stored at ~/.mindlink/USER.md and auto-imported into\nMEMORY.md when you run \\`mindlink init\\` on a new project.\n\nRun \\`mindlink update\\` to sync profile changes to all registered projects.\n\nExamples:\n mindlink profile # open profile in $EDITOR\n mindlink profile --show # print profile to stdout\n mindlink profile --path # print file path\n `)\n .action((opts) => {\n if (opts.path) {\n console.log(GLOBAL_USER_PROFILE_PATH);\n return;\n }\n\n if (opts.show) {\n if (!existsSync(GLOBAL_USER_PROFILE_PATH)) {\n console.log('');\n console.log(` ${chalk.yellow('⚠')} No global profile yet.`);\n console.log(` Run ${chalk.cyan('mindlink profile')} to create one.`);\n console.log('');\n return;\n }\n console.log('');\n console.log(readFileSync(GLOBAL_USER_PROFILE_PATH, 'utf8'));\n return;\n }\n\n // Open in $EDITOR\n ensureProfileExists();\n const editor = process.env.EDITOR || process.env.VISUAL || 'nano';\n console.log('');\n console.log(` ${chalk.dim(`Opening ${GLOBAL_USER_PROFILE_PATH} in ${editor}...`)}`);\n console.log(` ${chalk.dim('Run mindlink update after saving to sync to all registered projects.')}`);\n console.log('');\n\n try {\n execSync(`${editor} \"${GLOBAL_USER_PROFILE_PATH}\"`, { stdio: 'inherit' });\n console.log('');\n console.log(` ${chalk.green('✓')} Profile saved.`);\n console.log(` ${chalk.dim('→ Run mindlink update to sync to all registered projects.')}`);\n console.log('');\n } catch {\n // Editor exited non-zero (e.g. user hit Ctrl-C in nano) — not an error\n console.log('');\n }\n });\n","import { Command } from 'commander';\nimport { select, isCancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\n// Days after which an entry in a given section is considered stale\nconst STALENESS_THRESHOLDS: Record<string, number> = {\n 'current focus': 14,\n 'decisions': 180,\n 'conventions': 180,\n 'architecture': 365,\n // 'user profile' and 'important context' have no expiry\n};\n\ninterface TimestampedEntry {\n /** Section heading (e.g. \"Current Focus\") */\n section: string;\n /** The text of the entry (may span multiple lines) */\n text: string;\n /** ISO date from <!-- added: YYYY-MM-DD --> */\n addedDate: Date | null;\n /** Line index in the file where this entry starts (0-based) */\n lineStart: number;\n /** Line index where this entry ends (exclusive) */\n lineEnd: number;\n /** Age in days (null if no timestamp) */\n ageInDays: number | null;\n /** Staleness threshold for this section (days) */\n threshold: number;\n /** True if ageInDays exceeds threshold */\n isStale: boolean;\n}\n\nconst TIMESTAMP_RE = /<!--\\s*added:\\s*(\\d{4}-\\d{2}-\\d{2})\\s*-->/;\nconst SECTION_RE = /^(#{1,6})\\s+(.+)/;\n\nfunction parseTimestampedEntries(content: string): TimestampedEntry[] {\n const lines = content.split('\\n');\n const entries: TimestampedEntry[] = [];\n\n let currentSection = '';\n let currentHeadingLevel = 0;\n let entryLines: string[] = [];\n let entryStart = -1;\n\n function flushEntry(lineEnd: number): void {\n if (entryStart < 0 || entryLines.length === 0) return;\n\n // Only consider entries with a timestamp\n const fullText = entryLines.join('\\n');\n const timestampMatch = fullText.match(TIMESTAMP_RE);\n if (!timestampMatch) {\n entryLines = [];\n entryStart = -1;\n return;\n }\n\n const addedDate = new Date(timestampMatch[1] + 'T00:00:00Z');\n const ageInDays = (Date.now() - addedDate.getTime()) / 86400000;\n const sectionKey = currentSection.toLowerCase().replace(/\\s*<!--.*?-->\\s*/g, '').trim();\n const threshold = STALENESS_THRESHOLDS[sectionKey] ?? Infinity;\n const isStale = isFinite(threshold) && ageInDays > threshold;\n\n // Strip pure comment/blank lines from start/end for cleaner display\n const trimmedLines = entryLines.filter(l => l.trim().length > 0);\n const displayText = trimmedLines.join('\\n');\n\n entries.push({\n section: currentSection.replace(/<!--.*?-->/g, '').trim(),\n text: displayText,\n addedDate,\n lineStart: entryStart,\n lineEnd,\n ageInDays,\n threshold,\n isStale,\n });\n\n entryLines = [];\n entryStart = -1;\n }\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const sectionMatch = line.match(SECTION_RE);\n\n if (sectionMatch) {\n const level = sectionMatch[1].length;\n const title = sectionMatch[2];\n\n // Flush any pending entry when we hit a new heading\n flushEntry(i);\n\n if (level <= 2) {\n // Top-level section change\n currentSection = title;\n currentHeadingLevel = level;\n }\n // Don't start an entry on a heading line\n continue;\n }\n\n // Skip horizontal rules and empty lines outside an entry\n if (line.trim() === '---') { flushEntry(i); continue; }\n\n // Skip pure comment blocks\n if (line.trim().startsWith('<!--') && line.trim().endsWith('-->')) {\n if (entryStart < 0) continue; // not in an entry\n }\n\n // Lines with a timestamp marker = end of an entry block\n if (TIMESTAMP_RE.test(line)) {\n if (entryStart < 0) entryStart = i;\n entryLines.push(line);\n flushEntry(i + 1);\n continue;\n }\n\n // Non-empty, non-comment lines start or continue an entry\n if (line.trim().length > 0 && !line.trim().startsWith('>')) {\n if (entryStart < 0) entryStart = i;\n entryLines.push(line);\n } else if (entryStart >= 0) {\n // Empty line inside an entry — keep for context but don't start a new one on it\n entryLines.push(line);\n }\n }\n\n flushEntry(lines.length);\n return entries;\n}\n\nfunction removeLines(content: string, lineStart: number, lineEnd: number): string {\n const lines = content.split('\\n');\n lines.splice(lineStart, lineEnd - lineStart);\n return lines.join('\\n');\n}\n\nfunction appendToArchive(content: string, entryText: string, pruneDate: string): string {\n const archiveHeading = '## Archive';\n const archiveEntry = `${entryText} <!-- archived: ${pruneDate} -->`;\n\n if (content.includes(archiveHeading)) {\n // Insert after the archive heading and any existing comment\n return content.replace(\n /(## Archive\\n(?:<!--[^>]*-->\\n)*)/,\n `$1\\n${archiveEntry}\\n`\n );\n } else {\n return content.trimEnd() + `\\n\\n${archiveHeading}\\n\\n<!-- Entries moved here by mindlink prune — kept for reference -->\\n\\n${archiveEntry}\\n`;\n }\n}\n\nfunction formatAge(days: number): string {\n if (days < 30) return `${Math.round(days)} days`;\n if (days < 365) return `${Math.round(days / 30)} months`;\n return `${(days / 365).toFixed(1)} years`;\n}\n\nexport const pruneCommand = new Command('prune')\n .description('Review and retire stale MEMORY.md entries interactively')\n .option('--dry-run', 'Show stale entries without making any changes')\n .option('--all', 'Show all timestamped entries regardless of age')\n .addHelpText('after', `\nScans MEMORY.md for entries with <!-- added: YYYY-MM-DD --> timestamps.\nEntries older than their section's staleness threshold are flagged for review.\n\nStaleness thresholds:\n Current Focus — 14 days\n Decisions — 180 days\n Conventions — 180 days\n Architecture — 365 days\n User Profile — never expires\n\nArchived entries are moved to ## Archive at the bottom of MEMORY.md.\nThey are never permanently deleted unless you choose \"Delete\".\n\nExamples:\n mindlink prune\n mindlink prune --dry-run\n mindlink prune --all\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n const memoryPath = join(brainDir, 'MEMORY.md');\n\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink Prune')}`);\n console.log(` ${chalk.dim(memoryPath)}`);\n console.log('');\n\n if (!existsSync(memoryPath)) {\n console.log(` ${chalk.red('✗')} MEMORY.md not found. Run ${chalk.cyan('mindlink init')} first.`);\n console.log('');\n process.exit(1);\n }\n\n const allEntries = parseTimestampedEntries(readFileSync(memoryPath, 'utf8'));\n const toReview = opts.all\n ? allEntries.filter(e => e.addedDate !== null)\n : allEntries.filter(e => e.isStale);\n\n if (toReview.length === 0) {\n if (allEntries.length === 0) {\n console.log(` ${chalk.dim('No timestamped entries found in MEMORY.md.')}`);\n console.log(` ${chalk.dim('Entries are timestamped when your AI writes them (<!-- added: YYYY-MM-DD -->).')}`);\n } else {\n console.log(` ${chalk.green('✓')} No stale entries found. ${allEntries.length} entry${allEntries.length !== 1 ? 'ies' : 'y'} all within threshold.`);\n console.log(` ${chalk.dim('Run mindlink prune --all to review all timestamped entries.')}`);\n }\n console.log('');\n return;\n }\n\n console.log(` Scanning MEMORY.md for ${opts.all ? 'timestamped' : 'stale'} entries...`);\n console.log(` Found ${toReview.length} entr${toReview.length !== 1 ? 'ies' : 'y'} to review.`);\n console.log('');\n\n if (opts.dryRun) {\n for (const entry of toReview) {\n const age = entry.ageInDays !== null ? formatAge(entry.ageInDays) : 'undated';\n const thresholdStr = isFinite(entry.threshold) ? ` — threshold: ${entry.threshold} days` : '';\n console.log(` ${chalk.yellow('⚠')} [${entry.section}] ${entry.text.split('\\n')[0].slice(0, 80)}`);\n console.log(` ${chalk.dim(`Added: ${entry.addedDate?.toISOString().slice(0, 10) ?? 'unknown'} (${age} ago)${thresholdStr}`)}`);\n console.log('');\n }\n console.log(` ${chalk.dim('Dry run — no changes made.')}`);\n console.log('');\n return;\n }\n\n const pruneDate = new Date().toISOString().slice(0, 10);\n let content = readFileSync(memoryPath, 'utf8');\n\n let archived = 0;\n let deleted = 0;\n let kept = 0;\n let skippedAll = false;\n\n // Process in reverse order so line numbers stay valid as we splice\n const sorted = [...toReview].sort((a, b) => b.lineStart - a.lineStart);\n\n for (const entry of sorted) {\n if (skippedAll) { kept++; continue; }\n\n const age = entry.ageInDays !== null ? formatAge(entry.ageInDays) : 'undated';\n const thresholdStr = isFinite(entry.threshold) ? ` — threshold: ${entry.threshold} days` : '';\n const displayLines = entry.text.split('\\n').slice(0, 3).join('\\n');\n\n console.log(` ${chalk.bold('─'.repeat(55))}`);\n console.log(` ${chalk.bold('Section:')} ${entry.section}`);\n console.log(` ${chalk.bold('Entry:')}`);\n for (const l of displayLines.split('\\n')) console.log(` ${chalk.dim(l)}`);\n console.log(` ${chalk.bold('Added:')} ${entry.addedDate?.toISOString().slice(0, 10) ?? 'unknown'} (${age} ago)${thresholdStr}`);\n console.log('');\n\n const action = await select({\n message: 'What would you like to do?',\n options: [\n { value: 'keep', label: 'Keep', hint: 'leave as-is' },\n { value: 'archive', label: 'Archive', hint: 'move to ## Archive section' },\n { value: 'delete', label: 'Delete', hint: 'remove permanently' },\n { value: 'skip_all', label: 'Skip remaining', hint: 'keep all remaining entries unchanged' },\n ],\n });\n\n if (isCancel(action)) { console.log(''); break; }\n\n if (action === 'skip_all') {\n skippedAll = true;\n kept++;\n continue;\n }\n\n if (action === 'archive') {\n const entryText = content.split('\\n').slice(entry.lineStart, entry.lineEnd).join('\\n').trim();\n content = removeLines(content, entry.lineStart, entry.lineEnd);\n content = appendToArchive(content, entryText, pruneDate);\n archived++;\n } else if (action === 'delete') {\n content = removeLines(content, entry.lineStart, entry.lineEnd);\n deleted++;\n } else {\n kept++;\n }\n\n console.log('');\n }\n\n if (archived > 0 || deleted > 0) {\n writeFileSync(memoryPath, content);\n }\n\n console.log(` ${chalk.bold('─'.repeat(55))}`);\n if (archived > 0) console.log(` ${chalk.green('✓')} ${archived} entry${archived !== 1 ? 'ies' : ''} archived`);\n if (deleted > 0) console.log(` ${chalk.green('✓')} ${deleted} entry${deleted !== 1 ? 'ies' : ''} deleted`);\n if (kept > 0) console.log(` ${chalk.dim('·')} ${kept} entry${kept !== 1 ? 'ies' : ''} kept`);\n if (archived > 0 || deleted > 0) {\n console.log(` ${chalk.green('✓')} MEMORY.md updated.`);\n }\n console.log('');\n });\n","import { Command } from 'commander';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, resolve, dirname } from 'path';\nimport { homedir } from 'os';\nimport { BRAIN_DIR } from '../utils/paths.js';\nimport { extractSection } from '../utils/parser.js';\nimport { replaceSection } from '../utils/content.js';\nimport { runChecks } from './verify.js';\nimport { VERSION } from '../utils/version.js';\n\n// ── Project resolution ────────────────────────────────────────────────────────\n\n/**\n * Resolve the project root by:\n * 1. MINDLINK_PROJECT_PATH env var (set by Claude Code)\n * 2. cwd walk-up looking for .brain/\n */\nfunction resolveProjectPath(): string | null {\n const envPath = process.env.MINDLINK_PROJECT_PATH;\n if (envPath && existsSync(join(envPath, BRAIN_DIR))) return envPath;\n\n let current = resolve(process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(current, BRAIN_DIR))) return current;\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return null;\n}\n\n// ── Memory section helpers ────────────────────────────────────────────────────\n\nconst VALID_SECTIONS = ['Core', 'Architecture', 'Decisions', 'Conventions', 'User Profile', 'Important Context'] as const;\ntype Section = typeof VALID_SECTIONS[number];\n\nfunction readMemorySection(memoryPath: string, section?: string): string {\n const content = readFileSync(memoryPath, 'utf8');\n if (!section) {\n // Default: Core + User Profile\n const core = extractSection(content, 'Core');\n const profile = extractSection(content, 'User Profile');\n return `## Core\\n\\n${core}\\n\\n## User Profile\\n\\n${profile}`.trim();\n }\n return extractSection(content, section);\n}\n\nfunction appendToSection(memoryPath: string, section: string, newContent: string): void {\n let content = readFileSync(memoryPath, 'utf8');\n const sectionBody = extractSection(content, section);\n\n // Find where section ends and insert before the next heading\n const lines = content.split('\\n');\n let headingIdx = -1;\n let nextSectionIdx = lines.length;\n let headingLevel = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^(#{1,6})\\s+(.+)/);\n if (match) {\n const level = match[1].length;\n const title = match[2].replace(/<!--.*?-->/g, '').trim();\n if (headingIdx < 0 && title.toLowerCase() === section.toLowerCase()) {\n headingIdx = i;\n headingLevel = level;\n } else if (headingIdx >= 0 && level <= headingLevel) {\n nextSectionIdx = i;\n break;\n }\n }\n }\n\n if (headingIdx < 0) {\n // Section doesn't exist — create it at end of file\n content = content.trimEnd() + `\\n\\n## ${section}\\n\\n${newContent.trim()}\\n`;\n } else {\n // Insert before next section (or end of file), after existing content\n const insertAt = nextSectionIdx > 0 && lines[nextSectionIdx - 1].trim() === '---'\n ? nextSectionIdx - 1\n : nextSectionIdx;\n lines.splice(insertAt, 0, '', newContent.trim(), '');\n content = lines.join('\\n');\n }\n\n writeFileSync(memoryPath, content);\n void sectionBody; // suppress unused warning\n}\n\n// ── MCP server ────────────────────────────────────────────────────────────────\n\nexport const mcpCommand = new Command('mcp')\n .description('Start the MindLink MCP server (stdio transport for AI tool integration)')\n .addHelpText('after', `\nThe MCP server runs as a local process launched by Claude Code.\nIt exposes 4 tools for auditable, schema-validated memory reads and writes.\n\nTools:\n mindlink_read_memory(section?) — read a section of MEMORY.md\n mindlink_write_memory(section, content) — append to a MEMORY.md section\n mindlink_session_update(summary) — overwrite SESSION.md\n mindlink_verify() — run health check, return JSON\n\nConfigure in .claude/settings.json (done automatically by mindlink init):\n { \"mcpServers\": { \"mindlink\": { \"command\": \"mindlink\", \"args\": [\"mcp\"] } } }\n\nExamples:\n mindlink mcp # (launched by Claude Code, not by hand)\n `)\n .action(async () => {\n const { McpServer } = await import('@modelcontextprotocol/sdk/server/mcp.js');\n const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');\n const { z } = await import('zod');\n\n const server = new McpServer({ name: 'mindlink', version: VERSION });\n\n // ── Tool 1: mindlink_read_memory ─────────────────────────────────────────\n\n server.tool(\n 'mindlink_read_memory',\n 'Read a section of this project\\'s MEMORY.md. If section is omitted, returns Core + User Profile only.',\n {\n section: z.enum(['Core', 'Architecture', 'Decisions', 'Conventions', 'User Profile', 'Important Context'])\n .optional()\n .describe('Section to read. Omit for Core + User Profile (recommended default).'),\n },\n async ({ section }) => {\n const projectPath = resolveProjectPath();\n if (!projectPath) {\n return {\n content: [{ type: 'text' as const, text: 'Error: No MindLink project found at this path. Run mindlink init first.' }],\n isError: true,\n };\n }\n const memoryPath = join(projectPath, BRAIN_DIR, 'MEMORY.md');\n if (!existsSync(memoryPath)) {\n return {\n content: [{ type: 'text' as const, text: 'Error: MEMORY.md not found. Run mindlink init to create it.' }],\n isError: true,\n };\n }\n try {\n const content = readMemorySection(memoryPath, section);\n return { content: [{ type: 'text' as const, text: content || '(section is empty)' }] };\n } catch (err) {\n return {\n content: [{ type: 'text' as const, text: `Error reading MEMORY.md: ${err instanceof Error ? err.message : err}` }],\n isError: true,\n };\n }\n }\n );\n\n // ── Tool 2: mindlink_write_memory ────────────────────────────────────────\n\n server.tool(\n 'mindlink_write_memory',\n 'Append a fact or decision to a section of MEMORY.md. Never overwrites existing content. Always include a <!-- added: YYYY-MM-DD --> timestamp.',\n {\n section: z.enum(['Core', 'Architecture', 'Decisions', 'Conventions', 'User Profile', 'Important Context'])\n .describe('Section to append to.'),\n content: z.string()\n .describe('The markdown content to append. Include <!-- added: YYYY-MM-DD --> timestamp.'),\n },\n async ({ section, content }) => {\n const projectPath = resolveProjectPath();\n if (!projectPath) {\n return {\n content: [{ type: 'text' as const, text: 'Error: No MindLink project found. Run mindlink init first.' }],\n isError: true,\n };\n }\n const memoryPath = join(projectPath, BRAIN_DIR, 'MEMORY.md');\n if (!existsSync(memoryPath)) {\n return {\n content: [{ type: 'text' as const, text: 'Error: MEMORY.md not found. Run mindlink init to create it.' }],\n isError: true,\n };\n }\n try {\n appendToSection(memoryPath, section, content);\n return { content: [{ type: 'text' as const, text: `✓ Appended to ## ${section} in MEMORY.md.` }] };\n } catch (err) {\n return {\n content: [{ type: 'text' as const, text: `Error writing MEMORY.md: ${err instanceof Error ? err.message : err}` }],\n isError: true,\n };\n }\n }\n );\n\n // ── Tool 3: mindlink_session_update ──────────────────────────────────────\n\n server.tool(\n 'mindlink_session_update',\n 'Update SESSION.md with the current session summary. Call this as the last action of every response.',\n {\n summary: z.string()\n .describe('Current task state — what was asked, what you answered, any decisions made, what\\'s next.'),\n },\n async ({ summary }) => {\n const projectPath = resolveProjectPath();\n if (!projectPath) {\n return {\n content: [{ type: 'text' as const, text: 'Error: No MindLink project found. Run mindlink init first.' }],\n isError: true,\n };\n }\n const sessionPath = join(projectPath, BRAIN_DIR, 'SESSION.md');\n try {\n const date = new Date().toISOString().slice(0, 10);\n const content = `# Session State\\n\\n<!-- Last updated: ${date} -->\\n\\n${summary.trim()}\\n`;\n writeFileSync(sessionPath, content);\n return { content: [{ type: 'text' as const, text: '✓ SESSION.md updated.' }] };\n } catch (err) {\n return {\n content: [{ type: 'text' as const, text: `Error writing SESSION.md: ${err instanceof Error ? err.message : err}` }],\n isError: true,\n };\n }\n }\n );\n\n // ── Tool 4: mindlink_verify ───────────────────────────────────────────────\n\n server.tool(\n 'mindlink_verify',\n 'Run a health check on .brain/. Returns pass/warn/fail status for each check. Call this to verify your memory writes succeeded.',\n {},\n async () => {\n const projectPath = resolveProjectPath();\n if (!projectPath) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ ok: false, error: 'No MindLink project found. Run mindlink init first.' }) }],\n isError: true,\n };\n }\n const checks = runChecks(projectPath);\n const ok = checks.every(c => c.status === 'pass');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ ok, checks }, null, 2) }],\n };\n }\n );\n\n // ── Connect ────────────────────────────────────────────────────────────────\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n });\n"],"mappings":"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","names":["Command","chalk","chalk","existsSync","mkdirSync","readFileSync","writeFileSync","join","dirname","join","homedir","join","existsSync","readFileSync","info","chalk","mkdirSync","dirname","writeFileSync","Command","chalk","existsSync","readFileSync","join","resolve","text","Command","resolve","join","existsSync","chalk","readFileSync","Command","chalk","existsSync","readFileSync","readdirSync","join","resolve","Command","resolve","join","existsSync","chalk","readFileSync","readdirSync","Command","chalk","existsSync","readFileSync","writeFileSync","join","resolve","Command","resolve","join","existsSync","chalk","writeFileSync","readFileSync","Command","isCancel","cancel","chalk","existsSync","readFileSync","writeFileSync","join","resolve","BRAIN_FILES","Command","resolve","join","existsSync","chalk","isCancel","cancel","writeFileSync","readFileSync","Command","select","multiselect","isCancel","chalk","existsSync","readFileSync","writeFileSync","appendFileSync","mkdirSync","unlinkSync","join","resolve","dirname","readFileSync","join","writeFileSync","existsSync","appendFileSync","mkdirSync","dirname","unlinkSync","Command","resolve","chalk","select","isCancel","multiselect","Command","chalk","existsSync","readFileSync","statSync","join","resolve","basename","existsSync","chalk","statSync","readFileSync","basename","Command","resolve","join","Command","select","isCancel","cancel","spinner","chalk","execSync","join","dirname","existsSync","readFileSync","writeFileSync","mkdirSync","resolve","Command","spinner","chalk","select","isCancel","cancel","execSync","existsSync","join","readFileSync","writeFileSync","mkdirSync","dirname","Command","chalk","existsSync","readFileSync","join","resolve","Command","resolve","join","existsSync","chalk","readFileSync","Command","select","isCancel","cancel","chalk","existsSync","readFileSync","unlinkSync","join","resolve","Command","resolve","join","existsSync","chalk","readFileSync","select","isCancel","cancel","unlinkSync","Command","text","isCancel","cancel","chalk","existsSync","readdirSync","join","resolve","basename","Command","resolve","join","existsSync","chalk","basename","text","isCancel","cancel","readdirSync","Command","select","isCancel","cancel","chalk","existsSync","mkdirSync","join","resolve","AdmZip","Command","resolve","join","existsSync","chalk","AdmZip","select","isCancel","cancel","mkdirSync","Command","chalk","existsSync","readFileSync","statSync","readdirSync","join","resolve","chalk","Command","resolve","join","existsSync","readFileSync","statSync","readdirSync","Command","chalk","Command","chalk","Command","chalk","existsSync","readFileSync","statSync","join","resolve","execSync","BRAIN_FILES","relativeTime","resolve","execSync","Command","join","existsSync","chalk","readFileSync","statSync","Command","chalk","existsSync","readFileSync","statSync","mkdirSync","writeFileSync","dirname","join","resolve","warn","fail","icon","chalk","join","existsSync","readFileSync","statSync","mkdirSync","dirname","writeFileSync","Command","resolve","Command","chalk","existsSync","readFileSync","writeFileSync","mkdirSync","execSync","existsSync","mkdirSync","writeFileSync","Command","chalk","readFileSync","execSync","Command","select","isCancel","chalk","existsSync","readFileSync","writeFileSync","join","resolve","Command","resolve","join","chalk","existsSync","readFileSync","select","isCancel","writeFileSync","Command","existsSync","readFileSync","writeFileSync","join","resolve","dirname","existsSync","join","resolve","dirname","readFileSync","writeFileSync","Command","join","existsSync","ok","Command","_","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/utils/version.ts","../src/commands/init.ts","../src/utils/paths.ts","../src/utils/banner.ts","../src/utils/agents.ts","../src/utils/registry.ts","../src/utils/content.ts","../src/commands/status.ts","../src/utils/parser.ts","../src/commands/log.ts","../src/commands/clear.ts","../src/commands/reset.ts","../src/commands/config.ts","../src/commands/sync.ts","../src/commands/update.ts","../src/commands/summary.ts","../src/commands/uninstall.ts","../src/commands/export.ts","../src/commands/import.ts","../src/commands/doctor.ts","../src/commands/version.ts","../src/commands/diff.ts","../src/commands/verify.ts","../src/commands/profile.ts","../src/commands/prune.ts","../src/commands/mcp.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { VERSION } from './utils/version.js';\nimport { initCommand } from './commands/init.js';\nimport { statusCommand } from './commands/status.js';\nimport { logCommand } from './commands/log.js';\nimport { clearCommand } from './commands/clear.js';\nimport { resetCommand } from './commands/reset.js';\nimport { configCommand } from './commands/config.js';\nimport { syncCommand } from './commands/sync.js';\nimport { updateCommand } from './commands/update.js';\nimport { summaryCommand } from './commands/summary.js';\nimport { uninstallCommand } from './commands/uninstall.js';\nimport { exportCommand } from './commands/export.js';\nimport { importCommand } from './commands/import.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { versionCommand } from './commands/version.js';\nimport { diffCommand } from './commands/diff.js';\nimport { verifyCommand } from './commands/verify.js';\nimport { profileCommand } from './commands/profile.js';\nimport { pruneCommand } from './commands/prune.js';\nimport { mcpCommand } from './commands/mcp.js';\n\nconst program = new Command();\n\nprogram\n .name('mindlink')\n .description('Give your AI a brain.')\n .version(VERSION, '-v, --version');\n\nprogram.addCommand(initCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(logCommand);\nprogram.addCommand(clearCommand);\nprogram.addCommand(resetCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(syncCommand);\nprogram.addCommand(updateCommand);\nprogram.addCommand(summaryCommand);\nprogram.addCommand(uninstallCommand);\nprogram.addCommand(exportCommand);\nprogram.addCommand(importCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(versionCommand);\nprogram.addCommand(diffCommand);\nprogram.addCommand(verifyCommand);\nprogram.addCommand(profileCommand);\nprogram.addCommand(pruneCommand);\nprogram.addCommand(mcpCommand);\n\n// \"Did you mean?\" on unknown commands\nprogram.on('command:*', (operands: string[]) => {\n const unknown = operands[0];\n const known = ['init', 'status', 'log', 'clear', 'reset', 'config', 'sync', 'update', 'summary', 'uninstall', 'export', 'import', 'doctor', 'version', 'diff', 'verify', 'profile', 'prune', 'mcp'];\n\n // Simple Levenshtein-based suggestion\n function levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, (_, i) =>\n Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0))\n );\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] = a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n }\n\n const closest = known\n .map(cmd => ({ cmd, dist: levenshtein(unknown, cmd) }))\n .sort((a, b) => a.dist - b.dist)[0];\n\n console.log('');\n console.log(` ${chalk.red('✗')} Unknown command: ${chalk.bold(unknown)}`);\n if (closest && closest.dist <= 3) {\n console.log(` Did you mean ${chalk.cyan('mindlink ' + closest.cmd)}?`);\n }\n console.log(` Run ${chalk.cyan('mindlink --help')} to see all commands.`);\n console.log('');\n process.exit(1);\n});\n\nprogram.parse();\n","export const VERSION = '2.0.2';\n","import { Command } from 'commander';\nimport {\n intro,\n multiselect,\n select,\n spinner,\n note,\n cancel,\n isCancel,\n} from '@clack/prompts';\nimport chalk from 'chalk';\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n appendFileSync,\n readdirSync,\n} from 'fs';\nimport { execSync } from 'child_process';\nimport { join, resolve, dirname, basename } from 'path';\nimport { BRAIN_TEMPLATES_DIR, AGENT_TEMPLATES_DIR, HOOKS_TEMPLATES_DIR, BRAIN_DIR, GLOBAL_USER_PROFILE_PATH, GLOBAL_WINDSURF_MCP_PATH } from '../utils/paths.js';\nimport { printBanner } from '../utils/banner.js';\nimport { AGENTS } from '../utils/agents.js';\nimport { registerProject } from '../utils/registry.js';\nimport { sectionHasRealContent } from '../utils/content.js';\n\ninterface ProjectInfo {\n name: string;\n description: string;\n stack: string;\n recentActivity: string;\n topDirs: string;\n date: string;\n}\n\nfunction detectProjectInfo(projectPath: string): ProjectInfo {\n const date = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n\n let name = basename(projectPath);\n let description = '';\n let stack = '';\n let recentActivity = '';\n let topDirs = '';\n\n // Try package.json\n const pkgPath = join(projectPath, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n if (pkg.name) name = pkg.name;\n if (pkg.description) description = pkg.description;\n // Derive stack from package.json deps\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n const layers: string[] = ['Node.js'];\n if (deps['typescript'] || deps['ts-node'] || deps['tsup']) layers.push('TypeScript');\n if (deps['react'] || deps['next']) layers.push(deps['next'] ? 'Next.js' : 'React');\n if (deps['express'] || deps['fastify'] || deps['koa']) layers.push('Express/Fastify');\n if (deps['vite']) layers.push('Vite');\n stack = layers.join(' + ');\n } catch {}\n }\n\n // Detect stack from manifest files (if no package.json)\n if (!stack) {\n if (existsSync(join(projectPath, 'Cargo.toml'))) stack = 'Rust';\n else if (existsSync(join(projectPath, 'go.mod'))) stack = 'Go';\n else if (existsSync(join(projectPath, 'pyproject.toml')) || existsSync(join(projectPath, 'requirements.txt'))) stack = 'Python';\n else if (existsSync(join(projectPath, 'pom.xml'))) stack = 'Java (Maven)';\n else if (existsSync(join(projectPath, 'build.gradle')) || existsSync(join(projectPath, 'build.gradle.kts'))) stack = 'Kotlin/Java (Gradle)';\n else if (existsSync(join(projectPath, 'composer.json'))) stack = 'PHP';\n else if (existsSync(join(projectPath, 'Gemfile'))) stack = 'Ruby';\n }\n\n // Read README for description if not found yet\n if (!description) {\n const readmePath = join(projectPath, 'README.md');\n if (existsSync(readmePath)) {\n try {\n const lines = readFileSync(readmePath, 'utf8').split('\\n');\n // Find first non-heading, non-empty line as description\n for (const line of lines.slice(0, 30)) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('!') && !trimmed.startsWith('<') && trimmed.length > 10) {\n description = trimmed.replace(/\\*\\*/g, '').slice(0, 120);\n break;\n }\n }\n } catch {}\n }\n }\n\n // Get recent git activity\n try {\n const log = execSync('git log --oneline -5', { cwd: projectPath, encoding: 'utf8', stdio: ['pipe','pipe','pipe'] }).trim();\n if (log) {\n recentActivity = log.split('\\n').slice(0, 3).join(' · ');\n }\n } catch {}\n\n // Top-level dirs (skip hidden, node_modules, dist, etc.)\n const SKIP_DIRS = new Set(['.git', 'node_modules', 'dist', 'build', '.brain', 'binaries', '.cache', 'coverage', '.next', 'out']);\n try {\n const entries = readdirSync(projectPath, { withFileTypes: true });\n const dirs = entries\n .filter(e => e.isDirectory() && !SKIP_DIRS.has(e.name) && !e.name.startsWith('.'))\n .map(e => e.name)\n .slice(0, 6);\n if (dirs.length > 0) topDirs = dirs.join(', ');\n } catch {}\n\n return { name, description, stack, recentActivity, topDirs, date };\n}\n\n/** Returns true if MEMORY.md has at least one real (non-comment, non-heading, non-empty) line */\nfunction memoryHasRealContent(memoryPath: string): boolean {\n try {\n const lines = readFileSync(memoryPath, 'utf8').split('\\n');\n return lines.some(line => {\n const t = line.trim();\n return t.length > 0 && !t.startsWith('#') && !t.startsWith('<!--') && !t.startsWith('>') && !t.startsWith('|') && t !== '---';\n });\n } catch {\n return false;\n }\n}\n\n/** Inject global user profile into the ## User Profile section of MEMORY.md */\nfunction injectUserProfile(memoryContent: string, profileContent: string): string {\n // Strip the profile file header (# MindLink — Global User Profile + > lines)\n const profileLines = profileContent.split('\\n');\n const contentStart = profileLines.findIndex(l => {\n const t = l.trim();\n return t.length > 0 && !t.startsWith('#') && !t.startsWith('>') && !t.startsWith('<!--');\n });\n const profileBody = contentStart >= 0 ? profileLines.slice(contentStart).join('\\n').trim() : '';\n if (!profileBody) return memoryContent;\n\n // Find ## User Profile section and inject after its heading + comments\n const lines = memoryContent.split('\\n');\n let insertAt = -1;\n let inProfile = false;\n let profileHeadingLevel = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^(#{1,6})\\s+(.+)/);\n if (match) {\n const level = match[1].length;\n const title = match[2].replace(/<!--.*?-->/g, '').trim();\n if (title.toLowerCase() === 'user profile') {\n inProfile = true;\n profileHeadingLevel = level;\n continue;\n }\n if (inProfile && level <= profileHeadingLevel) {\n // Next section — insert before this line\n insertAt = i;\n break;\n }\n }\n if (inProfile && insertAt < 0 && i === lines.length - 1) {\n insertAt = lines.length;\n }\n }\n\n if (insertAt < 0) return memoryContent;\n\n // Insert profile body before the next section (or end of file)\n lines.splice(insertAt, 0, profileBody, '');\n return lines.join('\\n');\n}\n\nfunction buildMemoryMd(templateContent: string, info: ProjectInfo): string {\n let content = templateContent;\n\n // Inject project name + description under \"What this project is\"\n const whatLine = info.description\n ? `**${info.name}** — ${info.description}`\n : `**${info.name}**`;\n content = content.replace(\n /### What this project is\\n<!--[^]*?-->/,\n `### What this project is\\n${whatLine}\\n<!-- 2–3 lines: what it does, who it's for, what problem it solves -->`\n );\n\n // Inject detected stack under \"Stack\"\n if (info.stack) {\n content = content.replace(\n /### Stack\\n<!--[^]*?-->/,\n `### Stack\\n${info.stack}\\n<!-- Add layers: Frontend, Backend, Infra, etc. -->`\n );\n }\n\n // Inject top dirs and recent activity under \"Current focus\"\n const focusLines: string[] = [];\n if (info.topDirs) focusLines.push(`Directories: ${info.topDirs}`);\n if (info.recentActivity) focusLines.push(`Recent commits: ${info.recentActivity}`);\n const focusBlock = focusLines.length > 0\n ? focusLines.join('\\n') + `\\n<!-- Initialized ${info.date} — update to reflect the current active focus -->`\n : `<!-- Initialized ${info.date} — ask your AI to fill this in after your first session -->`;\n content = content.replace(\n /### Current focus\\n<!--[^]*?-->/,\n `### Current focus\\n${focusBlock}`\n );\n\n return content;\n}\n\nconst BRAIN_FILES = [\n { templateFile: 'MEMORY.md', label: '.brain/MEMORY.md', desc: 'permanent project facts' },\n { templateFile: 'SESSION.md', label: '.brain/SESSION.md', desc: 'current session state' },\n { templateFile: 'SHARED.md', label: '.brain/SHARED.md', desc: 'shared across sessions' },\n { templateFile: 'LOG.md', label: '.brain/LOG.md', desc: 'full session history' },\n];\n\nconst DEFAULT_MAX_LOG_ENTRIES = 50;\n\n\nexport const initCommand = new Command('init')\n .description('Set up memory for the current project')\n .option('-y, --yes', 'Skip all prompts, use defaults')\n .addHelpText('after', `\nExamples:\n mindlink init\n mindlink init --yes\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n printBanner();\n\n // --- Already initialized? ---\n if (existsSync(brainDir)) {\n const memoryPath = join(brainDir, 'MEMORY.md');\n const hasMemory = existsSync(memoryPath) && memoryHasRealContent(memoryPath);\n\n // Team onboarding mode: .brain/ exists with real content but no agent files for this user\n if (!opts.yes && hasMemory) {\n const hasAnyAgentFile = AGENTS.some(a => existsSync(join(projectPath, a.destFile)));\n if (!hasAnyAgentFile) {\n console.log('');\n console.log(` ${chalk.cyan('◉')} MindLink memory found in this project.`);\n console.log(` ${chalk.dim('MEMORY.md has content — this looks like a team project.')}`);\n console.log('');\n\n const action = await select({\n message: 'What would you like to do?',\n options: [\n { value: 'restore', label: 'Set up agent files', hint: 'recommended for new team members — writes CLAUDE.md, .cursorrules, etc.' },\n { value: 'reinit', label: 'Full re-init', hint: 'recreate everything, reconfigure settings' },\n { value: 'exit', label: 'Cancel', hint: '' },\n ],\n });\n\n if (isCancel(action) || action === 'exit') { process.exit(0); }\n\n if (action === 'restore') {\n // Just write agent instruction files — skip all config prompts\n const agentChoices = AGENTS.map(a => ({\n value: a.value,\n label: `${a.label.padEnd(18)} ${chalk.dim(a.hint)}`,\n hint: a.selected ? 'recommended' : undefined,\n }));\n const agentResult = await multiselect({\n message: 'Which AI agents do you use?',\n options: agentChoices,\n initialValues: AGENTS.filter(a => a.selected).map(a => a.value),\n required: false,\n });\n if (isCancel(agentResult)) { cancel('Cancelled.'); process.exit(0); }\n\n const toRestore = agentResult as string[];\n const restored: string[] = [];\n for (const agentValue of toRestore) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n restored.push(agent.destFile);\n }\n if (toRestore.includes('claude')) {\n const hookDest = join(projectPath, '.claude', 'settings.json');\n if (!existsSync(hookDest)) {\n mkdirSync(dirname(hookDest), { recursive: true });\n const settings = JSON.parse(readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n writeFileSync(hookDest, JSON.stringify(settings, null, 2));\n restored.push('.claude/settings.json');\n }\n const mcpJsonDest = join(projectPath, '.mcp.json');\n if (!existsSync(mcpJsonDest)) {\n const mcpJson = {\n mcpServers: {\n mindlink: { type: 'stdio', command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(mcpJsonDest, JSON.stringify(mcpJson, null, 2));\n restored.push('.mcp.json');\n }\n }\n\n // Write config.json if missing — needed so mindlink update tracks this project\n const configPath = join(brainDir, 'config.json');\n if (!existsSync(configPath)) {\n const config = {\n gitTracking: true,\n autoSync: true,\n agents: toRestore,\n maxLogEntries: DEFAULT_MAX_LOG_ENTRIES,\n };\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n restored.push('.brain/config.json');\n }\n\n // Register with project registry so update/sync can find it\n try { registerProject(projectPath); } catch {}\n\n console.log('');\n for (const f of restored) console.log(` ${chalk.green('✓')} ${f}`);\n console.log('');\n console.log(` ${chalk.green('✓')} Agent files ready. Start a new session — your AI is already briefed.`);\n console.log('');\n process.exit(0);\n }\n\n // action === 'reinit' — fall through to normal init flow below\n // Remove brainDir so the rest of init proceeds fresh\n // (we don't remove it — we'll overwrite files in place)\n } else {\n // Already fully initialized for this user\n if (opts.yes) {\n console.log(` ${chalk.red('✗')} Already initialized at this path.`);\n console.log(` Run ${chalk.cyan('mindlink config')} to change settings.`);\n console.log('');\n process.exit(1);\n }\n\n const action = await select({\n message: '.brain/ already exists at this path. What would you like to do?',\n options: [\n { value: 'config', label: 'Change settings', hint: 'mindlink config' },\n { value: 'status', label: 'View current status', hint: 'mindlink status' },\n { value: 'exit', label: 'Nothing — exit', hint: '' },\n ],\n });\n\n if (isCancel(action) || action === 'exit') { process.exit(0); }\n if (action === 'status') {\n try { execSync('mindlink status', { cwd: projectPath, stdio: 'inherit' }); } catch {}\n }\n if (action === 'config') {\n console.log(` Run ${chalk.cyan('mindlink config')} to change settings.`);\n }\n console.log('');\n process.exit(0);\n }\n } else if (opts.yes) {\n // --yes flag on already-initialized project: error out\n console.log(` ${chalk.red('✗')} Already initialized at this path.`);\n console.log(` Run ${chalk.cyan('mindlink config')} to change settings.`);\n console.log('');\n process.exit(1);\n } else if (!hasMemory) {\n // .brain/ exists but is empty — treat as re-init, fall through\n } else {\n const action = await select({\n message: '.brain/ already exists at this path. What would you like to do?',\n options: [\n { value: 'config', label: 'Change settings', hint: 'mindlink config' },\n { value: 'status', label: 'View current status', hint: 'mindlink status' },\n { value: 'exit', label: 'Nothing — exit', hint: '' },\n ],\n });\n if (isCancel(action) || action === 'exit') { process.exit(0); }\n if (action === 'status') {\n try { execSync('mindlink status', { cwd: projectPath, stdio: 'inherit' }); } catch {}\n }\n if (action === 'config') {\n console.log(` Run ${chalk.cyan('mindlink config')} to change settings.`);\n }\n console.log('');\n process.exit(0);\n }\n }\n\n intro(chalk.bold('Initializing memory for this project:'));\n console.log(` ${chalk.dim(projectPath)}`);\n console.log(` ${chalk.dim('This creates a .brain/ folder scoped to this project only.')}`);\n console.log(` ${chalk.dim('Run mindlink init once per project — never needs to be run again.')}`);\n console.log('');\n\n // Windows warning: hooks are bash scripts, won't run on Windows\n if (process.platform === 'win32') {\n console.log(` ${chalk.yellow('⚠')} ${chalk.bold('Windows detected')}`);\n console.log(` Claude Code hooks use bash and won't run on Windows.`);\n console.log(` Memory enforcement (Stop hook, session timestamps) will be disabled.`);\n console.log(` All other features work normally.`);\n console.log('');\n }\n\n // --- Prompt 1: Agent selection ---\n let selectedAgents: string[];\n\n if (opts.yes) {\n selectedAgents = AGENTS.filter(a => a.selected).map(a => a.value);\n } else {\n const agentChoices = AGENTS.map(a => ({\n value: a.value,\n label: `${a.label.padEnd(18)} ${chalk.dim(a.hint)}`,\n hint: a.selected ? 'recommended' : undefined,\n }));\n\n const agentResult = await multiselect({\n message: 'Which AI agents do you use?',\n options: agentChoices,\n initialValues: AGENTS.filter(a => a.selected).map(a => a.value),\n required: false,\n });\n\n if (isCancel(agentResult)) { cancel('Cancelled.'); process.exit(0); }\n selectedAgents = agentResult as string[];\n console.log(` ${chalk.dim('↩ Add or remove agents anytime: mindlink config → Agent instruction files')}`);\n console.log('');\n }\n\n // --- Prompt 2: Git tracking ---\n let gitTracking: boolean;\n\n if (opts.yes) {\n gitTracking = true;\n } else {\n console.log(` ${chalk.dim('.brain/ is your AI\\'s memory — MEMORY.md, SESSION.md, SHARED.md, LOG.md.')}`);\n console.log(` ${chalk.dim('Plain Markdown files. Commit them to share with your team, or keep them local.')}`);\n console.log('');\n const gitResult = await select({\n message: 'Should .brain/ be committed to git?',\n options: [\n { value: 'enable', label: 'Enable', hint: 'team shares the same AI memory' },\n { value: 'disable', label: 'Disable', hint: 'add to .gitignore — personal memory only' },\n ],\n });\n if (isCancel(gitResult)) { cancel('Cancelled.'); process.exit(0); }\n gitTracking = gitResult === 'enable';\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Git tracking')}`);\n console.log('');\n }\n\n // --- Prompt 3: Auto-sync ---\n let autoSync: boolean;\n\n if (opts.yes) {\n autoSync = true;\n } else {\n const syncResult = await select({\n message: 'Auto-sync between sessions?',\n options: [\n { value: 'enable', label: 'Enable', hint: 'watch for changes, sync automatically (recommended)' },\n { value: 'disable', label: 'Disable', hint: 'run mindlink sync manually when needed' },\n ],\n });\n if (isCancel(syncResult)) { cancel('Cancelled.'); process.exit(0); }\n autoSync = syncResult === 'enable';\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Auto-sync')}`);\n console.log('');\n }\n\n // --- Create files ---\n const s = spinner();\n s.start('Creating memory files...');\n\n const created: string[] = [];\n const errors: string[] = [];\n\n try {\n mkdirSync(brainDir, { recursive: true });\n try { registerProject(projectPath); } catch {}\n\n const projectInfo = detectProjectInfo(projectPath);\n\n // .brain/ template files\n for (const file of BRAIN_FILES) {\n const dest = join(brainDir, file.templateFile);\n const templateContent = readFileSync(join(BRAIN_TEMPLATES_DIR, file.templateFile), 'utf8');\n const content = file.templateFile === 'MEMORY.md'\n ? buildMemoryMd(templateContent, projectInfo)\n : templateContent;\n writeFileSync(dest, content);\n created.push(`${file.label.padEnd(32)} ${chalk.dim(file.desc)}`);\n }\n\n // Import global user profile into User Profile section if it exists\n const memoryDest = join(brainDir, 'MEMORY.md');\n if (existsSync(GLOBAL_USER_PROFILE_PATH)) {\n const profileContent = readFileSync(GLOBAL_USER_PROFILE_PATH, 'utf8');\n if (sectionHasRealContent(profileContent, 'MindLink — Global User Profile') ||\n profileContent.split('\\n').some(l => { const t = l.trim(); return t.length > 0 && !t.startsWith('#') && !t.startsWith('>') && !t.startsWith('<!--'); })) {\n const injected = injectUserProfile(readFileSync(memoryDest, 'utf8'), profileContent);\n writeFileSync(memoryDest, injected);\n created.push(`User Profile imported from ~/.mindlink/USER.md`);\n }\n }\n\n // Agent instruction files\n for (const agentValue of selectedAgents) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n created.push(`${agent.destFile.padEnd(32)} ${chalk.dim(agent.label)}`);\n }\n\n // .claude/settings.json hook for Claude Code (hooks + permissions only)\n if (selectedAgents.includes('claude')) {\n const hookDest = join(projectPath, '.claude', 'settings.json');\n if (!existsSync(hookDest)) {\n mkdirSync(dirname(hookDest), { recursive: true });\n const settings = JSON.parse(readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n writeFileSync(hookDest, JSON.stringify(settings, null, 2));\n created.push(`.claude/settings.json${' '.repeat(14)} ${chalk.dim('Claude Code hooks')}`);\n }\n // .mcp.json — Claude Code CLI reads MCP servers from here (not settings.json)\n const mcpJsonDest = join(projectPath, '.mcp.json');\n if (!existsSync(mcpJsonDest)) {\n const mcpJson = {\n mcpServers: {\n mindlink: { type: 'stdio', command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(mcpJsonDest, JSON.stringify(mcpJson, null, 2));\n created.push(`.mcp.json${' '.repeat(24)} ${chalk.dim('Claude Code MCP server')}`);\n }\n }\n\n // Cursor: .cursor/mcp.json (project-level MCP config, type: stdio required)\n if (selectedAgents.includes('cursor')) {\n const cursorMcpDest = join(projectPath, '.cursor', 'mcp.json');\n if (!existsSync(cursorMcpDest)) {\n mkdirSync(join(projectPath, '.cursor'), { recursive: true });\n const cursorMcp = { mcpServers: { mindlink: { type: 'stdio', command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(cursorMcpDest, JSON.stringify(cursorMcp, null, 2));\n created.push(`.cursor/mcp.json${' '.repeat(20)} ${chalk.dim('Cursor MCP server')}`);\n }\n }\n\n // Continue.dev: .continue/mcpServers/mindlink.json (project-level MCP config)\n if (selectedAgents.includes('continue')) {\n const continueMcpDest = join(projectPath, '.continue', 'mcpServers', 'mindlink.json');\n if (!existsSync(continueMcpDest)) {\n mkdirSync(join(projectPath, '.continue', 'mcpServers'), { recursive: true });\n const continueMcp = { mcpServers: { mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(continueMcpDest, JSON.stringify(continueMcp, null, 2));\n created.push(`.continue/mcpServers/mindlink.json ${chalk.dim('Continue MCP server')}`);\n }\n }\n\n // GitHub Copilot: .vscode/mcp.json (VS Code uses \"servers\" key, not \"mcpServers\")\n if (selectedAgents.includes('copilot')) {\n const copilotMcpDest = join(projectPath, '.vscode', 'mcp.json');\n if (!existsSync(copilotMcpDest)) {\n mkdirSync(join(projectPath, '.vscode'), { recursive: true });\n const copilotMcp = { servers: { mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(copilotMcpDest, JSON.stringify(copilotMcp, null, 2));\n created.push(`.vscode/mcp.json${' '.repeat(19)} ${chalk.dim('GitHub Copilot MCP server')}`);\n }\n }\n\n // Kiro: .kiro/settings/mcp.json (project-level MCP config, separate from steering file)\n if (selectedAgents.includes('kiro')) {\n const kiroMcpDest = join(projectPath, '.kiro', 'settings', 'mcp.json');\n if (!existsSync(kiroMcpDest)) {\n mkdirSync(join(projectPath, '.kiro', 'settings'), { recursive: true });\n const kiroMcp = { mcpServers: { mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(kiroMcpDest, JSON.stringify(kiroMcp, null, 2));\n created.push(`.kiro/settings/mcp.json${' '.repeat(13)} ${chalk.dim('Kiro MCP server')}`);\n }\n }\n\n // Windsurf: ~/.codeium/windsurf/mcp_config.json (global config — merge, no project path)\n // Windsurf only supports global MCP config; project resolution uses cwd walk-up at runtime.\n if (selectedAgents.includes('windsurf')) {\n try {\n mkdirSync(dirname(GLOBAL_WINDSURF_MCP_PATH), { recursive: true });\n let existingWindsurf: Record<string, unknown> = {};\n if (existsSync(GLOBAL_WINDSURF_MCP_PATH)) {\n try { existingWindsurf = JSON.parse(readFileSync(GLOBAL_WINDSURF_MCP_PATH, 'utf8')); } catch {}\n }\n const mergedWindsurf = {\n ...existingWindsurf,\n mcpServers: {\n ...(typeof existingWindsurf.mcpServers === 'object' && existingWindsurf.mcpServers !== null\n ? existingWindsurf.mcpServers as Record<string, unknown>\n : {}),\n mindlink: { command: 'mindlink', args: ['mcp'] },\n },\n };\n writeFileSync(GLOBAL_WINDSURF_MCP_PATH, JSON.stringify(mergedWindsurf, null, 2));\n created.push(`~/.codeium/windsurf/mcp_config.json ${chalk.dim('Windsurf MCP server (global)')}`);\n } catch {}\n }\n\n // .gitignore\n if (!gitTracking) {\n const gitignorePath = join(projectPath, '.gitignore');\n const entry = '\\n# MindLink memory (personal — not shared with team)\\n.brain/\\n';\n if (existsSync(gitignorePath)) {\n const current = readFileSync(gitignorePath, 'utf8');\n if (!current.includes('.brain/')) appendFileSync(gitignorePath, entry);\n } else {\n writeFileSync(gitignorePath, entry.trim() + '\\n');\n }\n created.push(`.gitignore${' '.repeat(23)} ${chalk.dim('.brain/ excluded')}`);\n }\n\n // Save config (includes maxLogEntries for log rotation)\n const config = {\n gitTracking,\n autoSync,\n agents: selectedAgents,\n maxLogEntries: DEFAULT_MAX_LOG_ENTRIES,\n };\n writeFileSync(join(brainDir, 'config.json'), JSON.stringify(config, null, 2));\n\n } catch (err: unknown) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n\n s.stop('Done.');\n console.log('');\n\n for (const line of created) {\n console.log(` ${chalk.green('✓')} ${line}`);\n }\n if (errors.length > 0) {\n console.log('');\n for (const err of errors) console.log(` ${chalk.red('✗')} ${err}`);\n }\n\n // Cline hint — MCP config can't be auto-written (VS Code internal storage)\n if (selectedAgents.includes('cline')) {\n console.log(` ${chalk.yellow('→')} Cline: add the MCP server manually in Cline's settings UI (MCP Servers tab)`);\n console.log(` ${chalk.dim('Command: mindlink Args: mcp Env: MINDLINK_PROJECT_PATH=' + projectPath)}`);\n console.log('');\n }\n\n // Hint about global profile if not yet set up\n if (!existsSync(GLOBAL_USER_PROFILE_PATH)) {\n console.log(` ${chalk.dim('→')} Run ${chalk.cyan('mindlink profile')} to set up a global user profile — imported into every new project automatically.`);\n console.log('');\n }\n\n note(\n `Your AI finally has a brain.\\n\\nEvery new session wakes up knowing the project, past decisions,\\ncurrent task, and what other sessions have shared. No more\\nre-explaining from scratch. No more goldfish moments.\\n\\nLike any good brain, it remembers what matters and quietly\\nlets go of the old stuff — that's what MEMORY.md is for:\\npromote anything important there and it stays forever.\\n\\nStart a new AI session — it'll hit the ground running.\\n\\nRun ${chalk.cyan('mindlink help')} to see all commands.`,\n '◉ MindLink active'\n );\n console.log('');\n });\n","import { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { homedir } from 'os';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Root of dist/ — templates live at dist/templates/\nexport const TEMPLATES_DIR = join(__dirname, 'templates');\n\nexport const BRAIN_TEMPLATES_DIR = join(TEMPLATES_DIR, 'brain');\nexport const AGENT_TEMPLATES_DIR = join(TEMPLATES_DIR, 'agents');\nexport const HOOKS_TEMPLATES_DIR = join(TEMPLATES_DIR, 'hooks');\n\nexport const BRAIN_DIR = '.brain';\n\n// Global MindLink directory — cross-project user profile lives here\nexport const GLOBAL_MINDLINK_DIR = join(homedir(), '.mindlink');\nexport const GLOBAL_USER_PROFILE_PATH = join(GLOBAL_MINDLINK_DIR, 'USER.md');\n\n// Windsurf global MCP config (Windsurf only supports global, not project-level)\nexport const GLOBAL_WINDSURF_MCP_PATH = join(homedir(), '.codeium', 'windsurf', 'mcp_config.json');\n","import chalk from 'chalk';\n\nexport function printBanner(): void {\n console.log('');\n console.log(chalk.dim(' ≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋'));\n console.log(` ${chalk.cyan('◉')} ${chalk.bold('M I N D L I N K')}`);\n console.log(chalk.dim(' ≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋≋'));\n console.log('');\n}\n","export interface AgentDef {\n value: string;\n label: string;\n hint: string;\n templateFile: string;\n destFile: string;\n selected: boolean;\n}\n\nexport const AGENTS: AgentDef[] = [\n { value: 'claude', label: 'Claude Code', hint: 'CLAUDE.md', templateFile: 'CLAUDE.md', destFile: 'CLAUDE.md', selected: true },\n { value: 'cursor', label: 'Cursor', hint: 'CURSOR.md', templateFile: 'CURSOR.md', destFile: 'CURSOR.md', selected: true },\n { value: 'codex', label: 'Codex / OpenAI', hint: 'AGENTS.md', templateFile: 'AGENTS.md', destFile: 'AGENTS.md', selected: true },\n { value: 'gemini', label: 'Gemini CLI', hint: 'GEMINI.md', templateFile: 'GEMINI.md', destFile: 'GEMINI.md', selected: true },\n { value: 'copilot', label: 'GitHub Copilot', hint: '.github/copilot-instructions.md', templateFile: 'copilot-instructions.md', destFile: '.github/copilot-instructions.md', selected: true },\n { value: 'windsurf', label: 'Windsurf', hint: '.windsurfrules', templateFile: '.windsurfrules', destFile: '.windsurfrules', selected: true },\n { value: 'cline', label: 'Cline', hint: '.clinerules', templateFile: '.clinerules', destFile: '.clinerules', selected: false },\n { value: 'aider', label: 'Aider', hint: 'CONVENTIONS.md', templateFile: 'CONVENTIONS.md', destFile: 'CONVENTIONS.md', selected: false },\n { value: 'zed', label: 'Zed', hint: '.rules', templateFile: '.rules', destFile: '.rules', selected: false },\n { value: 'kiro', label: 'Kiro', hint: '.kiro/steering/mindlink.md', templateFile: 'kiro-steering.md', destFile: '.kiro/steering/mindlink.md', selected: false },\n { value: 'continue', label: 'Continue.dev', hint: '.continue/rules/mindlink.md', templateFile: 'continue-rules.md', destFile: '.continue/rules/mindlink.md', selected: false },\n { value: 'trae', label: 'Trae', hint: '.trae/rules/mindlink.md', templateFile: 'trae-rules.md', destFile: '.trae/rules/mindlink.md', selected: false },\n];\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nconst REGISTRY_DIR = join(homedir(), '.mindlink');\nconst REGISTRY_PATH = join(REGISTRY_DIR, 'projects.json');\n\nfunction load(): string[] {\n try {\n return JSON.parse(readFileSync(REGISTRY_PATH, 'utf8'));\n } catch {\n return [];\n }\n}\n\nfunction save(paths: string[]): void {\n mkdirSync(REGISTRY_DIR, { recursive: true });\n writeFileSync(REGISTRY_PATH, JSON.stringify(paths, null, 2));\n}\n\nexport function registerProject(projectPath: string): void {\n const paths = load();\n if (!paths.includes(projectPath)) {\n paths.push(projectPath);\n save(paths);\n }\n}\n\nexport function getRegisteredProjects(): string[] {\n return load();\n}\n\nexport function pruneRegistry(isValid: (p: string) => boolean): void {\n const paths = load();\n const pruned = paths.filter(isValid);\n if (pruned.length !== paths.length) save(pruned);\n}\n","/**\n * Returns true if a markdown section (by heading name) has at least one real\n * (non-comment, non-heading, non-empty, non-horizontal-rule, non-table-divider) line.\n */\nexport function sectionHasRealContent(markdown: string, heading: string): boolean {\n const lines = markdown.split('\\n');\n let inSection = false;\n let headingLevel = 0;\n\n for (const line of lines) {\n const match = line.match(/^(#{1,6})\\s+(.+)/);\n\n if (match) {\n const level = match[1].length;\n const title = match[2].replace(/<!--.*?-->/g, '').trim();\n\n if (title.toLowerCase() === heading.toLowerCase()) {\n inSection = true;\n headingLevel = level;\n continue;\n }\n\n if (inSection && level <= headingLevel) {\n break;\n }\n }\n\n if (inSection) {\n const t = line.trim();\n if (\n t.length > 0 &&\n !t.startsWith('#') &&\n !t.startsWith('<!--') &&\n !t.startsWith('>') &&\n !t.startsWith('|') &&\n t !== '---'\n ) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Replace the body of a markdown section (identified by heading name) with new content.\n * The heading line itself is preserved. Returns the modified markdown.\n * If the section is not found, returns the original content unchanged.\n */\nexport function replaceSection(markdown: string, heading: string, newBody: string): string {\n const lines = markdown.split('\\n');\n let headingIdx = -1;\n let nextSectionIdx = lines.length;\n let headingLevel = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^(#{1,6})\\s+(.+)/);\n if (match) {\n const level = match[1].length;\n const title = match[2].replace(/<!--.*?-->/g, '').trim();\n if (headingIdx < 0 && title.toLowerCase() === heading.toLowerCase()) {\n headingIdx = i;\n headingLevel = level;\n } else if (headingIdx >= 0 && level <= headingLevel) {\n nextSectionIdx = i;\n break;\n }\n }\n }\n\n if (headingIdx < 0) return markdown;\n\n const before = lines.slice(0, headingIdx + 1);\n const after = lines.slice(nextSectionIdx);\n return [...before, '', newBody.trim(), '', ...after].join('\\n');\n}\n\n/**\n * Counts real (non-comment, non-heading, non-empty, non-horizontal-rule) lines in a markdown string.\n */\nexport function countRealLines(markdown: string): number {\n return markdown.split('\\n').filter(line => {\n const t = line.trim();\n return (\n t.length > 0 &&\n !t.startsWith('#') &&\n !t.startsWith('<!--') &&\n !t.startsWith('>') &&\n t !== '---'\n );\n }).length;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport { join, resolve } from 'path';\nimport {\n extractSection,\n extractBullets,\n countLogEntries,\n lastLogDate,\n countDecisions,\n relativeTime,\n} from '../utils/parser.js';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nexport const statusCommand = new Command('status')\n .description('Show last session summary and what\\'s next')\n .option('--json', 'Output as JSON')\n .addHelpText('after', `\nExamples:\n mindlink status\n mindlink status --json\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n // Not initialized?\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const sessionPath = join(brainDir, 'SESSION.md');\n const logPath = join(brainDir, 'LOG.md');\n const memoryPath = join(brainDir, 'MEMORY.md');\n\n const sessionMd = existsSync(sessionPath) ? readFileSync(sessionPath, 'utf8') : '';\n const logMd = existsSync(logPath) ? readFileSync(logPath, 'utf8') : '';\n const memoryMd = existsSync(memoryPath) ? readFileSync(memoryPath, 'utf8') : '';\n\n // Parse SESSION.md — strip comment placeholders\n const rawTask = extractSection(sessionMd, 'Current Task');\n const currentTask = rawTask.startsWith('<!--') ? '' : rawTask;\n const inProgress = extractBullets(extractSection(sessionMd, 'In Progress'));\n const decisions = extractBullets(extractSection(sessionMd, 'Decisions Made This Session'));\n const blockers = extractBullets(extractSection(sessionMd, 'Blockers'));\n const upNext = extractBullets(extractSection(sessionMd, 'Up Next'));\n\n // Parse LOG.md\n const sessionCount = countLogEntries(logMd);\n const lastSession = lastLogDate(logMd);\n\n // Parse MEMORY.md\n const decisionCount = countDecisions(memoryMd);\n\n // Last updated\n const lastUpdated = existsSync(sessionPath)\n ? relativeTime(statSync(sessionPath).mtime)\n : 'never';\n\n const isEmpty =\n !currentTask &&\n inProgress.length === 0 &&\n decisions.length === 0 &&\n blockers.length === 0 &&\n upNext.length === 0 &&\n sessionCount === 0;\n\n // ── JSON output ───────────────────────────────────────────────────────────\n if (opts.json) {\n console.log(JSON.stringify({\n currentTask,\n inProgress,\n decisions,\n blockers,\n upNext,\n stats: { sessionsLogged: sessionCount, decisionsMade: decisionCount, lastUpdated },\n }, null, 2));\n return;\n }\n\n // ── Human output ──────────────────────────────────────────────────────────\n console.log('');\n\n if (isEmpty) {\n console.log(` ${chalk.dim('No sessions logged yet.')}`);\n console.log(` Start an AI session — it will read ${chalk.cyan('.brain/')} automatically.`);\n console.log('');\n return;\n }\n\n // Last session date\n if (lastSession) {\n console.log(` ${chalk.bold('Last session')} ${chalk.dim('—')} ${lastSession}`);\n console.log('');\n }\n\n // Current task\n if (currentTask && !currentTask.startsWith('<!--')) {\n console.log(` ${chalk.bold('Current task')}`);\n console.log(` ${chalk.cyan('◎')} ${currentTask}`);\n console.log('');\n }\n\n // In progress\n if (inProgress.length > 0) {\n console.log(` ${chalk.bold('In progress')}`);\n for (const item of inProgress) {\n console.log(` ${chalk.yellow('●')} ${item}`);\n }\n console.log('');\n }\n\n // Decisions this session\n if (decisions.length > 0) {\n console.log(` ${chalk.bold('Decided this session')}`);\n for (const item of decisions) {\n console.log(` ${chalk.green('✓')} ${item}`);\n }\n console.log('');\n }\n\n // Blockers\n if (blockers.length > 0) {\n console.log(` ${chalk.bold('Blockers')}`);\n for (const item of blockers) {\n console.log(` ${chalk.red('✗')} ${item}`);\n }\n console.log('');\n }\n\n // Up next\n if (upNext.length > 0) {\n console.log(` ${chalk.bold('Up next')}`);\n for (const item of upNext) {\n console.log(` ${chalk.dim('→')} ${item}`);\n }\n console.log('');\n }\n\n // Stats\n console.log(` ${chalk.dim('─────────────────────────────')}`);\n console.log(` ${chalk.dim('Sessions logged')} ${String(sessionCount).padStart(4)}`);\n console.log(` ${chalk.dim('Decisions made')} ${String(decisionCount).padStart(4)}`);\n console.log(` ${chalk.dim('Last updated')} ${lastUpdated}`);\n console.log('');\n console.log(` Run ${chalk.cyan('mindlink log')} to see full history.`);\n console.log('');\n });\n","/**\n * Extract the content of a markdown section by heading name.\n * Returns lines under the heading until the next heading of same/higher level.\n */\nexport function extractSection(markdown: string, heading: string): string {\n const lines = markdown.split('\\n');\n let inSection = false;\n let headingLevel = 0;\n const result: string[] = [];\n\n for (const line of lines) {\n const match = line.match(/^(#{1,6})\\s+(.+)/);\n\n if (match) {\n const level = match[1].length;\n const title = match[2].trim();\n\n if (title.toLowerCase() === heading.toLowerCase()) {\n inSection = true;\n headingLevel = level;\n continue;\n }\n\n if (inSection && level <= headingLevel) {\n break;\n }\n }\n\n if (inSection) {\n result.push(line);\n }\n }\n\n return result.join('\\n').trim();\n}\n\n/**\n * Extract bullet list items from a markdown string.\n * Returns non-empty, non-comment lines that start with - or *.\n */\nexport function extractBullets(text: string): string[] {\n return text\n .split('\\n')\n .filter(l => /^[-*]\\s+/.test(l.trim()))\n .map(l => l.replace(/^[-*]\\s+/, '').trim())\n .filter(l => l.length > 0 && !l.startsWith('<!--'));\n}\n\n/**\n * Count how many top-level log entries exist in LOG.md.\n * Each entry starts with a ## heading.\n */\nexport function countLogEntries(markdown: string): number {\n return (markdown.match(/^##\\s+/gm) ?? []).length;\n}\n\n/**\n * Get the date of the last log entry in LOG.md.\n */\nexport function lastLogDate(markdown: string): string | null {\n const matches = markdown.match(/^##\\s+(.+)/m);\n return matches ? matches[1].trim() : null;\n}\n\n/**\n * Count how many rows exist in the Key Decisions table in MEMORY.md.\n * Skips the header and divider rows.\n */\nexport function countDecisions(markdown: string): number {\n const section = extractSection(markdown, 'Key Decisions');\n return section\n .split('\\n')\n .filter(l => l.startsWith('|') && !l.includes('---') && !l.toLowerCase().includes('decision'))\n .filter(l => {\n const cols = l.split('|').map(c => c.trim()).filter(Boolean);\n return cols.some(c => c.length > 0);\n }).length;\n}\n\n/**\n * Parse LOG.md into individual session entry objects.\n * Each entry starts with a ## heading.\n */\nexport interface LogEntry {\n heading: string;\n body: string;\n}\n\nexport function parseLogEntries(markdown: string): LogEntry[] {\n const blocks = markdown.split(/(?=^## )/m).filter(b => b.trimStart().startsWith('## '));\n return blocks.map(block => {\n const newline = block.indexOf('\\n');\n const heading = newline === -1 ? block.slice(3).trim() : block.slice(3, newline).trim();\n const body = newline === -1 ? '' : block.slice(newline + 1).trim();\n return { heading, body };\n });\n}\n\n/**\n * Get relative time string from a file's last modified date.\n */\nexport function relativeTime(date: Date): string {\n const diff = Date.now() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 2) return 'just now';\n if (minutes < 60) return `${minutes} minutes ago`;\n if (hours < 24) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n return `${days} day${days > 1 ? 's' : ''} ago`;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { parseLogEntries } from '../utils/parser.js';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nexport const logCommand = new Command('log')\n .description('Print session history')\n .option('--all', 'Show full history')\n .option('--limit <n>', 'Show last N sessions', '10')\n .option('--since <date>', 'Show sessions from a date (matched against heading text)')\n .option('--json', 'Output as JSON')\n .addHelpText('after', `\nExamples:\n mindlink log\n mindlink log --all\n mindlink log --limit 20\n mindlink log --since \"Apr 1\"\n mindlink log --json\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const logPath = join(brainDir, 'LOG.md');\n const logMd = existsSync(logPath) ? readFileSync(logPath, 'utf8') : '';\n\n let entries = parseLogEntries(logMd);\n\n if (entries.length === 0) {\n console.log('');\n console.log(` ${chalk.dim('No sessions logged yet.')}`);\n console.log(` ${chalk.dim('Your AI will append an entry here at the end of each session.')}`);\n console.log('');\n return;\n }\n\n // Filter by --since\n if (opts.since) {\n const since = opts.since.toLowerCase();\n entries = entries.filter(e => e.heading.toLowerCase().includes(since));\n }\n\n // Limit (unless --all)\n const limit = opts.all ? entries.length : parseInt(opts.limit, 10);\n const total = entries.length;\n const shown = entries.slice(0, limit);\n\n // ── JSON output ───────────────────────────────────────────────────────────\n if (opts.json) {\n console.log(JSON.stringify(shown, null, 2));\n return;\n }\n\n // ── Human output ──────────────────────────────────────────────────────────\n console.log('');\n\n if (!opts.all) {\n const rest = total - shown.length;\n const hint = rest > 0 ? ` ${chalk.dim(`${rest} more — run mindlink log --all to see everything`)}` : '';\n console.log(` ${chalk.dim(`Showing last ${shown.length} of ${total} session${total !== 1 ? 's' : ''}`)}${hint ? '' : ''}`);\n if (rest > 0) console.log(` ${chalk.dim(`${rest} more — run mindlink log --all to see everything`)}`);\n console.log('');\n }\n\n for (const entry of shown) {\n console.log(` ${chalk.bold('──')} ${chalk.cyan(entry.heading)} ${'─'.repeat(Math.max(0, 40 - entry.heading.length))}`);\n if (entry.body) {\n const lines = entry.body.split('\\n');\n for (const line of lines) {\n console.log(` ${chalk.dim(line)}`);\n }\n }\n console.log('');\n }\n\n // Check for archive files and show friendly notice\n const archiveFiles = readdirSync(brainDir).filter(f => /^LOG-\\d{4}-\\d{2}-\\d{2}\\.md$/.test(f)).sort();\n if (archiveFiles.length > 0) {\n console.log(` ${chalk.dim('─'.repeat(44))}`);\n console.log(` ${chalk.dim('Like all human brains, MindLink forgets old sessions')}`);\n console.log(` ${chalk.dim('that haven\\'t come up in a while — that\\'s by design.')}`);\n console.log(` ${chalk.dim(`Older entries archived to: ${archiveFiles.join(', ')}`)}`);\n console.log(` ${chalk.dim('Anything that truly matters belongs in MEMORY.md.')}`);\n console.log('');\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync, unlinkSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR, BRAIN_TEMPLATES_DIR } from '../utils/paths.js';\n\nexport const clearCommand = new Command('clear')\n .description('Reset SESSION.md for a fresh session start')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText('after', `\nWhat it does:\n Resets SESSION.md to a blank template — wipes current task, in-progress items,\n blockers, and up-next. MEMORY.md, LOG.md, and SHARED.md are untouched.\n\nNot what you need?\n mindlink reset — wipe ALL memory files back to blank (scorched earth)\n mindlink uninstall — remove MindLink from this project entirely\n\nExamples:\n mindlink clear\n mindlink clear --yes\n `)\n .action(async (_opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log('');\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n console.log('');\n\n try {\n const templatePath = join(BRAIN_TEMPLATES_DIR, 'SESSION.md');\n const destPath = join(brainDir, 'SESSION.md');\n writeFileSync(destPath, readFileSync(templatePath, 'utf8'));\n // Clean up ephemeral session timestamp used by Stop hook\n const tsDest = join(brainDir, '.session_ts');\n if (existsSync(tsDest)) unlinkSync(tsDest);\n } catch (err: unknown) {\n console.log(` ${chalk.red('✗')} ${err instanceof Error ? err.message : String(err)}`);\n console.log('');\n process.exit(1);\n }\n\n console.log(` ${chalk.green('✓')} SESSION.md cleared. Ready for a clean session.`);\n console.log(` ${chalk.dim('MEMORY.md, LOG.md, and SHARED.md are untouched.')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { confirm, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR, BRAIN_TEMPLATES_DIR } from '../utils/paths.js';\n\nconst BRAIN_FILES = ['MEMORY.md', 'SESSION.md', 'SHARED.md', 'LOG.md'];\n\nexport const resetCommand = new Command('reset')\n .description('Wipe all .brain/ memory files and start completely fresh')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText('after', `\nWhat it does:\n Resets MEMORY.md, SESSION.md, SHARED.md, and LOG.md to blank templates.\n Your settings (config.json) and agent instruction files are untouched.\n\nNot what you need?\n mindlink clear — reset SESSION.md only (lighter option)\n mindlink uninstall — remove MindLink from this project entirely\n\nExamples:\n mindlink reset\n mindlink reset --yes\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n console.log('');\n\n if (!opts.yes) {\n console.log(` ${chalk.yellow('!')} This will wipe ALL .brain/ memory files and start fresh.`);\n console.log(` ${chalk.dim('MEMORY.md, SESSION.md, SHARED.md, and LOG.md → reset to blank templates.')}`);\n console.log(` ${chalk.dim('Settings and agent instruction files are untouched.')}`);\n console.log('');\n console.log(` ${chalk.dim('Lighter option: mindlink clear — resets SESSION.md only')}`);\n console.log(` ${chalk.dim('Remove entirely: mindlink uninstall — removes MindLink from this project')}`);\n console.log('');\n\n const confirmed = await confirm({\n message: 'Reset everything? This cannot be undone (unless .brain/ is tracked by git).',\n });\n\n if (isCancel(confirmed) || !confirmed) {\n cancel('Cancelled.');\n process.exit(0);\n }\n console.log('');\n }\n\n const errors: string[] = [];\n\n for (const file of BRAIN_FILES) {\n try {\n const templatePath = join(BRAIN_TEMPLATES_DIR, file);\n const destPath = join(brainDir, file);\n if (existsSync(templatePath)) {\n writeFileSync(destPath, readFileSync(templatePath, 'utf8'));\n }\n } catch (err: unknown) {\n errors.push(`${file}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (errors.length > 0) {\n for (const err of errors) console.log(` ${chalk.red('✗')} ${err}`);\n console.log('');\n process.exit(1);\n }\n\n console.log(` ${chalk.green('✓')} .brain/ reset. All memory files are blank.`);\n console.log(` ${chalk.dim('Your AI will wake up with no memory of past sessions.')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { select, multiselect, text, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n appendFileSync,\n mkdirSync,\n unlinkSync,\n} from 'fs';\nimport { join, resolve, dirname } from 'path';\nimport { BRAIN_DIR, AGENT_TEMPLATES_DIR, HOOKS_TEMPLATES_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\n\ninterface BrainConfig {\n gitTracking: boolean;\n autoSync: boolean;\n agents: string[];\n maxLogEntries: number;\n}\n\nfunction readConfig(brainDir: string): BrainConfig {\n return JSON.parse(readFileSync(join(brainDir, 'config.json'), 'utf8'));\n}\n\nfunction saveConfig(brainDir: string, config: BrainConfig): void {\n writeFileSync(join(brainDir, 'config.json'), JSON.stringify(config, null, 2));\n}\n\nfunction enableGitTracking(projectPath: string): void {\n const gitignorePath = join(projectPath, '.gitignore');\n if (!existsSync(gitignorePath)) return;\n const content = readFileSync(gitignorePath, 'utf8');\n // Remove the mindlink .brain/ block\n const cleaned = content\n .replace(/\\n# MindLink memory[^\\n]*\\n\\.brain\\/\\n?/g, '')\n .replace(/\\n?\\.brain\\/\\n?/g, '\\n');\n writeFileSync(gitignorePath, cleaned.trimEnd() + '\\n');\n}\n\nfunction disableGitTracking(projectPath: string): void {\n const gitignorePath = join(projectPath, '.gitignore');\n const entry = '\\n# MindLink memory (personal — not shared with team)\\n.brain/\\n';\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf8');\n if (!content.includes('.brain/')) appendFileSync(gitignorePath, entry);\n } else {\n writeFileSync(gitignorePath, entry.trim() + '\\n');\n }\n}\n\nfunction addAgentFile(projectPath: string, agentValue: string): string | null {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) return null;\n const destPath = join(projectPath, agent.destFile);\n if (existsSync(destPath)) return null; // already there\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n return agent.destFile;\n}\n\nfunction removeAgentFile(projectPath: string, agentValue: string): string | null {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) return null;\n const destPath = join(projectPath, agent.destFile);\n if (!existsSync(destPath)) return null;\n unlinkSync(destPath);\n return agent.destFile;\n}\n\nfunction addClaudeHook(projectPath: string): boolean {\n const hookDest = join(projectPath, '.claude', 'settings.json');\n if (existsSync(hookDest)) return false;\n mkdirSync(dirname(hookDest), { recursive: true });\n writeFileSync(hookDest, readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n return true;\n}\n\nexport const configCommand = new Command('config')\n .description('Change settings for the current project')\n .addHelpText('after', `\nExamples:\n mindlink config\n `)\n .action(async () => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n // Non-TTY: just print current settings and exit\n if (!process.stdin.isTTY) {\n const cfg = readConfig(brainDir);\n const agentLabels = cfg.agents\n .map((v: string) => AGENTS.find(a => a.value === v)?.hint ?? v)\n .join(', ');\n console.log(JSON.stringify({ ...cfg, agentFiles: agentLabels }, null, 2));\n return;\n }\n\n let config = readConfig(brainDir);\n\n // ── Main menu loop ────────────────────────────────────────────────────────\n while (true) {\n console.log('');\n console.log(` ${chalk.bold('Current settings')} ${chalk.dim('·')} ${chalk.dim(projectPath)}`);\n console.log('');\n console.log(` Git tracking : ${config.gitTracking ? chalk.green('enabled') : chalk.dim('disabled')} ${chalk.dim(config.gitTracking ? '(team shares memory)' : '(.brain/ excluded from git)')}`);\n console.log(` Auto-sync : ${config.autoSync ? chalk.green('enabled') : chalk.dim('disabled')} ${chalk.dim(config.autoSync ? '(watch mode)' : '(run mindlink sync manually)')}`);\n console.log(` Max log entries: ${chalk.dim(String(config.maxLogEntries))} ${chalk.dim('(archive rotation threshold)')}`);\n\n const agentLabels = config.agents\n .map(v => AGENTS.find(a => a.value === v)?.hint ?? v)\n .join(', ');\n console.log(` Agent files : ${chalk.dim(agentLabels || 'none')}`);\n console.log('');\n\n const action = await select({\n message: 'What would you like to change?',\n options: [\n { value: 'git', label: 'Git tracking' },\n { value: 'sync', label: 'Auto-sync' },\n { value: 'memory', label: 'Memory settings', hint: 'log rotation threshold' },\n { value: 'agents', label: 'Agent instruction files' },\n { value: 'exit', label: 'Exit' },\n ],\n });\n\n if (isCancel(action) || action === 'exit') break;\n\n // ── Git tracking ───────────────────────────────────────────────────────\n if (action === 'git') {\n const choice = await select({\n message: 'Git tracking — should .brain/ be committed to git?',\n options: [\n { value: 'enable', label: 'Enable', hint: 'commit memory (share with your team)' },\n { value: 'disable', label: 'Disable', hint: 'add to .gitignore (keep memory personal)' },\n { value: 'back', label: '↩ Back' },\n ],\n initialValue: config.gitTracking ? 'enable' : 'disable',\n });\n\n if (isCancel(choice) || choice === 'back') continue;\n\n const newValue = choice === 'enable';\n if (newValue === config.gitTracking) {\n console.log(` ${chalk.dim('No change.')}`);\n continue;\n }\n\n if (newValue) {\n enableGitTracking(projectPath);\n console.log(` ${chalk.green('✓')} Git tracking enabled. .brain/ will be committed.`);\n } else {\n disableGitTracking(projectPath);\n console.log(` ${chalk.green('✓')} .gitignore updated. .brain/ will no longer be tracked.`);\n }\n\n config.gitTracking = newValue;\n saveConfig(brainDir, config);\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Git tracking')}`);\n }\n\n // ── Auto-sync ──────────────────────────────────────────────────────────\n if (action === 'sync') {\n const choice = await select({\n message: 'Auto-sync mode',\n options: [\n { value: 'enable', label: 'Enable', hint: 'watch for changes, sync automatically' },\n { value: 'disable', label: 'Disable', hint: 'run mindlink sync manually' },\n { value: 'back', label: '↩ Back' },\n ],\n initialValue: config.autoSync ? 'enable' : 'disable',\n });\n\n if (isCancel(choice) || choice === 'back') continue;\n\n const newValue = choice === 'enable';\n if (newValue === config.autoSync) {\n console.log(` ${chalk.dim('No change.')}`);\n continue;\n }\n\n config.autoSync = newValue;\n saveConfig(brainDir, config);\n console.log(` ${chalk.green('✓')} Auto-sync ${newValue ? 'enabled' : 'disabled'}.`);\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Auto-sync')}`);\n }\n\n // ── Memory settings ───────────────────────────────────────────────────\n if (action === 'memory') {\n console.log('');\n console.log(` ${chalk.dim('How many session entries to keep in LOG.md before archiving older ones.')}`);\n console.log(` ${chalk.dim('Archived entries move to LOG-YYYY-MM-DD.md — never deleted.')}`);\n console.log(` ${chalk.dim('Lower = lighter context for your AI. Higher = more history visible.')}`);\n console.log('');\n\n const input = await text({\n message: `Max log entries before archiving (current: ${config.maxLogEntries})`,\n placeholder: String(config.maxLogEntries),\n validate(value) {\n const n = parseInt(value, 10);\n if (isNaN(n) || n < 1) return 'Enter a number greater than 0';\n },\n });\n\n if (isCancel(input)) continue;\n\n const newValue = parseInt(input as string, 10);\n if (newValue === config.maxLogEntries) {\n console.log(` ${chalk.dim('No change.')}`);\n continue;\n }\n\n config.maxLogEntries = newValue;\n saveConfig(brainDir, config);\n console.log(` ${chalk.green('✓')} Max log entries set to ${newValue}.`);\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Memory settings')}`);\n }\n\n // ── Agent files ────────────────────────────────────────────────────────\n if (action === 'agents') {\n const agentChoices = AGENTS.map(a => ({\n value: a.value,\n label: `${a.label.padEnd(18)} ${chalk.dim(a.hint)}`,\n hint: a.selected ? 'recommended' : undefined,\n }));\n\n const result = await multiselect({\n message: 'Which AI agents do you use?',\n options: agentChoices,\n initialValues: config.agents,\n required: false,\n });\n\n if (isCancel(result)) continue;\n\n const newAgents = result as string[];\n const added = newAgents.filter(v => !config.agents.includes(v));\n const removed = config.agents.filter(v => !newAgents.includes(v));\n\n const addedFiles: string[] = [];\n const removedFiles: string[] = [];\n\n for (const v of added) {\n const f = addAgentFile(projectPath, v);\n if (f) addedFiles.push(f);\n if (v === 'claude') {\n if (addClaudeHook(projectPath)) addedFiles.push('.claude/settings.json');\n }\n }\n\n for (const v of removed) {\n const f = removeAgentFile(projectPath, v);\n if (f) removedFiles.push(f);\n }\n\n config.agents = newAgents;\n saveConfig(brainDir, config);\n\n if (addedFiles.length === 0 && removedFiles.length === 0) {\n console.log(` ${chalk.dim('No change.')}`);\n } else {\n for (const f of addedFiles) console.log(` ${chalk.green('✓')} ${f} added.`);\n for (const f of removedFiles) console.log(` ${chalk.dim('✗')} ${f} removed.`);\n }\n console.log(` ${chalk.dim('↩ Change anytime: mindlink config → Agent instruction files')}`);\n }\n }\n\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport { join, resolve, basename } from 'path';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nfunction timestamp(): string {\n const d = new Date();\n const month = d.toLocaleString('default', { month: 'short' });\n const day = d.getDate();\n const time = d.toTimeString().slice(0, 5);\n return `${month} ${day} ${time}`;\n}\n\nfunction describeFile(filePath: string): string {\n if (!existsSync(filePath)) return chalk.dim('(missing)');\n const stat = statSync(filePath);\n const kb = (stat.size / 1024).toFixed(1);\n const content = readFileSync(filePath, 'utf8');\n const entries = (content.match(/^## /gm) ?? []).length;\n const name = basename(filePath);\n if (name === 'LOG.md') return entries > 0 ? `${entries} session${entries !== 1 ? 's' : ''}` : chalk.dim('empty');\n if (name === 'SHARED.md') {\n const lines = content.split('\\n').filter(l => l.trim() && !l.startsWith('#') && !l.startsWith('<!--') && !l.startsWith('>') && l !== '---').length;\n return lines > 0 ? `${lines} line${lines !== 1 ? 's' : ''}` : chalk.dim('empty');\n }\n if (name === 'SESSION.md') {\n const hasTask = content.includes('## Current Task') && !content.includes('<!-- ');\n return hasTask ? chalk.green('active') : chalk.dim('idle');\n }\n return `${kb} KB`;\n}\n\nexport const syncCommand = new Command('sync')\n .description('Sync shared context between sessions')\n .option('--once', 'Sync once and exit (default: watch mode)')\n .addHelpText('after', `\nExamples:\n mindlink sync\n mindlink sync --once\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const sharedPath = join(brainDir, 'SHARED.md');\n const sessionPath = join(brainDir, 'SESSION.md');\n const logPath = join(brainDir, 'LOG.md');\n const memoryPath = join(brainDir, 'MEMORY.md');\n\n // ── --once mode ───────────────────────────────────────────────────────────\n if (opts.once) {\n console.log('');\n console.log(` ${chalk.dim('Checking shared context...')}`);\n console.log('');\n\n const files = [\n { label: 'SHARED.md ', path: sharedPath },\n { label: 'SESSION.md ', path: sessionPath },\n { label: 'LOG.md ', path: logPath },\n { label: 'MEMORY.md ', path: memoryPath },\n ];\n\n for (const { label, path } of files) {\n const desc = describeFile(path);\n const mtime = existsSync(path) ? statSync(path).mtime : null;\n const age = mtime\n ? (() => {\n const diff = Date.now() - mtime.getTime();\n const min = Math.floor(diff / 60000);\n const hr = Math.floor(diff / 3600000);\n if (min < 2) return 'just now';\n if (min < 60) return `${min}m ago`;\n return `${hr}h ago`;\n })()\n : '';\n console.log(` ${chalk.dim(label)} ${desc} ${chalk.dim(age)}`);\n }\n\n console.log('');\n console.log(` ${chalk.green('✓')} All sessions share the same .brain/ folder.`);\n console.log(` ${chalk.dim('Any session that writes to SHARED.md is immediately visible to all others.')}`);\n console.log('');\n return;\n }\n\n // ── Watch mode ────────────────────────────────────────────────────────────\n // Dynamic import so chokidar is only loaded when needed\n const { watch } = await import('chokidar');\n\n console.log('');\n console.log(` ${chalk.dim('Watching for changes...')} ${chalk.dim('(Ctrl+C to stop)')}`);\n console.log('');\n\n const watcher = watch(brainDir, {\n ignoreInitial: true,\n ignored: /(^|[/\\\\])\\../,\n persistent: true,\n awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },\n });\n\n watcher.on('change', (filePath: string) => {\n const name = basename(filePath);\n const stat = statSync(filePath);\n const kb = (stat.size / 1024).toFixed(1);\n console.log(` ${chalk.dim('[' + timestamp() + ']')} ${chalk.cyan(name)} updated ${chalk.dim(kb + ' KB')} ${chalk.green('→ synced ✓')}`);\n });\n\n watcher.on('add', (filePath: string) => {\n const name = basename(filePath);\n console.log(` ${chalk.dim('[' + timestamp() + ']')} ${chalk.cyan(name)} created ${chalk.green('→ synced ✓')}`);\n });\n\n watcher.on('error', (err: unknown) => {\n console.log(` ${chalk.red('✗')} Watch error: ${err instanceof Error ? err.message : String(err)}`);\n });\n\n // Keep process alive\n process.on('SIGINT', () => {\n watcher.close();\n console.log('');\n console.log(` ${chalk.dim('Stopped.')}`);\n console.log('');\n process.exit(0);\n });\n });\n","import { Command } from 'commander';\nimport { select, isCancel, cancel, spinner } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { AGENT_TEMPLATES_DIR, HOOKS_TEMPLATES_DIR, BRAIN_TEMPLATES_DIR, BRAIN_DIR, GLOBAL_USER_PROFILE_PATH, GLOBAL_WINDSURF_MCP_PATH } from '../utils/paths.js';\nimport { replaceSection } from '../utils/content.js';\nimport { AGENTS } from '../utils/agents.js';\nimport { getRegisteredProjects, pruneRegistry } from '../utils/registry.js';\nimport { VERSION } from '../utils/version.js';\n\n// Brain files that must exist in every initialized project.\n// If a future version adds a new brain file, add it here — update will create it for existing projects.\nconst REQUIRED_BRAIN_FILES = ['MEMORY.md', 'SESSION.md', 'SHARED.md', 'LOG.md'];\n\nasync function latestVersion(): Promise<string | null> {\n try {\n const { default: https } = await import('https');\n return new Promise((resolve) => {\n const req = https.get(\n 'https://registry.npmjs.org/mindlink/latest',\n { headers: { 'User-Agent': 'mindlink-cli' } },\n (res) => {\n let data = '';\n res.on('data', (chunk: Buffer) => { data += chunk; });\n res.on('end', () => {\n try {\n const parsed = JSON.parse(data);\n resolve(parsed.version ?? null);\n } catch {\n resolve(null);\n }\n });\n }\n );\n req.on('error', () => resolve(null));\n req.setTimeout(8000, () => { req.destroy(); resolve(null); });\n });\n } catch {\n return null;\n }\n}\n\nfunction semverGt(a: string, b: string): boolean {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n if ((pa[i] ?? 0) > (pb[i] ?? 0)) return true;\n if ((pa[i] ?? 0) < (pb[i] ?? 0)) return false;\n }\n return false;\n}\n\nexport const updateCommand = new Command('update')\n .description('Update mindlink to the latest version')\n .addHelpText('after', `\nExamples:\n mindlink update\n `)\n .action(async () => {\n const current = VERSION;\n\n // Deferred exit code for non-TTY mode — set here, applied after agent refresh below\n let nonTtyExitCode: number | null = null;\n\n if (!process.stdin.isTTY) {\n // Non-TTY: check version and report JSON, then fall through to agent refresh below\n const latest = await latestVersion();\n if (!latest) {\n console.log(JSON.stringify({ current, latest: null, upToDate: null }));\n nonTtyExitCode = 1; // registry unreachable — still refresh agents\n } else {\n const upToDate = !semverGt(latest, current);\n console.log(JSON.stringify({ current, latest, upToDate }));\n if (!upToDate) nonTtyExitCode = 2; // exit 2 = update available\n }\n // fall through to refresh agent files\n } else {\n // TTY: interactive version check + optional install\n const s = spinner();\n s.start('Checking for updates...');\n\n const latest = await latestVersion();\n\n if (!latest) {\n s.stop('Could not reach npm registry.');\n console.log('');\n console.log(` ${chalk.red('✗')} Could not check for updates. Check your internet connection.`);\n console.log(` ${chalk.dim('Latest releases: github.com/404-not-found/mindlink/releases')}`);\n console.log('');\n process.exit(1);\n }\n\n s.stop('Done.');\n console.log('');\n console.log(` Current version : ${chalk.dim(current)}`);\n console.log(` Latest version : ${semverGt(latest, current) ? chalk.green(latest) : chalk.dim(latest)}`);\n console.log('');\n\n if (!semverGt(latest, current)) {\n console.log(` ${chalk.green('✓')} You're on the latest version (${current}).`);\n console.log('');\n } else {\n const action = await select({\n message: `Update to ${latest}?`,\n options: [\n { value: 'update', label: `Update to ${latest}` },\n { value: 'skip', label: 'Skip this version' },\n { value: 'cancel', label: 'Cancel' },\n ],\n });\n\n if (isCancel(action) || action === 'cancel' || action === 'skip') {\n if (action === 'skip') {\n console.log(` ${chalk.dim('Skipped. Run mindlink update again to install later.')}`);\n } else {\n cancel('Cancelled.');\n }\n console.log('');\n return;\n }\n\n // Install\n const s2 = spinner();\n s2.start(`Installing mindlink@${latest}...`);\n\n try {\n execSync(`npm install -g mindlink@${latest}`, { stdio: 'pipe' });\n s2.stop('Done.');\n console.log('');\n console.log(` ${chalk.green('✓')} Updated to ${latest}.`);\n console.log(` ${chalk.dim('See what\\'s new: github.com/404-not-found/mindlink/releases')}`);\n } catch (err: unknown) {\n s2.stop('Failed.');\n console.log('');\n console.log(` ${chalk.red('✗')} Update failed.`);\n console.log(` ${chalk.dim('Try: npm install -g mindlink@' + latest)}`);\n if (err instanceof Error && err.message.includes('EACCES')) {\n console.log(` ${chalk.dim('Permission error — try: sudo npm install -g mindlink@' + latest)}`);\n }\n process.exit(1);\n }\n }\n }\n\n // Always refresh agent instruction files across all registered projects\n // Also include cwd if it has .brain/ — catches projects not in the registry (e.g. initialized before registry existed)\n const cwd = process.cwd();\n const validProjects = getRegisteredProjects().filter(p => existsSync(join(p, BRAIN_DIR, 'config.json')));\n // Prune stale entries while we're here\n pruneRegistry(p => existsSync(join(p, BRAIN_DIR, 'config.json')));\n const cwdHasBrain = existsSync(join(cwd, BRAIN_DIR, 'config.json'));\n const projects = cwdHasBrain && !validProjects.includes(cwd)\n ? [cwd, ...validProjects]\n : validProjects;\n\n if (projects.length > 0) {\n console.log('');\n console.log(` Refreshing agent files in ${projects.length} project${projects.length > 1 ? 's' : ''}...`);\n console.log('');\n for (const projectPath of projects) {\n const configPath = join(projectPath, BRAIN_DIR, 'config.json');\n let config: { agents?: string[] } = {};\n try { config = JSON.parse(readFileSync(configPath, 'utf8')); } catch {}\n\n const agentValues: string[] = config.agents ?? AGENTS.filter(a => a.selected).map(a => a.value);\n const refreshed: string[] = [];\n\n // Ensure all required brain files exist (forward compat: creates new files added in future versions)\n for (const brainFile of REQUIRED_BRAIN_FILES) {\n const dest = join(projectPath, BRAIN_DIR, brainFile);\n if (!existsSync(dest)) {\n try {\n const template = join(BRAIN_TEMPLATES_DIR, brainFile);\n if (existsSync(template)) {\n writeFileSync(dest, readFileSync(template, 'utf8'));\n refreshed.push(`.brain/${brainFile}`);\n }\n } catch {}\n }\n }\n\n for (const agentValue of agentValues) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n try {\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n refreshed.push(agent.destFile);\n } catch {}\n }\n\n if (agentValues.includes('claude')) {\n // .claude/settings.json — hooks + permissions only (no mcpServers)\n const hookDest = join(projectPath, '.claude', 'settings.json');\n try {\n mkdirSync(join(projectPath, '.claude'), { recursive: true });\n const template = JSON.parse(readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n let existing: Record<string, unknown> = {};\n if (existsSync(hookDest)) {\n try { existing = JSON.parse(readFileSync(hookDest, 'utf8')); } catch {}\n }\n // Remove stale mcpServers from settings.json (Claude Code CLI uses .mcp.json now)\n const { mcpServers: _removed, ...existingWithoutMcp } = existing as Record<string, unknown> & { mcpServers?: unknown };\n void _removed;\n const merged = {\n ...existingWithoutMcp,\n hooks: template.hooks,\n permissions: template.permissions,\n };\n writeFileSync(hookDest, JSON.stringify(merged, null, 2));\n refreshed.push('.claude/settings.json');\n } catch {}\n // .mcp.json — Claude Code CLI reads MCP servers from here\n const mcpJsonDest = join(projectPath, '.mcp.json');\n try {\n let existing: Record<string, unknown> = {};\n if (existsSync(mcpJsonDest)) {\n try { existing = JSON.parse(readFileSync(mcpJsonDest, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(typeof existing.mcpServers === 'object' && existing.mcpServers !== null ? existing.mcpServers as Record<string, unknown> : {}),\n mindlink: { type: 'stdio', command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(mcpJsonDest, JSON.stringify(merged, null, 2));\n refreshed.push('.mcp.json');\n } catch {}\n }\n\n // Cursor: refresh .cursor/mcp.json (merge — preserve user's other servers, type: stdio required)\n if (agentValues.includes('cursor')) {\n const cursorMcpDest = join(projectPath, '.cursor', 'mcp.json');\n try {\n mkdirSync(join(projectPath, '.cursor'), { recursive: true });\n let existing: Record<string, unknown> = {};\n if (existsSync(cursorMcpDest)) {\n try { existing = JSON.parse(readFileSync(cursorMcpDest, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(typeof existing.mcpServers === 'object' && existing.mcpServers !== null ? existing.mcpServers as Record<string, unknown> : {}),\n mindlink: { type: 'stdio', command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(cursorMcpDest, JSON.stringify(merged, null, 2));\n refreshed.push('.cursor/mcp.json');\n } catch {}\n }\n\n // Continue.dev: refresh .continue/mcpServers/mindlink.json\n if (agentValues.includes('continue')) {\n const continueMcpDest = join(projectPath, '.continue', 'mcpServers', 'mindlink.json');\n try {\n mkdirSync(join(projectPath, '.continue', 'mcpServers'), { recursive: true });\n const continueMcp = { mcpServers: { mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } } } };\n writeFileSync(continueMcpDest, JSON.stringify(continueMcp, null, 2));\n refreshed.push('.continue/mcpServers/mindlink.json');\n } catch {}\n }\n\n // GitHub Copilot: refresh .vscode/mcp.json (VS Code uses \"servers\" key, not \"mcpServers\")\n if (agentValues.includes('copilot')) {\n const copilotMcpDest = join(projectPath, '.vscode', 'mcp.json');\n try {\n mkdirSync(join(projectPath, '.vscode'), { recursive: true });\n let existing: Record<string, unknown> = {};\n if (existsSync(copilotMcpDest)) {\n try { existing = JSON.parse(readFileSync(copilotMcpDest, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n servers: {\n ...(typeof existing.servers === 'object' && existing.servers !== null ? existing.servers as Record<string, unknown> : {}),\n mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(copilotMcpDest, JSON.stringify(merged, null, 2));\n refreshed.push('.vscode/mcp.json');\n } catch {}\n }\n\n // Kiro: refresh .kiro/settings/mcp.json (merge — preserve user's other servers)\n if (agentValues.includes('kiro')) {\n const kiroMcpDest = join(projectPath, '.kiro', 'settings', 'mcp.json');\n try {\n mkdirSync(join(projectPath, '.kiro', 'settings'), { recursive: true });\n let existing: Record<string, unknown> = {};\n if (existsSync(kiroMcpDest)) {\n try { existing = JSON.parse(readFileSync(kiroMcpDest, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(typeof existing.mcpServers === 'object' && existing.mcpServers !== null ? existing.mcpServers as Record<string, unknown> : {}),\n mindlink: { command: 'mindlink', args: ['mcp'], env: { MINDLINK_PROJECT_PATH: projectPath } },\n },\n };\n writeFileSync(kiroMcpDest, JSON.stringify(merged, null, 2));\n refreshed.push('.kiro/settings/mcp.json');\n } catch {}\n }\n\n // Windsurf: refresh ~/.codeium/windsurf/mcp_config.json (global, no project path)\n if (agentValues.includes('windsurf')) {\n try {\n mkdirSync(dirname(GLOBAL_WINDSURF_MCP_PATH), { recursive: true });\n let existing: Record<string, unknown> = {};\n if (existsSync(GLOBAL_WINDSURF_MCP_PATH)) {\n try { existing = JSON.parse(readFileSync(GLOBAL_WINDSURF_MCP_PATH, 'utf8')); } catch {}\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(typeof existing.mcpServers === 'object' && existing.mcpServers !== null ? existing.mcpServers as Record<string, unknown> : {}),\n mindlink: { command: 'mindlink', args: ['mcp'] },\n },\n };\n writeFileSync(GLOBAL_WINDSURF_MCP_PATH, JSON.stringify(merged, null, 2));\n refreshed.push('~/.codeium/windsurf/mcp_config.json');\n } catch {}\n }\n\n // Apply MEMORY.md migrations — non-destructively inject any new sections added in this version\n const memoryPath = join(projectPath, BRAIN_DIR, 'MEMORY.md');\n if (existsSync(memoryPath)) {\n try {\n let content = readFileSync(memoryPath, 'utf8');\n let memoryChanged = false;\n\n // Each migration: { marker: string to check for presence, inject: content to add, before: anchor string }\n // Applied in order — all are non-destructive (only run if marker is absent)\n const migrations: Array<{ marker: string; block: string; before: string }> = [\n {\n // v1.1.5: Add ## User Profile section\n marker: '## User Profile',\n block:\n `## User Profile <!-- READ EVERY SESSION — personal facts about the user -->\\n\\n` +\n `<!-- Job, company, level, years of experience, immigration status -->\\n` +\n `<!-- Age, health, physical details -->\\n` +\n `<!-- Family, relationships, major life events -->\\n` +\n `<!-- Long-term goals: career, financial, personal -->\\n` +\n `<!-- Strong opinions, values, preferences -->\\n` +\n `<!-- Update in place — do not append; consolidate when it grows -->\\n\\n\\n` +\n `---\\n\\n`,\n before: '## Important Context',\n },\n // Future migrations go here — same pattern:\n // { marker: '## New Section', block: '## New Section\\n\\n<!-- ... -->\\n\\n\\n---\\n\\n', before: '## Some Existing Section' },\n ];\n\n for (const m of migrations) {\n if (!content.includes(m.marker) && content.includes(m.before)) {\n content = content.replace(m.before, m.block + m.before);\n memoryChanged = true;\n }\n }\n\n if (memoryChanged) {\n writeFileSync(memoryPath, content);\n refreshed.push('.brain/MEMORY.md');\n }\n } catch {}\n }\n\n // Sync global user profile into User Profile section (if profile exists and has content)\n if (existsSync(GLOBAL_USER_PROFILE_PATH) && existsSync(memoryPath)) {\n try {\n const profileRaw = readFileSync(GLOBAL_USER_PROFILE_PATH, 'utf8');\n // Strip profile file header lines (# heading, > blockquotes, leading blank lines)\n const profileLines = profileRaw.split('\\n');\n const bodyStart = profileLines.findIndex(l => {\n const t = l.trim();\n return t.length > 0 && !t.startsWith('#') && !t.startsWith('>') && !t.startsWith('<!--');\n });\n const profileBody = bodyStart >= 0 ? profileLines.slice(bodyStart).join('\\n').trim() : '';\n if (profileBody) {\n const memContent = readFileSync(memoryPath, 'utf8');\n const updated = replaceSection(memContent, 'User Profile', profileBody);\n if (updated !== memContent) {\n writeFileSync(memoryPath, updated);\n if (!refreshed.includes('.brain/MEMORY.md')) refreshed.push('.brain/MEMORY.md (profile synced)');\n }\n }\n } catch {}\n }\n\n console.log(` ${chalk.bold(projectPath)}`);\n for (const f of refreshed) {\n console.log(` ${chalk.green('✓')} ${f}`);\n }\n }\n console.log('');\n console.log(` ${chalk.dim('All agent files are up to date.')}`);\n }\n\n console.log('');\n\n // Apply deferred exit code from non-TTY version check (after agent refresh ran)\n if (nonTtyExitCode !== null) process.exit(nonTtyExitCode);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport {\n extractSection,\n extractBullets,\n countLogEntries,\n lastLogDate,\n parseLogEntries,\n} from '../utils/parser.js';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nexport const summaryCommand = new Command('summary')\n .description('Print a full briefing of what your AI knows — great for sharing or reviewing context')\n .option('--json', 'Output as JSON')\n .addHelpText('after', `\nExamples:\n mindlink summary\n mindlink summary --json\n\nTip: your AI agent can run this itself — ask it to run \"mindlink summary\"\nto get a full briefing on the current project state.\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const memoryPath = join(brainDir, 'MEMORY.md');\n const sessionPath = join(brainDir, 'SESSION.md');\n const logPath = join(brainDir, 'LOG.md');\n const sharedPath = join(brainDir, 'SHARED.md');\n\n const memoryMd = existsSync(memoryPath) ? readFileSync(memoryPath, 'utf8') : '';\n const sessionMd = existsSync(sessionPath) ? readFileSync(sessionPath, 'utf8') : '';\n const logMd = existsSync(logPath) ? readFileSync(logPath, 'utf8') : '';\n const sharedMd = existsSync(sharedPath) ? readFileSync(sharedPath, 'utf8') : '';\n\n // Parse memory\n const projectOverview = extractSection(memoryMd, 'Project Overview') ||\n extractSection(memoryMd, 'Project Identity') ||\n extractSection(memoryMd, 'What Is This Project');\n const techStack = extractSection(memoryMd, 'Tech Stack') ||\n extractSection(memoryMd, 'Stack');\n const decisions = extractBullets(\n extractSection(memoryMd, 'Key Decisions') ||\n extractSection(memoryMd, 'Decisions')\n );\n\n // Parse session\n const rawTask = extractSection(sessionMd, 'Current Task');\n const task = rawTask.startsWith('<!--') ? '' : rawTask;\n const inProg = extractBullets(extractSection(sessionMd, 'In Progress'));\n const upNext = extractBullets(extractSection(sessionMd, 'Up Next'));\n const blockers = extractBullets(extractSection(sessionMd, 'Blockers'));\n\n // Parse log\n const sessionCount = countLogEntries(logMd);\n const lastDate = lastLogDate(logMd);\n const recentLogs = parseLogEntries(logMd).slice(0, 3);\n\n // Parse shared\n const sharedLines = sharedMd\n .split('\\n')\n .filter(l => l.trim() && !l.startsWith('#') && !l.startsWith('<!--') && !l.startsWith('>') && l !== '---')\n .slice(0, 10);\n\n // ── JSON ─────────────────────────────────────────────────────────────────\n if (opts.json) {\n console.log(JSON.stringify({\n project: { overview: projectOverview, techStack, decisions },\n session: { currentTask: task, inProgress: inProg, upNext, blockers },\n log: { totalSessions: sessionCount, lastSession: lastDate, recent: recentLogs },\n shared: sharedLines,\n }, null, 2));\n return;\n }\n\n // ── Human ─────────────────────────────────────────────────────────────────\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink Memory Summary')} ${chalk.dim('·')} ${chalk.dim(projectPath)}`);\n console.log('');\n\n // Project\n if (projectOverview) {\n console.log(` ${chalk.bold('Project')}`);\n for (const line of projectOverview.split('\\n').filter(Boolean)) {\n console.log(` ${chalk.dim(line)}`);\n }\n console.log('');\n }\n\n if (techStack) {\n console.log(` ${chalk.bold('Tech stack')}`);\n for (const line of techStack.split('\\n').filter(Boolean)) {\n console.log(` ${chalk.dim(line)}`);\n }\n console.log('');\n }\n\n if (decisions.length > 0) {\n console.log(` ${chalk.bold('Key decisions')}`);\n for (const d of decisions.slice(0, 5)) {\n console.log(` ${chalk.dim('·')} ${d}`);\n }\n if (decisions.length > 5) {\n console.log(` ${chalk.dim(` …and ${decisions.length - 5} more in MEMORY.md`)}`);\n }\n console.log('');\n }\n\n // Current session\n if (task || inProg.length > 0 || upNext.length > 0) {\n console.log(` ${chalk.bold('Current session')}`);\n if (task) console.log(` ${chalk.cyan('◎')} ${task}`);\n for (const item of inProg) console.log(` ${chalk.yellow('●')} ${item}`);\n for (const item of blockers) console.log(` ${chalk.red('✗')} ${item}`);\n for (const item of upNext) console.log(` ${chalk.dim('→')} ${item}`);\n console.log('');\n }\n\n // Shared context\n if (sharedLines.length > 0) {\n console.log(` ${chalk.bold('Shared context')} ${chalk.dim('(from other sessions)')}`);\n for (const line of sharedLines) {\n console.log(` ${chalk.dim(line)}`);\n }\n console.log('');\n }\n\n // History\n if (recentLogs.length > 0) {\n console.log(` ${chalk.bold('Recent sessions')} ${chalk.dim(`(${sessionCount} total)`)}`);\n for (const entry of recentLogs) {\n console.log(` ${chalk.dim('──')} ${chalk.cyan(entry.heading)}`);\n if (entry.body) {\n const preview = entry.body.split('\\n').filter(Boolean)[0] ?? '';\n if (preview) console.log(` ${chalk.dim(preview.slice(0, 72))}`);\n }\n }\n console.log('');\n }\n\n if (!projectOverview && !task && sessionCount === 0 && sharedLines.length === 0) {\n console.log(` ${chalk.dim('Memory files are blank — your AI hasn\\'t written anything yet.')}`);\n console.log(` ${chalk.dim('Start a session and let it run — it will fill these in automatically.')}`);\n console.log('');\n }\n\n console.log(` ${chalk.dim('─────────────────────────────────────────────────')}`);\n console.log(` ${chalk.dim('Powered by MindLink — github.com/404-not-found/mindlink')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { select, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, rmSync, unlinkSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\n\nexport const uninstallCommand = new Command('uninstall')\n .description('Remove MindLink from the current project')\n .option('-y, --yes', 'Skip confirmation and remove all project files')\n .addHelpText('after', `\nWhat gets removed:\n - .brain/ folder (all memory files)\n - Agent instruction files (CLAUDE.md, CURSOR.md, etc.)\n - .claude/settings.json hook (if it was created by MindLink)\n\nWhat stays:\n - The mindlink CLI itself (run: npm uninstall -g mindlink)\n - Any files MindLink did not create\n\nNot what you need?\n mindlink clear — reset SESSION.md only (fresh session, keep everything else)\n mindlink reset — wipe memory back to blank (keep MindLink installed)\n\nExamples:\n mindlink uninstall\n mindlink uninstall --yes\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Nothing to uninstall here.`);\n console.log('');\n process.exit(1);\n }\n\n // Read config to know which agent files to remove\n let agents: string[] = [];\n try {\n const cfg = JSON.parse(readFileSync(join(brainDir, 'config.json'), 'utf8'));\n agents = cfg.agents ?? [];\n } catch {\n // config unreadable — use all agents as a safe default\n agents = AGENTS.map(a => a.value);\n }\n\n console.log('');\n\n if (!opts.yes) {\n console.log(` ${chalk.yellow('!')} This will remove MindLink from this project:`);\n console.log(` ${chalk.dim('· .brain/ (all memory files)')}`);\n for (const v of agents) {\n const agent = AGENTS.find(a => a.value === v);\n if (agent) console.log(` ${chalk.dim('· ' + agent.destFile)}`);\n }\n if (agents.includes('claude')) {\n console.log(` ${chalk.dim('· .claude/settings.json (hook)')}`);\n }\n console.log('');\n console.log(` ${chalk.dim('The mindlink CLI itself is NOT removed.')}`);\n console.log(` ${chalk.dim('To remove the CLI: npm uninstall -g mindlink')}`);\n console.log('');\n console.log(` ${chalk.dim('Lighter options:')}`);\n console.log(` ${chalk.dim(' mindlink clear — fresh session only (keeps all memory)')}`);\n console.log(` ${chalk.dim(' mindlink reset — wipe memory (keeps MindLink installed)')}`);\n console.log('');\n\n const action = await select({\n message: 'Remove MindLink from this project?',\n options: [\n { value: 'remove', label: 'Yes, remove everything listed above' },\n { value: 'cancel', label: 'Cancel' },\n ],\n });\n\n if (isCancel(action) || action === 'cancel') {\n cancel('Cancelled.');\n console.log('');\n return;\n }\n console.log('');\n }\n\n const removed: string[] = [];\n const errors: string[] = [];\n\n // Remove .brain/\n try {\n rmSync(brainDir, { recursive: true, force: true });\n removed.push('.brain/');\n } catch (err: unknown) {\n errors.push(`.brain/: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Remove agent instruction files\n for (const v of agents) {\n const agent = AGENTS.find(a => a.value === v);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n if (existsSync(destPath)) {\n try {\n unlinkSync(destPath);\n removed.push(agent.destFile);\n } catch (err: unknown) {\n errors.push(`${agent.destFile}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n\n // Remove .claude/settings.json (only if agent was claude)\n if (agents.includes('claude')) {\n const hookPath = join(projectPath, '.claude', 'settings.json');\n if (existsSync(hookPath)) {\n try {\n unlinkSync(hookPath);\n removed.push('.claude/settings.json');\n } catch {\n // non-fatal — user may have customised this file\n }\n }\n }\n\n for (const f of removed) console.log(` ${chalk.green('✓')} ${f} removed.`);\n for (const e of errors) console.log(` ${chalk.red('✗')} ${e}`);\n\n console.log('');\n console.log(` ${chalk.dim('MindLink removed from this project.')}`);\n console.log(` ${chalk.dim('To remove the CLI itself: npm uninstall -g mindlink')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { text, confirm, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readdirSync } from 'fs';\nimport { join, resolve, basename } from 'path';\nimport AdmZip from 'adm-zip';\nimport { BRAIN_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\n\nexport const exportCommand = new Command('export')\n .description('Export .brain/ memory to a shareable zip file')\n .option('--output <path>', 'Directory or full path to save the zip file')\n .option('--include-agents', 'Also include agent instruction files (CLAUDE.md, CURSOR.md, etc.)')\n .addHelpText('after', `\nWhat gets exported:\n - .brain/MEMORY.md — permanent project facts\n - .brain/SESSION.md — current session state\n - .brain/SHARED.md — shared context across sessions\n - .brain/LOG.md — full session history\n - .brain/config.json — settings (excluded by default; use --include-agents for agent files)\n\nUse cases:\n Onboard a new teammate — send them the zip; they run: mindlink import brain.zip\n Back up before reset — export first, then mindlink reset\n Share project context — hand off to a consultant without giving repo access\n\nExamples:\n mindlink export\n mindlink export --output ~/Desktop\n mindlink export --output ~/Desktop/my-app-brain.zip\n mindlink export --include-agents\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log('');\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n console.log('');\n\n // --- Determine output path ---\n const projectName = basename(projectPath);\n const date = new Date().toISOString().slice(0, 10);\n const defaultFilename = `${projectName}-brain-${date}.zip`;\n\n let outputPath: string;\n\n if (opts.output) {\n // If they gave a directory, append default filename\n const given = resolve(opts.output);\n if (existsSync(given) && !given.endsWith('.zip')) {\n outputPath = join(given, defaultFilename);\n } else {\n outputPath = given;\n }\n } else if (process.stdin.isTTY) {\n // Interactive: prompt for location\n const answer = await text({\n message: 'Where should the zip be saved?',\n placeholder: projectPath,\n initialValue: projectPath,\n\n });\n\n if (isCancel(answer)) { cancel('Cancelled.'); process.exit(0); }\n\n const dest = resolve(answer as string);\n // If the answer is a directory (or ends without .zip), append default filename\n if (!dest.endsWith('.zip')) {\n outputPath = join(dest, defaultFilename);\n } else {\n outputPath = dest;\n }\n } else {\n // Non-interactive: drop in cwd\n outputPath = join(projectPath, defaultFilename);\n }\n\n // --- Build zip ---\n const zip = new AdmZip();\n\n // Core .brain/ files\n const brainFiles = ['MEMORY.md', 'SESSION.md', 'SHARED.md', 'LOG.md'];\n const included: string[] = [];\n const skipped: string[] = [];\n\n for (const file of brainFiles) {\n const filePath = join(brainDir, file);\n if (existsSync(filePath)) {\n zip.addLocalFile(filePath, '.brain');\n included.push(`.brain/${file}`);\n } else {\n skipped.push(`.brain/${file}`);\n }\n }\n\n // Also include any LOG archive files\n const archiveFiles = readdirSync(brainDir).filter(f => /^LOG-\\d{4}-\\d{2}-\\d{2}\\.md$/.test(f));\n for (const file of archiveFiles) {\n zip.addLocalFile(join(brainDir, file), '.brain');\n included.push(`.brain/${file}`);\n }\n\n // Agent instruction files (optional)\n if (opts.includeAgents) {\n for (const agent of AGENTS) {\n const agentPath = join(projectPath, agent.destFile);\n if (existsSync(agentPath)) {\n const dir = agent.destFile.includes('/') ? agent.destFile.split('/').slice(0, -1).join('/') : '';\n zip.addLocalFile(agentPath, dir);\n included.push(agent.destFile);\n }\n }\n }\n\n // Write zip\n try {\n zip.writeZip(outputPath);\n } catch (err: unknown) {\n console.log(` ${chalk.red('✗')} Could not write zip: ${err instanceof Error ? err.message : String(err)}`);\n console.log('');\n process.exit(1);\n }\n\n // --- Output ---\n for (const f of included) console.log(` ${chalk.green('✓')} ${f}`);\n if (skipped.length > 0) {\n for (const f of skipped) console.log(` ${chalk.dim('–')} ${f} ${chalk.dim('(not found, skipped)')}`);\n }\n console.log('');\n console.log(` ${chalk.green('✓')} Exported to: ${chalk.bold(outputPath)}`);\n console.log('');\n console.log(` ${chalk.dim('To import on another machine or project:')}`);\n console.log(` ${chalk.cyan(`mindlink import ${basename(outputPath)}`)}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport { select, isCancel, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, mkdirSync } from 'fs';\nimport { join, resolve, extname } from 'path';\nimport AdmZip from 'adm-zip';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nexport const importCommand = new Command('import')\n .description('Import a MindLink memory zip into the current project')\n .argument('<file>', 'Path to the .zip file exported by mindlink export')\n .option('-y, --yes', 'Skip confirmation and overwrite existing memory')\n .addHelpText('after', `\nWhat gets imported:\n All .brain/ files found in the zip (MEMORY.md, SESSION.md, SHARED.md, LOG.md,\n and any LOG archive files). Agent instruction files are also imported if the zip\n contains them.\n\nIf .brain/ already exists, you will be asked whether to:\n Merge — import only files that don't exist yet (keeps your current memory)\n Overwrite — replace everything (use when onboarding from a teammate's export)\n Cancel — do nothing\n\nUse cases:\n Onboard on a new machine — copy the zip, run: mindlink import brain.zip\n Restore from backup — mindlink import my-app-brain-2026-04-10.zip\n Accept a colleague's brain — merge their context into your project\n\nExamples:\n mindlink import my-app-brain-2026-04-10.zip\n mindlink import ~/Desktop/my-app-brain-2026-04-10.zip --yes\n `)\n .action(async (file, opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n const zipPath = resolve(file);\n\n console.log('');\n\n if (!existsSync(zipPath)) {\n console.log(` ${chalk.red('✗')} File not found: ${zipPath}`);\n console.log('');\n process.exit(1);\n }\n\n if (extname(zipPath) !== '.zip') {\n console.log(` ${chalk.red('✗')} Expected a .zip file. Got: ${zipPath}`);\n console.log('');\n process.exit(1);\n }\n\n // --- Load and validate zip ---\n let zip: AdmZip;\n try {\n zip = new AdmZip(zipPath);\n } catch (err: unknown) {\n console.log(` ${chalk.red('✗')} Could not read zip: ${err instanceof Error ? err.message : String(err)}`);\n console.log('');\n process.exit(1);\n }\n\n const entries = zip.getEntries();\n const brainEntries = entries.filter(e => e.entryName.startsWith('.brain/') && !e.isDirectory);\n\n if (brainEntries.length === 0) {\n console.log(` ${chalk.red('✗')} This zip doesn't contain any .brain/ files.`);\n console.log(` Make sure it was created with ${chalk.cyan('mindlink export')}.`);\n console.log('');\n process.exit(1);\n }\n\n // --- Handle existing .brain/ ---\n let mode: 'merge' | 'overwrite' = 'overwrite';\n\n if (existsSync(brainDir)) {\n if (opts.yes) {\n mode = 'overwrite';\n } else {\n console.log(` ${chalk.yellow('!')} .brain/ already exists in this project.`);\n console.log('');\n\n const action = await select({\n message: 'How should the import handle existing memory?',\n options: [\n { value: 'merge', label: 'Merge', hint: 'add files that don\\'t exist yet — keep your current memory' },\n { value: 'overwrite', label: 'Overwrite', hint: 'replace everything with the imported version' },\n { value: 'cancel', label: 'Cancel', hint: '' },\n ],\n });\n\n if (isCancel(action) || action === 'cancel') {\n cancel('Cancelled.');\n console.log('');\n return;\n }\n\n mode = action as 'merge' | 'overwrite';\n console.log('');\n }\n }\n\n // --- Extract ---\n mkdirSync(brainDir, { recursive: true });\n\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory) continue;\n\n const destPath = join(projectPath, entry.entryName);\n const destDir = join(projectPath, entry.entryName.split('/').slice(0, -1).join('/'));\n\n if (mode === 'merge' && existsSync(destPath)) {\n skipped.push(entry.entryName);\n continue;\n }\n\n mkdirSync(destDir, { recursive: true });\n zip.extractEntryTo(entry, destDir, false, true);\n written.push(entry.entryName);\n }\n\n // --- Output ---\n for (const f of written) console.log(` ${chalk.green('✓')} ${f}`);\n for (const f of skipped) console.log(` ${chalk.dim('–')} ${f} ${chalk.dim('(already exists, kept)')}`);\n console.log('');\n\n if (written.length === 0) {\n console.log(` ${chalk.dim('Nothing imported — all files already exist (merge mode).')}`);\n } else {\n console.log(` ${chalk.green('✓')} Brain transplant complete. Your AI wakes up knowing everything.`);\n if (!existsSync(join(brainDir, '../CLAUDE.md')) && !existsSync(join(brainDir, '../CURSOR.md'))) {\n console.log(` ${chalk.dim('No agent instruction files found — run mindlink init to wire them up.')}`);\n }\n }\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync, readdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\nimport { extractSection, parseLogEntries, relativeTime } from '../utils/parser.js';\n\nconst CORE_LINE_LIMIT = 50;\nconst CORE_WARN_THRESHOLD = 40;\n\ntype CheckStatus = 'ok' | 'warn' | 'fail' | 'info';\n\ninterface Check {\n status: CheckStatus;\n label: string;\n detail?: string;\n}\n\nfunction ok(label: string, detail?: string): Check { return { status: 'ok', label, detail }; }\nfunction warn(label: string, detail?: string): Check { return { status: 'warn', label, detail }; }\nfunction fail(label: string, detail?: string): Check { return { status: 'fail', label, detail }; }\nfunction info(label: string, detail?: string): Check { return { status: 'info', label, detail }; }\n\nfunction icon(status: CheckStatus): string {\n switch (status) {\n case 'ok': return chalk.green('✓');\n case 'warn': return chalk.yellow('!');\n case 'fail': return chalk.red('✗');\n case 'info': return chalk.dim('·');\n }\n}\n\nexport const doctorCommand = new Command('doctor')\n .description('Check that your MindLink setup is healthy')\n .addHelpText('after', `\nWhat gets checked:\n .brain/ — exists and contains all expected files\n MEMORY.md — Core has content; warns if Core is getting too long to reliably read\n SESSION.md — has content (agent is updating it)\n LOG.md — session count, how far back history goes, warns when oldest sessions near rotation\n Agent files — instruction files exist per your config.json\n Hook — .claude/settings.json exists (if Claude Code is configured)\n\nExamples:\n mindlink doctor\n `)\n .action(() => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink Doctor')}`);\n console.log(` ${chalk.dim(projectPath)}`);\n console.log('');\n\n const checks: Check[] = [];\n let failCount = 0;\n let warnCount = 0;\n\n // ── 1. .brain/ exists ───────────────────────────────────────────────────\n if (!existsSync(brainDir)) {\n checks.push(fail('.brain/ missing', `Run ${chalk.cyan('mindlink init')} to get started.`));\n printChecks(checks);\n process.exit(1);\n }\n checks.push(ok('.brain/ found'));\n\n // ── 2. config.json ──────────────────────────────────────────────────────\n const configPath = join(brainDir, 'config.json');\n let config: { agents?: string[]; gitTracking?: boolean; autoSync?: boolean; maxLogEntries?: number } = {};\n if (!existsSync(configPath)) {\n checks.push(warn('config.json missing', `Run ${chalk.cyan('mindlink config')} to repair.`));\n } else {\n try {\n config = JSON.parse(readFileSync(configPath, 'utf8'));\n checks.push(ok('config.json valid'));\n } catch {\n checks.push(warn('config.json unreadable', 'File may be corrupted — delete and re-run mindlink init.'));\n }\n }\n\n // ── 3. MEMORY.md ────────────────────────────────────────────────────────\n const memoryPath = join(brainDir, 'MEMORY.md');\n if (!existsSync(memoryPath)) {\n checks.push(fail('MEMORY.md missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const memoryMd = readFileSync(memoryPath, 'utf8');\n const coreSection = extractSection(memoryMd, 'Core');\n const coreLines = coreSection.split('\\n').filter(l => l.trim().length > 0 && !l.startsWith('<!--')).length;\n\n if (coreLines === 0) {\n checks.push(warn('MEMORY.md Core is empty', 'Your AI has no permanent facts yet. It will fill this in automatically at the start of the next session.'));\n } else if (coreLines >= CORE_LINE_LIMIT) {\n checks.push(warn(\n 'MEMORY.md Core is getting too long',\n 'Ask your AI to consolidate — Core is read every session start, so keep it tight.'\n ));\n } else if (coreLines >= CORE_WARN_THRESHOLD) {\n checks.push(warn(\n 'MEMORY.md Core is getting long',\n 'Consider asking your AI to consolidate — Core is read on every session start.'\n ));\n } else {\n checks.push(ok('MEMORY.md Core has content'));\n }\n }\n\n // ── 4. SESSION.md ───────────────────────────────────────────────────────\n const sessionPath = join(brainDir, 'SESSION.md');\n if (!existsSync(sessionPath)) {\n checks.push(fail('SESSION.md missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const sessionMd = readFileSync(sessionPath, 'utf8');\n const hasContent = sessionMd.split('\\n').some(l => l.trim().length > 0 && !l.startsWith('<!--') && !l.startsWith('#'));\n const mtime = statSync(sessionPath).mtime;\n const age = relativeTime(mtime);\n\n if (!hasContent) {\n checks.push(warn('SESSION.md has no content yet', 'Start an AI session — it will fill this in automatically.'));\n } else {\n checks.push(ok(`SESSION.md — updated ${age}`));\n }\n }\n\n // ── 5. LOG.md ───────────────────────────────────────────────────────────\n const logPath = join(brainDir, 'LOG.md');\n if (!existsSync(logPath)) {\n checks.push(fail('LOG.md missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const logMd = readFileSync(logPath, 'utf8');\n const entries = parseLogEntries(logMd);\n const entryCount = entries.length;\n const maxEntries: number = (config as any).maxLogEntries ?? 50;\n\n if (entryCount === 0) {\n checks.push(info('LOG.md — no sessions yet, start your first AI session'));\n } else {\n // Newest entry = last in file (append order)\n const newestHeading = entries[entries.length - 1].heading;\n const oldestHeading = entries[0].heading;\n const remaining = maxEntries - entryCount;\n\n if (remaining <= 3 && remaining > 0) {\n checks.push(warn(\n `LOG.md — ${entryCount}/${maxEntries} sessions, ${remaining} until oldest start archiving`,\n `Oldest session on record: ${oldestHeading} — it will be archived soon. Important decisions belong in MEMORY.md where they never rotate out.`\n ));\n } else if (remaining <= 0) {\n checks.push(warn(\n `LOG.md — at ${maxEntries}-session limit, oldest are being archived`,\n `Oldest session on record: ${oldestHeading}. Anything important should be in MEMORY.md.`\n ));\n } else {\n checks.push(ok(`LOG.md — ${entryCount} sessions logged (last: ${newestHeading}, going back to: ${oldestHeading})`));\n }\n }\n\n // Archive files\n const archives = readdirSync(brainDir).filter(f => /^LOG-\\d{4}-\\d{2}\\.md$/.test(f));\n if (archives.length > 0) {\n checks.push(info(`${archives.length} archive file${archives.length !== 1 ? 's' : ''} — old sessions are stored in LOG-*.md, not gone`));\n }\n }\n\n // ── 6. Agent instruction files ──────────────────────────────────────────\n const configuredAgents: string[] = config.agents ?? [];\n if (configuredAgents.length === 0) {\n checks.push(warn('No agents configured', `Run ${chalk.cyan('mindlink config')} → Agent instruction files.`));\n } else {\n for (const agentValue of configuredAgents) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n if (!existsSync(destPath)) {\n checks.push(fail(`${agent.destFile} missing`, `Run ${chalk.cyan('mindlink config')} → Agent instruction files to recreate.`));\n } else {\n checks.push(ok(`${agent.destFile} — ${agent.label}`));\n }\n }\n }\n\n // ── 7. Claude Code hook ──────────────────────────────────────────────────\n if (configuredAgents.includes('claude')) {\n const hookPath = join(projectPath, '.claude', 'settings.json');\n if (!existsSync(hookPath)) {\n checks.push(warn(\n '.claude/settings.json missing',\n `Claude Code won't auto-reload after context compaction. Run ${chalk.cyan('mindlink config')} → Agent instruction files to restore.`\n ));\n } else {\n try {\n const settings = JSON.parse(readFileSync(hookPath, 'utf8'));\n const hasHook = settings?.hooks?.UserPromptSubmit != null;\n if (!hasHook) {\n checks.push(warn('.claude/settings.json exists but MindLink hook not found', 'Hook may have been removed — check the file manually.'));\n } else {\n checks.push(ok('.claude/settings.json — UserPromptSubmit hook active'));\n }\n } catch {\n checks.push(warn('.claude/settings.json is not valid JSON', 'Fix or delete it to restore the hook.'));\n }\n }\n }\n\n // ── 8. Git tracking notice ───────────────────────────────────────────────\n if (config.gitTracking === false) {\n checks.push(info('.brain/ is excluded from git (personal memory only)'));\n } else if (config.gitTracking === true) {\n checks.push(info('.brain/ is committed to git (shared team memory)'));\n }\n\n // ── Summary ──────────────────────────────────────────────────────────────\n for (const c of checks) {\n if (c.status === 'fail') failCount++;\n if (c.status === 'warn') warnCount++;\n }\n\n printChecks(checks);\n\n if (failCount > 0) {\n console.log(` ${chalk.red.bold(`${failCount} problem${failCount !== 1 ? 's' : ''} found`)} — fix the issues above and re-run ${chalk.cyan('mindlink doctor')}.`);\n } else if (warnCount > 0) {\n console.log(` ${chalk.yellow.bold(`${warnCount} warning${warnCount !== 1 ? 's' : ''}`)}, no critical issues. Your AI will still work.`);\n } else {\n console.log(` ${chalk.green.bold('All good.')} Your AI has a healthy brain.`);\n }\n console.log('');\n\n if (failCount > 0) process.exit(1);\n });\n\nfunction printChecks(checks: Check[]): void {\n for (const c of checks) {\n const prefix = ` ${icon(c.status)} `;\n console.log(`${prefix}${c.label}`);\n if (c.detail) {\n console.log(` ${chalk.dim(c.detail)}`);\n }\n }\n console.log('');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { VERSION } from '../utils/version.js';\n\nexport const versionCommand = new Command('version')\n .description('Show the current MindLink version')\n .action(() => {\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink')} v${VERSION}`);\n console.log('');\n console.log(` ${chalk.dim('Run')} ${chalk.cyan('mindlink update')} ${chalk.dim('to check for a newer version.')}`);\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { execSync } from 'child_process';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\nconst BRAIN_FILES = ['MEMORY.md', 'SESSION.md', 'LOG.md', 'SHARED.md'];\n\nfunction relativeTime(ms: number): string {\n const secs = Math.floor(ms / 1000);\n if (secs < 60) return `${secs}s ago`;\n const mins = Math.floor(secs / 60);\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n return `${Math.floor(hours / 24)}d ago`;\n}\n\n/** Try to get git diff for a file since the last commit (or HEAD~1). Returns null if not in git. */\nfunction getGitDiff(filePath: string, since?: string): string | null {\n try {\n const dir = resolve(filePath, '..');\n // Check if in git\n execSync('git rev-parse --is-inside-work-tree', { cwd: dir, stdio: 'pipe' });\n const ref = since || 'HEAD~1';\n const diff = execSync(`git diff ${ref} -- \"${filePath}\"`, {\n cwd: dir,\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return diff || null;\n } catch {\n return null;\n }\n}\n\n/** Summarize additions/removals from a unified diff string */\nfunction parseDiffSummary(diff: string): { added: string[]; removed: string[] } {\n const added: string[] = [];\n const removed: string[] = [];\n for (const line of diff.split('\\n')) {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n const t = line.slice(1).trim();\n if (t && !t.startsWith('<!--') && !t.startsWith('#') && t !== '---') added.push(t);\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n const t = line.slice(1).trim();\n if (t && !t.startsWith('<!--') && !t.startsWith('#') && t !== '---') removed.push(t);\n }\n }\n return { added, removed };\n}\n\nexport const diffCommand = new Command('diff')\n .description('Show what changed in .brain/ since last session')\n .option('--since <ref>', 'Git ref or date to diff against (default: last mindlink clear or HEAD~1)')\n .option('--json', 'Output as JSON')\n .addHelpText('after', `\nWhat it does:\n Shows what changed in each .brain/ file since your last session.\n Uses git diff when .brain/ is tracked; falls back to file modification times.\n\nExamples:\n mindlink diff\n mindlink diff --since HEAD~3\n mindlink diff --since \"2026-04-10\"\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n\n if (!existsSync(brainDir)) {\n console.log('');\n console.log(` ${chalk.red('✗')} No .brain/ found in this directory.`);\n console.log(` Run ${chalk.cyan('mindlink init')} to get started.`);\n console.log('');\n process.exit(1);\n }\n\n const results: Record<string, {\n exists: boolean;\n mtime?: number;\n diff?: string | null;\n added?: string[];\n removed?: string[];\n sizeLines?: number;\n }> = {};\n\n // Get session start timestamp (from .session_ts if available)\n const sessionTsPath = join(brainDir, '.session_ts');\n const sessionTs = existsSync(sessionTsPath)\n ? parseInt(readFileSync(sessionTsPath, 'utf8').trim(), 10) * 1000\n : null;\n\n const now = Date.now();\n const isGitTracked = (() => {\n try {\n execSync('git rev-parse --is-inside-work-tree', { cwd: projectPath, stdio: 'pipe' });\n // Check if .brain/ is tracked\n const tracked = execSync('git ls-files --error-unmatch .brain/MEMORY.md', {\n cwd: projectPath, stdio: 'pipe',\n });\n return true;\n } catch {\n return false;\n }\n })();\n\n for (const file of BRAIN_FILES) {\n const filePath = join(brainDir, file);\n if (!existsSync(filePath)) {\n results[file] = { exists: false };\n continue;\n }\n const stat = statSync(filePath);\n const mtime = stat.mtimeMs;\n const content = readFileSync(filePath, 'utf8');\n const sizeLines = content.split('\\n').length;\n\n let diff: string | null = null;\n let added: string[] = [];\n let removed: string[] = [];\n\n if (isGitTracked) {\n diff = getGitDiff(filePath, opts.since);\n if (diff) {\n const summary = parseDiffSummary(diff);\n added = summary.added.slice(0, 5);\n removed = summary.removed.slice(0, 5);\n }\n }\n\n results[file] = { exists: true, mtime, diff, added, removed, sizeLines };\n }\n\n if (opts.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n console.log('');\n console.log(` ${chalk.bold('.brain/ changes')}`);\n if (sessionTs) {\n console.log(` ${chalk.dim(`Session started ${relativeTime(now - sessionTs)}`)}`);\n }\n if (isGitTracked) {\n const sinceRef = opts.since || 'HEAD~1';\n console.log(` ${chalk.dim(`Git diff against: ${sinceRef}`)}`);\n } else {\n console.log(` ${chalk.dim('.brain/ is not git-tracked — showing modification times only')}`);\n }\n console.log('');\n\n for (const file of BRAIN_FILES) {\n const r = results[file];\n if (!r.exists) {\n console.log(` ${chalk.dim('—')} ${file} ${chalk.dim('(not found)')}`);\n continue;\n }\n\n const age = r.mtime ? relativeTime(now - r.mtime) : '';\n const changedThisSession = sessionTs && r.mtime ? r.mtime > sessionTs : false;\n const indicator = changedThisSession ? chalk.green('●') : chalk.dim('○');\n const label = changedThisSession ? chalk.green(file) : chalk.dim(file);\n\n console.log(` ${indicator} ${label} ${chalk.dim(`${r.sizeLines} lines · modified ${age}`)}`);\n\n if (isGitTracked && r.diff) {\n for (const line of (r.added ?? []).slice(0, 3)) {\n console.log(` ${chalk.green('+')} ${line.length > 80 ? line.slice(0, 80) + '…' : line}`);\n }\n for (const line of (r.removed ?? []).slice(0, 3)) {\n console.log(` ${chalk.red('-')} ${line.length > 80 ? line.slice(0, 80) + '…' : line}`);\n }\n } else if (!isGitTracked && changedThisSession) {\n console.log(` ${chalk.dim('(content diff unavailable — commit .brain/ to git for line-level diff)')}`);\n } else if (isGitTracked && !r.diff) {\n console.log(` ${chalk.dim('no changes since last commit')}`);\n }\n }\n\n console.log('');\n\n const changedCount = BRAIN_FILES.filter(f => {\n const r = results[f];\n return r.exists && sessionTs && r.mtime && r.mtime > sessionTs;\n }).length;\n\n if (changedCount === 0) {\n console.log(` ${chalk.dim('No .brain/ files were modified this session.')}`);\n if (sessionTs) {\n console.log(` ${chalk.dim('If the session just started, this is expected.')}`);\n }\n } else {\n console.log(` ${chalk.green('✓')} ${changedCount} file${changedCount !== 1 ? 's' : ''} updated this session.`);\n }\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, statSync, mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR, AGENT_TEMPLATES_DIR, HOOKS_TEMPLATES_DIR } from '../utils/paths.js';\nimport { AGENTS } from '../utils/agents.js';\nimport { sectionHasRealContent, countRealLines } from '../utils/content.js';\n\nconst SESSION_WARN_DAYS = 3;\nconst SESSION_FAIL_DAYS = 7;\nconst MEMORY_WARN_LINES = 100;\nconst MEMORY_FAIL_LINES = 200;\n\nexport interface CheckResult {\n id: string;\n label: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n fixable: boolean;\n}\n\nfunction pass(id: string, label: string, message: string): CheckResult {\n return { id, label, status: 'pass', message, fixable: false };\n}\nfunction warn(id: string, label: string, message: string, fixable = false): CheckResult {\n return { id, label, status: 'warn', message, fixable };\n}\nfunction fail(id: string, label: string, message: string, fixable = false): CheckResult {\n return { id, label, status: 'fail', message, fixable };\n}\n\nfunction icon(status: 'pass' | 'warn' | 'fail'): string {\n switch (status) {\n case 'pass': return chalk.green('✓');\n case 'warn': return chalk.yellow('⚠');\n case 'fail': return chalk.red('✗');\n }\n}\n\nexport function runChecks(projectPath: string): CheckResult[] {\n const brainDir = join(projectPath, BRAIN_DIR);\n const results: CheckResult[] = [];\n\n if (!existsSync(brainDir)) {\n results.push(fail('brain_missing', '.brain/ missing', `Run ${chalk.cyan('mindlink init')} to set up memory.`));\n return results;\n }\n\n // ── config ──────────────────────────────────────────────────────────────────\n const configPath = join(brainDir, 'config.json');\n let config: { agents?: string[] } = {};\n if (existsSync(configPath)) {\n try { config = JSON.parse(readFileSync(configPath, 'utf8')); } catch {}\n }\n\n // ── 1. core ──────────────────────────────────────────────────────────────────\n const memoryPath = join(brainDir, 'MEMORY.md');\n if (!existsSync(memoryPath)) {\n results.push(fail('core', 'Core section', `MEMORY.md is missing — run ${chalk.cyan('mindlink init')}.`));\n } else {\n const memMd = readFileSync(memoryPath, 'utf8');\n if (!sectionHasRealContent(memMd, 'Core')) {\n results.push(fail('core', 'Core section — empty', 'Start a session and tell your AI to fill in the Core section.'));\n } else {\n results.push(pass('core', 'Core section — filled', ''));\n }\n }\n\n // ── 2. user_profile ──────────────────────────────────────────────────────────\n if (existsSync(memoryPath)) {\n const memMd = readFileSync(memoryPath, 'utf8');\n if (!sectionHasRealContent(memMd, 'User Profile')) {\n results.push(fail('user_profile', 'User Profile — empty', `Run ${chalk.cyan('mindlink profile')} to set up your global profile and import it here.`));\n } else {\n results.push(pass('user_profile', 'User Profile — filled', ''));\n }\n }\n\n // ── 3. session_fresh ────────────────────────────────────────────────────────\n const sessionPath = join(brainDir, 'SESSION.md');\n if (!existsSync(sessionPath)) {\n results.push(fail('session_fresh', 'SESSION.md — missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const ageDays = (Date.now() - statSync(sessionPath).mtime.getTime()) / 86400000;\n const hasContent = readFileSync(sessionPath, 'utf8')\n .split('\\n')\n .some(l => l.trim().length > 0 && !l.startsWith('#') && !l.startsWith('<!--'));\n\n if (!hasContent) {\n results.push(warn('session_fresh', 'SESSION.md — no content yet', 'Start a session — your AI will fill this in automatically.'));\n } else if (ageDays > SESSION_FAIL_DAYS) {\n const days = Math.floor(ageDays);\n results.push(fail('session_fresh', `SESSION.md — last updated ${days} days ago`, 'SESSION.md has not been updated in a week. Your AI may not be writing session state. Check that it is completing the REQUIRED session-end steps.'));\n } else if (ageDays > SESSION_WARN_DAYS) {\n const days = Math.floor(ageDays);\n results.push(warn('session_fresh', `SESSION.md — last updated ${days} days ago`, 'SESSION.md is getting stale. If you have active sessions, your AI should be updating this after each response.'));\n } else {\n const mins = Math.floor((Date.now() - statSync(sessionPath).mtime.getTime()) / 60000);\n const age = mins < 60 ? `${mins}m ago` : mins < 1440 ? `${Math.floor(mins / 60)}h ago` : `${Math.floor(mins / 1440)}d ago`;\n results.push(pass('session_fresh', `SESSION.md — updated ${age}`, ''));\n }\n }\n\n // ── 4. log_present ───────────────────────────────────────────────────────────\n const logPath = join(brainDir, 'LOG.md');\n if (!existsSync(logPath)) {\n results.push(fail('log_present', 'LOG.md — missing', `Run ${chalk.cyan('mindlink init')} to recreate it.`));\n } else {\n const entries = (readFileSync(logPath, 'utf8').match(/^##\\s+/gm) ?? []).length;\n if (entries === 0) {\n results.push(pass('log_present', 'LOG.md — no sessions yet', ''));\n } else {\n results.push(pass('log_present', `LOG.md — ${entries} session${entries !== 1 ? 's' : ''} logged`, ''));\n }\n }\n\n // ── 5. memory_size ───────────────────────────────────────────────────────────\n if (existsSync(memoryPath)) {\n const memMd = readFileSync(memoryPath, 'utf8');\n const lines = countRealLines(memMd);\n if (lines > MEMORY_FAIL_LINES) {\n results.push(fail('memory_size', `MEMORY.md — ${lines} lines (target: under ${MEMORY_FAIL_LINES})`, `Run ${chalk.cyan('mindlink prune')} to consolidate stale entries.`));\n } else if (lines > MEMORY_WARN_LINES) {\n results.push(warn('memory_size', `MEMORY.md — ${lines} lines (getting long)`, `Consider running ${chalk.cyan('mindlink prune')} to retire old entries.`));\n } else {\n results.push(pass('memory_size', `MEMORY.md — ${lines} line${lines !== 1 ? 's' : ''} (healthy)`, ''));\n }\n }\n\n // ── 6. agent_files ───────────────────────────────────────────────────────────\n const configuredAgents: string[] = config.agents ?? [];\n if (configuredAgents.length === 0) {\n results.push(warn('agent_files', 'No agents configured', `Run ${chalk.cyan('mindlink config')} → Agent instruction files.`, false));\n } else {\n const missing: string[] = [];\n for (const agentValue of configuredAgents) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n if (!existsSync(join(projectPath, agent.destFile))) missing.push(agent.destFile);\n }\n if (missing.length === configuredAgents.length) {\n results.push(fail('agent_files', 'Agent files — none present', `All configured agent files are missing. Run ${chalk.cyan('mindlink verify --fix')} to regenerate.`, true));\n } else if (missing.length > 0) {\n results.push(warn('agent_files', `Agent files — ${missing.length} missing: ${missing.join(', ')}`, `Run ${chalk.cyan('mindlink verify --fix')} to regenerate.`, true));\n } else {\n results.push(pass('agent_files', `Agent files — all ${configuredAgents.length} present`, ''));\n }\n }\n\n return results;\n}\n\nfunction applyFix(projectPath: string, results: CheckResult[]): void {\n const brainDir = join(projectPath, BRAIN_DIR);\n const configPath = join(brainDir, 'config.json');\n let config: { agents?: string[] } = {};\n if (existsSync(configPath)) {\n try { config = JSON.parse(readFileSync(configPath, 'utf8')); } catch {}\n }\n\n const fixable = results.filter(r => r.fixable && r.status !== 'pass');\n if (fixable.length === 0) {\n console.log(` ${chalk.dim('Nothing to auto-fix. Address the issues above manually.')}`);\n return;\n }\n\n let fixed = 0;\n for (const r of fixable) {\n if (r.id === 'agent_files') {\n const configuredAgents: string[] = config.agents ?? [];\n for (const agentValue of configuredAgents) {\n const agent = AGENTS.find(a => a.value === agentValue);\n if (!agent) continue;\n const destPath = join(projectPath, agent.destFile);\n if (!existsSync(destPath)) {\n try {\n mkdirSync(dirname(destPath), { recursive: true });\n writeFileSync(destPath, readFileSync(join(AGENT_TEMPLATES_DIR, agent.templateFile), 'utf8'));\n console.log(` ${chalk.green('✓')} Regenerated ${agent.destFile}`);\n fixed++;\n } catch (err) {\n console.log(` ${chalk.red('✗')} Failed to regenerate ${agent.destFile}: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n // Also restore .claude/settings.json if claude is configured\n if (configuredAgents.includes('claude')) {\n const hookPath = join(projectPath, '.claude', 'settings.json');\n if (!existsSync(hookPath)) {\n try {\n mkdirSync(dirname(hookPath), { recursive: true });\n writeFileSync(hookPath, readFileSync(join(HOOKS_TEMPLATES_DIR, 'claude-settings.json'), 'utf8'));\n console.log(` ${chalk.green('✓')} Regenerated .claude/settings.json`);\n fixed++;\n } catch {}\n }\n }\n }\n }\n\n // Print non-fixable guidance\n for (const r of results) {\n if (r.status === 'fail' || r.status === 'warn') {\n if (r.id === 'core' || r.id === 'user_profile') {\n console.log(` ${chalk.dim('→')} ${r.id === 'core' ? 'Core' : 'User Profile'}: start a session and tell your AI to fill this in.`);\n } else if (r.id === 'memory_size') {\n console.log(` ${chalk.dim('→')} MEMORY.md too large: run ${chalk.cyan('mindlink prune')} to consolidate.`);\n }\n }\n }\n\n if (fixed > 0) console.log('');\n}\n\nexport const verifyCommand = new Command('verify')\n .description('Check that .brain/ memory is healthy and up-to-date')\n .option('--json', 'Output results as JSON')\n .option('--fix', 'Auto-fix recoverable issues (regenerate missing agent files)')\n .addHelpText('after', `\nWhat is checked:\n Core — MEMORY.md Core section has real content\n User Profile — MEMORY.md User Profile has real content\n SESSION.md — was updated recently (warn >3 days, fail >7 days)\n LOG.md — present and readable\n MEMORY.md size — line count (warn >100, fail >200)\n Agent files — all files from config.json are present on disk\n\nExamples:\n mindlink verify\n mindlink verify --json\n mindlink verify --fix\n `)\n .action((opts) => {\n const projectPath = resolve(process.cwd());\n const results = runChecks(projectPath);\n\n if (opts.json) {\n console.log(JSON.stringify({ ok: results.every(r => r.status === 'pass'), checks: results }, null, 2));\n const hasFailure = results.some(r => r.status === 'fail');\n process.exit(hasFailure ? 1 : 0);\n }\n\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink Verify')}`);\n console.log(` ${chalk.dim(projectPath)}`);\n console.log('');\n\n for (const r of results) {\n console.log(` ${icon(r.status)} ${r.label}`);\n if (r.message) console.log(` ${chalk.dim(r.message)}`);\n }\n console.log('');\n\n const failCount = results.filter(r => r.status === 'fail').length;\n const warnCount = results.filter(r => r.status === 'warn').length;\n const fixableCount = results.filter(r => r.fixable && r.status !== 'pass').length;\n\n if (opts.fix) {\n applyFix(projectPath, results);\n }\n\n if (failCount > 0) {\n console.log(` ${chalk.red.bold(`${failCount} error${failCount !== 1 ? 's' : ''}`)}, ${warnCount} warning${warnCount !== 1 ? 's' : ''}.`);\n if (!opts.fix && fixableCount > 0) {\n console.log(` ${chalk.dim(`Run ${chalk.cyan('mindlink verify --fix')} to auto-repair ${fixableCount} issue${fixableCount !== 1 ? 's' : ''}.`)}`);\n }\n } else if (warnCount > 0) {\n console.log(` ${chalk.yellow.bold(`${warnCount} warning${warnCount !== 1 ? 's' : ''}`)}, no critical errors.`);\n } else {\n console.log(` ${chalk.green.bold('All good.')} Your AI's memory is healthy.`);\n }\n console.log('');\n\n if (failCount > 0) process.exit(1);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { execSync } from 'child_process';\nimport { GLOBAL_MINDLINK_DIR, GLOBAL_USER_PROFILE_PATH } from '../utils/paths.js';\n\nconst PROFILE_TEMPLATE = `# MindLink — Global User Profile\n\n> This file is imported into every new project's MEMORY.md on \\`mindlink init\\`.\n> Edit it with \\`mindlink profile\\`. Run \\`mindlink update\\` to sync changes to all projects.\n\n<!-- Role, company, title, level, years of experience -->\n<!-- Primary languages and tools -->\n<!-- Communication style and preferences -->\n<!-- Editor, OS, shell setup -->\n<!-- Added: ${new Date().toISOString().slice(0, 10)} -->\n`;\n\nfunction ensureProfileExists(): void {\n if (!existsSync(GLOBAL_MINDLINK_DIR)) {\n mkdirSync(GLOBAL_MINDLINK_DIR, { recursive: true });\n }\n if (!existsSync(GLOBAL_USER_PROFILE_PATH)) {\n writeFileSync(GLOBAL_USER_PROFILE_PATH, PROFILE_TEMPLATE);\n }\n}\n\nexport const profileCommand = new Command('profile')\n .description('Manage your global user profile (imported into every new project)')\n .option('--show', 'Print current profile to stdout')\n .option('--path', 'Print profile file path only')\n .addHelpText('after', `\nYour profile is stored at ~/.mindlink/USER.md and auto-imported into\nMEMORY.md when you run \\`mindlink init\\` on a new project.\n\nRun \\`mindlink update\\` to sync profile changes to all registered projects.\n\nExamples:\n mindlink profile # open profile in $EDITOR\n mindlink profile --show # print profile to stdout\n mindlink profile --path # print file path\n `)\n .action((opts) => {\n if (opts.path) {\n console.log(GLOBAL_USER_PROFILE_PATH);\n return;\n }\n\n if (opts.show) {\n if (!existsSync(GLOBAL_USER_PROFILE_PATH)) {\n console.log('');\n console.log(` ${chalk.yellow('⚠')} No global profile yet.`);\n console.log(` Run ${chalk.cyan('mindlink profile')} to create one.`);\n console.log('');\n return;\n }\n console.log('');\n console.log(readFileSync(GLOBAL_USER_PROFILE_PATH, 'utf8'));\n return;\n }\n\n // Open in $EDITOR\n ensureProfileExists();\n const editor = process.env.EDITOR || process.env.VISUAL || 'nano';\n console.log('');\n console.log(` ${chalk.dim(`Opening ${GLOBAL_USER_PROFILE_PATH} in ${editor}...`)}`);\n console.log(` ${chalk.dim('Run mindlink update after saving to sync to all registered projects.')}`);\n console.log('');\n\n try {\n execSync(`${editor} \"${GLOBAL_USER_PROFILE_PATH}\"`, { stdio: 'inherit' });\n console.log('');\n console.log(` ${chalk.green('✓')} Profile saved.`);\n console.log(` ${chalk.dim('→ Run mindlink update to sync to all registered projects.')}`);\n console.log('');\n } catch {\n // Editor exited non-zero (e.g. user hit Ctrl-C in nano) — not an error\n console.log('');\n }\n });\n","import { Command } from 'commander';\nimport { select, isCancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { BRAIN_DIR } from '../utils/paths.js';\n\n// Days after which an entry in a given section is considered stale\nconst STALENESS_THRESHOLDS: Record<string, number> = {\n 'current focus': 14,\n 'decisions': 180,\n 'conventions': 180,\n 'architecture': 365,\n // 'user profile' and 'important context' have no expiry\n};\n\ninterface TimestampedEntry {\n /** Section heading (e.g. \"Current Focus\") */\n section: string;\n /** The text of the entry (may span multiple lines) */\n text: string;\n /** ISO date from <!-- added: YYYY-MM-DD --> */\n addedDate: Date | null;\n /** Line index in the file where this entry starts (0-based) */\n lineStart: number;\n /** Line index where this entry ends (exclusive) */\n lineEnd: number;\n /** Age in days (null if no timestamp) */\n ageInDays: number | null;\n /** Staleness threshold for this section (days) */\n threshold: number;\n /** True if ageInDays exceeds threshold */\n isStale: boolean;\n}\n\nconst TIMESTAMP_RE = /<!--\\s*added:\\s*(\\d{4}-\\d{2}-\\d{2})\\s*-->/;\nconst SECTION_RE = /^(#{1,6})\\s+(.+)/;\n\nfunction parseTimestampedEntries(content: string): TimestampedEntry[] {\n const lines = content.split('\\n');\n const entries: TimestampedEntry[] = [];\n\n let currentSection = '';\n let currentHeadingLevel = 0;\n let entryLines: string[] = [];\n let entryStart = -1;\n\n function flushEntry(lineEnd: number): void {\n if (entryStart < 0 || entryLines.length === 0) return;\n\n // Only consider entries with a timestamp\n const fullText = entryLines.join('\\n');\n const timestampMatch = fullText.match(TIMESTAMP_RE);\n if (!timestampMatch) {\n entryLines = [];\n entryStart = -1;\n return;\n }\n\n const addedDate = new Date(timestampMatch[1] + 'T00:00:00Z');\n const ageInDays = (Date.now() - addedDate.getTime()) / 86400000;\n const sectionKey = currentSection.toLowerCase().replace(/\\s*<!--.*?-->\\s*/g, '').trim();\n const threshold = STALENESS_THRESHOLDS[sectionKey] ?? Infinity;\n const isStale = isFinite(threshold) && ageInDays > threshold;\n\n // Strip pure comment/blank lines from start/end for cleaner display\n const trimmedLines = entryLines.filter(l => l.trim().length > 0);\n const displayText = trimmedLines.join('\\n');\n\n entries.push({\n section: currentSection.replace(/<!--.*?-->/g, '').trim(),\n text: displayText,\n addedDate,\n lineStart: entryStart,\n lineEnd,\n ageInDays,\n threshold,\n isStale,\n });\n\n entryLines = [];\n entryStart = -1;\n }\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const sectionMatch = line.match(SECTION_RE);\n\n if (sectionMatch) {\n const level = sectionMatch[1].length;\n const title = sectionMatch[2];\n\n // Flush any pending entry when we hit a new heading\n flushEntry(i);\n\n if (level <= 2) {\n // Top-level section change\n currentSection = title;\n currentHeadingLevel = level;\n }\n // Don't start an entry on a heading line\n continue;\n }\n\n // Skip horizontal rules and empty lines outside an entry\n if (line.trim() === '---') { flushEntry(i); continue; }\n\n // Skip pure comment blocks\n if (line.trim().startsWith('<!--') && line.trim().endsWith('-->')) {\n if (entryStart < 0) continue; // not in an entry\n }\n\n // Lines with a timestamp marker = end of an entry block\n if (TIMESTAMP_RE.test(line)) {\n if (entryStart < 0) entryStart = i;\n entryLines.push(line);\n flushEntry(i + 1);\n continue;\n }\n\n // Non-empty, non-comment lines start or continue an entry\n if (line.trim().length > 0 && !line.trim().startsWith('>')) {\n if (entryStart < 0) entryStart = i;\n entryLines.push(line);\n } else if (entryStart >= 0) {\n // Empty line inside an entry — keep for context but don't start a new one on it\n entryLines.push(line);\n }\n }\n\n flushEntry(lines.length);\n return entries;\n}\n\nfunction removeLines(content: string, lineStart: number, lineEnd: number): string {\n const lines = content.split('\\n');\n lines.splice(lineStart, lineEnd - lineStart);\n return lines.join('\\n');\n}\n\nfunction appendToArchive(content: string, entryText: string, pruneDate: string): string {\n const archiveHeading = '## Archive';\n const archiveEntry = `${entryText} <!-- archived: ${pruneDate} -->`;\n\n if (content.includes(archiveHeading)) {\n // Insert after the archive heading and any existing comment\n return content.replace(\n /(## Archive\\n(?:<!--[^>]*-->\\n)*)/,\n `$1\\n${archiveEntry}\\n`\n );\n } else {\n return content.trimEnd() + `\\n\\n${archiveHeading}\\n\\n<!-- Entries moved here by mindlink prune — kept for reference -->\\n\\n${archiveEntry}\\n`;\n }\n}\n\nfunction formatAge(days: number): string {\n if (days < 30) return `${Math.round(days)} days`;\n if (days < 365) return `${Math.round(days / 30)} months`;\n return `${(days / 365).toFixed(1)} years`;\n}\n\nexport const pruneCommand = new Command('prune')\n .description('Review and retire stale MEMORY.md entries interactively')\n .option('--dry-run', 'Show stale entries without making any changes')\n .option('--all', 'Show all timestamped entries regardless of age')\n .addHelpText('after', `\nScans MEMORY.md for entries with <!-- added: YYYY-MM-DD --> timestamps.\nEntries older than their section's staleness threshold are flagged for review.\n\nStaleness thresholds:\n Current Focus — 14 days\n Decisions — 180 days\n Conventions — 180 days\n Architecture — 365 days\n User Profile — never expires\n\nArchived entries are moved to ## Archive at the bottom of MEMORY.md.\nThey are never permanently deleted unless you choose \"Delete\".\n\nExamples:\n mindlink prune\n mindlink prune --dry-run\n mindlink prune --all\n `)\n .action(async (opts) => {\n const projectPath = resolve(process.cwd());\n const brainDir = join(projectPath, BRAIN_DIR);\n const memoryPath = join(brainDir, 'MEMORY.md');\n\n console.log('');\n console.log(` ${chalk.bold('◉ MindLink Prune')}`);\n console.log(` ${chalk.dim(memoryPath)}`);\n console.log('');\n\n if (!existsSync(memoryPath)) {\n console.log(` ${chalk.red('✗')} MEMORY.md not found. Run ${chalk.cyan('mindlink init')} first.`);\n console.log('');\n process.exit(1);\n }\n\n const allEntries = parseTimestampedEntries(readFileSync(memoryPath, 'utf8'));\n const toReview = opts.all\n ? allEntries.filter(e => e.addedDate !== null)\n : allEntries.filter(e => e.isStale);\n\n if (toReview.length === 0) {\n if (allEntries.length === 0) {\n console.log(` ${chalk.dim('No timestamped entries found in MEMORY.md.')}`);\n console.log(` ${chalk.dim('Entries are timestamped when your AI writes them (<!-- added: YYYY-MM-DD -->).')}`);\n } else {\n console.log(` ${chalk.green('✓')} No stale entries found. ${allEntries.length} entry${allEntries.length !== 1 ? 'ies' : 'y'} all within threshold.`);\n console.log(` ${chalk.dim('Run mindlink prune --all to review all timestamped entries.')}`);\n }\n console.log('');\n return;\n }\n\n console.log(` Scanning MEMORY.md for ${opts.all ? 'timestamped' : 'stale'} entries...`);\n console.log(` Found ${toReview.length} entr${toReview.length !== 1 ? 'ies' : 'y'} to review.`);\n console.log('');\n\n if (opts.dryRun) {\n for (const entry of toReview) {\n const age = entry.ageInDays !== null ? formatAge(entry.ageInDays) : 'undated';\n const thresholdStr = isFinite(entry.threshold) ? ` — threshold: ${entry.threshold} days` : '';\n console.log(` ${chalk.yellow('⚠')} [${entry.section}] ${entry.text.split('\\n')[0].slice(0, 80)}`);\n console.log(` ${chalk.dim(`Added: ${entry.addedDate?.toISOString().slice(0, 10) ?? 'unknown'} (${age} ago)${thresholdStr}`)}`);\n console.log('');\n }\n console.log(` ${chalk.dim('Dry run — no changes made.')}`);\n console.log('');\n return;\n }\n\n const pruneDate = new Date().toISOString().slice(0, 10);\n let content = readFileSync(memoryPath, 'utf8');\n\n let archived = 0;\n let deleted = 0;\n let kept = 0;\n let skippedAll = false;\n\n // Process in reverse order so line numbers stay valid as we splice\n const sorted = [...toReview].sort((a, b) => b.lineStart - a.lineStart);\n\n for (const entry of sorted) {\n if (skippedAll) { kept++; continue; }\n\n const age = entry.ageInDays !== null ? formatAge(entry.ageInDays) : 'undated';\n const thresholdStr = isFinite(entry.threshold) ? ` — threshold: ${entry.threshold} days` : '';\n const displayLines = entry.text.split('\\n').slice(0, 3).join('\\n');\n\n console.log(` ${chalk.bold('─'.repeat(55))}`);\n console.log(` ${chalk.bold('Section:')} ${entry.section}`);\n console.log(` ${chalk.bold('Entry:')}`);\n for (const l of displayLines.split('\\n')) console.log(` ${chalk.dim(l)}`);\n console.log(` ${chalk.bold('Added:')} ${entry.addedDate?.toISOString().slice(0, 10) ?? 'unknown'} (${age} ago)${thresholdStr}`);\n console.log('');\n\n const action = await select({\n message: 'What would you like to do?',\n options: [\n { value: 'keep', label: 'Keep', hint: 'leave as-is' },\n { value: 'archive', label: 'Archive', hint: 'move to ## Archive section' },\n { value: 'delete', label: 'Delete', hint: 'remove permanently' },\n { value: 'skip_all', label: 'Skip remaining', hint: 'keep all remaining entries unchanged' },\n ],\n });\n\n if (isCancel(action)) { console.log(''); break; }\n\n if (action === 'skip_all') {\n skippedAll = true;\n kept++;\n continue;\n }\n\n if (action === 'archive') {\n const entryText = content.split('\\n').slice(entry.lineStart, entry.lineEnd).join('\\n').trim();\n content = removeLines(content, entry.lineStart, entry.lineEnd);\n content = appendToArchive(content, entryText, pruneDate);\n archived++;\n } else if (action === 'delete') {\n content = removeLines(content, entry.lineStart, entry.lineEnd);\n deleted++;\n } else {\n kept++;\n }\n\n console.log('');\n }\n\n if (archived > 0 || deleted > 0) {\n writeFileSync(memoryPath, content);\n }\n\n console.log(` ${chalk.bold('─'.repeat(55))}`);\n if (archived > 0) console.log(` ${chalk.green('✓')} ${archived} entry${archived !== 1 ? 'ies' : ''} archived`);\n if (deleted > 0) console.log(` ${chalk.green('✓')} ${deleted} entry${deleted !== 1 ? 'ies' : ''} deleted`);\n if (kept > 0) console.log(` ${chalk.dim('·')} ${kept} entry${kept !== 1 ? 'ies' : ''} kept`);\n if (archived > 0 || deleted > 0) {\n console.log(` ${chalk.green('✓')} MEMORY.md updated.`);\n }\n console.log('');\n });\n","import { Command } from 'commander';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, resolve, dirname } from 'path';\nimport { homedir } from 'os';\nimport { BRAIN_DIR } from '../utils/paths.js';\nimport { extractSection } from '../utils/parser.js';\nimport { replaceSection } from '../utils/content.js';\nimport { runChecks } from './verify.js';\nimport { VERSION } from '../utils/version.js';\n\n// ── Project resolution ────────────────────────────────────────────────────────\n\n/**\n * Resolve the project root by:\n * 1. MINDLINK_PROJECT_PATH env var (set by Claude Code)\n * 2. cwd walk-up looking for .brain/\n */\nfunction resolveProjectPath(): string | null {\n const envPath = process.env.MINDLINK_PROJECT_PATH;\n if (envPath && existsSync(join(envPath, BRAIN_DIR))) return envPath;\n\n let current = resolve(process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(current, BRAIN_DIR))) return current;\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return null;\n}\n\n// ── Memory section helpers ────────────────────────────────────────────────────\n\nconst VALID_SECTIONS = ['Core', 'Architecture', 'Decisions', 'Conventions', 'User Profile', 'Important Context'] as const;\ntype Section = typeof VALID_SECTIONS[number];\n\nfunction readMemorySection(memoryPath: string, section?: string): string {\n const content = readFileSync(memoryPath, 'utf8');\n if (!section) {\n // Default: Core + User Profile\n const core = extractSection(content, 'Core');\n const profile = extractSection(content, 'User Profile');\n return `## Core\\n\\n${core}\\n\\n## User Profile\\n\\n${profile}`.trim();\n }\n return extractSection(content, section);\n}\n\nfunction appendToSection(memoryPath: string, section: string, newContent: string): void {\n let content = readFileSync(memoryPath, 'utf8');\n const sectionBody = extractSection(content, section);\n\n // Find where section ends and insert before the next heading\n const lines = content.split('\\n');\n let headingIdx = -1;\n let nextSectionIdx = lines.length;\n let headingLevel = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^(#{1,6})\\s+(.+)/);\n if (match) {\n const level = match[1].length;\n const title = match[2].replace(/<!--.*?-->/g, '').trim();\n if (headingIdx < 0 && title.toLowerCase() === section.toLowerCase()) {\n headingIdx = i;\n headingLevel = level;\n } else if (headingIdx >= 0 && level <= headingLevel) {\n nextSectionIdx = i;\n break;\n }\n }\n }\n\n if (headingIdx < 0) {\n // Section doesn't exist — create it at end of file\n content = content.trimEnd() + `\\n\\n## ${section}\\n\\n${newContent.trim()}\\n`;\n } else {\n // Insert before next section (or end of file), after existing content\n const insertAt = nextSectionIdx > 0 && lines[nextSectionIdx - 1].trim() === '---'\n ? nextSectionIdx - 1\n : nextSectionIdx;\n lines.splice(insertAt, 0, '', newContent.trim(), '');\n content = lines.join('\\n');\n }\n\n writeFileSync(memoryPath, content);\n void sectionBody; // suppress unused warning\n}\n\n// ── MCP server ────────────────────────────────────────────────────────────────\n\nexport const mcpCommand = new Command('mcp')\n .description('Start the MindLink MCP server (stdio transport for AI tool integration)')\n .addHelpText('after', `\nThe MCP server runs as a local process launched by Claude Code.\nIt exposes 4 tools for auditable, schema-validated memory reads and writes.\n\nTools:\n mindlink_read_memory(section?) — read a section of MEMORY.md\n mindlink_write_memory(section, content) — append to a MEMORY.md section\n mindlink_session_update(summary) — overwrite SESSION.md\n mindlink_verify() — run health check, return JSON\n\nConfigure in .claude/settings.json (done automatically by mindlink init):\n { \"mcpServers\": { \"mindlink\": { \"command\": \"mindlink\", \"args\": [\"mcp\"] } } }\n\nExamples:\n mindlink mcp # (launched by Claude Code, not by hand)\n `)\n .action(async () => {\n const { McpServer } = await import('@modelcontextprotocol/sdk/server/mcp.js');\n const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');\n const { z } = await import('zod');\n\n const server = new McpServer({ name: 'mindlink', version: VERSION });\n\n // ── Tool 1: mindlink_read_memory ─────────────────────────────────────────\n\n server.tool(\n 'mindlink_read_memory',\n 'Read a section of this project\\'s MEMORY.md. If section is omitted, returns Core + User Profile only.',\n {\n section: z.enum(['Core', 'Architecture', 'Decisions', 'Conventions', 'User Profile', 'Important Context'])\n .optional()\n .describe('Section to read. Omit for Core + User Profile (recommended default).'),\n },\n async ({ section }) => {\n const projectPath = resolveProjectPath();\n if (!projectPath) {\n return {\n content: [{ type: 'text' as const, text: 'Error: No MindLink project found at this path. Run mindlink init first.' }],\n isError: true,\n };\n }\n const memoryPath = join(projectPath, BRAIN_DIR, 'MEMORY.md');\n if (!existsSync(memoryPath)) {\n return {\n content: [{ type: 'text' as const, text: 'Error: MEMORY.md not found. Run mindlink init to create it.' }],\n isError: true,\n };\n }\n try {\n const content = readMemorySection(memoryPath, section);\n return { content: [{ type: 'text' as const, text: content || '(section is empty)' }] };\n } catch (err) {\n return {\n content: [{ type: 'text' as const, text: `Error reading MEMORY.md: ${err instanceof Error ? err.message : err}` }],\n isError: true,\n };\n }\n }\n );\n\n // ── Tool 2: mindlink_write_memory ────────────────────────────────────────\n\n server.tool(\n 'mindlink_write_memory',\n 'Append a fact or decision to a section of MEMORY.md. Never overwrites existing content. Always include a <!-- added: YYYY-MM-DD --> timestamp.',\n {\n section: z.enum(['Core', 'Architecture', 'Decisions', 'Conventions', 'User Profile', 'Important Context'])\n .describe('Section to append to.'),\n content: z.string()\n .describe('The markdown content to append. Include <!-- added: YYYY-MM-DD --> timestamp.'),\n },\n async ({ section, content }) => {\n const projectPath = resolveProjectPath();\n if (!projectPath) {\n return {\n content: [{ type: 'text' as const, text: 'Error: No MindLink project found. Run mindlink init first.' }],\n isError: true,\n };\n }\n const memoryPath = join(projectPath, BRAIN_DIR, 'MEMORY.md');\n if (!existsSync(memoryPath)) {\n return {\n content: [{ type: 'text' as const, text: 'Error: MEMORY.md not found. Run mindlink init to create it.' }],\n isError: true,\n };\n }\n try {\n appendToSection(memoryPath, section, content);\n return { content: [{ type: 'text' as const, text: `✓ Appended to ## ${section} in MEMORY.md.` }] };\n } catch (err) {\n return {\n content: [{ type: 'text' as const, text: `Error writing MEMORY.md: ${err instanceof Error ? err.message : err}` }],\n isError: true,\n };\n }\n }\n );\n\n // ── Tool 3: mindlink_session_update ──────────────────────────────────────\n\n server.tool(\n 'mindlink_session_update',\n 'Update SESSION.md with the current session summary. Call this as the last action of every response.',\n {\n summary: z.string()\n .describe('Current task state — what was asked, what you answered, any decisions made, what\\'s next.'),\n },\n async ({ summary }) => {\n const projectPath = resolveProjectPath();\n if (!projectPath) {\n return {\n content: [{ type: 'text' as const, text: 'Error: No MindLink project found. Run mindlink init first.' }],\n isError: true,\n };\n }\n const sessionPath = join(projectPath, BRAIN_DIR, 'SESSION.md');\n try {\n const date = new Date().toISOString().slice(0, 10);\n const content = `# Session State\\n\\n<!-- Last updated: ${date} -->\\n\\n${summary.trim()}\\n`;\n writeFileSync(sessionPath, content);\n return { content: [{ type: 'text' as const, text: '✓ SESSION.md updated.' }] };\n } catch (err) {\n return {\n content: [{ type: 'text' as const, text: `Error writing SESSION.md: ${err instanceof Error ? err.message : err}` }],\n isError: true,\n };\n }\n }\n );\n\n // ── Tool 4: mindlink_verify ───────────────────────────────────────────────\n\n server.tool(\n 'mindlink_verify',\n 'Run a health check on .brain/. Returns pass/warn/fail status for each check. Call this to verify your memory writes succeeded.',\n {},\n async () => {\n const projectPath = resolveProjectPath();\n if (!projectPath) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ ok: false, error: 'No MindLink project found. Run mindlink init first.' }) }],\n isError: true,\n };\n }\n const checks = runChecks(projectPath);\n const ok = checks.every(c => c.status === 'pass');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ ok, checks }, null, 2) }],\n };\n }\n );\n\n // ── Connect ────────────────────────────────────────────────────────────────\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n });\n"],"mappings":"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","names":["Command","chalk","chalk","existsSync","mkdirSync","readFileSync","writeFileSync","join","dirname","join","homedir","join","existsSync","readFileSync","info","chalk","mkdirSync","dirname","writeFileSync","Command","chalk","existsSync","readFileSync","join","resolve","text","Command","resolve","join","existsSync","chalk","readFileSync","Command","chalk","existsSync","readFileSync","readdirSync","join","resolve","Command","resolve","join","existsSync","chalk","readFileSync","readdirSync","Command","chalk","existsSync","readFileSync","writeFileSync","join","resolve","Command","resolve","join","existsSync","chalk","writeFileSync","readFileSync","Command","isCancel","cancel","chalk","existsSync","readFileSync","writeFileSync","join","resolve","BRAIN_FILES","Command","resolve","join","existsSync","chalk","isCancel","cancel","writeFileSync","readFileSync","Command","select","multiselect","isCancel","chalk","existsSync","readFileSync","writeFileSync","appendFileSync","mkdirSync","unlinkSync","join","resolve","dirname","readFileSync","join","writeFileSync","existsSync","appendFileSync","mkdirSync","dirname","unlinkSync","Command","resolve","chalk","select","isCancel","multiselect","Command","chalk","existsSync","readFileSync","statSync","join","resolve","basename","existsSync","chalk","statSync","readFileSync","basename","Command","resolve","join","Command","select","isCancel","cancel","spinner","chalk","execSync","join","dirname","existsSync","readFileSync","writeFileSync","mkdirSync","resolve","Command","spinner","chalk","select","isCancel","cancel","execSync","existsSync","join","readFileSync","writeFileSync","mkdirSync","dirname","Command","chalk","existsSync","readFileSync","join","resolve","Command","resolve","join","existsSync","chalk","readFileSync","Command","select","isCancel","cancel","chalk","existsSync","readFileSync","unlinkSync","join","resolve","Command","resolve","join","existsSync","chalk","readFileSync","select","isCancel","cancel","unlinkSync","Command","text","isCancel","cancel","chalk","existsSync","readdirSync","join","resolve","basename","Command","resolve","join","existsSync","chalk","basename","text","isCancel","cancel","readdirSync","Command","select","isCancel","cancel","chalk","existsSync","mkdirSync","join","resolve","AdmZip","Command","resolve","join","existsSync","chalk","AdmZip","select","isCancel","cancel","mkdirSync","Command","chalk","existsSync","readFileSync","statSync","readdirSync","join","resolve","chalk","Command","resolve","join","existsSync","readFileSync","statSync","readdirSync","Command","chalk","Command","chalk","Command","chalk","existsSync","readFileSync","statSync","join","resolve","execSync","BRAIN_FILES","relativeTime","resolve","execSync","Command","join","existsSync","chalk","readFileSync","statSync","Command","chalk","existsSync","readFileSync","statSync","mkdirSync","writeFileSync","dirname","join","resolve","warn","fail","icon","chalk","join","existsSync","readFileSync","statSync","mkdirSync","dirname","writeFileSync","Command","resolve","Command","chalk","existsSync","readFileSync","writeFileSync","mkdirSync","execSync","existsSync","mkdirSync","writeFileSync","Command","chalk","readFileSync","execSync","Command","select","isCancel","chalk","existsSync","readFileSync","writeFileSync","join","resolve","Command","resolve","join","chalk","existsSync","readFileSync","select","isCancel","writeFileSync","Command","existsSync","readFileSync","writeFileSync","join","resolve","dirname","existsSync","join","resolve","dirname","readFileSync","writeFileSync","Command","join","existsSync","ok","Command","_","chalk"]}
|