viberails 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/boundaries.ts","../src/utils/find-project-root.ts","../src/utils/prompt.ts","../src/utils/prompt-integrations.ts","../src/utils/prompt-rules.ts","../src/utils/prompt-menu-handlers.ts","../src/utils/prompt-package-overrides.ts","../src/utils/resolve-workspace-packages.ts","../src/commands/check.ts","../src/commands/check-config.ts","../src/commands/check-coverage.ts","../src/commands/check-files.ts","../src/commands/check-tests.ts","../src/commands/check-hook.ts","../src/commands/config.ts","../src/display-text.ts","../src/display.ts","../src/display-helpers.ts","../src/display-monorepo.ts","../src/utils/apply-rule-overrides.ts","../src/utils/diff-configs.ts","../src/utils/write-generated-files.ts","../src/commands/fix.ts","../src/commands/fix-helpers.ts","../src/commands/fix-imports.ts","../src/commands/fix-naming.ts","../src/commands/convert-name.ts","../src/commands/fix-tests.ts","../src/commands/init.ts","../src/utils/check-prerequisites.ts","../src/utils/filter-confidence.ts","../src/utils/update-gitignore.ts","../src/commands/init-hooks.ts","../src/commands/init-hooks-extra.ts","../src/commands/sync.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { boundariesCommand } from './commands/boundaries.js';\nimport { checkCommand } from './commands/check.js';\nimport { hookCheckCommand } from './commands/check-hook.js';\nimport { configCommand } from './commands/config.js';\nimport { fixCommand } from './commands/fix.js';\nimport { initCommand } from './commands/init.js';\nimport { syncCommand } from './commands/sync.js';\n\ndeclare const __PACKAGE_VERSION__: string;\nexport const VERSION: string = __PACKAGE_VERSION__;\n\nconst program = new Command();\n\nprogram.name('viberails').description('Guardrails for vibe coding').version(VERSION);\n\nprogram\n .command('init', { isDefault: true })\n .description('Scan your project and set up enforcement guardrails')\n .option('-y, --yes', 'Non-interactive mode (use defaults, high-confidence only)')\n .option('-f, --force', 'Re-initialize, replacing existing config')\n .action(async (options: { yes?: boolean; force?: boolean }) => {\n try {\n await initCommand(options);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('sync')\n .description('Re-scan and update generated files')\n .option('-i, --interactive', 'Review changes before writing')\n .action(async (options: { interactive?: boolean }) => {\n try {\n await syncCommand(options);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('config')\n .description('Interactively edit existing config rules')\n .option('--rescan', 'Re-scan project first (picks up new packages, stack changes)')\n .action(async (options: { rescan?: boolean }) => {\n try {\n await configCommand(options);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('check')\n .description('Check files against enforced rules')\n .option('--staged', 'Check only staged files (for pre-commit hooks)')\n .option('--files <files...>', 'Check specific files')\n .option('--diff-base <ref>', 'Only check files changed since <ref> (for CI on PRs)')\n .option('--no-boundaries', 'Skip boundary checking')\n .option('--quiet', 'Show only summary counts, not individual violations')\n .option('--limit <n>', 'Maximum number of violations to display', Number.parseInt)\n .option('--format <format>', 'Output format: text (default) or json')\n .option('--enforce', 'Exit with error on violations (for CI)')\n .option('--hook', 'Claude Code hook mode: read file from stdin, output to stderr')\n .action(\n async (options: {\n staged?: boolean;\n files?: string[];\n diffBase?: string;\n boundaries?: boolean;\n quiet?: boolean;\n limit?: number;\n format?: string;\n enforce?: boolean;\n hook?: boolean;\n }) => {\n try {\n if (options.hook) {\n const exitCode = await hookCheckCommand();\n process.exit(exitCode);\n }\n const exitCode = await checkCommand({\n ...options,\n diffBase: options.diffBase,\n enforce: options.enforce,\n noBoundaries: options.boundaries === false,\n format: options.format === 'json' ? 'json' : 'text',\n });\n process.exit(exitCode);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n },\n );\n\nprogram\n .command('fix')\n .description('Auto-fix file naming violations and generate missing test stubs')\n .option('--dry-run', 'Show planned fixes without applying them')\n .option('--rule <rules...>', 'Fix only specific rules (file-naming, missing-test)')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options: { dryRun?: boolean; rule?: string[]; yes?: boolean }) => {\n try {\n const exitCode = await fixCommand(options);\n process.exit(exitCode);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('boundaries')\n .description('Display, infer, or inspect import boundary rules')\n .option('--infer', 'Infer boundary rules from current import patterns')\n .option('--graph', 'Display import graph summary')\n .action(async (options: { infer?: boolean; graph?: boolean }) => {\n try {\n await boundariesCommand(options);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { compactConfig, loadConfig } from '@viberails/config';\nimport type { ViberailsConfig } from '@viberails/types';\nimport chalk from 'chalk';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { confirm } from '../utils/prompt.js';\nimport { resolveWorkspacePackages } from '../utils/resolve-workspace-packages.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\nexport interface BoundariesOptions {\n infer?: boolean;\n graph?: boolean;\n}\n\n/**\n * Display, infer, or inspect import boundary rules.\n *\n * @param options - CLI options\n * @param cwd - Working directory override (for testing)\n */\nexport async function boundariesCommand(options: BoundariesOptions, cwd?: string): Promise<void> {\n const startDir = cwd ?? process.cwd();\n const projectRoot = findProjectRoot(startDir);\n if (!projectRoot) {\n throw new Error('No package.json found. Are you in a JS/TS project?');\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (!fs.existsSync(configPath)) {\n throw new Error('No viberails.config.json found. Run `viberails init` first.');\n }\n\n const config = await loadConfig(configPath);\n\n if (options.graph) {\n await showGraph(projectRoot, config);\n return;\n }\n\n if (options.infer) {\n await inferAndDisplay(projectRoot, config, configPath);\n return;\n }\n\n displayRules(config);\n}\n\n/** Display configured boundary rules. */\nfunction displayRules(config: ViberailsConfig): void {\n if (!config.boundaries || Object.keys(config.boundaries.deny).length === 0) {\n console.log(chalk.yellow('No boundary rules configured.'));\n console.log(`Run ${chalk.cyan('viberails boundaries --infer')} to generate rules.`);\n return;\n }\n\n const { deny } = config.boundaries;\n const sources = Object.keys(deny).filter((k) => deny[k].length > 0);\n const totalRules = sources.reduce((sum, k) => sum + deny[k].length, 0);\n\n console.log(`\\n${chalk.bold(`Boundary rules (${totalRules} deny rules):`)}\\n`);\n\n for (const source of sources) {\n for (const target of deny[source]) {\n console.log(` ${chalk.red('✗')} ${source} → ${target}`);\n }\n }\n\n console.log(\n `\\nEnforcement: ${config.rules.enforceBoundaries ? chalk.green('on') : chalk.yellow('off')}`,\n );\n}\n\n/** Infer boundary rules from import patterns and optionally save. */\nasync function inferAndDisplay(\n projectRoot: string,\n config: ViberailsConfig,\n configPath: string,\n): Promise<void> {\n console.log(chalk.dim('Analyzing imports...'));\n const { buildImportGraph, inferBoundaries } = await import('@viberails/graph');\n\n const packages =\n config.packages.length > 1 ? resolveWorkspacePackages(projectRoot, config.packages) : undefined;\n\n const graph = await buildImportGraph(projectRoot, {\n packages,\n ignore: config.ignore,\n });\n\n console.log(chalk.dim(`${graph.nodes.length} files, ${graph.edges.length} edges`));\n\n const inferred = inferBoundaries(graph);\n const sources = Object.keys(inferred.deny).filter((k) => inferred.deny[k].length > 0);\n const totalRules = sources.reduce((sum, k) => sum + inferred.deny[k].length, 0);\n\n if (totalRules === 0) {\n console.log(chalk.yellow('No boundary rules could be inferred.'));\n return;\n }\n\n console.log(`\\n${chalk.bold('Inferred boundary rules:')}\\n`);\n\n for (const source of sources) {\n for (const target of inferred.deny[source]) {\n console.log(` ${chalk.red('✗')} ${source} → ${target}`);\n }\n }\n\n console.log(`\\n ${totalRules} denied`);\n\n console.log('');\n const shouldSave = await confirm('Save to viberails.config.json?');\n if (shouldSave) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n fs.writeFileSync(configPath, `${JSON.stringify(compactConfig(config), null, 2)}\\n`);\n console.log(`${chalk.green('✓')} Saved ${totalRules} rules`);\n }\n}\n\n/** Display import graph summary. */\nasync function showGraph(projectRoot: string, config: ViberailsConfig): Promise<void> {\n console.log(chalk.dim('Building import graph...'));\n const { buildImportGraph } = await import('@viberails/graph');\n\n const packages =\n config.packages.length > 1 ? resolveWorkspacePackages(projectRoot, config.packages) : undefined;\n\n const graph = await buildImportGraph(projectRoot, {\n packages,\n ignore: config.ignore,\n });\n\n console.log(`\\n${chalk.bold('Import dependency graph:')}\\n`);\n console.log(` ${graph.nodes.length} files, ${graph.edges.length} imports\\n`);\n\n if (graph.packages.length > 0) {\n for (const pkg of graph.packages) {\n const deps =\n pkg.internalDeps.length > 0\n ? `\\n${pkg.internalDeps.map((d) => ` → ${d}`).join('\\n')}`\n : chalk.dim(' (no internal deps)');\n console.log(` ${pkg.name}${deps}`);\n }\n }\n\n if (graph.cycles.length > 0) {\n console.log(`\\n${chalk.yellow('Cycles detected:')}`);\n for (const cycle of graph.cycles) {\n const paths = cycle.map((f) => path.relative(projectRoot, f));\n console.log(` ${paths.join(' → ')}`);\n }\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Walk up from startDir looking for a directory containing package.json.\n *\n * @param startDir - The directory to start searching from\n * @returns The project root path, or null if no package.json is found\n */\nexport function findProjectRoot(startDir: string): string | null {\n let dir = path.resolve(startDir);\n\n while (true) {\n if (fs.existsSync(path.join(dir, 'package.json'))) {\n return dir;\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) {\n return null;\n }\n dir = parent;\n }\n}\n","import * as clack from '@clack/prompts';\n\n/**\n * Assert that a clack prompt result was not cancelled (Ctrl+C).\n * If cancelled, prints a message and exits the process.\n */\nexport function assertNotCancelled<T>(value: T | symbol): asserts value is T {\n if (clack.isCancel(value)) {\n clack.cancel('Setup cancelled.');\n process.exit(0);\n }\n}\n\n/**\n * Prompt the user for a yes/no confirmation.\n *\n * @param message - The question to display\n * @returns true if the user confirms, false otherwise\n */\nexport async function confirm(message: string): Promise<boolean> {\n const result = await clack.confirm({ message, initialValue: true });\n assertNotCancelled(result);\n return result;\n}\n\n/**\n * Prompt the user for a yes/no confirmation that defaults to NO.\n * Use for destructive or risky actions.\n *\n * @param message - The question to display\n * @returns true if the user confirms, false otherwise\n */\nexport async function confirmDangerous(message: string): Promise<boolean> {\n const result = await clack.confirm({ message, initialValue: false });\n assertNotCancelled(result);\n return result;\n}\n\n/**\n * Prompt the user to choose between accepting defaults or customizing rules.\n *\n * @returns 'accept' or 'customize'\n */\nexport async function promptInitDecision(): Promise<'accept' | 'customize'> {\n const result = await clack.select({\n message: 'Accept these rules?',\n options: [\n {\n value: 'accept' as const,\n label: 'Yes, looks good',\n hint: 'warns on violation; use --enforce in CI to block',\n },\n { value: 'customize' as const, label: 'Let me customize rules' },\n ],\n });\n assertNotCancelled(result);\n return result;\n}\n\nexport type { IntegrationChoice } from './prompt-integrations.js';\n// Re-export from split modules so existing imports continue to work\nexport { promptIntegrations } from './prompt-integrations.js';\nexport type { RuleOverrides } from './prompt-rules.js';\nexport { promptRuleMenu } from './prompt-rules.js';\n","import { spawnSync } from 'node:child_process';\nimport * as clack from '@clack/prompts';\nimport { assertNotCancelled } from './prompt.js';\n\nexport interface IntegrationChoice {\n preCommitHook: boolean;\n claudeCodeHook: boolean;\n claudeMdRef: boolean;\n githubAction: boolean;\n typecheckHook: boolean;\n lintHook: boolean;\n}\n\nexport interface DetectedTools {\n isTypeScript?: boolean;\n linter?: string;\n packageManager?: string;\n}\n\n/**\n * Prompt the user to install Lefthook when no hook manager is detected.\n * Returns the updated hook manager name, or undefined if the user declined.\n */\nasync function promptHookManagerInstall(\n projectRoot: string,\n packageManager: string,\n): Promise<string | undefined> {\n const choice = await clack.select({\n message: 'No git hook manager detected. Install Lefthook for shareable pre-commit hooks?',\n options: [\n {\n value: 'install' as const,\n label: 'Yes, install Lefthook',\n hint: 'recommended — hooks are committed to the repo and shared with your team',\n },\n {\n value: 'skip' as const,\n label: 'No, skip',\n hint: 'pre-commit hooks will be local-only (.git/hooks) and not shared',\n },\n ],\n });\n assertNotCancelled(choice);\n\n if (choice !== 'install') return undefined;\n\n const pm = packageManager || 'npm';\n const installCmd =\n pm === 'yarn'\n ? 'yarn add -D lefthook'\n : pm === 'pnpm'\n ? 'pnpm add -D lefthook'\n : 'npm install -D lefthook';\n\n const s = clack.spinner();\n s.start('Installing Lefthook...');\n const result = spawnSync(installCmd, {\n cwd: projectRoot,\n shell: true,\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n\n if (result.status === 0) {\n // Create a minimal lefthook.yml so setupPreCommitHook detects it\n const fs = await import('node:fs');\n const path = await import('node:path');\n const lefthookPath = path.join(projectRoot, 'lefthook.yml');\n if (!fs.existsSync(lefthookPath)) {\n fs.writeFileSync(lefthookPath, '# Managed by viberails — https://viberails.sh\\n');\n }\n s.stop('Installed Lefthook');\n return 'Lefthook';\n }\n\n s.stop('Failed to install Lefthook');\n clack.log.warn(`Install manually: ${installCmd}`);\n return undefined;\n}\n\n/**\n * Prompt the user to select which integrations to set up.\n *\n * @param projectRoot - Project root directory (needed for Lefthook install)\n * @param hookManager - Detected hook manager name (e.g. \"Husky\", \"Lefthook\") or undefined\n * @param tools - Detected project tools (TypeScript, linter) to conditionally show options\n * @returns Object with selected integrations\n */\nexport async function promptIntegrations(\n projectRoot: string,\n hookManager: string | undefined,\n tools?: DetectedTools,\n): Promise<IntegrationChoice> {\n let resolvedHookManager = hookManager;\n\n // If no hook manager, offer to install Lefthook\n if (!resolvedHookManager) {\n resolvedHookManager = await promptHookManagerInstall(\n projectRoot,\n tools?.packageManager ?? 'npm',\n );\n }\n\n const isBareHook = !resolvedHookManager;\n const hookLabel = resolvedHookManager\n ? `Pre-commit hook (${resolvedHookManager})`\n : 'Pre-commit hook (git hook — local only)';\n const hookHint = isBareHook\n ? 'local only — will NOT be committed or shared with collaborators'\n : 'runs viberails checks when you commit';\n\n type OptionValue = 'preCommit' | 'claude' | 'claudeMd' | 'githubAction' | 'typecheck' | 'lint';\n\n const options: { value: OptionValue; label: string; hint: string }[] = [\n {\n value: 'preCommit',\n label: hookLabel,\n hint: hookHint,\n },\n ];\n\n if (tools?.isTypeScript) {\n options.push({\n value: 'typecheck',\n label: 'Typecheck (tsc --noEmit)',\n hint: 'catches type errors before commit',\n });\n }\n\n if (tools?.linter) {\n const linterName = tools.linter === 'biome' ? 'Biome' : 'ESLint';\n options.push({\n value: 'lint',\n label: `Lint check (${linterName})`,\n hint: 'runs linter on staged files before commit',\n });\n }\n\n options.push(\n {\n value: 'claude',\n label: 'Claude Code hook',\n hint: 'checks files when Claude edits them',\n },\n {\n value: 'claudeMd',\n label: 'CLAUDE.md reference',\n hint: 'appends @.viberails/context.md so Claude loads rules automatically',\n },\n {\n value: 'githubAction',\n label: 'GitHub Actions workflow',\n hint: 'blocks PRs that fail viberails check',\n },\n );\n\n // Default-disable pre-commit when using bare git hooks\n const initialValues = isBareHook\n ? options.filter((o) => o.value !== 'preCommit').map((o) => o.value)\n : options.map((o) => o.value);\n\n const result = await clack.multiselect({\n message: 'Set up integrations?',\n options,\n initialValues,\n required: false,\n });\n assertNotCancelled(result);\n\n return {\n preCommitHook: result.includes('preCommit'),\n claudeCodeHook: result.includes('claude'),\n claudeMdRef: result.includes('claudeMd'),\n githubAction: result.includes('githubAction'),\n typecheckHook: result.includes('typecheck'),\n lintHook: result.includes('lint'),\n };\n}\n","import * as clack from '@clack/prompts';\nimport type { PackageConfig } from '@viberails/types';\nimport { assertNotCancelled } from './prompt.js';\nimport { buildMenuOptions, clonePackages, handleMenuChoice } from './prompt-menu-handlers.js';\n\nexport interface RuleOverrides {\n maxFileLines: number;\n testCoverage: number;\n enforceMissingTests: boolean;\n enforceNaming: boolean;\n fileNamingValue?: string;\n coverageSummaryPath: string;\n coverageCommand?: string;\n packageOverrides?: PackageConfig[];\n}\n\nfunction getRootPackage(packages: PackageConfig[]): PackageConfig {\n return packages.find((pkg) => pkg.path === '.') ?? packages[0];\n}\n\n/**\n * Menu-based rule customization. Displays rules grouped into basic and\n * advanced sections. User browses with arrow keys and presses enter to\n * edit a rule, then returns to the menu. Select \"Done\" to finish.\n *\n * @param defaults - Current detected/default values to pre-fill\n * @returns The user's chosen rule settings\n */\nexport async function promptRuleMenu(defaults: {\n maxFileLines: number;\n testCoverage: number;\n enforceMissingTests: boolean;\n enforceNaming: boolean;\n fileNamingValue?: string;\n coverageSummaryPath: string;\n coverageCommand?: string;\n packageOverrides?: PackageConfig[];\n}): Promise<RuleOverrides> {\n const state: RuleOverrides = {\n ...defaults,\n packageOverrides: clonePackages(defaults.packageOverrides),\n };\n const root =\n state.packageOverrides && state.packageOverrides.length > 0\n ? getRootPackage(state.packageOverrides)\n : undefined;\n const packageCount = state.packageOverrides?.filter((pkg) => pkg.path !== '.').length ?? 0;\n\n while (true) {\n const options = buildMenuOptions(state, packageCount);\n const choice = await clack.select({ message: 'Customize rules', options });\n assertNotCancelled(choice);\n\n if (choice === 'done') break;\n await handleMenuChoice(choice, state, defaults, root);\n }\n\n return {\n maxFileLines: state.maxFileLines,\n testCoverage: state.testCoverage,\n enforceMissingTests: state.enforceMissingTests,\n enforceNaming: state.enforceNaming,\n fileNamingValue: state.fileNamingValue,\n coverageSummaryPath: state.coverageSummaryPath,\n coverageCommand: state.coverageCommand,\n packageOverrides: state.packageOverrides,\n };\n}\n","import * as clack from '@clack/prompts';\nimport type { PackageConfig } from '@viberails/types';\nimport { assertNotCancelled } from './prompt.js';\nimport { promptPackageCoverageOverrides } from './prompt-package-overrides.js';\nimport type { RuleOverrides } from './prompt-rules.js';\n\nfunction getPackageDiffs(pkg: PackageConfig, root: PackageConfig): string[] {\n const diffs: string[] = [];\n\n const convKeys = ['fileNaming', 'componentNaming', 'hookNaming', 'importAlias'] as const;\n for (const key of convKeys) {\n if (pkg.conventions?.[key] && pkg.conventions[key] !== root.conventions?.[key]) {\n diffs.push(`${key}: ${pkg.conventions[key]}`);\n }\n }\n\n const stackKeys = [\n 'framework',\n 'language',\n 'styling',\n 'backend',\n 'orm',\n 'linter',\n 'formatter',\n 'testRunner',\n 'packageManager',\n ] as const;\n for (const key of stackKeys) {\n if (pkg.stack?.[key] && pkg.stack[key] !== root.stack?.[key]) {\n diffs.push(`${key}: ${pkg.stack[key]}`);\n }\n }\n\n if (\n pkg.rules?.maxFileLines !== undefined &&\n pkg.rules.maxFileLines !== root.rules?.maxFileLines &&\n pkg.rules.maxFileLines > 0\n ) {\n diffs.push(`maxFileLines: ${pkg.rules.maxFileLines}`);\n }\n if (\n pkg.rules?.testCoverage !== undefined &&\n pkg.rules.testCoverage !== root.rules?.testCoverage &&\n pkg.rules.testCoverage >= 0\n ) {\n diffs.push(`testCoverage: ${pkg.rules.testCoverage}`);\n }\n if (pkg.coverage?.summaryPath && pkg.coverage.summaryPath !== root.coverage?.summaryPath) {\n diffs.push(`coverage.summaryPath: ${pkg.coverage.summaryPath}`);\n }\n if (pkg.coverage?.command && pkg.coverage.command !== root.coverage?.command) {\n diffs.push('coverage.command: (override)');\n }\n\n return diffs;\n}\n\n/** Build the options list for the rule customization menu. */\nexport function buildMenuOptions(\n state: RuleOverrides & { packageOverrides?: PackageConfig[] },\n packageCount: number,\n): { value: string; label: string; hint?: string }[] {\n const namingHint = state.enforceNaming\n ? `yes${state.fileNamingValue ? ` (${state.fileNamingValue})` : ''}`\n : 'no';\n\n const options: { value: string; label: string; hint?: string }[] = [\n { value: 'maxFileLines', label: 'Max file lines', hint: String(state.maxFileLines) },\n { value: 'enforceNaming', label: 'Enforce file naming', hint: namingHint },\n ];\n if (state.fileNamingValue) {\n options.push({\n value: 'fileNaming',\n label: 'File naming convention',\n hint: state.fileNamingValue,\n });\n }\n const isMonorepo = packageCount > 0;\n const coverageLabel = isMonorepo ? 'Default coverage target' : 'Test coverage target';\n const coverageHint =\n state.testCoverage === 0\n ? '0 (disabled)'\n : isMonorepo\n ? `${state.testCoverage}% (per-package default)`\n : `${state.testCoverage}%`;\n options.push({ value: 'testCoverage', label: coverageLabel, hint: coverageHint });\n options.push({\n value: 'enforceMissingTests',\n label: 'Enforce missing tests',\n hint: state.enforceMissingTests ? 'yes' : 'no',\n });\n\n if (state.testCoverage > 0) {\n options.push(\n {\n value: 'coverageSummaryPath',\n label: isMonorepo ? 'Default coverage summary path' : 'Coverage summary path',\n hint: state.coverageSummaryPath,\n },\n {\n value: 'coverageCommand',\n label: isMonorepo ? 'Default coverage command' : 'Coverage command',\n hint: state.coverageCommand ?? 'auto-detect from package.json test runner',\n },\n );\n\n if (isMonorepo) {\n options.push({\n value: 'packageOverrides',\n label: 'Per-package coverage overrides',\n hint: `${packageCount} package${packageCount > 1 ? 's' : ''} configurable`,\n });\n }\n }\n\n options.push(\n { value: 'reset', label: 'Reset all to detected defaults' },\n { value: 'done', label: 'Done' },\n );\n\n return options;\n}\n\nexport function clonePackages(packages?: PackageConfig[]): PackageConfig[] | undefined {\n return packages?.map((pkg) => ({\n ...pkg,\n stack: pkg.stack ? { ...pkg.stack } : undefined,\n structure: pkg.structure ? { ...pkg.structure } : undefined,\n conventions: pkg.conventions ? { ...pkg.conventions } : undefined,\n rules: pkg.rules ? { ...pkg.rules } : undefined,\n coverage: pkg.coverage ? { ...pkg.coverage } : undefined,\n ignore: pkg.ignore ? [...pkg.ignore] : undefined,\n boundaries: pkg.boundaries\n ? {\n deny: [...pkg.boundaries.deny],\n ignore: pkg.boundaries.ignore ? [...pkg.boundaries.ignore] : undefined,\n }\n : undefined,\n }));\n}\n\n/** Handle a single menu choice and update state accordingly. */\nexport async function handleMenuChoice(\n choice: string,\n state: RuleOverrides & { packageOverrides?: PackageConfig[] },\n defaults: RuleOverrides & { packageOverrides?: PackageConfig[] },\n root: PackageConfig | undefined,\n): Promise<void> {\n if (choice === 'reset') {\n state.maxFileLines = defaults.maxFileLines;\n state.testCoverage = defaults.testCoverage;\n state.enforceMissingTests = defaults.enforceMissingTests;\n state.enforceNaming = defaults.enforceNaming;\n state.fileNamingValue = defaults.fileNamingValue;\n state.coverageSummaryPath = defaults.coverageSummaryPath;\n state.coverageCommand = defaults.coverageCommand;\n state.packageOverrides = clonePackages(defaults.packageOverrides);\n clack.log.info('Reset all rules to detected defaults.');\n return;\n }\n\n if (choice === 'packageOverrides') {\n if (state.packageOverrides) {\n const packageDiffs = root\n ? state.packageOverrides\n .filter((pkg) => pkg.path !== root.path)\n .map((pkg) => ({ pkg, diffs: getPackageDiffs(pkg, root) }))\n .filter((entry) => entry.diffs.length > 0)\n : [];\n state.packageOverrides = await promptPackageCoverageOverrides(state.packageOverrides, {\n testCoverage: state.testCoverage,\n coverageSummaryPath: state.coverageSummaryPath,\n coverageCommand: state.coverageCommand,\n });\n const lines = packageDiffs.map((entry) => `${entry.pkg.path}\\n ${entry.diffs.join(', ')}`);\n if (lines.length > 0) {\n clack.note(lines.join('\\n\\n'), 'Existing package differences');\n }\n }\n return;\n }\n\n if (choice === 'maxFileLines') {\n const result = await clack.text({\n message: 'Maximum lines per source file?',\n initialValue: String(state.maxFileLines),\n validate: (v) => {\n if (typeof v !== 'string') return 'Enter a positive number';\n const n = Number.parseInt(v, 10);\n if (Number.isNaN(n) || n < 1) return 'Enter a positive number';\n },\n });\n assertNotCancelled(result);\n state.maxFileLines = Number.parseInt(result, 10);\n }\n\n if (choice === 'enforceMissingTests') {\n const result = await clack.confirm({\n message: 'Require every source file to have a corresponding test file?',\n initialValue: state.enforceMissingTests,\n });\n assertNotCancelled(result);\n state.enforceMissingTests = result;\n }\n\n if (choice === 'testCoverage') {\n const result = await clack.text({\n message: 'Test coverage target (0 disables coverage checks)?',\n initialValue: String(state.testCoverage),\n validate: (v) => {\n if (typeof v !== 'string') return 'Enter a number between 0 and 100';\n const n = Number.parseInt(v, 10);\n if (Number.isNaN(n) || n < 0 || n > 100) return 'Enter a number between 0 and 100';\n },\n });\n assertNotCancelled(result);\n state.testCoverage = Number.parseInt(result, 10);\n }\n\n if (choice === 'coverageSummaryPath') {\n const result = await clack.text({\n message: 'Coverage summary path (relative to package root)?',\n initialValue: state.coverageSummaryPath,\n validate: (v) => {\n if (typeof v !== 'string' || v.trim().length === 0) return 'Path cannot be empty';\n },\n });\n assertNotCancelled(result);\n state.coverageSummaryPath = result.trim();\n }\n\n if (choice === 'coverageCommand') {\n const result = await clack.text({\n message: 'Coverage command (blank to auto-detect from package.json)?',\n initialValue: state.coverageCommand ?? '',\n placeholder: '(auto-detect from package.json test runner)',\n });\n assertNotCancelled(result);\n const trimmed = result.trim();\n state.coverageCommand = trimmed.length > 0 ? trimmed : undefined;\n }\n\n if (choice === 'enforceNaming') {\n const result = await clack.confirm({\n message: state.fileNamingValue\n ? `Enforce file naming? (detected: ${state.fileNamingValue})`\n : 'Enforce file naming?',\n initialValue: state.enforceNaming,\n });\n assertNotCancelled(result);\n state.enforceNaming = result;\n }\n\n if (choice === 'fileNaming') {\n const selected = await clack.select({\n message: 'Which file naming convention should be enforced?',\n options: [\n { value: 'kebab-case', label: 'kebab-case' },\n { value: 'camelCase', label: 'camelCase' },\n { value: 'PascalCase', label: 'PascalCase' },\n { value: 'snake_case', label: 'snake_case' },\n ],\n initialValue: state.fileNamingValue,\n });\n assertNotCancelled(selected);\n state.fileNamingValue = selected;\n }\n}\n","import * as clack from '@clack/prompts';\nimport type { PackageConfig } from '@viberails/types';\nimport { assertNotCancelled } from './prompt.js';\n\nfunction normalizePackageOverrides(packages: PackageConfig[]): PackageConfig[] {\n for (const pkg of packages) {\n if (pkg.rules && Object.keys(pkg.rules).length === 0) {\n delete pkg.rules;\n }\n if (pkg.coverage && Object.keys(pkg.coverage).length === 0) {\n delete pkg.coverage;\n }\n }\n return packages;\n}\n\nfunction packageCoverageHint(\n pkg: PackageConfig,\n defaults: { testCoverage: number; coverageSummaryPath: string; coverageCommand?: string },\n): string {\n const coverage = pkg.rules?.testCoverage ?? defaults.testCoverage;\n const isExempt = coverage === 0;\n const hasSummaryOverride =\n pkg.coverage?.summaryPath !== undefined &&\n pkg.coverage.summaryPath !== defaults.coverageSummaryPath;\n const defaultCommand = defaults.coverageCommand ?? '';\n const hasCommandOverride =\n pkg.coverage?.command !== undefined && pkg.coverage.command !== defaultCommand;\n\n const tags: string[] = [];\n const nameSegments = pkg.name.replace(/^@[^/]+\\//, '').split(/[-/]/);\n const isTypesOnly = isExempt && nameSegments.some((s) => s === 'types');\n tags.push(isExempt ? (isTypesOnly ? 'exempt (types-only)' : 'exempt') : `${coverage}%`);\n if (hasSummaryOverride) tags.push('summary override');\n if (hasCommandOverride) tags.push('command override');\n return tags.join(', ');\n}\n\n/**\n * Prompt the user to edit per-package coverage overrides in a monorepo.\n * Presents a package selector followed by per-package edit menus.\n *\n * @param packages - All package configs (including root)\n * @param defaults - The shared default coverage settings\n * @returns Updated package configs with user overrides applied\n */\nexport async function promptPackageCoverageOverrides(\n packages: PackageConfig[],\n defaults: { testCoverage: number; coverageSummaryPath: string; coverageCommand?: string },\n): Promise<PackageConfig[]> {\n const editablePackages = packages.filter((pkg) => pkg.path !== '.');\n if (editablePackages.length === 0) return packages;\n\n while (true) {\n const selectedPath = await clack.select({\n message: 'Select package to edit coverage overrides',\n options: [\n ...editablePackages.map((pkg) => ({\n value: pkg.path,\n label: `${pkg.path} (${pkg.name})`,\n hint: packageCoverageHint(pkg, defaults),\n })),\n { value: '__done__', label: 'Done' },\n ],\n });\n assertNotCancelled(selectedPath);\n if (selectedPath === '__done__') break;\n\n const target = editablePackages.find((pkg) => pkg.path === selectedPath);\n if (!target) continue;\n\n while (true) {\n const effectiveCoverage: number = target.rules?.testCoverage ?? defaults.testCoverage;\n const effectiveSummary: string = target.coverage?.summaryPath ?? defaults.coverageSummaryPath;\n const effectiveCommand: string =\n target.coverage?.command ?? defaults.coverageCommand ?? '(auto-detect)';\n\n const choice: string | symbol = await clack.select({\n message: `Edit coverage overrides for ${target.path}`,\n options: [\n { value: 'testCoverage', label: 'testCoverage', hint: String(effectiveCoverage) },\n { value: 'summaryPath', label: 'coverage.summaryPath', hint: effectiveSummary },\n { value: 'command', label: 'coverage.command', hint: effectiveCommand },\n { value: 'reset', label: 'Reset this package to inherit defaults' },\n { value: 'back', label: 'Back to package list' },\n ],\n });\n assertNotCancelled(choice);\n\n if (choice === 'back') break;\n\n if (choice === 'testCoverage') {\n const result = await clack.text({\n message: 'Package testCoverage (0 to exempt package)?',\n initialValue: String(effectiveCoverage),\n validate: (v) => {\n if (typeof v !== 'string') return 'Enter a number between 0 and 100';\n const n = Number.parseInt(v, 10);\n if (Number.isNaN(n) || n < 0 || n > 100) return 'Enter a number between 0 and 100';\n },\n });\n assertNotCancelled(result);\n const nextCoverage = Number.parseInt(result, 10);\n if (nextCoverage === defaults.testCoverage) {\n if (target.rules) {\n delete target.rules.testCoverage;\n }\n } else {\n target.rules = { ...(target.rules ?? {}), testCoverage: nextCoverage };\n }\n }\n\n if (choice === 'summaryPath') {\n const result = await clack.text({\n message: 'Package coverage.summaryPath (blank to inherit default)?',\n initialValue:\n target.coverage?.summaryPath !== undefined ? target.coverage.summaryPath : '',\n placeholder: defaults.coverageSummaryPath,\n });\n assertNotCancelled(result);\n const value = result.trim();\n if (value.length === 0 || value === defaults.coverageSummaryPath) {\n if (target.coverage) {\n delete target.coverage.summaryPath;\n }\n } else {\n target.coverage = { ...(target.coverage ?? {}), summaryPath: value };\n }\n }\n\n if (choice === 'command') {\n const result = await clack.text({\n message: 'Package coverage.command (blank to inherit default/auto)?',\n initialValue: target.coverage?.command !== undefined ? target.coverage.command : '',\n placeholder: defaults.coverageCommand ?? '(auto-detect from package.json test runner)',\n });\n assertNotCancelled(result);\n const value = result.trim();\n const defaultCommand = defaults.coverageCommand ?? '';\n if (value.length === 0 || value === defaultCommand) {\n if (target.coverage) {\n delete target.coverage.command;\n }\n } else {\n target.coverage = { ...(target.coverage ?? {}), command: value };\n }\n }\n\n if (choice === 'reset') {\n if (target.rules) {\n delete target.rules.testCoverage;\n }\n delete target.coverage;\n }\n\n normalizePackageOverrides(editablePackages);\n }\n }\n\n return normalizePackageOverrides(packages);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PackageConfig, WorkspacePackage } from '@viberails/types';\n\n/**\n * Resolve WorkspacePackage[] from config packages.\n *\n * Reads each package's package.json to get the name and dependencies,\n * then filters internalDeps to only include workspace-internal packages.\n *\n * @param projectRoot - Absolute path to the project root\n * @param packages - The packages array from viberails.config.json\n * @returns Array of resolved WorkspacePackage objects\n */\nexport function resolveWorkspacePackages(\n projectRoot: string,\n packages: PackageConfig[],\n): WorkspacePackage[] {\n const resolved: WorkspacePackage[] = [];\n\n for (const pkgConfig of packages) {\n if (pkgConfig.path === '.') continue; // Skip root package\n const relativePath = pkgConfig.path;\n const absPath = path.join(projectRoot, relativePath);\n const pkgJsonPath = path.join(absPath, 'package.json');\n\n if (!fs.existsSync(pkgJsonPath)) continue;\n\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n } catch {\n continue;\n }\n\n const name = pkg.name as string;\n if (!name) continue;\n\n const allDeps = [\n ...Object.keys((pkg.dependencies as Record<string, unknown>) ?? {}),\n ...Object.keys((pkg.devDependencies as Record<string, unknown>) ?? {}),\n ];\n\n resolved.push({ name, path: absPath, relativePath, internalDeps: allDeps });\n }\n\n // Filter internalDeps to only workspace-internal package names\n const packageNames = new Set(resolved.map((p) => p.name));\n for (const pkg of resolved) {\n pkg.internalDeps = pkg.internalDeps.filter((dep) => packageNames.has(dep));\n }\n\n return resolved;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { loadConfig } from '@viberails/config';\nimport type { CheckViolation } from '@viberails/types';\nimport chalk from 'chalk';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { resolveWorkspacePackages } from '../utils/resolve-workspace-packages.js';\nimport { resolveConfigForFile, resolveIgnoreForFile } from './check-config.js';\nimport { checkCoverage } from './check-coverage.js';\nimport {\n checkNaming,\n countFileLines,\n getAllSourceFiles,\n getDiffFiles,\n getStagedFiles,\n isIgnored,\n SOURCE_EXTS,\n} from './check-files.js';\nimport { checkMissingTests } from './check-tests.js';\n\nexport { resolveConfigForFile } from './check-config.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\nexport interface CheckOptions {\n files?: string[];\n staged?: boolean;\n diffBase?: string;\n noBoundaries?: boolean;\n quiet?: boolean;\n limit?: number;\n format?: 'text' | 'json';\n enforce?: boolean;\n hook?: boolean;\n}\n\n/** Check if a file path looks like a test file. */\nfunction isTestFile(relPath: string): boolean {\n const filename = path.basename(relPath);\n return (\n filename.includes('.test.') ||\n filename.includes('.spec.') ||\n filename.startsWith('test.') ||\n filename.startsWith('spec.') ||\n relPath.includes('__tests__/') ||\n relPath.includes('__test__/')\n );\n}\n\n/**\n * Print violations grouped by rule type with counts.\n */\nfunction printGroupedViolations(violations: CheckViolation[], limit?: number): void {\n const groups = new Map<string, CheckViolation[]>();\n for (const v of violations) {\n const existing = groups.get(v.rule) ?? [];\n existing.push(v);\n groups.set(v.rule, existing);\n }\n\n const ruleOrder = [\n 'file-size',\n 'file-naming',\n 'missing-test',\n 'test-coverage',\n 'boundary-violation',\n ];\n const sortedKeys = [...groups.keys()].sort(\n (a, b) =>\n (ruleOrder.indexOf(a) === -1 ? 99 : ruleOrder.indexOf(a)) -\n (ruleOrder.indexOf(b) === -1 ? 99 : ruleOrder.indexOf(b)),\n );\n\n let totalShown = 0;\n const totalLimit = limit ?? Number.POSITIVE_INFINITY;\n\n for (const rule of sortedKeys) {\n const group = groups.get(rule);\n if (!group) continue;\n const remaining = totalLimit - totalShown;\n if (remaining <= 0) break;\n\n const toShow = group.slice(0, remaining);\n const hidden = group.length - toShow.length;\n\n for (const v of toShow) {\n const icon = v.severity === 'error' ? chalk.red('✗') : chalk.yellow('!');\n console.log(`${icon} ${chalk.dim(v.rule)} ${v.file}: ${v.message}`);\n }\n totalShown += toShow.length;\n\n if (hidden > 0) {\n console.log(chalk.dim(` ... and ${hidden} more ${rule} violations`));\n }\n }\n}\n\n/**\n * Print a summary of violations by rule type.\n */\nfunction printSummary(violations: CheckViolation[]): void {\n const counts = new Map<string, number>();\n for (const v of violations) {\n counts.set(v.rule, (counts.get(v.rule) ?? 0) + 1);\n }\n\n const word = violations.length === 1 ? 'violation' : 'violations';\n const parts = [...counts.entries()].map(([rule, count]) => `${count} ${rule}`);\n console.log(`\\n${violations.length} ${word} found (${parts.join(', ')}).`);\n}\n\n/**\n * Run the viberails check command.\n * Returns exit code: 0 = pass or warn-mode, 1 = violations in enforce mode.\n */\nexport async function checkCommand(options: CheckOptions, cwd?: string): Promise<number> {\n const startDir = cwd ?? process.cwd();\n\n const projectRoot = findProjectRoot(startDir);\n if (!projectRoot) {\n console.error(`${chalk.red('Error:')} No package.json found. Are you in a JS/TS project?`);\n return 1;\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (!fs.existsSync(configPath)) {\n console.error(\n `${chalk.red('Error:')} No viberails.config.json found. Run \\`viberails init\\` first.`,\n );\n return 1;\n }\n\n const config = await loadConfig(configPath);\n\n // Determine which files to check\n let filesToCheck: string[];\n let diffAddedFiles: Set<string> | null = null;\n if (options.staged) {\n filesToCheck = getStagedFiles(projectRoot);\n } else if (options.diffBase) {\n const diff = getDiffFiles(projectRoot, options.diffBase);\n filesToCheck = diff.all.filter((f) => SOURCE_EXTS.has(path.extname(f)));\n diffAddedFiles = new Set(diff.added);\n } else if (options.files && options.files.length > 0) {\n filesToCheck = options.files;\n } else {\n filesToCheck = getAllSourceFiles(projectRoot, config);\n }\n\n if (filesToCheck.length === 0) {\n if (options.format === 'json') {\n console.log(JSON.stringify({ violations: [], checkedFiles: 0 }));\n } else {\n console.log(`${chalk.green('✓')} No files to check.`);\n }\n return 0;\n }\n\n const violations: CheckViolation[] = [];\n const severity = options.enforce ? 'error' : 'warn';\n const log =\n options.format !== 'json' && !options.hook\n ? (msg: string) => process.stderr.write(chalk.dim(msg))\n : () => {};\n\n log(' Checking files...');\n for (const file of filesToCheck) {\n const absPath = path.isAbsolute(file) ? file : path.join(projectRoot, file);\n const relPath = path.relative(projectRoot, absPath);\n\n const effectiveIgnore = resolveIgnoreForFile(relPath, config);\n if (isIgnored(relPath, effectiveIgnore)) continue;\n if (!fs.existsSync(absPath)) continue;\n\n const resolved = resolveConfigForFile(relPath, config);\n\n // Check 1: File size (with separate threshold for test files)\n const testFile = isTestFile(relPath);\n const maxLines = testFile ? resolved.rules.maxTestFileLines : resolved.rules.maxFileLines;\n if (maxLines > 0) {\n const lines = countFileLines(absPath);\n if (lines !== null && lines > maxLines) {\n violations.push({\n file: relPath,\n rule: 'file-size',\n message: `${lines} lines (max ${maxLines}). Split into focused modules.`,\n severity,\n });\n }\n }\n\n // Check 2: File naming convention\n if (resolved.rules.enforceNaming && resolved.conventions.fileNaming) {\n const namingViolation = checkNaming(relPath, resolved.conventions);\n if (namingViolation) {\n violations.push({\n file: relPath,\n rule: 'file-naming',\n message: namingViolation,\n severity,\n });\n }\n }\n }\n\n log(' done\\n');\n\n // Check 3: Missing tests (full check or diff-base with added files only)\n if (!options.staged && !options.files) {\n log(' Checking missing tests...');\n const testViolations = checkMissingTests(projectRoot, config, severity);\n violations.push(\n ...(diffAddedFiles\n ? testViolations.filter((v) => diffAddedFiles.has(v.file))\n : testViolations),\n );\n log(' done\\n');\n }\n\n // Check 4: Test coverage threshold (full check only, skip in diff mode)\n if (!options.files && !options.staged && !options.diffBase) {\n log(' Running test coverage...\\n');\n const coverageViolations = checkCoverage(projectRoot, config, filesToCheck, {\n staged: options.staged,\n enforce: options.enforce,\n onProgress: (pkg) => log(` Coverage: ${pkg}...\\n`),\n });\n violations.push(...coverageViolations);\n }\n\n // Check 5: Boundary violations\n if (\n config.rules.enforceBoundaries &&\n config.boundaries &&\n Object.keys(config.boundaries.deny).length > 0 &&\n !options.noBoundaries\n ) {\n const startTime = Date.now();\n const { buildImportGraph, checkBoundaries } = await import('@viberails/graph');\n\n const packages =\n config.packages.length > 1\n ? resolveWorkspacePackages(projectRoot, config.packages)\n : undefined;\n\n const graph = await buildImportGraph(projectRoot, {\n packages,\n ignore: config.ignore,\n });\n\n const boundaryViolations = checkBoundaries(graph, config.boundaries);\n\n // In staged/files/diff mode, only report violations in those files\n const filterSet =\n options.staged || options.files || options.diffBase\n ? new Set(filesToCheck.map((f) => path.resolve(projectRoot, f)))\n : null;\n\n for (const bv of boundaryViolations) {\n if (filterSet && !filterSet.has(bv.file)) continue;\n\n const relFile = path.relative(projectRoot, bv.file);\n violations.push({\n file: relFile,\n rule: 'boundary-violation',\n message: `Imports \"${bv.specifier}\" violating boundary: ${bv.rule.from} → ${bv.rule.to}`,\n severity,\n });\n }\n\n log(` Boundary check: ${graph.nodes.length} files in ${Date.now() - startTime}ms\\n`);\n }\n\n // Output results\n if (options.format === 'json') {\n console.log(\n JSON.stringify({\n violations,\n checkedFiles: filesToCheck.length,\n }),\n );\n return options.enforce && violations.length > 0 ? 1 : 0;\n }\n\n if (violations.length === 0) {\n console.log(`${chalk.green('✓')} ${filesToCheck.length} files checked — no violations`);\n return 0;\n }\n\n if (!options.quiet) {\n printGroupedViolations(violations, options.limit);\n }\n\n printSummary(violations);\n\n if (options.enforce) {\n console.log(chalk.red('Fix violations before committing.'));\n return 1;\n }\n\n return 0;\n}\n","import { BUILTIN_IGNORE } from '@viberails/config';\nimport type {\n ConfigConventions,\n ConfigCoverage,\n ConfigRules,\n ViberailsConfig,\n} from '@viberails/types';\n\nexport interface ResolvedConfig {\n rules: ConfigRules;\n conventions: ConfigConventions;\n coverage: ConfigCoverage;\n}\n\n/**\n * Resolve the effective config for a file by finding its package.\n * Returns the global rules merged with any matching package overrides.\n */\nexport function resolveConfigForFile(relPath: string, config: ViberailsConfig): ResolvedConfig {\n // Sort by path length descending to match the most specific package first\n const sortedPackages = [...config.packages].sort((a, b) => b.path.length - a.path.length);\n\n for (const pkg of sortedPackages) {\n if (pkg.path === '.') continue; // Check non-root packages first\n if (relPath.startsWith(`${pkg.path}/`) || relPath === pkg.path) {\n return {\n rules: { ...config.rules, ...pkg.rules },\n conventions: pkg.conventions ?? {},\n coverage: {\n ...(config.defaults?.coverage ?? {}),\n ...(pkg.coverage ?? {}),\n },\n };\n }\n }\n\n // Fall back to root package\n const root = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n return {\n rules: { ...config.rules, ...root.rules },\n conventions: root.conventions ?? {},\n coverage: {\n ...(config.defaults?.coverage ?? {}),\n ...(root.coverage ?? {}),\n },\n };\n}\n\n/**\n * Get effective ignore patterns: BUILTIN_IGNORE + config.ignore + package-specific.\n */\nexport function getEffectiveIgnore(config: ViberailsConfig): string[] {\n return [...BUILTIN_IGNORE, ...(config.ignore ?? [])];\n}\n\n/**\n * Resolve ignore patterns for a file, appending any package-specific patterns.\n */\nexport function resolveIgnoreForFile(relPath: string, config: ViberailsConfig): string[] {\n const base = getEffectiveIgnore(config);\n const root = config.packages.find((p) => p.path === '.');\n const withRoot = root?.ignore ? [...base, ...root.ignore] : base;\n\n const matched = [...config.packages]\n .filter((p) => p.path !== '.')\n .sort((a, b) => b.path.length - a.path.length)\n .find((p) => relPath.startsWith(`${p.path}/`) || relPath === p.path);\n\n if (matched?.ignore) {\n return [...withRoot, ...matched.ignore];\n }\n\n return withRoot;\n}\n","import { spawnSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { inferCoverageCommand } from '@viberails/config';\nimport type {\n CheckViolation,\n ConfigCoverage,\n ConfigRules,\n PackageConfig,\n ViberailsConfig,\n} from '@viberails/types';\n\nconst DEFAULT_SUMMARY_PATH = 'coverage/coverage-summary.json';\n\ninterface ResolvedPackageCoverage {\n pkg: PackageConfig;\n rules: ConfigRules;\n coverage: ConfigCoverage;\n}\n\ninterface CoverageSummary {\n total?: {\n lines?: {\n pct?: number;\n };\n };\n}\n\nfunction packageRoot(projectRoot: string, pkg: PackageConfig): string {\n return pkg.path === '.' ? projectRoot : path.join(projectRoot, pkg.path);\n}\n\nfunction resolveForPackage(config: ViberailsConfig, pkg: PackageConfig): ResolvedPackageCoverage {\n return {\n pkg,\n rules: { ...config.rules, ...pkg.rules },\n coverage: {\n ...(config.defaults?.coverage ?? {}),\n ...(pkg.coverage ?? {}),\n },\n };\n}\n\nfunction resolveCoveragePackages(\n projectRoot: string,\n config: ViberailsConfig,\n filesToCheck: string[],\n staged: boolean,\n): ResolvedPackageCoverage[] {\n if (!staged) {\n return config.packages.map((pkg) => resolveForPackage(config, pkg));\n }\n\n const matched = new Map<string, ResolvedPackageCoverage>();\n for (const raw of filesToCheck) {\n const relPath = path.isAbsolute(raw) ? path.relative(projectRoot, raw) : raw;\n const sorted = [...config.packages]\n .filter((pkg) => pkg.path !== '.')\n .sort((a, b) => b.path.length - a.path.length);\n const pkg =\n sorted.find(\n (candidate) => relPath.startsWith(`${candidate.path}/`) || relPath === candidate.path,\n ) ??\n config.packages.find((candidate) => candidate.path === '.') ??\n config.packages[0];\n matched.set(pkg.path, resolveForPackage(config, pkg));\n }\n return [...matched.values()];\n}\n\nfunction readCoveragePercentage(summaryPath: string): number | undefined {\n try {\n const parsed = JSON.parse(fs.readFileSync(summaryPath, 'utf-8')) as CoverageSummary;\n const pct = parsed.total?.lines?.pct;\n return typeof pct === 'number' ? pct : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction runCoverageCommand(pkgRoot: string, command: string): { ok: boolean; detail?: string } {\n const result = spawnSync(command, {\n cwd: pkgRoot,\n shell: true,\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n if (result.status === 0) return { ok: true };\n const stderr = result.stderr?.trim() ?? '';\n const stdout = result.stdout?.trim() ?? '';\n const raw = stderr || stdout || `exit code ${result.status ?? 1}`;\n\n // Detect missing vitest coverage provider\n if (\n raw.includes('coverage-v8') ||\n raw.includes('coverage-istanbul') ||\n raw.includes('MISSING DEP')\n ) {\n return {\n ok: false,\n detail: 'Missing coverage provider. Install with: npm install -D @vitest/coverage-v8',\n };\n }\n\n // Strip ANSI codes from error output\n // biome-ignore lint/suspicious/noControlCharactersInRegex: stripping ANSI escape sequences\n const detail = raw.replace(/\\x1B\\[[0-9;]*m/g, '');\n return { ok: false, detail };\n}\n\nfunction violationFilePath(projectRoot: string, pkgRoot: string, summaryPath: string): string {\n return path.relative(projectRoot, path.join(pkgRoot, summaryPath));\n}\n\nfunction pushViolation(\n violations: CheckViolation[],\n file: string,\n message: string,\n severity: 'warn' | 'error',\n): void {\n violations.push({\n file,\n rule: 'test-coverage',\n message,\n severity,\n });\n}\n\nexport function checkCoverage(\n projectRoot: string,\n config: ViberailsConfig,\n filesToCheck: string[],\n options: { staged?: boolean; enforce?: boolean; onProgress?: (pkg: string) => void },\n): CheckViolation[] {\n const severity: 'warn' | 'error' = options.enforce ? 'error' : 'warn';\n const targets = resolveCoveragePackages(\n projectRoot,\n config,\n filesToCheck,\n options.staged === true,\n );\n const violations: CheckViolation[] = [];\n\n for (const target of targets) {\n if (target.rules.testCoverage <= 0) continue;\n\n // Skip packages that have no test runner — they can't produce coverage\n if (!target.pkg.stack?.testRunner) continue;\n\n const pkgRoot = packageRoot(projectRoot, target.pkg);\n const summaryPath = target.coverage.summaryPath ?? DEFAULT_SUMMARY_PATH;\n const summaryAbs = path.join(pkgRoot, summaryPath);\n const summaryRel = violationFilePath(projectRoot, pkgRoot, summaryPath);\n\n let pct = readCoveragePercentage(summaryAbs);\n\n if (pct === undefined && !options.staged) {\n // Use explicit command, or infer from this package's test runner\n const command = target.coverage.command ?? inferCoverageCommand(target.pkg.stack.testRunner);\n if (!command) {\n const pkgLabel = target.pkg.path === '.' ? 'root package' : target.pkg.path;\n pushViolation(\n violations,\n summaryRel,\n `No coverage summary found for \"${pkgLabel}\". Run your test suite with coverage enabled, or set defaults.coverage.command in viberails.config.json.`,\n severity,\n );\n continue;\n }\n\n options.onProgress?.(target.pkg.path === '.' ? 'root' : target.pkg.path);\n const run = runCoverageCommand(pkgRoot, command);\n if (!run.ok) {\n pushViolation(\n violations,\n summaryRel,\n `Failed to run coverage command: ${run.detail}.`,\n severity,\n );\n continue;\n }\n\n pct = readCoveragePercentage(summaryAbs);\n }\n\n if (pct === undefined) {\n pushViolation(\n violations,\n summaryRel,\n `Coverage summary not found or invalid at \\`${summaryPath}\\`.`,\n severity,\n );\n continue;\n }\n\n if (pct < target.rules.testCoverage) {\n pushViolation(\n violations,\n summaryRel,\n `Line coverage ${pct.toFixed(1)}% is below required ${target.rules.testCoverage}%.`,\n severity,\n );\n }\n }\n\n return violations;\n}\n","import { execSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { BUILTIN_IGNORE } from '@viberails/config';\nimport type { ConfigConventions, ViberailsConfig } from '@viberails/types';\nimport picomatch from 'picomatch';\n\nconst ALWAYS_SKIP_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n '.next',\n '.expo',\n '.output',\n '.svelte-kit',\n '.turbo',\n 'coverage',\n 'public',\n 'vendor',\n '__generated__',\n 'generated',\n '.viberails',\n]);\n\nexport const SOURCE_EXTS = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.vue',\n '.svelte',\n '.astro',\n]);\n\nexport const NAMING_PATTERNS: Record<string, RegExp> = {\n 'kebab-case': /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/,\n camelCase: /^[a-z][a-zA-Z0-9]*$/,\n PascalCase: /^[A-Z][a-zA-Z0-9]*$/,\n snake_case: /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,\n};\n\n/** Check if a path matches any ignore pattern. */\nexport function isIgnored(relPath: string, ignorePatterns: string[]): boolean {\n if (ignorePatterns.length === 0) return false;\n const isMatch = picomatch(ignorePatterns, { dot: true });\n return isMatch(relPath);\n}\n\n/** Count lines in a file. Returns null if the file can't be read. */\nexport function countFileLines(filePath: string): number | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n if (content.length === 0) return 0;\n let count = 1;\n for (let i = 0; i < content.length; i++) {\n if (content.charCodeAt(i) === 10) count++;\n }\n return count;\n } catch {\n return null;\n }\n}\n\n/** Check whether a file's name violates the configured naming convention. */\nexport function checkNaming(relPath: string, conventions: ConfigConventions): string | undefined {\n const filename = path.basename(relPath);\n\n // Skip non-source files\n const ext = path.extname(filename);\n if (!SOURCE_EXTS.has(ext)) return undefined;\n\n // Skip special files\n if (\n filename.startsWith('index.') ||\n filename.includes('.config.') ||\n filename.includes('.test.') ||\n filename.includes('.spec.') ||\n filename.startsWith('.') ||\n filename.startsWith('_') ||\n filename.startsWith('+') ||\n filename.startsWith('$') ||\n filename.startsWith('[')\n ) {\n return undefined;\n }\n\n const bare = filename.slice(0, filename.indexOf('.'));\n const convention = conventions.fileNaming;\n if (!convention) return undefined;\n\n const pattern = NAMING_PATTERNS[convention];\n if (!pattern || pattern.test(bare)) return undefined;\n\n return `File name \"${filename}\" does not follow ${convention} convention.`;\n}\n\n/** Get staged files from git. */\nexport function getStagedFiles(projectRoot: string): string[] {\n try {\n const output = execSync('git diff --cached --name-only --diff-filter=ACM', {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return output.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/** Get files changed between a base ref and HEAD. */\nexport function getDiffFiles(\n projectRoot: string,\n base: string,\n): { all: string[]; added: string[] } {\n try {\n const allOutput = execSync(`git diff --name-only --diff-filter=ACMR ${base}...HEAD`, {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n const addedOutput = execSync(`git diff --name-only --diff-filter=A ${base}...HEAD`, {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return {\n all: allOutput.trim().split('\\n').filter(Boolean),\n added: addedOutput.trim().split('\\n').filter(Boolean),\n };\n } catch {\n return { all: [], added: [] };\n }\n}\n\n/** Get all source files in the project. */\nexport function getAllSourceFiles(projectRoot: string, config: ViberailsConfig): string[] {\n const effectiveIgnore = [...BUILTIN_IGNORE, ...(config.ignore ?? [])];\n const files: string[] = [];\n const walk = (dir: string) => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const rel = path.relative(projectRoot, path.join(dir, entry.name));\n if (entry.isDirectory()) {\n if (ALWAYS_SKIP_DIRS.has(entry.name)) {\n continue;\n }\n if (isIgnored(rel, effectiveIgnore)) continue;\n walk(path.join(dir, entry.name));\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n if (SOURCE_EXTS.has(ext) && !isIgnored(rel, effectiveIgnore)) {\n files.push(rel);\n }\n }\n }\n };\n walk(projectRoot);\n return files;\n}\n\n/** Collect source files from a directory recursively. */\nexport function collectSourceFiles(dir: string, projectRoot: string): string[] {\n const files: string[] = [];\n const walk = (d: string) => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(d, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules') continue;\n walk(path.join(d, entry.name));\n } else if (entry.isFile()) {\n files.push(path.relative(projectRoot, path.join(d, entry.name)));\n }\n }\n };\n walk(dir);\n return files;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { CheckViolation, PackageConfig, ViberailsConfig } from '@viberails/types';\nimport { collectSourceFiles } from './check-files.js';\n\nconst SOURCE_EXTS = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.vue',\n '.svelte',\n '.astro',\n]);\n\n/** Check for source files without corresponding test files. */\nexport function checkMissingTests(\n projectRoot: string,\n config: ViberailsConfig,\n severity: 'error' | 'warn',\n): CheckViolation[] {\n const violations: CheckViolation[] = [];\n for (const pkg of config.packages) {\n const effectiveRules = { ...config.rules, ...pkg.rules };\n const enforceMissing = effectiveRules.enforceMissingTests ?? effectiveRules.testCoverage > 0;\n if (!enforceMissing) continue;\n\n const testPattern = pkg.structure?.testPattern;\n const srcDir = pkg.structure?.srcDir;\n if (!testPattern || !srcDir) continue;\n\n const packageRoot = pkg.path === '.' ? projectRoot : path.join(projectRoot, pkg.path);\n const srcPath = path.join(packageRoot, srcDir);\n if (!fs.existsSync(srcPath)) continue;\n\n const testSuffix = testPattern.replace('*', '');\n const sourceFiles = collectSourceFiles(srcPath, projectRoot);\n\n for (const relFile of sourceFiles) {\n const basename = path.basename(relFile);\n\n // Skip test files, index files, type definition files\n if (\n basename.includes('.test.') ||\n basename.includes('.spec.') ||\n basename.startsWith('index.') ||\n basename.endsWith('.d.ts')\n ) {\n continue;\n }\n\n const ext = path.extname(basename);\n if (!SOURCE_EXTS.has(ext)) continue;\n\n const stem = basename.slice(0, -ext.length);\n const expectedTestFile = `${stem}${testSuffix}`;\n\n // Look for the test file next to the source or in the package tests directory\n const dir = path.dirname(path.join(projectRoot, relFile));\n const colocatedTest = path.join(dir, expectedTestFile);\n const testsDir = pkg.structure?.tests;\n const dedicatedTest = testsDir ? path.join(packageRoot, testsDir, expectedTestFile) : null;\n\n const hasTest =\n fs.existsSync(colocatedTest) || (dedicatedTest !== null && fs.existsSync(dedicatedTest));\n\n if (!hasTest) {\n violations.push({\n file: relFile,\n rule: 'missing-test',\n message: `No test file found. Expected \\`${expectedTestFile}\\`.`,\n severity,\n });\n }\n }\n }\n\n return violations;\n}\n\nexport function resolvePackageForFile(\n sourceRelPath: string,\n config: ViberailsConfig,\n): PackageConfig | undefined {\n const sorted = [...config.packages]\n .filter((p) => p.path !== '.')\n .sort((a, b) => b.path.length - a.path.length);\n for (const pkg of sorted) {\n if (sourceRelPath.startsWith(`${pkg.path}/`) || sourceRelPath === pkg.path) {\n return pkg;\n }\n }\n return config.packages.find((p) => p.path === '.') ?? config.packages[0];\n}\n","import * as fs from 'node:fs';\nimport { checkCommand } from './check.js';\n\n/**\n * Parse a file path from Claude Code hook stdin JSON.\n * The PostToolUse hook receives `{ tool_input: { file_path: \"...\" } }` on stdin.\n * Returns the file path or undefined if input is empty/malformed.\n */\nexport function parseHookFilePath(input: string): string | undefined {\n try {\n if (!input.trim()) return undefined;\n const parsed = JSON.parse(input);\n return parsed?.tool_input?.file_path ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readStdin(): string {\n try {\n return fs.readFileSync(0, 'utf-8');\n } catch {\n return '';\n }\n}\n\n/**\n * Run viberails check in Claude Code hook mode.\n *\n * Reads the edited file path from stdin JSON, runs the check,\n * and outputs violation JSON to stderr so Claude sees feedback.\n * Returns exit code 2 if violations found, 0 otherwise.\n * Never throws — errors silently pass to avoid blocking Claude.\n */\nexport async function hookCheckCommand(cwd?: string): Promise<number> {\n try {\n const filePath = parseHookFilePath(readStdin());\n if (!filePath) return 0;\n\n // Redirect stdout to capture checkCommand's JSON output\n const originalWrite = process.stdout.write.bind(process.stdout);\n let captured = '';\n process.stdout.write = (chunk: string | Uint8Array): boolean => {\n captured += typeof chunk === 'string' ? chunk : chunk.toString();\n return true;\n };\n\n try {\n await checkCommand({ files: [filePath], format: 'json' }, cwd);\n } finally {\n process.stdout.write = originalWrite;\n }\n\n if (!captured.trim()) return 0;\n\n const result = JSON.parse(captured);\n if (result.violations?.length > 0) {\n process.stderr.write(`${captured.trim()}\\n`);\n return 2;\n }\n\n return 0;\n } catch {\n // Never block Claude on internal errors\n return 0;\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport { compactConfig, loadConfig, mergeConfig } from '@viberails/config';\nimport { scan } from '@viberails/scanner';\nimport chalk from 'chalk';\nimport { formatRulesText } from '../display-text.js';\nimport { applyRuleOverrides } from '../utils/apply-rule-overrides.js';\nimport { diffConfigs } from '../utils/diff-configs.js';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { confirm, promptRuleMenu } from '../utils/prompt.js';\nimport { resolveWorkspacePackages } from '../utils/resolve-workspace-packages.js';\nimport { writeGeneratedFiles } from '../utils/write-generated-files.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\n/**\n * Run the viberails config command: interactively edit existing config rules.\n *\n * @param options - Command options\n * @param cwd - Working directory override (for testing)\n */\nexport async function configCommand(options: { rescan?: boolean }, cwd?: string): Promise<void> {\n const projectRoot = findProjectRoot(cwd ?? process.cwd());\n if (!projectRoot) {\n throw new Error('No package.json found. Make sure you are inside a JS/TS project.');\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (!fs.existsSync(configPath)) {\n console.log(`${chalk.yellow('!')} No config found. Run ${chalk.cyan('viberails init')} first.`);\n return;\n }\n\n clack.intro('viberails config');\n\n const config = await loadConfig(configPath);\n let scanResult = options.rescan ? await rescanAndMerge(projectRoot, config) : undefined;\n\n // Show current rules\n clack.note(formatRulesText(config).join('\\n'), 'Current rules');\n\n // Open rule menu with current values\n const rootPkg = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const overrides = await promptRuleMenu({\n maxFileLines: config.rules.maxFileLines,\n testCoverage: config.rules.testCoverage,\n enforceMissingTests: config.rules.enforceMissingTests,\n enforceNaming: config.rules.enforceNaming,\n fileNamingValue: rootPkg.conventions?.fileNaming,\n coverageSummaryPath: rootPkg.coverage?.summaryPath ?? 'coverage/coverage-summary.json',\n coverageCommand: config.defaults?.coverage?.command,\n packageOverrides: config.packages,\n });\n\n applyRuleOverrides(config, overrides);\n\n // Re-infer boundaries if rescan on a monorepo\n if (options.rescan && config.packages.length > 1) {\n const shouldInfer = await confirm('Re-infer boundary rules from import patterns?');\n if (shouldInfer) {\n const bs = clack.spinner();\n bs.start('Building import graph...');\n const { buildImportGraph, inferBoundaries } = await import('@viberails/graph');\n const packages = resolveWorkspacePackages(projectRoot, config.packages);\n const graph = await buildImportGraph(projectRoot, { packages, ignore: config.ignore });\n const inferred = inferBoundaries(graph);\n const denyCount = Object.values(inferred.deny).reduce((sum, arr) => sum + arr.length, 0);\n if (denyCount > 0) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n bs.stop(`Inferred ${denyCount} boundary rules`);\n } else {\n bs.stop('No boundary rules inferred');\n }\n }\n }\n\n // Confirm and write\n const shouldWrite = await confirm('Save updated configuration?');\n if (!shouldWrite) {\n clack.outro('No changes written.');\n return;\n }\n\n const compacted = compactConfig(config);\n fs.writeFileSync(configPath, `${JSON.stringify(compacted, null, 2)}\\n`);\n\n // Regenerate context files (need scan result)\n if (!scanResult) {\n const s = clack.spinner();\n s.start('Scanning for context generation...');\n scanResult = await scan(projectRoot);\n s.stop('Scan complete');\n }\n\n writeGeneratedFiles(projectRoot, config, scanResult);\n\n clack.log.success(\n `Updated:\\n ${CONFIG_FILE}\\n .viberails/context.md\\n .viberails/scan-result.json`,\n );\n clack.outro('Done! Run viberails check to verify.');\n}\n\nasync function rescanAndMerge(\n projectRoot: string,\n config: import('@viberails/types').ViberailsConfig,\n): Promise<import('@viberails/types').ScanResult> {\n const s = clack.spinner();\n s.start('Re-scanning project...');\n const scanResult = await scan(projectRoot);\n const merged = mergeConfig(config, scanResult);\n s.stop('Scan complete');\n\n // Show diff if anything changed\n const changes = diffConfigs(config, merged);\n if (changes.length > 0) {\n const changeLines = changes\n .map((c) => {\n const icon = c.type === 'removed' ? '-' : '+';\n return `${icon} ${c.description}`;\n })\n .join('\\n');\n clack.note(changeLines, 'Changes detected');\n } else {\n clack.log.info('No new changes detected from scan.');\n }\n\n // Apply merged values back\n Object.assign(config, merged);\n\n return scanResult;\n}\n","import type { DetectedConvention, ScanResult, ViberailsConfig } from '@viberails/types';\nimport {\n CONVENTION_LABELS,\n FRAMEWORK_NAMES,\n LIBRARY_NAMES,\n ORM_NAMES,\n STYLING_NAMES,\n} from '@viberails/types';\nimport { formatItem } from './display.js';\nimport {\n formatExtensions,\n formatRoleGroup,\n formatSummary,\n groupByRole,\n} from './display-helpers.js';\nimport { formatMonorepoResultsText } from './display-monorepo.js';\n\n// Conventions are plain strings — no extraction needed.\n\n/**\n * Format a plain-text confidence label (no chalk).\n */\nfunction plainConfidenceLabel(convention: DetectedConvention): string {\n const pct = Math.round(convention.consistency);\n if (convention.confidence === 'high') {\n return `${pct}%`;\n }\n return `${pct}%, suggested only`;\n}\n\n/**\n * Build conventions section as plain text lines.\n */\nexport function formatConventionsText(scanResult: ScanResult): string[] {\n const lines: string[] = [];\n const conventionEntries = Object.entries(scanResult.conventions);\n if (conventionEntries.length === 0) return lines;\n\n lines.push('');\n lines.push('Conventions:');\n for (const [key, convention] of conventionEntries) {\n if (convention.confidence === 'low') continue;\n const label = CONVENTION_LABELS[key] ?? key;\n\n if (scanResult.packages.length > 1) {\n const pkgValues = scanResult.packages\n .filter((pkg) => pkg.conventions[key] && pkg.conventions[key].confidence !== 'low')\n .map((pkg) => ({ relativePath: pkg.relativePath, convention: pkg.conventions[key] }));\n\n const allSame = pkgValues.every((pv) => pv.convention.value === convention.value);\n\n if (allSame || pkgValues.length <= 1) {\n const ind = convention.confidence === 'high' ? '\\u2713' : '~';\n lines.push(` ${ind} ${label}: ${convention.value} (${plainConfidenceLabel(convention)})`);\n } else {\n lines.push(` ~ ${label}: varies by package`);\n for (const pv of pkgValues) {\n const pct = Math.round(pv.convention.consistency);\n lines.push(` ${pv.relativePath}: ${pv.convention.value} (${pct}%)`);\n }\n }\n } else {\n const ind = convention.confidence === 'high' ? '\\u2713' : '~';\n lines.push(` ${ind} ${label}: ${convention.value} (${plainConfidenceLabel(convention)})`);\n }\n }\n return lines;\n}\n\n/**\n * Build rules preview as plain text lines.\n */\nexport function formatRulesText(config: ViberailsConfig): string[] {\n const root = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const isMonorepo = config.packages.length > 1;\n const lines: string[] = [];\n lines.push(`Max file size: ${config.rules.maxFileLines} lines`);\n\n if (config.rules.testCoverage > 0) {\n const label = isMonorepo ? 'Default coverage target' : 'Test coverage target';\n const suffix = isMonorepo ? ' (per-package)' : '';\n lines.push(`${label}: ${config.rules.testCoverage}%${suffix}`);\n } else {\n lines.push('Test coverage target: disabled');\n }\n\n const enforceMissing = config.rules.enforceMissingTests ?? config.rules.testCoverage > 0;\n if (enforceMissing && root?.structure?.testPattern) {\n lines.push(`Enforce missing tests: yes (${root.structure.testPattern})`);\n } else {\n lines.push('Enforce missing tests: no');\n }\n\n if (config.rules.enforceNaming && root?.conventions?.fileNaming) {\n lines.push(`Enforce file naming: ${root.conventions.fileNaming}`);\n } else {\n lines.push('Enforce file naming: no');\n }\n\n return lines;\n}\n\n/**\n * Build scan results as a multi-line string for clack.note().\n * Returns plain text without chalk colors.\n *\n * @param scanResult - The scan result to format\n * @param config - The generated config (for rules preview)\n * @returns Formatted multi-line string\n */\nexport function formatScanResultsText(scanResult: ScanResult): string {\n if (scanResult.packages.length > 1) {\n return formatMonorepoResultsText(scanResult);\n }\n\n const lines: string[] = [];\n const { stack } = scanResult;\n\n lines.push('Detected:');\n if (stack.framework) {\n lines.push(` \\u2713 ${formatItem(stack.framework, FRAMEWORK_NAMES)}`);\n }\n lines.push(` \\u2713 ${formatItem(stack.language)}`);\n if (stack.styling) {\n lines.push(` \\u2713 ${formatItem(stack.styling, STYLING_NAMES)}`);\n }\n if (stack.backend) {\n lines.push(` \\u2713 ${formatItem(stack.backend, FRAMEWORK_NAMES)}`);\n }\n if (stack.orm) {\n lines.push(` \\u2713 ${formatItem(stack.orm, ORM_NAMES)}`);\n }\n\n // Compact secondary tools line\n const secondaryParts: string[] = [];\n if (stack.packageManager) secondaryParts.push(formatItem(stack.packageManager));\n if (stack.linter) secondaryParts.push(formatItem(stack.linter));\n if (stack.formatter) secondaryParts.push(formatItem(stack.formatter));\n if (stack.testRunner) secondaryParts.push(formatItem(stack.testRunner));\n if (secondaryParts.length > 0) {\n lines.push(` \\u2713 ${secondaryParts.join(' \\u00b7 ')}`);\n }\n\n if (stack.libraries.length > 0) {\n for (const lib of stack.libraries) {\n lines.push(` \\u2713 ${formatItem(lib, LIBRARY_NAMES)}`);\n }\n }\n\n // Structure\n const groups = groupByRole(scanResult.structure.directories);\n if (groups.length > 0) {\n lines.push('');\n lines.push('Structure:');\n for (const group of groups) {\n lines.push(` \\u2713 ${formatRoleGroup(group)}`);\n }\n }\n\n // Conventions\n lines.push(...formatConventionsText(scanResult));\n\n // Summary stats\n const pkgCount = scanResult.packages.length > 1 ? scanResult.packages.length : undefined;\n lines.push('');\n lines.push(formatSummary(scanResult.statistics, pkgCount));\n const ext = formatExtensions(scanResult.statistics.filesByExtension);\n if (ext) {\n lines.push(ext);\n }\n\n return lines.join('\\n');\n}\n","import type { DetectedConvention, ScanResult, StackItem, ViberailsConfig } from '@viberails/types';\nimport {\n CONVENTION_LABELS,\n FRAMEWORK_NAMES,\n LIBRARY_NAMES,\n ORM_NAMES,\n STYLING_NAMES,\n} from '@viberails/types';\nimport chalk from 'chalk';\nimport {\n formatExtensions,\n formatRoleGroup,\n formatSummary,\n groupByRole,\n} from './display-helpers.js';\nimport { displayMonorepoResults } from './display-monorepo.js';\n\n/**\n * Format a StackItem for display: \"DisplayName Version\".\n */\nexport function formatItem(item: StackItem, nameMap?: Record<string, string>): string {\n const name = nameMap?.[item.name] ?? item.name;\n return item.version ? `${name} ${item.version}` : name;\n}\n\n/**\n * Format a confidence label for display.\n */\nexport function confidenceLabel(convention: DetectedConvention): string {\n const pct = Math.round(convention.consistency);\n if (convention.confidence === 'high') {\n return `${pct}% — high confidence, will enforce`;\n }\n return `${pct}% — medium confidence, suggested only`;\n}\n\n/**\n * Display conventions section, shared between single-package and monorepo.\n */\nexport function displayConventions(scanResult: ScanResult): void {\n const conventionEntries = Object.entries(scanResult.conventions);\n if (conventionEntries.length === 0) return;\n\n console.log(`\\n${chalk.bold('Conventions:')}`);\n for (const [key, convention] of conventionEntries) {\n if (convention.confidence === 'low') continue;\n const label = CONVENTION_LABELS[key] ?? key;\n\n if (scanResult.packages.length > 1) {\n const pkgValues = scanResult.packages\n .filter((pkg) => pkg.conventions[key] && pkg.conventions[key].confidence !== 'low')\n .map((pkg) => ({ relativePath: pkg.relativePath, convention: pkg.conventions[key] }));\n\n const allSame = pkgValues.every((pv) => pv.convention.value === convention.value);\n\n if (allSame || pkgValues.length <= 1) {\n const ind = convention.confidence === 'high' ? chalk.green('✓') : chalk.yellow('~');\n const detail = chalk.dim(`(${confidenceLabel(convention)})`);\n console.log(` ${ind} ${label}: ${convention.value} ${detail}`);\n } else {\n console.log(` ${chalk.yellow('~')} ${label}: varies by package`);\n for (const pv of pkgValues) {\n const pct = Math.round(pv.convention.consistency);\n console.log(` ${pv.relativePath}: ${pv.convention.value} (${pct}%)`);\n }\n }\n } else {\n const ind = convention.confidence === 'high' ? chalk.green('✓') : chalk.yellow('~');\n const detail = chalk.dim(`(${confidenceLabel(convention)})`);\n console.log(` ${ind} ${label}: ${convention.value} ${detail}`);\n }\n }\n}\n\n/**\n * Display summary section with statistics.\n */\nexport function displaySummarySection(scanResult: ScanResult): void {\n const pkgCount = scanResult.packages.length > 1 ? scanResult.packages.length : undefined;\n console.log(`\\n${chalk.bold('Summary:')}`);\n console.log(` ${formatSummary(scanResult.statistics, pkgCount)}`);\n const ext = formatExtensions(scanResult.statistics.filesByExtension);\n if (ext) {\n console.log(` ${ext}`);\n }\n}\n\n/**\n * Display scan results to the console with confidence indicators.\n *\n * @param scanResult - The scan result to display\n */\nexport function displayScanResults(scanResult: ScanResult): void {\n if (scanResult.packages.length > 1) {\n displayMonorepoResults(scanResult);\n return;\n }\n\n const { stack } = scanResult;\n\n console.log(`\\n${chalk.bold('Detected:')}`);\n\n if (stack.framework) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.framework, FRAMEWORK_NAMES)}`);\n }\n console.log(` ${chalk.green('✓')} ${formatItem(stack.language)}`);\n if (stack.styling) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.styling, STYLING_NAMES)}`);\n }\n if (stack.backend) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.backend, FRAMEWORK_NAMES)}`);\n }\n if (stack.orm) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.orm, ORM_NAMES)}`);\n }\n if (stack.linter && stack.formatter && stack.linter.name === stack.formatter.name) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.linter)} (lint + format)`);\n } else {\n if (stack.linter) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.linter)}`);\n }\n if (stack.formatter) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.formatter)}`);\n }\n }\n if (stack.testRunner) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.testRunner)}`);\n }\n if (stack.packageManager) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.packageManager)}`);\n }\n if (stack.libraries.length > 0) {\n for (const lib of stack.libraries) {\n console.log(` ${chalk.green('✓')} ${formatItem(lib, LIBRARY_NAMES)}`);\n }\n }\n\n // Structure grouped by role\n const groups = groupByRole(scanResult.structure.directories);\n if (groups.length > 0) {\n console.log(`\\n${chalk.bold('Structure:')}`);\n for (const group of groups) {\n console.log(` ${chalk.green('✓')} ${formatRoleGroup(group)}`);\n }\n }\n\n displayConventions(scanResult);\n displaySummarySection(scanResult);\n console.log('');\n}\n\n/**\n * Display a preview of the rules that will be enforced.\n * Used in the non-interactive (--yes) path.\n */\nexport function displayRulesPreview(config: ViberailsConfig): void {\n const root = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n\n console.log(\n `${chalk.bold('Rules:')} ${chalk.dim('(warns on violation; use --enforce in CI to block)')}`,\n );\n console.log(` ${chalk.dim('\\u2022')} Max file size: ${config.rules.maxFileLines} lines`);\n\n if (config.rules.testCoverage > 0 && root?.structure?.testPattern) {\n console.log(\n ` ${chalk.dim('\\u2022')} Test coverage target: ${config.rules.testCoverage}% (${root.structure.testPattern})`,\n );\n } else if (config.rules.testCoverage > 0) {\n console.log(` ${chalk.dim('\\u2022')} Test coverage target: ${config.rules.testCoverage}%`);\n } else {\n console.log(` ${chalk.dim('\\u2022')} Test coverage target: disabled`);\n }\n\n if (config.rules.enforceNaming && root?.conventions?.fileNaming) {\n console.log(` ${chalk.dim('\\u2022')} Enforce file naming: ${root.conventions.fileNaming}`);\n } else {\n console.log(` ${chalk.dim('\\u2022')} Enforce file naming: no`);\n }\n\n console.log(\n ` ${chalk.dim('\\u2022')} Enforce boundaries: ${config.rules.enforceBoundaries ? 'yes' : 'no'}`,\n );\n\n console.log('');\n}\n\n/**\n * Display a colorful summary of rules right before the accept/customize prompt.\n * Designed to always be visible even when scan details have scrolled off.\n *\n * @param config - The generated config\n * @param exemptedPackages - Package paths exempted from coverage\n */\nexport function displayInitSummary(config: ViberailsConfig, exemptedPackages: string[]): void {\n const root = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const isMonorepo = config.packages.length > 1;\n const ok = chalk.green('✓');\n const off = chalk.dim('○');\n\n console.log('');\n console.log(` ${chalk.bold('Rules to apply:')}`);\n\n // Max file size\n console.log(` ${ok} Max file size: ${chalk.cyan(`${config.rules.maxFileLines} lines`)}`);\n\n // File naming\n if (config.rules.enforceNaming && root?.conventions?.fileNaming) {\n console.log(` ${ok} File naming: ${chalk.cyan(root.conventions.fileNaming)}`);\n } else {\n console.log(` ${off} File naming: ${chalk.dim('not enforced')}`);\n }\n\n // Missing tests\n if (config.rules.enforceMissingTests && root?.structure?.testPattern) {\n console.log(` ${ok} Missing tests: ${chalk.cyan(`enforced (${root.structure.testPattern})`)}`);\n } else if (config.rules.enforceMissingTests) {\n console.log(` ${ok} Missing tests: ${chalk.cyan('enforced')}`);\n } else {\n console.log(` ${off} Missing tests: ${chalk.dim('not enforced')}`);\n }\n\n // Coverage\n if (config.rules.testCoverage > 0) {\n if (isMonorepo) {\n const withCoverage = config.packages.filter(\n (p) => (p.rules?.testCoverage ?? config.rules.testCoverage) > 0,\n );\n console.log(\n ` ${ok} Coverage: ${chalk.cyan(`${config.rules.testCoverage}%`)} default ${chalk.dim(`(${withCoverage.length}/${config.packages.length} packages)`)}`,\n );\n } else {\n console.log(` ${ok} Coverage: ${chalk.cyan(`${config.rules.testCoverage}%`)}`);\n }\n } else {\n console.log(` ${off} Coverage: ${chalk.dim('disabled')}`);\n }\n\n // Exempted packages\n if (exemptedPackages.length > 0) {\n console.log(\n ` ${chalk.dim(' exempted:')} ${chalk.dim(exemptedPackages.join(', '))} ${chalk.dim('(types-only)')}`,\n );\n }\n\n // Stats line\n if (isMonorepo) {\n console.log(\n `\\n ${chalk.dim(`${config.packages.length} packages scanned · warns on violation · use --enforce in CI`)}`,\n );\n } else {\n console.log(`\\n ${chalk.dim('warns on violation · use --enforce in CI to block')}`);\n }\n\n console.log('');\n}\n","import type { CodebaseStatistics, DirectoryInfo, DirectoryRole } from '@viberails/types';\nimport { ROLE_DESCRIPTIONS } from '@viberails/types';\n\n/**\n * A group of directories sharing the same role within a package.\n */\nexport interface RoleGroup {\n role: DirectoryRole;\n label: string;\n dirCount: number;\n totalFiles: number;\n singlePath?: string;\n}\n\n/**\n * Groups a package's directories by role, merging file counts.\n * Filters out `unknown` role. For single-directory roles, sets `singlePath`.\n *\n * @param directories - The directories to group.\n * @returns Array of RoleGroup entries sorted by role label.\n */\nexport function groupByRole(directories: DirectoryInfo[]): RoleGroup[] {\n const map = new Map<DirectoryRole, { dirs: DirectoryInfo[] }>();\n\n for (const dir of directories) {\n if (dir.role === 'unknown') continue;\n const existing = map.get(dir.role);\n if (existing) {\n existing.dirs.push(dir);\n } else {\n map.set(dir.role, { dirs: [dir] });\n }\n }\n\n const groups: RoleGroup[] = [];\n for (const [role, { dirs }] of map) {\n const label = ROLE_DESCRIPTIONS[role] ?? role;\n const totalFiles = dirs.reduce((sum, d) => sum + d.fileCount, 0);\n groups.push({\n role,\n label,\n dirCount: dirs.length,\n totalFiles,\n singlePath: dirs.length === 1 ? dirs[0].path : undefined,\n });\n }\n\n return groups;\n}\n\n/**\n * Format a summary line from CodebaseStatistics.\n *\n * @param stats - The codebase statistics.\n * @param packageCount - Number of packages (shown for monorepos with > 1).\n * @returns Formatted summary string, e.g. \"3 packages · 743 source files · 48,200 lines · avg 65 lines/file\"\n */\nexport function formatSummary(stats: CodebaseStatistics, packageCount?: number): string {\n const parts: string[] = [];\n if (packageCount && packageCount > 1) {\n parts.push(`${packageCount} packages`);\n }\n parts.push(`${stats.totalFiles.toLocaleString()} source files`);\n parts.push(`${stats.totalLines.toLocaleString()} lines`);\n parts.push(`avg ${Math.round(stats.averageFileLines)} lines/file`);\n return parts.join(' \\u00b7 ');\n}\n\n/**\n * Format top extensions by count, e.g. \".tsx 312 · .ts 289 · .js 142\".\n *\n * @param filesByExtension - Extension counts from CodebaseStatistics.\n * @param maxEntries - Maximum number of extensions to show (default 4).\n * @returns Formatted extension string.\n */\nexport function formatExtensions(\n filesByExtension: Record<string, number>,\n maxEntries: number = 4,\n): string {\n return Object.entries(filesByExtension)\n .sort(([, a], [, b]) => b - a)\n .slice(0, maxEntries)\n .map(([ext, count]) => `${ext} ${count}`)\n .join(' \\u00b7 ');\n}\n\n/**\n * Format a RoleGroup for display.\n *\n * @param group - The role group.\n * @returns Formatted string, e.g. \"Hooks — 4 dirs (55 files)\" or \"Pages / Routes — app (12 files)\"\n */\nexport function formatRoleGroup(group: RoleGroup): string {\n const files = group.totalFiles === 1 ? '1 file' : `${group.totalFiles} files`;\n if (group.singlePath) {\n return `${group.label} — ${group.singlePath} (${files})`;\n }\n const dirs = group.dirCount === 1 ? '1 dir' : `${group.dirCount} dirs`;\n return `${group.label} — ${dirs} (${files})`;\n}\n","import type { PackageScanResult, ScanResult } from '@viberails/types';\nimport { FRAMEWORK_NAMES, STYLING_NAMES } from '@viberails/types';\nimport chalk from 'chalk';\nimport { displayConventions, displaySummarySection, formatItem } from './display.js';\nimport {\n formatExtensions,\n formatRoleGroup,\n formatSummary,\n groupByRole,\n} from './display-helpers.js';\nimport { formatConventionsText } from './display-text.js';\n\n/**\n * Format a package summary line for monorepo display.\n */\nexport function formatPackageSummary(pkg: PackageScanResult): string {\n const parts: string[] = [];\n if (pkg.stack.framework) {\n parts.push(formatItem(pkg.stack.framework, FRAMEWORK_NAMES));\n }\n if (pkg.stack.styling) {\n parts.push(formatItem(pkg.stack.styling, STYLING_NAMES));\n }\n const files = `${pkg.statistics.totalFiles} files`;\n const detail = parts.length > 0 ? `${parts.join(', ')} (${files})` : `(${files})`;\n return ` ${pkg.relativePath} — ${detail}`;\n}\n\n/**\n * Display scan results for a monorepo with per-package summaries.\n */\nexport function displayMonorepoResults(scanResult: ScanResult): void {\n const { stack, packages } = scanResult;\n\n console.log(`\\n${chalk.bold(`Detected: (monorepo, ${packages.length} packages)`)}`);\n\n // Shared stack items at the top\n console.log(` ${chalk.green('✓')} ${formatItem(stack.language)}`);\n if (stack.packageManager) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.packageManager)}`);\n }\n if (stack.linter && stack.formatter && stack.linter.name === stack.formatter.name) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.linter)} (lint + format)`);\n } else {\n if (stack.linter) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.linter)}`);\n }\n if (stack.formatter) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.formatter)}`);\n }\n }\n if (stack.testRunner) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.testRunner)}`);\n }\n\n // Per-package summaries\n console.log('');\n for (const pkg of packages) {\n console.log(formatPackageSummary(pkg));\n }\n\n // Structure grouped by role per package\n const packagesWithDirs = packages.filter((pkg) =>\n pkg.structure.directories.some((d) => d.role !== 'unknown'),\n );\n if (packagesWithDirs.length > 0) {\n console.log(`\\n${chalk.bold('Structure:')}`);\n for (const pkg of packagesWithDirs) {\n const groups = groupByRole(pkg.structure.directories);\n if (groups.length === 0) continue;\n console.log(` ${pkg.relativePath}:`);\n for (const group of groups) {\n console.log(` ${chalk.green('✓')} ${formatRoleGroup(group)}`);\n }\n }\n }\n\n displayConventions(scanResult);\n displaySummarySection(scanResult);\n console.log('');\n}\n\n/**\n * Format a plain-text package summary line (no chalk).\n */\nfunction formatPackageSummaryPlain(pkg: PackageScanResult): string {\n const parts: string[] = [];\n if (pkg.stack.framework) {\n parts.push(formatItem(pkg.stack.framework, FRAMEWORK_NAMES));\n }\n if (pkg.stack.styling) {\n parts.push(formatItem(pkg.stack.styling, STYLING_NAMES));\n }\n const files = `${pkg.statistics.totalFiles} files`;\n const detail = parts.length > 0 ? `${parts.join(', ')} (${files})` : `(${files})`;\n return ` ${pkg.relativePath} — ${detail}`;\n}\n\n/**\n * Build monorepo scan results as a multi-line string for clack.note().\n * Returns plain text without chalk colors.\n */\nexport function formatMonorepoResultsText(scanResult: ScanResult): string {\n const lines: string[] = [];\n const { stack, packages } = scanResult;\n\n lines.push(`Detected: (monorepo, ${packages.length} packages)`);\n\n // Shared stack items as compact line\n const sharedParts: string[] = [formatItem(stack.language)];\n if (stack.packageManager) sharedParts.push(formatItem(stack.packageManager));\n if (stack.linter && stack.formatter && stack.linter.name === stack.formatter.name) {\n sharedParts.push(`${formatItem(stack.linter)} (lint + format)`);\n } else {\n if (stack.linter) sharedParts.push(formatItem(stack.linter));\n if (stack.formatter) sharedParts.push(formatItem(stack.formatter));\n }\n if (stack.testRunner) sharedParts.push(formatItem(stack.testRunner));\n lines.push(` \\u2713 ${sharedParts.join(' \\u00b7 ')}`);\n\n // Per-package summaries\n lines.push('');\n for (const pkg of packages) {\n lines.push(formatPackageSummaryPlain(pkg));\n }\n\n // Structure grouped by role per package\n const packagesWithDirs = packages.filter((pkg) =>\n pkg.structure.directories.some((d) => d.role !== 'unknown'),\n );\n if (packagesWithDirs.length > 0) {\n lines.push('');\n lines.push('Structure:');\n for (const pkg of packagesWithDirs) {\n const groups = groupByRole(pkg.structure.directories);\n if (groups.length === 0) continue;\n lines.push(` ${pkg.relativePath}:`);\n for (const group of groups) {\n lines.push(` \\u2713 ${formatRoleGroup(group)}`);\n }\n }\n }\n\n // Conventions\n lines.push(...formatConventionsText(scanResult));\n\n // Summary stats\n const pkgCount = packages.length > 1 ? packages.length : undefined;\n lines.push('');\n lines.push(formatSummary(scanResult.statistics, pkgCount));\n const ext = formatExtensions(scanResult.statistics.filesByExtension);\n if (ext) {\n lines.push(ext);\n }\n\n return lines.join('\\n');\n}\n","import type { ViberailsConfig } from '@viberails/types';\nimport type { RuleOverrides } from './prompt-rules.js';\n\n/**\n * Apply user-chosen rule overrides to a ViberailsConfig in-place.\n * Shared between `init` (interactive customize flow) and `config` command.\n *\n * @param config - The config to mutate\n * @param overrides - The rule overrides from promptRuleMenu\n */\nexport function applyRuleOverrides(config: ViberailsConfig, overrides: RuleOverrides): void {\n if (overrides.packageOverrides) config.packages = overrides.packageOverrides;\n config.rules.maxFileLines = overrides.maxFileLines;\n config.rules.testCoverage = overrides.testCoverage;\n config.rules.enforceMissingTests = overrides.enforceMissingTests;\n config.rules.enforceNaming = overrides.enforceNaming;\n\n for (const pkg of config.packages) {\n pkg.coverage = pkg.coverage ?? {};\n if (pkg.coverage.summaryPath === undefined) {\n pkg.coverage.summaryPath = overrides.coverageSummaryPath;\n }\n if (pkg.coverage.command === undefined && overrides.coverageCommand) {\n pkg.coverage.command = overrides.coverageCommand;\n }\n }\n\n if (overrides.fileNamingValue) {\n const rootPkg = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const oldNaming = rootPkg.conventions?.fileNaming;\n rootPkg.conventions = rootPkg.conventions ?? {};\n rootPkg.conventions.fileNaming = overrides.fileNamingValue;\n if (oldNaming && oldNaming !== overrides.fileNamingValue) {\n for (const pkg of config.packages) {\n if (pkg.conventions?.fileNaming === oldNaming) {\n pkg.conventions.fileNaming = overrides.fileNamingValue;\n }\n }\n }\n }\n}\n","import type {\n CodebaseStatistics,\n ConfigConventions,\n ConfigStack,\n ConfigStructure,\n PackageConfig,\n ViberailsConfig,\n} from '@viberails/types';\nimport { CONVENTION_LABELS, FRAMEWORK_NAMES, ORM_NAMES, STYLING_NAMES } from '@viberails/types';\n\nexport interface ConfigChange {\n type: 'added' | 'changed' | 'removed';\n description: string;\n}\n\n/**\n * Parse a stack string like \"nextjs@15\" into { name: \"nextjs\", version: \"15\" }.\n */\nfunction parseStackString(s: string): { name: string; version?: string } {\n const atIdx = s.indexOf('@');\n if (atIdx > 0) {\n return { name: s.slice(0, atIdx), version: s.slice(atIdx + 1) };\n }\n return { name: s };\n}\n\n/**\n * Resolve a stack string to a human-readable display name.\n */\nfunction displayStackName(s: string): string {\n const { name, version } = parseStackString(s);\n const allMaps: Record<string, string> = {\n ...FRAMEWORK_NAMES,\n ...STYLING_NAMES,\n ...ORM_NAMES,\n };\n const display = allMaps[name] ?? name;\n return version ? `${display} ${version}` : display;\n}\n\n/**\n * Check if a convention was newly detected during sync (via _meta).\n */\nfunction isNewlyDetected(config: ViberailsConfig, pkgPath: string, key: string): boolean {\n return config._meta?.packages?.[pkgPath]?.conventions?.[key]?.detected === true;\n}\n\n/** Stack fields to compare (excluding language and packageManager which rarely change). */\nconst STACK_FIELDS: (keyof ConfigStack)[] = [\n 'framework',\n 'styling',\n 'backend',\n 'orm',\n 'linter',\n 'formatter',\n 'testRunner',\n];\n\n/** Convention keys to compare. */\nconst CONVENTION_KEYS: (keyof ConfigConventions)[] = [\n 'fileNaming',\n 'componentNaming',\n 'hookNaming',\n 'importAlias',\n];\n\n/** Structure fields to compare. */\nconst STRUCTURE_FIELDS: { key: keyof ConfigStructure; label: string }[] = [\n { key: 'srcDir', label: 'source directory' },\n { key: 'pages', label: 'pages directory' },\n { key: 'components', label: 'components directory' },\n { key: 'hooks', label: 'hooks directory' },\n { key: 'utils', label: 'utilities directory' },\n { key: 'types', label: 'types directory' },\n { key: 'tests', label: 'tests directory' },\n { key: 'testPattern', label: 'test pattern' },\n];\n\n/**\n * Diff a single package between existing and merged configs.\n */\nfunction diffPackage(\n existing: PackageConfig,\n merged: PackageConfig,\n mergedConfig: ViberailsConfig,\n): ConfigChange[] {\n const changes: ConfigChange[] = [];\n const pkgPrefix = existing.path === '.' ? '' : `${existing.path}: `;\n\n // Stack changes\n for (const field of STACK_FIELDS) {\n const oldVal = existing.stack?.[field];\n const newVal = merged.stack?.[field];\n\n if (!oldVal && newVal) {\n changes.push({\n type: 'added',\n description: `${pkgPrefix}Stack: added ${displayStackName(newVal)}`,\n });\n } else if (oldVal && newVal && oldVal !== newVal) {\n changes.push({\n type: 'changed',\n description: `${pkgPrefix}Stack: ${displayStackName(oldVal)} → ${displayStackName(newVal)}`,\n });\n }\n }\n\n // Convention changes\n for (const key of CONVENTION_KEYS) {\n const oldVal = existing.conventions?.[key];\n const newVal = merged.conventions?.[key];\n const label = CONVENTION_LABELS[key] ?? key;\n\n if (!oldVal && newVal) {\n changes.push({\n type: 'added',\n description: `${pkgPrefix}New convention: ${label} (${newVal})`,\n });\n } else if (oldVal && newVal && oldVal !== newVal) {\n const suffix = isNewlyDetected(mergedConfig, merged.path, key) ? ' (newly detected)' : '';\n changes.push({\n type: 'changed',\n description: `${pkgPrefix}Convention updated: ${label} (${newVal})${suffix}`,\n });\n }\n }\n\n // Structure changes\n for (const { key, label } of STRUCTURE_FIELDS) {\n const oldVal = existing.structure?.[key];\n const newVal = merged.structure?.[key];\n\n if (!oldVal && newVal) {\n changes.push({\n type: 'added',\n description: `${pkgPrefix}Structure: detected ${label} (${newVal})`,\n });\n }\n }\n\n return changes;\n}\n\n/**\n * Compare two ViberailsConfig objects and return a list of human-readable changes.\n *\n * @param existing - The config before sync\n * @param merged - The config after merging with fresh scan results\n * @returns Array of changes, empty if configs are identical\n */\nexport function diffConfigs(existing: ViberailsConfig, merged: ViberailsConfig): ConfigChange[] {\n const changes: ConfigChange[] = [];\n\n // Build lookup maps by path\n const existingByPath = new Map(existing.packages.map((p) => [p.path, p]));\n const mergedByPath = new Map(merged.packages.map((p) => [p.path, p]));\n\n // Diff existing packages against merged\n for (const existingPkg of existing.packages) {\n const mergedPkg = mergedByPath.get(existingPkg.path);\n if (mergedPkg) {\n changes.push(...diffPackage(existingPkg, mergedPkg, merged));\n }\n }\n\n // New packages\n for (const mergedPkg of merged.packages) {\n if (!existingByPath.has(mergedPkg.path)) {\n changes.push({ type: 'added', description: `New package: ${mergedPkg.path}` });\n }\n }\n\n return changes;\n}\n\n/**\n * Format a stats delta as a human-readable string.\n */\nexport function formatStatsDelta(\n oldStats: CodebaseStatistics,\n newStats: CodebaseStatistics,\n): string | undefined {\n const fileDelta = newStats.totalFiles - oldStats.totalFiles;\n const lineDelta = newStats.totalLines - oldStats.totalLines;\n\n if (fileDelta === 0 && lineDelta === 0) return undefined;\n\n const parts: string[] = [];\n\n if (fileDelta !== 0) {\n const sign = fileDelta > 0 ? '+' : '';\n parts.push(`${sign}${fileDelta.toLocaleString()} files`);\n }\n\n if (lineDelta !== 0) {\n const sign = lineDelta > 0 ? '+' : '';\n parts.push(`${sign}${lineDelta.toLocaleString()} lines`);\n }\n\n return `${parts.join(', ')} since last sync`;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { generateContext } from '@viberails/context';\nimport type { ScanResult, ViberailsConfig } from '@viberails/types';\n\nconst CONTEXT_DIR = '.viberails';\nconst CONTEXT_FILE = 'context.md';\nconst SCAN_RESULT_FILE = 'scan-result.json';\n\n/**\n * Write all generated files: context.md and scan-result.json.\n *\n * @param projectRoot - Absolute path to the project root\n * @param config - The viberails configuration\n * @param scanResult - The raw scan result\n */\nexport function writeGeneratedFiles(\n projectRoot: string,\n config: ViberailsConfig,\n scanResult: ScanResult,\n): void {\n const contextDir = path.join(projectRoot, CONTEXT_DIR);\n\n try {\n if (!fs.existsSync(contextDir)) {\n fs.mkdirSync(contextDir, { recursive: true });\n }\n\n const context = generateContext(config);\n fs.writeFileSync(path.join(contextDir, CONTEXT_FILE), context);\n\n fs.writeFileSync(\n path.join(contextDir, SCAN_RESULT_FILE),\n `${JSON.stringify(scanResult, null, 2)}\\n`,\n );\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to write generated files to ${contextDir}: ${message}`);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { loadConfig } from '@viberails/config';\nimport chalk from 'chalk';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { confirmDangerous } from '../utils/prompt.js';\nimport { resolveConfigForFile } from './check-config.js';\nimport { checkNaming, getAllSourceFiles } from './check-files.js';\nimport { checkMissingTests } from './check-tests.js';\nimport { checkGitDirty, getConventionValue, printPlan } from './fix-helpers.js';\nimport { updateImportsAfterRenames } from './fix-imports.js';\nimport {\n computeRename,\n deduplicateRenames,\n executeRename,\n type RenameRecord,\n} from './fix-naming.js';\nimport { generateTestStub, type TestStubRecord, writeTestStub } from './fix-tests.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\nexport interface FixOptions {\n dryRun?: boolean;\n rule?: string[];\n yes?: boolean;\n}\n\n/**\n * Run the viberails fix command.\n * Detects violations, computes fixes, optionally confirms, then applies.\n */\nexport async function fixCommand(options: FixOptions, cwd?: string): Promise<number> {\n const startDir = cwd ?? process.cwd();\n const projectRoot = findProjectRoot(startDir);\n\n if (!projectRoot) {\n console.error(`${chalk.red('Error:')} No package.json found. Are you in a JS/TS project?`);\n return 1;\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (!fs.existsSync(configPath)) {\n console.error(\n `${chalk.red('Error:')} No viberails.config.json found. Run \\`viberails init\\` first.`,\n );\n return 1;\n }\n\n const config = await loadConfig(configPath);\n\n // Git dirty check — warn but don't block\n if (!options.dryRun) {\n const isDirty = checkGitDirty(projectRoot);\n if (isDirty) {\n console.log(\n chalk.yellow('Warning: You have uncommitted changes. Consider committing first.'),\n );\n }\n }\n\n const shouldFixNaming = !options.rule || options.rule.includes('file-naming');\n const shouldFixTests = !options.rule || options.rule.includes('missing-test');\n\n // Collect source files\n const allFiles = getAllSourceFiles(projectRoot, config);\n\n // Compute naming renames\n const renames: RenameRecord[] = [];\n if (shouldFixNaming) {\n for (const file of allFiles) {\n const resolved = resolveConfigForFile(file, config);\n if (!resolved.rules.enforceNaming || !resolved.conventions.fileNaming) continue;\n\n const violation = checkNaming(file, resolved.conventions);\n if (!violation) continue;\n\n const convention = getConventionValue(resolved.conventions.fileNaming);\n if (!convention) continue;\n\n const rename = computeRename(file, convention, projectRoot);\n if (rename) renames.push(rename);\n }\n }\n\n const dedupedRenames = deduplicateRenames(renames);\n\n // Compute test stubs\n const testStubs: TestStubRecord[] = [];\n if (shouldFixTests) {\n const testViolations = checkMissingTests(projectRoot, config, 'warn');\n for (const v of testViolations) {\n const stub = generateTestStub(v.file, config, projectRoot);\n if (stub) testStubs.push(stub);\n }\n }\n\n // Nothing to fix\n if (dedupedRenames.length === 0 && testStubs.length === 0) {\n console.log(`${chalk.green('✓')} No fixable violations found.`);\n return 0;\n }\n\n // Display plan\n printPlan(dedupedRenames, testStubs);\n\n if (options.dryRun) {\n console.log(chalk.dim('\\nDry run — no changes applied.'));\n return 0;\n }\n\n // Confirm\n if (!options.yes) {\n const confirmed = await confirmDangerous('Apply these fixes?');\n if (!confirmed) {\n console.log('Aborted.');\n return 0;\n }\n }\n\n // Apply: 1. Renames\n let renameCount = 0;\n for (const rename of dedupedRenames) {\n if (executeRename(rename)) {\n renameCount++;\n }\n }\n\n // Apply: 2. Import updates\n let importUpdateCount = 0;\n if (renameCount > 0) {\n const appliedRenames = dedupedRenames.filter((r) => fs.existsSync(r.newAbsPath));\n const updates = await updateImportsAfterRenames(appliedRenames, projectRoot);\n importUpdateCount = updates.length;\n }\n\n // Apply: 3. Test stubs\n let stubCount = 0;\n for (const stub of testStubs) {\n if (!fs.existsSync(stub.absPath)) {\n writeTestStub(stub, config);\n stubCount++;\n }\n }\n\n // Summary\n console.log('');\n if (renameCount > 0) {\n console.log(`${chalk.green('✓')} Renamed ${renameCount} file${renameCount > 1 ? 's' : ''}`);\n }\n if (importUpdateCount > 0) {\n console.log(\n `${chalk.green('✓')} Updated ${importUpdateCount} import${importUpdateCount > 1 ? 's' : ''}`,\n );\n }\n if (stubCount > 0) {\n console.log(`${chalk.green('✓')} Generated ${stubCount} test stub${stubCount > 1 ? 's' : ''}`);\n }\n\n return 0;\n}\n","import { execSync } from 'node:child_process';\nimport chalk from 'chalk';\nimport type { RenameRecord } from './fix-naming.js';\nimport type { TestStubRecord } from './fix-tests.js';\n\n/**\n * Display the planned renames and test stubs.\n */\nexport function printPlan(renames: RenameRecord[], stubs: TestStubRecord[]): void {\n if (renames.length > 0) {\n console.log(chalk.bold('\\nFile renames:'));\n for (const r of renames) {\n console.log(` ${chalk.red(r.oldPath)} → ${chalk.green(r.newPath)}`);\n }\n }\n\n if (stubs.length > 0) {\n console.log(chalk.bold('\\nTest stubs to create:'));\n for (const s of stubs) {\n console.log(` ${chalk.green('+')} ${s.path}`);\n }\n }\n}\n\n/**\n * Check if the git working tree has uncommitted changes.\n */\nexport function checkGitDirty(projectRoot: string): boolean {\n try {\n const output = execSync('git status --porcelain', {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return output.trim().length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Extract the string value from a convention.\n * Conventions are always plain strings.\n */\nexport function getConventionValue(convention: unknown): string | undefined {\n if (typeof convention === 'string') return convention;\n return undefined;\n}\n","import * as path from 'node:path';\nimport type { RenameRecord } from './fix-naming.js';\n\nexport interface ImportUpdateRecord {\n file: string;\n oldSpecifier: string;\n newSpecifier: string;\n line: number;\n}\n\n/**\n * Strip known JS/TS extensions from a file path for specifier comparison.\n * E.g. \"/foo/bar.ts\" → \"/foo/bar\", \"/foo/bar.js\" → \"/foo/bar\"\n */\nfunction stripExtension(filePath: string): string {\n return filePath.replace(/\\.(tsx?|jsx?|mjs|cjs)$/, '');\n}\n\n/**\n * Compute the new import specifier given the old specifier and the rename.\n * Preserves `.js` suffix if present.\n */\nfunction computeNewSpecifier(oldSpecifier: string, newBare: string): string {\n const hasJsExt = oldSpecifier.endsWith('.js');\n const base = hasJsExt ? oldSpecifier.slice(0, -3) : oldSpecifier;\n\n // Replace the last path segment\n const dir = base.lastIndexOf('/');\n const prefix = dir >= 0 ? base.slice(0, dir + 1) : '';\n const newSpec = prefix + newBare;\n\n return hasJsExt ? `${newSpec}.js` : newSpec;\n}\n\n/**\n * Update import specifiers in all source files after renames.\n * Uses ts-morph for AST-accurate rewriting.\n *\n * @param renames - The renames that were applied\n * @param projectRoot - Absolute path to project root\n * @returns Records of all import updates made\n */\nexport async function updateImportsAfterRenames(\n renames: RenameRecord[],\n projectRoot: string,\n): Promise<ImportUpdateRecord[]> {\n if (renames.length === 0) return [];\n\n // Lazy import ts-morph to avoid startup cost\n const { Project, SyntaxKind } = await import('ts-morph');\n\n // Build rename map: stripped old abs path → { newBare }\n const renameMap = new Map<string, { newBare: string }>();\n for (const r of renames) {\n const oldStripped = stripExtension(r.oldAbsPath);\n const newFilename = path.basename(r.newPath);\n const newName = newFilename.slice(0, newFilename.indexOf('.'));\n renameMap.set(oldStripped, { newBare: newName });\n }\n\n const project = new Project({\n tsConfigFilePath: undefined,\n skipAddingFilesFromTsConfig: true,\n });\n\n // Add all TS/JS source files\n project.addSourceFilesAtPaths(path.join(projectRoot, '**/*.{ts,tsx,js,jsx,mjs,cjs}'));\n\n const updates: ImportUpdateRecord[] = [];\n const extensions = ['', '.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js'];\n\n for (const sourceFile of project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n // Skip node_modules and dist (check path segments to avoid false matches)\n const segments = filePath.split(path.sep);\n if (segments.includes('node_modules') || segments.includes('dist')) continue;\n\n const fileDir = path.dirname(filePath);\n\n // Process static imports\n for (const decl of sourceFile.getImportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n if (!specifier.startsWith('.')) continue;\n\n const match = resolveToRenamedFile(specifier, fileDir, renameMap, extensions);\n if (!match) continue;\n\n const newSpec = computeNewSpecifier(specifier, match.newBare);\n updates.push({\n file: filePath,\n oldSpecifier: specifier,\n newSpecifier: newSpec,\n line: decl.getStartLineNumber(),\n });\n decl.setModuleSpecifier(newSpec);\n }\n\n // Process re-exports\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n if (!specifier || !specifier.startsWith('.')) continue;\n\n const match = resolveToRenamedFile(specifier, fileDir, renameMap, extensions);\n if (!match) continue;\n\n const newSpec = computeNewSpecifier(specifier, match.newBare);\n updates.push({\n file: filePath,\n oldSpecifier: specifier,\n newSpecifier: newSpec,\n line: decl.getStartLineNumber(),\n });\n decl.setModuleSpecifier(newSpec);\n }\n\n // Process dynamic imports\n for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n if (call.getExpression().getKind() !== SyntaxKind.ImportKeyword) continue;\n\n const args = call.getArguments();\n if (args.length === 0) continue;\n\n const arg = args[0];\n if (arg.getKind() !== SyntaxKind.StringLiteral) continue;\n\n const specifier = arg.getText().slice(1, -1);\n if (!specifier.startsWith('.')) continue;\n\n const match = resolveToRenamedFile(specifier, fileDir, renameMap, extensions);\n if (!match) continue;\n\n const newSpec = computeNewSpecifier(specifier, match.newBare);\n updates.push({\n file: filePath,\n oldSpecifier: specifier,\n newSpecifier: newSpec,\n line: call.getStartLineNumber(),\n });\n // Replace the string literal content\n const quote = arg.getText()[0];\n arg.replaceWithText(`${quote}${newSpec}${quote}`);\n }\n }\n\n if (updates.length > 0) {\n await project.save();\n }\n\n return updates;\n}\n\n/**\n * Try to resolve a relative specifier to a renamed file.\n * Returns the rename info if matched, undefined otherwise.\n */\nfunction resolveToRenamedFile(\n specifier: string,\n fromDir: string,\n renameMap: Map<string, { newBare: string }>,\n extensions: string[],\n): { newBare: string } | undefined {\n // Strip .js extension for resolution (TypeScript convention)\n const cleanSpec = specifier.endsWith('.js') ? specifier.slice(0, -3) : specifier;\n const resolved = path.resolve(fromDir, cleanSpec);\n\n for (const ext of extensions) {\n const candidate = resolved + ext;\n const stripped = stripExtension(candidate);\n const match = renameMap.get(stripped);\n if (match) return match;\n }\n\n return undefined;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { convertName } from './convert-name.js';\n\nexport interface RenameRecord {\n oldPath: string;\n newPath: string;\n oldAbsPath: string;\n newAbsPath: string;\n}\n\n/**\n * Compute the rename for a file that violates the naming convention.\n * Returns null if no rename is needed or the target already exists.\n */\nexport function computeRename(\n relPath: string,\n targetConvention: string,\n projectRoot: string,\n): RenameRecord | null {\n const filename = path.basename(relPath);\n const dir = path.dirname(relPath);\n\n // Extract bare name (before first dot) — matches checkNaming logic\n const dotIndex = filename.indexOf('.');\n if (dotIndex === -1) return null;\n\n const bare = filename.slice(0, dotIndex);\n const suffix = filename.slice(dotIndex); // e.g. \".tsx\" or \".test.ts\"\n\n const newBare = convertName(bare, targetConvention);\n if (newBare === bare) return null;\n\n const newFilename = newBare + suffix;\n const newRelPath = path.join(dir, newFilename);\n const oldAbsPath = path.join(projectRoot, relPath);\n const newAbsPath = path.join(projectRoot, newRelPath);\n\n // Skip if target already exists\n if (fs.existsSync(newAbsPath)) return null;\n\n return { oldPath: relPath, newPath: newRelPath, oldAbsPath, newAbsPath };\n}\n\n/**\n * Execute a single rename on disk.\n * Returns true if successful, false if skipped (target exists).\n */\nexport function executeRename(rename: RenameRecord): boolean {\n if (fs.existsSync(rename.newAbsPath)) return false;\n fs.renameSync(rename.oldAbsPath, rename.newAbsPath);\n return true;\n}\n\n/**\n * Detect and deduplicate rename collisions.\n * If two planned renames target the same path, the second is removed.\n */\nexport function deduplicateRenames(renames: RenameRecord[]): RenameRecord[] {\n const seen = new Set<string>();\n const result: RenameRecord[] = [];\n for (const r of renames) {\n if (seen.has(r.newAbsPath)) continue;\n seen.add(r.newAbsPath);\n result.push(r);\n }\n return result;\n}\n","/**\n * Split a bare filename into its constituent words.\n *\n * Handles kebab-case, camelCase, PascalCase, and snake_case inputs.\n * Consecutive uppercase letters (acronyms like \"URL\") are kept together.\n */\nexport function splitIntoWords(name: string): string[] {\n // First, split on explicit separators (hyphens and underscores)\n const parts = name.split(/[-_]/);\n\n const words: string[] = [];\n for (const part of parts) {\n if (part === '') continue;\n\n // Split camelCase and PascalCase boundaries\n // \"UserProfile\" → [\"User\", \"Profile\"]\n // \"parseJSON\" → [\"parse\", \"JSON\"]\n // \"XMLParser\" → [\"XML\", \"Parser\"]\n let current = '';\n for (let i = 0; i < part.length; i++) {\n const ch = part[i];\n const isUpper = ch >= 'A' && ch <= 'Z';\n\n if (isUpper && current.length > 0) {\n const prevIsUpper =\n current[current.length - 1] >= 'A' && current[current.length - 1] <= 'Z';\n const nextIsLower = i + 1 < part.length && part[i + 1] >= 'a' && part[i + 1] <= 'z';\n\n if (!prevIsUpper || nextIsLower) {\n words.push(current.toLowerCase());\n current = '';\n }\n }\n current += ch;\n }\n if (current) words.push(current.toLowerCase());\n }\n\n return words;\n}\n\n/**\n * Convert a bare filename to the specified naming convention.\n *\n * @param bare - The bare filename without extension (e.g. \"UserProfile\")\n * @param target - The target convention (kebab-case, camelCase, PascalCase, snake_case)\n * @returns The converted name\n */\nexport function convertName(bare: string, target: string): string {\n const words = splitIntoWords(bare);\n if (words.length === 0) return bare;\n\n switch (target) {\n case 'kebab-case':\n return words.join('-');\n case 'camelCase':\n return words[0] + words.slice(1).map(capitalize).join('');\n case 'PascalCase':\n return words.map(capitalize).join('');\n case 'snake_case':\n return words.join('_');\n default:\n return bare;\n }\n}\n\nfunction capitalize(word: string): string {\n if (word.length === 0) return word;\n return word[0].toUpperCase() + word.slice(1);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { ViberailsConfig } from '@viberails/types';\nimport { resolvePackageForFile } from './check-tests.js';\n\nexport interface TestStubRecord {\n path: string;\n absPath: string;\n moduleName: string;\n}\n\n/**\n * Generate a test stub record for a source file that is missing tests.\n * Returns null if the test file already exists.\n */\nexport function generateTestStub(\n sourceRelPath: string,\n config: ViberailsConfig,\n projectRoot: string,\n): TestStubRecord | null {\n const pkg = resolvePackageForFile(sourceRelPath, config);\n const testPattern = pkg?.structure?.testPattern;\n if (!testPattern) return null;\n\n const basename = path.basename(sourceRelPath);\n const ext = path.extname(basename);\n if (!ext) return null;\n const stem = basename.slice(0, -ext.length);\n const testSuffix = testPattern.replace('*', '');\n const testFilename = `${stem}${testSuffix}`;\n\n const dir = path.dirname(path.join(projectRoot, sourceRelPath));\n const testAbsPath = path.join(dir, testFilename);\n\n if (fs.existsSync(testAbsPath)) return null;\n\n return {\n path: path.relative(projectRoot, testAbsPath),\n absPath: testAbsPath,\n moduleName: stem,\n };\n}\n\n/**\n * Write a test stub file to disk.\n */\nexport function writeTestStub(stub: TestStubRecord, config: ViberailsConfig): void {\n const pkg = resolvePackageForFile(stub.path, config);\n const testRunner = pkg?.stack?.testRunner ?? '';\n const runner = testRunner.startsWith('jest') ? 'jest' : 'vitest';\n const importLine =\n runner === 'jest'\n ? '' // jest globals are available without import\n : \"import { describe, it, expect } from 'vitest';\\n\\n\";\n\n const content = `${importLine}describe('${stub.moduleName}', () => {\\n it.todo('add tests');\\n});\\n`;\n\n fs.mkdirSync(path.dirname(stub.absPath), { recursive: true });\n fs.writeFileSync(stub.absPath, content);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport { compactConfig, generateConfig } from '@viberails/config';\nimport { scan } from '@viberails/scanner';\nimport chalk from 'chalk';\nimport { displayInitSummary, displayRulesPreview, displayScanResults } from '../display.js';\nimport { formatScanResultsText } from '../display-text.js';\nimport { applyRuleOverrides } from '../utils/apply-rule-overrides.js';\nimport {\n checkCoveragePrereqs,\n displayMissingPrereqs,\n promptMissingPrereqs,\n} from '../utils/check-prerequisites.js';\nimport { filterHighConfidence } from '../utils/filter-confidence.js';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport {\n confirm,\n confirmDangerous,\n promptInitDecision,\n promptIntegrations,\n promptRuleMenu,\n} from '../utils/prompt.js';\nimport { resolveWorkspacePackages } from '../utils/resolve-workspace-packages.js';\nimport { updateGitignore } from '../utils/update-gitignore.js';\nimport { writeGeneratedFiles } from '../utils/write-generated-files.js';\nimport {\n detectHookManager,\n setupClaudeCodeHook,\n setupClaudeMdReference,\n setupGithubAction,\n setupPreCommitHook,\n} from './init-hooks.js';\nimport {\n setupLintHook,\n setupSelectedIntegrations,\n setupTypecheckHook,\n} from './init-hooks-extra.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\nfunction getExemptedPackages(config: import('@viberails/types').ViberailsConfig): string[] {\n return config.packages\n .filter((pkg) => pkg.rules?.testCoverage === 0 && pkg.path !== '.')\n .map((pkg) => pkg.path);\n}\n\n/** Run the viberails init flow. */\nexport async function initCommand(\n options: { yes?: boolean; force?: boolean },\n cwd?: string,\n): Promise<void> {\n const projectRoot = findProjectRoot(cwd ?? process.cwd());\n if (!projectRoot) {\n throw new Error(\n 'No package.json found. Make sure you are inside a JS/TS project, then run:\\n npx viberails',\n );\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (fs.existsSync(configPath) && !options.force) {\n console.log(\n `${chalk.yellow('!')} viberails is already initialized.\\n` +\n ` Run ${chalk.cyan('viberails config')} to edit rules, ${chalk.cyan('viberails sync')} to update, or ${chalk.cyan('viberails init --force')} to start fresh.`,\n );\n return;\n }\n if (options.yes) return initNonInteractive(projectRoot, configPath);\n await initInteractive(projectRoot, configPath, options);\n}\n\nasync function initNonInteractive(projectRoot: string, configPath: string): Promise<void> {\n console.log(chalk.dim('Scanning project...'));\n const scanResult = await scan(projectRoot);\n const config = generateConfig(scanResult);\n\n for (const pkg of config.packages) {\n const pkgMeta = config._meta?.packages?.[pkg.path]?.conventions;\n pkg.conventions = filterHighConfidence(pkg.conventions ?? {}, pkgMeta);\n }\n\n displayMissingPrereqs(checkCoveragePrereqs(projectRoot, scanResult));\n\n displayScanResults(scanResult);\n displayRulesPreview(config);\n\n const exempted = getExemptedPackages(config);\n if (exempted.length > 0) {\n console.log(\n ` ${chalk.dim('Auto-exempted from coverage:')} ${exempted.join(', ')} ${chalk.dim('(types-only)')}`,\n );\n }\n\n if (config.packages.length > 1) {\n console.log(chalk.dim('Building import graph...'));\n const { buildImportGraph, inferBoundaries } = await import('@viberails/graph');\n const packages = resolveWorkspacePackages(projectRoot, config.packages);\n const graph = await buildImportGraph(projectRoot, { packages, ignore: config.ignore });\n const inferred = inferBoundaries(graph);\n const denyCount = Object.values(inferred.deny).reduce((sum, arr) => sum + arr.length, 0);\n if (denyCount > 0) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n console.log(` Inferred ${denyCount} boundary rules`);\n }\n }\n\n const compacted = compactConfig(config);\n fs.writeFileSync(configPath, `${JSON.stringify(compacted, null, 2)}\\n`);\n writeGeneratedFiles(projectRoot, config, scanResult);\n updateGitignore(projectRoot);\n\n setupClaudeCodeHook(projectRoot);\n setupClaudeMdReference(projectRoot);\n const rootPkg = config.packages[0];\n const rootPkgPm = rootPkg?.stack?.packageManager ?? 'npm';\n const actionTarget = setupGithubAction(projectRoot, rootPkgPm);\n\n // Skip bare .git/hooks in --yes mode — they're local-only and won't be shared.\n const hookManager = detectHookManager(projectRoot);\n const hasHookManager = hookManager === 'Lefthook' || hookManager === 'Husky';\n const preCommitTarget = hasHookManager ? setupPreCommitHook(projectRoot) : undefined;\n const linter = rootPkg?.stack?.linter?.split('@')[0];\n\n const ok = chalk.green('\\u2713');\n const created = [\n `${ok} ${path.basename(configPath)}`,\n `${ok} .viberails/context.md`,\n `${ok} .viberails/scan-result.json`,\n `${ok} .claude/settings.json \\u2014 added viberails hook`,\n `${ok} CLAUDE.md \\u2014 added @.viberails/context.md reference`,\n preCommitTarget\n ? `${ok} ${preCommitTarget}`\n : `${chalk.yellow('!')} pre-commit hook skipped (install lefthook or husky)`,\n actionTarget ? `${ok} ${actionTarget} \\u2014 blocks PRs on violations` : '',\n ].filter(Boolean);\n\n if (hasHookManager && rootPkg?.stack?.language === 'typescript') setupTypecheckHook(projectRoot);\n if (hasHookManager && linter) setupLintHook(projectRoot, linter);\n console.log(`\\nCreated:\\n${created.map((f) => ` ${f}`).join('\\n')}`);\n}\n\nasync function initInteractive(\n projectRoot: string,\n configPath: string,\n options: { force?: boolean },\n): Promise<void> {\n clack.intro('viberails');\n\n if (fs.existsSync(configPath) && options.force) {\n const replace = await confirmDangerous(\n `${path.basename(configPath)} already exists and will be replaced. Continue?`,\n );\n if (!replace) {\n clack.outro('Aborted. No files were written.');\n return;\n }\n }\n\n const s = clack.spinner();\n s.start('Scanning project...');\n const scanResult = await scan(projectRoot);\n const config = generateConfig(scanResult);\n s.stop('Scan complete');\n\n const prereqResult = await promptMissingPrereqs(\n projectRoot,\n checkCoveragePrereqs(projectRoot, scanResult),\n );\n if (prereqResult.disableCoverage) {\n config.rules.testCoverage = 0;\n }\n\n if (scanResult.statistics.totalFiles === 0) {\n clack.log.warn(\n 'No source files detected. Try running from the project root,\\n' +\n 'or check that source files exist. Run viberails sync after adding files.',\n );\n }\n\n clack.note(formatScanResultsText(scanResult), 'Scan results');\n\n const exemptedPkgs = getExemptedPackages(config);\n displayInitSummary(config, exemptedPkgs);\n\n const decision = await promptInitDecision();\n\n if (decision === 'customize') {\n const rootPkg = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const overrides = await promptRuleMenu({\n maxFileLines: config.rules.maxFileLines,\n testCoverage: config.rules.testCoverage,\n enforceMissingTests: config.rules.enforceMissingTests,\n enforceNaming: config.rules.enforceNaming,\n fileNamingValue: rootPkg.conventions?.fileNaming,\n coverageSummaryPath: 'coverage/coverage-summary.json',\n coverageCommand: config.defaults?.coverage?.command,\n packageOverrides: config.packages,\n });\n\n applyRuleOverrides(config, overrides);\n }\n\n if (config.packages.length > 1) {\n clack.note(\n 'Boundary rules prevent packages from importing where they\\n' +\n \"shouldn't. viberails scans your existing imports and creates\\n\" +\n \"rules based on what's already working.\",\n 'Boundaries',\n );\n const shouldInfer = await confirm('Infer boundary rules from import patterns?');\n\n if (shouldInfer) {\n const bs = clack.spinner();\n bs.start('Building import graph...');\n const { buildImportGraph, inferBoundaries } = await import('@viberails/graph');\n const packages = resolveWorkspacePackages(projectRoot, config.packages);\n const graph = await buildImportGraph(projectRoot, { packages, ignore: config.ignore });\n const inferred = inferBoundaries(graph);\n const denyCount = Object.values(inferred.deny).reduce((sum, arr) => sum + arr.length, 0);\n if (denyCount > 0) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n bs.stop(`Inferred ${denyCount} boundary rules`);\n const boundaryLines = Object.entries(inferred.deny)\n .map(([pkg, denied]) => `${pkg} must NOT import from: ${denied.join(', ')}`)\n .join('\\n');\n clack.note(boundaryLines, 'Boundary rules');\n } else {\n bs.stop('No boundary rules inferred');\n }\n }\n }\n\n const hookManager = detectHookManager(projectRoot);\n const rootPkgStack = (config.packages.find((p) => p.path === '.') ?? config.packages[0])?.stack;\n const integrations = await promptIntegrations(projectRoot, hookManager, {\n isTypeScript: rootPkgStack?.language === 'typescript',\n linter: rootPkgStack?.linter?.split('@')[0],\n packageManager: rootPkgStack?.packageManager,\n });\n\n const shouldWrite = await confirm('Write configuration and set up selected integrations?');\n if (!shouldWrite) {\n clack.outro('Aborted. No files were written.');\n return;\n }\n\n const compacted = compactConfig(config);\n fs.writeFileSync(configPath, `${JSON.stringify(compacted, null, 2)}\\n`);\n writeGeneratedFiles(projectRoot, config, scanResult);\n updateGitignore(projectRoot);\n\n const createdFiles: string[] = [\n path.basename(configPath),\n '.viberails/context.md',\n '.viberails/scan-result.json',\n ...setupSelectedIntegrations(projectRoot, integrations, {\n linter: rootPkgStack?.linter?.split('@')[0],\n packageManager: rootPkgStack?.packageManager,\n }),\n ];\n\n clack.log.success(`Created:\\n${createdFiles.map((f) => ` ${f}`).join('\\n')}`);\n clack.outro(\n `Done! Next: review viberails.config.json, then run viberails check\\n` +\n ` ${chalk.dim('Tip: use')} ${chalk.cyan('viberails check --enforce')} ${chalk.dim('in CI to block PRs on violations.')}`,\n );\n}\n","import { spawnSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport type { ScanResult } from '@viberails/types';\nimport chalk from 'chalk';\nimport { assertNotCancelled } from './prompt.js';\n\nexport interface PrereqResult {\n label: string;\n installed: boolean;\n installCommand?: string;\n reason: string;\n}\n\n/**\n * Detect coverage prerequisites based on the scan result.\n * Checks whether the required coverage provider package is installed.\n */\nexport function checkCoveragePrereqs(projectRoot: string, scanResult: ScanResult): PrereqResult[] {\n const testRunner = scanResult.stack.testRunner;\n if (!testRunner) return [];\n\n const runner = testRunner.name;\n const pm = scanResult.stack.packageManager.name;\n\n if (runner === 'vitest') {\n const hasV8 = hasDependency(projectRoot, '@vitest/coverage-v8');\n const hasIstanbul = hasDependency(projectRoot, '@vitest/coverage-istanbul');\n const installed = hasV8 || hasIstanbul;\n const addCmd = pm === 'yarn' ? 'yarn add -D' : pm === 'npm' ? 'npm install -D' : `${pm} add -D`;\n return [\n {\n label: '@vitest/coverage-v8',\n installed,\n installCommand: installed ? undefined : `${addCmd} @vitest/coverage-v8`,\n reason: 'Required for coverage percentage checks with vitest',\n },\n ];\n }\n\n // Jest has built-in coverage support — no extra dependency needed\n return [];\n}\n\n/**\n * Display missing prereqs in non-interactive (--yes) mode.\n */\nexport function displayMissingPrereqs(prereqs: PrereqResult[]): void {\n const missing = prereqs.filter((p) => !p.installed);\n for (const m of missing) {\n console.log(` ${chalk.yellow('!')} ${m.label} not installed \\u2014 ${m.reason}`);\n if (m.installCommand) {\n console.log(` Install: ${chalk.cyan(m.installCommand)}`);\n }\n }\n}\n\nexport interface PrereqPromptResult {\n /** Whether the user chose to disable coverage percentage checks. */\n disableCoverage: boolean;\n}\n\n/**\n * Prompt the user to handle missing prereqs in interactive mode.\n * Offers three choices: install now, disable coverage, or skip (keep enabled but warn later).\n */\nexport async function promptMissingPrereqs(\n projectRoot: string,\n prereqs: PrereqResult[],\n): Promise<PrereqPromptResult> {\n const missing = prereqs.filter((p) => !p.installed);\n if (missing.length === 0) return { disableCoverage: false };\n\n const prereqLines = prereqs\n .map(\n (p) =>\n `${p.installed ? '\\u2713' : '\\u2717'} ${p.label}${p.installed ? '' : ` \\u2014 ${p.reason}`}`,\n )\n .join('\\n');\n clack.note(prereqLines, 'Coverage prerequisites');\n\n let disableCoverage = false;\n\n for (const m of missing) {\n if (!m.installCommand) continue;\n\n const choice = await clack.select({\n message: `${m.label} is not installed. It is required for coverage percentage checks.`,\n options: [\n {\n value: 'install' as const,\n label: `Yes, install now`,\n hint: m.installCommand,\n },\n {\n value: 'disable' as const,\n label: 'No, disable coverage percentage checks',\n hint: 'missing-test checks still active',\n },\n {\n value: 'skip' as const,\n label: 'Skip for now',\n hint: `install later: ${m.installCommand}`,\n },\n ],\n });\n assertNotCancelled(choice);\n\n if (choice === 'install') {\n const is = clack.spinner();\n is.start(`Installing ${m.label}...`);\n const result = spawnSync(m.installCommand, {\n cwd: projectRoot,\n shell: true,\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n if (result.status === 0) {\n is.stop(`Installed ${m.label}`);\n } else {\n is.stop(`Failed to install ${m.label}`);\n clack.log.warn(\n `Install manually: ${m.installCommand}\\n` +\n 'Coverage percentage checks will not work until the dependency is installed.',\n );\n }\n } else if (choice === 'disable') {\n disableCoverage = true;\n clack.log.info('Coverage percentage checks disabled. Missing-test checks remain active.');\n } else {\n clack.log.info(\n `Coverage percentage checks will fail until ${m.label} is installed.\\n` +\n `Install later: ${m.installCommand}`,\n );\n }\n }\n\n return { disableCoverage };\n}\n\nfunction hasDependency(projectRoot: string, name: string): boolean {\n try {\n const pkgPath = path.join(projectRoot, 'package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n return !!(pkg.devDependencies?.[name] || pkg.dependencies?.[name]);\n } catch {\n return false;\n }\n}\n","import type { ConfigConventions } from '@viberails/types';\n\n/**\n * Filter conventions to only include high-confidence entries (using _meta).\n * Used in --yes mode to avoid enforcing uncertain detections.\n */\nexport function filterHighConfidence(\n conventions: ConfigConventions,\n meta?: Record<string, { confidence: string }>,\n): ConfigConventions {\n if (!meta) return conventions;\n const filtered: ConfigConventions = {};\n for (const [key, value] of Object.entries(conventions)) {\n if (value === undefined) continue;\n const convMeta = meta[key];\n if (!convMeta || convMeta.confidence === 'high') {\n filtered[key as keyof ConfigConventions] = value;\n }\n }\n return filtered;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Append viberails entries to .gitignore if not already present.\n * Only scan-result.json is ignored — context.md should be committed\n * so AI agents can read the enforced rules.\n */\nexport function updateGitignore(projectRoot: string): void {\n const gitignorePath = path.join(projectRoot, '.gitignore');\n let content = '';\n\n if (fs.existsSync(gitignorePath)) {\n content = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n if (!content.includes('.viberails/scan-result.json')) {\n const block = '\\n# viberails\\n.viberails/scan-result.json\\n';\n const prefix = content.length === 0 ? '' : `${content.trimEnd()}\\n`;\n fs.writeFileSync(gitignorePath, `${prefix}${block}`);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\n\n/**\n * Set up a pre-commit hook that runs viberails check on staged files.\n * Detects Lefthook, Husky, or falls back to a raw git hook.\n */\nexport function setupPreCommitHook(projectRoot: string): string | undefined {\n // Check for Lefthook\n const lefthookPath = path.join(projectRoot, 'lefthook.yml');\n if (fs.existsSync(lefthookPath)) {\n addLefthookPreCommit(lefthookPath);\n console.log(` ${chalk.green('✓')} lefthook.yml — added viberails pre-commit`);\n return 'lefthook.yml';\n }\n\n // Check for Husky\n const huskyDir = path.join(projectRoot, '.husky');\n if (fs.existsSync(huskyDir)) {\n writeHuskyPreCommit(huskyDir);\n console.log(` ${chalk.green('✓')} .husky/pre-commit — added viberails check`);\n return '.husky/pre-commit';\n }\n\n // Fall back to raw git hook\n const gitDir = path.join(projectRoot, '.git');\n if (fs.existsSync(gitDir)) {\n const hooksDir = path.join(gitDir, 'hooks');\n if (!fs.existsSync(hooksDir)) {\n fs.mkdirSync(hooksDir, { recursive: true });\n }\n writeGitHookPreCommit(hooksDir);\n console.log(` ${chalk.green('✓')} .git/hooks/pre-commit`);\n return '.git/hooks/pre-commit';\n }\n\n return undefined;\n}\n\nfunction writeGitHookPreCommit(hooksDir: string): void {\n const hookPath = path.join(hooksDir, 'pre-commit');\n if (fs.existsSync(hookPath)) {\n const existing = fs.readFileSync(hookPath, 'utf-8');\n if (existing.includes('viberails')) return;\n fs.writeFileSync(\n hookPath,\n `${existing.trimEnd()}\\n\\n# viberails check\\nnpx viberails check --staged\\n`,\n );\n return;\n }\n const script = [\n '#!/bin/sh',\n '# Generated by viberails — https://viberails.sh',\n '',\n 'npx viberails check --staged',\n '',\n ].join('\\n');\n fs.writeFileSync(hookPath, script, { mode: 0o755 });\n}\n\nfunction addLefthookPreCommit(lefthookPath: string): void {\n const content = fs.readFileSync(lefthookPath, 'utf-8');\n if (content.includes('viberails')) return;\n\n const doc = parseYaml(content) ?? {};\n\n if (!doc['pre-commit']) {\n doc['pre-commit'] = { commands: {} };\n }\n if (!doc['pre-commit'].commands) {\n doc['pre-commit'].commands = {};\n }\n\n doc['pre-commit'].commands.viberails = {\n run: 'npx viberails check --staged',\n };\n\n fs.writeFileSync(lefthookPath, stringifyYaml(doc));\n}\n\n/**\n * Detect which pre-commit hook manager is present.\n * Returns a label like \"Lefthook\", \"Husky\", \"git hook\", or undefined if no .git.\n */\nexport function detectHookManager(projectRoot: string): string | undefined {\n if (fs.existsSync(path.join(projectRoot, 'lefthook.yml'))) return 'Lefthook';\n if (fs.existsSync(path.join(projectRoot, '.husky'))) return 'Husky';\n if (fs.existsSync(path.join(projectRoot, '.git'))) return 'git hook';\n return undefined;\n}\n\n/**\n * Set up a Claude Code PostToolUse hook that checks files after edit/write.\n * Writes to .claude/settings.json (project-level, team-shared).\n */\nexport function setupClaudeCodeHook(projectRoot: string): void {\n const claudeDir = path.join(projectRoot, '.claude');\n if (!fs.existsSync(claudeDir)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n }\n\n const settingsPath = path.join(claudeDir, 'settings.json');\n let settings: Record<string, unknown> = {};\n\n if (fs.existsSync(settingsPath)) {\n try {\n settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));\n } catch {\n console.warn(\n ` ${chalk.yellow('!')} .claude/settings.json contains invalid JSON — skipping hook setup`,\n );\n console.warn(` Fix the JSON manually, then re-run ${chalk.cyan('viberails init --force')}`);\n return;\n }\n }\n\n const hooks = (settings.hooks ?? {}) as Record<string, unknown[]>;\n\n // Check if viberails hook already exists\n const existing = hooks.PostToolUse ?? [];\n if (existing.some((h) => JSON.stringify(h).includes('viberails'))) return;\n\n // The --hook flag handles everything: reads stdin JSON, extracts file_path,\n // runs the check, outputs violations to stderr, and exits 2 on violations.\n // Prefer the local binary (fast) over npx (slow cold-start).\n const hookCommand =\n 'if [ -x ./node_modules/.bin/viberails ]; then ./node_modules/.bin/viberails check --hook; else npx viberails check --hook; fi';\n\n hooks.PostToolUse = [\n ...existing,\n {\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: hookCommand,\n },\n ],\n },\n ];\n\n settings.hooks = hooks;\n fs.writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`);\n console.log(` ${chalk.green('✓')} .claude/settings.json — added viberails PostToolUse hook`);\n}\n\n/**\n * Append a @.viberails/context.md reference to the project's CLAUDE.md.\n * Creates CLAUDE.md if it doesn't exist. Skips if the reference is already present.\n */\nexport function setupClaudeMdReference(projectRoot: string): void {\n const claudeMdPath = path.join(projectRoot, 'CLAUDE.md');\n let content = '';\n\n if (fs.existsSync(claudeMdPath)) {\n content = fs.readFileSync(claudeMdPath, 'utf-8');\n }\n\n if (content.includes('@.viberails/context.md')) return;\n\n const ref = '\\n@.viberails/context.md\\n';\n const prefix = content.length === 0 ? '' : content.trimEnd();\n fs.writeFileSync(claudeMdPath, prefix + ref);\n console.log(` ${chalk.green('✓')} CLAUDE.md — added @.viberails/context.md reference`);\n}\n\n/**\n * Generate a GitHub Actions workflow that runs viberails check --enforce on PRs.\n * Detects the project's package manager for correct install/run commands.\n */\nexport function setupGithubAction(projectRoot: string, packageManager: string): string | undefined {\n const workflowDir = path.join(projectRoot, '.github', 'workflows');\n const workflowPath = path.join(workflowDir, 'viberails.yml');\n\n if (fs.existsSync(workflowPath)) {\n const existing = fs.readFileSync(workflowPath, 'utf-8');\n if (existing.includes('viberails')) return undefined;\n }\n\n fs.mkdirSync(workflowDir, { recursive: true });\n\n const pm = packageManager || 'npm';\n const installCmd =\n pm === 'yarn'\n ? 'yarn install --frozen-lockfile'\n : pm === 'pnpm'\n ? 'pnpm install --frozen-lockfile'\n : 'npm ci';\n const runPrefix = pm === 'npm' ? 'npx' : `${pm} exec`;\n\n const lines = [\n 'name: viberails',\n '',\n 'on:',\n ' pull_request:',\n ' branches: [main]',\n '',\n 'jobs:',\n ' check:',\n ' runs-on: ubuntu-latest',\n ' steps:',\n ' - uses: actions/checkout@v4',\n ' with:',\n ' fetch-depth: 0',\n '',\n ];\n\n if (pm === 'pnpm') {\n lines.push(' - uses: pnpm/action-setup@v4', '');\n }\n\n lines.push(\n ' - uses: actions/setup-node@v4',\n ' with:',\n ' node-version: 22',\n pm !== 'npm' ? ` cache: ${pm}` : '',\n '',\n ` - run: ${installCmd}`,\n ` - run: ${runPrefix} viberails check --enforce --diff-base origin/\\${{ github.event.pull_request.base.ref }}`,\n '',\n );\n\n const content = lines.filter((l) => l !== undefined).join('\\n');\n fs.writeFileSync(workflowPath, content);\n return '.github/workflows/viberails.yml';\n}\n\nfunction writeHuskyPreCommit(huskyDir: string): void {\n const hookPath = path.join(huskyDir, 'pre-commit');\n if (fs.existsSync(hookPath)) {\n const existing = fs.readFileSync(hookPath, 'utf-8');\n if (!existing.includes('viberails')) {\n fs.writeFileSync(hookPath, `${existing.trimEnd()}\\nnpx viberails check --staged\\n`);\n }\n return;\n }\n fs.writeFileSync(hookPath, '#!/bin/sh\\nnpx viberails check --staged\\n', { mode: 0o755 });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { IntegrationChoice } from '../utils/prompt-integrations.js';\nimport {\n setupClaudeCodeHook,\n setupClaudeMdReference,\n setupGithubAction,\n setupPreCommitHook,\n} from './init-hooks.js';\n\n/**\n * Add a named pre-commit command to the detected hook manager.\n * Idempotent — skips if the marker string is already present.\n */\nexport function addPreCommitStep(\n projectRoot: string,\n name: string,\n command: string,\n marker: string,\n): string | undefined {\n const lefthookPath = path.join(projectRoot, 'lefthook.yml');\n if (fs.existsSync(lefthookPath)) {\n const content = fs.readFileSync(lefthookPath, 'utf-8');\n if (content.includes(marker)) return undefined;\n const doc = parseYaml(content) ?? {};\n if (!doc['pre-commit']) doc['pre-commit'] = { commands: {} };\n if (!doc['pre-commit'].commands) doc['pre-commit'].commands = {};\n doc['pre-commit'].commands[name] = { run: command };\n fs.writeFileSync(lefthookPath, stringifyYaml(doc));\n return 'lefthook.yml';\n }\n\n const huskyDir = path.join(projectRoot, '.husky');\n if (fs.existsSync(huskyDir)) {\n const hookPath = path.join(huskyDir, 'pre-commit');\n if (fs.existsSync(hookPath)) {\n const existing = fs.readFileSync(hookPath, 'utf-8');\n if (existing.includes(marker)) return undefined;\n fs.writeFileSync(hookPath, `${existing.trimEnd()}\\n${command}\\n`);\n } else {\n fs.writeFileSync(hookPath, `#!/bin/sh\\n${command}\\n`, { mode: 0o755 });\n }\n return '.husky/pre-commit';\n }\n\n const gitDir = path.join(projectRoot, '.git');\n if (fs.existsSync(gitDir)) {\n const hooksDir = path.join(gitDir, 'hooks');\n if (!fs.existsSync(hooksDir)) fs.mkdirSync(hooksDir, { recursive: true });\n const hookPath = path.join(hooksDir, 'pre-commit');\n if (fs.existsSync(hookPath)) {\n const existing = fs.readFileSync(hookPath, 'utf-8');\n if (existing.includes(marker)) return undefined;\n fs.writeFileSync(hookPath, `${existing.trimEnd()}\\n\\n# ${name}\\n${command}\\n`);\n } else {\n fs.writeFileSync(hookPath, `#!/bin/sh\\n# Generated by viberails\\n\\n# ${name}\\n${command}\\n`, {\n mode: 0o755,\n });\n }\n return '.git/hooks/pre-commit';\n }\n\n return undefined;\n}\n\n/** Set up a tsc --noEmit pre-commit step. */\nexport function setupTypecheckHook(projectRoot: string): string | undefined {\n const target = addPreCommitStep(projectRoot, 'typecheck', 'npx tsc --noEmit', 'tsc');\n if (target) {\n console.log(` ${chalk.green('✓')} ${target} — added typecheck (tsc --noEmit)`);\n }\n return target;\n}\n\n/** Set up a linter pre-commit step. */\nexport function setupLintHook(projectRoot: string, linter: string): string | undefined {\n const command = linter === 'biome' ? 'npx biome check .' : 'npx eslint .';\n const linterName = linter === 'biome' ? 'Biome' : 'ESLint';\n const target = addPreCommitStep(projectRoot, 'lint', command, linter);\n if (target) {\n console.log(` ${chalk.green('✓')} ${target} — added ${linterName} lint check`);\n }\n return target;\n}\n\n/** Apply selected integrations and return list of created file descriptions. */\nexport function setupSelectedIntegrations(\n projectRoot: string,\n integrations: IntegrationChoice,\n opts: { linter?: string; packageManager?: string },\n): string[] {\n const created: string[] = [];\n if (integrations.preCommitHook) {\n const t = setupPreCommitHook(projectRoot);\n created.push(t ? `${t} — added viberails pre-commit` : 'pre-commit hook skipped');\n }\n if (integrations.typecheckHook) {\n const t = setupTypecheckHook(projectRoot);\n if (t) created.push(`${t} — added typecheck`);\n }\n if (integrations.lintHook && opts.linter) {\n const t = setupLintHook(projectRoot, opts.linter);\n if (t) created.push(`${t} — added lint check`);\n }\n if (integrations.claudeCodeHook) {\n setupClaudeCodeHook(projectRoot);\n created.push('.claude/settings.json — added viberails hook');\n }\n if (integrations.claudeMdRef) {\n setupClaudeMdReference(projectRoot);\n created.push('CLAUDE.md — added @.viberails/context.md reference');\n }\n if (integrations.githubAction) {\n const t = setupGithubAction(projectRoot, opts.packageManager ?? 'npm');\n if (t) created.push(`${t} — blocks PRs on violations`);\n }\n return created;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport { compactConfig, loadConfig, mergeConfig } from '@viberails/config';\nimport { scan } from '@viberails/scanner';\nimport type { CodebaseStatistics } from '@viberails/types';\nimport chalk from 'chalk';\nimport { formatRulesText } from '../display-text.js';\nimport { applyRuleOverrides } from '../utils/apply-rule-overrides.js';\nimport { diffConfigs, formatStatsDelta } from '../utils/diff-configs.js';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { assertNotCancelled, promptRuleMenu } from '../utils/prompt.js';\nimport { writeGeneratedFiles } from '../utils/write-generated-files.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\nconst SCAN_RESULT_FILE = '.viberails/scan-result.json';\n\n/**\n * Try to load previous scan statistics from scan-result.json.\n */\nfunction loadPreviousStats(projectRoot: string): CodebaseStatistics | undefined {\n const scanResultPath = path.join(projectRoot, SCAN_RESULT_FILE);\n try {\n const raw = fs.readFileSync(scanResultPath, 'utf-8');\n const parsed = JSON.parse(raw);\n if (parsed?.statistics?.totalFiles !== undefined) {\n return parsed.statistics as CodebaseStatistics;\n }\n } catch {\n // File missing or malformed — skip stats delta\n }\n return undefined;\n}\n\n/**\n * Run the viberails sync flow: re-scan, merge config, regenerate context.\n *\n * @param options - Command options (interactive mode)\n * @param cwd - Working directory override (for testing)\n */\nexport async function syncCommand(\n options?: { interactive?: boolean },\n cwd?: string,\n): Promise<void> {\n const startDir = cwd ?? process.cwd();\n\n // 1. Find project root\n const projectRoot = findProjectRoot(startDir);\n if (!projectRoot) {\n throw new Error(\n 'No package.json found in this directory or any parent.\\n\\n' +\n 'Make sure you are inside a JavaScript or TypeScript project, then run:\\n' +\n ' npx viberails',\n );\n }\n\n // 2. Load existing config and previous stats\n const configPath = path.join(projectRoot, CONFIG_FILE);\n const existing = await loadConfig(configPath);\n const previousStats = loadPreviousStats(projectRoot);\n\n // 3. Re-scan\n console.log(chalk.dim('Scanning project...'));\n const scanResult = await scan(projectRoot);\n\n // 4. Merge config and detect changes\n const merged = mergeConfig(existing, scanResult);\n const compacted = compactConfig(merged);\n const compactedJson = JSON.stringify(compacted, null, 2);\n\n // Compare against raw disk JSON (ignoring lastSync timestamp)\n const rawDisk = fs.readFileSync(configPath, 'utf-8').trim();\n const diskWithoutSync = rawDisk.replace(/\"lastSync\":\\s*\"[^\"]*\"/, '\"lastSync\": \"\"');\n const mergedWithoutSync = compactedJson.replace(/\"lastSync\":\\s*\"[^\"]*\"/, '\"lastSync\": \"\"');\n const configChanged = diskWithoutSync !== mergedWithoutSync;\n\n // 5. Report specific changes\n const changes = configChanged ? diffConfigs(existing, merged) : [];\n const statsDelta = previousStats\n ? formatStatsDelta(previousStats, scanResult.statistics)\n : undefined;\n\n if (changes.length > 0 || statsDelta) {\n console.log(`\\n${chalk.bold('Changes:')}`);\n for (const change of changes) {\n const icon = change.type === 'removed' ? chalk.red('-') : chalk.green('+');\n console.log(` ${icon} ${change.description}`);\n }\n if (statsDelta) {\n console.log(` ${chalk.dim(statsDelta)}`);\n }\n }\n\n // 5b. Interactive review (if --interactive)\n if (options?.interactive) {\n clack.intro('viberails sync (interactive)');\n clack.note(formatRulesText(merged).join('\\n'), 'Rules after sync');\n\n const decision = await clack.select({\n message: 'How would you like to proceed?',\n options: [\n { value: 'accept' as const, label: 'Accept changes' },\n { value: 'customize' as const, label: 'Customize rules' },\n { value: 'cancel' as const, label: 'Cancel (no changes written)' },\n ],\n });\n assertNotCancelled(decision);\n\n if (decision === 'cancel') {\n clack.outro('Sync cancelled. No files were written.');\n return;\n }\n\n if (decision === 'customize') {\n const rootPkg = merged.packages.find((p) => p.path === '.') ?? merged.packages[0];\n const overrides = await promptRuleMenu({\n maxFileLines: merged.rules.maxFileLines,\n testCoverage: merged.rules.testCoverage,\n enforceMissingTests: merged.rules.enforceMissingTests,\n enforceNaming: merged.rules.enforceNaming,\n fileNamingValue: rootPkg.conventions?.fileNaming,\n coverageSummaryPath: rootPkg.coverage?.summaryPath ?? 'coverage/coverage-summary.json',\n coverageCommand: merged.defaults?.coverage?.command,\n packageOverrides: merged.packages,\n });\n applyRuleOverrides(merged, overrides);\n\n // Recompact after overrides\n const recompacted = compactConfig(merged);\n fs.writeFileSync(configPath, `${JSON.stringify(recompacted, null, 2)}\\n`);\n writeGeneratedFiles(projectRoot, merged, scanResult);\n\n clack.log.success('Updated config with your customizations.');\n clack.outro('Done! Run viberails check to verify.');\n return;\n }\n }\n\n // 6. Write config (compacted)\n fs.writeFileSync(configPath, `${compactedJson}\\n`);\n\n // 7. Regenerate context and scan-result.json\n writeGeneratedFiles(projectRoot, merged, scanResult);\n\n // 8. Summary\n console.log(`\\n${chalk.bold('Synced:')}`);\n if (configChanged) {\n console.log(` ${chalk.yellow('!')} ${CONFIG_FILE} — updated (review changes)`);\n } else {\n console.log(` ${chalk.green('✓')} ${CONFIG_FILE} — unchanged`);\n }\n console.log(` ${chalk.green('✓')} .viberails/context.md — regenerated`);\n console.log(` ${chalk.green('✓')} .viberails/scan-result.json — updated`);\n}\n"],"mappings":"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","names":["chalk","fs","path","clack","fs","path","clack","clack","clack","confirm","fs","path","confirm","fs","path","loadConfig","chalk","spawnSync","fs","path","pkg","fs","path","BUILTIN_IGNORE","fs","path","SOURCE_EXTS","packageRoot","basename","CONFIG_FILE","chalk","loadConfig","log","fs","fs","path","clack","compactConfig","loadConfig","chalk","CONVENTION_LABELS","FRAMEWORK_NAMES","LIBRARY_NAMES","ORM_NAMES","STYLING_NAMES","FRAMEWORK_NAMES","STYLING_NAMES","chalk","chalk","chalk","chalk","FRAMEWORK_NAMES","STYLING_NAMES","CONVENTION_LABELS","FRAMEWORK_NAMES","STYLING_NAMES","ORM_NAMES","LIBRARY_NAMES","CONVENTION_LABELS","FRAMEWORK_NAMES","ORM_NAMES","STYLING_NAMES","fs","path","CONFIG_FILE","chalk","loadConfig","confirm","compactConfig","fs","path","loadConfig","chalk","execSync","chalk","path","fs","path","fs","path","basename","CONFIG_FILE","chalk","loadConfig","fs","path","clack","compactConfig","scan","chalk","spawnSync","fs","path","clack","chalk","chalk","spawnSync","fs","path","fs","path","chalk","fs","path","chalk","parseYaml","stringifyYaml","parseYaml","stringifyYaml","chalk","CONFIG_FILE","chalk","scan","compactConfig","confirm","fs","path","clack","compactConfig","loadConfig","mergeConfig","scan","chalk","CONFIG_FILE","SCAN_RESULT_FILE","loadConfig","chalk","scan","mergeConfig","compactConfig","chalk","exitCode"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/boundaries.ts","../src/utils/find-project-root.ts","../src/utils/prompt.ts","../src/utils/prompt-integrations.ts","../src/utils/prompt-rules.ts","../src/utils/prompt-menu-handlers.ts","../src/utils/prompt-package-overrides.ts","../src/utils/resolve-workspace-packages.ts","../src/commands/check.ts","../src/commands/check-config.ts","../src/commands/check-coverage.ts","../src/commands/check-files.ts","../src/commands/check-tests.ts","../src/commands/check-hook.ts","../src/commands/config.ts","../src/display-text.ts","../src/display.ts","../src/display-helpers.ts","../src/display-monorepo.ts","../src/utils/apply-rule-overrides.ts","../src/utils/diff-configs.ts","../src/utils/write-generated-files.ts","../src/commands/fix.ts","../src/commands/fix-helpers.ts","../src/commands/fix-imports.ts","../src/commands/fix-naming.ts","../src/commands/convert-name.ts","../src/commands/fix-tests.ts","../src/commands/init.ts","../src/utils/check-prerequisites.ts","../src/utils/filter-confidence.ts","../src/utils/update-gitignore.ts","../src/commands/init-hooks.ts","../src/commands/init-hooks-extra.ts","../src/commands/sync.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { boundariesCommand } from './commands/boundaries.js';\nimport { checkCommand } from './commands/check.js';\nimport { hookCheckCommand } from './commands/check-hook.js';\nimport { configCommand } from './commands/config.js';\nimport { fixCommand } from './commands/fix.js';\nimport { initCommand } from './commands/init.js';\nimport { syncCommand } from './commands/sync.js';\n\ndeclare const __PACKAGE_VERSION__: string;\nexport const VERSION: string = __PACKAGE_VERSION__;\n\nconst program = new Command();\n\nprogram.name('viberails').description('Guardrails for vibe coding').version(VERSION);\n\nprogram\n .command('init', { isDefault: true })\n .description('Scan your project and set up enforcement guardrails')\n .option('-y, --yes', 'Non-interactive mode (use defaults, high-confidence only)')\n .option('-f, --force', 'Re-initialize, replacing existing config')\n .action(async (options: { yes?: boolean; force?: boolean }) => {\n try {\n await initCommand(options);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('sync')\n .description('Re-scan and update generated files')\n .option('-i, --interactive', 'Review changes before writing')\n .action(async (options: { interactive?: boolean }) => {\n try {\n await syncCommand(options);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('config')\n .description('Interactively edit existing config rules')\n .option('--rescan', 'Re-scan project first (picks up new packages, stack changes)')\n .action(async (options: { rescan?: boolean }) => {\n try {\n await configCommand(options);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('check')\n .description('Check files against enforced rules')\n .option('--staged', 'Check only staged files (for pre-commit hooks)')\n .option('--files <files...>', 'Check specific files')\n .option('--diff-base <ref>', 'Only check files changed since <ref> (for CI on PRs)')\n .option('--no-boundaries', 'Skip boundary checking')\n .option('--quiet', 'Show only summary counts, not individual violations')\n .option('--limit <n>', 'Maximum number of violations to display', Number.parseInt)\n .option('--format <format>', 'Output format: text (default) or json')\n .option('--enforce', 'Exit with error on violations (for CI)')\n .option('--hook', 'Claude Code hook mode: read file from stdin, output to stderr')\n .action(\n async (options: {\n staged?: boolean;\n files?: string[];\n diffBase?: string;\n boundaries?: boolean;\n quiet?: boolean;\n limit?: number;\n format?: string;\n enforce?: boolean;\n hook?: boolean;\n }) => {\n try {\n if (options.hook) {\n const exitCode = await hookCheckCommand();\n process.exit(exitCode);\n }\n const exitCode = await checkCommand({\n ...options,\n diffBase: options.diffBase,\n enforce: options.enforce,\n noBoundaries: options.boundaries === false,\n format: options.format === 'json' ? 'json' : 'text',\n });\n process.exit(exitCode);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n },\n );\n\nprogram\n .command('fix')\n .description('Auto-fix file naming violations and generate missing test stubs')\n .option('--dry-run', 'Show planned fixes without applying them')\n .option('--rule <rules...>', 'Fix only specific rules (file-naming, missing-test)')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options: { dryRun?: boolean; rule?: string[]; yes?: boolean }) => {\n try {\n const exitCode = await fixCommand(options);\n process.exit(exitCode);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('boundaries')\n .description('Display, infer, or inspect import boundary rules')\n .option('--infer', 'Infer boundary rules from current import patterns')\n .option('--graph', 'Display import graph summary')\n .action(async (options: { infer?: boolean; graph?: boolean }) => {\n try {\n await boundariesCommand(options);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${chalk.red('Error:')} ${message}`);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { compactConfig, loadConfig } from '@viberails/config';\nimport type { ViberailsConfig } from '@viberails/types';\nimport chalk from 'chalk';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { confirm } from '../utils/prompt.js';\nimport { resolveWorkspacePackages } from '../utils/resolve-workspace-packages.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\nexport interface BoundariesOptions {\n infer?: boolean;\n graph?: boolean;\n}\n\n/**\n * Display, infer, or inspect import boundary rules.\n *\n * @param options - CLI options\n * @param cwd - Working directory override (for testing)\n */\nexport async function boundariesCommand(options: BoundariesOptions, cwd?: string): Promise<void> {\n const startDir = cwd ?? process.cwd();\n const projectRoot = findProjectRoot(startDir);\n if (!projectRoot) {\n throw new Error('No package.json found. Are you in a JS/TS project?');\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (!fs.existsSync(configPath)) {\n throw new Error('No viberails.config.json found. Run `viberails init` first.');\n }\n\n const config = await loadConfig(configPath);\n\n if (options.graph) {\n await showGraph(projectRoot, config);\n return;\n }\n\n if (options.infer) {\n await inferAndDisplay(projectRoot, config, configPath);\n return;\n }\n\n displayRules(config);\n}\n\n/** Display configured boundary rules. */\nfunction displayRules(config: ViberailsConfig): void {\n if (!config.boundaries || Object.keys(config.boundaries.deny).length === 0) {\n console.log(chalk.yellow('No boundary rules configured.'));\n console.log(`Run ${chalk.cyan('viberails boundaries --infer')} to generate rules.`);\n return;\n }\n\n const { deny } = config.boundaries;\n const sources = Object.keys(deny).filter((k) => deny[k].length > 0);\n const totalRules = sources.reduce((sum, k) => sum + deny[k].length, 0);\n\n console.log(`\\n${chalk.bold(`Boundary rules (${totalRules} deny rules):`)}\\n`);\n\n for (const source of sources) {\n for (const target of deny[source]) {\n console.log(` ${chalk.red('✗')} ${source} → ${target}`);\n }\n }\n\n console.log(\n `\\nEnforcement: ${config.rules.enforceBoundaries ? chalk.green('on') : chalk.yellow('off')}`,\n );\n}\n\n/** Infer boundary rules from import patterns and optionally save. */\nasync function inferAndDisplay(\n projectRoot: string,\n config: ViberailsConfig,\n configPath: string,\n): Promise<void> {\n console.log(chalk.dim('Analyzing imports...'));\n const { buildImportGraph, inferBoundaries } = await import('@viberails/graph');\n\n const packages =\n config.packages.length > 1 ? resolveWorkspacePackages(projectRoot, config.packages) : undefined;\n\n const graph = await buildImportGraph(projectRoot, {\n packages,\n ignore: config.ignore,\n });\n\n console.log(chalk.dim(`${graph.nodes.length} files, ${graph.edges.length} edges`));\n\n const inferred = inferBoundaries(graph);\n const sources = Object.keys(inferred.deny).filter((k) => inferred.deny[k].length > 0);\n const totalRules = sources.reduce((sum, k) => sum + inferred.deny[k].length, 0);\n\n if (totalRules === 0) {\n console.log(chalk.yellow('No boundary rules could be inferred.'));\n return;\n }\n\n console.log(`\\n${chalk.bold('Inferred boundary rules:')}\\n`);\n\n for (const source of sources) {\n for (const target of inferred.deny[source]) {\n console.log(` ${chalk.red('✗')} ${source} → ${target}`);\n }\n }\n\n console.log(`\\n ${totalRules} denied`);\n\n console.log('');\n const shouldSave = await confirm('Save to viberails.config.json?');\n if (shouldSave) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n fs.writeFileSync(configPath, `${JSON.stringify(compactConfig(config), null, 2)}\\n`);\n console.log(`${chalk.green('✓')} Saved ${totalRules} rules`);\n }\n}\n\n/** Display import graph summary. */\nasync function showGraph(projectRoot: string, config: ViberailsConfig): Promise<void> {\n console.log(chalk.dim('Building import graph...'));\n const { buildImportGraph } = await import('@viberails/graph');\n\n const packages =\n config.packages.length > 1 ? resolveWorkspacePackages(projectRoot, config.packages) : undefined;\n\n const graph = await buildImportGraph(projectRoot, {\n packages,\n ignore: config.ignore,\n });\n\n console.log(`\\n${chalk.bold('Import dependency graph:')}\\n`);\n console.log(` ${graph.nodes.length} files, ${graph.edges.length} imports\\n`);\n\n if (graph.packages.length > 0) {\n for (const pkg of graph.packages) {\n const deps =\n pkg.internalDeps.length > 0\n ? `\\n${pkg.internalDeps.map((d) => ` → ${d}`).join('\\n')}`\n : chalk.dim(' (no internal deps)');\n console.log(` ${pkg.name}${deps}`);\n }\n }\n\n if (graph.cycles.length > 0) {\n console.log(`\\n${chalk.yellow('Cycles detected:')}`);\n for (const cycle of graph.cycles) {\n const paths = cycle.map((f) => path.relative(projectRoot, f));\n console.log(` ${paths.join(' → ')}`);\n }\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Walk up from startDir looking for a directory containing package.json.\n *\n * @param startDir - The directory to start searching from\n * @returns The project root path, or null if no package.json is found\n */\nexport function findProjectRoot(startDir: string): string | null {\n let dir = path.resolve(startDir);\n\n while (true) {\n if (fs.existsSync(path.join(dir, 'package.json'))) {\n return dir;\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) {\n return null;\n }\n dir = parent;\n }\n}\n","import * as clack from '@clack/prompts';\n\n/**\n * Assert that a clack prompt result was not cancelled (Ctrl+C).\n * If cancelled, prints a message and exits the process.\n */\nexport function assertNotCancelled<T>(value: T | symbol): asserts value is T {\n if (clack.isCancel(value)) {\n clack.cancel('Setup cancelled.');\n process.exit(0);\n }\n}\n\n/**\n * Prompt the user for a yes/no confirmation.\n *\n * @param message - The question to display\n * @returns true if the user confirms, false otherwise\n */\nexport async function confirm(message: string): Promise<boolean> {\n const result = await clack.confirm({ message, initialValue: true });\n assertNotCancelled(result);\n return result;\n}\n\n/**\n * Prompt the user for a yes/no confirmation that defaults to NO.\n * Use for destructive or risky actions.\n *\n * @param message - The question to display\n * @returns true if the user confirms, false otherwise\n */\nexport async function confirmDangerous(message: string): Promise<boolean> {\n const result = await clack.confirm({ message, initialValue: false });\n assertNotCancelled(result);\n return result;\n}\n\n/**\n * Prompt the user to choose between accepting defaults or customizing rules.\n *\n * @returns 'accept' or 'customize'\n */\nexport async function promptInitDecision(): Promise<'accept' | 'customize'> {\n const result = await clack.select({\n message: 'Accept these rules?',\n options: [\n {\n value: 'accept' as const,\n label: 'Yes, looks good',\n hint: 'warns on violation; use --enforce in CI to block',\n },\n { value: 'customize' as const, label: 'Let me customize rules' },\n ],\n });\n assertNotCancelled(result);\n return result;\n}\n\nexport type { IntegrationChoice } from './prompt-integrations.js';\n// Re-export from split modules so existing imports continue to work\nexport { promptIntegrations } from './prompt-integrations.js';\nexport type { RuleOverrides } from './prompt-rules.js';\nexport { promptRuleMenu } from './prompt-rules.js';\n","import { spawnSync } from 'node:child_process';\nimport * as clack from '@clack/prompts';\nimport { assertNotCancelled } from './prompt.js';\n\nexport interface IntegrationChoice {\n preCommitHook: boolean;\n claudeCodeHook: boolean;\n claudeMdRef: boolean;\n githubAction: boolean;\n typecheckHook: boolean;\n lintHook: boolean;\n}\n\nexport interface DetectedTools {\n isTypeScript?: boolean;\n linter?: string;\n packageManager?: string;\n}\n\n/**\n * Prompt the user to install Lefthook when no hook manager is detected.\n * Returns the updated hook manager name, or undefined if the user declined.\n */\nasync function promptHookManagerInstall(\n projectRoot: string,\n packageManager: string,\n): Promise<string | undefined> {\n const choice = await clack.select({\n message: 'No git hook manager detected. Install Lefthook for shareable pre-commit hooks?',\n options: [\n {\n value: 'install' as const,\n label: 'Yes, install Lefthook',\n hint: 'recommended — hooks are committed to the repo and shared with your team',\n },\n {\n value: 'skip' as const,\n label: 'No, skip',\n hint: 'pre-commit hooks will be local-only (.git/hooks) and not shared',\n },\n ],\n });\n assertNotCancelled(choice);\n\n if (choice !== 'install') return undefined;\n\n const pm = packageManager || 'npm';\n const installCmd =\n pm === 'yarn'\n ? 'yarn add -D lefthook'\n : pm === 'pnpm'\n ? 'pnpm add -D lefthook'\n : 'npm install -D lefthook';\n\n const s = clack.spinner();\n s.start('Installing Lefthook...');\n const result = spawnSync(installCmd, {\n cwd: projectRoot,\n shell: true,\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n\n if (result.status === 0) {\n // Create a minimal lefthook.yml so setupPreCommitHook detects it\n const fs = await import('node:fs');\n const path = await import('node:path');\n const lefthookPath = path.join(projectRoot, 'lefthook.yml');\n if (!fs.existsSync(lefthookPath)) {\n fs.writeFileSync(lefthookPath, '# Managed by viberails — https://viberails.sh\\n');\n }\n s.stop('Installed Lefthook');\n return 'Lefthook';\n }\n\n s.stop('Failed to install Lefthook');\n clack.log.warn(`Install manually: ${installCmd}`);\n return undefined;\n}\n\n/**\n * Prompt the user to select which integrations to set up.\n *\n * @param projectRoot - Project root directory (needed for Lefthook install)\n * @param hookManager - Detected hook manager name (e.g. \"Husky\", \"Lefthook\") or undefined\n * @param tools - Detected project tools (TypeScript, linter) to conditionally show options\n * @returns Object with selected integrations\n */\nexport async function promptIntegrations(\n projectRoot: string,\n hookManager: string | undefined,\n tools?: DetectedTools,\n): Promise<IntegrationChoice> {\n let resolvedHookManager = hookManager;\n\n // If no hook manager, offer to install Lefthook\n if (!resolvedHookManager) {\n resolvedHookManager = await promptHookManagerInstall(\n projectRoot,\n tools?.packageManager ?? 'npm',\n );\n }\n\n const isBareHook = !resolvedHookManager;\n const hookLabel = resolvedHookManager\n ? `Pre-commit hook (${resolvedHookManager})`\n : 'Pre-commit hook (git hook — local only)';\n const hookHint = isBareHook\n ? 'local only — will NOT be committed or shared with collaborators'\n : 'runs viberails checks when you commit';\n\n type OptionValue = 'preCommit' | 'claude' | 'claudeMd' | 'githubAction' | 'typecheck' | 'lint';\n\n const options: { value: OptionValue; label: string; hint: string }[] = [\n {\n value: 'preCommit',\n label: hookLabel,\n hint: hookHint,\n },\n ];\n\n if (tools?.isTypeScript) {\n options.push({\n value: 'typecheck',\n label: 'Typecheck (tsc --noEmit)',\n hint: 'catches type errors before commit',\n });\n }\n\n if (tools?.linter) {\n const linterName = tools.linter === 'biome' ? 'Biome' : 'ESLint';\n options.push({\n value: 'lint',\n label: `Lint check (${linterName})`,\n hint: 'runs linter on staged files before commit',\n });\n }\n\n options.push(\n {\n value: 'claude',\n label: 'Claude Code hook',\n hint: 'checks files when Claude edits them',\n },\n {\n value: 'claudeMd',\n label: 'CLAUDE.md reference',\n hint: 'appends @.viberails/context.md so Claude loads rules automatically',\n },\n {\n value: 'githubAction',\n label: 'GitHub Actions workflow',\n hint: 'blocks PRs that fail viberails check',\n },\n );\n\n // Default-disable pre-commit when using bare git hooks\n const initialValues = isBareHook\n ? options.filter((o) => o.value !== 'preCommit').map((o) => o.value)\n : options.map((o) => o.value);\n\n const result = await clack.multiselect({\n message: 'Set up integrations?',\n options,\n initialValues,\n required: false,\n });\n assertNotCancelled(result);\n\n return {\n preCommitHook: result.includes('preCommit'),\n claudeCodeHook: result.includes('claude'),\n claudeMdRef: result.includes('claudeMd'),\n githubAction: result.includes('githubAction'),\n typecheckHook: result.includes('typecheck'),\n lintHook: result.includes('lint'),\n };\n}\n","import * as clack from '@clack/prompts';\nimport type { PackageConfig } from '@viberails/types';\nimport { assertNotCancelled } from './prompt.js';\nimport { buildMenuOptions, clonePackages, handleMenuChoice } from './prompt-menu-handlers.js';\n\nexport interface RuleOverrides {\n maxFileLines: number;\n testCoverage: number;\n enforceMissingTests: boolean;\n enforceNaming: boolean;\n fileNamingValue?: string;\n coverageSummaryPath: string;\n coverageCommand?: string;\n packageOverrides?: PackageConfig[];\n}\n\nfunction getRootPackage(packages: PackageConfig[]): PackageConfig {\n return packages.find((pkg) => pkg.path === '.') ?? packages[0];\n}\n\n/**\n * Menu-based rule customization. Displays rules grouped into basic and\n * advanced sections. User browses with arrow keys and presses enter to\n * edit a rule, then returns to the menu. Select \"Done\" to finish.\n *\n * @param defaults - Current detected/default values to pre-fill\n * @returns The user's chosen rule settings\n */\nexport async function promptRuleMenu(defaults: {\n maxFileLines: number;\n testCoverage: number;\n enforceMissingTests: boolean;\n enforceNaming: boolean;\n fileNamingValue?: string;\n coverageSummaryPath: string;\n coverageCommand?: string;\n packageOverrides?: PackageConfig[];\n}): Promise<RuleOverrides> {\n const state: RuleOverrides = {\n ...defaults,\n packageOverrides: clonePackages(defaults.packageOverrides),\n };\n const root =\n state.packageOverrides && state.packageOverrides.length > 0\n ? getRootPackage(state.packageOverrides)\n : undefined;\n const packageCount = state.packageOverrides?.filter((pkg) => pkg.path !== '.').length ?? 0;\n\n while (true) {\n const options = buildMenuOptions(state, packageCount);\n const choice = await clack.select({ message: 'Customize rules', options });\n assertNotCancelled(choice);\n\n if (choice === 'done') break;\n await handleMenuChoice(choice, state, defaults, root);\n }\n\n return {\n maxFileLines: state.maxFileLines,\n testCoverage: state.testCoverage,\n enforceMissingTests: state.enforceMissingTests,\n enforceNaming: state.enforceNaming,\n fileNamingValue: state.fileNamingValue,\n coverageSummaryPath: state.coverageSummaryPath,\n coverageCommand: state.coverageCommand,\n packageOverrides: state.packageOverrides,\n };\n}\n","import * as clack from '@clack/prompts';\nimport type { PackageConfig } from '@viberails/types';\nimport { assertNotCancelled } from './prompt.js';\nimport { promptPackageCoverageOverrides } from './prompt-package-overrides.js';\nimport type { RuleOverrides } from './prompt-rules.js';\n\nfunction getPackageDiffs(pkg: PackageConfig, root: PackageConfig): string[] {\n const diffs: string[] = [];\n\n const convKeys = ['fileNaming', 'componentNaming', 'hookNaming', 'importAlias'] as const;\n for (const key of convKeys) {\n if (pkg.conventions?.[key] && pkg.conventions[key] !== root.conventions?.[key]) {\n diffs.push(`${key}: ${pkg.conventions[key]}`);\n }\n }\n\n const stackKeys = [\n 'framework',\n 'language',\n 'styling',\n 'backend',\n 'orm',\n 'linter',\n 'formatter',\n 'testRunner',\n 'packageManager',\n ] as const;\n for (const key of stackKeys) {\n if (pkg.stack?.[key] && pkg.stack[key] !== root.stack?.[key]) {\n diffs.push(`${key}: ${pkg.stack[key]}`);\n }\n }\n\n if (\n pkg.rules?.maxFileLines !== undefined &&\n pkg.rules.maxFileLines !== root.rules?.maxFileLines &&\n pkg.rules.maxFileLines > 0\n ) {\n diffs.push(`maxFileLines: ${pkg.rules.maxFileLines}`);\n }\n if (\n pkg.rules?.testCoverage !== undefined &&\n pkg.rules.testCoverage !== root.rules?.testCoverage &&\n pkg.rules.testCoverage >= 0\n ) {\n diffs.push(`testCoverage: ${pkg.rules.testCoverage}`);\n }\n if (pkg.coverage?.summaryPath && pkg.coverage.summaryPath !== root.coverage?.summaryPath) {\n diffs.push(`coverage.summaryPath: ${pkg.coverage.summaryPath}`);\n }\n if (pkg.coverage?.command && pkg.coverage.command !== root.coverage?.command) {\n diffs.push('coverage.command: (override)');\n }\n\n return diffs;\n}\n\n/** Build the options list for the rule customization menu. */\nexport function buildMenuOptions(\n state: RuleOverrides & { packageOverrides?: PackageConfig[] },\n packageCount: number,\n): { value: string; label: string; hint?: string }[] {\n const namingHint = state.enforceNaming\n ? `yes${state.fileNamingValue ? ` (${state.fileNamingValue})` : ''}`\n : 'no';\n\n const options: { value: string; label: string; hint?: string }[] = [\n { value: 'maxFileLines', label: 'Max file lines', hint: String(state.maxFileLines) },\n { value: 'enforceNaming', label: 'Enforce file naming', hint: namingHint },\n ];\n if (state.fileNamingValue) {\n options.push({\n value: 'fileNaming',\n label: 'File naming convention',\n hint: state.fileNamingValue,\n });\n }\n const isMonorepo = packageCount > 0;\n const coverageLabel = isMonorepo ? 'Default coverage target' : 'Test coverage target';\n const coverageHint =\n state.testCoverage === 0\n ? '0 (disabled)'\n : isMonorepo\n ? `${state.testCoverage}% (per-package default)`\n : `${state.testCoverage}%`;\n options.push({ value: 'testCoverage', label: coverageLabel, hint: coverageHint });\n options.push({\n value: 'enforceMissingTests',\n label: 'Enforce missing tests',\n hint: state.enforceMissingTests ? 'yes' : 'no',\n });\n\n if (state.testCoverage > 0) {\n options.push(\n {\n value: 'coverageSummaryPath',\n label: isMonorepo ? 'Default coverage summary path' : 'Coverage summary path',\n hint: state.coverageSummaryPath,\n },\n {\n value: 'coverageCommand',\n label: isMonorepo ? 'Default coverage command' : 'Coverage command',\n hint: state.coverageCommand ?? 'auto-detect from package.json test runner',\n },\n );\n\n if (isMonorepo) {\n options.push({\n value: 'packageOverrides',\n label: 'Per-package coverage overrides',\n hint: `${packageCount} package${packageCount > 1 ? 's' : ''} configurable`,\n });\n }\n }\n\n options.push(\n { value: 'reset', label: 'Reset all to detected defaults' },\n { value: 'done', label: 'Done' },\n );\n\n return options;\n}\n\nexport function clonePackages(packages?: PackageConfig[]): PackageConfig[] | undefined {\n return packages?.map((pkg) => ({\n ...pkg,\n stack: pkg.stack ? { ...pkg.stack } : undefined,\n structure: pkg.structure ? { ...pkg.structure } : undefined,\n conventions: pkg.conventions ? { ...pkg.conventions } : undefined,\n rules: pkg.rules ? { ...pkg.rules } : undefined,\n coverage: pkg.coverage ? { ...pkg.coverage } : undefined,\n ignore: pkg.ignore ? [...pkg.ignore] : undefined,\n boundaries: pkg.boundaries\n ? {\n deny: [...pkg.boundaries.deny],\n ignore: pkg.boundaries.ignore ? [...pkg.boundaries.ignore] : undefined,\n }\n : undefined,\n }));\n}\n\n/** Handle a single menu choice and update state accordingly. */\nexport async function handleMenuChoice(\n choice: string,\n state: RuleOverrides & { packageOverrides?: PackageConfig[] },\n defaults: RuleOverrides & { packageOverrides?: PackageConfig[] },\n root: PackageConfig | undefined,\n): Promise<void> {\n if (choice === 'reset') {\n state.maxFileLines = defaults.maxFileLines;\n state.testCoverage = defaults.testCoverage;\n state.enforceMissingTests = defaults.enforceMissingTests;\n state.enforceNaming = defaults.enforceNaming;\n state.fileNamingValue = defaults.fileNamingValue;\n state.coverageSummaryPath = defaults.coverageSummaryPath;\n state.coverageCommand = defaults.coverageCommand;\n state.packageOverrides = clonePackages(defaults.packageOverrides);\n clack.log.info('Reset all rules to detected defaults.');\n return;\n }\n\n if (choice === 'packageOverrides') {\n if (state.packageOverrides) {\n const packageDiffs = root\n ? state.packageOverrides\n .filter((pkg) => pkg.path !== root.path)\n .map((pkg) => ({ pkg, diffs: getPackageDiffs(pkg, root) }))\n .filter((entry) => entry.diffs.length > 0)\n : [];\n state.packageOverrides = await promptPackageCoverageOverrides(state.packageOverrides, {\n testCoverage: state.testCoverage,\n coverageSummaryPath: state.coverageSummaryPath,\n coverageCommand: state.coverageCommand,\n });\n const lines = packageDiffs.map((entry) => `${entry.pkg.path}\\n ${entry.diffs.join(', ')}`);\n if (lines.length > 0) {\n clack.note(lines.join('\\n\\n'), 'Existing package differences');\n }\n }\n return;\n }\n\n if (choice === 'maxFileLines') {\n const result = await clack.text({\n message: 'Maximum lines per source file?',\n initialValue: String(state.maxFileLines),\n validate: (v) => {\n if (typeof v !== 'string') return 'Enter a positive number';\n const n = Number.parseInt(v, 10);\n if (Number.isNaN(n) || n < 1) return 'Enter a positive number';\n },\n });\n assertNotCancelled(result);\n state.maxFileLines = Number.parseInt(result, 10);\n }\n\n if (choice === 'enforceMissingTests') {\n const result = await clack.confirm({\n message: 'Require every source file to have a corresponding test file?',\n initialValue: state.enforceMissingTests,\n });\n assertNotCancelled(result);\n state.enforceMissingTests = result;\n }\n\n if (choice === 'testCoverage') {\n const result = await clack.text({\n message: 'Test coverage target (0 disables coverage checks)?',\n initialValue: String(state.testCoverage),\n validate: (v) => {\n if (typeof v !== 'string') return 'Enter a number between 0 and 100';\n const n = Number.parseInt(v, 10);\n if (Number.isNaN(n) || n < 0 || n > 100) return 'Enter a number between 0 and 100';\n },\n });\n assertNotCancelled(result);\n state.testCoverage = Number.parseInt(result, 10);\n }\n\n if (choice === 'coverageSummaryPath') {\n const result = await clack.text({\n message: 'Coverage summary path (relative to package root)?',\n initialValue: state.coverageSummaryPath,\n validate: (v) => {\n if (typeof v !== 'string' || v.trim().length === 0) return 'Path cannot be empty';\n },\n });\n assertNotCancelled(result);\n state.coverageSummaryPath = result.trim();\n }\n\n if (choice === 'coverageCommand') {\n const result = await clack.text({\n message: 'Coverage command (blank to auto-detect from package.json)?',\n initialValue: state.coverageCommand ?? '',\n placeholder: '(auto-detect from package.json test runner)',\n });\n assertNotCancelled(result);\n const trimmed = result.trim();\n state.coverageCommand = trimmed.length > 0 ? trimmed : undefined;\n }\n\n if (choice === 'enforceNaming') {\n const result = await clack.confirm({\n message: state.fileNamingValue\n ? `Enforce file naming? (detected: ${state.fileNamingValue})`\n : 'Enforce file naming?',\n initialValue: state.enforceNaming,\n });\n assertNotCancelled(result);\n state.enforceNaming = result;\n }\n\n if (choice === 'fileNaming') {\n const selected = await clack.select({\n message: 'Which file naming convention should be enforced?',\n options: [\n { value: 'kebab-case', label: 'kebab-case' },\n { value: 'camelCase', label: 'camelCase' },\n { value: 'PascalCase', label: 'PascalCase' },\n { value: 'snake_case', label: 'snake_case' },\n ],\n initialValue: state.fileNamingValue,\n });\n assertNotCancelled(selected);\n state.fileNamingValue = selected;\n }\n}\n","import * as clack from '@clack/prompts';\nimport type { PackageConfig } from '@viberails/types';\nimport { assertNotCancelled } from './prompt.js';\n\nfunction normalizePackageOverrides(packages: PackageConfig[]): PackageConfig[] {\n for (const pkg of packages) {\n if (pkg.rules && Object.keys(pkg.rules).length === 0) {\n delete pkg.rules;\n }\n if (pkg.coverage && Object.keys(pkg.coverage).length === 0) {\n delete pkg.coverage;\n }\n }\n return packages;\n}\n\nfunction packageCoverageHint(\n pkg: PackageConfig,\n defaults: { testCoverage: number; coverageSummaryPath: string; coverageCommand?: string },\n): string {\n const coverage = pkg.rules?.testCoverage ?? defaults.testCoverage;\n const isExempt = coverage === 0;\n const hasSummaryOverride =\n pkg.coverage?.summaryPath !== undefined &&\n pkg.coverage.summaryPath !== defaults.coverageSummaryPath;\n const defaultCommand = defaults.coverageCommand ?? '';\n const hasCommandOverride =\n pkg.coverage?.command !== undefined && pkg.coverage.command !== defaultCommand;\n\n const tags: string[] = [];\n const nameSegments = pkg.name.replace(/^@[^/]+\\//, '').split(/[-/]/);\n const isTypesOnly = isExempt && nameSegments.some((s) => s === 'types');\n tags.push(isExempt ? (isTypesOnly ? 'exempt (types-only)' : 'exempt') : `${coverage}%`);\n if (hasSummaryOverride) tags.push('summary override');\n if (hasCommandOverride) tags.push('command override');\n return tags.join(', ');\n}\n\n/**\n * Prompt the user to edit per-package coverage overrides in a monorepo.\n * Presents a package selector followed by per-package edit menus.\n *\n * @param packages - All package configs (including root)\n * @param defaults - The shared default coverage settings\n * @returns Updated package configs with user overrides applied\n */\nexport async function promptPackageCoverageOverrides(\n packages: PackageConfig[],\n defaults: { testCoverage: number; coverageSummaryPath: string; coverageCommand?: string },\n): Promise<PackageConfig[]> {\n const editablePackages = packages.filter((pkg) => pkg.path !== '.');\n if (editablePackages.length === 0) return packages;\n\n while (true) {\n const selectedPath = await clack.select({\n message: 'Select package to edit coverage overrides',\n options: [\n ...editablePackages.map((pkg) => ({\n value: pkg.path,\n label: `${pkg.path} (${pkg.name})`,\n hint: packageCoverageHint(pkg, defaults),\n })),\n { value: '__done__', label: 'Done' },\n ],\n });\n assertNotCancelled(selectedPath);\n if (selectedPath === '__done__') break;\n\n const target = editablePackages.find((pkg) => pkg.path === selectedPath);\n if (!target) continue;\n\n while (true) {\n const effectiveCoverage: number = target.rules?.testCoverage ?? defaults.testCoverage;\n const effectiveSummary: string = target.coverage?.summaryPath ?? defaults.coverageSummaryPath;\n const effectiveCommand: string =\n target.coverage?.command ?? defaults.coverageCommand ?? '(auto-detect)';\n\n const choice: string | symbol = await clack.select({\n message: `Edit coverage overrides for ${target.path}`,\n options: [\n { value: 'testCoverage', label: 'testCoverage', hint: String(effectiveCoverage) },\n { value: 'summaryPath', label: 'coverage.summaryPath', hint: effectiveSummary },\n { value: 'command', label: 'coverage.command', hint: effectiveCommand },\n { value: 'reset', label: 'Reset this package to inherit defaults' },\n { value: 'back', label: 'Back to package list' },\n ],\n });\n assertNotCancelled(choice);\n\n if (choice === 'back') break;\n\n if (choice === 'testCoverage') {\n const result = await clack.text({\n message: 'Package testCoverage (0 to exempt package)?',\n initialValue: String(effectiveCoverage),\n validate: (v) => {\n if (typeof v !== 'string') return 'Enter a number between 0 and 100';\n const n = Number.parseInt(v, 10);\n if (Number.isNaN(n) || n < 0 || n > 100) return 'Enter a number between 0 and 100';\n },\n });\n assertNotCancelled(result);\n const nextCoverage = Number.parseInt(result, 10);\n if (nextCoverage === defaults.testCoverage) {\n if (target.rules) {\n delete target.rules.testCoverage;\n }\n } else {\n target.rules = { ...(target.rules ?? {}), testCoverage: nextCoverage };\n }\n }\n\n if (choice === 'summaryPath') {\n const result = await clack.text({\n message: 'Package coverage.summaryPath (blank to inherit default)?',\n initialValue:\n target.coverage?.summaryPath !== undefined ? target.coverage.summaryPath : '',\n placeholder: defaults.coverageSummaryPath,\n });\n assertNotCancelled(result);\n const value = result.trim();\n if (value.length === 0 || value === defaults.coverageSummaryPath) {\n if (target.coverage) {\n delete target.coverage.summaryPath;\n }\n } else {\n target.coverage = { ...(target.coverage ?? {}), summaryPath: value };\n }\n }\n\n if (choice === 'command') {\n const result = await clack.text({\n message: 'Package coverage.command (blank to inherit default/auto)?',\n initialValue: target.coverage?.command !== undefined ? target.coverage.command : '',\n placeholder: defaults.coverageCommand ?? '(auto-detect from package.json test runner)',\n });\n assertNotCancelled(result);\n const value = result.trim();\n const defaultCommand = defaults.coverageCommand ?? '';\n if (value.length === 0 || value === defaultCommand) {\n if (target.coverage) {\n delete target.coverage.command;\n }\n } else {\n target.coverage = { ...(target.coverage ?? {}), command: value };\n }\n }\n\n if (choice === 'reset') {\n if (target.rules) {\n delete target.rules.testCoverage;\n }\n delete target.coverage;\n }\n\n normalizePackageOverrides(editablePackages);\n }\n }\n\n return normalizePackageOverrides(packages);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PackageConfig, WorkspacePackage } from '@viberails/types';\n\n/**\n * Resolve WorkspacePackage[] from config packages.\n *\n * Reads each package's package.json to get the name and dependencies,\n * then filters internalDeps to only include workspace-internal packages.\n *\n * @param projectRoot - Absolute path to the project root\n * @param packages - The packages array from viberails.config.json\n * @returns Array of resolved WorkspacePackage objects\n */\nexport function resolveWorkspacePackages(\n projectRoot: string,\n packages: PackageConfig[],\n): WorkspacePackage[] {\n const resolved: WorkspacePackage[] = [];\n\n for (const pkgConfig of packages) {\n if (pkgConfig.path === '.') continue; // Skip root package\n const relativePath = pkgConfig.path;\n const absPath = path.join(projectRoot, relativePath);\n const pkgJsonPath = path.join(absPath, 'package.json');\n\n if (!fs.existsSync(pkgJsonPath)) continue;\n\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n } catch {\n continue;\n }\n\n const name = pkg.name as string;\n if (!name) continue;\n\n const allDeps = [\n ...Object.keys((pkg.dependencies as Record<string, unknown>) ?? {}),\n ...Object.keys((pkg.devDependencies as Record<string, unknown>) ?? {}),\n ];\n\n resolved.push({ name, path: absPath, relativePath, internalDeps: allDeps });\n }\n\n // Filter internalDeps to only workspace-internal package names\n const packageNames = new Set(resolved.map((p) => p.name));\n for (const pkg of resolved) {\n pkg.internalDeps = pkg.internalDeps.filter((dep) => packageNames.has(dep));\n }\n\n return resolved;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { loadConfig } from '@viberails/config';\nimport type { CheckViolation } from '@viberails/types';\nimport chalk from 'chalk';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { resolveWorkspacePackages } from '../utils/resolve-workspace-packages.js';\nimport { resolveConfigForFile, resolveIgnoreForFile } from './check-config.js';\nimport { checkCoverage } from './check-coverage.js';\nimport {\n checkNaming,\n countFileLines,\n getAllSourceFiles,\n getDiffFiles,\n getStagedFiles,\n isIgnored,\n SOURCE_EXTS,\n} from './check-files.js';\nimport { checkMissingTests } from './check-tests.js';\n\nexport { resolveConfigForFile } from './check-config.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\nexport interface CheckOptions {\n files?: string[];\n staged?: boolean;\n diffBase?: string;\n noBoundaries?: boolean;\n quiet?: boolean;\n limit?: number;\n format?: 'text' | 'json';\n enforce?: boolean;\n hook?: boolean;\n}\n\n/** Check if a file path looks like a test file. */\nfunction isTestFile(relPath: string): boolean {\n const filename = path.basename(relPath);\n return (\n filename.includes('.test.') ||\n filename.includes('.spec.') ||\n filename.startsWith('test.') ||\n filename.startsWith('spec.') ||\n relPath.includes('__tests__/') ||\n relPath.includes('__test__/')\n );\n}\n\n/**\n * Print violations grouped by rule type with counts.\n */\nfunction printGroupedViolations(violations: CheckViolation[], limit?: number): void {\n const groups = new Map<string, CheckViolation[]>();\n for (const v of violations) {\n const existing = groups.get(v.rule) ?? [];\n existing.push(v);\n groups.set(v.rule, existing);\n }\n\n const ruleOrder = [\n 'file-size',\n 'file-naming',\n 'missing-test',\n 'test-coverage',\n 'boundary-violation',\n ];\n const sortedKeys = [...groups.keys()].sort(\n (a, b) =>\n (ruleOrder.indexOf(a) === -1 ? 99 : ruleOrder.indexOf(a)) -\n (ruleOrder.indexOf(b) === -1 ? 99 : ruleOrder.indexOf(b)),\n );\n\n let totalShown = 0;\n const totalLimit = limit ?? Number.POSITIVE_INFINITY;\n\n for (const rule of sortedKeys) {\n const group = groups.get(rule);\n if (!group) continue;\n const remaining = totalLimit - totalShown;\n if (remaining <= 0) break;\n\n const toShow = group.slice(0, remaining);\n const hidden = group.length - toShow.length;\n\n for (const v of toShow) {\n const icon = v.severity === 'error' ? chalk.red('✗') : chalk.yellow('!');\n console.log(`${icon} ${chalk.dim(v.rule)} ${v.file}: ${v.message}`);\n }\n totalShown += toShow.length;\n\n if (hidden > 0) {\n console.log(chalk.dim(` ... and ${hidden} more ${rule} violations`));\n }\n }\n}\n\n/**\n * Print a summary of violations by rule type.\n */\nfunction printSummary(violations: CheckViolation[]): void {\n const counts = new Map<string, number>();\n for (const v of violations) {\n counts.set(v.rule, (counts.get(v.rule) ?? 0) + 1);\n }\n\n const word = violations.length === 1 ? 'violation' : 'violations';\n const parts = [...counts.entries()].map(([rule, count]) => `${count} ${rule}`);\n console.log(`\\n${violations.length} ${word} found (${parts.join(', ')}).`);\n}\n\n/**\n * Run the viberails check command.\n * Returns exit code: 0 = pass or warn-mode, 1 = violations in enforce mode.\n */\nexport async function checkCommand(options: CheckOptions, cwd?: string): Promise<number> {\n const startDir = cwd ?? process.cwd();\n\n const projectRoot = findProjectRoot(startDir);\n if (!projectRoot) {\n console.error(`${chalk.red('Error:')} No package.json found. Are you in a JS/TS project?`);\n return 1;\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (!fs.existsSync(configPath)) {\n console.error(\n `${chalk.red('Error:')} No viberails.config.json found. Run \\`viberails init\\` first.`,\n );\n return 1;\n }\n\n const config = await loadConfig(configPath);\n\n // Determine which files to check\n let filesToCheck: string[];\n let diffAddedFiles: Set<string> | null = null;\n if (options.staged) {\n filesToCheck = getStagedFiles(projectRoot);\n } else if (options.diffBase) {\n const diff = getDiffFiles(projectRoot, options.diffBase);\n filesToCheck = diff.all.filter((f) => SOURCE_EXTS.has(path.extname(f)));\n diffAddedFiles = new Set(diff.added);\n } else if (options.files && options.files.length > 0) {\n filesToCheck = options.files;\n } else {\n filesToCheck = getAllSourceFiles(projectRoot, config);\n }\n\n if (filesToCheck.length === 0) {\n if (options.format === 'json') {\n console.log(JSON.stringify({ violations: [], checkedFiles: 0 }));\n } else {\n console.log(`${chalk.green('✓')} No files to check.`);\n }\n return 0;\n }\n\n const violations: CheckViolation[] = [];\n const severity = options.enforce ? 'error' : 'warn';\n const log =\n options.format !== 'json' && !options.hook\n ? (msg: string) => process.stderr.write(chalk.dim(msg))\n : () => {};\n\n log(' Checking files...');\n for (const file of filesToCheck) {\n const absPath = path.isAbsolute(file) ? file : path.join(projectRoot, file);\n const relPath = path.relative(projectRoot, absPath);\n\n const effectiveIgnore = resolveIgnoreForFile(relPath, config);\n if (isIgnored(relPath, effectiveIgnore)) continue;\n if (!fs.existsSync(absPath)) continue;\n\n const resolved = resolveConfigForFile(relPath, config);\n\n // Check 1: File size (with separate threshold for test files)\n const testFile = isTestFile(relPath);\n const maxLines = testFile ? resolved.rules.maxTestFileLines : resolved.rules.maxFileLines;\n if (maxLines > 0) {\n const lines = countFileLines(absPath);\n if (lines !== null && lines > maxLines) {\n violations.push({\n file: relPath,\n rule: 'file-size',\n message: `${lines} lines (max ${maxLines}). Split into focused modules.`,\n severity,\n });\n }\n }\n\n // Check 2: File naming convention\n if (resolved.rules.enforceNaming && resolved.conventions.fileNaming) {\n const namingViolation = checkNaming(relPath, resolved.conventions);\n if (namingViolation) {\n violations.push({\n file: relPath,\n rule: 'file-naming',\n message: namingViolation,\n severity,\n });\n }\n }\n }\n\n log(' done\\n');\n\n // Check 3: Missing tests (full check or diff-base with added files only)\n if (!options.staged && !options.files) {\n log(' Checking missing tests...');\n const testViolations = checkMissingTests(projectRoot, config, severity);\n violations.push(\n ...(diffAddedFiles\n ? testViolations.filter((v) => diffAddedFiles.has(v.file))\n : testViolations),\n );\n log(' done\\n');\n }\n\n // Check 4: Test coverage threshold (full check only, skip in diff mode)\n if (!options.files && !options.staged && !options.diffBase) {\n log(' Running test coverage...\\n');\n const coverageViolations = checkCoverage(projectRoot, config, filesToCheck, {\n staged: options.staged,\n enforce: options.enforce,\n onProgress: (pkg) => log(` Coverage: ${pkg}...\\n`),\n });\n violations.push(...coverageViolations);\n }\n\n // Check 5: Boundary violations\n if (\n config.rules.enforceBoundaries &&\n config.boundaries &&\n Object.keys(config.boundaries.deny).length > 0 &&\n !options.noBoundaries\n ) {\n const startTime = Date.now();\n const { buildImportGraph, checkBoundaries } = await import('@viberails/graph');\n\n const packages =\n config.packages.length > 1\n ? resolveWorkspacePackages(projectRoot, config.packages)\n : undefined;\n\n const graph = await buildImportGraph(projectRoot, {\n packages,\n ignore: config.ignore,\n });\n\n const boundaryViolations = checkBoundaries(graph, config.boundaries);\n\n // In staged/files/diff mode, only report violations in those files\n const filterSet =\n options.staged || options.files || options.diffBase\n ? new Set(filesToCheck.map((f) => path.resolve(projectRoot, f)))\n : null;\n\n for (const bv of boundaryViolations) {\n if (filterSet && !filterSet.has(bv.file)) continue;\n\n const relFile = path.relative(projectRoot, bv.file);\n violations.push({\n file: relFile,\n rule: 'boundary-violation',\n message: `Imports \"${bv.specifier}\" violating boundary: ${bv.rule.from} → ${bv.rule.to}`,\n severity,\n });\n }\n\n log(` Boundary check: ${graph.nodes.length} files in ${Date.now() - startTime}ms\\n`);\n }\n\n // Output results\n if (options.format === 'json') {\n console.log(\n JSON.stringify({\n violations,\n checkedFiles: filesToCheck.length,\n }),\n );\n return options.enforce && violations.length > 0 ? 1 : 0;\n }\n\n if (violations.length === 0) {\n console.log(`${chalk.green('✓')} ${filesToCheck.length} files checked — no violations`);\n return 0;\n }\n\n if (!options.quiet) {\n printGroupedViolations(violations, options.limit);\n }\n\n printSummary(violations);\n\n if (options.enforce) {\n console.log(chalk.red('Fix violations before committing.'));\n return 1;\n }\n\n return 0;\n}\n","import { BUILTIN_IGNORE } from '@viberails/config';\nimport type {\n ConfigConventions,\n ConfigCoverage,\n ConfigRules,\n ViberailsConfig,\n} from '@viberails/types';\n\nexport interface ResolvedConfig {\n rules: ConfigRules;\n conventions: ConfigConventions;\n coverage: ConfigCoverage;\n}\n\n/**\n * Resolve the effective config for a file by finding its package.\n * Returns the global rules merged with any matching package overrides.\n */\nexport function resolveConfigForFile(relPath: string, config: ViberailsConfig): ResolvedConfig {\n // Sort by path length descending to match the most specific package first\n const sortedPackages = [...config.packages].sort((a, b) => b.path.length - a.path.length);\n\n for (const pkg of sortedPackages) {\n if (pkg.path === '.') continue; // Check non-root packages first\n if (relPath.startsWith(`${pkg.path}/`) || relPath === pkg.path) {\n return {\n rules: { ...config.rules, ...pkg.rules },\n conventions: pkg.conventions ?? {},\n coverage: {\n ...(config.defaults?.coverage ?? {}),\n ...(pkg.coverage ?? {}),\n },\n };\n }\n }\n\n // Fall back to root package\n const root = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n return {\n rules: { ...config.rules, ...root.rules },\n conventions: root.conventions ?? {},\n coverage: {\n ...(config.defaults?.coverage ?? {}),\n ...(root.coverage ?? {}),\n },\n };\n}\n\n/**\n * Get effective ignore patterns: BUILTIN_IGNORE + config.ignore + package-specific.\n */\nexport function getEffectiveIgnore(config: ViberailsConfig): string[] {\n return [...BUILTIN_IGNORE, ...(config.ignore ?? [])];\n}\n\n/**\n * Resolve ignore patterns for a file, appending any package-specific patterns.\n */\nexport function resolveIgnoreForFile(relPath: string, config: ViberailsConfig): string[] {\n const base = getEffectiveIgnore(config);\n const root = config.packages.find((p) => p.path === '.');\n const withRoot = root?.ignore ? [...base, ...root.ignore] : base;\n\n const matched = [...config.packages]\n .filter((p) => p.path !== '.')\n .sort((a, b) => b.path.length - a.path.length)\n .find((p) => relPath.startsWith(`${p.path}/`) || relPath === p.path);\n\n if (matched?.ignore) {\n return [...withRoot, ...matched.ignore];\n }\n\n return withRoot;\n}\n","import { spawnSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { inferCoverageCommand } from '@viberails/config';\nimport type {\n CheckViolation,\n ConfigCoverage,\n ConfigRules,\n PackageConfig,\n ViberailsConfig,\n} from '@viberails/types';\n\nconst DEFAULT_SUMMARY_PATH = 'coverage/coverage-summary.json';\n\ninterface ResolvedPackageCoverage {\n pkg: PackageConfig;\n rules: ConfigRules;\n coverage: ConfigCoverage;\n}\n\ninterface CoverageSummary {\n total?: {\n lines?: {\n pct?: number;\n };\n };\n}\n\nfunction packageRoot(projectRoot: string, pkg: PackageConfig): string {\n return pkg.path === '.' ? projectRoot : path.join(projectRoot, pkg.path);\n}\n\nfunction resolveForPackage(config: ViberailsConfig, pkg: PackageConfig): ResolvedPackageCoverage {\n return {\n pkg,\n rules: { ...config.rules, ...pkg.rules },\n coverage: {\n ...(config.defaults?.coverage ?? {}),\n ...(pkg.coverage ?? {}),\n },\n };\n}\n\nfunction resolveCoveragePackages(\n projectRoot: string,\n config: ViberailsConfig,\n filesToCheck: string[],\n staged: boolean,\n): ResolvedPackageCoverage[] {\n if (!staged) {\n return config.packages.map((pkg) => resolveForPackage(config, pkg));\n }\n\n const matched = new Map<string, ResolvedPackageCoverage>();\n for (const raw of filesToCheck) {\n const relPath = path.isAbsolute(raw) ? path.relative(projectRoot, raw) : raw;\n const sorted = [...config.packages]\n .filter((pkg) => pkg.path !== '.')\n .sort((a, b) => b.path.length - a.path.length);\n const pkg =\n sorted.find(\n (candidate) => relPath.startsWith(`${candidate.path}/`) || relPath === candidate.path,\n ) ??\n config.packages.find((candidate) => candidate.path === '.') ??\n config.packages[0];\n matched.set(pkg.path, resolveForPackage(config, pkg));\n }\n return [...matched.values()];\n}\n\nfunction readCoveragePercentage(summaryPath: string): number | undefined {\n try {\n const parsed = JSON.parse(fs.readFileSync(summaryPath, 'utf-8')) as CoverageSummary;\n const pct = parsed.total?.lines?.pct;\n return typeof pct === 'number' ? pct : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction runCoverageCommand(pkgRoot: string, command: string): { ok: boolean; detail?: string } {\n const result = spawnSync(command, {\n cwd: pkgRoot,\n shell: true,\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n if (result.status === 0) return { ok: true };\n const stderr = result.stderr?.trim() ?? '';\n const stdout = result.stdout?.trim() ?? '';\n const raw = stderr || stdout || `exit code ${result.status ?? 1}`;\n\n // Detect missing vitest coverage provider\n if (\n raw.includes('coverage-v8') ||\n raw.includes('coverage-istanbul') ||\n raw.includes('MISSING DEP')\n ) {\n return {\n ok: false,\n detail: 'Missing coverage provider. Install with: npm install -D @vitest/coverage-v8',\n };\n }\n\n // Strip ANSI codes from error output\n // biome-ignore lint/suspicious/noControlCharactersInRegex: stripping ANSI escape sequences\n const detail = raw.replace(/\\x1B\\[[0-9;]*m/g, '');\n return { ok: false, detail };\n}\n\nfunction violationFilePath(projectRoot: string, pkgRoot: string, summaryPath: string): string {\n return path.relative(projectRoot, path.join(pkgRoot, summaryPath));\n}\n\nfunction pushViolation(\n violations: CheckViolation[],\n file: string,\n message: string,\n severity: 'warn' | 'error',\n): void {\n violations.push({\n file,\n rule: 'test-coverage',\n message,\n severity,\n });\n}\n\nexport function checkCoverage(\n projectRoot: string,\n config: ViberailsConfig,\n filesToCheck: string[],\n options: { staged?: boolean; enforce?: boolean; onProgress?: (pkg: string) => void },\n): CheckViolation[] {\n const severity: 'warn' | 'error' = options.enforce ? 'error' : 'warn';\n const targets = resolveCoveragePackages(\n projectRoot,\n config,\n filesToCheck,\n options.staged === true,\n );\n const violations: CheckViolation[] = [];\n\n for (const target of targets) {\n if (target.rules.testCoverage <= 0) continue;\n\n // Skip packages that have no test runner — they can't produce coverage\n if (!target.pkg.stack?.testRunner) continue;\n\n const pkgRoot = packageRoot(projectRoot, target.pkg);\n const summaryPath = target.coverage.summaryPath ?? DEFAULT_SUMMARY_PATH;\n const summaryAbs = path.join(pkgRoot, summaryPath);\n const summaryRel = violationFilePath(projectRoot, pkgRoot, summaryPath);\n\n let pct = readCoveragePercentage(summaryAbs);\n\n if (pct === undefined && !options.staged) {\n // Use explicit command, or infer from this package's test runner\n const command = target.coverage.command ?? inferCoverageCommand(target.pkg.stack.testRunner);\n if (!command) {\n const pkgLabel = target.pkg.path === '.' ? 'root package' : target.pkg.path;\n pushViolation(\n violations,\n summaryRel,\n `No coverage summary found for \"${pkgLabel}\". Run your test suite with coverage enabled, or set defaults.coverage.command in viberails.config.json.`,\n severity,\n );\n continue;\n }\n\n options.onProgress?.(target.pkg.path === '.' ? 'root' : target.pkg.path);\n const run = runCoverageCommand(pkgRoot, command);\n if (!run.ok) {\n pushViolation(\n violations,\n summaryRel,\n `Failed to run coverage command: ${run.detail}.`,\n severity,\n );\n continue;\n }\n\n pct = readCoveragePercentage(summaryAbs);\n }\n\n if (pct === undefined) {\n pushViolation(\n violations,\n summaryRel,\n `Coverage summary not found or invalid at \\`${summaryPath}\\`.`,\n severity,\n );\n continue;\n }\n\n if (pct < target.rules.testCoverage) {\n pushViolation(\n violations,\n summaryRel,\n `Line coverage ${pct.toFixed(1)}% is below required ${target.rules.testCoverage}%.`,\n severity,\n );\n }\n }\n\n return violations;\n}\n","import { execSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { BUILTIN_IGNORE } from '@viberails/config';\nimport type { ConfigConventions, ViberailsConfig } from '@viberails/types';\nimport picomatch from 'picomatch';\n\nconst ALWAYS_SKIP_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n '.next',\n '.expo',\n '.output',\n '.svelte-kit',\n '.turbo',\n 'coverage',\n 'public',\n 'vendor',\n '__generated__',\n 'generated',\n '.viberails',\n]);\n\nexport const SOURCE_EXTS = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.vue',\n '.svelte',\n '.astro',\n]);\n\nexport const NAMING_PATTERNS: Record<string, RegExp> = {\n 'kebab-case': /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/,\n camelCase: /^[a-z][a-zA-Z0-9]*$/,\n PascalCase: /^[A-Z][a-zA-Z0-9]*$/,\n snake_case: /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,\n};\n\n/** Check if a path matches any ignore pattern. */\nexport function isIgnored(relPath: string, ignorePatterns: string[]): boolean {\n if (ignorePatterns.length === 0) return false;\n const isMatch = picomatch(ignorePatterns, { dot: true });\n return isMatch(relPath);\n}\n\n/** Count lines in a file. Returns null if the file can't be read. */\nexport function countFileLines(filePath: string): number | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n if (content.length === 0) return 0;\n let count = 1;\n for (let i = 0; i < content.length; i++) {\n if (content.charCodeAt(i) === 10) count++;\n }\n return count;\n } catch {\n return null;\n }\n}\n\n/** Check whether a file's name violates the configured naming convention. */\nexport function checkNaming(relPath: string, conventions: ConfigConventions): string | undefined {\n const filename = path.basename(relPath);\n\n // Skip non-source files\n const ext = path.extname(filename);\n if (!SOURCE_EXTS.has(ext)) return undefined;\n\n // Skip special files\n if (\n filename.startsWith('index.') ||\n filename.includes('.config.') ||\n filename.includes('.test.') ||\n filename.includes('.spec.') ||\n filename.startsWith('.') ||\n filename.startsWith('_') ||\n filename.startsWith('+') ||\n filename.startsWith('$') ||\n filename.startsWith('[')\n ) {\n return undefined;\n }\n\n const bare = filename.slice(0, filename.indexOf('.'));\n const convention = conventions.fileNaming;\n if (!convention) return undefined;\n\n const pattern = NAMING_PATTERNS[convention];\n if (!pattern || pattern.test(bare)) return undefined;\n\n return `File name \"${filename}\" does not follow ${convention} convention.`;\n}\n\n/** Get staged files from git. */\nexport function getStagedFiles(projectRoot: string): string[] {\n try {\n const output = execSync('git diff --cached --name-only --diff-filter=ACM', {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return output.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/** Get files changed between a base ref and HEAD. */\nexport function getDiffFiles(\n projectRoot: string,\n base: string,\n): { all: string[]; added: string[] } {\n try {\n const allOutput = execSync(`git diff --name-only --diff-filter=ACMR ${base}...HEAD`, {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n const addedOutput = execSync(`git diff --name-only --diff-filter=A ${base}...HEAD`, {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return {\n all: allOutput.trim().split('\\n').filter(Boolean),\n added: addedOutput.trim().split('\\n').filter(Boolean),\n };\n } catch {\n return { all: [], added: [] };\n }\n}\n\n/** Get all source files in the project. */\nexport function getAllSourceFiles(projectRoot: string, config: ViberailsConfig): string[] {\n const effectiveIgnore = [...BUILTIN_IGNORE, ...(config.ignore ?? [])];\n const files: string[] = [];\n const walk = (dir: string) => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const rel = path.relative(projectRoot, path.join(dir, entry.name));\n if (entry.isDirectory()) {\n if (ALWAYS_SKIP_DIRS.has(entry.name)) {\n continue;\n }\n if (isIgnored(rel, effectiveIgnore)) continue;\n walk(path.join(dir, entry.name));\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n if (SOURCE_EXTS.has(ext) && !isIgnored(rel, effectiveIgnore)) {\n files.push(rel);\n }\n }\n }\n };\n walk(projectRoot);\n return files;\n}\n\n/** Collect source files from a directory recursively. */\nexport function collectSourceFiles(dir: string, projectRoot: string): string[] {\n const files: string[] = [];\n const walk = (d: string) => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(d, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules') continue;\n walk(path.join(d, entry.name));\n } else if (entry.isFile()) {\n files.push(path.relative(projectRoot, path.join(d, entry.name)));\n }\n }\n };\n walk(dir);\n return files;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { CheckViolation, PackageConfig, ViberailsConfig } from '@viberails/types';\nimport { collectSourceFiles } from './check-files.js';\n\nconst SOURCE_EXTS = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.vue',\n '.svelte',\n '.astro',\n]);\n\n/** Check for source files without corresponding test files. */\nexport function checkMissingTests(\n projectRoot: string,\n config: ViberailsConfig,\n severity: 'error' | 'warn',\n): CheckViolation[] {\n const violations: CheckViolation[] = [];\n for (const pkg of config.packages) {\n const effectiveRules = { ...config.rules, ...pkg.rules };\n const enforceMissing = effectiveRules.enforceMissingTests ?? effectiveRules.testCoverage > 0;\n if (!enforceMissing) continue;\n\n const testPattern = pkg.structure?.testPattern;\n const srcDir = pkg.structure?.srcDir;\n if (!testPattern || !srcDir) continue;\n\n const packageRoot = pkg.path === '.' ? projectRoot : path.join(projectRoot, pkg.path);\n const srcPath = path.join(packageRoot, srcDir);\n if (!fs.existsSync(srcPath)) continue;\n\n const testSuffix = testPattern.replace('*', '');\n const sourceFiles = collectSourceFiles(srcPath, projectRoot);\n\n for (const relFile of sourceFiles) {\n const basename = path.basename(relFile);\n\n // Skip test files, index files, type definition files\n if (\n basename.includes('.test.') ||\n basename.includes('.spec.') ||\n basename.startsWith('index.') ||\n basename.endsWith('.d.ts')\n ) {\n continue;\n }\n\n const ext = path.extname(basename);\n if (!SOURCE_EXTS.has(ext)) continue;\n\n const stem = basename.slice(0, -ext.length);\n const expectedTestFile = `${stem}${testSuffix}`;\n\n // Look for the test file next to the source or in the package tests directory\n const dir = path.dirname(path.join(projectRoot, relFile));\n const colocatedTest = path.join(dir, expectedTestFile);\n const testsDir = pkg.structure?.tests;\n const dedicatedTest = testsDir ? path.join(packageRoot, testsDir, expectedTestFile) : null;\n\n const hasTest =\n fs.existsSync(colocatedTest) || (dedicatedTest !== null && fs.existsSync(dedicatedTest));\n\n if (!hasTest) {\n violations.push({\n file: relFile,\n rule: 'missing-test',\n message: `No test file found. Expected \\`${expectedTestFile}\\`.`,\n severity,\n });\n }\n }\n }\n\n return violations;\n}\n\nexport function resolvePackageForFile(\n sourceRelPath: string,\n config: ViberailsConfig,\n): PackageConfig | undefined {\n const sorted = [...config.packages]\n .filter((p) => p.path !== '.')\n .sort((a, b) => b.path.length - a.path.length);\n for (const pkg of sorted) {\n if (sourceRelPath.startsWith(`${pkg.path}/`) || sourceRelPath === pkg.path) {\n return pkg;\n }\n }\n return config.packages.find((p) => p.path === '.') ?? config.packages[0];\n}\n","import * as fs from 'node:fs';\nimport { checkCommand } from './check.js';\n\n/**\n * Parse a file path from Claude Code hook stdin JSON.\n * The PostToolUse hook receives `{ tool_input: { file_path: \"...\" } }` on stdin.\n * Returns the file path or undefined if input is empty/malformed.\n */\nexport function parseHookFilePath(input: string): string | undefined {\n try {\n if (!input.trim()) return undefined;\n const parsed = JSON.parse(input);\n return parsed?.tool_input?.file_path ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readStdin(): string {\n try {\n return fs.readFileSync(0, 'utf-8');\n } catch {\n return '';\n }\n}\n\n/**\n * Run viberails check in Claude Code hook mode.\n *\n * Reads the edited file path from stdin JSON, runs the check,\n * and outputs violation JSON to stderr so Claude sees feedback.\n * Returns exit code 2 if violations found, 0 otherwise.\n * Never throws — errors silently pass to avoid blocking Claude.\n */\nexport async function hookCheckCommand(cwd?: string): Promise<number> {\n try {\n const filePath = parseHookFilePath(readStdin());\n if (!filePath) return 0;\n\n // Redirect stdout to capture checkCommand's JSON output\n const originalWrite = process.stdout.write.bind(process.stdout);\n let captured = '';\n process.stdout.write = (chunk: string | Uint8Array): boolean => {\n captured += typeof chunk === 'string' ? chunk : chunk.toString();\n return true;\n };\n\n try {\n await checkCommand({ files: [filePath], format: 'json' }, cwd);\n } finally {\n process.stdout.write = originalWrite;\n }\n\n if (!captured.trim()) return 0;\n\n const result = JSON.parse(captured);\n if (result.violations?.length > 0) {\n process.stderr.write(`${captured.trim()}\\n`);\n return 2;\n }\n\n return 0;\n } catch {\n // Never block Claude on internal errors\n return 0;\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport { compactConfig, loadConfig, mergeConfig } from '@viberails/config';\nimport { scan } from '@viberails/scanner';\nimport chalk from 'chalk';\nimport { formatRulesText } from '../display-text.js';\nimport { applyRuleOverrides } from '../utils/apply-rule-overrides.js';\nimport { diffConfigs } from '../utils/diff-configs.js';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { confirm, promptRuleMenu } from '../utils/prompt.js';\nimport { resolveWorkspacePackages } from '../utils/resolve-workspace-packages.js';\nimport { writeGeneratedFiles } from '../utils/write-generated-files.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\n/**\n * Run the viberails config command: interactively edit existing config rules.\n *\n * @param options - Command options\n * @param cwd - Working directory override (for testing)\n */\nexport async function configCommand(options: { rescan?: boolean }, cwd?: string): Promise<void> {\n const projectRoot = findProjectRoot(cwd ?? process.cwd());\n if (!projectRoot) {\n throw new Error('No package.json found. Make sure you are inside a JS/TS project.');\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (!fs.existsSync(configPath)) {\n console.log(`${chalk.yellow('!')} No config found. Run ${chalk.cyan('viberails init')} first.`);\n return;\n }\n\n clack.intro('viberails config');\n\n const config = await loadConfig(configPath);\n let scanResult = options.rescan ? await rescanAndMerge(projectRoot, config) : undefined;\n\n // Show current rules\n clack.note(formatRulesText(config).join('\\n'), 'Current rules');\n\n // Open rule menu with current values\n const rootPkg = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const overrides = await promptRuleMenu({\n maxFileLines: config.rules.maxFileLines,\n testCoverage: config.rules.testCoverage,\n enforceMissingTests: config.rules.enforceMissingTests,\n enforceNaming: config.rules.enforceNaming,\n fileNamingValue: rootPkg.conventions?.fileNaming,\n coverageSummaryPath: rootPkg.coverage?.summaryPath ?? 'coverage/coverage-summary.json',\n coverageCommand: config.defaults?.coverage?.command,\n packageOverrides: config.packages,\n });\n\n applyRuleOverrides(config, overrides);\n\n // Re-infer boundaries if rescan on a monorepo\n if (options.rescan && config.packages.length > 1) {\n const shouldInfer = await confirm('Re-infer boundary rules from import patterns?');\n if (shouldInfer) {\n const bs = clack.spinner();\n bs.start('Building import graph...');\n const { buildImportGraph, inferBoundaries } = await import('@viberails/graph');\n const packages = resolveWorkspacePackages(projectRoot, config.packages);\n const graph = await buildImportGraph(projectRoot, { packages, ignore: config.ignore });\n const inferred = inferBoundaries(graph);\n const denyCount = Object.values(inferred.deny).reduce((sum, arr) => sum + arr.length, 0);\n if (denyCount > 0) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n bs.stop(`Inferred ${denyCount} boundary rules`);\n } else {\n bs.stop('No boundary rules inferred');\n }\n }\n }\n\n // Confirm and write\n const shouldWrite = await confirm('Save updated configuration?');\n if (!shouldWrite) {\n clack.outro('No changes written.');\n return;\n }\n\n const compacted = compactConfig(config);\n fs.writeFileSync(configPath, `${JSON.stringify(compacted, null, 2)}\\n`);\n\n // Regenerate context files (need scan result)\n if (!scanResult) {\n const s = clack.spinner();\n s.start('Scanning for context generation...');\n scanResult = await scan(projectRoot);\n s.stop('Scan complete');\n }\n\n writeGeneratedFiles(projectRoot, config, scanResult);\n\n clack.log.success(\n `Updated:\\n ${CONFIG_FILE}\\n .viberails/context.md\\n .viberails/scan-result.json`,\n );\n clack.outro('Done! Run viberails check to verify.');\n}\n\nasync function rescanAndMerge(\n projectRoot: string,\n config: import('@viberails/types').ViberailsConfig,\n): Promise<import('@viberails/types').ScanResult> {\n const s = clack.spinner();\n s.start('Re-scanning project...');\n const scanResult = await scan(projectRoot);\n const merged = mergeConfig(config, scanResult);\n s.stop('Scan complete');\n\n // Show diff if anything changed\n const changes = diffConfigs(config, merged);\n if (changes.length > 0) {\n const changeLines = changes\n .map((c) => {\n const icon = c.type === 'removed' ? '-' : '+';\n return `${icon} ${c.description}`;\n })\n .join('\\n');\n clack.note(changeLines, 'Changes detected');\n } else {\n clack.log.info('No new changes detected from scan.');\n }\n\n // Apply merged values back\n Object.assign(config, merged);\n\n return scanResult;\n}\n","import type { DetectedConvention, ScanResult, ViberailsConfig } from '@viberails/types';\nimport {\n CONVENTION_LABELS,\n FRAMEWORK_NAMES,\n LIBRARY_NAMES,\n ORM_NAMES,\n STYLING_NAMES,\n} from '@viberails/types';\nimport { formatItem } from './display.js';\nimport {\n formatExtensions,\n formatRoleGroup,\n formatSummary,\n groupByRole,\n} from './display-helpers.js';\nimport { formatMonorepoResultsText } from './display-monorepo.js';\n\n// Conventions are plain strings — no extraction needed.\n\n/**\n * Format a plain-text confidence label (no chalk).\n */\nfunction plainConfidenceLabel(convention: DetectedConvention): string {\n const pct = Math.round(convention.consistency);\n if (convention.confidence === 'high') {\n return `${pct}%`;\n }\n return `${pct}%, suggested only`;\n}\n\n/**\n * Build conventions section as plain text lines.\n */\nexport function formatConventionsText(scanResult: ScanResult): string[] {\n const lines: string[] = [];\n const conventionEntries = Object.entries(scanResult.conventions);\n if (conventionEntries.length === 0) return lines;\n\n lines.push('');\n lines.push('Conventions:');\n for (const [key, convention] of conventionEntries) {\n if (convention.confidence === 'low') continue;\n const label = CONVENTION_LABELS[key] ?? key;\n\n if (scanResult.packages.length > 1) {\n const pkgValues = scanResult.packages\n .filter((pkg) => pkg.conventions[key] && pkg.conventions[key].confidence !== 'low')\n .map((pkg) => ({ relativePath: pkg.relativePath, convention: pkg.conventions[key] }));\n\n const allSame = pkgValues.every((pv) => pv.convention.value === convention.value);\n\n if (allSame || pkgValues.length <= 1) {\n const ind = convention.confidence === 'high' ? '\\u2713' : '~';\n lines.push(` ${ind} ${label}: ${convention.value} (${plainConfidenceLabel(convention)})`);\n } else {\n lines.push(` ~ ${label}: varies by package`);\n for (const pv of pkgValues) {\n const pct = Math.round(pv.convention.consistency);\n lines.push(` ${pv.relativePath}: ${pv.convention.value} (${pct}%)`);\n }\n }\n } else {\n const ind = convention.confidence === 'high' ? '\\u2713' : '~';\n lines.push(` ${ind} ${label}: ${convention.value} (${plainConfidenceLabel(convention)})`);\n }\n }\n return lines;\n}\n\n/**\n * Build rules preview as plain text lines.\n */\nexport function formatRulesText(config: ViberailsConfig): string[] {\n const root = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const isMonorepo = config.packages.length > 1;\n const lines: string[] = [];\n lines.push(`Max file size: ${config.rules.maxFileLines} lines`);\n\n if (config.rules.testCoverage > 0) {\n const label = isMonorepo ? 'Default coverage target' : 'Test coverage target';\n const suffix = isMonorepo ? ' (per-package)' : '';\n lines.push(`${label}: ${config.rules.testCoverage}%${suffix}`);\n } else {\n lines.push('Test coverage target: disabled');\n }\n\n const enforceMissing = config.rules.enforceMissingTests ?? config.rules.testCoverage > 0;\n if (enforceMissing && root?.structure?.testPattern) {\n lines.push(`Enforce missing tests: yes (${root.structure.testPattern})`);\n } else {\n lines.push('Enforce missing tests: no');\n }\n\n if (config.rules.enforceNaming && root?.conventions?.fileNaming) {\n lines.push(`Enforce file naming: ${root.conventions.fileNaming}`);\n } else {\n lines.push('Enforce file naming: no');\n }\n\n return lines;\n}\n\n/**\n * Build scan results as a multi-line string for clack.note().\n * Returns plain text without chalk colors.\n *\n * @param scanResult - The scan result to format\n * @param config - The generated config (for rules preview)\n * @returns Formatted multi-line string\n */\nexport function formatScanResultsText(scanResult: ScanResult): string {\n if (scanResult.packages.length > 1) {\n return formatMonorepoResultsText(scanResult);\n }\n\n const lines: string[] = [];\n const { stack } = scanResult;\n\n lines.push('Detected:');\n if (stack.framework) {\n lines.push(` \\u2713 ${formatItem(stack.framework, FRAMEWORK_NAMES)}`);\n }\n lines.push(` \\u2713 ${formatItem(stack.language)}`);\n if (stack.styling) {\n lines.push(` \\u2713 ${formatItem(stack.styling, STYLING_NAMES)}`);\n }\n if (stack.backend) {\n lines.push(` \\u2713 ${formatItem(stack.backend, FRAMEWORK_NAMES)}`);\n }\n if (stack.orm) {\n lines.push(` \\u2713 ${formatItem(stack.orm, ORM_NAMES)}`);\n }\n\n // Compact secondary tools line\n const secondaryParts: string[] = [];\n if (stack.packageManager) secondaryParts.push(formatItem(stack.packageManager));\n if (stack.linter) secondaryParts.push(formatItem(stack.linter));\n if (stack.formatter) secondaryParts.push(formatItem(stack.formatter));\n if (stack.testRunner) secondaryParts.push(formatItem(stack.testRunner));\n if (secondaryParts.length > 0) {\n lines.push(` \\u2713 ${secondaryParts.join(' \\u00b7 ')}`);\n }\n\n if (stack.libraries.length > 0) {\n for (const lib of stack.libraries) {\n lines.push(` \\u2713 ${formatItem(lib, LIBRARY_NAMES)}`);\n }\n }\n\n // Structure\n const groups = groupByRole(scanResult.structure.directories);\n if (groups.length > 0) {\n lines.push('');\n lines.push('Structure:');\n for (const group of groups) {\n lines.push(` \\u2713 ${formatRoleGroup(group)}`);\n }\n }\n\n // Conventions\n lines.push(...formatConventionsText(scanResult));\n\n // Summary stats\n const pkgCount = scanResult.packages.length > 1 ? scanResult.packages.length : undefined;\n lines.push('');\n lines.push(formatSummary(scanResult.statistics, pkgCount));\n const ext = formatExtensions(scanResult.statistics.filesByExtension);\n if (ext) {\n lines.push(ext);\n }\n\n return lines.join('\\n');\n}\n","import type { DetectedConvention, ScanResult, StackItem, ViberailsConfig } from '@viberails/types';\nimport {\n CONVENTION_LABELS,\n FRAMEWORK_NAMES,\n LIBRARY_NAMES,\n ORM_NAMES,\n STYLING_NAMES,\n} from '@viberails/types';\nimport chalk from 'chalk';\nimport {\n formatExtensions,\n formatRoleGroup,\n formatSummary,\n groupByRole,\n} from './display-helpers.js';\nimport { displayMonorepoResults } from './display-monorepo.js';\n\n/**\n * Format a StackItem for display: \"DisplayName Version\".\n */\nexport function formatItem(item: StackItem, nameMap?: Record<string, string>): string {\n const name = nameMap?.[item.name] ?? item.name;\n return item.version ? `${name} ${item.version}` : name;\n}\n\n/**\n * Format a confidence label for display.\n */\nexport function confidenceLabel(convention: DetectedConvention): string {\n const pct = Math.round(convention.consistency);\n if (convention.confidence === 'high') {\n return `${pct}% — high confidence, will enforce`;\n }\n return `${pct}% — medium confidence, suggested only`;\n}\n\n/**\n * Display conventions section, shared between single-package and monorepo.\n */\nexport function displayConventions(scanResult: ScanResult): void {\n const conventionEntries = Object.entries(scanResult.conventions);\n if (conventionEntries.length === 0) return;\n\n console.log(`\\n${chalk.bold('Conventions:')}`);\n for (const [key, convention] of conventionEntries) {\n if (convention.confidence === 'low') continue;\n const label = CONVENTION_LABELS[key] ?? key;\n\n if (scanResult.packages.length > 1) {\n const pkgValues = scanResult.packages\n .filter((pkg) => pkg.conventions[key] && pkg.conventions[key].confidence !== 'low')\n .map((pkg) => ({ relativePath: pkg.relativePath, convention: pkg.conventions[key] }));\n\n const allSame = pkgValues.every((pv) => pv.convention.value === convention.value);\n\n if (allSame || pkgValues.length <= 1) {\n const ind = convention.confidence === 'high' ? chalk.green('✓') : chalk.yellow('~');\n const detail = chalk.dim(`(${confidenceLabel(convention)})`);\n console.log(` ${ind} ${label}: ${convention.value} ${detail}`);\n } else {\n console.log(` ${chalk.yellow('~')} ${label}: varies by package`);\n for (const pv of pkgValues) {\n const pct = Math.round(pv.convention.consistency);\n console.log(` ${pv.relativePath}: ${pv.convention.value} (${pct}%)`);\n }\n }\n } else {\n const ind = convention.confidence === 'high' ? chalk.green('✓') : chalk.yellow('~');\n const detail = chalk.dim(`(${confidenceLabel(convention)})`);\n console.log(` ${ind} ${label}: ${convention.value} ${detail}`);\n }\n }\n}\n\n/**\n * Display summary section with statistics.\n */\nexport function displaySummarySection(scanResult: ScanResult): void {\n const pkgCount = scanResult.packages.length > 1 ? scanResult.packages.length : undefined;\n console.log(`\\n${chalk.bold('Summary:')}`);\n console.log(` ${formatSummary(scanResult.statistics, pkgCount)}`);\n const ext = formatExtensions(scanResult.statistics.filesByExtension);\n if (ext) {\n console.log(` ${ext}`);\n }\n}\n\n/**\n * Display scan results to the console with confidence indicators.\n *\n * @param scanResult - The scan result to display\n */\nexport function displayScanResults(scanResult: ScanResult): void {\n if (scanResult.packages.length > 1) {\n displayMonorepoResults(scanResult);\n return;\n }\n\n const { stack } = scanResult;\n\n console.log(`\\n${chalk.bold('Detected:')}`);\n\n if (stack.framework) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.framework, FRAMEWORK_NAMES)}`);\n }\n console.log(` ${chalk.green('✓')} ${formatItem(stack.language)}`);\n if (stack.styling) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.styling, STYLING_NAMES)}`);\n }\n if (stack.backend) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.backend, FRAMEWORK_NAMES)}`);\n }\n if (stack.orm) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.orm, ORM_NAMES)}`);\n }\n if (stack.linter && stack.formatter && stack.linter.name === stack.formatter.name) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.linter)} (lint + format)`);\n } else {\n if (stack.linter) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.linter)}`);\n }\n if (stack.formatter) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.formatter)}`);\n }\n }\n if (stack.testRunner) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.testRunner)}`);\n }\n if (stack.packageManager) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.packageManager)}`);\n }\n if (stack.libraries.length > 0) {\n for (const lib of stack.libraries) {\n console.log(` ${chalk.green('✓')} ${formatItem(lib, LIBRARY_NAMES)}`);\n }\n }\n\n // Structure grouped by role\n const groups = groupByRole(scanResult.structure.directories);\n if (groups.length > 0) {\n console.log(`\\n${chalk.bold('Structure:')}`);\n for (const group of groups) {\n console.log(` ${chalk.green('✓')} ${formatRoleGroup(group)}`);\n }\n }\n\n displayConventions(scanResult);\n displaySummarySection(scanResult);\n console.log('');\n}\n\n/**\n * Display a preview of the rules that will be enforced.\n * Used in the non-interactive (--yes) path.\n */\nexport function displayRulesPreview(config: ViberailsConfig): void {\n const root = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n\n console.log(\n `${chalk.bold('Rules:')} ${chalk.dim('(warns on violation; use --enforce in CI to block)')}`,\n );\n console.log(` ${chalk.dim('\\u2022')} Max file size: ${config.rules.maxFileLines} lines`);\n\n if (config.rules.testCoverage > 0 && root?.structure?.testPattern) {\n console.log(\n ` ${chalk.dim('\\u2022')} Test coverage target: ${config.rules.testCoverage}% (${root.structure.testPattern})`,\n );\n } else if (config.rules.testCoverage > 0) {\n console.log(` ${chalk.dim('\\u2022')} Test coverage target: ${config.rules.testCoverage}%`);\n } else {\n console.log(` ${chalk.dim('\\u2022')} Test coverage target: disabled`);\n }\n\n if (config.rules.enforceNaming && root?.conventions?.fileNaming) {\n console.log(` ${chalk.dim('\\u2022')} Enforce file naming: ${root.conventions.fileNaming}`);\n } else {\n console.log(` ${chalk.dim('\\u2022')} Enforce file naming: no`);\n }\n\n console.log(\n ` ${chalk.dim('\\u2022')} Enforce boundaries: ${config.rules.enforceBoundaries ? 'yes' : 'no'}`,\n );\n\n console.log('');\n}\n\n/**\n * Display a colorful summary of rules right before the accept/customize prompt.\n * Designed to always be visible even when scan details have scrolled off.\n *\n * @param config - The generated config\n * @param exemptedPackages - Package paths exempted from coverage\n */\nexport function displayInitSummary(config: ViberailsConfig, exemptedPackages: string[]): void {\n const root = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const isMonorepo = config.packages.length > 1;\n const ok = chalk.green('✓');\n const off = chalk.dim('○');\n\n console.log('');\n console.log(` ${chalk.bold('Rules to apply:')}`);\n\n // Max file size\n console.log(` ${ok} Max file size: ${chalk.cyan(`${config.rules.maxFileLines} lines`)}`);\n\n // File naming — check root first, then any package\n const fileNaming =\n root?.conventions?.fileNaming ??\n config.packages.find((p) => p.conventions?.fileNaming)?.conventions?.fileNaming;\n if (config.rules.enforceNaming && fileNaming) {\n console.log(` ${ok} File naming: ${chalk.cyan(fileNaming)}`);\n } else {\n console.log(` ${off} File naming: ${chalk.dim('not enforced')}`);\n }\n\n // Missing tests — check root first, then any package\n const testPattern =\n root?.structure?.testPattern ??\n config.packages.find((p) => p.structure?.testPattern)?.structure?.testPattern;\n if (config.rules.enforceMissingTests && testPattern) {\n console.log(` ${ok} Missing tests: ${chalk.cyan(`enforced (${testPattern})`)}`);\n } else if (config.rules.enforceMissingTests) {\n console.log(` ${ok} Missing tests: ${chalk.cyan('enforced')}`);\n } else {\n console.log(` ${off} Missing tests: ${chalk.dim('not enforced')}`);\n }\n\n // Coverage\n if (config.rules.testCoverage > 0) {\n if (isMonorepo) {\n const withCoverage = config.packages.filter(\n (p) => (p.rules?.testCoverage ?? config.rules.testCoverage) > 0,\n );\n console.log(\n ` ${ok} Coverage: ${chalk.cyan(`${config.rules.testCoverage}%`)} default ${chalk.dim(`(${withCoverage.length}/${config.packages.length} packages)`)}`,\n );\n } else {\n console.log(` ${ok} Coverage: ${chalk.cyan(`${config.rules.testCoverage}%`)}`);\n }\n } else {\n console.log(` ${off} Coverage: ${chalk.dim('disabled')}`);\n }\n\n // Exempted packages\n if (exemptedPackages.length > 0) {\n console.log(\n ` ${chalk.dim(' exempted:')} ${chalk.dim(exemptedPackages.join(', '))} ${chalk.dim('(types-only)')}`,\n );\n }\n\n // Stats line\n if (isMonorepo) {\n console.log(\n `\\n ${chalk.dim(`${config.packages.length} packages scanned · warns on violation · use --enforce in CI`)}`,\n );\n } else {\n console.log(`\\n ${chalk.dim('warns on violation · use --enforce in CI to block')}`);\n }\n\n console.log('');\n}\n","import type { CodebaseStatistics, DirectoryInfo, DirectoryRole } from '@viberails/types';\nimport { ROLE_DESCRIPTIONS } from '@viberails/types';\n\n/**\n * A group of directories sharing the same role within a package.\n */\nexport interface RoleGroup {\n role: DirectoryRole;\n label: string;\n dirCount: number;\n totalFiles: number;\n singlePath?: string;\n}\n\n/**\n * Groups a package's directories by role, merging file counts.\n * Filters out `unknown` role. For single-directory roles, sets `singlePath`.\n *\n * @param directories - The directories to group.\n * @returns Array of RoleGroup entries sorted by role label.\n */\nexport function groupByRole(directories: DirectoryInfo[]): RoleGroup[] {\n const map = new Map<DirectoryRole, { dirs: DirectoryInfo[] }>();\n\n for (const dir of directories) {\n if (dir.role === 'unknown') continue;\n const existing = map.get(dir.role);\n if (existing) {\n existing.dirs.push(dir);\n } else {\n map.set(dir.role, { dirs: [dir] });\n }\n }\n\n const groups: RoleGroup[] = [];\n for (const [role, { dirs }] of map) {\n const label = ROLE_DESCRIPTIONS[role] ?? role;\n const totalFiles = dirs.reduce((sum, d) => sum + d.fileCount, 0);\n groups.push({\n role,\n label,\n dirCount: dirs.length,\n totalFiles,\n singlePath: dirs.length === 1 ? dirs[0].path : undefined,\n });\n }\n\n return groups;\n}\n\n/**\n * Format a summary line from CodebaseStatistics.\n *\n * @param stats - The codebase statistics.\n * @param packageCount - Number of packages (shown for monorepos with > 1).\n * @returns Formatted summary string, e.g. \"3 packages · 743 source files · 48,200 lines · avg 65 lines/file\"\n */\nexport function formatSummary(stats: CodebaseStatistics, packageCount?: number): string {\n const parts: string[] = [];\n if (packageCount && packageCount > 1) {\n parts.push(`${packageCount} packages`);\n }\n parts.push(`${stats.totalFiles.toLocaleString()} source files`);\n parts.push(`${stats.totalLines.toLocaleString()} lines`);\n parts.push(`avg ${Math.round(stats.averageFileLines)} lines/file`);\n return parts.join(' \\u00b7 ');\n}\n\n/**\n * Format top extensions by count, e.g. \".tsx 312 · .ts 289 · .js 142\".\n *\n * @param filesByExtension - Extension counts from CodebaseStatistics.\n * @param maxEntries - Maximum number of extensions to show (default 4).\n * @returns Formatted extension string.\n */\nexport function formatExtensions(\n filesByExtension: Record<string, number>,\n maxEntries: number = 4,\n): string {\n return Object.entries(filesByExtension)\n .sort(([, a], [, b]) => b - a)\n .slice(0, maxEntries)\n .map(([ext, count]) => `${ext} ${count}`)\n .join(' \\u00b7 ');\n}\n\n/**\n * Format a RoleGroup for display.\n *\n * @param group - The role group.\n * @returns Formatted string, e.g. \"Hooks — 4 dirs (55 files)\" or \"Pages / Routes — app (12 files)\"\n */\nexport function formatRoleGroup(group: RoleGroup): string {\n const files = group.totalFiles === 1 ? '1 file' : `${group.totalFiles} files`;\n if (group.singlePath) {\n return `${group.label} — ${group.singlePath} (${files})`;\n }\n const dirs = group.dirCount === 1 ? '1 dir' : `${group.dirCount} dirs`;\n return `${group.label} — ${dirs} (${files})`;\n}\n","import type { PackageScanResult, ScanResult } from '@viberails/types';\nimport { FRAMEWORK_NAMES, STYLING_NAMES } from '@viberails/types';\nimport chalk from 'chalk';\nimport { displayConventions, displaySummarySection, formatItem } from './display.js';\nimport {\n formatExtensions,\n formatRoleGroup,\n formatSummary,\n groupByRole,\n} from './display-helpers.js';\nimport { formatConventionsText } from './display-text.js';\n\n/**\n * Format a package summary line for monorepo display.\n */\nexport function formatPackageSummary(pkg: PackageScanResult): string {\n const parts: string[] = [];\n if (pkg.stack.framework) {\n parts.push(formatItem(pkg.stack.framework, FRAMEWORK_NAMES));\n }\n if (pkg.stack.styling) {\n parts.push(formatItem(pkg.stack.styling, STYLING_NAMES));\n }\n const files = `${pkg.statistics.totalFiles} files`;\n const detail = parts.length > 0 ? `${parts.join(', ')} (${files})` : `(${files})`;\n return ` ${pkg.relativePath} — ${detail}`;\n}\n\n/**\n * Display scan results for a monorepo with per-package summaries.\n */\nexport function displayMonorepoResults(scanResult: ScanResult): void {\n const { stack, packages } = scanResult;\n\n console.log(`\\n${chalk.bold(`Detected: (monorepo, ${packages.length} packages)`)}`);\n\n // Shared stack items at the top\n console.log(` ${chalk.green('✓')} ${formatItem(stack.language)}`);\n if (stack.packageManager) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.packageManager)}`);\n }\n if (stack.linter && stack.formatter && stack.linter.name === stack.formatter.name) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.linter)} (lint + format)`);\n } else {\n if (stack.linter) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.linter)}`);\n }\n if (stack.formatter) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.formatter)}`);\n }\n }\n if (stack.testRunner) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.testRunner)}`);\n }\n\n // Per-package summaries\n console.log('');\n for (const pkg of packages) {\n console.log(formatPackageSummary(pkg));\n }\n\n // Structure grouped by role per package\n const packagesWithDirs = packages.filter((pkg) =>\n pkg.structure.directories.some((d) => d.role !== 'unknown'),\n );\n if (packagesWithDirs.length > 0) {\n console.log(`\\n${chalk.bold('Structure:')}`);\n for (const pkg of packagesWithDirs) {\n const groups = groupByRole(pkg.structure.directories);\n if (groups.length === 0) continue;\n console.log(` ${pkg.relativePath}:`);\n for (const group of groups) {\n console.log(` ${chalk.green('✓')} ${formatRoleGroup(group)}`);\n }\n }\n }\n\n displayConventions(scanResult);\n displaySummarySection(scanResult);\n console.log('');\n}\n\n/**\n * Format a plain-text package summary line (no chalk).\n */\nfunction formatPackageSummaryPlain(pkg: PackageScanResult): string {\n const parts: string[] = [];\n if (pkg.stack.framework) {\n parts.push(formatItem(pkg.stack.framework, FRAMEWORK_NAMES));\n }\n if (pkg.stack.styling) {\n parts.push(formatItem(pkg.stack.styling, STYLING_NAMES));\n }\n const files = `${pkg.statistics.totalFiles} files`;\n const detail = parts.length > 0 ? `${parts.join(', ')} (${files})` : `(${files})`;\n return ` ${pkg.relativePath} — ${detail}`;\n}\n\n/**\n * Build monorepo scan results as a multi-line string for clack.note().\n * Returns plain text without chalk colors.\n */\nexport function formatMonorepoResultsText(scanResult: ScanResult): string {\n const lines: string[] = [];\n const { stack, packages } = scanResult;\n\n lines.push(`Detected: (monorepo, ${packages.length} packages)`);\n\n // Shared stack items as compact line\n const sharedParts: string[] = [formatItem(stack.language)];\n if (stack.packageManager) sharedParts.push(formatItem(stack.packageManager));\n if (stack.linter && stack.formatter && stack.linter.name === stack.formatter.name) {\n sharedParts.push(`${formatItem(stack.linter)} (lint + format)`);\n } else {\n if (stack.linter) sharedParts.push(formatItem(stack.linter));\n if (stack.formatter) sharedParts.push(formatItem(stack.formatter));\n }\n if (stack.testRunner) sharedParts.push(formatItem(stack.testRunner));\n lines.push(` \\u2713 ${sharedParts.join(' \\u00b7 ')}`);\n\n // Per-package summaries\n lines.push('');\n for (const pkg of packages) {\n lines.push(formatPackageSummaryPlain(pkg));\n }\n\n // Structure grouped by role per package\n const packagesWithDirs = packages.filter((pkg) =>\n pkg.structure.directories.some((d) => d.role !== 'unknown'),\n );\n if (packagesWithDirs.length > 0) {\n lines.push('');\n lines.push('Structure:');\n for (const pkg of packagesWithDirs) {\n const groups = groupByRole(pkg.structure.directories);\n if (groups.length === 0) continue;\n lines.push(` ${pkg.relativePath}:`);\n for (const group of groups) {\n lines.push(` \\u2713 ${formatRoleGroup(group)}`);\n }\n }\n }\n\n // Conventions\n lines.push(...formatConventionsText(scanResult));\n\n // Summary stats\n const pkgCount = packages.length > 1 ? packages.length : undefined;\n lines.push('');\n lines.push(formatSummary(scanResult.statistics, pkgCount));\n const ext = formatExtensions(scanResult.statistics.filesByExtension);\n if (ext) {\n lines.push(ext);\n }\n\n return lines.join('\\n');\n}\n","import type { ViberailsConfig } from '@viberails/types';\nimport type { RuleOverrides } from './prompt-rules.js';\n\n/**\n * Apply user-chosen rule overrides to a ViberailsConfig in-place.\n * Shared between `init` (interactive customize flow) and `config` command.\n *\n * @param config - The config to mutate\n * @param overrides - The rule overrides from promptRuleMenu\n */\nexport function applyRuleOverrides(config: ViberailsConfig, overrides: RuleOverrides): void {\n if (overrides.packageOverrides) config.packages = overrides.packageOverrides;\n config.rules.maxFileLines = overrides.maxFileLines;\n config.rules.testCoverage = overrides.testCoverage;\n config.rules.enforceMissingTests = overrides.enforceMissingTests;\n config.rules.enforceNaming = overrides.enforceNaming;\n\n for (const pkg of config.packages) {\n pkg.coverage = pkg.coverage ?? {};\n if (pkg.coverage.summaryPath === undefined) {\n pkg.coverage.summaryPath = overrides.coverageSummaryPath;\n }\n if (pkg.coverage.command === undefined && overrides.coverageCommand) {\n pkg.coverage.command = overrides.coverageCommand;\n }\n }\n\n if (overrides.fileNamingValue) {\n const rootPkg = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const oldNaming = rootPkg.conventions?.fileNaming;\n rootPkg.conventions = rootPkg.conventions ?? {};\n rootPkg.conventions.fileNaming = overrides.fileNamingValue;\n if (oldNaming && oldNaming !== overrides.fileNamingValue) {\n for (const pkg of config.packages) {\n if (pkg.conventions?.fileNaming === oldNaming) {\n pkg.conventions.fileNaming = overrides.fileNamingValue;\n }\n }\n }\n }\n}\n","import type {\n CodebaseStatistics,\n ConfigConventions,\n ConfigStack,\n ConfigStructure,\n PackageConfig,\n ViberailsConfig,\n} from '@viberails/types';\nimport { CONVENTION_LABELS, FRAMEWORK_NAMES, ORM_NAMES, STYLING_NAMES } from '@viberails/types';\n\nexport interface ConfigChange {\n type: 'added' | 'changed' | 'removed';\n description: string;\n}\n\n/**\n * Parse a stack string like \"nextjs@15\" into { name: \"nextjs\", version: \"15\" }.\n */\nfunction parseStackString(s: string): { name: string; version?: string } {\n const atIdx = s.indexOf('@');\n if (atIdx > 0) {\n return { name: s.slice(0, atIdx), version: s.slice(atIdx + 1) };\n }\n return { name: s };\n}\n\n/**\n * Resolve a stack string to a human-readable display name.\n */\nfunction displayStackName(s: string): string {\n const { name, version } = parseStackString(s);\n const allMaps: Record<string, string> = {\n ...FRAMEWORK_NAMES,\n ...STYLING_NAMES,\n ...ORM_NAMES,\n };\n const display = allMaps[name] ?? name;\n return version ? `${display} ${version}` : display;\n}\n\n/**\n * Check if a convention was newly detected during sync (via _meta).\n */\nfunction isNewlyDetected(config: ViberailsConfig, pkgPath: string, key: string): boolean {\n return config._meta?.packages?.[pkgPath]?.conventions?.[key]?.detected === true;\n}\n\n/** Stack fields to compare (excluding language and packageManager which rarely change). */\nconst STACK_FIELDS: (keyof ConfigStack)[] = [\n 'framework',\n 'styling',\n 'backend',\n 'orm',\n 'linter',\n 'formatter',\n 'testRunner',\n];\n\n/** Convention keys to compare. */\nconst CONVENTION_KEYS: (keyof ConfigConventions)[] = [\n 'fileNaming',\n 'componentNaming',\n 'hookNaming',\n 'importAlias',\n];\n\n/** Structure fields to compare. */\nconst STRUCTURE_FIELDS: { key: keyof ConfigStructure; label: string }[] = [\n { key: 'srcDir', label: 'source directory' },\n { key: 'pages', label: 'pages directory' },\n { key: 'components', label: 'components directory' },\n { key: 'hooks', label: 'hooks directory' },\n { key: 'utils', label: 'utilities directory' },\n { key: 'types', label: 'types directory' },\n { key: 'tests', label: 'tests directory' },\n { key: 'testPattern', label: 'test pattern' },\n];\n\n/**\n * Diff a single package between existing and merged configs.\n */\nfunction diffPackage(\n existing: PackageConfig,\n merged: PackageConfig,\n mergedConfig: ViberailsConfig,\n): ConfigChange[] {\n const changes: ConfigChange[] = [];\n const pkgPrefix = existing.path === '.' ? '' : `${existing.path}: `;\n\n // Stack changes\n for (const field of STACK_FIELDS) {\n const oldVal = existing.stack?.[field];\n const newVal = merged.stack?.[field];\n\n if (!oldVal && newVal) {\n changes.push({\n type: 'added',\n description: `${pkgPrefix}Stack: added ${displayStackName(newVal)}`,\n });\n } else if (oldVal && newVal && oldVal !== newVal) {\n changes.push({\n type: 'changed',\n description: `${pkgPrefix}Stack: ${displayStackName(oldVal)} → ${displayStackName(newVal)}`,\n });\n }\n }\n\n // Convention changes\n for (const key of CONVENTION_KEYS) {\n const oldVal = existing.conventions?.[key];\n const newVal = merged.conventions?.[key];\n const label = CONVENTION_LABELS[key] ?? key;\n\n if (!oldVal && newVal) {\n changes.push({\n type: 'added',\n description: `${pkgPrefix}New convention: ${label} (${newVal})`,\n });\n } else if (oldVal && newVal && oldVal !== newVal) {\n const suffix = isNewlyDetected(mergedConfig, merged.path, key) ? ' (newly detected)' : '';\n changes.push({\n type: 'changed',\n description: `${pkgPrefix}Convention updated: ${label} (${newVal})${suffix}`,\n });\n }\n }\n\n // Structure changes\n for (const { key, label } of STRUCTURE_FIELDS) {\n const oldVal = existing.structure?.[key];\n const newVal = merged.structure?.[key];\n\n if (!oldVal && newVal) {\n changes.push({\n type: 'added',\n description: `${pkgPrefix}Structure: detected ${label} (${newVal})`,\n });\n }\n }\n\n return changes;\n}\n\n/**\n * Compare two ViberailsConfig objects and return a list of human-readable changes.\n *\n * @param existing - The config before sync\n * @param merged - The config after merging with fresh scan results\n * @returns Array of changes, empty if configs are identical\n */\nexport function diffConfigs(existing: ViberailsConfig, merged: ViberailsConfig): ConfigChange[] {\n const changes: ConfigChange[] = [];\n\n // Build lookup maps by path\n const existingByPath = new Map(existing.packages.map((p) => [p.path, p]));\n const mergedByPath = new Map(merged.packages.map((p) => [p.path, p]));\n\n // Diff existing packages against merged\n for (const existingPkg of existing.packages) {\n const mergedPkg = mergedByPath.get(existingPkg.path);\n if (mergedPkg) {\n changes.push(...diffPackage(existingPkg, mergedPkg, merged));\n }\n }\n\n // New packages\n for (const mergedPkg of merged.packages) {\n if (!existingByPath.has(mergedPkg.path)) {\n changes.push({ type: 'added', description: `New package: ${mergedPkg.path}` });\n }\n }\n\n return changes;\n}\n\n/**\n * Format a stats delta as a human-readable string.\n */\nexport function formatStatsDelta(\n oldStats: CodebaseStatistics,\n newStats: CodebaseStatistics,\n): string | undefined {\n const fileDelta = newStats.totalFiles - oldStats.totalFiles;\n const lineDelta = newStats.totalLines - oldStats.totalLines;\n\n if (fileDelta === 0 && lineDelta === 0) return undefined;\n\n const parts: string[] = [];\n\n if (fileDelta !== 0) {\n const sign = fileDelta > 0 ? '+' : '';\n parts.push(`${sign}${fileDelta.toLocaleString()} files`);\n }\n\n if (lineDelta !== 0) {\n const sign = lineDelta > 0 ? '+' : '';\n parts.push(`${sign}${lineDelta.toLocaleString()} lines`);\n }\n\n return `${parts.join(', ')} since last sync`;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { generateContext } from '@viberails/context';\nimport type { ScanResult, ViberailsConfig } from '@viberails/types';\n\nconst CONTEXT_DIR = '.viberails';\nconst CONTEXT_FILE = 'context.md';\nconst SCAN_RESULT_FILE = 'scan-result.json';\n\n/**\n * Write all generated files: context.md and scan-result.json.\n *\n * @param projectRoot - Absolute path to the project root\n * @param config - The viberails configuration\n * @param scanResult - The raw scan result\n */\nexport function writeGeneratedFiles(\n projectRoot: string,\n config: ViberailsConfig,\n scanResult: ScanResult,\n): void {\n const contextDir = path.join(projectRoot, CONTEXT_DIR);\n\n try {\n if (!fs.existsSync(contextDir)) {\n fs.mkdirSync(contextDir, { recursive: true });\n }\n\n const context = generateContext(config);\n fs.writeFileSync(path.join(contextDir, CONTEXT_FILE), context);\n\n fs.writeFileSync(\n path.join(contextDir, SCAN_RESULT_FILE),\n `${JSON.stringify(scanResult, null, 2)}\\n`,\n );\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to write generated files to ${contextDir}: ${message}`);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { loadConfig } from '@viberails/config';\nimport chalk from 'chalk';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { confirmDangerous } from '../utils/prompt.js';\nimport { resolveConfigForFile } from './check-config.js';\nimport { checkNaming, getAllSourceFiles } from './check-files.js';\nimport { checkMissingTests } from './check-tests.js';\nimport { checkGitDirty, getConventionValue, printPlan } from './fix-helpers.js';\nimport { updateImportsAfterRenames } from './fix-imports.js';\nimport {\n computeRename,\n deduplicateRenames,\n executeRename,\n type RenameRecord,\n} from './fix-naming.js';\nimport { generateTestStub, type TestStubRecord, writeTestStub } from './fix-tests.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\nexport interface FixOptions {\n dryRun?: boolean;\n rule?: string[];\n yes?: boolean;\n}\n\n/**\n * Run the viberails fix command.\n * Detects violations, computes fixes, optionally confirms, then applies.\n */\nexport async function fixCommand(options: FixOptions, cwd?: string): Promise<number> {\n const startDir = cwd ?? process.cwd();\n const projectRoot = findProjectRoot(startDir);\n\n if (!projectRoot) {\n console.error(`${chalk.red('Error:')} No package.json found. Are you in a JS/TS project?`);\n return 1;\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (!fs.existsSync(configPath)) {\n console.error(\n `${chalk.red('Error:')} No viberails.config.json found. Run \\`viberails init\\` first.`,\n );\n return 1;\n }\n\n const config = await loadConfig(configPath);\n\n // Git dirty check — warn but don't block\n if (!options.dryRun) {\n const isDirty = checkGitDirty(projectRoot);\n if (isDirty) {\n console.log(\n chalk.yellow('Warning: You have uncommitted changes. Consider committing first.'),\n );\n }\n }\n\n const shouldFixNaming = !options.rule || options.rule.includes('file-naming');\n const shouldFixTests = !options.rule || options.rule.includes('missing-test');\n\n // Collect source files\n const allFiles = getAllSourceFiles(projectRoot, config);\n\n // Compute naming renames\n const renames: RenameRecord[] = [];\n if (shouldFixNaming) {\n for (const file of allFiles) {\n const resolved = resolveConfigForFile(file, config);\n if (!resolved.rules.enforceNaming || !resolved.conventions.fileNaming) continue;\n\n const violation = checkNaming(file, resolved.conventions);\n if (!violation) continue;\n\n const convention = getConventionValue(resolved.conventions.fileNaming);\n if (!convention) continue;\n\n const rename = computeRename(file, convention, projectRoot);\n if (rename) renames.push(rename);\n }\n }\n\n const dedupedRenames = deduplicateRenames(renames);\n\n // Compute test stubs\n const testStubs: TestStubRecord[] = [];\n if (shouldFixTests) {\n const testViolations = checkMissingTests(projectRoot, config, 'warn');\n for (const v of testViolations) {\n const stub = generateTestStub(v.file, config, projectRoot);\n if (stub) testStubs.push(stub);\n }\n }\n\n // Nothing to fix\n if (dedupedRenames.length === 0 && testStubs.length === 0) {\n console.log(`${chalk.green('✓')} No fixable violations found.`);\n return 0;\n }\n\n // Display plan\n printPlan(dedupedRenames, testStubs);\n\n if (options.dryRun) {\n console.log(chalk.dim('\\nDry run — no changes applied.'));\n return 0;\n }\n\n // Confirm\n if (!options.yes) {\n const confirmed = await confirmDangerous('Apply these fixes?');\n if (!confirmed) {\n console.log('Aborted.');\n return 0;\n }\n }\n\n // Apply: 1. Renames\n let renameCount = 0;\n for (const rename of dedupedRenames) {\n if (executeRename(rename)) {\n renameCount++;\n }\n }\n\n // Apply: 2. Import updates\n let importUpdateCount = 0;\n if (renameCount > 0) {\n const appliedRenames = dedupedRenames.filter((r) => fs.existsSync(r.newAbsPath));\n const updates = await updateImportsAfterRenames(appliedRenames, projectRoot);\n importUpdateCount = updates.length;\n }\n\n // Apply: 3. Test stubs\n let stubCount = 0;\n for (const stub of testStubs) {\n if (!fs.existsSync(stub.absPath)) {\n writeTestStub(stub, config);\n stubCount++;\n }\n }\n\n // Summary\n console.log('');\n if (renameCount > 0) {\n console.log(`${chalk.green('✓')} Renamed ${renameCount} file${renameCount > 1 ? 's' : ''}`);\n }\n if (importUpdateCount > 0) {\n console.log(\n `${chalk.green('✓')} Updated ${importUpdateCount} import${importUpdateCount > 1 ? 's' : ''}`,\n );\n }\n if (stubCount > 0) {\n console.log(`${chalk.green('✓')} Generated ${stubCount} test stub${stubCount > 1 ? 's' : ''}`);\n }\n\n return 0;\n}\n","import { execSync } from 'node:child_process';\nimport chalk from 'chalk';\nimport type { RenameRecord } from './fix-naming.js';\nimport type { TestStubRecord } from './fix-tests.js';\n\n/**\n * Display the planned renames and test stubs.\n */\nexport function printPlan(renames: RenameRecord[], stubs: TestStubRecord[]): void {\n if (renames.length > 0) {\n console.log(chalk.bold('\\nFile renames:'));\n for (const r of renames) {\n console.log(` ${chalk.red(r.oldPath)} → ${chalk.green(r.newPath)}`);\n }\n }\n\n if (stubs.length > 0) {\n console.log(chalk.bold('\\nTest stubs to create:'));\n for (const s of stubs) {\n console.log(` ${chalk.green('+')} ${s.path}`);\n }\n }\n}\n\n/**\n * Check if the git working tree has uncommitted changes.\n */\nexport function checkGitDirty(projectRoot: string): boolean {\n try {\n const output = execSync('git status --porcelain', {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return output.trim().length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Extract the string value from a convention.\n * Conventions are always plain strings.\n */\nexport function getConventionValue(convention: unknown): string | undefined {\n if (typeof convention === 'string') return convention;\n return undefined;\n}\n","import * as path from 'node:path';\nimport type { RenameRecord } from './fix-naming.js';\n\nexport interface ImportUpdateRecord {\n file: string;\n oldSpecifier: string;\n newSpecifier: string;\n line: number;\n}\n\n/**\n * Strip known JS/TS extensions from a file path for specifier comparison.\n * E.g. \"/foo/bar.ts\" → \"/foo/bar\", \"/foo/bar.js\" → \"/foo/bar\"\n */\nfunction stripExtension(filePath: string): string {\n return filePath.replace(/\\.(tsx?|jsx?|mjs|cjs)$/, '');\n}\n\n/**\n * Compute the new import specifier given the old specifier and the rename.\n * Preserves `.js` suffix if present.\n */\nfunction computeNewSpecifier(oldSpecifier: string, newBare: string): string {\n const hasJsExt = oldSpecifier.endsWith('.js');\n const base = hasJsExt ? oldSpecifier.slice(0, -3) : oldSpecifier;\n\n // Replace the last path segment\n const dir = base.lastIndexOf('/');\n const prefix = dir >= 0 ? base.slice(0, dir + 1) : '';\n const newSpec = prefix + newBare;\n\n return hasJsExt ? `${newSpec}.js` : newSpec;\n}\n\n/**\n * Update import specifiers in all source files after renames.\n * Uses ts-morph for AST-accurate rewriting.\n *\n * @param renames - The renames that were applied\n * @param projectRoot - Absolute path to project root\n * @returns Records of all import updates made\n */\nexport async function updateImportsAfterRenames(\n renames: RenameRecord[],\n projectRoot: string,\n): Promise<ImportUpdateRecord[]> {\n if (renames.length === 0) return [];\n\n // Lazy import ts-morph to avoid startup cost\n const { Project, SyntaxKind } = await import('ts-morph');\n\n // Build rename map: stripped old abs path → { newBare }\n const renameMap = new Map<string, { newBare: string }>();\n for (const r of renames) {\n const oldStripped = stripExtension(r.oldAbsPath);\n const newFilename = path.basename(r.newPath);\n const newName = newFilename.slice(0, newFilename.indexOf('.'));\n renameMap.set(oldStripped, { newBare: newName });\n }\n\n const project = new Project({\n tsConfigFilePath: undefined,\n skipAddingFilesFromTsConfig: true,\n });\n\n // Add all TS/JS source files\n project.addSourceFilesAtPaths(path.join(projectRoot, '**/*.{ts,tsx,js,jsx,mjs,cjs}'));\n\n const updates: ImportUpdateRecord[] = [];\n const extensions = ['', '.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js'];\n\n for (const sourceFile of project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n // Skip node_modules and dist (check path segments to avoid false matches)\n const segments = filePath.split(path.sep);\n if (segments.includes('node_modules') || segments.includes('dist')) continue;\n\n const fileDir = path.dirname(filePath);\n\n // Process static imports\n for (const decl of sourceFile.getImportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n if (!specifier.startsWith('.')) continue;\n\n const match = resolveToRenamedFile(specifier, fileDir, renameMap, extensions);\n if (!match) continue;\n\n const newSpec = computeNewSpecifier(specifier, match.newBare);\n updates.push({\n file: filePath,\n oldSpecifier: specifier,\n newSpecifier: newSpec,\n line: decl.getStartLineNumber(),\n });\n decl.setModuleSpecifier(newSpec);\n }\n\n // Process re-exports\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n if (!specifier || !specifier.startsWith('.')) continue;\n\n const match = resolveToRenamedFile(specifier, fileDir, renameMap, extensions);\n if (!match) continue;\n\n const newSpec = computeNewSpecifier(specifier, match.newBare);\n updates.push({\n file: filePath,\n oldSpecifier: specifier,\n newSpecifier: newSpec,\n line: decl.getStartLineNumber(),\n });\n decl.setModuleSpecifier(newSpec);\n }\n\n // Process dynamic imports\n for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n if (call.getExpression().getKind() !== SyntaxKind.ImportKeyword) continue;\n\n const args = call.getArguments();\n if (args.length === 0) continue;\n\n const arg = args[0];\n if (arg.getKind() !== SyntaxKind.StringLiteral) continue;\n\n const specifier = arg.getText().slice(1, -1);\n if (!specifier.startsWith('.')) continue;\n\n const match = resolveToRenamedFile(specifier, fileDir, renameMap, extensions);\n if (!match) continue;\n\n const newSpec = computeNewSpecifier(specifier, match.newBare);\n updates.push({\n file: filePath,\n oldSpecifier: specifier,\n newSpecifier: newSpec,\n line: call.getStartLineNumber(),\n });\n // Replace the string literal content\n const quote = arg.getText()[0];\n arg.replaceWithText(`${quote}${newSpec}${quote}`);\n }\n }\n\n if (updates.length > 0) {\n await project.save();\n }\n\n return updates;\n}\n\n/**\n * Try to resolve a relative specifier to a renamed file.\n * Returns the rename info if matched, undefined otherwise.\n */\nfunction resolveToRenamedFile(\n specifier: string,\n fromDir: string,\n renameMap: Map<string, { newBare: string }>,\n extensions: string[],\n): { newBare: string } | undefined {\n // Strip .js extension for resolution (TypeScript convention)\n const cleanSpec = specifier.endsWith('.js') ? specifier.slice(0, -3) : specifier;\n const resolved = path.resolve(fromDir, cleanSpec);\n\n for (const ext of extensions) {\n const candidate = resolved + ext;\n const stripped = stripExtension(candidate);\n const match = renameMap.get(stripped);\n if (match) return match;\n }\n\n return undefined;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { convertName } from './convert-name.js';\n\nexport interface RenameRecord {\n oldPath: string;\n newPath: string;\n oldAbsPath: string;\n newAbsPath: string;\n}\n\n/**\n * Compute the rename for a file that violates the naming convention.\n * Returns null if no rename is needed or the target already exists.\n */\nexport function computeRename(\n relPath: string,\n targetConvention: string,\n projectRoot: string,\n): RenameRecord | null {\n const filename = path.basename(relPath);\n const dir = path.dirname(relPath);\n\n // Extract bare name (before first dot) — matches checkNaming logic\n const dotIndex = filename.indexOf('.');\n if (dotIndex === -1) return null;\n\n const bare = filename.slice(0, dotIndex);\n const suffix = filename.slice(dotIndex); // e.g. \".tsx\" or \".test.ts\"\n\n const newBare = convertName(bare, targetConvention);\n if (newBare === bare) return null;\n\n const newFilename = newBare + suffix;\n const newRelPath = path.join(dir, newFilename);\n const oldAbsPath = path.join(projectRoot, relPath);\n const newAbsPath = path.join(projectRoot, newRelPath);\n\n // Skip if target already exists\n if (fs.existsSync(newAbsPath)) return null;\n\n return { oldPath: relPath, newPath: newRelPath, oldAbsPath, newAbsPath };\n}\n\n/**\n * Execute a single rename on disk.\n * Returns true if successful, false if skipped (target exists).\n */\nexport function executeRename(rename: RenameRecord): boolean {\n if (fs.existsSync(rename.newAbsPath)) return false;\n fs.renameSync(rename.oldAbsPath, rename.newAbsPath);\n return true;\n}\n\n/**\n * Detect and deduplicate rename collisions.\n * If two planned renames target the same path, the second is removed.\n */\nexport function deduplicateRenames(renames: RenameRecord[]): RenameRecord[] {\n const seen = new Set<string>();\n const result: RenameRecord[] = [];\n for (const r of renames) {\n if (seen.has(r.newAbsPath)) continue;\n seen.add(r.newAbsPath);\n result.push(r);\n }\n return result;\n}\n","/**\n * Split a bare filename into its constituent words.\n *\n * Handles kebab-case, camelCase, PascalCase, and snake_case inputs.\n * Consecutive uppercase letters (acronyms like \"URL\") are kept together.\n */\nexport function splitIntoWords(name: string): string[] {\n // First, split on explicit separators (hyphens and underscores)\n const parts = name.split(/[-_]/);\n\n const words: string[] = [];\n for (const part of parts) {\n if (part === '') continue;\n\n // Split camelCase and PascalCase boundaries\n // \"UserProfile\" → [\"User\", \"Profile\"]\n // \"parseJSON\" → [\"parse\", \"JSON\"]\n // \"XMLParser\" → [\"XML\", \"Parser\"]\n let current = '';\n for (let i = 0; i < part.length; i++) {\n const ch = part[i];\n const isUpper = ch >= 'A' && ch <= 'Z';\n\n if (isUpper && current.length > 0) {\n const prevIsUpper =\n current[current.length - 1] >= 'A' && current[current.length - 1] <= 'Z';\n const nextIsLower = i + 1 < part.length && part[i + 1] >= 'a' && part[i + 1] <= 'z';\n\n if (!prevIsUpper || nextIsLower) {\n words.push(current.toLowerCase());\n current = '';\n }\n }\n current += ch;\n }\n if (current) words.push(current.toLowerCase());\n }\n\n return words;\n}\n\n/**\n * Convert a bare filename to the specified naming convention.\n *\n * @param bare - The bare filename without extension (e.g. \"UserProfile\")\n * @param target - The target convention (kebab-case, camelCase, PascalCase, snake_case)\n * @returns The converted name\n */\nexport function convertName(bare: string, target: string): string {\n const words = splitIntoWords(bare);\n if (words.length === 0) return bare;\n\n switch (target) {\n case 'kebab-case':\n return words.join('-');\n case 'camelCase':\n return words[0] + words.slice(1).map(capitalize).join('');\n case 'PascalCase':\n return words.map(capitalize).join('');\n case 'snake_case':\n return words.join('_');\n default:\n return bare;\n }\n}\n\nfunction capitalize(word: string): string {\n if (word.length === 0) return word;\n return word[0].toUpperCase() + word.slice(1);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { ViberailsConfig } from '@viberails/types';\nimport { resolvePackageForFile } from './check-tests.js';\n\nexport interface TestStubRecord {\n path: string;\n absPath: string;\n moduleName: string;\n}\n\n/**\n * Generate a test stub record for a source file that is missing tests.\n * Returns null if the test file already exists.\n */\nexport function generateTestStub(\n sourceRelPath: string,\n config: ViberailsConfig,\n projectRoot: string,\n): TestStubRecord | null {\n const pkg = resolvePackageForFile(sourceRelPath, config);\n const testPattern = pkg?.structure?.testPattern;\n if (!testPattern) return null;\n\n const basename = path.basename(sourceRelPath);\n const ext = path.extname(basename);\n if (!ext) return null;\n const stem = basename.slice(0, -ext.length);\n const testSuffix = testPattern.replace('*', '');\n const testFilename = `${stem}${testSuffix}`;\n\n const dir = path.dirname(path.join(projectRoot, sourceRelPath));\n const testAbsPath = path.join(dir, testFilename);\n\n if (fs.existsSync(testAbsPath)) return null;\n\n return {\n path: path.relative(projectRoot, testAbsPath),\n absPath: testAbsPath,\n moduleName: stem,\n };\n}\n\n/**\n * Write a test stub file to disk.\n */\nexport function writeTestStub(stub: TestStubRecord, config: ViberailsConfig): void {\n const pkg = resolvePackageForFile(stub.path, config);\n const testRunner = pkg?.stack?.testRunner ?? '';\n const runner = testRunner.startsWith('jest') ? 'jest' : 'vitest';\n const importLine =\n runner === 'jest'\n ? '' // jest globals are available without import\n : \"import { describe, it, expect } from 'vitest';\\n\\n\";\n\n const content = `${importLine}describe('${stub.moduleName}', () => {\\n it.todo('add tests');\\n});\\n`;\n\n fs.mkdirSync(path.dirname(stub.absPath), { recursive: true });\n fs.writeFileSync(stub.absPath, content);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport { compactConfig, generateConfig } from '@viberails/config';\nimport { scan } from '@viberails/scanner';\nimport chalk from 'chalk';\nimport { displayInitSummary, displayRulesPreview, displayScanResults } from '../display.js';\nimport { formatScanResultsText } from '../display-text.js';\nimport { applyRuleOverrides } from '../utils/apply-rule-overrides.js';\nimport {\n checkCoveragePrereqs,\n displayMissingPrereqs,\n promptMissingPrereqs,\n} from '../utils/check-prerequisites.js';\nimport { filterHighConfidence } from '../utils/filter-confidence.js';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport {\n confirm,\n confirmDangerous,\n promptInitDecision,\n promptIntegrations,\n promptRuleMenu,\n} from '../utils/prompt.js';\nimport { resolveWorkspacePackages } from '../utils/resolve-workspace-packages.js';\nimport { updateGitignore } from '../utils/update-gitignore.js';\nimport { writeGeneratedFiles } from '../utils/write-generated-files.js';\nimport {\n detectHookManager,\n setupClaudeCodeHook,\n setupClaudeMdReference,\n setupGithubAction,\n setupPreCommitHook,\n} from './init-hooks.js';\nimport {\n setupLintHook,\n setupSelectedIntegrations,\n setupTypecheckHook,\n} from './init-hooks-extra.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\nfunction getExemptedPackages(config: import('@viberails/types').ViberailsConfig): string[] {\n return config.packages\n .filter((pkg) => pkg.rules?.testCoverage === 0 && pkg.path !== '.')\n .map((pkg) => pkg.path);\n}\n\n/** Run the viberails init flow. */\nexport async function initCommand(\n options: { yes?: boolean; force?: boolean },\n cwd?: string,\n): Promise<void> {\n const projectRoot = findProjectRoot(cwd ?? process.cwd());\n if (!projectRoot) {\n throw new Error(\n 'No package.json found. Make sure you are inside a JS/TS project, then run:\\n npx viberails',\n );\n }\n\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (fs.existsSync(configPath) && !options.force) {\n console.log(\n `${chalk.yellow('!')} viberails is already initialized.\\n` +\n ` Run ${chalk.cyan('viberails config')} to edit rules, ${chalk.cyan('viberails sync')} to update, or ${chalk.cyan('viberails init --force')} to start fresh.`,\n );\n return;\n }\n if (options.yes) return initNonInteractive(projectRoot, configPath);\n await initInteractive(projectRoot, configPath, options);\n}\n\nasync function initNonInteractive(projectRoot: string, configPath: string): Promise<void> {\n console.log(chalk.dim('Scanning project...'));\n const scanResult = await scan(projectRoot);\n const config = generateConfig(scanResult);\n\n for (const pkg of config.packages) {\n const pkgMeta = config._meta?.packages?.[pkg.path]?.conventions;\n pkg.conventions = filterHighConfidence(pkg.conventions ?? {}, pkgMeta);\n }\n\n displayMissingPrereqs(checkCoveragePrereqs(projectRoot, scanResult));\n\n displayScanResults(scanResult);\n displayRulesPreview(config);\n\n const exempted = getExemptedPackages(config);\n if (exempted.length > 0) {\n console.log(\n ` ${chalk.dim('Auto-exempted from coverage:')} ${exempted.join(', ')} ${chalk.dim('(types-only)')}`,\n );\n }\n\n if (config.packages.length > 1) {\n console.log(chalk.dim('Building import graph...'));\n const { buildImportGraph, inferBoundaries } = await import('@viberails/graph');\n const packages = resolveWorkspacePackages(projectRoot, config.packages);\n const graph = await buildImportGraph(projectRoot, { packages, ignore: config.ignore });\n const inferred = inferBoundaries(graph);\n const denyCount = Object.values(inferred.deny).reduce((sum, arr) => sum + arr.length, 0);\n if (denyCount > 0) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n console.log(` Inferred ${denyCount} boundary rules`);\n }\n }\n\n const compacted = compactConfig(config);\n fs.writeFileSync(configPath, `${JSON.stringify(compacted, null, 2)}\\n`);\n writeGeneratedFiles(projectRoot, config, scanResult);\n updateGitignore(projectRoot);\n\n setupClaudeCodeHook(projectRoot);\n setupClaudeMdReference(projectRoot);\n const rootPkg = config.packages[0];\n const rootPkgPm = rootPkg?.stack?.packageManager ?? 'npm';\n const actionTarget = setupGithubAction(projectRoot, rootPkgPm);\n\n // Skip bare .git/hooks in --yes mode — they're local-only and won't be shared.\n const hookManager = detectHookManager(projectRoot);\n const hasHookManager = hookManager === 'Lefthook' || hookManager === 'Husky';\n const preCommitTarget = hasHookManager ? setupPreCommitHook(projectRoot) : undefined;\n const linter = rootPkg?.stack?.linter?.split('@')[0];\n\n const ok = chalk.green('\\u2713');\n const created = [\n `${ok} ${path.basename(configPath)}`,\n `${ok} .viberails/context.md`,\n `${ok} .viberails/scan-result.json`,\n `${ok} .claude/settings.json \\u2014 added viberails hook`,\n `${ok} CLAUDE.md \\u2014 added @.viberails/context.md reference`,\n preCommitTarget\n ? `${ok} ${preCommitTarget}`\n : `${chalk.yellow('!')} pre-commit hook skipped (install lefthook or husky)`,\n actionTarget ? `${ok} ${actionTarget} \\u2014 blocks PRs on violations` : '',\n ].filter(Boolean);\n\n if (hasHookManager && rootPkg?.stack?.language === 'typescript') setupTypecheckHook(projectRoot);\n if (hasHookManager && linter) setupLintHook(projectRoot, linter);\n console.log(`\\nCreated:\\n${created.map((f) => ` ${f}`).join('\\n')}`);\n}\n\nasync function initInteractive(\n projectRoot: string,\n configPath: string,\n options: { force?: boolean },\n): Promise<void> {\n clack.intro('viberails');\n\n if (fs.existsSync(configPath) && options.force) {\n const replace = await confirmDangerous(\n `${path.basename(configPath)} already exists and will be replaced. Continue?`,\n );\n if (!replace) {\n clack.outro('Aborted. No files were written.');\n return;\n }\n }\n\n const s = clack.spinner();\n s.start('Scanning project...');\n const scanResult = await scan(projectRoot);\n const config = generateConfig(scanResult);\n s.stop('Scan complete');\n\n const prereqResult = await promptMissingPrereqs(\n projectRoot,\n checkCoveragePrereqs(projectRoot, scanResult),\n );\n if (prereqResult.disableCoverage) {\n config.rules.testCoverage = 0;\n }\n\n if (scanResult.statistics.totalFiles === 0) {\n clack.log.warn(\n 'No source files detected. Try running from the project root,\\n' +\n 'or check that source files exist. Run viberails sync after adding files.',\n );\n }\n\n clack.note(formatScanResultsText(scanResult), 'Scan results');\n\n const exemptedPkgs = getExemptedPackages(config);\n displayInitSummary(config, exemptedPkgs);\n\n const decision = await promptInitDecision();\n\n if (decision === 'customize') {\n const rootPkg = config.packages.find((p) => p.path === '.') ?? config.packages[0];\n const overrides = await promptRuleMenu({\n maxFileLines: config.rules.maxFileLines,\n testCoverage: config.rules.testCoverage,\n enforceMissingTests: config.rules.enforceMissingTests,\n enforceNaming: config.rules.enforceNaming,\n fileNamingValue: rootPkg.conventions?.fileNaming,\n coverageSummaryPath: 'coverage/coverage-summary.json',\n coverageCommand: config.defaults?.coverage?.command,\n packageOverrides: config.packages,\n });\n\n applyRuleOverrides(config, overrides);\n }\n\n if (config.packages.length > 1) {\n clack.note(\n 'Boundary rules prevent packages from importing where they\\n' +\n \"shouldn't. viberails scans your existing imports and creates\\n\" +\n \"rules based on what's already working.\",\n 'Boundaries',\n );\n const shouldInfer = await confirm('Infer boundary rules from import patterns?');\n\n if (shouldInfer) {\n const bs = clack.spinner();\n bs.start('Building import graph...');\n const { buildImportGraph, inferBoundaries } = await import('@viberails/graph');\n const packages = resolveWorkspacePackages(projectRoot, config.packages);\n const graph = await buildImportGraph(projectRoot, { packages, ignore: config.ignore });\n const inferred = inferBoundaries(graph);\n const denyCount = Object.values(inferred.deny).reduce((sum, arr) => sum + arr.length, 0);\n if (denyCount > 0) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n bs.stop(`Inferred ${denyCount} boundary rules`);\n const boundaryLines = Object.entries(inferred.deny)\n .map(([pkg, denied]) => `${pkg} must NOT import from: ${denied.join(', ')}`)\n .join('\\n');\n clack.note(boundaryLines, 'Boundary rules');\n } else {\n bs.stop('No boundary rules inferred');\n }\n }\n }\n\n const hookManager = detectHookManager(projectRoot);\n const rootPkgStack = (config.packages.find((p) => p.path === '.') ?? config.packages[0])?.stack;\n const integrations = await promptIntegrations(projectRoot, hookManager, {\n isTypeScript: rootPkgStack?.language === 'typescript',\n linter: rootPkgStack?.linter?.split('@')[0],\n packageManager: rootPkgStack?.packageManager,\n });\n\n const shouldWrite = await confirm('Write configuration and set up selected integrations?');\n if (!shouldWrite) {\n clack.outro('Aborted. No files were written.');\n return;\n }\n\n const compacted = compactConfig(config);\n fs.writeFileSync(configPath, `${JSON.stringify(compacted, null, 2)}\\n`);\n writeGeneratedFiles(projectRoot, config, scanResult);\n updateGitignore(projectRoot);\n\n const createdFiles: string[] = [\n path.basename(configPath),\n '.viberails/context.md',\n '.viberails/scan-result.json',\n ...setupSelectedIntegrations(projectRoot, integrations, {\n linter: rootPkgStack?.linter?.split('@')[0],\n packageManager: rootPkgStack?.packageManager,\n }),\n ];\n\n clack.log.success(`Created:\\n${createdFiles.map((f) => ` ${f}`).join('\\n')}`);\n clack.outro(\n `Done! Next: review viberails.config.json, then run viberails check\\n` +\n ` ${chalk.dim('Tip: use')} ${chalk.cyan('viberails check --enforce')} ${chalk.dim('in CI to block PRs on violations.')}`,\n );\n}\n","import { spawnSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport type { ScanResult } from '@viberails/types';\nimport chalk from 'chalk';\nimport { assertNotCancelled } from './prompt.js';\n\nexport interface PrereqResult {\n label: string;\n installed: boolean;\n installCommand?: string;\n reason: string;\n /** Package paths that use the runner requiring this dependency (monorepo). */\n affectedPackages?: string[];\n}\n\n/**\n * Detect coverage prerequisites based on the scan result.\n * Checks whether the required coverage provider package is installed.\n * In monorepos, scans all packages for their test runners.\n */\nexport function checkCoveragePrereqs(projectRoot: string, scanResult: ScanResult): PrereqResult[] {\n const pm = scanResult.stack.packageManager.name;\n\n // Collect vitest-using packages from per-package scan results\n const vitestPackages = scanResult.packages\n .filter((pkg) => pkg.stack.testRunner?.name === 'vitest')\n .map((pkg) => pkg.relativePath);\n\n // Fall back to global runner for single-package projects or empty packages array\n const hasVitest = vitestPackages.length > 0 || scanResult.stack.testRunner?.name === 'vitest';\n\n if (!hasVitest) return [];\n\n // Check root package.json first (workspace hoisting makes this available everywhere)\n let installed =\n hasDependency(projectRoot, '@vitest/coverage-v8') ||\n hasDependency(projectRoot, '@vitest/coverage-istanbul');\n\n // If not at root, check whether every vitest-using package has it locally\n if (!installed && vitestPackages.length > 0) {\n installed = vitestPackages.every((rel) => {\n const pkgDir = path.join(projectRoot, rel);\n return (\n hasDependency(pkgDir, '@vitest/coverage-v8') ||\n hasDependency(pkgDir, '@vitest/coverage-istanbul')\n );\n });\n }\n\n const addCmd = pm === 'yarn' ? 'yarn add -D' : pm === 'npm' ? 'npm install -D' : `${pm} add -D`;\n const affectedPackages = vitestPackages.length > 1 ? vitestPackages : undefined;\n const reason = affectedPackages\n ? `Required for coverage in: ${affectedPackages.join(', ')}`\n : 'Required for coverage percentage checks with vitest';\n\n return [\n {\n label: '@vitest/coverage-v8',\n installed,\n installCommand: installed ? undefined : `${addCmd} @vitest/coverage-v8`,\n reason,\n affectedPackages,\n },\n ];\n}\n\n/**\n * Display missing prereqs in non-interactive (--yes) mode.\n */\nexport function displayMissingPrereqs(prereqs: PrereqResult[]): void {\n const missing = prereqs.filter((p) => !p.installed);\n for (const m of missing) {\n const suffix = m.affectedPackages\n ? ` \\u2014 needed for coverage in: ${m.affectedPackages.join(', ')}`\n : ` \\u2014 ${m.reason}`;\n console.log(` ${chalk.yellow('!')} ${m.label} not installed${suffix}`);\n if (m.installCommand) {\n console.log(` Install: ${chalk.cyan(m.installCommand)}`);\n }\n }\n}\n\nexport interface PrereqPromptResult {\n /** Whether the user chose to disable coverage percentage checks. */\n disableCoverage: boolean;\n}\n\n/**\n * Prompt the user to handle missing prereqs in interactive mode.\n * Offers three choices: install now, disable coverage, or skip (keep enabled but warn later).\n */\nexport async function promptMissingPrereqs(\n projectRoot: string,\n prereqs: PrereqResult[],\n): Promise<PrereqPromptResult> {\n const missing = prereqs.filter((p) => !p.installed);\n if (missing.length === 0) return { disableCoverage: false };\n\n const prereqLines = prereqs\n .map((p) => {\n if (p.installed) return `\\u2713 ${p.label}`;\n const detail = p.affectedPackages ? `needed by: ${p.affectedPackages.join(', ')}` : p.reason;\n return `\\u2717 ${p.label} \\u2014 ${detail}`;\n })\n .join('\\n');\n clack.note(prereqLines, 'Coverage prerequisites');\n\n let disableCoverage = false;\n\n for (const m of missing) {\n if (!m.installCommand) continue;\n\n const pkgCount = m.affectedPackages?.length;\n const message = pkgCount\n ? `${m.label} is not installed. Required for coverage in ${pkgCount} packages using vitest.`\n : `${m.label} is not installed. It is required for coverage percentage checks.`;\n const choice = await clack.select({\n message,\n options: [\n {\n value: 'install' as const,\n label: `Yes, install now`,\n hint: m.installCommand,\n },\n {\n value: 'disable' as const,\n label: 'No, disable coverage percentage checks',\n hint: 'missing-test checks still active',\n },\n {\n value: 'skip' as const,\n label: 'Skip for now',\n hint: `install later: ${m.installCommand}`,\n },\n ],\n });\n assertNotCancelled(choice);\n\n if (choice === 'install') {\n const is = clack.spinner();\n is.start(`Installing ${m.label}...`);\n const result = spawnSync(m.installCommand, {\n cwd: projectRoot,\n shell: true,\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n if (result.status === 0) {\n is.stop(`Installed ${m.label}`);\n } else {\n is.stop(`Failed to install ${m.label}`);\n clack.log.warn(\n `Install manually: ${m.installCommand}\\n` +\n 'Coverage percentage checks will not work until the dependency is installed.',\n );\n }\n } else if (choice === 'disable') {\n disableCoverage = true;\n clack.log.info('Coverage percentage checks disabled. Missing-test checks remain active.');\n } else {\n clack.log.info(\n `Coverage percentage checks will fail until ${m.label} is installed.\\n` +\n `Install later: ${m.installCommand}`,\n );\n }\n }\n\n return { disableCoverage };\n}\n\nfunction hasDependency(projectRoot: string, name: string): boolean {\n try {\n const pkgPath = path.join(projectRoot, 'package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n return !!(pkg.devDependencies?.[name] || pkg.dependencies?.[name]);\n } catch {\n return false;\n }\n}\n","import type { ConfigConventions } from '@viberails/types';\n\n/**\n * Filter conventions to only include high-confidence entries (using _meta).\n * Used in --yes mode to avoid enforcing uncertain detections.\n */\nexport function filterHighConfidence(\n conventions: ConfigConventions,\n meta?: Record<string, { confidence: string }>,\n): ConfigConventions {\n if (!meta) return conventions;\n const filtered: ConfigConventions = {};\n for (const [key, value] of Object.entries(conventions)) {\n if (value === undefined) continue;\n const convMeta = meta[key];\n if (!convMeta || convMeta.confidence === 'high') {\n filtered[key as keyof ConfigConventions] = value;\n }\n }\n return filtered;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Append viberails entries to .gitignore if not already present.\n * Only scan-result.json is ignored — context.md should be committed\n * so AI agents can read the enforced rules.\n */\nexport function updateGitignore(projectRoot: string): void {\n const gitignorePath = path.join(projectRoot, '.gitignore');\n let content = '';\n\n if (fs.existsSync(gitignorePath)) {\n content = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n if (!content.includes('.viberails/scan-result.json')) {\n const block = '\\n# viberails\\n.viberails/scan-result.json\\n';\n const prefix = content.length === 0 ? '' : `${content.trimEnd()}\\n`;\n fs.writeFileSync(gitignorePath, `${prefix}${block}`);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\n\n/**\n * Set up a pre-commit hook that runs viberails check on staged files.\n * Detects Lefthook, Husky, or falls back to a raw git hook.\n */\nexport function setupPreCommitHook(projectRoot: string): string | undefined {\n // Check for Lefthook\n const lefthookPath = path.join(projectRoot, 'lefthook.yml');\n if (fs.existsSync(lefthookPath)) {\n addLefthookPreCommit(lefthookPath);\n console.log(` ${chalk.green('✓')} lefthook.yml — added viberails pre-commit`);\n return 'lefthook.yml';\n }\n\n // Check for Husky\n const huskyDir = path.join(projectRoot, '.husky');\n if (fs.existsSync(huskyDir)) {\n writeHuskyPreCommit(huskyDir);\n console.log(` ${chalk.green('✓')} .husky/pre-commit — added viberails check`);\n return '.husky/pre-commit';\n }\n\n // Fall back to raw git hook\n const gitDir = path.join(projectRoot, '.git');\n if (fs.existsSync(gitDir)) {\n const hooksDir = path.join(gitDir, 'hooks');\n if (!fs.existsSync(hooksDir)) {\n fs.mkdirSync(hooksDir, { recursive: true });\n }\n writeGitHookPreCommit(hooksDir);\n console.log(` ${chalk.green('✓')} .git/hooks/pre-commit`);\n return '.git/hooks/pre-commit';\n }\n\n return undefined;\n}\n\nfunction writeGitHookPreCommit(hooksDir: string): void {\n const hookPath = path.join(hooksDir, 'pre-commit');\n if (fs.existsSync(hookPath)) {\n const existing = fs.readFileSync(hookPath, 'utf-8');\n if (existing.includes('viberails')) return;\n fs.writeFileSync(\n hookPath,\n `${existing.trimEnd()}\\n\\n# viberails check\\nnpx viberails check --staged\\n`,\n );\n return;\n }\n const script = [\n '#!/bin/sh',\n '# Generated by viberails — https://viberails.sh',\n '',\n 'npx viberails check --staged',\n '',\n ].join('\\n');\n fs.writeFileSync(hookPath, script, { mode: 0o755 });\n}\n\nfunction addLefthookPreCommit(lefthookPath: string): void {\n const content = fs.readFileSync(lefthookPath, 'utf-8');\n if (content.includes('viberails')) return;\n\n const doc = parseYaml(content) ?? {};\n\n if (!doc['pre-commit']) {\n doc['pre-commit'] = { commands: {} };\n }\n if (!doc['pre-commit'].commands) {\n doc['pre-commit'].commands = {};\n }\n\n doc['pre-commit'].commands.viberails = {\n run: 'npx viberails check --staged',\n };\n\n fs.writeFileSync(lefthookPath, stringifyYaml(doc));\n}\n\n/**\n * Detect which pre-commit hook manager is present.\n * Returns a label like \"Lefthook\", \"Husky\", \"git hook\", or undefined if no .git.\n */\nexport function detectHookManager(projectRoot: string): string | undefined {\n if (fs.existsSync(path.join(projectRoot, 'lefthook.yml'))) return 'Lefthook';\n if (fs.existsSync(path.join(projectRoot, '.husky'))) return 'Husky';\n if (fs.existsSync(path.join(projectRoot, '.git'))) return 'git hook';\n return undefined;\n}\n\n/**\n * Set up a Claude Code PostToolUse hook that checks files after edit/write.\n * Writes to .claude/settings.json (project-level, team-shared).\n */\nexport function setupClaudeCodeHook(projectRoot: string): void {\n const claudeDir = path.join(projectRoot, '.claude');\n if (!fs.existsSync(claudeDir)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n }\n\n const settingsPath = path.join(claudeDir, 'settings.json');\n let settings: Record<string, unknown> = {};\n\n if (fs.existsSync(settingsPath)) {\n try {\n settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));\n } catch {\n console.warn(\n ` ${chalk.yellow('!')} .claude/settings.json contains invalid JSON — skipping hook setup`,\n );\n console.warn(` Fix the JSON manually, then re-run ${chalk.cyan('viberails init --force')}`);\n return;\n }\n }\n\n const hooks = (settings.hooks ?? {}) as Record<string, unknown[]>;\n\n // Check if viberails hook already exists\n const existing = hooks.PostToolUse ?? [];\n if (existing.some((h) => JSON.stringify(h).includes('viberails'))) return;\n\n // The --hook flag handles everything: reads stdin JSON, extracts file_path,\n // runs the check, outputs violations to stderr, and exits 2 on violations.\n // Prefer the local binary (fast) over npx (slow cold-start).\n const hookCommand =\n 'if [ -x ./node_modules/.bin/viberails ]; then ./node_modules/.bin/viberails check --hook; else npx viberails check --hook; fi';\n\n hooks.PostToolUse = [\n ...existing,\n {\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: hookCommand,\n },\n ],\n },\n ];\n\n settings.hooks = hooks;\n fs.writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`);\n console.log(` ${chalk.green('✓')} .claude/settings.json — added viberails PostToolUse hook`);\n}\n\n/**\n * Append a @.viberails/context.md reference to the project's CLAUDE.md.\n * Creates CLAUDE.md if it doesn't exist. Skips if the reference is already present.\n */\nexport function setupClaudeMdReference(projectRoot: string): void {\n const claudeMdPath = path.join(projectRoot, 'CLAUDE.md');\n let content = '';\n\n if (fs.existsSync(claudeMdPath)) {\n content = fs.readFileSync(claudeMdPath, 'utf-8');\n }\n\n if (content.includes('@.viberails/context.md')) return;\n\n const ref = '\\n@.viberails/context.md\\n';\n const prefix = content.length === 0 ? '' : content.trimEnd();\n fs.writeFileSync(claudeMdPath, prefix + ref);\n console.log(` ${chalk.green('✓')} CLAUDE.md — added @.viberails/context.md reference`);\n}\n\n/**\n * Generate a GitHub Actions workflow that runs viberails check --enforce on PRs.\n * Detects the project's package manager for correct install/run commands.\n */\nexport function setupGithubAction(projectRoot: string, packageManager: string): string | undefined {\n const workflowDir = path.join(projectRoot, '.github', 'workflows');\n const workflowPath = path.join(workflowDir, 'viberails.yml');\n\n if (fs.existsSync(workflowPath)) {\n const existing = fs.readFileSync(workflowPath, 'utf-8');\n if (existing.includes('viberails')) return undefined;\n }\n\n fs.mkdirSync(workflowDir, { recursive: true });\n\n const pm = packageManager || 'npm';\n const installCmd =\n pm === 'yarn'\n ? 'yarn install --frozen-lockfile'\n : pm === 'pnpm'\n ? 'pnpm install --frozen-lockfile'\n : 'npm ci';\n const runPrefix = pm === 'npm' ? 'npx' : `${pm} exec`;\n\n const lines = [\n 'name: viberails',\n '',\n 'on:',\n ' pull_request:',\n ' branches: [main]',\n '',\n 'jobs:',\n ' check:',\n ' runs-on: ubuntu-latest',\n ' steps:',\n ' - uses: actions/checkout@v4',\n ' with:',\n ' fetch-depth: 0',\n '',\n ];\n\n if (pm === 'pnpm') {\n lines.push(' - uses: pnpm/action-setup@v4', '');\n }\n\n lines.push(\n ' - uses: actions/setup-node@v4',\n ' with:',\n ' node-version: 22',\n pm !== 'npm' ? ` cache: ${pm}` : '',\n '',\n ` - run: ${installCmd}`,\n ` - run: ${runPrefix} viberails check --enforce --diff-base origin/\\${{ github.event.pull_request.base.ref }}`,\n '',\n );\n\n const content = lines.filter((l) => l !== undefined).join('\\n');\n fs.writeFileSync(workflowPath, content);\n return '.github/workflows/viberails.yml';\n}\n\nfunction writeHuskyPreCommit(huskyDir: string): void {\n const hookPath = path.join(huskyDir, 'pre-commit');\n if (fs.existsSync(hookPath)) {\n const existing = fs.readFileSync(hookPath, 'utf-8');\n if (!existing.includes('viberails')) {\n fs.writeFileSync(hookPath, `${existing.trimEnd()}\\nnpx viberails check --staged\\n`);\n }\n return;\n }\n fs.writeFileSync(hookPath, '#!/bin/sh\\nnpx viberails check --staged\\n', { mode: 0o755 });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { IntegrationChoice } from '../utils/prompt-integrations.js';\nimport {\n setupClaudeCodeHook,\n setupClaudeMdReference,\n setupGithubAction,\n setupPreCommitHook,\n} from './init-hooks.js';\n\n/**\n * Add a named pre-commit command to the detected hook manager.\n * Idempotent — skips if the marker string is already present.\n */\nexport function addPreCommitStep(\n projectRoot: string,\n name: string,\n command: string,\n marker: string,\n): string | undefined {\n const lefthookPath = path.join(projectRoot, 'lefthook.yml');\n if (fs.existsSync(lefthookPath)) {\n const content = fs.readFileSync(lefthookPath, 'utf-8');\n if (content.includes(marker)) return undefined;\n const doc = parseYaml(content) ?? {};\n if (!doc['pre-commit']) doc['pre-commit'] = { commands: {} };\n if (!doc['pre-commit'].commands) doc['pre-commit'].commands = {};\n doc['pre-commit'].commands[name] = { run: command };\n fs.writeFileSync(lefthookPath, stringifyYaml(doc));\n return 'lefthook.yml';\n }\n\n const huskyDir = path.join(projectRoot, '.husky');\n if (fs.existsSync(huskyDir)) {\n const hookPath = path.join(huskyDir, 'pre-commit');\n if (fs.existsSync(hookPath)) {\n const existing = fs.readFileSync(hookPath, 'utf-8');\n if (existing.includes(marker)) return undefined;\n fs.writeFileSync(hookPath, `${existing.trimEnd()}\\n${command}\\n`);\n } else {\n fs.writeFileSync(hookPath, `#!/bin/sh\\n${command}\\n`, { mode: 0o755 });\n }\n return '.husky/pre-commit';\n }\n\n const gitDir = path.join(projectRoot, '.git');\n if (fs.existsSync(gitDir)) {\n const hooksDir = path.join(gitDir, 'hooks');\n if (!fs.existsSync(hooksDir)) fs.mkdirSync(hooksDir, { recursive: true });\n const hookPath = path.join(hooksDir, 'pre-commit');\n if (fs.existsSync(hookPath)) {\n const existing = fs.readFileSync(hookPath, 'utf-8');\n if (existing.includes(marker)) return undefined;\n fs.writeFileSync(hookPath, `${existing.trimEnd()}\\n\\n# ${name}\\n${command}\\n`);\n } else {\n fs.writeFileSync(hookPath, `#!/bin/sh\\n# Generated by viberails\\n\\n# ${name}\\n${command}\\n`, {\n mode: 0o755,\n });\n }\n return '.git/hooks/pre-commit';\n }\n\n return undefined;\n}\n\n/** Set up a tsc --noEmit pre-commit step. */\nexport function setupTypecheckHook(projectRoot: string): string | undefined {\n const target = addPreCommitStep(projectRoot, 'typecheck', 'npx tsc --noEmit', 'tsc');\n if (target) {\n console.log(` ${chalk.green('✓')} ${target} — added typecheck (tsc --noEmit)`);\n }\n return target;\n}\n\n/** Set up a linter pre-commit step. */\nexport function setupLintHook(projectRoot: string, linter: string): string | undefined {\n const command = linter === 'biome' ? 'npx biome check .' : 'npx eslint .';\n const linterName = linter === 'biome' ? 'Biome' : 'ESLint';\n const target = addPreCommitStep(projectRoot, 'lint', command, linter);\n if (target) {\n console.log(` ${chalk.green('✓')} ${target} — added ${linterName} lint check`);\n }\n return target;\n}\n\n/** Apply selected integrations and return list of created file descriptions. */\nexport function setupSelectedIntegrations(\n projectRoot: string,\n integrations: IntegrationChoice,\n opts: { linter?: string; packageManager?: string },\n): string[] {\n const created: string[] = [];\n if (integrations.preCommitHook) {\n const t = setupPreCommitHook(projectRoot);\n created.push(t ? `${t} — added viberails pre-commit` : 'pre-commit hook skipped');\n }\n if (integrations.typecheckHook) {\n const t = setupTypecheckHook(projectRoot);\n if (t) created.push(`${t} — added typecheck`);\n }\n if (integrations.lintHook && opts.linter) {\n const t = setupLintHook(projectRoot, opts.linter);\n if (t) created.push(`${t} — added lint check`);\n }\n if (integrations.claudeCodeHook) {\n setupClaudeCodeHook(projectRoot);\n created.push('.claude/settings.json — added viberails hook');\n }\n if (integrations.claudeMdRef) {\n setupClaudeMdReference(projectRoot);\n created.push('CLAUDE.md — added @.viberails/context.md reference');\n }\n if (integrations.githubAction) {\n const t = setupGithubAction(projectRoot, opts.packageManager ?? 'npm');\n if (t) created.push(`${t} — blocks PRs on violations`);\n }\n return created;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport { compactConfig, loadConfig, mergeConfig } from '@viberails/config';\nimport { scan } from '@viberails/scanner';\nimport type { CodebaseStatistics } from '@viberails/types';\nimport chalk from 'chalk';\nimport { formatRulesText } from '../display-text.js';\nimport { applyRuleOverrides } from '../utils/apply-rule-overrides.js';\nimport { diffConfigs, formatStatsDelta } from '../utils/diff-configs.js';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { assertNotCancelled, promptRuleMenu } from '../utils/prompt.js';\nimport { writeGeneratedFiles } from '../utils/write-generated-files.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\nconst SCAN_RESULT_FILE = '.viberails/scan-result.json';\n\n/**\n * Try to load previous scan statistics from scan-result.json.\n */\nfunction loadPreviousStats(projectRoot: string): CodebaseStatistics | undefined {\n const scanResultPath = path.join(projectRoot, SCAN_RESULT_FILE);\n try {\n const raw = fs.readFileSync(scanResultPath, 'utf-8');\n const parsed = JSON.parse(raw);\n if (parsed?.statistics?.totalFiles !== undefined) {\n return parsed.statistics as CodebaseStatistics;\n }\n } catch {\n // File missing or malformed — skip stats delta\n }\n return undefined;\n}\n\n/**\n * Run the viberails sync flow: re-scan, merge config, regenerate context.\n *\n * @param options - Command options (interactive mode)\n * @param cwd - Working directory override (for testing)\n */\nexport async function syncCommand(\n options?: { interactive?: boolean },\n cwd?: string,\n): Promise<void> {\n const startDir = cwd ?? process.cwd();\n\n // 1. Find project root\n const projectRoot = findProjectRoot(startDir);\n if (!projectRoot) {\n throw new Error(\n 'No package.json found in this directory or any parent.\\n\\n' +\n 'Make sure you are inside a JavaScript or TypeScript project, then run:\\n' +\n ' npx viberails',\n );\n }\n\n // 2. Load existing config and previous stats\n const configPath = path.join(projectRoot, CONFIG_FILE);\n const existing = await loadConfig(configPath);\n const previousStats = loadPreviousStats(projectRoot);\n\n // 3. Re-scan\n console.log(chalk.dim('Scanning project...'));\n const scanResult = await scan(projectRoot);\n\n // 4. Merge config and detect changes\n const merged = mergeConfig(existing, scanResult);\n const compacted = compactConfig(merged);\n const compactedJson = JSON.stringify(compacted, null, 2);\n\n // Compare against raw disk JSON (ignoring lastSync timestamp)\n const rawDisk = fs.readFileSync(configPath, 'utf-8').trim();\n const diskWithoutSync = rawDisk.replace(/\"lastSync\":\\s*\"[^\"]*\"/, '\"lastSync\": \"\"');\n const mergedWithoutSync = compactedJson.replace(/\"lastSync\":\\s*\"[^\"]*\"/, '\"lastSync\": \"\"');\n const configChanged = diskWithoutSync !== mergedWithoutSync;\n\n // 5. Report specific changes\n const changes = configChanged ? diffConfigs(existing, merged) : [];\n const statsDelta = previousStats\n ? formatStatsDelta(previousStats, scanResult.statistics)\n : undefined;\n\n if (changes.length > 0 || statsDelta) {\n console.log(`\\n${chalk.bold('Changes:')}`);\n for (const change of changes) {\n const icon = change.type === 'removed' ? chalk.red('-') : chalk.green('+');\n console.log(` ${icon} ${change.description}`);\n }\n if (statsDelta) {\n console.log(` ${chalk.dim(statsDelta)}`);\n }\n }\n\n // 5b. Interactive review (if --interactive)\n if (options?.interactive) {\n clack.intro('viberails sync (interactive)');\n clack.note(formatRulesText(merged).join('\\n'), 'Rules after sync');\n\n const decision = await clack.select({\n message: 'How would you like to proceed?',\n options: [\n { value: 'accept' as const, label: 'Accept changes' },\n { value: 'customize' as const, label: 'Customize rules' },\n { value: 'cancel' as const, label: 'Cancel (no changes written)' },\n ],\n });\n assertNotCancelled(decision);\n\n if (decision === 'cancel') {\n clack.outro('Sync cancelled. No files were written.');\n return;\n }\n\n if (decision === 'customize') {\n const rootPkg = merged.packages.find((p) => p.path === '.') ?? merged.packages[0];\n const overrides = await promptRuleMenu({\n maxFileLines: merged.rules.maxFileLines,\n testCoverage: merged.rules.testCoverage,\n enforceMissingTests: merged.rules.enforceMissingTests,\n enforceNaming: merged.rules.enforceNaming,\n fileNamingValue: rootPkg.conventions?.fileNaming,\n coverageSummaryPath: rootPkg.coverage?.summaryPath ?? 'coverage/coverage-summary.json',\n coverageCommand: merged.defaults?.coverage?.command,\n packageOverrides: merged.packages,\n });\n applyRuleOverrides(merged, overrides);\n\n // Recompact after overrides\n const recompacted = compactConfig(merged);\n fs.writeFileSync(configPath, `${JSON.stringify(recompacted, null, 2)}\\n`);\n writeGeneratedFiles(projectRoot, merged, scanResult);\n\n clack.log.success('Updated config with your customizations.');\n clack.outro('Done! Run viberails check to verify.');\n return;\n }\n }\n\n // 6. Write config (compacted)\n fs.writeFileSync(configPath, `${compactedJson}\\n`);\n\n // 7. Regenerate context and scan-result.json\n writeGeneratedFiles(projectRoot, merged, scanResult);\n\n // 8. Summary\n console.log(`\\n${chalk.bold('Synced:')}`);\n if (configChanged) {\n console.log(` ${chalk.yellow('!')} ${CONFIG_FILE} — updated (review changes)`);\n } else {\n console.log(` ${chalk.green('✓')} ${CONFIG_FILE} — unchanged`);\n }\n console.log(` ${chalk.green('✓')} .viberails/context.md — regenerated`);\n console.log(` ${chalk.green('✓')} .viberails/scan-result.json — updated`);\n}\n"],"mappings":"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","names":["chalk","fs","path","clack","fs","path","clack","clack","clack","confirm","fs","path","confirm","fs","path","loadConfig","chalk","spawnSync","fs","path","pkg","fs","path","BUILTIN_IGNORE","fs","path","SOURCE_EXTS","packageRoot","basename","CONFIG_FILE","chalk","loadConfig","log","fs","fs","path","clack","compactConfig","loadConfig","chalk","CONVENTION_LABELS","FRAMEWORK_NAMES","LIBRARY_NAMES","ORM_NAMES","STYLING_NAMES","FRAMEWORK_NAMES","STYLING_NAMES","chalk","chalk","chalk","chalk","FRAMEWORK_NAMES","STYLING_NAMES","CONVENTION_LABELS","FRAMEWORK_NAMES","STYLING_NAMES","ORM_NAMES","LIBRARY_NAMES","CONVENTION_LABELS","FRAMEWORK_NAMES","ORM_NAMES","STYLING_NAMES","fs","path","CONFIG_FILE","chalk","loadConfig","confirm","compactConfig","fs","path","loadConfig","chalk","execSync","chalk","path","fs","path","fs","path","basename","CONFIG_FILE","chalk","loadConfig","fs","path","clack","compactConfig","scan","chalk","spawnSync","fs","path","clack","chalk","chalk","spawnSync","fs","path","fs","path","chalk","fs","path","chalk","parseYaml","stringifyYaml","parseYaml","stringifyYaml","chalk","CONFIG_FILE","chalk","scan","compactConfig","confirm","fs","path","clack","compactConfig","loadConfig","mergeConfig","scan","chalk","CONFIG_FILE","SCAN_RESULT_FILE","loadConfig","chalk","scan","mergeConfig","compactConfig","chalk","exitCode"]}