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,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP (Model Context Protocol) scanner.
|
|
3
|
+
*
|
|
4
|
+
* Detects MCP-related configuration files, server definitions,
|
|
5
|
+
* and dependencies in a repository.
|
|
6
|
+
*/
|
|
7
|
+
import { join, basename, extname } from 'node:path';
|
|
8
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
9
|
+
import { walkDirectory, readTextFile, fileExists } from '../utils/fs.js';
|
|
10
|
+
/** Directories to skip during traversal. */
|
|
11
|
+
const SKIP_DIRS = new Set([
|
|
12
|
+
'node_modules', '.git', 'dist', 'build', 'coverage',
|
|
13
|
+
'__pycache__', '.next', '.nuxt', '.cache', '.turbo',
|
|
14
|
+
'.parcel-cache', '.vscode', '.idea', 'vendor', 'tmp',
|
|
15
|
+
'.tmp', '.terraform', 'src',
|
|
16
|
+
]);
|
|
17
|
+
/**
|
|
18
|
+
* Safely parse a JSON file. Returns null on failure.
|
|
19
|
+
*/
|
|
20
|
+
async function readJsonFile(filePath) {
|
|
21
|
+
try {
|
|
22
|
+
const content = await readFile(filePath, 'utf-8');
|
|
23
|
+
const parsed = JSON.parse(content);
|
|
24
|
+
if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
25
|
+
return parsed;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Extract MCP server definitions from a parsed JSON config.
|
|
35
|
+
*/
|
|
36
|
+
function extractServers(data, filePath) {
|
|
37
|
+
const assets = [];
|
|
38
|
+
// Check for "mcpServers" key (standard format)
|
|
39
|
+
const serversKey = Object.keys(data).find((k) => k === 'mcpServers' || k === 'mcp_servers');
|
|
40
|
+
if (serversKey) {
|
|
41
|
+
const servers = data[serversKey];
|
|
42
|
+
if (typeof servers === 'object' && servers !== null && !Array.isArray(servers)) {
|
|
43
|
+
const serversObj = servers;
|
|
44
|
+
for (const [name, config] of Object.entries(serversObj)) {
|
|
45
|
+
let transport = 'unknown';
|
|
46
|
+
if (typeof config === 'object' && config !== null) {
|
|
47
|
+
const configObj = config;
|
|
48
|
+
if (typeof configObj['transport'] === 'string') {
|
|
49
|
+
transport = configObj['transport'];
|
|
50
|
+
}
|
|
51
|
+
else if (typeof configObj['command'] === 'string') {
|
|
52
|
+
transport = 'stdio';
|
|
53
|
+
}
|
|
54
|
+
else if (typeof configObj['url'] === 'string') {
|
|
55
|
+
transport = 'sse';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
assets.push({
|
|
59
|
+
path: filePath,
|
|
60
|
+
type: 'mcp-config',
|
|
61
|
+
serverName: name,
|
|
62
|
+
transport,
|
|
63
|
+
description: `MCP server "${name}" (transport: ${transport})`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return assets;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// If no servers found but file matches MCP naming, still report it
|
|
70
|
+
return assets;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Scan well-known MCP config file locations.
|
|
74
|
+
*/
|
|
75
|
+
async function scanKnownMcpFiles(rootPath) {
|
|
76
|
+
const assets = [];
|
|
77
|
+
const knownPaths = [
|
|
78
|
+
join(rootPath, '.mcp.json'),
|
|
79
|
+
join(rootPath, 'mcp.json'),
|
|
80
|
+
];
|
|
81
|
+
for (const filePath of knownPaths) {
|
|
82
|
+
if (!(await fileExists(filePath)))
|
|
83
|
+
continue;
|
|
84
|
+
const data = await readJsonFile(filePath);
|
|
85
|
+
if (data) {
|
|
86
|
+
const servers = extractServers(data, filePath);
|
|
87
|
+
if (servers.length > 0) {
|
|
88
|
+
assets.push(...servers);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
assets.push({
|
|
92
|
+
path: filePath,
|
|
93
|
+
type: 'mcp-config',
|
|
94
|
+
description: `MCP configuration file: ${basename(filePath)}`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
assets.push({
|
|
100
|
+
path: filePath,
|
|
101
|
+
type: 'mcp-config',
|
|
102
|
+
description: `MCP configuration file (parse failed): ${basename(filePath)}`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return assets;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Scan .claude/ directory for MCP-related JSON files.
|
|
110
|
+
*/
|
|
111
|
+
async function scanClaudeMcpFiles(rootPath) {
|
|
112
|
+
const assets = [];
|
|
113
|
+
const claudeDir = join(rootPath, '.claude');
|
|
114
|
+
try {
|
|
115
|
+
const claudeStat = await stat(claudeDir);
|
|
116
|
+
if (!claudeStat.isDirectory())
|
|
117
|
+
return assets;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return assets;
|
|
121
|
+
}
|
|
122
|
+
const entries = await walkDirectory(claudeDir, { ignoreDirs: SKIP_DIRS });
|
|
123
|
+
for (const entry of entries) {
|
|
124
|
+
if (!entry.isFile)
|
|
125
|
+
continue;
|
|
126
|
+
const fileName = basename(entry.path);
|
|
127
|
+
if (fileName.startsWith('mcp') && fileName.endsWith('.json')) {
|
|
128
|
+
const data = await readJsonFile(entry.path);
|
|
129
|
+
if (data) {
|
|
130
|
+
const servers = extractServers(data, entry.path);
|
|
131
|
+
if (servers.length > 0) {
|
|
132
|
+
assets.push(...servers);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
assets.push({
|
|
136
|
+
path: entry.path,
|
|
137
|
+
type: 'mcp-config',
|
|
138
|
+
description: `MCP configuration in .claude/: ${fileName}`,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
assets.push({
|
|
144
|
+
path: entry.path,
|
|
145
|
+
type: 'mcp-config',
|
|
146
|
+
description: `MCP configuration in .claude/ (parse failed): ${fileName}`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return assets;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Scan files for MCP-related content patterns.
|
|
155
|
+
*/
|
|
156
|
+
async function scanForMcpContent(rootPath) {
|
|
157
|
+
const assets = [];
|
|
158
|
+
const mcpPatterns = [
|
|
159
|
+
/["']?mcpServers["']?\s*:/,
|
|
160
|
+
/["']?mcp_servers["']?\s*:/,
|
|
161
|
+
];
|
|
162
|
+
const mcpReferencePatterns = [
|
|
163
|
+
/ModelContextProtocol/,
|
|
164
|
+
/@modelcontextprotocol/,
|
|
165
|
+
];
|
|
166
|
+
const textExtensions = new Set([
|
|
167
|
+
'.json', '.yaml', '.yml', '.toml',
|
|
168
|
+
'.ts', '.js', '.mjs', '.cjs',
|
|
169
|
+
'.md', '.txt', '.cfg', '.conf',
|
|
170
|
+
]);
|
|
171
|
+
const entries = await walkDirectory(rootPath, { ignoreDirs: SKIP_DIRS });
|
|
172
|
+
for (const entry of entries) {
|
|
173
|
+
if (!entry.isFile)
|
|
174
|
+
continue;
|
|
175
|
+
const ext = extname(entry.path).toLowerCase();
|
|
176
|
+
if (!textExtensions.has(ext))
|
|
177
|
+
continue;
|
|
178
|
+
// Skip files we already check via specific scanners
|
|
179
|
+
const fileName = basename(entry.path);
|
|
180
|
+
if (fileName === '.mcp.json' || fileName === 'mcp.json')
|
|
181
|
+
continue;
|
|
182
|
+
if (fileName === 'package.json')
|
|
183
|
+
continue;
|
|
184
|
+
const relativeToClaude = entry.path.includes('.claude/') || entry.path.includes('.claude\\');
|
|
185
|
+
if (relativeToClaude && fileName.startsWith('mcp') && fileName.endsWith('.json')) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const content = await readTextFile(entry.path);
|
|
189
|
+
if (!content)
|
|
190
|
+
continue;
|
|
191
|
+
// Check for server config patterns
|
|
192
|
+
for (const pattern of mcpPatterns) {
|
|
193
|
+
if (pattern.test(content)) {
|
|
194
|
+
assets.push({
|
|
195
|
+
path: entry.path,
|
|
196
|
+
type: 'mcp-related',
|
|
197
|
+
description: `File contains MCP server configuration pattern.`,
|
|
198
|
+
});
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Check for MCP reference patterns (only if not already matched)
|
|
203
|
+
if (!assets.some((a) => a.path === entry.path)) {
|
|
204
|
+
for (const pattern of mcpReferencePatterns) {
|
|
205
|
+
if (pattern.test(content)) {
|
|
206
|
+
assets.push({
|
|
207
|
+
path: entry.path,
|
|
208
|
+
type: 'mcp-related',
|
|
209
|
+
description: `File references Model Context Protocol.`,
|
|
210
|
+
});
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return assets;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Scan package.json for MCP-related dependencies.
|
|
220
|
+
*/
|
|
221
|
+
async function scanPackageJsonMcp(rootPath) {
|
|
222
|
+
const assets = [];
|
|
223
|
+
const pkgPath = join(rootPath, 'package.json');
|
|
224
|
+
const data = await readJsonFile(pkgPath);
|
|
225
|
+
if (!data)
|
|
226
|
+
return assets;
|
|
227
|
+
const depSections = ['dependencies', 'devDependencies', 'peerDependencies'];
|
|
228
|
+
const mcpDepPatterns = [/mcp/, /model-context-protocol/, /modelcontextprotocol/];
|
|
229
|
+
for (const section of depSections) {
|
|
230
|
+
const deps = data[section];
|
|
231
|
+
if (typeof deps !== 'object' || deps === null)
|
|
232
|
+
continue;
|
|
233
|
+
const depsObj = deps;
|
|
234
|
+
for (const [name, version] of Object.entries(depsObj)) {
|
|
235
|
+
const isMcp = mcpDepPatterns.some((p) => p.test(name.toLowerCase()));
|
|
236
|
+
if (isMcp && typeof version === 'string') {
|
|
237
|
+
assets.push({
|
|
238
|
+
path: pkgPath,
|
|
239
|
+
type: 'mcp-server',
|
|
240
|
+
serverName: name,
|
|
241
|
+
description: `MCP-related dependency: ${name}@${version} (in ${section})`,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return assets;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Scan a repository for MCP-related files and configurations.
|
|
250
|
+
*
|
|
251
|
+
* Detects:
|
|
252
|
+
* - .mcp.json, mcp.json root config files
|
|
253
|
+
* - .claude/mcp*.json config files
|
|
254
|
+
* - Files containing "mcpServers" or "mcp_servers" patterns
|
|
255
|
+
* - package.json MCP-related dependencies
|
|
256
|
+
* - Files referencing "ModelContextProtocol" or "@modelcontextprotocol"
|
|
257
|
+
*
|
|
258
|
+
* @param rootPath Absolute path to the repository root.
|
|
259
|
+
* @returns Array of detected MCP assets.
|
|
260
|
+
*/
|
|
261
|
+
export async function scanForMCP(rootPath) {
|
|
262
|
+
// Verify root exists
|
|
263
|
+
try {
|
|
264
|
+
const rootStat = await stat(rootPath);
|
|
265
|
+
if (!rootStat.isDirectory())
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return [];
|
|
270
|
+
}
|
|
271
|
+
const results = await Promise.all([
|
|
272
|
+
scanKnownMcpFiles(rootPath),
|
|
273
|
+
scanClaudeMcpFiles(rootPath),
|
|
274
|
+
scanPackageJsonMcp(rootPath),
|
|
275
|
+
scanForMcpContent(rootPath),
|
|
276
|
+
]);
|
|
277
|
+
const allAssets = results.flat();
|
|
278
|
+
// Deduplicate by path + type + serverName
|
|
279
|
+
const seen = new Set();
|
|
280
|
+
const deduped = [];
|
|
281
|
+
for (const asset of allAssets) {
|
|
282
|
+
const key = `${asset.path}:${asset.type}:${asset.serverName ?? ''}`;
|
|
283
|
+
if (!seen.has(key)) {
|
|
284
|
+
seen.add(key);
|
|
285
|
+
deduped.push(asset);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return deduped;
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=mcpScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpScanner.js","sourceRoot":"","sources":["../../src/core/mcpScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal model registry for codeprobe.
|
|
3
|
+
*
|
|
4
|
+
* Contains pricing, context-window, and capability metadata for AI models
|
|
5
|
+
* across all major providers. Used by the benchmark runner for cost estimation
|
|
6
|
+
* and by the CLI for model discovery.
|
|
7
|
+
*/
|
|
8
|
+
export interface ModelInfo {
|
|
9
|
+
id: string;
|
|
10
|
+
provider: string;
|
|
11
|
+
name: string;
|
|
12
|
+
contextWindow: number;
|
|
13
|
+
maxOutput: number;
|
|
14
|
+
inputPricePer1M: number;
|
|
15
|
+
outputPricePer1M: number;
|
|
16
|
+
}
|
|
17
|
+
/** Look up a model by its id. Returns undefined if not found. */
|
|
18
|
+
export declare function getModel(id: string): ModelInfo | undefined;
|
|
19
|
+
/** Return every registered model. */
|
|
20
|
+
export declare function getAllModels(): ModelInfo[];
|
|
21
|
+
/** Return all models belonging to a specific provider. */
|
|
22
|
+
export declare function getModelsByProvider(provider: string): ModelInfo[];
|
|
23
|
+
/** Return the distinct list of provider names, sorted alphabetically. */
|
|
24
|
+
export declare function getProviders(): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Get the context window size for a model.
|
|
27
|
+
* Returns 200 000 as a safe default when the model id is not found.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getContextWindow(modelId: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Estimate the dollar cost for a given number of input and output tokens.
|
|
32
|
+
* Returns 0 when the model is not in the registry.
|
|
33
|
+
*/
|
|
34
|
+
export declare function estimateCost(modelId: string, inputTokens: number, outputTokens: number): number;
|
|
35
|
+
//# sourceMappingURL=modelRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelRegistry.d.ts","sourceRoot":"","sources":["../../src/core/modelRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAiED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE1D;AAED,qCAAqC;AACrC,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAE1C;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAEjE;AAED,yEAAyE;AACzE,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAGvC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAMR"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal model registry for codeprobe.
|
|
3
|
+
*
|
|
4
|
+
* Contains pricing, context-window, and capability metadata for AI models
|
|
5
|
+
* across all major providers. Used by the benchmark runner for cost estimation
|
|
6
|
+
* and by the CLI for model discovery.
|
|
7
|
+
*/
|
|
8
|
+
/** Internal model registry keyed by model id. */
|
|
9
|
+
const MODEL_REGISTRY = new Map();
|
|
10
|
+
function register(model) {
|
|
11
|
+
MODEL_REGISTRY.set(model.id, model);
|
|
12
|
+
}
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Anthropic
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
register({ id: 'claude-opus-4-6', provider: 'anthropic', name: 'Claude Opus 4.6', contextWindow: 200000, maxOutput: 16384, inputPricePer1M: 15, outputPricePer1M: 75 });
|
|
17
|
+
register({ id: 'claude-sonnet-4-6', provider: 'anthropic', name: 'Claude Sonnet 4.6', contextWindow: 200000, maxOutput: 16384, inputPricePer1M: 3, outputPricePer1M: 15 });
|
|
18
|
+
register({ id: 'claude-haiku-4-5', provider: 'anthropic', name: 'Claude Haiku 4.5', contextWindow: 200000, maxOutput: 8192, inputPricePer1M: 0.80, outputPricePer1M: 4 });
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// OpenAI
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
register({ id: 'gpt-4.1', provider: 'openai', name: 'GPT-4.1', contextWindow: 1047576, maxOutput: 32768, inputPricePer1M: 2, outputPricePer1M: 8 });
|
|
23
|
+
register({ id: 'gpt-4.1-mini', provider: 'openai', name: 'GPT-4.1 Mini', contextWindow: 1047576, maxOutput: 32768, inputPricePer1M: 0.40, outputPricePer1M: 1.60 });
|
|
24
|
+
register({ id: 'gpt-4.1-nano', provider: 'openai', name: 'GPT-4.1 Nano', contextWindow: 1047576, maxOutput: 32768, inputPricePer1M: 0.10, outputPricePer1M: 0.40 });
|
|
25
|
+
register({ id: 'gpt-4o', provider: 'openai', name: 'GPT-4o', contextWindow: 128000, maxOutput: 16384, inputPricePer1M: 2.50, outputPricePer1M: 10 });
|
|
26
|
+
register({ id: 'o3', provider: 'openai', name: 'o3', contextWindow: 200000, maxOutput: 100000, inputPricePer1M: 2, outputPricePer1M: 8 });
|
|
27
|
+
register({ id: 'o4-mini', provider: 'openai', name: 'o4-mini', contextWindow: 200000, maxOutput: 100000, inputPricePer1M: 1.10, outputPricePer1M: 4.40 });
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Google
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
register({ id: 'gemini-2.5-pro', provider: 'google', name: 'Gemini 2.5 Pro', contextWindow: 1048576, maxOutput: 65536, inputPricePer1M: 1.25, outputPricePer1M: 10 });
|
|
32
|
+
register({ id: 'gemini-2.5-flash', provider: 'google', name: 'Gemini 2.5 Flash', contextWindow: 1048576, maxOutput: 65536, inputPricePer1M: 0.15, outputPricePer1M: 0.60 });
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// DeepSeek
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
register({ id: 'deepseek-v3', provider: 'deepseek', name: 'DeepSeek V3', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0.27, outputPricePer1M: 1.10 });
|
|
37
|
+
register({ id: 'deepseek-r1', provider: 'deepseek', name: 'DeepSeek R1', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0.55, outputPricePer1M: 2.19 });
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Qwen (Alibaba)
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
register({ id: 'qwen-3-235b', provider: 'qwen', name: 'Qwen 3 235B', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0.80, outputPricePer1M: 2.40 });
|
|
42
|
+
register({ id: 'qwen-3-32b', provider: 'qwen', name: 'Qwen 3 32B', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0.20, outputPricePer1M: 0.60 });
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Meta (via API providers)
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
register({ id: 'llama-4-maverick', provider: 'meta', name: 'Llama 4 Maverick', contextWindow: 1048576, maxOutput: 16384, inputPricePer1M: 0.20, outputPricePer1M: 0.60 });
|
|
47
|
+
register({ id: 'llama-4-scout', provider: 'meta', name: 'Llama 4 Scout', contextWindow: 524288, maxOutput: 16384, inputPricePer1M: 0.10, outputPricePer1M: 0.30 });
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Mistral
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
register({ id: 'codestral-25.01', provider: 'mistral', name: 'Codestral', contextWindow: 256000, maxOutput: 8192, inputPricePer1M: 0.30, outputPricePer1M: 0.90 });
|
|
52
|
+
register({ id: 'mistral-large', provider: 'mistral', name: 'Mistral Large', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 2, outputPricePer1M: 6 });
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Local (Ollama / vLLM — free)
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
register({ id: 'local', provider: 'local', name: 'Local Model', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0, outputPricePer1M: 0 });
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Public API
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
/** Look up a model by its id. Returns undefined if not found. */
|
|
61
|
+
export function getModel(id) {
|
|
62
|
+
return MODEL_REGISTRY.get(id);
|
|
63
|
+
}
|
|
64
|
+
/** Return every registered model. */
|
|
65
|
+
export function getAllModels() {
|
|
66
|
+
return Array.from(MODEL_REGISTRY.values());
|
|
67
|
+
}
|
|
68
|
+
/** Return all models belonging to a specific provider. */
|
|
69
|
+
export function getModelsByProvider(provider) {
|
|
70
|
+
return getAllModels().filter((m) => m.provider === provider);
|
|
71
|
+
}
|
|
72
|
+
/** Return the distinct list of provider names, sorted alphabetically. */
|
|
73
|
+
export function getProviders() {
|
|
74
|
+
const providers = new Set(getAllModels().map((m) => m.provider));
|
|
75
|
+
return Array.from(providers).sort();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the context window size for a model.
|
|
79
|
+
* Returns 200 000 as a safe default when the model id is not found.
|
|
80
|
+
*/
|
|
81
|
+
export function getContextWindow(modelId) {
|
|
82
|
+
const model = MODEL_REGISTRY.get(modelId);
|
|
83
|
+
return model ? model.contextWindow : 200_000;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Estimate the dollar cost for a given number of input and output tokens.
|
|
87
|
+
* Returns 0 when the model is not in the registry.
|
|
88
|
+
*/
|
|
89
|
+
export function estimateCost(modelId, inputTokens, outputTokens) {
|
|
90
|
+
const model = MODEL_REGISTRY.get(modelId);
|
|
91
|
+
if (!model)
|
|
92
|
+
return 0;
|
|
93
|
+
const inputCost = (inputTokens / 1_000_000) * model.inputPricePer1M;
|
|
94
|
+
const outputCost = (outputTokens / 1_000_000) * model.outputPricePer1M;
|
|
95
|
+
return inputCost + outputCost;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=modelRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelRegistry.js","sourceRoot":"","sources":["../../src/core/modelRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt diff — compare two prompt spec YAML files field by field
|
|
3
|
+
* and report what changed.
|
|
4
|
+
*/
|
|
5
|
+
export interface DiffDetail {
|
|
6
|
+
field: string;
|
|
7
|
+
before: string;
|
|
8
|
+
after: string;
|
|
9
|
+
}
|
|
10
|
+
export interface DiffResult {
|
|
11
|
+
systemPromptChanged: boolean;
|
|
12
|
+
promptChanged: boolean;
|
|
13
|
+
modelChanged: boolean;
|
|
14
|
+
testsChanged: boolean;
|
|
15
|
+
otherChanges: string[];
|
|
16
|
+
details: DiffDetail[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse two prompt spec YAML files and compare them field by field.
|
|
20
|
+
*
|
|
21
|
+
* Returns a structured DiffResult indicating which fields changed
|
|
22
|
+
* and the before/after values.
|
|
23
|
+
*/
|
|
24
|
+
export declare function diffPrompts(pathA: string, pathB: string): Promise<DiffResult>;
|
|
25
|
+
//# sourceMappingURL=promptDiff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptDiff.d.ts","sourceRoot":"","sources":["../../src/core/promptDiff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AA6CD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,CAAC,CAqGrB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt diff — compare two prompt spec YAML files field by field
|
|
3
|
+
* and report what changed.
|
|
4
|
+
*/
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
import { parsePromptSpec } from './promptRunner.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Serialize a value to a stable string for comparison.
|
|
12
|
+
*/
|
|
13
|
+
function serialize(value) {
|
|
14
|
+
if (value === undefined || value === null) {
|
|
15
|
+
return '';
|
|
16
|
+
}
|
|
17
|
+
if (typeof value === 'string') {
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
return JSON.stringify(value, null, 2);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Compare two values and return a DiffDetail if they differ.
|
|
24
|
+
*/
|
|
25
|
+
function compareField(field, before, after) {
|
|
26
|
+
const beforeStr = serialize(before);
|
|
27
|
+
const afterStr = serialize(after);
|
|
28
|
+
if (beforeStr === afterStr) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
field,
|
|
33
|
+
before: beforeStr,
|
|
34
|
+
after: afterStr,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Public API
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/**
|
|
41
|
+
* Parse two prompt spec YAML files and compare them field by field.
|
|
42
|
+
*
|
|
43
|
+
* Returns a structured DiffResult indicating which fields changed
|
|
44
|
+
* and the before/after values.
|
|
45
|
+
*/
|
|
46
|
+
export async function diffPrompts(pathA, pathB) {
|
|
47
|
+
const absoluteA = resolve(pathA);
|
|
48
|
+
const absoluteB = resolve(pathB);
|
|
49
|
+
const specA = await parsePromptSpec(absoluteA);
|
|
50
|
+
const specB = await parsePromptSpec(absoluteB);
|
|
51
|
+
const details = [];
|
|
52
|
+
const otherChanges = [];
|
|
53
|
+
// Compare name
|
|
54
|
+
const nameDiff = compareField('name', specA.name, specB.name);
|
|
55
|
+
if (nameDiff) {
|
|
56
|
+
details.push(nameDiff);
|
|
57
|
+
otherChanges.push('name');
|
|
58
|
+
}
|
|
59
|
+
// Compare description
|
|
60
|
+
const descDiff = compareField('description', specA.description, specB.description);
|
|
61
|
+
if (descDiff) {
|
|
62
|
+
details.push(descDiff);
|
|
63
|
+
otherChanges.push('description');
|
|
64
|
+
}
|
|
65
|
+
// Compare model
|
|
66
|
+
const modelDiff = compareField('model', specA.model, specB.model);
|
|
67
|
+
const modelChanged = modelDiff !== null;
|
|
68
|
+
if (modelDiff) {
|
|
69
|
+
details.push(modelDiff);
|
|
70
|
+
}
|
|
71
|
+
// Compare system prompt
|
|
72
|
+
const systemDiff = compareField('system', specA.system, specB.system);
|
|
73
|
+
const systemPromptChanged = systemDiff !== null;
|
|
74
|
+
if (systemDiff) {
|
|
75
|
+
details.push(systemDiff);
|
|
76
|
+
}
|
|
77
|
+
// Compare prompt
|
|
78
|
+
const promptDiff = compareField('prompt', specA.prompt, specB.prompt);
|
|
79
|
+
const promptChanged = promptDiff !== null;
|
|
80
|
+
if (promptDiff) {
|
|
81
|
+
details.push(promptDiff);
|
|
82
|
+
}
|
|
83
|
+
// Compare tests
|
|
84
|
+
const testsA = serialize(specA.tests);
|
|
85
|
+
const testsB = serialize(specB.tests);
|
|
86
|
+
const testsChanged = testsA !== testsB;
|
|
87
|
+
if (testsChanged) {
|
|
88
|
+
// Add a summary diff for the tests array
|
|
89
|
+
details.push({
|
|
90
|
+
field: 'tests',
|
|
91
|
+
before: testsA || '(none)',
|
|
92
|
+
after: testsB || '(none)',
|
|
93
|
+
});
|
|
94
|
+
// Add per-test diffs for more granularity
|
|
95
|
+
const maxLen = Math.max(specA.tests?.length ?? 0, specB.tests?.length ?? 0);
|
|
96
|
+
for (let i = 0; i < maxLen; i++) {
|
|
97
|
+
const testA = specA.tests?.[i];
|
|
98
|
+
const testB = specB.tests?.[i];
|
|
99
|
+
if (!testA && testB) {
|
|
100
|
+
details.push({
|
|
101
|
+
field: `tests[${i}]`,
|
|
102
|
+
before: '(not present)',
|
|
103
|
+
after: serialize(testB),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
else if (testA && !testB) {
|
|
107
|
+
details.push({
|
|
108
|
+
field: `tests[${i}]`,
|
|
109
|
+
before: serialize(testA),
|
|
110
|
+
after: '(removed)',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
else if (testA && testB) {
|
|
114
|
+
const testDiff = compareField(`tests[${i}]`, testA, testB);
|
|
115
|
+
if (testDiff) {
|
|
116
|
+
details.push(testDiff);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
systemPromptChanged,
|
|
123
|
+
promptChanged,
|
|
124
|
+
modelChanged,
|
|
125
|
+
testsChanged,
|
|
126
|
+
otherChanges,
|
|
127
|
+
details,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=promptDiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptDiff.js","sourceRoot":"","sources":["../../src/core/promptDiff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt explainer: offline analysis of a prompt spec.
|
|
3
|
+
*
|
|
4
|
+
* Generates a plain-text explanation of what a prompt does,
|
|
5
|
+
* identifies potential weaknesses, and suggests improvements --
|
|
6
|
+
* all without making any LLM calls.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Analyze a prompt spec file and generate a plain-text explanation.
|
|
10
|
+
*
|
|
11
|
+
* This is a purely offline analysis -- no LLM calls are made.
|
|
12
|
+
*
|
|
13
|
+
* @param specPath Absolute path to a YAML prompt spec file.
|
|
14
|
+
* @returns Multi-line plain-text explanation.
|
|
15
|
+
*/
|
|
16
|
+
export declare function explainPrompt(specPath: string): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=promptExplainer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptExplainer.d.ts","sourceRoot":"","sources":["../../src/core/promptExplainer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2VH;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCrE"}
|