@raindogs/contextmd 0.1.1 → 0.1.4

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 CHANGED
@@ -376,8 +376,46 @@ function scanFilesystem(cwd, stack) {
376
376
  deduped.push(entry);
377
377
  }
378
378
  }
379
+ const srcDir = join2(cwd, "src");
380
+ if (deduped.length === 0 && existsSync2(srcDir)) {
381
+ try {
382
+ const srcFiles = readdirSync(srcDir).filter((f) => !f.startsWith(".") && /\.(jsx?|tsx?)$/.test(f)).sort();
383
+ for (const file of srcFiles) {
384
+ const purpose = inferFilePurpose(file);
385
+ if (purpose) {
386
+ deduped.push({ path: `src/${file}`, purpose, isKey: true });
387
+ }
388
+ }
389
+ } catch {
390
+ }
391
+ }
379
392
  return deduped.filter((e) => e.isKey).slice(0, 12).concat(deduped.filter((e) => !e.isKey).slice(0, 3)).slice(0, 12);
380
393
  }
394
+ function inferFilePurpose(filename) {
395
+ const lower = filename.toLowerCase().replace(/\.(jsx?|tsx?)$/, "");
396
+ const map = {
397
+ main: "Application entry point",
398
+ index: "Application entry point",
399
+ app: "Root application component",
400
+ router: "Client-side routing",
401
+ routes: "Route definitions",
402
+ supabase: "Supabase client configuration",
403
+ auth: "Authentication logic",
404
+ authgate: "Authentication guard component",
405
+ login: "Login component",
406
+ store: "Application state store",
407
+ api: "API utilities",
408
+ config: "Application configuration",
409
+ theme: "Theme and style tokens",
410
+ constants: "App-wide constants",
411
+ utils: "Utility functions",
412
+ helpers: "Helper functions",
413
+ types: "TypeScript type definitions",
414
+ hooks: "Custom React hooks",
415
+ context: "React context provider"
416
+ };
417
+ return map[lower];
418
+ }
381
419
  function detectMcpServers(cwd) {
382
420
  const servers = [];
383
421
  const claudeDir = join2(cwd, ".claude");
@@ -491,7 +529,8 @@ var RULES = [
491
529
  },
492
530
  {
493
531
  condition: (s) => s.database === "supabase",
494
- convention: "Use the Supabase client from @/lib/supabase (or equivalent) \u2014 do not instantiate directly",
532
+ convention: "Supabase client is configured in one place (e.g. src/supabase.js or @/lib/supabase) \u2014 import from there",
533
+ doNot: "Do not call createClient() directly \u2014 use the shared Supabase client",
495
534
  inferredFrom: "dep:@supabase/supabase-js"
496
535
  },
497
536
  // ── CSS / styling ────────────────────────────────────────────────────────
@@ -704,13 +743,10 @@ function buildTestingSection(ctx) {
704
743
  }
705
744
  function buildGitSection(ctx) {
706
745
  const { git } = ctx;
707
- const lines = [];
708
- if (!git.commitFormat && git.recentExamples.length === 0) return lines;
709
- lines.push("## Git", "");
710
- if (git.commitFormat) {
711
- lines.push(`Commit format: \`${git.commitFormat}\``);
712
- }
713
- if (git.recentExamples.length > 0 && git.commitFormat) {
746
+ if (!git.commitFormat) return [];
747
+ const lines = ["## Git", ""];
748
+ lines.push(`Commit format: \`${git.commitFormat}\``);
749
+ if (git.recentExamples.length > 0) {
714
750
  lines.push("");
715
751
  lines.push("Examples:");
716
752
  for (const ex of git.recentExamples.slice(0, 2)) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/scanner/package.ts","../src/scanner/filesystem.ts","../src/scanner/git.ts","../src/scanner/inference.ts","../src/scanner/index.ts","../src/generators/claude.ts","../src/generators/agents.ts","../src/generators/ruler.ts","../src/generators/scorer.ts"],"sourcesContent":["import { program } from 'commander'\nimport { writeFileSync, existsSync, mkdirSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { createInterface } from 'readline'\nimport { scanRepo } from './scanner/index.js'\nimport { generateClaude } from './generators/claude.js'\nimport { generateAgents } from './generators/agents.js'\nimport { generateRulerFiles } from './generators/ruler.js'\nimport { scoreClaudeFile } from './generators/scorer.js'\n\nconst VERSION = '0.1.0'\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction write(filePath: string, content: string, overwrite = false) {\n if (!overwrite && existsSync(filePath)) {\n console.log(` ⚠ ${filePath} already exists — use --force to overwrite`)\n return false\n }\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content, 'utf-8')\n return true\n}\n\nfunction lineCount(content: string) {\n return content.split('\\n').length\n}\n\nasync function promptSubscribe() {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise<void>(resolve => {\n rl.question(\n '\\n📬 Get notified about updates? Enter email (or press Enter to skip): ',\n (email) => {\n rl.close()\n if (email && email.includes('@')) {\n console.log(` ✓ Noted — ${email} will receive release notes`)\n // TODO Phase 3: POST to Supabase edge function\n // fetch('https://api.contextmd.dev/subscribe', { method: 'POST', body: JSON.stringify({ email }) })\n }\n resolve()\n }\n )\n })\n}\n\n// ─── Commands ─────────────────────────────────────────────────────────────────\n\nprogram\n .name('contextmd')\n .description('Generate and sync CLAUDE.md and AGENTS.md for your repo')\n .version(VERSION)\n\n// ── init (default) ────────────────────────────────────────────────────────────\n\nprogram\n .command('init', { isDefault: true })\n .description('Generate CLAUDE.md and AGENTS.md in the current directory')\n .option('-f, --force', 'overwrite existing files')\n .option('--ruler', 'also write .ruler/ files for ruler.js fan-out (27+ agent formats)')\n .option('--no-agents', 'skip AGENTS.md generation')\n .option('--no-subscribe', 'skip the email subscribe prompt')\n .action(async (opts) => {\n const cwd = process.cwd()\n\n let spinner: { stop: () => void } | null = null\n try {\n const { default: ora } = await import('ora')\n spinner = ora('Scanning repository...').start()\n } catch {\n console.log('Scanning repository...')\n }\n\n let ctx: Awaited<ReturnType<typeof scanRepo>>\n try {\n ctx = await scanRepo(cwd)\n if (spinner) spinner.stop()\n } catch (err: unknown) {\n if (spinner) spinner.stop()\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`\\n✗ Scan failed: ${msg}`)\n process.exit(1)\n }\n\n const { default: chalk } = await import('chalk')\n\n console.log(`\\n${chalk.bold(ctx.name)} — ${ctx.stack.language}${ctx.stack.framework ? ` / ${ctx.stack.framework}` : ''}`)\n console.log()\n\n // ── CLAUDE.md ──\n const claudeContent = generateClaude(ctx)\n const claudePath = join(cwd, 'CLAUDE.md')\n const claudeWritten = write(claudePath, claudeContent, opts.force)\n if (claudeWritten) {\n console.log(` ${chalk.green('✓')} CLAUDE.md ${chalk.dim(`(${lineCount(claudeContent)} lines)`)}`)\n }\n\n // ── AGENTS.md ──\n if (opts.agents !== false) {\n const agentsContent = generateAgents(ctx)\n const agentsPath = join(cwd, 'AGENTS.md')\n const agentsWritten = write(agentsPath, agentsContent, opts.force)\n if (agentsWritten) {\n console.log(` ${chalk.green('✓')} AGENTS.md ${chalk.dim(`(${lineCount(agentsContent)} lines)`)}`)\n }\n }\n\n // ── .ruler/ ──\n if (opts.ruler) {\n const rulerOutput = generateRulerFiles(ctx)\n for (const [relPath, content] of Object.entries(rulerOutput.files)) {\n const fullPath = join(cwd, relPath)\n const written = write(fullPath, content, opts.force)\n if (written) {\n console.log(` ${chalk.green('✓')} ${relPath} ${chalk.dim('(ruler format)')}`)\n }\n }\n console.log()\n console.log(chalk.dim(' Run `ruler` to distribute rules to all your agent configs.'))\n }\n\n console.log()\n console.log(chalk.dim(' Tip: commit these files — they improve every AI session on this repo.'))\n console.log(chalk.dim(' Run `contextmd score` to audit the quality of your CLAUDE.md.'))\n\n if (opts.subscribe !== false) {\n await promptSubscribe()\n }\n })\n\n// ── sync ──────────────────────────────────────────────────────────────────────\n\nprogram\n .command('sync')\n .description('Regenerate CLAUDE.md and AGENTS.md from current repo state')\n .option('--ruler', 'also sync .ruler/ files')\n .action(async (opts) => {\n const cwd = process.cwd()\n const hasClaudeFile = existsSync(join(cwd, 'CLAUDE.md'))\n const hasAgentsFile = existsSync(join(cwd, 'AGENTS.md'))\n\n if (!hasClaudeFile && !hasAgentsFile) {\n console.log('No CLAUDE.md or AGENTS.md found. Run `contextmd init` first.')\n process.exit(1)\n }\n\n console.log('Syncing...')\n const ctx = await scanRepo(cwd)\n const { default: chalk } = await import('chalk')\n\n if (hasClaudeFile) {\n const content = generateClaude(ctx)\n writeFileSync(join(cwd, 'CLAUDE.md'), content, 'utf-8')\n console.log(` ${chalk.green('✓')} CLAUDE.md updated ${chalk.dim(`(${lineCount(content)} lines)`)}`)\n }\n\n if (hasAgentsFile) {\n const content = generateAgents(ctx)\n writeFileSync(join(cwd, 'AGENTS.md'), content, 'utf-8')\n console.log(` ${chalk.green('✓')} AGENTS.md updated ${chalk.dim(`(${lineCount(content)} lines)`)}`)\n }\n\n if (opts.ruler) {\n const rulerOutput = generateRulerFiles(ctx)\n for (const [relPath, content] of Object.entries(rulerOutput.files)) {\n writeFileSync(join(cwd, relPath), content, 'utf-8')\n console.log(` ${chalk.green('✓')} ${relPath} updated`)\n }\n }\n })\n\n// ── score ─────────────────────────────────────────────────────────────────────\n\nprogram\n .command('score')\n .description('Audit the quality of your CLAUDE.md against the 5 commit-readiness tests')\n .action(async () => {\n const cwd = process.cwd()\n const { default: chalk } = await import('chalk')\n const result = scoreClaudeFile(cwd)\n\n console.log(`\\nCLAUDE.md quality score: ${chalk.bold(result.total)}/100\\n`)\n\n for (const check of result.checks) {\n const icon = check.passed ? chalk.green('✓') : chalk.red('✗')\n const scoreStr = chalk.dim(`(${check.score} pts)`)\n console.log(` ${icon} ${check.name} ${scoreStr}`)\n if (!check.passed) {\n console.log(` ${chalk.dim(check.feedback)}`)\n }\n }\n\n console.log()\n\n if (result.total >= 80) {\n console.log(chalk.green(' Strong CLAUDE.md — this file is working hard for you.'))\n } else if (result.total >= 60) {\n console.log(chalk.yellow(' Decent start — address the failing checks to improve agent accuracy.'))\n } else {\n console.log(chalk.red(' High risk of Claude ignoring this file. Run `contextmd init --force` to regenerate.'))\n }\n\n console.log()\n console.log(chalk.dim(` Share your score: \"My CLAUDE.md scored ${result.total}/100 with contextmd\"`))\n })\n\nprogram.parse()\n","import { readFileSync, existsSync } from 'fs'\nimport { join } from 'path'\nimport type {\n StackInfo, CommandSet, PackageManager,\n Framework, TestRunner, Database, StateLib,\n CssApproach, UiLib, CommitConvention, DeployTarget\n} from '../types.js'\n\ninterface PkgJson {\n name?: string\n description?: string\n version?: string\n scripts?: Record<string, string>\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n workspaces?: string[] | { packages: string[] }\n}\n\nexport interface PackageScanResult {\n name: string\n description?: string\n version?: string\n scripts: Record<string, string>\n allDeps: Record<string, string>\n stack: StackInfo\n commands: CommandSet\n}\n\nexport function scanPackage(cwd: string): PackageScanResult {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) {\n throw new Error('No package.json found. Run contextmd from the root of your project.')\n }\n\n const pkg: PkgJson = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n const scripts = pkg.scripts ?? {}\n\n const allDeps: Record<string, string> = {\n ...(pkg.dependencies ?? {}),\n ...(pkg.devDependencies ?? {}),\n ...(pkg.peerDependencies ?? {}),\n }\n\n const has = (name: string) => name in allDeps\n const hasPattern = (re: RegExp) => Object.keys(allDeps).some(k => re.test(k))\n\n // ── Package manager ──────────────────────────────────────────────────────\n let packageManager: PackageManager = 'npm'\n if (existsSync(join(cwd, 'bun.lockb'))) packageManager = 'bun'\n else if (existsSync(join(cwd, 'pnpm-lock.yaml'))) packageManager = 'pnpm'\n else if (existsSync(join(cwd, 'yarn.lock'))) packageManager = 'yarn'\n\n const runCmd = packageManager === 'npm' ? 'npm run' : packageManager\n\n // ── Framework ────────────────────────────────────────────────────────────\n let framework: Framework | undefined\n let isNextAppRouter = false\n if (has('next')) {\n framework = 'nextjs'\n isNextAppRouter =\n existsSync(join(cwd, 'app')) ||\n existsSync(join(cwd, 'src/app'))\n } else if (has('react') || has('react-dom')) {\n framework = 'react'\n } else if (has('vue') || has('@vue/core')) {\n framework = 'vue'\n } else if (has('@sveltejs/kit') || has('svelte')) {\n framework = 'svelte'\n } else if (has('express')) {\n framework = 'express'\n } else if (has('fastify')) {\n framework = 'fastify'\n } else if (has('hono')) {\n framework = 'hono'\n }\n\n // ── Test runner ──────────────────────────────────────────────────────────\n let testRunner: TestRunner | undefined\n if (has('vitest')) testRunner = 'vitest'\n else if (has('jest') || has('@jest/core') || has('ts-jest')) testRunner = 'jest'\n else if (has('mocha')) testRunner = 'mocha'\n\n // ── Database / ORM ───────────────────────────────────────────────────────\n let database: Database | undefined\n if (has('@prisma/client') || has('prisma')) database = 'prisma'\n else if (has('drizzle-orm')) database = 'drizzle'\n else if (has('@supabase/supabase-js') || has('@supabase/ssr')) database = 'supabase'\n else if (has('mongoose')) database = 'mongoose'\n else if (has('typeorm')) database = 'typeorm'\n else if (has('pg') || has('postgres')) database = 'pg'\n else if (has('better-sqlite3')) database = 'better-sqlite3'\n\n // ── State management ─────────────────────────────────────────────────────\n let stateLib: StateLib | undefined\n if (has('zustand')) stateLib = 'zustand'\n else if (has('@reduxjs/toolkit') || has('redux')) stateLib = 'redux'\n else if (has('@tanstack/react-query') || has('@tanstack/query-core')) stateLib = 'tanstack-query'\n else if (has('jotai')) stateLib = 'jotai'\n else if (has('recoil')) stateLib = 'recoil'\n\n // ── CSS ──────────────────────────────────────────────────────────────────\n let cssApproach: CssApproach | undefined\n if (has('tailwindcss')) cssApproach = 'tailwind'\n else if (has('styled-components')) cssApproach = 'styled-components'\n else if (has('@emotion/styled') || has('@emotion/react')) cssApproach = 'emotion'\n else if (has('sass') || has('node-sass')) cssApproach = 'sass'\n\n // ── UI lib ───────────────────────────────────────────────────────────────\n let uiLib: UiLib | undefined\n if (\n existsSync(join(cwd, 'src/components/ui')) ||\n existsSync(join(cwd, 'components/ui'))\n ) {\n uiLib = 'shadcn'\n } else if (hasPattern(/@radix-ui\\//)) {\n uiLib = 'radix'\n } else if (has('@chakra-ui/react')) {\n uiLib = 'chakra'\n } else if (has('@mantine/core')) {\n uiLib = 'mantine'\n } else if (has('@mui/material')) {\n uiLib = 'mui'\n }\n\n // ── Linter / formatter ───────────────────────────────────────────────────\n const linter = has('eslint') ? 'eslint' as const : has('biome') ? 'biome' as const : undefined\n const formatter = has('prettier') ? 'prettier' as const : has('biome') ? 'biome' as const : undefined\n\n // ── Commit conventions ───────────────────────────────────────────────────\n let commitConvention: CommitConvention | undefined\n if (has('@commitlint/cli') || has('commitlint') || has('commitizen') || has('@commitlint/config-conventional')) {\n commitConvention = 'conventional-commits'\n } else if (has('gitmoji-cli')) {\n commitConvention = 'gitmoji'\n }\n\n // ── Deploy target ────────────────────────────────────────────────────────\n let deployTarget: DeployTarget | undefined\n if (existsSync(join(cwd, 'vercel.json')) || existsSync(join(cwd, '.vercel'))) deployTarget = 'vercel'\n else if (existsSync(join(cwd, 'netlify.toml'))) deployTarget = 'netlify'\n else if (existsSync(join(cwd, 'fly.toml'))) deployTarget = 'fly'\n else if (existsSync(join(cwd, 'Dockerfile')) || existsSync(join(cwd, 'docker-compose.yml'))) deployTarget = 'docker'\n\n // ── Path alias (from tsconfig) ───────────────────────────────────────────\n let pathAlias: string | undefined\n const tsconfigPath = join(cwd, 'tsconfig.json')\n if (existsSync(tsconfigPath)) {\n try {\n const tsconfig = JSON.parse(readFileSync(tsconfigPath, 'utf-8'))\n const paths = tsconfig?.compilerOptions?.paths\n if (paths) {\n const aliases = Object.keys(paths)\n const atAlias = aliases.find(a => a.startsWith('@/') || a === '@/*')\n if (atAlias) pathAlias = '@/'\n else if (aliases.length > 0) pathAlias = aliases[0].replace('/*', '/')\n }\n } catch {\n // tsconfig parse failure is non-fatal\n }\n }\n\n // ── Monorepo ─────────────────────────────────────────────────────────────\n const hasMonorepo = !!(\n pkg.workspaces ||\n existsSync(join(cwd, 'turbo.json')) ||\n existsSync(join(cwd, 'nx.json')) ||\n existsSync(join(cwd, 'lerna.json')) ||\n existsSync(join(cwd, 'pnpm-workspace.yaml'))\n )\n\n const hasSupabaseLocal = existsSync(join(cwd, 'supabase'))\n\n // ── Command set ──────────────────────────────────────────────────────────\n const findScript = (...names: string[]) =>\n names.find(n => n in scripts)\n\n const devScript = findScript('dev', 'start:dev', 'develop')\n const buildScript = findScript('build', 'compile')\n const testScript = findScript('test', 'test:unit', 'test:all')\n const lintScript = findScript('lint', 'eslint')\n const typecheckScript = findScript('typecheck', 'type-check', 'tsc', 'check:types')\n const formatScript = findScript('format', 'fmt', 'prettier')\n const dbMigrateScript = findScript('db:migrate', 'db:push', 'prisma:migrate', 'drizzle-kit:push')\n const dbGenerateScript = findScript('db:generate', 'prisma:generate', 'drizzle-kit:generate')\n const huskyPreCommit = existsSync(join(cwd, '.husky/pre-commit'))\n\n // single-file test invocation\n let testSingle: string | undefined\n if (testRunner === 'vitest') testSingle = 'vitest run <path/to/file.test.ts>'\n else if (testRunner === 'jest') testSingle = 'jest <path/to/file.test.ts>'\n\n // pre-commit directive — what to always run before committing\n let preCommit: string | undefined\n if (huskyPreCommit) {\n preCommit = `${runCmd} lint && ${runCmd} typecheck` // safe default\n if (typecheckScript && lintScript) {\n preCommit = `${runCmd} ${lintScript} && ${runCmd} ${typecheckScript}`\n }\n } else if (typecheckScript && lintScript) {\n preCommit = `${runCmd} ${lintScript} && ${runCmd} ${typecheckScript}`\n } else if (typecheckScript) {\n preCommit = `${runCmd} ${typecheckScript}`\n }\n\n const commands: CommandSet = {\n dev: devScript ? `${runCmd} ${devScript}` : undefined,\n build: buildScript ? `${runCmd} ${buildScript}` : undefined,\n test: testScript ? `${runCmd} ${testScript}` : undefined,\n testSingle,\n lint: lintScript ? `${runCmd} ${lintScript}` : undefined,\n typecheck: typecheckScript ? `${runCmd} ${typecheckScript}` : undefined,\n format: formatScript ? `${runCmd} ${formatScript}` : undefined,\n preCommit,\n dbMigrate: dbMigrateScript ? `${runCmd} ${dbMigrateScript}` : undefined,\n dbGenerate: dbGenerateScript ? `${runCmd} ${dbGenerateScript}` : undefined,\n }\n\n const stack: StackInfo = {\n framework,\n language: (has('typescript') || existsSync(tsconfigPath)) ? 'typescript' : 'javascript',\n testRunner,\n database,\n stateLib,\n cssApproach,\n uiLib,\n packageManager,\n linter,\n formatter,\n commitConvention,\n deployTarget,\n isNextAppRouter,\n hasMonorepo,\n hasSupabaseLocal,\n pathAlias,\n }\n\n return {\n name: pkg.name ?? 'untitled',\n description: pkg.description,\n version: pkg.version,\n scripts,\n allDeps,\n stack,\n commands,\n }\n}\n","import { readdirSync, statSync, existsSync, readFileSync } from 'fs'\nimport { join, relative } from 'path'\nimport type { DirectoryEntry, StackInfo } from '../types.js'\n\n// Directories we always skip\nconst SKIP_ALWAYS = new Set([\n 'node_modules', '.git', '.next', '.nuxt', '.svelte-kit',\n 'dist', 'build', 'out', '.turbo', '.cache', 'coverage',\n '.vercel', '.netlify', '__pycache__', '.pytest_cache',\n])\n\n// ─── Purpose map ─────────────────────────────────────────────────────────────\n// Maps directory name patterns → human-readable purpose\n\nconst PURPOSE_MAP: Array<[RegExp | string, string]> = [\n ['src/app', 'App Router pages, layouts, and server components'],\n ['src/pages', 'Next.js pages and API routes'],\n ['app', 'App Router pages, layouts, and server components'],\n ['pages', 'Next.js pages and API routes'],\n ['src/components', 'React components'],\n ['components', 'React components'],\n ['src/components/ui', 'shadcn/ui primitive components'],\n ['components/ui', 'shadcn/ui primitive components'],\n ['src/lib', 'Shared utilities and helper functions'],\n ['src/utils', 'Shared utility functions'],\n ['lib', 'Shared utilities'],\n ['utils', 'Utility functions'],\n ['src/hooks', 'Custom React hooks'],\n ['hooks', 'Custom React hooks'],\n ['src/types', 'TypeScript type definitions'],\n ['types', 'TypeScript type definitions'],\n ['src/stores', 'State management stores'],\n ['stores', 'State management stores'],\n ['src/server', 'Server-side code and API handlers'],\n ['src/api', 'API route handlers'],\n ['server', 'Server-side code'],\n ['api', 'API endpoints'],\n ['src/db', 'Database schema, queries, and migrations'],\n ['src/database', 'Database schema and queries'],\n ['db', 'Database schema and queries'],\n ['database', 'Database layer'],\n ['supabase', 'Supabase local config, migrations, and edge functions'],\n ['prisma', 'Prisma schema and generated client'],\n ['drizzle', 'Drizzle ORM schema and migrations'],\n ['migrations', 'Database migration files'],\n ['public', 'Static assets served as-is'],\n ['static', 'Static assets'],\n ['assets', 'Images, fonts, and other static assets'],\n ['styles', 'Global styles and CSS variables'],\n ['src/styles', 'Global styles'],\n ['src/config', 'App configuration'],\n ['config', 'Configuration files'],\n ['src/middleware', 'Express/Next.js middleware'],\n ['middleware', 'Request middleware'],\n ['src/services', 'Business logic and external service clients'],\n ['services', 'Service layer'],\n ['src/actions', 'Server actions'],\n ['actions', 'Server actions'],\n ['src/context', 'React context providers'],\n ['context', 'React context providers'],\n ['scripts', 'Build and maintenance scripts'],\n ['tests', 'Test files'],\n ['__tests__', 'Test files'],\n ['e2e', 'End-to-end tests'],\n ['docs', 'Documentation'],\n ['.claude', 'Claude Code configuration and rules'],\n ['.github', 'GitHub Actions and workflows'],\n]\n\nfunction getPurpose(relPath: string): string | undefined {\n // Exact match first, then pattern\n for (const [key, purpose] of PURPOSE_MAP) {\n if (typeof key === 'string') {\n if (relPath === key) return purpose\n } else {\n if (key.test(relPath)) return purpose\n }\n }\n return undefined\n}\n\n// Fallback: infer a generic purpose from a directory name\nfunction inferPurposeFromName(name: string): string | undefined {\n const lower = name.toLowerCase()\n const map: Record<string, string> = {\n scanner: 'File and repo analysis modules',\n generator: 'Output generators',\n generators: 'Output generators',\n parser: 'Parsing utilities',\n parsers: 'Parsing utilities',\n writer: 'File writing utilities',\n writers: 'File writing utilities',\n command: 'CLI command handlers',\n commands: 'CLI command handlers',\n handler: 'Request or event handlers',\n handlers: 'Request or event handlers',\n controller: 'Route controllers',\n controllers: 'Route controllers',\n model: 'Data models',\n models: 'Data models',\n schema: 'Data schemas',\n schemas: 'Data schemas',\n resolver: 'GraphQL resolvers',\n resolvers: 'GraphQL resolvers',\n route: 'Route definitions',\n routes: 'Route definitions',\n plugin: 'Plugin modules',\n plugins: 'Plugin modules',\n provider: 'React context providers',\n providers: 'React context providers',\n helper: 'Helper utilities',\n helpers: 'Helper utilities',\n test: 'Test files',\n tests: 'Test files',\n spec: 'Test files',\n specs: 'Test files',\n fixture: 'Test fixtures',\n fixtures: 'Test fixtures',\n mock: 'Mock modules for testing',\n mocks: 'Mock modules for testing',\n constant: 'Constants and enums',\n constants: 'Constants and enums',\n enum: 'TypeScript enums',\n enums: 'TypeScript enums',\n event: 'Event definitions',\n events: 'Event definitions',\n job: 'Background jobs',\n jobs: 'Background jobs',\n queue: 'Job queue definitions',\n queues: 'Job queue definitions',\n dto: 'Data transfer objects',\n dtos: 'Data transfer objects',\n entity: 'Database entities',\n entities: 'Database entities',\n repository: 'Data access repositories',\n repositories: 'Data access repositories',\n }\n return map[lower]\n}\n\nexport function scanFilesystem(cwd: string, stack: StackInfo): DirectoryEntry[] {\n const entries: DirectoryEntry[] = []\n const seen = new Set<string>()\n\n function walk(dir: string, depth: number) {\n if (depth > 3) return\n let items: string[]\n try {\n items = readdirSync(dir)\n } catch {\n return\n }\n\n for (const item of items) {\n if (item.startsWith('.') && item !== '.claude' && item !== '.github') continue\n if (SKIP_ALWAYS.has(item)) continue\n\n const full = join(dir, item)\n const rel = relative(cwd, full)\n\n try {\n const stat = statSync(full)\n if (!stat.isDirectory()) continue\n } catch {\n continue\n }\n\n if (seen.has(rel)) continue\n seen.add(rel)\n\n const purpose = getPurpose(rel)\n if (purpose) {\n entries.push({ path: rel, purpose, isKey: depth <= 2 })\n // Don't recurse into directories we've already mapped\n continue\n }\n\n // Recurse into src/, packages/, apps/ to find their children\n if (item === 'src' || item === 'packages' || item === 'apps' || item === 'lib') {\n walk(full, depth + 1)\n continue\n }\n\n // For depth-1+ unknown dirs under src/, make a best-effort inference from name\n if (depth >= 1) {\n const inferred = inferPurposeFromName(item)\n if (inferred) {\n entries.push({ path: rel, purpose: inferred, isKey: true })\n }\n }\n }\n }\n\n walk(cwd, 0)\n\n // Sort: key entries first, then by depth (shorter paths first), then alphabetically\n entries.sort((a, b) => {\n if (a.isKey !== b.isKey) return a.isKey ? -1 : 1\n const aDepth = a.path.split('/').length\n const bDepth = b.path.split('/').length\n if (aDepth !== bDepth) return aDepth - bDepth\n return a.path.localeCompare(b.path)\n })\n\n // Deduplicate overlapping entries (e.g. don't show both src/components AND src/components/ui if both matched)\n const deduped: DirectoryEntry[] = []\n for (const entry of entries) {\n const isSubpathOfExisting = deduped.some(\n e => entry.path.startsWith(e.path + '/') && entry.path !== e.path\n )\n // Keep sub-paths only if they're notable (ui subdir, supabase children, etc.)\n const isNotable = entry.path.includes('/ui') || entry.path === 'supabase' || entry.path.startsWith('.claude')\n if (!isSubpathOfExisting || isNotable) {\n deduped.push(entry)\n }\n }\n\n // Cap at 12 entries for output — pick the most key ones\n return deduped\n .filter(e => e.isKey)\n .slice(0, 12)\n .concat(deduped.filter(e => !e.isKey).slice(0, 3))\n .slice(0, 12)\n}\n\n// ─── MCP server detection ────────────────────────────────────────────────────\n\nexport function detectMcpServers(cwd: string): string[] {\n const servers: string[] = []\n const claudeDir = join(cwd, '.claude')\n if (!existsSync(claudeDir)) return servers\n\n try {\n const files = readdirSync(claudeDir)\n for (const file of files) {\n if (!file.endsWith('.json')) continue\n const content = readFileSync(join(claudeDir, file), 'utf-8')\n const parsed = JSON.parse(content)\n if (parsed.mcpServers) {\n servers.push(...Object.keys(parsed.mcpServers))\n }\n }\n } catch {\n // non-fatal\n }\n\n // Also check claude_desktop_config.json at root\n const desktopConfig = join(cwd, 'claude_desktop_config.json')\n if (existsSync(desktopConfig)) {\n try {\n const parsed = JSON.parse(readFileSync(desktopConfig, 'utf-8'))\n if (parsed.mcpServers) servers.push(...Object.keys(parsed.mcpServers))\n } catch {\n // non-fatal\n }\n }\n\n return [...new Set(servers)]\n}\n","import { existsSync } from 'fs'\nimport { join } from 'path'\nimport type { GitInfo } from '../types.js'\n\n// Lazy import to avoid error if simple-git is not yet installed during dev\nasync function getGit(cwd: string) {\n const { simpleGit } = await import('simple-git')\n return simpleGit(cwd)\n}\n\nexport async function scanGit(cwd: string): Promise<GitInfo> {\n const hasHusky = existsSync(join(cwd, '.husky'))\n\n if (!existsSync(join(cwd, '.git'))) {\n return { recentExamples: [], hasHusky }\n }\n\n try {\n const git = await getGit(cwd)\n\n // Get recent commits\n const log = await git.log({ maxCount: 25, '--no-merges': null })\n const messages = log.all.map(c => c.message.trim()).filter(Boolean)\n\n // Detect commit format from recent messages\n const commitFormat = detectCommitFormat(messages)\n\n // Get default branch\n let defaultBranch: string | undefined\n try {\n const branches = await git.branch(['-r'])\n if (branches.all.includes('origin/main')) defaultBranch = 'main'\n else if (branches.all.includes('origin/master')) defaultBranch = 'master'\n } catch {\n // non-fatal\n }\n\n // Pick 2-3 representative examples (different types if conventional)\n const recentExamples = pickExamples(messages, commitFormat)\n\n return { commitFormat, recentExamples, defaultBranch, hasHusky }\n } catch {\n return { recentExamples: [], hasHusky }\n }\n}\n\nfunction detectCommitFormat(messages: string[]): string | undefined {\n if (messages.length === 0) return undefined\n\n // Conventional commits: type(scope): description or type: description\n const conventionalRe = /^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\\(.+\\))?: .+/\n const conventionalCount = messages.filter(m => conventionalRe.test(m)).length\n\n // Gitmoji: starts with emoji\n const gitmoji = /^[\\u{1F300}-\\u{1FAFF}]/u\n const gitmojiCount = messages.filter(m => gitmoji.test(m)).length\n\n const threshold = Math.max(3, messages.length * 0.6)\n\n if (conventionalCount >= threshold) return 'type(scope): description — conventional commits'\n if (gitmojiCount >= threshold) return ':emoji: description — gitmoji'\n return undefined\n}\n\nfunction pickExamples(messages: string[], format: string | undefined): string[] {\n if (messages.length === 0) return []\n\n if (format?.includes('conventional')) {\n // Try to pick one of each common type\n const types = ['feat', 'fix', 'chore', 'refactor', 'docs']\n const picked: string[] = []\n for (const type of types) {\n const match = messages.find(m => m.startsWith(type))\n if (match && picked.length < 3) picked.push(match)\n }\n if (picked.length > 0) return picked\n }\n\n // Fallback: first 3 unique messages\n return messages.slice(0, 3)\n}\n","import type { StackInfo, Convention } from '../types.js'\n\n// ─── Inference rules ──────────────────────────────────────────────────────────\n// Each rule: { condition, convention?, doNot? }\n// Applied in order. First match wins within each category.\n\ninterface Rule {\n condition: (stack: StackInfo, deps: Record<string, string>) => boolean\n convention?: string\n doNot?: string\n inferredFrom: string\n}\n\nconst RULES: Rule[] = [\n // ── State management ────────────────────────────────────────────────────\n {\n condition: s => s.stateLib === 'zustand',\n doNot: 'Do not introduce Redux or Redux Toolkit — state management is Zustand',\n inferredFrom: 'dep:zustand',\n },\n {\n condition: s => s.stateLib === 'tanstack-query',\n doNot: 'Do not store server state in useState or useReducer — use TanStack Query',\n inferredFrom: 'dep:@tanstack/react-query',\n },\n {\n condition: s => s.stateLib === 'jotai',\n doNot: 'Do not use Redux or Zustand — state management is Jotai',\n inferredFrom: 'dep:jotai',\n },\n\n // ── Database ────────────────────────────────────────────────────────────\n {\n condition: s => s.database === 'prisma',\n doNot: 'Do not write raw SQL — use Prisma ORM for all database access',\n inferredFrom: 'dep:prisma',\n },\n {\n condition: s => s.database === 'drizzle',\n doNot: 'Do not write raw SQL — use Drizzle ORM for all database access',\n inferredFrom: 'dep:drizzle-orm',\n },\n {\n condition: s => s.database === 'supabase',\n convention: 'Use the Supabase client from @/lib/supabase (or equivalent) — do not instantiate directly',\n inferredFrom: 'dep:@supabase/supabase-js',\n },\n\n // ── CSS / styling ────────────────────────────────────────────────────────\n {\n condition: s => s.cssApproach === 'tailwind',\n doNot: 'Do not use inline styles or CSS-in-JS — styling is Tailwind utility classes',\n inferredFrom: 'dep:tailwindcss',\n },\n {\n condition: s => s.cssApproach === 'css-modules',\n doNot: 'Do not use inline styles — use CSS Modules (*.module.css)',\n inferredFrom: 'css-modules detected',\n },\n {\n condition: s => s.cssApproach === 'styled-components',\n convention: 'Styling uses styled-components — keep component styles co-located',\n inferredFrom: 'dep:styled-components',\n },\n\n // ── UI lib ───────────────────────────────────────────────────────────────\n {\n condition: s => s.uiLib === 'shadcn',\n convention: 'UI primitives live in @/components/ui — use them before creating new components',\n inferredFrom: 'src/components/ui detected',\n },\n {\n condition: s => s.uiLib === 'chakra',\n convention: 'UI components use Chakra UI — do not mix with other component libraries',\n inferredFrom: 'dep:@chakra-ui/react',\n },\n\n // ── Next.js ─────────────────────────────────────────────────────────────\n {\n condition: s => s.isNextAppRouter,\n convention: 'This is a Next.js App Router project — use Server Components by default, add \"use client\" only when needed',\n inferredFrom: 'nextjs app/ directory detected',\n },\n {\n condition: s => s.isNextAppRouter,\n doNot: 'Do not create files in a pages/ directory — this project uses App Router',\n inferredFrom: 'nextjs app/ directory detected',\n },\n\n // ── Path aliases ──────────────────────────────────────────────────────────\n {\n condition: s => !!s.pathAlias,\n convention: s => `Use the ${s.pathAlias} path alias for imports — do not use relative paths like ../../`,\n inferredFrom: 'tsconfig paths',\n },\n\n // ── Monorepo ─────────────────────────────────────────────────────────────\n {\n condition: s => s.hasMonorepo,\n convention: 'Monorepo: run commands from the workspace root with --filter or --workspace flags',\n inferredFrom: 'monorepo config detected',\n },\n\n // ── Commit conventions ───────────────────────────────────────────────────\n {\n condition: s => s.commitConvention === 'conventional-commits',\n convention: \"Commits follow Conventional Commits: type(scope): description (e.g. feat(auth): add OAuth login)\",\n inferredFrom: 'dep:@commitlint',\n },\n {\n condition: s => s.commitConvention === 'gitmoji',\n convention: 'Commits use gitmoji prefix (e.g. ✨ new feature, 🐛 bug fix)',\n inferredFrom: 'dep:gitmoji-cli',\n },\n\n // ── TypeScript ───────────────────────────────────────────────────────────\n {\n condition: (s, deps) => s.language === 'typescript' && 'typescript' in deps,\n doNot: 'Do not use @ts-ignore or any — fix type errors properly',\n inferredFrom: 'dep:typescript',\n },\n\n // ── Testing ──────────────────────────────────────────────────────────────\n {\n condition: s => s.testRunner === 'vitest',\n convention: 'Tests use Vitest — co-locate test files as *.test.ts beside the file they test',\n inferredFrom: 'dep:vitest',\n },\n]\n\n// Convention condition can be a function (for dynamic messages) or a string\ntype ConventionCondition = Rule['convention']\nfunction resolveConvention(c: ConventionCondition, stack: StackInfo): string | undefined {\n if (typeof c === 'function') return (c as (s: StackInfo) => string)(stack)\n return c\n}\n\nexport function inferConventions(\n stack: StackInfo,\n allDeps: Record<string, string>\n): { conventions: Convention[]; doNots: string[] } {\n const conventions: Convention[] = []\n const doNots: string[] = []\n\n for (const rule of RULES) {\n if (!rule.condition(stack, allDeps)) continue\n\n if (rule.convention) {\n const text = resolveConvention(rule.convention, stack)\n if (text) conventions.push({ rule: text, inferredFrom: rule.inferredFrom })\n }\n if (rule.doNot) {\n doNots.push(rule.doNot)\n }\n }\n\n return { conventions, doNots }\n}\n","import { scanPackage } from './package.js'\nimport { scanFilesystem, detectMcpServers } from './filesystem.js'\nimport { scanGit } from './git.js'\nimport { inferConventions } from './inference.js'\nimport type { RepoContext } from '../types.js'\n\nexport async function scanRepo(cwd: string): Promise<RepoContext> {\n const pkg = scanPackage(cwd)\n\n const [directories, git] = await Promise.all([\n Promise.resolve(scanFilesystem(cwd, pkg.stack)),\n scanGit(cwd),\n ])\n\n const mcpServers = detectMcpServers(cwd)\n const { conventions, doNots } = inferConventions(pkg.stack, pkg.allDeps)\n\n return {\n name: pkg.name,\n description: pkg.description,\n version: pkg.version,\n stack: pkg.stack,\n scripts: pkg.scripts,\n commands: pkg.commands,\n directories,\n git,\n conventions,\n doNots,\n mcpServers,\n hasDatabaseNotes: !!(pkg.stack.database && (pkg.commands.dbMigrate || pkg.stack.hasSupabaseLocal)),\n hasSupabaseLocal: pkg.stack.hasSupabaseLocal,\n cwd,\n allDeps: pkg.allDeps,\n }\n}\n","import type { RepoContext } from '../types.js'\n\nconst MAX_LINES = 150\n\n// ─── Headline builder ─────────────────────────────────────────────────────────\n\nfunction buildHeadline(ctx: RepoContext): string {\n const { stack, name, description } = ctx\n const parts: string[] = []\n\n // Framework\n if (stack.framework === 'nextjs') {\n parts.push(`Next.js${stack.isNextAppRouter ? ' (App Router)' : ''}`)\n } else if (stack.framework === 'react') {\n parts.push('React')\n } else if (stack.framework === 'vue') {\n parts.push('Vue')\n } else if (stack.framework === 'svelte') {\n parts.push('SvelteKit')\n } else if (stack.framework === 'express') {\n parts.push('Express')\n } else if (stack.framework === 'fastify') {\n parts.push('Fastify')\n } else if (stack.framework === 'hono') {\n parts.push('Hono')\n }\n\n if (stack.language === 'typescript') parts.push('TypeScript')\n\n // Key deps summary\n const keyDeps: string[] = []\n if (stack.database === 'prisma') keyDeps.push('Prisma')\n else if (stack.database === 'drizzle') keyDeps.push('Drizzle')\n else if (stack.database === 'supabase') keyDeps.push('Supabase')\n if (stack.cssApproach === 'tailwind') keyDeps.push('Tailwind')\n if (stack.uiLib === 'shadcn') keyDeps.push('shadcn/ui')\n if (stack.stateLib === 'zustand') keyDeps.push('Zustand')\n else if (stack.stateLib === 'tanstack-query') keyDeps.push('TanStack Query')\n if (stack.deployTarget === 'vercel') keyDeps.push('Vercel')\n\n const stackStr = parts.join(' + ')\n const depsStr = keyDeps.length > 0 ? ` using ${keyDeps.join(', ')}.` : '.'\n\n // Use description if it's short and informative, otherwise build from stack\n if (description && description.length < 80 && !description.toLowerCase().includes('undefined')) {\n return `${stackStr}${depsStr} ${description}`\n }\n\n return `${stackStr}${depsStr}`\n}\n\n// ─── Commands section ─────────────────────────────────────────────────────────\n\nfunction buildCommandsSection(ctx: RepoContext): string[] {\n const lines: string[] = ['## Commands', '']\n const { commands } = ctx\n\n if (commands.dev) lines.push(`- \\`${commands.dev}\\` — start dev server`)\n if (commands.build) lines.push(`- \\`${commands.build}\\` — production build`)\n if (commands.test) lines.push(`- \\`${commands.test}\\` — run all tests`)\n if (commands.testSingle) lines.push(`- \\`${commands.testSingle}\\` — run a single test file`)\n if (commands.lint) lines.push(`- \\`${commands.lint}\\` — lint`)\n if (commands.typecheck) lines.push(`- \\`${commands.typecheck}\\` — type check`)\n if (commands.format) lines.push(`- \\`${commands.format}\\` — format`)\n if (commands.dbMigrate) lines.push(`- \\`${commands.dbMigrate}\\` — run database migrations`)\n if (commands.dbGenerate) lines.push(`- \\`${commands.dbGenerate}\\` — regenerate database types`)\n\n if (commands.preCommit) {\n lines.push('')\n lines.push(`Always run \\`${commands.preCommit}\\` before committing.`)\n }\n\n return lines\n}\n\n// ─── Architecture section ─────────────────────────────────────────────────────\n\nfunction buildArchSection(ctx: RepoContext): string[] {\n if (ctx.directories.length === 0) return []\n\n const lines: string[] = ['## Architecture', '']\n for (const dir of ctx.directories) {\n lines.push(`- \\`${dir.path}/\\` — ${dir.purpose}`)\n }\n return lines\n}\n\n// ─── Conventions section ──────────────────────────────────────────────────────\n\nfunction buildConventionsSection(ctx: RepoContext): string[] {\n if (ctx.conventions.length === 0) return []\n\n const lines: string[] = ['## Conventions', '']\n for (const c of ctx.conventions) {\n lines.push(`- ${c.rule}`)\n }\n return lines\n}\n\n// ─── Testing section ──────────────────────────────────────────────────────────\n\nfunction buildTestingSection(ctx: RepoContext): string[] {\n const { stack, commands } = ctx\n if (!stack.testRunner) return []\n\n const lines: string[] = ['## Testing', '']\n\n if (stack.testRunner === 'vitest') {\n lines.push(`Uses Vitest. Run all: \\`${commands.test ?? 'vitest'}\\``)\n if (commands.testSingle) lines.push(`Run one file: \\`${commands.testSingle}\\``)\n } else if (stack.testRunner === 'jest') {\n lines.push(`Uses Jest. Run all: \\`${commands.test ?? 'jest'}\\``)\n if (commands.testSingle) lines.push(`Run one file: \\`${commands.testSingle}\\``)\n } else if (stack.testRunner === 'mocha') {\n lines.push(`Uses Mocha. Run: \\`${commands.test ?? 'mocha'}\\``)\n }\n\n return lines\n}\n\n// ─── Git section ──────────────────────────────────────────────────────────────\n\nfunction buildGitSection(ctx: RepoContext): string[] {\n const { git } = ctx\n const lines: string[] = []\n\n if (!git.commitFormat && git.recentExamples.length === 0) return lines\n\n lines.push('## Git', '')\n\n if (git.commitFormat) {\n lines.push(`Commit format: \\`${git.commitFormat}\\``)\n }\n\n if (git.recentExamples.length > 0 && git.commitFormat) {\n lines.push('')\n lines.push('Examples:')\n for (const ex of git.recentExamples.slice(0, 2)) {\n lines.push(`- \\`${ex.slice(0, 72)}\\``)\n }\n }\n\n return lines\n}\n\n// ─── Do NOT section ───────────────────────────────────────────────────────────\n\nfunction buildDoNotSection(ctx: RepoContext): string[] {\n if (ctx.doNots.length === 0) return []\n\n const lines: string[] = ['## Do NOT', '']\n for (const doNot of ctx.doNots) {\n lines.push(`- ${doNot}`)\n }\n return lines\n}\n\n// ─── MCP section (optional) ───────────────────────────────────────────────────\n\nfunction buildMcpSection(ctx: RepoContext): string[] {\n if (ctx.mcpServers.length === 0) return []\n\n const lines: string[] = ['## MCP Servers', '']\n lines.push('Available in this project:')\n for (const srv of ctx.mcpServers) {\n lines.push(`- ${srv}`)\n }\n return lines\n}\n\n// ─── Database section (optional) ─────────────────────────────────────────────\n\nfunction buildDatabaseSection(ctx: RepoContext): string[] {\n if (!ctx.hasDatabaseNotes) return []\n\n const lines: string[] = ['## Database', '']\n\n if (ctx.stack.database === 'prisma') {\n lines.push('Schema is in `prisma/schema.prisma`.')\n if (ctx.commands.dbMigrate) lines.push(`Run migrations: \\`${ctx.commands.dbMigrate}\\``)\n if (ctx.commands.dbGenerate) lines.push(`Regenerate client: \\`${ctx.commands.dbGenerate}\\``)\n } else if (ctx.stack.database === 'drizzle') {\n lines.push('Schema is in `drizzle/` or `src/db/`.')\n if (ctx.commands.dbMigrate) lines.push(`Apply migrations: \\`${ctx.commands.dbMigrate}\\``)\n } else if (ctx.stack.hasSupabaseLocal) {\n lines.push('Uses Supabase local development stack.')\n lines.push('Start local: `supabase start`')\n lines.push('Apply migrations: `supabase db push`')\n if (ctx.commands.dbGenerate) lines.push(`Generate types: \\`${ctx.commands.dbGenerate}\\``)\n }\n\n return lines\n}\n\n// ─── Main generator ───────────────────────────────────────────────────────────\n\nexport function generateClaude(ctx: RepoContext): string {\n const sections: string[][] = [\n [`# ${ctx.name}`, '', buildHeadline(ctx), ''],\n [...buildCommandsSection(ctx), ''],\n [...buildArchSection(ctx), ''],\n [...buildConventionsSection(ctx), ''],\n [...buildTestingSection(ctx), ''],\n [...buildGitSection(ctx), ''],\n [...buildDoNotSection(ctx), ''],\n [...buildMcpSection(ctx), ''],\n [...buildDatabaseSection(ctx), ''],\n ]\n\n const allLines = sections\n .flat()\n .join('\\n')\n .split('\\n')\n\n // Trim trailing empty lines per section, then enforce 150-line cap\n const trimmed = allLines\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n') // max 2 consecutive blank lines\n .trim()\n\n const lines = trimmed.split('\\n')\n\n if (lines.length <= MAX_LINES) {\n return trimmed + '\\n'\n }\n\n // Soft cap: truncate at 150 lines with a note\n const capped = lines.slice(0, MAX_LINES - 3).join('\\n')\n return capped + '\\n\\n<!-- contextmd: output capped at 150 lines. Run with --depth for extended output. -->\\n'\n}\n","import type { RepoContext } from '../types.js'\n\n// AGENTS.md is the multi-agent standard (Codex, Amp, Cursor, Windsurf).\n// Format differs from CLAUDE.md: no markdown headers, structured with\n// clear sections that generalist agents parse reliably.\n//\n// Based on GitHub Blog analysis of 2,500+ repositories and community consensus.\n\nexport function generateAgents(ctx: RepoContext): string {\n const { name, stack, commands, directories, conventions, doNots, git } = ctx\n const lines: string[] = []\n\n // ── Header ──────────────────────────────────────────────────────────────\n lines.push(`# ${name} — Agent Instructions`)\n lines.push('')\n lines.push(buildHeadline(ctx))\n lines.push('')\n\n // ── Environment setup ────────────────────────────────────────────────────\n lines.push('## Environment')\n lines.push('')\n if (commands.dev) lines.push(`Dev server: \\`${commands.dev}\\``)\n if (commands.build) lines.push(`Build: \\`${commands.build}\\``)\n if (commands.typecheck) lines.push(`Type check: \\`${commands.typecheck}\\``)\n if (commands.lint) lines.push(`Lint: \\`${commands.lint}\\``)\n if (commands.test) lines.push(`Tests: \\`${commands.test}\\``)\n if (commands.testSingle) lines.push(`Single test: \\`${commands.testSingle}\\``)\n lines.push('')\n\n // ── Required checks before finishing any task ─────────────────────────────\n lines.push('## Required before completing any task')\n lines.push('')\n const checks: string[] = []\n if (commands.typecheck) checks.push(`Run \\`${commands.typecheck}\\` — zero type errors`)\n if (commands.lint) checks.push(`Run \\`${commands.lint}\\` — zero lint errors`)\n if (commands.test) checks.push(`Run \\`${commands.test}\\` — all tests pass`)\n if (commands.build) checks.push(`Run \\`${commands.build}\\` — build succeeds`)\n\n if (checks.length > 0) {\n for (const check of checks) lines.push(`- ${check}`)\n } else {\n lines.push('- Ensure no TypeScript errors before submitting')\n lines.push('- Ensure all existing tests pass')\n }\n lines.push('')\n\n // ── Code style ─────────────────────────────────────────────────────────────\n if (conventions.length > 0) {\n lines.push('## Code style')\n lines.push('')\n for (const c of conventions) {\n lines.push(`- ${c.rule}`)\n }\n lines.push('')\n }\n\n // ── Constraints ─────────────────────────────────────────────────────────────\n if (doNots.length > 0) {\n lines.push('## Constraints')\n lines.push('')\n for (const doNot of doNots) {\n lines.push(`- ${doNot}`)\n }\n lines.push('')\n }\n\n // ── Repository map ──────────────────────────────────────────────────────────\n if (directories.length > 0) {\n lines.push('## Repository structure')\n lines.push('')\n for (const dir of directories) {\n lines.push(`- \\`${dir.path}/\\` — ${dir.purpose}`)\n }\n lines.push('')\n }\n\n // ── Commit format ──────────────────────────────────────────────────────────\n if (git.commitFormat) {\n lines.push('## Commit format')\n lines.push('')\n lines.push(git.commitFormat)\n if (git.recentExamples.length > 0) {\n lines.push('')\n lines.push('Examples:')\n for (const ex of git.recentExamples.slice(0, 2)) {\n lines.push(`- \\`${ex.slice(0, 72)}\\``)\n }\n }\n lines.push('')\n }\n\n // ── Reminders ─────────────────────────────────────────────────────────────\n lines.push('## Reminders')\n lines.push('')\n\n if (stack.isNextAppRouter) {\n lines.push('- This is a Next.js App Router project. Default to Server Components.')\n lines.push('- Only add \"use client\" when the component needs browser APIs or event handlers.')\n }\n\n if (stack.database === 'prisma') {\n lines.push('- Never write raw SQL. All database access goes through Prisma.')\n } else if (stack.database === 'drizzle') {\n lines.push('- Never write raw SQL. All database access goes through Drizzle ORM.')\n }\n\n if (stack.pathAlias) {\n lines.push(`- Use \\`${stack.pathAlias}\\` path alias for imports, not relative paths.`)\n }\n\n lines.push('- Do not commit changes to auto-generated files (prisma client, supabase types, etc.).')\n lines.push('- Prefer editing existing patterns over introducing new abstractions.')\n\n return lines.join('\\n') + '\\n'\n}\n\nfunction buildHeadline(ctx: RepoContext): string {\n const { stack, description } = ctx\n const parts: string[] = []\n\n if (stack.framework === 'nextjs') parts.push(`Next.js${stack.isNextAppRouter ? ' App Router' : ''}`)\n else if (stack.framework === 'react') parts.push('React')\n else if (stack.framework === 'vue') parts.push('Vue')\n else if (stack.framework === 'svelte') parts.push('SvelteKit')\n else if (stack.framework) parts.push(stack.framework)\n\n if (stack.language === 'typescript') parts.push('TypeScript')\n\n const extras: string[] = []\n if (stack.database === 'prisma') extras.push('Prisma')\n else if (stack.database === 'drizzle') extras.push('Drizzle')\n else if (stack.database === 'supabase') extras.push('Supabase')\n if (stack.cssApproach === 'tailwind') extras.push('Tailwind CSS')\n if (stack.uiLib === 'shadcn') extras.push('shadcn/ui')\n\n const base = parts.join(' + ') + (extras.length ? ` · ${extras.join(', ')}` : '')\n return description ? `${base} — ${description}` : base\n}\n","import type { RepoContext } from '../types.js'\n\n// ruler (https://github.com/intellectronica/ruler) distributes rules to 27+\n// agent formats. contextmd generates the .ruler/ source files — ruler handles\n// the fan-out. This is the --ruler flag integration.\n//\n// ruler has 1,900 stars and 36K weekly downloads. Its users already want a\n// generator. contextmd --ruler turns ruler's audience into a discovery funnel.\n\nexport interface RulerOutput {\n files: Record<string, string>\n}\n\nexport function generateRulerFiles(ctx: RepoContext): RulerOutput {\n const files: Record<string, string> = {}\n files['.ruler/rules.md'] = buildRulerRules(ctx)\n files['.ruler/project.md'] = buildRulerProject(ctx)\n return { files }\n}\n\nfunction buildRulerRules(ctx: RepoContext): string {\n const lines: string[] = [\n '# Rules',\n '',\n '<!-- Generated by contextmd --ruler — edit here, ruler distributes to all agents -->',\n '',\n ]\n\n if (ctx.conventions.length > 0) {\n lines.push('## Conventions', '')\n for (const c of ctx.conventions) lines.push(`- ${c.rule}`)\n lines.push('')\n }\n\n if (ctx.doNots.length > 0) {\n lines.push('## Constraints', '')\n for (const doNot of ctx.doNots) lines.push(`- ${doNot}`)\n lines.push('')\n }\n\n if (ctx.commands.preCommit) {\n lines.push('## Before committing', '', `Always run: \\`${ctx.commands.preCommit}\\``, '')\n }\n\n return lines.join('\\n')\n}\n\nfunction buildRulerProject(ctx: RepoContext): string {\n const { name, stack, directories } = ctx\n const lines: string[] = [`# ${name}`, '']\n\n const parts: string[] = []\n if (stack.framework) parts.push(stack.framework)\n if (stack.language === 'typescript') parts.push('TypeScript')\n if (stack.database) parts.push(stack.database)\n if (parts.length > 0) lines.push(parts.join(' + '), '')\n\n if (directories.length > 0) {\n lines.push('## Structure', '')\n for (const dir of directories) lines.push(`- \\`${dir.path}/\\` — ${dir.purpose}`)\n lines.push('')\n }\n\n return lines.join('\\n')\n}\n","import { readFileSync, existsSync } from 'fs'\nimport { join } from 'path'\nimport type { ScoreResult, ScoreCheck } from '../types.js'\n\n// The 5 commit-readiness tests from the research (GitHub Blog + community consensus):\n//\n// 1. Every command in the Commands section can be copy-pasted and run immediately\n// 2. The architecture map matches the actual directory structure\n// 3. Conventions section contains at least one fact not in README / obvious from stack\n// 4. \"Do NOT\" section contains at least one explicit rejection of a plausible alternative\n// 5. The whole file is under 200 lines\n\nexport function scoreClaudeFile(cwd: string): ScoreResult {\n const filePath = join(cwd, 'CLAUDE.md')\n\n if (!existsSync(filePath)) {\n return {\n total: 0,\n checks: [\n {\n name: 'File exists',\n passed: false,\n score: 0,\n feedback: 'No CLAUDE.md found. Run `npx contextmd` to generate one.',\n },\n ],\n }\n }\n\n const content = readFileSync(filePath, 'utf-8')\n const lines = content.split('\\n')\n\n const checks: ScoreCheck[] = [\n checkCommands(content),\n checkArchitecture(content, cwd),\n checkConventions(content),\n checkDoNot(content),\n checkLength(lines),\n ]\n\n const total = Math.round(checks.reduce((sum, c) => sum + c.score, 0))\n\n return { total, checks }\n}\n\n// ─── Individual checks ────────────────────────────────────────────────────────\n\nfunction checkCommands(content: string): ScoreCheck {\n const hasCommandsSection = /^## Commands/m.test(content)\n const commandMatches = content.match(/`([^`]+)`/g) ?? []\n const hasExecutableCommands = commandMatches.some(cmd => {\n const inner = cmd.replace(/`/g, '')\n return /^(npm|pnpm|yarn|bun|node|npx|vitest|jest|tsc|next|vite|deno)/.test(inner)\n })\n\n const passed = hasCommandsSection && hasExecutableCommands\n return {\n name: 'Commands are executable',\n passed,\n score: passed ? 20 : hasCommandsSection ? 10 : 0,\n feedback: passed\n ? 'Commands section has executable commands.'\n : !hasCommandsSection\n ? 'Missing ## Commands section. Add dev, build, test commands.'\n : 'Commands section found but commands are not in backtick format.',\n }\n}\n\nfunction checkArchitecture(content: string, cwd: string): ScoreCheck {\n const hasArchSection = /^## Architecture/m.test(content)\n if (!hasArchSection) {\n return {\n name: 'Architecture map',\n passed: false,\n score: 0,\n feedback: 'Missing ## Architecture section with directory map.',\n }\n }\n\n const archSection = content.split(/^## /m).find(s => s.startsWith('Architecture'))\n const mentionedDirs = (archSection?.match(/`([^`/]+\\/[^`]*)`/g) ?? [])\n .map(m => m.replace(/`/g, '').replace(/\\/$/, ''))\n\n const existCount = mentionedDirs.filter(d => {\n try { return existsSync(join(cwd, d)) } catch { return false }\n }).length\n\n const accuracy = mentionedDirs.length > 0 ? existCount / mentionedDirs.length : 1\n const passed = accuracy >= 0.8 || mentionedDirs.length === 0\n\n return {\n name: 'Architecture matches actual structure',\n passed,\n score: passed ? 20 : 10,\n feedback: passed\n ? 'Architecture section looks accurate.'\n : `${mentionedDirs.length - existCount} directories in Architecture section don't exist. Run \\`contextmd sync\\` to update.`,\n }\n}\n\nfunction checkConventions(content: string): ScoreCheck {\n const hasSection = /^## Conventions/m.test(content)\n if (!hasSection) {\n return {\n name: 'Conventions encode team decisions',\n passed: false,\n score: 0,\n feedback: 'Missing ## Conventions section. Add at least one non-obvious team decision.',\n }\n }\n\n const section = content.split(/^## /m).find(s => s.startsWith('Conventions'))\n const bulletCount = (section?.match(/^- /gm) ?? []).length\n const passed = bulletCount >= 1\n\n return {\n name: 'Conventions encode team decisions',\n passed,\n score: passed ? 20 : 10,\n feedback: passed\n ? `${bulletCount} convention${bulletCount === 1 ? '' : 's'} documented.`\n : 'Conventions section is empty. Add at least one non-obvious team decision.',\n }\n}\n\nfunction checkDoNot(content: string): ScoreCheck {\n const hasSection = /^## Do NOT/m.test(content)\n if (!hasSection) {\n return {\n name: 'Do NOT prevents architectural drift',\n passed: false,\n score: 0,\n feedback: 'Missing ## Do NOT section. Add 2-3 explicit rejections of plausible alternatives.',\n }\n }\n\n const section = content.split(/^## /m).find(s => s.startsWith('Do NOT'))\n const bulletCount = (section?.match(/^- /gm) ?? []).length\n const passed = bulletCount >= 1\n\n return {\n name: 'Do NOT prevents architectural drift',\n passed,\n score: passed ? 20 : 10,\n feedback: passed\n ? `${bulletCount} explicit rejection${bulletCount === 1 ? '' : 's'} documented.`\n : 'Do NOT section is empty. Add explicit rejections of alternatives the team has decided against.',\n }\n}\n\nfunction checkLength(lines: string[]): ScoreCheck {\n const count = lines.length\n const passed = count <= 200\n let score: number\n if (count <= 150) score = 20\n else if (count <= 200) score = 15\n else if (count <= 300) score = 10\n else score = 0\n\n return {\n name: 'File under 200 lines',\n passed,\n score,\n feedback: passed\n ? `${count} lines — within the 200-line limit.`\n : `${count} lines — exceeds 200-line limit. Claude may treat it as low-signal. Trim or move detail to agent_docs/.`,\n }\n}\n"],"mappings":"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","names":["existsSync","join","existsSync","readFileSync","join","existsSync","join","buildHeadline","readFileSync","existsSync","join","existsSync","join"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/scanner/package.ts","../src/scanner/filesystem.ts","../src/scanner/git.ts","../src/scanner/inference.ts","../src/scanner/index.ts","../src/generators/claude.ts","../src/generators/agents.ts","../src/generators/ruler.ts","../src/generators/scorer.ts"],"sourcesContent":["import { program } from 'commander'\nimport { writeFileSync, existsSync, mkdirSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { createInterface } from 'readline'\nimport { scanRepo } from './scanner/index.js'\nimport { generateClaude } from './generators/claude.js'\nimport { generateAgents } from './generators/agents.js'\nimport { generateRulerFiles } from './generators/ruler.js'\nimport { scoreClaudeFile } from './generators/scorer.js'\n\nconst VERSION = '0.1.0'\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction write(filePath: string, content: string, overwrite = false) {\n if (!overwrite && existsSync(filePath)) {\n console.log(` ⚠ ${filePath} already exists — use --force to overwrite`)\n return false\n }\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content, 'utf-8')\n return true\n}\n\nfunction lineCount(content: string) {\n return content.split('\\n').length\n}\n\nasync function promptSubscribe() {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise<void>(resolve => {\n rl.question(\n '\\n📬 Get notified about updates? Enter email (or press Enter to skip): ',\n (email) => {\n rl.close()\n if (email && email.includes('@')) {\n console.log(` ✓ Noted — ${email} will receive release notes`)\n // TODO Phase 3: POST to Supabase edge function\n // fetch('https://api.contextmd.dev/subscribe', { method: 'POST', body: JSON.stringify({ email }) })\n }\n resolve()\n }\n )\n })\n}\n\n// ─── Commands ─────────────────────────────────────────────────────────────────\n\nprogram\n .name('contextmd')\n .description('Generate and sync CLAUDE.md and AGENTS.md for your repo')\n .version(VERSION)\n\n// ── init (default) ────────────────────────────────────────────────────────────\n\nprogram\n .command('init', { isDefault: true })\n .description('Generate CLAUDE.md and AGENTS.md in the current directory')\n .option('-f, --force', 'overwrite existing files')\n .option('--ruler', 'also write .ruler/ files for ruler.js fan-out (27+ agent formats)')\n .option('--no-agents', 'skip AGENTS.md generation')\n .option('--no-subscribe', 'skip the email subscribe prompt')\n .action(async (opts) => {\n const cwd = process.cwd()\n\n let spinner: { stop: () => void } | null = null\n try {\n const { default: ora } = await import('ora')\n spinner = ora('Scanning repository...').start()\n } catch {\n console.log('Scanning repository...')\n }\n\n let ctx: Awaited<ReturnType<typeof scanRepo>>\n try {\n ctx = await scanRepo(cwd)\n if (spinner) spinner.stop()\n } catch (err: unknown) {\n if (spinner) spinner.stop()\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`\\n✗ Scan failed: ${msg}`)\n process.exit(1)\n }\n\n const { default: chalk } = await import('chalk')\n\n console.log(`\\n${chalk.bold(ctx.name)} — ${ctx.stack.language}${ctx.stack.framework ? ` / ${ctx.stack.framework}` : ''}`)\n console.log()\n\n // ── CLAUDE.md ──\n const claudeContent = generateClaude(ctx)\n const claudePath = join(cwd, 'CLAUDE.md')\n const claudeWritten = write(claudePath, claudeContent, opts.force)\n if (claudeWritten) {\n console.log(` ${chalk.green('✓')} CLAUDE.md ${chalk.dim(`(${lineCount(claudeContent)} lines)`)}`)\n }\n\n // ── AGENTS.md ──\n if (opts.agents !== false) {\n const agentsContent = generateAgents(ctx)\n const agentsPath = join(cwd, 'AGENTS.md')\n const agentsWritten = write(agentsPath, agentsContent, opts.force)\n if (agentsWritten) {\n console.log(` ${chalk.green('✓')} AGENTS.md ${chalk.dim(`(${lineCount(agentsContent)} lines)`)}`)\n }\n }\n\n // ── .ruler/ ──\n if (opts.ruler) {\n const rulerOutput = generateRulerFiles(ctx)\n for (const [relPath, content] of Object.entries(rulerOutput.files)) {\n const fullPath = join(cwd, relPath)\n const written = write(fullPath, content, opts.force)\n if (written) {\n console.log(` ${chalk.green('✓')} ${relPath} ${chalk.dim('(ruler format)')}`)\n }\n }\n console.log()\n console.log(chalk.dim(' Run `ruler` to distribute rules to all your agent configs.'))\n }\n\n console.log()\n console.log(chalk.dim(' Tip: commit these files — they improve every AI session on this repo.'))\n console.log(chalk.dim(' Run `contextmd score` to audit the quality of your CLAUDE.md.'))\n\n if (opts.subscribe !== false) {\n await promptSubscribe()\n }\n })\n\n// ── sync ──────────────────────────────────────────────────────────────────────\n\nprogram\n .command('sync')\n .description('Regenerate CLAUDE.md and AGENTS.md from current repo state')\n .option('--ruler', 'also sync .ruler/ files')\n .action(async (opts) => {\n const cwd = process.cwd()\n const hasClaudeFile = existsSync(join(cwd, 'CLAUDE.md'))\n const hasAgentsFile = existsSync(join(cwd, 'AGENTS.md'))\n\n if (!hasClaudeFile && !hasAgentsFile) {\n console.log('No CLAUDE.md or AGENTS.md found. Run `contextmd init` first.')\n process.exit(1)\n }\n\n console.log('Syncing...')\n const ctx = await scanRepo(cwd)\n const { default: chalk } = await import('chalk')\n\n if (hasClaudeFile) {\n const content = generateClaude(ctx)\n writeFileSync(join(cwd, 'CLAUDE.md'), content, 'utf-8')\n console.log(` ${chalk.green('✓')} CLAUDE.md updated ${chalk.dim(`(${lineCount(content)} lines)`)}`)\n }\n\n if (hasAgentsFile) {\n const content = generateAgents(ctx)\n writeFileSync(join(cwd, 'AGENTS.md'), content, 'utf-8')\n console.log(` ${chalk.green('✓')} AGENTS.md updated ${chalk.dim(`(${lineCount(content)} lines)`)}`)\n }\n\n if (opts.ruler) {\n const rulerOutput = generateRulerFiles(ctx)\n for (const [relPath, content] of Object.entries(rulerOutput.files)) {\n writeFileSync(join(cwd, relPath), content, 'utf-8')\n console.log(` ${chalk.green('✓')} ${relPath} updated`)\n }\n }\n })\n\n// ── score ─────────────────────────────────────────────────────────────────────\n\nprogram\n .command('score')\n .description('Audit the quality of your CLAUDE.md against the 5 commit-readiness tests')\n .action(async () => {\n const cwd = process.cwd()\n const { default: chalk } = await import('chalk')\n const result = scoreClaudeFile(cwd)\n\n console.log(`\\nCLAUDE.md quality score: ${chalk.bold(result.total)}/100\\n`)\n\n for (const check of result.checks) {\n const icon = check.passed ? chalk.green('✓') : chalk.red('✗')\n const scoreStr = chalk.dim(`(${check.score} pts)`)\n console.log(` ${icon} ${check.name} ${scoreStr}`)\n if (!check.passed) {\n console.log(` ${chalk.dim(check.feedback)}`)\n }\n }\n\n console.log()\n\n if (result.total >= 80) {\n console.log(chalk.green(' Strong CLAUDE.md — this file is working hard for you.'))\n } else if (result.total >= 60) {\n console.log(chalk.yellow(' Decent start — address the failing checks to improve agent accuracy.'))\n } else {\n console.log(chalk.red(' High risk of Claude ignoring this file. Run `contextmd init --force` to regenerate.'))\n }\n\n console.log()\n console.log(chalk.dim(` Share your score: \"My CLAUDE.md scored ${result.total}/100 with contextmd\"`))\n })\n\nprogram.parse()\n","import { readFileSync, existsSync } from 'fs'\nimport { join } from 'path'\nimport type {\n StackInfo, CommandSet, PackageManager,\n Framework, TestRunner, Database, StateLib,\n CssApproach, UiLib, CommitConvention, DeployTarget\n} from '../types.js'\n\ninterface PkgJson {\n name?: string\n description?: string\n version?: string\n scripts?: Record<string, string>\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n workspaces?: string[] | { packages: string[] }\n}\n\nexport interface PackageScanResult {\n name: string\n description?: string\n version?: string\n scripts: Record<string, string>\n allDeps: Record<string, string>\n stack: StackInfo\n commands: CommandSet\n}\n\nexport function scanPackage(cwd: string): PackageScanResult {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) {\n throw new Error('No package.json found. Run contextmd from the root of your project.')\n }\n\n const pkg: PkgJson = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n const scripts = pkg.scripts ?? {}\n\n const allDeps: Record<string, string> = {\n ...(pkg.dependencies ?? {}),\n ...(pkg.devDependencies ?? {}),\n ...(pkg.peerDependencies ?? {}),\n }\n\n const has = (name: string) => name in allDeps\n const hasPattern = (re: RegExp) => Object.keys(allDeps).some(k => re.test(k))\n\n // ── Package manager ──────────────────────────────────────────────────────\n let packageManager: PackageManager = 'npm'\n if (existsSync(join(cwd, 'bun.lockb'))) packageManager = 'bun'\n else if (existsSync(join(cwd, 'pnpm-lock.yaml'))) packageManager = 'pnpm'\n else if (existsSync(join(cwd, 'yarn.lock'))) packageManager = 'yarn'\n\n const runCmd = packageManager === 'npm' ? 'npm run' : packageManager\n\n // ── Framework ────────────────────────────────────────────────────────────\n let framework: Framework | undefined\n let isNextAppRouter = false\n if (has('next')) {\n framework = 'nextjs'\n isNextAppRouter =\n existsSync(join(cwd, 'app')) ||\n existsSync(join(cwd, 'src/app'))\n } else if (has('react') || has('react-dom')) {\n framework = 'react'\n } else if (has('vue') || has('@vue/core')) {\n framework = 'vue'\n } else if (has('@sveltejs/kit') || has('svelte')) {\n framework = 'svelte'\n } else if (has('express')) {\n framework = 'express'\n } else if (has('fastify')) {\n framework = 'fastify'\n } else if (has('hono')) {\n framework = 'hono'\n }\n\n // ── Test runner ──────────────────────────────────────────────────────────\n let testRunner: TestRunner | undefined\n if (has('vitest')) testRunner = 'vitest'\n else if (has('jest') || has('@jest/core') || has('ts-jest')) testRunner = 'jest'\n else if (has('mocha')) testRunner = 'mocha'\n\n // ── Database / ORM ───────────────────────────────────────────────────────\n let database: Database | undefined\n if (has('@prisma/client') || has('prisma')) database = 'prisma'\n else if (has('drizzle-orm')) database = 'drizzle'\n else if (has('@supabase/supabase-js') || has('@supabase/ssr')) database = 'supabase'\n else if (has('mongoose')) database = 'mongoose'\n else if (has('typeorm')) database = 'typeorm'\n else if (has('pg') || has('postgres')) database = 'pg'\n else if (has('better-sqlite3')) database = 'better-sqlite3'\n\n // ── State management ─────────────────────────────────────────────────────\n let stateLib: StateLib | undefined\n if (has('zustand')) stateLib = 'zustand'\n else if (has('@reduxjs/toolkit') || has('redux')) stateLib = 'redux'\n else if (has('@tanstack/react-query') || has('@tanstack/query-core')) stateLib = 'tanstack-query'\n else if (has('jotai')) stateLib = 'jotai'\n else if (has('recoil')) stateLib = 'recoil'\n\n // ── CSS ──────────────────────────────────────────────────────────────────\n let cssApproach: CssApproach | undefined\n if (has('tailwindcss')) cssApproach = 'tailwind'\n else if (has('styled-components')) cssApproach = 'styled-components'\n else if (has('@emotion/styled') || has('@emotion/react')) cssApproach = 'emotion'\n else if (has('sass') || has('node-sass')) cssApproach = 'sass'\n\n // ── UI lib ───────────────────────────────────────────────────────────────\n let uiLib: UiLib | undefined\n if (\n existsSync(join(cwd, 'src/components/ui')) ||\n existsSync(join(cwd, 'components/ui'))\n ) {\n uiLib = 'shadcn'\n } else if (hasPattern(/@radix-ui\\//)) {\n uiLib = 'radix'\n } else if (has('@chakra-ui/react')) {\n uiLib = 'chakra'\n } else if (has('@mantine/core')) {\n uiLib = 'mantine'\n } else if (has('@mui/material')) {\n uiLib = 'mui'\n }\n\n // ── Linter / formatter ───────────────────────────────────────────────────\n const linter = has('eslint') ? 'eslint' as const : has('biome') ? 'biome' as const : undefined\n const formatter = has('prettier') ? 'prettier' as const : has('biome') ? 'biome' as const : undefined\n\n // ── Commit conventions ───────────────────────────────────────────────────\n let commitConvention: CommitConvention | undefined\n if (has('@commitlint/cli') || has('commitlint') || has('commitizen') || has('@commitlint/config-conventional')) {\n commitConvention = 'conventional-commits'\n } else if (has('gitmoji-cli')) {\n commitConvention = 'gitmoji'\n }\n\n // ── Deploy target ────────────────────────────────────────────────────────\n let deployTarget: DeployTarget | undefined\n if (existsSync(join(cwd, 'vercel.json')) || existsSync(join(cwd, '.vercel'))) deployTarget = 'vercel'\n else if (existsSync(join(cwd, 'netlify.toml'))) deployTarget = 'netlify'\n else if (existsSync(join(cwd, 'fly.toml'))) deployTarget = 'fly'\n else if (existsSync(join(cwd, 'Dockerfile')) || existsSync(join(cwd, 'docker-compose.yml'))) deployTarget = 'docker'\n\n // ── Path alias (from tsconfig) ───────────────────────────────────────────\n let pathAlias: string | undefined\n const tsconfigPath = join(cwd, 'tsconfig.json')\n if (existsSync(tsconfigPath)) {\n try {\n const tsconfig = JSON.parse(readFileSync(tsconfigPath, 'utf-8'))\n const paths = tsconfig?.compilerOptions?.paths\n if (paths) {\n const aliases = Object.keys(paths)\n const atAlias = aliases.find(a => a.startsWith('@/') || a === '@/*')\n if (atAlias) pathAlias = '@/'\n else if (aliases.length > 0) pathAlias = aliases[0].replace('/*', '/')\n }\n } catch {\n // tsconfig parse failure is non-fatal\n }\n }\n\n // ── Monorepo ─────────────────────────────────────────────────────────────\n const hasMonorepo = !!(\n pkg.workspaces ||\n existsSync(join(cwd, 'turbo.json')) ||\n existsSync(join(cwd, 'nx.json')) ||\n existsSync(join(cwd, 'lerna.json')) ||\n existsSync(join(cwd, 'pnpm-workspace.yaml'))\n )\n\n const hasSupabaseLocal = existsSync(join(cwd, 'supabase'))\n\n // ── Command set ──────────────────────────────────────────────────────────\n const findScript = (...names: string[]) =>\n names.find(n => n in scripts)\n\n const devScript = findScript('dev', 'start:dev', 'develop')\n const buildScript = findScript('build', 'compile')\n const testScript = findScript('test', 'test:unit', 'test:all')\n const lintScript = findScript('lint', 'eslint')\n const typecheckScript = findScript('typecheck', 'type-check', 'tsc', 'check:types')\n const formatScript = findScript('format', 'fmt', 'prettier')\n const dbMigrateScript = findScript('db:migrate', 'db:push', 'prisma:migrate', 'drizzle-kit:push')\n const dbGenerateScript = findScript('db:generate', 'prisma:generate', 'drizzle-kit:generate')\n const huskyPreCommit = existsSync(join(cwd, '.husky/pre-commit'))\n\n // single-file test invocation\n let testSingle: string | undefined\n if (testRunner === 'vitest') testSingle = 'vitest run <path/to/file.test.ts>'\n else if (testRunner === 'jest') testSingle = 'jest <path/to/file.test.ts>'\n\n // pre-commit directive — what to always run before committing\n let preCommit: string | undefined\n if (huskyPreCommit) {\n preCommit = `${runCmd} lint && ${runCmd} typecheck` // safe default\n if (typecheckScript && lintScript) {\n preCommit = `${runCmd} ${lintScript} && ${runCmd} ${typecheckScript}`\n }\n } else if (typecheckScript && lintScript) {\n preCommit = `${runCmd} ${lintScript} && ${runCmd} ${typecheckScript}`\n } else if (typecheckScript) {\n preCommit = `${runCmd} ${typecheckScript}`\n }\n\n const commands: CommandSet = {\n dev: devScript ? `${runCmd} ${devScript}` : undefined,\n build: buildScript ? `${runCmd} ${buildScript}` : undefined,\n test: testScript ? `${runCmd} ${testScript}` : undefined,\n testSingle,\n lint: lintScript ? `${runCmd} ${lintScript}` : undefined,\n typecheck: typecheckScript ? `${runCmd} ${typecheckScript}` : undefined,\n format: formatScript ? `${runCmd} ${formatScript}` : undefined,\n preCommit,\n dbMigrate: dbMigrateScript ? `${runCmd} ${dbMigrateScript}` : undefined,\n dbGenerate: dbGenerateScript ? `${runCmd} ${dbGenerateScript}` : undefined,\n }\n\n const stack: StackInfo = {\n framework,\n language: (has('typescript') || existsSync(tsconfigPath)) ? 'typescript' : 'javascript',\n testRunner,\n database,\n stateLib,\n cssApproach,\n uiLib,\n packageManager,\n linter,\n formatter,\n commitConvention,\n deployTarget,\n isNextAppRouter,\n hasMonorepo,\n hasSupabaseLocal,\n pathAlias,\n }\n\n return {\n name: pkg.name ?? 'untitled',\n description: pkg.description,\n version: pkg.version,\n scripts,\n allDeps,\n stack,\n commands,\n }\n}\n","import { readdirSync, statSync, existsSync, readFileSync } from 'fs'\nimport { join, relative } from 'path'\nimport type { DirectoryEntry, StackInfo } from '../types.js'\n\n// Directories we always skip\nconst SKIP_ALWAYS = new Set([\n 'node_modules', '.git', '.next', '.nuxt', '.svelte-kit',\n 'dist', 'build', 'out', '.turbo', '.cache', 'coverage',\n '.vercel', '.netlify', '__pycache__', '.pytest_cache',\n])\n\n// ─── Purpose map ─────────────────────────────────────────────────────────────\n// Maps directory name patterns → human-readable purpose\n\nconst PURPOSE_MAP: Array<[RegExp | string, string]> = [\n ['src/app', 'App Router pages, layouts, and server components'],\n ['src/pages', 'Next.js pages and API routes'],\n ['app', 'App Router pages, layouts, and server components'],\n ['pages', 'Next.js pages and API routes'],\n ['src/components', 'React components'],\n ['components', 'React components'],\n ['src/components/ui', 'shadcn/ui primitive components'],\n ['components/ui', 'shadcn/ui primitive components'],\n ['src/lib', 'Shared utilities and helper functions'],\n ['src/utils', 'Shared utility functions'],\n ['lib', 'Shared utilities'],\n ['utils', 'Utility functions'],\n ['src/hooks', 'Custom React hooks'],\n ['hooks', 'Custom React hooks'],\n ['src/types', 'TypeScript type definitions'],\n ['types', 'TypeScript type definitions'],\n ['src/stores', 'State management stores'],\n ['stores', 'State management stores'],\n ['src/server', 'Server-side code and API handlers'],\n ['src/api', 'API route handlers'],\n ['server', 'Server-side code'],\n ['api', 'API endpoints'],\n ['src/db', 'Database schema, queries, and migrations'],\n ['src/database', 'Database schema and queries'],\n ['db', 'Database schema and queries'],\n ['database', 'Database layer'],\n ['supabase', 'Supabase local config, migrations, and edge functions'],\n ['prisma', 'Prisma schema and generated client'],\n ['drizzle', 'Drizzle ORM schema and migrations'],\n ['migrations', 'Database migration files'],\n ['public', 'Static assets served as-is'],\n ['static', 'Static assets'],\n ['assets', 'Images, fonts, and other static assets'],\n ['styles', 'Global styles and CSS variables'],\n ['src/styles', 'Global styles'],\n ['src/config', 'App configuration'],\n ['config', 'Configuration files'],\n ['src/middleware', 'Express/Next.js middleware'],\n ['middleware', 'Request middleware'],\n ['src/services', 'Business logic and external service clients'],\n ['services', 'Service layer'],\n ['src/actions', 'Server actions'],\n ['actions', 'Server actions'],\n ['src/context', 'React context providers'],\n ['context', 'React context providers'],\n ['scripts', 'Build and maintenance scripts'],\n ['tests', 'Test files'],\n ['__tests__', 'Test files'],\n ['e2e', 'End-to-end tests'],\n ['docs', 'Documentation'],\n ['.claude', 'Claude Code configuration and rules'],\n ['.github', 'GitHub Actions and workflows'],\n]\n\nfunction getPurpose(relPath: string): string | undefined {\n // Exact match first, then pattern\n for (const [key, purpose] of PURPOSE_MAP) {\n if (typeof key === 'string') {\n if (relPath === key) return purpose\n } else {\n if (key.test(relPath)) return purpose\n }\n }\n return undefined\n}\n\n// Fallback: infer a generic purpose from a directory name\nfunction inferPurposeFromName(name: string): string | undefined {\n const lower = name.toLowerCase()\n const map: Record<string, string> = {\n scanner: 'File and repo analysis modules',\n generator: 'Output generators',\n generators: 'Output generators',\n parser: 'Parsing utilities',\n parsers: 'Parsing utilities',\n writer: 'File writing utilities',\n writers: 'File writing utilities',\n command: 'CLI command handlers',\n commands: 'CLI command handlers',\n handler: 'Request or event handlers',\n handlers: 'Request or event handlers',\n controller: 'Route controllers',\n controllers: 'Route controllers',\n model: 'Data models',\n models: 'Data models',\n schema: 'Data schemas',\n schemas: 'Data schemas',\n resolver: 'GraphQL resolvers',\n resolvers: 'GraphQL resolvers',\n route: 'Route definitions',\n routes: 'Route definitions',\n plugin: 'Plugin modules',\n plugins: 'Plugin modules',\n provider: 'React context providers',\n providers: 'React context providers',\n helper: 'Helper utilities',\n helpers: 'Helper utilities',\n test: 'Test files',\n tests: 'Test files',\n spec: 'Test files',\n specs: 'Test files',\n fixture: 'Test fixtures',\n fixtures: 'Test fixtures',\n mock: 'Mock modules for testing',\n mocks: 'Mock modules for testing',\n constant: 'Constants and enums',\n constants: 'Constants and enums',\n enum: 'TypeScript enums',\n enums: 'TypeScript enums',\n event: 'Event definitions',\n events: 'Event definitions',\n job: 'Background jobs',\n jobs: 'Background jobs',\n queue: 'Job queue definitions',\n queues: 'Job queue definitions',\n dto: 'Data transfer objects',\n dtos: 'Data transfer objects',\n entity: 'Database entities',\n entities: 'Database entities',\n repository: 'Data access repositories',\n repositories: 'Data access repositories',\n }\n return map[lower]\n}\n\nexport function scanFilesystem(cwd: string, stack: StackInfo): DirectoryEntry[] {\n const entries: DirectoryEntry[] = []\n const seen = new Set<string>()\n\n function walk(dir: string, depth: number) {\n if (depth > 3) return\n let items: string[]\n try {\n items = readdirSync(dir)\n } catch {\n return\n }\n\n for (const item of items) {\n if (item.startsWith('.') && item !== '.claude' && item !== '.github') continue\n if (SKIP_ALWAYS.has(item)) continue\n\n const full = join(dir, item)\n const rel = relative(cwd, full)\n\n try {\n const stat = statSync(full)\n if (!stat.isDirectory()) continue\n } catch {\n continue\n }\n\n if (seen.has(rel)) continue\n seen.add(rel)\n\n const purpose = getPurpose(rel)\n if (purpose) {\n entries.push({ path: rel, purpose, isKey: depth <= 2 })\n // Don't recurse into directories we've already mapped\n continue\n }\n\n // Recurse into src/, packages/, apps/ to find their children\n if (item === 'src' || item === 'packages' || item === 'apps' || item === 'lib') {\n walk(full, depth + 1)\n continue\n }\n\n // For depth-1+ unknown dirs under src/, make a best-effort inference from name\n if (depth >= 1) {\n const inferred = inferPurposeFromName(item)\n if (inferred) {\n entries.push({ path: rel, purpose: inferred, isKey: true })\n }\n }\n }\n }\n\n walk(cwd, 0)\n\n // Sort: key entries first, then shorter paths, then alphabetically\n entries.sort((a, b) => {\n if (a.isKey !== b.isKey) return a.isKey ? -1 : 1\n const aDepth = a.path.split('/').length\n const bDepth = b.path.split('/').length\n if (aDepth !== bDepth) return aDepth - bDepth\n return a.path.localeCompare(b.path)\n })\n\n // Deduplicate overlapping entries\n const deduped: DirectoryEntry[] = []\n for (const entry of entries) {\n const isSubpathOfExisting = deduped.some(\n e => entry.path.startsWith(e.path + '/') && entry.path !== e.path\n )\n const isNotable = entry.path.includes('/ui') || entry.path === 'supabase' || entry.path.startsWith('.claude')\n if (!isSubpathOfExisting || isNotable) {\n deduped.push(entry)\n }\n }\n\n // If no directories were found, fall back to mapping key files in src/\n const srcDir = join(cwd, 'src')\n if (deduped.length === 0 && existsSync(srcDir)) {\n try {\n const srcFiles = readdirSync(srcDir)\n .filter(f => !f.startsWith('.') && /\\.(jsx?|tsx?)$/.test(f))\n .sort()\n for (const file of srcFiles) {\n const purpose = inferFilePurpose(file)\n if (purpose) {\n deduped.push({ path: `src/${file}`, purpose, isKey: true })\n }\n }\n } catch {\n // non-fatal\n }\n }\n\n return deduped\n .filter(e => e.isKey)\n .slice(0, 12)\n .concat(deduped.filter(e => !e.isKey).slice(0, 3))\n .slice(0, 12)\n}\n\n// Infer purpose of individual source files (fallback for flat src/ structures)\nfunction inferFilePurpose(filename: string): string | undefined {\n const lower = filename.toLowerCase().replace(/\\.(jsx?|tsx?)$/, '')\n const map: Record<string, string> = {\n main: 'Application entry point',\n index: 'Application entry point',\n app: 'Root application component',\n router: 'Client-side routing',\n routes: 'Route definitions',\n supabase: 'Supabase client configuration',\n auth: 'Authentication logic',\n authgate: 'Authentication guard component',\n login: 'Login component',\n store: 'Application state store',\n api: 'API utilities',\n config: 'Application configuration',\n theme: 'Theme and style tokens',\n constants: 'App-wide constants',\n utils: 'Utility functions',\n helpers: 'Helper functions',\n types: 'TypeScript type definitions',\n hooks: 'Custom React hooks',\n context: 'React context provider',\n }\n return map[lower]\n}\n\nexport function detectMcpServers(cwd: string): string[] {\n const servers: string[] = []\n const claudeDir = join(cwd, '.claude')\n if (!existsSync(claudeDir)) return servers\n\n try {\n const files = readdirSync(claudeDir)\n for (const file of files) {\n if (!file.endsWith('.json')) continue\n const content = readFileSync(join(claudeDir, file), 'utf-8')\n const parsed = JSON.parse(content)\n if (parsed.mcpServers) {\n servers.push(...Object.keys(parsed.mcpServers))\n }\n }\n } catch {\n // non-fatal\n }\n\n // Also check claude_desktop_config.json at root\n const desktopConfig = join(cwd, 'claude_desktop_config.json')\n if (existsSync(desktopConfig)) {\n try {\n const parsed = JSON.parse(readFileSync(desktopConfig, 'utf-8'))\n if (parsed.mcpServers) servers.push(...Object.keys(parsed.mcpServers))\n } catch {\n // non-fatal\n }\n }\n\n return [...new Set(servers)]\n}\n","import { existsSync } from 'fs'\nimport { join } from 'path'\nimport type { GitInfo } from '../types.js'\n\n// Lazy import to avoid error if simple-git is not yet installed during dev\nasync function getGit(cwd: string) {\n const { simpleGit } = await import('simple-git')\n return simpleGit(cwd)\n}\n\nexport async function scanGit(cwd: string): Promise<GitInfo> {\n const hasHusky = existsSync(join(cwd, '.husky'))\n\n if (!existsSync(join(cwd, '.git'))) {\n return { recentExamples: [], hasHusky }\n }\n\n try {\n const git = await getGit(cwd)\n\n // Get recent commits\n const log = await git.log({ maxCount: 25, '--no-merges': null })\n const messages = log.all.map(c => c.message.trim()).filter(Boolean)\n\n // Detect commit format from recent messages\n const commitFormat = detectCommitFormat(messages)\n\n // Get default branch\n let defaultBranch: string | undefined\n try {\n const branches = await git.branch(['-r'])\n if (branches.all.includes('origin/main')) defaultBranch = 'main'\n else if (branches.all.includes('origin/master')) defaultBranch = 'master'\n } catch {\n // non-fatal\n }\n\n // Pick 2-3 representative examples (different types if conventional)\n const recentExamples = pickExamples(messages, commitFormat)\n\n return { commitFormat, recentExamples, defaultBranch, hasHusky }\n } catch {\n return { recentExamples: [], hasHusky }\n }\n}\n\nfunction detectCommitFormat(messages: string[]): string | undefined {\n if (messages.length === 0) return undefined\n\n // Conventional commits: type(scope): description or type: description\n const conventionalRe = /^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\\(.+\\))?: .+/\n const conventionalCount = messages.filter(m => conventionalRe.test(m)).length\n\n // Gitmoji: starts with emoji\n const gitmoji = /^[\\u{1F300}-\\u{1FAFF}]/u\n const gitmojiCount = messages.filter(m => gitmoji.test(m)).length\n\n const threshold = Math.max(3, messages.length * 0.6)\n\n if (conventionalCount >= threshold) return 'type(scope): description — conventional commits'\n if (gitmojiCount >= threshold) return ':emoji: description — gitmoji'\n return undefined\n}\n\nfunction pickExamples(messages: string[], format: string | undefined): string[] {\n if (messages.length === 0) return []\n\n if (format?.includes('conventional')) {\n // Try to pick one of each common type\n const types = ['feat', 'fix', 'chore', 'refactor', 'docs']\n const picked: string[] = []\n for (const type of types) {\n const match = messages.find(m => m.startsWith(type))\n if (match && picked.length < 3) picked.push(match)\n }\n if (picked.length > 0) return picked\n }\n\n // Fallback: first 3 unique messages\n return messages.slice(0, 3)\n}\n","import type { StackInfo, Convention } from '../types.js'\n\n// ─── Inference rules ──────────────────────────────────────────────────────────\n// Each rule: { condition, convention?, doNot? }\n// Applied in order. First match wins within each category.\n\ninterface Rule {\n condition: (stack: StackInfo, deps: Record<string, string>) => boolean\n convention?: string\n doNot?: string\n inferredFrom: string\n}\n\nconst RULES: Rule[] = [\n // ── State management ────────────────────────────────────────────────────\n {\n condition: s => s.stateLib === 'zustand',\n doNot: 'Do not introduce Redux or Redux Toolkit — state management is Zustand',\n inferredFrom: 'dep:zustand',\n },\n {\n condition: s => s.stateLib === 'tanstack-query',\n doNot: 'Do not store server state in useState or useReducer — use TanStack Query',\n inferredFrom: 'dep:@tanstack/react-query',\n },\n {\n condition: s => s.stateLib === 'jotai',\n doNot: 'Do not use Redux or Zustand — state management is Jotai',\n inferredFrom: 'dep:jotai',\n },\n\n // ── Database ────────────────────────────────────────────────────────────\n {\n condition: s => s.database === 'prisma',\n doNot: 'Do not write raw SQL — use Prisma ORM for all database access',\n inferredFrom: 'dep:prisma',\n },\n {\n condition: s => s.database === 'drizzle',\n doNot: 'Do not write raw SQL — use Drizzle ORM for all database access',\n inferredFrom: 'dep:drizzle-orm',\n },\n {\n condition: s => s.database === 'supabase',\n convention: 'Supabase client is configured in one place (e.g. src/supabase.js or @/lib/supabase) — import from there',\n doNot: 'Do not call createClient() directly — use the shared Supabase client',\n inferredFrom: 'dep:@supabase/supabase-js',\n },\n\n // ── CSS / styling ────────────────────────────────────────────────────────\n {\n condition: s => s.cssApproach === 'tailwind',\n doNot: 'Do not use inline styles or CSS-in-JS — styling is Tailwind utility classes',\n inferredFrom: 'dep:tailwindcss',\n },\n {\n condition: s => s.cssApproach === 'css-modules',\n doNot: 'Do not use inline styles — use CSS Modules (*.module.css)',\n inferredFrom: 'css-modules detected',\n },\n {\n condition: s => s.cssApproach === 'styled-components',\n convention: 'Styling uses styled-components — keep component styles co-located',\n inferredFrom: 'dep:styled-components',\n },\n\n // ── UI lib ───────────────────────────────────────────────────────────────\n {\n condition: s => s.uiLib === 'shadcn',\n convention: 'UI primitives live in @/components/ui — use them before creating new components',\n inferredFrom: 'src/components/ui detected',\n },\n {\n condition: s => s.uiLib === 'chakra',\n convention: 'UI components use Chakra UI — do not mix with other component libraries',\n inferredFrom: 'dep:@chakra-ui/react',\n },\n\n // ── Next.js ─────────────────────────────────────────────────────────────\n {\n condition: s => s.isNextAppRouter,\n convention: 'This is a Next.js App Router project — use Server Components by default, add \"use client\" only when needed',\n inferredFrom: 'nextjs app/ directory detected',\n },\n {\n condition: s => s.isNextAppRouter,\n doNot: 'Do not create files in a pages/ directory — this project uses App Router',\n inferredFrom: 'nextjs app/ directory detected',\n },\n\n // ── Path aliases ──────────────────────────────────────────────────────────\n {\n condition: s => !!s.pathAlias,\n convention: s => `Use the ${s.pathAlias} path alias for imports — do not use relative paths like ../../`,\n inferredFrom: 'tsconfig paths',\n },\n\n // ── Monorepo ─────────────────────────────────────────────────────────────\n {\n condition: s => s.hasMonorepo,\n convention: 'Monorepo: run commands from the workspace root with --filter or --workspace flags',\n inferredFrom: 'monorepo config detected',\n },\n\n // ── Commit conventions ───────────────────────────────────────────────────\n {\n condition: s => s.commitConvention === 'conventional-commits',\n convention: \"Commits follow Conventional Commits: type(scope): description (e.g. feat(auth): add OAuth login)\",\n inferredFrom: 'dep:@commitlint',\n },\n {\n condition: s => s.commitConvention === 'gitmoji',\n convention: 'Commits use gitmoji prefix (e.g. ✨ new feature, 🐛 bug fix)',\n inferredFrom: 'dep:gitmoji-cli',\n },\n\n // ── TypeScript ───────────────────────────────────────────────────────────\n {\n condition: (s, deps) => s.language === 'typescript' && 'typescript' in deps,\n doNot: 'Do not use @ts-ignore or any — fix type errors properly',\n inferredFrom: 'dep:typescript',\n },\n\n // ── Testing ──────────────────────────────────────────────────────────────\n {\n condition: s => s.testRunner === 'vitest',\n convention: 'Tests use Vitest — co-locate test files as *.test.ts beside the file they test',\n inferredFrom: 'dep:vitest',\n },\n]\n\n// Convention condition can be a function (for dynamic messages) or a string\ntype ConventionCondition = Rule['convention']\nfunction resolveConvention(c: ConventionCondition, stack: StackInfo): string | undefined {\n if (typeof c === 'function') return (c as (s: StackInfo) => string)(stack)\n return c\n}\n\nexport function inferConventions(\n stack: StackInfo,\n allDeps: Record<string, string>\n): { conventions: Convention[]; doNots: string[] } {\n const conventions: Convention[] = []\n const doNots: string[] = []\n\n for (const rule of RULES) {\n if (!rule.condition(stack, allDeps)) continue\n\n if (rule.convention) {\n const text = resolveConvention(rule.convention, stack)\n if (text) conventions.push({ rule: text, inferredFrom: rule.inferredFrom })\n }\n if (rule.doNot) {\n doNots.push(rule.doNot)\n }\n }\n\n return { conventions, doNots }\n}\n","import { scanPackage } from './package.js'\nimport { scanFilesystem, detectMcpServers } from './filesystem.js'\nimport { scanGit } from './git.js'\nimport { inferConventions } from './inference.js'\nimport type { RepoContext } from '../types.js'\n\nexport async function scanRepo(cwd: string): Promise<RepoContext> {\n const pkg = scanPackage(cwd)\n\n const [directories, git] = await Promise.all([\n Promise.resolve(scanFilesystem(cwd, pkg.stack)),\n scanGit(cwd),\n ])\n\n const mcpServers = detectMcpServers(cwd)\n const { conventions, doNots } = inferConventions(pkg.stack, pkg.allDeps)\n\n return {\n name: pkg.name,\n description: pkg.description,\n version: pkg.version,\n stack: pkg.stack,\n scripts: pkg.scripts,\n commands: pkg.commands,\n directories,\n git,\n conventions,\n doNots,\n mcpServers,\n hasDatabaseNotes: !!(pkg.stack.database && (pkg.commands.dbMigrate || pkg.stack.hasSupabaseLocal)),\n hasSupabaseLocal: pkg.stack.hasSupabaseLocal,\n cwd,\n allDeps: pkg.allDeps,\n }\n}\n","import type { RepoContext } from '../types.js'\n\nconst MAX_LINES = 150\n\n// ─── Headline builder ─────────────────────────────────────────────────────────\n\nfunction buildHeadline(ctx: RepoContext): string {\n const { stack, name, description } = ctx\n const parts: string[] = []\n\n // Framework\n if (stack.framework === 'nextjs') {\n parts.push(`Next.js${stack.isNextAppRouter ? ' (App Router)' : ''}`)\n } else if (stack.framework === 'react') {\n parts.push('React')\n } else if (stack.framework === 'vue') {\n parts.push('Vue')\n } else if (stack.framework === 'svelte') {\n parts.push('SvelteKit')\n } else if (stack.framework === 'express') {\n parts.push('Express')\n } else if (stack.framework === 'fastify') {\n parts.push('Fastify')\n } else if (stack.framework === 'hono') {\n parts.push('Hono')\n }\n\n if (stack.language === 'typescript') parts.push('TypeScript')\n\n // Key deps summary\n const keyDeps: string[] = []\n if (stack.database === 'prisma') keyDeps.push('Prisma')\n else if (stack.database === 'drizzle') keyDeps.push('Drizzle')\n else if (stack.database === 'supabase') keyDeps.push('Supabase')\n if (stack.cssApproach === 'tailwind') keyDeps.push('Tailwind')\n if (stack.uiLib === 'shadcn') keyDeps.push('shadcn/ui')\n if (stack.stateLib === 'zustand') keyDeps.push('Zustand')\n else if (stack.stateLib === 'tanstack-query') keyDeps.push('TanStack Query')\n if (stack.deployTarget === 'vercel') keyDeps.push('Vercel')\n\n const stackStr = parts.join(' + ')\n const depsStr = keyDeps.length > 0 ? ` using ${keyDeps.join(', ')}.` : '.'\n\n // Use description if it's short and informative, otherwise build from stack\n if (description && description.length < 80 && !description.toLowerCase().includes('undefined')) {\n return `${stackStr}${depsStr} ${description}`\n }\n\n return `${stackStr}${depsStr}`\n}\n\n// ─── Commands section ─────────────────────────────────────────────────────────\n\nfunction buildCommandsSection(ctx: RepoContext): string[] {\n const lines: string[] = ['## Commands', '']\n const { commands } = ctx\n\n if (commands.dev) lines.push(`- \\`${commands.dev}\\` — start dev server`)\n if (commands.build) lines.push(`- \\`${commands.build}\\` — production build`)\n if (commands.test) lines.push(`- \\`${commands.test}\\` — run all tests`)\n if (commands.testSingle) lines.push(`- \\`${commands.testSingle}\\` — run a single test file`)\n if (commands.lint) lines.push(`- \\`${commands.lint}\\` — lint`)\n if (commands.typecheck) lines.push(`- \\`${commands.typecheck}\\` — type check`)\n if (commands.format) lines.push(`- \\`${commands.format}\\` — format`)\n if (commands.dbMigrate) lines.push(`- \\`${commands.dbMigrate}\\` — run database migrations`)\n if (commands.dbGenerate) lines.push(`- \\`${commands.dbGenerate}\\` — regenerate database types`)\n\n if (commands.preCommit) {\n lines.push('')\n lines.push(`Always run \\`${commands.preCommit}\\` before committing.`)\n }\n\n return lines\n}\n\n// ─── Architecture section ─────────────────────────────────────────────────────\n\nfunction buildArchSection(ctx: RepoContext): string[] {\n if (ctx.directories.length === 0) return []\n\n const lines: string[] = ['## Architecture', '']\n for (const dir of ctx.directories) {\n lines.push(`- \\`${dir.path}/\\` — ${dir.purpose}`)\n }\n return lines\n}\n\n// ─── Conventions section ──────────────────────────────────────────────────────\n\nfunction buildConventionsSection(ctx: RepoContext): string[] {\n if (ctx.conventions.length === 0) return []\n\n const lines: string[] = ['## Conventions', '']\n for (const c of ctx.conventions) {\n lines.push(`- ${c.rule}`)\n }\n return lines\n}\n\n// ─── Testing section ──────────────────────────────────────────────────────────\n\nfunction buildTestingSection(ctx: RepoContext): string[] {\n const { stack, commands } = ctx\n if (!stack.testRunner) return []\n\n const lines: string[] = ['## Testing', '']\n\n if (stack.testRunner === 'vitest') {\n lines.push(`Uses Vitest. Run all: \\`${commands.test ?? 'vitest'}\\``)\n if (commands.testSingle) lines.push(`Run one file: \\`${commands.testSingle}\\``)\n } else if (stack.testRunner === 'jest') {\n lines.push(`Uses Jest. Run all: \\`${commands.test ?? 'jest'}\\``)\n if (commands.testSingle) lines.push(`Run one file: \\`${commands.testSingle}\\``)\n } else if (stack.testRunner === 'mocha') {\n lines.push(`Uses Mocha. Run: \\`${commands.test ?? 'mocha'}\\``)\n }\n\n return lines\n}\n\n// ─── Git section ──────────────────────────────────────────────────────────────\n\nfunction buildGitSection(ctx: RepoContext): string[] {\n const { git } = ctx\n\n if (!git.commitFormat) return []\n\n const lines: string[] = ['## Git', '']\n lines.push(`Commit format: \\`${git.commitFormat}\\``)\n\n if (git.recentExamples.length > 0) {\n lines.push('')\n lines.push('Examples:')\n for (const ex of git.recentExamples.slice(0, 2)) {\n lines.push(`- \\`${ex.slice(0, 72)}\\``)\n }\n }\n\n return lines\n}\n\n// ─── Do NOT section ───────────────────────────────────────────────────────────\n\nfunction buildDoNotSection(ctx: RepoContext): string[] {\n if (ctx.doNots.length === 0) return []\n\n const lines: string[] = ['## Do NOT', '']\n for (const doNot of ctx.doNots) {\n lines.push(`- ${doNot}`)\n }\n return lines\n}\n\n// ─── MCP section (optional) ───────────────────────────────────────────────────\n\nfunction buildMcpSection(ctx: RepoContext): string[] {\n if (ctx.mcpServers.length === 0) return []\n\n const lines: string[] = ['## MCP Servers', '']\n lines.push('Available in this project:')\n for (const srv of ctx.mcpServers) {\n lines.push(`- ${srv}`)\n }\n return lines\n}\n\n// ─── Database section (optional) ─────────────────────────────────────────────\n\nfunction buildDatabaseSection(ctx: RepoContext): string[] {\n if (!ctx.hasDatabaseNotes) return []\n\n const lines: string[] = ['## Database', '']\n\n if (ctx.stack.database === 'prisma') {\n lines.push('Schema is in `prisma/schema.prisma`.')\n if (ctx.commands.dbMigrate) lines.push(`Run migrations: \\`${ctx.commands.dbMigrate}\\``)\n if (ctx.commands.dbGenerate) lines.push(`Regenerate client: \\`${ctx.commands.dbGenerate}\\``)\n } else if (ctx.stack.database === 'drizzle') {\n lines.push('Schema is in `drizzle/` or `src/db/`.')\n if (ctx.commands.dbMigrate) lines.push(`Apply migrations: \\`${ctx.commands.dbMigrate}\\``)\n } else if (ctx.stack.hasSupabaseLocal) {\n lines.push('Uses Supabase local development stack.')\n lines.push('Start local: `supabase start`')\n lines.push('Apply migrations: `supabase db push`')\n if (ctx.commands.dbGenerate) lines.push(`Generate types: \\`${ctx.commands.dbGenerate}\\``)\n }\n\n return lines\n}\n\n// ─── Main generator ───────────────────────────────────────────────────────────\n\nexport function generateClaude(ctx: RepoContext): string {\n const sections: string[][] = [\n [`# ${ctx.name}`, '', buildHeadline(ctx), ''],\n [...buildCommandsSection(ctx), ''],\n [...buildArchSection(ctx), ''],\n [...buildConventionsSection(ctx), ''],\n [...buildTestingSection(ctx), ''],\n [...buildGitSection(ctx), ''],\n [...buildDoNotSection(ctx), ''],\n [...buildMcpSection(ctx), ''],\n [...buildDatabaseSection(ctx), ''],\n ]\n\n const allLines = sections\n .flat()\n .join('\\n')\n .split('\\n')\n\n // Trim trailing empty lines per section, then enforce 150-line cap\n const trimmed = allLines\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n') // max 2 consecutive blank lines\n .trim()\n\n const lines = trimmed.split('\\n')\n\n if (lines.length <= MAX_LINES) {\n return trimmed + '\\n'\n }\n\n // Soft cap: truncate at 150 lines with a note\n const capped = lines.slice(0, MAX_LINES - 3).join('\\n')\n return capped + '\\n\\n<!-- contextmd: output capped at 150 lines. Run with --depth for extended output. -->\\n'\n}\n","import type { RepoContext } from '../types.js'\n\n// AGENTS.md is the multi-agent standard (Codex, Amp, Cursor, Windsurf).\n// Format differs from CLAUDE.md: no markdown headers, structured with\n// clear sections that generalist agents parse reliably.\n//\n// Based on GitHub Blog analysis of 2,500+ repositories and community consensus.\n\nexport function generateAgents(ctx: RepoContext): string {\n const { name, stack, commands, directories, conventions, doNots, git } = ctx\n const lines: string[] = []\n\n // ── Header ──────────────────────────────────────────────────────────────\n lines.push(`# ${name} — Agent Instructions`)\n lines.push('')\n lines.push(buildHeadline(ctx))\n lines.push('')\n\n // ── Environment setup ────────────────────────────────────────────────────\n lines.push('## Environment')\n lines.push('')\n if (commands.dev) lines.push(`Dev server: \\`${commands.dev}\\``)\n if (commands.build) lines.push(`Build: \\`${commands.build}\\``)\n if (commands.typecheck) lines.push(`Type check: \\`${commands.typecheck}\\``)\n if (commands.lint) lines.push(`Lint: \\`${commands.lint}\\``)\n if (commands.test) lines.push(`Tests: \\`${commands.test}\\``)\n if (commands.testSingle) lines.push(`Single test: \\`${commands.testSingle}\\``)\n lines.push('')\n\n // ── Required checks before finishing any task ─────────────────────────────\n lines.push('## Required before completing any task')\n lines.push('')\n const checks: string[] = []\n if (commands.typecheck) checks.push(`Run \\`${commands.typecheck}\\` — zero type errors`)\n if (commands.lint) checks.push(`Run \\`${commands.lint}\\` — zero lint errors`)\n if (commands.test) checks.push(`Run \\`${commands.test}\\` — all tests pass`)\n if (commands.build) checks.push(`Run \\`${commands.build}\\` — build succeeds`)\n\n if (checks.length > 0) {\n for (const check of checks) lines.push(`- ${check}`)\n } else {\n lines.push('- Ensure no TypeScript errors before submitting')\n lines.push('- Ensure all existing tests pass')\n }\n lines.push('')\n\n // ── Code style ─────────────────────────────────────────────────────────────\n if (conventions.length > 0) {\n lines.push('## Code style')\n lines.push('')\n for (const c of conventions) {\n lines.push(`- ${c.rule}`)\n }\n lines.push('')\n }\n\n // ── Constraints ─────────────────────────────────────────────────────────────\n if (doNots.length > 0) {\n lines.push('## Constraints')\n lines.push('')\n for (const doNot of doNots) {\n lines.push(`- ${doNot}`)\n }\n lines.push('')\n }\n\n // ── Repository map ──────────────────────────────────────────────────────────\n if (directories.length > 0) {\n lines.push('## Repository structure')\n lines.push('')\n for (const dir of directories) {\n lines.push(`- \\`${dir.path}/\\` — ${dir.purpose}`)\n }\n lines.push('')\n }\n\n // ── Commit format ──────────────────────────────────────────────────────────\n if (git.commitFormat) {\n lines.push('## Commit format')\n lines.push('')\n lines.push(git.commitFormat)\n if (git.recentExamples.length > 0) {\n lines.push('')\n lines.push('Examples:')\n for (const ex of git.recentExamples.slice(0, 2)) {\n lines.push(`- \\`${ex.slice(0, 72)}\\``)\n }\n }\n lines.push('')\n }\n\n // ── Reminders ─────────────────────────────────────────────────────────────\n lines.push('## Reminders')\n lines.push('')\n\n if (stack.isNextAppRouter) {\n lines.push('- This is a Next.js App Router project. Default to Server Components.')\n lines.push('- Only add \"use client\" when the component needs browser APIs or event handlers.')\n }\n\n if (stack.database === 'prisma') {\n lines.push('- Never write raw SQL. All database access goes through Prisma.')\n } else if (stack.database === 'drizzle') {\n lines.push('- Never write raw SQL. All database access goes through Drizzle ORM.')\n }\n\n if (stack.pathAlias) {\n lines.push(`- Use \\`${stack.pathAlias}\\` path alias for imports, not relative paths.`)\n }\n\n lines.push('- Do not commit changes to auto-generated files (prisma client, supabase types, etc.).')\n lines.push('- Prefer editing existing patterns over introducing new abstractions.')\n\n return lines.join('\\n') + '\\n'\n}\n\nfunction buildHeadline(ctx: RepoContext): string {\n const { stack, description } = ctx\n const parts: string[] = []\n\n if (stack.framework === 'nextjs') parts.push(`Next.js${stack.isNextAppRouter ? ' App Router' : ''}`)\n else if (stack.framework === 'react') parts.push('React')\n else if (stack.framework === 'vue') parts.push('Vue')\n else if (stack.framework === 'svelte') parts.push('SvelteKit')\n else if (stack.framework) parts.push(stack.framework)\n\n if (stack.language === 'typescript') parts.push('TypeScript')\n\n const extras: string[] = []\n if (stack.database === 'prisma') extras.push('Prisma')\n else if (stack.database === 'drizzle') extras.push('Drizzle')\n else if (stack.database === 'supabase') extras.push('Supabase')\n if (stack.cssApproach === 'tailwind') extras.push('Tailwind CSS')\n if (stack.uiLib === 'shadcn') extras.push('shadcn/ui')\n\n const base = parts.join(' + ') + (extras.length ? ` · ${extras.join(', ')}` : '')\n return description ? `${base} — ${description}` : base\n}\n","import type { RepoContext } from '../types.js'\n\n// ruler (https://github.com/intellectronica/ruler) distributes rules to 27+\n// agent formats. contextmd generates the .ruler/ source files — ruler handles\n// the fan-out. This is the --ruler flag integration.\n//\n// ruler has 1,900 stars and 36K weekly downloads. Its users already want a\n// generator. contextmd --ruler turns ruler's audience into a discovery funnel.\n\nexport interface RulerOutput {\n files: Record<string, string>\n}\n\nexport function generateRulerFiles(ctx: RepoContext): RulerOutput {\n const files: Record<string, string> = {}\n files['.ruler/rules.md'] = buildRulerRules(ctx)\n files['.ruler/project.md'] = buildRulerProject(ctx)\n return { files }\n}\n\nfunction buildRulerRules(ctx: RepoContext): string {\n const lines: string[] = [\n '# Rules',\n '',\n '<!-- Generated by contextmd --ruler — edit here, ruler distributes to all agents -->',\n '',\n ]\n\n if (ctx.conventions.length > 0) {\n lines.push('## Conventions', '')\n for (const c of ctx.conventions) lines.push(`- ${c.rule}`)\n lines.push('')\n }\n\n if (ctx.doNots.length > 0) {\n lines.push('## Constraints', '')\n for (const doNot of ctx.doNots) lines.push(`- ${doNot}`)\n lines.push('')\n }\n\n if (ctx.commands.preCommit) {\n lines.push('## Before committing', '', `Always run: \\`${ctx.commands.preCommit}\\``, '')\n }\n\n return lines.join('\\n')\n}\n\nfunction buildRulerProject(ctx: RepoContext): string {\n const { name, stack, directories } = ctx\n const lines: string[] = [`# ${name}`, '']\n\n const parts: string[] = []\n if (stack.framework) parts.push(stack.framework)\n if (stack.language === 'typescript') parts.push('TypeScript')\n if (stack.database) parts.push(stack.database)\n if (parts.length > 0) lines.push(parts.join(' + '), '')\n\n if (directories.length > 0) {\n lines.push('## Structure', '')\n for (const dir of directories) lines.push(`- \\`${dir.path}/\\` — ${dir.purpose}`)\n lines.push('')\n }\n\n return lines.join('\\n')\n}\n","import { readFileSync, existsSync } from 'fs'\nimport { join } from 'path'\nimport type { ScoreResult, ScoreCheck } from '../types.js'\n\n// The 5 commit-readiness tests from the research (GitHub Blog + community consensus):\n//\n// 1. Every command in the Commands section can be copy-pasted and run immediately\n// 2. The architecture map matches the actual directory structure\n// 3. Conventions section contains at least one fact not in README / obvious from stack\n// 4. \"Do NOT\" section contains at least one explicit rejection of a plausible alternative\n// 5. The whole file is under 200 lines\n\nexport function scoreClaudeFile(cwd: string): ScoreResult {\n const filePath = join(cwd, 'CLAUDE.md')\n\n if (!existsSync(filePath)) {\n return {\n total: 0,\n checks: [\n {\n name: 'File exists',\n passed: false,\n score: 0,\n feedback: 'No CLAUDE.md found. Run `npx contextmd` to generate one.',\n },\n ],\n }\n }\n\n const content = readFileSync(filePath, 'utf-8')\n const lines = content.split('\\n')\n\n const checks: ScoreCheck[] = [\n checkCommands(content),\n checkArchitecture(content, cwd),\n checkConventions(content),\n checkDoNot(content),\n checkLength(lines),\n ]\n\n const total = Math.round(checks.reduce((sum, c) => sum + c.score, 0))\n\n return { total, checks }\n}\n\n// ─── Individual checks ────────────────────────────────────────────────────────\n\nfunction checkCommands(content: string): ScoreCheck {\n const hasCommandsSection = /^## Commands/m.test(content)\n const commandMatches = content.match(/`([^`]+)`/g) ?? []\n const hasExecutableCommands = commandMatches.some(cmd => {\n const inner = cmd.replace(/`/g, '')\n return /^(npm|pnpm|yarn|bun|node|npx|vitest|jest|tsc|next|vite|deno)/.test(inner)\n })\n\n const passed = hasCommandsSection && hasExecutableCommands\n return {\n name: 'Commands are executable',\n passed,\n score: passed ? 20 : hasCommandsSection ? 10 : 0,\n feedback: passed\n ? 'Commands section has executable commands.'\n : !hasCommandsSection\n ? 'Missing ## Commands section. Add dev, build, test commands.'\n : 'Commands section found but commands are not in backtick format.',\n }\n}\n\nfunction checkArchitecture(content: string, cwd: string): ScoreCheck {\n const hasArchSection = /^## Architecture/m.test(content)\n if (!hasArchSection) {\n return {\n name: 'Architecture map',\n passed: false,\n score: 0,\n feedback: 'Missing ## Architecture section with directory map.',\n }\n }\n\n const archSection = content.split(/^## /m).find(s => s.startsWith('Architecture'))\n const mentionedDirs = (archSection?.match(/`([^`/]+\\/[^`]*)`/g) ?? [])\n .map(m => m.replace(/`/g, '').replace(/\\/$/, ''))\n\n const existCount = mentionedDirs.filter(d => {\n try { return existsSync(join(cwd, d)) } catch { return false }\n }).length\n\n const accuracy = mentionedDirs.length > 0 ? existCount / mentionedDirs.length : 1\n const passed = accuracy >= 0.8 || mentionedDirs.length === 0\n\n return {\n name: 'Architecture matches actual structure',\n passed,\n score: passed ? 20 : 10,\n feedback: passed\n ? 'Architecture section looks accurate.'\n : `${mentionedDirs.length - existCount} directories in Architecture section don't exist. Run \\`contextmd sync\\` to update.`,\n }\n}\n\nfunction checkConventions(content: string): ScoreCheck {\n const hasSection = /^## Conventions/m.test(content)\n if (!hasSection) {\n return {\n name: 'Conventions encode team decisions',\n passed: false,\n score: 0,\n feedback: 'Missing ## Conventions section. Add at least one non-obvious team decision.',\n }\n }\n\n const section = content.split(/^## /m).find(s => s.startsWith('Conventions'))\n const bulletCount = (section?.match(/^- /gm) ?? []).length\n const passed = bulletCount >= 1\n\n return {\n name: 'Conventions encode team decisions',\n passed,\n score: passed ? 20 : 10,\n feedback: passed\n ? `${bulletCount} convention${bulletCount === 1 ? '' : 's'} documented.`\n : 'Conventions section is empty. Add at least one non-obvious team decision.',\n }\n}\n\nfunction checkDoNot(content: string): ScoreCheck {\n const hasSection = /^## Do NOT/m.test(content)\n if (!hasSection) {\n return {\n name: 'Do NOT prevents architectural drift',\n passed: false,\n score: 0,\n feedback: 'Missing ## Do NOT section. Add 2-3 explicit rejections of plausible alternatives.',\n }\n }\n\n const section = content.split(/^## /m).find(s => s.startsWith('Do NOT'))\n const bulletCount = (section?.match(/^- /gm) ?? []).length\n const passed = bulletCount >= 1\n\n return {\n name: 'Do NOT prevents architectural drift',\n passed,\n score: passed ? 20 : 10,\n feedback: passed\n ? `${bulletCount} explicit rejection${bulletCount === 1 ? '' : 's'} documented.`\n : 'Do NOT section is empty. Add explicit rejections of alternatives the team has decided against.',\n }\n}\n\nfunction checkLength(lines: string[]): ScoreCheck {\n const count = lines.length\n const passed = count <= 200\n let score: number\n if (count <= 150) score = 20\n else if (count <= 200) score = 15\n else if (count <= 300) score = 10\n else score = 0\n\n return {\n name: 'File under 200 lines',\n passed,\n score,\n feedback: passed\n ? `${count} lines — within the 200-line limit.`\n : `${count} lines — exceeds 200-line limit. Claude may treat it as low-signal. Trim or move detail to agent_docs/.`,\n }\n}\n"],"mappings":"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","names":["existsSync","join","existsSync","readFileSync","join","existsSync","join","buildHeadline","readFileSync","existsSync","join","existsSync","join"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raindogs/contextmd",
3
- "version": "0.1.1",
3
+ "version": "0.1.4",
4
4
  "description": "Generate and sync CLAUDE.md and AGENTS.md for any repo — npx contextmd and your AI assistant finally knows your project",
5
5
  "keywords": [
6
6
  "claude",