@amit641/testpilot-ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/frameworks/index.ts","../src/types.ts","../src/config/index.ts","../src/analyzer/index.ts","../src/analyzer/context.ts","../src/prompt/index.ts","../src/llm/index.ts","../src/writer/index.ts","../src/verify/runner.ts","../src/verify/fixer.ts","../src/verify/index.ts","../src/generate.ts","../src/coverage/index.ts","../src/cli.ts"],"names":["readFileSync","exports","resolve","existsSync","extname","response","dirname","basename","parseTestOutput","ai","pc","writeFileSync","join"],"mappings":"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","file":"cli.js","sourcesContent":["import type { TestFramework } from '../types.js';\n\nexport interface FrameworkInfo {\n name: TestFramework;\n imports: string;\n runCommand: string;\n filePattern: string;\n coverageCommand: string;\n}\n\nconst FRAMEWORKS: Record<TestFramework, FrameworkInfo> = {\n vitest: {\n name: 'vitest',\n imports: \"import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';\",\n runCommand: 'npx vitest run',\n filePattern: '**/*.test.{ts,tsx,js,jsx}',\n coverageCommand: 'npx vitest run --coverage --reporter=lcov',\n },\n jest: {\n name: 'jest',\n imports: '// Jest globals available',\n runCommand: 'npx jest',\n filePattern: '**/*.test.{ts,tsx,js,jsx}',\n coverageCommand: 'npx jest --coverage --coverageReporters=lcov',\n },\n mocha: {\n name: 'mocha',\n imports: \"import { describe, it, before, after, beforeEach, afterEach } from 'mocha';\\nimport { expect } from 'chai';\",\n runCommand: 'npx mocha',\n filePattern: '**/*.test.{ts,tsx,js,jsx}',\n coverageCommand: 'npx c8 mocha',\n },\n node: {\n name: 'node',\n imports: \"import { describe, it, before, after, beforeEach, afterEach } from 'node:test';\\nimport assert from 'node:assert/strict';\",\n runCommand: 'node --test',\n filePattern: '**/*.test.{ts,tsx,js,jsx}',\n coverageCommand: 'node --test --experimental-test-coverage',\n },\n};\n\nexport function getFrameworkInfo(framework: TestFramework): FrameworkInfo {\n return FRAMEWORKS[framework];\n}\n\n/**\n * Detect which test framework the project uses by checking package.json.\n */\nexport function detectFramework(packageJson: Record<string, unknown>): TestFramework {\n const deps = {\n ...(packageJson['devDependencies'] as Record<string, string> | undefined),\n ...(packageJson['dependencies'] as Record<string, string> | undefined),\n };\n\n if (deps['vitest']) return 'vitest';\n if (deps['jest'] || deps['@jest/core']) return 'jest';\n if (deps['mocha']) return 'mocha';\n\n // Check scripts\n const scripts = packageJson['scripts'] as Record<string, string> | undefined;\n if (scripts) {\n const testScript = scripts['test'] ?? '';\n if (testScript.includes('vitest')) return 'vitest';\n if (testScript.includes('jest')) return 'jest';\n if (testScript.includes('mocha')) return 'mocha';\n if (testScript.includes('node --test')) return 'node';\n }\n\n return 'vitest';\n}\n","// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface AutotestConfig {\n /** LLM provider: 'openai' | 'anthropic' | 'google' | 'ollama' */\n provider: string;\n /** Model to use, e.g. 'gpt-4o', 'claude-sonnet-4-20250514' */\n model?: string;\n /** API key (or use env var) */\n apiKey?: string;\n /** Test framework: 'vitest' | 'jest' | 'mocha' | 'node' */\n framework: TestFramework;\n /** Output directory for test files (default: same dir as source) */\n outDir?: string;\n /** Overwrite existing test files */\n overwrite: boolean;\n /** Include edge case tests */\n edgeCases: boolean;\n /** Include error handling tests */\n errorHandling: boolean;\n /** Additional context/instructions for the LLM */\n instructions?: string;\n /** Max tokens for LLM response */\n maxTokens: number;\n /** Temperature for LLM */\n temperature: number;\n}\n\nexport type TestFramework = 'vitest' | 'jest' | 'mocha' | 'node';\n\nexport const DEFAULT_CONFIG: AutotestConfig = {\n provider: 'openai',\n framework: 'vitest',\n overwrite: false,\n edgeCases: true,\n errorHandling: true,\n maxTokens: 4096,\n temperature: 0.2,\n};\n\n// ---------------------------------------------------------------------------\n// Code Analysis\n// ---------------------------------------------------------------------------\n\nexport interface AnalyzedFile {\n filePath: string;\n fileName: string;\n language: 'typescript' | 'javascript';\n sourceCode: string;\n exports: ExportedSymbol[];\n imports: ImportStatement[];\n dependencies: string[];\n}\n\nexport interface ExportedSymbol {\n name: string;\n kind: SymbolKind;\n signature: string;\n jsDoc?: string;\n isAsync: boolean;\n isDefault: boolean;\n lineNumber: number;\n parameters?: ParameterInfo[];\n returnType?: string;\n}\n\nexport type SymbolKind =\n | 'function'\n | 'class'\n | 'variable'\n | 'type'\n | 'interface'\n | 'enum'\n | 'arrow-function';\n\nexport interface ParameterInfo {\n name: string;\n type?: string;\n optional: boolean;\n defaultValue?: string;\n}\n\nexport interface ImportStatement {\n source: string;\n specifiers: string[];\n isRelative: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Test Generation\n// ---------------------------------------------------------------------------\n\nexport interface GeneratedTest {\n sourceFile: string;\n testFile: string;\n testCode: string;\n testCount: number;\n categories: TestCategory[];\n}\n\nexport interface TestCategory {\n name: string;\n count: number;\n}\n\n// ---------------------------------------------------------------------------\n// Generation Result\n// ---------------------------------------------------------------------------\n\nexport interface AutotestResult {\n sourceFile: string;\n testFile: string;\n testCount: number;\n categories: TestCategory[];\n duration: number;\n tokensUsed: number;\n verified?: boolean;\n verifyIterations?: number;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { detectFramework } from '../frameworks/index.js';\nimport { DEFAULT_CONFIG, type AutotestConfig } from '../types.js';\n\nconst CONFIG_FILES = [\n 'autotest.config.json',\n '.autotestrc',\n '.autotestrc.json',\n];\n\n/**\n * Resolve the final config by merging: defaults < config file < CLI flags.\n */\nexport function resolveConfig(\n cliFlags: Partial<AutotestConfig>,\n cwd: string = process.cwd(),\n): AutotestConfig {\n const fileConfig = loadConfigFile(cwd);\n const pkgConfig = loadFromPackageJson(cwd);\n const detectedFramework = detectFrameworkFromProject(cwd);\n\n return {\n ...DEFAULT_CONFIG,\n ...(detectedFramework && { framework: detectedFramework }),\n ...pkgConfig,\n ...fileConfig,\n ...stripUndefined(cliFlags),\n };\n}\n\nfunction loadConfigFile(cwd: string): Partial<AutotestConfig> {\n for (const fileName of CONFIG_FILES) {\n const filePath = resolve(cwd, fileName);\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n // Ignore invalid config files\n }\n }\n }\n return {};\n}\n\nfunction loadFromPackageJson(cwd: string): Partial<AutotestConfig> {\n const pkgPath = resolve(cwd, 'package.json');\n if (!existsSync(pkgPath)) return {};\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return (pkg['autotest'] as Partial<AutotestConfig>) ?? {};\n } catch {\n return {};\n }\n}\n\nfunction detectFrameworkFromProject(cwd: string): AutotestConfig['framework'] | undefined {\n const pkgPath = resolve(cwd, 'package.json');\n if (!existsSync(pkgPath)) return undefined;\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return detectFramework(pkg);\n } catch {\n return undefined;\n }\n}\n\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n return result;\n}\n","import * as ts from 'typescript';\nimport { readFileSync } from 'node:fs';\nimport { basename, extname } from 'node:path';\nimport type {\n AnalyzedFile,\n ExportedSymbol,\n ImportStatement,\n ParameterInfo,\n SymbolKind,\n} from '../types.js';\n\n/**\n * Analyze a source file and extract its exported symbols, imports, and structure.\n * Uses the TypeScript compiler API for accurate parsing.\n */\nexport function analyzeFile(filePath: string): AnalyzedFile {\n const sourceCode = readFileSync(filePath, 'utf-8');\n const ext = extname(filePath);\n const language = ext === '.ts' || ext === '.tsx' ? 'typescript' : 'javascript';\n\n const sourceFile = ts.createSourceFile(\n filePath,\n sourceCode,\n ts.ScriptTarget.Latest,\n true,\n ext === '.tsx' || ext === '.jsx' ? ts.ScriptKind.TSX : ts.ScriptKind.TS,\n );\n\n const exports: ExportedSymbol[] = [];\n const imports: ImportStatement[] = [];\n\n visitNode(sourceFile, sourceFile, exports, imports);\n\n const dependencies = imports\n .filter((i) => !i.isRelative)\n .map((i) => i.source);\n\n return {\n filePath,\n fileName: basename(filePath),\n language,\n sourceCode,\n exports,\n imports,\n dependencies,\n };\n}\n\nfunction visitNode(\n node: ts.Node,\n sourceFile: ts.SourceFile,\n exports: ExportedSymbol[],\n imports: ImportStatement[],\n): void {\n // Import declarations\n if (ts.isImportDeclaration(node) && node.moduleSpecifier) {\n const source = (node.moduleSpecifier as ts.StringLiteral).text;\n const specifiers: string[] = [];\n\n if (node.importClause) {\n if (node.importClause.name) {\n specifiers.push(node.importClause.name.text);\n }\n if (node.importClause.namedBindings) {\n if (ts.isNamedImports(node.importClause.namedBindings)) {\n for (const el of node.importClause.namedBindings.elements) {\n specifiers.push(el.name.text);\n }\n } else if (ts.isNamespaceImport(node.importClause.namedBindings)) {\n specifiers.push(`* as ${node.importClause.namedBindings.name.text}`);\n }\n }\n }\n\n imports.push({\n source,\n specifiers,\n isRelative: source.startsWith('.'),\n });\n }\n\n // Exported function declarations\n if (ts.isFunctionDeclaration(node) && hasExportModifier(node)) {\n const name = node.name?.text ?? 'default';\n exports.push({\n name,\n kind: 'function',\n signature: getSignatureText(node, sourceFile),\n jsDoc: getJSDoc(node, sourceFile),\n isAsync: hasAsyncModifier(node),\n isDefault: hasDefaultModifier(node),\n lineNumber: getLineNumber(node, sourceFile),\n parameters: getParameters(node.parameters, sourceFile),\n returnType: node.type ? node.type.getText(sourceFile) : undefined,\n });\n }\n\n // Exported class declarations\n if (ts.isClassDeclaration(node) && hasExportModifier(node)) {\n const name = node.name?.text ?? 'default';\n exports.push({\n name,\n kind: 'class',\n signature: getClassSignature(node, sourceFile),\n jsDoc: getJSDoc(node, sourceFile),\n isAsync: false,\n isDefault: hasDefaultModifier(node),\n lineNumber: getLineNumber(node, sourceFile),\n });\n }\n\n // Exported variable declarations (including arrow functions)\n if (ts.isVariableStatement(node) && hasExportModifier(node)) {\n for (const decl of node.declarationList.declarations) {\n if (!ts.isIdentifier(decl.name)) continue;\n const name = decl.name.text;\n\n const isArrow = decl.initializer && ts.isArrowFunction(decl.initializer);\n const isFuncExpr = decl.initializer && ts.isFunctionExpression(decl.initializer);\n\n if (isArrow || isFuncExpr) {\n const func = decl.initializer as ts.ArrowFunction | ts.FunctionExpression;\n exports.push({\n name,\n kind: 'arrow-function',\n signature: getSignatureText(node, sourceFile),\n jsDoc: getJSDoc(node, sourceFile),\n isAsync: hasAsyncModifier(func),\n isDefault: false,\n lineNumber: getLineNumber(node, sourceFile),\n parameters: getParameters(func.parameters, sourceFile),\n returnType: func.type ? func.type.getText(sourceFile) : undefined,\n });\n } else {\n exports.push({\n name,\n kind: 'variable',\n signature: decl.getText(sourceFile),\n jsDoc: getJSDoc(node, sourceFile),\n isAsync: false,\n isDefault: false,\n lineNumber: getLineNumber(node, sourceFile),\n });\n }\n }\n }\n\n // Exported interfaces and types\n if (ts.isInterfaceDeclaration(node) && hasExportModifier(node)) {\n exports.push({\n name: node.name.text,\n kind: 'interface',\n signature: node.getText(sourceFile),\n isAsync: false,\n isDefault: false,\n lineNumber: getLineNumber(node, sourceFile),\n });\n }\n\n if (ts.isTypeAliasDeclaration(node) && hasExportModifier(node)) {\n exports.push({\n name: node.name.text,\n kind: 'type',\n signature: node.getText(sourceFile),\n isAsync: false,\n isDefault: false,\n lineNumber: getLineNumber(node, sourceFile),\n });\n }\n\n if (ts.isEnumDeclaration(node) && hasExportModifier(node)) {\n exports.push({\n name: node.name.text,\n kind: 'enum',\n signature: node.getText(sourceFile),\n isAsync: false,\n isDefault: false,\n lineNumber: getLineNumber(node, sourceFile),\n });\n }\n\n ts.forEachChild(node, (child) => visitNode(child, sourceFile, exports, imports));\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction hasExportModifier(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false;\n}\n\nfunction hasDefaultModifier(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword) ?? false;\n}\n\nfunction hasAsyncModifier(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) ?? false;\n}\n\nfunction getLineNumber(node: ts.Node, sourceFile: ts.SourceFile): number {\n return sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n}\n\nfunction getSignatureText(node: ts.Node, sourceFile: ts.SourceFile): string {\n const fullText = node.getText(sourceFile);\n const bodyStart = fullText.indexOf('{');\n if (bodyStart === -1) return fullText;\n return fullText.slice(0, bodyStart).trim();\n}\n\nfunction getClassSignature(node: ts.ClassDeclaration, sourceFile: ts.SourceFile): string {\n const lines = node.getText(sourceFile).split('\\n');\n const sigLines: string[] = [];\n for (const line of lines) {\n sigLines.push(line);\n if (line.includes('{')) break;\n }\n let sig = sigLines.join('\\n');\n const methods = node.members\n .filter((m): m is ts.MethodDeclaration => ts.isMethodDeclaration(m))\n .map((m) => {\n const methodSig = getSignatureText(m, sourceFile);\n return ` ${methodSig}`;\n });\n\n if (methods.length > 0) {\n sig += '\\n' + methods.join('\\n') + '\\n}';\n }\n return sig;\n}\n\nfunction getJSDoc(node: ts.Node, sourceFile: ts.SourceFile): string | undefined {\n const fullText = sourceFile.getFullText();\n const ranges = ts.getLeadingCommentRanges(fullText, node.getFullStart());\n if (!ranges) return undefined;\n\n for (const range of ranges) {\n const comment = fullText.slice(range.pos, range.end);\n if (comment.startsWith('/**')) {\n return comment;\n }\n }\n return undefined;\n}\n\nfunction getParameters(\n params: ts.NodeArray<ts.ParameterDeclaration>,\n sourceFile: ts.SourceFile,\n): ParameterInfo[] {\n return params.map((p) => ({\n name: p.name.getText(sourceFile),\n type: p.type ? p.type.getText(sourceFile) : undefined,\n optional: !!p.questionToken,\n defaultValue: p.initializer ? p.initializer.getText(sourceFile) : undefined,\n }));\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { resolve, dirname, extname } from 'node:path';\nimport type { AnalyzedFile } from '../types.js';\n\n/**\n * Follow relative imports from the analyzed file and collect their source code\n * as additional context for the LLM.\n */\nexport function gatherImportContext(\n analysis: AnalyzedFile,\n maxFiles: number = 5,\n maxCharsPerFile: number = 3000,\n): ImportContext[] {\n const contexts: ImportContext[] = [];\n const seen = new Set<string>();\n\n for (const imp of analysis.imports) {\n if (!imp.isRelative) continue;\n if (contexts.length >= maxFiles) break;\n\n const resolvedPath = resolveImportPath(analysis.filePath, imp.source);\n if (!resolvedPath || seen.has(resolvedPath)) continue;\n seen.add(resolvedPath);\n\n try {\n let content = readFileSync(resolvedPath, 'utf-8');\n if (content.length > maxCharsPerFile) {\n content = content.slice(0, maxCharsPerFile) + '\\n// ... (truncated)';\n }\n\n contexts.push({\n importPath: imp.source,\n resolvedPath,\n specifiers: imp.specifiers,\n content,\n });\n } catch {\n // File not readable, skip\n }\n }\n\n return contexts;\n}\n\nexport interface ImportContext {\n importPath: string;\n resolvedPath: string;\n specifiers: string[];\n content: string;\n}\n\n/**\n * Resolve a relative import to an absolute file path,\n * trying common extensions.\n */\nfunction resolveImportPath(fromFile: string, importSource: string): string | null {\n const dir = dirname(fromFile);\n const base = resolve(dir, importSource);\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js'];\n\n // Direct match (already has extension)\n if (existsSync(base) && extname(base)) return base;\n\n for (const ext of extensions) {\n const candidate = base + ext;\n if (existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n","import type { AnalyzedFile, AutotestConfig, ExportedSymbol } from '../types.js';\nimport type { ImportContext } from '../analyzer/context.js';\n\n/**\n * Build a system prompt for the LLM that establishes the test-generation role.\n */\nexport function buildSystemPrompt(config: AutotestConfig): string {\n const framework = config.framework;\n\n const frameworkRules: Record<string, string> = {\n vitest: `- ALWAYS start with: import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';\n- Use vi.fn() for mocking, vi.spyOn for spying`,\n jest: `- Jest globals (describe, it, expect, jest) are available — do not import them\n- Use jest.fn() for mocking, jest.spyOn for spying`,\n mocha: `- ALWAYS start with: import { describe, it } from 'mocha'; import { expect } from 'chai';\n- Use sinon for mocking if needed`,\n node: `- ALWAYS start with: import { describe, it } from 'node:test'; import assert from 'node:assert/strict';\n- Use assert.strictEqual, assert.throws, assert.deepStrictEqual\n- Use t.mock for mocking`,\n };\n\n return `You are an expert test engineer. You write comprehensive, production-quality ${framework} tests.\n\nRules:\n- Use ${framework} syntax and conventions\n${frameworkRules[framework] ?? frameworkRules['vitest']}\n- Write ONLY the test code — no explanations, no markdown fences, no commentary\n- Use descriptive test names that explain the expected behavior\n- Group related tests in describe blocks\n- Test both happy paths and edge cases\n- Test error conditions and boundary values\n- Import the module under test using the EXACT relative path provided\n- Ensure all tests are independent and can run in any order\n${config.instructions ? `\\nAdditional instructions: ${config.instructions}` : ''}`;\n}\n\n/**\n * Build the user prompt with the actual source code and analysis.\n */\nexport function buildUserPrompt(\n analysis: AnalyzedFile,\n config: AutotestConfig,\n importContexts?: ImportContext[],\n): string {\n const testableExports = analysis.exports.filter(\n (e) => e.kind !== 'type' && e.kind !== 'interface',\n );\n\n if (testableExports.length === 0) {\n return buildSimplePrompt(analysis);\n }\n\n const sections: string[] = [];\n\n sections.push(`Generate comprehensive ${config.framework} tests for the following file.`);\n sections.push(`\\nFile: ${analysis.fileName}`);\n sections.push(`Language: ${analysis.language}`);\n\n // Describe what to test\n sections.push('\\n## Exported Symbols to Test\\n');\n for (const sym of testableExports) {\n sections.push(formatSymbolForPrompt(sym));\n }\n\n // Build the exact import line the LLM should use\n const importPath = `./${analysis.fileName.replace(/\\.(ts|tsx|js|jsx)$/, '')}`;\n const exportNames = testableExports.map((e) => e.isDefault ? `default as ${e.name}` : e.name);\n const importLine = `import { ${exportNames.join(', ')} } from '${importPath}';`;\n\n // Requirements\n sections.push('\\n## Requirements\\n');\n sections.push(`- Your test file MUST start with this exact import:\\n ${importLine}`);\n sections.push(`- Import each function/class by name — do NOT use side-effect imports like \\`import '${importPath}'\\``);\n\n if (config.edgeCases) {\n sections.push('- Include edge case tests for boundary values (empty strings, 0, negative numbers, large inputs)');\n sections.push('- Only test null/undefined if the source code explicitly handles them — JavaScript coerces null/undefined in arithmetic, so do NOT assume they throw');\n }\n if (config.errorHandling) {\n sections.push('- Include error handling tests ONLY for errors explicitly thrown in the source code');\n sections.push('- Read the source code carefully — only use toThrow/toThrowError for functions that actually have throw statements');\n }\n\n const asyncExports = testableExports.filter((e) => e.isAsync);\n if (asyncExports.length > 0) {\n sections.push(`- Use async/await for testing: ${asyncExports.map((e) => e.name).join(', ')}`);\n }\n\n // Full source code as context\n sections.push('\\n## Full Source Code\\n');\n sections.push('```' + analysis.language);\n sections.push(analysis.sourceCode);\n sections.push('```');\n\n // Import context — related files for better understanding\n if (importContexts && importContexts.length > 0) {\n sections.push('\\n## Related Files (for context only — do NOT test these)\\n');\n for (const ctx of importContexts) {\n sections.push(`### ${ctx.importPath} (imports: ${ctx.specifiers.join(', ')})\\n`);\n sections.push('```' + analysis.language);\n sections.push(ctx.content);\n sections.push('```\\n');\n }\n }\n\n sections.push('\\nGenerate the test file now. Output ONLY valid test code, nothing else.');\n\n return sections.join('\\n');\n}\n\nfunction buildSimplePrompt(analysis: AnalyzedFile): string {\n return `Generate comprehensive tests for the following ${analysis.language} file.\n\nFile: ${analysis.fileName}\nImport from: './${analysis.fileName.replace(/\\.(ts|tsx|js|jsx)$/, '')}'\n\n\\`\\`\\`${analysis.language}\n${analysis.sourceCode}\n\\`\\`\\`\n\nGenerate the test file now. Output ONLY valid test code, nothing else.`;\n}\n\nfunction formatSymbolForPrompt(sym: ExportedSymbol): string {\n const parts: string[] = [];\n const prefix = sym.isDefault ? '(default export) ' : '';\n\n switch (sym.kind) {\n case 'function':\n case 'arrow-function': {\n parts.push(`### ${prefix}\\`${sym.name}\\` (${sym.isAsync ? 'async ' : ''}function)`);\n if (sym.parameters?.length) {\n const params = sym.parameters\n .map((p) => ` - \\`${p.name}\\`: ${p.type ?? 'any'}${p.optional ? ' (optional)' : ''}${p.defaultValue ? ` = ${p.defaultValue}` : ''}`)\n .join('\\n');\n parts.push(`Parameters:\\n${params}`);\n }\n if (sym.returnType) {\n parts.push(`Returns: \\`${sym.returnType}\\``);\n }\n break;\n }\n case 'class': {\n parts.push(`### ${prefix}\\`${sym.name}\\` (class)`);\n parts.push(`Signature:\\n\\`\\`\\`\\n${sym.signature}\\n\\`\\`\\``);\n break;\n }\n case 'variable': {\n parts.push(`### \\`${sym.name}\\` (exported variable)`);\n break;\n }\n case 'enum': {\n parts.push(`### \\`${sym.name}\\` (enum)`);\n break;\n }\n }\n\n if (sym.jsDoc) {\n parts.push(`Documentation: ${sym.jsDoc}`);\n }\n\n return parts.join('\\n') + '\\n';\n}\n","import { ai } from 'aiclientjs';\nimport type { AutotestConfig } from '../types.js';\n\nexport interface LLMResult {\n text: string;\n tokensUsed: number;\n}\n\n/**\n * Call the LLM with the system and user prompts.\n * Streams output to stdout for real-time feedback.\n */\nexport async function generateWithLLM(\n systemPrompt: string,\n userPrompt: string,\n config: AutotestConfig,\n onChunk?: (text: string) => void,\n): Promise<LLMResult> {\n if (onChunk) {\n const stream = await ai(\n [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n {\n provider: config.provider,\n model: config.model,\n apiKey: config.apiKey,\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n stream: true,\n },\n );\n\n let fullText = '';\n for await (const chunk of stream) {\n fullText += chunk;\n onChunk(chunk);\n }\n\n const response = await stream.response();\n return {\n text: fullText,\n tokensUsed: response.usage.totalTokens,\n };\n }\n\n const response = await ai(\n [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n {\n provider: config.provider,\n model: config.model,\n apiKey: config.apiKey,\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n },\n );\n\n return {\n text: response.text,\n tokensUsed: response.usage.totalTokens,\n };\n}\n","import { writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { dirname, basename, join, extname } from 'node:path';\nimport type { GeneratedTest, TestCategory, AutotestConfig } from '../types.js';\n\n/**\n * Parse raw LLM output into clean test code.\n * Strips markdown fences, extracts test count, and categorizes tests.\n */\nexport function parseTestOutput(\n raw: string,\n sourceFile: string,\n config: AutotestConfig,\n): GeneratedTest {\n let code = raw.trim();\n\n // Extract code from markdown fences — handles preamble text before fences\n const fenceStart = code.indexOf('```');\n if (fenceStart !== -1) {\n code = code.slice(fenceStart);\n const firstNewline = code.indexOf('\\n');\n code = code.slice(firstNewline + 1);\n const lastFence = code.lastIndexOf('```');\n if (lastFence !== -1) {\n code = code.slice(0, lastFence);\n }\n code = code.trim();\n }\n\n // Count tests\n const itMatches = code.match(/\\bit\\s*\\(/g) || [];\n const testMatches = code.match(/\\btest\\s*\\(/g) || [];\n const testCount = itMatches.length + testMatches.length;\n\n // Categorize tests by describe blocks\n const categories = extractCategories(code);\n\n const testFile = getTestFilePath(sourceFile, config);\n\n return {\n sourceFile,\n testFile,\n testCode: code,\n testCount,\n categories,\n };\n}\n\n/**\n * Write the generated test file to disk.\n */\nexport function writeTestFile(\n test: GeneratedTest,\n config: AutotestConfig,\n): void {\n if (existsSync(test.testFile) && !config.overwrite) {\n throw new Error(\n `Test file already exists: ${test.testFile}. Use --overwrite to replace it.`,\n );\n }\n\n const dir = dirname(test.testFile);\n mkdirSync(dir, { recursive: true });\n\n writeFileSync(test.testFile, test.testCode + '\\n', 'utf-8');\n}\n\n/**\n * Determine the test file path from the source file.\n */\nexport function getTestFilePath(\n sourceFile: string,\n config: AutotestConfig,\n): string {\n const ext = extname(sourceFile);\n const base = basename(sourceFile, ext);\n const dir = config.outDir ?? dirname(sourceFile);\n\n return join(dir, `${base}.test${ext}`);\n}\n\nfunction extractCategories(code: string): TestCategory[] {\n const categories: TestCategory[] = [];\n const describeRegex = /describe\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g;\n\n let match;\n while ((match = describeRegex.exec(code)) !== null) {\n const name = match[1]!;\n // Count it() calls within this describe block (approximate)\n const startIdx = match.index;\n const nextDescribe = code.indexOf('describe(', startIdx + 1);\n const block = nextDescribe === -1\n ? code.slice(startIdx)\n : code.slice(startIdx, nextDescribe);\n\n const itCount = (block.match(/\\bit\\s*\\(/g) || []).length +\n (block.match(/\\btest\\s*\\(/g) || []).length;\n\n categories.push({ name, count: itCount });\n }\n\n return categories;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { TestFramework } from '../types.js';\n\nexport interface TestRunResult {\n passed: boolean;\n output: string;\n failures: TestFailure[];\n totalTests: number;\n passedTests: number;\n failedTests: number;\n}\n\nexport interface TestFailure {\n testName: string;\n error: string;\n expected?: string;\n received?: string;\n}\n\n/**\n * Run a test file and collect results.\n */\nexport function runTestFile(\n testFile: string,\n framework: TestFramework,\n cwd?: string,\n): TestRunResult {\n const resolvedCwd = cwd ?? findProjectRoot(testFile);\n const cmd = buildRunCommand(framework, testFile);\n\n try {\n const output = execSync(cmd, {\n cwd: resolvedCwd,\n encoding: 'utf-8',\n timeout: 60_000,\n env: { ...process.env, FORCE_COLOR: '0', NO_COLOR: '1' },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Exit code 0 means all tests passed\n return parseTestOutput(output, framework, true);\n } catch (err: unknown) {\n const execErr = err as { stdout?: string; stderr?: string; status?: number };\n const output = (execErr.stdout ?? '') + '\\n' + (execErr.stderr ?? '');\n return parseTestOutput(output, framework, false);\n }\n}\n\nfunction buildRunCommand(framework: TestFramework, testFile: string): string {\n switch (framework) {\n case 'vitest':\n return `npx vitest run \"${testFile}\" --reporter=verbose 2>&1`;\n case 'jest':\n return `npx jest \"${testFile}\" --verbose --no-coverage 2>&1`;\n case 'mocha':\n return `npx mocha \"${testFile}\" --reporter spec 2>&1`;\n case 'node':\n return `node --test \"${testFile}\" 2>&1`;\n }\n}\n\nfunction parseTestOutput(output: string, framework: TestFramework, exitedClean: boolean): TestRunResult {\n const failures = extractFailures(output, framework);\n const counts = extractCounts(output, framework);\n\n // A test run passes if: exit code was 0, OR no failures found and some tests ran\n const passed = exitedClean || (failures.length === 0 && counts.total > 0);\n\n return {\n passed,\n output,\n failures,\n totalTests: counts.total,\n passedTests: counts.passed,\n failedTests: counts.failed,\n };\n}\n\nfunction extractFailures(output: string, _framework: TestFramework): TestFailure[] {\n const failures: TestFailure[] = [];\n\n // Universal: match FAIL lines followed by error details\n const failPattern = /(?:FAIL|×|✕|✗|✖)\\s+(.+?)(?:\\n|\\r\\n)([\\s\\S]*?)(?=(?:FAIL|×|✕|✗|✖)\\s|\\n\\s*(?:Tests|Test Files|Test Suites)|\\n\\s*$)/gi;\n let match;\n\n while ((match = failPattern.exec(output)) !== null) {\n const testName = match[1]?.trim() ?? 'unknown';\n const errorBlock = match[2]?.trim() ?? '';\n\n const expectedMatch = errorBlock.match(/Expected:?\\s*(.+)/i);\n const receivedMatch = errorBlock.match(/Received:?\\s*(.+)/i);\n\n failures.push({\n testName,\n error: errorBlock.slice(0, 500),\n expected: expectedMatch?.[1]?.trim(),\n received: receivedMatch?.[1]?.trim(),\n });\n }\n\n // Fallback: look for AssertionError / Error lines\n if (failures.length === 0 && output.includes('FAIL')) {\n const errorLines = output.match(/(?:AssertionError|Error|ReferenceError|TypeError):.*$/gm);\n if (errorLines) {\n for (const line of errorLines) {\n failures.push({\n testName: 'unknown',\n error: line.trim(),\n });\n }\n }\n }\n\n // Fallback: syntax/compilation errors\n if (failures.length === 0) {\n const syntaxErr = output.match(/(?:SyntaxError|ERROR):\\s*(.+)/);\n if (syntaxErr) {\n failures.push({\n testName: 'compilation',\n error: syntaxErr[0]!.trim(),\n });\n }\n }\n\n return failures;\n}\n\nfunction extractCounts(\n output: string,\n _framework: TestFramework,\n): { total: number; passed: number; failed: number } {\n // Vitest: \"Tests 5 failed | 12 passed (17)\" or \"Tests 1 passed (1)\"\n const vitestMatch = output.match(/Tests\\s+(?:(\\d+)\\s+failed\\s*\\|?\\s*)?(?:(\\d+)\\s+passed\\s*)?\\((\\d+)\\)/);\n if (vitestMatch) {\n const failed = parseInt(vitestMatch[1] ?? '0', 10);\n const passed = parseInt(vitestMatch[2] ?? '0', 10);\n const total = parseInt(vitestMatch[3]!, 10);\n return { total, passed, failed: failed || (total - passed) };\n }\n\n // Vitest alternate: \"N failed | M passed\" without parens\n const vitestAlt = output.match(/(\\d+)\\s+failed\\s*\\|\\s*(\\d+)\\s+passed/);\n if (vitestAlt) {\n const failed = parseInt(vitestAlt[1]!, 10);\n const passed = parseInt(vitestAlt[2]!, 10);\n return { total: failed + passed, passed, failed };\n }\n\n // Jest: \"Tests: 2 failed, 5 passed, 7 total\"\n const jestMatch = output.match(/Tests:\\s+(?:(\\d+)\\s+failed,\\s+)?(\\d+)\\s+passed,\\s+(\\d+)\\s+total/);\n if (jestMatch) {\n const failed = parseInt(jestMatch[1] ?? '0', 10);\n const passed = parseInt(jestMatch[2]!, 10);\n const total = parseInt(jestMatch[3]!, 10);\n return { total, passed, failed };\n }\n\n // \"Test Files 1 passed\" / \"Test Files 1 failed\" (vitest file-level summary)\n const filesPass = output.match(/Test Files\\s+(\\d+)\\s+passed/);\n const filesFail = output.match(/Test Files\\s+(\\d+)\\s+failed/);\n if (filesPass || filesFail) {\n // Try to get individual test counts from the output\n const passMarkers = (output.match(/✓|✔|√/g) || []).length;\n const failMarkers = (output.match(/×|✕|✗|✖|❯/g) || []).length;\n if (passMarkers + failMarkers > 0) {\n return { total: passMarkers + failMarkers, passed: passMarkers, failed: failMarkers };\n }\n }\n\n // Count from pass/fail markers\n const passCount = (output.match(/✓|✔|√/g) || []).length;\n const failCount = (output.match(/×|✕|✗|✖/g) || []).length;\n\n return {\n total: passCount + failCount,\n passed: passCount,\n failed: failCount,\n };\n}\n\nfunction findProjectRoot(fromFile: string): string {\n let dir = dirname(resolve(fromFile));\n for (let i = 0; i < 10; i++) {\n if (existsSync(resolve(dir, 'package.json'))) return dir;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return dirname(resolve(fromFile));\n}\n","import { ai } from 'aiclientjs';\nimport type { AutotestConfig } from '../types.js';\nimport type { TestFailure } from './runner.js';\n\n/**\n * Send failing tests back to the LLM for auto-fix.\n */\nexport async function fixFailingTests(\n sourceCode: string,\n testCode: string,\n failures: TestFailure[],\n config: AutotestConfig,\n onChunk?: (text: string) => void,\n): Promise<string> {\n const systemPrompt = buildFixSystemPrompt(config);\n const userPrompt = buildFixUserPrompt(sourceCode, testCode, failures);\n\n if (onChunk) {\n const stream = await ai(\n [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n {\n provider: config.provider,\n model: config.model,\n apiKey: config.apiKey,\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n stream: true,\n },\n );\n\n let fullText = '';\n for await (const chunk of stream) {\n fullText += chunk;\n onChunk(chunk);\n }\n return fullText;\n }\n\n const response = await ai(\n [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n {\n provider: config.provider,\n model: config.model,\n apiKey: config.apiKey,\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n },\n );\n\n return response.text;\n}\n\nfunction buildFixSystemPrompt(config: AutotestConfig): string {\n return `You are an expert test engineer fixing failing ${config.framework} tests.\n\nRules:\n- Output ONLY the complete, corrected test file — no explanations, no markdown fences\n- Fix every failing test based on the actual error messages\n- If a test expected a function to throw but it doesn't, remove or rewrite the test to match actual behavior\n- If the expected value is wrong, correct it to match the actual source code behavior\n- Do NOT remove passing tests\n- Do NOT add new tests — only fix the broken ones\n- Keep all imports and structure intact\n- Read the source code carefully to understand what each function actually does`;\n}\n\nfunction buildFixUserPrompt(\n sourceCode: string,\n testCode: string,\n failures: TestFailure[],\n): string {\n const failureDetails = failures\n .map((f, i) => {\n let detail = `${i + 1}. **${f.testName}**\\n Error: ${f.error}`;\n if (f.expected) detail += `\\n Expected: ${f.expected}`;\n if (f.received) detail += `\\n Received: ${f.received}`;\n return detail;\n })\n .join('\\n\\n');\n\n return `Fix the failing tests below. The source code is the truth — adjust the tests to match it.\n\n## Source Code (DO NOT MODIFY)\n\n\\`\\`\\`\n${sourceCode}\n\\`\\`\\`\n\n## Current Test File (FIX THIS)\n\n\\`\\`\\`\n${testCode}\n\\`\\`\\`\n\n## Failures (${failures.length})\n\n${failureDetails}\n\nOutput the COMPLETE fixed test file. Every test must pass.`;\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport pc from 'picocolors';\nimport { runTestFile } from './runner.js';\nimport { fixFailingTests } from './fixer.js';\nimport { parseTestOutput } from '../writer/index.js';\nimport type { AutotestConfig } from '../types.js';\n\nexport { runTestFile, type TestRunResult, type TestFailure } from './runner.js';\nexport { fixFailingTests } from './fixer.js';\n\nexport interface VerifyResult {\n passed: boolean;\n iterations: number;\n totalTests: number;\n passedTests: number;\n failedTests: number;\n finalTestCode: string;\n}\n\n/**\n * Verify & auto-fix loop:\n * 1. Run the generated tests\n * 2. If failures, send them to the LLM for fixing\n * 3. Write the fixed tests\n * 4. Repeat until all pass or maxIterations reached\n */\nexport async function verifyAndFix(\n sourceFile: string,\n testFile: string,\n config: AutotestConfig,\n options?: {\n maxIterations?: number;\n onChunk?: (text: string) => void;\n onStatus?: (msg: string) => void;\n },\n): Promise<VerifyResult> {\n const maxIterations = options?.maxIterations ?? 3;\n const log = options?.onStatus ?? (() => {});\n const sourceCode = readFileSync(sourceFile, 'utf-8');\n\n for (let iteration = 1; iteration <= maxIterations; iteration++) {\n log(`\\n${pc.cyan('▶')} Verify iteration ${iteration}/${maxIterations}...`);\n\n const result = runTestFile(testFile, config.framework);\n\n if (result.passed) {\n log(`${pc.green('✔')} All ${result.totalTests} tests pass!`);\n return {\n passed: true,\n iterations: iteration,\n totalTests: result.totalTests,\n passedTests: result.passedTests,\n failedTests: 0,\n finalTestCode: readFileSync(testFile, 'utf-8'),\n };\n }\n\n log(\n `${pc.yellow('⚠')} ${result.failedTests}/${result.totalTests} tests failed` +\n (iteration < maxIterations ? ' — sending to LLM for auto-fix...' : ''),\n );\n\n if (iteration >= maxIterations) {\n return {\n passed: false,\n iterations: iteration,\n totalTests: result.totalTests,\n passedTests: result.passedTests,\n failedTests: result.failedTests,\n finalTestCode: readFileSync(testFile, 'utf-8'),\n };\n }\n\n const currentTestCode = readFileSync(testFile, 'utf-8');\n\n if (options?.onChunk) options.onChunk('\\n');\n const fixedRaw = await fixFailingTests(\n sourceCode,\n currentTestCode,\n result.failures,\n config,\n options?.onChunk,\n );\n if (options?.onChunk) options.onChunk('\\n');\n\n const parsed = parseTestOutput(fixedRaw, sourceFile, config);\n writeFileSync(testFile, parsed.testCode + '\\n', 'utf-8');\n log(`${pc.dim(' Wrote fixed tests to')} ${testFile}`);\n }\n\n // Should not reach here\n return {\n passed: false,\n iterations: maxIterations,\n totalTests: 0,\n passedTests: 0,\n failedTests: 0,\n finalTestCode: readFileSync(testFile, 'utf-8'),\n };\n}\n","import { analyzeFile } from './analyzer/index.js';\nimport { gatherImportContext } from './analyzer/context.js';\nimport { buildSystemPrompt, buildUserPrompt } from './prompt/index.js';\nimport { generateWithLLM } from './llm/index.js';\nimport { parseTestOutput, writeTestFile } from './writer/index.js';\nimport { verifyAndFix } from './verify/index.js';\nimport type { AutotestConfig, AutotestResult } from './types.js';\n\n/**\n * Main orchestrator: analyze → prompt → generate → write → (verify → fix).\n */\nexport async function generateTests(\n sourceFile: string,\n config: AutotestConfig,\n options?: {\n onChunk?: (text: string) => void;\n onStatus?: (msg: string) => void;\n dryRun?: boolean;\n verify?: boolean;\n maxFixIterations?: number;\n },\n): Promise<AutotestResult> {\n const start = Date.now();\n\n // 1. Analyze\n const analysis = analyzeFile(sourceFile);\n\n // 2. Gather import context\n const importContexts = gatherImportContext(analysis);\n\n // 3. Build prompts\n const systemPrompt = buildSystemPrompt(config);\n const userPrompt = buildUserPrompt(analysis, config, importContexts);\n\n // 4. Generate via LLM\n const llmResult = await generateWithLLM(\n systemPrompt,\n userPrompt,\n config,\n options?.onChunk,\n );\n\n // 5. Parse & write\n const generatedTest = parseTestOutput(llmResult.text, sourceFile, config);\n\n if (!options?.dryRun) {\n writeTestFile(generatedTest, config);\n }\n\n const result: AutotestResult = {\n sourceFile: generatedTest.sourceFile,\n testFile: generatedTest.testFile,\n testCount: generatedTest.testCount,\n categories: generatedTest.categories,\n duration: Date.now() - start,\n tokensUsed: llmResult.tokensUsed,\n };\n\n // 6. Verify & auto-fix if requested\n if (options?.verify && !options?.dryRun) {\n const verifyResult = await verifyAndFix(\n sourceFile,\n generatedTest.testFile,\n config,\n {\n maxIterations: options.maxFixIterations ?? 3,\n onChunk: options.onChunk,\n onStatus: options.onStatus,\n },\n );\n\n result.verified = verifyResult.passed;\n result.verifyIterations = verifyResult.iterations;\n result.testCount = verifyResult.totalTests;\n result.duration = Date.now() - start;\n }\n\n return result;\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { resolve, relative, basename } from 'node:path';\n\nexport interface CoverageData {\n files: CoverageFile[];\n totalLines: number;\n coveredLines: number;\n overallRate: number;\n}\n\nexport interface CoverageFile {\n filePath: string;\n relativePath: string;\n lineRate: number;\n branchRate: number;\n uncoveredLines: number[];\n totalLines: number;\n coveredLines: number;\n hasTests: boolean;\n}\n\n/**\n * Parse LCOV format coverage data.\n */\nexport function parseLcov(lcovPath: string, cwd: string): CoverageData {\n const content = readFileSync(lcovPath, 'utf-8');\n const files: CoverageFile[] = [];\n\n let currentFile: string | null = null;\n let linesHit = 0;\n let linesFound = 0;\n let branchesHit = 0;\n let branchesFound = 0;\n const uncoveredLines: number[] = [];\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n\n if (trimmed.startsWith('SF:')) {\n currentFile = trimmed.slice(3);\n linesHit = 0;\n linesFound = 0;\n branchesHit = 0;\n branchesFound = 0;\n uncoveredLines.length = 0;\n } else if (trimmed.startsWith('DA:')) {\n const parts = trimmed.slice(3).split(',');\n const lineNum = parseInt(parts[0]!, 10);\n const hits = parseInt(parts[1]!, 10);\n linesFound++;\n if (hits > 0) {\n linesHit++;\n } else {\n uncoveredLines.push(lineNum);\n }\n } else if (trimmed.startsWith('BRF:')) {\n branchesFound = parseInt(trimmed.slice(4), 10);\n } else if (trimmed.startsWith('BRH:')) {\n branchesHit = parseInt(trimmed.slice(4), 10);\n } else if (trimmed === 'end_of_record' && currentFile) {\n const filePath = resolve(currentFile);\n const relPath = relative(cwd, filePath);\n\n // Check if test file exists\n const ext = filePath.match(/\\.(ts|tsx|js|jsx)$/)?.[0] ?? '.ts';\n const base = basename(filePath, ext);\n const testFile = filePath.replace(\n new RegExp(`${base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}${ext.replace('.', '\\\\.')}$`),\n `${base}.test${ext}`,\n );\n\n files.push({\n filePath,\n relativePath: relPath,\n lineRate: linesFound > 0 ? linesHit / linesFound : 0,\n branchRate: branchesFound > 0 ? branchesHit / branchesFound : 0,\n uncoveredLines: [...uncoveredLines],\n totalLines: linesFound,\n coveredLines: linesHit,\n hasTests: existsSync(testFile),\n });\n currentFile = null;\n }\n }\n\n const totalLines = files.reduce((s, f) => s + f.totalLines, 0);\n const coveredLines = files.reduce((s, f) => s + f.coveredLines, 0);\n\n return {\n files,\n totalLines,\n coveredLines,\n overallRate: totalLines > 0 ? coveredLines / totalLines : 0,\n };\n}\n\n/**\n * Parse Cobertura XML coverage data.\n */\nexport function parseCobertura(xmlPath: string, cwd: string): CoverageData {\n const content = readFileSync(xmlPath, 'utf-8');\n const files: CoverageFile[] = [];\n\n // Simple XML parsing for <class> elements\n const classRegex = /<class\\s[^>]*filename=\"([^\"]+)\"[^>]*line-rate=\"([^\"]+)\"[^>]*branch-rate=\"([^\"]+)\"[^>]*>/g;\n let match;\n\n while ((match = classRegex.exec(content)) !== null) {\n const filename = match[1]!;\n const lineRate = parseFloat(match[2]!);\n const branchRate = parseFloat(match[3]!);\n const filePath = resolve(cwd, filename);\n const relPath = relative(cwd, filePath);\n\n // Extract uncovered lines\n const uncoveredLines: number[] = [];\n const fileSection = content.slice(match.index, content.indexOf('</class>', match.index));\n const lineRegex = /<line\\s+number=\"(\\d+)\"\\s+hits=\"(\\d+)\"/g;\n let lineMatch;\n let total = 0;\n let covered = 0;\n\n while ((lineMatch = lineRegex.exec(fileSection)) !== null) {\n total++;\n const lineNum = parseInt(lineMatch[1]!, 10);\n const hits = parseInt(lineMatch[2]!, 10);\n if (hits > 0) {\n covered++;\n } else {\n uncoveredLines.push(lineNum);\n }\n }\n\n const ext = filePath.match(/\\.(ts|tsx|js|jsx)$/)?.[0] ?? '.ts';\n const base = basename(filePath, ext);\n const testFile = filePath.replace(\n new RegExp(`${base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}${ext.replace('.', '\\\\.')}$`),\n `${base}.test${ext}`,\n );\n\n files.push({\n filePath,\n relativePath: relPath,\n lineRate,\n branchRate,\n uncoveredLines,\n totalLines: total || Math.round(1 / (1 - lineRate + 0.001)),\n coveredLines: covered || Math.round(lineRate * (total || 10)),\n hasTests: existsSync(testFile),\n });\n }\n\n const totalLines = files.reduce((s, f) => s + f.totalLines, 0);\n const coveredLines = files.reduce((s, f) => s + f.coveredLines, 0);\n\n return {\n files,\n totalLines,\n coveredLines,\n overallRate: totalLines > 0 ? coveredLines / totalLines : 0,\n };\n}\n\n/**\n * Auto-detect and parse coverage data from common locations.\n */\nexport function loadCoverage(cwd: string): CoverageData | null {\n const lcovPaths = [\n 'coverage/lcov.info',\n 'coverage/lcov/lcov.info',\n ];\n\n for (const p of lcovPaths) {\n const fullPath = resolve(cwd, p);\n if (existsSync(fullPath)) return parseLcov(fullPath, cwd);\n }\n\n const coberturaPaths = [\n 'coverage/cobertura-coverage.xml',\n 'coverage/cobertura.xml',\n ];\n\n for (const p of coberturaPaths) {\n const fullPath = resolve(cwd, p);\n if (existsSync(fullPath)) return parseCobertura(fullPath, cwd);\n }\n\n return null;\n}\n\n/**\n * Get files that need test generation, sorted by lowest coverage first.\n */\nexport function getUncoveredFiles(\n coverage: CoverageData,\n targetRate: number = 0.8,\n): CoverageFile[] {\n return coverage.files\n .filter((f) => f.lineRate < targetRate)\n .filter((f) => !f.relativePath.includes('.test.') && !f.relativePath.includes('.spec.'))\n .filter((f) => !f.relativePath.includes('node_modules'))\n .sort((a, b) => a.lineRate - b.lineRate);\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { existsSync, statSync, readdirSync } from 'node:fs';\nimport { resolve, extname, join } from 'node:path';\nimport { resolveConfig } from './config/index.js';\nimport { generateTests } from './generate.js';\nimport { loadCoverage, getUncoveredFiles } from './coverage/index.js';\nimport type { AutotestConfig, AutotestResult, TestFramework } from './types.js';\n\nconst VERSION = '0.1.0';\n\nconst program = new Command();\n\nprogram\n .name('testpilot')\n .description('AI-powered test generation that actually works')\n .version(VERSION);\n\n// ── generate (default command) ──────────────────────────────────────────\n\nprogram\n .command('generate', { isDefault: true })\n .description('Generate tests for a file or directory')\n .argument('<target>', 'File or directory to generate tests for')\n .option('-p, --provider <provider>', 'LLM provider (openai, anthropic, google, ollama)')\n .option('-m, --model <model>', 'Model to use')\n .option('-k, --api-key <key>', 'API key (or use env var)')\n .option('-f, --framework <framework>', 'Test framework: vitest, jest, mocha, node')\n .option('-o, --out-dir <dir>', 'Output directory for test files')\n .option('--overwrite', 'Overwrite existing test files', false)\n .option('--no-edge-cases', 'Skip edge case tests')\n .option('--no-error-handling', 'Skip error handling tests')\n .option('--instructions <text>', 'Additional instructions for the LLM')\n .option('--max-tokens <n>', 'Max tokens for LLM response', parseInt)\n .option('--temperature <n>', 'Temperature for LLM', parseFloat)\n .option('--dry-run', 'Generate tests without writing to disk')\n .option('-s, --stream', 'Stream LLM output in real-time', true)\n .option('--verify', 'Run tests after generation and auto-fix failures', false)\n .option('--fix-iterations <n>', 'Max auto-fix iterations (with --verify)', parseInt)\n .action(async (target: string, options: CLIOptions) => {\n try {\n await runGenerate(target, options);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`\\n${pc.red('✖')} ${msg}`);\n process.exit(1);\n }\n });\n\n// ── analyze command ─────────────────────────────────────────────────────\n\nprogram\n .command('analyze')\n .description('Analyze project for files needing tests (uses coverage data if available)')\n .option('-t, --target <rate>', 'Coverage target (0-1)', parseFloat)\n .option('-l, --limit <n>', 'Max files to show', parseInt)\n .action(async (options: { target?: number; limit?: number }) => {\n try {\n await runAnalyze(options);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`\\n${pc.red('✖')} ${msg}`);\n process.exit(1);\n }\n });\n\ninterface CLIOptions {\n provider?: string;\n model?: string;\n apiKey?: string;\n framework?: TestFramework;\n outDir?: string;\n overwrite?: boolean;\n edgeCases?: boolean;\n errorHandling?: boolean;\n instructions?: string;\n maxTokens?: number;\n temperature?: number;\n dryRun?: boolean;\n stream?: boolean;\n verify?: boolean;\n fixIterations?: number;\n}\n\n// ── Generate logic ──────────────────────────────────────────────────────\n\nasync function runGenerate(target: string, options: CLIOptions): Promise<void> {\n const resolvedTarget = resolve(target);\n\n if (!existsSync(resolvedTarget)) {\n throw new Error(`Target not found: ${resolvedTarget}`);\n }\n\n const files = collectFiles(resolvedTarget);\n if (files.length === 0) {\n throw new Error('No .ts, .tsx, .js, or .jsx files found');\n }\n\n const config = resolveConfig({\n provider: options.provider,\n model: options.model,\n apiKey: options.apiKey,\n framework: options.framework,\n outDir: options.outDir,\n overwrite: options.overwrite,\n edgeCases: options.edgeCases,\n errorHandling: options.errorHandling,\n instructions: options.instructions,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n });\n\n printHeader(files, config, options.verify);\n\n const results: AutotestResult[] = [];\n for (const file of files) {\n const result = await generateForFile(file, config, options);\n results.push(result);\n }\n\n printSummary(results, options.verify);\n}\n\nfunction collectFiles(target: string): string[] {\n const validExts = new Set(['.ts', '.tsx', '.js', '.jsx']);\n const stat = statSync(target);\n\n if (stat.isFile()) {\n const ext = extname(target);\n if (!validExts.has(ext)) {\n throw new Error(`Unsupported file type: ${ext}`);\n }\n if (target.includes('.test.') || target.includes('.spec.')) {\n throw new Error('Target is already a test file');\n }\n return [target];\n }\n\n if (stat.isDirectory()) {\n const files: string[] = [];\n const entries = readdirSync(target, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile()) {\n const ext = extname(entry.name);\n if (validExts.has(ext) && !entry.name.includes('.test.') && !entry.name.includes('.spec.')) {\n files.push(join(target, entry.name));\n }\n }\n }\n return files.sort();\n }\n\n return [];\n}\n\nasync function generateForFile(\n file: string,\n config: AutotestConfig,\n options: CLIOptions,\n): Promise<AutotestResult> {\n const fileName = file.split('/').pop() ?? file;\n console.log(`\\n${pc.cyan('●')} Generating tests for ${pc.bold(fileName)}...`);\n if (options.verify) {\n console.log(` ${pc.dim('verify & auto-fix enabled')}`);\n }\n console.log();\n\n let streamOutput = '';\n const result = await generateTests(file, config, {\n dryRun: options.dryRun,\n verify: options.verify,\n maxFixIterations: options.fixIterations ?? 3,\n onChunk: options.stream\n ? (chunk) => {\n process.stdout.write(pc.dim(chunk));\n streamOutput += chunk;\n }\n : undefined,\n onStatus: (msg) => console.log(msg),\n });\n\n if (streamOutput) {\n process.stdout.write('\\n');\n }\n\n const action = options.dryRun ? 'would write' : 'wrote';\n console.log(`${pc.green('✔')} ${action} ${pc.bold(result.testFile)}`);\n\n const parts = [\n `${result.testCount} tests`,\n `${result.categories.length} groups`,\n `${result.tokensUsed} tokens`,\n `${(result.duration / 1000).toFixed(1)}s`,\n ];\n\n if (result.verified !== undefined) {\n parts.push(\n result.verified\n ? pc.green('✔ all tests pass')\n : pc.yellow(`⚠ ${result.verifyIterations} fix iterations`),\n );\n }\n\n console.log(` ${pc.dim(parts.join(' | '))}`);\n\n if (result.categories.length > 0) {\n for (const cat of result.categories) {\n console.log(` ${pc.dim('├')} ${cat.name} ${pc.dim(`(${cat.count} tests)`)}`);\n }\n }\n\n return result;\n}\n\n// ── Analyze logic ───────────────────────────────────────────────────────\n\nasync function runAnalyze(options: { target?: number; limit?: number }): Promise<void> {\n const cwd = process.cwd();\n const targetRate = options.target ?? 0.8;\n const limit = options.limit ?? 15;\n\n console.log(`\\n${pc.bold(pc.magenta('⚡ testpilot analyze'))}\\n`);\n\n const coverage = loadCoverage(cwd);\n\n if (!coverage) {\n console.log(`${pc.yellow('⚠')} No coverage data found.`);\n console.log(` ${pc.dim('Run your tests with coverage first:')}`);\n console.log(` ${pc.dim(' npx vitest run --coverage')}`);\n console.log(` ${pc.dim(' npx jest --coverage')}`);\n console.log();\n\n // Fallback: find source files without test files\n console.log(`${pc.cyan('●')} Scanning for files without tests...\\n`);\n const srcFiles = findSourceFilesWithoutTests(cwd);\n\n if (srcFiles.length === 0) {\n console.log(`${pc.green('✔')} All source files have corresponding test files.`);\n return;\n }\n\n console.log(`Found ${pc.bold(String(srcFiles.length))} file(s) without tests:\\n`);\n for (const f of srcFiles.slice(0, limit)) {\n console.log(` ${pc.red('○')} ${f}`);\n }\n\n if (srcFiles.length > limit) {\n console.log(` ${pc.dim(`... and ${srcFiles.length - limit} more`)}`);\n }\n\n console.log(`\\n${pc.dim('Generate tests:')} testpilot generate <file>\\n`);\n return;\n }\n\n // Coverage-based analysis\n console.log(` ${pc.dim('Coverage:')} ${(coverage.overallRate * 100).toFixed(1)}% (${coverage.coveredLines}/${coverage.totalLines} lines)`);\n console.log(` ${pc.dim('Target:')} ${(targetRate * 100).toFixed(0)}%`);\n console.log(` ${pc.dim('Files:')} ${coverage.files.length}\\n`);\n\n const uncovered = getUncoveredFiles(coverage, targetRate).slice(0, limit);\n\n if (uncovered.length === 0) {\n console.log(`${pc.green('✔')} All files meet the ${(targetRate * 100).toFixed(0)}% coverage target!`);\n return;\n }\n\n console.log(`${pc.bold('Files below target:')}\\n`);\n console.log(` ${pc.dim('File'.padEnd(50))} ${pc.dim('Coverage'.padEnd(10))} ${pc.dim('Tests?')}`);\n console.log(` ${pc.dim('─'.repeat(70))}`);\n\n for (const file of uncovered) {\n const covStr = `${(file.lineRate * 100).toFixed(1)}%`.padEnd(10);\n const testStr = file.hasTests ? pc.green('yes') : pc.red('no');\n const color = file.lineRate < 0.3 ? pc.red : file.lineRate < 0.6 ? pc.yellow : pc.white;\n console.log(` ${color(file.relativePath.padEnd(50))} ${covStr} ${testStr}`);\n }\n\n console.log(`\\n${pc.dim('Generate tests:')} testpilot generate <file> --verify\\n`);\n}\n\nfunction findSourceFilesWithoutTests(cwd: string): string[] {\n const validExts = new Set(['.ts', '.tsx', '.js', '.jsx']);\n const results: string[] = [];\n\n function scan(dir: string): void {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name === '.git' || entry.name === 'docs') continue;\n\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n scan(fullPath);\n } else if (entry.isFile()) {\n const ext = extname(entry.name);\n if (!validExts.has(ext)) continue;\n if (entry.name.includes('.test.') || entry.name.includes('.spec.')) continue;\n if (entry.name.includes('.d.ts')) continue;\n\n // Check if corresponding test file exists\n const base = entry.name.replace(/\\.(ts|tsx|js|jsx)$/, '');\n const testNames = [\n `${base}.test${ext}`,\n `${base}.spec${ext}`,\n ];\n const hasTest = testNames.some((t) => existsSync(join(dir, t)));\n if (!hasTest) {\n const relPath = fullPath.slice(cwd.length + 1);\n results.push(relPath);\n }\n }\n }\n } catch {\n // Permission denied, etc.\n }\n }\n\n scan(cwd);\n return results.sort();\n}\n\n// ── Output helpers ──────────────────────────────────────────────────────\n\nfunction printHeader(files: string[], config: AutotestConfig, verify?: boolean): void {\n console.log(`\\n${pc.bold(pc.magenta('⚡ testpilot'))} — AI-powered test generation\\n`);\n console.log(` ${pc.dim('Provider:')} ${config.provider}${config.model ? ` (${config.model})` : ''}`);\n console.log(` ${pc.dim('Framework:')} ${config.framework}`);\n console.log(` ${pc.dim('Files:')} ${files.length}`);\n console.log(` ${pc.dim('Edge cases:')} ${config.edgeCases ? 'yes' : 'no'}`);\n console.log(` ${pc.dim('Error handling:')} ${config.errorHandling ? 'yes' : 'no'}`);\n if (verify) {\n console.log(` ${pc.dim('Verify & fix:')} ${pc.green('enabled')}`);\n }\n}\n\nfunction printSummary(results: AutotestResult[], verify?: boolean): void {\n const totalTests = results.reduce((n, r) => n + r.testCount, 0);\n const totalTokens = results.reduce((n, r) => n + r.tokensUsed, 0);\n const totalDuration = results.reduce((n, r) => n + r.duration, 0);\n\n console.log(`\\n${pc.bold(pc.green('Done!'))} Generated ${pc.bold(String(totalTests))} tests across ${pc.bold(String(results.length))} file(s)`);\n\n if (verify) {\n const allPassed = results.every((r) => r.verified);\n const passedCount = results.filter((r) => r.verified).length;\n if (allPassed) {\n console.log(`${pc.green('✔')} All tests verified and passing`);\n } else {\n console.log(`${pc.yellow('⚠')} ${passedCount}/${results.length} files fully verified`);\n }\n }\n\n console.log(`${pc.dim(`Total: ${totalTokens} tokens | ${(totalDuration / 1000).toFixed(1)}s`)}\\n`);\n}\n\nprogram.parse();\n"]}
@@ -0,0 +1,201 @@
1
+ interface AutotestConfig {
2
+ /** LLM provider: 'openai' | 'anthropic' | 'google' | 'ollama' */
3
+ provider: string;
4
+ /** Model to use, e.g. 'gpt-4o', 'claude-sonnet-4-20250514' */
5
+ model?: string;
6
+ /** API key (or use env var) */
7
+ apiKey?: string;
8
+ /** Test framework: 'vitest' | 'jest' | 'mocha' | 'node' */
9
+ framework: TestFramework;
10
+ /** Output directory for test files (default: same dir as source) */
11
+ outDir?: string;
12
+ /** Overwrite existing test files */
13
+ overwrite: boolean;
14
+ /** Include edge case tests */
15
+ edgeCases: boolean;
16
+ /** Include error handling tests */
17
+ errorHandling: boolean;
18
+ /** Additional context/instructions for the LLM */
19
+ instructions?: string;
20
+ /** Max tokens for LLM response */
21
+ maxTokens: number;
22
+ /** Temperature for LLM */
23
+ temperature: number;
24
+ }
25
+ type TestFramework = 'vitest' | 'jest' | 'mocha' | 'node';
26
+ declare const DEFAULT_CONFIG: AutotestConfig;
27
+ interface AnalyzedFile {
28
+ filePath: string;
29
+ fileName: string;
30
+ language: 'typescript' | 'javascript';
31
+ sourceCode: string;
32
+ exports: ExportedSymbol[];
33
+ imports: ImportStatement[];
34
+ dependencies: string[];
35
+ }
36
+ interface ExportedSymbol {
37
+ name: string;
38
+ kind: SymbolKind;
39
+ signature: string;
40
+ jsDoc?: string;
41
+ isAsync: boolean;
42
+ isDefault: boolean;
43
+ lineNumber: number;
44
+ parameters?: ParameterInfo[];
45
+ returnType?: string;
46
+ }
47
+ type SymbolKind = 'function' | 'class' | 'variable' | 'type' | 'interface' | 'enum' | 'arrow-function';
48
+ interface ParameterInfo {
49
+ name: string;
50
+ type?: string;
51
+ optional: boolean;
52
+ defaultValue?: string;
53
+ }
54
+ interface ImportStatement {
55
+ source: string;
56
+ specifiers: string[];
57
+ isRelative: boolean;
58
+ }
59
+ interface GeneratedTest {
60
+ sourceFile: string;
61
+ testFile: string;
62
+ testCode: string;
63
+ testCount: number;
64
+ categories: TestCategory[];
65
+ }
66
+ interface TestCategory {
67
+ name: string;
68
+ count: number;
69
+ }
70
+ interface AutotestResult {
71
+ sourceFile: string;
72
+ testFile: string;
73
+ testCount: number;
74
+ categories: TestCategory[];
75
+ duration: number;
76
+ tokensUsed: number;
77
+ verified?: boolean;
78
+ verifyIterations?: number;
79
+ }
80
+
81
+ /**
82
+ * Main orchestrator: analyze → prompt → generate → write → (verify → fix).
83
+ */
84
+ declare function generateTests(sourceFile: string, config: AutotestConfig, options?: {
85
+ onChunk?: (text: string) => void;
86
+ onStatus?: (msg: string) => void;
87
+ dryRun?: boolean;
88
+ verify?: boolean;
89
+ maxFixIterations?: number;
90
+ }): Promise<AutotestResult>;
91
+
92
+ /**
93
+ * Analyze a source file and extract its exported symbols, imports, and structure.
94
+ * Uses the TypeScript compiler API for accurate parsing.
95
+ */
96
+ declare function analyzeFile(filePath: string): AnalyzedFile;
97
+
98
+ /**
99
+ * Follow relative imports from the analyzed file and collect their source code
100
+ * as additional context for the LLM.
101
+ */
102
+ declare function gatherImportContext(analysis: AnalyzedFile, maxFiles?: number, maxCharsPerFile?: number): ImportContext[];
103
+ interface ImportContext {
104
+ importPath: string;
105
+ resolvedPath: string;
106
+ specifiers: string[];
107
+ content: string;
108
+ }
109
+
110
+ /**
111
+ * Resolve the final config by merging: defaults < config file < CLI flags.
112
+ */
113
+ declare function resolveConfig(cliFlags: Partial<AutotestConfig>, cwd?: string): AutotestConfig;
114
+
115
+ interface FrameworkInfo {
116
+ name: TestFramework;
117
+ imports: string;
118
+ runCommand: string;
119
+ filePattern: string;
120
+ coverageCommand: string;
121
+ }
122
+ declare function getFrameworkInfo(framework: TestFramework): FrameworkInfo;
123
+ /**
124
+ * Detect which test framework the project uses by checking package.json.
125
+ */
126
+ declare function detectFramework(packageJson: Record<string, unknown>): TestFramework;
127
+
128
+ interface TestRunResult {
129
+ passed: boolean;
130
+ output: string;
131
+ failures: TestFailure[];
132
+ totalTests: number;
133
+ passedTests: number;
134
+ failedTests: number;
135
+ }
136
+ interface TestFailure {
137
+ testName: string;
138
+ error: string;
139
+ expected?: string;
140
+ received?: string;
141
+ }
142
+ /**
143
+ * Run a test file and collect results.
144
+ */
145
+ declare function runTestFile(testFile: string, framework: TestFramework, cwd?: string): TestRunResult;
146
+
147
+ interface VerifyResult {
148
+ passed: boolean;
149
+ iterations: number;
150
+ totalTests: number;
151
+ passedTests: number;
152
+ failedTests: number;
153
+ finalTestCode: string;
154
+ }
155
+ /**
156
+ * Verify & auto-fix loop:
157
+ * 1. Run the generated tests
158
+ * 2. If failures, send them to the LLM for fixing
159
+ * 3. Write the fixed tests
160
+ * 4. Repeat until all pass or maxIterations reached
161
+ */
162
+ declare function verifyAndFix(sourceFile: string, testFile: string, config: AutotestConfig, options?: {
163
+ maxIterations?: number;
164
+ onChunk?: (text: string) => void;
165
+ onStatus?: (msg: string) => void;
166
+ }): Promise<VerifyResult>;
167
+
168
+ interface CoverageData {
169
+ files: CoverageFile[];
170
+ totalLines: number;
171
+ coveredLines: number;
172
+ overallRate: number;
173
+ }
174
+ interface CoverageFile {
175
+ filePath: string;
176
+ relativePath: string;
177
+ lineRate: number;
178
+ branchRate: number;
179
+ uncoveredLines: number[];
180
+ totalLines: number;
181
+ coveredLines: number;
182
+ hasTests: boolean;
183
+ }
184
+ /**
185
+ * Parse LCOV format coverage data.
186
+ */
187
+ declare function parseLcov(lcovPath: string, cwd: string): CoverageData;
188
+ /**
189
+ * Parse Cobertura XML coverage data.
190
+ */
191
+ declare function parseCobertura(xmlPath: string, cwd: string): CoverageData;
192
+ /**
193
+ * Auto-detect and parse coverage data from common locations.
194
+ */
195
+ declare function loadCoverage(cwd: string): CoverageData | null;
196
+ /**
197
+ * Get files that need test generation, sorted by lowest coverage first.
198
+ */
199
+ declare function getUncoveredFiles(coverage: CoverageData, targetRate?: number): CoverageFile[];
200
+
201
+ export { type AnalyzedFile, type AutotestConfig, type AutotestResult, type CoverageData, type CoverageFile, DEFAULT_CONFIG, type ExportedSymbol, type GeneratedTest, type ImportContext, type ImportStatement, type ParameterInfo, type SymbolKind, type TestCategory, type TestFailure, type TestFramework, type TestRunResult, analyzeFile, detectFramework, gatherImportContext, generateTests, getFrameworkInfo, getUncoveredFiles, loadCoverage, parseCobertura, parseLcov, resolveConfig, runTestFile, verifyAndFix };