codeprobe 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 +406 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +104 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ab.d.ts +7 -0
- package/dist/commands/ab.d.ts.map +1 -0
- package/dist/commands/ab.js +230 -0
- package/dist/commands/ab.js.map +1 -0
- package/dist/commands/agents.d.ts +10 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +326 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/autotest.d.ts +10 -0
- package/dist/commands/autotest.d.ts.map +1 -0
- package/dist/commands/autotest.js +408 -0
- package/dist/commands/autotest.js.map +1 -0
- package/dist/commands/benchmark.d.ts +6 -0
- package/dist/commands/benchmark.d.ts.map +1 -0
- package/dist/commands/benchmark.js +215 -0
- package/dist/commands/benchmark.js.map +1 -0
- package/dist/commands/check.d.ts +10 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +333 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/context.d.ts +16 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +219 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/cost.d.ts +9 -0
- package/dist/commands/cost.d.ts.map +1 -0
- package/dist/commands/cost.js +142 -0
- package/dist/commands/cost.js.map +1 -0
- package/dist/commands/dashboard.d.ts +10 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +462 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/diff.d.ts +6 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +118 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +12 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +203 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/explain.d.ts +7 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +164 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/flaky.d.ts +10 -0
- package/dist/commands/flaky.d.ts.map +1 -0
- package/dist/commands/flaky.js +141 -0
- package/dist/commands/flaky.js.map +1 -0
- package/dist/commands/generateClaudeMd.d.ts +11 -0
- package/dist/commands/generateClaudeMd.d.ts.map +1 -0
- package/dist/commands/generateClaudeMd.js +278 -0
- package/dist/commands/generateClaudeMd.js.map +1 -0
- package/dist/commands/generateRules.d.ts +11 -0
- package/dist/commands/generateRules.d.ts.map +1 -0
- package/dist/commands/generateRules.js +413 -0
- package/dist/commands/generateRules.js.map +1 -0
- package/dist/commands/heatmap.d.ts +7 -0
- package/dist/commands/heatmap.d.ts.map +1 -0
- package/dist/commands/heatmap.js +117 -0
- package/dist/commands/heatmap.js.map +1 -0
- package/dist/commands/history.d.ts +13 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +113 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/hooks.d.ts +9 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +199 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/improve.d.ts +7 -0
- package/dist/commands/improve.d.ts.map +1 -0
- package/dist/commands/improve.js +192 -0
- package/dist/commands/improve.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +270 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/installHook.d.ts +9 -0
- package/dist/commands/installHook.d.ts.map +1 -0
- package/dist/commands/installHook.js +78 -0
- package/dist/commands/installHook.js.map +1 -0
- package/dist/commands/lint.d.ts +6 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +237 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/map.d.ts +9 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +114 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/mcp.d.ts +6 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +151 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/models.d.ts +9 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +89 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/pack.d.ts +10 -0
- package/dist/commands/pack.d.ts.map +1 -0
- package/dist/commands/pack.js +248 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/recommend.d.ts +10 -0
- package/dist/commands/recommend.d.ts.map +1 -0
- package/dist/commands/recommend.js +472 -0
- package/dist/commands/recommend.js.map +1 -0
- package/dist/commands/regression.d.ts +10 -0
- package/dist/commands/regression.d.ts.map +1 -0
- package/dist/commands/regression.js +212 -0
- package/dist/commands/regression.js.map +1 -0
- package/dist/commands/repl.d.ts +9 -0
- package/dist/commands/repl.d.ts.map +1 -0
- package/dist/commands/repl.js +245 -0
- package/dist/commands/repl.js.map +1 -0
- package/dist/commands/scan.d.ts +10 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +352 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/score.d.ts +10 -0
- package/dist/commands/score.d.ts.map +1 -0
- package/dist/commands/score.js +192 -0
- package/dist/commands/score.js.map +1 -0
- package/dist/commands/security.d.ts +10 -0
- package/dist/commands/security.d.ts.map +1 -0
- package/dist/commands/security.js +211 -0
- package/dist/commands/security.js.map +1 -0
- package/dist/commands/simulate.d.ts +7 -0
- package/dist/commands/simulate.d.ts.map +1 -0
- package/dist/commands/simulate.js +149 -0
- package/dist/commands/simulate.js.map +1 -0
- package/dist/commands/summary.d.ts +9 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +271 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/test.d.ts +9 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +219 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/ui.d.ts +8 -0
- package/dist/commands/ui.d.ts.map +1 -0
- package/dist/commands/ui.js +222 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/commands/validate.d.ts +7 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +254 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/workflow.d.ts +39 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +309 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/core/__tests__/contextAnalyzer.test.d.ts +2 -0
- package/dist/core/__tests__/contextAnalyzer.test.d.ts.map +1 -0
- package/dist/core/__tests__/contextAnalyzer.test.js +48 -0
- package/dist/core/__tests__/contextAnalyzer.test.js.map +1 -0
- package/dist/core/__tests__/promptLinter.test.d.ts +2 -0
- package/dist/core/__tests__/promptLinter.test.d.ts.map +1 -0
- package/dist/core/__tests__/promptLinter.test.js +74 -0
- package/dist/core/__tests__/promptLinter.test.js.map +1 -0
- package/dist/core/__tests__/promptRunner.test.d.ts +2 -0
- package/dist/core/__tests__/promptRunner.test.d.ts.map +1 -0
- package/dist/core/__tests__/promptRunner.test.js +84 -0
- package/dist/core/__tests__/promptRunner.test.js.map +1 -0
- package/dist/core/__tests__/securityScanner.test.d.ts +2 -0
- package/dist/core/__tests__/securityScanner.test.d.ts.map +1 -0
- package/dist/core/__tests__/securityScanner.test.js +39 -0
- package/dist/core/__tests__/securityScanner.test.js.map +1 -0
- package/dist/core/agentTracer.d.ts +21 -0
- package/dist/core/agentTracer.d.ts.map +1 -0
- package/dist/core/agentTracer.js +355 -0
- package/dist/core/agentTracer.js.map +1 -0
- package/dist/core/anthropicClient.d.ts +26 -0
- package/dist/core/anthropicClient.d.ts.map +1 -0
- package/dist/core/anthropicClient.js +62 -0
- package/dist/core/anthropicClient.js.map +1 -0
- package/dist/core/benchmarkRunner.d.ts +25 -0
- package/dist/core/benchmarkRunner.d.ts.map +1 -0
- package/dist/core/benchmarkRunner.js +182 -0
- package/dist/core/benchmarkRunner.js.map +1 -0
- package/dist/core/contextAnalyzer.d.ts +19 -0
- package/dist/core/contextAnalyzer.d.ts.map +1 -0
- package/dist/core/contextAnalyzer.js +221 -0
- package/dist/core/contextAnalyzer.js.map +1 -0
- package/dist/core/contextPacker.d.ts +26 -0
- package/dist/core/contextPacker.d.ts.map +1 -0
- package/dist/core/contextPacker.js +358 -0
- package/dist/core/contextPacker.js.map +1 -0
- package/dist/core/datasetRunner.d.ts +10 -0
- package/dist/core/datasetRunner.d.ts.map +1 -0
- package/dist/core/datasetRunner.js +130 -0
- package/dist/core/datasetRunner.js.map +1 -0
- package/dist/core/doctorRunner.d.ts +24 -0
- package/dist/core/doctorRunner.d.ts.map +1 -0
- package/dist/core/doctorRunner.js +278 -0
- package/dist/core/doctorRunner.js.map +1 -0
- package/dist/core/hookScanner.d.ts +24 -0
- package/dist/core/hookScanner.d.ts.map +1 -0
- package/dist/core/hookScanner.js +226 -0
- package/dist/core/hookScanner.js.map +1 -0
- package/dist/core/mcpScanner.d.ts +22 -0
- package/dist/core/mcpScanner.d.ts.map +1 -0
- package/dist/core/mcpScanner.js +290 -0
- package/dist/core/mcpScanner.js.map +1 -0
- package/dist/core/modelRegistry.d.ts +35 -0
- package/dist/core/modelRegistry.d.ts.map +1 -0
- package/dist/core/modelRegistry.js +97 -0
- package/dist/core/modelRegistry.js.map +1 -0
- package/dist/core/promptDiff.d.ts +25 -0
- package/dist/core/promptDiff.d.ts.map +1 -0
- package/dist/core/promptDiff.js +130 -0
- package/dist/core/promptDiff.js.map +1 -0
- package/dist/core/promptExplainer.d.ts +17 -0
- package/dist/core/promptExplainer.d.ts.map +1 -0
- package/dist/core/promptExplainer.js +334 -0
- package/dist/core/promptExplainer.js.map +1 -0
- package/dist/core/promptImprover.d.ts +19 -0
- package/dist/core/promptImprover.d.ts.map +1 -0
- package/dist/core/promptImprover.js +260 -0
- package/dist/core/promptImprover.js.map +1 -0
- package/dist/core/promptLinter.d.ts +24 -0
- package/dist/core/promptLinter.d.ts.map +1 -0
- package/dist/core/promptLinter.js +319 -0
- package/dist/core/promptLinter.js.map +1 -0
- package/dist/core/promptRunner.d.ts +31 -0
- package/dist/core/promptRunner.d.ts.map +1 -0
- package/dist/core/promptRunner.js +427 -0
- package/dist/core/promptRunner.js.map +1 -0
- package/dist/core/providers/anthropic.d.ts +10 -0
- package/dist/core/providers/anthropic.d.ts.map +1 -0
- package/dist/core/providers/anthropic.js +26 -0
- package/dist/core/providers/anthropic.js.map +1 -0
- package/dist/core/providers/base.d.ts +22 -0
- package/dist/core/providers/base.d.ts.map +1 -0
- package/dist/core/providers/base.js +2 -0
- package/dist/core/providers/base.js.map +1 -0
- package/dist/core/providers/factory.d.ts +7 -0
- package/dist/core/providers/factory.d.ts.map +1 -0
- package/dist/core/providers/factory.js +42 -0
- package/dist/core/providers/factory.js.map +1 -0
- package/dist/core/providers/google.d.ts +10 -0
- package/dist/core/providers/google.d.ts.map +1 -0
- package/dist/core/providers/google.js +47 -0
- package/dist/core/providers/google.js.map +1 -0
- package/dist/core/providers/openai.d.ts +19 -0
- package/dist/core/providers/openai.d.ts.map +1 -0
- package/dist/core/providers/openai.js +54 -0
- package/dist/core/providers/openai.js.map +1 -0
- package/dist/core/regressionRunner.d.ts +11 -0
- package/dist/core/regressionRunner.d.ts.map +1 -0
- package/dist/core/regressionRunner.js +116 -0
- package/dist/core/regressionRunner.js.map +1 -0
- package/dist/core/repositorySimulator.d.ts +17 -0
- package/dist/core/repositorySimulator.d.ts.map +1 -0
- package/dist/core/repositorySimulator.js +104 -0
- package/dist/core/repositorySimulator.js.map +1 -0
- package/dist/core/scorer.d.ts +30 -0
- package/dist/core/scorer.d.ts.map +1 -0
- package/dist/core/scorer.js +317 -0
- package/dist/core/scorer.js.map +1 -0
- package/dist/core/securityScanner.d.ts +23 -0
- package/dist/core/securityScanner.d.ts.map +1 -0
- package/dist/core/securityScanner.js +216 -0
- package/dist/core/securityScanner.js.map +1 -0
- package/dist/core/skillValidator.d.ts +41 -0
- package/dist/core/skillValidator.d.ts.map +1 -0
- package/dist/core/skillValidator.js +235 -0
- package/dist/core/skillValidator.js.map +1 -0
- package/dist/core/testHistory.d.ts +44 -0
- package/dist/core/testHistory.d.ts.map +1 -0
- package/dist/core/testHistory.js +91 -0
- package/dist/core/testHistory.js.map +1 -0
- package/dist/tokenizers/claudeTokenizer.d.ts +26 -0
- package/dist/tokenizers/claudeTokenizer.d.ts.map +1 -0
- package/dist/tokenizers/claudeTokenizer.js +83 -0
- package/dist/tokenizers/claudeTokenizer.js.map +1 -0
- package/dist/types/agent.d.ts +26 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +5 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/config.d.ts +30 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/context.d.ts +77 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +5 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/dataset.d.ts +26 -0
- package/dist/types/dataset.d.ts.map +1 -0
- package/dist/types/dataset.js +5 -0
- package/dist/types/dataset.js.map +1 -0
- package/dist/types/diagnostics.d.ts +31 -0
- package/dist/types/diagnostics.d.ts.map +1 -0
- package/dist/types/diagnostics.js +5 -0
- package/dist/types/diagnostics.js.map +1 -0
- package/dist/types/prompt.d.ts +53 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +5 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/results.d.ts +42 -0
- package/dist/types/results.d.ts.map +1 -0
- package/dist/types/results.js +5 -0
- package/dist/types/results.js.map +1 -0
- package/dist/ui/dashboard.d.ts +57 -0
- package/dist/ui/dashboard.d.ts.map +1 -0
- package/dist/ui/dashboard.js +644 -0
- package/dist/ui/dashboard.js.map +1 -0
- package/dist/utils/__tests__/hashing.test.d.ts +2 -0
- package/dist/utils/__tests__/hashing.test.d.ts.map +1 -0
- package/dist/utils/__tests__/hashing.test.js +28 -0
- package/dist/utils/__tests__/hashing.test.js.map +1 -0
- package/dist/utils/__tests__/output.test.d.ts +2 -0
- package/dist/utils/__tests__/output.test.d.ts.map +1 -0
- package/dist/utils/__tests__/output.test.js +62 -0
- package/dist/utils/__tests__/output.test.js.map +1 -0
- package/dist/utils/cache.d.ts +29 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +87 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +15 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +61 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/errors.d.ts +43 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +83 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/fs.d.ts +44 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +119 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/hashing.d.ts +13 -0
- package/dist/utils/hashing.d.ts.map +1 -0
- package/dist/utils/hashing.js +18 -0
- package/dist/utils/hashing.js.map +1 -0
- package/dist/utils/logger.d.ts +32 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +76 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/output.d.ts +34 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +99 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/paths.d.ts +33 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +51 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/spinner.d.ts +23 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +79 -0
- package/dist/utils/spinner.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context packer — the killer feature.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes a repository, categorizes files, ranks them by likely usefulness,
|
|
5
|
+
* and builds an optimal pack plan that maximizes value within a context
|
|
6
|
+
* window budget.
|
|
7
|
+
*/
|
|
8
|
+
import { resolve, basename, dirname } from 'node:path';
|
|
9
|
+
import { analyzeContext } from './contextAnalyzer.js';
|
|
10
|
+
import { walkDirectory, readTextFile } from '../utils/fs.js';
|
|
11
|
+
import { estimateTokens } from '../tokenizers/claudeTokenizer.js';
|
|
12
|
+
import { logger } from '../utils/logger.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// File categorization heuristics
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Lock / dependency-resolution files — excluded from pack plans. */
|
|
17
|
+
const EXCLUDED_FILENAMES = new Set([
|
|
18
|
+
'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb',
|
|
19
|
+
'composer.lock', 'gemfile.lock', 'poetry.lock', 'cargo.lock',
|
|
20
|
+
'go.sum', 'flake.lock', 'packages.lock.json', 'shrinkwrap.json',
|
|
21
|
+
]);
|
|
22
|
+
/** Extensions that indicate core source code. */
|
|
23
|
+
const CORE_SOURCE_EXTENSIONS = new Set([
|
|
24
|
+
'.ts', '.js', '.py', '.go', '.rs', '.java', '.rb',
|
|
25
|
+
'.tsx', '.jsx', '.vue', '.svelte', '.swift', '.kt',
|
|
26
|
+
'.cs', '.cpp', '.c', '.h', '.hpp', '.scala', '.clj',
|
|
27
|
+
'.ex', '.exs', '.hs', '.ml', '.mli', '.php',
|
|
28
|
+
]);
|
|
29
|
+
/** Extensions that indicate documentation. */
|
|
30
|
+
const DOC_EXTENSIONS = new Set([
|
|
31
|
+
'.md', '.txt', '.rst', '.adoc', '.org',
|
|
32
|
+
]);
|
|
33
|
+
/** Extensions that indicate config files. */
|
|
34
|
+
const CONFIG_EXTENSIONS = new Set([
|
|
35
|
+
'.json', '.yaml', '.yml', '.toml', '.ini', '.cfg',
|
|
36
|
+
'.env.example', '.editorconfig', '.prettierrc',
|
|
37
|
+
]);
|
|
38
|
+
/** Directories that indicate core source code. */
|
|
39
|
+
const CORE_DIRS = new Set([
|
|
40
|
+
'src', 'lib', 'app', 'apps', 'packages', 'modules',
|
|
41
|
+
'components', 'pages', 'views', 'controllers', 'services',
|
|
42
|
+
'models', 'utils', 'helpers', 'core',
|
|
43
|
+
]);
|
|
44
|
+
/** Directories that indicate test code. */
|
|
45
|
+
const TEST_DIRS = new Set([
|
|
46
|
+
'test', 'tests', '__tests__', 'spec', 'specs',
|
|
47
|
+
'e2e', 'integration', 'unit', 'fixtures',
|
|
48
|
+
]);
|
|
49
|
+
/** Directories that indicate generated/build output. */
|
|
50
|
+
const GENERATED_DIRS = new Set([
|
|
51
|
+
'dist', 'build', '.next', '.nuxt', 'coverage', 'out',
|
|
52
|
+
'.output', '.cache', '.turbo', 'target',
|
|
53
|
+
]);
|
|
54
|
+
/** Directories that indicate documentation. */
|
|
55
|
+
const DOC_DIRS = new Set([
|
|
56
|
+
'docs', 'doc', 'documentation', 'wiki',
|
|
57
|
+
]);
|
|
58
|
+
/** File name patterns for test files. */
|
|
59
|
+
const TEST_FILE_PATTERNS = [
|
|
60
|
+
/\.test\.\w+$/,
|
|
61
|
+
/\.spec\.\w+$/,
|
|
62
|
+
/_test\.\w+$/,
|
|
63
|
+
/_spec\.\w+$/,
|
|
64
|
+
/test_.*\.\w+$/,
|
|
65
|
+
];
|
|
66
|
+
/** File names that are documentation regardless of extension. */
|
|
67
|
+
const DOC_FILE_NAMES = new Set([
|
|
68
|
+
'readme', 'changelog', 'changes', 'history',
|
|
69
|
+
'contributing', 'license', 'authors', 'todo',
|
|
70
|
+
'claude.md', 'claude',
|
|
71
|
+
]);
|
|
72
|
+
/** Config file names (exact match, case-insensitive). */
|
|
73
|
+
const CONFIG_FILE_NAMES = new Set([
|
|
74
|
+
'package.json', 'tsconfig.json', 'jest.config.js',
|
|
75
|
+
'vite.config.ts', 'webpack.config.js', 'rollup.config.js',
|
|
76
|
+
'babel.config.js', '.babelrc', '.eslintrc', '.eslintrc.js',
|
|
77
|
+
'.eslintrc.json', '.prettierrc', '.prettierrc.js',
|
|
78
|
+
'tailwind.config.js', 'tailwind.config.ts',
|
|
79
|
+
'postcss.config.js', 'next.config.js', 'next.config.mjs',
|
|
80
|
+
'nuxt.config.ts', 'svelte.config.js',
|
|
81
|
+
'docker-compose.yml', 'docker-compose.yaml',
|
|
82
|
+
'dockerfile', 'makefile', 'cargo.toml', 'go.mod',
|
|
83
|
+
'go.sum', 'requirements.txt', 'pyproject.toml',
|
|
84
|
+
'gemfile', 'mix.exs', 'build.gradle', 'pom.xml',
|
|
85
|
+
]);
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Categorization logic
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
function categorizeFile(relativePath, extension) {
|
|
90
|
+
const lowerPath = relativePath.toLowerCase();
|
|
91
|
+
const fileName = basename(lowerPath);
|
|
92
|
+
const dirParts = dirname(lowerPath).split('/').filter(Boolean);
|
|
93
|
+
// Check if it's in a generated directory
|
|
94
|
+
for (const part of dirParts) {
|
|
95
|
+
if (GENERATED_DIRS.has(part)) {
|
|
96
|
+
return 'generated';
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Check if it's a test file by name pattern
|
|
100
|
+
for (const pattern of TEST_FILE_PATTERNS) {
|
|
101
|
+
if (pattern.test(fileName)) {
|
|
102
|
+
return 'tests';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Check if it's in a test directory
|
|
106
|
+
for (const part of dirParts) {
|
|
107
|
+
if (TEST_DIRS.has(part)) {
|
|
108
|
+
return 'tests';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Check if it's a known config file
|
|
112
|
+
if (CONFIG_FILE_NAMES.has(fileName)) {
|
|
113
|
+
return 'configs';
|
|
114
|
+
}
|
|
115
|
+
// Check if it's a documentation file
|
|
116
|
+
const nameWithoutExt = fileName.replace(/\.[^.]+$/, '');
|
|
117
|
+
if (DOC_FILE_NAMES.has(nameWithoutExt)) {
|
|
118
|
+
return 'docs';
|
|
119
|
+
}
|
|
120
|
+
// Check by directory
|
|
121
|
+
for (const part of dirParts) {
|
|
122
|
+
if (DOC_DIRS.has(part)) {
|
|
123
|
+
return 'docs';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Check by extension
|
|
127
|
+
if (DOC_EXTENSIONS.has(extension)) {
|
|
128
|
+
return 'docs';
|
|
129
|
+
}
|
|
130
|
+
if (CONFIG_EXTENSIONS.has(extension)) {
|
|
131
|
+
return 'configs';
|
|
132
|
+
}
|
|
133
|
+
if (CORE_SOURCE_EXTENSIONS.has(extension)) {
|
|
134
|
+
// Bonus: check if in a core directory
|
|
135
|
+
return 'core';
|
|
136
|
+
}
|
|
137
|
+
return 'assets';
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Assign a priority score to a categorized file.
|
|
141
|
+
* Higher scores = higher priority for inclusion.
|
|
142
|
+
*/
|
|
143
|
+
function assignPriority(file) {
|
|
144
|
+
const dirParts = dirname(file.path).split('/').filter(Boolean);
|
|
145
|
+
let priority = 0;
|
|
146
|
+
switch (file.category) {
|
|
147
|
+
case 'core':
|
|
148
|
+
priority = 100;
|
|
149
|
+
// Boost files in core directories
|
|
150
|
+
for (const part of dirParts) {
|
|
151
|
+
if (CORE_DIRS.has(part)) {
|
|
152
|
+
priority += 20;
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Boost smaller files (more likely to be focused modules)
|
|
157
|
+
if (file.estimatedTokens < 500)
|
|
158
|
+
priority += 10;
|
|
159
|
+
if (file.estimatedTokens < 200)
|
|
160
|
+
priority += 5;
|
|
161
|
+
break;
|
|
162
|
+
case 'docs':
|
|
163
|
+
priority = 60;
|
|
164
|
+
// Boost README and CLAUDE.md
|
|
165
|
+
const fileName = basename(file.path).toLowerCase();
|
|
166
|
+
if (fileName === 'readme.md' || fileName === 'readme')
|
|
167
|
+
priority += 30;
|
|
168
|
+
if (fileName === 'claude.md')
|
|
169
|
+
priority += 25;
|
|
170
|
+
if (fileName === 'changelog.md')
|
|
171
|
+
priority += 10;
|
|
172
|
+
break;
|
|
173
|
+
case 'configs':
|
|
174
|
+
priority = 50;
|
|
175
|
+
// Boost root-level configs
|
|
176
|
+
if (dirParts.length <= 1)
|
|
177
|
+
priority += 15;
|
|
178
|
+
break;
|
|
179
|
+
case 'tests':
|
|
180
|
+
priority = 30;
|
|
181
|
+
break;
|
|
182
|
+
case 'generated':
|
|
183
|
+
priority = 5;
|
|
184
|
+
break;
|
|
185
|
+
case 'assets':
|
|
186
|
+
priority = 10;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
return priority;
|
|
190
|
+
}
|
|
191
|
+
function allocateBudgets(targetTokens, config) {
|
|
192
|
+
const budgets = config?.contextBudgets;
|
|
193
|
+
// Normalize: if values are > 1, they're percentages (e.g. 10 = 10%); convert to fractions
|
|
194
|
+
const norm = (v, fallback) => {
|
|
195
|
+
const val = v ?? fallback;
|
|
196
|
+
return val > 1 ? val / 100 : val;
|
|
197
|
+
};
|
|
198
|
+
const systemPromptFrac = norm(budgets?.systemPrompt, 0.10);
|
|
199
|
+
const coreFilesFrac = norm(budgets?.coreFiles, 0.50);
|
|
200
|
+
const docsFrac = norm(budgets?.docs, 0.20);
|
|
201
|
+
const toolMetaFrac = norm(budgets?.toolMeta, 0.10);
|
|
202
|
+
const freeFrac = 1.0 - systemPromptFrac - coreFilesFrac - docsFrac - toolMetaFrac;
|
|
203
|
+
return {
|
|
204
|
+
systemPrompt: Math.round(targetTokens * systemPromptFrac),
|
|
205
|
+
coreFiles: Math.round(targetTokens * coreFilesFrac),
|
|
206
|
+
docs: Math.round(targetTokens * docsFrac),
|
|
207
|
+
toolMeta: Math.round(targetTokens * toolMetaFrac),
|
|
208
|
+
free: Math.round(targetTokens * Math.max(freeFrac, 0)),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
// Packing algorithm
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
/**
|
|
215
|
+
* Pack files into budget buckets using a greedy approach.
|
|
216
|
+
* Files are sorted by priority (descending), then by token count (ascending)
|
|
217
|
+
* to maximize the number of high-value files that fit.
|
|
218
|
+
*/
|
|
219
|
+
function packFiles(files, budgets) {
|
|
220
|
+
const included = [];
|
|
221
|
+
const summarize = [];
|
|
222
|
+
const excluded = [];
|
|
223
|
+
// Sort by priority desc, then by token count asc (fit more smaller files)
|
|
224
|
+
const sorted = [...files].sort((a, b) => {
|
|
225
|
+
if (b.priority !== a.priority)
|
|
226
|
+
return b.priority - a.priority;
|
|
227
|
+
return a.estimatedTokens - b.estimatedTokens;
|
|
228
|
+
});
|
|
229
|
+
// Track remaining budget per category
|
|
230
|
+
const remaining = {
|
|
231
|
+
core: budgets.coreFiles,
|
|
232
|
+
docs: budgets.docs,
|
|
233
|
+
configs: budgets.toolMeta,
|
|
234
|
+
tests: budgets.free,
|
|
235
|
+
assets: 0,
|
|
236
|
+
generated: 0,
|
|
237
|
+
};
|
|
238
|
+
// Also track a spillover budget from free allocation
|
|
239
|
+
let spillover = budgets.free;
|
|
240
|
+
for (const file of sorted) {
|
|
241
|
+
const categoryBudget = remaining[file.category];
|
|
242
|
+
if (file.category === 'generated' || file.category === 'assets') {
|
|
243
|
+
excluded.push(file);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (file.estimatedTokens <= categoryBudget) {
|
|
247
|
+
// Fits in its category budget
|
|
248
|
+
remaining[file.category] -= file.estimatedTokens;
|
|
249
|
+
included.push(file);
|
|
250
|
+
}
|
|
251
|
+
else if (file.estimatedTokens <= spillover) {
|
|
252
|
+
// Fits in the spillover/free budget
|
|
253
|
+
spillover -= file.estimatedTokens;
|
|
254
|
+
included.push(file);
|
|
255
|
+
}
|
|
256
|
+
else if (file.estimatedTokens > 2000 && file.category === 'core') {
|
|
257
|
+
// Large core file: recommend summarizing
|
|
258
|
+
summarize.push(file);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
excluded.push(file);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return { included, summarize, excluded };
|
|
265
|
+
}
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
// Public API
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
/**
|
|
270
|
+
* Build an optimized context pack plan for a repository.
|
|
271
|
+
*
|
|
272
|
+
* 1. Analyzes the repo using contextAnalyzer
|
|
273
|
+
* 2. Categorizes files (core, docs, configs, tests, assets, generated)
|
|
274
|
+
* 3. Ranks files by likely usefulness
|
|
275
|
+
* 4. Allocates budgets per category
|
|
276
|
+
* 5. Packs files greedily into the target context window
|
|
277
|
+
* 6. Returns a plan with include/summarize/exclude recommendations
|
|
278
|
+
*/
|
|
279
|
+
export async function packContext(rootPath, options) {
|
|
280
|
+
const absoluteRoot = resolve(rootPath);
|
|
281
|
+
const targetTokens = options.target === '200k' ? 200_000 : 1_000_000;
|
|
282
|
+
const targetLabel = options.target === '200k' ? '200k' : '1M';
|
|
283
|
+
logger.debug(`Packing context for ${absoluteRoot} (target: ${targetLabel})`);
|
|
284
|
+
// Step 1: Run the full analysis (used for validation / logging)
|
|
285
|
+
await analyzeContext(absoluteRoot, options.config);
|
|
286
|
+
// Step 2 & 3: Categorize and rank all text files
|
|
287
|
+
const ignoreDirs = new Set([
|
|
288
|
+
'node_modules', '.git', 'dist', 'build', 'coverage',
|
|
289
|
+
'.DS_Store', '__pycache__', '.next', '.nuxt', '.svelte-kit',
|
|
290
|
+
'.turbo', '.vercel', 'vendor', '.venv', 'env', '.env',
|
|
291
|
+
]);
|
|
292
|
+
if (options.config?.ignorePaths) {
|
|
293
|
+
for (const p of options.config.ignorePaths) {
|
|
294
|
+
ignoreDirs.add(p);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const entries = await walkDirectory(absoluteRoot, { ignoreDirs });
|
|
298
|
+
const fileEntries = entries.filter((e) => e.isFile);
|
|
299
|
+
const categorizedFiles = [];
|
|
300
|
+
for (const entry of fileEntries) {
|
|
301
|
+
// Skip lock / dependency-resolution files
|
|
302
|
+
if (EXCLUDED_FILENAMES.has(basename(entry.path).toLowerCase()))
|
|
303
|
+
continue;
|
|
304
|
+
// Skip binary extensions
|
|
305
|
+
const binaryExts = new Set([
|
|
306
|
+
'.png', '.jpg', '.jpeg', '.gif', '.ico', '.woff', '.woff2',
|
|
307
|
+
'.ttf', '.eot', '.mp3', '.mp4', '.zip', '.tar', '.gz',
|
|
308
|
+
'.pdf', '.exe', '.dll', '.so', '.dylib', '.class', '.pyc',
|
|
309
|
+
'.o', '.obj', '.bin', '.dat', '.sqlite', '.db',
|
|
310
|
+
]);
|
|
311
|
+
if (binaryExts.has(entry.extension)) {
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
const content = await readTextFile(entry.path);
|
|
315
|
+
if (content === null) {
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
const tokens = estimateTokens(content);
|
|
319
|
+
const category = categorizeFile(entry.relativePath, entry.extension);
|
|
320
|
+
const file = {
|
|
321
|
+
path: entry.relativePath,
|
|
322
|
+
bytes: entry.size,
|
|
323
|
+
estimatedTokens: tokens,
|
|
324
|
+
category,
|
|
325
|
+
priority: 0,
|
|
326
|
+
};
|
|
327
|
+
file.priority = assignPriority(file);
|
|
328
|
+
categorizedFiles.push(file);
|
|
329
|
+
}
|
|
330
|
+
// Step 4: Allocate budgets
|
|
331
|
+
const budgets = allocateBudgets(targetTokens, options.config);
|
|
332
|
+
// Step 5: Pack files into budgets
|
|
333
|
+
const { included, summarize, excluded } = packFiles(categorizedFiles, budgets);
|
|
334
|
+
// Calculate total tokens for included files
|
|
335
|
+
const totalIncluded = included.reduce((sum, f) => sum + f.estimatedTokens, 0);
|
|
336
|
+
// Strip category/priority from the public FileTokenInfo results
|
|
337
|
+
const toFileTokenInfo = (f) => ({
|
|
338
|
+
path: f.path,
|
|
339
|
+
bytes: f.bytes,
|
|
340
|
+
estimatedTokens: f.estimatedTokens,
|
|
341
|
+
});
|
|
342
|
+
const plan = {
|
|
343
|
+
target: targetTokens,
|
|
344
|
+
targetLabel,
|
|
345
|
+
systemPromptBudget: budgets.systemPrompt,
|
|
346
|
+
coreFilesBudget: budgets.coreFiles,
|
|
347
|
+
docsBudget: budgets.docs,
|
|
348
|
+
toolMetaBudget: budgets.toolMeta,
|
|
349
|
+
remainingFree: budgets.free,
|
|
350
|
+
includeFirst: included.map(toFileTokenInfo),
|
|
351
|
+
summarize: summarize.map(toFileTokenInfo),
|
|
352
|
+
exclude: excluded.map(toFileTokenInfo),
|
|
353
|
+
totalEstimatedTokens: totalIncluded,
|
|
354
|
+
};
|
|
355
|
+
logger.debug(`Pack plan: ${included.length} include, ${summarize.length} summarize, ${excluded.length} exclude (${totalIncluded} tokens)`);
|
|
356
|
+
return plan;
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=contextPacker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextPacker.js","sourceRoot":"","sources":["../../src/core/contextPacker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAmB5C,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E,qEAAqE;AACrE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,mBAAmB,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW;IAC/D,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY;IAC5D,QAAQ,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB;CAChE,CAAC,CAAC;AAEH,iDAAiD;AACjD,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK;IACjD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK;IAClD,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IACnD,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;CAC5C,CAAC,CAAC;AAEH,8CAA8C;AAC9C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CACvC,CAAC,CAAC;AAEH,6CAA6C;AAC7C,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IACjD,cAAc,EAAE,eAAe,EAAE,aAAa;CAC/C,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS;IAClD,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU;IACzD,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM;CACrC,CAAC,CAAC;AAEH,2CAA2C;AAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO;IAC7C,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU;CACzC,CAAC,CAAC;AAEH,wDAAwD;AACxD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK;IACpD,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;CACxC,CAAC,CAAC;AAEH,+CAA+C;AAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM;CACvC,CAAC,CAAC;AAEH,yCAAyC;AACzC,MAAM,kBAAkB,GAAG;IACzB,cAAc;IACd,cAAc;IACd,aAAa;IACb,aAAa;IACb,eAAe;CAChB,CAAC;AAEF,iEAAiE;AACjE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS;IAC3C,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM;IAC5C,WAAW,EAAE,QAAQ;CACtB,CAAC,CAAC;AAEH,yDAAyD;AACzD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,cAAc,EAAE,eAAe,EAAE,gBAAgB;IACjD,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB;IACzD,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc;IAC1D,gBAAgB,EAAE,aAAa,EAAE,gBAAgB;IACjD,oBAAoB,EAAE,oBAAoB;IAC1C,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB;IACxD,gBAAgB,EAAE,kBAAkB;IACpC,oBAAoB,EAAE,qBAAqB;IAC3C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ;IAChD,QAAQ,EAAE,kBAAkB,EAAE,gBAAgB;IAC9C,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS;CAChD,CAAC,CAAC;AAEH,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,cAAc,CAAC,YAAoB,EAAE,SAAiB;IAC7D,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE/D,yCAAyC;IACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,qCAAqC;IACrC,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qBAAqB;IACrB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,sCAAsC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAqB;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,MAAM;YACT,QAAQ,GAAG,GAAG,CAAC;YACf,kCAAkC;YAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,QAAQ,IAAI,EAAE,CAAC;oBACf,MAAM;gBACR,CAAC;YACH,CAAC;YACD,0DAA0D;YAC1D,IAAI,IAAI,CAAC,eAAe,GAAG,GAAG;gBAAE,QAAQ,IAAI,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,eAAe,GAAG,GAAG;gBAAE,QAAQ,IAAI,CAAC,CAAC;YAC9C,MAAM;QACR,KAAK,MAAM;YACT,QAAQ,GAAG,EAAE,CAAC;YACd,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,QAAQ;gBAAE,QAAQ,IAAI,EAAE,CAAC;YACtE,IAAI,QAAQ,KAAK,WAAW;gBAAE,QAAQ,IAAI,EAAE,CAAC;YAC7C,IAAI,QAAQ,KAAK,cAAc;gBAAE,QAAQ,IAAI,EAAE,CAAC;YAChD,MAAM;QACR,KAAK,SAAS;YACZ,QAAQ,GAAG,EAAE,CAAC;YACd,2BAA2B;YAC3B,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;gBAAE,QAAQ,IAAI,EAAE,CAAC;YACzC,MAAM;QACR,KAAK,OAAO;YACV,QAAQ,GAAG,EAAE,CAAC;YACd,MAAM;QACR,KAAK,WAAW;YACd,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,KAAK,QAAQ;YACX,QAAQ,GAAG,EAAE,CAAC;YACd,MAAM;IACV,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAcD,SAAS,eAAe,CACtB,YAAoB,EACpB,MAAyB;IAEzB,MAAM,OAAO,GAAG,MAAM,EAAE,cAAc,CAAC;IAEvC,0FAA0F;IAC1F,MAAM,IAAI,GAAG,CAAC,CAAqB,EAAE,QAAgB,EAAU,EAAE;QAC/D,MAAM,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC;QAC1B,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,GAAG,GAAG,gBAAgB,GAAG,aAAa,GAAG,QAAQ,GAAG,YAAY,CAAC;IAElF,OAAO;QACL,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,gBAAgB,CAAC;QACzD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,aAAa,CAAC;QACnD,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC;QACzC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;QACjD,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;GAIG;AACH,SAAS,SAAS,CAChB,KAAwB,EACxB,OAAyB;IAEzB,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,0EAA0E;IAC1E,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC9D,OAAO,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,SAAS,GAAiC;QAC9C,IAAI,EAAE,OAAO,CAAC,SAAS;QACvB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,QAAQ;QACzB,KAAK,EAAE,OAAO,CAAC,IAAI;QACnB,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;KACb,CAAC;IAEF,qDAAqD;IACrD,IAAI,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,IAAI,cAAc,EAAE,CAAC;YAC3C,8BAA8B;YAC9B,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC;YACjD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,CAAC,eAAe,IAAI,SAAS,EAAE,CAAC;YAC7C,oCAAoC;YACpC,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACnE,yCAAyC;YACzC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,OAAoB;IAEpB,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9D,MAAM,CAAC,KAAK,CAAC,uBAAuB,YAAY,aAAa,WAAW,GAAG,CAAC,CAAC;IAE7E,gEAAgE;IAChE,MAAM,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnD,iDAAiD;IACjD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;QACzB,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;QACnD,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa;QAC3D,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;KACtD,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3C,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEpD,MAAM,gBAAgB,GAAsB,EAAE,CAAC;IAE/C,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,0CAA0C;QAC1C,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QAEzE,yBAAyB;QACzB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;YACzB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ;YAC1D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;YACrD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;YACzD,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK;SAC/C,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAErE,MAAM,IAAI,GAAoB;YAC5B,IAAI,EAAE,KAAK,CAAC,YAAY;YACxB,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,eAAe,EAAE,MAAM;YACvB,QAAQ;YACR,QAAQ,EAAE,CAAC;SACZ,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9D,kCAAkC;IAClC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAE/E,4CAA4C;IAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,EACnC,CAAC,CACF,CAAC;IAEF,gEAAgE;IAChE,MAAM,eAAe,GAAG,CAAC,CAAkB,EAAiB,EAAE,CAAC,CAAC;QAC9D,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,eAAe,EAAE,CAAC,CAAC,eAAe;KACnC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAa;QACrB,MAAM,EAAE,YAAY;QACpB,WAAW;QACX,kBAAkB,EAAE,OAAO,CAAC,YAAY;QACxC,eAAe,EAAE,OAAO,CAAC,SAAS;QAClC,UAAU,EAAE,OAAO,CAAC,IAAI;QACxB,cAAc,EAAE,OAAO,CAAC,QAAQ;QAChC,aAAa,EAAE,OAAO,CAAC,IAAI;QAC3B,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;QAC3C,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC;QACzC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;QACtC,oBAAoB,EAAE,aAAa;KACpC,CAAC;IAEF,MAAM,CAAC,KAAK,CACV,cAAc,QAAQ,CAAC,MAAM,aAAa,SAAS,CAAC,MAAM,eAAe,QAAQ,CAAC,MAAM,aAAa,aAAa,UAAU,CAC7H,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dataset test runner — runs a prompt spec against each row in a JSONL dataset.
|
|
3
|
+
*/
|
|
4
|
+
import type { DatasetResult } from '../types/dataset.js';
|
|
5
|
+
import type { RunOptions } from './promptRunner.js';
|
|
6
|
+
/**
|
|
7
|
+
* Run a prompt spec against each row of a JSONL dataset file.
|
|
8
|
+
*/
|
|
9
|
+
export declare function runDatasetTests(specPath: string, datasetPath: string, options: RunOptions): Promise<DatasetResult>;
|
|
10
|
+
//# sourceMappingURL=datasetRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasetRunner.d.ts","sourceRoot":"","sources":["../../src/core/datasetRunner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA+DpD;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,aAAa,CAAC,CAoFxB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dataset test runner — runs a prompt spec against each row in a JSONL dataset.
|
|
3
|
+
*/
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
import { parsePromptSpec, runSingleTest, evaluateAssertions } from './promptRunner.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse a JSONL file into an array of DatasetRow objects.
|
|
10
|
+
*/
|
|
11
|
+
function parseJsonl(content) {
|
|
12
|
+
const rows = [];
|
|
13
|
+
const lines = content.split('\n');
|
|
14
|
+
for (let i = 0; i < lines.length; i++) {
|
|
15
|
+
const line = lines[i].trim();
|
|
16
|
+
if (!line) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(line);
|
|
21
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
22
|
+
logger.warn(`JSONL line ${i + 1}: expected an object, got ${typeof parsed}`);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const obj = parsed;
|
|
26
|
+
if (typeof obj.input !== 'string') {
|
|
27
|
+
logger.warn(`JSONL line ${i + 1}: missing or non-string "input" field`);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const row = {
|
|
31
|
+
input: obj.input,
|
|
32
|
+
};
|
|
33
|
+
if (typeof obj.expected === 'string') {
|
|
34
|
+
row.expected = obj.expected;
|
|
35
|
+
}
|
|
36
|
+
if (typeof obj.metadata === 'object' && obj.metadata !== null) {
|
|
37
|
+
row.metadata = obj.metadata;
|
|
38
|
+
}
|
|
39
|
+
rows.push(row);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
logger.warn(`JSONL line ${i + 1}: invalid JSON, skipping`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return rows;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build a TestExpectation from a dataset row's expected field.
|
|
49
|
+
* If the row has an expected string, create a "contains" assertion for it.
|
|
50
|
+
*/
|
|
51
|
+
function buildExpectationFromRow(row) {
|
|
52
|
+
if (!row.expected) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
contains: [row.expected],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Run a prompt spec against each row of a JSONL dataset file.
|
|
61
|
+
*/
|
|
62
|
+
export async function runDatasetTests(specPath, datasetPath, options) {
|
|
63
|
+
const absoluteSpecPath = resolve(specPath);
|
|
64
|
+
const absoluteDatasetPath = resolve(datasetPath);
|
|
65
|
+
// Parse the prompt spec
|
|
66
|
+
const spec = await parsePromptSpec(absoluteSpecPath);
|
|
67
|
+
// Read and parse the JSONL dataset
|
|
68
|
+
const datasetContent = await readFile(absoluteDatasetPath, 'utf-8');
|
|
69
|
+
const rows = parseJsonl(datasetContent);
|
|
70
|
+
if (rows.length === 0) {
|
|
71
|
+
logger.warn(`No valid rows found in dataset "${absoluteDatasetPath}"`);
|
|
72
|
+
return {
|
|
73
|
+
datasetPath: absoluteDatasetPath,
|
|
74
|
+
promptName: spec.name,
|
|
75
|
+
totalRows: 0,
|
|
76
|
+
passed: 0,
|
|
77
|
+
failed: 0,
|
|
78
|
+
results: [],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
logger.info(`Running "${spec.name}" against ${rows.length} dataset row(s)...`);
|
|
82
|
+
const results = [];
|
|
83
|
+
let passed = 0;
|
|
84
|
+
let failed = 0;
|
|
85
|
+
for (let i = 0; i < rows.length; i++) {
|
|
86
|
+
const row = rows[i];
|
|
87
|
+
// Build a test with the row's input
|
|
88
|
+
const testCase = {
|
|
89
|
+
name: `dataset-row-${i}`,
|
|
90
|
+
input: row.input,
|
|
91
|
+
expect: buildExpectationFromRow(row),
|
|
92
|
+
};
|
|
93
|
+
// Run the test
|
|
94
|
+
const testResult = await runSingleTest(spec, testCase, options);
|
|
95
|
+
// If the dataset row has its own expected field, evaluate those assertions
|
|
96
|
+
let assertions = testResult.assertions;
|
|
97
|
+
if (row.expected && testCase.expect) {
|
|
98
|
+
assertions = evaluateAssertions(testResult.output, testCase.expect);
|
|
99
|
+
}
|
|
100
|
+
const rowPassed = assertions.length === 0 || assertions.every((a) => a.passed);
|
|
101
|
+
if (rowPassed) {
|
|
102
|
+
passed++;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
failed++;
|
|
106
|
+
}
|
|
107
|
+
results.push({
|
|
108
|
+
rowIndex: i,
|
|
109
|
+
input: row.input,
|
|
110
|
+
expected: row.expected,
|
|
111
|
+
output: testResult.output,
|
|
112
|
+
passed: rowPassed,
|
|
113
|
+
assertions,
|
|
114
|
+
});
|
|
115
|
+
if (options.verbose) {
|
|
116
|
+
const status = rowPassed ? 'PASS' : 'FAIL';
|
|
117
|
+
logger.info(` Row ${i}: ${status}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
logger.info(`Dataset run complete: ${passed}/${rows.length} passed, ${failed} failed`);
|
|
121
|
+
return {
|
|
122
|
+
datasetPath: absoluteDatasetPath,
|
|
123
|
+
promptName: spec.name,
|
|
124
|
+
totalRows: rows.length,
|
|
125
|
+
passed,
|
|
126
|
+
failed,
|
|
127
|
+
results,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=datasetRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasetRunner.js","sourceRoot":"","sources":["../../src/core/datasetRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor runner: environment and project diagnostics.
|
|
3
|
+
*
|
|
4
|
+
* Runs a series of checks to verify that the development environment
|
|
5
|
+
* and project structure are properly configured for codeprobe.
|
|
6
|
+
*/
|
|
7
|
+
import type { DiagnosticCheck } from '../types/diagnostics.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run all diagnostic checks and return the results.
|
|
10
|
+
*
|
|
11
|
+
* Checks:
|
|
12
|
+
* 1. Node.js version (>= 18)
|
|
13
|
+
* 2. prompts/ directory exists
|
|
14
|
+
* 3. datasets/ directory exists
|
|
15
|
+
* 4. codeprobe.config.yaml exists
|
|
16
|
+
* 5. ANTHROPIC_API_KEY env var is set
|
|
17
|
+
* 6. .cache/ directory exists/writable
|
|
18
|
+
* 7. package.json exists
|
|
19
|
+
* 8. TypeScript installed
|
|
20
|
+
*
|
|
21
|
+
* @returns Array of diagnostic check results.
|
|
22
|
+
*/
|
|
23
|
+
export declare function runDiagnostics(): Promise<DiagnosticCheck[]>;
|
|
24
|
+
//# sourceMappingURL=doctorRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctorRunner.d.ts","sourceRoot":"","sources":["../../src/core/doctorRunner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AA8Q/D;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAajE"}
|