viberails 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/boundaries.ts","../src/utils/find-project-root.ts","../src/utils/prompt.ts","../src/utils/resolve-workspace-packages.ts","../src/commands/check.ts","../src/commands/init.ts","../src/display.ts","../src/utils/write-generated-files.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 { initCommand } from './commands/init.js';\nimport { syncCommand } from './commands/sync.js';\n\nexport const VERSION = '0.1.0';\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 .action(async (options: { yes?: 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 .action(async () => {\n try {\n await syncCommand();\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('--no-boundaries', 'Skip boundary checking')\n .action(async (options: { staged?: boolean; files?: string[]; boundaries?: boolean }) => {\n try {\n const exitCode = await checkCommand({\n ...options,\n noBoundaries: options.boundaries === false,\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\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 { 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 || config.boundaries.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 allowRules = config.boundaries.filter((r) => r.allow);\n const denyRules = config.boundaries.filter((r) => !r.allow);\n\n console.log(`\\n${chalk.bold(`Boundary rules (${config.boundaries.length} rules):`)}\\n`);\n\n for (const r of allowRules) {\n console.log(` ${chalk.green('✓')} ${r.from} → ${r.to}`);\n }\n\n for (const r of denyRules) {\n const reason = r.reason ? chalk.dim(` (${r.reason})`) : '';\n console.log(` ${chalk.red('✗')} ${r.from} → ${r.to}${reason}`);\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 = config.workspace\n ? resolveWorkspacePackages(projectRoot, config.workspace)\n : 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\n if (inferred.length === 0) {\n console.log(chalk.yellow('No boundary rules could be inferred.'));\n return;\n }\n\n const allow = inferred.filter((r) => r.allow);\n const deny = inferred.filter((r) => !r.allow);\n\n console.log(`\\n${chalk.bold('Inferred boundary rules:')}\\n`);\n\n for (const r of allow) {\n console.log(` ${chalk.green('✓')} ${r.from} → ${r.to}`);\n }\n\n for (const r of deny) {\n const reason = r.reason ? chalk.dim(` (${r.reason})`) : '';\n console.log(` ${chalk.red('✗')} ${r.from} → ${r.to}${reason}`);\n }\n\n console.log(`\\n ${allow.length} allowed, ${deny.length} denied`);\n\n const shouldSave = await confirm('\\nSave to viberails.config.json?');\n if (shouldSave) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n console.log(`${chalk.green('✓')} Saved ${inferred.length} 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 = config.workspace\n ? resolveWorkspacePackages(projectRoot, config.workspace)\n : 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 readline from 'node:readline';\n\n/**\n * Prompt the user for a yes/no confirmation.\n *\n * @param message - The question to display (without the Y/n suffix)\n * @returns true if the user confirms, false otherwise\n */\nexport async function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<boolean>((resolve) => {\n rl.question(`${message} (Y/n) `, (answer) => {\n rl.close();\n const trimmed = answer.trim().toLowerCase();\n resolve(trimmed === '' || trimmed === 'y' || trimmed === 'yes');\n });\n });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { WorkspaceConfig, WorkspacePackage } from '@viberails/types';\n\n/**\n * Resolve WorkspacePackage[] from config workspace relative paths.\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 workspace - The workspace config from viberails.config.json\n * @returns Array of resolved WorkspacePackage objects\n */\nexport function resolveWorkspacePackages(\n projectRoot: string,\n workspace: WorkspaceConfig,\n): WorkspacePackage[] {\n const packages: WorkspacePackage[] = [];\n\n for (const relativePath of workspace.packages) {\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 packages.push({ name, path: absPath, relativePath, internalDeps: allDeps });\n }\n\n // Filter internalDeps to only workspace-internal package names\n const packageNames = new Set(packages.map((p) => p.name));\n for (const pkg of packages) {\n pkg.internalDeps = pkg.internalDeps.filter((dep) => packageNames.has(dep));\n }\n\n return packages;\n}\n","import { execSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { loadConfig } from '@viberails/config';\nimport type { CheckViolation, ViberailsConfig } from '@viberails/types';\nimport chalk from 'chalk';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { resolveWorkspacePackages } from '../utils/resolve-workspace-packages.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\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\nconst 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\nexport interface CheckOptions {\n files?: string[];\n staged?: boolean;\n noBoundaries?: boolean;\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 if (options.staged) {\n filesToCheck = getStagedFiles(projectRoot);\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 console.log(`${chalk.green('✓')} No files to check.`);\n return 0;\n }\n\n const violations: CheckViolation[] = [];\n const severity = config.enforcement === 'enforce' ? 'error' : 'warn';\n\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 if (isIgnored(relPath, config.ignore)) continue;\n if (!fs.existsSync(absPath)) continue;\n\n // Check 1: File size\n if (config.rules.maxFileLines > 0) {\n const lines = countFileLines(absPath);\n if (lines !== null && lines > config.rules.maxFileLines) {\n violations.push({\n file: relPath,\n rule: 'file-size',\n message: `${lines} lines (max ${config.rules.maxFileLines}). Split into focused modules.`,\n severity,\n });\n }\n }\n\n // Check 2: File naming convention\n if (config.rules.enforceNaming && config.conventions.fileNaming) {\n const namingViolation = checkNaming(relPath, config);\n if (namingViolation) {\n violations.push({\n file: relPath,\n rule: 'file-naming',\n message: namingViolation,\n severity,\n });\n }\n }\n }\n\n // Check 3: Missing tests (only on full project check, not staged/specific files)\n if (config.rules.requireTests && !options.staged && !options.files) {\n const testViolations = checkMissingTests(projectRoot, config, severity);\n violations.push(...testViolations);\n }\n\n // Check 4: Boundary violations\n if (\n config.rules.enforceBoundaries &&\n config.boundaries &&\n config.boundaries.length > 0 &&\n !options.noBoundaries\n ) {\n const startTime = Date.now();\n const { buildImportGraph, checkBoundaries } = await import('@viberails/graph');\n\n const packages = config.workspace\n ? resolveWorkspacePackages(projectRoot, config.workspace)\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 mode, only report violations in those files\n const filterSet =\n options.staged || options.files\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}${bv.rule.reason ? ` (${bv.rule.reason})` : ''}`,\n severity,\n });\n }\n\n const elapsed = Date.now() - startTime;\n console.log(chalk.dim(` Boundary check: ${graph.nodes.length} files in ${elapsed}ms`));\n }\n\n // Output results\n if (violations.length === 0) {\n console.log(`${chalk.green('✓')} ${filesToCheck.length} files checked — no violations`);\n return 0;\n }\n\n for (const v of violations) {\n const icon = v.severity === 'error' ? chalk.red('✗') : chalk.yellow('!');\n console.log(`${icon} ${chalk.dim(v.rule)} ${v.file}: ${v.message}`);\n }\n\n const word = violations.length === 1 ? 'violation' : 'violations';\n console.log(`\\n${violations.length} ${word} found.`);\n\n if (config.enforcement === 'enforce') {\n console.log(chalk.red('Fix violations before committing.'));\n return 1;\n }\n\n return 0;\n}\n\n/** Count lines in a file. Returns null if the file can't be read. */\nfunction 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. */\nfunction checkNaming(relPath: string, config: ViberailsConfig): 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 ) {\n return undefined;\n }\n\n const bare = filename.slice(0, filename.indexOf('.'));\n const convention =\n typeof config.conventions.fileNaming === 'string'\n ? config.conventions.fileNaming\n : config.conventions.fileNaming?.value;\n\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/** Check for source files without corresponding test files. */\nfunction checkMissingTests(\n projectRoot: string,\n config: ViberailsConfig,\n severity: 'error' | 'warn',\n): CheckViolation[] {\n const violations: CheckViolation[] = [];\n const { testPattern } = config.structure;\n if (!testPattern) return violations;\n\n const srcDir = config.structure.srcDir;\n if (!srcDir) return violations;\n\n const srcPath = path.join(projectRoot, srcDir);\n if (!fs.existsSync(srcPath)) return violations;\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, basename.indexOf('.'));\n const expectedTestFile = `${stem}${testSuffix}`;\n\n // Look for the test file next to the source or in the tests directory\n const dir = path.dirname(path.join(projectRoot, relFile));\n const colocatedTest = path.join(dir, expectedTestFile);\n const testsDir = config.structure.tests;\n const dedicatedTest = testsDir ? path.join(projectRoot, 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 return violations;\n}\n\n/** Get staged files from git. */\nfunction 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 });\n return output.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/** Get all source files in the project. */\nfunction getAllSourceFiles(projectRoot: string, config: ViberailsConfig): string[] {\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 (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'dist') {\n continue;\n }\n if (isIgnored(rel, config.ignore)) 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, config.ignore)) {\n files.push(rel);\n }\n }\n }\n };\n walk(projectRoot);\n return files;\n}\n\n/** Collect source files from a directory recursively. */\nfunction 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\n/** Check if a path matches any ignore pattern. */\nfunction isIgnored(relPath: string, ignorePatterns: string[]): boolean {\n for (const pattern of ignorePatterns) {\n if (pattern.endsWith('/**')) {\n const prefix = pattern.slice(0, -3);\n if (relPath.startsWith(`${prefix}/`) || relPath === prefix) return true;\n } else if (pattern.startsWith('**/')) {\n const suffix = pattern.slice(3);\n if (relPath.endsWith(suffix)) return true;\n } else if (relPath === pattern || relPath.startsWith(`${pattern}/`)) {\n return true;\n }\n }\n return false;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { generateConfig } from '@viberails/config';\nimport { scan } from '@viberails/scanner';\nimport type { ConfigConventions, ConventionValue } from '@viberails/types';\nimport chalk from 'chalk';\nimport { displayScanResults } from '../display.js';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { confirm } 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 * Filter a ConfigConventions object to only include high-confidence entries.\n */\nfunction filterHighConfidence(conventions: ConfigConventions): ConfigConventions {\n const filtered: ConfigConventions = {};\n for (const [key, value] of Object.entries(conventions)) {\n if (value === undefined) continue;\n if (typeof value === 'string') {\n filtered[key as keyof ConfigConventions] = value;\n } else if (value._confidence === 'high') {\n filtered[key as keyof ConfigConventions] = value as ConventionValue;\n }\n }\n return filtered;\n}\n\n/**\n * Run the viberails init flow.\n *\n * @param options - CLI options\n * @param cwd - Working directory override (for testing)\n */\nexport async function initCommand(options: { yes?: boolean }, cwd?: string): 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. Check for existing config\n const configPath = path.join(projectRoot, CONFIG_FILE);\n if (fs.existsSync(configPath)) {\n console.log(\n chalk.yellow('!') +\n ' viberails is already initialized in this project.\\n' +\n ' Run ' +\n chalk.cyan('viberails sync') +\n ' to update the generated files.',\n );\n return;\n }\n\n // 3. Run scanner\n console.log(chalk.dim('Scanning project...'));\n const scanResult = await scan(projectRoot);\n\n // 4. Display results\n displayScanResults(scanResult);\n\n // 5. Sparse project notice\n if (scanResult.statistics.totalFiles === 0) {\n console.log(\n chalk.yellow('!') +\n ' No source files detected. viberails will generate context with minimal content.\\n' +\n ' Run ' +\n chalk.cyan('viberails sync') +\n ' after adding source files.\\n',\n );\n }\n\n // 6. Interactive confirmation\n if (!options.yes) {\n const accepted = await confirm('Does this look right?');\n if (!accepted) {\n console.log('Aborted.');\n return;\n }\n }\n\n // 7. Generate config\n const config = generateConfig(scanResult);\n if (options.yes) {\n config.conventions = filterHighConfidence(config.conventions);\n }\n\n // 7b. Infer boundary rules for workspace projects\n if (config.workspace && config.workspace.packages.length > 0) {\n let shouldInfer = options.yes;\n if (!options.yes) {\n shouldInfer = await confirm('Infer boundary rules from import patterns?');\n }\n\n if (shouldInfer) {\n console.log(chalk.dim('Building import graph...'));\n const { buildImportGraph, inferBoundaries } = await import('@viberails/graph');\n const packages = resolveWorkspacePackages(projectRoot, config.workspace);\n const graph = await buildImportGraph(projectRoot, { packages, ignore: config.ignore });\n const inferred = inferBoundaries(graph);\n if (inferred.length > 0) {\n config.boundaries = inferred;\n config.rules.enforceBoundaries = true;\n console.log(` ${chalk.green('✓')} Inferred ${inferred.length} boundary rules`);\n }\n }\n }\n\n fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n\n // 8. Generate context and scan-result.json\n writeGeneratedFiles(projectRoot, config, scanResult);\n\n // 9. Update .gitignore\n updateGitignore(projectRoot);\n\n // 10. Set up pre-commit hook\n setupPreCommitHook(projectRoot);\n\n // 11. Print summary\n console.log(`\\n${chalk.bold('Created:')}`);\n console.log(` ${chalk.green('✓')} ${CONFIG_FILE}`);\n console.log(` ${chalk.green('✓')} .viberails/context.md`);\n console.log(` ${chalk.green('✓')} .viberails/scan-result.json`);\n console.log(`\\n${chalk.bold('Next steps:')}`);\n console.log(` 1. Review ${chalk.cyan('viberails.config.json')} and adjust rules`);\n console.log(\n ` 2. Commit ${chalk.cyan('viberails.config.json')} and ${chalk.cyan('.viberails/context.md')}`,\n );\n console.log(` 3. Run ${chalk.cyan('viberails check')} to verify your project passes`);\n}\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 */\nfunction 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 fs.writeFileSync(gitignorePath, `${content.trimEnd()}\\n${block}`);\n }\n}\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 */\nfunction setupPreCommitHook(projectRoot: string): void {\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;\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;\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 }\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 const addition = ['', ' viberails:', ' run: npx viberails check --staged'].join('\\n');\n fs.writeFileSync(lefthookPath, `${content.trimEnd()}\\n${addition}\\n`);\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 type { DetectedConvention, ScanResult, StackItem } from '@viberails/types';\nimport { FRAMEWORK_NAMES, LIBRARY_NAMES, ROLE_DESCRIPTIONS, STYLING_NAMES } from '@viberails/types';\nimport chalk from 'chalk';\n\n/** Labels for convention keys. */\nconst CONVENTION_LABELS: Record<string, string> = {\n fileNaming: 'File naming',\n componentNaming: 'Component naming',\n hookNaming: 'Hook naming',\n importAlias: 'Import alias',\n};\n\n/**\n * Format a StackItem for display: \"DisplayName Version\".\n */\nfunction 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 */\nfunction 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 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 const { stack, conventions } = 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.linter) {\n console.log(` ${chalk.green('✓')} ${formatItem(stack.linter)}`);\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\n const meaningfulDirs = scanResult.structure.directories.filter((d) => d.role !== 'unknown');\n if (meaningfulDirs.length > 0) {\n console.log(`\\n${chalk.bold('Structure:')}`);\n for (const dir of meaningfulDirs) {\n const label = ROLE_DESCRIPTIONS[dir.role] ?? dir.role;\n const files = dir.fileCount === 1 ? '1 file' : `${dir.fileCount} files`;\n console.log(` ${chalk.green('✓')} ${dir.path} — ${label} (${files})`);\n }\n }\n\n const conventionEntries = Object.entries(conventions);\n if (conventionEntries.length > 0) {\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 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 console.log('');\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 // Ensure .viberails directory exists\n const contextDir = path.join(projectRoot, CONTEXT_DIR);\n if (!fs.existsSync(contextDir)) {\n fs.mkdirSync(contextDir, { recursive: true });\n }\n\n // Generate and write rules-focused context.md\n const context = generateContext(config);\n fs.writeFileSync(path.join(contextDir, CONTEXT_FILE), context);\n\n // Write scan-result.json for drift detection\n fs.writeFileSync(\n path.join(contextDir, SCAN_RESULT_FILE),\n `${JSON.stringify(scanResult, null, 2)}\\n`,\n );\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { loadConfig, mergeConfig } from '@viberails/config';\nimport { scan } from '@viberails/scanner';\nimport chalk from 'chalk';\nimport { findProjectRoot } from '../utils/find-project-root.js';\nimport { writeGeneratedFiles } from '../utils/write-generated-files.js';\n\nconst CONFIG_FILE = 'viberails.config.json';\n\n/**\n * Run the viberails sync flow: re-scan, merge config, regenerate context.\n *\n * @param cwd - Working directory override (for testing)\n */\nexport async function syncCommand(cwd?: string): 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\n const configPath = path.join(projectRoot, CONFIG_FILE);\n const existing = await loadConfig(configPath);\n\n // 3. Re-scan\n console.log(chalk.dim('Scanning project...'));\n const scanResult = await scan(projectRoot);\n\n // 4. Merge config\n const merged = mergeConfig(existing, scanResult);\n fs.writeFileSync(configPath, `${JSON.stringify(merged, null, 2)}\\n`);\n\n // 5. Regenerate context and scan-result.json\n writeGeneratedFiles(projectRoot, merged, scanResult);\n\n console.log(`\\n${chalk.bold('Synced:')}`);\n console.log(` ${chalk.green('✓')} ${CONFIG_FILE} — updated`);\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":["import_chalk","fs","path","resolve","fs","path","chalk","fs","path","import_config","import_chalk","CONFIG_FILE","chalk","basename","fs","path","import_config","import_chalk","import_chalk","chalk","fs","path","CONFIG_FILE","chalk","fs","path","import_config","import_scanner","import_chalk","CONFIG_FILE","chalk","chalk"]}
@@ -0,0 +1,3 @@
1
+ declare const VERSION = "0.1.0";
2
+
3
+ export { VERSION };
@@ -0,0 +1,3 @@
1
+ declare const VERSION = "0.1.0";
2
+
3
+ export { VERSION };