@prnv/tuck 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/ui/banner.ts","../src/ui/logger.ts","../src/ui/prompts.ts","../src/ui/spinner.ts","../src/ui/table.ts","../src/lib/paths.ts","../src/constants.ts","../src/lib/config.ts","../src/schemas/config.schema.ts","../src/errors.ts","../src/lib/manifest.ts","../src/schemas/manifest.schema.ts","../src/lib/git.ts","../src/commands/add.ts","../src/lib/files.ts","../src/commands/remove.ts","../src/commands/sync.ts","../src/lib/hooks.ts","../src/commands/push.ts","../src/commands/pull.ts","../src/commands/restore.ts","../src/lib/backup.ts","../src/commands/status.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/config.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n initCommand,\n addCommand,\n removeCommand,\n syncCommand,\n pushCommand,\n pullCommand,\n restoreCommand,\n statusCommand,\n listCommand,\n diffCommand,\n configCommand,\n} from './commands/index.js';\nimport { handleError } from './errors.js';\nimport { VERSION, DESCRIPTION } from './constants.js';\n\nconst program = new Command();\n\nprogram\n .name('tuck')\n .description(DESCRIPTION)\n .version(VERSION, '-v, --version', 'Display version number')\n .configureOutput({\n outputError: (str, write) => write(chalk.red(str)),\n });\n\n// Register commands\nprogram.addCommand(initCommand);\nprogram.addCommand(addCommand);\nprogram.addCommand(removeCommand);\nprogram.addCommand(syncCommand);\nprogram.addCommand(pushCommand);\nprogram.addCommand(pullCommand);\nprogram.addCommand(restoreCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(listCommand);\nprogram.addCommand(diffCommand);\nprogram.addCommand(configCommand);\n\n// Global error handling\nprocess.on('uncaughtException', handleError);\nprocess.on('unhandledRejection', (reason) => {\n handleError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\n// Parse and execute\nprogram.parseAsync(process.argv).catch(handleError);\n","import { Command } from 'commander';\nimport { join } from 'path';\nimport { writeFile } from 'fs/promises';\nimport { ensureDir } from 'fs-extra';\nimport { banner, nextSteps, prompts, withSpinner, logger } from '../ui/index.js';\nimport {\n getTuckDir,\n getManifestPath,\n getConfigPath,\n getFilesDir,\n getCategoryDir,\n pathExists,\n expandPath,\n collapsePath,\n} from '../lib/paths.js';\nimport { saveConfig } from '../lib/config.js';\nimport { createManifest } from '../lib/manifest.js';\nimport { initRepo, addRemote, cloneRepo, setDefaultBranch } from '../lib/git.js';\nimport { AlreadyInitializedError } from '../errors.js';\nimport { CATEGORIES, COMMON_DOTFILES } from '../constants.js';\nimport { defaultConfig } from '../schemas/config.schema.js';\nimport type { InitOptions } from '../types.js';\n\nconst GITIGNORE_TEMPLATE = `# OS generated files\n.DS_Store\n.DS_Store?\n._*\n.Spotlight-V100\n.Trashes\nehthumbs.db\nThumbs.db\n\n# Backup files\n*.bak\n*.backup\n*~\n\n# Secret files (add patterns for files you want to exclude)\n# *.secret\n# .env.local\n`;\n\nconst README_TEMPLATE = (machine?: string) => `# Dotfiles\n\nManaged with [tuck](https://github.com/Pranav-Karra-3301/tuck) - Modern Dotfiles Manager\n\n${machine ? `## Machine: ${machine}\\n` : ''}\n\n## Quick Start\n\n\\`\\`\\`bash\n# Restore dotfiles to a new machine\ntuck init --from <this-repo-url>\n\n# Or clone and restore manually\ngit clone <this-repo-url> ~/.tuck\ntuck restore --all\n\\`\\`\\`\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| \\`tuck add <paths>\\` | Track new dotfiles |\n| \\`tuck sync\\` | Sync changes to repository |\n| \\`tuck push\\` | Push to remote |\n| \\`tuck pull\\` | Pull from remote |\n| \\`tuck restore\\` | Restore dotfiles to system |\n| \\`tuck status\\` | Show tracking status |\n| \\`tuck list\\` | List tracked files |\n\n## Structure\n\n\\`\\`\\`\n.tuck/\n├── files/ # Tracked dotfiles organized by category\n│ ├── shell/ # Shell configs (.zshrc, .bashrc, etc.)\n│ ├── git/ # Git configs (.gitconfig, etc.)\n│ ├── editors/ # Editor configs (nvim, vim, etc.)\n│ ├── terminal/ # Terminal configs (tmux, alacritty, etc.)\n│ └── misc/ # Other dotfiles\n├── .tuckmanifest.json # Tracks all managed files\n└── .tuckrc.json # Tuck configuration\n\\`\\`\\`\n`;\n\nconst createDirectoryStructure = async (tuckDir: string): Promise<void> => {\n // Create main directories\n await ensureDir(tuckDir);\n await ensureDir(getFilesDir(tuckDir));\n\n // Create category directories\n for (const category of Object.keys(CATEGORIES)) {\n await ensureDir(getCategoryDir(tuckDir, category));\n }\n};\n\nconst createDefaultFiles = async (tuckDir: string, machine?: string): Promise<void> => {\n // Create .gitignore\n const gitignorePath = join(tuckDir, '.gitignore');\n await writeFile(gitignorePath, GITIGNORE_TEMPLATE, 'utf-8');\n\n // Create README.md\n const readmePath = join(tuckDir, 'README.md');\n await writeFile(readmePath, README_TEMPLATE(machine), 'utf-8');\n};\n\nconst initFromScratch = async (\n tuckDir: string,\n options: { remote?: string; bare?: boolean }\n): Promise<void> => {\n // Check if already initialized\n if (await pathExists(getManifestPath(tuckDir))) {\n throw new AlreadyInitializedError(tuckDir);\n }\n\n // Create directory structure\n await withSpinner('Creating directory structure...', async () => {\n await createDirectoryStructure(tuckDir);\n });\n\n // Initialize git repository\n await withSpinner('Initializing git repository...', async () => {\n await initRepo(tuckDir);\n await setDefaultBranch(tuckDir, 'main');\n });\n\n // Create manifest\n await withSpinner('Creating manifest...', async () => {\n const hostname = (await import('os')).hostname();\n await createManifest(tuckDir, hostname);\n });\n\n // Create config\n await withSpinner('Creating configuration...', async () => {\n await saveConfig(\n {\n ...defaultConfig,\n repository: { ...defaultConfig.repository, path: tuckDir },\n },\n tuckDir\n );\n });\n\n // Create default files unless --bare\n if (!options.bare) {\n await withSpinner('Creating default files...', async () => {\n const hostname = (await import('os')).hostname();\n await createDefaultFiles(tuckDir, hostname);\n });\n }\n\n // Add remote if provided\n if (options.remote) {\n await withSpinner('Adding remote...', async () => {\n await addRemote(tuckDir, 'origin', options.remote!);\n });\n }\n};\n\nconst initFromRemote = async (tuckDir: string, remoteUrl: string): Promise<void> => {\n // Clone the repository\n await withSpinner(`Cloning from ${remoteUrl}...`, async () => {\n await cloneRepo(remoteUrl, tuckDir);\n });\n\n // Verify manifest exists\n if (!(await pathExists(getManifestPath(tuckDir)))) {\n logger.warning('No manifest found in cloned repository. Creating new manifest...');\n const hostname = (await import('os')).hostname();\n await createManifest(tuckDir, hostname);\n }\n\n // Verify config exists\n if (!(await pathExists(getConfigPath(tuckDir)))) {\n logger.warning('No config found in cloned repository. Creating default config...');\n await saveConfig(\n {\n ...defaultConfig,\n repository: { ...defaultConfig.repository, path: tuckDir },\n },\n tuckDir\n );\n }\n};\n\nconst runInteractiveInit = async (): Promise<void> => {\n banner();\n prompts.intro('tuck init');\n\n // Ask for tuck directory\n const dirInput = await prompts.text('Where should tuck store your dotfiles?', {\n defaultValue: '~/.tuck',\n });\n const tuckDir = getTuckDir(dirInput);\n\n // Check if already initialized\n if (await pathExists(getManifestPath(tuckDir))) {\n prompts.log.error(`Tuck is already initialized at ${collapsePath(tuckDir)}`);\n prompts.outro('Use `tuck status` to see current state');\n return;\n }\n\n // Ask about existing repo\n const hasExisting = await prompts.select('Do you have an existing dotfiles repository?', [\n { value: 'no', label: 'No, start fresh' },\n { value: 'yes', label: 'Yes, clone from URL' },\n ]);\n\n if (hasExisting === 'yes') {\n const repoUrl = await prompts.text('Enter repository URL:', {\n placeholder: 'git@github.com:user/dotfiles.git',\n validate: (value) => {\n if (!value) return 'Repository URL is required';\n if (!value.includes('github.com') && !value.includes('gitlab.com') && !value.includes('git@')) {\n return 'Please enter a valid git URL';\n }\n return undefined;\n },\n });\n\n await initFromRemote(tuckDir, repoUrl);\n\n prompts.log.success('Repository cloned successfully!');\n\n const shouldRestore = await prompts.confirm('Would you like to restore dotfiles now?', true);\n\n if (shouldRestore) {\n prompts.log.info('Run `tuck restore --all` to restore all dotfiles');\n }\n } else {\n // Check for common dotfiles that exist\n const existingDotfiles: { path: string; label: string }[] = [];\n\n for (const df of COMMON_DOTFILES) {\n const fullPath = expandPath(df.path);\n if (await pathExists(fullPath)) {\n existingDotfiles.push({\n path: df.path,\n label: `${df.path} (${df.category})`,\n });\n }\n }\n\n await initFromScratch(tuckDir, {});\n\n // Ask to add common dotfiles if any exist\n if (existingDotfiles.length > 0) {\n const selectedFiles = await prompts.multiselect(\n 'Would you like to track some common dotfiles?',\n existingDotfiles.map((f) => ({\n value: f.path,\n label: f.label,\n }))\n );\n\n if (selectedFiles.length > 0) {\n prompts.log.step(\n `Run the following to track these files:\\n tuck add ${selectedFiles.join(' ')}`\n );\n }\n }\n\n // Ask about remote\n const wantsRemote = await prompts.confirm('Would you like to set up a remote repository?');\n\n if (wantsRemote) {\n const remoteUrl = await prompts.text('Enter remote URL:', {\n placeholder: 'git@github.com:user/dotfiles.git',\n });\n\n if (remoteUrl) {\n await addRemote(tuckDir, 'origin', remoteUrl);\n prompts.log.success('Remote added successfully');\n }\n }\n }\n\n prompts.outro('Tuck initialized successfully!');\n\n nextSteps([\n `Add files: tuck add ~/.zshrc`,\n `Sync changes: tuck sync`,\n `Push remote: tuck push`,\n ]);\n};\n\nconst runInit = async (options: InitOptions): Promise<void> => {\n const tuckDir = getTuckDir(options.dir);\n\n // If --from is provided, clone from remote\n if (options.from) {\n await initFromRemote(tuckDir, options.from);\n logger.success(`Tuck initialized from ${options.from}`);\n logger.info('Run `tuck restore --all` to restore dotfiles');\n return;\n }\n\n // Initialize from scratch\n await initFromScratch(tuckDir, {\n remote: options.remote,\n bare: options.bare,\n });\n\n logger.success(`Tuck initialized at ${collapsePath(tuckDir)}`);\n\n nextSteps([\n `Add files: tuck add ~/.zshrc`,\n `Sync changes: tuck sync`,\n `Push remote: tuck push`,\n ]);\n};\n\nexport const initCommand = new Command('init')\n .description('Initialize tuck repository')\n .option('-d, --dir <path>', 'Directory for tuck repository', '~/.tuck')\n .option('-r, --remote <url>', 'Git remote URL to set up')\n .option('--bare', 'Initialize without any default files')\n .option('--from <url>', 'Clone from existing tuck repository')\n .action(async (options: InitOptions) => {\n // If no options provided, run interactive mode\n if (!options.remote && !options.bare && !options.from && options.dir === '~/.tuck') {\n await runInteractiveInit();\n } else {\n await runInit(options);\n }\n });\n","import chalk from 'chalk';\nimport boxen from 'boxen';\n\nexport const banner = (): void => {\n const art = `\n ████████╗██╗ ██╗ ██████╗██╗ ██╗\n ╚══██╔══╝██║ ██║██╔════╝██║ ██╔╝\n ██║ ██║ ██║██║ █████╔╝\n ██║ ██║ ██║██║ ██╔═██╗\n ██║ ╚██████╔╝╚██████╗██║ ██╗\n ╚═╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝`;\n\n console.log(chalk.cyan(art));\n console.log(chalk.dim(' Modern Dotfiles Manager\\n'));\n};\n\nexport const welcomeBox = (message: string, title?: string): void => {\n console.log(\n boxen(message, {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'cyan',\n title,\n titleAlignment: 'center',\n })\n );\n};\n\nexport const successBox = (message: string, title?: string): void => {\n console.log(\n boxen(message, {\n padding: 1,\n margin: { top: 1, bottom: 1, left: 0, right: 0 },\n borderStyle: 'round',\n borderColor: 'green',\n title: title || 'Success',\n titleAlignment: 'center',\n })\n );\n};\n\nexport const errorBox = (message: string, title?: string): void => {\n console.log(\n boxen(message, {\n padding: 1,\n margin: { top: 1, bottom: 1, left: 0, right: 0 },\n borderStyle: 'round',\n borderColor: 'red',\n title: title || 'Error',\n titleAlignment: 'center',\n })\n );\n};\n\nexport const infoBox = (message: string, title?: string): void => {\n console.log(\n boxen(message, {\n padding: 1,\n margin: { top: 1, bottom: 1, left: 0, right: 0 },\n borderStyle: 'round',\n borderColor: 'blue',\n title,\n titleAlignment: 'center',\n })\n );\n};\n\nexport const nextSteps = (steps: string[]): void => {\n const content = steps.map((step, i) => `${chalk.cyan(`${i + 1}.`)} ${step}`).join('\\n');\n\n console.log(\n boxen(content, {\n padding: 1,\n margin: { top: 1, bottom: 0, left: 0, right: 0 },\n borderStyle: 'round',\n borderColor: 'cyan',\n title: 'Next Steps',\n titleAlignment: 'left',\n })\n );\n};\n","import chalk from 'chalk';\n\nexport interface Logger {\n info: (msg: string) => void;\n success: (msg: string) => void;\n warning: (msg: string) => void;\n error: (msg: string) => void;\n debug: (msg: string) => void;\n step: (current: number, total: number, msg: string) => void;\n file: (action: 'add' | 'modify' | 'delete' | 'sync', path: string) => void;\n tree: (items: TreeItem[]) => void;\n blank: () => void;\n dim: (msg: string) => void;\n heading: (msg: string) => void;\n}\n\nexport interface TreeItem {\n name: string;\n isLast: boolean;\n indent?: number;\n}\n\nexport const logger: Logger = {\n info: (msg: string) => {\n console.log(chalk.blue('ℹ'), msg);\n },\n\n success: (msg: string) => {\n console.log(chalk.green('✓'), msg);\n },\n\n warning: (msg: string) => {\n console.log(chalk.yellow('⚠'), msg);\n },\n\n error: (msg: string) => {\n console.log(chalk.red('✗'), msg);\n },\n\n debug: (msg: string) => {\n if (process.env.DEBUG) {\n console.log(chalk.gray('⚙'), chalk.gray(msg));\n }\n },\n\n step: (current: number, total: number, msg: string) => {\n console.log(chalk.dim(`[${current}/${total}]`), msg);\n },\n\n file: (action: 'add' | 'modify' | 'delete' | 'sync', path: string) => {\n const icons = {\n add: chalk.green('+'),\n modify: chalk.yellow('~'),\n delete: chalk.red('-'),\n sync: chalk.blue('↔'),\n };\n console.log(` ${icons[action]} ${path}`);\n },\n\n tree: (items: TreeItem[]) => {\n items.forEach(({ name, isLast, indent = 0 }) => {\n const indentation = ' '.repeat(indent);\n const prefix = isLast ? '└── ' : '├── ';\n console.log(chalk.dim(indentation + prefix) + name);\n });\n },\n\n blank: () => {\n console.log();\n },\n\n dim: (msg: string) => {\n console.log(chalk.dim(msg));\n },\n\n heading: (msg: string) => {\n console.log(chalk.bold.cyan(msg));\n },\n};\n\nexport const formatPath = (path: string): string => {\n return chalk.cyan(path);\n};\n\nexport const formatCategory = (category: string, icon?: string): string => {\n return icon ? `${icon} ${chalk.bold(category)}` : chalk.bold(category);\n};\n\nexport const formatCount = (count: number, singular: string, plural?: string): string => {\n const word = count === 1 ? singular : (plural || `${singular}s`);\n return `${chalk.bold(count.toString())} ${word}`;\n};\n\nexport const formatStatus = (status: string): string => {\n switch (status) {\n case 'modified':\n return chalk.yellow('modified');\n case 'added':\n return chalk.green('added');\n case 'deleted':\n return chalk.red('deleted');\n case 'untracked':\n return chalk.gray('untracked');\n default:\n return status;\n }\n};\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\n\nexport interface SelectOption<T> {\n value: T;\n label: string;\n hint?: string;\n}\n\nexport const prompts = {\n intro: (title: string): void => {\n p.intro(chalk.bgCyan(chalk.black(` ${title} `)));\n },\n\n outro: (message: string): void => {\n p.outro(chalk.green(message));\n },\n\n confirm: async (message: string, initial = false): Promise<boolean> => {\n const result = await p.confirm({ message, initialValue: initial });\n if (p.isCancel(result)) {\n prompts.cancel();\n }\n return result as boolean;\n },\n\n select: async <T>(message: string, options: SelectOption<T>[]): Promise<T> => {\n const result = await p.select({\n message,\n options: options.map((opt) => ({\n value: opt.value,\n label: opt.label,\n hint: opt.hint,\n })),\n });\n if (p.isCancel(result)) {\n prompts.cancel();\n }\n return result as T;\n },\n\n multiselect: async <T>(\n message: string,\n options: SelectOption<T>[],\n required = false\n ): Promise<T[]> => {\n const result = await p.multiselect({\n message,\n options: options.map((opt) => ({\n value: opt.value,\n label: opt.label,\n hint: opt.hint,\n })),\n required,\n });\n if (p.isCancel(result)) {\n prompts.cancel();\n }\n return result as T[];\n },\n\n text: async (\n message: string,\n options?: {\n placeholder?: string;\n defaultValue?: string;\n validate?: (value: string) => string | undefined;\n }\n ): Promise<string> => {\n const result = await p.text({\n message,\n placeholder: options?.placeholder,\n defaultValue: options?.defaultValue,\n validate: options?.validate,\n });\n if (p.isCancel(result)) {\n prompts.cancel();\n }\n return result as string;\n },\n\n password: async (message: string): Promise<string> => {\n const result = await p.password({ message });\n if (p.isCancel(result)) {\n prompts.cancel();\n }\n return result as string;\n },\n\n spinner: () => p.spinner(),\n\n note: (message: string, title?: string): void => {\n p.note(message, title);\n },\n\n cancel: (message = 'Operation cancelled'): never => {\n p.cancel(message);\n process.exit(0);\n },\n\n log: {\n info: (message: string): void => {\n p.log.info(message);\n },\n success: (message: string): void => {\n p.log.success(message);\n },\n warning: (message: string): void => {\n p.log.warning(message);\n },\n error: (message: string): void => {\n p.log.error(message);\n },\n step: (message: string): void => {\n p.log.step(message);\n },\n message: (message: string): void => {\n p.log.message(message);\n },\n },\n\n group: async <T>(\n steps: Record<string, () => Promise<T | symbol>>,\n options?: { onCancel?: () => void }\n ): Promise<Record<string, T>> => {\n const results = await p.group(steps, {\n onCancel: () => {\n if (options?.onCancel) {\n options.onCancel();\n } else {\n prompts.cancel();\n }\n },\n });\n return results as Record<string, T>;\n },\n};\n\nexport const isCancel = p.isCancel;\n","import ora, { Ora } from 'ora';\nimport chalk from 'chalk';\n\nexport interface SpinnerInstance {\n start: (text?: string) => void;\n stop: () => void;\n succeed: (text?: string) => void;\n fail: (text?: string) => void;\n warn: (text?: string) => void;\n info: (text?: string) => void;\n text: (text: string) => void;\n}\n\nexport const createSpinner = (initialText?: string): SpinnerInstance => {\n const spinner: Ora = ora({\n text: initialText,\n color: 'cyan',\n spinner: 'dots',\n });\n\n return {\n start: (text?: string) => {\n if (text) spinner.text = text;\n spinner.start();\n },\n stop: () => {\n spinner.stop();\n },\n succeed: (text?: string) => {\n spinner.succeed(text ? chalk.green(text) : undefined);\n },\n fail: (text?: string) => {\n spinner.fail(text ? chalk.red(text) : undefined);\n },\n warn: (text?: string) => {\n spinner.warn(text ? chalk.yellow(text) : undefined);\n },\n info: (text?: string) => {\n spinner.info(text ? chalk.blue(text) : undefined);\n },\n text: (text: string) => {\n spinner.text = text;\n },\n };\n};\n\nexport const withSpinner = async <T>(\n text: string,\n fn: () => Promise<T>,\n options?: {\n successText?: string;\n failText?: string;\n }\n): Promise<T> => {\n const spinner = createSpinner(text);\n spinner.start();\n\n try {\n const result = await fn();\n spinner.succeed(options?.successText || text);\n return result;\n } catch (error) {\n spinner.fail(options?.failText || text);\n throw error;\n }\n};\n","import chalk from 'chalk';\n\nexport interface TableColumn {\n header: string;\n key: string;\n width?: number;\n align?: 'left' | 'right' | 'center';\n format?: (value: unknown) => string;\n}\n\nexport interface TableOptions {\n columns: TableColumn[];\n border?: boolean;\n padding?: number;\n}\n\nconst padString = (str: string, width: number, align: 'left' | 'right' | 'center' = 'left'): string => {\n // eslint-disable-next-line no-control-regex\n const visibleLength = str.replace(/\\x1b\\[[0-9;]*m/g, '').length;\n const padding = Math.max(0, width - visibleLength);\n\n switch (align) {\n case 'right':\n return ' '.repeat(padding) + str;\n case 'center': {\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n return ' '.repeat(leftPad) + str + ' '.repeat(rightPad);\n }\n default:\n return str + ' '.repeat(padding);\n }\n};\n\nexport const createTable = (\n data: Record<string, unknown>[],\n options: TableOptions\n): string => {\n const { columns, border = false, padding = 2 } = options;\n\n // Calculate column widths\n const widths = columns.map((col) => {\n const headerWidth = col.header.length;\n const maxDataWidth = data.reduce((max, row) => {\n const value = col.format ? col.format(row[col.key]) : String(row[col.key] ?? '');\n // eslint-disable-next-line no-control-regex\n const visibleLength = value.replace(/\\x1b\\[[0-9;]*m/g, '').length;\n return Math.max(max, visibleLength);\n }, 0);\n return col.width || Math.max(headerWidth, maxDataWidth);\n });\n\n const lines: string[] = [];\n const pad = ' '.repeat(padding);\n\n // Header\n const headerRow = columns\n .map((col, i) => chalk.bold(padString(col.header, widths[i], col.align)))\n .join(pad);\n\n if (border) {\n const borderLine = widths.map((w) => '─'.repeat(w)).join(pad);\n lines.push(chalk.dim(borderLine));\n lines.push(headerRow);\n lines.push(chalk.dim(borderLine));\n } else {\n lines.push(headerRow);\n lines.push(chalk.dim(widths.map((w) => '─'.repeat(w)).join(pad)));\n }\n\n // Data rows\n data.forEach((row) => {\n const dataRow = columns\n .map((col, i) => {\n const value = col.format ? col.format(row[col.key]) : String(row[col.key] ?? '');\n return padString(value, widths[i], col.align);\n })\n .join(pad);\n lines.push(dataRow);\n });\n\n if (border) {\n lines.push(chalk.dim(widths.map((w) => '─'.repeat(w)).join(pad)));\n }\n\n return lines.join('\\n');\n};\n\nexport const printTable = (data: Record<string, unknown>[], options: TableOptions): void => {\n console.log(createTable(data, options));\n};\n","import { homedir } from 'os';\nimport { join, basename, dirname, relative, isAbsolute, resolve } from 'path';\nimport { stat, access } from 'fs/promises';\nimport { constants } from 'fs';\nimport { DEFAULT_TUCK_DIR, FILES_DIR, MANIFEST_FILE, CONFIG_FILE, CATEGORIES } from '../constants.js';\n\nexport const expandPath = (path: string): string => {\n if (path.startsWith('~/')) {\n return join(homedir(), path.slice(2));\n }\n if (path.startsWith('$HOME/')) {\n return join(homedir(), path.slice(6));\n }\n return isAbsolute(path) ? path : resolve(path);\n};\n\nexport const collapsePath = (path: string): string => {\n const home = homedir();\n if (path.startsWith(home)) {\n return '~' + path.slice(home.length);\n }\n return path;\n};\n\nexport const getTuckDir = (customDir?: string): string => {\n return expandPath(customDir || DEFAULT_TUCK_DIR);\n};\n\nexport const getManifestPath = (tuckDir: string): string => {\n return join(tuckDir, MANIFEST_FILE);\n};\n\nexport const getConfigPath = (tuckDir: string): string => {\n return join(tuckDir, CONFIG_FILE);\n};\n\nexport const getFilesDir = (tuckDir: string): string => {\n return join(tuckDir, FILES_DIR);\n};\n\nexport const getCategoryDir = (tuckDir: string, category: string): string => {\n return join(getFilesDir(tuckDir), category);\n};\n\nexport const getDestinationPath = (tuckDir: string, category: string, filename: string): string => {\n return join(getCategoryDir(tuckDir, category), filename);\n};\n\nexport const getRelativeDestination = (category: string, filename: string): string => {\n return join(FILES_DIR, category, filename);\n};\n\nexport const sanitizeFilename = (filepath: string): string => {\n const base = basename(filepath);\n // Remove leading dot for storage, but keep track that it was a dotfile\n return base.startsWith('.') ? base.slice(1) : base;\n};\n\nexport const detectCategory = (filepath: string): string => {\n const expandedPath = expandPath(filepath);\n const relativePath = collapsePath(expandedPath);\n\n for (const [category, config] of Object.entries(CATEGORIES)) {\n for (const pattern of config.patterns) {\n // Check if the pattern matches the path\n if (relativePath.endsWith(pattern) || relativePath.includes(pattern)) {\n return category;\n }\n // Check just the filename\n const filename = basename(expandedPath);\n if (filename === pattern || filename === basename(pattern)) {\n return category;\n }\n }\n }\n\n return 'misc';\n};\n\nexport const pathExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isDirectory = async (path: string): Promise<boolean> => {\n try {\n const stats = await stat(path);\n return stats.isDirectory();\n } catch {\n return false;\n }\n};\n\nexport const isFile = async (path: string): Promise<boolean> => {\n try {\n const stats = await stat(path);\n return stats.isFile();\n } catch {\n return false;\n }\n};\n\nexport const isSymlink = async (path: string): Promise<boolean> => {\n try {\n const stats = await stat(path);\n return stats.isSymbolicLink();\n } catch {\n return false;\n }\n};\n\nexport const isReadable = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.R_OK);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isWritable = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.W_OK);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getRelativePath = (from: string, to: string): string => {\n return relative(dirname(from), to);\n};\n\nexport const generateFileId = (source: string): string => {\n // Create a unique ID from the source path\n const collapsed = collapsePath(source);\n // Remove special characters and create a readable ID\n return collapsed\n .replace(/^~\\//, '')\n .replace(/\\//g, '_')\n .replace(/\\./g, '-')\n .replace(/^-/, '');\n};\n","import { homedir } from 'os';\nimport { join } from 'path';\n\nexport const VERSION = '0.1.0';\nexport const DESCRIPTION = 'Modern dotfiles manager with a beautiful CLI';\nexport const APP_NAME = 'tuck';\n\nexport const HOME_DIR = homedir();\nexport const DEFAULT_TUCK_DIR = join(HOME_DIR, '.tuck');\nexport const MANIFEST_FILE = '.tuckmanifest.json';\nexport const CONFIG_FILE = '.tuckrc.json';\nexport const BACKUP_DIR = join(HOME_DIR, '.tuck-backups');\nexport const FILES_DIR = 'files';\n\nexport const MANIFEST_VERSION = '1.0.0';\n\nexport interface CategoryConfig {\n patterns: string[];\n icon: string;\n}\n\nexport const CATEGORIES: Record<string, CategoryConfig> = {\n shell: {\n patterns: [\n '.zshrc',\n '.bashrc',\n '.bash_profile',\n '.zprofile',\n '.profile',\n '.aliases',\n '.zshenv',\n '.bash_aliases',\n '.inputrc',\n ],\n icon: '🐚',\n },\n git: {\n patterns: ['.gitconfig', '.gitignore_global', '.gitmessage', '.gitattributes'],\n icon: '📦',\n },\n editors: {\n patterns: [\n '.vimrc',\n '.config/nvim',\n '.emacs',\n '.emacs.d',\n '.config/Code',\n '.ideavimrc',\n '.nanorc',\n ],\n icon: '✏️',\n },\n terminal: {\n patterns: [\n '.tmux.conf',\n '.config/alacritty',\n '.config/kitty',\n '.wezterm.lua',\n '.config/wezterm',\n '.config/hyper',\n '.config/starship.toml',\n ],\n icon: '💻',\n },\n ssh: {\n patterns: ['.ssh/config'],\n icon: '🔐',\n },\n misc: {\n patterns: [],\n icon: '📄',\n },\n};\n\nexport const COMMON_DOTFILES = [\n { path: '~/.zshrc', category: 'shell' },\n { path: '~/.bashrc', category: 'shell' },\n { path: '~/.bash_profile', category: 'shell' },\n { path: '~/.gitconfig', category: 'git' },\n { path: '~/.config/nvim', category: 'editors' },\n { path: '~/.vimrc', category: 'editors' },\n { path: '~/.tmux.conf', category: 'terminal' },\n { path: '~/.ssh/config', category: 'ssh' },\n { path: '~/.config/starship.toml', category: 'terminal' },\n];\n","import { readFile, writeFile } from 'fs/promises';\nimport { cosmiconfig } from 'cosmiconfig';\nimport { tuckConfigSchema, defaultConfig, type TuckConfigOutput } from '../schemas/config.schema.js';\nimport { getConfigPath, pathExists, getTuckDir } from './paths.js';\nimport { ConfigError } from '../errors.js';\nimport { BACKUP_DIR } from '../constants.js';\n\nlet cachedConfig: TuckConfigOutput | null = null;\nlet cachedTuckDir: string | null = null;\n\nexport const loadConfig = async (tuckDir?: string): Promise<TuckConfigOutput> => {\n const dir = tuckDir || getTuckDir();\n\n // Return cached config if same directory\n if (cachedConfig && cachedTuckDir === dir) {\n return cachedConfig;\n }\n\n const configPath = getConfigPath(dir);\n\n if (!(await pathExists(configPath))) {\n // Return default config if no config file exists\n cachedConfig = { ...defaultConfig, repository: { ...defaultConfig.repository, path: dir } };\n cachedTuckDir = dir;\n return cachedConfig;\n }\n\n try {\n const content = await readFile(configPath, 'utf-8');\n const rawConfig = JSON.parse(content);\n const result = tuckConfigSchema.safeParse(rawConfig);\n\n if (!result.success) {\n throw new ConfigError(`Invalid configuration: ${result.error.message}`);\n }\n\n // Merge with defaults\n cachedConfig = {\n ...defaultConfig,\n ...result.data,\n repository: {\n ...defaultConfig.repository,\n ...result.data.repository,\n path: dir,\n },\n files: {\n ...defaultConfig.files,\n ...result.data.files,\n backupDir: result.data.files?.backupDir || BACKUP_DIR,\n },\n };\n cachedTuckDir = dir;\n\n return cachedConfig;\n } catch (error) {\n if (error instanceof ConfigError) {\n throw error;\n }\n if (error instanceof SyntaxError) {\n throw new ConfigError('Configuration file contains invalid JSON');\n }\n throw new ConfigError(`Failed to load configuration: ${error}`);\n }\n};\n\nexport const saveConfig = async (\n config: Partial<TuckConfigOutput>,\n tuckDir?: string\n): Promise<void> => {\n const dir = tuckDir || getTuckDir();\n const configPath = getConfigPath(dir);\n\n // Load existing config and merge\n const existing = await loadConfig(dir);\n const merged = {\n ...existing,\n ...config,\n repository: {\n ...existing.repository,\n ...config.repository,\n },\n files: {\n ...existing.files,\n ...config.files,\n },\n hooks: {\n ...existing.hooks,\n ...config.hooks,\n },\n templates: {\n ...existing.templates,\n ...config.templates,\n },\n encryption: {\n ...existing.encryption,\n ...config.encryption,\n },\n ui: {\n ...existing.ui,\n ...config.ui,\n },\n };\n\n // Validate before saving\n const result = tuckConfigSchema.safeParse(merged);\n if (!result.success) {\n throw new ConfigError(`Invalid configuration: ${result.error.message}`);\n }\n\n try {\n await writeFile(configPath, JSON.stringify(result.data, null, 2) + '\\n', 'utf-8');\n // Update cache\n cachedConfig = result.data;\n cachedTuckDir = dir;\n } catch (error) {\n throw new ConfigError(`Failed to save configuration: ${error}`);\n }\n};\n\nexport const getConfigValue = async <K extends keyof TuckConfigOutput>(\n key: K,\n tuckDir?: string\n): Promise<TuckConfigOutput[K]> => {\n const config = await loadConfig(tuckDir);\n return config[key];\n};\n\nexport const setConfigValue = async <K extends keyof TuckConfigOutput>(\n key: K,\n value: TuckConfigOutput[K],\n tuckDir?: string\n): Promise<void> => {\n await saveConfig({ [key]: value } as Partial<TuckConfigOutput>, tuckDir);\n};\n\nexport const resetConfig = async (tuckDir?: string): Promise<void> => {\n const dir = tuckDir || getTuckDir();\n const configPath = getConfigPath(dir);\n\n const resetTo = { ...defaultConfig, repository: { ...defaultConfig.repository, path: dir } };\n\n try {\n await writeFile(configPath, JSON.stringify(resetTo, null, 2) + '\\n', 'utf-8');\n cachedConfig = resetTo;\n cachedTuckDir = dir;\n } catch (error) {\n throw new ConfigError(`Failed to reset configuration: ${error}`);\n }\n};\n\nexport const clearConfigCache = (): void => {\n cachedConfig = null;\n cachedTuckDir = null;\n};\n\nexport const findTuckDir = async (): Promise<string | null> => {\n // First check default location\n const defaultDir = getTuckDir();\n if (await pathExists(getConfigPath(defaultDir))) {\n return defaultDir;\n }\n\n // Try cosmiconfig to find config in current directory or parents\n const explorer = cosmiconfig('tuck', {\n searchPlaces: [\n '.tuckrc',\n '.tuckrc.json',\n '.tuckrc.yaml',\n '.tuckrc.yml',\n 'tuck.config.js',\n 'tuck.config.cjs',\n ],\n });\n\n try {\n const result = await explorer.search();\n if (result?.filepath) {\n return result.filepath;\n }\n } catch {\n // Ignore search errors\n }\n\n return null;\n};\n","import { z } from 'zod';\n\nexport const fileStrategySchema = z.enum(['copy', 'symlink']);\n\nexport const categoryConfigSchema = z.object({\n patterns: z.array(z.string()),\n icon: z.string().optional(),\n});\n\nexport const tuckConfigSchema = z.object({\n repository: z\n .object({\n path: z.string(),\n defaultBranch: z.string().default('main'),\n autoCommit: z.boolean().default(true),\n autoPush: z.boolean().default(false),\n })\n .partial()\n .default({}),\n\n files: z\n .object({\n strategy: fileStrategySchema.default('copy'),\n backupOnRestore: z.boolean().default(true),\n backupDir: z.string().optional(),\n })\n .partial()\n .default({}),\n\n categories: z.record(categoryConfigSchema).optional().default({}),\n\n ignore: z.array(z.string()).optional().default([]),\n\n hooks: z\n .object({\n preSync: z.string().optional(),\n postSync: z.string().optional(),\n preRestore: z.string().optional(),\n postRestore: z.string().optional(),\n })\n .partial()\n .default({}),\n\n templates: z\n .object({\n enabled: z.boolean().default(false),\n variables: z.record(z.string()).default({}),\n })\n .partial()\n .default({}),\n\n encryption: z\n .object({\n enabled: z.boolean().default(false),\n gpgKey: z.string().optional(),\n files: z.array(z.string()).default([]),\n })\n .partial()\n .default({}),\n\n ui: z\n .object({\n colors: z.boolean().default(true),\n emoji: z.boolean().default(true),\n verbose: z.boolean().default(false),\n })\n .partial()\n .default({}),\n});\n\nexport type TuckConfigInput = z.input<typeof tuckConfigSchema>;\nexport type TuckConfigOutput = z.output<typeof tuckConfigSchema>;\n\nexport const defaultConfig: TuckConfigOutput = {\n repository: {\n defaultBranch: 'main',\n autoCommit: true,\n autoPush: false,\n },\n files: {\n strategy: 'copy',\n backupOnRestore: true,\n },\n categories: {},\n ignore: [],\n hooks: {},\n templates: {\n enabled: false,\n variables: {},\n },\n encryption: {\n enabled: false,\n files: [],\n },\n ui: {\n colors: true,\n emoji: true,\n verbose: false,\n },\n};\n","import chalk from 'chalk';\n\nexport class TuckError extends Error {\n constructor(\n message: string,\n public code: string,\n public suggestions?: string[]\n ) {\n super(message);\n this.name = 'TuckError';\n }\n}\n\nexport class NotInitializedError extends TuckError {\n constructor() {\n super('Tuck is not initialized in this system', 'NOT_INITIALIZED', [\n 'Run `tuck init` to get started',\n ]);\n }\n}\n\nexport class AlreadyInitializedError extends TuckError {\n constructor(path: string) {\n super(`Tuck is already initialized at ${path}`, 'ALREADY_INITIALIZED', [\n 'Use `tuck status` to see current state',\n `Remove ${path} to reinitialize`,\n ]);\n }\n}\n\nexport class FileNotFoundError extends TuckError {\n constructor(path: string) {\n super(`File not found: ${path}`, 'FILE_NOT_FOUND', [\n 'Check that the path is correct',\n 'Use absolute paths or paths relative to home directory',\n ]);\n }\n}\n\nexport class FileNotTrackedError extends TuckError {\n constructor(path: string) {\n super(`File is not tracked: ${path}`, 'FILE_NOT_TRACKED', [\n `Run \\`tuck add ${path}\\` to track this file`,\n 'Run `tuck list` to see all tracked files',\n ]);\n }\n}\n\nexport class FileAlreadyTrackedError extends TuckError {\n constructor(path: string) {\n super(`File is already tracked: ${path}`, 'FILE_ALREADY_TRACKED', [\n 'Run `tuck sync` to update it',\n `Run \\`tuck remove ${path}\\` to untrack`,\n ]);\n }\n}\n\nexport class GitError extends TuckError {\n constructor(message: string, gitError?: string) {\n super(`Git operation failed: ${message}`, 'GIT_ERROR', gitError ? [gitError] : undefined);\n }\n}\n\nexport class ConfigError extends TuckError {\n constructor(message: string) {\n super(`Configuration error: ${message}`, 'CONFIG_ERROR', [\n 'Run `tuck config edit` to fix configuration',\n 'Run `tuck config reset` to restore defaults',\n ]);\n }\n}\n\nexport class ManifestError extends TuckError {\n constructor(message: string) {\n super(`Manifest error: ${message}`, 'MANIFEST_ERROR', [\n 'The manifest file may be corrupted',\n 'Run `tuck init --from <remote>` to restore from remote',\n ]);\n }\n}\n\nexport class PermissionError extends TuckError {\n constructor(path: string, operation: string) {\n super(`Permission denied: cannot ${operation} ${path}`, 'PERMISSION_ERROR', [\n 'Check file permissions',\n 'Try running with appropriate permissions',\n ]);\n }\n}\n\nexport const handleError = (error: unknown): never => {\n if (error instanceof TuckError) {\n console.error(chalk.red('✗'), error.message);\n if (error.suggestions && error.suggestions.length > 0) {\n console.error();\n console.error(chalk.dim('Suggestions:'));\n error.suggestions.forEach((s) => console.error(chalk.dim(` → ${s}`)));\n }\n process.exit(1);\n }\n\n if (error instanceof Error) {\n console.error(chalk.red('✗'), 'An unexpected error occurred:', error.message);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n\n console.error(chalk.red('✗'), 'An unknown error occurred');\n process.exit(1);\n};\n","import { readFile, writeFile } from 'fs/promises';\nimport {\n tuckManifestSchema,\n createEmptyManifest,\n type TuckManifestOutput,\n type TrackedFileOutput,\n} from '../schemas/manifest.schema.js';\nimport { getManifestPath, pathExists } from './paths.js';\nimport { ManifestError } from '../errors.js';\n\nlet cachedManifest: TuckManifestOutput | null = null;\nlet cachedManifestDir: string | null = null;\n\nexport const loadManifest = async (tuckDir: string): Promise<TuckManifestOutput> => {\n // Return cached manifest if same directory\n if (cachedManifest && cachedManifestDir === tuckDir) {\n return cachedManifest;\n }\n\n const manifestPath = getManifestPath(tuckDir);\n\n if (!(await pathExists(manifestPath))) {\n throw new ManifestError('Manifest file not found. Is tuck initialized?');\n }\n\n try {\n const content = await readFile(manifestPath, 'utf-8');\n const rawManifest = JSON.parse(content);\n const result = tuckManifestSchema.safeParse(rawManifest);\n\n if (!result.success) {\n throw new ManifestError(`Invalid manifest: ${result.error.message}`);\n }\n\n cachedManifest = result.data;\n cachedManifestDir = tuckDir;\n\n return cachedManifest;\n } catch (error) {\n if (error instanceof ManifestError) {\n throw error;\n }\n if (error instanceof SyntaxError) {\n throw new ManifestError('Manifest file contains invalid JSON');\n }\n throw new ManifestError(`Failed to load manifest: ${error}`);\n }\n};\n\nexport const saveManifest = async (\n manifest: TuckManifestOutput,\n tuckDir: string\n): Promise<void> => {\n const manifestPath = getManifestPath(tuckDir);\n\n // Update the updated timestamp\n manifest.updated = new Date().toISOString();\n\n // Validate before saving\n const result = tuckManifestSchema.safeParse(manifest);\n if (!result.success) {\n throw new ManifestError(`Invalid manifest: ${result.error.message}`);\n }\n\n try {\n await writeFile(manifestPath, JSON.stringify(result.data, null, 2) + '\\n', 'utf-8');\n cachedManifest = result.data;\n cachedManifestDir = tuckDir;\n } catch (error) {\n throw new ManifestError(`Failed to save manifest: ${error}`);\n }\n};\n\nexport const createManifest = async (\n tuckDir: string,\n machine?: string\n): Promise<TuckManifestOutput> => {\n const manifestPath = getManifestPath(tuckDir);\n\n if (await pathExists(manifestPath)) {\n throw new ManifestError('Manifest already exists');\n }\n\n const manifest = createEmptyManifest(machine);\n\n try {\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\\n', 'utf-8');\n cachedManifest = manifest;\n cachedManifestDir = tuckDir;\n return manifest;\n } catch (error) {\n throw new ManifestError(`Failed to create manifest: ${error}`);\n }\n};\n\nexport const addFileToManifest = async (\n tuckDir: string,\n id: string,\n file: TrackedFileOutput\n): Promise<void> => {\n const manifest = await loadManifest(tuckDir);\n\n if (manifest.files[id]) {\n throw new ManifestError(`File already tracked with ID: ${id}`);\n }\n\n manifest.files[id] = file;\n await saveManifest(manifest, tuckDir);\n};\n\nexport const updateFileInManifest = async (\n tuckDir: string,\n id: string,\n updates: Partial<TrackedFileOutput>\n): Promise<void> => {\n const manifest = await loadManifest(tuckDir);\n\n if (!manifest.files[id]) {\n throw new ManifestError(`File not found in manifest: ${id}`);\n }\n\n manifest.files[id] = {\n ...manifest.files[id],\n ...updates,\n modified: new Date().toISOString(),\n };\n\n await saveManifest(manifest, tuckDir);\n};\n\nexport const removeFileFromManifest = async (tuckDir: string, id: string): Promise<void> => {\n const manifest = await loadManifest(tuckDir);\n\n if (!manifest.files[id]) {\n throw new ManifestError(`File not found in manifest: ${id}`);\n }\n\n delete manifest.files[id];\n await saveManifest(manifest, tuckDir);\n};\n\nexport const getTrackedFile = async (\n tuckDir: string,\n id: string\n): Promise<TrackedFileOutput | null> => {\n const manifest = await loadManifest(tuckDir);\n return manifest.files[id] || null;\n};\n\nexport const getTrackedFileBySource = async (\n tuckDir: string,\n source: string\n): Promise<{ id: string; file: TrackedFileOutput } | null> => {\n const manifest = await loadManifest(tuckDir);\n\n for (const [id, file] of Object.entries(manifest.files)) {\n if (file.source === source) {\n return { id, file };\n }\n }\n\n return null;\n};\n\nexport const getAllTrackedFiles = async (\n tuckDir: string\n): Promise<Record<string, TrackedFileOutput>> => {\n const manifest = await loadManifest(tuckDir);\n return manifest.files;\n};\n\nexport const getTrackedFilesByCategory = async (\n tuckDir: string,\n category: string\n): Promise<Record<string, TrackedFileOutput>> => {\n const manifest = await loadManifest(tuckDir);\n const filtered: Record<string, TrackedFileOutput> = {};\n\n for (const [id, file] of Object.entries(manifest.files)) {\n if (file.category === category) {\n filtered[id] = file;\n }\n }\n\n return filtered;\n};\n\nexport const isFileTracked = async (tuckDir: string, source: string): Promise<boolean> => {\n const result = await getTrackedFileBySource(tuckDir, source);\n return result !== null;\n};\n\nexport const getFileCount = async (tuckDir: string): Promise<number> => {\n const manifest = await loadManifest(tuckDir);\n return Object.keys(manifest.files).length;\n};\n\nexport const getCategories = async (tuckDir: string): Promise<string[]> => {\n const manifest = await loadManifest(tuckDir);\n const categories = new Set<string>();\n\n for (const file of Object.values(manifest.files)) {\n categories.add(file.category);\n }\n\n return Array.from(categories).sort();\n};\n\nexport const clearManifestCache = (): void => {\n cachedManifest = null;\n cachedManifestDir = null;\n};\n","import { z } from 'zod';\n\nexport const fileStrategySchema = z.enum(['copy', 'symlink']);\n\nexport const trackedFileSchema = z.object({\n source: z.string(),\n destination: z.string(),\n category: z.string(),\n strategy: fileStrategySchema,\n encrypted: z.boolean().default(false),\n template: z.boolean().default(false),\n permissions: z.string().optional(),\n added: z.string(),\n modified: z.string(),\n checksum: z.string(),\n});\n\nexport const tuckManifestSchema = z.object({\n version: z.string(),\n created: z.string(),\n updated: z.string(),\n machine: z.string().optional(),\n files: z.record(trackedFileSchema),\n});\n\nexport type TrackedFileInput = z.input<typeof trackedFileSchema>;\nexport type TrackedFileOutput = z.output<typeof trackedFileSchema>;\nexport type TuckManifestInput = z.input<typeof tuckManifestSchema>;\nexport type TuckManifestOutput = z.output<typeof tuckManifestSchema>;\n\nexport const createEmptyManifest = (machine?: string): TuckManifestOutput => {\n const now = new Date().toISOString();\n return {\n version: '1.0.0',\n created: now,\n updated: now,\n machine,\n files: {},\n };\n};\n","import simpleGit, { SimpleGit, StatusResult } from 'simple-git';\nimport { GitError } from '../errors.js';\nimport { pathExists } from './paths.js';\nimport { join } from 'path';\n\nexport interface GitStatus {\n isRepo: boolean;\n branch: string;\n tracking?: string;\n ahead: number;\n behind: number;\n staged: string[];\n modified: string[];\n untracked: string[];\n deleted: string[];\n hasChanges: boolean;\n}\n\nexport interface GitCommit {\n hash: string;\n date: string;\n message: string;\n author: string;\n}\n\nconst createGit = (dir: string): SimpleGit => {\n return simpleGit(dir, {\n binary: 'git',\n maxConcurrentProcesses: 6,\n trimmed: true,\n });\n};\n\nexport const isGitRepo = async (dir: string): Promise<boolean> => {\n const gitDir = join(dir, '.git');\n return pathExists(gitDir);\n};\n\nexport const initRepo = async (dir: string): Promise<void> => {\n try {\n const git = createGit(dir);\n await git.init();\n } catch (error) {\n throw new GitError('Failed to initialize repository', String(error));\n }\n};\n\nexport const cloneRepo = async (url: string, dir: string): Promise<void> => {\n try {\n const git = simpleGit();\n await git.clone(url, dir);\n } catch (error) {\n throw new GitError(`Failed to clone repository from ${url}`, String(error));\n }\n};\n\nexport const addRemote = async (dir: string, name: string, url: string): Promise<void> => {\n try {\n const git = createGit(dir);\n await git.addRemote(name, url);\n } catch (error) {\n throw new GitError('Failed to add remote', String(error));\n }\n};\n\nexport const getRemotes = async (dir: string): Promise<{ name: string; url: string }[]> => {\n try {\n const git = createGit(dir);\n const remotes = await git.getRemotes(true);\n return remotes.map((r) => ({ name: r.name, url: r.refs.fetch || r.refs.push || '' }));\n } catch (error) {\n throw new GitError('Failed to get remotes', String(error));\n }\n};\n\nexport const getStatus = async (dir: string): Promise<GitStatus> => {\n try {\n const git = createGit(dir);\n const status: StatusResult = await git.status();\n\n return {\n isRepo: true,\n branch: status.current || 'main',\n tracking: status.tracking || undefined,\n ahead: status.ahead,\n behind: status.behind,\n staged: status.staged,\n modified: status.modified,\n untracked: status.not_added,\n deleted: status.deleted,\n hasChanges: !status.isClean(),\n };\n } catch (error) {\n throw new GitError('Failed to get status', String(error));\n }\n};\n\nexport const stageFiles = async (dir: string, files: string[]): Promise<void> => {\n try {\n const git = createGit(dir);\n await git.add(files);\n } catch (error) {\n throw new GitError('Failed to stage files', String(error));\n }\n};\n\nexport const stageAll = async (dir: string): Promise<void> => {\n try {\n const git = createGit(dir);\n await git.add('.');\n } catch (error) {\n throw new GitError('Failed to stage all files', String(error));\n }\n};\n\nexport const commit = async (dir: string, message: string): Promise<string> => {\n try {\n const git = createGit(dir);\n const result = await git.commit(message);\n return result.commit;\n } catch (error) {\n throw new GitError('Failed to commit', String(error));\n }\n};\n\nexport const push = async (\n dir: string,\n options?: { remote?: string; branch?: string; force?: boolean; setUpstream?: boolean }\n): Promise<void> => {\n try {\n const git = createGit(dir);\n const args: string[] = [];\n\n if (options?.setUpstream) {\n args.push('-u');\n }\n if (options?.force) {\n args.push('--force');\n }\n\n const remote = options?.remote || 'origin';\n const branch = options?.branch;\n\n if (branch) {\n await git.push([remote, branch, ...args]);\n } else {\n await git.push([remote, ...args]);\n }\n } catch (error) {\n throw new GitError('Failed to push', String(error));\n }\n};\n\nexport const pull = async (\n dir: string,\n options?: { remote?: string; branch?: string; rebase?: boolean }\n): Promise<void> => {\n try {\n const git = createGit(dir);\n const args: string[] = [];\n\n if (options?.rebase) {\n args.push('--rebase');\n }\n\n const remote = options?.remote || 'origin';\n const branch = options?.branch;\n\n if (branch) {\n await git.pull(remote, branch, args);\n } else {\n await git.pull(remote, undefined, args);\n }\n } catch (error) {\n throw new GitError('Failed to pull', String(error));\n }\n};\n\nexport const fetch = async (dir: string, remote = 'origin'): Promise<void> => {\n try {\n const git = createGit(dir);\n await git.fetch(remote);\n } catch (error) {\n throw new GitError('Failed to fetch', String(error));\n }\n};\n\nexport const getLog = async (\n dir: string,\n options?: { maxCount?: number }\n): Promise<GitCommit[]> => {\n try {\n const git = createGit(dir);\n const log = await git.log({\n maxCount: options?.maxCount || 10,\n });\n\n return log.all.map((entry) => ({\n hash: entry.hash,\n date: entry.date,\n message: entry.message,\n author: entry.author_name || 'Unknown',\n }));\n } catch (error) {\n throw new GitError('Failed to get log', String(error));\n }\n};\n\nexport const getDiff = async (\n dir: string,\n options?: { staged?: boolean; stat?: boolean; files?: string[] }\n): Promise<string> => {\n try {\n const git = createGit(dir);\n const args: string[] = [];\n\n if (options?.staged) {\n args.push('--staged');\n }\n if (options?.stat) {\n args.push('--stat');\n }\n if (options?.files) {\n args.push('--');\n args.push(...options.files);\n }\n\n const result = await git.diff(args);\n return result;\n } catch (error) {\n throw new GitError('Failed to get diff', String(error));\n }\n};\n\nexport const getCurrentBranch = async (dir: string): Promise<string> => {\n try {\n const git = createGit(dir);\n const branch = await git.revparse(['--abbrev-ref', 'HEAD']);\n return branch;\n } catch (error) {\n throw new GitError('Failed to get current branch', String(error));\n }\n};\n\nexport const hasRemote = async (dir: string, name = 'origin'): Promise<boolean> => {\n try {\n const remotes = await getRemotes(dir);\n return remotes.some((r) => r.name === name);\n } catch {\n return false;\n }\n};\n\nexport const getRemoteUrl = async (dir: string, name = 'origin'): Promise<string | null> => {\n try {\n const remotes = await getRemotes(dir);\n const remote = remotes.find((r) => r.name === name);\n return remote?.url || null;\n } catch {\n return null;\n }\n};\n\nexport const setDefaultBranch = async (dir: string, branch: string): Promise<void> => {\n try {\n const git = createGit(dir);\n await git.branch(['-M', branch]);\n } catch (error) {\n throw new GitError('Failed to set default branch', String(error));\n }\n};\n","import { Command } from 'commander';\nimport { prompts, logger, withSpinner } from '../ui/index.js';\nimport {\n getTuckDir,\n expandPath,\n collapsePath,\n pathExists,\n isDirectory,\n detectCategory,\n sanitizeFilename,\n getDestinationPath,\n getRelativeDestination,\n generateFileId,\n} from '../lib/paths.js';\nimport { loadConfig } from '../lib/config.js';\nimport {\n addFileToManifest,\n isFileTracked,\n loadManifest,\n} from '../lib/manifest.js';\nimport { copyFileOrDir, getFileChecksum, getDirectoryFileCount, getFileInfo } from '../lib/files.js';\nimport { NotInitializedError, FileNotFoundError, FileAlreadyTrackedError } from '../errors.js';\nimport { CATEGORIES } from '../constants.js';\nimport type { AddOptions } from '../types.js';\n\ninterface FileToAdd {\n source: string;\n destination: string;\n category: string;\n filename: string;\n isDir: boolean;\n fileCount: number;\n}\n\nconst validateAndPrepareFiles = async (\n paths: string[],\n tuckDir: string,\n options: AddOptions\n): Promise<FileToAdd[]> => {\n const filesToAdd: FileToAdd[] = [];\n\n for (const path of paths) {\n const expandedPath = expandPath(path);\n const collapsedPath = collapsePath(expandedPath);\n\n // Check if file exists\n if (!(await pathExists(expandedPath))) {\n throw new FileNotFoundError(path);\n }\n\n // Check if already tracked\n if (await isFileTracked(tuckDir, collapsedPath)) {\n throw new FileAlreadyTrackedError(path);\n }\n\n // Determine if it's a directory\n const isDir = await isDirectory(expandedPath);\n const fileCount = isDir ? await getDirectoryFileCount(expandedPath) : 1;\n\n // Determine category\n const category = options.category || detectCategory(expandedPath);\n\n // Generate filename for storage\n const filename = options.name || sanitizeFilename(expandedPath);\n\n // Determine destination path\n const destination = getDestinationPath(tuckDir, category, filename);\n\n filesToAdd.push({\n source: collapsedPath,\n destination,\n category,\n filename,\n isDir,\n fileCount,\n });\n }\n\n return filesToAdd;\n};\n\nconst addFiles = async (\n filesToAdd: FileToAdd[],\n tuckDir: string,\n options: AddOptions\n): Promise<void> => {\n const config = await loadConfig(tuckDir);\n const strategy = options.symlink ? 'symlink' : (config.files.strategy || 'copy');\n\n for (const file of filesToAdd) {\n const expandedSource = expandPath(file.source);\n\n // Copy file to repository\n await withSpinner(`Copying ${file.source}...`, async () => {\n await copyFileOrDir(expandedSource, file.destination, { overwrite: true });\n });\n\n // Get file info\n const checksum = await getFileChecksum(file.destination);\n const info = await getFileInfo(expandedSource);\n const now = new Date().toISOString();\n\n // Generate unique ID\n const id = generateFileId(file.source);\n\n // Add to manifest\n await addFileToManifest(tuckDir, id, {\n source: file.source,\n destination: getRelativeDestination(file.category, file.filename),\n category: file.category,\n strategy,\n encrypted: options.encrypt || false,\n template: options.template || false,\n permissions: info.permissions,\n added: now,\n modified: now,\n checksum,\n });\n\n // Log result\n const categoryInfo = CATEGORIES[file.category];\n const icon = categoryInfo?.icon || '📄';\n logger.success(`Added ${file.source}`);\n logger.dim(` ${icon} Category: ${file.category}`);\n if (file.isDir) {\n logger.dim(` 📁 Directory with ${file.fileCount} files`);\n }\n }\n};\n\nconst runInteractiveAdd = async (tuckDir: string): Promise<void> => {\n prompts.intro('tuck add');\n\n // Ask for paths\n const pathsInput = await prompts.text('Enter file paths to track (space-separated):', {\n placeholder: '~/.zshrc ~/.gitconfig',\n validate: (value) => {\n if (!value.trim()) return 'At least one path is required';\n return undefined;\n },\n });\n\n const paths = pathsInput.split(/\\s+/).filter(Boolean);\n\n // Validate and prepare\n let filesToAdd: FileToAdd[];\n try {\n filesToAdd = await validateAndPrepareFiles(paths, tuckDir, {});\n } catch (error) {\n if (error instanceof Error) {\n prompts.log.error(error.message);\n }\n prompts.cancel();\n return;\n }\n\n // Show what will be added and ask for category confirmation\n for (const file of filesToAdd) {\n prompts.log.step(`${file.source}`);\n\n const categoryOptions = Object.entries(CATEGORIES).map(([name, config]) => ({\n value: name,\n label: `${config.icon} ${name}`,\n hint: file.category === name ? '(auto-detected)' : undefined,\n }));\n\n // Move detected category to top\n categoryOptions.sort((a, b) => {\n if (a.value === file.category) return -1;\n if (b.value === file.category) return 1;\n return 0;\n });\n\n const selectedCategory = await prompts.select('Category:', categoryOptions);\n file.category = selectedCategory as string;\n\n // Update destination with new category\n file.destination = getDestinationPath(tuckDir, file.category, file.filename);\n }\n\n // Confirm\n const confirm = await prompts.confirm(\n `Add ${filesToAdd.length} ${filesToAdd.length === 1 ? 'file' : 'files'}?`,\n true\n );\n\n if (!confirm) {\n prompts.cancel('Operation cancelled');\n return;\n }\n\n // Add files\n await addFiles(filesToAdd, tuckDir, {});\n\n prompts.outro(`Added ${filesToAdd.length} ${filesToAdd.length === 1 ? 'file' : 'files'}`);\n logger.info(\"Run 'tuck sync' to commit changes\");\n};\n\nconst runAdd = async (paths: string[], options: AddOptions): Promise<void> => {\n const tuckDir = getTuckDir();\n\n // Verify tuck is initialized\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n\n if (paths.length === 0) {\n await runInteractiveAdd(tuckDir);\n return;\n }\n\n // Validate and prepare files\n const filesToAdd = await validateAndPrepareFiles(paths, tuckDir, options);\n\n // Add files\n await addFiles(filesToAdd, tuckDir, options);\n\n logger.blank();\n logger.success(`Added ${filesToAdd.length} ${filesToAdd.length === 1 ? 'item' : 'items'}`);\n logger.info(\"Run 'tuck sync' to commit changes\");\n};\n\nexport const addCommand = new Command('add')\n .description('Track new dotfiles')\n .argument('[paths...]', 'Paths to dotfiles to track')\n .option('-c, --category <name>', 'Category to organize under')\n .option('-n, --name <name>', 'Custom name for the file in manifest')\n .option('--symlink', 'Create symlink instead of copy')\n .option('--encrypt', 'Encrypt this file (requires GPG setup)')\n .option('--template', 'Treat as template with variable substitution')\n .action(async (paths: string[], options: AddOptions) => {\n await runAdd(paths, options);\n });\n","import { createHash } from 'crypto';\nimport { readFile, stat, readdir, copyFile, symlink, unlink, rm } from 'fs/promises';\nimport { copy, ensureDir } from 'fs-extra';\nimport { join, dirname } from 'path';\nimport { FileNotFoundError, PermissionError } from '../errors.js';\nimport { expandPath, pathExists, isDirectory } from './paths.js';\n\nexport interface FileInfo {\n path: string;\n isDirectory: boolean;\n isSymlink: boolean;\n size: number;\n permissions: string;\n modified: Date;\n}\n\nexport interface CopyResult {\n source: string;\n destination: string;\n fileCount: number;\n totalSize: number;\n}\n\nexport const getFileChecksum = async (filepath: string): Promise<string> => {\n const expandedPath = expandPath(filepath);\n\n if (await isDirectory(expandedPath)) {\n // For directories, create a hash of all file checksums\n const files = await getDirectoryFiles(expandedPath);\n const hashes: string[] = [];\n\n for (const file of files) {\n const content = await readFile(file);\n hashes.push(createHash('sha256').update(content).digest('hex'));\n }\n\n return createHash('sha256').update(hashes.join('')).digest('hex');\n }\n\n const content = await readFile(expandedPath);\n return createHash('sha256').update(content).digest('hex');\n};\n\nexport const getFileInfo = async (filepath: string): Promise<FileInfo> => {\n const expandedPath = expandPath(filepath);\n\n if (!(await pathExists(expandedPath))) {\n throw new FileNotFoundError(filepath);\n }\n\n try {\n const stats = await stat(expandedPath);\n const permissions = (stats.mode & 0o777).toString(8).padStart(3, '0');\n\n return {\n path: expandedPath,\n isDirectory: stats.isDirectory(),\n isSymlink: stats.isSymbolicLink(),\n size: stats.size,\n permissions,\n modified: stats.mtime,\n };\n } catch (error) {\n throw new PermissionError(filepath, 'read');\n }\n};\n\nexport const getDirectoryFiles = async (dirpath: string): Promise<string[]> => {\n const expandedPath = expandPath(dirpath);\n const files: string[] = [];\n\n const entries = await readdir(expandedPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = join(expandedPath, entry.name);\n\n if (entry.isDirectory()) {\n const subFiles = await getDirectoryFiles(entryPath);\n files.push(...subFiles);\n } else if (entry.isFile()) {\n files.push(entryPath);\n }\n }\n\n return files.sort();\n};\n\nexport const getDirectoryFileCount = async (dirpath: string): Promise<number> => {\n const files = await getDirectoryFiles(dirpath);\n return files.length;\n};\n\nexport const copyFileOrDir = async (\n source: string,\n destination: string,\n options?: { overwrite?: boolean }\n): Promise<CopyResult> => {\n const expandedSource = expandPath(source);\n const expandedDest = expandPath(destination);\n\n if (!(await pathExists(expandedSource))) {\n throw new FileNotFoundError(source);\n }\n\n // Ensure destination directory exists\n await ensureDir(dirname(expandedDest));\n\n const sourceIsDir = await isDirectory(expandedSource);\n\n try {\n if (sourceIsDir) {\n await copy(expandedSource, expandedDest, { overwrite: options?.overwrite ?? true });\n const fileCount = await getDirectoryFileCount(expandedDest);\n const files = await getDirectoryFiles(expandedDest);\n let totalSize = 0;\n for (const file of files) {\n const stats = await stat(file);\n totalSize += stats.size;\n }\n return { source: expandedSource, destination: expandedDest, fileCount, totalSize };\n } else {\n await copyFile(expandedSource, expandedDest);\n const stats = await stat(expandedDest);\n return { source: expandedSource, destination: expandedDest, fileCount: 1, totalSize: stats.size };\n }\n } catch (error) {\n throw new PermissionError(destination, 'write');\n }\n};\n\nexport const createSymlink = async (\n target: string,\n linkPath: string,\n options?: { overwrite?: boolean }\n): Promise<void> => {\n const expandedTarget = expandPath(target);\n const expandedLink = expandPath(linkPath);\n\n if (!(await pathExists(expandedTarget))) {\n throw new FileNotFoundError(target);\n }\n\n // Ensure link parent directory exists\n await ensureDir(dirname(expandedLink));\n\n // Remove existing file/symlink if overwrite is true\n if (options?.overwrite && (await pathExists(expandedLink))) {\n await unlink(expandedLink);\n }\n\n try {\n await symlink(expandedTarget, expandedLink);\n } catch (error) {\n throw new PermissionError(linkPath, 'create symlink');\n }\n};\n\nexport const deleteFileOrDir = async (filepath: string): Promise<void> => {\n const expandedPath = expandPath(filepath);\n\n if (!(await pathExists(expandedPath))) {\n return; // Already deleted\n }\n\n try {\n if (await isDirectory(expandedPath)) {\n await rm(expandedPath, { recursive: true });\n } else {\n await unlink(expandedPath);\n }\n } catch (error) {\n throw new PermissionError(filepath, 'delete');\n }\n};\n\nexport const ensureDirectory = async (dirpath: string): Promise<void> => {\n const expandedPath = expandPath(dirpath);\n await ensureDir(expandedPath);\n};\n\nexport const moveFile = async (\n source: string,\n destination: string,\n options?: { overwrite?: boolean }\n): Promise<void> => {\n await copyFileOrDir(source, destination, options);\n await deleteFileOrDir(source);\n};\n\nexport const hasFileChanged = async (\n file1: string,\n file2: string\n): Promise<boolean> => {\n const expandedFile1 = expandPath(file1);\n const expandedFile2 = expandPath(file2);\n\n // If either doesn't exist, they're different\n if (!(await pathExists(expandedFile1)) || !(await pathExists(expandedFile2))) {\n return true;\n }\n\n const checksum1 = await getFileChecksum(expandedFile1);\n const checksum2 = await getFileChecksum(expandedFile2);\n\n return checksum1 !== checksum2;\n};\n\nexport const getFilePermissions = async (filepath: string): Promise<string> => {\n const expandedPath = expandPath(filepath);\n const stats = await stat(expandedPath);\n return (stats.mode & 0o777).toString(8).padStart(3, '0');\n};\n\nexport const setFilePermissions = async (filepath: string, mode: string): Promise<void> => {\n const expandedPath = expandPath(filepath);\n const { chmod } = await import('fs/promises');\n await chmod(expandedPath, parseInt(mode, 8));\n};\n\nexport const formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n};\n","import { Command } from 'commander';\nimport { prompts, logger, withSpinner } from '../ui/index.js';\nimport {\n getTuckDir,\n expandPath,\n collapsePath,\n pathExists,\n} from '../lib/paths.js';\nimport { loadManifest, removeFileFromManifest, getTrackedFileBySource, getAllTrackedFiles } from '../lib/manifest.js';\nimport { deleteFileOrDir } from '../lib/files.js';\nimport { NotInitializedError, FileNotTrackedError } from '../errors.js';\nimport type { RemoveOptions } from '../types.js';\nimport { join } from 'path';\n\ninterface FileToRemove {\n id: string;\n source: string;\n destination: string;\n}\n\nconst validateAndPrepareFiles = async (\n paths: string[],\n tuckDir: string\n): Promise<FileToRemove[]> => {\n const filesToRemove: FileToRemove[] = [];\n\n for (const path of paths) {\n const expandedPath = expandPath(path);\n const collapsedPath = collapsePath(expandedPath);\n\n // Check if tracked\n const tracked = await getTrackedFileBySource(tuckDir, collapsedPath);\n if (!tracked) {\n throw new FileNotTrackedError(path);\n }\n\n filesToRemove.push({\n id: tracked.id,\n source: tracked.file.source,\n destination: join(tuckDir, tracked.file.destination),\n });\n }\n\n return filesToRemove;\n};\n\nconst removeFiles = async (\n filesToRemove: FileToRemove[],\n tuckDir: string,\n options: RemoveOptions\n): Promise<void> => {\n for (const file of filesToRemove) {\n // Remove from manifest\n await removeFileFromManifest(tuckDir, file.id);\n\n // Delete from repository if requested\n if (options.delete) {\n if (await pathExists(file.destination)) {\n await withSpinner(`Deleting ${file.source} from repository...`, async () => {\n await deleteFileOrDir(file.destination);\n });\n }\n }\n\n logger.success(`Removed ${file.source} from tracking`);\n if (options.delete) {\n logger.dim(' Also deleted from repository');\n }\n }\n};\n\nconst runInteractiveRemove = async (tuckDir: string): Promise<void> => {\n prompts.intro('tuck remove');\n\n // Get all tracked files\n const trackedFiles = await getAllTrackedFiles(tuckDir);\n const fileEntries = Object.entries(trackedFiles);\n\n if (fileEntries.length === 0) {\n prompts.log.warning('No files are currently tracked');\n prompts.outro('');\n return;\n }\n\n // Let user select files to remove\n const selectedFiles = await prompts.multiselect(\n 'Select files to stop tracking:',\n fileEntries.map(([id, file]) => ({\n value: id,\n label: file.source,\n hint: file.category,\n })),\n true\n );\n\n if (selectedFiles.length === 0) {\n prompts.cancel('No files selected');\n return;\n }\n\n // Ask if they want to delete from repo\n const shouldDelete = await prompts.confirm('Also delete files from repository?');\n\n // Confirm\n const confirm = await prompts.confirm(\n `Remove ${selectedFiles.length} ${selectedFiles.length === 1 ? 'file' : 'files'} from tracking?`,\n true\n );\n\n if (!confirm) {\n prompts.cancel('Operation cancelled');\n return;\n }\n\n // Prepare files to remove\n const filesToRemove: FileToRemove[] = selectedFiles.map((id) => {\n const file = trackedFiles[id as string];\n return {\n id: id as string,\n source: file.source,\n destination: join(tuckDir, file.destination),\n };\n });\n\n // Remove files\n await removeFiles(filesToRemove, tuckDir, { delete: shouldDelete });\n\n prompts.outro(`Removed ${selectedFiles.length} ${selectedFiles.length === 1 ? 'file' : 'files'}`);\n logger.info(\"Run 'tuck sync' to commit changes\");\n};\n\nconst runRemove = async (paths: string[], options: RemoveOptions): Promise<void> => {\n const tuckDir = getTuckDir();\n\n // Verify tuck is initialized\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n\n if (paths.length === 0) {\n await runInteractiveRemove(tuckDir);\n return;\n }\n\n // Validate and prepare files\n const filesToRemove = await validateAndPrepareFiles(paths, tuckDir);\n\n // Remove files\n await removeFiles(filesToRemove, tuckDir, options);\n\n logger.blank();\n logger.success(`Removed ${filesToRemove.length} ${filesToRemove.length === 1 ? 'item' : 'items'} from tracking`);\n logger.info(\"Run 'tuck sync' to commit changes\");\n};\n\nexport const removeCommand = new Command('remove')\n .description('Stop tracking dotfiles')\n .argument('[paths...]', 'Paths to dotfiles to untrack')\n .option('--delete', 'Also delete from tuck repository')\n .option('--keep-original', \"Don't restore symlinks to regular files\")\n .action(async (paths: string[], options: RemoveOptions) => {\n await runRemove(paths, options);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { join } from 'path';\nimport { prompts, logger, withSpinner } from '../ui/index.js';\nimport { getTuckDir, expandPath, pathExists } from '../lib/paths.js';\nimport { loadManifest, getAllTrackedFiles, updateFileInManifest } from '../lib/manifest.js';\nimport { stageAll, commit, getStatus } from '../lib/git.js';\nimport { copyFileOrDir, getFileChecksum } from '../lib/files.js';\nimport { runPreSyncHook, runPostSyncHook, type HookOptions } from '../lib/hooks.js';\nimport { NotInitializedError } from '../errors.js';\nimport type { SyncOptions, FileChange } from '../types.js';\n\ninterface SyncResult {\n modified: string[];\n added: string[];\n deleted: string[];\n commitHash?: string;\n}\n\nconst detectChanges = async (tuckDir: string): Promise<FileChange[]> => {\n const files = await getAllTrackedFiles(tuckDir);\n const changes: FileChange[] = [];\n\n for (const [, file] of Object.entries(files)) {\n const sourcePath = expandPath(file.source);\n\n // Check if source still exists\n if (!(await pathExists(sourcePath))) {\n changes.push({\n path: file.source,\n status: 'deleted',\n source: file.source,\n destination: file.destination,\n });\n continue;\n }\n\n // Check if file has changed compared to stored checksum\n try {\n const sourceChecksum = await getFileChecksum(sourcePath);\n if (sourceChecksum !== file.checksum) {\n changes.push({\n path: file.source,\n status: 'modified',\n source: file.source,\n destination: file.destination,\n });\n }\n } catch {\n changes.push({\n path: file.source,\n status: 'modified',\n source: file.source,\n destination: file.destination,\n });\n }\n }\n\n return changes;\n};\n\nconst generateCommitMessage = (result: SyncResult): string => {\n const parts: string[] = [];\n\n if (result.added.length > 0) {\n parts.push(`Add: ${result.added.join(', ')}`);\n }\n if (result.modified.length > 0) {\n parts.push(`Update: ${result.modified.join(', ')}`);\n }\n if (result.deleted.length > 0) {\n parts.push(`Remove: ${result.deleted.join(', ')}`);\n }\n\n if (parts.length === 0) {\n return 'Sync dotfiles';\n }\n\n const totalCount =\n result.added.length + result.modified.length + result.deleted.length;\n\n if (parts.length === 1 && totalCount <= 3) {\n return parts[0];\n }\n\n return `Sync: ${totalCount} file${totalCount > 1 ? 's' : ''} changed`;\n};\n\nconst syncFiles = async (\n tuckDir: string,\n changes: FileChange[],\n options: SyncOptions\n): Promise<SyncResult> => {\n const result: SyncResult = {\n modified: [],\n added: [],\n deleted: [],\n };\n\n // Prepare hook options\n const hookOptions: HookOptions = {\n skipHooks: options.noHooks,\n trustHooks: options.trustHooks,\n };\n\n // Run pre-sync hook\n await runPreSyncHook(tuckDir, hookOptions);\n\n // Process each change\n for (const change of changes) {\n const sourcePath = expandPath(change.source);\n const destPath = join(tuckDir, change.destination!);\n\n if (change.status === 'modified') {\n await withSpinner(`Syncing ${change.path}...`, async () => {\n await copyFileOrDir(sourcePath, destPath, { overwrite: true });\n\n // Update checksum in manifest\n const newChecksum = await getFileChecksum(destPath);\n const files = await getAllTrackedFiles(tuckDir);\n const fileId = Object.entries(files).find(([, f]) => f.source === change.source)?.[0];\n\n if (fileId) {\n await updateFileInManifest(tuckDir, fileId, {\n checksum: newChecksum,\n modified: new Date().toISOString(),\n });\n }\n });\n result.modified.push(change.path.split('/').pop() || change.path);\n } else if (change.status === 'deleted') {\n logger.warning(`Source file deleted: ${change.path}`);\n result.deleted.push(change.path.split('/').pop() || change.path);\n }\n }\n\n // Stage and commit if not --no-commit\n if (!options.noCommit && (result.modified.length > 0 || result.deleted.length > 0)) {\n await withSpinner('Staging changes...', async () => {\n await stageAll(tuckDir);\n });\n\n const message = options.message || generateCommitMessage(result);\n\n await withSpinner('Committing...', async () => {\n result.commitHash = await commit(tuckDir, message);\n });\n }\n\n // Run post-sync hook\n await runPostSyncHook(tuckDir, hookOptions);\n\n return result;\n};\n\nconst runInteractiveSync = async (tuckDir: string): Promise<void> => {\n prompts.intro('tuck sync');\n\n // Detect changes\n const spinner = prompts.spinner();\n spinner.start('Detecting changes...');\n const changes = await detectChanges(tuckDir);\n spinner.stop('Changes detected');\n\n if (changes.length === 0) {\n // Check for git changes\n const gitStatus = await getStatus(tuckDir);\n if (gitStatus.hasChanges) {\n prompts.log.info('No dotfile changes, but repository has uncommitted changes');\n\n const commitAnyway = await prompts.confirm('Commit repository changes?');\n if (commitAnyway) {\n const message = await prompts.text('Commit message:', {\n defaultValue: 'Update dotfiles',\n });\n\n await stageAll(tuckDir);\n const hash = await commit(tuckDir, message);\n prompts.log.success(`Committed: ${hash.slice(0, 7)}`);\n }\n } else {\n prompts.log.success('Everything is up to date');\n }\n return;\n }\n\n // Show changes\n console.log();\n console.log(chalk.bold('Changes detected:'));\n for (const change of changes) {\n if (change.status === 'modified') {\n console.log(chalk.yellow(` ~ ${change.path}`));\n } else if (change.status === 'deleted') {\n console.log(chalk.red(` - ${change.path}`));\n }\n }\n console.log();\n\n // Confirm\n const confirm = await prompts.confirm('Sync these changes?', true);\n if (!confirm) {\n prompts.cancel('Operation cancelled');\n return;\n }\n\n // Get commit message\n const autoMessage = generateCommitMessage({\n modified: changes.filter((c) => c.status === 'modified').map((c) => c.path),\n added: [],\n deleted: changes.filter((c) => c.status === 'deleted').map((c) => c.path),\n });\n\n const message = await prompts.text('Commit message:', {\n defaultValue: autoMessage,\n });\n\n // Sync\n const result = await syncFiles(tuckDir, changes, { message });\n\n console.log();\n if (result.commitHash) {\n prompts.log.success(`Committed: ${result.commitHash.slice(0, 7)}`);\n }\n\n prompts.outro('Synced successfully!');\n logger.info(\"Run 'tuck push' to upload to remote\");\n};\n\nconst runSync = async (messageArg: string | undefined, options: SyncOptions): Promise<void> => {\n const tuckDir = getTuckDir();\n\n // Verify tuck is initialized\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n\n // If no options, run interactive\n if (!messageArg && !options.message && !options.all && !options.noCommit && !options.amend) {\n await runInteractiveSync(tuckDir);\n return;\n }\n\n // Detect changes\n const changes = await detectChanges(tuckDir);\n\n if (changes.length === 0) {\n logger.info('No changes detected');\n return;\n }\n\n // Show changes\n logger.heading('Changes detected:');\n for (const change of changes) {\n logger.file(change.status === 'modified' ? 'modify' : 'delete', change.path);\n }\n logger.blank();\n\n // Sync\n const message = messageArg || options.message;\n const result = await syncFiles(tuckDir, changes, { ...options, message });\n\n logger.blank();\n logger.success(`Synced ${changes.length} file${changes.length > 1 ? 's' : ''}`);\n\n if (result.commitHash) {\n logger.info(`Commit: ${result.commitHash.slice(0, 7)}`);\n }\n\n logger.info(\"Run 'tuck push' to upload to remote\");\n};\n\nexport const syncCommand = new Command('sync')\n .description('Sync changes to repository')\n .argument('[message]', 'Commit message')\n .option('-m, --message <msg>', 'Commit message')\n .option('-a, --all', 'Sync all tracked files, not just changed')\n .option('--no-commit', \"Stage changes but don't commit\")\n .option('--amend', 'Amend previous commit')\n .option('--no-hooks', 'Skip execution of pre/post sync hooks')\n .option('--trust-hooks', 'Trust and run hooks without confirmation (use with caution)')\n .action(async (messageArg: string | undefined, options: SyncOptions) => {\n await runSync(messageArg, options);\n });\n","import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport chalk from 'chalk';\nimport { loadConfig } from './config.js';\nimport { logger } from '../ui/logger.js';\nimport { prompts } from '../ui/prompts.js';\n\nconst execAsync = promisify(exec);\n\nexport type HookType = 'preSync' | 'postSync' | 'preRestore' | 'postRestore';\n\nexport interface HookResult {\n success: boolean;\n output?: string;\n error?: string;\n skipped?: boolean;\n}\n\nexport interface HookOptions {\n silent?: boolean;\n skipHooks?: boolean;\n trustHooks?: boolean;\n}\n\n/**\n * SECURITY: This function executes shell commands from the configuration file.\n * When cloning from untrusted repositories, hooks could contain malicious commands.\n * We require explicit user confirmation before executing any hooks.\n */\nexport const runHook = async (\n hookType: HookType,\n tuckDir: string,\n options?: HookOptions\n): Promise<HookResult> => {\n // If hooks are explicitly disabled, skip execution\n if (options?.skipHooks) {\n return { success: true, skipped: true };\n }\n\n const config = await loadConfig(tuckDir);\n const command = config.hooks[hookType];\n\n if (!command) {\n return { success: true };\n }\n\n // SECURITY: Always show the hook command and require confirmation\n // unless trustHooks is explicitly set (for non-interactive/scripted use)\n if (!options?.trustHooks) {\n console.log();\n console.log(chalk.yellow.bold('⚠️ Hook Execution Warning'));\n console.log(chalk.dim('─'.repeat(50)));\n console.log(chalk.white(`Hook type: ${chalk.cyan(hookType)}`));\n console.log(chalk.white('Command:'));\n console.log(chalk.red(` ${command}`));\n console.log(chalk.dim('─'.repeat(50)));\n console.log(\n chalk.yellow(\n 'SECURITY: Hooks can execute arbitrary commands on your system.'\n )\n );\n console.log(\n chalk.yellow(\n 'Only proceed if you trust the source of this configuration.'\n )\n );\n console.log();\n\n const confirmed = await prompts.confirm(\n 'Execute this hook?',\n false // Default to NO for safety\n );\n\n if (!confirmed) {\n logger.warning(`Hook ${hookType} skipped by user`);\n return { success: true, skipped: true };\n }\n }\n\n if (!options?.silent) {\n logger.dim(`Running ${hookType} hook...`);\n }\n\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: tuckDir,\n timeout: 30000, // 30 second timeout\n env: {\n ...process.env,\n TUCK_DIR: tuckDir,\n TUCK_HOOK: hookType,\n },\n });\n\n if (stdout && !options?.silent) {\n logger.dim(stdout.trim());\n }\n\n if (stderr && !options?.silent) {\n logger.warning(stderr.trim());\n }\n\n return { success: true, output: stdout };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (!options?.silent) {\n logger.error(`Hook ${hookType} failed: ${errorMessage}`);\n }\n\n return { success: false, error: errorMessage };\n }\n};\n\nexport const runPreSyncHook = async (\n tuckDir: string,\n options?: HookOptions\n): Promise<HookResult> => {\n return runHook('preSync', tuckDir, options);\n};\n\nexport const runPostSyncHook = async (\n tuckDir: string,\n options?: HookOptions\n): Promise<HookResult> => {\n return runHook('postSync', tuckDir, options);\n};\n\nexport const runPreRestoreHook = async (\n tuckDir: string,\n options?: HookOptions\n): Promise<HookResult> => {\n return runHook('preRestore', tuckDir, options);\n};\n\nexport const runPostRestoreHook = async (\n tuckDir: string,\n options?: HookOptions\n): Promise<HookResult> => {\n return runHook('postRestore', tuckDir, options);\n};\n\nexport const hasHook = async (hookType: HookType, tuckDir: string): Promise<boolean> => {\n const config = await loadConfig(tuckDir);\n return Boolean(config.hooks[hookType]);\n};\n\nexport const getHookCommand = async (\n hookType: HookType,\n tuckDir: string\n): Promise<string | undefined> => {\n const config = await loadConfig(tuckDir);\n return config.hooks[hookType];\n};\n\n/**\n * Check if any hooks are configured\n */\nexport const hasAnyHooks = async (tuckDir: string): Promise<boolean> => {\n const config = await loadConfig(tuckDir);\n return Boolean(\n config.hooks.preSync ||\n config.hooks.postSync ||\n config.hooks.preRestore ||\n config.hooks.postRestore\n );\n};\n\n/**\n * Get all configured hooks for display\n */\nexport const getAllHooks = async (\n tuckDir: string\n): Promise<Record<HookType, string | undefined>> => {\n const config = await loadConfig(tuckDir);\n return {\n preSync: config.hooks.preSync,\n postSync: config.hooks.postSync,\n preRestore: config.hooks.preRestore,\n postRestore: config.hooks.postRestore,\n };\n};\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { prompts, logger, withSpinner } from '../ui/index.js';\nimport { getTuckDir } from '../lib/paths.js';\nimport { loadManifest } from '../lib/manifest.js';\nimport {\n push,\n hasRemote,\n getRemoteUrl,\n getStatus,\n getCurrentBranch,\n addRemote,\n} from '../lib/git.js';\nimport { NotInitializedError, GitError } from '../errors.js';\nimport type { PushOptions } from '../types.js';\n\nconst runInteractivePush = async (tuckDir: string): Promise<void> => {\n prompts.intro('tuck push');\n\n // Check if remote exists\n const hasRemoteRepo = await hasRemote(tuckDir);\n\n if (!hasRemoteRepo) {\n prompts.log.warning('No remote configured');\n\n const addRemoteNow = await prompts.confirm('Would you like to add a remote?');\n if (!addRemoteNow) {\n prompts.cancel('No remote to push to');\n return;\n }\n\n const remoteUrl = await prompts.text('Enter remote URL:', {\n placeholder: 'git@github.com:user/dotfiles.git',\n validate: (value) => {\n if (!value) return 'Remote URL is required';\n return undefined;\n },\n });\n\n await addRemote(tuckDir, 'origin', remoteUrl);\n prompts.log.success('Remote added');\n }\n\n // Get current status\n const status = await getStatus(tuckDir);\n const branch = await getCurrentBranch(tuckDir);\n const remoteUrl = await getRemoteUrl(tuckDir);\n\n if (status.ahead === 0 && status.tracking) {\n prompts.log.success('Already up to date with remote');\n return;\n }\n\n // Show what will be pushed\n console.log();\n console.log(chalk.dim('Remote:'), remoteUrl);\n console.log(chalk.dim('Branch:'), branch);\n\n if (status.ahead > 0) {\n console.log(chalk.dim('Commits:'), chalk.green(`↑ ${status.ahead} to push`));\n }\n\n if (status.behind > 0) {\n console.log(chalk.dim('Warning:'), chalk.yellow(`↓ ${status.behind} commits behind remote`));\n\n const pullFirst = await prompts.confirm('Pull changes first?', true);\n if (pullFirst) {\n prompts.log.info(\"Run 'tuck pull' first, then push\");\n return;\n }\n }\n\n console.log();\n\n // Confirm\n const confirm = await prompts.confirm('Push to remote?', true);\n if (!confirm) {\n prompts.cancel('Operation cancelled');\n return;\n }\n\n // Push\n const needsUpstream = !status.tracking;\n\n await withSpinner('Pushing...', async () => {\n await push(tuckDir, {\n setUpstream: needsUpstream,\n branch: needsUpstream ? branch : undefined,\n });\n });\n\n prompts.log.success('Pushed successfully!');\n\n if (remoteUrl) {\n // Extract repo URL for display\n let viewUrl = remoteUrl;\n if (remoteUrl.startsWith('git@github.com:')) {\n viewUrl = remoteUrl\n .replace('git@github.com:', 'https://github.com/')\n .replace('.git', '');\n }\n console.log();\n console.log(chalk.dim('View at:'), chalk.cyan(viewUrl));\n }\n\n prompts.outro('');\n};\n\nconst runPush = async (options: PushOptions): Promise<void> => {\n const tuckDir = getTuckDir();\n\n // Verify tuck is initialized\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n\n // If no options, run interactive\n if (!options.force && !options.setUpstream) {\n await runInteractivePush(tuckDir);\n return;\n }\n\n // Check if remote exists\n const hasRemoteRepo = await hasRemote(tuckDir);\n if (!hasRemoteRepo) {\n throw new GitError('No remote configured', \"Run 'tuck init -r <url>' or add a remote manually\");\n }\n\n const branch = await getCurrentBranch(tuckDir);\n\n await withSpinner('Pushing...', async () => {\n await push(tuckDir, {\n force: options.force,\n setUpstream: Boolean(options.setUpstream),\n branch: options.setUpstream || branch,\n });\n });\n\n logger.success('Pushed successfully!');\n};\n\nexport const pushCommand = new Command('push')\n .description('Push changes to remote repository')\n .option('-f, --force', 'Force push')\n .option('--set-upstream <name>', 'Set upstream branch')\n .action(async (options: PushOptions) => {\n await runPush(options);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { prompts, logger, withSpinner } from '../ui/index.js';\nimport { getTuckDir } from '../lib/paths.js';\nimport { loadManifest } from '../lib/manifest.js';\nimport {\n pull,\n fetch,\n hasRemote,\n getRemoteUrl,\n getStatus,\n getCurrentBranch,\n} from '../lib/git.js';\nimport { NotInitializedError, GitError } from '../errors.js';\nimport type { PullOptions } from '../types.js';\n\nconst runInteractivePull = async (tuckDir: string): Promise<void> => {\n prompts.intro('tuck pull');\n\n // Check if remote exists\n const hasRemoteRepo = await hasRemote(tuckDir);\n if (!hasRemoteRepo) {\n prompts.log.error('No remote configured');\n prompts.note(\"Run 'tuck init -r <url>' or add a remote manually\", 'Tip');\n return;\n }\n\n // Fetch first to get latest remote status\n await withSpinner('Fetching...', async () => {\n await fetch(tuckDir);\n });\n\n // Get current status\n const status = await getStatus(tuckDir);\n const branch = await getCurrentBranch(tuckDir);\n const remoteUrl = await getRemoteUrl(tuckDir);\n\n // Show status\n console.log();\n console.log(chalk.dim('Remote:'), remoteUrl);\n console.log(chalk.dim('Branch:'), branch);\n\n if (status.behind === 0) {\n prompts.log.success('Already up to date');\n return;\n }\n\n console.log(chalk.dim('Commits:'), chalk.yellow(`↓ ${status.behind} to pull`));\n\n if (status.ahead > 0) {\n console.log(\n chalk.dim('Note:'),\n chalk.yellow(`You also have ${status.ahead} local commit${status.ahead > 1 ? 's' : ''} to push`)\n );\n }\n\n // Check for local changes\n if (status.modified.length > 0 || status.staged.length > 0) {\n console.log();\n prompts.log.warning('You have uncommitted changes');\n console.log(chalk.dim('Modified:'), status.modified.join(', '));\n\n const continueAnyway = await prompts.confirm('Pull anyway? (may cause merge conflicts)');\n if (!continueAnyway) {\n prompts.cancel(\"Commit or stash your changes first with 'tuck sync'\");\n return;\n }\n }\n\n console.log();\n\n // Ask about rebase\n const useRebase = await prompts.confirm('Use rebase instead of merge?');\n\n // Pull\n await withSpinner('Pulling...', async () => {\n await pull(tuckDir, { rebase: useRebase });\n });\n\n prompts.log.success('Pulled successfully!');\n\n // Ask about restore\n const shouldRestore = await prompts.confirm('Restore updated dotfiles to system?', true);\n if (shouldRestore) {\n prompts.note(\"Run 'tuck restore --all' to restore all dotfiles\", 'Next step');\n }\n\n prompts.outro('');\n};\n\nconst runPull = async (options: PullOptions): Promise<void> => {\n const tuckDir = getTuckDir();\n\n // Verify tuck is initialized\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n\n // If no options, run interactive\n if (!options.rebase && !options.restore) {\n await runInteractivePull(tuckDir);\n return;\n }\n\n // Check if remote exists\n const hasRemoteRepo = await hasRemote(tuckDir);\n if (!hasRemoteRepo) {\n throw new GitError('No remote configured', \"Run 'tuck init -r <url>' or add a remote manually\");\n }\n\n // Fetch first\n await withSpinner('Fetching...', async () => {\n await fetch(tuckDir);\n });\n\n // Pull\n await withSpinner('Pulling...', async () => {\n await pull(tuckDir, { rebase: options.rebase });\n });\n\n logger.success('Pulled successfully!');\n\n if (options.restore) {\n logger.info(\"Run 'tuck restore --all' to restore dotfiles\");\n }\n};\n\nexport const pullCommand = new Command('pull')\n .description('Pull changes from remote')\n .option('--rebase', 'Pull with rebase')\n .option('--restore', 'Also restore files to system after pull')\n .action(async (options: PullOptions) => {\n await runPull(options);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { join } from 'path';\nimport { prompts, logger, withSpinner } from '../ui/index.js';\nimport { getTuckDir, expandPath, pathExists, collapsePath } from '../lib/paths.js';\nimport { loadManifest, getAllTrackedFiles, getTrackedFileBySource } from '../lib/manifest.js';\nimport { loadConfig } from '../lib/config.js';\nimport { copyFileOrDir, createSymlink } from '../lib/files.js';\nimport { createBackup } from '../lib/backup.js';\nimport { runPreRestoreHook, runPostRestoreHook, type HookOptions } from '../lib/hooks.js';\nimport { NotInitializedError, FileNotFoundError } from '../errors.js';\nimport { CATEGORIES } from '../constants.js';\nimport type { RestoreOptions } from '../types.js';\n\ninterface FileToRestore {\n id: string;\n source: string;\n destination: string;\n category: string;\n existsAtTarget: boolean;\n}\n\nconst prepareFilesToRestore = async (\n tuckDir: string,\n paths?: string[]\n): Promise<FileToRestore[]> => {\n const allFiles = await getAllTrackedFiles(tuckDir);\n const filesToRestore: FileToRestore[] = [];\n\n if (paths && paths.length > 0) {\n // Restore specific files\n for (const path of paths) {\n const expandedPath = expandPath(path);\n const collapsedPath = collapsePath(expandedPath);\n\n const tracked = await getTrackedFileBySource(tuckDir, collapsedPath);\n if (!tracked) {\n throw new FileNotFoundError(`Not tracked: ${path}`);\n }\n\n filesToRestore.push({\n id: tracked.id,\n source: tracked.file.source,\n destination: join(tuckDir, tracked.file.destination),\n category: tracked.file.category,\n existsAtTarget: await pathExists(expandedPath),\n });\n }\n } else {\n // Restore all files\n for (const [id, file] of Object.entries(allFiles)) {\n const targetPath = expandPath(file.source);\n filesToRestore.push({\n id,\n source: file.source,\n destination: join(tuckDir, file.destination),\n category: file.category,\n existsAtTarget: await pathExists(targetPath),\n });\n }\n }\n\n return filesToRestore;\n};\n\nconst restoreFiles = async (\n tuckDir: string,\n files: FileToRestore[],\n options: RestoreOptions\n): Promise<number> => {\n const config = await loadConfig(tuckDir);\n const useSymlink = options.symlink || config.files.strategy === 'symlink';\n const shouldBackup = options.backup ?? config.files.backupOnRestore;\n\n // Prepare hook options\n const hookOptions: HookOptions = {\n skipHooks: options.noHooks,\n trustHooks: options.trustHooks,\n };\n\n // Run pre-restore hook\n await runPreRestoreHook(tuckDir, hookOptions);\n\n let restoredCount = 0;\n\n for (const file of files) {\n const targetPath = expandPath(file.source);\n\n // Check if source exists in repository\n if (!(await pathExists(file.destination))) {\n logger.warning(`Source not found in repository: ${file.source}`);\n continue;\n }\n\n // Dry run - just show what would happen\n if (options.dryRun) {\n if (file.existsAtTarget) {\n logger.file('modify', `${file.source} (would overwrite)`);\n } else {\n logger.file('add', `${file.source} (would create)`);\n }\n continue;\n }\n\n // Create backup if needed\n if (shouldBackup && file.existsAtTarget) {\n await withSpinner(`Backing up ${file.source}...`, async () => {\n await createBackup(targetPath);\n });\n }\n\n // Restore file\n await withSpinner(`Restoring ${file.source}...`, async () => {\n if (useSymlink) {\n await createSymlink(file.destination, targetPath, { overwrite: true });\n } else {\n await copyFileOrDir(file.destination, targetPath, { overwrite: true });\n }\n });\n\n restoredCount++;\n }\n\n // Run post-restore hook\n await runPostRestoreHook(tuckDir, hookOptions);\n\n return restoredCount;\n};\n\nconst runInteractiveRestore = async (tuckDir: string): Promise<void> => {\n prompts.intro('tuck restore');\n\n // Get all tracked files\n const files = await prepareFilesToRestore(tuckDir);\n\n if (files.length === 0) {\n prompts.log.warning('No files to restore');\n prompts.note(\"Run 'tuck add <path>' to track files first\", 'Tip');\n return;\n }\n\n // Let user select files to restore\n const fileOptions = files.map((file) => {\n const categoryConfig = CATEGORIES[file.category] || { icon: '📄' };\n const status = file.existsAtTarget ? chalk.yellow('(exists, will backup)') : '';\n\n return {\n value: file.id,\n label: `${categoryConfig.icon} ${file.source} ${status}`,\n hint: file.category,\n };\n });\n\n const selectedIds = await prompts.multiselect('Select files to restore:', fileOptions, true);\n\n if (selectedIds.length === 0) {\n prompts.cancel('No files selected');\n return;\n }\n\n const selectedFiles = files.filter((f) => selectedIds.includes(f.id));\n\n // Check for files that exist\n const existingFiles = selectedFiles.filter((f) => f.existsAtTarget);\n if (existingFiles.length > 0) {\n console.log();\n prompts.log.warning(\n `${existingFiles.length} file${existingFiles.length > 1 ? 's' : ''} will be backed up:`\n );\n existingFiles.forEach((f) => console.log(chalk.dim(` ${f.source}`)));\n console.log();\n }\n\n // Ask about strategy\n const useSymlink = await prompts.select('Restore method:', [\n { value: false, label: 'Copy files', hint: 'Recommended' },\n { value: true, label: 'Create symlinks', hint: 'Files stay in tuck repo' },\n ]);\n\n // Confirm\n const confirm = await prompts.confirm(\n `Restore ${selectedFiles.length} file${selectedFiles.length > 1 ? 's' : ''}?`,\n true\n );\n\n if (!confirm) {\n prompts.cancel('Operation cancelled');\n return;\n }\n\n // Restore\n const restoredCount = await restoreFiles(tuckDir, selectedFiles, {\n symlink: useSymlink as boolean,\n backup: true,\n });\n\n console.log();\n prompts.outro(`Restored ${restoredCount} file${restoredCount > 1 ? 's' : ''}`);\n};\n\nconst runRestore = async (paths: string[], options: RestoreOptions): Promise<void> => {\n const tuckDir = getTuckDir();\n\n // Verify tuck is initialized\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n\n // If no paths and no --all, run interactive\n if (paths.length === 0 && !options.all) {\n await runInteractiveRestore(tuckDir);\n return;\n }\n\n // Prepare files to restore\n const files = await prepareFilesToRestore(tuckDir, options.all ? undefined : paths);\n\n if (files.length === 0) {\n logger.warning('No files to restore');\n return;\n }\n\n // Show what will be restored\n if (options.dryRun) {\n logger.heading('Dry run - would restore:');\n } else {\n logger.heading('Restoring:');\n }\n\n // Restore files\n const restoredCount = await restoreFiles(tuckDir, files, options);\n\n logger.blank();\n\n if (options.dryRun) {\n logger.info(`Would restore ${files.length} file${files.length > 1 ? 's' : ''}`);\n } else {\n logger.success(`Restored ${restoredCount} file${restoredCount > 1 ? 's' : ''}`);\n }\n};\n\nexport const restoreCommand = new Command('restore')\n .description('Restore dotfiles to the system')\n .argument('[paths...]', 'Paths to restore (or use --all)')\n .option('-a, --all', 'Restore all tracked files')\n .option('--symlink', 'Create symlinks instead of copies')\n .option('--backup', 'Backup existing files before restore')\n .option('--no-backup', 'Skip backup of existing files')\n .option('--dry-run', 'Show what would be done')\n .option('--no-hooks', 'Skip execution of pre/post restore hooks')\n .option('--trust-hooks', 'Trust and run hooks without confirmation (use with caution)')\n .action(async (paths: string[], options: RestoreOptions) => {\n await runRestore(paths, options);\n });\n","import { join } from 'path';\nimport { readdir, rm } from 'fs/promises';\nimport { copy, ensureDir, pathExists } from 'fs-extra';\nimport { BACKUP_DIR } from '../constants.js';\nimport { expandPath, collapsePath, pathExists as checkPathExists } from './paths.js';\n\nexport interface BackupInfo {\n path: string;\n date: Date;\n files: string[];\n}\n\nexport interface BackupResult {\n originalPath: string;\n backupPath: string;\n date: Date;\n}\n\nconst getBackupDir = (): string => {\n return expandPath(BACKUP_DIR);\n};\n\nconst formatDateForBackup = (date: Date): string => {\n return date.toISOString().slice(0, 10); // YYYY-MM-DD\n};\n\nconst getTimestampedBackupDir = (date: Date): string => {\n const backupRoot = getBackupDir();\n const timestamp = formatDateForBackup(date);\n return join(backupRoot, timestamp);\n};\n\nexport const createBackup = async (\n sourcePath: string,\n customBackupDir?: string\n): Promise<BackupResult> => {\n const expandedSource = expandPath(sourcePath);\n const date = new Date();\n\n if (!(await checkPathExists(expandedSource))) {\n throw new Error(`Source path does not exist: ${sourcePath}`);\n }\n\n // Create backup directory with date\n const backupRoot = customBackupDir\n ? expandPath(customBackupDir)\n : getTimestampedBackupDir(date);\n await ensureDir(backupRoot);\n\n // Generate backup filename that preserves structure\n const collapsed = collapsePath(expandedSource);\n const backupName = collapsed\n .replace(/^~\\//, '')\n .replace(/\\//g, '_')\n .replace(/^\\./, 'dot-');\n\n // Add timestamp to handle multiple backups of same file in a day\n const timestamp = date.toISOString().replace(/[:.]/g, '-').slice(11, 19);\n const backupPath = join(backupRoot, `${backupName}_${timestamp}`);\n\n await copy(expandedSource, backupPath, { overwrite: true });\n\n return {\n originalPath: expandedSource,\n backupPath,\n date,\n };\n};\n\nexport const createMultipleBackups = async (\n sourcePaths: string[],\n customBackupDir?: string\n): Promise<BackupResult[]> => {\n const results: BackupResult[] = [];\n\n for (const path of sourcePaths) {\n const result = await createBackup(path, customBackupDir);\n results.push(result);\n }\n\n return results;\n};\n\nexport const listBackups = async (): Promise<BackupInfo[]> => {\n const backupRoot = getBackupDir();\n\n if (!(await pathExists(backupRoot))) {\n return [];\n }\n\n const backups: BackupInfo[] = [];\n const dateDirs = await readdir(backupRoot, { withFileTypes: true });\n\n for (const dateDir of dateDirs) {\n if (!dateDir.isDirectory()) continue;\n\n const datePath = join(backupRoot, dateDir.name);\n const files = await readdir(datePath);\n\n // Parse date from directory name\n const dateMatch = dateDir.name.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!dateMatch) continue;\n\n const date = new Date(`${dateMatch[1]}-${dateMatch[2]}-${dateMatch[3]}`);\n\n backups.push({\n path: datePath,\n date,\n files: files.map((f) => join(datePath, f)),\n });\n }\n\n // Sort by date, newest first\n return backups.sort((a, b) => b.date.getTime() - a.date.getTime());\n};\n\nexport const getBackupsByDate = async (date: Date): Promise<string[]> => {\n const backupDir = getTimestampedBackupDir(date);\n\n if (!(await pathExists(backupDir))) {\n return [];\n }\n\n const files = await readdir(backupDir);\n return files.map((f) => join(backupDir, f));\n};\n\nexport const restoreBackup = async (backupPath: string, targetPath: string): Promise<void> => {\n const expandedBackup = expandPath(backupPath);\n const expandedTarget = expandPath(targetPath);\n\n if (!(await checkPathExists(expandedBackup))) {\n throw new Error(`Backup not found: ${backupPath}`);\n }\n\n // Create backup of current state before restoring\n if (await checkPathExists(expandedTarget)) {\n await createBackup(expandedTarget);\n }\n\n await copy(expandedBackup, expandedTarget, { overwrite: true });\n};\n\nexport const deleteBackup = async (backupPath: string): Promise<void> => {\n const expandedPath = expandPath(backupPath);\n\n if (await checkPathExists(expandedPath)) {\n await rm(expandedPath, { recursive: true });\n }\n};\n\nexport const cleanOldBackups = async (daysToKeep: number): Promise<number> => {\n const backups = await listBackups();\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - daysToKeep);\n\n let deletedCount = 0;\n\n for (const backup of backups) {\n if (backup.date < cutoffDate) {\n await rm(backup.path, { recursive: true });\n deletedCount++;\n }\n }\n\n return deletedCount;\n};\n\nexport const getBackupSize = async (): Promise<number> => {\n const backups = await listBackups();\n let totalSize = 0;\n\n for (const backup of backups) {\n for (const file of backup.files) {\n const { stat } = await import('fs/promises');\n try {\n const stats = await stat(file);\n totalSize += stats.size;\n } catch {\n // Ignore errors\n }\n }\n }\n\n return totalSize;\n};\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { prompts, formatStatus } from '../ui/index.js';\nimport { getTuckDir, collapsePath, expandPath, pathExists } from '../lib/paths.js';\nimport { loadManifest, getAllTrackedFiles } from '../lib/manifest.js';\nimport { getStatus, hasRemote, getRemoteUrl, getCurrentBranch } from '../lib/git.js';\nimport { getFileChecksum } from '../lib/files.js';\nimport { NotInitializedError } from '../errors.js';\nimport type { StatusOptions, FileChange } from '../types.js';\n\ninterface TuckStatus {\n tuckDir: string;\n branch: string;\n remote?: string;\n remoteStatus: 'up-to-date' | 'ahead' | 'behind' | 'diverged' | 'no-remote';\n ahead: number;\n behind: number;\n trackedCount: number;\n changes: FileChange[];\n gitChanges: {\n staged: string[];\n modified: string[];\n untracked: string[];\n };\n}\n\nconst detectFileChanges = async (tuckDir: string): Promise<FileChange[]> => {\n const files = await getAllTrackedFiles(tuckDir);\n const changes: FileChange[] = [];\n\n for (const [, file] of Object.entries(files)) {\n const sourcePath = expandPath(file.source);\n\n // Check if source still exists\n if (!(await pathExists(sourcePath))) {\n changes.push({\n path: file.source,\n status: 'deleted',\n source: file.source,\n destination: file.destination,\n });\n continue;\n }\n\n // Check if file has changed\n try {\n const sourceChecksum = await getFileChecksum(sourcePath);\n if (sourceChecksum !== file.checksum) {\n changes.push({\n path: file.source,\n status: 'modified',\n source: file.source,\n destination: file.destination,\n });\n }\n } catch {\n // Error reading file, mark as modified\n changes.push({\n path: file.source,\n status: 'modified',\n source: file.source,\n destination: file.destination,\n });\n }\n }\n\n return changes;\n};\n\nconst getFullStatus = async (tuckDir: string): Promise<TuckStatus> => {\n const manifest = await loadManifest(tuckDir);\n const gitStatus = await getStatus(tuckDir);\n const branch = await getCurrentBranch(tuckDir);\n const hasRemoteRepo = await hasRemote(tuckDir);\n const remoteUrl = hasRemoteRepo ? await getRemoteUrl(tuckDir) : undefined;\n\n let remoteStatus: TuckStatus['remoteStatus'] = 'no-remote';\n if (hasRemoteRepo) {\n if (gitStatus.ahead > 0 && gitStatus.behind > 0) {\n remoteStatus = 'diverged';\n } else if (gitStatus.ahead > 0) {\n remoteStatus = 'ahead';\n } else if (gitStatus.behind > 0) {\n remoteStatus = 'behind';\n } else {\n remoteStatus = 'up-to-date';\n }\n }\n\n const fileChanges = await detectFileChanges(tuckDir);\n\n return {\n tuckDir,\n branch,\n remote: remoteUrl || undefined,\n remoteStatus,\n ahead: gitStatus.ahead,\n behind: gitStatus.behind,\n trackedCount: Object.keys(manifest.files).length,\n changes: fileChanges,\n gitChanges: {\n staged: gitStatus.staged,\n modified: gitStatus.modified,\n untracked: gitStatus.untracked,\n },\n };\n};\n\nconst printStatus = (status: TuckStatus): void => {\n prompts.intro('tuck status');\n\n // Repository info\n console.log();\n console.log(chalk.dim('Repository:'), collapsePath(status.tuckDir));\n console.log(chalk.dim('Branch:'), chalk.cyan(status.branch));\n\n if (status.remote) {\n console.log(chalk.dim('Remote:'), status.remote);\n\n let remoteInfo = '';\n switch (status.remoteStatus) {\n case 'up-to-date':\n remoteInfo = chalk.green('up to date');\n break;\n case 'ahead':\n remoteInfo = chalk.yellow(`${status.ahead} commit${status.ahead > 1 ? 's' : ''} ahead`);\n break;\n case 'behind':\n remoteInfo = chalk.yellow(`${status.behind} commit${status.behind > 1 ? 's' : ''} behind`);\n break;\n case 'diverged':\n remoteInfo = chalk.red(`diverged (${status.ahead} ahead, ${status.behind} behind)`);\n break;\n }\n console.log(chalk.dim('Status:'), remoteInfo);\n } else {\n console.log(chalk.dim('Remote:'), chalk.yellow('not configured'));\n }\n\n console.log();\n console.log(chalk.dim('Tracked files:'), status.trackedCount);\n\n // File changes\n if (status.changes.length > 0) {\n console.log();\n console.log(chalk.bold('Changes detected:'));\n for (const change of status.changes) {\n const statusText = formatStatus(change.status);\n console.log(` ${statusText}: ${chalk.cyan(change.path)}`);\n }\n }\n\n // Git changes in repository\n const hasGitChanges =\n status.gitChanges.staged.length > 0 ||\n status.gitChanges.modified.length > 0 ||\n status.gitChanges.untracked.length > 0;\n\n if (hasGitChanges) {\n console.log();\n console.log(chalk.bold('Repository changes:'));\n\n if (status.gitChanges.staged.length > 0) {\n console.log(chalk.green(' Staged:'));\n status.gitChanges.staged.forEach((f) => console.log(chalk.green(` + ${f}`)));\n }\n\n if (status.gitChanges.modified.length > 0) {\n console.log(chalk.yellow(' Modified:'));\n status.gitChanges.modified.forEach((f) => console.log(chalk.yellow(` ~ ${f}`)));\n }\n\n if (status.gitChanges.untracked.length > 0) {\n console.log(chalk.dim(' Untracked:'));\n status.gitChanges.untracked.forEach((f) => console.log(chalk.dim(` ? ${f}`)));\n }\n }\n\n console.log();\n\n // Suggestions\n if (status.changes.length > 0) {\n prompts.note(\"Run 'tuck sync' to commit changes\", 'Next step');\n } else if (status.remoteStatus === 'ahead') {\n prompts.note(\"Run 'tuck push' to push changes to remote\", 'Next step');\n } else if (status.remoteStatus === 'behind') {\n prompts.note(\"Run 'tuck pull' to pull changes from remote\", 'Next step');\n } else if (status.trackedCount === 0) {\n prompts.note(\"Run 'tuck add <path>' to start tracking files\", 'Next step');\n } else {\n prompts.outro('Everything is up to date');\n }\n};\n\nconst printShortStatus = (status: TuckStatus): void => {\n const parts: string[] = [];\n\n parts.push(`[${status.branch}]`);\n\n if (status.remoteStatus === 'ahead') {\n parts.push(`↑${status.ahead}`);\n } else if (status.remoteStatus === 'behind') {\n parts.push(`↓${status.behind}`);\n } else if (status.remoteStatus === 'diverged') {\n parts.push(`↑${status.ahead}↓${status.behind}`);\n }\n\n if (status.changes.length > 0) {\n const modified = status.changes.filter((c) => c.status === 'modified').length;\n const deleted = status.changes.filter((c) => c.status === 'deleted').length;\n if (modified > 0) parts.push(`~${modified}`);\n if (deleted > 0) parts.push(`-${deleted}`);\n }\n\n parts.push(`(${status.trackedCount} tracked)`);\n\n console.log(parts.join(' '));\n};\n\nconst printJsonStatus = (status: TuckStatus): void => {\n console.log(JSON.stringify(status, null, 2));\n};\n\nconst runStatus = async (options: StatusOptions): Promise<void> => {\n const tuckDir = getTuckDir();\n\n // Verify tuck is initialized\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n\n const status = await getFullStatus(tuckDir);\n\n if (options.json) {\n printJsonStatus(status);\n } else if (options.short) {\n printShortStatus(status);\n } else {\n printStatus(status);\n }\n};\n\nexport const statusCommand = new Command('status')\n .description('Show current tracking status')\n .option('--short', 'Short format')\n .option('--json', 'Output as JSON')\n .action(async (options: StatusOptions) => {\n await runStatus(options);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { prompts, logger, formatCount } from '../ui/index.js';\nimport { getTuckDir } from '../lib/paths.js';\nimport { loadManifest, getAllTrackedFiles } from '../lib/manifest.js';\nimport { NotInitializedError } from '../errors.js';\nimport { CATEGORIES } from '../constants.js';\nimport type { ListOptions } from '../types.js';\n\ninterface CategoryGroup {\n name: string;\n icon: string;\n files: { id: string; source: string; destination: string; isDir: boolean }[];\n}\n\nconst groupByCategory = async (tuckDir: string): Promise<CategoryGroup[]> => {\n const files = await getAllTrackedFiles(tuckDir);\n const groups: Map<string, CategoryGroup> = new Map();\n\n for (const [id, file] of Object.entries(files)) {\n const category = file.category;\n const categoryConfig = CATEGORIES[category] || { icon: '📄' };\n\n if (!groups.has(category)) {\n groups.set(category, {\n name: category,\n icon: categoryConfig.icon,\n files: [],\n });\n }\n\n groups.get(category)!.files.push({\n id,\n source: file.source,\n destination: file.destination,\n isDir: file.destination.endsWith('/') || file.destination.includes('nvim'),\n });\n }\n\n // Sort groups by name and files within each group\n return Array.from(groups.values())\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((group) => ({\n ...group,\n files: group.files.sort((a, b) => a.source.localeCompare(b.source)),\n }));\n};\n\nconst printList = (groups: CategoryGroup[]): void => {\n prompts.intro('tuck list');\n\n if (groups.length === 0) {\n prompts.log.warning('No files are currently tracked');\n prompts.note(\"Run 'tuck add <path>' to start tracking files\", 'Tip');\n return;\n }\n\n let totalFiles = 0;\n\n for (const group of groups) {\n const fileCount = group.files.length;\n totalFiles += fileCount;\n\n console.log();\n console.log(\n chalk.bold(`${group.icon} ${group.name}`) +\n chalk.dim(` (${formatCount(fileCount, 'file')})`)\n );\n\n group.files.forEach((file, index) => {\n const isLast = index === group.files.length - 1;\n const prefix = isLast ? '└── ' : '├── ';\n const name = file.source.split('/').pop() || file.source;\n const arrow = chalk.dim(' → ');\n const dest = chalk.dim(file.source);\n\n console.log(chalk.dim(prefix) + chalk.cyan(name) + arrow + dest);\n });\n }\n\n console.log();\n prompts.outro(`Total: ${formatCount(totalFiles, 'tracked item')}`);\n};\n\nconst printPathsOnly = (groups: CategoryGroup[]): void => {\n for (const group of groups) {\n for (const file of group.files) {\n console.log(file.source);\n }\n }\n};\n\nconst printJson = (groups: CategoryGroup[]): void => {\n const output = groups.reduce(\n (acc, group) => {\n acc[group.name] = group.files.map((f) => ({\n source: f.source,\n destination: f.destination,\n }));\n return acc;\n },\n {} as Record<string, { source: string; destination: string }[]>\n );\n\n console.log(JSON.stringify(output, null, 2));\n};\n\nconst runList = async (options: ListOptions): Promise<void> => {\n const tuckDir = getTuckDir();\n\n // Verify tuck is initialized\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n\n let groups = await groupByCategory(tuckDir);\n\n // Filter by category if specified\n if (options.category) {\n groups = groups.filter((g) => g.name === options.category);\n if (groups.length === 0) {\n logger.warning(`No files found in category: ${options.category}`);\n return;\n }\n }\n\n // Output based on format\n if (options.json) {\n printJson(groups);\n } else if (options.paths) {\n printPathsOnly(groups);\n } else {\n printList(groups);\n }\n};\n\nexport const listCommand = new Command('list')\n .description('List all tracked files')\n .option('-c, --category <name>', 'Filter by category')\n .option('--paths', 'Show only paths')\n .option('--json', 'Output as JSON')\n .action(async (options: ListOptions) => {\n await runList(options);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { join } from 'path';\nimport { prompts, logger } from '../ui/index.js';\nimport { getTuckDir, expandPath, pathExists, collapsePath } from '../lib/paths.js';\nimport { loadManifest, getAllTrackedFiles, getTrackedFileBySource } from '../lib/manifest.js';\nimport { getDiff } from '../lib/git.js';\nimport { getFileChecksum } from '../lib/files.js';\nimport { NotInitializedError, FileNotFoundError } from '../errors.js';\nimport type { DiffOptions } from '../types.js';\nimport { readFile } from 'fs/promises';\n\ninterface FileDiff {\n source: string;\n destination: string;\n hasChanges: boolean;\n systemContent?: string;\n repoContent?: string;\n}\n\nconst getFileDiff = async (tuckDir: string, source: string): Promise<FileDiff> => {\n const tracked = await getTrackedFileBySource(tuckDir, source);\n if (!tracked) {\n throw new FileNotFoundError(`Not tracked: ${source}`);\n }\n\n const systemPath = expandPath(source);\n const repoPath = join(tuckDir, tracked.file.destination);\n\n const diff: FileDiff = {\n source,\n destination: tracked.file.destination,\n hasChanges: false,\n };\n\n // Check if system file exists\n if (!(await pathExists(systemPath))) {\n diff.hasChanges = true;\n if (await pathExists(repoPath)) {\n diff.repoContent = await readFile(repoPath, 'utf-8');\n }\n return diff;\n }\n\n // Check if repo file exists\n if (!(await pathExists(repoPath))) {\n diff.hasChanges = true;\n diff.systemContent = await readFile(systemPath, 'utf-8');\n return diff;\n }\n\n // Compare checksums\n const systemChecksum = await getFileChecksum(systemPath);\n const repoChecksum = await getFileChecksum(repoPath);\n\n if (systemChecksum !== repoChecksum) {\n diff.hasChanges = true;\n diff.systemContent = await readFile(systemPath, 'utf-8');\n diff.repoContent = await readFile(repoPath, 'utf-8');\n }\n\n return diff;\n};\n\nconst formatUnifiedDiff = (\n source: string,\n systemContent?: string,\n repoContent?: string\n): string => {\n const lines: string[] = [];\n\n lines.push(chalk.bold(`--- a/${source} (system)`));\n lines.push(chalk.bold(`+++ b/${source} (repository)`));\n\n if (!systemContent && repoContent) {\n // File only in repo\n lines.push(chalk.red('File missing on system'));\n lines.push(chalk.dim('Repository content:'));\n repoContent.split('\\n').forEach((line) => {\n lines.push(chalk.green(`+ ${line}`));\n });\n } else if (systemContent && !repoContent) {\n // File only on system\n lines.push(chalk.yellow('File not yet synced to repository'));\n lines.push(chalk.dim('System content:'));\n systemContent.split('\\n').forEach((line) => {\n lines.push(chalk.red(`- ${line}`));\n });\n } else if (systemContent && repoContent) {\n // Simple line-by-line diff\n const systemLines = systemContent.split('\\n');\n const repoLines = repoContent.split('\\n');\n\n const maxLines = Math.max(systemLines.length, repoLines.length);\n\n let inDiff = false;\n let diffStart = 0;\n\n for (let i = 0; i < maxLines; i++) {\n const sysLine = systemLines[i];\n const repoLine = repoLines[i];\n\n if (sysLine !== repoLine) {\n if (!inDiff) {\n inDiff = true;\n diffStart = i;\n lines.push(chalk.cyan(`@@ -${i + 1} +${i + 1} @@`));\n }\n\n if (sysLine !== undefined) {\n lines.push(chalk.red(`- ${sysLine}`));\n }\n if (repoLine !== undefined) {\n lines.push(chalk.green(`+ ${repoLine}`));\n }\n } else if (inDiff) {\n // Show a bit of context then stop\n lines.push(chalk.dim(` ${sysLine || ''}`));\n if (i - diffStart > 3) {\n inDiff = false;\n }\n }\n }\n }\n\n return lines.join('\\n');\n};\n\nconst runDiff = async (paths: string[], options: DiffOptions): Promise<void> => {\n const tuckDir = getTuckDir();\n\n // Verify tuck is initialized\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n\n // If --staged, show git diff\n if (options.staged) {\n const diff = await getDiff(tuckDir, { staged: true, stat: options.stat });\n if (diff) {\n console.log(diff);\n } else {\n logger.info('No staged changes');\n }\n return;\n }\n\n // If no paths, show all changed files\n if (paths.length === 0) {\n const allFiles = await getAllTrackedFiles(tuckDir);\n const changedFiles: FileDiff[] = [];\n\n for (const [, file] of Object.entries(allFiles)) {\n const diff = await getFileDiff(tuckDir, file.source);\n if (diff.hasChanges) {\n changedFiles.push(diff);\n }\n }\n\n if (changedFiles.length === 0) {\n logger.success('No differences found');\n return;\n }\n\n if (options.stat) {\n // Show summary only\n prompts.intro('tuck diff');\n console.log();\n console.log(chalk.bold(`${changedFiles.length} file${changedFiles.length > 1 ? 's' : ''} changed:`));\n console.log();\n\n for (const diff of changedFiles) {\n console.log(chalk.yellow(` ~ ${diff.source}`));\n }\n\n console.log();\n return;\n }\n\n // Show full diff for each file\n for (const diff of changedFiles) {\n console.log();\n console.log(formatUnifiedDiff(diff.source, diff.systemContent, diff.repoContent));\n console.log();\n }\n\n return;\n }\n\n // Show diff for specific files\n for (const path of paths) {\n const expandedPath = expandPath(path);\n const collapsedPath = collapsePath(expandedPath);\n\n const diff = await getFileDiff(tuckDir, collapsedPath);\n\n if (!diff.hasChanges) {\n logger.info(`No changes: ${path}`);\n continue;\n }\n\n if (options.stat) {\n console.log(chalk.yellow(`~ ${path}`));\n } else {\n console.log(formatUnifiedDiff(path, diff.systemContent, diff.repoContent));\n console.log();\n }\n }\n};\n\nexport const diffCommand = new Command('diff')\n .description('Show differences between system and repository')\n .argument('[paths...]', 'Specific files to diff')\n .option('--staged', 'Show staged git changes')\n .option('--stat', 'Show diffstat only')\n .action(async (paths: string[], options: DiffOptions) => {\n await runDiff(paths, options);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { spawn } from 'child_process';\nimport { prompts, logger } from '../ui/index.js';\nimport { getTuckDir, getConfigPath, collapsePath } from '../lib/paths.js';\nimport { loadConfig, saveConfig, resetConfig } from '../lib/config.js';\nimport { loadManifest } from '../lib/manifest.js';\nimport { NotInitializedError, ConfigError } from '../errors.js';\nimport type { TuckConfigOutput } from '../schemas/config.schema.js';\n\nconst printConfig = (config: TuckConfigOutput): void => {\n console.log(JSON.stringify(config, null, 2));\n};\n\nconst getNestedValue = (obj: Record<string, unknown>, path: string): unknown => {\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined) {\n return undefined;\n }\n if (typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current;\n};\n\nconst setNestedValue = (\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): void => {\n const keys = path.split('.');\n let current = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n};\n\nconst parseValue = (value: string): unknown => {\n // Try to parse as JSON\n try {\n return JSON.parse(value);\n } catch {\n // Return as string if not valid JSON\n return value;\n }\n};\n\nconst runConfigGet = async (key: string): Promise<void> => {\n const tuckDir = getTuckDir();\n const config = await loadConfig(tuckDir);\n\n const value = getNestedValue(config as unknown as Record<string, unknown>, key);\n\n if (value === undefined) {\n logger.error(`Key not found: ${key}`);\n return;\n }\n\n if (typeof value === 'object') {\n console.log(JSON.stringify(value, null, 2));\n } else {\n console.log(value);\n }\n};\n\nconst runConfigSet = async (key: string, value: string): Promise<void> => {\n const tuckDir = getTuckDir();\n const config = await loadConfig(tuckDir);\n\n const parsedValue = parseValue(value);\n const configObj = config as unknown as Record<string, unknown>;\n\n setNestedValue(configObj, key, parsedValue);\n\n await saveConfig(config, tuckDir);\n logger.success(`Set ${key} = ${JSON.stringify(parsedValue)}`);\n};\n\nconst runConfigList = async (): Promise<void> => {\n const tuckDir = getTuckDir();\n const config = await loadConfig(tuckDir);\n\n prompts.intro('tuck config');\n console.log();\n console.log(chalk.dim('Configuration file:'), collapsePath(getConfigPath(tuckDir)));\n console.log();\n\n printConfig(config);\n};\n\nconst runConfigEdit = async (): Promise<void> => {\n const tuckDir = getTuckDir();\n const configPath = getConfigPath(tuckDir);\n\n const editor = process.env.EDITOR || process.env.VISUAL || 'vim';\n\n logger.info(`Opening ${collapsePath(configPath)} in ${editor}...`);\n\n return new Promise((resolve, reject) => {\n const child = spawn(editor, [configPath], {\n stdio: 'inherit',\n });\n\n child.on('exit', (code) => {\n if (code === 0) {\n logger.success('Configuration updated');\n resolve();\n } else {\n reject(new ConfigError(`Editor exited with code ${code}`));\n }\n });\n\n child.on('error', (err) => {\n reject(new ConfigError(`Failed to open editor: ${err.message}`));\n });\n });\n};\n\nconst runConfigReset = async (): Promise<void> => {\n const tuckDir = getTuckDir();\n\n const confirm = await prompts.confirm('Reset configuration to defaults? This cannot be undone.', false);\n\n if (!confirm) {\n prompts.cancel('Operation cancelled');\n return;\n }\n\n await resetConfig(tuckDir);\n logger.success('Configuration reset to defaults');\n};\n\nexport const configCommand = new Command('config')\n .description('Manage tuck configuration')\n .addCommand(\n new Command('get')\n .description('Get a config value')\n .argument('<key>', 'Config key (e.g., \"repository.autoCommit\")')\n .action(async (key: string) => {\n const tuckDir = getTuckDir();\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n await runConfigGet(key);\n })\n )\n .addCommand(\n new Command('set')\n .description('Set a config value')\n .argument('<key>', 'Config key')\n .argument('<value>', 'Value to set (JSON or string)')\n .action(async (key: string, value: string) => {\n const tuckDir = getTuckDir();\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n await runConfigSet(key, value);\n })\n )\n .addCommand(\n new Command('list')\n .description('List all config')\n .action(async () => {\n const tuckDir = getTuckDir();\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n await runConfigList();\n })\n )\n .addCommand(\n new Command('edit')\n .description('Open config in editor')\n .action(async () => {\n const tuckDir = getTuckDir();\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n await runConfigEdit();\n })\n )\n .addCommand(\n new Command('reset')\n .description('Reset to defaults')\n .action(async () => {\n const tuckDir = getTuckDir();\n try {\n await loadManifest(tuckDir);\n } catch {\n throw new NotInitializedError();\n }\n await runConfigReset();\n })\n );\n"],"mappings":"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","names":["Command","chalk","join","writeFile","chalk","chalk","chalk","chalk","spinner","text","chalk","homedir","join","join","homedir","chalk","readFile","writeFile","z","fileStrategySchema","readFile","writeFile","join","writeFile","Command","readFile","stat","ensureDir","join","dirname","content","readFile","stat","join","ensureDir","dirname","confirm","Command","Command","join","validateAndPrepareFiles","confirm","Command","Command","chalk","join","chalk","chalk","join","spinner","message","chalk","confirm","Command","Command","chalk","remoteUrl","chalk","confirm","Command","Command","chalk","chalk","Command","Command","chalk","join","join","copy","ensureDir","pathExists","join","ensureDir","copy","join","chalk","confirm","Command","Command","chalk","chalk","Command","Command","chalk","group","chalk","Command","Command","chalk","join","readFile","join","chalk","Command","Command","chalk","chalk","resolve","confirm","Command","Command","chalk"]}