agentseed 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +227 -0
- package/bin/agentseed.js +2 -0
- package/dist/cli.js +2090 -0
- package/dist/cli.js.map +1 -0
- package/package.json +63 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/utils/logger.ts","../src/config/loader.ts","../src/config/schema.ts","../src/config/defaults.ts","../src/utils/fs.ts","../src/utils/errors.ts","../src/analyzer/language-detector.ts","../src/analyzer/framework-detector.ts","../src/analyzer/command-extractor.ts","../src/analyzer/structure-mapper.ts","../src/analyzer/pattern-detector.ts","../src/analyzer/file-sampler.ts","../src/analyzer/index.ts","../src/providers/base.ts","../src/providers/claude.ts","../src/providers/openai.ts","../src/providers/ollama.ts","../src/providers/index.ts","../src/generator/prompt-builder.ts","../src/utils/git.ts","../src/generator/format-renderer.ts","../src/generator/markdown-renderer.ts","../src/utils/retry.ts","../src/generator/index.ts","../src/utils/spinner.ts","../src/utils/usage-tracker.ts","../src/generator/formats.ts","../src/commands/scan.ts","../src/scanner/index.ts","../src/scanner/heuristics.ts","../src/generator/subfolder-differ.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { initCommand } from \"./commands/init\";\nimport { scanCommand } from \"./commands/scan\";\n\nconst program = new Command();\n\nprogram\n .name(\"agentseed\")\n .description(\"The best AGENTS.md generator. Analyze your codebase, seed AI agents with context.\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"init\")\n .description(\"Analyze current repository and generate AI context files\")\n .option(\"-d, --dry-run\", \"Show analysis output without writing files\")\n .option(\"-o, --output <path>\", \"Output file path (overrides format default)\")\n .option(\"-f, --format <name>\", \"Output format: agents, claude, cursor, copilot, windsurf, all\", \"all\")\n .option(\"-p, --provider <name>\", \"LLM provider: claude, openai, ollama (enables LLM enhancement)\")\n .option(\"-m, --model <name>\", \"LLM model to use (overrides default)\")\n .option(\"--force\", \"Regenerate all files even if unchanged\")\n .option(\"-v, --verbose\", \"Enable verbose logging\")\n .action(initCommand);\n\nprogram\n .command(\"scan\")\n .description(\"Scan for subfolders and generate scoped AI context files\")\n .argument(\"[path]\", \"Root path to scan\", \".\")\n .option(\"-d, --dry-run\", \"Show detected subfolders without writing files\")\n .option(\"-f, --format <name>\", \"Output format: agents, claude, cursor, copilot, windsurf, all\", \"all\")\n .option(\"-p, --provider <name>\", \"LLM provider: claude, openai, ollama (enables LLM enhancement)\")\n .option(\"-m, --model <name>\", \"LLM model to use (overrides default)\")\n .option(\"--force\", \"Regenerate all files even if unchanged\")\n .option(\"-v, --verbose\", \"Enable verbose logging\")\n .action(scanCommand);\n\nprogram.parse();\n","import * as path from \"node:path\";\nimport pc from \"picocolors\";\nimport { logger, setLogLevel } from \"../utils/logger\";\nimport { loadConfig } from \"../config/loader\";\nimport { analyze } from \"../analyzer\";\nimport { generate, generateStatic } from \"../generator\";\nimport { writeFileSync, fileExists, readFileSync } from \"../utils/fs\";\nimport { withSpinner } from \"../utils/spinner\";\nimport { UsageTracker } from \"../utils/usage-tracker\";\nimport { FORMATS, resolveFormats, type OutputFormat } from \"../generator/formats\";\nimport { renderForFormat } from \"../generator/format-renderer\";\nimport { renderCoreContent } from \"../generator/markdown-renderer\";\nimport {\n isGitRepo,\n getHeadSha,\n needsRegeneration,\n parseMetaTag,\n type FileMeta,\n} from \"../utils/git\";\n\ninterface InitOptions {\n dryRun?: boolean;\n output?: string;\n format: string;\n provider?: string;\n model?: string;\n force?: boolean;\n verbose?: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n if (options.verbose) setLogLevel(\"debug\");\n\n const rootDir = process.cwd();\n const format = options.format as OutputFormat;\n const formats = resolveFormats(format);\n const useLlm = !!options.provider;\n\n logger.info(pc.bold(\"agentseed init\"), pc.gray(`(${rootDir})`));\n logger.info(\n pc.gray(`Formats: ${formats.map((f) => FORMATS[f].name).join(\", \")}`)\n );\n if (!useLlm) {\n logger.info(pc.gray(\"Static analysis mode. Use --provider claude for LLM enhancement.\"));\n }\n\n try {\n const config = await loadConfig(rootDir, {\n provider: options.provider,\n model: options.model,\n noLlm: !useLlm,\n });\n\n // --- Staleness check ---\n const gitRepo = isGitRepo(rootDir);\n const currentSha = gitRepo ? getHeadSha(rootDir) : null;\n\n if (!options.force && !options.dryRun && gitRepo && currentSha) {\n const allFresh = formats.every((fmt) => {\n const outPath = options.output\n ? path.resolve(rootDir, options.output)\n : path.resolve(rootDir, FORMATS[fmt].outputPath);\n if (!fileExists(outPath)) return false;\n const existing = readFileSync(outPath);\n return !needsRegeneration(existing, currentSha, rootDir);\n });\n\n if (allFresh) {\n logger.info(\n pc.green(\"All files are up to date.\") +\n pc.gray(\" Use --force to regenerate.\")\n );\n return;\n }\n }\n\n const analysis = await withSpinner(\"Analyzing repository...\", () =>\n analyze(rootDir, config)\n );\n\n // Generate core content once (static or LLM), then render for each format\n let coreContent: string;\n const tracker = new UsageTracker(config.model!);\n\n if (config.noLlm) {\n coreContent = renderCoreContent(analysis, null);\n } else {\n // Use first format for the LLM call — content is format-agnostic\n const result = await withSpinner(\"Generating with LLM...\", () =>\n generate(rootDir, analysis, config, formats[0])\n );\n coreContent = result.coreContent;\n tracker.add(result.usage);\n }\n\n // Build metadata for tracking\n const meta: FileMeta | undefined =\n gitRepo && currentSha\n ? {\n sha: currentSha,\n timestamp: new Date().toISOString(),\n format: \"agentseed-v1\",\n }\n : undefined;\n\n if (options.dryRun) {\n for (const fmt of formats) {\n const formatted = renderForFormat(fmt, analysis, coreContent);\n logger.info(pc.bold(`\\n--- ${FORMATS[fmt].name} (dry run) ---\\n`));\n logger.info(formatted);\n }\n if (!config.noLlm) tracker.printSummary();\n return;\n }\n\n // Write each format\n let written = 0;\n let skipped = 0;\n for (const fmt of formats) {\n const outputPath = options.output\n ? path.resolve(rootDir, options.output)\n : path.resolve(rootDir, FORMATS[fmt].outputPath);\n\n // Per-file staleness check (skip files that are already current)\n if (!options.force && gitRepo && currentSha && fileExists(outputPath)) {\n const existing = readFileSync(outputPath);\n if (!needsRegeneration(existing, currentSha, rootDir)) {\n logger.info(\n pc.gray(` ${FORMATS[fmt].name} is up to date, skipping`)\n );\n skipped++;\n continue;\n }\n }\n\n const formatted = renderForFormat(\n fmt,\n analysis,\n coreContent,\n undefined,\n meta\n );\n writeFileSync(outputPath, formatted);\n logger.success(\n `${FORMATS[fmt].name} written to ${pc.bold(outputPath)}`\n );\n written++;\n }\n\n if (skipped > 0) {\n logger.info(\n pc.gray(`${skipped} file(s) skipped (unchanged). Use --force to regenerate all.`)\n );\n }\n\n if (!config.noLlm) tracker.printSummary();\n } catch (err) {\n logger.error((err as Error).message);\n process.exitCode = 1;\n }\n}\n","import pc from \"picocolors\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\nlet currentLevel: LogLevel = \"info\";\n\nexport function setLogLevel(level: LogLevel): void {\n currentLevel = level;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LEVELS[level] >= LEVELS[currentLevel];\n}\n\nexport const logger = {\n debug(...args: unknown[]): void {\n if (shouldLog(\"debug\")) {\n console.log(pc.gray(\"[debug]\"), ...args);\n }\n },\n\n info(...args: unknown[]): void {\n if (shouldLog(\"info\")) {\n console.log(...args);\n }\n },\n\n success(...args: unknown[]): void {\n if (shouldLog(\"info\")) {\n console.log(pc.green(\"✔\"), ...args);\n }\n },\n\n warn(...args: unknown[]): void {\n if (shouldLog(\"warn\")) {\n console.warn(pc.yellow(\"⚠\"), ...args);\n }\n },\n\n error(...args: unknown[]): void {\n if (shouldLog(\"error\")) {\n console.error(pc.red(\"✖\"), ...args);\n }\n },\n};\n","import * as path from \"node:path\";\nimport YAML from \"yaml\";\nimport { configSchema, type AgentseedConfig } from \"./schema\";\nimport { DEFAULT_MODELS } from \"./defaults\";\nimport { fileExists, readFileSync } from \"../utils/fs\";\nimport { ConfigError } from \"../utils/errors\";\nimport { logger } from \"../utils/logger\";\n\ninterface LoadOverrides {\n provider?: string;\n model?: string;\n noLlm?: boolean;\n}\n\nconst CONFIG_FILES = [\".agentseedrc\", \".agentseedrc.yml\", \".agentseedrc.yaml\"];\n\nexport async function loadConfig(\n rootDir: string,\n overrides: LoadOverrides = {}\n): Promise<AgentseedConfig> {\n let rawConfig: Record<string, unknown> = {};\n\n // Look for config file\n for (const filename of CONFIG_FILES) {\n const configPath = path.join(rootDir, filename);\n if (fileExists(configPath)) {\n logger.debug(`Loading config from ${configPath}`);\n try {\n const content = readFileSync(configPath);\n rawConfig = YAML.parse(content) ?? {};\n } catch (err) {\n throw new ConfigError(\n `Failed to parse ${filename}: ${(err as Error).message}`\n );\n }\n break;\n }\n }\n\n // Apply CLI overrides\n if (overrides.provider) rawConfig.provider = overrides.provider;\n if (overrides.model) rawConfig.model = overrides.model;\n if (overrides.noLlm !== undefined) rawConfig.noLlm = overrides.noLlm;\n\n // Resolve env vars for API key\n if (!rawConfig.apiKey) {\n const provider = (rawConfig.provider as string) ?? \"claude\";\n rawConfig.apiKey = resolveApiKey(provider);\n }\n\n // Set default model if not specified\n if (!rawConfig.model) {\n const provider = (rawConfig.provider as string) ?? \"claude\";\n rawConfig.model = DEFAULT_MODELS[provider];\n }\n\n // Validate\n const result = configSchema.safeParse(rawConfig);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => ` ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new ConfigError(`Invalid configuration:\\n${issues}`);\n }\n\n return result.data;\n}\n\nfunction resolveApiKey(provider: string): string | undefined {\n switch (provider) {\n case \"claude\":\n return process.env.ANTHROPIC_API_KEY;\n case \"openai\":\n return process.env.OPENAI_API_KEY;\n case \"ollama\":\n return undefined; // Ollama doesn't need an API key\n default:\n return undefined;\n }\n}\n","import { z } from \"zod\";\n\nexport const providerSchema = z.enum([\"claude\", \"openai\", \"ollama\"]);\n\nexport const configSchema = z.object({\n provider: providerSchema.default(\"claude\"),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n ollamaUrl: z.string().default(\"http://localhost:11434\"),\n noLlm: z.boolean().default(false),\n maxFiles: z.number().int().positive().default(15),\n maxTokenBudget: z.number().int().positive().default(65536),\n sections: z\n .object({\n projectContext: z.boolean().default(true),\n stack: z.boolean().default(true),\n commands: z.boolean().default(true),\n conventions: z.boolean().default(true),\n architecture: z.boolean().default(true),\n boundaries: z.boolean().default(true),\n })\n .default({}),\n ignore: z.array(z.string()).default([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \"coverage\",\n \"__pycache__\",\n \".next\",\n \".nuxt\",\n \"vendor\",\n \"target\",\n ]),\n});\n\nexport type AgentseedConfig = z.infer<typeof configSchema>;\nexport type Provider = z.infer<typeof providerSchema>;\n","import type { AgentseedConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: AgentseedConfig = {\n provider: \"claude\",\n ollamaUrl: \"http://localhost:11434\",\n noLlm: false,\n maxFiles: 15,\n maxTokenBudget: 65536,\n sections: {\n projectContext: true,\n stack: true,\n commands: true,\n conventions: true,\n architecture: true,\n boundaries: true,\n },\n ignore: [\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \"coverage\",\n \"__pycache__\",\n \".next\",\n \".nuxt\",\n \"vendor\",\n \"target\",\n ],\n};\n\nexport const DEFAULT_MODELS: Record<string, string> = {\n claude: \"claude-sonnet-4-5-20250929\",\n openai: \"gpt-4o\",\n ollama: \"llama3\",\n};\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport function fileExists(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\nexport function dirExists(dirPath: string): boolean {\n try {\n return fs.statSync(dirPath).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function readFileSync(filePath: string): string {\n return fs.readFileSync(filePath, \"utf-8\");\n}\n\nexport function writeFileSync(filePath: string, content: string): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, content, \"utf-8\");\n}\n\nexport function readJsonSync<T = unknown>(filePath: string): T {\n const content = readFileSync(filePath);\n return JSON.parse(content) as T;\n}\n\nexport function resolveFromRoot(rootDir: string, ...segments: string[]): string {\n return path.resolve(rootDir, ...segments);\n}\n","export class AgentseedError extends Error {\n constructor(message: string, public code: string) {\n super(message);\n this.name = \"AgentseedError\";\n }\n}\n\nexport class ConfigError extends AgentseedError {\n constructor(message: string) {\n super(message, \"CONFIG_ERROR\");\n this.name = \"ConfigError\";\n }\n}\n\nexport class ProviderError extends AgentseedError {\n constructor(message: string, public provider: string) {\n super(message, \"PROVIDER_ERROR\");\n this.name = \"ProviderError\";\n }\n}\n\nexport class AnalysisError extends AgentseedError {\n constructor(message: string) {\n super(message, \"ANALYSIS_ERROR\");\n this.name = \"AnalysisError\";\n }\n}\n","import fg from \"fast-glob\";\nimport * as path from \"node:path\";\nimport type { LanguageInfo } from \"./types\";\n\nconst EXTENSIONS: Record<string, string> = {\n \".ts\": \"TypeScript\",\n \".tsx\": \"TypeScript\",\n \".js\": \"JavaScript\",\n \".jsx\": \"JavaScript\",\n \".mjs\": \"JavaScript\",\n \".cjs\": \"JavaScript\",\n \".py\": \"Python\",\n \".rs\": \"Rust\",\n \".go\": \"Go\",\n \".java\": \"Java\",\n \".kt\": \"Kotlin\",\n \".rb\": \"Ruby\",\n \".php\": \"PHP\",\n \".cs\": \"C#\",\n \".cpp\": \"C++\",\n \".c\": \"C\",\n \".h\": \"C\",\n \".hpp\": \"C++\",\n \".swift\": \"Swift\",\n \".scala\": \"Scala\",\n \".ex\": \"Elixir\",\n \".exs\": \"Elixir\",\n \".erl\": \"Erlang\",\n \".hs\": \"Haskell\",\n \".lua\": \"Lua\",\n \".r\": \"R\",\n \".R\": \"R\",\n \".dart\": \"Dart\",\n \".vue\": \"Vue\",\n \".svelte\": \"Svelte\",\n \".astro\": \"Astro\",\n \".sql\": \"SQL\",\n \".hql\": \"HiveQL\",\n \".ddl\": \"SQL\",\n \".dml\": \"SQL\",\n \".plsql\": \"PL/SQL\",\n \".pgsql\": \"PL/pgSQL\",\n \".sh\": \"Shell\",\n \".bash\": \"Shell\",\n \".zsh\": \"Shell\",\n \".css\": \"CSS\",\n \".scss\": \"SCSS\",\n \".less\": \"Less\",\n \".html\": \"HTML\",\n \".yml\": \"YAML\",\n \".yaml\": \"YAML\",\n \".toml\": \"TOML\",\n \".tf\": \"Terraform\",\n \".tfvars\": \"Terraform\",\n};\n\nexport async function detectLanguages(\n rootDir: string,\n ignore: string[]\n): Promise<LanguageInfo[]> {\n const files = await fg(\"**/*\", {\n cwd: rootDir,\n ignore: ignore.map((p) => `**/${p}/**`),\n onlyFiles: true,\n dot: false,\n });\n\n const counts = new Map<string, number>();\n\n for (const file of files) {\n const ext = path.extname(file).toLowerCase();\n const lang = EXTENSIONS[ext];\n if (lang) {\n counts.set(lang, (counts.get(lang) ?? 0) + 1);\n }\n }\n\n const total = Array.from(counts.values()).reduce((a, b) => a + b, 0);\n if (total === 0) return [];\n\n return Array.from(counts.entries())\n .map(([name, fileCount]) => ({\n name,\n fileCount,\n percentage: Math.round((fileCount / total) * 100),\n }))\n .sort((a, b) => b.percentage - a.percentage);\n}\n","import * as path from \"node:path\";\nimport type { FrameworkInfo } from \"./types\";\nimport { fileExists, readFileSync } from \"../utils/fs\";\n\ninterface FrameworkSignature {\n name: string;\n category: FrameworkInfo[\"category\"];\n indicators: {\n files?: string[];\n dependencies?: string[];\n devDependencies?: string[];\n };\n}\n\nconst FRAMEWORKS: FrameworkSignature[] = [\n // Web frameworks\n { name: \"Next.js\", category: \"web\", indicators: { files: [\"next.config.js\", \"next.config.mjs\", \"next.config.ts\"], dependencies: [\"next\"] } },\n { name: \"React\", category: \"web\", indicators: { dependencies: [\"react\"] } },\n { name: \"Vue\", category: \"web\", indicators: { dependencies: [\"vue\"] } },\n { name: \"Nuxt\", category: \"web\", indicators: { files: [\"nuxt.config.ts\", \"nuxt.config.js\"], dependencies: [\"nuxt\"] } },\n { name: \"Svelte\", category: \"web\", indicators: { dependencies: [\"svelte\"] } },\n { name: \"SvelteKit\", category: \"web\", indicators: { files: [\"svelte.config.js\"], dependencies: [\"@sveltejs/kit\"] } },\n { name: \"Angular\", category: \"web\", indicators: { files: [\"angular.json\"], dependencies: [\"@angular/core\"] } },\n { name: \"Astro\", category: \"web\", indicators: { files: [\"astro.config.mjs\", \"astro.config.ts\"], dependencies: [\"astro\"] } },\n { name: \"Remix\", category: \"web\", indicators: { dependencies: [\"@remix-run/react\"] } },\n { name: \"Gatsby\", category: \"web\", indicators: { files: [\"gatsby-config.js\", \"gatsby-config.ts\"], dependencies: [\"gatsby\"] } },\n\n // API frameworks\n { name: \"Express\", category: \"api\", indicators: { dependencies: [\"express\"] } },\n { name: \"Fastify\", category: \"api\", indicators: { dependencies: [\"fastify\"] } },\n { name: \"NestJS\", category: \"api\", indicators: { dependencies: [\"@nestjs/core\"] } },\n { name: \"Hono\", category: \"api\", indicators: { dependencies: [\"hono\"] } },\n { name: \"Koa\", category: \"api\", indicators: { dependencies: [\"koa\"] } },\n { name: \"Flask\", category: \"api\", indicators: { files: [\"app.py\"], dependencies: [\"flask\", \"Flask\"] } },\n { name: \"Django\", category: \"api\", indicators: { files: [\"manage.py\"], dependencies: [\"django\", \"Django\"] } },\n { name: \"FastAPI\", category: \"api\", indicators: { dependencies: [\"fastapi\"] } },\n { name: \"Spring Boot\", category: \"api\", indicators: { files: [\"pom.xml\", \"build.gradle\"] } },\n\n // Testing\n { name: \"Vitest\", category: \"testing\", indicators: { devDependencies: [\"vitest\"] } },\n { name: \"Jest\", category: \"testing\", indicators: { devDependencies: [\"jest\"] } },\n { name: \"Mocha\", category: \"testing\", indicators: { devDependencies: [\"mocha\"] } },\n { name: \"Playwright\", category: \"testing\", indicators: { devDependencies: [\"@playwright/test\", \"playwright\"] } },\n { name: \"Cypress\", category: \"testing\", indicators: { devDependencies: [\"cypress\"] } },\n { name: \"pytest\", category: \"testing\", indicators: { files: [\"pytest.ini\", \"pyproject.toml\"] } },\n\n // Build tools\n { name: \"Vite\", category: \"build\", indicators: { files: [\"vite.config.ts\", \"vite.config.js\"], devDependencies: [\"vite\"] } },\n { name: \"Webpack\", category: \"build\", indicators: { files: [\"webpack.config.js\", \"webpack.config.ts\"], devDependencies: [\"webpack\"] } },\n { name: \"tsup\", category: \"build\", indicators: { devDependencies: [\"tsup\"] } },\n { name: \"esbuild\", category: \"build\", indicators: { devDependencies: [\"esbuild\"] } },\n { name: \"Turbopack\", category: \"build\", indicators: { files: [\"turbo.json\"] } },\n { name: \"Rollup\", category: \"build\", indicators: { files: [\"rollup.config.js\", \"rollup.config.ts\"], devDependencies: [\"rollup\"] } },\n\n // ORM\n { name: \"Prisma\", category: \"orm\", indicators: { files: [\"prisma/schema.prisma\"], dependencies: [\"@prisma/client\"] } },\n { name: \"Drizzle\", category: \"orm\", indicators: { dependencies: [\"drizzle-orm\"] } },\n { name: \"TypeORM\", category: \"orm\", indicators: { dependencies: [\"typeorm\"] } },\n { name: \"Sequelize\", category: \"orm\", indicators: { dependencies: [\"sequelize\"] } },\n { name: \"SQLAlchemy\", category: \"orm\", indicators: { dependencies: [\"sqlalchemy\"] } },\n\n // Data / ETL / Analytics\n { name: \"dbt\", category: \"data\", indicators: { files: [\"dbt_project.yml\"] } },\n { name: \"Apache Airflow\", category: \"etl\", indicators: { files: [\"dags/\", \"airflow.cfg\"], dependencies: [\"apache-airflow\", \"airflow\"] } },\n { name: \"Dagster\", category: \"etl\", indicators: { dependencies: [\"dagster\"] } },\n { name: \"Prefect\", category: \"etl\", indicators: { dependencies: [\"prefect\"] } },\n { name: \"Luigi\", category: \"etl\", indicators: { dependencies: [\"luigi\"] } },\n { name: \"Apache Spark\", category: \"data\", indicators: { dependencies: [\"pyspark\"] } },\n { name: \"Pandas\", category: \"data\", indicators: { dependencies: [\"pandas\"] } },\n { name: \"Polars\", category: \"data\", indicators: { dependencies: [\"polars\"] } },\n { name: \"Great Expectations\", category: \"data\", indicators: { dependencies: [\"great-expectations\", \"great_expectations\"] } },\n { name: \"Alembic\", category: \"data\", indicators: { files: [\"alembic.ini\", \"alembic/\"], dependencies: [\"alembic\"] } },\n { name: \"Flyway\", category: \"data\", indicators: { files: [\"flyway.conf\", \"sql/\"] } },\n { name: \"Liquibase\", category: \"data\", indicators: { files: [\"liquibase.properties\", \"changelog.xml\"] } },\n { name: \"Terraform\", category: \"data\", indicators: { files: [\"main.tf\", \"terraform.tfvars\"] } },\n];\n\nexport async function detectFrameworks(\n rootDir: string\n): Promise<FrameworkInfo[]> {\n const detected: FrameworkInfo[] = [];\n const pkgJson = loadPackageJson(rootDir);\n const pyDeps = loadPythonDeps(rootDir);\n\n for (const fw of FRAMEWORKS) {\n let confidence = 0;\n const { files, dependencies, devDependencies } = fw.indicators;\n\n // Check for indicator files\n if (files) {\n for (const f of files) {\n if (fileExists(path.join(rootDir, f))) {\n confidence += 0.5;\n break;\n }\n }\n }\n\n // Check npm dependencies\n if (dependencies && pkgJson) {\n for (const dep of dependencies) {\n if (pkgJson.dependencies?.[dep] || pkgJson.devDependencies?.[dep]) {\n confidence += 0.8;\n break;\n }\n }\n }\n\n if (devDependencies && pkgJson) {\n for (const dep of devDependencies) {\n if (pkgJson.devDependencies?.[dep]) {\n confidence += 0.7;\n break;\n }\n }\n }\n\n // Check Python dependencies\n if (dependencies && pyDeps.length > 0) {\n for (const dep of dependencies) {\n if (pyDeps.includes(dep.toLowerCase())) {\n confidence += 0.8;\n break;\n }\n }\n }\n\n if (confidence > 0) {\n detected.push({\n name: fw.name,\n category: fw.category,\n confidence: Math.min(confidence, 1),\n });\n }\n }\n\n return detected.sort((a, b) => b.confidence - a.confidence);\n}\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\nfunction loadPackageJson(rootDir: string): PackageJson | null {\n const pkgPath = path.join(rootDir, \"package.json\");\n if (!fileExists(pkgPath)) return null;\n try {\n return JSON.parse(readFileSync(pkgPath));\n } catch {\n return null;\n }\n}\n\nfunction loadPythonDeps(rootDir: string): string[] {\n const reqPath = path.join(rootDir, \"requirements.txt\");\n if (fileExists(reqPath)) {\n return readFileSync(reqPath)\n .split(\"\\n\")\n .map((line) => line.split(\"==\")[0].split(\">=\")[0].split(\"<=\")[0].trim().toLowerCase())\n .filter(Boolean);\n }\n return [];\n}\n","import * as path from \"node:path\";\nimport type { CommandInfo } from \"./types\";\nimport { fileExists, readFileSync } from \"../utils/fs\";\n\nexport async function extractCommands(\n rootDir: string\n): Promise<CommandInfo[]> {\n const commands: CommandInfo[] = [];\n\n commands.push(...extractFromPackageJson(rootDir));\n commands.push(...extractFromMakefile(rootDir));\n commands.push(...extractFromPyproject(rootDir));\n commands.push(...extractFromCargoToml(rootDir));\n commands.push(...extractFromDbt(rootDir));\n commands.push(...extractFromAirflow(rootDir));\n\n return commands;\n}\n\nfunction extractFromPackageJson(rootDir: string): CommandInfo[] {\n const pkgPath = path.join(rootDir, \"package.json\");\n if (!fileExists(pkgPath)) return [];\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath));\n const scripts = pkg.scripts as Record<string, string> | undefined;\n if (!scripts) return [];\n\n const important = [\n \"dev\", \"start\", \"build\", \"test\", \"lint\", \"format\",\n \"preview\", \"serve\", \"watch\", \"check\", \"typecheck\",\n \"e2e\", \"test:unit\", \"test:e2e\", \"test:watch\",\n ];\n\n const commands: CommandInfo[] = [];\n for (const [name, cmd] of Object.entries(scripts)) {\n if (important.includes(name) || name.startsWith(\"test\") || name.startsWith(\"build\")) {\n commands.push({\n name,\n command: `npm run ${name}`,\n source: \"package.json scripts\",\n });\n }\n }\n\n // Also check for package manager\n if (fileExists(path.join(rootDir, \"pnpm-lock.yaml\"))) {\n commands.forEach((c) => (c.command = c.command.replace(\"npm run\", \"pnpm\")));\n } else if (fileExists(path.join(rootDir, \"yarn.lock\"))) {\n commands.forEach((c) => (c.command = c.command.replace(\"npm run\", \"yarn\")));\n } else if (fileExists(path.join(rootDir, \"bun.lockb\")) || fileExists(path.join(rootDir, \"bun.lock\"))) {\n commands.forEach((c) => (c.command = c.command.replace(\"npm run\", \"bun run\")));\n }\n\n return commands;\n } catch {\n return [];\n }\n}\n\nfunction extractFromMakefile(rootDir: string): CommandInfo[] {\n const mkPath = path.join(rootDir, \"Makefile\");\n if (!fileExists(mkPath)) return [];\n\n try {\n const content = readFileSync(mkPath);\n const commands: CommandInfo[] = [];\n const targetRegex = /^([a-zA-Z_][\\w-]*):/gm;\n let match;\n\n while ((match = targetRegex.exec(content)) !== null) {\n const name = match[1];\n if (!name.startsWith(\".\") && !name.startsWith(\"_\")) {\n commands.push({\n name,\n command: `make ${name}`,\n source: \"Makefile\",\n });\n }\n }\n\n return commands;\n } catch {\n return [];\n }\n}\n\nfunction extractFromPyproject(rootDir: string): CommandInfo[] {\n const pyprojectPath = path.join(rootDir, \"pyproject.toml\");\n if (!fileExists(pyprojectPath)) return [];\n\n const commands: CommandInfo[] = [];\n\n // Check for common Python project commands\n if (fileExists(path.join(rootDir, \"manage.py\"))) {\n commands.push({ name: \"runserver\", command: \"python manage.py runserver\", source: \"Django\" });\n commands.push({ name: \"test\", command: \"python manage.py test\", source: \"Django\" });\n }\n\n if (fileExists(path.join(rootDir, \"pytest.ini\")) || fileExists(pyprojectPath)) {\n commands.push({ name: \"test\", command: \"pytest\", source: \"pytest\" });\n }\n\n return commands;\n}\n\nfunction extractFromCargoToml(rootDir: string): CommandInfo[] {\n const cargoPath = path.join(rootDir, \"Cargo.toml\");\n if (!fileExists(cargoPath)) return [];\n\n return [\n { name: \"build\", command: \"cargo build\", source: \"Cargo.toml\" },\n { name: \"test\", command: \"cargo test\", source: \"Cargo.toml\" },\n { name: \"run\", command: \"cargo run\", source: \"Cargo.toml\" },\n { name: \"check\", command: \"cargo check\", source: \"Cargo.toml\" },\n ];\n}\n\nfunction extractFromDbt(rootDir: string): CommandInfo[] {\n if (!fileExists(path.join(rootDir, \"dbt_project.yml\"))) return [];\n\n return [\n { name: \"run\", command: \"dbt run\", source: \"dbt\" },\n { name: \"test\", command: \"dbt test\", source: \"dbt\" },\n { name: \"build\", command: \"dbt build\", source: \"dbt\" },\n { name: \"compile\", command: \"dbt compile\", source: \"dbt\" },\n { name: \"docs\", command: \"dbt docs generate && dbt docs serve\", source: \"dbt\" },\n { name: \"seed\", command: \"dbt seed\", source: \"dbt\" },\n { name: \"snapshot\", command: \"dbt snapshot\", source: \"dbt\" },\n ];\n}\n\nfunction extractFromAirflow(rootDir: string): CommandInfo[] {\n const hasDags =\n fileExists(path.join(rootDir, \"airflow.cfg\")) ||\n fileExists(path.join(rootDir, \"dags\"));\n\n if (!hasDags) return [];\n\n return [\n { name: \"webserver\", command: \"airflow webserver\", source: \"Airflow\" },\n { name: \"scheduler\", command: \"airflow scheduler\", source: \"Airflow\" },\n { name: \"test-dag\", command: \"airflow dags test <dag_id>\", source: \"Airflow\" },\n { name: \"list-dags\", command: \"airflow dags list\", source: \"Airflow\" },\n ];\n}\n","import fg from \"fast-glob\";\nimport * as path from \"node:path\";\nimport type { StructureInfo, DirectoryEntry } from \"./types\";\n\nconst ENTRY_POINT_PATTERNS = [\n \"src/index.*\",\n \"src/main.*\",\n \"src/app.*\",\n \"src/cli.*\",\n \"index.*\",\n \"main.*\",\n \"app.*\",\n \"server.*\",\n \"src/server.*\",\n \"cmd/main.*\",\n \"lib/index.*\",\n \"manage.py\",\n \"app.py\",\n \"main.py\",\n \"dbt_project.yml\",\n \"airflow.cfg\",\n \"alembic.ini\",\n];\n\nexport async function mapStructure(\n rootDir: string,\n ignore: string[]\n): Promise<StructureInfo> {\n const ignorePatterns = ignore.map((p) => `**/${p}/**`);\n\n const files = await fg(\"**/*\", {\n cwd: rootDir,\n ignore: ignorePatterns,\n onlyFiles: true,\n dot: false,\n deep: 6,\n });\n\n const dirs = await fg(\"**/\", {\n cwd: rootDir,\n ignore: ignorePatterns,\n onlyDirectories: true,\n dot: false,\n deep: 4,\n });\n\n // Build tree (limited depth for readability)\n const tree: DirectoryEntry[] = [];\n\n for (const dir of dirs.slice(0, 50)) {\n const depth = dir.split(\"/\").length - 1;\n if (depth <= 3) {\n tree.push({ path: dir, type: \"directory\", depth });\n }\n }\n\n for (const file of files) {\n const depth = file.split(\"/\").length - 1;\n if (depth <= 2) {\n tree.push({ path: file, type: \"file\", depth });\n }\n }\n\n tree.sort((a, b) => a.path.localeCompare(b.path));\n\n // Find entry points\n const entryPoints: string[] = [];\n for (const pattern of ENTRY_POINT_PATTERNS) {\n const matches = await fg(pattern, {\n cwd: rootDir,\n ignore: ignorePatterns,\n });\n entryPoints.push(...matches);\n }\n\n return {\n totalFiles: files.length,\n totalDirs: dirs.length,\n tree,\n entryPoints: [...new Set(entryPoints)],\n };\n}\n","import fg from \"fast-glob\";\nimport * as path from \"node:path\";\nimport type { PatternInfo } from \"./types\";\nimport { fileExists } from \"../utils/fs\";\n\nconst CONFIG_FILES = [\n \"tsconfig.json\", \"jsconfig.json\",\n \".eslintrc\", \".eslintrc.js\", \".eslintrc.json\", \".eslintrc.yml\", \"eslint.config.js\", \"eslint.config.mjs\",\n \".prettierrc\", \".prettierrc.js\", \".prettierrc.json\", \"prettier.config.js\",\n \".editorconfig\",\n \"biome.json\",\n \".env.example\",\n \"docker-compose.yml\", \"docker-compose.yaml\", \"Dockerfile\",\n \"pyproject.toml\", \"setup.py\", \"setup.cfg\",\n \"Cargo.toml\",\n \"go.mod\",\n \"Gemfile\",\n \"composer.json\",\n];\n\nconst CI_FILES = [\n \".github/workflows/*.yml\",\n \".github/workflows/*.yaml\",\n \".gitlab-ci.yml\",\n \"Jenkinsfile\",\n \".circleci/config.yml\",\n \".travis.yml\",\n \"bitbucket-pipelines.yml\",\n];\n\nexport async function detectPatterns(\n rootDir: string,\n ignore: string[]\n): Promise<PatternInfo> {\n const ignorePatterns = ignore.map((p) => `**/${p}/**`);\n\n // Detect naming convention from source files\n const sourceFiles = await fg(\"src/**/*.*\", {\n cwd: rootDir,\n ignore: ignorePatterns,\n onlyFiles: true,\n deep: 3,\n });\n\n const namingConvention = detectNamingConvention(sourceFiles);\n const fileOrganization = detectFileOrganization(rootDir, sourceFiles);\n\n // Detect monorepo\n const hasMonorepo =\n fileExists(path.join(rootDir, \"lerna.json\")) ||\n fileExists(path.join(rootDir, \"pnpm-workspace.yaml\")) ||\n fileExists(path.join(rootDir, \"turbo.json\")) ||\n (await fg(\"packages/*/package.json\", { cwd: rootDir })).length > 0 ||\n (await fg(\"apps/*/package.json\", { cwd: rootDir })).length > 0;\n\n // Find config files\n const configFiles: string[] = [];\n for (const cf of CONFIG_FILES) {\n if (fileExists(path.join(rootDir, cf))) {\n configFiles.push(cf);\n }\n }\n\n // Find CI files (use dot: true to match .github)\n const ciFiles: string[] = [];\n for (const pattern of CI_FILES) {\n const matches = await fg(pattern, { cwd: rootDir, dot: true });\n ciFiles.push(...matches);\n }\n\n return {\n namingConvention,\n fileOrganization,\n hasMonorepo,\n configFiles,\n ciFiles,\n };\n}\n\nfunction detectNamingConvention(files: string[]): PatternInfo[\"namingConvention\"] {\n const names = files.map((f) => path.basename(f, path.extname(f)));\n let camel = 0, snake = 0, kebab = 0, pascal = 0;\n\n for (const name of names) {\n if (name.includes(\"_\")) snake++;\n else if (name.includes(\"-\")) kebab++;\n else if (/^[A-Z]/.test(name)) pascal++;\n else if (/[a-z][A-Z]/.test(name)) camel++;\n }\n\n const total = camel + snake + kebab + pascal;\n if (total === 0) return \"mixed\";\n\n const max = Math.max(camel, snake, kebab, pascal);\n if (max / total < 0.5) return \"mixed\";\n\n if (max === kebab) return \"kebab-case\";\n if (max === snake) return \"snake_case\";\n if (max === pascal) return \"PascalCase\";\n return \"camelCase\";\n}\n\nfunction detectFileOrganization(rootDir: string, files: string[]): string {\n // Collect both top-level dirs and src/ subdirectories\n const topDirs = new Set<string>();\n const srcSubDirs = new Set<string>();\n\n for (const f of files) {\n const parts = f.split(\"/\");\n if (parts.length > 1) topDirs.add(parts[0]);\n // If file is under src/, track subdirectory names\n if (parts[0] === \"src\" && parts.length > 2) {\n srcSubDirs.add(parts[1]);\n }\n }\n\n const allDirs = new Set([...topDirs, ...srcSubDirs]);\n\n // Feature-based: src/features/*, src/modules/*, etc.\n const featureDirs = [\"features\", \"modules\", \"domains\", \"pages\", \"routes\"];\n for (const fd of featureDirs) {\n if (allDirs.has(fd)) return \"feature-based\";\n }\n\n // Module-based: organized by functional areas (router/, middleware/, adapter/, helper/, etc.)\n const moduleDirs = [\n \"router\", \"routers\", \"middleware\", \"middlewares\",\n \"adapter\", \"adapters\", \"helper\", \"helpers\",\n \"plugin\", \"plugins\", \"handler\", \"handlers\",\n \"client\", \"utils\", \"hooks\", \"providers\",\n ];\n let moduleCount = 0;\n for (const md of moduleDirs) {\n if (srcSubDirs.has(md) || topDirs.has(md)) moduleCount++;\n }\n if (moduleCount >= 2) return \"module-based\";\n\n // Layer-based: src/controllers, src/services, src/models, etc.\n const layerDirs = [\"controllers\", \"services\", \"models\", \"repositories\"];\n let layerCount = 0;\n for (const ld of layerDirs) {\n if (allDirs.has(ld)) layerCount++;\n }\n if (layerCount >= 2) return \"layer-based\";\n\n // Component-based (React/Vue/Svelte)\n if (allDirs.has(\"components\")) return \"component-based\";\n\n // Check if there are meaningful subdirectories at all\n if (srcSubDirs.size >= 3) return \"domain-based\";\n\n return \"flat\";\n}\n","import fg from \"fast-glob\";\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport type { SampledFile, StructureInfo } from \"./types\";\n\nconst PRIORITY_PATTERNS: Record<SampledFile[\"priority\"], string[]> = {\n entry: [\n \"src/index.{ts,tsx,js,jsx}\",\n \"src/main.{ts,tsx,js,jsx}\",\n \"src/app.{ts,tsx,js,jsx}\",\n \"src/cli.{ts,tsx,js,jsx}\",\n \"index.{ts,tsx,js,jsx}\",\n \"main.{ts,tsx,js,jsx,py,go,rs}\",\n \"app.{ts,tsx,js,jsx,py}\",\n \"server.{ts,js}\",\n \"manage.py\",\n \"cmd/main.go\",\n ],\n config: [\n \"package.json\",\n \"tsconfig.json\",\n \"pyproject.toml\",\n \"Cargo.toml\",\n \"go.mod\",\n \"Makefile\",\n \"Dockerfile\",\n \"docker-compose.yml\",\n \".env.example\",\n \"dbt_project.yml\",\n \"profiles.yml\",\n \"airflow.cfg\",\n \"alembic.ini\",\n ],\n source: [\n \"src/**/*.{ts,tsx,js,jsx,py,go,rs,java,rb}\",\n \"lib/**/*.{ts,tsx,js,jsx,py,go,rs,java,rb}\",\n \"app/**/*.{ts,tsx,js,jsx,py,rb}\",\n \"models/**/*.sql\",\n \"dags/**/*.py\",\n \"sql/**/*.sql\",\n \"queries/**/*.sql\",\n \"macros/**/*.sql\",\n \"staging/**/*.sql\",\n \"marts/**/*.sql\",\n \"transforms/**/*.{sql,py}\",\n \"pipelines/**/*.{py,yml,yaml}\",\n \"etl/**/*.{py,sql}\",\n ],\n test: [\n \"tests/**/*.{ts,tsx,js,jsx,py}\",\n \"test/**/*.{ts,tsx,js,jsx,py}\",\n \"**/*.test.{ts,tsx,js,jsx}\",\n \"**/*.spec.{ts,tsx,js,jsx}\",\n \"**/*_test.{go,py}\",\n ],\n};\n\nexport async function sampleFiles(\n rootDir: string,\n ignore: string[],\n structure: StructureInfo,\n maxFiles: number,\n maxBudget: number\n): Promise<SampledFile[]> {\n const ignorePatterns = ignore.map((p) => `**/${p}/**`);\n const sampled: SampledFile[] = [];\n const seenPaths = new Set<string>();\n let totalSize = 0;\n\n const priorities: SampledFile[\"priority\"][] = [\"entry\", \"config\", \"source\", \"test\"];\n\n for (const priority of priorities) {\n if (sampled.length >= maxFiles) break;\n\n const patterns = PRIORITY_PATTERNS[priority];\n for (const pattern of patterns) {\n if (sampled.length >= maxFiles) break;\n\n const matches = await fg(pattern, {\n cwd: rootDir,\n ignore: ignorePatterns,\n onlyFiles: true,\n });\n\n for (const match of matches) {\n if (sampled.length >= maxFiles || totalSize >= maxBudget) break;\n if (seenPaths.has(match)) continue;\n\n const fullPath = path.join(rootDir, match);\n try {\n const stat = fs.statSync(fullPath);\n // Skip very large files\n if (stat.size > 32768) continue;\n // Skip binary files\n if (isBinary(fullPath)) continue;\n\n const content = fs.readFileSync(fullPath, \"utf-8\");\n const sizeBytes = Buffer.byteLength(content);\n\n if (totalSize + sizeBytes > maxBudget) continue;\n\n seenPaths.add(match);\n totalSize += sizeBytes;\n sampled.push({ path: match, content, priority, sizeBytes });\n } catch {\n // Skip unreadable files\n }\n }\n }\n }\n\n return sampled;\n}\n\nfunction isBinary(filePath: string): boolean {\n const binaryExts = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".ico\", \".svg\",\n \".woff\", \".woff2\", \".ttf\", \".eot\",\n \".zip\", \".tar\", \".gz\", \".bz2\",\n \".pdf\", \".doc\", \".docx\",\n \".exe\", \".dll\", \".so\", \".dylib\",\n \".lock\", \".lockb\",\n ]);\n return binaryExts.has(path.extname(filePath).toLowerCase());\n}\n","import type { AnalysisResult } from \"./types\";\nimport type { AgentseedConfig } from \"../config/schema\";\nimport { detectLanguages } from \"./language-detector\";\nimport { detectFrameworks } from \"./framework-detector\";\nimport { extractCommands } from \"./command-extractor\";\nimport { mapStructure } from \"./structure-mapper\";\nimport { detectPatterns } from \"./pattern-detector\";\nimport { sampleFiles } from \"./file-sampler\";\nimport { logger } from \"../utils/logger\";\n\nexport async function analyze(\n rootDir: string,\n config: AgentseedConfig\n): Promise<AnalysisResult> {\n logger.debug(`Analyzing ${rootDir}...`);\n\n const [languages, frameworks, commands, structure, patterns] =\n await Promise.all([\n detectLanguages(rootDir, config.ignore),\n detectFrameworks(rootDir),\n extractCommands(rootDir),\n mapStructure(rootDir, config.ignore),\n detectPatterns(rootDir, config.ignore),\n ]);\n\n logger.debug(`Found ${languages.length} languages, ${frameworks.length} frameworks`);\n\n // Only sample files if LLM pass is enabled\n let sampledFiles: AnalysisResult[\"sampledFiles\"] = [];\n if (!config.noLlm) {\n sampledFiles = await sampleFiles(\n rootDir,\n config.ignore,\n structure,\n config.maxFiles,\n config.maxTokenBudget\n );\n logger.debug(`Sampled ${sampledFiles.length} files for LLM`);\n }\n\n return { languages, frameworks, commands, structure, patterns, sampledFiles };\n}\n\nexport type { AnalysisResult } from \"./types\";\n","import type { LLMRequest, LLMResponse } from \"./types\";\n\nexport abstract class LLMProvider {\n constructor(\n protected model: string,\n protected apiKey?: string\n ) {}\n\n abstract generate(request: LLMRequest): Promise<LLMResponse>;\n\n abstract get name(): string;\n}\n","import { LLMProvider } from \"./base\";\nimport { ProviderError } from \"../utils/errors\";\nimport type { LLMRequest, LLMResponse } from \"./types\";\n\nexport class ClaudeProvider extends LLMProvider {\n get name(): string {\n return \"claude\";\n }\n\n async generate(request: LLMRequest): Promise<LLMResponse> {\n if (!this.apiKey) {\n throw new ProviderError(\n \"ANTHROPIC_API_KEY is required. Set it via environment variable or .agentseedrc config.\",\n \"claude\"\n );\n }\n\n try {\n // Dynamic import to avoid requiring the SDK when not used\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n const client = new Anthropic({ apiKey: this.apiKey });\n\n const message = await client.messages.create({\n model: this.model,\n max_tokens: request.maxTokens ?? 4096,\n ...(request.systemPrompt ? { system: request.systemPrompt } : {}),\n messages: [{ role: \"user\", content: request.prompt }],\n });\n\n const textBlock = message.content.find((b) => b.type === \"text\");\n if (!textBlock || textBlock.type !== \"text\") {\n throw new ProviderError(\"No text response from Claude\", \"claude\");\n }\n\n return {\n content: textBlock.text,\n usage: {\n inputTokens: message.usage.input_tokens,\n outputTokens: message.usage.output_tokens,\n },\n };\n } catch (err) {\n if (err instanceof ProviderError) throw err;\n throw new ProviderError(\n `Claude API error: ${(err as Error).message}`,\n \"claude\"\n );\n }\n }\n}\n","import { LLMProvider } from \"./base\";\nimport { ProviderError } from \"../utils/errors\";\nimport type { LLMRequest, LLMResponse } from \"./types\";\n\nexport class OpenAIProvider extends LLMProvider {\n get name(): string {\n return \"openai\";\n }\n\n async generate(request: LLMRequest): Promise<LLMResponse> {\n if (!this.apiKey) {\n throw new ProviderError(\n \"OPENAI_API_KEY is required. Set it via environment variable or .agentseedrc config.\",\n \"openai\"\n );\n }\n\n try {\n const { default: OpenAI } = await import(\"openai\");\n const client = new OpenAI({ apiKey: this.apiKey });\n\n const messages: Array<{ role: \"system\" | \"user\"; content: string }> = [];\n if (request.systemPrompt) {\n messages.push({ role: \"system\", content: request.systemPrompt });\n }\n messages.push({ role: \"user\", content: request.prompt });\n\n const response = await client.chat.completions.create({\n model: this.model,\n max_tokens: request.maxTokens ?? 4096,\n temperature: request.temperature ?? 0.3,\n messages,\n });\n\n const content = response.choices[0]?.message?.content;\n if (!content) {\n throw new ProviderError(\"No response from OpenAI\", \"openai\");\n }\n\n return {\n content,\n usage: response.usage\n ? {\n inputTokens: response.usage.prompt_tokens,\n outputTokens: response.usage.completion_tokens ?? 0,\n }\n : undefined,\n };\n } catch (err) {\n if (err instanceof ProviderError) throw err;\n throw new ProviderError(\n `OpenAI API error: ${(err as Error).message}`,\n \"openai\"\n );\n }\n }\n}\n","import { LLMProvider } from \"./base\";\nimport { ProviderError } from \"../utils/errors\";\nimport type { LLMRequest, LLMResponse } from \"./types\";\n\nexport class OllamaProvider extends LLMProvider {\n private baseUrl: string;\n\n constructor(model: string, baseUrl: string = \"http://localhost:11434\") {\n super(model);\n this.baseUrl = baseUrl;\n }\n\n get name(): string {\n return \"ollama\";\n }\n\n async generate(request: LLMRequest): Promise<LLMResponse> {\n try {\n const body: Record<string, unknown> = {\n model: this.model,\n prompt: request.prompt,\n stream: false,\n options: {\n num_predict: request.maxTokens ?? 4096,\n temperature: request.temperature ?? 0.3,\n },\n };\n\n if (request.systemPrompt) {\n body.system = request.systemPrompt;\n }\n\n const response = await fetch(`${this.baseUrl}/api/generate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new ProviderError(\n `Ollama returned ${response.status}: ${text}`,\n \"ollama\"\n );\n }\n\n const data = (await response.json()) as {\n response: string;\n eval_count?: number;\n prompt_eval_count?: number;\n };\n\n return {\n content: data.response,\n usage: {\n inputTokens: data.prompt_eval_count ?? 0,\n outputTokens: data.eval_count ?? 0,\n },\n };\n } catch (err) {\n if (err instanceof ProviderError) throw err;\n throw new ProviderError(\n `Ollama error: ${(err as Error).message}. Is Ollama running at ${this.baseUrl}?`,\n \"ollama\"\n );\n }\n }\n}\n","import type { AgentseedConfig } from \"../config/schema\";\nimport type { LLMProvider } from \"./base\";\nimport { ClaudeProvider } from \"./claude\";\nimport { OpenAIProvider } from \"./openai\";\nimport { OllamaProvider } from \"./ollama\";\nimport { ConfigError } from \"../utils/errors\";\n\nexport function createProvider(config: AgentseedConfig): LLMProvider {\n const model = config.model!;\n\n switch (config.provider) {\n case \"claude\":\n return new ClaudeProvider(model, config.apiKey);\n case \"openai\":\n return new OpenAIProvider(model, config.apiKey);\n case \"ollama\":\n return new OllamaProvider(model, config.ollamaUrl);\n default:\n throw new ConfigError(`Unknown provider: ${config.provider}`);\n }\n}\n\nexport type { LLMProvider } from \"./base\";\n","import Handlebars from \"handlebars\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { AnalysisResult } from \"../analyzer/types\";\n\nconst ROOT_TEMPLATE = `You are generating an AGENTS.md file for a code repository. This file helps AI coding agents understand the project.\n\nBased on the analysis and code samples below, generate the content for each section. Be concise and practical - focus on what an AI agent needs to know to work effectively in this codebase.\n\n## Repository Analysis\n\n### Languages\n{{#each languages}}\n- {{name}}: {{percentage}}% ({{fileCount}} files)\n{{/each}}\n\n### Frameworks & Libraries\n{{#each frameworks}}\n- {{name}} ({{category}}, confidence: {{confidence}})\n{{/each}}\n\n### Available Commands\n{{#each commands}}\n- \\`{{command}}\\` ({{name}}, from {{source}})\n{{/each}}\n\n### Project Structure\n- Total files: {{structure.totalFiles}}\n- Total directories: {{structure.totalDirs}}\n- Entry points: {{#each structure.entryPoints}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}\n\n### Detected Patterns\n- Naming convention: {{patterns.namingConvention}}\n- File organization: {{patterns.fileOrganization}}\n- Monorepo: {{patterns.hasMonorepo}}\n- Config files: {{#each patterns.configFiles}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}\n- CI files: {{#each patterns.ciFiles}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}\n\n{{#if sampledFiles.length}}\n### Code Samples\n{{#each sampledFiles}}\n#### {{path}} ({{priority}})\n\\`\\`\\`\n{{{content}}}\n\\`\\`\\`\n\n{{/each}}\n{{/if}}\n\n## Instructions\n\nGenerate EXACTLY these 6 sections in markdown. Each section should be practical and actionable for an AI coding agent:\n\n1. **Project Context** - What this project is (2-3 sentences max)\n2. **Stack** - List of languages, frameworks, and key libraries with versions if detectable\n3. **Commands** - Copy-pasteable commands for build, run, test, lint. Use the exact commands from analysis.\n4. **Conventions** - Naming conventions, file structure patterns, import style, any coding standards\n5. **Architecture** - What lives where, key directories and their purposes, how components connect\n6. **Boundaries** - Rules as three sub-lists:\n - **Always**: Things to always do (e.g., \"run tests before committing\")\n - **Ask first**: Things that need human approval (e.g., \"adding new dependencies\")\n - **Never**: Things to never do (e.g., \"commit secrets or .env files\")\n\nOutput ONLY the markdown content. Do NOT wrap in code blocks. Start directly with the first section heading.`;\n\nconst SUBFOLDER_TEMPLATE = `You are generating a subfolder AGENTS.md file for the {{subfolderPath}} directory in a larger repository.\n\nThis file should ONLY include sections that DIFFER from the root AGENTS.md. If a section is identical to root, omit it entirely.\n\n## Root AGENTS.md\n{{{rootMarkdown}}}\n\n## Subfolder Analysis ({{subfolderPath}})\n\n### Languages\n{{#each languages}}\n- {{name}}: {{percentage}}% ({{fileCount}} files)\n{{/each}}\n\n### Frameworks & Libraries\n{{#each frameworks}}\n- {{name}} ({{category}})\n{{/each}}\n\n### Available Commands\n{{#each commands}}\n- \\`{{command}}\\` ({{name}})\n{{/each}}\n\n### Patterns\n- Naming: {{patterns.namingConvention}}\n- Organization: {{patterns.fileOrganization}}\n\n{{#if sampledFiles.length}}\n### Code Samples\n{{#each sampledFiles}}\n#### {{path}} ({{priority}})\n\\`\\`\\`\n{{{content}}}\n\\`\\`\\`\n\n{{/each}}\n{{/if}}\n\n## Instructions\n\nGenerate markdown with ONLY the sections that differ from the root AGENTS.md. Possible sections:\n1. Project Context - only if this subfolder has a distinctly different purpose\n2. Stack - only if it uses additional/different tech\n3. Commands - only if subfolder has its own commands\n4. Conventions - only if conventions differ from root\n5. Architecture - describe what lives in this subfolder specifically\n6. Boundaries - only if there are additional rules for this subfolder\n\nStart with a one-line note: \"This directory contains [purpose]. See root AGENTS.md for general project info.\"\n\nOutput ONLY the markdown content. Do NOT wrap in code blocks.`;\n\nexport function buildRootPrompt(analysis: AnalysisResult): string {\n const template = Handlebars.compile(ROOT_TEMPLATE);\n return template(analysis);\n}\n\nexport function buildSubfolderPrompt(\n analysis: AnalysisResult,\n rootMarkdown: string,\n subfolderPath: string\n): string {\n const template = Handlebars.compile(SUBFOLDER_TEMPLATE);\n return template({ ...analysis, rootMarkdown, subfolderPath });\n}\n\nexport const SYSTEM_PROMPT =\n \"You are an expert at analyzing codebases and generating clear, concise documentation for AI coding agents. Focus on practical, actionable information.\";\n","import { execSync } from \"node:child_process\";\nimport { logger } from \"./logger\";\n\n/**\n * Get the current HEAD commit SHA for a repo.\n */\nexport function getHeadSha(cwd: string): string | null {\n try {\n return execSync(\"git rev-parse HEAD\", { cwd, encoding: \"utf-8\" }).trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Get the latest commit SHA that touched files in a specific directory.\n * Falls back to HEAD if the path has no commits (new files).\n */\nexport function getPathSha(cwd: string, relativePath: string): string | null {\n try {\n const sha = execSync(\n `git log -1 --format=%H -- \"${relativePath}\"`,\n { cwd, encoding: \"utf-8\" }\n ).trim();\n return sha || getHeadSha(cwd);\n } catch {\n return getHeadSha(cwd);\n }\n}\n\n/**\n * Check if a directory has uncommitted changes (staged or unstaged).\n */\nexport function hasUncommittedChanges(cwd: string, relativePath?: string): boolean {\n try {\n const pathArg = relativePath ? ` -- \"${relativePath}\"` : \"\";\n const status = execSync(`git status --porcelain${pathArg}`, {\n cwd,\n encoding: \"utf-8\",\n }).trim();\n return status.length > 0;\n } catch {\n return true; // Assume changes if git fails\n }\n}\n\n/**\n * Check if the repo is a git repository.\n */\nexport function isGitRepo(cwd: string): boolean {\n try {\n execSync(\"git rev-parse --git-dir\", { cwd, encoding: \"utf-8\" });\n return true;\n } catch {\n return false;\n }\n}\n\n// Metadata tag format embedded in generated files\nconst META_REGEX = /<!-- agentseed:meta (.+?) -->/;\n\nexport interface FileMeta {\n sha: string;\n timestamp: string;\n format: string;\n}\n\n/**\n * Build a metadata comment to embed in generated files.\n */\nexport function buildMetaTag(meta: FileMeta): string {\n const json = JSON.stringify(meta);\n return `<!-- agentseed:meta ${json} -->`;\n}\n\n/**\n * Parse metadata from an existing generated file.\n */\nexport function parseMetaTag(content: string): FileMeta | null {\n const match = content.match(META_REGEX);\n if (!match) return null;\n try {\n return JSON.parse(match[1]) as FileMeta;\n } catch {\n return null;\n }\n}\n\n/**\n * Determine if a generated file needs regeneration.\n * Returns true if:\n * - File doesn't exist\n * - File has no metadata tag\n * - Git SHA has changed since last generation\n * - There are uncommitted changes in the specific path (subfolder only)\n *\n * Note: uncommitted changes are only checked when a relativePath is given.\n * At root level, the generated files themselves appear as uncommitted,\n * causing false positives. The HEAD SHA comparison is sufficient for root.\n */\nexport function needsRegeneration(\n existingContent: string | null,\n currentSha: string | null,\n cwd: string,\n relativePath?: string\n): boolean {\n if (!existingContent || !currentSha) return true;\n\n const meta = parseMetaTag(existingContent);\n if (!meta) return true;\n\n // SHA changed = new commits since last generation\n if (meta.sha !== currentSha) return true;\n\n // Check for uncommitted changes in specific subfolder paths only\n if (relativePath && hasUncommittedChanges(cwd, relativePath)) return true;\n\n return false;\n}\n","import type { AnalysisResult } from \"../analyzer/types\";\nimport type { OutputFormat } from \"./formats\";\nimport { buildMetaTag, type FileMeta } from \"../utils/git\";\n\n/**\n * Renders LLM-generated or static content into tool-specific formats.\n * Each format wraps the same core content with tool-specific conventions.\n * Optionally embeds a metadata tag for incremental update tracking.\n */\nexport function renderForFormat(\n format: Exclude<OutputFormat, \"all\">,\n analysis: AnalysisResult,\n coreContent: string,\n subfolderPath?: string,\n meta?: FileMeta\n): string {\n let output: string;\n switch (format) {\n case \"agents\":\n output = renderAgentsMd(coreContent, subfolderPath);\n break;\n case \"claude\":\n output = renderClaudeMd(coreContent, analysis, subfolderPath);\n break;\n case \"cursor\":\n output = renderCursorRules(coreContent, analysis);\n break;\n case \"copilot\":\n output = renderCopilotInstructions(coreContent, analysis);\n break;\n case \"windsurf\":\n output = renderWindsurfRules(coreContent, analysis);\n break;\n }\n\n // Append metadata tag for incremental update tracking\n if (meta) {\n output = output.trimEnd() + \"\\n\\n\" + buildMetaTag(meta) + \"\\n\";\n }\n\n return output;\n}\n\n// --- AGENTS.md (universal) ---\nfunction renderAgentsMd(content: string, subfolderPath?: string): string {\n const lines: string[] = [];\n if (subfolderPath) {\n lines.push(`> Scoped context for \\`${subfolderPath}\\`. See root AGENTS.md for general project info.`);\n lines.push(\"\");\n }\n lines.push(content.trim());\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n// --- CLAUDE.md ---\n// Claude Code reads CLAUDE.md automatically. Supports full markdown.\n// Best practices: keep under 300 lines, be specific, use code blocks for commands.\nfunction renderClaudeMd(\n content: string,\n analysis: AnalysisResult,\n subfolderPath?: string\n): string {\n const lines: string[] = [];\n\n if (subfolderPath) {\n lines.push(`> Context for \\`${subfolderPath}\\`. See root CLAUDE.md for general rules.`);\n lines.push(\"\");\n }\n\n lines.push(content.trim());\n lines.push(\"\");\n\n // Claude Code benefits from explicit command blocks\n if (analysis.commands.length > 0) {\n // Check if Commands section already exists in content\n if (!content.includes(\"## Commands\")) {\n lines.push(\"## Quick Reference Commands\");\n lines.push(\"\");\n lines.push(\"```bash\");\n for (const cmd of analysis.commands.slice(0, 8)) {\n lines.push(`${cmd.command} # ${cmd.name}`);\n }\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// --- .cursorrules ---\n// Cursor: plain text instructions. Concise rules format.\n// Focus on do/don't rules, conventions, and preferences.\nfunction renderCursorRules(\n content: string,\n analysis: AnalysisResult\n): string {\n const lines: string[] = [];\n\n lines.push(\"# Project Rules\");\n lines.push(\"\");\n\n // Extract and reformat for Cursor's rule-oriented style\n lines.push(content.trim());\n lines.push(\"\");\n\n // Add explicit technology context that Cursor uses for completions\n if (analysis.frameworks.length > 0) {\n const techList = analysis.frameworks.map((f) => f.name).join(\", \");\n if (!content.includes(\"## Stack\") && !content.includes(\"## Tech\")) {\n lines.push(\"## Tech Stack Context\");\n lines.push(\"\");\n lines.push(`This project uses: ${techList}`);\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// --- .github/copilot-instructions.md ---\n// GitHub Copilot: markdown, max ~4000 chars recommended.\n// Each instruction should be a self-contained statement.\nfunction renderCopilotInstructions(\n content: string,\n analysis: AnalysisResult\n): string {\n const lines: string[] = [];\n\n lines.push(\"<!-- GitHub Copilot Custom Instructions -->\");\n lines.push(\"<!-- See: https://docs.github.com/copilot/customizing-copilot -->\");\n lines.push(\"\");\n lines.push(content.trim());\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n// --- .windsurfrules ---\n// Windsurf: plain markdown, max 12,000 chars.\n// Supports XML-style tags for grouping.\nfunction renderWindsurfRules(\n content: string,\n analysis: AnalysisResult\n): string {\n const lines: string[] = [];\n\n lines.push(content.trim());\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","import type { AnalysisResult } from \"../analyzer/types\";\n\n// Well-known directory descriptions\nconst DIR_DESCRIPTIONS: Record<string, string> = {\n src: \"Source code\",\n lib: \"Library code\",\n app: \"Application code\",\n bin: \"CLI entry points / executables\",\n dist: \"Build output\",\n build: \"Build output\",\n out: \"Build output\",\n tests: \"Test files\",\n test: \"Test files\",\n __tests__: \"Test files\",\n spec: \"Test specifications\",\n docs: \"Documentation\",\n doc: \"Documentation\",\n config: \"Configuration files\",\n scripts: \"Build/automation scripts\",\n public: \"Static public assets\",\n static: \"Static assets\",\n assets: \"Project assets\",\n styles: \"Stylesheets\",\n components: \"UI components\",\n pages: \"Page components / routes\",\n routes: \"Route handlers\",\n api: \"API endpoints\",\n middleware: \"Middleware functions\",\n middlewares: \"Middleware functions\",\n utils: \"Utility functions\",\n helpers: \"Helper functions\",\n hooks: \"Custom hooks\",\n types: \"Type definitions\",\n models: \"Data models / dbt models\",\n services: \"Service layer\",\n controllers: \"Request handlers\",\n schemas: \"Validation / schema definitions\",\n migrations: \"Database migrations\",\n fixtures: \"Test fixtures / seed data\",\n packages: \"Monorepo packages\",\n apps: \"Monorepo applications\",\n plugins: \"Plugin modules\",\n adapters: \"Platform adapters\",\n adapter: \"Platform adapters\",\n router: \"Routing logic\",\n routers: \"Routing logic\",\n client: \"Client-side code\",\n server: \"Server-side code\",\n benchmarks: \"Performance benchmarks\",\n examples: \"Example code\",\n templates: \"Template files\",\n i18n: \"Internationalization\",\n locales: \"Locale files\",\n dags: \"Airflow DAG definitions\",\n pipelines: \"Data pipelines\",\n etl: \"ETL jobs\",\n sql: \"SQL queries / scripts\",\n queries: \"SQL queries\",\n macros: \"dbt macros / reusable SQL\",\n seeds: \"dbt seed data (CSV)\",\n snapshots: \"dbt snapshots\",\n analyses: \"dbt ad-hoc analyses\",\n transforms: \"Data transformations\",\n warehouse: \"Data warehouse definitions\",\n staging: \"Staging layer models\",\n marts: \"Data mart models\",\n raw: \"Raw data ingestion\",\n alembic: \"Alembic migration scripts\",\n notebooks: \"Jupyter / data notebooks\",\n data: \"Data files\",\n jobs: \"Scheduled jobs / tasks\",\n connectors: \"Data source connectors\",\n};\n\n/**\n * Renders format-agnostic core content from analysis results.\n * If llmContent is provided, returns it directly.\n * Otherwise, renders from static analysis.\n */\nexport function renderCoreContent(\n analysis: AnalysisResult,\n llmContent: string | null,\n subfolderPath?: string\n): string {\n if (llmContent) {\n return llmContent.trim();\n }\n return renderStaticContent(analysis, subfolderPath);\n}\n\n/**\n * Legacy wrapper: renders AGENTS.md with header/footer.\n * Used by tests and backward-compat code paths.\n */\nexport function renderMarkdown(\n analysis: AnalysisResult,\n llmContent: string | null,\n subfolderPath?: string\n): string {\n const core = renderCoreContent(analysis, llmContent, subfolderPath);\n return core;\n}\n\nfunction renderStaticContent(\n analysis: AnalysisResult,\n subfolderPath?: string\n): string {\n const lines: string[] = [];\n\n // Project Context\n lines.push(\"## Project Context\");\n lines.push(\"\");\n if (analysis.languages.length > 0) {\n const primary = analysis.languages[0].name;\n const frameworks = analysis.frameworks\n .filter((f) => f.category === \"web\" || f.category === \"api\")\n .map((f) => f.name);\n const extras: string[] = [];\n if (analysis.patterns.hasMonorepo) extras.push(\"monorepo\");\n if (analysis.patterns.fileOrganization !== \"flat\") {\n extras.push(`${analysis.patterns.fileOrganization} architecture`);\n }\n const suffix = extras.length > 0 ? ` Uses ${extras.join(\", \")}.` : \"\";\n\n if (frameworks.length > 0) {\n lines.push(\n `A ${primary} project using ${frameworks.join(\", \")}. ` +\n `Contains ${analysis.structure.totalFiles} files across ${analysis.structure.totalDirs} directories.${suffix}`\n );\n } else {\n lines.push(\n `A ${primary} project with ${analysis.structure.totalFiles} files across ${analysis.structure.totalDirs} directories.${suffix}`\n );\n }\n } else {\n lines.push(\"Project details could not be determined from static analysis alone.\");\n }\n lines.push(\"\");\n\n // Stack\n lines.push(\"## Stack\");\n lines.push(\"\");\n if (analysis.languages.length > 0) {\n lines.push(\"**Languages:**\");\n for (const lang of analysis.languages.slice(0, 5)) {\n lines.push(`- ${lang.name} (${lang.percentage}%)`);\n }\n lines.push(\"\");\n }\n if (analysis.frameworks.length > 0) {\n lines.push(\"**Frameworks & Tools:**\");\n for (const fw of analysis.frameworks) {\n lines.push(`- ${fw.name} (${fw.category})`);\n }\n lines.push(\"\");\n }\n\n // Commands\n lines.push(\"## Commands\");\n lines.push(\"\");\n if (analysis.commands.length > 0) {\n lines.push(\"```bash\");\n for (const cmd of analysis.commands) {\n lines.push(`${cmd.command} # ${cmd.name}`);\n }\n lines.push(\"```\");\n } else {\n lines.push(\"No commands detected. Check project documentation for build/run instructions.\");\n }\n lines.push(\"\");\n\n // Conventions\n lines.push(\"## Conventions\");\n lines.push(\"\");\n lines.push(`- **Naming**: ${analysis.patterns.namingConvention}`);\n lines.push(`- **File organization**: ${analysis.patterns.fileOrganization}`);\n if (analysis.patterns.hasMonorepo) {\n lines.push(\"- **Monorepo**: Yes\");\n }\n if (analysis.patterns.configFiles.length > 0) {\n lines.push(`- **Config files**: ${analysis.patterns.configFiles.join(\", \")}`);\n }\n if (analysis.patterns.ciFiles.length > 0) {\n lines.push(`- **CI/CD**: ${analysis.patterns.ciFiles.join(\", \")}`);\n }\n lines.push(\"\");\n\n // Architecture\n lines.push(\"## Architecture\");\n lines.push(\"\");\n if (analysis.structure.entryPoints.length > 0) {\n lines.push(`**Entry points:** ${analysis.structure.entryPoints.join(\", \")}`);\n lines.push(\"\");\n }\n lines.push(\"**Key directories:**\");\n const topDirs = analysis.structure.tree\n .filter((e) => e.type === \"directory\" && e.depth === 0)\n .slice(0, 15);\n for (const dir of topDirs) {\n const dirName = dir.path.replace(/\\/$/, \"\");\n const desc = DIR_DESCRIPTIONS[dirName];\n if (desc) {\n lines.push(`- \\`${dirName}/\\` - ${desc}`);\n } else {\n lines.push(`- \\`${dirName}/\\``);\n }\n }\n lines.push(\"\");\n\n // Boundaries\n lines.push(\"## Boundaries\");\n lines.push(\"\");\n lines.push(\"**Always:**\");\n\n const testCmd = analysis.commands.find((c) => c.name === \"test\");\n if (testCmd) {\n lines.push(`- Run \\`${testCmd.command}\\` before committing changes`);\n } else {\n lines.push(\"- Run existing tests before committing changes\");\n }\n\n const lintCmd = analysis.commands.find(\n (c) => c.name === \"lint\" || c.name === \"check\" || c.name === \"typecheck\"\n );\n if (lintCmd) {\n lines.push(`- Run \\`${lintCmd.command}\\` before committing`);\n }\n\n lines.push(`- Follow ${analysis.patterns.namingConvention} naming convention`);\n lines.push(`- Follow ${analysis.patterns.fileOrganization} file organization`);\n lines.push(\"\");\n\n lines.push(\"**Ask first:**\");\n lines.push(\"- Adding new dependencies\");\n lines.push(\"- Changing project configuration files\");\n if (analysis.patterns.ciFiles.length > 0) {\n lines.push(\"- Modifying CI/CD pipelines\");\n }\n if (analysis.patterns.hasMonorepo) {\n lines.push(\"- Adding new packages/workspaces\");\n }\n lines.push(\"\");\n\n lines.push(\"**Never:**\");\n lines.push(\"- Commit secrets, API keys, or .env files\");\n lines.push(\"- Delete or overwrite test files without understanding them\");\n lines.push(\"- Force push to main/master branch\");\n if (analysis.patterns.hasMonorepo) {\n lines.push(\"- Make cross-package changes without checking downstream effects\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { logger } from \"./logger\";\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n maxAttempts: number = 3,\n baseDelayMs: number = 1000\n): Promise<T> {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n const message = (err as Error).message ?? String(err);\n const isRetryable =\n message.includes(\"rate_limit\") ||\n message.includes(\"429\") ||\n message.includes(\"500\") ||\n message.includes(\"502\") ||\n message.includes(\"503\") ||\n message.includes(\"overloaded\") ||\n message.includes(\"ECONNRESET\") ||\n message.includes(\"ETIMEDOUT\");\n\n if (!isRetryable || attempt === maxAttempts) {\n throw err;\n }\n\n const delay = baseDelayMs * Math.pow(2, attempt - 1);\n logger.warn(`Attempt ${attempt}/${maxAttempts} failed, retrying in ${delay}ms...`);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n // Unreachable, but TypeScript needs it\n throw new Error(\"Retry exhausted\");\n}\n","import type { AnalysisResult } from \"../analyzer/types\";\nimport type { AgentseedConfig } from \"../config/schema\";\nimport type { LLMResponse } from \"../providers/types\";\nimport type { OutputFormat } from \"./formats\";\nimport { createProvider } from \"../providers\";\nimport {\n buildRootPrompt,\n buildSubfolderPrompt,\n SYSTEM_PROMPT,\n} from \"./prompt-builder\";\nimport { renderForFormat } from \"./format-renderer\";\nimport { renderCoreContent } from \"./markdown-renderer\";\nimport { logger } from \"../utils/logger\";\nimport { withRetry } from \"../utils/retry\";\n\ninterface SubfolderContext {\n rootAnalysis: AnalysisResult;\n subfolderPath: string;\n}\n\nexport interface GenerateResult {\n /** Core content (format-agnostic) */\n coreContent: string;\n /** Formatted output for the requested format */\n formatted: string;\n usage?: LLMResponse[\"usage\"];\n}\n\n/**\n * Generates core content via LLM, then renders it for the specified format.\n */\nexport async function generate(\n rootDir: string,\n analysis: AnalysisResult,\n config: AgentseedConfig,\n format: Exclude<OutputFormat, \"all\">,\n subfolderCtx?: SubfolderContext\n): Promise<GenerateResult> {\n const provider = createProvider(config);\n\n let prompt: string;\n if (subfolderCtx) {\n const rootContent = renderCoreContent(subfolderCtx.rootAnalysis, null);\n prompt = buildSubfolderPrompt(\n analysis,\n rootContent,\n subfolderCtx.subfolderPath\n );\n } else {\n prompt = buildRootPrompt(analysis);\n }\n\n logger.debug(`Sending prompt to ${provider.name} (${config.model})`);\n\n const response = await withRetry(() =>\n provider.generate({\n prompt,\n systemPrompt: SYSTEM_PROMPT,\n maxTokens: 4096,\n temperature: 0.3,\n })\n );\n\n if (response.usage) {\n logger.debug(\n `Tokens: ${response.usage.inputTokens} in, ${response.usage.outputTokens} out`\n );\n }\n\n const coreContent = response.content;\n const formatted = renderForFormat(\n format,\n analysis,\n coreContent,\n subfolderCtx?.subfolderPath\n );\n\n return { coreContent, formatted, usage: response.usage };\n}\n\n/**\n * Generates static-only content (no LLM) for the specified format.\n */\nexport function generateStatic(\n analysis: AnalysisResult,\n format: Exclude<OutputFormat, \"all\">,\n subfolderPath?: string\n): string {\n const coreContent = renderCoreContent(analysis, null, subfolderPath);\n return renderForFormat(format, analysis, coreContent, subfolderPath);\n}\n","import { createSpinner } from \"nanospinner\";\n\nexport function withSpinner<T>(text: string, fn: () => Promise<T>): Promise<T> {\n const spinner = createSpinner(text).start();\n return fn().then(\n (result) => {\n spinner.success();\n return result;\n },\n (err) => {\n spinner.error();\n throw err;\n }\n );\n}\n","import pc from \"picocolors\";\nimport { logger } from \"./logger\";\n\n// Approximate pricing per 1M tokens (USD) as of 2025\nconst PRICING: Record<string, { input: number; output: number }> = {\n \"claude-sonnet-4-5-20250929\": { input: 3, output: 15 },\n \"claude-haiku-4-5-20251001\": { input: 0.8, output: 4 },\n \"gpt-4o\": { input: 2.5, output: 10 },\n \"gpt-4o-mini\": { input: 0.15, output: 0.6 },\n};\n\ninterface UsageEntry {\n inputTokens: number;\n outputTokens: number;\n}\n\nexport class UsageTracker {\n private entries: UsageEntry[] = [];\n private model: string;\n\n constructor(model: string) {\n this.model = model;\n }\n\n add(usage?: { inputTokens: number; outputTokens: number }): void {\n if (usage) {\n this.entries.push(usage);\n }\n }\n\n get totalInput(): number {\n return this.entries.reduce((sum, e) => sum + e.inputTokens, 0);\n }\n\n get totalOutput(): number {\n return this.entries.reduce((sum, e) => sum + e.outputTokens, 0);\n }\n\n get callCount(): number {\n return this.entries.length;\n }\n\n printSummary(): void {\n if (this.entries.length === 0) return;\n\n const input = this.totalInput;\n const output = this.totalOutput;\n const total = input + output;\n\n const pricing = PRICING[this.model];\n let costStr = \"\";\n if (pricing) {\n const cost =\n (input / 1_000_000) * pricing.input +\n (output / 1_000_000) * pricing.output;\n costStr = ` (~$${cost.toFixed(4)})`;\n }\n\n logger.info(\n pc.gray(\n `\\nLLM usage: ${this.entries.length} call(s), ` +\n `${input.toLocaleString()} input + ${output.toLocaleString()} output = ` +\n `${total.toLocaleString()} tokens${costStr}`\n )\n );\n }\n}\n","export type OutputFormat = \"agents\" | \"claude\" | \"cursor\" | \"copilot\" | \"windsurf\" | \"all\";\n\nexport const FORMATS: Record<Exclude<OutputFormat, \"all\">, FormatConfig> = {\n agents: {\n name: \"AGENTS.md\",\n outputPath: \"AGENTS.md\",\n description: \"Universal format (GitHub Copilot, Codex, Gemini CLI, Cursor, 20+ tools)\",\n },\n claude: {\n name: \"CLAUDE.md\",\n outputPath: \"CLAUDE.md\",\n description: \"Claude Code\",\n },\n cursor: {\n name: \".cursorrules\",\n outputPath: \".cursorrules\",\n description: \"Cursor IDE\",\n },\n copilot: {\n name: \"copilot-instructions.md\",\n outputPath: \".github/copilot-instructions.md\",\n description: \"GitHub Copilot\",\n },\n windsurf: {\n name: \".windsurfrules\",\n outputPath: \".windsurfrules\",\n description: \"Windsurf / Codeium\",\n },\n};\n\nexport interface FormatConfig {\n name: string;\n outputPath: string;\n description: string;\n}\n\nexport function resolveFormats(format: OutputFormat): (Exclude<OutputFormat, \"all\">)[] {\n if (format === \"all\") {\n return [\"agents\", \"claude\", \"cursor\", \"copilot\", \"windsurf\"];\n }\n return [format];\n}\n","import * as path from \"node:path\";\nimport pc from \"picocolors\";\nimport { logger, setLogLevel } from \"../utils/logger\";\nimport { loadConfig } from \"../config/loader\";\nimport { analyze } from \"../analyzer\";\nimport { generate } from \"../generator\";\nimport { detectSubfolders } from \"../scanner\";\nimport { writeFileSync, fileExists, readFileSync } from \"../utils/fs\";\nimport { withSpinner } from \"../utils/spinner\";\nimport { computeSubfolderDelta } from \"../generator/subfolder-differ\";\nimport { renderCoreContent } from \"../generator/markdown-renderer\";\nimport { renderForFormat } from \"../generator/format-renderer\";\nimport { UsageTracker } from \"../utils/usage-tracker\";\nimport { FORMATS, resolveFormats, type OutputFormat } from \"../generator/formats\";\nimport {\n isGitRepo,\n getHeadSha,\n getPathSha,\n needsRegeneration,\n type FileMeta,\n} from \"../utils/git\";\n\ninterface ScanOptions {\n dryRun?: boolean;\n format: string;\n provider?: string;\n model?: string;\n force?: boolean;\n verbose?: boolean;\n}\n\nexport async function scanCommand(\n targetPath: string,\n options: ScanOptions\n): Promise<void> {\n if (options.verbose) setLogLevel(\"debug\");\n\n const rootDir = path.resolve(targetPath);\n const format = options.format as OutputFormat;\n const formats = resolveFormats(format);\n const useLlm = !!options.provider;\n\n logger.info(pc.bold(\"agentseed scan\"), pc.gray(`(${rootDir})`));\n logger.info(\n pc.gray(`Formats: ${formats.map((f) => FORMATS[f].name).join(\", \")}`)\n );\n\n try {\n const config = await loadConfig(rootDir, {\n provider: options.provider,\n model: options.model,\n noLlm: !useLlm,\n });\n\n const tracker = new UsageTracker(config.model!);\n\n // Git context\n const gitRepo = isGitRepo(rootDir);\n const rootSha = gitRepo ? getHeadSha(rootDir) : null;\n\n // Analyze root\n const rootAnalysis = await withSpinner(\"Analyzing root...\", () =>\n analyze(rootDir, config)\n );\n\n // Build root metadata\n const rootMeta: FileMeta | undefined =\n gitRepo && rootSha\n ? {\n sha: rootSha,\n timestamp: new Date().toISOString(),\n format: \"agentseed-v1\",\n }\n : undefined;\n\n // Generate root core content\n let rootCoreContent: string;\n\n // Check if root needs regeneration\n let rootNeedsRegen = true;\n if (!options.force && !options.dryRun && gitRepo && rootSha) {\n rootNeedsRegen = formats.some((fmt) => {\n const outPath = path.join(rootDir, FORMATS[fmt].outputPath);\n if (!fileExists(outPath)) return true;\n const existing = readFileSync(outPath);\n return needsRegeneration(existing, rootSha, rootDir);\n });\n }\n\n if (!rootNeedsRegen) {\n logger.info(pc.gray(\"Root files are up to date, skipping analysis\"));\n // Still need core content for subfolder diffing — read from existing file\n const agentsPath = path.join(rootDir, FORMATS.agents.outputPath);\n rootCoreContent = fileExists(agentsPath) ? readFileSync(agentsPath) : \"\";\n } else if (config.noLlm) {\n rootCoreContent = renderCoreContent(rootAnalysis, null);\n } else {\n const result = await withSpinner(\"Generating root with LLM...\", () =>\n generate(rootDir, rootAnalysis, config, formats[0])\n );\n rootCoreContent = result.coreContent;\n tracker.add(result.usage);\n }\n\n // Detect subfolders\n const subfolders = await withSpinner(\"Detecting subfolders...\", () =>\n detectSubfolders(rootDir)\n );\n\n if (options.dryRun) {\n for (const fmt of formats) {\n const formatted = renderForFormat(fmt, rootAnalysis, rootCoreContent);\n logger.info(pc.bold(`\\n--- Root ${FORMATS[fmt].name} ---\\n`));\n logger.info(formatted);\n }\n logger.info(pc.bold(`\\nDetected ${subfolders.length} subfolder(s):`));\n for (const sf of subfolders) {\n logger.info(` ${pc.cyan(sf.relativePath)} - ${sf.reason}`);\n }\n if (!config.noLlm) tracker.printSummary();\n return;\n }\n\n // Write root files (if needed)\n if (rootNeedsRegen) {\n for (const fmt of formats) {\n const formatted = renderForFormat(\n fmt,\n rootAnalysis,\n rootCoreContent,\n undefined,\n rootMeta\n );\n writeFileSync(path.join(rootDir, FORMATS[fmt].outputPath), formatted);\n }\n logger.success(\n `Root files written (${formats.map((f) => FORMATS[f].name).join(\", \")})`\n );\n }\n\n // Process each subfolder\n const total = subfolders.length;\n let sfWritten = 0;\n let sfSkipped = 0;\n\n for (let i = 0; i < total; i++) {\n const sf = subfolders[i];\n const progress = pc.gray(`[${i + 1}/${total}]`);\n const sfDir = path.join(rootDir, sf.relativePath);\n\n // Per-subfolder staleness check using path-specific SHA\n const sfSha = gitRepo\n ? getPathSha(rootDir, sf.relativePath)\n : null;\n\n if (!options.force && gitRepo && sfSha) {\n const sfAllFresh = formats.every((fmt) => {\n const outPath = path.join(sfDir, FORMATS[fmt].outputPath);\n if (!fileExists(outPath)) return false;\n const existing = readFileSync(outPath);\n return !needsRegeneration(existing, sfSha, rootDir, sf.relativePath);\n });\n\n if (sfAllFresh) {\n logger.info(\n `${progress} ${pc.gray(sf.relativePath + \"/\")} ${pc.yellow(\"unchanged, skipping\")}`\n );\n sfSkipped++;\n continue;\n }\n }\n\n const sfMeta: FileMeta | undefined =\n gitRepo && sfSha\n ? {\n sha: sfSha,\n timestamp: new Date().toISOString(),\n format: \"agentseed-v1\",\n }\n : undefined;\n\n const sfAnalysis = await analyze(sfDir, config);\n\n let sfCoreContent: string;\n if (config.noLlm) {\n const delta = computeSubfolderDelta(rootAnalysis, sfAnalysis);\n sfCoreContent = renderCoreContent(delta, null, sf.relativePath);\n } else {\n const result = await withSpinner(\n `${progress} Generating ${sf.relativePath}...`,\n () =>\n generate(sfDir, sfAnalysis, config, formats[0], {\n rootAnalysis,\n subfolderPath: sf.relativePath,\n })\n );\n sfCoreContent = result.coreContent;\n tracker.add(result.usage);\n }\n\n for (const fmt of formats) {\n const formatted = renderForFormat(\n fmt,\n sfAnalysis,\n sfCoreContent,\n sf.relativePath,\n sfMeta\n );\n writeFileSync(\n path.join(sfDir, FORMATS[fmt].outputPath),\n formatted\n );\n }\n logger.success(`${progress} ${sf.relativePath}/ files written`);\n sfWritten++;\n }\n\n if (sfSkipped > 0) {\n logger.info(\n pc.gray(\n `${sfSkipped} subfolder(s) skipped (unchanged). Use --force to regenerate all.`\n )\n );\n }\n\n if (!config.noLlm) tracker.printSummary();\n } catch (err) {\n logger.error((err as Error).message);\n process.exitCode = 1;\n }\n}\n","import * as path from \"node:path\";\nimport fg from \"fast-glob\";\nimport { shouldHaveAgentsMd, type SubfolderCandidate } from \"./heuristics\";\nimport { logger } from \"../utils/logger\";\n\nexport async function detectSubfolders(\n rootDir: string\n): Promise<SubfolderCandidate[]> {\n // Look for candidate directories (depth 1-3)\n const dirs = await fg(\"**/\", {\n cwd: rootDir,\n onlyDirectories: true,\n deep: 3,\n ignore: [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/__pycache__/**\",\n \"**/vendor/**\",\n \"**/target/**\",\n ],\n });\n\n const candidates: SubfolderCandidate[] = [];\n\n for (const dir of dirs) {\n const fullPath = path.join(rootDir, dir);\n const result = await shouldHaveAgentsMd(rootDir, fullPath);\n if (result) {\n candidates.push(result);\n logger.debug(`Subfolder candidate: ${result.relativePath} (${result.reason})`);\n }\n }\n\n return candidates;\n}\n\nexport type { SubfolderCandidate } from \"./heuristics\";\n","import * as path from \"node:path\";\nimport fg from \"fast-glob\";\nimport { fileExists } from \"../utils/fs\";\n\nconst CONFIG_INDICATORS = [\n \"package.json\",\n \"Cargo.toml\",\n \"go.mod\",\n \"pyproject.toml\",\n \"setup.py\",\n \"Gemfile\",\n \"composer.json\",\n \"pom.xml\",\n \"build.gradle\",\n];\n\nconst MIN_FILE_COUNT = 5;\n\nexport interface SubfolderCandidate {\n relativePath: string;\n reason: string;\n}\n\n/**\n * Determines if a directory qualifies as a subfolder that should get its own AGENTS.md.\n */\nexport async function shouldHaveAgentsMd(\n rootDir: string,\n dirPath: string\n): Promise<SubfolderCandidate | null> {\n const relativePath = path.relative(rootDir, dirPath).replace(/\\\\/g, \"/\");\n\n // Check for own config file\n for (const config of CONFIG_INDICATORS) {\n if (fileExists(path.join(dirPath, config))) {\n return { relativePath, reason: `Has own ${config}` };\n }\n }\n\n // Check file count\n const files = await fg(\"**/*\", {\n cwd: dirPath,\n onlyFiles: true,\n ignore: [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/build/**\"],\n deep: 3,\n });\n\n if (files.length < MIN_FILE_COUNT) {\n return null;\n }\n\n // Recognized structure patterns\n const parts = relativePath.split(\"/\");\n const parentDir = parts[0];\n const recognizedParents = [\n \"packages\", \"apps\", \"services\", \"libs\", \"modules\",\n \"src/features\", \"src/modules\", \"src/apps\",\n \"runtime-tests\", \"benchmarks\", \"examples\", \"plugins\",\n \"tools\", \"crates\", \"internal\",\n ];\n\n for (const rp of recognizedParents) {\n if (relativePath.startsWith(rp + \"/\") && parts.length === rp.split(\"/\").length + 1) {\n return { relativePath, reason: `Recognized pattern: ${rp}/*` };\n }\n }\n\n // Fallback: any directory with its own config and enough files is a candidate\n if (files.length >= 10) {\n return { relativePath, reason: `Standalone directory (${files.length} files)` };\n }\n\n return null;\n}\n","import type { AnalysisResult } from \"../analyzer/types\";\n\n/**\n * Computes the delta between root analysis and subfolder analysis.\n * Returns a modified AnalysisResult that only contains sections that differ.\n */\nexport function computeSubfolderDelta(\n root: AnalysisResult,\n subfolder: AnalysisResult\n): AnalysisResult {\n const rootLangs = new Set(root.languages.map((l) => l.name));\n const rootFws = new Set(root.frameworks.map((f) => f.name));\n const rootCmds = new Set(root.commands.map((c) => c.command));\n\n // Only include languages not dominant in root\n const diffLanguages = subfolder.languages.filter(\n (l) => !rootLangs.has(l.name) || l.percentage > 50\n );\n\n // Only include frameworks not already in root\n const diffFrameworks = subfolder.frameworks.filter(\n (f) => !rootFws.has(f.name)\n );\n\n // Only include commands not in root\n const diffCommands = subfolder.commands.filter(\n (c) => !rootCmds.has(c.command)\n );\n\n return {\n languages: diffLanguages.length > 0 ? diffLanguages : subfolder.languages,\n frameworks: diffFrameworks,\n commands: diffCommands,\n structure: subfolder.structure,\n patterns: subfolder.patterns,\n sampledFiles: subfolder.sampledFiles,\n };\n}\n"],"mappings":"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","names":["path","import_picocolors","pc","path","readFileSync","writeFileSync","readFileSync","YAML","path","fg","path","readFileSync","path","readFileSync","import_fast_glob","fg","import_fast_glob","path","CONFIG_FILES","fg","import_fast_glob","path","fs","fg","Handlebars","resolve","import_picocolors","pc","pc","readFileSync","writeFileSync","path","import_picocolors","path","import_fast_glob","path","import_fast_glob","fg","fg","pc","readFileSync","writeFileSync"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentseed",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "The best AGENTS.md generator. Analyze your codebase, seed AI agents with context.",
|
|
5
|
+
"main": "dist/cli.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"agentseed": "./bin/agentseed.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"bin"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsup",
|
|
15
|
+
"dev": "tsup --watch",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"lint": "tsc --noEmit",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"agents",
|
|
23
|
+
"agents-md",
|
|
24
|
+
"agentsmd",
|
|
25
|
+
"ai",
|
|
26
|
+
"cli",
|
|
27
|
+
"codegen",
|
|
28
|
+
"context",
|
|
29
|
+
"cursor",
|
|
30
|
+
"copilot",
|
|
31
|
+
"claude",
|
|
32
|
+
"documentation"
|
|
33
|
+
],
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/avinshe/agentseed.git"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/avinshe/agentseed#readme",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/avinshe/agentseed/issues"
|
|
41
|
+
},
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=18"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
48
|
+
"commander": "^13.1.0",
|
|
49
|
+
"fast-glob": "^3.3.3",
|
|
50
|
+
"handlebars": "^4.7.8",
|
|
51
|
+
"nanospinner": "^1.2.2",
|
|
52
|
+
"openai": "^4.85.4",
|
|
53
|
+
"picocolors": "^1.1.1",
|
|
54
|
+
"yaml": "^2.7.0",
|
|
55
|
+
"zod": "^3.24.2"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/node": "^22.13.1",
|
|
59
|
+
"tsup": "^8.3.6",
|
|
60
|
+
"typescript": "^5.7.3",
|
|
61
|
+
"vitest": "^3.0.5"
|
|
62
|
+
}
|
|
63
|
+
}
|