@sushanglewis/lincoln 1.5.2 → 1.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -15,7 +15,9 @@ var BOOLEAN_FLAGS = /* @__PURE__ */ new Set([
15
15
  "json",
16
16
  "help",
17
17
  "h",
18
- "no-venv"
18
+ "no-venv",
19
+ "version",
20
+ "v"
19
21
  ]);
20
22
  function parseArgs(argv) {
21
23
  const args = argv.slice(2);
@@ -1313,9 +1315,15 @@ Options:
1313
1315
  --check Check for available updates without installing (update)
1314
1316
  --json Output machine-readable JSON (where supported)
1315
1317
  --help, -h Show this help message
1318
+ --version, -v Show the installed Lincoln version
1316
1319
  `;
1317
1320
  async function main(argv) {
1318
1321
  const parsed = parseArgs(argv);
1322
+ if (parsed.flags.version || parsed.flags.v) {
1323
+ const version = readLocalPackageVersion();
1324
+ console.log(version ? `Lincoln ${version}` : "Lincoln (unknown version)");
1325
+ return 0;
1326
+ }
1319
1327
  if (parsed.command === "help") {
1320
1328
  console.log(USAGE);
1321
1329
  return 0;
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main.ts","../src/cli.ts","../src/commands/doctor.ts","../src/lib/paths.ts","../src/lib/versionMarker.ts","../src/lib/packageInfo.ts","../src/lib/marker.ts","../src/commands/initProject.ts","../src/commands/install.ts","../src/lib/syncClaude.ts","../src/lib/claudeMdMerge.ts","../src/lib/harnessDetect.ts","../src/commands/update.ts","../src/lib/npmRegistry.ts","../src/lib/semver.ts","../src/commands/use.ts","../src/commands/migrateProject.ts","../src/lib/projectFiles.ts","../src/commands/record.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { parseArgs } from './cli.js'\nimport { doctor } from './commands/doctor.js'\nimport { initProject } from './commands/initProject.js'\nimport { install } from './commands/install.js'\nimport { update } from './commands/update.js'\nimport { use } from './commands/use.js'\nimport { migrateProject } from './commands/migrateProject.js'\nimport { record } from './commands/record.js'\n\nconst USAGE = `Lincoln — Global agent harness plugin CLI\n\nUsage:\n lincoln <command> [options]\n\nCommands:\n install One-time global setup: sync to ~/.claude/, ~/.codex/, ~/.opencode/\n update Pull latest release and re-sync globally\n use <version> Switch active global version\n doctor Diagnose harness integration\n init-project Create .lincoln.yaml in current project\n migrate-project Remove vendored framework files from an existing project\n record Launch the Lincoln interview recorder TUI\n help Show this help message\n\nOptions:\n --yes, -y Skip confirmation prompts\n --dry-run Show what would be done without making changes\n --force Force re-install even if up to date\n --check Check for available updates without installing (update)\n --json Output machine-readable JSON (where supported)\n --help, -h Show this help message\n`\n\nexport async function main(argv: string[]): Promise<number> {\n const parsed = parseArgs(argv)\n\n if (parsed.command === 'help') {\n console.log(USAGE)\n return 0\n }\n\n if (parsed.command === 'install') {\n return install({\n yes: Boolean(parsed.flags.yes || parsed.flags.y),\n dryRun: Boolean(parsed.flags['dry-run']),\n force: Boolean(parsed.flags.force),\n harnesses: parsed.args,\n noVenv: Boolean(parsed.flags['no-venv'])\n })\n }\n\n if (parsed.command === 'update') {\n return update({\n check: Boolean(parsed.flags.check),\n dryRun: Boolean(parsed.flags['dry-run']),\n yes: Boolean(parsed.flags.yes || parsed.flags.y)\n })\n }\n\n if (parsed.command === 'use') {\n const version = parsed.args[0]\n if (!version) {\n console.error('Usage: lincoln use <version> [--yes] [--dry-run]')\n return 1\n }\n return use(version, {\n dryRun: Boolean(parsed.flags['dry-run']),\n yes: Boolean(parsed.flags.yes || parsed.flags.y)\n })\n }\n\n if (parsed.command === 'doctor') {\n const result = await doctor({ json: Boolean(parsed.flags.json) })\n return result.code\n }\n\n if (parsed.command === 'init-project') {\n return initProject(process.cwd(), {\n force: Boolean(parsed.flags.force),\n dryRun: Boolean(parsed.flags['dry-run'])\n })\n }\n\n if (parsed.command === 'migrate-project') {\n return migrateProject(process.cwd(), {\n dryRun: Boolean(parsed.flags['dry-run']),\n yes: Boolean(parsed.flags.yes || parsed.flags.y),\n force: Boolean(parsed.flags.force)\n })\n }\n\n if (parsed.command === 'record') {\n return record(parsed.args)\n }\n\n console.log(USAGE)\n return 0\n}\n\nif (\n process.argv[1] &&\n path.resolve(fs.realpathSync(fileURLToPath(import.meta.url))) ===\n path.resolve(fs.realpathSync(process.argv[1]))\n) {\n main(process.argv).then((code) => process.exit(code))\n}\n","export interface ParsedArgs {\n command: string\n args: string[]\n flags: Record<string, unknown>\n}\n\n/**\n * Flags that never take a value. Boolean flags must not consume the next\n * token, otherwise `lincoln use --yes 1.6.0` would swallow the positional\n * version argument into `flags.yes`.\n */\nconst BOOLEAN_FLAGS = new Set([\n 'yes',\n 'y',\n 'dry-run',\n 'force',\n 'check',\n 'json',\n 'help',\n 'h',\n 'no-venv'\n])\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2)\n const flags: Record<string, unknown> = {}\n const positional: string[] = []\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (arg.startsWith('--')) {\n const key = arg.replace(/^--/, '')\n const next = args[i + 1]\n if (!BOOLEAN_FLAGS.has(key) && next && !next.startsWith('-')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else if (arg.startsWith('-')) {\n const key = arg.replace(/^-/, '')\n const next = args[i + 1]\n if (!BOOLEAN_FLAGS.has(key) && next && !next.startsWith('-')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else {\n positional.push(arg)\n }\n }\n\n const command = positional[0] || 'help'\n const validCommands = new Set([\n 'install',\n 'update',\n 'use',\n 'doctor',\n 'init-project',\n 'migrate-project',\n 'record',\n 'help',\n '--help',\n '-h'\n ])\n\n if (command === 'help' || command === '--help' || command === '-h') {\n return { command: 'help', args: positional.slice(1), flags }\n }\n\n if (!validCommands.has(command)) {\n return { command: 'help', args: positional, flags }\n }\n\n return { command, args: positional.slice(1), flags }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport type { LincolnPaths } from '../lib/paths.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport { readVersionMarker } from '../lib/versionMarker.js'\n\nexport interface DoctorCheck {\n name: string\n status: 'ok' | 'warn' | 'skip' | 'error'\n message: string\n}\n\nexport interface DoctorOptions {\n json?: boolean\n}\n\nexport interface DoctorDeps {\n paths: LincolnPaths\n nodeVersion: () => string\n pythonVersion: () => Promise<string | undefined>\n pyyamlVersion: () => Promise<string | undefined>\n npmVersion: () => Promise<string | undefined>\n projectRoot: string\n}\n\nexport interface DoctorResult {\n code: number\n checks: DoctorCheck[]\n}\n\nconst MIN_NODE_MAJOR = 20\nconst MIN_PYTHON_MAJOR = 3\nconst MIN_PYTHON_MINOR = 10\n\nexport function createDefaultDeps(): DoctorDeps {\n const paths = resolveLincolnPaths()\n const pythonCommand = resolvePythonCommand(paths)\n return {\n paths,\n nodeVersion: () => process.version,\n pythonVersion: () => queryCommandVersion(pythonCommand, ['--version']),\n pyyamlVersion: () => queryPyyamlVersion(pythonCommand),\n npmVersion: () => queryCommandVersion('npm', ['--version']),\n projectRoot: process.cwd()\n }\n}\n\nexport async function doctor(\n options: DoctorOptions = {},\n deps: DoctorDeps = createDefaultDeps()\n): Promise<DoctorResult> {\n const checks: DoctorCheck[] = []\n\n checks.push(checkNode(deps.nodeVersion()))\n checks.push(await checkPython(deps.pythonVersion))\n checks.push(await checkPyyaml(deps.pyyamlVersion))\n checks.push(await checkNpm(deps.npmVersion))\n checks.push(checkGlobalMarker(deps.paths))\n checks.push(checkPayloadHooks(deps.paths))\n checks.push(checkVenv(deps.paths))\n checks.push(checkProjectMarker(deps.projectRoot))\n\n const hasError = checks.some((c) => c.status === 'error')\n const result: DoctorResult = { code: hasError ? 1 : 0, checks }\n\n if (options.json) {\n console.log(JSON.stringify({ checks }, null, 2))\n } else {\n for (const check of checks) {\n const icon = check.status === 'ok' ? '✓' : check.status === 'error' ? '✗' : check.status === 'warn' ? '!' : '-'\n console.log(`${icon} ${check.name}: ${check.message}`)\n }\n if (hasError) {\n console.error('\\nOne or more checks failed.')\n }\n }\n\n return result\n}\n\nfunction checkNode(version: string): DoctorCheck {\n const major = parseNodeMajor(version)\n if (major === undefined) {\n return { name: 'node', status: 'warn', message: `Could not parse Node version: ${version}` }\n }\n if (major < MIN_NODE_MAJOR) {\n return { name: 'node', status: 'error', message: `Node ${version} is below the minimum required v${MIN_NODE_MAJOR}` }\n }\n return { name: 'node', status: 'ok', message: `Node ${version}` }\n}\n\nasync function checkPython(query: () => Promise<string | undefined>): Promise<DoctorCheck> {\n const version = (await query())?.trim()\n if (!version) {\n return { name: 'python', status: 'error', message: 'Python 3 is not available' }\n }\n const parsed = parsePythonVersion(version)\n if (!parsed) {\n return { name: 'python', status: 'warn', message: `Could not parse Python version: ${version}` }\n }\n if (parsed.major < MIN_PYTHON_MAJOR || (parsed.major === MIN_PYTHON_MAJOR && parsed.minor < MIN_PYTHON_MINOR)) {\n return {\n name: 'python',\n status: 'error',\n message: `Python ${version} is below the minimum required ${MIN_PYTHON_MAJOR}.${MIN_PYTHON_MINOR}`\n }\n }\n const display = version.replace(/^Python\\s+/, '')\n return { name: 'python', status: 'ok', message: `Python ${display}` }\n}\n\nasync function checkPyyaml(query: () => Promise<string | undefined>): Promise<DoctorCheck> {\n const version = await query()\n if (!version) {\n return { name: 'pyyaml', status: 'error', message: 'PyYAML is not installed for Python 3' }\n }\n return { name: 'pyyaml', status: 'ok', message: `PyYAML ${version}` }\n}\n\nasync function checkNpm(query: () => Promise<string | undefined>): Promise<DoctorCheck> {\n const version = await query()\n if (!version) {\n return { name: 'npm', status: 'warn', message: 'npm is not available' }\n }\n return { name: 'npm', status: 'ok', message: `npm ${version}` }\n}\n\nfunction checkGlobalMarker(paths: LincolnPaths): DoctorCheck {\n const marker = readVersionMarker(paths)\n if (!marker) {\n return { name: 'global-marker', status: 'warn', message: `No version marker at ${paths.versionMarker}` }\n }\n return { name: 'global-marker', status: 'ok', message: `Lincoln ${marker.version} installed` }\n}\n\nfunction checkPayloadHooks(paths: LincolnPaths): DoctorCheck {\n const hooksDir = path.join(paths.currentDir, '.claude', 'hooks')\n if (!fs.existsSync(hooksDir)) {\n return { name: 'payload-hooks', status: 'warn', message: `Payload hooks not found at ${hooksDir}` }\n }\n const required = ['on-session-start.sh']\n const missing = required.filter((f) => !fs.existsSync(path.join(hooksDir, f)))\n if (missing.length > 0) {\n return { name: 'payload-hooks', status: 'warn', message: `Missing hooks: ${missing.join(', ')}` }\n }\n return { name: 'payload-hooks', status: 'ok', message: `Payload hooks present at ${hooksDir}` }\n}\n\nfunction checkVenv(paths: LincolnPaths): DoctorCheck {\n if (!fs.existsSync(paths.venvDir)) {\n return { name: 'venv', status: 'warn', message: `Virtual environment not found at ${paths.venvDir}` }\n }\n const pythonExe = path.join(paths.venvDir, process.platform === 'win32' ? 'Scripts' : 'bin', 'python')\n if (!fs.existsSync(pythonExe)) {\n return { name: 'venv', status: 'warn', message: `Virtual environment exists but python executable is missing` }\n }\n return { name: 'venv', status: 'ok', message: `Virtual environment present at ${paths.venvDir}` }\n}\n\nfunction checkProjectMarker(projectRoot: string): DoctorCheck {\n const markerPath = path.join(projectRoot, '.lincoln.yaml')\n if (!fs.existsSync(markerPath)) {\n return { name: 'project-marker', status: 'skip', message: `No .lincoln.yaml in ${projectRoot}` }\n }\n return { name: 'project-marker', status: 'ok', message: `Project marker found at ${markerPath}` }\n}\n\nfunction resolvePythonCommand(paths: LincolnPaths): string {\n const venvPython = path.join(\n paths.venvDir,\n process.platform === 'win32' ? 'Scripts' : 'bin',\n process.platform === 'win32' ? 'python.exe' : 'python'\n )\n if (fs.existsSync(venvPython)) {\n return venvPython\n }\n return 'python3'\n}\n\nfunction parseNodeMajor(version: string): number | undefined {\n const match = /^v?(\\d+)/.exec(version)\n if (!match) {\n return undefined\n }\n return Number(match[1])\n}\n\nfunction parsePythonVersion(version: string): { major: number; minor: number } | undefined {\n const match = /(\\d+)\\.(\\d+)/.exec(version)\n if (!match) {\n return undefined\n }\n return { major: Number(match[1]), minor: Number(match[2]) }\n}\n\nasync function queryCommandVersion(command: string, args: string[]): Promise<string | undefined> {\n return new Promise((resolvePromise) => {\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'ignore'],\n shell: process.platform === 'win32'\n })\n let stdout = ''\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString()\n })\n child.on('close', (code) => {\n const text = stdout.trim()\n resolvePromise(code === 0 && text.length > 0 ? text : undefined)\n })\n child.on('error', () => resolvePromise(undefined))\n })\n}\n\nasync function queryPyyamlVersion(pythonCommand: string): Promise<string | undefined> {\n return new Promise((resolvePromise) => {\n const child = spawn(\n pythonCommand,\n ['-c', 'import yaml; print(yaml.__version__)'],\n { stdio: ['ignore', 'pipe', 'ignore'], shell: process.platform === 'win32' }\n )\n let stdout = ''\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString()\n })\n child.on('close', (code) => {\n const text = stdout.trim()\n resolvePromise(code === 0 && text.length > 0 ? text : undefined)\n })\n child.on('error', () => resolvePromise(undefined))\n })\n}\n","import path from 'node:path'\nimport os from 'node:os'\n\nexport interface LincolnPaths {\n homeDir: string\n lincolnHome: string\n versionsDir: string\n currentDir: string\n versionMarker: string\n venvDir: string\n claudeDir: string\n codexDir: string\n opencodeDir: string\n}\n\nexport function resolveLincolnPaths(overrideHomeDir?: string): LincolnPaths {\n const homeDir = overrideHomeDir ?? os.homedir()\n const lincolnHome = process.env.LINCOLN_HOME\n ? path.resolve(process.env.LINCOLN_HOME)\n : path.join(homeDir, '.lincoln')\n\n return {\n homeDir,\n lincolnHome,\n versionsDir: path.join(lincolnHome, 'versions'),\n currentDir: path.join(lincolnHome, 'current'),\n versionMarker: path.join(lincolnHome, 'marker.json'),\n venvDir: path.join(lincolnHome, 'venv'),\n claudeDir: path.join(homeDir, '.claude'),\n codexDir: path.join(homeDir, '.codex'),\n opencodeDir: path.join(homeDir, '.opencode')\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { LincolnPaths } from './paths.js'\n\nexport interface VersionMarker {\n version: string\n installedAt: string\n harnesses: string[]\n managedFiles: string[]\n}\n\nexport function readVersionMarker(paths: LincolnPaths): VersionMarker | undefined {\n try {\n const raw = fs.readFileSync(paths.versionMarker, 'utf8')\n const parsed = JSON.parse(raw) as VersionMarker\n if (\n typeof parsed.version === 'string' &&\n typeof parsed.installedAt === 'string' &&\n Array.isArray(parsed.harnesses)\n ) {\n return parsed\n }\n return undefined\n } catch {\n return undefined\n }\n}\n\nexport function writeVersionMarker(\n paths: LincolnPaths,\n marker: VersionMarker\n): void {\n fs.mkdirSync(path.dirname(paths.versionMarker), { recursive: true })\n fs.writeFileSync(paths.versionMarker, JSON.stringify(marker, null, 2) + '\\n')\n}\n\nexport function isUpToDate(paths: LincolnPaths, version: string): boolean {\n const marker = readVersionMarker(paths)\n return marker?.version === version\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\n/**\n * Finds the directory containing the running lincoln package's package.json.\n * Returns undefined when no package.json can be located.\n */\nexport function readLocalPackageRoot(): string | undefined {\n try {\n let dir = path.dirname(fileURLToPath(import.meta.url))\n const root = path.parse(dir).root\n while (dir !== root) {\n const pkgPath = path.join(dir, 'package.json')\n if (fs.existsSync(pkgPath)) {\n const parsed = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as { name?: string }\n if (parsed.name === '@sushanglewis/lincoln') {\n return dir\n }\n }\n dir = path.dirname(dir)\n }\n } catch {\n // ignore and return undefined\n }\n return undefined\n}\n\n/**\n * Reads the version of the running lincoln package from its own package.json.\n * Walks upward from the current module file until it finds the package.json.\n * Returns undefined when the package.json cannot be located or parsed.\n */\nexport function readLocalPackageVersion(): string | undefined {\n try {\n const root = readLocalPackageRoot()\n if (!root) return undefined\n const parsed = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')) as {\n version?: string\n }\n return typeof parsed.version === 'string' ? parsed.version : undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Resolves the bundled framework payload directory inside the running package.\n */\nexport function resolvePayloadRoot(): string | undefined {\n const root = readLocalPackageRoot()\n if (!root) return undefined\n const payload = path.join(root, 'framework')\n return fs.existsSync(payload) ? payload : undefined\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport yaml from 'js-yaml'\n\nexport interface ProjectMarker {\n enabled: boolean\n workflow_template?: string\n min_lincoln_version?: string\n}\n\nexport interface WriteMarkerOptions {\n force?: boolean\n dryRun?: boolean\n}\n\nexport function readProjectMarker(projectRoot: string): ProjectMarker | undefined {\n const markerPath = path.join(projectRoot, '.lincoln.yaml')\n if (!fs.existsSync(markerPath)) {\n return undefined\n }\n try {\n const parsed = yaml.load(fs.readFileSync(markerPath, 'utf8')) as Record<string, unknown> | null | undefined\n if (!parsed || typeof parsed !== 'object') {\n return undefined\n }\n return {\n enabled: Boolean(parsed.enabled),\n workflow_template: typeof parsed.workflow_template === 'string' ? parsed.workflow_template : undefined,\n min_lincoln_version: typeof parsed.min_lincoln_version === 'string' ? parsed.min_lincoln_version : undefined\n }\n } catch {\n return undefined\n }\n}\n\nexport function writeProjectMarker(\n projectRoot: string,\n marker: ProjectMarker,\n opts: WriteMarkerOptions = {}\n): void {\n const markerPath = path.join(projectRoot, '.lincoln.yaml')\n if (fs.existsSync(markerPath) && !opts.force) {\n throw new Error(`.lincoln.yaml already exists at ${markerPath}; use --force to overwrite`)\n }\n const content = yaml.dump(marker, { sortKeys: false, lineWidth: -1 })\n if (!opts.dryRun) {\n fs.mkdirSync(projectRoot, { recursive: true })\n fs.writeFileSync(markerPath, content)\n }\n}\n","import { readLocalPackageVersion } from '../lib/packageInfo.js'\nimport { writeProjectMarker, readProjectMarker } from '../lib/marker.js'\n\nexport interface InitProjectOptions {\n force?: boolean\n dryRun?: boolean\n}\n\nexport function initProject(projectRoot: string, options: InitProjectOptions = {}): number {\n if (!options.force && readProjectMarker(projectRoot) !== undefined) {\n console.error(`Project already has a .lincoln.yaml. Use --force to overwrite.`)\n return 1\n }\n\n try {\n writeProjectMarker(\n projectRoot,\n {\n enabled: true,\n workflow_template: 'interview-to-knowledge',\n min_lincoln_version: readLocalPackageVersion() ?? '1.5.0'\n },\n { force: options.force, dryRun: options.dryRun }\n )\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to write .lincoln.yaml: ${message}`)\n return 1\n }\n\n if (options.dryRun) {\n console.log(`Dry run: would create ${projectRoot}/.lincoln.yaml`)\n } else {\n console.log(`Created ${projectRoot}/.lincoln.yaml`)\n }\n return 0\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport type { LincolnPaths } from '../lib/paths.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport { writeVersionMarker } from '../lib/versionMarker.js'\nimport { readLocalPackageVersion, resolvePayloadRoot } from '../lib/packageInfo.js'\nimport type { SyncReport } from '../lib/syncClaude.js'\nimport { syncClaudeCode } from '../lib/syncClaude.js'\nimport { installedHarnessIds } from '../lib/harnessDetect.js'\n\nexport interface InstallOptions {\n yes: boolean\n dryRun: boolean\n force: boolean\n harnesses: string[]\n noVenv: boolean\n}\n\nexport interface InstallDeps {\n paths: LincolnPaths\n payloadRoot: string\n syncClaude: (opts: {\n payloadRoot: string\n targetDir: string\n version: string\n dryRun: boolean\n }) => SyncReport\n}\n\nexport function createDefaultDeps(): InstallDeps {\n return {\n paths: resolveLincolnPaths(),\n payloadRoot: resolvePayloadRoot() || '',\n syncClaude: syncClaudeCode\n }\n}\n\nexport async function install(\n options: InstallOptions,\n deps: InstallDeps = createDefaultDeps()\n): Promise<number> {\n if (!options.dryRun && !options.yes) {\n console.error('This will install Lincoln globally. Run with --yes to proceed.')\n return 1\n }\n\n const version = readLocalPackageVersion()\n if (!version) {\n console.error('Could not determine Lincoln version')\n return 1\n }\n\n const harnesses =\n options.harnesses.length > 0 ? options.harnesses : installedHarnessIds(deps.paths.homeDir)\n\n if (harnesses.length === 0) {\n console.error('No agent harness detected. Install Claude Code, Codex, or OpenCode first.')\n return 1\n }\n\n const payloadRoot = deps.payloadRoot\n if (!payloadRoot || !fs.existsSync(payloadRoot)) {\n console.error(\n `Lincoln payload not found. Run \"npm install -g @sushanglewis/lincoln\" first.`\n )\n return 1\n }\n\n const versionDir = path.join(deps.paths.versionsDir, version)\n if (!options.dryRun) {\n fs.mkdirSync(versionDir, { recursive: true })\n fs.cpSync(payloadRoot, versionDir, { recursive: true, force: true })\n try {\n fs.rmSync(deps.paths.currentDir, { recursive: true, force: true })\n fs.symlinkSync(versionDir, deps.paths.currentDir)\n } catch {\n fs.rmSync(deps.paths.currentDir, { recursive: true, force: true })\n fs.cpSync(versionDir, deps.paths.currentDir, { recursive: true, force: true })\n }\n }\n\n const report = deps.syncClaude({\n payloadRoot: deps.paths.currentDir,\n targetDir: deps.paths.claudeDir,\n version,\n dryRun: options.dryRun\n })\n\n if (!options.dryRun && !options.noVenv) {\n const python = await resolvePythonForVenv()\n if (!python) {\n console.error(\n 'Python 3.10+ is required but was not found. Set LINCOLN_PYTHON to a compatible Python executable.'\n )\n return 1\n }\n await setupVenv(deps.paths, payloadRoot, python)\n }\n\n if (!options.dryRun) {\n writeVersionMarker(deps.paths, {\n version,\n installedAt: new Date().toISOString(),\n harnesses,\n managedFiles: report.written\n })\n }\n\n if (options.dryRun) {\n console.log(`Dry run: would install Lincoln ${version} for harnesses: ${harnesses.join(', ')}`)\n console.log(`Would write ${report.written.length} files`)\n } else {\n console.log(`Installed Lincoln ${version} for harnesses: ${harnesses.join(', ')}`)\n console.log(`Wrote ${report.written.length} files`)\n }\n\n return 0\n}\n\nfunction runCommand(command: string, args: string[]): Promise<number> {\n return new Promise((resolvePromise, rejectPromise) => {\n const child = spawn(command, args, { stdio: 'inherit' })\n child.on('close', (code) => resolvePromise(code ?? 1))\n child.on('error', (err) => rejectPromise(err))\n })\n}\n\nconst MIN_PYTHON_MAJOR = 3\nconst MIN_PYTHON_MINOR = 10\nconst DEFAULT_PYTHON_CANDIDATES = ['python3.12', 'python3.11', 'python3.10', 'python3']\n\nfunction parsePythonVersion(version: string): { major: number; minor: number } | undefined {\n const match = /(\\d+)\\.(\\d+)/.exec(version)\n if (!match) {\n return undefined\n }\n return { major: Number(match[1]), minor: Number(match[2]) }\n}\n\nasync function queryPythonVersion(command: string): Promise<string | undefined> {\n return new Promise((resolvePromise) => {\n const child = spawn(command, ['--version'], {\n stdio: ['ignore', 'pipe', 'ignore'],\n shell: process.platform === 'win32'\n })\n let stdout = ''\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString()\n })\n child.on('close', (code) => {\n const text = stdout.trim()\n resolvePromise(code === 0 && text.length > 0 ? text : undefined)\n })\n child.on('error', () => resolvePromise(undefined))\n })\n}\n\nexport async function resolvePythonForVenv(\n envOverride: string | undefined = process.env.LINCOLN_PYTHON,\n candidates: string[] = DEFAULT_PYTHON_CANDIDATES,\n queryVersion: (cmd: string) => Promise<string | undefined> = queryPythonVersion\n): Promise<string | undefined> {\n const list = envOverride ? [envOverride] : candidates\n for (const cmd of list) {\n const version = await queryVersion(cmd)\n if (!version) {\n continue\n }\n const parsed = parsePythonVersion(version)\n if (\n parsed &&\n parsed.major >= MIN_PYTHON_MAJOR &&\n (parsed.major > MIN_PYTHON_MAJOR || parsed.minor >= MIN_PYTHON_MINOR)\n ) {\n return cmd\n }\n }\n return undefined\n}\n\nasync function setupVenv(paths: LincolnPaths, payloadRoot: string, pythonCommand: string): Promise<void> {\n const pythonExe = path.join(\n paths.venvDir,\n process.platform === 'win32' ? 'Scripts' : 'bin',\n process.platform === 'win32' ? 'python.exe' : 'python'\n )\n\n if (!fs.existsSync(pythonExe)) {\n console.log('Creating Lincoln virtual environment...')\n await runCommand(pythonCommand, ['-m', 'venv', paths.venvDir])\n }\n\n const requirementsPath = path.join(payloadRoot, 'requirements.txt')\n if (fs.existsSync(requirementsPath)) {\n console.log('Installing Python dependencies...')\n const pipExe = path.join(\n paths.venvDir,\n process.platform === 'win32' ? 'Scripts' : 'bin',\n process.platform === 'win32' ? 'pip.exe' : 'pip'\n )\n await runCommand(pipExe, ['install', '-r', requirementsPath])\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport crypto from 'node:crypto'\nimport { mergeManagedBlock } from './claudeMdMerge.js'\n\nexport interface SyncOptions {\n payloadRoot: string\n targetDir: string\n version: string\n dryRun: boolean\n}\n\nexport interface SyncReport {\n written: string[]\n skipped: string[]\n preserved: string[]\n warnings: string[]\n settingsTouched?: string[]\n}\n\nconst COPY_SUBDIRS = [\n 'agents',\n 'skills',\n 'workflows',\n 'stages',\n 'schemas',\n 'templates',\n 'harnesses'\n]\n\nfunction sha256(filePath: string): string {\n const data = fs.readFileSync(filePath)\n return crypto.createHash('sha256').update(data).digest('hex')\n}\n\nfunction sameContent(a: string, b: string): boolean {\n return sha256(a) === sha256(b)\n}\n\nfunction deepMergeSettings(existing: unknown, incoming: unknown): unknown {\n if (Array.isArray(existing) && Array.isArray(incoming)) {\n return incoming\n }\n if (\n typeof existing === 'object' &&\n existing !== null &&\n typeof incoming === 'object' &&\n incoming !== null\n ) {\n const result: Record<string, unknown> = { ...existing }\n for (const [key, value] of Object.entries(incoming)) {\n if (key in result) {\n result[key] = deepMergeSettings(result[key], value)\n } else {\n result[key] = value\n }\n }\n return result\n }\n return incoming\n}\n\nexport function syncClaudeCode(opts: SyncOptions): SyncReport {\n const report: SyncReport = {\n written: [],\n skipped: [],\n preserved: [],\n warnings: [],\n settingsTouched: []\n }\n\n const payloadClaude = path.join(opts.payloadRoot, '.claude')\n if (!fs.existsSync(payloadClaude)) {\n report.warnings.push(`payload .claude directory not found: ${payloadClaude}`)\n return report\n }\n\n if (!opts.dryRun) {\n fs.mkdirSync(opts.targetDir, { recursive: true })\n }\n\n for (const subdir of COPY_SUBDIRS) {\n const srcDir = path.join(payloadClaude, subdir)\n if (!fs.existsSync(srcDir)) {\n continue\n }\n\n const destDir = path.join(opts.targetDir, subdir)\n if (!opts.dryRun) {\n fs.mkdirSync(destDir, { recursive: true })\n }\n\n for (const entry of walkSync(srcDir)) {\n const relativePath = path.relative(srcDir, entry)\n const srcFile = entry\n const destFile = path.join(destDir, relativePath)\n\n if (fs.existsSync(destFile) && sameContent(srcFile, destFile)) {\n report.skipped.push(path.join('.claude', subdir, relativePath))\n continue\n }\n\n if (!opts.dryRun) {\n fs.mkdirSync(path.dirname(destFile), { recursive: true })\n fs.copyFileSync(srcFile, destFile)\n }\n report.written.push(path.join('.claude', subdir, relativePath))\n }\n }\n\n // settings.json merge\n const payloadSettings = path.join(payloadClaude, 'settings.json')\n const targetSettings = path.join(opts.targetDir, 'settings.json')\n if (fs.existsSync(payloadSettings)) {\n const incoming = JSON.parse(fs.readFileSync(payloadSettings, 'utf8'))\n let merged = incoming\n if (fs.existsSync(targetSettings)) {\n const existing = JSON.parse(fs.readFileSync(targetSettings, 'utf8'))\n merged = deepMergeSettings(existing, incoming)\n }\n\n const wouldChange =\n !fs.existsSync(targetSettings) ||\n JSON.stringify(merged) !== JSON.stringify(JSON.parse(fs.readFileSync(targetSettings, 'utf8')))\n\n if (wouldChange) {\n if (!opts.dryRun) {\n fs.writeFileSync(targetSettings, JSON.stringify(merged, null, 2) + '\\n')\n }\n report.written.push('.claude/settings.json')\n report.settingsTouched = ['.claude/settings.json']\n } else {\n report.skipped.push('.claude/settings.json')\n }\n }\n\n // CLAUDE.md merge\n const payloadClaudeMd = path.join(opts.payloadRoot, 'CLAUDE.md')\n const targetClaudeMd = path.join(path.dirname(opts.targetDir), 'CLAUDE.md')\n if (fs.existsSync(payloadClaudeMd)) {\n const incomingBlock = fs.readFileSync(payloadClaudeMd, 'utf8')\n const existing = fs.existsSync(targetClaudeMd)\n ? fs.readFileSync(targetClaudeMd, 'utf8')\n : undefined\n const merged = mergeManagedBlock(existing, incomingBlock)\n\n if (merged !== existing) {\n if (!opts.dryRun) {\n fs.writeFileSync(targetClaudeMd, merged)\n }\n report.written.push('CLAUDE.md')\n } else {\n report.skipped.push('CLAUDE.md')\n }\n }\n\n return report\n}\n\nfunction* walkSync(dir: string): Generator<string> {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n yield* walkSync(fullPath)\n } else {\n yield fullPath\n }\n }\n}\n","const BEGIN = '<!-- lincoln:begin -->'\nconst END = '<!-- lincoln:end -->'\n\nexport function mergeManagedBlock(\n existing: string | undefined,\n block: string\n): string {\n const wrapped = `${BEGIN}\\n${block}\\n${END}`\n const text = existing ?? ''\n\n const beginIndex = text.indexOf(BEGIN)\n const endIndex = text.indexOf(END)\n\n if (beginIndex !== -1 && endIndex !== -1 && endIndex > beginIndex) {\n return (\n text.slice(0, beginIndex) +\n wrapped +\n text.slice(endIndex + END.length)\n )\n }\n\n if (text.trim().length === 0) {\n return wrapped\n }\n\n return `${text.trimEnd()}\\n\\n${wrapped}\\n`\n}\n\nexport function extractManagedBlock(existing: string): string | undefined {\n const beginIndex = existing.indexOf(BEGIN)\n const endIndex = existing.indexOf(END)\n if (beginIndex === -1 || endIndex === -1 || endIndex <= beginIndex) {\n return undefined\n }\n return existing\n .slice(beginIndex + BEGIN.length, endIndex)\n .replace(/^\\n+|\\n+$/g, '')\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\n\nexport type HarnessId = 'claude-code' | 'codex' | 'opencode'\n\nexport interface GlobalHarnessInfo {\n id: HarnessId\n installed: boolean\n configDir: string\n pluginManaged: boolean\n}\n\ninterface HarnessSpec {\n id: HarnessId\n configDirName: string\n pluginMarker?: string\n}\n\nconst HARNESS_SPECS: HarnessSpec[] = [\n {\n id: 'claude-code',\n configDirName: '.claude',\n pluginMarker: 'plugins/lincoln'\n },\n { id: 'codex', configDirName: '.codex' },\n { id: 'opencode', configDirName: '.opencode' }\n]\n\nexport function detectGlobalHarnesses(\n overrideHomeDir?: string\n): GlobalHarnessInfo[] {\n const homeDir = overrideHomeDir ?? os.homedir()\n\n return HARNESS_SPECS.map((spec) => {\n const configDir = path.join(homeDir, spec.configDirName)\n const installed = fs.existsSync(configDir)\n const pluginManaged = spec.pluginMarker\n ? fs.existsSync(path.join(configDir, spec.pluginMarker))\n : false\n\n return {\n id: spec.id,\n installed,\n configDir,\n pluginManaged\n }\n })\n}\n\nexport function installedHarnessIds(homeDir?: string): HarnessId[] {\n return detectGlobalHarnesses(homeDir)\n .filter((h) => h.installed)\n .map((h) => h.id)\n}\n","import { spawn } from 'node:child_process'\nimport type { LincolnPaths } from '../lib/paths.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport { readVersionMarker } from '../lib/versionMarker.js'\nimport { createRegistryClient } from '../lib/npmRegistry.js'\nimport { compareVersions } from '../lib/semver.js'\nimport { readLocalPackageVersion } from '../lib/packageInfo.js'\nimport { install } from './install.js'\nimport type { InstallOptions } from './install.js'\n\nconst PACKAGE_NAME = '@sushanglewis/lincoln'\n\nexport interface UpdateOptions {\n check: boolean\n dryRun: boolean\n yes: boolean\n}\n\nexport interface UpdateDeps {\n paths: LincolnPaths\n latestVersion: () => Promise<string>\n currentVersion: () => string | undefined\n npmInstallGlobal: (version: string) => Promise<number>\n runInstall: (options: InstallOptions) => Promise<number>\n}\n\nexport function createDefaultDeps(): UpdateDeps {\n const paths = resolveLincolnPaths()\n const registry = createRegistryClient()\n return {\n paths,\n latestVersion: () => registry.latestVersion(PACKAGE_NAME),\n currentVersion: () => readVersionMarker(paths)?.version ?? readLocalPackageVersion(),\n npmInstallGlobal: (version) => runNpmInstallGlobal(PACKAGE_NAME, version),\n runInstall: (options) => install(options)\n }\n}\n\nexport async function update(\n options: UpdateOptions,\n deps: Partial<UpdateDeps> = {}\n): Promise<number> {\n const resolved: UpdateDeps = { ...createDefaultDeps(), ...deps }\n\n let latest: string\n try {\n latest = await resolved.latestVersion()\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to query npm registry: ${message}`)\n return 1\n }\n\n const current = resolved.currentVersion()\n\n if (current !== undefined) {\n const comparison = compareVersions(current, latest)\n if (comparison !== undefined ? comparison > 0 : false) {\n console.log(\n `Lincoln ${current} is ahead of the latest release (${latest}); nothing to do.`\n )\n return 0\n }\n if (comparison !== undefined ? comparison === 0 : current === latest) {\n console.log(`Lincoln ${current} is already up to date.`)\n return 0\n }\n }\n\n const summary = `${current ?? 'unknown'} -> ${latest}`\n\n if (options.check) {\n console.log(`Lincoln update available: ${summary}`)\n return 0\n }\n\n if (options.dryRun) {\n console.log(`Dry run: would update Lincoln ${summary}`)\n return 0\n }\n\n if (!options.yes) {\n console.error(`Will update Lincoln ${summary}. Run with --yes to proceed.`)\n return 1\n }\n\n const installCode = await resolved.npmInstallGlobal(latest)\n if (installCode !== 0) {\n console.error(`npm install -g ${PACKAGE_NAME}@${latest} failed with exit code ${installCode}`)\n return 1\n }\n\n // NOTE: this runs the *current* process's install(), not the just-installed\n // new version's. Re-executing the freshly installed `lincoln` binary would\n // rely on PATH/npx resolution picking up the new shim, which is fragile\n // mid-upgrade. The tradeoff is that sync logic changes shipped in the new\n // version only take effect on the next command run.\n const syncCode = await resolved.runInstall(defaultInstallOptions())\n if (syncCode !== 0) {\n console.error(`lincoln install failed with exit code ${syncCode}`)\n return 1\n }\n\n console.log(`Updated Lincoln to ${latest}`)\n return 0\n}\n\nfunction defaultInstallOptions(): InstallOptions {\n return { yes: true, dryRun: false, force: false, harnesses: [], noVenv: true }\n}\n\nfunction runNpmInstallGlobal(packageName: string, version: string): Promise<number> {\n return new Promise((resolvePromise) => {\n const child = spawn('npm', ['install', '-g', `${packageName}@${version}`], {\n stdio: 'inherit',\n shell: process.platform === 'win32'\n })\n child.on('close', (code) => resolvePromise(code ?? 1))\n child.on('error', () => resolvePromise(1))\n })\n}\n","const DEFAULT_REGISTRY_URL = 'https://registry.npmjs.org'\nconst FETCH_TIMEOUT_MS = 15_000\n\nexport interface NpmDistTags {\n latest?: string\n [tag: string]: string | undefined\n}\n\nexport interface NpmVersionMetadata {\n version?: string\n dist?: {\n tarball?: string\n }\n}\n\nexport interface NpmPackument {\n name?: string\n 'dist-tags'?: NpmDistTags\n versions?: Record<string, NpmVersionMetadata>\n}\n\nexport interface RegistryClient {\n latestVersion(packageName: string): Promise<string>\n versions(packageName: string): Promise<string[]>\n resolveVersion(packageName: string, spec: string): Promise<string>\n}\n\nexport function createRegistryClient(\n registryUrl: string = DEFAULT_REGISTRY_URL,\n fetchImpl: typeof fetch = fetch\n): RegistryClient {\n const baseUrl = registryUrl.replace(/\\/+$/, '')\n\n async function fetchPackument(packageName: string): Promise<NpmPackument> {\n const url = `${baseUrl}/${encodePackageName(packageName)}`\n const response = await fetchImpl(url, {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS)\n })\n if (!response.ok) {\n throw new Error(\n `npm registry returned ${response.status} ${response.statusText} for ${packageName}`\n )\n }\n return (await response.json()) as NpmPackument\n }\n\n return {\n async latestVersion(packageName: string): Promise<string> {\n const packument = await fetchPackument(packageName)\n const latest = packument['dist-tags']?.latest\n if (!latest) {\n throw new Error(`npm registry has no latest dist-tag for ${packageName}`)\n }\n return latest\n },\n\n async versions(packageName: string): Promise<string[]> {\n const packument = await fetchPackument(packageName)\n return Object.keys(packument.versions ?? {})\n },\n\n async resolveVersion(packageName: string, spec: string): Promise<string> {\n const packument = await fetchPackument(packageName)\n const tagTarget = packument['dist-tags']?.[spec]\n if (tagTarget) {\n return tagTarget\n }\n if (packument.versions && spec in packument.versions) {\n return spec\n }\n throw new Error(`Version not found for ${packageName}: ${spec}`)\n }\n }\n}\n\nfunction encodePackageName(packageName: string): string {\n if (packageName.startsWith('@')) {\n const slash = packageName.indexOf('/')\n if (slash === -1) {\n return encodeURIComponent(packageName)\n }\n const scope = packageName.slice(1, slash)\n const name = packageName.slice(slash + 1)\n return `@${encodeURIComponent(scope)}%2F${encodeURIComponent(name)}`\n }\n return encodeURIComponent(packageName)\n}\n","const SEMVER_CORE = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/\nconst NUMERIC_IDENTIFIER = /^\\d+$/\n\ninterface ParsedVersion {\n major: number\n minor: number\n patch: number\n prerelease: string[]\n}\n\n/**\n * Compares two semver strings per semver.org precedence rules (build metadata\n * ignored). Returns a negative number when a < b, 0 when equal, a positive\n * number when a > b, or undefined when either input is not a parseable semver.\n */\nexport function compareVersions(a: string, b: string): number | undefined {\n const pa = parseVersion(a)\n const pb = parseVersion(b)\n if (!pa || !pb) {\n return undefined\n }\n if (pa.major !== pb.major) return pa.major - pb.major\n if (pa.minor !== pb.minor) return pa.minor - pb.minor\n if (pa.patch !== pb.patch) return pa.patch - pb.patch\n return comparePrerelease(pa.prerelease, pb.prerelease)\n}\n\nfunction parseVersion(version: string): ParsedVersion | undefined {\n const match = SEMVER_CORE.exec(version.trim())\n if (!match) {\n return undefined\n }\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ? match[4].split('.') : []\n }\n}\n\nfunction comparePrerelease(a: string[], b: string[]): number {\n if (a.length === 0 && b.length === 0) return 0\n // A version without a prerelease has higher precedence than one with it.\n if (a.length === 0) return 1\n if (b.length === 0) return -1\n const shared = Math.min(a.length, b.length)\n for (let i = 0; i < shared; i++) {\n const x = a[i]\n const y = b[i]\n if (x === y) continue\n const xNumeric = NUMERIC_IDENTIFIER.test(x)\n const yNumeric = NUMERIC_IDENTIFIER.test(y)\n if (xNumeric && yNumeric) return Number(x) - Number(y)\n // Numeric identifiers have lower precedence than alphanumeric ones.\n if (xNumeric) return -1\n if (yNumeric) return 1\n return x < y ? -1 : 1\n }\n return a.length - b.length\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport type { LincolnPaths } from '../lib/paths.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport { createRegistryClient } from '../lib/npmRegistry.js'\nimport { install } from './install.js'\nimport type { InstallOptions } from './install.js'\n\nconst PACKAGE_NAME = '@sushanglewis/lincoln'\nconst SEMVER_REGEX = /^v?\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/\nconst STRICT_SEMVER_REGEX = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/\nconst DIST_TAG_REGEX = /^[a-zA-Z][a-zA-Z0-9._-]*$/\n\nexport interface UseOptions {\n dryRun: boolean\n yes: boolean\n}\n\nexport interface UseDeps {\n paths: LincolnPaths\n resolveVersion: (spec: string) => Promise<string>\n ensureVersionAvailable: (version: string) => Promise<void>\n npmGlobalRoot: () => Promise<string | undefined>\n runInstall: (options: InstallOptions) => Promise<number>\n}\n\nexport function createDefaultDeps(): UseDeps {\n const paths = resolveLincolnPaths()\n const registry = createRegistryClient()\n return {\n paths,\n resolveVersion: async (spec) => {\n // Exact (optionally v-prefixed) versions resolve locally without a\n // registry round-trip, so switching between installed versions works\n // offline. Dist-tags (latest, next, ...) need the registry.\n const normalized = spec.startsWith('v') ? spec.slice(1) : spec\n if (STRICT_SEMVER_REGEX.test(normalized)) {\n return normalized\n }\n return registry.resolveVersion(PACKAGE_NAME, spec)\n },\n ensureVersionAvailable: async (version) => {\n const code = await runNpmInstallGlobal(PACKAGE_NAME, version)\n if (code !== 0) {\n throw new Error(`npm install -g ${PACKAGE_NAME}@${version} exited with ${code}`)\n }\n },\n npmGlobalRoot: () => runNpmRootGlobal(),\n runInstall: (options) => install(options)\n }\n}\n\nexport async function use(\n spec: string,\n options: UseOptions,\n deps: Partial<UseDeps> = {}\n): Promise<number> {\n if (!isValidVersion(spec)) {\n console.error(`Invalid version: ${spec}`)\n return 1\n }\n\n const resolved: UseDeps = { ...createDefaultDeps(), ...deps }\n\n let version: string\n try {\n version = await resolved.resolveVersion(spec)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to resolve version ${spec}: ${message}`)\n return 1\n }\n\n const versionDir = path.join(resolved.paths.versionsDir, version)\n const alreadyInstalled = fs.existsSync(versionDir)\n\n if (options.dryRun) {\n if (alreadyInstalled) {\n console.log(`Dry run: would switch ${resolved.paths.currentDir} to ${versionDir}`)\n } else {\n console.log(\n `Dry run: would install ${PACKAGE_NAME}@${version} globally, then switch ${resolved.paths.currentDir} to ${versionDir}`\n )\n }\n return 0\n }\n\n if (!options.yes) {\n console.error(`Will switch Lincoln to ${version}. Run with --yes to proceed.`)\n return 1\n }\n\n if (!alreadyInstalled) {\n try {\n await resolved.ensureVersionAvailable(version)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to install ${PACKAGE_NAME}@${version}: ${message}`)\n return 1\n }\n\n if (!fs.existsSync(versionDir)) {\n // `npm install -g` places the package in the npm global root; it does\n // not populate ~/.lincoln/versions. Copy the payload over so the\n // version switch below has a real directory to point at.\n try {\n await copyVersionFromNpmGlobal(resolved, versionDir)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to populate ${versionDir}: ${message}`)\n return 1\n }\n }\n\n if (!fs.existsSync(versionDir)) {\n console.error(\n `Provisioning ${PACKAGE_NAME}@${version} did not produce ${versionDir}; cannot switch versions.`\n )\n return 1\n }\n }\n\n try {\n switchCurrentLink(resolved.paths, versionDir)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to switch ${resolved.paths.currentDir}: ${message}`)\n return 1\n }\n\n const syncCode = await resolved.runInstall(defaultInstallOptions())\n if (syncCode !== 0) {\n console.error(`lincoln install failed with exit code ${syncCode}`)\n return 1\n }\n\n // The trailing install re-points ~/.lincoln/current at the *running* CLI's\n // own version dir (Task 9 behavior, pending the install payload fix).\n // Re-assert the requested version so the switch actually sticks.\n try {\n switchCurrentLink(resolved.paths, versionDir)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to switch ${resolved.paths.currentDir}: ${message}`)\n return 1\n }\n\n console.log(`Switched Lincoln to ${version}`)\n return 0\n}\n\nfunction isValidVersion(version: string): boolean {\n return SEMVER_REGEX.test(version) || DIST_TAG_REGEX.test(version)\n}\n\nasync function copyVersionFromNpmGlobal(deps: UseDeps, versionDir: string): Promise<void> {\n const globalRoot = await deps.npmGlobalRoot()\n if (!globalRoot) {\n return\n }\n const packageRoot = path.join(globalRoot, ...PACKAGE_NAME.split('/'))\n if (!fs.existsSync(packageRoot)) {\n return\n }\n fs.mkdirSync(path.dirname(versionDir), { recursive: true })\n fs.cpSync(packageRoot, versionDir, { recursive: true })\n}\n\nfunction switchCurrentLink(paths: LincolnPaths, versionDir: string): void {\n fs.mkdirSync(paths.lincolnHome, { recursive: true })\n try {\n fs.rmSync(paths.currentDir, { recursive: true, force: true })\n fs.symlinkSync(versionDir, paths.currentDir)\n } catch {\n fs.rmSync(paths.currentDir, { recursive: true, force: true })\n fs.cpSync(versionDir, paths.currentDir, { recursive: true, force: true })\n }\n}\n\nfunction defaultInstallOptions(): InstallOptions {\n return { yes: true, dryRun: false, force: false, harnesses: [], noVenv: true }\n}\n\nfunction runNpmInstallGlobal(packageName: string, version: string): Promise<number> {\n return new Promise((resolvePromise) => {\n const child = spawn('npm', ['install', '-g', `${packageName}@${version}`], {\n stdio: 'inherit',\n shell: process.platform === 'win32'\n })\n child.on('close', (code) => resolvePromise(code ?? 1))\n child.on('error', () => resolvePromise(1))\n })\n}\n\nfunction runNpmRootGlobal(): Promise<string | undefined> {\n return new Promise((resolvePromise) => {\n const child = spawn('npm', ['root', '-g'], {\n stdio: ['ignore', 'pipe', 'ignore'],\n shell: process.platform === 'win32'\n })\n let stdout = ''\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString()\n })\n child.on('close', (code) => {\n const root = stdout.trim()\n resolvePromise(code === 0 && root.length > 0 ? root : undefined)\n })\n child.on('error', () => resolvePromise(undefined))\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { listVendoredFrameworkFiles } from '../lib/projectFiles.js'\nimport { readLocalPackageVersion } from '../lib/packageInfo.js'\nimport { writeProjectMarker } from '../lib/marker.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport type { LincolnPaths } from '../lib/paths.js'\n\nexport interface MigrateProjectOptions {\n dryRun?: boolean\n yes?: boolean\n force?: boolean\n}\n\nexport interface MigrateProjectDeps {\n paths: LincolnPaths\n listVendoredFrameworkFiles: (\n payloadRoot: string,\n projectRoot: string\n ) => ReturnType<typeof listVendoredFrameworkFiles>\n writeProjectMarker: typeof writeProjectMarker\n}\n\nexport function createDefaultDeps(): MigrateProjectDeps {\n return {\n paths: resolveLincolnPaths(),\n listVendoredFrameworkFiles,\n writeProjectMarker\n }\n}\n\nexport async function migrateProject(\n projectRoot: string,\n options: MigrateProjectOptions = {},\n deps: MigrateProjectDeps = createDefaultDeps()\n): Promise<number> {\n const payloadRoot = deps.paths.currentDir\n if (!fs.existsSync(payloadRoot)) {\n console.error(`Lincoln payload not found at ${payloadRoot}. Run \"lincoln install\" first.`)\n return 1\n }\n\n const absoluteProjectRoot = path.resolve(projectRoot)\n const report = deps.listVendoredFrameworkFiles(payloadRoot, absoluteProjectRoot)\n\n if (options.dryRun) {\n console.log(`Dry run: would migrate ${absoluteProjectRoot}`)\n if (report.removable.length > 0) {\n console.log('Would remove unmodified framework files:')\n for (const f of report.removable) console.log(` - ${f}`)\n }\n if (report.modified.length > 0) {\n console.log('Would preserve modified framework files:')\n for (const f of report.modified) console.log(` - ${f}`)\n }\n if (report.preserved.length > 0) {\n console.log('Would preserve project-local files:')\n for (const f of report.preserved) console.log(` - ${f}`)\n }\n console.log('Would create .lincoln.yaml')\n return 0\n }\n\n if (!options.yes) {\n console.error('This will remove vendored framework files. Run with --yes to proceed.')\n return 1\n }\n\n for (const file of report.removable) {\n const filePath = path.join(absoluteProjectRoot, file)\n try {\n fs.rmSync(filePath)\n // Remove empty parent directories up to project root\n let dir = path.dirname(filePath)\n while (dir !== absoluteProjectRoot && fs.existsSync(dir)) {\n const entries = fs.readdirSync(dir)\n if (entries.length === 0) {\n fs.rmdirSync(dir)\n dir = path.dirname(dir)\n } else {\n break\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to remove ${file}: ${message}`)\n return 1\n }\n }\n\n if (report.modified.length > 0) {\n console.log('Preserved modified framework files:')\n for (const f of report.modified) console.log(` - ${f}`)\n }\n\n if (report.preserved.length > 0) {\n console.log('Preserved project-local files:')\n for (const f of report.preserved) console.log(` - ${f}`)\n }\n\n try {\n deps.writeProjectMarker(\n absoluteProjectRoot,\n {\n enabled: true,\n workflow_template: 'interview-to-knowledge',\n min_lincoln_version: readLocalPackageVersion() ?? '1.5.0'\n },\n { force: options.force }\n )\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to write .lincoln.yaml: ${message}`)\n return 1\n }\n\n console.log(`Migrated project at ${absoluteProjectRoot}`)\n console.log(`Removed ${report.removable.length} unmodified framework files`)\n return 0\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport crypto from 'node:crypto'\n\n// Mirrors scripts/package-lincoln-plugin.py and scripts/sync-framework-package.mjs\nexport const FRAMEWORK_ALLOWLIST_DIRS = ['.claude', '.claude-plugin', 'scripts', 'tools']\nexport const FRAMEWORK_ALLOWLIST_FILES = [\n 'README.md',\n 'README.en.md',\n 'USAGE.md',\n 'CONTRIBUTING.md',\n 'CLAUDE.md',\n 'LICENSE',\n 'RELEASE.md',\n '.version-bump.json',\n 'requirements.txt',\n 'SKILL.md'\n]\nexport const FRAMEWORK_DENYLIST_NAMES = new Set([\n '.git',\n '.context',\n '.venv',\n 'venv',\n 'dist',\n 'oss',\n '.pytest_cache',\n '__pycache__',\n '.DS_Store',\n 'node_modules'\n])\nexport const FRAMEWORK_DENYLIST_PREFIXES = ['issue-']\nexport const FRAMEWORK_SKIP_PATHS = new Set([\n '.claude/templates/issue-package',\n 'tools/lincoln-installer/dist',\n 'tools/lincoln-installer/node_modules',\n 'tools/lincoln-installer/coverage'\n])\n\nfunction sha256(filePath: string): string {\n return crypto.createHash('sha256').update(fs.readFileSync(filePath)).digest('hex')\n}\n\nfunction isDenied(relativePath: string): boolean {\n const parts = relativePath.split(path.sep)\n for (const part of parts) {\n if (FRAMEWORK_DENYLIST_NAMES.has(part)) return true\n for (const prefix of FRAMEWORK_DENYLIST_PREFIXES) {\n if (part.startsWith(prefix)) return true\n }\n }\n for (const skip of FRAMEWORK_SKIP_PATHS) {\n if (relativePath === skip || relativePath.startsWith(skip + path.sep)) return true\n }\n return false\n}\n\nfunction isAllowlisted(relativePath: string): boolean {\n if (FRAMEWORK_ALLOWLIST_FILES.includes(relativePath)) return true\n for (const dir of FRAMEWORK_ALLOWLIST_DIRS) {\n if (relativePath === dir || relativePath.startsWith(dir + path.sep)) return true\n }\n return false\n}\n\nfunction isPreservedDir(relativePath: string): boolean {\n const normalized = relativePath.replace(/\\\\/g, '/')\n if (normalized === '.context' || normalized.startsWith('.context/')) return true\n const parts = normalized.split('/')\n for (const part of parts) {\n if (part.startsWith('issue-')) return true\n }\n return false\n}\n\nfunction isPreserved(relativePath: string): boolean {\n const normalized = relativePath.replace(/\\\\/g, '/')\n if (normalized === '.github/openspec-config.yml') return true\n return isPreservedDir(relativePath)\n}\n\nexport interface VendoredFileReport {\n removable: string[]\n modified: string[]\n preserved: string[]\n}\n\nexport function listVendoredFrameworkFiles(\n payloadRoot: string,\n projectRoot: string\n): VendoredFileReport {\n const report: VendoredFileReport = { removable: [], modified: [], preserved: [] }\n\n function walk(dir: string): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n const relativePath = path.relative(projectRoot, fullPath)\n\n if (entry.isDirectory()) {\n if (isPreservedDir(relativePath)) {\n walk(fullPath)\n } else if (!isDenied(relativePath)) {\n walk(fullPath)\n }\n continue\n }\n\n if (isPreserved(relativePath)) {\n report.preserved.push(relativePath)\n continue\n }\n\n if (isDenied(relativePath)) continue\n if (!isAllowlisted(relativePath)) continue\n\n const payloadFile = path.join(payloadRoot, relativePath)\n if (!fs.existsSync(payloadFile)) {\n report.modified.push(relativePath)\n continue\n }\n\n if (sha256(fullPath) === sha256(payloadFile)) {\n report.removable.push(relativePath)\n } else {\n report.modified.push(relativePath)\n }\n }\n }\n\n if (fs.existsSync(projectRoot)) {\n walk(projectRoot)\n }\n\n return report\n}\n","import { spawn, type ChildProcess } from 'node:child_process'\nimport { EventEmitter } from 'node:events'\n\nexport interface RecordDeps {\n spawn: (\n command: string,\n args: readonly string[],\n options: { stdio: 'inherit' }\n ) => ChildProcess\n}\n\nexport function createDefaultDeps(): RecordDeps {\n return { spawn }\n}\n\nexport function record(args: string[], deps: RecordDeps = createDefaultDeps()): Promise<number> {\n return new Promise((resolve) => {\n const child = deps.spawn('lincoln-record', args, { stdio: 'inherit' })\n child.on('error', (err: Error) => {\n console.error(`Failed to start lincoln-record: ${err.message}`)\n resolve(1)\n })\n child.on('close', (code: number | null) => {\n resolve(code ?? 0)\n })\n })\n}\n\nexport function makeFakeChildProcess(exitCode: number | null = 0): ChildProcess {\n const emitter = new EventEmitter() as ChildProcess\n process.nextTick(() => {\n emitter.emit('close', exitCode)\n })\n return emitter\n}\n\nexport function makeFailingFakeChildProcess(message: string): ChildProcess {\n const emitter = new EventEmitter() as ChildProcess\n process.nextTick(() => {\n emitter.emit('error', new Error(message))\n })\n return emitter\n}\n"],"mappings":"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","names":["fs","path","fileURLToPath","fs","path","path","path","fs","fs","path","fs","path","fs","path","spawn","fs","path","fs","path","fs","path","os","createDefaultDeps","fs","path","spawn","MIN_PYTHON_MAJOR","MIN_PYTHON_MINOR","parsePythonVersion","spawn","createDefaultDeps","spawn","fs","path","spawn","PACKAGE_NAME","createDefaultDeps","runNpmInstallGlobal","path","fs","defaultInstallOptions","spawn","fs","path","fs","path","crypto","sha256","createDefaultDeps","fs","path","spawn","createDefaultDeps","path","fs","fileURLToPath"]}
1
+ {"version":3,"sources":["../src/main.ts","../src/cli.ts","../src/commands/doctor.ts","../src/lib/paths.ts","../src/lib/versionMarker.ts","../src/lib/packageInfo.ts","../src/lib/marker.ts","../src/commands/initProject.ts","../src/commands/install.ts","../src/lib/syncClaude.ts","../src/lib/claudeMdMerge.ts","../src/lib/harnessDetect.ts","../src/commands/update.ts","../src/lib/npmRegistry.ts","../src/lib/semver.ts","../src/commands/use.ts","../src/commands/migrateProject.ts","../src/lib/projectFiles.ts","../src/commands/record.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { parseArgs } from './cli.js'\nimport { doctor } from './commands/doctor.js'\nimport { initProject } from './commands/initProject.js'\nimport { install } from './commands/install.js'\nimport { update } from './commands/update.js'\nimport { use } from './commands/use.js'\nimport { migrateProject } from './commands/migrateProject.js'\nimport { record } from './commands/record.js'\nimport { readLocalPackageVersion } from './lib/packageInfo.js'\n\nconst USAGE = `Lincoln — Global agent harness plugin CLI\n\nUsage:\n lincoln <command> [options]\n\nCommands:\n install One-time global setup: sync to ~/.claude/, ~/.codex/, ~/.opencode/\n update Pull latest release and re-sync globally\n use <version> Switch active global version\n doctor Diagnose harness integration\n init-project Create .lincoln.yaml in current project\n migrate-project Remove vendored framework files from an existing project\n record Launch the Lincoln interview recorder TUI\n help Show this help message\n\nOptions:\n --yes, -y Skip confirmation prompts\n --dry-run Show what would be done without making changes\n --force Force re-install even if up to date\n --check Check for available updates without installing (update)\n --json Output machine-readable JSON (where supported)\n --help, -h Show this help message\n --version, -v Show the installed Lincoln version\n`\n\nexport async function main(argv: string[]): Promise<number> {\n const parsed = parseArgs(argv)\n\n if (parsed.flags.version || parsed.flags.v) {\n const version = readLocalPackageVersion()\n console.log(version ? `Lincoln ${version}` : 'Lincoln (unknown version)')\n return 0\n }\n\n if (parsed.command === 'help') {\n console.log(USAGE)\n return 0\n }\n\n if (parsed.command === 'install') {\n return install({\n yes: Boolean(parsed.flags.yes || parsed.flags.y),\n dryRun: Boolean(parsed.flags['dry-run']),\n force: Boolean(parsed.flags.force),\n harnesses: parsed.args,\n noVenv: Boolean(parsed.flags['no-venv'])\n })\n }\n\n if (parsed.command === 'update') {\n return update({\n check: Boolean(parsed.flags.check),\n dryRun: Boolean(parsed.flags['dry-run']),\n yes: Boolean(parsed.flags.yes || parsed.flags.y)\n })\n }\n\n if (parsed.command === 'use') {\n const version = parsed.args[0]\n if (!version) {\n console.error('Usage: lincoln use <version> [--yes] [--dry-run]')\n return 1\n }\n return use(version, {\n dryRun: Boolean(parsed.flags['dry-run']),\n yes: Boolean(parsed.flags.yes || parsed.flags.y)\n })\n }\n\n if (parsed.command === 'doctor') {\n const result = await doctor({ json: Boolean(parsed.flags.json) })\n return result.code\n }\n\n if (parsed.command === 'init-project') {\n return initProject(process.cwd(), {\n force: Boolean(parsed.flags.force),\n dryRun: Boolean(parsed.flags['dry-run'])\n })\n }\n\n if (parsed.command === 'migrate-project') {\n return migrateProject(process.cwd(), {\n dryRun: Boolean(parsed.flags['dry-run']),\n yes: Boolean(parsed.flags.yes || parsed.flags.y),\n force: Boolean(parsed.flags.force)\n })\n }\n\n if (parsed.command === 'record') {\n return record(parsed.args)\n }\n\n console.log(USAGE)\n return 0\n}\n\nif (\n process.argv[1] &&\n path.resolve(fs.realpathSync(fileURLToPath(import.meta.url))) ===\n path.resolve(fs.realpathSync(process.argv[1]))\n) {\n main(process.argv).then((code) => process.exit(code))\n}\n","export interface ParsedArgs {\n command: string\n args: string[]\n flags: Record<string, unknown>\n}\n\n/**\n * Flags that never take a value. Boolean flags must not consume the next\n * token, otherwise `lincoln use --yes 1.6.0` would swallow the positional\n * version argument into `flags.yes`.\n */\nconst BOOLEAN_FLAGS = new Set([\n 'yes',\n 'y',\n 'dry-run',\n 'force',\n 'check',\n 'json',\n 'help',\n 'h',\n 'no-venv',\n 'version',\n 'v'\n])\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2)\n const flags: Record<string, unknown> = {}\n const positional: string[] = []\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (arg.startsWith('--')) {\n const key = arg.replace(/^--/, '')\n const next = args[i + 1]\n if (!BOOLEAN_FLAGS.has(key) && next && !next.startsWith('-')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else if (arg.startsWith('-')) {\n const key = arg.replace(/^-/, '')\n const next = args[i + 1]\n if (!BOOLEAN_FLAGS.has(key) && next && !next.startsWith('-')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else {\n positional.push(arg)\n }\n }\n\n const command = positional[0] || 'help'\n const validCommands = new Set([\n 'install',\n 'update',\n 'use',\n 'doctor',\n 'init-project',\n 'migrate-project',\n 'record',\n 'help',\n '--help',\n '-h'\n ])\n\n if (command === 'help' || command === '--help' || command === '-h') {\n return { command: 'help', args: positional.slice(1), flags }\n }\n\n if (!validCommands.has(command)) {\n return { command: 'help', args: positional, flags }\n }\n\n return { command, args: positional.slice(1), flags }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport type { LincolnPaths } from '../lib/paths.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport { readVersionMarker } from '../lib/versionMarker.js'\n\nexport interface DoctorCheck {\n name: string\n status: 'ok' | 'warn' | 'skip' | 'error'\n message: string\n}\n\nexport interface DoctorOptions {\n json?: boolean\n}\n\nexport interface DoctorDeps {\n paths: LincolnPaths\n nodeVersion: () => string\n pythonVersion: () => Promise<string | undefined>\n pyyamlVersion: () => Promise<string | undefined>\n npmVersion: () => Promise<string | undefined>\n projectRoot: string\n}\n\nexport interface DoctorResult {\n code: number\n checks: DoctorCheck[]\n}\n\nconst MIN_NODE_MAJOR = 20\nconst MIN_PYTHON_MAJOR = 3\nconst MIN_PYTHON_MINOR = 10\n\nexport function createDefaultDeps(): DoctorDeps {\n const paths = resolveLincolnPaths()\n const pythonCommand = resolvePythonCommand(paths)\n return {\n paths,\n nodeVersion: () => process.version,\n pythonVersion: () => queryCommandVersion(pythonCommand, ['--version']),\n pyyamlVersion: () => queryPyyamlVersion(pythonCommand),\n npmVersion: () => queryCommandVersion('npm', ['--version']),\n projectRoot: process.cwd()\n }\n}\n\nexport async function doctor(\n options: DoctorOptions = {},\n deps: DoctorDeps = createDefaultDeps()\n): Promise<DoctorResult> {\n const checks: DoctorCheck[] = []\n\n checks.push(checkNode(deps.nodeVersion()))\n checks.push(await checkPython(deps.pythonVersion))\n checks.push(await checkPyyaml(deps.pyyamlVersion))\n checks.push(await checkNpm(deps.npmVersion))\n checks.push(checkGlobalMarker(deps.paths))\n checks.push(checkPayloadHooks(deps.paths))\n checks.push(checkVenv(deps.paths))\n checks.push(checkProjectMarker(deps.projectRoot))\n\n const hasError = checks.some((c) => c.status === 'error')\n const result: DoctorResult = { code: hasError ? 1 : 0, checks }\n\n if (options.json) {\n console.log(JSON.stringify({ checks }, null, 2))\n } else {\n for (const check of checks) {\n const icon = check.status === 'ok' ? '✓' : check.status === 'error' ? '✗' : check.status === 'warn' ? '!' : '-'\n console.log(`${icon} ${check.name}: ${check.message}`)\n }\n if (hasError) {\n console.error('\\nOne or more checks failed.')\n }\n }\n\n return result\n}\n\nfunction checkNode(version: string): DoctorCheck {\n const major = parseNodeMajor(version)\n if (major === undefined) {\n return { name: 'node', status: 'warn', message: `Could not parse Node version: ${version}` }\n }\n if (major < MIN_NODE_MAJOR) {\n return { name: 'node', status: 'error', message: `Node ${version} is below the minimum required v${MIN_NODE_MAJOR}` }\n }\n return { name: 'node', status: 'ok', message: `Node ${version}` }\n}\n\nasync function checkPython(query: () => Promise<string | undefined>): Promise<DoctorCheck> {\n const version = (await query())?.trim()\n if (!version) {\n return { name: 'python', status: 'error', message: 'Python 3 is not available' }\n }\n const parsed = parsePythonVersion(version)\n if (!parsed) {\n return { name: 'python', status: 'warn', message: `Could not parse Python version: ${version}` }\n }\n if (parsed.major < MIN_PYTHON_MAJOR || (parsed.major === MIN_PYTHON_MAJOR && parsed.minor < MIN_PYTHON_MINOR)) {\n return {\n name: 'python',\n status: 'error',\n message: `Python ${version} is below the minimum required ${MIN_PYTHON_MAJOR}.${MIN_PYTHON_MINOR}`\n }\n }\n const display = version.replace(/^Python\\s+/, '')\n return { name: 'python', status: 'ok', message: `Python ${display}` }\n}\n\nasync function checkPyyaml(query: () => Promise<string | undefined>): Promise<DoctorCheck> {\n const version = await query()\n if (!version) {\n return { name: 'pyyaml', status: 'error', message: 'PyYAML is not installed for Python 3' }\n }\n return { name: 'pyyaml', status: 'ok', message: `PyYAML ${version}` }\n}\n\nasync function checkNpm(query: () => Promise<string | undefined>): Promise<DoctorCheck> {\n const version = await query()\n if (!version) {\n return { name: 'npm', status: 'warn', message: 'npm is not available' }\n }\n return { name: 'npm', status: 'ok', message: `npm ${version}` }\n}\n\nfunction checkGlobalMarker(paths: LincolnPaths): DoctorCheck {\n const marker = readVersionMarker(paths)\n if (!marker) {\n return { name: 'global-marker', status: 'warn', message: `No version marker at ${paths.versionMarker}` }\n }\n return { name: 'global-marker', status: 'ok', message: `Lincoln ${marker.version} installed` }\n}\n\nfunction checkPayloadHooks(paths: LincolnPaths): DoctorCheck {\n const hooksDir = path.join(paths.currentDir, '.claude', 'hooks')\n if (!fs.existsSync(hooksDir)) {\n return { name: 'payload-hooks', status: 'warn', message: `Payload hooks not found at ${hooksDir}` }\n }\n const required = ['on-session-start.sh']\n const missing = required.filter((f) => !fs.existsSync(path.join(hooksDir, f)))\n if (missing.length > 0) {\n return { name: 'payload-hooks', status: 'warn', message: `Missing hooks: ${missing.join(', ')}` }\n }\n return { name: 'payload-hooks', status: 'ok', message: `Payload hooks present at ${hooksDir}` }\n}\n\nfunction checkVenv(paths: LincolnPaths): DoctorCheck {\n if (!fs.existsSync(paths.venvDir)) {\n return { name: 'venv', status: 'warn', message: `Virtual environment not found at ${paths.venvDir}` }\n }\n const pythonExe = path.join(paths.venvDir, process.platform === 'win32' ? 'Scripts' : 'bin', 'python')\n if (!fs.existsSync(pythonExe)) {\n return { name: 'venv', status: 'warn', message: `Virtual environment exists but python executable is missing` }\n }\n return { name: 'venv', status: 'ok', message: `Virtual environment present at ${paths.venvDir}` }\n}\n\nfunction checkProjectMarker(projectRoot: string): DoctorCheck {\n const markerPath = path.join(projectRoot, '.lincoln.yaml')\n if (!fs.existsSync(markerPath)) {\n return { name: 'project-marker', status: 'skip', message: `No .lincoln.yaml in ${projectRoot}` }\n }\n return { name: 'project-marker', status: 'ok', message: `Project marker found at ${markerPath}` }\n}\n\nfunction resolvePythonCommand(paths: LincolnPaths): string {\n const venvPython = path.join(\n paths.venvDir,\n process.platform === 'win32' ? 'Scripts' : 'bin',\n process.platform === 'win32' ? 'python.exe' : 'python'\n )\n if (fs.existsSync(venvPython)) {\n return venvPython\n }\n return 'python3'\n}\n\nfunction parseNodeMajor(version: string): number | undefined {\n const match = /^v?(\\d+)/.exec(version)\n if (!match) {\n return undefined\n }\n return Number(match[1])\n}\n\nfunction parsePythonVersion(version: string): { major: number; minor: number } | undefined {\n const match = /(\\d+)\\.(\\d+)/.exec(version)\n if (!match) {\n return undefined\n }\n return { major: Number(match[1]), minor: Number(match[2]) }\n}\n\nasync function queryCommandVersion(command: string, args: string[]): Promise<string | undefined> {\n return new Promise((resolvePromise) => {\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'ignore'],\n shell: process.platform === 'win32'\n })\n let stdout = ''\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString()\n })\n child.on('close', (code) => {\n const text = stdout.trim()\n resolvePromise(code === 0 && text.length > 0 ? text : undefined)\n })\n child.on('error', () => resolvePromise(undefined))\n })\n}\n\nasync function queryPyyamlVersion(pythonCommand: string): Promise<string | undefined> {\n return new Promise((resolvePromise) => {\n const child = spawn(\n pythonCommand,\n ['-c', 'import yaml; print(yaml.__version__)'],\n { stdio: ['ignore', 'pipe', 'ignore'], shell: process.platform === 'win32' }\n )\n let stdout = ''\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString()\n })\n child.on('close', (code) => {\n const text = stdout.trim()\n resolvePromise(code === 0 && text.length > 0 ? text : undefined)\n })\n child.on('error', () => resolvePromise(undefined))\n })\n}\n","import path from 'node:path'\nimport os from 'node:os'\n\nexport interface LincolnPaths {\n homeDir: string\n lincolnHome: string\n versionsDir: string\n currentDir: string\n versionMarker: string\n venvDir: string\n claudeDir: string\n codexDir: string\n opencodeDir: string\n}\n\nexport function resolveLincolnPaths(overrideHomeDir?: string): LincolnPaths {\n const homeDir = overrideHomeDir ?? os.homedir()\n const lincolnHome = process.env.LINCOLN_HOME\n ? path.resolve(process.env.LINCOLN_HOME)\n : path.join(homeDir, '.lincoln')\n\n return {\n homeDir,\n lincolnHome,\n versionsDir: path.join(lincolnHome, 'versions'),\n currentDir: path.join(lincolnHome, 'current'),\n versionMarker: path.join(lincolnHome, 'marker.json'),\n venvDir: path.join(lincolnHome, 'venv'),\n claudeDir: path.join(homeDir, '.claude'),\n codexDir: path.join(homeDir, '.codex'),\n opencodeDir: path.join(homeDir, '.opencode')\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { LincolnPaths } from './paths.js'\n\nexport interface VersionMarker {\n version: string\n installedAt: string\n harnesses: string[]\n managedFiles: string[]\n}\n\nexport function readVersionMarker(paths: LincolnPaths): VersionMarker | undefined {\n try {\n const raw = fs.readFileSync(paths.versionMarker, 'utf8')\n const parsed = JSON.parse(raw) as VersionMarker\n if (\n typeof parsed.version === 'string' &&\n typeof parsed.installedAt === 'string' &&\n Array.isArray(parsed.harnesses)\n ) {\n return parsed\n }\n return undefined\n } catch {\n return undefined\n }\n}\n\nexport function writeVersionMarker(\n paths: LincolnPaths,\n marker: VersionMarker\n): void {\n fs.mkdirSync(path.dirname(paths.versionMarker), { recursive: true })\n fs.writeFileSync(paths.versionMarker, JSON.stringify(marker, null, 2) + '\\n')\n}\n\nexport function isUpToDate(paths: LincolnPaths, version: string): boolean {\n const marker = readVersionMarker(paths)\n return marker?.version === version\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\n/**\n * Finds the directory containing the running lincoln package's package.json.\n * Returns undefined when no package.json can be located.\n */\nexport function readLocalPackageRoot(): string | undefined {\n try {\n let dir = path.dirname(fileURLToPath(import.meta.url))\n const root = path.parse(dir).root\n while (dir !== root) {\n const pkgPath = path.join(dir, 'package.json')\n if (fs.existsSync(pkgPath)) {\n const parsed = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as { name?: string }\n if (parsed.name === '@sushanglewis/lincoln') {\n return dir\n }\n }\n dir = path.dirname(dir)\n }\n } catch {\n // ignore and return undefined\n }\n return undefined\n}\n\n/**\n * Reads the version of the running lincoln package from its own package.json.\n * Walks upward from the current module file until it finds the package.json.\n * Returns undefined when the package.json cannot be located or parsed.\n */\nexport function readLocalPackageVersion(): string | undefined {\n try {\n const root = readLocalPackageRoot()\n if (!root) return undefined\n const parsed = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')) as {\n version?: string\n }\n return typeof parsed.version === 'string' ? parsed.version : undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Resolves the bundled framework payload directory inside the running package.\n */\nexport function resolvePayloadRoot(): string | undefined {\n const root = readLocalPackageRoot()\n if (!root) return undefined\n const payload = path.join(root, 'framework')\n return fs.existsSync(payload) ? payload : undefined\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport yaml from 'js-yaml'\n\nexport interface ProjectMarker {\n enabled: boolean\n workflow_template?: string\n min_lincoln_version?: string\n}\n\nexport interface WriteMarkerOptions {\n force?: boolean\n dryRun?: boolean\n}\n\nexport function readProjectMarker(projectRoot: string): ProjectMarker | undefined {\n const markerPath = path.join(projectRoot, '.lincoln.yaml')\n if (!fs.existsSync(markerPath)) {\n return undefined\n }\n try {\n const parsed = yaml.load(fs.readFileSync(markerPath, 'utf8')) as Record<string, unknown> | null | undefined\n if (!parsed || typeof parsed !== 'object') {\n return undefined\n }\n return {\n enabled: Boolean(parsed.enabled),\n workflow_template: typeof parsed.workflow_template === 'string' ? parsed.workflow_template : undefined,\n min_lincoln_version: typeof parsed.min_lincoln_version === 'string' ? parsed.min_lincoln_version : undefined\n }\n } catch {\n return undefined\n }\n}\n\nexport function writeProjectMarker(\n projectRoot: string,\n marker: ProjectMarker,\n opts: WriteMarkerOptions = {}\n): void {\n const markerPath = path.join(projectRoot, '.lincoln.yaml')\n if (fs.existsSync(markerPath) && !opts.force) {\n throw new Error(`.lincoln.yaml already exists at ${markerPath}; use --force to overwrite`)\n }\n const content = yaml.dump(marker, { sortKeys: false, lineWidth: -1 })\n if (!opts.dryRun) {\n fs.mkdirSync(projectRoot, { recursive: true })\n fs.writeFileSync(markerPath, content)\n }\n}\n","import { readLocalPackageVersion } from '../lib/packageInfo.js'\nimport { writeProjectMarker, readProjectMarker } from '../lib/marker.js'\n\nexport interface InitProjectOptions {\n force?: boolean\n dryRun?: boolean\n}\n\nexport function initProject(projectRoot: string, options: InitProjectOptions = {}): number {\n if (!options.force && readProjectMarker(projectRoot) !== undefined) {\n console.error(`Project already has a .lincoln.yaml. Use --force to overwrite.`)\n return 1\n }\n\n try {\n writeProjectMarker(\n projectRoot,\n {\n enabled: true,\n workflow_template: 'interview-to-knowledge',\n min_lincoln_version: readLocalPackageVersion() ?? '1.5.0'\n },\n { force: options.force, dryRun: options.dryRun }\n )\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to write .lincoln.yaml: ${message}`)\n return 1\n }\n\n if (options.dryRun) {\n console.log(`Dry run: would create ${projectRoot}/.lincoln.yaml`)\n } else {\n console.log(`Created ${projectRoot}/.lincoln.yaml`)\n }\n return 0\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport type { LincolnPaths } from '../lib/paths.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport { writeVersionMarker } from '../lib/versionMarker.js'\nimport { readLocalPackageVersion, resolvePayloadRoot } from '../lib/packageInfo.js'\nimport type { SyncReport } from '../lib/syncClaude.js'\nimport { syncClaudeCode } from '../lib/syncClaude.js'\nimport { installedHarnessIds } from '../lib/harnessDetect.js'\n\nexport interface InstallOptions {\n yes: boolean\n dryRun: boolean\n force: boolean\n harnesses: string[]\n noVenv: boolean\n}\n\nexport interface InstallDeps {\n paths: LincolnPaths\n payloadRoot: string\n syncClaude: (opts: {\n payloadRoot: string\n targetDir: string\n version: string\n dryRun: boolean\n }) => SyncReport\n}\n\nexport function createDefaultDeps(): InstallDeps {\n return {\n paths: resolveLincolnPaths(),\n payloadRoot: resolvePayloadRoot() || '',\n syncClaude: syncClaudeCode\n }\n}\n\nexport async function install(\n options: InstallOptions,\n deps: InstallDeps = createDefaultDeps()\n): Promise<number> {\n if (!options.dryRun && !options.yes) {\n console.error('This will install Lincoln globally. Run with --yes to proceed.')\n return 1\n }\n\n const version = readLocalPackageVersion()\n if (!version) {\n console.error('Could not determine Lincoln version')\n return 1\n }\n\n const harnesses =\n options.harnesses.length > 0 ? options.harnesses : installedHarnessIds(deps.paths.homeDir)\n\n if (harnesses.length === 0) {\n console.error('No agent harness detected. Install Claude Code, Codex, or OpenCode first.')\n return 1\n }\n\n const payloadRoot = deps.payloadRoot\n if (!payloadRoot || !fs.existsSync(payloadRoot)) {\n console.error(\n `Lincoln payload not found. Run \"npm install -g @sushanglewis/lincoln\" first.`\n )\n return 1\n }\n\n const versionDir = path.join(deps.paths.versionsDir, version)\n if (!options.dryRun) {\n fs.mkdirSync(versionDir, { recursive: true })\n fs.cpSync(payloadRoot, versionDir, { recursive: true, force: true })\n try {\n fs.rmSync(deps.paths.currentDir, { recursive: true, force: true })\n fs.symlinkSync(versionDir, deps.paths.currentDir)\n } catch {\n fs.rmSync(deps.paths.currentDir, { recursive: true, force: true })\n fs.cpSync(versionDir, deps.paths.currentDir, { recursive: true, force: true })\n }\n }\n\n const report = deps.syncClaude({\n payloadRoot: deps.paths.currentDir,\n targetDir: deps.paths.claudeDir,\n version,\n dryRun: options.dryRun\n })\n\n if (!options.dryRun && !options.noVenv) {\n const python = await resolvePythonForVenv()\n if (!python) {\n console.error(\n 'Python 3.10+ is required but was not found. Set LINCOLN_PYTHON to a compatible Python executable.'\n )\n return 1\n }\n await setupVenv(deps.paths, payloadRoot, python)\n }\n\n if (!options.dryRun) {\n writeVersionMarker(deps.paths, {\n version,\n installedAt: new Date().toISOString(),\n harnesses,\n managedFiles: report.written\n })\n }\n\n if (options.dryRun) {\n console.log(`Dry run: would install Lincoln ${version} for harnesses: ${harnesses.join(', ')}`)\n console.log(`Would write ${report.written.length} files`)\n } else {\n console.log(`Installed Lincoln ${version} for harnesses: ${harnesses.join(', ')}`)\n console.log(`Wrote ${report.written.length} files`)\n }\n\n return 0\n}\n\nfunction runCommand(command: string, args: string[]): Promise<number> {\n return new Promise((resolvePromise, rejectPromise) => {\n const child = spawn(command, args, { stdio: 'inherit' })\n child.on('close', (code) => resolvePromise(code ?? 1))\n child.on('error', (err) => rejectPromise(err))\n })\n}\n\nconst MIN_PYTHON_MAJOR = 3\nconst MIN_PYTHON_MINOR = 10\nconst DEFAULT_PYTHON_CANDIDATES = ['python3.12', 'python3.11', 'python3.10', 'python3']\n\nfunction parsePythonVersion(version: string): { major: number; minor: number } | undefined {\n const match = /(\\d+)\\.(\\d+)/.exec(version)\n if (!match) {\n return undefined\n }\n return { major: Number(match[1]), minor: Number(match[2]) }\n}\n\nasync function queryPythonVersion(command: string): Promise<string | undefined> {\n return new Promise((resolvePromise) => {\n const child = spawn(command, ['--version'], {\n stdio: ['ignore', 'pipe', 'ignore'],\n shell: process.platform === 'win32'\n })\n let stdout = ''\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString()\n })\n child.on('close', (code) => {\n const text = stdout.trim()\n resolvePromise(code === 0 && text.length > 0 ? text : undefined)\n })\n child.on('error', () => resolvePromise(undefined))\n })\n}\n\nexport async function resolvePythonForVenv(\n envOverride: string | undefined = process.env.LINCOLN_PYTHON,\n candidates: string[] = DEFAULT_PYTHON_CANDIDATES,\n queryVersion: (cmd: string) => Promise<string | undefined> = queryPythonVersion\n): Promise<string | undefined> {\n const list = envOverride ? [envOverride] : candidates\n for (const cmd of list) {\n const version = await queryVersion(cmd)\n if (!version) {\n continue\n }\n const parsed = parsePythonVersion(version)\n if (\n parsed &&\n parsed.major >= MIN_PYTHON_MAJOR &&\n (parsed.major > MIN_PYTHON_MAJOR || parsed.minor >= MIN_PYTHON_MINOR)\n ) {\n return cmd\n }\n }\n return undefined\n}\n\nasync function setupVenv(paths: LincolnPaths, payloadRoot: string, pythonCommand: string): Promise<void> {\n const pythonExe = path.join(\n paths.venvDir,\n process.platform === 'win32' ? 'Scripts' : 'bin',\n process.platform === 'win32' ? 'python.exe' : 'python'\n )\n\n if (!fs.existsSync(pythonExe)) {\n console.log('Creating Lincoln virtual environment...')\n await runCommand(pythonCommand, ['-m', 'venv', paths.venvDir])\n }\n\n const requirementsPath = path.join(payloadRoot, 'requirements.txt')\n if (fs.existsSync(requirementsPath)) {\n console.log('Installing Python dependencies...')\n const pipExe = path.join(\n paths.venvDir,\n process.platform === 'win32' ? 'Scripts' : 'bin',\n process.platform === 'win32' ? 'pip.exe' : 'pip'\n )\n await runCommand(pipExe, ['install', '-r', requirementsPath])\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport crypto from 'node:crypto'\nimport { mergeManagedBlock } from './claudeMdMerge.js'\n\nexport interface SyncOptions {\n payloadRoot: string\n targetDir: string\n version: string\n dryRun: boolean\n}\n\nexport interface SyncReport {\n written: string[]\n skipped: string[]\n preserved: string[]\n warnings: string[]\n settingsTouched?: string[]\n}\n\nconst COPY_SUBDIRS = [\n 'agents',\n 'skills',\n 'workflows',\n 'stages',\n 'schemas',\n 'templates',\n 'harnesses'\n]\n\nfunction sha256(filePath: string): string {\n const data = fs.readFileSync(filePath)\n return crypto.createHash('sha256').update(data).digest('hex')\n}\n\nfunction sameContent(a: string, b: string): boolean {\n return sha256(a) === sha256(b)\n}\n\nfunction deepMergeSettings(existing: unknown, incoming: unknown): unknown {\n if (Array.isArray(existing) && Array.isArray(incoming)) {\n return incoming\n }\n if (\n typeof existing === 'object' &&\n existing !== null &&\n typeof incoming === 'object' &&\n incoming !== null\n ) {\n const result: Record<string, unknown> = { ...existing }\n for (const [key, value] of Object.entries(incoming)) {\n if (key in result) {\n result[key] = deepMergeSettings(result[key], value)\n } else {\n result[key] = value\n }\n }\n return result\n }\n return incoming\n}\n\nexport function syncClaudeCode(opts: SyncOptions): SyncReport {\n const report: SyncReport = {\n written: [],\n skipped: [],\n preserved: [],\n warnings: [],\n settingsTouched: []\n }\n\n const payloadClaude = path.join(opts.payloadRoot, '.claude')\n if (!fs.existsSync(payloadClaude)) {\n report.warnings.push(`payload .claude directory not found: ${payloadClaude}`)\n return report\n }\n\n if (!opts.dryRun) {\n fs.mkdirSync(opts.targetDir, { recursive: true })\n }\n\n for (const subdir of COPY_SUBDIRS) {\n const srcDir = path.join(payloadClaude, subdir)\n if (!fs.existsSync(srcDir)) {\n continue\n }\n\n const destDir = path.join(opts.targetDir, subdir)\n if (!opts.dryRun) {\n fs.mkdirSync(destDir, { recursive: true })\n }\n\n for (const entry of walkSync(srcDir)) {\n const relativePath = path.relative(srcDir, entry)\n const srcFile = entry\n const destFile = path.join(destDir, relativePath)\n\n if (fs.existsSync(destFile) && sameContent(srcFile, destFile)) {\n report.skipped.push(path.join('.claude', subdir, relativePath))\n continue\n }\n\n if (!opts.dryRun) {\n fs.mkdirSync(path.dirname(destFile), { recursive: true })\n fs.copyFileSync(srcFile, destFile)\n }\n report.written.push(path.join('.claude', subdir, relativePath))\n }\n }\n\n // settings.json merge\n const payloadSettings = path.join(payloadClaude, 'settings.json')\n const targetSettings = path.join(opts.targetDir, 'settings.json')\n if (fs.existsSync(payloadSettings)) {\n const incoming = JSON.parse(fs.readFileSync(payloadSettings, 'utf8'))\n let merged = incoming\n if (fs.existsSync(targetSettings)) {\n const existing = JSON.parse(fs.readFileSync(targetSettings, 'utf8'))\n merged = deepMergeSettings(existing, incoming)\n }\n\n const wouldChange =\n !fs.existsSync(targetSettings) ||\n JSON.stringify(merged) !== JSON.stringify(JSON.parse(fs.readFileSync(targetSettings, 'utf8')))\n\n if (wouldChange) {\n if (!opts.dryRun) {\n fs.writeFileSync(targetSettings, JSON.stringify(merged, null, 2) + '\\n')\n }\n report.written.push('.claude/settings.json')\n report.settingsTouched = ['.claude/settings.json']\n } else {\n report.skipped.push('.claude/settings.json')\n }\n }\n\n // CLAUDE.md merge\n const payloadClaudeMd = path.join(opts.payloadRoot, 'CLAUDE.md')\n const targetClaudeMd = path.join(path.dirname(opts.targetDir), 'CLAUDE.md')\n if (fs.existsSync(payloadClaudeMd)) {\n const incomingBlock = fs.readFileSync(payloadClaudeMd, 'utf8')\n const existing = fs.existsSync(targetClaudeMd)\n ? fs.readFileSync(targetClaudeMd, 'utf8')\n : undefined\n const merged = mergeManagedBlock(existing, incomingBlock)\n\n if (merged !== existing) {\n if (!opts.dryRun) {\n fs.writeFileSync(targetClaudeMd, merged)\n }\n report.written.push('CLAUDE.md')\n } else {\n report.skipped.push('CLAUDE.md')\n }\n }\n\n return report\n}\n\nfunction* walkSync(dir: string): Generator<string> {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n yield* walkSync(fullPath)\n } else {\n yield fullPath\n }\n }\n}\n","const BEGIN = '<!-- lincoln:begin -->'\nconst END = '<!-- lincoln:end -->'\n\nexport function mergeManagedBlock(\n existing: string | undefined,\n block: string\n): string {\n const wrapped = `${BEGIN}\\n${block}\\n${END}`\n const text = existing ?? ''\n\n const beginIndex = text.indexOf(BEGIN)\n const endIndex = text.indexOf(END)\n\n if (beginIndex !== -1 && endIndex !== -1 && endIndex > beginIndex) {\n return (\n text.slice(0, beginIndex) +\n wrapped +\n text.slice(endIndex + END.length)\n )\n }\n\n if (text.trim().length === 0) {\n return wrapped\n }\n\n return `${text.trimEnd()}\\n\\n${wrapped}\\n`\n}\n\nexport function extractManagedBlock(existing: string): string | undefined {\n const beginIndex = existing.indexOf(BEGIN)\n const endIndex = existing.indexOf(END)\n if (beginIndex === -1 || endIndex === -1 || endIndex <= beginIndex) {\n return undefined\n }\n return existing\n .slice(beginIndex + BEGIN.length, endIndex)\n .replace(/^\\n+|\\n+$/g, '')\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\n\nexport type HarnessId = 'claude-code' | 'codex' | 'opencode'\n\nexport interface GlobalHarnessInfo {\n id: HarnessId\n installed: boolean\n configDir: string\n pluginManaged: boolean\n}\n\ninterface HarnessSpec {\n id: HarnessId\n configDirName: string\n pluginMarker?: string\n}\n\nconst HARNESS_SPECS: HarnessSpec[] = [\n {\n id: 'claude-code',\n configDirName: '.claude',\n pluginMarker: 'plugins/lincoln'\n },\n { id: 'codex', configDirName: '.codex' },\n { id: 'opencode', configDirName: '.opencode' }\n]\n\nexport function detectGlobalHarnesses(\n overrideHomeDir?: string\n): GlobalHarnessInfo[] {\n const homeDir = overrideHomeDir ?? os.homedir()\n\n return HARNESS_SPECS.map((spec) => {\n const configDir = path.join(homeDir, spec.configDirName)\n const installed = fs.existsSync(configDir)\n const pluginManaged = spec.pluginMarker\n ? fs.existsSync(path.join(configDir, spec.pluginMarker))\n : false\n\n return {\n id: spec.id,\n installed,\n configDir,\n pluginManaged\n }\n })\n}\n\nexport function installedHarnessIds(homeDir?: string): HarnessId[] {\n return detectGlobalHarnesses(homeDir)\n .filter((h) => h.installed)\n .map((h) => h.id)\n}\n","import { spawn } from 'node:child_process'\nimport type { LincolnPaths } from '../lib/paths.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport { readVersionMarker } from '../lib/versionMarker.js'\nimport { createRegistryClient } from '../lib/npmRegistry.js'\nimport { compareVersions } from '../lib/semver.js'\nimport { readLocalPackageVersion } from '../lib/packageInfo.js'\nimport { install } from './install.js'\nimport type { InstallOptions } from './install.js'\n\nconst PACKAGE_NAME = '@sushanglewis/lincoln'\n\nexport interface UpdateOptions {\n check: boolean\n dryRun: boolean\n yes: boolean\n}\n\nexport interface UpdateDeps {\n paths: LincolnPaths\n latestVersion: () => Promise<string>\n currentVersion: () => string | undefined\n npmInstallGlobal: (version: string) => Promise<number>\n runInstall: (options: InstallOptions) => Promise<number>\n}\n\nexport function createDefaultDeps(): UpdateDeps {\n const paths = resolveLincolnPaths()\n const registry = createRegistryClient()\n return {\n paths,\n latestVersion: () => registry.latestVersion(PACKAGE_NAME),\n currentVersion: () => readVersionMarker(paths)?.version ?? readLocalPackageVersion(),\n npmInstallGlobal: (version) => runNpmInstallGlobal(PACKAGE_NAME, version),\n runInstall: (options) => install(options)\n }\n}\n\nexport async function update(\n options: UpdateOptions,\n deps: Partial<UpdateDeps> = {}\n): Promise<number> {\n const resolved: UpdateDeps = { ...createDefaultDeps(), ...deps }\n\n let latest: string\n try {\n latest = await resolved.latestVersion()\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to query npm registry: ${message}`)\n return 1\n }\n\n const current = resolved.currentVersion()\n\n if (current !== undefined) {\n const comparison = compareVersions(current, latest)\n if (comparison !== undefined ? comparison > 0 : false) {\n console.log(\n `Lincoln ${current} is ahead of the latest release (${latest}); nothing to do.`\n )\n return 0\n }\n if (comparison !== undefined ? comparison === 0 : current === latest) {\n console.log(`Lincoln ${current} is already up to date.`)\n return 0\n }\n }\n\n const summary = `${current ?? 'unknown'} -> ${latest}`\n\n if (options.check) {\n console.log(`Lincoln update available: ${summary}`)\n return 0\n }\n\n if (options.dryRun) {\n console.log(`Dry run: would update Lincoln ${summary}`)\n return 0\n }\n\n if (!options.yes) {\n console.error(`Will update Lincoln ${summary}. Run with --yes to proceed.`)\n return 1\n }\n\n const installCode = await resolved.npmInstallGlobal(latest)\n if (installCode !== 0) {\n console.error(`npm install -g ${PACKAGE_NAME}@${latest} failed with exit code ${installCode}`)\n return 1\n }\n\n // NOTE: this runs the *current* process's install(), not the just-installed\n // new version's. Re-executing the freshly installed `lincoln` binary would\n // rely on PATH/npx resolution picking up the new shim, which is fragile\n // mid-upgrade. The tradeoff is that sync logic changes shipped in the new\n // version only take effect on the next command run.\n const syncCode = await resolved.runInstall(defaultInstallOptions())\n if (syncCode !== 0) {\n console.error(`lincoln install failed with exit code ${syncCode}`)\n return 1\n }\n\n console.log(`Updated Lincoln to ${latest}`)\n return 0\n}\n\nfunction defaultInstallOptions(): InstallOptions {\n return { yes: true, dryRun: false, force: false, harnesses: [], noVenv: true }\n}\n\nfunction runNpmInstallGlobal(packageName: string, version: string): Promise<number> {\n return new Promise((resolvePromise) => {\n const child = spawn('npm', ['install', '-g', `${packageName}@${version}`], {\n stdio: 'inherit',\n shell: process.platform === 'win32'\n })\n child.on('close', (code) => resolvePromise(code ?? 1))\n child.on('error', () => resolvePromise(1))\n })\n}\n","const DEFAULT_REGISTRY_URL = 'https://registry.npmjs.org'\nconst FETCH_TIMEOUT_MS = 15_000\n\nexport interface NpmDistTags {\n latest?: string\n [tag: string]: string | undefined\n}\n\nexport interface NpmVersionMetadata {\n version?: string\n dist?: {\n tarball?: string\n }\n}\n\nexport interface NpmPackument {\n name?: string\n 'dist-tags'?: NpmDistTags\n versions?: Record<string, NpmVersionMetadata>\n}\n\nexport interface RegistryClient {\n latestVersion(packageName: string): Promise<string>\n versions(packageName: string): Promise<string[]>\n resolveVersion(packageName: string, spec: string): Promise<string>\n}\n\nexport function createRegistryClient(\n registryUrl: string = DEFAULT_REGISTRY_URL,\n fetchImpl: typeof fetch = fetch\n): RegistryClient {\n const baseUrl = registryUrl.replace(/\\/+$/, '')\n\n async function fetchPackument(packageName: string): Promise<NpmPackument> {\n const url = `${baseUrl}/${encodePackageName(packageName)}`\n const response = await fetchImpl(url, {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS)\n })\n if (!response.ok) {\n throw new Error(\n `npm registry returned ${response.status} ${response.statusText} for ${packageName}`\n )\n }\n return (await response.json()) as NpmPackument\n }\n\n return {\n async latestVersion(packageName: string): Promise<string> {\n const packument = await fetchPackument(packageName)\n const latest = packument['dist-tags']?.latest\n if (!latest) {\n throw new Error(`npm registry has no latest dist-tag for ${packageName}`)\n }\n return latest\n },\n\n async versions(packageName: string): Promise<string[]> {\n const packument = await fetchPackument(packageName)\n return Object.keys(packument.versions ?? {})\n },\n\n async resolveVersion(packageName: string, spec: string): Promise<string> {\n const packument = await fetchPackument(packageName)\n const tagTarget = packument['dist-tags']?.[spec]\n if (tagTarget) {\n return tagTarget\n }\n if (packument.versions && spec in packument.versions) {\n return spec\n }\n throw new Error(`Version not found for ${packageName}: ${spec}`)\n }\n }\n}\n\nfunction encodePackageName(packageName: string): string {\n if (packageName.startsWith('@')) {\n const slash = packageName.indexOf('/')\n if (slash === -1) {\n return encodeURIComponent(packageName)\n }\n const scope = packageName.slice(1, slash)\n const name = packageName.slice(slash + 1)\n return `@${encodeURIComponent(scope)}%2F${encodeURIComponent(name)}`\n }\n return encodeURIComponent(packageName)\n}\n","const SEMVER_CORE = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/\nconst NUMERIC_IDENTIFIER = /^\\d+$/\n\ninterface ParsedVersion {\n major: number\n minor: number\n patch: number\n prerelease: string[]\n}\n\n/**\n * Compares two semver strings per semver.org precedence rules (build metadata\n * ignored). Returns a negative number when a < b, 0 when equal, a positive\n * number when a > b, or undefined when either input is not a parseable semver.\n */\nexport function compareVersions(a: string, b: string): number | undefined {\n const pa = parseVersion(a)\n const pb = parseVersion(b)\n if (!pa || !pb) {\n return undefined\n }\n if (pa.major !== pb.major) return pa.major - pb.major\n if (pa.minor !== pb.minor) return pa.minor - pb.minor\n if (pa.patch !== pb.patch) return pa.patch - pb.patch\n return comparePrerelease(pa.prerelease, pb.prerelease)\n}\n\nfunction parseVersion(version: string): ParsedVersion | undefined {\n const match = SEMVER_CORE.exec(version.trim())\n if (!match) {\n return undefined\n }\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ? match[4].split('.') : []\n }\n}\n\nfunction comparePrerelease(a: string[], b: string[]): number {\n if (a.length === 0 && b.length === 0) return 0\n // A version without a prerelease has higher precedence than one with it.\n if (a.length === 0) return 1\n if (b.length === 0) return -1\n const shared = Math.min(a.length, b.length)\n for (let i = 0; i < shared; i++) {\n const x = a[i]\n const y = b[i]\n if (x === y) continue\n const xNumeric = NUMERIC_IDENTIFIER.test(x)\n const yNumeric = NUMERIC_IDENTIFIER.test(y)\n if (xNumeric && yNumeric) return Number(x) - Number(y)\n // Numeric identifiers have lower precedence than alphanumeric ones.\n if (xNumeric) return -1\n if (yNumeric) return 1\n return x < y ? -1 : 1\n }\n return a.length - b.length\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport type { LincolnPaths } from '../lib/paths.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport { createRegistryClient } from '../lib/npmRegistry.js'\nimport { install } from './install.js'\nimport type { InstallOptions } from './install.js'\n\nconst PACKAGE_NAME = '@sushanglewis/lincoln'\nconst SEMVER_REGEX = /^v?\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/\nconst STRICT_SEMVER_REGEX = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/\nconst DIST_TAG_REGEX = /^[a-zA-Z][a-zA-Z0-9._-]*$/\n\nexport interface UseOptions {\n dryRun: boolean\n yes: boolean\n}\n\nexport interface UseDeps {\n paths: LincolnPaths\n resolveVersion: (spec: string) => Promise<string>\n ensureVersionAvailable: (version: string) => Promise<void>\n npmGlobalRoot: () => Promise<string | undefined>\n runInstall: (options: InstallOptions) => Promise<number>\n}\n\nexport function createDefaultDeps(): UseDeps {\n const paths = resolveLincolnPaths()\n const registry = createRegistryClient()\n return {\n paths,\n resolveVersion: async (spec) => {\n // Exact (optionally v-prefixed) versions resolve locally without a\n // registry round-trip, so switching between installed versions works\n // offline. Dist-tags (latest, next, ...) need the registry.\n const normalized = spec.startsWith('v') ? spec.slice(1) : spec\n if (STRICT_SEMVER_REGEX.test(normalized)) {\n return normalized\n }\n return registry.resolveVersion(PACKAGE_NAME, spec)\n },\n ensureVersionAvailable: async (version) => {\n const code = await runNpmInstallGlobal(PACKAGE_NAME, version)\n if (code !== 0) {\n throw new Error(`npm install -g ${PACKAGE_NAME}@${version} exited with ${code}`)\n }\n },\n npmGlobalRoot: () => runNpmRootGlobal(),\n runInstall: (options) => install(options)\n }\n}\n\nexport async function use(\n spec: string,\n options: UseOptions,\n deps: Partial<UseDeps> = {}\n): Promise<number> {\n if (!isValidVersion(spec)) {\n console.error(`Invalid version: ${spec}`)\n return 1\n }\n\n const resolved: UseDeps = { ...createDefaultDeps(), ...deps }\n\n let version: string\n try {\n version = await resolved.resolveVersion(spec)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to resolve version ${spec}: ${message}`)\n return 1\n }\n\n const versionDir = path.join(resolved.paths.versionsDir, version)\n const alreadyInstalled = fs.existsSync(versionDir)\n\n if (options.dryRun) {\n if (alreadyInstalled) {\n console.log(`Dry run: would switch ${resolved.paths.currentDir} to ${versionDir}`)\n } else {\n console.log(\n `Dry run: would install ${PACKAGE_NAME}@${version} globally, then switch ${resolved.paths.currentDir} to ${versionDir}`\n )\n }\n return 0\n }\n\n if (!options.yes) {\n console.error(`Will switch Lincoln to ${version}. Run with --yes to proceed.`)\n return 1\n }\n\n if (!alreadyInstalled) {\n try {\n await resolved.ensureVersionAvailable(version)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to install ${PACKAGE_NAME}@${version}: ${message}`)\n return 1\n }\n\n if (!fs.existsSync(versionDir)) {\n // `npm install -g` places the package in the npm global root; it does\n // not populate ~/.lincoln/versions. Copy the payload over so the\n // version switch below has a real directory to point at.\n try {\n await copyVersionFromNpmGlobal(resolved, versionDir)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to populate ${versionDir}: ${message}`)\n return 1\n }\n }\n\n if (!fs.existsSync(versionDir)) {\n console.error(\n `Provisioning ${PACKAGE_NAME}@${version} did not produce ${versionDir}; cannot switch versions.`\n )\n return 1\n }\n }\n\n try {\n switchCurrentLink(resolved.paths, versionDir)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to switch ${resolved.paths.currentDir}: ${message}`)\n return 1\n }\n\n const syncCode = await resolved.runInstall(defaultInstallOptions())\n if (syncCode !== 0) {\n console.error(`lincoln install failed with exit code ${syncCode}`)\n return 1\n }\n\n // The trailing install re-points ~/.lincoln/current at the *running* CLI's\n // own version dir (Task 9 behavior, pending the install payload fix).\n // Re-assert the requested version so the switch actually sticks.\n try {\n switchCurrentLink(resolved.paths, versionDir)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to switch ${resolved.paths.currentDir}: ${message}`)\n return 1\n }\n\n console.log(`Switched Lincoln to ${version}`)\n return 0\n}\n\nfunction isValidVersion(version: string): boolean {\n return SEMVER_REGEX.test(version) || DIST_TAG_REGEX.test(version)\n}\n\nasync function copyVersionFromNpmGlobal(deps: UseDeps, versionDir: string): Promise<void> {\n const globalRoot = await deps.npmGlobalRoot()\n if (!globalRoot) {\n return\n }\n const packageRoot = path.join(globalRoot, ...PACKAGE_NAME.split('/'))\n if (!fs.existsSync(packageRoot)) {\n return\n }\n fs.mkdirSync(path.dirname(versionDir), { recursive: true })\n fs.cpSync(packageRoot, versionDir, { recursive: true })\n}\n\nfunction switchCurrentLink(paths: LincolnPaths, versionDir: string): void {\n fs.mkdirSync(paths.lincolnHome, { recursive: true })\n try {\n fs.rmSync(paths.currentDir, { recursive: true, force: true })\n fs.symlinkSync(versionDir, paths.currentDir)\n } catch {\n fs.rmSync(paths.currentDir, { recursive: true, force: true })\n fs.cpSync(versionDir, paths.currentDir, { recursive: true, force: true })\n }\n}\n\nfunction defaultInstallOptions(): InstallOptions {\n return { yes: true, dryRun: false, force: false, harnesses: [], noVenv: true }\n}\n\nfunction runNpmInstallGlobal(packageName: string, version: string): Promise<number> {\n return new Promise((resolvePromise) => {\n const child = spawn('npm', ['install', '-g', `${packageName}@${version}`], {\n stdio: 'inherit',\n shell: process.platform === 'win32'\n })\n child.on('close', (code) => resolvePromise(code ?? 1))\n child.on('error', () => resolvePromise(1))\n })\n}\n\nfunction runNpmRootGlobal(): Promise<string | undefined> {\n return new Promise((resolvePromise) => {\n const child = spawn('npm', ['root', '-g'], {\n stdio: ['ignore', 'pipe', 'ignore'],\n shell: process.platform === 'win32'\n })\n let stdout = ''\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString()\n })\n child.on('close', (code) => {\n const root = stdout.trim()\n resolvePromise(code === 0 && root.length > 0 ? root : undefined)\n })\n child.on('error', () => resolvePromise(undefined))\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { listVendoredFrameworkFiles } from '../lib/projectFiles.js'\nimport { readLocalPackageVersion } from '../lib/packageInfo.js'\nimport { writeProjectMarker } from '../lib/marker.js'\nimport { resolveLincolnPaths } from '../lib/paths.js'\nimport type { LincolnPaths } from '../lib/paths.js'\n\nexport interface MigrateProjectOptions {\n dryRun?: boolean\n yes?: boolean\n force?: boolean\n}\n\nexport interface MigrateProjectDeps {\n paths: LincolnPaths\n listVendoredFrameworkFiles: (\n payloadRoot: string,\n projectRoot: string\n ) => ReturnType<typeof listVendoredFrameworkFiles>\n writeProjectMarker: typeof writeProjectMarker\n}\n\nexport function createDefaultDeps(): MigrateProjectDeps {\n return {\n paths: resolveLincolnPaths(),\n listVendoredFrameworkFiles,\n writeProjectMarker\n }\n}\n\nexport async function migrateProject(\n projectRoot: string,\n options: MigrateProjectOptions = {},\n deps: MigrateProjectDeps = createDefaultDeps()\n): Promise<number> {\n const payloadRoot = deps.paths.currentDir\n if (!fs.existsSync(payloadRoot)) {\n console.error(`Lincoln payload not found at ${payloadRoot}. Run \"lincoln install\" first.`)\n return 1\n }\n\n const absoluteProjectRoot = path.resolve(projectRoot)\n const report = deps.listVendoredFrameworkFiles(payloadRoot, absoluteProjectRoot)\n\n if (options.dryRun) {\n console.log(`Dry run: would migrate ${absoluteProjectRoot}`)\n if (report.removable.length > 0) {\n console.log('Would remove unmodified framework files:')\n for (const f of report.removable) console.log(` - ${f}`)\n }\n if (report.modified.length > 0) {\n console.log('Would preserve modified framework files:')\n for (const f of report.modified) console.log(` - ${f}`)\n }\n if (report.preserved.length > 0) {\n console.log('Would preserve project-local files:')\n for (const f of report.preserved) console.log(` - ${f}`)\n }\n console.log('Would create .lincoln.yaml')\n return 0\n }\n\n if (!options.yes) {\n console.error('This will remove vendored framework files. Run with --yes to proceed.')\n return 1\n }\n\n for (const file of report.removable) {\n const filePath = path.join(absoluteProjectRoot, file)\n try {\n fs.rmSync(filePath)\n // Remove empty parent directories up to project root\n let dir = path.dirname(filePath)\n while (dir !== absoluteProjectRoot && fs.existsSync(dir)) {\n const entries = fs.readdirSync(dir)\n if (entries.length === 0) {\n fs.rmdirSync(dir)\n dir = path.dirname(dir)\n } else {\n break\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to remove ${file}: ${message}`)\n return 1\n }\n }\n\n if (report.modified.length > 0) {\n console.log('Preserved modified framework files:')\n for (const f of report.modified) console.log(` - ${f}`)\n }\n\n if (report.preserved.length > 0) {\n console.log('Preserved project-local files:')\n for (const f of report.preserved) console.log(` - ${f}`)\n }\n\n try {\n deps.writeProjectMarker(\n absoluteProjectRoot,\n {\n enabled: true,\n workflow_template: 'interview-to-knowledge',\n min_lincoln_version: readLocalPackageVersion() ?? '1.5.0'\n },\n { force: options.force }\n )\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.error(`Failed to write .lincoln.yaml: ${message}`)\n return 1\n }\n\n console.log(`Migrated project at ${absoluteProjectRoot}`)\n console.log(`Removed ${report.removable.length} unmodified framework files`)\n return 0\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport crypto from 'node:crypto'\n\n// Mirrors scripts/package-lincoln-plugin.py and scripts/sync-framework-package.mjs\nexport const FRAMEWORK_ALLOWLIST_DIRS = ['.claude', '.claude-plugin', 'scripts', 'tools']\nexport const FRAMEWORK_ALLOWLIST_FILES = [\n 'README.md',\n 'README.en.md',\n 'USAGE.md',\n 'CONTRIBUTING.md',\n 'CLAUDE.md',\n 'LICENSE',\n 'RELEASE.md',\n '.version-bump.json',\n 'requirements.txt',\n 'SKILL.md'\n]\nexport const FRAMEWORK_DENYLIST_NAMES = new Set([\n '.git',\n '.context',\n '.venv',\n 'venv',\n 'dist',\n 'oss',\n '.pytest_cache',\n '__pycache__',\n '.DS_Store',\n 'node_modules'\n])\nexport const FRAMEWORK_DENYLIST_PREFIXES = ['issue-']\nexport const FRAMEWORK_SKIP_PATHS = new Set([\n '.claude/templates/issue-package',\n 'tools/lincoln-installer/dist',\n 'tools/lincoln-installer/node_modules',\n 'tools/lincoln-installer/coverage'\n])\n\nfunction sha256(filePath: string): string {\n return crypto.createHash('sha256').update(fs.readFileSync(filePath)).digest('hex')\n}\n\nfunction isDenied(relativePath: string): boolean {\n const parts = relativePath.split(path.sep)\n for (const part of parts) {\n if (FRAMEWORK_DENYLIST_NAMES.has(part)) return true\n for (const prefix of FRAMEWORK_DENYLIST_PREFIXES) {\n if (part.startsWith(prefix)) return true\n }\n }\n for (const skip of FRAMEWORK_SKIP_PATHS) {\n if (relativePath === skip || relativePath.startsWith(skip + path.sep)) return true\n }\n return false\n}\n\nfunction isAllowlisted(relativePath: string): boolean {\n if (FRAMEWORK_ALLOWLIST_FILES.includes(relativePath)) return true\n for (const dir of FRAMEWORK_ALLOWLIST_DIRS) {\n if (relativePath === dir || relativePath.startsWith(dir + path.sep)) return true\n }\n return false\n}\n\nfunction isPreservedDir(relativePath: string): boolean {\n const normalized = relativePath.replace(/\\\\/g, '/')\n if (normalized === '.context' || normalized.startsWith('.context/')) return true\n const parts = normalized.split('/')\n for (const part of parts) {\n if (part.startsWith('issue-')) return true\n }\n return false\n}\n\nfunction isPreserved(relativePath: string): boolean {\n const normalized = relativePath.replace(/\\\\/g, '/')\n if (normalized === '.github/openspec-config.yml') return true\n return isPreservedDir(relativePath)\n}\n\nexport interface VendoredFileReport {\n removable: string[]\n modified: string[]\n preserved: string[]\n}\n\nexport function listVendoredFrameworkFiles(\n payloadRoot: string,\n projectRoot: string\n): VendoredFileReport {\n const report: VendoredFileReport = { removable: [], modified: [], preserved: [] }\n\n function walk(dir: string): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n const relativePath = path.relative(projectRoot, fullPath)\n\n if (entry.isDirectory()) {\n if (isPreservedDir(relativePath)) {\n walk(fullPath)\n } else if (!isDenied(relativePath)) {\n walk(fullPath)\n }\n continue\n }\n\n if (isPreserved(relativePath)) {\n report.preserved.push(relativePath)\n continue\n }\n\n if (isDenied(relativePath)) continue\n if (!isAllowlisted(relativePath)) continue\n\n const payloadFile = path.join(payloadRoot, relativePath)\n if (!fs.existsSync(payloadFile)) {\n report.modified.push(relativePath)\n continue\n }\n\n if (sha256(fullPath) === sha256(payloadFile)) {\n report.removable.push(relativePath)\n } else {\n report.modified.push(relativePath)\n }\n }\n }\n\n if (fs.existsSync(projectRoot)) {\n walk(projectRoot)\n }\n\n return report\n}\n","import { spawn, type ChildProcess } from 'node:child_process'\nimport { EventEmitter } from 'node:events'\n\nexport interface RecordDeps {\n spawn: (\n command: string,\n args: readonly string[],\n options: { stdio: 'inherit' }\n ) => ChildProcess\n}\n\nexport function createDefaultDeps(): RecordDeps {\n return { spawn }\n}\n\nexport function record(args: string[], deps: RecordDeps = createDefaultDeps()): Promise<number> {\n return new Promise((resolve) => {\n const child = deps.spawn('lincoln-record', args, { stdio: 'inherit' })\n child.on('error', (err: Error) => {\n console.error(`Failed to start lincoln-record: ${err.message}`)\n resolve(1)\n })\n child.on('close', (code: number | null) => {\n resolve(code ?? 0)\n })\n })\n}\n\nexport function makeFakeChildProcess(exitCode: number | null = 0): ChildProcess {\n const emitter = new EventEmitter() as ChildProcess\n process.nextTick(() => {\n emitter.emit('close', exitCode)\n })\n return emitter\n}\n\nexport function makeFailingFakeChildProcess(message: string): ChildProcess {\n const emitter = new EventEmitter() as ChildProcess\n process.nextTick(() => {\n emitter.emit('error', new Error(message))\n })\n return emitter\n}\n"],"mappings":"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","names":["fs","path","fileURLToPath","fs","path","path","path","fs","fs","path","fs","path","fs","path","spawn","fs","path","fs","path","fs","path","os","createDefaultDeps","fs","path","spawn","MIN_PYTHON_MAJOR","MIN_PYTHON_MINOR","parsePythonVersion","spawn","createDefaultDeps","spawn","fs","path","spawn","PACKAGE_NAME","createDefaultDeps","runNpmInstallGlobal","path","fs","defaultInstallOptions","spawn","fs","path","fs","path","crypto","sha256","createDefaultDeps","fs","path","spawn","createDefaultDeps","path","fs","fileURLToPath"]}
@@ -9,7 +9,7 @@
9
9
  {
10
10
  "name": "lincoln",
11
11
  "description": "AI-Native product R&D collaboration system for Conductor + Claude Code. Orchestrates stages, gates, artifacts, skills, and roles across product, design, and engineering into a repeatable workflow from recordings to GitHub Issues to Obsidian knowledge base.",
12
- "version": "1.5.2",
12
+ "version": "1.5.4",
13
13
  "author": {
14
14
  "name": "Lincoln contributors"
15
15
  },
@@ -28,5 +28,5 @@
28
28
  ]
29
29
  }
