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,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill file validator.
|
|
3
|
+
*
|
|
4
|
+
* Validates Markdown skill files that use YAML frontmatter for
|
|
5
|
+
* metadata. Checks for required fields, valid frontmatter syntax,
|
|
6
|
+
* and reasonable content structure.
|
|
7
|
+
*/
|
|
8
|
+
import { readFile, stat, readdir } from 'node:fs/promises';
|
|
9
|
+
import { join, extname } from 'node:path';
|
|
10
|
+
import yaml from 'js-yaml';
|
|
11
|
+
/** Minimum content length (excluding frontmatter) for a meaningful skill. */
|
|
12
|
+
const MIN_BODY_LENGTH = 10;
|
|
13
|
+
/** Maximum reasonable content length (very large skills are suspicious). */
|
|
14
|
+
const MAX_BODY_LENGTH = 50000;
|
|
15
|
+
/**
|
|
16
|
+
* Extract YAML frontmatter from a Markdown string.
|
|
17
|
+
*
|
|
18
|
+
* Frontmatter is delimited by `---` on the first line and a closing
|
|
19
|
+
* `---`. Returns the frontmatter text and the remaining body, or
|
|
20
|
+
* null if no valid frontmatter is found.
|
|
21
|
+
*/
|
|
22
|
+
function extractFrontmatter(content) {
|
|
23
|
+
const trimmed = content.trimStart();
|
|
24
|
+
if (!trimmed.startsWith('---')) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// Find closing delimiter (skip the first line)
|
|
28
|
+
const afterOpening = trimmed.indexOf('\n');
|
|
29
|
+
if (afterOpening === -1)
|
|
30
|
+
return null;
|
|
31
|
+
const rest = trimmed.slice(afterOpening + 1);
|
|
32
|
+
const closingIndex = rest.indexOf('\n---');
|
|
33
|
+
if (closingIndex === -1) {
|
|
34
|
+
// Check if the entire remaining content ends with ---
|
|
35
|
+
if (rest.trimEnd().endsWith('---')) {
|
|
36
|
+
const lastDash = rest.lastIndexOf('---');
|
|
37
|
+
return {
|
|
38
|
+
frontmatter: rest.slice(0, lastDash).trim(),
|
|
39
|
+
body: '',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const frontmatter = rest.slice(0, closingIndex).trim();
|
|
45
|
+
const body = rest.slice(closingIndex + 4).trim(); // +4 for '\n---'
|
|
46
|
+
return { frontmatter, body };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate a single skill file.
|
|
50
|
+
*
|
|
51
|
+
* Checks:
|
|
52
|
+
* - File exists and is readable
|
|
53
|
+
* - Valid YAML frontmatter with `name` and `description` fields
|
|
54
|
+
* - Non-empty body content
|
|
55
|
+
* - Reasonable content length
|
|
56
|
+
*
|
|
57
|
+
* @param filePath Absolute path to a .md skill file.
|
|
58
|
+
* @returns Validation result with errors and warnings.
|
|
59
|
+
*/
|
|
60
|
+
export async function validateSkill(filePath) {
|
|
61
|
+
const errors = [];
|
|
62
|
+
const warnings = [];
|
|
63
|
+
// Check file exists and is readable
|
|
64
|
+
let content;
|
|
65
|
+
try {
|
|
66
|
+
content = await readFile(filePath, 'utf-8');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return {
|
|
70
|
+
path: filePath,
|
|
71
|
+
valid: false,
|
|
72
|
+
errors: [`Cannot read file: ${filePath}`],
|
|
73
|
+
warnings: [],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Check for empty file
|
|
77
|
+
if (!content.trim()) {
|
|
78
|
+
return {
|
|
79
|
+
path: filePath,
|
|
80
|
+
valid: false,
|
|
81
|
+
errors: ['File is empty.'],
|
|
82
|
+
warnings: [],
|
|
83
|
+
metadata: { hasFrontmatter: false },
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Extract frontmatter
|
|
87
|
+
const extracted = extractFrontmatter(content);
|
|
88
|
+
if (!extracted) {
|
|
89
|
+
errors.push('No valid YAML frontmatter found. Skill files should start with --- delimited YAML metadata.');
|
|
90
|
+
return {
|
|
91
|
+
path: filePath,
|
|
92
|
+
valid: false,
|
|
93
|
+
errors,
|
|
94
|
+
warnings,
|
|
95
|
+
metadata: { hasFrontmatter: false },
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// Parse YAML frontmatter
|
|
99
|
+
let frontmatterData;
|
|
100
|
+
try {
|
|
101
|
+
const parsed = yaml.load(extracted.frontmatter);
|
|
102
|
+
if (parsed === null || parsed === undefined || typeof parsed !== 'object') {
|
|
103
|
+
errors.push('Frontmatter is empty or not a valid YAML object.');
|
|
104
|
+
return {
|
|
105
|
+
path: filePath,
|
|
106
|
+
valid: false,
|
|
107
|
+
errors,
|
|
108
|
+
warnings,
|
|
109
|
+
metadata: { hasFrontmatter: true },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
frontmatterData = parsed;
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
const errorMsg = e instanceof Error ? e.message : String(e);
|
|
116
|
+
errors.push(`Invalid YAML in frontmatter: ${errorMsg}`);
|
|
117
|
+
return {
|
|
118
|
+
path: filePath,
|
|
119
|
+
valid: false,
|
|
120
|
+
errors,
|
|
121
|
+
warnings,
|
|
122
|
+
metadata: { hasFrontmatter: true },
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// Extract metadata
|
|
126
|
+
const name = typeof frontmatterData['name'] === 'string'
|
|
127
|
+
? frontmatterData['name']
|
|
128
|
+
: undefined;
|
|
129
|
+
const description = typeof frontmatterData['description'] === 'string'
|
|
130
|
+
? frontmatterData['description']
|
|
131
|
+
: undefined;
|
|
132
|
+
// Validate required fields
|
|
133
|
+
if (!name) {
|
|
134
|
+
errors.push('Missing required "name" field in frontmatter.');
|
|
135
|
+
}
|
|
136
|
+
else if (name.trim().length === 0) {
|
|
137
|
+
errors.push('"name" field in frontmatter is empty.');
|
|
138
|
+
}
|
|
139
|
+
if (!description) {
|
|
140
|
+
warnings.push('Missing "description" field in frontmatter. A description helps with discoverability.');
|
|
141
|
+
}
|
|
142
|
+
else if (description.trim().length === 0) {
|
|
143
|
+
warnings.push('"description" field in frontmatter is empty.');
|
|
144
|
+
}
|
|
145
|
+
// Validate body content
|
|
146
|
+
const body = extracted.body;
|
|
147
|
+
if (!body || body.trim().length === 0) {
|
|
148
|
+
errors.push('Skill body is empty. Add instructions or content after the frontmatter.');
|
|
149
|
+
}
|
|
150
|
+
else if (body.trim().length < MIN_BODY_LENGTH) {
|
|
151
|
+
warnings.push(`Skill body is very short (${body.trim().length} chars). Consider adding more detailed instructions.`);
|
|
152
|
+
}
|
|
153
|
+
if (body && body.length > MAX_BODY_LENGTH) {
|
|
154
|
+
warnings.push(`Skill body is very large (${body.length} chars). Consider splitting into smaller, focused skills.`);
|
|
155
|
+
}
|
|
156
|
+
const valid = errors.length === 0;
|
|
157
|
+
return {
|
|
158
|
+
path: filePath,
|
|
159
|
+
valid,
|
|
160
|
+
errors,
|
|
161
|
+
warnings,
|
|
162
|
+
metadata: {
|
|
163
|
+
name,
|
|
164
|
+
description,
|
|
165
|
+
hasFrontmatter: true,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Validate all skill files in a directory.
|
|
171
|
+
*
|
|
172
|
+
* Looks for `.md` files in the given directory (non-recursively).
|
|
173
|
+
*
|
|
174
|
+
* @param dirPath Absolute path to a directory containing skill files.
|
|
175
|
+
* @returns Array of validation results, one per skill file.
|
|
176
|
+
*/
|
|
177
|
+
export async function validateSkills(dirPath) {
|
|
178
|
+
// Verify directory exists
|
|
179
|
+
try {
|
|
180
|
+
const dirStat = await stat(dirPath);
|
|
181
|
+
if (!dirStat.isDirectory()) {
|
|
182
|
+
return [
|
|
183
|
+
{
|
|
184
|
+
path: dirPath,
|
|
185
|
+
valid: false,
|
|
186
|
+
errors: [`"${dirPath}" is not a directory.`],
|
|
187
|
+
warnings: [],
|
|
188
|
+
},
|
|
189
|
+
];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return [
|
|
194
|
+
{
|
|
195
|
+
path: dirPath,
|
|
196
|
+
valid: false,
|
|
197
|
+
errors: [`Directory "${dirPath}" does not exist or is not accessible.`],
|
|
198
|
+
warnings: [],
|
|
199
|
+
},
|
|
200
|
+
];
|
|
201
|
+
}
|
|
202
|
+
let entries;
|
|
203
|
+
try {
|
|
204
|
+
entries = await readdir(dirPath);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return [
|
|
208
|
+
{
|
|
209
|
+
path: dirPath,
|
|
210
|
+
valid: false,
|
|
211
|
+
errors: [`Cannot read directory: ${dirPath}`],
|
|
212
|
+
warnings: [],
|
|
213
|
+
},
|
|
214
|
+
];
|
|
215
|
+
}
|
|
216
|
+
const results = [];
|
|
217
|
+
for (const entry of entries) {
|
|
218
|
+
const ext = extname(entry).toLowerCase();
|
|
219
|
+
if (ext !== '.md')
|
|
220
|
+
continue;
|
|
221
|
+
const fullPath = join(dirPath, entry);
|
|
222
|
+
try {
|
|
223
|
+
const entryStat = await stat(fullPath);
|
|
224
|
+
if (!entryStat.isFile())
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const result = await validateSkill(fullPath);
|
|
231
|
+
results.push(result);
|
|
232
|
+
}
|
|
233
|
+
return results;
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=skillValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillValidator.js","sourceRoot":"","sources":["../../src/core/skillValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test history tracking with JSON file storage.
|
|
3
|
+
*
|
|
4
|
+
* Stores test run records in `.codeprobe/history/` as individual JSON files.
|
|
5
|
+
* Each run gets its own `<id>.json` file for simple, dependency-free persistence.
|
|
6
|
+
*/
|
|
7
|
+
export interface TestRunRecord {
|
|
8
|
+
id: string;
|
|
9
|
+
timestamp: string;
|
|
10
|
+
specFile: string;
|
|
11
|
+
totalTests: number;
|
|
12
|
+
passed: number;
|
|
13
|
+
failed: number;
|
|
14
|
+
duration: number;
|
|
15
|
+
results: Array<{
|
|
16
|
+
testName: string;
|
|
17
|
+
passed: boolean;
|
|
18
|
+
score?: number;
|
|
19
|
+
duration: number;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Save a test run record to `.codeprobe/history/<id>.json`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function saveTestRun(record: TestRunRecord): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Load all history files, sorted by timestamp descending.
|
|
28
|
+
* Optionally limit to the most recent N records.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadHistory(limit?: number): Promise<TestRunRecord[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Return the history for a specific test, sorted by timestamp descending.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getTestTrend(testName: string, limit?: number): Promise<Array<{
|
|
35
|
+
timestamp: string;
|
|
36
|
+
passed: boolean;
|
|
37
|
+
score?: number;
|
|
38
|
+
duration: number;
|
|
39
|
+
}>>;
|
|
40
|
+
/**
|
|
41
|
+
* Delete all history files.
|
|
42
|
+
*/
|
|
43
|
+
export declare function clearHistory(): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=testHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testHistory.d.ts","sourceRoot":"","sources":["../../src/core/testHistory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AASD;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAgC1E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAwB1F;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test history tracking with JSON file storage.
|
|
3
|
+
*
|
|
4
|
+
* Stores test run records in `.codeprobe/history/` as individual JSON files.
|
|
5
|
+
* Each run gets its own `<id>.json` file for simple, dependency-free persistence.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
const HISTORY_DIR = join(process.cwd(), '.codeprobe', 'history');
|
|
10
|
+
/**
|
|
11
|
+
* Ensure the history directory exists.
|
|
12
|
+
*/
|
|
13
|
+
async function ensureHistoryDir() {
|
|
14
|
+
await mkdir(HISTORY_DIR, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Save a test run record to `.codeprobe/history/<id>.json`.
|
|
18
|
+
*/
|
|
19
|
+
export async function saveTestRun(record) {
|
|
20
|
+
await ensureHistoryDir();
|
|
21
|
+
const filePath = join(HISTORY_DIR, `${record.id}.json`);
|
|
22
|
+
await writeFile(filePath, JSON.stringify(record, null, 2), 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Load all history files, sorted by timestamp descending.
|
|
26
|
+
* Optionally limit to the most recent N records.
|
|
27
|
+
*/
|
|
28
|
+
export async function loadHistory(limit) {
|
|
29
|
+
await ensureHistoryDir();
|
|
30
|
+
let entries;
|
|
31
|
+
try {
|
|
32
|
+
entries = await readdir(HISTORY_DIR);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const jsonFiles = entries.filter((f) => f.endsWith('.json'));
|
|
38
|
+
const records = [];
|
|
39
|
+
for (const file of jsonFiles) {
|
|
40
|
+
try {
|
|
41
|
+
const content = await readFile(join(HISTORY_DIR, file), 'utf-8');
|
|
42
|
+
const record = JSON.parse(content);
|
|
43
|
+
records.push(record);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Skip malformed files
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
records.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
50
|
+
if (limit !== undefined && limit > 0) {
|
|
51
|
+
return records.slice(0, limit);
|
|
52
|
+
}
|
|
53
|
+
return records;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Return the history for a specific test, sorted by timestamp descending.
|
|
57
|
+
*/
|
|
58
|
+
export async function getTestTrend(testName, limit) {
|
|
59
|
+
const records = await loadHistory();
|
|
60
|
+
const trend = [];
|
|
61
|
+
for (const record of records) {
|
|
62
|
+
for (const result of record.results) {
|
|
63
|
+
if (result.testName === testName) {
|
|
64
|
+
trend.push({
|
|
65
|
+
timestamp: record.timestamp,
|
|
66
|
+
passed: result.passed,
|
|
67
|
+
score: result.score,
|
|
68
|
+
duration: result.duration,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Already sorted by timestamp desc (from loadHistory)
|
|
74
|
+
if (limit !== undefined && limit > 0) {
|
|
75
|
+
return trend.slice(0, limit);
|
|
76
|
+
}
|
|
77
|
+
return trend;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Delete all history files.
|
|
81
|
+
*/
|
|
82
|
+
export async function clearHistory() {
|
|
83
|
+
try {
|
|
84
|
+
await rm(HISTORY_DIR, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Directory may not exist
|
|
88
|
+
}
|
|
89
|
+
await ensureHistoryDir();
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=testHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testHistory.js","sourceRoot":"","sources":["../../src/core/testHistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude tokenizer wrapper using tiktoken with cl100k_base encoding.
|
|
3
|
+
* Provides lazy initialization and graceful fallback to character-count estimation.
|
|
4
|
+
*/
|
|
5
|
+
interface TiktokenEncoder {
|
|
6
|
+
encode(text: string): Uint32Array;
|
|
7
|
+
decode(tokens: Uint32Array): string;
|
|
8
|
+
free(): void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Estimate the number of tokens in a text string.
|
|
12
|
+
* Uses tiktoken cl100k_base when available, falls back to chars/4.
|
|
13
|
+
*/
|
|
14
|
+
export declare function estimateTokens(text: string): number;
|
|
15
|
+
/**
|
|
16
|
+
* Estimate token count for a file's contents.
|
|
17
|
+
* Reads the file as UTF-8 text and estimates tokens.
|
|
18
|
+
*/
|
|
19
|
+
export declare function estimateTokensForFile(filePath: string): Promise<number>;
|
|
20
|
+
/**
|
|
21
|
+
* Get the underlying tiktoken encoder instance.
|
|
22
|
+
* Returns the encoder or throws if initialization fails.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getTokenizer(): TiktokenEncoder;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=claudeTokenizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudeTokenizer.d.ts","sourceRoot":"","sources":["../../src/tokenizers/claudeTokenizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,UAAU,eAAe;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAClC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC;IACpC,IAAI,IAAI,IAAI,CAAC;CACd;AAqCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBnD;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO7E;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,eAAe,CAS9C"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude tokenizer wrapper using tiktoken with cl100k_base encoding.
|
|
3
|
+
* Provides lazy initialization and graceful fallback to character-count estimation.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
let tokenizerInstance = null;
|
|
9
|
+
let initFailed = false;
|
|
10
|
+
/**
|
|
11
|
+
* Lazily initialize and return the tiktoken encoder.
|
|
12
|
+
* Uses createRequire for synchronous loading in ESM context.
|
|
13
|
+
* Returns null if tiktoken cannot be loaded.
|
|
14
|
+
*/
|
|
15
|
+
function lazyInit() {
|
|
16
|
+
if (tokenizerInstance) {
|
|
17
|
+
return tokenizerInstance;
|
|
18
|
+
}
|
|
19
|
+
if (initFailed) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const tiktoken = require('tiktoken');
|
|
24
|
+
tokenizerInstance = tiktoken.get_encoding('cl100k_base');
|
|
25
|
+
return tokenizerInstance;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
initFailed = true;
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fallback estimation: approximately 1 token per 4 characters.
|
|
34
|
+
*/
|
|
35
|
+
function fallbackEstimate(text) {
|
|
36
|
+
return Math.ceil(text.length / 4);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Estimate the number of tokens in a text string.
|
|
40
|
+
* Uses tiktoken cl100k_base when available, falls back to chars/4.
|
|
41
|
+
*/
|
|
42
|
+
export function estimateTokens(text) {
|
|
43
|
+
if (!text) {
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
const encoder = lazyInit();
|
|
47
|
+
if (encoder) {
|
|
48
|
+
try {
|
|
49
|
+
const tokens = encoder.encode(text);
|
|
50
|
+
return tokens.length;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return fallbackEstimate(text);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return fallbackEstimate(text);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Estimate token count for a file's contents.
|
|
60
|
+
* Reads the file as UTF-8 text and estimates tokens.
|
|
61
|
+
*/
|
|
62
|
+
export async function estimateTokensForFile(filePath) {
|
|
63
|
+
try {
|
|
64
|
+
const content = await readFile(filePath, 'utf-8');
|
|
65
|
+
return estimateTokens(content);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the underlying tiktoken encoder instance.
|
|
73
|
+
* Returns the encoder or throws if initialization fails.
|
|
74
|
+
*/
|
|
75
|
+
export function getTokenizer() {
|
|
76
|
+
const encoder = lazyInit();
|
|
77
|
+
if (!encoder) {
|
|
78
|
+
throw new Error('Failed to initialize tiktoken encoder. ' +
|
|
79
|
+
'Ensure the tiktoken package is installed correctly.');
|
|
80
|
+
}
|
|
81
|
+
return encoder;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=claudeTokenizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudeTokenizer.js","sourceRoot":"","sources":["../../src/tokenizers/claudeTokenizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAQ/C,IAAI,iBAAiB,GAA2B,IAAI,CAAC;AACrD,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB;;;;GAIG;AACH,SAAS,QAAQ;IACf,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAElC,CAAC;QACF,iBAAiB,GAAG,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACzD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;IAC3B,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAC1D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,yCAAyC;YACvC,qDAAqD,CACxD,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent, hook, and MCP asset discovery types.
|
|
3
|
+
*/
|
|
4
|
+
export interface ClaudeAsset {
|
|
5
|
+
path: string;
|
|
6
|
+
type: ClaudeAssetType;
|
|
7
|
+
confidence: 'high' | 'medium' | 'low';
|
|
8
|
+
reason: string;
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export type AIToolType = 'claude-config' | 'cursor-config' | 'windsurf-config' | 'copilot-config' | 'aider-config' | 'continue-config' | 'cline-config' | 'codex-config' | 'agent' | 'skill' | 'hook' | 'mcp-config' | 'prompt-spec' | 'context-file' | 'agentic-workflow' | 'other';
|
|
12
|
+
export type ClaudeAssetType = AIToolType;
|
|
13
|
+
export interface HookInfo {
|
|
14
|
+
path: string;
|
|
15
|
+
type: string;
|
|
16
|
+
description: string;
|
|
17
|
+
events?: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface MCPAsset {
|
|
20
|
+
path: string;
|
|
21
|
+
type: 'mcp-config' | 'mcp-server' | 'mcp-related';
|
|
22
|
+
serverName?: string;
|
|
23
|
+
transport?: string;
|
|
24
|
+
description: string;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,UAAU,GAClB,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,cAAc,GACd,OAAO,GACP,OAAO,GACP,MAAM,GACN,YAAY,GACZ,aAAa,GACb,cAAc,GACd,kBAAkB,GAClB,OAAO,CAAC;AAGZ,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC;AAEzC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,aAAa,CAAC;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration types for codeprobe.
|
|
3
|
+
*/
|
|
4
|
+
export interface CodeprobeConfig {
|
|
5
|
+
defaultModel?: string;
|
|
6
|
+
defaultContextTarget?: '200k' | '1m';
|
|
7
|
+
ignorePaths?: string[];
|
|
8
|
+
caching?: boolean;
|
|
9
|
+
watchDefaults?: WatchConfig;
|
|
10
|
+
contextBudgets?: ContextBudgets;
|
|
11
|
+
benchmarkDefaults?: BenchmarkConfig;
|
|
12
|
+
}
|
|
13
|
+
export interface WatchConfig {
|
|
14
|
+
debounceMs?: number;
|
|
15
|
+
clearScreen?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface ContextBudgets {
|
|
18
|
+
systemPrompt?: number;
|
|
19
|
+
coreFiles?: number;
|
|
20
|
+
docs?: number;
|
|
21
|
+
toolMeta?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface BenchmarkConfig {
|
|
24
|
+
models?: string[];
|
|
25
|
+
runs?: number;
|
|
26
|
+
warmup?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** @deprecated Use CodeprobeConfig instead. */
|
|
29
|
+
export type ClaudeTestConfig = CodeprobeConfig;
|
|
30
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iBAAiB,CAAC,EAAE,eAAe,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,+CAA+C;AAC/C,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context analysis, simulation, and packing types.
|
|
3
|
+
*/
|
|
4
|
+
export interface ContextAnalysis {
|
|
5
|
+
rootPath: string;
|
|
6
|
+
totalFiles: number;
|
|
7
|
+
textFiles: number;
|
|
8
|
+
skippedFiles: number;
|
|
9
|
+
totalBytes: number;
|
|
10
|
+
estimatedTokens: number;
|
|
11
|
+
extensionBreakdown: ExtensionStats[];
|
|
12
|
+
largestFiles: FileTokenInfo[];
|
|
13
|
+
fitEstimates: FitEstimate[];
|
|
14
|
+
}
|
|
15
|
+
export interface ExtensionStats {
|
|
16
|
+
extension: string;
|
|
17
|
+
fileCount: number;
|
|
18
|
+
totalBytes: number;
|
|
19
|
+
estimatedTokens: number;
|
|
20
|
+
}
|
|
21
|
+
export interface FileTokenInfo {
|
|
22
|
+
path: string;
|
|
23
|
+
bytes: number;
|
|
24
|
+
estimatedTokens: number;
|
|
25
|
+
}
|
|
26
|
+
export interface FitEstimate {
|
|
27
|
+
windowSize: number;
|
|
28
|
+
windowLabel: string;
|
|
29
|
+
fits: boolean;
|
|
30
|
+
utilization: number;
|
|
31
|
+
headroom: number;
|
|
32
|
+
}
|
|
33
|
+
export interface SimulationResult {
|
|
34
|
+
rootPath: string;
|
|
35
|
+
totalTokens: number;
|
|
36
|
+
targets: SimulationTarget[];
|
|
37
|
+
recommendations: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface SimulationTarget {
|
|
40
|
+
windowSize: number;
|
|
41
|
+
windowLabel: string;
|
|
42
|
+
fits: boolean;
|
|
43
|
+
utilization: number;
|
|
44
|
+
headroom: number;
|
|
45
|
+
reservedBudget: number;
|
|
46
|
+
}
|
|
47
|
+
export interface PackPlan {
|
|
48
|
+
target: number;
|
|
49
|
+
targetLabel: string;
|
|
50
|
+
systemPromptBudget: number;
|
|
51
|
+
coreFilesBudget: number;
|
|
52
|
+
docsBudget: number;
|
|
53
|
+
toolMetaBudget: number;
|
|
54
|
+
remainingFree: number;
|
|
55
|
+
includeFirst: FileTokenInfo[];
|
|
56
|
+
summarize: FileTokenInfo[];
|
|
57
|
+
exclude: FileTokenInfo[];
|
|
58
|
+
totalEstimatedTokens: number;
|
|
59
|
+
}
|
|
60
|
+
export interface ContextMap {
|
|
61
|
+
rootPath: string;
|
|
62
|
+
totalTokens: number;
|
|
63
|
+
directories: DirectoryTokenInfo[];
|
|
64
|
+
}
|
|
65
|
+
export interface DirectoryTokenInfo {
|
|
66
|
+
path: string;
|
|
67
|
+
fileCount: number;
|
|
68
|
+
estimatedTokens: number;
|
|
69
|
+
percentage: number;
|
|
70
|
+
}
|
|
71
|
+
export interface HeatmapEntry {
|
|
72
|
+
path: string;
|
|
73
|
+
estimatedTokens: number;
|
|
74
|
+
percentage: number;
|
|
75
|
+
bar: string;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=context.d.ts.map
|