viberails 0.6.3 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/get-root-package.ts","../src/utils/prompt-constants.ts","../src/utils/prompt-submenus.ts","../src/utils/prompt.ts","../src/utils/prompt-integrations.ts","../src/utils/spawn-async.ts","../src/utils/prompt-rules.ts","../src/utils/prompt-menu-handlers.ts","../src/utils/prompt-package-overrides.ts"],"sourcesContent":["import type { PackageConfig } from '@viberails/types';\n\n/**\n * Find the root package (path === '.') from a packages array.\n * Falls back to the first package if no root is found.\n */\nexport function getRootPackage(packages: PackageConfig[]): PackageConfig {\n return packages.find((pkg) => pkg.path === '.') ?? packages[0];\n}\n","export const SENTINEL_DONE = '__done__';\nexport const SENTINEL_CLEAR = '__clear__';\nexport const SENTINEL_CUSTOM = '__custom__';\nexport const SENTINEL_NONE = '__none__';\nexport const SENTINEL_INHERIT = '__inherit__';\nexport const SENTINEL_SKIP = '__skip__';\n","import * as clack from '@clack/prompts';\nimport { assertNotCancelled } from './prompt.js';\nimport { SENTINEL_CLEAR, SENTINEL_CUSTOM } from './prompt-constants.js';\nimport type { RuleOverrides } from './prompt-rules.js';\n\nexport const FILE_NAMING_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] as const;\n\nexport const COMPONENT_NAMING_OPTIONS = [\n { value: 'PascalCase', label: 'PascalCase', hint: 'MyComponent.tsx' },\n { value: 'camelCase', label: 'camelCase', hint: 'myComponent.tsx' },\n] as const;\n\nexport const HOOK_NAMING_OPTIONS = [\n { value: 'useXxx', label: 'useXxx', hint: 'useAuth, useFormData' },\n { value: 'use-*', label: 'use-*', hint: 'use-auth, use-form-data' },\n] as const;\n\n/** Sub-menu for file limit settings. */\nexport async function promptFileLimitsMenu(state: RuleOverrides): Promise<void> {\n while (true) {\n const choice = await clack.select({\n message: 'File limits',\n options: [\n { value: 'maxFileLines', label: 'Max file lines', hint: String(state.maxFileLines) },\n {\n value: 'maxTestFileLines',\n label: 'Max test file lines',\n hint: state.maxTestFileLines > 0 ? String(state.maxTestFileLines) : '0 (unlimited)',\n },\n { value: 'back', label: 'Back' },\n ],\n });\n assertNotCancelled(choice);\n if (choice === 'back') return;\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 === 'maxTestFileLines') {\n const result = await clack.text({\n message: 'Maximum lines per test file (0 to disable)?',\n initialValue: String(state.maxTestFileLines),\n validate: (v) => {\n if (typeof v !== 'string') return 'Enter a number (0 or positive)';\n const n = Number.parseInt(v, 10);\n if (Number.isNaN(n) || n < 0) return 'Enter a number (0 or positive)';\n },\n });\n assertNotCancelled(result);\n state.maxTestFileLines = Number.parseInt(result, 10);\n }\n }\n}\n\n/** Sub-menu for naming and convention settings. */\nexport async function promptNamingMenu(state: RuleOverrides): Promise<void> {\n while (true) {\n const options: { value: string; label: string; hint?: string }[] = [\n {\n value: 'enforceNaming',\n label: 'Enforce file naming',\n hint: state.enforceNaming ? 'yes' : 'no',\n },\n ];\n\n if (state.enforceNaming) {\n options.push({\n value: 'fileNaming',\n label: 'File naming convention',\n hint: state.fileNamingValue ?? '(not set)',\n });\n }\n\n options.push(\n {\n value: 'componentNaming',\n label: 'Component naming',\n hint: state.componentNaming ?? '(not set)',\n },\n {\n value: 'hookNaming',\n label: 'Hook naming',\n hint: state.hookNaming ?? '(not set)',\n },\n {\n value: 'importAlias',\n label: 'Import alias',\n hint: state.importAlias ?? '(not set)',\n },\n { value: 'back', label: 'Back' },\n );\n\n const choice = await clack.select({ message: 'Naming & conventions', options });\n assertNotCancelled(choice);\n if (choice === 'back') return;\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\n if (result && !state.fileNamingValue) {\n // Must pick a convention before enabling enforcement\n const selected = await clack.select({\n message: 'Which file naming convention should be enforced?',\n options: [...FILE_NAMING_OPTIONS],\n });\n assertNotCancelled(selected);\n state.fileNamingValue = selected;\n }\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: [...FILE_NAMING_OPTIONS],\n initialValue: state.fileNamingValue,\n });\n assertNotCancelled(selected);\n state.fileNamingValue = selected;\n }\n\n if (choice === 'componentNaming') {\n const selected = await clack.select({\n message: 'Component naming convention',\n options: [\n ...COMPONENT_NAMING_OPTIONS,\n { value: SENTINEL_CLEAR, label: 'Clear (no convention)' },\n ],\n initialValue: state.componentNaming ?? SENTINEL_CLEAR,\n });\n assertNotCancelled(selected);\n state.componentNaming = selected === SENTINEL_CLEAR ? undefined : selected;\n }\n\n if (choice === 'hookNaming') {\n const selected = await clack.select({\n message: 'Hook naming convention',\n options: [\n ...HOOK_NAMING_OPTIONS,\n { value: SENTINEL_CLEAR, label: 'Clear (no convention)' },\n ],\n initialValue: state.hookNaming ?? SENTINEL_CLEAR,\n });\n assertNotCancelled(selected);\n state.hookNaming = selected === SENTINEL_CLEAR ? undefined : selected;\n }\n\n if (choice === 'importAlias') {\n const selected = await clack.select({\n message: 'Import alias pattern',\n options: [\n { value: '@/*', label: '@/*', hint: \"import { x } from '@/utils'\" },\n { value: '~/*', label: '~/*', hint: \"import { x } from '~/utils'\" },\n { value: SENTINEL_CUSTOM, label: 'Custom...' },\n { value: SENTINEL_CLEAR, label: 'Clear (no alias)' },\n ],\n initialValue: state.importAlias ?? SENTINEL_CLEAR,\n });\n assertNotCancelled(selected);\n if (selected === SENTINEL_CLEAR) {\n state.importAlias = undefined;\n } else if (selected === SENTINEL_CUSTOM) {\n const result = await clack.text({\n message: 'Custom import alias (e.g. #/*)?',\n initialValue: state.importAlias ?? '',\n placeholder: 'e.g. #/*',\n validate: (v) => {\n if (typeof v !== 'string' || !v.trim()) return 'Alias cannot be empty';\n if (!/^[a-zA-Z@~#$][a-zA-Z0-9@~#$_-]*\\/\\*$/.test(v.trim()))\n return 'Must match pattern like @/*, ~/*, or #src/*';\n },\n });\n assertNotCancelled(result);\n state.importAlias = result.trim();\n } else {\n state.importAlias = selected;\n }\n }\n }\n}\n\n/** Sub-menu for testing and coverage settings. */\nexport async function promptTestingMenu(state: RuleOverrides): Promise<void> {\n while (true) {\n const options: { value: string; label: string; hint?: string }[] = [\n {\n value: 'enforceMissingTests',\n label: 'Enforce missing tests',\n hint: state.enforceMissingTests ? 'yes' : 'no',\n },\n {\n value: 'testCoverage',\n label: 'Test coverage target',\n hint: state.testCoverage === 0 ? '0 (disabled)' : `${state.testCoverage}%`,\n },\n ];\n\n if (state.testCoverage > 0) {\n options.push(\n {\n value: 'coverageSummaryPath',\n label: 'Coverage summary path',\n hint: state.coverageSummaryPath,\n },\n {\n value: 'coverageCommand',\n label: 'Coverage command',\n hint: state.coverageCommand ?? 'auto-detect from package.json test runner',\n },\n );\n }\n\n options.push({ value: 'back', label: 'Back' });\n\n const choice = await clack.select({ message: 'Testing & coverage', options });\n assertNotCancelled(choice);\n if (choice === 'back') return;\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}\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 for how to handle an existing config file.\n *\n * @param configFile - The config filename\n * @returns 'edit', 'replace', or 'cancel'\n */\nexport async function promptExistingConfigAction(\n configFile: string,\n): Promise<'edit' | 'replace' | 'cancel'> {\n const result = await clack.select({\n message: `${configFile} already exists. What do you want to do?`,\n options: [\n {\n value: 'edit' as const,\n label: 'Edit existing config',\n hint: 'open the current rules and save updates in place',\n },\n {\n value: 'replace' as const,\n label: 'Replace with a fresh scan',\n hint: 're-scan the project and overwrite the current config',\n },\n {\n value: 'cancel' as const,\n label: 'Cancel',\n hint: 'leave the current setup unchanged',\n },\n ],\n });\n assertNotCancelled(result);\n return result;\n}\n\n/**\n * Prompt the user to choose how to proceed after the initial scan.\n *\n * @returns 'accept', 'customize', or 'review'\n */\nexport async function promptInitDecision(): Promise<'accept' | 'customize' | 'review'> {\n const result = await clack.select({\n message: 'How do you want to proceed?',\n options: [\n {\n value: 'accept' as const,\n label: 'Accept defaults',\n hint: 'writes the config with these defaults; use --enforce in CI to block',\n },\n {\n value: 'customize' as const,\n label: 'Customize rules',\n hint: 'edit limits, naming, test coverage, and package overrides',\n },\n {\n value: 'review' as const,\n label: 'Review detected details',\n hint: 'show the full scan report with package and structure details',\n },\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 * as clack from '@clack/prompts';\nimport { assertNotCancelled } from './prompt.js';\nimport { spawnAsync } from './spawn-async.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 isWorkspace?: boolean;\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 isWorkspace?: boolean,\n): Promise<string | undefined> {\n const choice = await clack.select({\n message: 'No shared git hook manager detected. Install Lefthook?',\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${isWorkspace ? ' -w' : ''} lefthook`\n : 'npm install -D lefthook';\n\n const s = clack.spinner();\n s.start('Installing Lefthook...');\n const result = await spawnAsync(installCmd, projectRoot);\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 tools?.isWorkspace,\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: 'pre-commit hook + CI check',\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: 'pre-commit hook + CI check',\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: 'Optional 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 { spawn } from 'node:child_process';\n\nexport interface SpawnResult {\n status: number | null;\n stdout: string;\n stderr: string;\n}\n\n/**\n * Run a shell command asynchronously so the event loop stays responsive\n * (e.g. for CLI spinner animations). Drop-in replacement for spawnSync.\n */\nexport function spawnAsync(command: string, cwd: string): Promise<SpawnResult> {\n return new Promise((resolve) => {\n const child = spawn(command, { cwd, shell: true, stdio: 'pipe' });\n let stdout = '';\n let stderr = '';\n child.stdout.on('data', (d: Buffer) => {\n stdout += d.toString();\n });\n child.stderr.on('data', (d: Buffer) => {\n stderr += d.toString();\n });\n child.on('close', (status) => {\n resolve({ status, stdout, stderr });\n });\n child.on('error', () => {\n resolve({ status: 1, stdout, stderr });\n });\n });\n}\n","import * as clack from '@clack/prompts';\nimport type { PackageConfig } from '@viberails/types';\nimport { getRootPackage } from './get-root-package.js';\nimport { assertNotCancelled } from './prompt.js';\nimport { buildMenuOptions, clonePackages, handleMenuChoice } from './prompt-menu-handlers.js';\n\nexport interface RuleOverrides {\n maxFileLines: number;\n maxTestFileLines: number;\n testCoverage: number;\n enforceMissingTests: boolean;\n enforceNaming: boolean;\n fileNamingValue?: string;\n componentNaming?: string;\n hookNaming?: string;\n importAlias?: string;\n coverageSummaryPath: string;\n coverageCommand?: string;\n packageOverrides?: PackageConfig[];\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 maxTestFileLines: number;\n testCoverage: number;\n enforceMissingTests: boolean;\n enforceNaming: boolean;\n fileNamingValue?: string;\n componentNaming?: string;\n hookNaming?: string;\n importAlias?: 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 maxTestFileLines: state.maxTestFileLines,\n testCoverage: state.testCoverage,\n enforceMissingTests: state.enforceMissingTests,\n enforceNaming: state.enforceNaming,\n fileNamingValue: state.fileNamingValue,\n componentNaming: state.componentNaming,\n hookNaming: state.hookNaming,\n importAlias: state.importAlias,\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 { promptPackageOverrides } from './prompt-package-overrides.js';\nimport type { RuleOverrides } from './prompt-rules.js';\nimport { promptFileLimitsMenu, promptNamingMenu, promptTestingMenu } from './prompt-submenus.js';\n\n/** @internal Exported for testing. */\nexport function 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 top-level grouped options for the rule customization menu. */\nexport function buildMenuOptions(\n state: RuleOverrides,\n packageCount: number,\n): { value: string; label: string; hint?: string }[] {\n const fileLimitsHint =\n state.maxTestFileLines > 0\n ? `max ${state.maxFileLines} lines, tests ${state.maxTestFileLines}`\n : `max ${state.maxFileLines} lines, test files unlimited`;\n\n const namingHint = state.enforceNaming\n ? `${state.fileNamingValue ?? 'not set'} (enforced)`\n : 'not enforced';\n\n const testingHint =\n state.testCoverage > 0\n ? `${state.testCoverage}% coverage, missing tests ${state.enforceMissingTests ? 'enforced' : 'not enforced'}`\n : `coverage disabled, missing tests ${state.enforceMissingTests ? 'enforced' : 'not enforced'}`;\n\n const options: { value: string; label: string; hint?: string }[] = [\n { value: 'fileLimits', label: 'File limits', hint: fileLimitsHint },\n { value: 'naming', label: 'Naming & conventions', hint: namingHint },\n { value: 'testing', label: 'Testing & coverage', hint: testingHint },\n ];\n\n if (packageCount > 0) {\n options.push({\n value: 'packageOverrides',\n label: 'Per-package overrides',\n hint: `${packageCount} package${packageCount > 1 ? 's' : ''} configurable`,\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 ? structuredClone(packages) : undefined;\n}\n\n/** Handle a single top-level menu choice and update state accordingly. */\nexport async function handleMenuChoice(\n choice: string,\n state: RuleOverrides,\n defaults: RuleOverrides,\n root: PackageConfig | undefined,\n): Promise<void> {\n if (choice === 'reset') {\n state.maxFileLines = defaults.maxFileLines;\n state.maxTestFileLines = defaults.maxTestFileLines;\n state.testCoverage = defaults.testCoverage;\n state.enforceMissingTests = defaults.enforceMissingTests;\n state.enforceNaming = defaults.enforceNaming;\n state.fileNamingValue = defaults.fileNamingValue;\n state.componentNaming = defaults.componentNaming;\n state.hookNaming = defaults.hookNaming;\n state.importAlias = defaults.importAlias;\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 === 'fileLimits') {\n await promptFileLimitsMenu(state);\n return;\n }\n\n if (choice === 'naming') {\n await promptNamingMenu(state);\n return;\n }\n\n if (choice === 'testing') {\n await promptTestingMenu(state);\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 promptPackageOverrides(state.packageOverrides, {\n fileNamingValue: state.fileNamingValue,\n maxFileLines: state.maxFileLines,\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","import * as clack from '@clack/prompts';\nimport type { PackageConfig } from '@viberails/types';\nimport { assertNotCancelled } from './prompt.js';\nimport { SENTINEL_DONE, SENTINEL_INHERIT, SENTINEL_NONE } from './prompt-constants.js';\nimport { FILE_NAMING_OPTIONS } from './prompt-submenus.js';\n\n/** @internal Exported for testing. */\nexport function 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 if (pkg.conventions && Object.keys(pkg.conventions).length === 0) {\n delete pkg.conventions;\n }\n }\n return packages;\n}\n\ninterface PackageOverrideDefaults {\n fileNamingValue?: string;\n maxFileLines: number;\n testCoverage: number;\n coverageSummaryPath: string;\n coverageCommand?: string;\n}\n\n/** @internal Exported for testing. */\nexport function packageOverrideHint(pkg: PackageConfig, defaults: PackageOverrideDefaults): string {\n const tags: string[] = [];\n\n // Naming override\n if (pkg.conventions?.fileNaming && pkg.conventions.fileNaming !== defaults.fileNamingValue) {\n tags.push(pkg.conventions.fileNaming);\n }\n\n // Max file lines override\n if (\n pkg.rules?.maxFileLines !== undefined &&\n pkg.rules.maxFileLines !== defaults.maxFileLines &&\n pkg.rules.maxFileLines > 0\n ) {\n tags.push(`${pkg.rules.maxFileLines} lines`);\n }\n\n // Coverage\n const coverage = pkg.rules?.testCoverage ?? defaults.testCoverage;\n const isExempt = coverage === 0;\n const nameSegments = pkg.name.replace(/^@[^/]+\\//, '').split(/[-/]/);\n const isTypesOnly = isExempt && nameSegments.some((s) => s === 'types');\n if (isExempt) {\n tags.push(isTypesOnly ? 'exempt (types-only)' : 'exempt');\n } else if (\n pkg.rules?.testCoverage !== undefined &&\n pkg.rules.testCoverage !== defaults.testCoverage\n ) {\n tags.push(`${coverage}%`);\n }\n\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 if (hasSummaryOverride) tags.push('summary override');\n if (hasCommandOverride) tags.push('command override');\n\n return tags.length > 0 ? tags.join(', ') : '(no overrides)';\n}\n\n/**\n * Prompt the user to edit per-package overrides in a monorepo.\n * Covers naming, file limits, and coverage settings.\n *\n * @param packages - All package configs (including root)\n * @param defaults - The shared default settings\n * @returns Updated package configs with user overrides applied\n */\nexport async function promptPackageOverrides(\n packages: PackageConfig[],\n defaults: PackageOverrideDefaults,\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 overrides',\n options: [\n ...editablePackages.map((pkg) => ({\n value: pkg.path,\n label: `${pkg.path} (${pkg.name})`,\n hint: packageOverrideHint(pkg, defaults),\n })),\n { value: SENTINEL_DONE, label: 'Done' },\n ],\n });\n assertNotCancelled(selectedPath);\n if (selectedPath === SENTINEL_DONE) break;\n\n const target = editablePackages.find((pkg) => pkg.path === selectedPath);\n if (!target) continue;\n\n await promptSinglePackageOverrides(target, defaults);\n normalizePackageOverrides(editablePackages);\n }\n\n return normalizePackageOverrides(packages);\n}\n\nasync function promptSinglePackageOverrides(\n target: PackageConfig,\n defaults: PackageOverrideDefaults,\n): Promise<void> {\n while (true) {\n const effectiveNaming = target.conventions?.fileNaming ?? defaults.fileNamingValue;\n const effectiveMaxLines = target.rules?.maxFileLines ?? defaults.maxFileLines;\n const effectiveCoverage = target.rules?.testCoverage ?? defaults.testCoverage;\n const effectiveSummary = target.coverage?.summaryPath ?? defaults.coverageSummaryPath;\n const effectiveCommand =\n target.coverage?.command ?? defaults.coverageCommand ?? '(auto-detect)';\n\n const hasNamingOverride =\n target.conventions?.fileNaming !== undefined &&\n target.conventions.fileNaming !== defaults.fileNamingValue;\n const hasMaxLinesOverride =\n target.rules?.maxFileLines !== undefined &&\n target.rules.maxFileLines !== defaults.maxFileLines;\n\n const namingHint = hasNamingOverride\n ? String(effectiveNaming)\n : `(inherits: ${effectiveNaming ?? 'not set'})`;\n const maxLinesHint = hasMaxLinesOverride\n ? String(effectiveMaxLines)\n : `(inherits: ${effectiveMaxLines})`;\n\n const choice = await clack.select({\n message: `Edit overrides for ${target.path}`,\n options: [\n { value: 'fileNaming', label: 'File naming', hint: namingHint },\n { value: 'maxFileLines', label: 'Max file lines', hint: maxLinesHint },\n { value: 'testCoverage', label: 'Test coverage', hint: String(effectiveCoverage) },\n { value: 'summaryPath', label: 'Coverage summary path', hint: effectiveSummary },\n { value: 'command', label: 'Coverage command', hint: effectiveCommand },\n { value: 'reset', label: 'Reset all overrides for this package' },\n { value: 'back', label: 'Back to package list' },\n ],\n });\n assertNotCancelled(choice);\n\n if (choice === 'back') break;\n\n if (choice === 'fileNaming') {\n const selected = await clack.select({\n message: `File naming for ${target.path}`,\n options: [\n ...FILE_NAMING_OPTIONS,\n { value: SENTINEL_NONE, label: '(none \\u2014 exempt from checks)' },\n {\n value: SENTINEL_INHERIT,\n label: `Inherit default${defaults.fileNamingValue ? ` (${defaults.fileNamingValue})` : ''}`,\n },\n ],\n initialValue: target.conventions?.fileNaming ?? SENTINEL_INHERIT,\n });\n assertNotCancelled(selected);\n if (selected === SENTINEL_INHERIT) {\n if (target.conventions) delete target.conventions.fileNaming;\n } else if (selected === SENTINEL_NONE) {\n target.conventions = { ...(target.conventions ?? {}), fileNaming: '' };\n } else {\n target.conventions = { ...(target.conventions ?? {}), fileNaming: selected };\n }\n }\n\n if (choice === 'maxFileLines') {\n const result = await clack.text({\n message: `Max file lines for ${target.path} (blank to inherit default)?`,\n initialValue:\n target.rules?.maxFileLines !== undefined ? String(target.rules.maxFileLines) : '',\n placeholder: String(defaults.maxFileLines),\n });\n assertNotCancelled(result);\n const value = result.trim();\n if (value.length === 0 || Number.parseInt(value, 10) === defaults.maxFileLines) {\n if (target.rules) delete target.rules.maxFileLines;\n } else {\n target.rules = { ...(target.rules ?? {}), maxFileLines: Number.parseInt(value, 10) };\n }\n }\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) delete target.rules.testCoverage;\n } else {\n target.rules = { ...(target.rules ?? {}), testCoverage: nextCoverage };\n }\n }\n\n if (choice === 'summaryPath') {\n const result = await clack.text({\n message: 'Path to coverage summary file (blank to inherit default)?',\n initialValue: 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) delete target.coverage.summaryPath;\n } else {\n target.coverage = { ...(target.coverage ?? {}), summaryPath: value };\n }\n }\n\n if (choice === 'command') {\n const result = await clack.text({\n message: 'Coverage command (blank to auto-detect)?',\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) delete target.coverage.command;\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 delete target.rules.maxFileLines;\n }\n delete target.coverage;\n delete target.conventions;\n }\n }\n}\n"],"mappings":"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","names":["clack","clack","clack","clack","clack","confirm"]}