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,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeprobe init` — Create starter folders, example prompt files,
|
|
3
|
+
* dataset examples, and configuration.
|
|
4
|
+
*
|
|
5
|
+
* Auto-detects AI tools in use and provides context-aware next steps.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdir, writeFile, access } from 'node:fs/promises';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { resolvePath } from '../utils/paths.js';
|
|
10
|
+
import { fileExists, isDirectory } from '../utils/fs.js';
|
|
11
|
+
const EXAMPLE_PROMPT_SPEC = `# Example prompt spec for codeprobe
|
|
12
|
+
name: summarize
|
|
13
|
+
description: Summarize an article into bullet points
|
|
14
|
+
model: claude-sonnet-4-6
|
|
15
|
+
|
|
16
|
+
system: |
|
|
17
|
+
You are a concise summarizer. Given an article, produce 3-5 bullet points
|
|
18
|
+
capturing the key ideas.
|
|
19
|
+
|
|
20
|
+
prompt: |
|
|
21
|
+
Summarize the following article into 3-5 bullet points:
|
|
22
|
+
|
|
23
|
+
{{input}}
|
|
24
|
+
|
|
25
|
+
tests:
|
|
26
|
+
- name: produces bullet points
|
|
27
|
+
input: >
|
|
28
|
+
Artificial intelligence is transforming industries worldwide.
|
|
29
|
+
Healthcare, finance, and transportation are seeing significant
|
|
30
|
+
improvements through machine learning applications.
|
|
31
|
+
expect:
|
|
32
|
+
contains:
|
|
33
|
+
- "artificial intelligence"
|
|
34
|
+
regex:
|
|
35
|
+
- "^[\\\\s]*[-*]"
|
|
36
|
+
- name: handles short input
|
|
37
|
+
input: "The sky is blue."
|
|
38
|
+
expect:
|
|
39
|
+
contains:
|
|
40
|
+
- "sky"
|
|
41
|
+
`;
|
|
42
|
+
const EXAMPLE_DATASET = `{"input":"Machine learning models require large amounts of data for training.","expected":"Summary mentioning data requirements"}
|
|
43
|
+
{"input":"Climate change is affecting weather patterns globally, leading to more extreme events.","expected":"Summary mentioning climate and weather"}
|
|
44
|
+
{"input":"Remote work has become the new norm since the pandemic reshaped how companies operate.","expected":"Summary mentioning remote work trends"}
|
|
45
|
+
`;
|
|
46
|
+
const EXAMPLE_FIXTURE = `The Rise of Context Engineering
|
|
47
|
+
|
|
48
|
+
Context engineering is the emerging discipline of designing and optimizing
|
|
49
|
+
the information provided to large language models (LLMs) to achieve better
|
|
50
|
+
outputs. Unlike prompt engineering, which focuses narrowly on the instruction
|
|
51
|
+
text, context engineering considers the entire input window: system prompts,
|
|
52
|
+
few-shot examples, retrieved documents, tool definitions, and conversation
|
|
53
|
+
history.
|
|
54
|
+
|
|
55
|
+
Key principles of context engineering include:
|
|
56
|
+
|
|
57
|
+
1. Token budget management — understanding how to allocate the finite
|
|
58
|
+
context window across different information types.
|
|
59
|
+
|
|
60
|
+
2. Information density — ensuring every token carries maximum signal
|
|
61
|
+
and minimal noise.
|
|
62
|
+
|
|
63
|
+
3. Structured formatting — using consistent formats (YAML, XML, markdown)
|
|
64
|
+
that models parse reliably.
|
|
65
|
+
|
|
66
|
+
4. Progressive disclosure — loading information on demand rather than
|
|
67
|
+
stuffing everything upfront.
|
|
68
|
+
|
|
69
|
+
5. Validation loops — testing that context changes actually improve
|
|
70
|
+
model behavior on representative tasks.
|
|
71
|
+
|
|
72
|
+
As context windows grow from 8K to 200K to 1M+ tokens, context engineering
|
|
73
|
+
becomes increasingly important. The challenge shifts from "what fits" to
|
|
74
|
+
"what matters" — curating the right information at the right level of
|
|
75
|
+
detail for each specific task.
|
|
76
|
+
`;
|
|
77
|
+
const EXAMPLE_CONFIG = `# codeprobe configuration
|
|
78
|
+
# See: https://github.com/anthropics/codeprobe
|
|
79
|
+
|
|
80
|
+
defaultModel: claude-sonnet-4-6
|
|
81
|
+
defaultContextTarget: 200k
|
|
82
|
+
|
|
83
|
+
# Paths to ignore during context analysis
|
|
84
|
+
ignorePaths:
|
|
85
|
+
- node_modules
|
|
86
|
+
- .git
|
|
87
|
+
- dist
|
|
88
|
+
- coverage
|
|
89
|
+
- "*.min.js"
|
|
90
|
+
- "*.map"
|
|
91
|
+
|
|
92
|
+
# Enable result caching
|
|
93
|
+
caching: true
|
|
94
|
+
|
|
95
|
+
# Context window budget allocation (percentages)
|
|
96
|
+
contextBudgets:
|
|
97
|
+
systemPrompt: 10
|
|
98
|
+
coreFiles: 50
|
|
99
|
+
docs: 20
|
|
100
|
+
toolMeta: 10
|
|
101
|
+
|
|
102
|
+
# Watch mode settings
|
|
103
|
+
watchDefaults:
|
|
104
|
+
debounceMs: 300
|
|
105
|
+
clearScreen: true
|
|
106
|
+
|
|
107
|
+
# Benchmark defaults
|
|
108
|
+
benchmarkDefaults:
|
|
109
|
+
models:
|
|
110
|
+
- claude-sonnet-4-6
|
|
111
|
+
- claude-opus-4-6
|
|
112
|
+
runs: 3
|
|
113
|
+
warmup: true
|
|
114
|
+
`;
|
|
115
|
+
async function pathExists(path) {
|
|
116
|
+
try {
|
|
117
|
+
await access(path);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Auto-detect AI tools in use by checking for known config files/directories.
|
|
126
|
+
*/
|
|
127
|
+
async function detectAITools(root) {
|
|
128
|
+
const detected = [];
|
|
129
|
+
const checks = [
|
|
130
|
+
{ name: 'Claude Code', paths: ['CLAUDE.md', '.claude/settings.json'] },
|
|
131
|
+
{ name: 'Cursor', paths: ['.cursorrules', '.cursor/rules'] },
|
|
132
|
+
{ name: 'Windsurf', paths: ['.windsurfrules', '.windsurf/rules'] },
|
|
133
|
+
{ name: 'GitHub Copilot', paths: ['.github/copilot-instructions.md', '.copilot'] },
|
|
134
|
+
{ name: 'Aider', paths: ['.aider.conf.yml', '.aiderignore'] },
|
|
135
|
+
{ name: 'Continue', paths: ['.continue/config.json', '.continuerules'] },
|
|
136
|
+
{ name: 'Cline', paths: ['.clinerules', '.cline'] },
|
|
137
|
+
{ name: 'Codex', paths: ['codex.md', 'CODEX.md', '.codex'] },
|
|
138
|
+
];
|
|
139
|
+
for (const check of checks) {
|
|
140
|
+
for (const p of check.paths) {
|
|
141
|
+
if (await pathExists(join(root, p))) {
|
|
142
|
+
detected.push({ name: check.name, indicator: p });
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return detected;
|
|
148
|
+
}
|
|
149
|
+
export function registerInitCommand(program) {
|
|
150
|
+
program
|
|
151
|
+
.command('init')
|
|
152
|
+
.description('Create starter folders, example prompt files, dataset examples, and config')
|
|
153
|
+
.option('--force', 'Overwrite existing files')
|
|
154
|
+
.action(async (options) => {
|
|
155
|
+
const chalk = (await import('chalk')).default;
|
|
156
|
+
const root = process.cwd();
|
|
157
|
+
// Auto-detect AI tools
|
|
158
|
+
const detectedTools = await detectAITools(root);
|
|
159
|
+
const items = [
|
|
160
|
+
{
|
|
161
|
+
type: 'dir',
|
|
162
|
+
path: 'prompts',
|
|
163
|
+
description: 'Prompt specs directory',
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
type: 'file',
|
|
167
|
+
path: join('prompts', 'summarize.prompt.yaml'),
|
|
168
|
+
content: EXAMPLE_PROMPT_SPEC,
|
|
169
|
+
description: 'Example prompt spec',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
type: 'dir',
|
|
173
|
+
path: 'datasets',
|
|
174
|
+
description: 'Datasets directory',
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
type: 'file',
|
|
178
|
+
path: join('datasets', 'sample.jsonl'),
|
|
179
|
+
content: EXAMPLE_DATASET,
|
|
180
|
+
description: 'Example dataset',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
type: 'dir',
|
|
184
|
+
path: 'fixtures',
|
|
185
|
+
description: 'Test fixtures directory',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
type: 'file',
|
|
189
|
+
path: join('fixtures', 'article.txt'),
|
|
190
|
+
content: EXAMPLE_FIXTURE,
|
|
191
|
+
description: 'Sample fixture',
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
type: 'dir',
|
|
195
|
+
path: 'examples',
|
|
196
|
+
description: 'Examples directory',
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
type: 'file',
|
|
200
|
+
path: 'codeprobe.config.yaml',
|
|
201
|
+
content: EXAMPLE_CONFIG,
|
|
202
|
+
description: 'Configuration file',
|
|
203
|
+
},
|
|
204
|
+
];
|
|
205
|
+
let created = 0;
|
|
206
|
+
let skipped = 0;
|
|
207
|
+
const createdFiles = [];
|
|
208
|
+
for (const item of items) {
|
|
209
|
+
const fullPath = resolvePath(join(root, item.path));
|
|
210
|
+
if (item.type === 'dir') {
|
|
211
|
+
if (await isDirectory(fullPath)) {
|
|
212
|
+
if (!options.force) {
|
|
213
|
+
console.log(chalk.dim(` skip ${item.path}/ (already exists)`));
|
|
214
|
+
skipped++;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
await mkdir(fullPath, { recursive: true });
|
|
219
|
+
console.log(chalk.green(` create ${item.path}/`));
|
|
220
|
+
created++;
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
if ((await fileExists(fullPath)) && !options.force) {
|
|
224
|
+
console.log(chalk.dim(` skip ${item.path} (already exists)`));
|
|
225
|
+
skipped++;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
// Ensure parent directory exists
|
|
229
|
+
const parentDir = fullPath.substring(0, fullPath.lastIndexOf('/'));
|
|
230
|
+
await mkdir(parentDir, { recursive: true });
|
|
231
|
+
await writeFile(fullPath, item.content ?? '', 'utf-8');
|
|
232
|
+
console.log(chalk.green(` create ${item.path}`));
|
|
233
|
+
createdFiles.push(item.path);
|
|
234
|
+
created++;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
console.log('');
|
|
238
|
+
console.log(chalk.bold(`Initialized codeprobe project: ${created} created, ${skipped} skipped`));
|
|
239
|
+
// Show detected AI tools
|
|
240
|
+
if (detectedTools.length > 0) {
|
|
241
|
+
console.log('');
|
|
242
|
+
console.log(chalk.bold(' Detected AI tools:'));
|
|
243
|
+
for (const tool of detectedTools) {
|
|
244
|
+
console.log(chalk.cyan(` ${tool.name}`) + chalk.dim(` (${tool.indicator})`));
|
|
245
|
+
}
|
|
246
|
+
// Hint about Cursor rules generation if Cursor is detected but no .cursorrules
|
|
247
|
+
const hasCursor = detectedTools.some(t => t.name === 'Cursor');
|
|
248
|
+
const hasCursorRules = await pathExists(join(root, '.cursorrules'));
|
|
249
|
+
if (hasCursor && !hasCursorRules) {
|
|
250
|
+
console.log(chalk.dim(' Tip: generate Cursor rules with: codeprobe generate-rules --tool cursor'));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
console.log('');
|
|
255
|
+
console.log(chalk.dim(' No AI tools detected. Generate configs with:'));
|
|
256
|
+
console.log(chalk.dim(' codeprobe generate-claudemd (Claude Code)'));
|
|
257
|
+
console.log(chalk.dim(' codeprobe generate-rules (Cursor, Windsurf, etc.)'));
|
|
258
|
+
}
|
|
259
|
+
// Context-aware "What's next?" section
|
|
260
|
+
console.log('');
|
|
261
|
+
console.log(chalk.bold(' What\'s next:'));
|
|
262
|
+
console.log(chalk.white(' 1. Run a full scan: ') + chalk.cyan('codeprobe scan'));
|
|
263
|
+
console.log(chalk.white(' 2. See the dashboard: ') + chalk.cyan('codeprobe'));
|
|
264
|
+
console.log(chalk.white(' 3. Generate AI tool config: ') + chalk.cyan('codeprobe generate-claudemd'));
|
|
265
|
+
console.log(chalk.white(' 4. Test your prompts: ') + chalk.cyan('codeprobe test'));
|
|
266
|
+
console.log(chalk.white(' 5. Auto-generate tests: ') + chalk.cyan('codeprobe autotest prompts/summarize.prompt.yaml'));
|
|
267
|
+
console.log('');
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeprobe install-hook` — Install a Claude Code hook into .claude/settings.json.
|
|
3
|
+
*
|
|
4
|
+
* Merges a hook entry (e.g. PreCommit) into the project's Claude settings
|
|
5
|
+
* without overwriting existing entries.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
export declare function registerInstallHookCommand(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=installHook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installHook.d.ts","sourceRoot":"","sources":["../../src/commands/installHook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqFjE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeprobe install-hook` — Install a Claude Code hook into .claude/settings.json.
|
|
3
|
+
*
|
|
4
|
+
* Merges a hook entry (e.g. PreCommit) into the project's Claude settings
|
|
5
|
+
* without overwriting existing entries.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { fileExists, readTextFile } from '../utils/fs.js';
|
|
10
|
+
export function registerInstallHookCommand(program) {
|
|
11
|
+
program
|
|
12
|
+
.command('install-hook')
|
|
13
|
+
.description('Install a Claude Code hook into .claude/settings.json')
|
|
14
|
+
.option('--event <event>', 'Hook event name', 'PreCommit')
|
|
15
|
+
.option('--command <cmd>', 'Command to run', 'codeprobe test --json')
|
|
16
|
+
.option('--dry-run', 'Show what would be written without modifying files')
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
const chalk = (await import('chalk')).default;
|
|
19
|
+
const projectRoot = process.cwd();
|
|
20
|
+
const claudeDir = join(projectRoot, '.claude');
|
|
21
|
+
const settingsPath = join(claudeDir, 'settings.json');
|
|
22
|
+
// Read existing settings or start fresh
|
|
23
|
+
let settings = {};
|
|
24
|
+
if (await fileExists(settingsPath)) {
|
|
25
|
+
const content = await readTextFile(settingsPath);
|
|
26
|
+
if (content) {
|
|
27
|
+
try {
|
|
28
|
+
settings = JSON.parse(content);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
console.error(chalk.red('Error: .claude/settings.json contains invalid JSON.'));
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Ensure hooks object exists
|
|
38
|
+
if (!settings.hooks) {
|
|
39
|
+
settings.hooks = {};
|
|
40
|
+
}
|
|
41
|
+
// Ensure event array exists
|
|
42
|
+
const eventName = options.event;
|
|
43
|
+
if (!settings.hooks[eventName]) {
|
|
44
|
+
settings.hooks[eventName] = [];
|
|
45
|
+
}
|
|
46
|
+
const newEntry = {
|
|
47
|
+
command: options.command,
|
|
48
|
+
description: 'Run prompt regression tests',
|
|
49
|
+
};
|
|
50
|
+
// Check for duplicate — same command already registered
|
|
51
|
+
const existing = settings.hooks[eventName];
|
|
52
|
+
const alreadyExists = existing.some((e) => e.command === newEntry.command);
|
|
53
|
+
if (alreadyExists) {
|
|
54
|
+
console.log(chalk.yellow(`\nHook already exists: ${eventName} -> "${newEntry.command}"\n` +
|
|
55
|
+
'No changes made.\n'));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Append to the array (merge, not overwrite)
|
|
59
|
+
existing.push(newEntry);
|
|
60
|
+
const resultJson = JSON.stringify(settings, null, 2);
|
|
61
|
+
if (options.dryRun) {
|
|
62
|
+
console.log(chalk.dim('\n[dry-run] Would write to .claude/settings.json:\n'));
|
|
63
|
+
console.log(resultJson);
|
|
64
|
+
console.log('');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Create .claude/ directory if needed
|
|
68
|
+
await mkdir(claudeDir, { recursive: true });
|
|
69
|
+
// Write settings
|
|
70
|
+
await writeFile(settingsPath, resultJson + '\n', 'utf-8');
|
|
71
|
+
console.log(chalk.green('\nHook installed successfully!\n'));
|
|
72
|
+
console.log(` Event: ${chalk.bold(eventName)}`);
|
|
73
|
+
console.log(` Command: ${chalk.bold(newEntry.command)}`);
|
|
74
|
+
console.log(` File: ${chalk.dim('.claude/settings.json')}`);
|
|
75
|
+
console.log('');
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=installHook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installHook.js","sourceRoot":"","sources":["../../src/commands/installHook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6LpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6E1D"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeprobe lint [path]` — Lint prompt spec files for common issues.
|
|
3
|
+
*/
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import { resolvePath } from '../utils/paths.js';
|
|
6
|
+
import { readTextFile, isDirectory, fileExists, getRelativePath as getRelPath } from '../utils/fs.js';
|
|
7
|
+
import { setLogLevel } from '../utils/logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* Find all prompt spec files in a directory.
|
|
10
|
+
*/
|
|
11
|
+
async function findSpecFiles(dirPath) {
|
|
12
|
+
const { glob } = await import('glob');
|
|
13
|
+
const pattern = resolve(dirPath, '**/*.prompt.{yaml,yml}');
|
|
14
|
+
return glob(pattern, { absolute: true });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Lint a single prompt spec file.
|
|
18
|
+
*/
|
|
19
|
+
async function lintFile(filePath, rootPath) {
|
|
20
|
+
const yaml = (await import('js-yaml')).default;
|
|
21
|
+
const warnings = [];
|
|
22
|
+
const relPath = getRelPath(rootPath, filePath);
|
|
23
|
+
const content = await readTextFile(filePath);
|
|
24
|
+
if (!content) {
|
|
25
|
+
warnings.push({
|
|
26
|
+
file: relPath,
|
|
27
|
+
rule: 'file-read',
|
|
28
|
+
severity: 'error',
|
|
29
|
+
message: 'Could not read file',
|
|
30
|
+
});
|
|
31
|
+
return warnings;
|
|
32
|
+
}
|
|
33
|
+
// Parse YAML
|
|
34
|
+
let parsed;
|
|
35
|
+
try {
|
|
36
|
+
parsed = yaml.load(content);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
warnings.push({
|
|
40
|
+
file: relPath,
|
|
41
|
+
rule: 'yaml-parse',
|
|
42
|
+
severity: 'error',
|
|
43
|
+
message: `Invalid YAML: ${err instanceof Error ? err.message : String(err)}`,
|
|
44
|
+
});
|
|
45
|
+
return warnings;
|
|
46
|
+
}
|
|
47
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
48
|
+
warnings.push({
|
|
49
|
+
file: relPath,
|
|
50
|
+
rule: 'yaml-parse',
|
|
51
|
+
severity: 'error',
|
|
52
|
+
message: 'YAML did not parse to an object',
|
|
53
|
+
});
|
|
54
|
+
return warnings;
|
|
55
|
+
}
|
|
56
|
+
// Check required fields
|
|
57
|
+
if (!parsed['name']) {
|
|
58
|
+
warnings.push({
|
|
59
|
+
file: relPath,
|
|
60
|
+
rule: 'missing-name',
|
|
61
|
+
severity: 'warning',
|
|
62
|
+
message: 'Missing "name" field',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (!parsed['prompt']) {
|
|
66
|
+
warnings.push({
|
|
67
|
+
file: relPath,
|
|
68
|
+
rule: 'missing-prompt',
|
|
69
|
+
severity: 'error',
|
|
70
|
+
message: 'Missing "prompt" field — every spec needs a prompt',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Check prompt quality
|
|
74
|
+
const prompt = parsed['prompt'];
|
|
75
|
+
if (typeof prompt === 'string') {
|
|
76
|
+
if (prompt.length < 10) {
|
|
77
|
+
warnings.push({
|
|
78
|
+
file: relPath,
|
|
79
|
+
rule: 'short-prompt',
|
|
80
|
+
severity: 'warning',
|
|
81
|
+
message: 'Prompt is very short (< 10 characters). Consider adding more detail.',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (prompt.length > 10_000) {
|
|
85
|
+
warnings.push({
|
|
86
|
+
file: relPath,
|
|
87
|
+
rule: 'long-prompt',
|
|
88
|
+
severity: 'info',
|
|
89
|
+
message: `Prompt is very long (${prompt.length} chars). Consider splitting into system + prompt.`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (!parsed['system'] && prompt.includes('You are')) {
|
|
93
|
+
warnings.push({
|
|
94
|
+
file: relPath,
|
|
95
|
+
rule: 'system-in-prompt',
|
|
96
|
+
severity: 'info',
|
|
97
|
+
message: 'Prompt contains "You are" — consider moving persona to the "system" field.',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Check model
|
|
102
|
+
if (parsed['model'] && typeof parsed['model'] === 'string') {
|
|
103
|
+
const model = parsed['model'];
|
|
104
|
+
if (!model.startsWith('claude-') && !model.startsWith('gpt-') && !model.includes('/')) {
|
|
105
|
+
warnings.push({
|
|
106
|
+
file: relPath,
|
|
107
|
+
rule: 'unknown-model',
|
|
108
|
+
severity: 'warning',
|
|
109
|
+
message: `Unknown model format: "${model}". Expected claude-*, gpt-*, or provider/model.`,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Check tests
|
|
114
|
+
if (!parsed['tests'] || !Array.isArray(parsed['tests'])) {
|
|
115
|
+
warnings.push({
|
|
116
|
+
file: relPath,
|
|
117
|
+
rule: 'no-tests',
|
|
118
|
+
severity: 'warning',
|
|
119
|
+
message: 'No tests defined. Add tests to validate prompt behavior.',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const tests = parsed['tests'];
|
|
124
|
+
for (let i = 0; i < tests.length; i++) {
|
|
125
|
+
const test = tests[i];
|
|
126
|
+
if (!test['name']) {
|
|
127
|
+
warnings.push({
|
|
128
|
+
file: relPath,
|
|
129
|
+
rule: 'test-missing-name',
|
|
130
|
+
severity: 'warning',
|
|
131
|
+
message: `Test at index ${i} is missing a "name" field.`,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (!test['expect']) {
|
|
135
|
+
warnings.push({
|
|
136
|
+
file: relPath,
|
|
137
|
+
rule: 'test-no-expect',
|
|
138
|
+
severity: 'info',
|
|
139
|
+
message: `Test "${test['name'] ?? `index ${i}`}" has no "expect" block.`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Check description
|
|
145
|
+
if (!parsed['description']) {
|
|
146
|
+
warnings.push({
|
|
147
|
+
file: relPath,
|
|
148
|
+
rule: 'no-description',
|
|
149
|
+
severity: 'info',
|
|
150
|
+
message: 'Missing "description" field. Add one for documentation.',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return warnings;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Lint all prompt specs in a path.
|
|
157
|
+
*/
|
|
158
|
+
async function promptLinter(targetPath) {
|
|
159
|
+
let files;
|
|
160
|
+
if (await fileExists(targetPath)) {
|
|
161
|
+
files = [targetPath];
|
|
162
|
+
}
|
|
163
|
+
else if (await isDirectory(targetPath)) {
|
|
164
|
+
files = await findSpecFiles(targetPath);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
throw new Error(`Path not found: ${targetPath}`);
|
|
168
|
+
}
|
|
169
|
+
const allWarnings = [];
|
|
170
|
+
for (const file of files) {
|
|
171
|
+
const warnings = await lintFile(file, process.cwd());
|
|
172
|
+
allWarnings.push(...warnings);
|
|
173
|
+
}
|
|
174
|
+
return allWarnings;
|
|
175
|
+
}
|
|
176
|
+
export function registerLintCommand(program) {
|
|
177
|
+
program
|
|
178
|
+
.command('lint [path]')
|
|
179
|
+
.description('Lint prompt spec files for common issues and best practices')
|
|
180
|
+
.option('--json', 'Output warnings as JSON')
|
|
181
|
+
.option('--fix', 'Show fix suggestions (future)')
|
|
182
|
+
.option('--output <file>', 'Write JSON results to a file')
|
|
183
|
+
.action(async (pathArg, options) => {
|
|
184
|
+
if (options.json || options.output) {
|
|
185
|
+
setLogLevel('silent');
|
|
186
|
+
}
|
|
187
|
+
const chalk = (await import('chalk')).default;
|
|
188
|
+
const targetPath = resolvePath(pathArg ?? 'prompts');
|
|
189
|
+
const warnings = await promptLinter(targetPath);
|
|
190
|
+
if (options.output) {
|
|
191
|
+
const { writeFile } = await import('node:fs/promises');
|
|
192
|
+
await writeFile(resolvePath(options.output), JSON.stringify(warnings, null, 2));
|
|
193
|
+
console.log(`Results written to ${options.output}`);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (options.json) {
|
|
197
|
+
console.log(JSON.stringify(warnings, null, 2));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (warnings.length === 0) {
|
|
201
|
+
console.log(chalk.green('\nNo lint issues found.\n'));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Group by file
|
|
205
|
+
const grouped = new Map();
|
|
206
|
+
for (const w of warnings) {
|
|
207
|
+
const list = grouped.get(w.file) ?? [];
|
|
208
|
+
list.push(w);
|
|
209
|
+
grouped.set(w.file, list);
|
|
210
|
+
}
|
|
211
|
+
const severityIcon = (s) => {
|
|
212
|
+
switch (s) {
|
|
213
|
+
case 'error': return chalk.red('ERR');
|
|
214
|
+
case 'warning': return chalk.yellow('WRN');
|
|
215
|
+
case 'info': return chalk.blue('INF');
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
console.log(chalk.bold(`\nLint Results (${warnings.length} issues)`));
|
|
219
|
+
console.log('');
|
|
220
|
+
for (const [file, fileWarnings] of grouped) {
|
|
221
|
+
console.log(chalk.bold(` ${file}`));
|
|
222
|
+
for (const w of fileWarnings) {
|
|
223
|
+
const lineStr = w.line ? `:${w.line}` : '';
|
|
224
|
+
console.log(` ${severityIcon(w.severity)} ${w.rule}${lineStr}: ${w.message}`);
|
|
225
|
+
}
|
|
226
|
+
console.log('');
|
|
227
|
+
}
|
|
228
|
+
const errorCount = warnings.filter((w) => w.severity === 'error').length;
|
|
229
|
+
const warnCount = warnings.filter((w) => w.severity === 'warning').length;
|
|
230
|
+
const infoCount = warnings.filter((w) => w.severity === 'info').length;
|
|
231
|
+
console.log(chalk.dim(` ${errorCount} errors, ${warnCount} warnings, ${infoCount} info\n`));
|
|
232
|
+
if (errorCount > 0) {
|
|
233
|
+
process.exitCode = 1;
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,OAAe;IAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,QAAgB;IACxD,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,qBAAqB;SAC/B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,aAAa;IACb,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAA4B,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SAC7E,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,iCAAiC;SAC3C,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,oDAAoD;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,sEAAsE;aAChF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,wBAAwB,MAAM,CAAC,MAAM,mDAAmD;aAClG,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,kBAAkB;gBACxB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,4EAA4E;aACtF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtF,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,eAAe;gBACrB,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,0BAA0B,KAAK,iDAAiD;aAC1F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,0DAA0D;SACpE,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAmC,CAAC;QAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,mBAAmB;oBACzB,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,iBAAiB,CAAC,6BAA6B;iBACzD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,EAAE,0BAA0B;iBACzE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,yDAAyD;SACnE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,UAAkB;IAC5C,IAAI,KAAe,CAAC;IAEpB,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;SAAM,IAAI,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,KAAK,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,WAAW,GAAkB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACrD,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,OAAO,EAAE,+BAA+B,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;SACzD,MAAM,CAAC,KAAK,EACX,OAA2B,EAC3B,OAA2D,EAC3D,EAAE;QACF,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9C,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACvD,MAAM,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,gBAAgB;QAChB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,CAA0B,EAAU,EAAE;YAC1D,QAAQ,CAAC,EAAE,CAAC;gBACV,KAAK,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACtC,KAAK,SAAS,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3C,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QACzE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAC1E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAEvE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,YAAY,SAAS,cAAc,SAAS,SAAS,CAAC,CAChF,CAAC;QAEF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeprobe map [path]` — Repository context map.
|
|
3
|
+
*
|
|
4
|
+
* Shows directory-level token distribution as a tree with bar
|
|
5
|
+
* visualizations.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
export declare function registerMapCommand(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsEpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiEzD"}
|