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,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt spec linter.
|
|
3
|
+
*
|
|
4
|
+
* Validates prompt specification files against a set of configurable
|
|
5
|
+
* rules covering clarity, safety, completeness, and consistency.
|
|
6
|
+
*/
|
|
7
|
+
import type { LintWarning } from '../types/diagnostics.js';
|
|
8
|
+
/**
|
|
9
|
+
* Lint a single prompt spec file and return all warnings.
|
|
10
|
+
*
|
|
11
|
+
* @param specPath Absolute path to a YAML prompt spec file.
|
|
12
|
+
* @returns Array of lint warnings.
|
|
13
|
+
*/
|
|
14
|
+
export declare function lintPrompt(specPath: string): Promise<LintWarning[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Lint all prompt spec files in a directory recursively.
|
|
17
|
+
*
|
|
18
|
+
* Looks for files with `.yaml` or `.yml` extensions.
|
|
19
|
+
*
|
|
20
|
+
* @param dirPath Absolute path to the directory to scan.
|
|
21
|
+
* @returns Array of lint warnings from all discovered spec files.
|
|
22
|
+
*/
|
|
23
|
+
export declare function lintDirectory(dirPath: string): Promise<LintWarning[]>;
|
|
24
|
+
//# sourceMappingURL=promptLinter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptLinter.d.ts","sourceRoot":"","sources":["../../src/core/promptLinter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA8Q3D;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAezE;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAwC3E"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt spec linter.
|
|
3
|
+
*
|
|
4
|
+
* Validates prompt specification files against a set of configurable
|
|
5
|
+
* rules covering clarity, safety, completeness, and consistency.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
8
|
+
import { extname } from 'node:path';
|
|
9
|
+
import yaml from 'js-yaml';
|
|
10
|
+
import { walkDirectory } from '../utils/fs.js';
|
|
11
|
+
/**
|
|
12
|
+
* Vague words that lack specificity when used without further qualification.
|
|
13
|
+
*/
|
|
14
|
+
const VAGUE_WORDS = [
|
|
15
|
+
'good', 'nice', 'appropriate', 'proper', 'suitable',
|
|
16
|
+
'adequate', 'reasonable', 'decent', 'fine', 'okay',
|
|
17
|
+
'correct', 'right', 'best', 'great', 'optimal',
|
|
18
|
+
];
|
|
19
|
+
/**
|
|
20
|
+
* Patterns that suggest potential prompt injection vulnerabilities.
|
|
21
|
+
*/
|
|
22
|
+
const INJECTION_PATTERNS = [
|
|
23
|
+
/ignore\s+(all\s+)?previous/i,
|
|
24
|
+
/disregard\s+(all\s+)?previous/i,
|
|
25
|
+
/disregard\s+(all\s+)?(above|prior)/i,
|
|
26
|
+
/forget\s+(all\s+)?previous/i,
|
|
27
|
+
/new\s+instructions?\s*:/i,
|
|
28
|
+
/override\s+(system|instructions)/i,
|
|
29
|
+
/you\s+are\s+now\s+/i,
|
|
30
|
+
/act\s+as\s+if\s+/i,
|
|
31
|
+
/pretend\s+(that\s+)?you/i,
|
|
32
|
+
/ignore\s+everything\s+(above|before)/i,
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Contradictory instruction pairs: [patternA, patternB, description].
|
|
36
|
+
*/
|
|
37
|
+
const CONTRADICTIONS = [
|
|
38
|
+
[/be\s+concise/i, /explain\s+in\s+detail/i, '"be concise" vs "explain in detail"'],
|
|
39
|
+
[/be\s+brief/i, /be\s+thorough/i, '"be brief" vs "be thorough"'],
|
|
40
|
+
[/keep\s+it\s+short/i, /provide\s+(a\s+)?comprehensive/i, '"keep it short" vs "provide comprehensive"'],
|
|
41
|
+
[/one\s+sentence/i, /multiple\s+paragraphs/i, '"one sentence" vs "multiple paragraphs"'],
|
|
42
|
+
[/do\s+not\s+explain/i, /explain\s+(your|the)\s+reasoning/i, '"do not explain" vs "explain reasoning"'],
|
|
43
|
+
[/no\s+examples/i, /provide\s+examples/i, '"no examples" vs "provide examples"'],
|
|
44
|
+
];
|
|
45
|
+
/**
|
|
46
|
+
* Rough token estimation: ~4 characters per token for English text.
|
|
47
|
+
*/
|
|
48
|
+
function estimateTokenCount(text) {
|
|
49
|
+
if (!text)
|
|
50
|
+
return 0;
|
|
51
|
+
return Math.ceil(text.length / 4);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse a YAML file into a PromptSpec. Returns null on parse failure.
|
|
55
|
+
*/
|
|
56
|
+
async function parseSpec(specPath) {
|
|
57
|
+
let content;
|
|
58
|
+
try {
|
|
59
|
+
content = await readFile(specPath, 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
let parsed;
|
|
65
|
+
try {
|
|
66
|
+
parsed = yaml.load(content);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
if (parsed === null || parsed === undefined || typeof parsed !== 'object') {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const obj = parsed;
|
|
75
|
+
return {
|
|
76
|
+
name: typeof obj['name'] === 'string' ? obj['name'] : specPath,
|
|
77
|
+
description: typeof obj['description'] === 'string' ? obj['description'] : undefined,
|
|
78
|
+
model: typeof obj['model'] === 'string' ? obj['model'] : undefined,
|
|
79
|
+
system: typeof obj['system'] === 'string' ? obj['system'] : undefined,
|
|
80
|
+
prompt: typeof obj['prompt'] === 'string' ? obj['prompt'] : '',
|
|
81
|
+
tests: Array.isArray(obj['tests']) ? parseRawTests(obj['tests']) : undefined,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Parse raw test entries from YAML.
|
|
86
|
+
*/
|
|
87
|
+
function parseRawTests(rawTests) {
|
|
88
|
+
return rawTests
|
|
89
|
+
.filter((t) => typeof t === 'object' && t !== null)
|
|
90
|
+
.map((t) => {
|
|
91
|
+
const test = {
|
|
92
|
+
name: typeof t['name'] === 'string' ? t['name'] : 'unnamed',
|
|
93
|
+
input: typeof t['input'] === 'string' ? t['input'] : undefined,
|
|
94
|
+
inputFile: typeof t['inputFile'] === 'string' ? t['inputFile'] : undefined,
|
|
95
|
+
};
|
|
96
|
+
if (typeof t['expect'] === 'object' && t['expect'] !== null) {
|
|
97
|
+
const e = t['expect'];
|
|
98
|
+
const expect = {};
|
|
99
|
+
if (Array.isArray(e['contains'])) {
|
|
100
|
+
expect.contains = e['contains'].filter((v) => typeof v === 'string');
|
|
101
|
+
}
|
|
102
|
+
if (Array.isArray(e['notContains'])) {
|
|
103
|
+
expect.notContains = e['notContains'].filter((v) => typeof v === 'string');
|
|
104
|
+
}
|
|
105
|
+
if (Array.isArray(e['regex'])) {
|
|
106
|
+
expect.regex = e['regex'].filter((v) => typeof v === 'string');
|
|
107
|
+
}
|
|
108
|
+
if (typeof e['equals'] === 'string') {
|
|
109
|
+
expect.equals = e['equals'];
|
|
110
|
+
}
|
|
111
|
+
if (typeof e['jsonSchema'] === 'object' && e['jsonSchema'] !== null) {
|
|
112
|
+
expect.jsonSchema = e['jsonSchema'];
|
|
113
|
+
}
|
|
114
|
+
test.expect = expect;
|
|
115
|
+
}
|
|
116
|
+
return test;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check a single spec against all lint rules.
|
|
121
|
+
*/
|
|
122
|
+
function applyRules(spec, filePath) {
|
|
123
|
+
const warnings = [];
|
|
124
|
+
// Combine all text for full-spec checks
|
|
125
|
+
const fullText = [spec.system ?? '', spec.prompt].join('\n');
|
|
126
|
+
// Rule 1: no-vague-instructions
|
|
127
|
+
for (const word of VAGUE_WORDS) {
|
|
128
|
+
const pattern = new RegExp(`\\b${word}\\b`, 'gi');
|
|
129
|
+
const match = pattern.exec(fullText);
|
|
130
|
+
if (match) {
|
|
131
|
+
// Check it's not followed by a more specific qualifier
|
|
132
|
+
const afterMatch = fullText.slice(match.index + match[0].length, match.index + match[0].length + 30);
|
|
133
|
+
const hasQualifier = /^\s+(for|when|if|because|that|which|at|in|with)\b/.test(afterMatch);
|
|
134
|
+
if (!hasQualifier) {
|
|
135
|
+
warnings.push({
|
|
136
|
+
file: filePath,
|
|
137
|
+
rule: 'no-vague-instructions',
|
|
138
|
+
severity: 'warning',
|
|
139
|
+
message: `Vague word "${word}" found without specific qualification. Consider being more precise.`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Rule 2: require-format
|
|
145
|
+
const formatIndicators = [
|
|
146
|
+
/\bformat\b/i, /\bjson\b/i, /\bxml\b/i, /\byaml\b/i,
|
|
147
|
+
/\bmarkdown\b/i, /\bcsv\b/i, /\btable\b/i,
|
|
148
|
+
/\bbullet/i, /\bnumbered\s+list/i, /\blist\b/i,
|
|
149
|
+
/\boutput\s+as\b/i, /\brespond\s+(with|in|as)\b/i,
|
|
150
|
+
];
|
|
151
|
+
const hasFormat = formatIndicators.some((p) => p.test(fullText));
|
|
152
|
+
if (!hasFormat) {
|
|
153
|
+
warnings.push({
|
|
154
|
+
file: filePath,
|
|
155
|
+
rule: 'require-format',
|
|
156
|
+
severity: 'warning',
|
|
157
|
+
message: 'No output format specified in prompt or system message. Consider specifying the expected response format.',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// Rule 3: weak-system-prompt
|
|
161
|
+
if (!spec.system) {
|
|
162
|
+
warnings.push({
|
|
163
|
+
file: filePath,
|
|
164
|
+
rule: 'weak-system-prompt',
|
|
165
|
+
severity: 'warning',
|
|
166
|
+
message: 'No system prompt defined. A system prompt helps set context and constraints.',
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
else if (spec.system.length < 20) {
|
|
170
|
+
warnings.push({
|
|
171
|
+
file: filePath,
|
|
172
|
+
rule: 'weak-system-prompt',
|
|
173
|
+
severity: 'warning',
|
|
174
|
+
message: `System prompt is very short (${spec.system.length} chars). Consider adding more context and constraints.`,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
// Rule 4: prompt-injection-risk
|
|
178
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
179
|
+
const match = pattern.exec(fullText);
|
|
180
|
+
if (match) {
|
|
181
|
+
warnings.push({
|
|
182
|
+
file: filePath,
|
|
183
|
+
rule: 'prompt-injection-risk',
|
|
184
|
+
severity: 'error',
|
|
185
|
+
message: `Potential prompt injection pattern detected: "${match[0]}". This could be exploited to override instructions.`,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Rule 5: oversized-prompt
|
|
190
|
+
const totalTokens = estimateTokenCount(fullText);
|
|
191
|
+
if (totalTokens > 4000) {
|
|
192
|
+
warnings.push({
|
|
193
|
+
file: filePath,
|
|
194
|
+
rule: 'oversized-prompt',
|
|
195
|
+
severity: 'warning',
|
|
196
|
+
message: `Prompt is estimated at ~${totalTokens} tokens, exceeding the 4000-token guideline. Consider trimming or splitting.`,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// Rule 6: missing-description
|
|
200
|
+
if (!spec.description) {
|
|
201
|
+
warnings.push({
|
|
202
|
+
file: filePath,
|
|
203
|
+
rule: 'missing-description',
|
|
204
|
+
severity: 'info',
|
|
205
|
+
message: 'No description field. Adding a description improves discoverability and documentation.',
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
// Rule 7: missing-tests
|
|
209
|
+
if (!spec.tests || spec.tests.length === 0) {
|
|
210
|
+
warnings.push({
|
|
211
|
+
file: filePath,
|
|
212
|
+
rule: 'missing-tests',
|
|
213
|
+
severity: 'warning',
|
|
214
|
+
message: 'No tests defined. Add tests to verify prompt behavior and prevent regressions.',
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
// Rule 8: missing-model
|
|
218
|
+
if (!spec.model) {
|
|
219
|
+
warnings.push({
|
|
220
|
+
file: filePath,
|
|
221
|
+
rule: 'missing-model',
|
|
222
|
+
severity: 'info',
|
|
223
|
+
message: 'No model specified. The default model will be used, which may produce unexpected results if changed.',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// Rule 9: missing-assertions
|
|
227
|
+
if (spec.tests && spec.tests.length > 0) {
|
|
228
|
+
for (const test of spec.tests) {
|
|
229
|
+
if (!test.expect) {
|
|
230
|
+
warnings.push({
|
|
231
|
+
file: filePath,
|
|
232
|
+
rule: 'missing-assertions',
|
|
233
|
+
severity: 'warning',
|
|
234
|
+
message: `Test "${test.name}" has no expect field. Tests without assertions cannot verify output correctness.`,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Rule 10: contradictory-instructions
|
|
240
|
+
for (const [patternA, patternB, description] of CONTRADICTIONS) {
|
|
241
|
+
if (patternA.test(fullText) && patternB.test(fullText)) {
|
|
242
|
+
warnings.push({
|
|
243
|
+
file: filePath,
|
|
244
|
+
rule: 'contradictory-instructions',
|
|
245
|
+
severity: 'warning',
|
|
246
|
+
message: `Potentially contradictory instructions detected: ${description}. This may confuse the model.`,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return warnings;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Lint a single prompt spec file and return all warnings.
|
|
254
|
+
*
|
|
255
|
+
* @param specPath Absolute path to a YAML prompt spec file.
|
|
256
|
+
* @returns Array of lint warnings.
|
|
257
|
+
*/
|
|
258
|
+
export async function lintPrompt(specPath) {
|
|
259
|
+
const spec = await parseSpec(specPath);
|
|
260
|
+
if (!spec) {
|
|
261
|
+
return [
|
|
262
|
+
{
|
|
263
|
+
file: specPath,
|
|
264
|
+
rule: 'parse-error',
|
|
265
|
+
severity: 'error',
|
|
266
|
+
message: 'Failed to parse prompt spec file. Ensure it is valid YAML with a "prompt" field.',
|
|
267
|
+
},
|
|
268
|
+
];
|
|
269
|
+
}
|
|
270
|
+
return applyRules(spec, specPath);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Lint all prompt spec files in a directory recursively.
|
|
274
|
+
*
|
|
275
|
+
* Looks for files with `.yaml` or `.yml` extensions.
|
|
276
|
+
*
|
|
277
|
+
* @param dirPath Absolute path to the directory to scan.
|
|
278
|
+
* @returns Array of lint warnings from all discovered spec files.
|
|
279
|
+
*/
|
|
280
|
+
export async function lintDirectory(dirPath) {
|
|
281
|
+
const warnings = [];
|
|
282
|
+
const promptExtensions = new Set(['.yaml', '.yml']);
|
|
283
|
+
// Verify directory exists
|
|
284
|
+
try {
|
|
285
|
+
const dirStat = await stat(dirPath);
|
|
286
|
+
if (!dirStat.isDirectory()) {
|
|
287
|
+
return [
|
|
288
|
+
{
|
|
289
|
+
file: dirPath,
|
|
290
|
+
rule: 'invalid-path',
|
|
291
|
+
severity: 'error',
|
|
292
|
+
message: `"${dirPath}" is not a directory.`,
|
|
293
|
+
},
|
|
294
|
+
];
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return [
|
|
299
|
+
{
|
|
300
|
+
file: dirPath,
|
|
301
|
+
rule: 'invalid-path',
|
|
302
|
+
severity: 'error',
|
|
303
|
+
message: `Directory "${dirPath}" does not exist or is not accessible.`,
|
|
304
|
+
},
|
|
305
|
+
];
|
|
306
|
+
}
|
|
307
|
+
const entries = await walkDirectory(dirPath);
|
|
308
|
+
for (const entry of entries) {
|
|
309
|
+
if (!entry.isFile)
|
|
310
|
+
continue;
|
|
311
|
+
const ext = extname(entry.path).toLowerCase();
|
|
312
|
+
if (!promptExtensions.has(ext))
|
|
313
|
+
continue;
|
|
314
|
+
const fileWarnings = await lintPrompt(entry.path);
|
|
315
|
+
warnings.push(...fileWarnings);
|
|
316
|
+
}
|
|
317
|
+
return warnings;
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=promptLinter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptLinter.js","sourceRoot":"","sources":["../../src/core/promptLinter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt test runner — parses prompt specs, runs tests, and evaluates assertions.
|
|
3
|
+
*/
|
|
4
|
+
import type { PromptSpec, PromptTest, TestExpectation, TestResult, AssertionResult, ExecutionMode } from '../types/prompt.js';
|
|
5
|
+
/**
|
|
6
|
+
* Options controlling how prompt tests are executed.
|
|
7
|
+
*/
|
|
8
|
+
export interface RunOptions {
|
|
9
|
+
mode: ExecutionMode;
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
cache?: boolean;
|
|
12
|
+
json?: boolean;
|
|
13
|
+
modelOverride?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse and validate a prompt spec YAML file.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parsePromptSpec(filePath: string): Promise<PromptSpec>;
|
|
19
|
+
/**
|
|
20
|
+
* Evaluate all assertions for a test expectation against actual output.
|
|
21
|
+
*/
|
|
22
|
+
export declare function evaluateAssertions(output: string, expect: TestExpectation): AssertionResult[];
|
|
23
|
+
/**
|
|
24
|
+
* Run a single prompt test and return the result.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runSingleTest(spec: PromptSpec, test: PromptTest, options: RunOptions): Promise<TestResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Run all tests defined in a prompt spec file.
|
|
29
|
+
*/
|
|
30
|
+
export declare function runPromptTests(specPath: string, options: RunOptions): Promise<TestResult[]>;
|
|
31
|
+
//# sourceMappingURL=promptRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptRunner.d.ts","sourceRoot":"","sources":["../../src/core/promptRunner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,eAAe,EACf,UAAU,EACV,eAAe,EACf,aAAa,EACd,MAAM,oBAAoB,CAAC;AAK5B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA0CD;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0B3E;AAuED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,GACtB,eAAe,EAAE,CAmMnB;AAMD;;GAEG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,UAAU,CAAC,CA8FrB;AAMD;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CAevB"}
|