30
30
  ],
31
- "version": "1.5.2"
31
+ "version": "1.5.4"
32
32
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lincoln",
3
- "version": "1.5.2",
3
+ "version": "1.5.4",
4
4
  "description": "AI-Native product R&D collaboration system for Conductor + Claude Code + OpenSpec + GitHub + Obsidian",
5
5
  "author": {
6
6
  "name": "Lincoln contributors"
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.5.2",
2
+ "version": "1.5.4",
3
3
  "manifests": [
4
4
  {
5
5
  "path": ".claude-plugin/plugin.json",
@@ -27,14 +27,70 @@ Open the repo and tell the Agent what you want in plain language. Lincoln will r
27
27
 
28
28
  ## Installation
29
29
 
30
- Lincoln is now distributed as a global npm plugin:
30
+ ### Prerequisites
31
+
32
+ - Node.js ≥ 20
33
+ - Python 3.10+ (`lincoln install` will auto-detect `python3.12 / 3.11 / 3.10` and create a virtual environment)
34
+ - At least one agent harness installed: `Claude Code`, `Codex`, or `OpenCode`
35
+
36
+ ### Install Lincoln
37
+
38
+ ```bash
39
+ npm install -g @sushanglewis/lincoln
40
+ lincoln install --yes
41
+ ```
42
+
43
+ > **Note**: `npm install -g` only installs the CLI and bundled framework payload; **you must run `lincoln install`** to sync hooks, agents, skills, scripts, and the full runtime framework to `~/.claude/`, `~/.codex/`, and `~/.opencode/`.
44
+
45
+ If you previously installed the legacy `lincoln-install` package, uninstall it first (its bin names conflict with the new package):
31
46
 
32
47
  ```bash
48
+ npm uninstall -g lincoln-install
33
49
  npm install -g @sushanglewis/lincoln
34
- lincoln install
50
+ lincoln install --yes
51
+ ```
52
+
53
+ To force a reinstall:
54
+
55
+ ```bash
56
+ npm install -g @sushanglewis/lincoln --force
57
+ lincoln install --yes
58
+ ```
59
+
60
+ ### Verify the installation
61
+
62
+ ```bash
63
+ lincoln --version
64
+ lincoln doctor --json
35
65
  ```
36
66
 
37
- `lincoln install` syncs the runtime framework to `~/.claude/`, `~/.codex/`, and `~/.opencode/`. Projects only need a `.lincoln.yaml` marker to opt in (empty directories won't activate Lincoln).
67
+ `lincoln doctor --json` checks Node, Python, PyYAML, npm, the global marker, payload hooks, venv, and project marker.
68
+
69
+ ### Enable Lincoln in a project
70
+
71
+ Lincoln hooks are **off by default** in directories without a marker. In your project root run:
72
+
73
+ ```bash
74
+ cd your-project
75
+ lincoln init-project
76
+ ```
77
+
78
+ This creates a `.lincoln.yaml` marker file. After that, opening Claude Code in this directory will load the `/lc-*` commands.
79
+
80
+ ### Update Lincoln
81
+
82
+ ```bash
83
+ lincoln update
84
+ ```
85
+
86
+ ### Migrate from the old vendored model
87
+
88
+ If your project previously committed the Lincoln framework source directly into the repo:
89
+
90
+ ```bash
91
+ lincoln migrate-project --dry-run # preview files to remove
92
+ lincoln migrate-project --yes # confirm migration
93
+ ```
38
94
 
39
95
  The legacy `npx lincoln-install` / `npx lincoln-update` wrappers are still present but deprecated; migrate to the global CLI.
40
96
 
@@ -27,14 +27,70 @@ Lincoln 是一个贯穿 **IDE、Agent Harness、代码托管、知识管理、
27
27
 
28
28
  ## 安装
29
29
 
30
- Lincoln 现在以全局 npm 插件的形式分发:
30
+ ### 前置条件
31
+
32
+ - Node.js ≥ 20
33
+ - Python 3.10+(`lincoln install` 会自动探测 `python3.12 / 3.11 / 3.10` 并创建虚拟环境)
34
+ - 已安装至少一个 agent harness:`Claude Code`、`Codex` 或 `OpenCode`
35
+
36
+ ### 安装 Lincoln
37
+
38
+ ```bash
39
+ npm install -g @sushanglewis/lincoln
40
+ lincoln install --yes
41
+ ```
42
+
43
+ > **注意**:`npm install -g` 只是把 CLI 和框架 payload 安装到 npm 全局目录;**必须执行 `lincoln install`**,才会把 hooks、agents、skills、scripts 等完整运行时体系同步到 `~/.claude/`、`~/.codex/`、`~/.opencode/`。
44
+
45
+ 如果之前安装过旧版 `lincoln-install`,需要先卸载(旧包与新版 bin 名冲突):
31
46
 
32
47
  ```bash
48
+ npm uninstall -g lincoln-install
33
49
  npm install -g @sushanglewis/lincoln
34
- lincoln install
50
+ lincoln install --yes
51
+ ```
52
+
53
+ 若要强制重装,可加上 `--force`:
54
+
55
+ ```bash
56
+ npm install -g @sushanglewis/lincoln --force
57
+ lincoln install --yes
58
+ ```
59
+
60
+ ### 验证安装
61
+
62
+ ```bash
63
+ lincoln --version
64
+ lincoln doctor --json
35
65
  ```
36
66
 
37
- `lincoln install` 会把运行时框架同步到 `~/.claude/`、`~/.codex/`、`~/.opencode/`。项目侧只需一个 `.lincoln.yaml` 标记即可选择性激活(空目录不会触发 Lincoln)。
67
+ `lincoln doctor --json` 会输出 Node、Python、PyYAML、npm、全局 marker、payload hooks、venv、项目 marker 等检查项。
68
+
69
+ ### 在项目中启用
70
+
71
+ Lincoln hooks 默认**不会**在空目录激活。进入项目后执行:
72
+
73
+ ```bash
74
+ cd your-project
75
+ lincoln init-project
76
+ ```
77
+
78
+ 这会在项目根目录创建 `.lincoln.yaml` 标记文件,之后在该目录打开 Claude Code 即可使用 `/lc-*` 命令。
79
+
80
+ ### 更新 Lincoln
81
+
82
+ ```bash
83
+ lincoln update
84
+ ```
85
+
86
+ ### 从旧版 vendored 模式迁移
87
+
88
+ 如果你的项目之前是把 Lincoln 框架源码直接提交到仓库里的,可以用:
89
+
90
+ ```bash
91
+ lincoln migrate-project --dry-run # 先看看会删哪些文件
92
+ lincoln migrate-project --yes # 确认迁移
93
+ ```
38
94
 
39
95
  旧版 `npx lincoln-install` / `npx lincoln-update` 仍保留但已弃用,建议迁移到全局 CLI。
40
96
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.5.2",
3
- "generatedAt": "2026-08-06T03:07:34.713Z",
2
+ "version": "1.5.4",
3
+ "generatedAt": "2026-08-06T03:47:12.007Z",
4
4
  "files": [
5
5
  {
6
6
  "path": ".claude-plugin/hooks.json",
@@ -8,11 +8,11 @@
8
8
  },
9
9
  {
10
10
  "path": ".claude-plugin/marketplace.json",
11
- "sha256": "e3d11b11dc35a096064cff03df0fdef5dec12f75387d44634a22b02c160affab"
11
+ "sha256": "3416511abe2f0fe63b7108a99b4386974ed5a1d9165f54cc21ceefa215ddb5a9"
12
12
  },
13
13
  {
14
14
  "path": ".claude-plugin/plugin.json",
15
- "sha256": "78a1c6fbc6c3cee62560e64edd8fe4d10beab2b080de4bd8e4f02743933e79f9"
15
+ "sha256": "a95de6491156662f078aeb4b9b3b46e222fcb0b6ef3a6a14f280e23b1c5ad1af"
16
16
  },
17
17
  {
18
18
  "path": ".claude/agents/_contract.md",
@@ -488,7 +488,7 @@
488
488
  },
489
489
  {
490
490
  "path": ".version-bump.json",
491
- "sha256": "06f7b8cf78e406b87124b1a3c38c917517c4e6b1a37c5d812c485a64ef2c53e6"
491
+ "sha256": "e17ad70c1076bcef5ed4401960fd8bbf31eb0c4d6f023efff6a1d1fe91e3f7e6"
492
492
  },
493
493
  {
494
494
  "path": "CLAUDE.md",
@@ -504,11 +504,11 @@
504
504
  },
505
505
  {
506
506
  "path": "README.en.md",
507
- "sha256": "bfcfcb255a2289a0018a13c19f3fef7e52e6c48bbe6b755bba90deb33de1d459"
507
+ "sha256": "dc352b91f0b134a7119062a716b34a84ea0a9f62777f5c7f6dbbca8a8ea3cb99"
508
508
  },
509
509
  {
510
510
  "path": "README.md",
511
- "sha256": "f26116a64f7c057aaacbddc56ce3e874cc337c20ec7e158fce39ef87dfb80bb4"
511
+ "sha256": "5f6a04b52cd7ed056511857b99ef9cb58b9da6001fa14d6a958247167025c172"
512
512
  },
513
513
  {
514
514
  "path": "RELEASE.md",
@@ -696,7 +696,7 @@
696
696
  },
697
697
  {
698
698
  "path": "tools/lincoln-installer/package.json",
699
- "sha256": "8b069894f9cde9a2f724810d92e8f14ba1e8e909d39c1fd40a971731b3d79ece"
699
+ "sha256": "634627c4dc491da303e21601d284258926a7663a628530fbce2bbe0eef136a4d"
700
700
  },
701
701
  {
702
702
  "path": "tools/lincoln-installer/src/cli.tsx",
@@ -988,11 +988,11 @@
988
988
  },
989
989
  {
990
990
  "path": "tools/lincoln/package-lock.json",
991
- "sha256": "dbbd918a124e77006738ed4830d026eecf4304cfd4b8937159b53d304ef16743"
991
+ "sha256": "895bff7b343cc24e4152ca57942b3219e0e59a65416297619d03f4acd2a945c1"
992
992
  },
993
993
  {
994
994
  "path": "tools/lincoln/package.json",
995
- "sha256": "d23a2993785b5eabccbb3d11341f935e60dfdc28d3dc6435f8479417e9f204a5"
995
+ "sha256": "4bb2ca50fd059d0885989d619b852c3473be4ad55d508013158fb6701c30b171"
996
996
  },
997
997
  {
998
998
  "path": "tools/lincoln/src/cli.tsx",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sushanglewis/lincoln",
3
- "version": "1.5.2",
3
+ "version": "1.5.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sushanglewis/lincoln",
9
- "version": "1.5.2",
9
+ "version": "1.5.4",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "ink": "^5.2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sushanglewis/lincoln-recorder",
3
- "version": "1.5.2",
3
+ "version": "1.5.4",
4
4
  "description": "Cross-tool terminal UI for recording Lincoln interviews",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lincoln-install",
3
- "version": "1.5.2",
3
+ "version": "1.5.4",
4
4
  "description": "Terminal TUI installer for the Lincoln AI-Native R&D workflow system",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sushanglewis/lincoln",
3
- "version": "1.5.2",
3
+ "version": "1.5.4",
4
4
  "description": "Global Lincoln agent harness plugin CLI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",