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,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark runner for AI models.
|
|
3
|
+
*
|
|
4
|
+
* Runs a prompt spec against one or more models, collecting
|
|
5
|
+
* score, token usage, latency, and cost data across multiple runs.
|
|
6
|
+
* Supports a mock mode for offline development and CI pipelines.
|
|
7
|
+
*
|
|
8
|
+
* Pricing and model metadata are sourced from the central model registry.
|
|
9
|
+
*/
|
|
10
|
+
import { readFile } from 'node:fs/promises';
|
|
11
|
+
import yaml from 'js-yaml';
|
|
12
|
+
import { getModel, estimateCost as registryEstimateCost } from './modelRegistry.js';
|
|
13
|
+
/** Default models to benchmark when none are specified. */
|
|
14
|
+
const DEFAULT_MODELS = ['claude-sonnet-4-6', 'claude-opus-4-6'];
|
|
15
|
+
/** Default number of runs per model. */
|
|
16
|
+
const DEFAULT_RUNS = 3;
|
|
17
|
+
/**
|
|
18
|
+
* Rough estimate of token count from a text string.
|
|
19
|
+
* Uses a simple heuristic: ~4 characters per token for English text.
|
|
20
|
+
*/
|
|
21
|
+
function estimateTokens(text) {
|
|
22
|
+
if (!text)
|
|
23
|
+
return 0;
|
|
24
|
+
return Math.ceil(text.length / 4);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Determine the model tier for mock score generation.
|
|
28
|
+
* Higher-tier models produce higher simulated scores.
|
|
29
|
+
*/
|
|
30
|
+
function getModelTier(model) {
|
|
31
|
+
if (model.includes('opus'))
|
|
32
|
+
return 'opus';
|
|
33
|
+
if (model.includes('sonnet'))
|
|
34
|
+
return 'sonnet';
|
|
35
|
+
return 'other';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generate a random value within a +-variance range of the base.
|
|
39
|
+
*/
|
|
40
|
+
function withVariance(base, varianceFraction) {
|
|
41
|
+
const delta = base * varianceFraction;
|
|
42
|
+
return base + (Math.random() * 2 - 1) * delta;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generate a mock benchmark run for offline development.
|
|
46
|
+
*/
|
|
47
|
+
function generateMockRun(runIndex, spec, model) {
|
|
48
|
+
const tier = getModelTier(model);
|
|
49
|
+
// Score: opus scores higher (0.85-0.98), sonnet (0.75-0.90), other (0.65-0.80)
|
|
50
|
+
const baseScore = tier === 'opus' ? 0.92 : tier === 'sonnet' ? 0.83 : 0.72;
|
|
51
|
+
const score = Math.min(1.0, Math.max(0, withVariance(baseScore, 0.05)));
|
|
52
|
+
// Tokens: estimate from prompt + system text
|
|
53
|
+
const promptTokens = estimateTokens(spec.prompt);
|
|
54
|
+
const systemTokens = estimateTokens(spec.system ?? '');
|
|
55
|
+
const inputTokens = promptTokens + systemTokens;
|
|
56
|
+
const outputTokens = Math.ceil(inputTokens * 0.6);
|
|
57
|
+
const tokens = inputTokens + outputTokens;
|
|
58
|
+
// Latency: sonnet ~500ms, opus ~1500ms, with +-20% variance
|
|
59
|
+
const baseLatency = tier === 'opus' ? 1500 : tier === 'sonnet' ? 500 : 800;
|
|
60
|
+
const latency = Math.max(50, withVariance(baseLatency, 0.2));
|
|
61
|
+
// Mock output text
|
|
62
|
+
const output = `[mock-${model}-run-${runIndex}] Simulated response for "${spec.name}".`;
|
|
63
|
+
return {
|
|
64
|
+
runIndex,
|
|
65
|
+
score: Math.round(score * 1000) / 1000,
|
|
66
|
+
tokens: Math.round(tokens),
|
|
67
|
+
latency: Math.round(latency),
|
|
68
|
+
output,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Compute estimated cost for a set of benchmark runs using the model registry.
|
|
73
|
+
* Falls back to zero when the model is not in the registry.
|
|
74
|
+
*/
|
|
75
|
+
function computeCost(runs, model, spec) {
|
|
76
|
+
const modelInfo = getModel(model);
|
|
77
|
+
if (!modelInfo)
|
|
78
|
+
return 0;
|
|
79
|
+
const promptTokens = estimateTokens(spec.prompt);
|
|
80
|
+
const systemTokens = estimateTokens(spec.system ?? '');
|
|
81
|
+
const inputTokensPerRun = promptTokens + systemTokens;
|
|
82
|
+
let totalCost = 0;
|
|
83
|
+
for (const run of runs) {
|
|
84
|
+
const outputTokens = Math.max(0, run.tokens - inputTokensPerRun);
|
|
85
|
+
totalCost += registryEstimateCost(model, inputTokensPerRun, outputTokens);
|
|
86
|
+
}
|
|
87
|
+
return totalCost;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Parse a YAML prompt spec file. Returns the parsed spec or throws on
|
|
91
|
+
* invalid input.
|
|
92
|
+
*/
|
|
93
|
+
async function loadSpec(specPath) {
|
|
94
|
+
const content = await readFile(specPath, 'utf-8');
|
|
95
|
+
const raw = yaml.load(content);
|
|
96
|
+
if (raw === null || raw === undefined || typeof raw !== 'object') {
|
|
97
|
+
throw new Error(`Invalid prompt spec at ${specPath}: expected a YAML object`);
|
|
98
|
+
}
|
|
99
|
+
const obj = raw;
|
|
100
|
+
if (typeof obj['prompt'] !== 'string' || !obj['prompt']) {
|
|
101
|
+
throw new Error(`Prompt spec at ${specPath} is missing a "prompt" field`);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
name: typeof obj['name'] === 'string' ? obj['name'] : specPath,
|
|
105
|
+
description: typeof obj['description'] === 'string' ? obj['description'] : undefined,
|
|
106
|
+
model: typeof obj['model'] === 'string' ? obj['model'] : undefined,
|
|
107
|
+
system: typeof obj['system'] === 'string' ? obj['system'] : undefined,
|
|
108
|
+
prompt: obj['prompt'],
|
|
109
|
+
tests: Array.isArray(obj['tests']) ? parseTests(obj['tests']) : undefined,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse the tests array from a raw YAML structure.
|
|
114
|
+
*/
|
|
115
|
+
function parseTests(rawTests) {
|
|
116
|
+
return rawTests
|
|
117
|
+
.filter((t) => typeof t === 'object' && t !== null)
|
|
118
|
+
.map((t) => ({
|
|
119
|
+
name: typeof t['name'] === 'string' ? t['name'] : 'unnamed',
|
|
120
|
+
input: typeof t['input'] === 'string' ? t['input'] : undefined,
|
|
121
|
+
inputFile: typeof t['inputFile'] === 'string' ? t['inputFile'] : undefined,
|
|
122
|
+
expect: typeof t['expect'] === 'object' && t['expect'] !== null
|
|
123
|
+
? t['expect']
|
|
124
|
+
: undefined,
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Run benchmarks for a prompt spec across one or more models.
|
|
129
|
+
*
|
|
130
|
+
* @param specPath Path to a YAML prompt spec file.
|
|
131
|
+
* @param options Benchmark configuration.
|
|
132
|
+
* @returns An array of results, one per model.
|
|
133
|
+
*/
|
|
134
|
+
export async function runBenchmark(specPath, options = {}) {
|
|
135
|
+
const { models = DEFAULT_MODELS, runs = DEFAULT_RUNS, mode = 'mock', } = options;
|
|
136
|
+
const spec = await loadSpec(specPath);
|
|
137
|
+
const results = [];
|
|
138
|
+
for (const model of models) {
|
|
139
|
+
const benchmarkRuns = [];
|
|
140
|
+
for (let i = 0; i < runs; i++) {
|
|
141
|
+
if (mode === 'mock') {
|
|
142
|
+
benchmarkRuns.push(generateMockRun(i, spec, model));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Live mode: call the appropriate provider via factory.
|
|
146
|
+
const { createProvider } = await import('./providers/factory.js');
|
|
147
|
+
const provider = createProvider(model);
|
|
148
|
+
const testInput = spec.tests?.[0]?.input ?? 'Hello';
|
|
149
|
+
const fullPrompt = spec.prompt.replace(/\{\{input\}\}/g, testInput);
|
|
150
|
+
const start = Date.now();
|
|
151
|
+
const response = await provider.call({
|
|
152
|
+
model,
|
|
153
|
+
system: spec.system,
|
|
154
|
+
messages: [{ role: 'user', content: fullPrompt }],
|
|
155
|
+
});
|
|
156
|
+
const latency = Date.now() - start;
|
|
157
|
+
benchmarkRuns.push({
|
|
158
|
+
runIndex: i,
|
|
159
|
+
score: 1.0, // Live mode: user evaluates quality
|
|
160
|
+
tokens: response.inputTokens + response.outputTokens,
|
|
161
|
+
latency,
|
|
162
|
+
output: response.content,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const totalScore = benchmarkRuns.reduce((sum, r) => sum + r.score, 0);
|
|
167
|
+
const totalTokens = benchmarkRuns.reduce((sum, r) => sum + r.tokens, 0);
|
|
168
|
+
const totalLatency = benchmarkRuns.reduce((sum, r) => sum + r.latency, 0);
|
|
169
|
+
const runCount = benchmarkRuns.length;
|
|
170
|
+
results.push({
|
|
171
|
+
model,
|
|
172
|
+
promptName: spec.name,
|
|
173
|
+
runs: benchmarkRuns,
|
|
174
|
+
averageScore: runCount > 0 ? Math.round((totalScore / runCount) * 1000) / 1000 : 0,
|
|
175
|
+
averageTokens: runCount > 0 ? Math.round(totalTokens / runCount) : 0,
|
|
176
|
+
averageLatency: runCount > 0 ? Math.round(totalLatency / runCount) : 0,
|
|
177
|
+
estimatedCost: computeCost(benchmarkRuns, model, spec),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return results;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=benchmarkRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmarkRunner.js","sourceRoot":"","sources":["../../src/core/benchmarkRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context analyzer — recursively walks a directory, estimates token counts,
|
|
3
|
+
* and produces a comprehensive analysis of how a codebase fits into
|
|
4
|
+
* Claude's context windows.
|
|
5
|
+
*/
|
|
6
|
+
import type { ContextAnalysis } from '../types/context.js';
|
|
7
|
+
import type { ClaudeTestConfig } from '../types/config.js';
|
|
8
|
+
/**
|
|
9
|
+
* Analyze a directory tree and produce a comprehensive context usage report.
|
|
10
|
+
*
|
|
11
|
+
* - Recursively walks directories, skipping ignored paths
|
|
12
|
+
* - Detects binary files by extension
|
|
13
|
+
* - Reads text files and estimates token counts
|
|
14
|
+
* - Builds per-extension breakdowns
|
|
15
|
+
* - Identifies the largest files
|
|
16
|
+
* - Calculates fit estimates for 200k and 1M context windows
|
|
17
|
+
*/
|
|
18
|
+
export declare function analyzeContext(rootPath: string, config?: ClaudeTestConfig): Promise<ContextAnalysis>;
|
|
19
|
+
//# sourceMappingURL=contextAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextAnalyzer.d.ts","sourceRoot":"","sources":["../../src/core/contextAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAwG3D;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAoI1B"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context analyzer — recursively walks a directory, estimates token counts,
|
|
3
|
+
* and produces a comprehensive analysis of how a codebase fits into
|
|
4
|
+
* Claude's context windows.
|
|
5
|
+
*/
|
|
6
|
+
import { resolve } from 'node:path';
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { walkDirectory } from '../utils/fs.js';
|
|
9
|
+
import { readTextFile } from '../utils/fs.js';
|
|
10
|
+
import { estimateTokens } from '../tokenizers/claudeTokenizer.js';
|
|
11
|
+
import { logger } from '../utils/logger.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// .gitignore parsing
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* Load directory/file name patterns from a .gitignore file.
|
|
17
|
+
*
|
|
18
|
+
* This is intentionally simplified — it extracts plain directory and file
|
|
19
|
+
* names (no glob expansion). Patterns containing wildcards after cleanup
|
|
20
|
+
* are skipped. This is sufficient for the common cases like `dist/`,
|
|
21
|
+
* `coverage/`, `.cache/`, etc.
|
|
22
|
+
*/
|
|
23
|
+
async function loadGitignorePatterns(rootPath) {
|
|
24
|
+
const patterns = new Set();
|
|
25
|
+
const gitignorePath = resolve(rootPath, '.gitignore');
|
|
26
|
+
try {
|
|
27
|
+
const content = await readFile(gitignorePath, 'utf-8');
|
|
28
|
+
for (const line of content.split('\n')) {
|
|
29
|
+
const trimmed = line.trim();
|
|
30
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
31
|
+
continue;
|
|
32
|
+
// Extract directory/file name (strip leading/trailing slashes and wildcards)
|
|
33
|
+
const clean = trimmed.replace(/^\//, '').replace(/\/\*?$/, '').replace(/^\*\*\//, '');
|
|
34
|
+
if (clean && !clean.includes('*')) {
|
|
35
|
+
patterns.add(clean);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// No .gitignore or unreadable — fine
|
|
41
|
+
}
|
|
42
|
+
return patterns;
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Paths and extensions to ignore
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
const DEFAULT_IGNORE_DIRS = new Set([
|
|
48
|
+
'node_modules',
|
|
49
|
+
'.git',
|
|
50
|
+
'dist',
|
|
51
|
+
'build',
|
|
52
|
+
'coverage',
|
|
53
|
+
'.DS_Store',
|
|
54
|
+
'__pycache__',
|
|
55
|
+
'.next',
|
|
56
|
+
'.nuxt',
|
|
57
|
+
'.svelte-kit',
|
|
58
|
+
'.turbo',
|
|
59
|
+
'.vercel',
|
|
60
|
+
'vendor',
|
|
61
|
+
'.venv',
|
|
62
|
+
'env',
|
|
63
|
+
'.env',
|
|
64
|
+
]);
|
|
65
|
+
const BINARY_EXTENSIONS = new Set([
|
|
66
|
+
'.png',
|
|
67
|
+
'.jpg',
|
|
68
|
+
'.jpeg',
|
|
69
|
+
'.gif',
|
|
70
|
+
'.ico',
|
|
71
|
+
'.woff',
|
|
72
|
+
'.woff2',
|
|
73
|
+
'.ttf',
|
|
74
|
+
'.eot',
|
|
75
|
+
'.mp3',
|
|
76
|
+
'.mp4',
|
|
77
|
+
'.zip',
|
|
78
|
+
'.tar',
|
|
79
|
+
'.gz',
|
|
80
|
+
'.pdf',
|
|
81
|
+
'.exe',
|
|
82
|
+
'.dll',
|
|
83
|
+
'.so',
|
|
84
|
+
'.dylib',
|
|
85
|
+
'.class',
|
|
86
|
+
'.pyc',
|
|
87
|
+
'.o',
|
|
88
|
+
'.obj',
|
|
89
|
+
'.bin',
|
|
90
|
+
'.dat',
|
|
91
|
+
'.sqlite',
|
|
92
|
+
'.db',
|
|
93
|
+
]);
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// Context window definitions
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
const CONTEXT_WINDOWS = [
|
|
98
|
+
{ size: 200_000, label: '200k' },
|
|
99
|
+
{ size: 1_000_000, label: '1M' },
|
|
100
|
+
];
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Public API
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
/**
|
|
105
|
+
* Analyze a directory tree and produce a comprehensive context usage report.
|
|
106
|
+
*
|
|
107
|
+
* - Recursively walks directories, skipping ignored paths
|
|
108
|
+
* - Detects binary files by extension
|
|
109
|
+
* - Reads text files and estimates token counts
|
|
110
|
+
* - Builds per-extension breakdowns
|
|
111
|
+
* - Identifies the largest files
|
|
112
|
+
* - Calculates fit estimates for 200k and 1M context windows
|
|
113
|
+
*/
|
|
114
|
+
export async function analyzeContext(rootPath, config) {
|
|
115
|
+
const absoluteRoot = resolve(rootPath);
|
|
116
|
+
logger.debug(`Analyzing context for: ${absoluteRoot}`);
|
|
117
|
+
// Build the set of directories to ignore
|
|
118
|
+
const ignoreDirs = new Set(DEFAULT_IGNORE_DIRS);
|
|
119
|
+
if (config?.ignorePaths) {
|
|
120
|
+
for (const p of config.ignorePaths) {
|
|
121
|
+
ignoreDirs.add(p);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Merge patterns from .gitignore (if present)
|
|
125
|
+
const gitignorePatterns = await loadGitignorePatterns(absoluteRoot);
|
|
126
|
+
for (const pattern of gitignorePatterns) {
|
|
127
|
+
ignoreDirs.add(pattern);
|
|
128
|
+
}
|
|
129
|
+
if (gitignorePatterns.size > 0) {
|
|
130
|
+
logger.debug(`Loaded ${gitignorePatterns.size} pattern(s) from .gitignore`);
|
|
131
|
+
}
|
|
132
|
+
// Walk the directory tree
|
|
133
|
+
const entries = await walkDirectory(absoluteRoot, { ignoreDirs });
|
|
134
|
+
// Process only files
|
|
135
|
+
const fileEntries = entries.filter((e) => e.isFile);
|
|
136
|
+
let totalFiles = 0;
|
|
137
|
+
let textFiles = 0;
|
|
138
|
+
let skippedFiles = 0;
|
|
139
|
+
let totalBytes = 0;
|
|
140
|
+
let estimatedTokens = 0;
|
|
141
|
+
const extensionMap = new Map();
|
|
142
|
+
const fileTokenInfos = [];
|
|
143
|
+
for (const entry of fileEntries) {
|
|
144
|
+
totalFiles++;
|
|
145
|
+
totalBytes += entry.size;
|
|
146
|
+
// Skip binary files
|
|
147
|
+
if (BINARY_EXTENSIONS.has(entry.extension)) {
|
|
148
|
+
skippedFiles++;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// Try to read as text
|
|
152
|
+
const content = await readTextFile(entry.path);
|
|
153
|
+
if (content === null) {
|
|
154
|
+
skippedFiles++;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
textFiles++;
|
|
158
|
+
const tokens = estimateTokens(content);
|
|
159
|
+
estimatedTokens += tokens;
|
|
160
|
+
// Track per-extension stats
|
|
161
|
+
const ext = entry.extension || '(no extension)';
|
|
162
|
+
const existing = extensionMap.get(ext);
|
|
163
|
+
if (existing) {
|
|
164
|
+
existing.fileCount++;
|
|
165
|
+
existing.totalBytes += entry.size;
|
|
166
|
+
existing.estimatedTokens += tokens;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
extensionMap.set(ext, {
|
|
170
|
+
fileCount: 1,
|
|
171
|
+
totalBytes: entry.size,
|
|
172
|
+
estimatedTokens: tokens,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
// Track file token info for largest-file ranking
|
|
176
|
+
fileTokenInfos.push({
|
|
177
|
+
path: entry.relativePath,
|
|
178
|
+
bytes: entry.size,
|
|
179
|
+
estimatedTokens: tokens,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// Build extension breakdown sorted by token count descending
|
|
183
|
+
const extensionBreakdown = Array.from(extensionMap.entries())
|
|
184
|
+
.map(([extension, stats]) => ({
|
|
185
|
+
extension,
|
|
186
|
+
fileCount: stats.fileCount,
|
|
187
|
+
totalBytes: stats.totalBytes,
|
|
188
|
+
estimatedTokens: stats.estimatedTokens,
|
|
189
|
+
}))
|
|
190
|
+
.sort((a, b) => b.estimatedTokens - a.estimatedTokens);
|
|
191
|
+
// Find the top 20 largest files by token count
|
|
192
|
+
const largestFiles = fileTokenInfos
|
|
193
|
+
.sort((a, b) => b.estimatedTokens - a.estimatedTokens)
|
|
194
|
+
.slice(0, 20);
|
|
195
|
+
// Calculate fit estimates for each context window
|
|
196
|
+
const fitEstimates = CONTEXT_WINDOWS.map((window) => {
|
|
197
|
+
const fits = estimatedTokens <= window.size;
|
|
198
|
+
const utilization = window.size > 0 ? estimatedTokens / window.size : 0;
|
|
199
|
+
const headroom = window.size > 0 ? 1 - utilization : 0;
|
|
200
|
+
return {
|
|
201
|
+
windowSize: window.size,
|
|
202
|
+
windowLabel: window.label,
|
|
203
|
+
fits,
|
|
204
|
+
utilization: Math.min(utilization, 1),
|
|
205
|
+
headroom: Math.max(headroom, 0),
|
|
206
|
+
};
|
|
207
|
+
});
|
|
208
|
+
logger.debug(`Analysis complete: ${totalFiles} files, ${textFiles} text, ${skippedFiles} skipped, ~${estimatedTokens} tokens`);
|
|
209
|
+
return {
|
|
210
|
+
rootPath: absoluteRoot,
|
|
211
|
+
totalFiles,
|
|
212
|
+
textFiles,
|
|
213
|
+
skippedFiles,
|
|
214
|
+
totalBytes,
|
|
215
|
+
estimatedTokens,
|
|
216
|
+
extensionBreakdown,
|
|
217
|
+
largestFiles,
|
|
218
|
+
fitEstimates,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=contextAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextAnalyzer.js","sourceRoot":"","sources":["../../src/core/contextAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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 type { PackPlan } from '../types/context.js';
|
|
9
|
+
import type { ClaudeTestConfig } from '../types/config.js';
|
|
10
|
+
export interface PackOptions {
|
|
11
|
+
target: '200k' | '1m';
|
|
12
|
+
optimize?: boolean;
|
|
13
|
+
config?: ClaudeTestConfig;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build an optimized context pack plan for a repository.
|
|
17
|
+
*
|
|
18
|
+
* 1. Analyzes the repo using contextAnalyzer
|
|
19
|
+
* 2. Categorizes files (core, docs, configs, tests, assets, generated)
|
|
20
|
+
* 3. Ranks files by likely usefulness
|
|
21
|
+
* 4. Allocates budgets per category
|
|
22
|
+
* 5. Packs files greedily into the target context window
|
|
23
|
+
* 6. Returns a plan with include/summarize/exclude recommendations
|
|
24
|
+
*/
|
|
25
|
+
export declare function packContext(rootPath: string, options: PackOptions): Promise<PackPlan>;
|
|
26
|
+
//# sourceMappingURL=contextPacker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextPacker.d.ts","sourceRoot":"","sources":["../../src/core/contextPacker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,QAAQ,EAET,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAU3D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AA0TD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAqGnB"}
|