kiro-kit 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +23 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -707,25 +707,40 @@ async function multiPickPrompt(items) {
|
|
|
707
707
|
process5.stdin.resume();
|
|
708
708
|
process5.stdin.setEncoding("utf-8");
|
|
709
709
|
let escBuffer = "";
|
|
710
|
+
const handleArrow = (seq) => {
|
|
711
|
+
if (seq === "\x1B[A" || seq === "\x1BOA") {
|
|
712
|
+
cursor = (cursor - 1 + items.length) % items.length;
|
|
713
|
+
render();
|
|
714
|
+
return true;
|
|
715
|
+
}
|
|
716
|
+
if (seq === "\x1B[B" || seq === "\x1BOB") {
|
|
717
|
+
cursor = (cursor + 1) % items.length;
|
|
718
|
+
render();
|
|
719
|
+
return true;
|
|
720
|
+
}
|
|
721
|
+
return false;
|
|
722
|
+
};
|
|
710
723
|
const onData = (key) => {
|
|
711
724
|
if (escBuffer.length > 0) {
|
|
712
725
|
escBuffer += key;
|
|
713
726
|
if (escBuffer.length >= 3) {
|
|
714
727
|
const seq = escBuffer;
|
|
715
728
|
escBuffer = "";
|
|
716
|
-
|
|
717
|
-
cursor = (cursor - 1 + items.length) % items.length;
|
|
718
|
-
render();
|
|
719
|
-
} else if (seq === "\x1B[B" || seq === "\x1BOB") {
|
|
720
|
-
cursor = (cursor + 1) % items.length;
|
|
721
|
-
render();
|
|
722
|
-
}
|
|
723
|
-
return;
|
|
729
|
+
handleArrow(seq);
|
|
724
730
|
}
|
|
725
731
|
return;
|
|
726
732
|
}
|
|
733
|
+
if (key.length >= 3 && key.startsWith("\x1B")) {
|
|
734
|
+
handleArrow(key);
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
727
737
|
if (key === "\x1B") {
|
|
728
738
|
escBuffer = key;
|
|
739
|
+
setTimeout(() => {
|
|
740
|
+
if (escBuffer.length > 0) {
|
|
741
|
+
escBuffer = "";
|
|
742
|
+
}
|
|
743
|
+
}, 50);
|
|
729
744
|
return;
|
|
730
745
|
}
|
|
731
746
|
if (key === "") {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/core/PresetLoader.ts","../src/core/ManifestParser.ts","../src/core/errors.ts","../src/core/ConflictResolver.ts","../src/core/BackupManager.ts","../src/core/TrackingStore.ts","../src/utils/logger.ts","../src/utils/color.ts","../src/core/MetadataWriter.ts","../src/core/StatuslineSelector.ts","../src/core/merge/mergeMCP.ts","../src/core/merge/mergeSettings.ts","../src/prompts/DiffViewer.ts","../src/utils/fs-safe.ts","../src/utils/paths.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/info.ts","../src/commands/update.ts","../src/commands/restore.ts","../src/commands/doctor.ts","../src/commands/telemetry.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { createRequire } from 'node:module';\r\nimport process from 'node:process';\r\nimport { Command } from 'commander';\r\nimport { registerInitCommand } from './commands/init.js';\r\nimport { registerAddCommand } from './commands/add.js';\r\nimport { registerListCommand } from './commands/list.js';\r\nimport { registerInfoCommand } from './commands/info.js';\r\nimport { registerUpdateCommand } from './commands/update.js';\r\nimport { registerRestoreCommand } from './commands/restore.js';\r\nimport { registerDoctorCommand } from './commands/doctor.js';\r\nimport { registerTelemetryCommand } from './commands/telemetry.js';\r\nimport { setVerbose, setQuiet } from './utils/logger.js';\r\n\r\n// Node version check\r\nconst major = parseInt(process.versions.node.split('.')[0], 10);\r\nif (major < 18) {\r\n process.stderr.write(\r\n '[KK001] kiro-kit requires Node.js >= 18. ' +\r\n `Current version: ${process.version}. ` +\r\n 'Please upgrade Node.js.\\n',\r\n );\r\n process.exit(1);\r\n}\r\n\r\nconst require = createRequire(import.meta.url);\r\nconst pkg = require('../package.json') as { version: string };\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('kiro-kit')\r\n .description('CLI tool for bootstrapping engineer-grade Kiro IDE workspaces.')\r\n .version(pkg.version, '-v, --version');\r\n\r\n// Global flags\r\nprogram.option('--verbose', 'Enable verbose output');\r\nprogram.option('--quiet', 'Suppress non-essential output');\r\nprogram.option('--no-color', 'Disable colored output');\r\n\r\n// Wire all commands\r\nregisterInitCommand(program);\r\nregisterAddCommand(program);\r\nregisterListCommand(program);\r\nregisterInfoCommand(program);\r\nregisterUpdateCommand(program);\r\nregisterRestoreCommand(program);\r\nregisterDoctorCommand(program);\r\nregisterTelemetryCommand(program);\r\n\r\n// Apply global flags before command execution\r\nprogram.hook('preAction', (thisCommand) => {\r\n const opts = thisCommand.opts();\r\n if (opts['verbose']) setVerbose(true);\r\n if (opts['quiet']) setQuiet(true);\r\n});\r\n\r\nprogram.parse(process.argv);\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport readline from 'node:readline';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load, loadAll, listAvailable } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport * as MetadataWriter from '../core/MetadataWriter.js';\r\nimport * as StatuslineSelector from '../core/StatuslineSelector.js';\r\nimport { mergeMCP, type MCPConfig } from '../core/merge/mergeMCP.js';\r\nimport { mergeSettings, type SettingsConfig } from '../core/merge/mergeSettings.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface InitOptions {\r\n yes?: boolean;\r\n preset?: string[];\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n color?: boolean;\r\n}\r\n\r\n// Handle SIGINT at process level for exit 130\r\nfunction setupSigintHandler(): void {\r\n process.on('SIGINT', () => {\r\n process.exit(130);\r\n });\r\n}\r\n\r\n/**\r\n * Interactive multi-pick prompt using readline.\r\n * Space to toggle, 'a' to toggle all, Enter to confirm.\r\n */\r\nasync function multiPickPrompt(\r\n items: Array<{ name: string; description: string }>,\r\n): Promise<string[]> {\r\n const selected = new Set<number>();\r\n let cursor = 0;\r\n\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n terminal: false,\r\n });\r\n\r\n // Enable raw mode for keypress detection\r\n if (!process.stdin.isTTY) {\r\n // Non-interactive: return empty\r\n rl.close();\r\n return [];\r\n }\r\n\r\n return new Promise<string[]>((resolve, reject) => {\r\n let rendered = false;\r\n\r\n const render = (): void => {\r\n // Move cursor up to overwrite previous render\r\n if (rendered) {\r\n process.stdout.write(`\\x1B[${items.length + 1}A`);\r\n }\r\n rendered = true;\r\n // Clear line + write header\r\n process.stdout.write(\r\n '\\x1B[2K' +\r\n color.bold('? Select presets to install:') +\r\n color.dim(' (Space to select, <a> toggle all, Enter to confirm)') +\r\n '\\n',\r\n );\r\n for (let i = 0; i < items.length; i++) {\r\n const marker = cursor === i ? color.cyan('>') : ' ';\r\n const check = selected.has(i)\r\n ? color.green('[x]')\r\n : '[ ]';\r\n const name = color.bold(items[i].name.padEnd(12));\r\n const desc = color.dim(`- ${items[i].description}`);\r\n // Clear line before writing to prevent ghost text\r\n process.stdout.write(`\\x1B[2K ${marker} ${check} ${name} ${desc}\\n`);\r\n }\r\n };\r\n\r\n // Initial render (no need for blank lines — first render writes directly)\r\n render();\r\n\r\n process.stdin.setRawMode(true);\r\n process.stdin.resume();\r\n process.stdin.setEncoding('utf-8');\r\n\r\n let escBuffer = '';\r\n\r\n const onData = (key: string): void => {\r\n // Handle multi-byte escape sequences (arrow keys on Windows)\r\n if (escBuffer.length > 0) {\r\n escBuffer += key;\r\n if (escBuffer.length >= 3) {\r\n const seq = escBuffer;\r\n escBuffer = '';\r\n if (seq === '\\x1B[A' || seq === '\\x1BOA') {\r\n cursor = (cursor - 1 + items.length) % items.length;\r\n render();\r\n } else if (seq === '\\x1B[B' || seq === '\\x1BOB') {\r\n cursor = (cursor + 1) % items.length;\r\n render();\r\n }\r\n return;\r\n }\r\n return;\r\n }\r\n\r\n // Start of escape sequence\r\n if (key === '\\x1B') {\r\n escBuffer = key;\r\n return;\r\n }\r\n\r\n // Ctrl+C / SIGINT\r\n if (key === '\\x03') {\r\n process.stdin.setRawMode(false);\r\n process.stdin.removeListener('data', onData);\r\n process.stdin.pause();\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n return;\r\n }\r\n\r\n // Enter\r\n if (key === '\\r' || key === '\\n') {\r\n process.stdin.setRawMode(false);\r\n process.stdin.removeListener('data', onData);\r\n process.stdin.pause();\r\n rl.close();\r\n const result = [...selected].map((i) => items[i].name);\r\n resolve(result);\r\n return;\r\n }\r\n\r\n // Space - toggle current\r\n if (key === ' ') {\r\n if (selected.has(cursor)) {\r\n selected.delete(cursor);\r\n } else {\r\n selected.add(cursor);\r\n }\r\n render();\r\n return;\r\n }\r\n\r\n // 'a' - toggle all\r\n if (key === 'a' || key === 'A') {\r\n if (selected.size === items.length) {\r\n selected.clear();\r\n } else {\r\n for (let i = 0; i < items.length; i++) selected.add(i);\r\n }\r\n render();\r\n return;\r\n }\r\n\r\n // Arrow up / k\r\n if (key === 'k') {\r\n cursor = (cursor - 1 + items.length) % items.length;\r\n render();\r\n return;\r\n }\r\n\r\n // Arrow down / j\r\n if (key === 'j') {\r\n cursor = (cursor + 1) % items.length;\r\n render();\r\n return;\r\n }\r\n };\r\n\r\n process.stdin.on('data', onData);\r\n });\r\n}\r\n\r\n/**\r\n * Confirmation prompt: \"About to write X files. Continue? (Y/n)\"\r\n */\r\nasync function confirmPrompt(message: string): Promise<boolean> {\r\n if (!process.stdin.isTTY) return true;\r\n\r\n return new Promise((resolve, reject) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n rl.question(`${color.bold('?')} ${message} `, (answer) => {\r\n rl.close();\r\n const normalized = answer.trim().toLowerCase();\r\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\r\n });\r\n\r\n rl.on('SIGINT', () => {\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Interactive 4-option conflict prompt.\r\n */\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} already exists with different content.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace existing file (backup will be saved)\\n` +\r\n ` skip - Keep existing file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace this and all remaining conflicting files\\n`,\r\n );\r\n\r\n return new Promise((resolve, reject) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip'); // default to skip on unrecognized input\r\n });\r\n\r\n rl.on('SIGINT', () => {\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n });\r\n });\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\n/**\r\n * Register the init command on the given program.\r\n */\r\nexport function registerInitCommand(program: Command): void {\r\n program\r\n .command('init')\r\n .description('Initialize workspace with selected presets')\r\n .option('-y, --yes', 'Skip confirmation, accept defaults')\r\n .option('--preset <name>', 'Specify preset (repeatable)', collectPreset, [])\r\n .option('--force', 'Overwrite all files (with backup)')\r\n .option('--skip-existing', 'Skip all existing files')\r\n .option('--no-color', 'Disable ANSI colors')\r\n .action(async (opts: InitOptions) => {\r\n setupSigintHandler();\r\n try {\r\n await runInit(opts);\r\n } catch (err: unknown) {\r\n if (err instanceof Error && err.message === 'SIGINT') {\r\n process.exit(130);\r\n }\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction collectPreset(value: string, previous: string[]): string[] {\r\n return [...previous, value];\r\n}\r\n\r\nasync function runInit(opts: InitOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n const available = listAvailable();\r\n\r\n // 1. Determine selected presets\r\n let selectedNames: string[];\r\n\r\n if (opts.preset && opts.preset.length > 0) {\r\n // Validate preset names\r\n for (const name of opts.preset) {\r\n if (!available.includes(name)) {\r\n logger.error(\r\n `Preset \"${name}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n }\r\n selectedNames = opts.preset;\r\n } else {\r\n // Interactive multi-pick\r\n const items = available.map((name) => {\r\n try {\r\n const preset = load(name);\r\n return { name, description: preset.manifest.description };\r\n } catch {\r\n return { name, description: '' };\r\n }\r\n });\r\n\r\n selectedNames = await multiPickPrompt(items);\r\n }\r\n\r\n // Empty selection -> exit 0\r\n if (selectedNames.length === 0) {\r\n logger.info('No presets selected. Exiting.');\r\n process.exit(0);\r\n }\r\n\r\n // 2. Load selected presets\r\n const presets = loadAll(selectedNames);\r\n\r\n // 3. Plan operations - count total files\r\n let totalFiles = 0;\r\n for (const preset of presets) {\r\n totalFiles += preset.manifest.files.length;\r\n }\r\n\r\n // 4. Show summary and ask for confirmation\r\n if (!opts.yes) {\r\n const confirmed = await confirmPrompt(\r\n `About to write ${totalFiles} files into .kiro/ and workspace. Continue? (Y/n)`,\r\n );\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // 5. Determine conflict mode\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n\r\n // Track written files for tracking store\r\n const allTrackedFiles: TrackingStore.TrackedFile[] = [];\r\n let filesWritten = 0;\r\n let filesSkipped = 0;\r\n\r\n // 6. Process each preset\r\n for (const preset of presets) {\r\n const { manifest, dir: presetDir } = preset;\r\n\r\n // Separate files by type for special handling\r\n const regularFiles = manifest.files.filter(\r\n (f) => !['mcp', 'settings', 'statusline'].includes(f.type),\r\n );\r\n const mcpFiles = manifest.files.filter((f) => f.type === 'mcp');\r\n const settingsFiles = manifest.files.filter((f) => f.type === 'settings');\r\n const statuslineFiles = manifest.files.filter((f) => f.type === 'statusline');\r\n\r\n // Process regular files\r\n for (const fileEntry of regularFiles) {\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n // Safety check\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) {\r\n logger.warn(`Skipping unsafe path: ${fileEntry.target}`);\r\n filesSkipped++;\r\n continue;\r\n }\r\n\r\n if (!fs.existsSync(sourcePath)) {\r\n logger.debug(`Source file missing: ${sourcePath}`);\r\n continue;\r\n }\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n // Set executable bit if needed\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'SKIP':\r\n filesSkipped++;\r\n break;\r\n case 'NO_OP':\r\n // File already identical\r\n break;\r\n }\r\n\r\n // Track the file regardless of action (for tracking store)\r\n if (action !== 'SKIP') {\r\n allTrackedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: manifest.name,\r\n contentHash: sha256(sourceContent),\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process statusline files via StatuslineSelector\r\n if (statuslineFiles.length > 0) {\r\n const installed = StatuslineSelector.install(presetDir, workspaceRoot);\r\n filesWritten += installed.length;\r\n for (const f of installed) {\r\n allTrackedFiles.push({\r\n target: f,\r\n sourcePreset: manifest.name,\r\n contentHash: '',\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process MCP merge\r\n if (mcpFiles.length > 0 && manifest.mcpServers) {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n let existingMcp: MCPConfig | null = null;\r\n if (fs.existsSync(mcpPath)) {\r\n try {\r\n existingMcp = JSON.parse(fs.readFileSync(mcpPath, 'utf-8')) as MCPConfig;\r\n } catch {\r\n existingMcp = null;\r\n }\r\n }\r\n const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);\r\n fs.mkdirSync(path.dirname(mcpPath), { recursive: true });\r\n atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Process settings merge\r\n if (settingsFiles.length > 0) {\r\n const settingsPath = path.join(workspaceRoot, '.kiro/settings.json');\r\n let existingSettings: SettingsConfig | null = null;\r\n if (fs.existsSync(settingsPath)) {\r\n try {\r\n existingSettings = JSON.parse(\r\n fs.readFileSync(settingsPath, 'utf-8'),\r\n ) as SettingsConfig;\r\n } catch {\r\n existingSettings = null;\r\n }\r\n }\r\n\r\n // Read preset settings\r\n const presetSettingsPath = path.join(presetDir, 'settings.json');\r\n if (fs.existsSync(presetSettingsPath)) {\r\n const presetSettings = JSON.parse(\r\n fs.readFileSync(presetSettingsPath, 'utf-8'),\r\n ) as SettingsConfig;\r\n\r\n // Resolve statusline command per platform\r\n const resolvedSettings = StatuslineSelector.resolveSettingsCommand(\r\n presetSettings as Record<string, unknown>,\r\n ) as SettingsConfig;\r\n\r\n const merged = mergeSettings(existingSettings, resolvedSettings);\r\n fs.mkdirSync(path.dirname(settingsPath), { recursive: true });\r\n atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n }\r\n\r\n // Also write .mcp.json.example if present in preset (as regular file)\r\n const mcpExampleSource = path.join(presetDir, '.mcp.json.example');\r\n if (fs.existsSync(mcpExampleSource)) {\r\n const mcpExampleTarget = path.join(workspaceRoot, '.kiro/.mcp.json.example');\r\n if (!fs.existsSync(mcpExampleTarget)) {\r\n fs.mkdirSync(path.dirname(mcpExampleTarget), { recursive: true });\r\n fs.copyFileSync(mcpExampleSource, mcpExampleTarget);\r\n }\r\n }\r\n }\r\n\r\n // 7. Write metadata.json\r\n const kitVersion = getKitVersion();\r\n const presetMetas = presets.map((p) => ({\r\n name: p.manifest.name,\r\n version: p.manifest.version,\r\n }));\r\n\r\n const existingMeta = MetadataWriter.read(workspaceRoot);\r\n const metadata = existingMeta\r\n ? MetadataWriter.mergePresets(existingMeta, presetMetas)\r\n : MetadataWriter.compose({\r\n kitVersion,\r\n repository: 'https://github.com/ihatesea69/kiro-kit.git',\r\n presets: presetMetas,\r\n });\r\n\r\n MetadataWriter.write(workspaceRoot, metadata);\r\n\r\n // 8. Write tracking file LAST\r\n let trackingData = TrackingStore.read(workspaceRoot) ?? TrackingStore.createInitial(kitVersion);\r\n\r\n for (const preset of presets) {\r\n const presetFiles = allTrackedFiles.filter(\r\n (f) => f.sourcePreset === preset.manifest.name,\r\n );\r\n const trackedPreset: TrackingStore.TrackedPreset = {\r\n name: preset.manifest.name,\r\n version: preset.manifest.version,\r\n installedAt: new Date().toISOString(),\r\n files: presetFiles,\r\n };\r\n trackingData = TrackingStore.upsertPreset(trackingData, trackedPreset);\r\n }\r\n\r\n trackingData.kitVersion = kitVersion;\r\n TrackingStore.write(workspaceRoot, trackingData);\r\n\r\n // 9. Print summary\r\n logger.success(\r\n `Done! ${filesWritten} files written, ${filesSkipped} skipped.`,\r\n );\r\n logger.info(\r\n `Presets installed: ${selectedNames.join(', ')}`,\r\n );\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { fileURLToPath } from 'node:url';\r\nimport { parse, validate, type Manifest } from './ManifestParser.js';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\n\r\nfunction getPresetsDir(): string {\r\n // Try a couple of candidate locations so the loader works whether the\r\n // bundle places presets next to index.js or one level up.\r\n const candidates = [\r\n path.resolve(__dirname, 'presets'), // dist/presets (current bundle)\r\n path.resolve(__dirname, '../presets'), // legacy layout\r\n path.resolve(__dirname, '../../../../presets'), // dev/source checkout\r\n ];\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate;\r\n }\r\n throw new KKError(\r\n ErrorCodes.PRESET_NOT_FOUND,\r\n 'Cannot locate presets directory.',\r\n 'Ensure kiro-kit is installed correctly.',\r\n );\r\n}\r\n\r\nexport interface LoadedPreset {\r\n manifest: Manifest;\r\n dir: string;\r\n}\r\n\r\n/**\r\n * Load a single preset by name.\r\n */\r\nexport function load(name: string): LoadedPreset {\r\n const presetsDir = getPresetsDir();\r\n const presetDir = path.join(presetsDir, name);\r\n\r\n if (!fs.existsSync(presetDir)) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_NOT_FOUND,\r\n `Preset \"${name}\" not found.`,\r\n `Available presets: ${listAvailable().join(', ')}`,\r\n );\r\n }\r\n\r\n const manifestPath = path.join(presetDir, 'manifest.json');\r\n if (!fs.existsSync(manifestPath)) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_LOAD_FAILED,\r\n `Preset \"${name}\" is missing manifest.json.`,\r\n );\r\n }\r\n\r\n const raw = fs.readFileSync(manifestPath, 'utf-8');\r\n const result = parse(raw);\r\n\r\n if (!result.ok) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_LOAD_FAILED,\r\n `Preset \"${name}\" manifest parse error: ${result.error.message}`,\r\n );\r\n }\r\n\r\n return { manifest: result.value, dir: presetDir };\r\n}\r\n\r\n/**\r\n * Load multiple presets by name.\r\n */\r\nexport function loadAll(names: string[]): LoadedPreset[] {\r\n return names.map((n) => load(n));\r\n}\r\n\r\n/**\r\n * List all available preset names from the presets directory.\r\n */\r\nexport function listAvailable(): string[] {\r\n const presetsDir = getPresetsDir();\r\n try {\r\n return fs\r\n .readdirSync(presetsDir, { withFileTypes: true })\r\n .filter((d) => d.isDirectory())\r\n .filter((d) => !d.name.startsWith('_'))\r\n .filter((d) =>\r\n fs.existsSync(path.join(presetsDir, d.name, 'manifest.json')),\r\n )\r\n .map((d) => d.name);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n","import { z } from 'zod';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst ArtifactTypeSchema = z.enum([\r\n 'steering', 'hook', 'mcp', 'skill', 'agent',\r\n 'command', 'workflow', 'statusline', 'metadata',\r\n 'settings', 'env', 'spec', 'docs', 'doc', 'config', 'other',\r\n]);\r\n\r\nconst PresetNameSchema = z.enum([\r\n 'frontend', 'backend', 'fullstack', 'mobile', 'devops', 'data-ai',\r\n]);\r\n\r\nconst FileEntrySchema = z.object({\r\n source: z.string().min(1),\r\n target: z.string().min(1),\r\n type: ArtifactTypeSchema,\r\n executable: z.boolean().optional(),\r\n});\r\n\r\nconst MCPServerDefSchema = z.object({\r\n command: z.string().min(1),\r\n args: z.array(z.string()).optional(),\r\n env: z.record(z.string()).optional(),\r\n});\r\n\r\nconst HookEntrySchema = z.union([\r\n z.object({\r\n matcher: z.string().optional(),\r\n command: z.string().min(1),\r\n }),\r\n z.string().min(1),\r\n]);\r\n\r\nconst ManifestSchema = z.object({\r\n name: z.string().min(1),\r\n version: z.string().min(1),\r\n description: z.string().min(1),\r\n category: PresetNameSchema,\r\n files: z.array(FileEntrySchema).min(1),\r\n dependencies: z.array(PresetNameSchema).optional(),\r\n mcpServers: z.record(MCPServerDefSchema).optional(),\r\n hooks: z.object({\r\n PreToolUse: z.array(HookEntrySchema).optional(),\r\n PostToolUse: z.array(HookEntrySchema).optional(),\r\n agentStop: z.array(HookEntrySchema).optional(),\r\n fileEdited: z.array(HookEntrySchema).optional(),\r\n }).optional(),\r\n tags: z.array(z.string()).optional(),\r\n minCounts: z.object({\r\n agents: z.number().int().nonnegative().optional(),\r\n skills: z.number().int().nonnegative().optional(),\r\n commands: z.number().int().nonnegative().optional(),\r\n hooks: z.number().int().nonnegative().optional(),\r\n workflows: z.number().int().nonnegative().optional(),\r\n }).optional(),\r\n});\r\n\r\nexport type Manifest = z.infer<typeof ManifestSchema>;\r\nexport type FileEntry = z.infer<typeof FileEntrySchema>;\r\nexport type ArtifactType = z.infer<typeof ArtifactTypeSchema>;\r\n\r\nexport interface ManifestError {\r\n code: string;\r\n message: string;\r\n}\r\n\r\nexport type Result<T, E> =\r\n | { ok: true; value: T }\r\n | { ok: false; error: E };\r\n\r\n/**\r\n * Parse raw JSON string into a validated Manifest.\r\n */\r\nexport function parse(json: string): Result<Manifest, ManifestError> {\r\n let raw: unknown;\r\n try {\r\n raw = JSON.parse(json);\r\n } catch {\r\n return {\r\n ok: false,\r\n error: {\r\n code: ErrorCodes.MANIFEST_INVALID,\r\n message: 'Manifest is not valid JSON.',\r\n },\r\n };\r\n }\r\n\r\n const result = ManifestSchema.safeParse(raw);\r\n if (!result.success) {\r\n const issues = result.error.issues\r\n .map((i) => `${i.path.join('.')}: ${i.message}`)\r\n .join('; ');\r\n return {\r\n ok: false,\r\n error: {\r\n code: ErrorCodes.MANIFEST_MISSING_FIELD,\r\n message: `Manifest schema validation failed: ${issues}`,\r\n },\r\n };\r\n }\r\n\r\n return { ok: true, value: result.data };\r\n}\r\n\r\n/**\r\n * Pretty-print a Manifest object as JSON (2-space indent).\r\n */\r\nexport function print(m: Manifest): string {\r\n return JSON.stringify(m, null, 2);\r\n}\r\n\r\n/**\r\n * Validate a parsed Manifest against its preset directory on disk.\r\n * Checks:\r\n * 1. File completeness: every file in manifest.files exists at presetDir/source\r\n * 2. No-orphan: every file in presetDir (except manifest.json, README.md) is declared in manifest.files\r\n */\r\nexport function validate(m: Manifest, presetDir: string): Result<void, ManifestError[]> {\r\n const errors: ManifestError[] = [];\r\n\r\n // 1. File completeness check\r\n for (const entry of m.files) {\r\n const fullPath = path.join(presetDir, entry.source);\r\n if (!fs.existsSync(fullPath)) {\r\n errors.push({\r\n code: ErrorCodes.MANIFEST_INCOMPLETE,\r\n message: `File declared in manifest not found on disk: ${entry.source}`,\r\n });\r\n }\r\n }\r\n\r\n // 2. No-orphan check\r\n const declaredSources = new Set(m.files.map((f) => f.source));\r\n const ignoredFiles = new Set(['manifest.json', 'README.md']);\r\n\r\n const walkDir = (dir: string, prefix: string): void => {\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n for (const entry of entries) {\r\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n walkDir(path.join(dir, entry.name), rel);\r\n } else if (entry.isFile()) {\r\n if (!ignoredFiles.has(rel) && !declaredSources.has(rel)) {\r\n errors.push({\r\n code: ErrorCodes.MANIFEST_ORPHAN_FILE,\r\n message: `File on disk not declared in manifest (orphan): ${rel}`,\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n walkDir(presetDir, '');\r\n\r\n if (errors.length > 0) {\r\n return { ok: false, error: errors };\r\n }\r\n return { ok: true, value: undefined };\r\n}\r\n","/**\r\n * Structured error class for kiro-kit CLI.\r\n * Each error carries a unique code (KK001-KK091), a human-readable message,\r\n * and an optional suggestion for resolution.\r\n */\r\nexport class KKError extends Error {\r\n readonly code: string;\r\n readonly suggestion?: string;\r\n\r\n constructor(code: string, message: string, suggestion?: string) {\r\n super(message);\r\n this.name = 'KKError';\r\n this.code = code;\r\n this.suggestion = suggestion;\r\n Object.setPrototypeOf(this, KKError.prototype);\r\n }\r\n\r\n format(): string {\r\n let output = `[${this.code}] ${this.message}`;\r\n if (this.suggestion) {\r\n output += `\\n Suggestion: ${this.suggestion}`;\r\n }\r\n return output;\r\n }\r\n}\r\n\r\n// Common error codes\r\nexport const ErrorCodes = {\r\n NODE_VERSION: 'KK001',\r\n MANIFEST_INVALID: 'KK010',\r\n MANIFEST_MISSING_FIELD: 'KK011',\r\n MANIFEST_ORPHAN_FILE: 'KK012',\r\n MANIFEST_INCOMPLETE: 'KK013',\r\n PRESET_NOT_FOUND: 'KK020',\r\n PRESET_LOAD_FAILED: 'KK021',\r\n CONFLICT_UNRESOLVED: 'KK030',\r\n TRACKING_CORRUPT: 'KK040',\r\n TRACKING_WRITE_FAILED: 'KK041',\r\n BACKUP_NOT_FOUND: 'KK050',\r\n BACKUP_WRITE_FAILED: 'KK051',\r\n MCP_MERGE_CONFLICT: 'KK060',\r\n MCP_INVALID_JSON: 'KK061',\r\n SETTINGS_MERGE_WARN: 'KK070',\r\n FRONTMATTER_INVALID: 'KK080',\r\n FRONTMATTER_MISSING: 'KK081',\r\n DOCTOR_FAIL: 'KK090',\r\n DOCTOR_WARN: 'KK091',\r\n} as const;\r\n","import fs from 'node:fs';\r\nimport crypto from 'node:crypto';\r\n\r\nexport type ConflictAction =\r\n | 'WRITE_NEW'\r\n | 'OVERWRITE_WITH_BACKUP'\r\n | 'SKIP'\r\n | 'NO_OP';\r\n\r\nexport type ConflictMode = 'interactive' | 'force' | 'skip-existing';\r\n\r\nexport interface SessionState {\r\n overwriteAll: boolean;\r\n}\r\n\r\nexport interface ConflictPromptFn {\r\n (target: string): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'>;\r\n}\r\n\r\nexport interface DiffViewerFn {\r\n (target: string, sourceContent: Buffer): void;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\n/**\r\n * Resolve file conflict based on mode and session state.\r\n */\r\nexport async function resolve(opts: {\r\n target: string;\r\n sourceContent: Buffer;\r\n mode: ConflictMode;\r\n sessionState: SessionState;\r\n prompt?: ConflictPromptFn;\r\n showDiff?: DiffViewerFn;\r\n}): Promise<ConflictAction> {\r\n const { target, sourceContent, mode, sessionState, prompt, showDiff } = opts;\r\n\r\n // File doesn't exist yet - write new\r\n if (!fs.existsSync(target)) {\r\n return 'WRITE_NEW';\r\n }\r\n\r\n // Compare hashes\r\n const currentContent = fs.readFileSync(target);\r\n const currentHash = sha256(currentContent);\r\n const newHash = sha256(sourceContent);\r\n\r\n // Byte-equal - no operation needed\r\n if (currentHash === newHash) {\r\n return 'NO_OP';\r\n }\r\n\r\n // Force mode - always overwrite with backup\r\n if (mode === 'force') {\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n\r\n // Skip-existing mode - never overwrite\r\n if (mode === 'skip-existing') {\r\n return 'SKIP';\r\n }\r\n\r\n // Session overwrite-all already set\r\n if (sessionState.overwriteAll) {\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n\r\n // Interactive mode - prompt user\r\n if (!prompt) {\r\n // No prompt function provided, default to skip\r\n return 'SKIP';\r\n }\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const choice = await prompt(target);\r\n\r\n switch (choice) {\r\n case 'view-diff':\r\n if (showDiff) {\r\n showDiff(target, sourceContent);\r\n }\r\n continue;\r\n case 'overwrite':\r\n return 'OVERWRITE_WITH_BACKUP';\r\n case 'skip':\r\n return 'SKIP';\r\n case 'overwrite-all':\r\n sessionState.overwriteAll = true;\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst BACKUP_DIR = '.kiro/.backup';\r\n\r\n/**\r\n * Generate timestamp string: YYYYMMDD-HHmmss-mmm\r\n */\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\n/**\r\n * Backup a file to .kiro/.backup/<timestamp>/<relative-path>\r\n */\r\nexport function backup(\r\n workspaceRoot: string,\r\n target: string,\r\n timestamp?: string,\r\n): string {\r\n const ts = timestamp ?? generateTimestamp();\r\n const relPath = path.relative(workspaceRoot, target);\r\n const backupPath = path.join(workspaceRoot, BACKUP_DIR, ts, relPath);\r\n const backupDir = path.dirname(backupPath);\r\n\r\n fs.mkdirSync(backupDir, { recursive: true });\r\n fs.copyFileSync(target, backupPath);\r\n\r\n return ts;\r\n}\r\n\r\n/**\r\n * Restore files from a backup timestamp.\r\n * If no timestamp given, uses the most recent backup.\r\n * Returns list of restored file paths.\r\n */\r\nexport function restore(\r\n workspaceRoot: string,\r\n timestamp?: string,\r\n): string[] {\r\n const ts = timestamp ?? getLatestTimestamp(workspaceRoot);\r\n\r\n if (!ts) {\r\n throw new KKError(\r\n ErrorCodes.BACKUP_NOT_FOUND,\r\n 'No backup found.',\r\n 'Run kiro-kit init or add first to create backups.',\r\n );\r\n }\r\n\r\n const backupRoot = path.join(workspaceRoot, BACKUP_DIR, ts);\r\n if (!fs.existsSync(backupRoot)) {\r\n throw new KKError(\r\n ErrorCodes.BACKUP_NOT_FOUND,\r\n `Backup timestamp \"${ts}\" not found.`,\r\n `Available: ${listTimestamps(workspaceRoot).join(', ') || 'none'}`,\r\n );\r\n }\r\n\r\n const restored: string[] = [];\r\n\r\n const walkAndRestore = (dir: string, relPrefix: string): void => {\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n const rel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n walkAndRestore(fullPath, rel);\r\n } else if (entry.isFile()) {\r\n const targetPath = path.join(workspaceRoot, rel);\r\n const targetDir = path.dirname(targetPath);\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n fs.copyFileSync(fullPath, targetPath);\r\n restored.push(rel);\r\n }\r\n }\r\n };\r\n\r\n walkAndRestore(backupRoot, '');\r\n return restored;\r\n}\r\n\r\n/**\r\n * List all backup timestamps sorted newest first.\r\n */\r\nexport function listTimestamps(workspaceRoot: string): string[] {\r\n const backupBase = path.join(workspaceRoot, BACKUP_DIR);\r\n if (!fs.existsSync(backupBase)) return [];\r\n\r\n try {\r\n return fs\r\n .readdirSync(backupBase, { withFileTypes: true })\r\n .filter((d) => d.isDirectory())\r\n .map((d) => d.name)\r\n .sort()\r\n .reverse();\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nfunction getLatestTimestamp(workspaceRoot: string): string | undefined {\r\n const timestamps = listTimestamps(workspaceRoot);\r\n return timestamps[0];\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\nimport { logger } from '../utils/logger.js';\r\n\r\nconst TRACKING_FILE = '.kiro/.kiro-kit.json';\r\n\r\nexport interface TrackedFile {\r\n target: string;\r\n sourcePreset: string;\r\n contentHash: string;\r\n installedAt: string;\r\n}\r\n\r\nexport interface TrackedPreset {\r\n name: string;\r\n version: string;\r\n installedAt: string;\r\n updatedAt?: string;\r\n files: TrackedFile[];\r\n}\r\n\r\nexport interface TrackingData {\r\n kitVersion: string;\r\n installedAt: string;\r\n updatedAt?: string;\r\n presets: TrackedPreset[];\r\n}\r\n\r\nfunction getTrackingPath(workspaceRoot: string): string {\r\n return path.join(workspaceRoot, TRACKING_FILE);\r\n}\r\n\r\n/**\r\n * Read tracking data from .kiro/.kiro-kit.json.\r\n * Returns null if file doesn't exist.\r\n * Throws KK040 if file is corrupt.\r\n */\r\nexport function read(workspaceRoot: string): TrackingData | null {\r\n const filePath = getTrackingPath(workspaceRoot);\r\n\r\n if (!fs.existsSync(filePath)) {\r\n return null;\r\n }\r\n\r\n const raw = fs.readFileSync(filePath, 'utf-8');\r\n try {\r\n return JSON.parse(raw) as TrackingData;\r\n } catch {\r\n logger.warn(`Tracking file is corrupt: ${filePath}`);\r\n throw new KKError(\r\n ErrorCodes.TRACKING_CORRUPT,\r\n 'Tracking file .kiro/.kiro-kit.json is corrupt (invalid JSON).',\r\n 'Delete the file and re-run kiro-kit init to regenerate.',\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Write tracking data to .kiro/.kiro-kit.json.\r\n * Creates directory if needed.\r\n */\r\nexport function write(workspaceRoot: string, data: TrackingData): void {\r\n const filePath = getTrackingPath(workspaceRoot);\r\n const dir = path.dirname(filePath);\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\n/**\r\n * Add or update a preset in tracking data.\r\n */\r\nexport function upsertPreset(\r\n data: TrackingData,\r\n preset: TrackedPreset,\r\n): TrackingData {\r\n const existing = data.presets.findIndex((p) => p.name === preset.name);\r\n if (existing >= 0) {\r\n data.presets[existing] = preset;\r\n } else {\r\n data.presets.push(preset);\r\n }\r\n data.updatedAt = new Date().toISOString();\r\n return data;\r\n}\r\n\r\n/**\r\n * Create initial tracking data.\r\n */\r\nexport function createInitial(kitVersion: string): TrackingData {\r\n return {\r\n kitVersion,\r\n installedAt: new Date().toISOString(),\r\n presets: [],\r\n };\r\n}\r\n\r\n/**\r\n * Get a preset from tracking data by name.\r\n */\r\nexport function getPreset(\r\n data: TrackingData,\r\n name: string,\r\n): TrackedPreset | undefined {\r\n return data.presets.find((p) => p.name === name);\r\n}\r\n","import process from 'node:process';\r\nimport { color } from './color.js';\r\n\r\nlet verboseEnabled = false;\r\nlet quietEnabled = false;\r\n\r\nexport function setVerbose(enabled: boolean): void {\r\n verboseEnabled = enabled;\r\n}\r\n\r\nexport function setQuiet(enabled: boolean): void {\r\n quietEnabled = enabled;\r\n}\r\n\r\nexport const logger = {\r\n info(msg: string): void {\r\n if (!quietEnabled) {\r\n process.stdout.write(`${msg}\\n`);\r\n }\r\n },\r\n\r\n success(msg: string): void {\r\n if (!quietEnabled) {\r\n process.stdout.write(`${color.green(msg)}\\n`);\r\n }\r\n },\r\n\r\n warn(msg: string): void {\r\n process.stderr.write(`${color.yellow('WARN')} ${msg}\\n`);\r\n },\r\n\r\n error(msg: string): void {\r\n process.stderr.write(`${color.red('ERROR')} ${msg}\\n`);\r\n },\r\n\r\n debug(msg: string): void {\r\n if (verboseEnabled) {\r\n process.stderr.write(`${color.dim('[debug]')} ${msg}\\n`);\r\n }\r\n },\r\n};\r\n","import pc from 'picocolors';\r\nimport process from 'node:process';\r\n\r\nconst isColorDisabled =\r\n !!process.env['NO_COLOR'] ||\r\n process.argv.includes('--no-color') ||\r\n !process.stdout.isTTY;\r\n\r\nfunction wrap(fn: (s: string) => string): (s: string) => string {\r\n return (s: string) => (isColorDisabled ? s : fn(s));\r\n}\r\n\r\nexport const color = {\r\n green: wrap(pc.green),\r\n red: wrap(pc.red),\r\n yellow: wrap(pc.yellow),\r\n blue: wrap(pc.blue),\r\n cyan: wrap(pc.cyan),\r\n gray: wrap(pc.gray),\r\n bold: wrap(pc.bold),\r\n dim: wrap(pc.dim),\r\n};\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\n\r\nconst METADATA_FILE = '.kiro/metadata.json';\r\n\r\nexport interface PresetMeta {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface Metadata {\r\n version: string;\r\n name: string;\r\n description: string;\r\n buildDate: string;\r\n repository: string;\r\n presets: PresetMeta[];\r\n installedAt: string;\r\n kitVersion: string;\r\n}\r\n\r\n/**\r\n * Compose metadata from installed presets and kit info.\r\n */\r\nexport function compose(opts: {\r\n kitVersion: string;\r\n repository: string;\r\n presets: PresetMeta[];\r\n}): Metadata {\r\n return {\r\n version: '1.0.0',\r\n name: 'kiro-kit',\r\n description: 'Kiro IDE workspace bootstrapped by kiro-kit.',\r\n buildDate: new Date().toISOString(),\r\n repository: opts.repository,\r\n presets: opts.presets,\r\n installedAt: new Date().toISOString(),\r\n kitVersion: opts.kitVersion,\r\n };\r\n}\r\n\r\n/**\r\n * Write metadata.json to workspace.\r\n * When installing multiple presets, merges preset list.\r\n */\r\nexport function write(workspaceRoot: string, metadata: Metadata): void {\r\n const filePath = path.join(workspaceRoot, METADATA_FILE);\r\n const dir = path.dirname(filePath);\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(filePath, JSON.stringify(metadata, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\n/**\r\n * Read existing metadata, or return null if not present.\r\n */\r\nexport function read(workspaceRoot: string): Metadata | null {\r\n const filePath = path.join(workspaceRoot, METADATA_FILE);\r\n if (!fs.existsSync(filePath)) return null;\r\n try {\r\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as Metadata;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Merge new presets into existing metadata (dedup by name).\r\n */\r\nexport function mergePresets(existing: Metadata, newPresets: PresetMeta[]): Metadata {\r\n const merged = [...existing.presets];\r\n for (const p of newPresets) {\r\n const idx = merged.findIndex((m) => m.name === p.name);\r\n if (idx >= 0) {\r\n merged[idx] = p;\r\n } else {\r\n merged.push(p);\r\n }\r\n }\r\n return { ...existing, presets: merged, buildDate: new Date().toISOString() };\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\n\r\nconst STATUSLINE_FILES = ['statusline.js', 'statusline.sh', 'statusline.ps1'];\r\n\r\n/**\r\n * Get the appropriate statusline command for the current platform.\r\n */\r\nexport function getCommand(): string {\r\n switch (process.platform) {\r\n case 'win32':\r\n return 'powershell -ExecutionPolicy Bypass -File .kiro/statusline.ps1';\r\n default:\r\n // macOS, Linux, etc.\r\n return 'node .kiro/statusline.js';\r\n }\r\n}\r\n\r\n/**\r\n * Install statusline triple (.js, .sh, .ps1) from preset to workspace.\r\n * Sets chmod +x on .sh for Unix platforms.\r\n */\r\nexport function install(\r\n presetDir: string,\r\n workspaceRoot: string,\r\n): string[] {\r\n const installed: string[] = [];\r\n const targetDir = path.join(workspaceRoot, '.kiro');\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n\r\n for (const file of STATUSLINE_FILES) {\r\n const source = path.join(presetDir, file);\r\n if (!fs.existsSync(source)) continue;\r\n\r\n const target = path.join(targetDir, file);\r\n fs.copyFileSync(source, target);\r\n installed.push(`.kiro/${file}`);\r\n\r\n // Set executable bit on Unix for .sh\r\n if (file.endsWith('.sh') && process.platform !== 'win32') {\r\n try {\r\n fs.chmodSync(target, 0o755);\r\n } catch {\r\n // Non-critical: skip if chmod fails\r\n }\r\n }\r\n }\r\n\r\n return installed;\r\n}\r\n\r\n/**\r\n * Resolve the statusLine.command field in settings based on platform.\r\n */\r\nexport function resolveSettingsCommand(settings: Record<string, unknown>): Record<string, unknown> {\r\n const statusLine = settings['statusLine'] as Record<string, unknown> | undefined;\r\n if (statusLine && statusLine['type'] === 'command') {\r\n statusLine['command'] = getCommand();\r\n }\r\n return settings;\r\n}\r\n","import { logger } from '../../utils/logger.js';\r\n\r\nexport interface MCPConfig {\r\n mcpServers: Record<string, MCPServerEntry>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface MCPServerEntry {\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n disabled?: boolean;\r\n autoApprove?: string[];\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Merge preset MCP servers into existing MCP config.\r\n * User-priority: existing servers are never overwritten or deleted.\r\n * Warns on cross-preset conflicts (same server name from different presets).\r\n */\r\nexport function mergeMCP(\r\n existing: MCPConfig | null,\r\n presetServers: Record<string, MCPServerEntry>,\r\n presetName?: string,\r\n): MCPConfig {\r\n const result: MCPConfig = existing\r\n ? structuredClone(existing)\r\n : { mcpServers: {} };\r\n\r\n if (!result.mcpServers) {\r\n result.mcpServers = {};\r\n }\r\n\r\n for (const [serverName, def] of Object.entries(presetServers)) {\r\n if (serverName in result.mcpServers) {\r\n logger.warn(\r\n `MCP server \"${serverName}\" already exists, keeping user definition.` +\r\n (presetName ? ` (from preset: ${presetName})` : ''),\r\n );\r\n continue;\r\n }\r\n result.mcpServers[serverName] = structuredClone(def);\r\n }\r\n\r\n return result;\r\n}\r\n","import { logger } from '../../utils/logger.js';\r\n\r\nexport interface HookRef {\r\n command: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface SettingsConfig {\r\n statusLine?: { type?: string; command?: string; [key: string]: unknown };\r\n hooks?: {\r\n PreToolUse?: HookRef[];\r\n PostToolUse?: HookRef[];\r\n agentStop?: HookRef[];\r\n [key: string]: unknown;\r\n };\r\n includeCoAuthoredBy?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Merge preset settings into existing settings.\r\n * - Array fields (hooks.PreToolUse, hooks.PostToolUse, etc.): concat-dedupe by `command`\r\n * - Non-array fields: last-write-wins with warning\r\n * - Preserves user-added fields not in preset\r\n */\r\nexport function mergeSettings(\r\n existing: SettingsConfig | null,\r\n preset: SettingsConfig,\r\n): SettingsConfig {\r\n const result: SettingsConfig = existing\r\n ? structuredClone(existing)\r\n : {};\r\n\r\n // Merge hooks arrays with dedup by command\r\n if (preset.hooks) {\r\n if (!result.hooks) result.hooks = {};\r\n\r\n for (const key of ['PreToolUse', 'PostToolUse', 'agentStop'] as const) {\r\n const presetArr = preset.hooks[key];\r\n if (!presetArr || presetArr.length === 0) continue;\r\n\r\n const existingArr: HookRef[] = (result.hooks[key] as HookRef[]) ?? [];\r\n const existingCommands = new Set(existingArr.map((h) => h.command));\r\n\r\n for (const hook of presetArr) {\r\n if (!existingCommands.has(hook.command)) {\r\n existingArr.push(structuredClone(hook));\r\n }\r\n }\r\n (result.hooks as Record<string, unknown>)[key] = existingArr;\r\n }\r\n }\r\n\r\n // Merge non-array scalar fields with last-write-wins + warning\r\n if (preset.statusLine !== undefined) {\r\n if (result.statusLine !== undefined) {\r\n logger.warn('statusLine already set in settings, overwriting with preset value.');\r\n }\r\n result.statusLine = structuredClone(preset.statusLine);\r\n }\r\n\r\n if (preset.includeCoAuthoredBy !== undefined) {\r\n if (result.includeCoAuthoredBy !== undefined && result.includeCoAuthoredBy !== preset.includeCoAuthoredBy) {\r\n logger.warn('includeCoAuthoredBy already set, overwriting with preset value.');\r\n }\r\n result.includeCoAuthoredBy = preset.includeCoAuthoredBy;\r\n }\r\n\r\n return result;\r\n}\r\n","import fs from 'node:fs';\r\nimport { createTwoFilesPatch } from 'diff';\r\nimport { color } from '../utils/color.js';\r\n\r\n/**\r\n * Print a unified diff between the existing file on disk and new source content.\r\n * Highlights additions in green and deletions in red (NO_COLOR aware).\r\n */\r\nexport function showDiff(target: string, sourceContent: Buffer): void {\r\n const existing = fs.existsSync(target)\r\n ? fs.readFileSync(target, 'utf-8')\r\n : '';\r\n const incoming = sourceContent.toString('utf-8');\r\n\r\n const patch = createTwoFilesPatch(\r\n `a/${target}`,\r\n `b/${target}`,\r\n existing,\r\n incoming,\r\n 'current',\r\n 'incoming',\r\n { context: 3 },\r\n );\r\n\r\n const lines = patch.split('\\n');\r\n for (const line of lines) {\r\n if (line.startsWith('+') && !line.startsWith('+++')) {\r\n process.stdout.write(color.green(line) + '\\n');\r\n } else if (line.startsWith('-') && !line.startsWith('---')) {\r\n process.stdout.write(color.red(line) + '\\n');\r\n } else if (line.startsWith('@@')) {\r\n process.stdout.write(color.cyan(line) + '\\n');\r\n } else {\r\n process.stdout.write(line + '\\n');\r\n }\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport crypto from 'node:crypto';\r\nimport os from 'node:os';\r\n\r\n/** Extensions that should always use LF line endings. */\r\nconst LF_EXTENSIONS = new Set(['.json', '.yaml', '.yml']);\r\n\r\n/**\r\n * Determine the appropriate line ending for a file based on extension.\r\n * - .json, .yaml, .yml -> LF\r\n * - Everything else -> OS default (CRLF on Windows, LF elsewhere)\r\n */\r\nfunction getLineEnding(filePath: string): string {\r\n const ext = path.extname(filePath).toLowerCase();\r\n if (LF_EXTENSIONS.has(ext)) return '\\n';\r\n return os.EOL;\r\n}\r\n\r\n/**\r\n * Normalize line endings in content based on target file extension.\r\n */\r\nfunction normalizeLineEndings(content: string, filePath: string): string {\r\n const eol = getLineEnding(filePath);\r\n // First normalize all to LF, then convert to target\r\n const normalized = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\r\n if (eol === '\\n') return normalized;\r\n return normalized.replace(/\\n/g, eol);\r\n}\r\n\r\n/**\r\n * Atomic write: writes to a temp file in the same directory, then renames.\r\n * This ensures the target file is never in a partial state.\r\n * Also normalizes line endings based on file extension.\r\n */\r\nexport function atomicWrite(target: string, content: string | Buffer): void {\r\n const dir = path.dirname(target);\r\n fs.mkdirSync(dir, { recursive: true });\r\n\r\n const rand = crypto.randomBytes(6).toString('hex');\r\n const tmpPath = path.join(dir, `.tmp.${rand}`);\r\n\r\n let data: Buffer;\r\n if (typeof content === 'string') {\r\n const normalized = normalizeLineEndings(content, target);\r\n data = Buffer.from(normalized, 'utf-8');\r\n } else {\r\n data = content;\r\n }\r\n\r\n try {\r\n fs.writeFileSync(tmpPath, data);\r\n fs.renameSync(tmpPath, target);\r\n } catch (err) {\r\n // Clean up temp file on failure\r\n try {\r\n fs.unlinkSync(tmpPath);\r\n } catch {\r\n // ignore cleanup errors\r\n }\r\n throw err;\r\n }\r\n}\r\n","import path from 'node:path';\r\n\r\n/**\r\n * Normalize a path to use forward slashes (for consistent cross-platform display).\r\n */\r\nexport function normalize(p: string): string {\r\n return p.split(path.sep).join('/');\r\n}\r\n\r\n/**\r\n * Get relative path from workspace root, normalized with forward slashes.\r\n */\r\nexport function relativeFromWorkspace(workspaceRoot: string, target: string): string {\r\n return normalize(path.relative(workspaceRoot, target));\r\n}\r\n\r\n/**\r\n * Check that a resolved path is safely inside the workspace root.\r\n * Prevents path traversal attacks (e.g., ../../etc/passwd).\r\n */\r\nexport function safePathInside(workspaceRoot: string, target: string): boolean {\r\n const resolved = path.resolve(workspaceRoot, target);\r\n const root = path.resolve(workspaceRoot);\r\n return resolved.startsWith(root + path.sep) || resolved === root;\r\n}\r\n\r\n/**\r\n * Join paths using OS-native separator.\r\n */\r\nexport function join(...segments: string[]): string {\r\n return path.join(...segments);\r\n}\r\n\r\n/**\r\n * Resolve to absolute path.\r\n */\r\nexport function resolve(...segments: string[]): string {\r\n return path.resolve(...segments);\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport * as MetadataWriter from '../core/MetadataWriter.js';\r\nimport * as StatuslineSelector from '../core/StatuslineSelector.js';\r\nimport { mergeMCP, type MCPConfig } from '../core/merge/mergeMCP.js';\r\nimport { mergeSettings, type SettingsConfig } from '../core/merge/mergeSettings.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface AddOptions {\r\n yes?: boolean;\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n color?: boolean;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const { default: readline } = await import('node:readline');\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} already exists with different content.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace existing file (backup will be saved)\\n` +\r\n ` skip - Keep existing file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace this and all remaining conflicting files\\n`,\r\n );\r\n\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip');\r\n });\r\n });\r\n}\r\n\r\nexport function registerAddCommand(program: Command): void {\r\n program\r\n .command('add <preset>')\r\n .description('Add a preset to existing workspace')\r\n .option('-y, --yes', 'Skip confirmation')\r\n .option('--force', 'Overwrite all files (with backup)')\r\n .option('--skip-existing', 'Skip all existing files')\r\n .option('--no-color', 'Disable ANSI colors')\r\n .action(async (presetName: string, opts: AddOptions) => {\r\n try {\r\n await runAdd(presetName, opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function runAdd(presetName: string, opts: AddOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n const available = listAvailable();\r\n\r\n // Validate preset name\r\n if (!available.includes(presetName)) {\r\n logger.error(\r\n `Preset \"${presetName}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Auto-init: create .kiro/ if it doesn't exist\r\n const kiroDir = path.join(workspaceRoot, '.kiro');\r\n if (!fs.existsSync(kiroDir)) {\r\n fs.mkdirSync(kiroDir, { recursive: true });\r\n logger.info('Created .kiro/ directory.');\r\n }\r\n\r\n // Load preset\r\n const preset = load(presetName);\r\n\r\n // Determine conflict mode\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n const allTrackedFiles: TrackingStore.TrackedFile[] = [];\r\n let filesWritten = 0;\r\n let filesSkipped = 0;\r\n\r\n const { manifest, dir: presetDir } = preset;\r\n\r\n // Separate files by type\r\n const regularFiles = manifest.files.filter(\r\n (f) => !['mcp', 'settings', 'statusline'].includes(f.type),\r\n );\r\n const statuslineFiles = manifest.files.filter((f) => f.type === 'statusline');\r\n\r\n // Process regular files\r\n for (const fileEntry of regularFiles) {\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) {\r\n logger.warn(`Skipping unsafe path: ${fileEntry.target}`);\r\n filesSkipped++;\r\n continue;\r\n }\r\n\r\n if (!fs.existsSync(sourcePath)) {\r\n logger.debug(`Source file missing: ${sourcePath}`);\r\n continue;\r\n }\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'SKIP':\r\n filesSkipped++;\r\n break;\r\n case 'NO_OP':\r\n break;\r\n }\r\n\r\n if (action !== 'SKIP') {\r\n allTrackedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: manifest.name,\r\n contentHash: sha256(sourceContent),\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process statusline files\r\n if (statuslineFiles.length > 0) {\r\n const installed = StatuslineSelector.install(presetDir, workspaceRoot);\r\n filesWritten += installed.length;\r\n for (const f of installed) {\r\n allTrackedFiles.push({\r\n target: f,\r\n sourcePreset: manifest.name,\r\n contentHash: '',\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process MCP merge\r\n if (manifest.mcpServers) {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n let existingMcp: MCPConfig | null = null;\r\n if (fs.existsSync(mcpPath)) {\r\n try {\r\n existingMcp = JSON.parse(fs.readFileSync(mcpPath, 'utf-8')) as MCPConfig;\r\n } catch { existingMcp = null; }\r\n }\r\n const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);\r\n fs.mkdirSync(path.dirname(mcpPath), { recursive: true });\r\n atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Process settings merge\r\n const presetSettingsPath = path.join(presetDir, 'settings.json');\r\n if (fs.existsSync(presetSettingsPath)) {\r\n const settingsPath = path.join(workspaceRoot, '.kiro/settings.json');\r\n let existingSettings: SettingsConfig | null = null;\r\n if (fs.existsSync(settingsPath)) {\r\n try {\r\n existingSettings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as SettingsConfig;\r\n } catch { existingSettings = null; }\r\n }\r\n const presetSettings = JSON.parse(fs.readFileSync(presetSettingsPath, 'utf-8')) as SettingsConfig;\r\n const resolvedSettings = StatuslineSelector.resolveSettingsCommand(\r\n presetSettings as Record<string, unknown>,\r\n ) as SettingsConfig;\r\n const merged = mergeSettings(existingSettings, resolvedSettings);\r\n fs.mkdirSync(path.dirname(settingsPath), { recursive: true });\r\n atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Write metadata\r\n const kitVersion = getKitVersion();\r\n const presetMeta = { name: manifest.name, version: manifest.version };\r\n const existingMeta = MetadataWriter.read(workspaceRoot);\r\n const metadata = existingMeta\r\n ? MetadataWriter.mergePresets(existingMeta, [presetMeta])\r\n : MetadataWriter.compose({ kitVersion, repository: 'https://github.com/ihatesea69/kiro-kit.git', presets: [presetMeta] });\r\n MetadataWriter.write(workspaceRoot, metadata);\r\n\r\n // Write tracking file LAST\r\n let trackingData = TrackingStore.read(workspaceRoot) ?? TrackingStore.createInitial(kitVersion);\r\n const trackedPreset: TrackingStore.TrackedPreset = {\r\n name: manifest.name,\r\n version: manifest.version,\r\n installedAt: new Date().toISOString(),\r\n files: allTrackedFiles,\r\n };\r\n trackingData = TrackingStore.upsertPreset(trackingData, trackedPreset);\r\n trackingData.kitVersion = kitVersion;\r\n TrackingStore.write(workspaceRoot, trackingData);\r\n\r\n // Summary\r\n logger.success(`Done! ${filesWritten} files written, ${filesSkipped} skipped.`);\r\n logger.info(`Preset added: ${presetName}`);\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface ListOptions {\r\n json?: boolean;\r\n}\r\n\r\ninterface PresetSummary {\r\n name: string;\r\n description: string;\r\n agents: number;\r\n skills: number;\r\n commands: number;\r\n hooks: number;\r\n workflows: number;\r\n mcp: number;\r\n}\r\n\r\nfunction countArtifacts(files: Array<{ type: string }>): Record<string, number> {\r\n const counts: Record<string, number> = {\r\n agent: 0,\r\n skill: 0,\r\n command: 0,\r\n hook: 0,\r\n workflow: 0,\r\n mcp: 0,\r\n };\r\n for (const f of files) {\r\n if (f.type in counts) {\r\n counts[f.type]++;\r\n }\r\n }\r\n return counts;\r\n}\r\n\r\nexport function registerListCommand(program: Command): void {\r\n program\r\n .command('list')\r\n .description('List available presets')\r\n .option('--json', 'Output as JSON')\r\n .action((opts: ListOptions) => {\r\n try {\r\n runList(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runList(opts: ListOptions): void {\r\n const available = listAvailable();\r\n const summaries: PresetSummary[] = [];\r\n\r\n for (const name of available) {\r\n try {\r\n const preset = load(name);\r\n const counts = countArtifacts(preset.manifest.files);\r\n summaries.push({\r\n name,\r\n description: preset.manifest.description,\r\n agents: counts['agent'],\r\n skills: counts['skill'],\r\n commands: counts['command'],\r\n hooks: counts['hook'],\r\n workflows: counts['workflow'],\r\n mcp: Object.keys(preset.manifest.mcpServers ?? {}).length,\r\n });\r\n } catch {\r\n summaries.push({\r\n name,\r\n description: '(failed to load)',\r\n agents: 0,\r\n skills: 0,\r\n commands: 0,\r\n hooks: 0,\r\n workflows: 0,\r\n mcp: 0,\r\n });\r\n }\r\n }\r\n\r\n if (opts.json) {\r\n process.stdout.write(JSON.stringify(summaries, null, 2) + '\\n');\r\n return;\r\n }\r\n\r\n // Text output\r\n for (const s of summaries) {\r\n const nameStr = color.bold(s.name.padEnd(12));\r\n const descStr = color.dim(`- ${s.description}`);\r\n process.stdout.write(` ${nameStr} ${descStr}\\n`);\r\n const counts = `${s.agents} agents, ${s.skills} skills, ${s.commands} commands, ${s.hooks} hooks, ${s.workflows} workflows, ${s.mcp} MCP servers`;\r\n process.stdout.write(`${''.padEnd(14)} ${color.gray(counts)}\\n`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface InfoOptions {\r\n json?: boolean;\r\n}\r\n\r\ninterface PresetInfo {\r\n name: string;\r\n version: string;\r\n description: string;\r\n category: string;\r\n files: Array<{ source: string; target: string; type: string }>;\r\n mcpServers: string[];\r\n hooks: string[];\r\n agents: string[];\r\n skills: string[];\r\n commands: string[];\r\n workflows: string[];\r\n}\r\n\r\nexport function registerInfoCommand(program: Command): void {\r\n program\r\n .command('info <preset>')\r\n .description('Show detailed preset information')\r\n .option('--json', 'Output as JSON')\r\n .action((presetName: string, opts: InfoOptions) => {\r\n try {\r\n runInfo(presetName, opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runInfo(presetName: string, opts: InfoOptions): void {\r\n const available = listAvailable();\r\n\r\n if (!available.includes(presetName)) {\r\n logger.error(\r\n `Preset \"${presetName}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const preset = load(presetName);\r\n const { manifest } = preset;\r\n\r\n const agents = manifest.files.filter((f) => f.type === 'agent').map((f) => f.source);\r\n const skills = manifest.files.filter((f) => f.type === 'skill').map((f) => f.source);\r\n const commands = manifest.files.filter((f) => f.type === 'command').map((f) => f.source);\r\n const workflows = manifest.files.filter((f) => f.type === 'workflow').map((f) => f.source);\r\n const hooks = manifest.files.filter((f) => f.type === 'hook').map((f) => f.source);\r\n const mcpServers = Object.keys(manifest.mcpServers ?? {});\r\n\r\n const info: PresetInfo = {\r\n name: manifest.name,\r\n version: manifest.version,\r\n description: manifest.description,\r\n category: manifest.category,\r\n files: manifest.files.map((f) => ({ source: f.source, target: f.target, type: f.type })),\r\n mcpServers,\r\n hooks,\r\n agents,\r\n skills,\r\n commands,\r\n workflows,\r\n };\r\n\r\n if (opts.json) {\r\n process.stdout.write(JSON.stringify(info, null, 2) + '\\n');\r\n return;\r\n }\r\n\r\n // Text output\r\n process.stdout.write(`\\n${color.bold(manifest.name)} v${manifest.version}\\n`);\r\n process.stdout.write(`${manifest.description}\\n\\n`);\r\n process.stdout.write(`${color.dim('Category:')} ${manifest.category}\\n`);\r\n process.stdout.write(`${color.dim('Total files:')} ${manifest.files.length}\\n\\n`);\r\n\r\n if (mcpServers.length > 0) {\r\n process.stdout.write(`${color.bold('MCP Servers')} (${mcpServers.length}):\\n`);\r\n for (const s of mcpServers) {\r\n process.stdout.write(` - ${s}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (agents.length > 0) {\r\n process.stdout.write(`${color.bold('Agents')} (${agents.length}):\\n`);\r\n for (const a of agents) {\r\n process.stdout.write(` - ${a}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (skills.length > 0) {\r\n process.stdout.write(`${color.bold('Skills')} (${skills.length}):\\n`);\r\n for (const s of skills) {\r\n process.stdout.write(` - ${s}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (commands.length > 0) {\r\n process.stdout.write(`${color.bold('Commands')} (${commands.length}):\\n`);\r\n for (const c of commands) {\r\n process.stdout.write(` - ${c}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (workflows.length > 0) {\r\n process.stdout.write(`${color.bold('Workflows')} (${workflows.length}):\\n`);\r\n for (const w of workflows) {\r\n process.stdout.write(` - ${w}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (hooks.length > 0) {\r\n process.stdout.write(`${color.bold('Hooks')} (${hooks.length}):\\n`);\r\n for (const h of hooks) {\r\n process.stdout.write(` - ${h}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n // File list with targets\r\n process.stdout.write(`${color.bold('File Targets')}:\\n`);\r\n for (const f of manifest.files) {\r\n process.stdout.write(` ${color.dim(f.type.padEnd(12))} ${f.target}\\n`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface UpdateOptions {\r\n yes?: boolean;\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const { default: readline } = await import('node:readline');\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} has changed in the new version.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace with new version (backup saved)\\n` +\r\n ` skip - Keep current file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace all remaining changed files\\n`,\r\n );\r\n\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip');\r\n });\r\n });\r\n}\r\n\r\nexport function registerUpdateCommand(program: Command): void {\r\n program\r\n .command('update')\r\n .description('Update installed presets to latest bundled version')\r\n .option('-y, --yes', 'Skip confirmation, auto-skip conflicts')\r\n .option('--force', 'Overwrite all changed files (with backup)')\r\n .option('--skip-existing', 'Skip all changed files')\r\n .action(async (opts: UpdateOptions) => {\r\n try {\r\n await runUpdate(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function runUpdate(opts: UpdateOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n\r\n // Read tracking\r\n const tracking = TrackingStore.read(workspaceRoot);\r\n if (!tracking || tracking.presets.length === 0) {\r\n logger.info('No presets installed. Nothing to update.');\r\n process.exit(0);\r\n }\r\n\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n let totalUpdated = 0;\r\n let totalSkipped = 0;\r\n\r\n for (const trackedPreset of tracking.presets) {\r\n let bundled;\r\n try {\r\n bundled = load(trackedPreset.name);\r\n } catch {\r\n logger.warn(`Preset \"${trackedPreset.name}\" not found in bundled presets. Skipping.`);\r\n continue;\r\n }\r\n\r\n const bundledVersion = bundled.manifest.version;\r\n if (bundledVersion === trackedPreset.version) {\r\n logger.debug(`Preset \"${trackedPreset.name}\" is up to date (v${bundledVersion}).`);\r\n continue;\r\n }\r\n\r\n logger.info(\r\n `Updating ${color.bold(trackedPreset.name)}: v${trackedPreset.version} -> v${bundledVersion}`,\r\n );\r\n\r\n // Find changed files by comparing content hashes\r\n const presetDir = bundled.dir;\r\n const updatedFiles: TrackingStore.TrackedFile[] = [];\r\n\r\n for (const fileEntry of bundled.manifest.files) {\r\n if (['mcp', 'settings', 'statusline'].includes(fileEntry.type)) continue;\r\n\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) continue;\r\n if (!fs.existsSync(sourcePath)) continue;\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n const newHash = sha256(sourceContent);\r\n\r\n // Check if file changed from what we installed\r\n const trackedFile = trackedPreset.files.find((f) => f.target === fileEntry.target);\r\n if (trackedFile && trackedFile.contentHash === newHash) {\r\n // Bundled file hasn't changed since last install\r\n continue;\r\n }\r\n\r\n // File has changed in the new version - resolve conflict\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* */ }\r\n }\r\n totalUpdated++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* */ }\r\n }\r\n totalUpdated++;\r\n break;\r\n case 'SKIP':\r\n totalSkipped++;\r\n break;\r\n case 'NO_OP':\r\n break;\r\n }\r\n\r\n updatedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: bundled.manifest.name,\r\n contentHash: newHash,\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n // Bump version in tracking\r\n trackedPreset.version = bundledVersion;\r\n trackedPreset.updatedAt = new Date().toISOString();\r\n // Update file hashes for changed files\r\n for (const uf of updatedFiles) {\r\n const idx = trackedPreset.files.findIndex((f) => f.target === uf.target);\r\n if (idx >= 0) {\r\n trackedPreset.files[idx] = uf;\r\n } else {\r\n trackedPreset.files.push(uf);\r\n }\r\n }\r\n }\r\n\r\n // Write updated tracking\r\n tracking.kitVersion = getKitVersion();\r\n tracking.updatedAt = new Date().toISOString();\r\n TrackingStore.write(workspaceRoot, tracking);\r\n\r\n if (totalUpdated === 0 && totalSkipped === 0) {\r\n logger.success('All presets are up to date.');\r\n } else {\r\n logger.success(`Update complete: ${totalUpdated} files updated, ${totalSkipped} skipped.`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { restore, listTimestamps } from '../core/BackupManager.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface RestoreOptions {\r\n timestamp?: string;\r\n list?: boolean;\r\n}\r\n\r\nexport function registerRestoreCommand(program: Command): void {\r\n program\r\n .command('restore')\r\n .description('Restore files from backup')\r\n .option('--timestamp <ts>', 'Restore from specific backup timestamp')\r\n .option('--list', 'List available backup timestamps')\r\n .action((opts: RestoreOptions) => {\r\n try {\r\n runRestore(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runRestore(opts: RestoreOptions): void {\r\n const workspaceRoot = process.cwd();\r\n\r\n // --list flag: print available timestamps and exit\r\n if (opts.list) {\r\n const timestamps = listTimestamps(workspaceRoot);\r\n if (timestamps.length === 0) {\r\n logger.info('No backups available.');\r\n process.exit(0);\r\n }\r\n process.stdout.write(`${color.bold('Available backups')}:\\n`);\r\n for (const ts of timestamps) {\r\n process.stdout.write(` ${ts}\\n`);\r\n }\r\n process.exit(0);\r\n }\r\n\r\n // Check if any backups exist\r\n const timestamps = listTimestamps(workspaceRoot);\r\n if (timestamps.length === 0) {\r\n logger.error('No backups found. Nothing to restore.');\r\n process.exit(1);\r\n }\r\n\r\n // Restore from specified timestamp or latest\r\n const restored = restore(workspaceRoot, opts.timestamp);\r\n\r\n if (restored.length === 0) {\r\n logger.info('No files to restore from backup.');\r\n process.exit(0);\r\n }\r\n\r\n process.stdout.write(`${color.bold('Restored files')}:\\n`);\r\n for (const file of restored) {\r\n process.stdout.write(` ${color.green('+')} ${file}\\n`);\r\n }\r\n logger.success(`Restored ${restored.length} files.`);\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\n\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface DoctorOptions {\r\n fix?: boolean;\r\n}\r\n\r\ntype CheckResult = 'PASS' | 'FAIL' | 'WARN';\r\n\r\ninterface CheckReport {\r\n name: string;\r\n result: CheckResult;\r\n message: string;\r\n fixable?: boolean;\r\n fixAction?: () => void;\r\n}\r\n\r\nexport function registerDoctorCommand(program: Command): void {\r\n program\r\n .command('doctor')\r\n .description('Run workspace health checks')\r\n .option('--fix', 'Auto-fix fixable issues')\r\n .action((opts: DoctorOptions) => {\r\n try {\r\n runDoctor(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runDoctor(opts: DoctorOptions): void {\r\n const workspaceRoot = process.cwd();\r\n const checks: CheckReport[] = [];\r\n\r\n // (a) Node >= 18\r\n checks.push(checkNodeVersion());\r\n\r\n // (b) .kiro/ exists\r\n checks.push(checkKiroDir(workspaceRoot));\r\n\r\n // (c) mcp.json valid\r\n checks.push(checkMcpJson(workspaceRoot));\r\n\r\n // (d) tracking valid\r\n checks.push(checkTracking(workspaceRoot));\r\n\r\n // (e) tracked files exist\r\n checks.push(checkTrackedFiles(workspaceRoot));\r\n\r\n // (f) no trailing whitespace in steering front-matter\r\n checks.push(checkSteeringFrontMatter(workspaceRoot));\r\n\r\n // (g) metadata.json valid\r\n checks.push(checkMetadataJson(workspaceRoot));\r\n\r\n // (h) statusline exec bit (Unix)\r\n checks.push(checkStatuslineExecBit(workspaceRoot));\r\n\r\n // Print results\r\n let hasFail = false;\r\n for (const check of checks) {\r\n const tag = formatTag(check.result);\r\n process.stdout.write(`${tag} ${check.message}\\n`);\r\n\r\n if (check.result === 'FAIL') hasFail = true;\r\n\r\n // Apply fix if --fix and fixable\r\n if (opts.fix && check.fixable && check.fixAction) {\r\n check.fixAction();\r\n process.stdout.write(` ${color.green('Fixed!')}\\n`);\r\n }\r\n }\r\n\r\n process.exit(hasFail ? 1 : 0);\r\n}\r\n\r\nfunction formatTag(result: CheckResult): string {\r\n switch (result) {\r\n case 'PASS': return color.green('[PASS]');\r\n case 'FAIL': return color.red('[FAIL]');\r\n case 'WARN': return color.yellow('[WARN]');\r\n }\r\n}\r\n\r\nfunction checkNodeVersion(): CheckReport {\r\n const major = parseInt(process.versions.node.split('.')[0], 10);\r\n if (major >= 18) {\r\n return {\r\n name: 'node-version',\r\n result: 'PASS',\r\n message: `Node.js version >= 18 (${process.version})`,\r\n };\r\n }\r\n return {\r\n name: 'node-version',\r\n result: 'FAIL',\r\n message: `Node.js version >= 18 required (current: ${process.version})`,\r\n };\r\n}\r\n\r\nfunction checkKiroDir(workspaceRoot: string): CheckReport {\r\n const kiroDir = path.join(workspaceRoot, '.kiro');\r\n if (fs.existsSync(kiroDir) && fs.statSync(kiroDir).isDirectory()) {\r\n return { name: 'kiro-dir', result: 'PASS', message: '.kiro/ directory exists' };\r\n }\r\n return {\r\n name: 'kiro-dir',\r\n result: 'FAIL',\r\n message: '.kiro/ directory not found. Run `kiro-kit init` to create it.',\r\n };\r\n}\r\n\r\nfunction checkMcpJson(workspaceRoot: string): CheckReport {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n if (!fs.existsSync(mcpPath)) {\r\n return { name: 'mcp-json', result: 'WARN', message: '.kiro/settings/mcp.json not found (optional)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(mcpPath, 'utf-8');\r\n JSON.parse(content);\r\n return { name: 'mcp-json', result: 'PASS', message: '.kiro/settings/mcp.json is valid JSON' };\r\n } catch {\r\n return {\r\n name: 'mcp-json',\r\n result: 'FAIL',\r\n message: '.kiro/settings/mcp.json is not valid JSON',\r\n fixable: true,\r\n fixAction: () => {\r\n const mcpPath2 = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n fs.writeFileSync(mcpPath2, '{\\n \"mcpServers\": {}\\n}\\n', 'utf-8');\r\n },\r\n };\r\n }\r\n}\r\n\r\nfunction checkTracking(workspaceRoot: string): CheckReport {\r\n const trackingPath = path.join(workspaceRoot, '.kiro/.kiro-kit.json');\r\n if (!fs.existsSync(trackingPath)) {\r\n return { name: 'tracking', result: 'WARN', message: '.kiro/.kiro-kit.json not found (no presets installed)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(trackingPath, 'utf-8');\r\n JSON.parse(content);\r\n return { name: 'tracking', result: 'PASS', message: '.kiro/.kiro-kit.json is valid' };\r\n } catch {\r\n return {\r\n name: 'tracking',\r\n result: 'FAIL',\r\n message: '.kiro/.kiro-kit.json is corrupt (invalid JSON)',\r\n };\r\n }\r\n}\r\n\r\nfunction checkTrackedFiles(workspaceRoot: string): CheckReport {\r\n let tracking: TrackingStore.TrackingData | null;\r\n try {\r\n tracking = TrackingStore.read(workspaceRoot);\r\n } catch {\r\n return { name: 'tracked-files', result: 'WARN', message: 'Cannot read tracking file, skipping file check' };\r\n }\r\n\r\n if (!tracking || tracking.presets.length === 0) {\r\n return { name: 'tracked-files', result: 'PASS', message: 'No tracked files to verify' };\r\n }\r\n\r\n const missing: string[] = [];\r\n for (const preset of tracking.presets) {\r\n for (const file of preset.files) {\r\n const fullPath = path.resolve(workspaceRoot, file.target);\r\n if (!fs.existsSync(fullPath)) {\r\n missing.push(file.target);\r\n }\r\n }\r\n }\r\n\r\n if (missing.length === 0) {\r\n return { name: 'tracked-files', result: 'PASS', message: 'All tracked files exist on disk' };\r\n }\r\n\r\n return {\r\n name: 'tracked-files',\r\n result: 'FAIL',\r\n message: `${missing.length} tracked file(s) missing: ${missing.slice(0, 3).join(', ')}${missing.length > 3 ? '...' : ''}`,\r\n };\r\n}\r\n\r\nfunction checkSteeringFrontMatter(workspaceRoot: string): CheckReport {\r\n const steeringDir = path.join(workspaceRoot, '.kiro/steering');\r\n if (!fs.existsSync(steeringDir)) {\r\n return { name: 'steering-fm', result: 'PASS', message: 'No steering files to check' };\r\n }\r\n\r\n const issues: string[] = [];\r\n\r\n const walkDir = (dir: string): void => {\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true });\r\n } catch { return; }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n walkDir(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\r\n checkSingleSteering(fullPath, issues);\r\n }\r\n }\r\n };\r\n\r\n walkDir(steeringDir);\r\n\r\n if (issues.length === 0) {\r\n return { name: 'steering-fm', result: 'PASS', message: 'Steering front-matter has no trailing whitespace' };\r\n }\r\n\r\n return {\r\n name: 'steering-fm',\r\n result: 'WARN',\r\n message: `${issues.length} steering file(s) have trailing whitespace in front-matter`,\r\n fixable: true,\r\n fixAction: () => {\r\n fixSteeringWhitespace(steeringDir);\r\n },\r\n };\r\n}\r\n\r\nfunction checkSingleSteering(filePath: string, issues: string[]): void {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n if (lines[0]?.trim() !== '---') return;\r\n\r\n let endIdx = -1;\r\n for (let i = 1; i < lines.length; i++) {\r\n if (lines[i]?.trim() === '---') { endIdx = i; break; }\r\n }\r\n if (endIdx === -1) return;\r\n\r\n // Check for trailing whitespace in front-matter lines\r\n for (let i = 1; i < endIdx; i++) {\r\n if (lines[i] !== lines[i].trimEnd()) {\r\n issues.push(filePath);\r\n return;\r\n }\r\n }\r\n } catch { /* skip unreadable files */ }\r\n}\r\n\r\nfunction fixSteeringWhitespace(steeringDir: string): void {\r\n const walkAndFix = (dir: string): void => {\r\n let entries: fs.Dirent[];\r\n try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n walkAndFix(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\r\n const content = fs.readFileSync(fullPath, 'utf-8');\r\n const lines = content.split('\\n');\r\n if (lines[0]?.trim() !== '---') continue;\r\n let endIdx = -1;\r\n for (let i = 1; i < lines.length; i++) {\r\n if (lines[i]?.trim() === '---') { endIdx = i; break; }\r\n }\r\n if (endIdx === -1) continue;\r\n let changed = false;\r\n for (let i = 1; i < endIdx; i++) {\r\n const trimmed = lines[i].trimEnd();\r\n if (lines[i] !== trimmed) { lines[i] = trimmed; changed = true; }\r\n }\r\n if (changed) {\r\n fs.writeFileSync(fullPath, lines.join('\\n'), 'utf-8');\r\n }\r\n }\r\n }\r\n };\r\n walkAndFix(steeringDir);\r\n}\r\n\r\nfunction checkMetadataJson(workspaceRoot: string): CheckReport {\r\n const metaPath = path.join(workspaceRoot, '.kiro/metadata.json');\r\n if (!fs.existsSync(metaPath)) {\r\n return { name: 'metadata-json', result: 'WARN', message: '.kiro/metadata.json not found (optional)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(metaPath, 'utf-8');\r\n const parsed = JSON.parse(content);\r\n if (!parsed.version || !parsed.name) {\r\n return { name: 'metadata-json', result: 'FAIL', message: '.kiro/metadata.json missing required fields (version, name)' };\r\n }\r\n return { name: 'metadata-json', result: 'PASS', message: '.kiro/metadata.json is valid' };\r\n } catch {\r\n return { name: 'metadata-json', result: 'FAIL', message: '.kiro/metadata.json is not valid JSON' };\r\n }\r\n}\r\n\r\nfunction checkStatuslineExecBit(workspaceRoot: string): CheckReport {\r\n // Only relevant on Unix\r\n if (process.platform === 'win32') {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'Statusline exec bit check (skipped on Windows)' };\r\n }\r\n\r\n const shPath = path.join(workspaceRoot, '.kiro/statusline.sh');\r\n if (!fs.existsSync(shPath)) {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'No statusline.sh to check' };\r\n }\r\n\r\n try {\r\n const stat = fs.statSync(shPath);\r\n const isExecutable = (stat.mode & 0o111) !== 0;\r\n if (isExecutable) {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'statusline.sh is executable' };\r\n }\r\n return {\r\n name: 'statusline-exec',\r\n result: 'WARN',\r\n message: 'statusline.sh is not executable',\r\n fixable: true,\r\n fixAction: () => {\r\n fs.chmodSync(shPath, 0o755);\r\n },\r\n };\r\n } catch {\r\n return { name: 'statusline-exec', result: 'WARN', message: 'Cannot check statusline.sh permissions' };\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport process from 'node:process';\r\n\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\nconst CONFIG_DIR = path.join(os.homedir(), '.kiro-kit');\r\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\r\n\r\ninterface TelemetryConfig {\r\n telemetry: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\nfunction readConfig(): TelemetryConfig {\r\n try {\r\n if (fs.existsSync(CONFIG_FILE)) {\r\n return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8')) as TelemetryConfig;\r\n }\r\n } catch { /* ignore corrupt config */ }\r\n return { telemetry: false };\r\n}\r\n\r\nfunction writeConfig(config: TelemetryConfig): void {\r\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\r\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function registerTelemetryCommand(program: Command): void {\r\n const telemetry = program\r\n .command('telemetry')\r\n .description('Manage anonymous usage telemetry');\r\n\r\n telemetry\r\n .command('enable')\r\n .description('Opt in to anonymous telemetry')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n config.telemetry = true;\r\n writeConfig(config);\r\n logger.success('Telemetry enabled. Anonymous usage data will be collected.');\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n\r\n telemetry\r\n .command('disable')\r\n .description('Opt out of telemetry')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n config.telemetry = false;\r\n writeConfig(config);\r\n logger.success('Telemetry disabled. No data will be collected.');\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n\r\n telemetry\r\n .command('status')\r\n .description('Show current telemetry status')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n const status = config.telemetry ? color.green('enabled') : color.yellow('disabled');\r\n process.stdout.write(`Telemetry: ${status}\\n`);\r\n process.stdout.write(`Config: ${CONFIG_FILE}\\n`);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n"],"mappings":"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","names":["process","fs","path","process","crypto","fs","path","path","fs","fs","showDiff","fs","path","path","fs","fs","path","process","process","process","path","fs","fs","path","write","read","fs","path","process","fs","fs","fs","path","crypto","path","path","process","resolve","path","sha256","crypto","program","generateTimestamp","fs","read","write","pkg","fs","path","process","crypto","sha256","crypto","generateTimestamp","getKitVersion","pkg","fs","conflictPrompt","process","readline","path","resolve","program","read","write","process","program","process","process","program","process","fs","path","process","crypto","sha256","crypto","generateTimestamp","getKitVersion","pkg","fs","conflictPrompt","process","readline","path","resolve","program","process","program","process","timestamps","fs","path","process","program","process","major","path","fs","fs","path","os","process","path","os","fs","program","process","process","require"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/core/PresetLoader.ts","../src/core/ManifestParser.ts","../src/core/errors.ts","../src/core/ConflictResolver.ts","../src/core/BackupManager.ts","../src/core/TrackingStore.ts","../src/utils/logger.ts","../src/utils/color.ts","../src/core/MetadataWriter.ts","../src/core/StatuslineSelector.ts","../src/core/merge/mergeMCP.ts","../src/core/merge/mergeSettings.ts","../src/prompts/DiffViewer.ts","../src/utils/fs-safe.ts","../src/utils/paths.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/info.ts","../src/commands/update.ts","../src/commands/restore.ts","../src/commands/doctor.ts","../src/commands/telemetry.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { createRequire } from 'node:module';\r\nimport process from 'node:process';\r\nimport { Command } from 'commander';\r\nimport { registerInitCommand } from './commands/init.js';\r\nimport { registerAddCommand } from './commands/add.js';\r\nimport { registerListCommand } from './commands/list.js';\r\nimport { registerInfoCommand } from './commands/info.js';\r\nimport { registerUpdateCommand } from './commands/update.js';\r\nimport { registerRestoreCommand } from './commands/restore.js';\r\nimport { registerDoctorCommand } from './commands/doctor.js';\r\nimport { registerTelemetryCommand } from './commands/telemetry.js';\r\nimport { setVerbose, setQuiet } from './utils/logger.js';\r\n\r\n// Node version check\r\nconst major = parseInt(process.versions.node.split('.')[0], 10);\r\nif (major < 18) {\r\n process.stderr.write(\r\n '[KK001] kiro-kit requires Node.js >= 18. ' +\r\n `Current version: ${process.version}. ` +\r\n 'Please upgrade Node.js.\\n',\r\n );\r\n process.exit(1);\r\n}\r\n\r\nconst require = createRequire(import.meta.url);\r\nconst pkg = require('../package.json') as { version: string };\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('kiro-kit')\r\n .description('CLI tool for bootstrapping engineer-grade Kiro IDE workspaces.')\r\n .version(pkg.version, '-v, --version');\r\n\r\n// Global flags\r\nprogram.option('--verbose', 'Enable verbose output');\r\nprogram.option('--quiet', 'Suppress non-essential output');\r\nprogram.option('--no-color', 'Disable colored output');\r\n\r\n// Wire all commands\r\nregisterInitCommand(program);\r\nregisterAddCommand(program);\r\nregisterListCommand(program);\r\nregisterInfoCommand(program);\r\nregisterUpdateCommand(program);\r\nregisterRestoreCommand(program);\r\nregisterDoctorCommand(program);\r\nregisterTelemetryCommand(program);\r\n\r\n// Apply global flags before command execution\r\nprogram.hook('preAction', (thisCommand) => {\r\n const opts = thisCommand.opts();\r\n if (opts['verbose']) setVerbose(true);\r\n if (opts['quiet']) setQuiet(true);\r\n});\r\n\r\nprogram.parse(process.argv);\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport readline from 'node:readline';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load, loadAll, listAvailable } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport * as MetadataWriter from '../core/MetadataWriter.js';\r\nimport * as StatuslineSelector from '../core/StatuslineSelector.js';\r\nimport { mergeMCP, type MCPConfig } from '../core/merge/mergeMCP.js';\r\nimport { mergeSettings, type SettingsConfig } from '../core/merge/mergeSettings.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface InitOptions {\r\n yes?: boolean;\r\n preset?: string[];\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n color?: boolean;\r\n}\r\n\r\n// Handle SIGINT at process level for exit 130\r\nfunction setupSigintHandler(): void {\r\n process.on('SIGINT', () => {\r\n process.exit(130);\r\n });\r\n}\r\n\r\n/**\r\n * Interactive multi-pick prompt using readline.\r\n * Space to toggle, 'a' to toggle all, Enter to confirm.\r\n */\r\nasync function multiPickPrompt(\r\n items: Array<{ name: string; description: string }>,\r\n): Promise<string[]> {\r\n const selected = new Set<number>();\r\n let cursor = 0;\r\n\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n terminal: false,\r\n });\r\n\r\n // Enable raw mode for keypress detection\r\n if (!process.stdin.isTTY) {\r\n // Non-interactive: return empty\r\n rl.close();\r\n return [];\r\n }\r\n\r\n return new Promise<string[]>((resolve, reject) => {\r\n let rendered = false;\r\n\r\n const render = (): void => {\r\n // Move cursor up to overwrite previous render\r\n if (rendered) {\r\n process.stdout.write(`\\x1B[${items.length + 1}A`);\r\n }\r\n rendered = true;\r\n // Clear line + write header\r\n process.stdout.write(\r\n '\\x1B[2K' +\r\n color.bold('? Select presets to install:') +\r\n color.dim(' (Space to select, <a> toggle all, Enter to confirm)') +\r\n '\\n',\r\n );\r\n for (let i = 0; i < items.length; i++) {\r\n const marker = cursor === i ? color.cyan('>') : ' ';\r\n const check = selected.has(i)\r\n ? color.green('[x]')\r\n : '[ ]';\r\n const name = color.bold(items[i].name.padEnd(12));\r\n const desc = color.dim(`- ${items[i].description}`);\r\n // Clear line before writing to prevent ghost text\r\n process.stdout.write(`\\x1B[2K ${marker} ${check} ${name} ${desc}\\n`);\r\n }\r\n };\r\n\r\n // Initial render (no need for blank lines — first render writes directly)\r\n render();\r\n\r\n process.stdin.setRawMode(true);\r\n process.stdin.resume();\r\n process.stdin.setEncoding('utf-8');\r\n\r\n let escBuffer = '';\r\n\r\n const handleArrow = (seq: string): boolean => {\r\n if (seq === '\\x1B[A' || seq === '\\x1BOA') {\r\n cursor = (cursor - 1 + items.length) % items.length;\r\n render();\r\n return true;\r\n }\r\n if (seq === '\\x1B[B' || seq === '\\x1BOB') {\r\n cursor = (cursor + 1) % items.length;\r\n render();\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const onData = (key: string): void => {\r\n // Case 1: continuing a buffered escape sequence (split across chunks)\r\n if (escBuffer.length > 0) {\r\n escBuffer += key;\r\n if (escBuffer.length >= 3) {\r\n const seq = escBuffer;\r\n escBuffer = '';\r\n handleArrow(seq);\r\n }\r\n return;\r\n }\r\n\r\n // Case 2: full escape sequence arrived in one chunk (common on Windows)\r\n if (key.length >= 3 && key.startsWith('\\x1B')) {\r\n handleArrow(key);\r\n return;\r\n }\r\n\r\n // Case 3: start of escape sequence (single ESC byte, more coming)\r\n if (key === '\\x1B') {\r\n escBuffer = key;\r\n // Timeout: if no more bytes arrive within 50ms, discard (bare ESC key)\r\n setTimeout(() => {\r\n if (escBuffer.length > 0) {\r\n escBuffer = '';\r\n }\r\n }, 50);\r\n return;\r\n }\r\n\r\n // Ctrl+C / SIGINT\r\n if (key === '\\x03') {\r\n process.stdin.setRawMode(false);\r\n process.stdin.removeListener('data', onData);\r\n process.stdin.pause();\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n return;\r\n }\r\n\r\n // Enter\r\n if (key === '\\r' || key === '\\n') {\r\n process.stdin.setRawMode(false);\r\n process.stdin.removeListener('data', onData);\r\n process.stdin.pause();\r\n rl.close();\r\n const result = [...selected].map((i) => items[i].name);\r\n resolve(result);\r\n return;\r\n }\r\n\r\n // Space - toggle current\r\n if (key === ' ') {\r\n if (selected.has(cursor)) {\r\n selected.delete(cursor);\r\n } else {\r\n selected.add(cursor);\r\n }\r\n render();\r\n return;\r\n }\r\n\r\n // 'a' - toggle all\r\n if (key === 'a' || key === 'A') {\r\n if (selected.size === items.length) {\r\n selected.clear();\r\n } else {\r\n for (let i = 0; i < items.length; i++) selected.add(i);\r\n }\r\n render();\r\n return;\r\n }\r\n\r\n // Arrow up / k\r\n if (key === 'k') {\r\n cursor = (cursor - 1 + items.length) % items.length;\r\n render();\r\n return;\r\n }\r\n\r\n // Arrow down / j\r\n if (key === 'j') {\r\n cursor = (cursor + 1) % items.length;\r\n render();\r\n return;\r\n }\r\n };\r\n\r\n process.stdin.on('data', onData);\r\n });\r\n}\r\n\r\n/**\r\n * Confirmation prompt: \"About to write X files. Continue? (Y/n)\"\r\n */\r\nasync function confirmPrompt(message: string): Promise<boolean> {\r\n if (!process.stdin.isTTY) return true;\r\n\r\n return new Promise((resolve, reject) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n rl.question(`${color.bold('?')} ${message} `, (answer) => {\r\n rl.close();\r\n const normalized = answer.trim().toLowerCase();\r\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\r\n });\r\n\r\n rl.on('SIGINT', () => {\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Interactive 4-option conflict prompt.\r\n */\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} already exists with different content.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace existing file (backup will be saved)\\n` +\r\n ` skip - Keep existing file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace this and all remaining conflicting files\\n`,\r\n );\r\n\r\n return new Promise((resolve, reject) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip'); // default to skip on unrecognized input\r\n });\r\n\r\n rl.on('SIGINT', () => {\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n });\r\n });\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\n/**\r\n * Register the init command on the given program.\r\n */\r\nexport function registerInitCommand(program: Command): void {\r\n program\r\n .command('init')\r\n .description('Initialize workspace with selected presets')\r\n .option('-y, --yes', 'Skip confirmation, accept defaults')\r\n .option('--preset <name>', 'Specify preset (repeatable)', collectPreset, [])\r\n .option('--force', 'Overwrite all files (with backup)')\r\n .option('--skip-existing', 'Skip all existing files')\r\n .option('--no-color', 'Disable ANSI colors')\r\n .action(async (opts: InitOptions) => {\r\n setupSigintHandler();\r\n try {\r\n await runInit(opts);\r\n } catch (err: unknown) {\r\n if (err instanceof Error && err.message === 'SIGINT') {\r\n process.exit(130);\r\n }\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction collectPreset(value: string, previous: string[]): string[] {\r\n return [...previous, value];\r\n}\r\n\r\nasync function runInit(opts: InitOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n const available = listAvailable();\r\n\r\n // 1. Determine selected presets\r\n let selectedNames: string[];\r\n\r\n if (opts.preset && opts.preset.length > 0) {\r\n // Validate preset names\r\n for (const name of opts.preset) {\r\n if (!available.includes(name)) {\r\n logger.error(\r\n `Preset \"${name}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n }\r\n selectedNames = opts.preset;\r\n } else {\r\n // Interactive multi-pick\r\n const items = available.map((name) => {\r\n try {\r\n const preset = load(name);\r\n return { name, description: preset.manifest.description };\r\n } catch {\r\n return { name, description: '' };\r\n }\r\n });\r\n\r\n selectedNames = await multiPickPrompt(items);\r\n }\r\n\r\n // Empty selection -> exit 0\r\n if (selectedNames.length === 0) {\r\n logger.info('No presets selected. Exiting.');\r\n process.exit(0);\r\n }\r\n\r\n // 2. Load selected presets\r\n const presets = loadAll(selectedNames);\r\n\r\n // 3. Plan operations - count total files\r\n let totalFiles = 0;\r\n for (const preset of presets) {\r\n totalFiles += preset.manifest.files.length;\r\n }\r\n\r\n // 4. Show summary and ask for confirmation\r\n if (!opts.yes) {\r\n const confirmed = await confirmPrompt(\r\n `About to write ${totalFiles} files into .kiro/ and workspace. Continue? (Y/n)`,\r\n );\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // 5. Determine conflict mode\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n\r\n // Track written files for tracking store\r\n const allTrackedFiles: TrackingStore.TrackedFile[] = [];\r\n let filesWritten = 0;\r\n let filesSkipped = 0;\r\n\r\n // 6. Process each preset\r\n for (const preset of presets) {\r\n const { manifest, dir: presetDir } = preset;\r\n\r\n // Separate files by type for special handling\r\n const regularFiles = manifest.files.filter(\r\n (f) => !['mcp', 'settings', 'statusline'].includes(f.type),\r\n );\r\n const mcpFiles = manifest.files.filter((f) => f.type === 'mcp');\r\n const settingsFiles = manifest.files.filter((f) => f.type === 'settings');\r\n const statuslineFiles = manifest.files.filter((f) => f.type === 'statusline');\r\n\r\n // Process regular files\r\n for (const fileEntry of regularFiles) {\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n // Safety check\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) {\r\n logger.warn(`Skipping unsafe path: ${fileEntry.target}`);\r\n filesSkipped++;\r\n continue;\r\n }\r\n\r\n if (!fs.existsSync(sourcePath)) {\r\n logger.debug(`Source file missing: ${sourcePath}`);\r\n continue;\r\n }\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n // Set executable bit if needed\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'SKIP':\r\n filesSkipped++;\r\n break;\r\n case 'NO_OP':\r\n // File already identical\r\n break;\r\n }\r\n\r\n // Track the file regardless of action (for tracking store)\r\n if (action !== 'SKIP') {\r\n allTrackedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: manifest.name,\r\n contentHash: sha256(sourceContent),\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process statusline files via StatuslineSelector\r\n if (statuslineFiles.length > 0) {\r\n const installed = StatuslineSelector.install(presetDir, workspaceRoot);\r\n filesWritten += installed.length;\r\n for (const f of installed) {\r\n allTrackedFiles.push({\r\n target: f,\r\n sourcePreset: manifest.name,\r\n contentHash: '',\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process MCP merge\r\n if (mcpFiles.length > 0 && manifest.mcpServers) {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n let existingMcp: MCPConfig | null = null;\r\n if (fs.existsSync(mcpPath)) {\r\n try {\r\n existingMcp = JSON.parse(fs.readFileSync(mcpPath, 'utf-8')) as MCPConfig;\r\n } catch {\r\n existingMcp = null;\r\n }\r\n }\r\n const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);\r\n fs.mkdirSync(path.dirname(mcpPath), { recursive: true });\r\n atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Process settings merge\r\n if (settingsFiles.length > 0) {\r\n const settingsPath = path.join(workspaceRoot, '.kiro/settings.json');\r\n let existingSettings: SettingsConfig | null = null;\r\n if (fs.existsSync(settingsPath)) {\r\n try {\r\n existingSettings = JSON.parse(\r\n fs.readFileSync(settingsPath, 'utf-8'),\r\n ) as SettingsConfig;\r\n } catch {\r\n existingSettings = null;\r\n }\r\n }\r\n\r\n // Read preset settings\r\n const presetSettingsPath = path.join(presetDir, 'settings.json');\r\n if (fs.existsSync(presetSettingsPath)) {\r\n const presetSettings = JSON.parse(\r\n fs.readFileSync(presetSettingsPath, 'utf-8'),\r\n ) as SettingsConfig;\r\n\r\n // Resolve statusline command per platform\r\n const resolvedSettings = StatuslineSelector.resolveSettingsCommand(\r\n presetSettings as Record<string, unknown>,\r\n ) as SettingsConfig;\r\n\r\n const merged = mergeSettings(existingSettings, resolvedSettings);\r\n fs.mkdirSync(path.dirname(settingsPath), { recursive: true });\r\n atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n }\r\n\r\n // Also write .mcp.json.example if present in preset (as regular file)\r\n const mcpExampleSource = path.join(presetDir, '.mcp.json.example');\r\n if (fs.existsSync(mcpExampleSource)) {\r\n const mcpExampleTarget = path.join(workspaceRoot, '.kiro/.mcp.json.example');\r\n if (!fs.existsSync(mcpExampleTarget)) {\r\n fs.mkdirSync(path.dirname(mcpExampleTarget), { recursive: true });\r\n fs.copyFileSync(mcpExampleSource, mcpExampleTarget);\r\n }\r\n }\r\n }\r\n\r\n // 7. Write metadata.json\r\n const kitVersion = getKitVersion();\r\n const presetMetas = presets.map((p) => ({\r\n name: p.manifest.name,\r\n version: p.manifest.version,\r\n }));\r\n\r\n const existingMeta = MetadataWriter.read(workspaceRoot);\r\n const metadata = existingMeta\r\n ? MetadataWriter.mergePresets(existingMeta, presetMetas)\r\n : MetadataWriter.compose({\r\n kitVersion,\r\n repository: 'https://github.com/ihatesea69/kiro-kit.git',\r\n presets: presetMetas,\r\n });\r\n\r\n MetadataWriter.write(workspaceRoot, metadata);\r\n\r\n // 8. Write tracking file LAST\r\n let trackingData = TrackingStore.read(workspaceRoot) ?? TrackingStore.createInitial(kitVersion);\r\n\r\n for (const preset of presets) {\r\n const presetFiles = allTrackedFiles.filter(\r\n (f) => f.sourcePreset === preset.manifest.name,\r\n );\r\n const trackedPreset: TrackingStore.TrackedPreset = {\r\n name: preset.manifest.name,\r\n version: preset.manifest.version,\r\n installedAt: new Date().toISOString(),\r\n files: presetFiles,\r\n };\r\n trackingData = TrackingStore.upsertPreset(trackingData, trackedPreset);\r\n }\r\n\r\n trackingData.kitVersion = kitVersion;\r\n TrackingStore.write(workspaceRoot, trackingData);\r\n\r\n // 9. Print summary\r\n logger.success(\r\n `Done! ${filesWritten} files written, ${filesSkipped} skipped.`,\r\n );\r\n logger.info(\r\n `Presets installed: ${selectedNames.join(', ')}`,\r\n );\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { fileURLToPath } from 'node:url';\r\nimport { parse, validate, type Manifest } from './ManifestParser.js';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\n\r\nfunction getPresetsDir(): string {\r\n // Try a couple of candidate locations so the loader works whether the\r\n // bundle places presets next to index.js or one level up.\r\n const candidates = [\r\n path.resolve(__dirname, 'presets'), // dist/presets (current bundle)\r\n path.resolve(__dirname, '../presets'), // legacy layout\r\n path.resolve(__dirname, '../../../../presets'), // dev/source checkout\r\n ];\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate;\r\n }\r\n throw new KKError(\r\n ErrorCodes.PRESET_NOT_FOUND,\r\n 'Cannot locate presets directory.',\r\n 'Ensure kiro-kit is installed correctly.',\r\n );\r\n}\r\n\r\nexport interface LoadedPreset {\r\n manifest: Manifest;\r\n dir: string;\r\n}\r\n\r\n/**\r\n * Load a single preset by name.\r\n */\r\nexport function load(name: string): LoadedPreset {\r\n const presetsDir = getPresetsDir();\r\n const presetDir = path.join(presetsDir, name);\r\n\r\n if (!fs.existsSync(presetDir)) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_NOT_FOUND,\r\n `Preset \"${name}\" not found.`,\r\n `Available presets: ${listAvailable().join(', ')}`,\r\n );\r\n }\r\n\r\n const manifestPath = path.join(presetDir, 'manifest.json');\r\n if (!fs.existsSync(manifestPath)) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_LOAD_FAILED,\r\n `Preset \"${name}\" is missing manifest.json.`,\r\n );\r\n }\r\n\r\n const raw = fs.readFileSync(manifestPath, 'utf-8');\r\n const result = parse(raw);\r\n\r\n if (!result.ok) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_LOAD_FAILED,\r\n `Preset \"${name}\" manifest parse error: ${result.error.message}`,\r\n );\r\n }\r\n\r\n return { manifest: result.value, dir: presetDir };\r\n}\r\n\r\n/**\r\n * Load multiple presets by name.\r\n */\r\nexport function loadAll(names: string[]): LoadedPreset[] {\r\n return names.map((n) => load(n));\r\n}\r\n\r\n/**\r\n * List all available preset names from the presets directory.\r\n */\r\nexport function listAvailable(): string[] {\r\n const presetsDir = getPresetsDir();\r\n try {\r\n return fs\r\n .readdirSync(presetsDir, { withFileTypes: true })\r\n .filter((d) => d.isDirectory())\r\n .filter((d) => !d.name.startsWith('_'))\r\n .filter((d) =>\r\n fs.existsSync(path.join(presetsDir, d.name, 'manifest.json')),\r\n )\r\n .map((d) => d.name);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n","import { z } from 'zod';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst ArtifactTypeSchema = z.enum([\r\n 'steering', 'hook', 'mcp', 'skill', 'agent',\r\n 'command', 'workflow', 'statusline', 'metadata',\r\n 'settings', 'env', 'spec', 'docs', 'doc', 'config', 'other',\r\n]);\r\n\r\nconst PresetNameSchema = z.enum([\r\n 'frontend', 'backend', 'fullstack', 'mobile', 'devops', 'data-ai',\r\n]);\r\n\r\nconst FileEntrySchema = z.object({\r\n source: z.string().min(1),\r\n target: z.string().min(1),\r\n type: ArtifactTypeSchema,\r\n executable: z.boolean().optional(),\r\n});\r\n\r\nconst MCPServerDefSchema = z.object({\r\n command: z.string().min(1),\r\n args: z.array(z.string()).optional(),\r\n env: z.record(z.string()).optional(),\r\n});\r\n\r\nconst HookEntrySchema = z.union([\r\n z.object({\r\n matcher: z.string().optional(),\r\n command: z.string().min(1),\r\n }),\r\n z.string().min(1),\r\n]);\r\n\r\nconst ManifestSchema = z.object({\r\n name: z.string().min(1),\r\n version: z.string().min(1),\r\n description: z.string().min(1),\r\n category: PresetNameSchema,\r\n files: z.array(FileEntrySchema).min(1),\r\n dependencies: z.array(PresetNameSchema).optional(),\r\n mcpServers: z.record(MCPServerDefSchema).optional(),\r\n hooks: z.object({\r\n PreToolUse: z.array(HookEntrySchema).optional(),\r\n PostToolUse: z.array(HookEntrySchema).optional(),\r\n agentStop: z.array(HookEntrySchema).optional(),\r\n fileEdited: z.array(HookEntrySchema).optional(),\r\n }).optional(),\r\n tags: z.array(z.string()).optional(),\r\n minCounts: z.object({\r\n agents: z.number().int().nonnegative().optional(),\r\n skills: z.number().int().nonnegative().optional(),\r\n commands: z.number().int().nonnegative().optional(),\r\n hooks: z.number().int().nonnegative().optional(),\r\n workflows: z.number().int().nonnegative().optional(),\r\n }).optional(),\r\n});\r\n\r\nexport type Manifest = z.infer<typeof ManifestSchema>;\r\nexport type FileEntry = z.infer<typeof FileEntrySchema>;\r\nexport type ArtifactType = z.infer<typeof ArtifactTypeSchema>;\r\n\r\nexport interface ManifestError {\r\n code: string;\r\n message: string;\r\n}\r\n\r\nexport type Result<T, E> =\r\n | { ok: true; value: T }\r\n | { ok: false; error: E };\r\n\r\n/**\r\n * Parse raw JSON string into a validated Manifest.\r\n */\r\nexport function parse(json: string): Result<Manifest, ManifestError> {\r\n let raw: unknown;\r\n try {\r\n raw = JSON.parse(json);\r\n } catch {\r\n return {\r\n ok: false,\r\n error: {\r\n code: ErrorCodes.MANIFEST_INVALID,\r\n message: 'Manifest is not valid JSON.',\r\n },\r\n };\r\n }\r\n\r\n const result = ManifestSchema.safeParse(raw);\r\n if (!result.success) {\r\n const issues = result.error.issues\r\n .map((i) => `${i.path.join('.')}: ${i.message}`)\r\n .join('; ');\r\n return {\r\n ok: false,\r\n error: {\r\n code: ErrorCodes.MANIFEST_MISSING_FIELD,\r\n message: `Manifest schema validation failed: ${issues}`,\r\n },\r\n };\r\n }\r\n\r\n return { ok: true, value: result.data };\r\n}\r\n\r\n/**\r\n * Pretty-print a Manifest object as JSON (2-space indent).\r\n */\r\nexport function print(m: Manifest): string {\r\n return JSON.stringify(m, null, 2);\r\n}\r\n\r\n/**\r\n * Validate a parsed Manifest against its preset directory on disk.\r\n * Checks:\r\n * 1. File completeness: every file in manifest.files exists at presetDir/source\r\n * 2. No-orphan: every file in presetDir (except manifest.json, README.md) is declared in manifest.files\r\n */\r\nexport function validate(m: Manifest, presetDir: string): Result<void, ManifestError[]> {\r\n const errors: ManifestError[] = [];\r\n\r\n // 1. File completeness check\r\n for (const entry of m.files) {\r\n const fullPath = path.join(presetDir, entry.source);\r\n if (!fs.existsSync(fullPath)) {\r\n errors.push({\r\n code: ErrorCodes.MANIFEST_INCOMPLETE,\r\n message: `File declared in manifest not found on disk: ${entry.source}`,\r\n });\r\n }\r\n }\r\n\r\n // 2. No-orphan check\r\n const declaredSources = new Set(m.files.map((f) => f.source));\r\n const ignoredFiles = new Set(['manifest.json', 'README.md']);\r\n\r\n const walkDir = (dir: string, prefix: string): void => {\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n for (const entry of entries) {\r\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n walkDir(path.join(dir, entry.name), rel);\r\n } else if (entry.isFile()) {\r\n if (!ignoredFiles.has(rel) && !declaredSources.has(rel)) {\r\n errors.push({\r\n code: ErrorCodes.MANIFEST_ORPHAN_FILE,\r\n message: `File on disk not declared in manifest (orphan): ${rel}`,\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n walkDir(presetDir, '');\r\n\r\n if (errors.length > 0) {\r\n return { ok: false, error: errors };\r\n }\r\n return { ok: true, value: undefined };\r\n}\r\n","/**\r\n * Structured error class for kiro-kit CLI.\r\n * Each error carries a unique code (KK001-KK091), a human-readable message,\r\n * and an optional suggestion for resolution.\r\n */\r\nexport class KKError extends Error {\r\n readonly code: string;\r\n readonly suggestion?: string;\r\n\r\n constructor(code: string, message: string, suggestion?: string) {\r\n super(message);\r\n this.name = 'KKError';\r\n this.code = code;\r\n this.suggestion = suggestion;\r\n Object.setPrototypeOf(this, KKError.prototype);\r\n }\r\n\r\n format(): string {\r\n let output = `[${this.code}] ${this.message}`;\r\n if (this.suggestion) {\r\n output += `\\n Suggestion: ${this.suggestion}`;\r\n }\r\n return output;\r\n }\r\n}\r\n\r\n// Common error codes\r\nexport const ErrorCodes = {\r\n NODE_VERSION: 'KK001',\r\n MANIFEST_INVALID: 'KK010',\r\n MANIFEST_MISSING_FIELD: 'KK011',\r\n MANIFEST_ORPHAN_FILE: 'KK012',\r\n MANIFEST_INCOMPLETE: 'KK013',\r\n PRESET_NOT_FOUND: 'KK020',\r\n PRESET_LOAD_FAILED: 'KK021',\r\n CONFLICT_UNRESOLVED: 'KK030',\r\n TRACKING_CORRUPT: 'KK040',\r\n TRACKING_WRITE_FAILED: 'KK041',\r\n BACKUP_NOT_FOUND: 'KK050',\r\n BACKUP_WRITE_FAILED: 'KK051',\r\n MCP_MERGE_CONFLICT: 'KK060',\r\n MCP_INVALID_JSON: 'KK061',\r\n SETTINGS_MERGE_WARN: 'KK070',\r\n FRONTMATTER_INVALID: 'KK080',\r\n FRONTMATTER_MISSING: 'KK081',\r\n DOCTOR_FAIL: 'KK090',\r\n DOCTOR_WARN: 'KK091',\r\n} as const;\r\n","import fs from 'node:fs';\r\nimport crypto from 'node:crypto';\r\n\r\nexport type ConflictAction =\r\n | 'WRITE_NEW'\r\n | 'OVERWRITE_WITH_BACKUP'\r\n | 'SKIP'\r\n | 'NO_OP';\r\n\r\nexport type ConflictMode = 'interactive' | 'force' | 'skip-existing';\r\n\r\nexport interface SessionState {\r\n overwriteAll: boolean;\r\n}\r\n\r\nexport interface ConflictPromptFn {\r\n (target: string): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'>;\r\n}\r\n\r\nexport interface DiffViewerFn {\r\n (target: string, sourceContent: Buffer): void;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\n/**\r\n * Resolve file conflict based on mode and session state.\r\n */\r\nexport async function resolve(opts: {\r\n target: string;\r\n sourceContent: Buffer;\r\n mode: ConflictMode;\r\n sessionState: SessionState;\r\n prompt?: ConflictPromptFn;\r\n showDiff?: DiffViewerFn;\r\n}): Promise<ConflictAction> {\r\n const { target, sourceContent, mode, sessionState, prompt, showDiff } = opts;\r\n\r\n // File doesn't exist yet - write new\r\n if (!fs.existsSync(target)) {\r\n return 'WRITE_NEW';\r\n }\r\n\r\n // Compare hashes\r\n const currentContent = fs.readFileSync(target);\r\n const currentHash = sha256(currentContent);\r\n const newHash = sha256(sourceContent);\r\n\r\n // Byte-equal - no operation needed\r\n if (currentHash === newHash) {\r\n return 'NO_OP';\r\n }\r\n\r\n // Force mode - always overwrite with backup\r\n if (mode === 'force') {\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n\r\n // Skip-existing mode - never overwrite\r\n if (mode === 'skip-existing') {\r\n return 'SKIP';\r\n }\r\n\r\n // Session overwrite-all already set\r\n if (sessionState.overwriteAll) {\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n\r\n // Interactive mode - prompt user\r\n if (!prompt) {\r\n // No prompt function provided, default to skip\r\n return 'SKIP';\r\n }\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const choice = await prompt(target);\r\n\r\n switch (choice) {\r\n case 'view-diff':\r\n if (showDiff) {\r\n showDiff(target, sourceContent);\r\n }\r\n continue;\r\n case 'overwrite':\r\n return 'OVERWRITE_WITH_BACKUP';\r\n case 'skip':\r\n return 'SKIP';\r\n case 'overwrite-all':\r\n sessionState.overwriteAll = true;\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst BACKUP_DIR = '.kiro/.backup';\r\n\r\n/**\r\n * Generate timestamp string: YYYYMMDD-HHmmss-mmm\r\n */\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\n/**\r\n * Backup a file to .kiro/.backup/<timestamp>/<relative-path>\r\n */\r\nexport function backup(\r\n workspaceRoot: string,\r\n target: string,\r\n timestamp?: string,\r\n): string {\r\n const ts = timestamp ?? generateTimestamp();\r\n const relPath = path.relative(workspaceRoot, target);\r\n const backupPath = path.join(workspaceRoot, BACKUP_DIR, ts, relPath);\r\n const backupDir = path.dirname(backupPath);\r\n\r\n fs.mkdirSync(backupDir, { recursive: true });\r\n fs.copyFileSync(target, backupPath);\r\n\r\n return ts;\r\n}\r\n\r\n/**\r\n * Restore files from a backup timestamp.\r\n * If no timestamp given, uses the most recent backup.\r\n * Returns list of restored file paths.\r\n */\r\nexport function restore(\r\n workspaceRoot: string,\r\n timestamp?: string,\r\n): string[] {\r\n const ts = timestamp ?? getLatestTimestamp(workspaceRoot);\r\n\r\n if (!ts) {\r\n throw new KKError(\r\n ErrorCodes.BACKUP_NOT_FOUND,\r\n 'No backup found.',\r\n 'Run kiro-kit init or add first to create backups.',\r\n );\r\n }\r\n\r\n const backupRoot = path.join(workspaceRoot, BACKUP_DIR, ts);\r\n if (!fs.existsSync(backupRoot)) {\r\n throw new KKError(\r\n ErrorCodes.BACKUP_NOT_FOUND,\r\n `Backup timestamp \"${ts}\" not found.`,\r\n `Available: ${listTimestamps(workspaceRoot).join(', ') || 'none'}`,\r\n );\r\n }\r\n\r\n const restored: string[] = [];\r\n\r\n const walkAndRestore = (dir: string, relPrefix: string): void => {\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n const rel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n walkAndRestore(fullPath, rel);\r\n } else if (entry.isFile()) {\r\n const targetPath = path.join(workspaceRoot, rel);\r\n const targetDir = path.dirname(targetPath);\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n fs.copyFileSync(fullPath, targetPath);\r\n restored.push(rel);\r\n }\r\n }\r\n };\r\n\r\n walkAndRestore(backupRoot, '');\r\n return restored;\r\n}\r\n\r\n/**\r\n * List all backup timestamps sorted newest first.\r\n */\r\nexport function listTimestamps(workspaceRoot: string): string[] {\r\n const backupBase = path.join(workspaceRoot, BACKUP_DIR);\r\n if (!fs.existsSync(backupBase)) return [];\r\n\r\n try {\r\n return fs\r\n .readdirSync(backupBase, { withFileTypes: true })\r\n .filter((d) => d.isDirectory())\r\n .map((d) => d.name)\r\n .sort()\r\n .reverse();\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nfunction getLatestTimestamp(workspaceRoot: string): string | undefined {\r\n const timestamps = listTimestamps(workspaceRoot);\r\n return timestamps[0];\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\nimport { logger } from '../utils/logger.js';\r\n\r\nconst TRACKING_FILE = '.kiro/.kiro-kit.json';\r\n\r\nexport interface TrackedFile {\r\n target: string;\r\n sourcePreset: string;\r\n contentHash: string;\r\n installedAt: string;\r\n}\r\n\r\nexport interface TrackedPreset {\r\n name: string;\r\n version: string;\r\n installedAt: string;\r\n updatedAt?: string;\r\n files: TrackedFile[];\r\n}\r\n\r\nexport interface TrackingData {\r\n kitVersion: string;\r\n installedAt: string;\r\n updatedAt?: string;\r\n presets: TrackedPreset[];\r\n}\r\n\r\nfunction getTrackingPath(workspaceRoot: string): string {\r\n return path.join(workspaceRoot, TRACKING_FILE);\r\n}\r\n\r\n/**\r\n * Read tracking data from .kiro/.kiro-kit.json.\r\n * Returns null if file doesn't exist.\r\n * Throws KK040 if file is corrupt.\r\n */\r\nexport function read(workspaceRoot: string): TrackingData | null {\r\n const filePath = getTrackingPath(workspaceRoot);\r\n\r\n if (!fs.existsSync(filePath)) {\r\n return null;\r\n }\r\n\r\n const raw = fs.readFileSync(filePath, 'utf-8');\r\n try {\r\n return JSON.parse(raw) as TrackingData;\r\n } catch {\r\n logger.warn(`Tracking file is corrupt: ${filePath}`);\r\n throw new KKError(\r\n ErrorCodes.TRACKING_CORRUPT,\r\n 'Tracking file .kiro/.kiro-kit.json is corrupt (invalid JSON).',\r\n 'Delete the file and re-run kiro-kit init to regenerate.',\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Write tracking data to .kiro/.kiro-kit.json.\r\n * Creates directory if needed.\r\n */\r\nexport function write(workspaceRoot: string, data: TrackingData): void {\r\n const filePath = getTrackingPath(workspaceRoot);\r\n const dir = path.dirname(filePath);\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\n/**\r\n * Add or update a preset in tracking data.\r\n */\r\nexport function upsertPreset(\r\n data: TrackingData,\r\n preset: TrackedPreset,\r\n): TrackingData {\r\n const existing = data.presets.findIndex((p) => p.name === preset.name);\r\n if (existing >= 0) {\r\n data.presets[existing] = preset;\r\n } else {\r\n data.presets.push(preset);\r\n }\r\n data.updatedAt = new Date().toISOString();\r\n return data;\r\n}\r\n\r\n/**\r\n * Create initial tracking data.\r\n */\r\nexport function createInitial(kitVersion: string): TrackingData {\r\n return {\r\n kitVersion,\r\n installedAt: new Date().toISOString(),\r\n presets: [],\r\n };\r\n}\r\n\r\n/**\r\n * Get a preset from tracking data by name.\r\n */\r\nexport function getPreset(\r\n data: TrackingData,\r\n name: string,\r\n): TrackedPreset | undefined {\r\n return data.presets.find((p) => p.name === name);\r\n}\r\n","import process from 'node:process';\r\nimport { color } from './color.js';\r\n\r\nlet verboseEnabled = false;\r\nlet quietEnabled = false;\r\n\r\nexport function setVerbose(enabled: boolean): void {\r\n verboseEnabled = enabled;\r\n}\r\n\r\nexport function setQuiet(enabled: boolean): void {\r\n quietEnabled = enabled;\r\n}\r\n\r\nexport const logger = {\r\n info(msg: string): void {\r\n if (!quietEnabled) {\r\n process.stdout.write(`${msg}\\n`);\r\n }\r\n },\r\n\r\n success(msg: string): void {\r\n if (!quietEnabled) {\r\n process.stdout.write(`${color.green(msg)}\\n`);\r\n }\r\n },\r\n\r\n warn(msg: string): void {\r\n process.stderr.write(`${color.yellow('WARN')} ${msg}\\n`);\r\n },\r\n\r\n error(msg: string): void {\r\n process.stderr.write(`${color.red('ERROR')} ${msg}\\n`);\r\n },\r\n\r\n debug(msg: string): void {\r\n if (verboseEnabled) {\r\n process.stderr.write(`${color.dim('[debug]')} ${msg}\\n`);\r\n }\r\n },\r\n};\r\n","import pc from 'picocolors';\r\nimport process from 'node:process';\r\n\r\nconst isColorDisabled =\r\n !!process.env['NO_COLOR'] ||\r\n process.argv.includes('--no-color') ||\r\n !process.stdout.isTTY;\r\n\r\nfunction wrap(fn: (s: string) => string): (s: string) => string {\r\n return (s: string) => (isColorDisabled ? s : fn(s));\r\n}\r\n\r\nexport const color = {\r\n green: wrap(pc.green),\r\n red: wrap(pc.red),\r\n yellow: wrap(pc.yellow),\r\n blue: wrap(pc.blue),\r\n cyan: wrap(pc.cyan),\r\n gray: wrap(pc.gray),\r\n bold: wrap(pc.bold),\r\n dim: wrap(pc.dim),\r\n};\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\n\r\nconst METADATA_FILE = '.kiro/metadata.json';\r\n\r\nexport interface PresetMeta {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface Metadata {\r\n version: string;\r\n name: string;\r\n description: string;\r\n buildDate: string;\r\n repository: string;\r\n presets: PresetMeta[];\r\n installedAt: string;\r\n kitVersion: string;\r\n}\r\n\r\n/**\r\n * Compose metadata from installed presets and kit info.\r\n */\r\nexport function compose(opts: {\r\n kitVersion: string;\r\n repository: string;\r\n presets: PresetMeta[];\r\n}): Metadata {\r\n return {\r\n version: '1.0.0',\r\n name: 'kiro-kit',\r\n description: 'Kiro IDE workspace bootstrapped by kiro-kit.',\r\n buildDate: new Date().toISOString(),\r\n repository: opts.repository,\r\n presets: opts.presets,\r\n installedAt: new Date().toISOString(),\r\n kitVersion: opts.kitVersion,\r\n };\r\n}\r\n\r\n/**\r\n * Write metadata.json to workspace.\r\n * When installing multiple presets, merges preset list.\r\n */\r\nexport function write(workspaceRoot: string, metadata: Metadata): void {\r\n const filePath = path.join(workspaceRoot, METADATA_FILE);\r\n const dir = path.dirname(filePath);\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(filePath, JSON.stringify(metadata, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\n/**\r\n * Read existing metadata, or return null if not present.\r\n */\r\nexport function read(workspaceRoot: string): Metadata | null {\r\n const filePath = path.join(workspaceRoot, METADATA_FILE);\r\n if (!fs.existsSync(filePath)) return null;\r\n try {\r\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as Metadata;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Merge new presets into existing metadata (dedup by name).\r\n */\r\nexport function mergePresets(existing: Metadata, newPresets: PresetMeta[]): Metadata {\r\n const merged = [...existing.presets];\r\n for (const p of newPresets) {\r\n const idx = merged.findIndex((m) => m.name === p.name);\r\n if (idx >= 0) {\r\n merged[idx] = p;\r\n } else {\r\n merged.push(p);\r\n }\r\n }\r\n return { ...existing, presets: merged, buildDate: new Date().toISOString() };\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\n\r\nconst STATUSLINE_FILES = ['statusline.js', 'statusline.sh', 'statusline.ps1'];\r\n\r\n/**\r\n * Get the appropriate statusline command for the current platform.\r\n */\r\nexport function getCommand(): string {\r\n switch (process.platform) {\r\n case 'win32':\r\n return 'powershell -ExecutionPolicy Bypass -File .kiro/statusline.ps1';\r\n default:\r\n // macOS, Linux, etc.\r\n return 'node .kiro/statusline.js';\r\n }\r\n}\r\n\r\n/**\r\n * Install statusline triple (.js, .sh, .ps1) from preset to workspace.\r\n * Sets chmod +x on .sh for Unix platforms.\r\n */\r\nexport function install(\r\n presetDir: string,\r\n workspaceRoot: string,\r\n): string[] {\r\n const installed: string[] = [];\r\n const targetDir = path.join(workspaceRoot, '.kiro');\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n\r\n for (const file of STATUSLINE_FILES) {\r\n const source = path.join(presetDir, file);\r\n if (!fs.existsSync(source)) continue;\r\n\r\n const target = path.join(targetDir, file);\r\n fs.copyFileSync(source, target);\r\n installed.push(`.kiro/${file}`);\r\n\r\n // Set executable bit on Unix for .sh\r\n if (file.endsWith('.sh') && process.platform !== 'win32') {\r\n try {\r\n fs.chmodSync(target, 0o755);\r\n } catch {\r\n // Non-critical: skip if chmod fails\r\n }\r\n }\r\n }\r\n\r\n return installed;\r\n}\r\n\r\n/**\r\n * Resolve the statusLine.command field in settings based on platform.\r\n */\r\nexport function resolveSettingsCommand(settings: Record<string, unknown>): Record<string, unknown> {\r\n const statusLine = settings['statusLine'] as Record<string, unknown> | undefined;\r\n if (statusLine && statusLine['type'] === 'command') {\r\n statusLine['command'] = getCommand();\r\n }\r\n return settings;\r\n}\r\n","import { logger } from '../../utils/logger.js';\r\n\r\nexport interface MCPConfig {\r\n mcpServers: Record<string, MCPServerEntry>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface MCPServerEntry {\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n disabled?: boolean;\r\n autoApprove?: string[];\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Merge preset MCP servers into existing MCP config.\r\n * User-priority: existing servers are never overwritten or deleted.\r\n * Warns on cross-preset conflicts (same server name from different presets).\r\n */\r\nexport function mergeMCP(\r\n existing: MCPConfig | null,\r\n presetServers: Record<string, MCPServerEntry>,\r\n presetName?: string,\r\n): MCPConfig {\r\n const result: MCPConfig = existing\r\n ? structuredClone(existing)\r\n : { mcpServers: {} };\r\n\r\n if (!result.mcpServers) {\r\n result.mcpServers = {};\r\n }\r\n\r\n for (const [serverName, def] of Object.entries(presetServers)) {\r\n if (serverName in result.mcpServers) {\r\n logger.warn(\r\n `MCP server \"${serverName}\" already exists, keeping user definition.` +\r\n (presetName ? ` (from preset: ${presetName})` : ''),\r\n );\r\n continue;\r\n }\r\n result.mcpServers[serverName] = structuredClone(def);\r\n }\r\n\r\n return result;\r\n}\r\n","import { logger } from '../../utils/logger.js';\r\n\r\nexport interface HookRef {\r\n command: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface SettingsConfig {\r\n statusLine?: { type?: string; command?: string; [key: string]: unknown };\r\n hooks?: {\r\n PreToolUse?: HookRef[];\r\n PostToolUse?: HookRef[];\r\n agentStop?: HookRef[];\r\n [key: string]: unknown;\r\n };\r\n includeCoAuthoredBy?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Merge preset settings into existing settings.\r\n * - Array fields (hooks.PreToolUse, hooks.PostToolUse, etc.): concat-dedupe by `command`\r\n * - Non-array fields: last-write-wins with warning\r\n * - Preserves user-added fields not in preset\r\n */\r\nexport function mergeSettings(\r\n existing: SettingsConfig | null,\r\n preset: SettingsConfig,\r\n): SettingsConfig {\r\n const result: SettingsConfig = existing\r\n ? structuredClone(existing)\r\n : {};\r\n\r\n // Merge hooks arrays with dedup by command\r\n if (preset.hooks) {\r\n if (!result.hooks) result.hooks = {};\r\n\r\n for (const key of ['PreToolUse', 'PostToolUse', 'agentStop'] as const) {\r\n const presetArr = preset.hooks[key];\r\n if (!presetArr || presetArr.length === 0) continue;\r\n\r\n const existingArr: HookRef[] = (result.hooks[key] as HookRef[]) ?? [];\r\n const existingCommands = new Set(existingArr.map((h) => h.command));\r\n\r\n for (const hook of presetArr) {\r\n if (!existingCommands.has(hook.command)) {\r\n existingArr.push(structuredClone(hook));\r\n }\r\n }\r\n (result.hooks as Record<string, unknown>)[key] = existingArr;\r\n }\r\n }\r\n\r\n // Merge non-array scalar fields with last-write-wins + warning\r\n if (preset.statusLine !== undefined) {\r\n if (result.statusLine !== undefined) {\r\n logger.warn('statusLine already set in settings, overwriting with preset value.');\r\n }\r\n result.statusLine = structuredClone(preset.statusLine);\r\n }\r\n\r\n if (preset.includeCoAuthoredBy !== undefined) {\r\n if (result.includeCoAuthoredBy !== undefined && result.includeCoAuthoredBy !== preset.includeCoAuthoredBy) {\r\n logger.warn('includeCoAuthoredBy already set, overwriting with preset value.');\r\n }\r\n result.includeCoAuthoredBy = preset.includeCoAuthoredBy;\r\n }\r\n\r\n return result;\r\n}\r\n","import fs from 'node:fs';\r\nimport { createTwoFilesPatch } from 'diff';\r\nimport { color } from '../utils/color.js';\r\n\r\n/**\r\n * Print a unified diff between the existing file on disk and new source content.\r\n * Highlights additions in green and deletions in red (NO_COLOR aware).\r\n */\r\nexport function showDiff(target: string, sourceContent: Buffer): void {\r\n const existing = fs.existsSync(target)\r\n ? fs.readFileSync(target, 'utf-8')\r\n : '';\r\n const incoming = sourceContent.toString('utf-8');\r\n\r\n const patch = createTwoFilesPatch(\r\n `a/${target}`,\r\n `b/${target}`,\r\n existing,\r\n incoming,\r\n 'current',\r\n 'incoming',\r\n { context: 3 },\r\n );\r\n\r\n const lines = patch.split('\\n');\r\n for (const line of lines) {\r\n if (line.startsWith('+') && !line.startsWith('+++')) {\r\n process.stdout.write(color.green(line) + '\\n');\r\n } else if (line.startsWith('-') && !line.startsWith('---')) {\r\n process.stdout.write(color.red(line) + '\\n');\r\n } else if (line.startsWith('@@')) {\r\n process.stdout.write(color.cyan(line) + '\\n');\r\n } else {\r\n process.stdout.write(line + '\\n');\r\n }\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport crypto from 'node:crypto';\r\nimport os from 'node:os';\r\n\r\n/** Extensions that should always use LF line endings. */\r\nconst LF_EXTENSIONS = new Set(['.json', '.yaml', '.yml']);\r\n\r\n/**\r\n * Determine the appropriate line ending for a file based on extension.\r\n * - .json, .yaml, .yml -> LF\r\n * - Everything else -> OS default (CRLF on Windows, LF elsewhere)\r\n */\r\nfunction getLineEnding(filePath: string): string {\r\n const ext = path.extname(filePath).toLowerCase();\r\n if (LF_EXTENSIONS.has(ext)) return '\\n';\r\n return os.EOL;\r\n}\r\n\r\n/**\r\n * Normalize line endings in content based on target file extension.\r\n */\r\nfunction normalizeLineEndings(content: string, filePath: string): string {\r\n const eol = getLineEnding(filePath);\r\n // First normalize all to LF, then convert to target\r\n const normalized = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\r\n if (eol === '\\n') return normalized;\r\n return normalized.replace(/\\n/g, eol);\r\n}\r\n\r\n/**\r\n * Atomic write: writes to a temp file in the same directory, then renames.\r\n * This ensures the target file is never in a partial state.\r\n * Also normalizes line endings based on file extension.\r\n */\r\nexport function atomicWrite(target: string, content: string | Buffer): void {\r\n const dir = path.dirname(target);\r\n fs.mkdirSync(dir, { recursive: true });\r\n\r\n const rand = crypto.randomBytes(6).toString('hex');\r\n const tmpPath = path.join(dir, `.tmp.${rand}`);\r\n\r\n let data: Buffer;\r\n if (typeof content === 'string') {\r\n const normalized = normalizeLineEndings(content, target);\r\n data = Buffer.from(normalized, 'utf-8');\r\n } else {\r\n data = content;\r\n }\r\n\r\n try {\r\n fs.writeFileSync(tmpPath, data);\r\n fs.renameSync(tmpPath, target);\r\n } catch (err) {\r\n // Clean up temp file on failure\r\n try {\r\n fs.unlinkSync(tmpPath);\r\n } catch {\r\n // ignore cleanup errors\r\n }\r\n throw err;\r\n }\r\n}\r\n","import path from 'node:path';\r\n\r\n/**\r\n * Normalize a path to use forward slashes (for consistent cross-platform display).\r\n */\r\nexport function normalize(p: string): string {\r\n return p.split(path.sep).join('/');\r\n}\r\n\r\n/**\r\n * Get relative path from workspace root, normalized with forward slashes.\r\n */\r\nexport function relativeFromWorkspace(workspaceRoot: string, target: string): string {\r\n return normalize(path.relative(workspaceRoot, target));\r\n}\r\n\r\n/**\r\n * Check that a resolved path is safely inside the workspace root.\r\n * Prevents path traversal attacks (e.g., ../../etc/passwd).\r\n */\r\nexport function safePathInside(workspaceRoot: string, target: string): boolean {\r\n const resolved = path.resolve(workspaceRoot, target);\r\n const root = path.resolve(workspaceRoot);\r\n return resolved.startsWith(root + path.sep) || resolved === root;\r\n}\r\n\r\n/**\r\n * Join paths using OS-native separator.\r\n */\r\nexport function join(...segments: string[]): string {\r\n return path.join(...segments);\r\n}\r\n\r\n/**\r\n * Resolve to absolute path.\r\n */\r\nexport function resolve(...segments: string[]): string {\r\n return path.resolve(...segments);\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport * as MetadataWriter from '../core/MetadataWriter.js';\r\nimport * as StatuslineSelector from '../core/StatuslineSelector.js';\r\nimport { mergeMCP, type MCPConfig } from '../core/merge/mergeMCP.js';\r\nimport { mergeSettings, type SettingsConfig } from '../core/merge/mergeSettings.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface AddOptions {\r\n yes?: boolean;\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n color?: boolean;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const { default: readline } = await import('node:readline');\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} already exists with different content.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace existing file (backup will be saved)\\n` +\r\n ` skip - Keep existing file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace this and all remaining conflicting files\\n`,\r\n );\r\n\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip');\r\n });\r\n });\r\n}\r\n\r\nexport function registerAddCommand(program: Command): void {\r\n program\r\n .command('add <preset>')\r\n .description('Add a preset to existing workspace')\r\n .option('-y, --yes', 'Skip confirmation')\r\n .option('--force', 'Overwrite all files (with backup)')\r\n .option('--skip-existing', 'Skip all existing files')\r\n .option('--no-color', 'Disable ANSI colors')\r\n .action(async (presetName: string, opts: AddOptions) => {\r\n try {\r\n await runAdd(presetName, opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function runAdd(presetName: string, opts: AddOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n const available = listAvailable();\r\n\r\n // Validate preset name\r\n if (!available.includes(presetName)) {\r\n logger.error(\r\n `Preset \"${presetName}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Auto-init: create .kiro/ if it doesn't exist\r\n const kiroDir = path.join(workspaceRoot, '.kiro');\r\n if (!fs.existsSync(kiroDir)) {\r\n fs.mkdirSync(kiroDir, { recursive: true });\r\n logger.info('Created .kiro/ directory.');\r\n }\r\n\r\n // Load preset\r\n const preset = load(presetName);\r\n\r\n // Determine conflict mode\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n const allTrackedFiles: TrackingStore.TrackedFile[] = [];\r\n let filesWritten = 0;\r\n let filesSkipped = 0;\r\n\r\n const { manifest, dir: presetDir } = preset;\r\n\r\n // Separate files by type\r\n const regularFiles = manifest.files.filter(\r\n (f) => !['mcp', 'settings', 'statusline'].includes(f.type),\r\n );\r\n const statuslineFiles = manifest.files.filter((f) => f.type === 'statusline');\r\n\r\n // Process regular files\r\n for (const fileEntry of regularFiles) {\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) {\r\n logger.warn(`Skipping unsafe path: ${fileEntry.target}`);\r\n filesSkipped++;\r\n continue;\r\n }\r\n\r\n if (!fs.existsSync(sourcePath)) {\r\n logger.debug(`Source file missing: ${sourcePath}`);\r\n continue;\r\n }\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'SKIP':\r\n filesSkipped++;\r\n break;\r\n case 'NO_OP':\r\n break;\r\n }\r\n\r\n if (action !== 'SKIP') {\r\n allTrackedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: manifest.name,\r\n contentHash: sha256(sourceContent),\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process statusline files\r\n if (statuslineFiles.length > 0) {\r\n const installed = StatuslineSelector.install(presetDir, workspaceRoot);\r\n filesWritten += installed.length;\r\n for (const f of installed) {\r\n allTrackedFiles.push({\r\n target: f,\r\n sourcePreset: manifest.name,\r\n contentHash: '',\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process MCP merge\r\n if (manifest.mcpServers) {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n let existingMcp: MCPConfig | null = null;\r\n if (fs.existsSync(mcpPath)) {\r\n try {\r\n existingMcp = JSON.parse(fs.readFileSync(mcpPath, 'utf-8')) as MCPConfig;\r\n } catch { existingMcp = null; }\r\n }\r\n const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);\r\n fs.mkdirSync(path.dirname(mcpPath), { recursive: true });\r\n atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Process settings merge\r\n const presetSettingsPath = path.join(presetDir, 'settings.json');\r\n if (fs.existsSync(presetSettingsPath)) {\r\n const settingsPath = path.join(workspaceRoot, '.kiro/settings.json');\r\n let existingSettings: SettingsConfig | null = null;\r\n if (fs.existsSync(settingsPath)) {\r\n try {\r\n existingSettings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as SettingsConfig;\r\n } catch { existingSettings = null; }\r\n }\r\n const presetSettings = JSON.parse(fs.readFileSync(presetSettingsPath, 'utf-8')) as SettingsConfig;\r\n const resolvedSettings = StatuslineSelector.resolveSettingsCommand(\r\n presetSettings as Record<string, unknown>,\r\n ) as SettingsConfig;\r\n const merged = mergeSettings(existingSettings, resolvedSettings);\r\n fs.mkdirSync(path.dirname(settingsPath), { recursive: true });\r\n atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Write metadata\r\n const kitVersion = getKitVersion();\r\n const presetMeta = { name: manifest.name, version: manifest.version };\r\n const existingMeta = MetadataWriter.read(workspaceRoot);\r\n const metadata = existingMeta\r\n ? MetadataWriter.mergePresets(existingMeta, [presetMeta])\r\n : MetadataWriter.compose({ kitVersion, repository: 'https://github.com/ihatesea69/kiro-kit.git', presets: [presetMeta] });\r\n MetadataWriter.write(workspaceRoot, metadata);\r\n\r\n // Write tracking file LAST\r\n let trackingData = TrackingStore.read(workspaceRoot) ?? TrackingStore.createInitial(kitVersion);\r\n const trackedPreset: TrackingStore.TrackedPreset = {\r\n name: manifest.name,\r\n version: manifest.version,\r\n installedAt: new Date().toISOString(),\r\n files: allTrackedFiles,\r\n };\r\n trackingData = TrackingStore.upsertPreset(trackingData, trackedPreset);\r\n trackingData.kitVersion = kitVersion;\r\n TrackingStore.write(workspaceRoot, trackingData);\r\n\r\n // Summary\r\n logger.success(`Done! ${filesWritten} files written, ${filesSkipped} skipped.`);\r\n logger.info(`Preset added: ${presetName}`);\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface ListOptions {\r\n json?: boolean;\r\n}\r\n\r\ninterface PresetSummary {\r\n name: string;\r\n description: string;\r\n agents: number;\r\n skills: number;\r\n commands: number;\r\n hooks: number;\r\n workflows: number;\r\n mcp: number;\r\n}\r\n\r\nfunction countArtifacts(files: Array<{ type: string }>): Record<string, number> {\r\n const counts: Record<string, number> = {\r\n agent: 0,\r\n skill: 0,\r\n command: 0,\r\n hook: 0,\r\n workflow: 0,\r\n mcp: 0,\r\n };\r\n for (const f of files) {\r\n if (f.type in counts) {\r\n counts[f.type]++;\r\n }\r\n }\r\n return counts;\r\n}\r\n\r\nexport function registerListCommand(program: Command): void {\r\n program\r\n .command('list')\r\n .description('List available presets')\r\n .option('--json', 'Output as JSON')\r\n .action((opts: ListOptions) => {\r\n try {\r\n runList(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runList(opts: ListOptions): void {\r\n const available = listAvailable();\r\n const summaries: PresetSummary[] = [];\r\n\r\n for (const name of available) {\r\n try {\r\n const preset = load(name);\r\n const counts = countArtifacts(preset.manifest.files);\r\n summaries.push({\r\n name,\r\n description: preset.manifest.description,\r\n agents: counts['agent'],\r\n skills: counts['skill'],\r\n commands: counts['command'],\r\n hooks: counts['hook'],\r\n workflows: counts['workflow'],\r\n mcp: Object.keys(preset.manifest.mcpServers ?? {}).length,\r\n });\r\n } catch {\r\n summaries.push({\r\n name,\r\n description: '(failed to load)',\r\n agents: 0,\r\n skills: 0,\r\n commands: 0,\r\n hooks: 0,\r\n workflows: 0,\r\n mcp: 0,\r\n });\r\n }\r\n }\r\n\r\n if (opts.json) {\r\n process.stdout.write(JSON.stringify(summaries, null, 2) + '\\n');\r\n return;\r\n }\r\n\r\n // Text output\r\n for (const s of summaries) {\r\n const nameStr = color.bold(s.name.padEnd(12));\r\n const descStr = color.dim(`- ${s.description}`);\r\n process.stdout.write(` ${nameStr} ${descStr}\\n`);\r\n const counts = `${s.agents} agents, ${s.skills} skills, ${s.commands} commands, ${s.hooks} hooks, ${s.workflows} workflows, ${s.mcp} MCP servers`;\r\n process.stdout.write(`${''.padEnd(14)} ${color.gray(counts)}\\n`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface InfoOptions {\r\n json?: boolean;\r\n}\r\n\r\ninterface PresetInfo {\r\n name: string;\r\n version: string;\r\n description: string;\r\n category: string;\r\n files: Array<{ source: string; target: string; type: string }>;\r\n mcpServers: string[];\r\n hooks: string[];\r\n agents: string[];\r\n skills: string[];\r\n commands: string[];\r\n workflows: string[];\r\n}\r\n\r\nexport function registerInfoCommand(program: Command): void {\r\n program\r\n .command('info <preset>')\r\n .description('Show detailed preset information')\r\n .option('--json', 'Output as JSON')\r\n .action((presetName: string, opts: InfoOptions) => {\r\n try {\r\n runInfo(presetName, opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runInfo(presetName: string, opts: InfoOptions): void {\r\n const available = listAvailable();\r\n\r\n if (!available.includes(presetName)) {\r\n logger.error(\r\n `Preset \"${presetName}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const preset = load(presetName);\r\n const { manifest } = preset;\r\n\r\n const agents = manifest.files.filter((f) => f.type === 'agent').map((f) => f.source);\r\n const skills = manifest.files.filter((f) => f.type === 'skill').map((f) => f.source);\r\n const commands = manifest.files.filter((f) => f.type === 'command').map((f) => f.source);\r\n const workflows = manifest.files.filter((f) => f.type === 'workflow').map((f) => f.source);\r\n const hooks = manifest.files.filter((f) => f.type === 'hook').map((f) => f.source);\r\n const mcpServers = Object.keys(manifest.mcpServers ?? {});\r\n\r\n const info: PresetInfo = {\r\n name: manifest.name,\r\n version: manifest.version,\r\n description: manifest.description,\r\n category: manifest.category,\r\n files: manifest.files.map((f) => ({ source: f.source, target: f.target, type: f.type })),\r\n mcpServers,\r\n hooks,\r\n agents,\r\n skills,\r\n commands,\r\n workflows,\r\n };\r\n\r\n if (opts.json) {\r\n process.stdout.write(JSON.stringify(info, null, 2) + '\\n');\r\n return;\r\n }\r\n\r\n // Text output\r\n process.stdout.write(`\\n${color.bold(manifest.name)} v${manifest.version}\\n`);\r\n process.stdout.write(`${manifest.description}\\n\\n`);\r\n process.stdout.write(`${color.dim('Category:')} ${manifest.category}\\n`);\r\n process.stdout.write(`${color.dim('Total files:')} ${manifest.files.length}\\n\\n`);\r\n\r\n if (mcpServers.length > 0) {\r\n process.stdout.write(`${color.bold('MCP Servers')} (${mcpServers.length}):\\n`);\r\n for (const s of mcpServers) {\r\n process.stdout.write(` - ${s}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (agents.length > 0) {\r\n process.stdout.write(`${color.bold('Agents')} (${agents.length}):\\n`);\r\n for (const a of agents) {\r\n process.stdout.write(` - ${a}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (skills.length > 0) {\r\n process.stdout.write(`${color.bold('Skills')} (${skills.length}):\\n`);\r\n for (const s of skills) {\r\n process.stdout.write(` - ${s}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (commands.length > 0) {\r\n process.stdout.write(`${color.bold('Commands')} (${commands.length}):\\n`);\r\n for (const c of commands) {\r\n process.stdout.write(` - ${c}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (workflows.length > 0) {\r\n process.stdout.write(`${color.bold('Workflows')} (${workflows.length}):\\n`);\r\n for (const w of workflows) {\r\n process.stdout.write(` - ${w}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (hooks.length > 0) {\r\n process.stdout.write(`${color.bold('Hooks')} (${hooks.length}):\\n`);\r\n for (const h of hooks) {\r\n process.stdout.write(` - ${h}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n // File list with targets\r\n process.stdout.write(`${color.bold('File Targets')}:\\n`);\r\n for (const f of manifest.files) {\r\n process.stdout.write(` ${color.dim(f.type.padEnd(12))} ${f.target}\\n`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface UpdateOptions {\r\n yes?: boolean;\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const { default: readline } = await import('node:readline');\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} has changed in the new version.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace with new version (backup saved)\\n` +\r\n ` skip - Keep current file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace all remaining changed files\\n`,\r\n );\r\n\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip');\r\n });\r\n });\r\n}\r\n\r\nexport function registerUpdateCommand(program: Command): void {\r\n program\r\n .command('update')\r\n .description('Update installed presets to latest bundled version')\r\n .option('-y, --yes', 'Skip confirmation, auto-skip conflicts')\r\n .option('--force', 'Overwrite all changed files (with backup)')\r\n .option('--skip-existing', 'Skip all changed files')\r\n .action(async (opts: UpdateOptions) => {\r\n try {\r\n await runUpdate(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function runUpdate(opts: UpdateOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n\r\n // Read tracking\r\n const tracking = TrackingStore.read(workspaceRoot);\r\n if (!tracking || tracking.presets.length === 0) {\r\n logger.info('No presets installed. Nothing to update.');\r\n process.exit(0);\r\n }\r\n\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n let totalUpdated = 0;\r\n let totalSkipped = 0;\r\n\r\n for (const trackedPreset of tracking.presets) {\r\n let bundled;\r\n try {\r\n bundled = load(trackedPreset.name);\r\n } catch {\r\n logger.warn(`Preset \"${trackedPreset.name}\" not found in bundled presets. Skipping.`);\r\n continue;\r\n }\r\n\r\n const bundledVersion = bundled.manifest.version;\r\n if (bundledVersion === trackedPreset.version) {\r\n logger.debug(`Preset \"${trackedPreset.name}\" is up to date (v${bundledVersion}).`);\r\n continue;\r\n }\r\n\r\n logger.info(\r\n `Updating ${color.bold(trackedPreset.name)}: v${trackedPreset.version} -> v${bundledVersion}`,\r\n );\r\n\r\n // Find changed files by comparing content hashes\r\n const presetDir = bundled.dir;\r\n const updatedFiles: TrackingStore.TrackedFile[] = [];\r\n\r\n for (const fileEntry of bundled.manifest.files) {\r\n if (['mcp', 'settings', 'statusline'].includes(fileEntry.type)) continue;\r\n\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) continue;\r\n if (!fs.existsSync(sourcePath)) continue;\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n const newHash = sha256(sourceContent);\r\n\r\n // Check if file changed from what we installed\r\n const trackedFile = trackedPreset.files.find((f) => f.target === fileEntry.target);\r\n if (trackedFile && trackedFile.contentHash === newHash) {\r\n // Bundled file hasn't changed since last install\r\n continue;\r\n }\r\n\r\n // File has changed in the new version - resolve conflict\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* */ }\r\n }\r\n totalUpdated++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* */ }\r\n }\r\n totalUpdated++;\r\n break;\r\n case 'SKIP':\r\n totalSkipped++;\r\n break;\r\n case 'NO_OP':\r\n break;\r\n }\r\n\r\n updatedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: bundled.manifest.name,\r\n contentHash: newHash,\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n // Bump version in tracking\r\n trackedPreset.version = bundledVersion;\r\n trackedPreset.updatedAt = new Date().toISOString();\r\n // Update file hashes for changed files\r\n for (const uf of updatedFiles) {\r\n const idx = trackedPreset.files.findIndex((f) => f.target === uf.target);\r\n if (idx >= 0) {\r\n trackedPreset.files[idx] = uf;\r\n } else {\r\n trackedPreset.files.push(uf);\r\n }\r\n }\r\n }\r\n\r\n // Write updated tracking\r\n tracking.kitVersion = getKitVersion();\r\n tracking.updatedAt = new Date().toISOString();\r\n TrackingStore.write(workspaceRoot, tracking);\r\n\r\n if (totalUpdated === 0 && totalSkipped === 0) {\r\n logger.success('All presets are up to date.');\r\n } else {\r\n logger.success(`Update complete: ${totalUpdated} files updated, ${totalSkipped} skipped.`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { restore, listTimestamps } from '../core/BackupManager.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface RestoreOptions {\r\n timestamp?: string;\r\n list?: boolean;\r\n}\r\n\r\nexport function registerRestoreCommand(program: Command): void {\r\n program\r\n .command('restore')\r\n .description('Restore files from backup')\r\n .option('--timestamp <ts>', 'Restore from specific backup timestamp')\r\n .option('--list', 'List available backup timestamps')\r\n .action((opts: RestoreOptions) => {\r\n try {\r\n runRestore(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runRestore(opts: RestoreOptions): void {\r\n const workspaceRoot = process.cwd();\r\n\r\n // --list flag: print available timestamps and exit\r\n if (opts.list) {\r\n const timestamps = listTimestamps(workspaceRoot);\r\n if (timestamps.length === 0) {\r\n logger.info('No backups available.');\r\n process.exit(0);\r\n }\r\n process.stdout.write(`${color.bold('Available backups')}:\\n`);\r\n for (const ts of timestamps) {\r\n process.stdout.write(` ${ts}\\n`);\r\n }\r\n process.exit(0);\r\n }\r\n\r\n // Check if any backups exist\r\n const timestamps = listTimestamps(workspaceRoot);\r\n if (timestamps.length === 0) {\r\n logger.error('No backups found. Nothing to restore.');\r\n process.exit(1);\r\n }\r\n\r\n // Restore from specified timestamp or latest\r\n const restored = restore(workspaceRoot, opts.timestamp);\r\n\r\n if (restored.length === 0) {\r\n logger.info('No files to restore from backup.');\r\n process.exit(0);\r\n }\r\n\r\n process.stdout.write(`${color.bold('Restored files')}:\\n`);\r\n for (const file of restored) {\r\n process.stdout.write(` ${color.green('+')} ${file}\\n`);\r\n }\r\n logger.success(`Restored ${restored.length} files.`);\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\n\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface DoctorOptions {\r\n fix?: boolean;\r\n}\r\n\r\ntype CheckResult = 'PASS' | 'FAIL' | 'WARN';\r\n\r\ninterface CheckReport {\r\n name: string;\r\n result: CheckResult;\r\n message: string;\r\n fixable?: boolean;\r\n fixAction?: () => void;\r\n}\r\n\r\nexport function registerDoctorCommand(program: Command): void {\r\n program\r\n .command('doctor')\r\n .description('Run workspace health checks')\r\n .option('--fix', 'Auto-fix fixable issues')\r\n .action((opts: DoctorOptions) => {\r\n try {\r\n runDoctor(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runDoctor(opts: DoctorOptions): void {\r\n const workspaceRoot = process.cwd();\r\n const checks: CheckReport[] = [];\r\n\r\n // (a) Node >= 18\r\n checks.push(checkNodeVersion());\r\n\r\n // (b) .kiro/ exists\r\n checks.push(checkKiroDir(workspaceRoot));\r\n\r\n // (c) mcp.json valid\r\n checks.push(checkMcpJson(workspaceRoot));\r\n\r\n // (d) tracking valid\r\n checks.push(checkTracking(workspaceRoot));\r\n\r\n // (e) tracked files exist\r\n checks.push(checkTrackedFiles(workspaceRoot));\r\n\r\n // (f) no trailing whitespace in steering front-matter\r\n checks.push(checkSteeringFrontMatter(workspaceRoot));\r\n\r\n // (g) metadata.json valid\r\n checks.push(checkMetadataJson(workspaceRoot));\r\n\r\n // (h) statusline exec bit (Unix)\r\n checks.push(checkStatuslineExecBit(workspaceRoot));\r\n\r\n // Print results\r\n let hasFail = false;\r\n for (const check of checks) {\r\n const tag = formatTag(check.result);\r\n process.stdout.write(`${tag} ${check.message}\\n`);\r\n\r\n if (check.result === 'FAIL') hasFail = true;\r\n\r\n // Apply fix if --fix and fixable\r\n if (opts.fix && check.fixable && check.fixAction) {\r\n check.fixAction();\r\n process.stdout.write(` ${color.green('Fixed!')}\\n`);\r\n }\r\n }\r\n\r\n process.exit(hasFail ? 1 : 0);\r\n}\r\n\r\nfunction formatTag(result: CheckResult): string {\r\n switch (result) {\r\n case 'PASS': return color.green('[PASS]');\r\n case 'FAIL': return color.red('[FAIL]');\r\n case 'WARN': return color.yellow('[WARN]');\r\n }\r\n}\r\n\r\nfunction checkNodeVersion(): CheckReport {\r\n const major = parseInt(process.versions.node.split('.')[0], 10);\r\n if (major >= 18) {\r\n return {\r\n name: 'node-version',\r\n result: 'PASS',\r\n message: `Node.js version >= 18 (${process.version})`,\r\n };\r\n }\r\n return {\r\n name: 'node-version',\r\n result: 'FAIL',\r\n message: `Node.js version >= 18 required (current: ${process.version})`,\r\n };\r\n}\r\n\r\nfunction checkKiroDir(workspaceRoot: string): CheckReport {\r\n const kiroDir = path.join(workspaceRoot, '.kiro');\r\n if (fs.existsSync(kiroDir) && fs.statSync(kiroDir).isDirectory()) {\r\n return { name: 'kiro-dir', result: 'PASS', message: '.kiro/ directory exists' };\r\n }\r\n return {\r\n name: 'kiro-dir',\r\n result: 'FAIL',\r\n message: '.kiro/ directory not found. Run `kiro-kit init` to create it.',\r\n };\r\n}\r\n\r\nfunction checkMcpJson(workspaceRoot: string): CheckReport {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n if (!fs.existsSync(mcpPath)) {\r\n return { name: 'mcp-json', result: 'WARN', message: '.kiro/settings/mcp.json not found (optional)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(mcpPath, 'utf-8');\r\n JSON.parse(content);\r\n return { name: 'mcp-json', result: 'PASS', message: '.kiro/settings/mcp.json is valid JSON' };\r\n } catch {\r\n return {\r\n name: 'mcp-json',\r\n result: 'FAIL',\r\n message: '.kiro/settings/mcp.json is not valid JSON',\r\n fixable: true,\r\n fixAction: () => {\r\n const mcpPath2 = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n fs.writeFileSync(mcpPath2, '{\\n \"mcpServers\": {}\\n}\\n', 'utf-8');\r\n },\r\n };\r\n }\r\n}\r\n\r\nfunction checkTracking(workspaceRoot: string): CheckReport {\r\n const trackingPath = path.join(workspaceRoot, '.kiro/.kiro-kit.json');\r\n if (!fs.existsSync(trackingPath)) {\r\n return { name: 'tracking', result: 'WARN', message: '.kiro/.kiro-kit.json not found (no presets installed)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(trackingPath, 'utf-8');\r\n JSON.parse(content);\r\n return { name: 'tracking', result: 'PASS', message: '.kiro/.kiro-kit.json is valid' };\r\n } catch {\r\n return {\r\n name: 'tracking',\r\n result: 'FAIL',\r\n message: '.kiro/.kiro-kit.json is corrupt (invalid JSON)',\r\n };\r\n }\r\n}\r\n\r\nfunction checkTrackedFiles(workspaceRoot: string): CheckReport {\r\n let tracking: TrackingStore.TrackingData | null;\r\n try {\r\n tracking = TrackingStore.read(workspaceRoot);\r\n } catch {\r\n return { name: 'tracked-files', result: 'WARN', message: 'Cannot read tracking file, skipping file check' };\r\n }\r\n\r\n if (!tracking || tracking.presets.length === 0) {\r\n return { name: 'tracked-files', result: 'PASS', message: 'No tracked files to verify' };\r\n }\r\n\r\n const missing: string[] = [];\r\n for (const preset of tracking.presets) {\r\n for (const file of preset.files) {\r\n const fullPath = path.resolve(workspaceRoot, file.target);\r\n if (!fs.existsSync(fullPath)) {\r\n missing.push(file.target);\r\n }\r\n }\r\n }\r\n\r\n if (missing.length === 0) {\r\n return { name: 'tracked-files', result: 'PASS', message: 'All tracked files exist on disk' };\r\n }\r\n\r\n return {\r\n name: 'tracked-files',\r\n result: 'FAIL',\r\n message: `${missing.length} tracked file(s) missing: ${missing.slice(0, 3).join(', ')}${missing.length > 3 ? '...' : ''}`,\r\n };\r\n}\r\n\r\nfunction checkSteeringFrontMatter(workspaceRoot: string): CheckReport {\r\n const steeringDir = path.join(workspaceRoot, '.kiro/steering');\r\n if (!fs.existsSync(steeringDir)) {\r\n return { name: 'steering-fm', result: 'PASS', message: 'No steering files to check' };\r\n }\r\n\r\n const issues: string[] = [];\r\n\r\n const walkDir = (dir: string): void => {\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true });\r\n } catch { return; }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n walkDir(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\r\n checkSingleSteering(fullPath, issues);\r\n }\r\n }\r\n };\r\n\r\n walkDir(steeringDir);\r\n\r\n if (issues.length === 0) {\r\n return { name: 'steering-fm', result: 'PASS', message: 'Steering front-matter has no trailing whitespace' };\r\n }\r\n\r\n return {\r\n name: 'steering-fm',\r\n result: 'WARN',\r\n message: `${issues.length} steering file(s) have trailing whitespace in front-matter`,\r\n fixable: true,\r\n fixAction: () => {\r\n fixSteeringWhitespace(steeringDir);\r\n },\r\n };\r\n}\r\n\r\nfunction checkSingleSteering(filePath: string, issues: string[]): void {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n if (lines[0]?.trim() !== '---') return;\r\n\r\n let endIdx = -1;\r\n for (let i = 1; i < lines.length; i++) {\r\n if (lines[i]?.trim() === '---') { endIdx = i; break; }\r\n }\r\n if (endIdx === -1) return;\r\n\r\n // Check for trailing whitespace in front-matter lines\r\n for (let i = 1; i < endIdx; i++) {\r\n if (lines[i] !== lines[i].trimEnd()) {\r\n issues.push(filePath);\r\n return;\r\n }\r\n }\r\n } catch { /* skip unreadable files */ }\r\n}\r\n\r\nfunction fixSteeringWhitespace(steeringDir: string): void {\r\n const walkAndFix = (dir: string): void => {\r\n let entries: fs.Dirent[];\r\n try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n walkAndFix(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\r\n const content = fs.readFileSync(fullPath, 'utf-8');\r\n const lines = content.split('\\n');\r\n if (lines[0]?.trim() !== '---') continue;\r\n let endIdx = -1;\r\n for (let i = 1; i < lines.length; i++) {\r\n if (lines[i]?.trim() === '---') { endIdx = i; break; }\r\n }\r\n if (endIdx === -1) continue;\r\n let changed = false;\r\n for (let i = 1; i < endIdx; i++) {\r\n const trimmed = lines[i].trimEnd();\r\n if (lines[i] !== trimmed) { lines[i] = trimmed; changed = true; }\r\n }\r\n if (changed) {\r\n fs.writeFileSync(fullPath, lines.join('\\n'), 'utf-8');\r\n }\r\n }\r\n }\r\n };\r\n walkAndFix(steeringDir);\r\n}\r\n\r\nfunction checkMetadataJson(workspaceRoot: string): CheckReport {\r\n const metaPath = path.join(workspaceRoot, '.kiro/metadata.json');\r\n if (!fs.existsSync(metaPath)) {\r\n return { name: 'metadata-json', result: 'WARN', message: '.kiro/metadata.json not found (optional)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(metaPath, 'utf-8');\r\n const parsed = JSON.parse(content);\r\n if (!parsed.version || !parsed.name) {\r\n return { name: 'metadata-json', result: 'FAIL', message: '.kiro/metadata.json missing required fields (version, name)' };\r\n }\r\n return { name: 'metadata-json', result: 'PASS', message: '.kiro/metadata.json is valid' };\r\n } catch {\r\n return { name: 'metadata-json', result: 'FAIL', message: '.kiro/metadata.json is not valid JSON' };\r\n }\r\n}\r\n\r\nfunction checkStatuslineExecBit(workspaceRoot: string): CheckReport {\r\n // Only relevant on Unix\r\n if (process.platform === 'win32') {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'Statusline exec bit check (skipped on Windows)' };\r\n }\r\n\r\n const shPath = path.join(workspaceRoot, '.kiro/statusline.sh');\r\n if (!fs.existsSync(shPath)) {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'No statusline.sh to check' };\r\n }\r\n\r\n try {\r\n const stat = fs.statSync(shPath);\r\n const isExecutable = (stat.mode & 0o111) !== 0;\r\n if (isExecutable) {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'statusline.sh is executable' };\r\n }\r\n return {\r\n name: 'statusline-exec',\r\n result: 'WARN',\r\n message: 'statusline.sh is not executable',\r\n fixable: true,\r\n fixAction: () => {\r\n fs.chmodSync(shPath, 0o755);\r\n },\r\n };\r\n } catch {\r\n return { name: 'statusline-exec', result: 'WARN', message: 'Cannot check statusline.sh permissions' };\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport process from 'node:process';\r\n\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\nconst CONFIG_DIR = path.join(os.homedir(), '.kiro-kit');\r\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\r\n\r\ninterface TelemetryConfig {\r\n telemetry: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\nfunction readConfig(): TelemetryConfig {\r\n try {\r\n if (fs.existsSync(CONFIG_FILE)) {\r\n return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8')) as TelemetryConfig;\r\n }\r\n } catch { /* ignore corrupt config */ }\r\n return { telemetry: false };\r\n}\r\n\r\nfunction writeConfig(config: TelemetryConfig): void {\r\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\r\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function registerTelemetryCommand(program: Command): void {\r\n const telemetry = program\r\n .command('telemetry')\r\n .description('Manage anonymous usage telemetry');\r\n\r\n telemetry\r\n .command('enable')\r\n .description('Opt in to anonymous telemetry')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n config.telemetry = true;\r\n writeConfig(config);\r\n logger.success('Telemetry enabled. Anonymous usage data will be collected.');\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n\r\n telemetry\r\n .command('disable')\r\n .description('Opt out of telemetry')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n config.telemetry = false;\r\n writeConfig(config);\r\n logger.success('Telemetry disabled. No data will be collected.');\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n\r\n telemetry\r\n .command('status')\r\n .description('Show current telemetry status')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n const status = config.telemetry ? color.green('enabled') : color.yellow('disabled');\r\n process.stdout.write(`Telemetry: ${status}\\n`);\r\n process.stdout.write(`Config: ${CONFIG_FILE}\\n`);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n"],"mappings":"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","names":["process","fs","path","process","crypto","fs","path","path","fs","fs","showDiff","fs","path","path","fs","fs","path","process","process","process","path","fs","fs","path","write","read","fs","path","process","fs","fs","fs","path","crypto","path","path","process","resolve","path","sha256","crypto","program","generateTimestamp","fs","read","write","pkg","fs","path","process","crypto","sha256","crypto","generateTimestamp","getKitVersion","pkg","fs","conflictPrompt","process","readline","path","resolve","program","read","write","process","program","process","process","program","process","fs","path","process","crypto","sha256","crypto","generateTimestamp","getKitVersion","pkg","fs","conflictPrompt","process","readline","path","resolve","program","process","program","process","timestamps","fs","path","process","program","process","major","path","fs","fs","path","os","process","path","os","fs","program","process","process","require"]}
|