@prism-d1/cli 1.0.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/dist/bin/prism-cli.d.ts +3 -0
- package/dist/bin/prism-cli.d.ts.map +1 -0
- package/dist/bin/prism-cli.js +10 -0
- package/dist/bin/prism-cli.js.map +1 -0
- package/dist/src/commands/assessment/deploy-cdk.d.ts +22 -0
- package/dist/src/commands/assessment/deploy-cdk.d.ts.map +1 -0
- package/dist/src/commands/assessment/deploy-cdk.js +59 -0
- package/dist/src/commands/assessment/deploy-cdk.js.map +1 -0
- package/dist/src/commands/assessment/interview-agent.d.ts +71 -0
- package/dist/src/commands/assessment/interview-agent.d.ts.map +1 -0
- package/dist/src/commands/assessment/interview-agent.js +648 -0
- package/dist/src/commands/assessment/interview-agent.js.map +1 -0
- package/dist/src/commands/assessment/run.d.ts +20 -0
- package/dist/src/commands/assessment/run.d.ts.map +1 -0
- package/dist/src/commands/assessment/run.js +23 -0
- package/dist/src/commands/assessment/run.js.map +1 -0
- package/dist/src/commands/assessment/web.d.ts +15 -0
- package/dist/src/commands/assessment/web.d.ts.map +1 -0
- package/dist/src/commands/assessment/web.js +1393 -0
- package/dist/src/commands/assessment/web.js.map +1 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.d.ts +15 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.d.ts.map +1 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.js +99 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.js.map +1 -0
- package/dist/src/commands/bootstrapper/install-git-hooks.d.ts +15 -0
- package/dist/src/commands/bootstrapper/install-git-hooks.d.ts.map +1 -0
- package/dist/src/commands/bootstrapper/install-git-hooks.js +141 -0
- package/dist/src/commands/bootstrapper/install-git-hooks.js.map +1 -0
- package/dist/src/commands/bootstrapper/setup-github-oidc.d.ts +6 -0
- package/dist/src/commands/bootstrapper/setup-github-oidc.d.ts.map +1 -0
- package/dist/src/commands/bootstrapper/setup-github-oidc.js +157 -0
- package/dist/src/commands/bootstrapper/setup-github-oidc.js.map +1 -0
- package/dist/src/commands/securityagent/setup.d.ts +14 -0
- package/dist/src/commands/securityagent/setup.d.ts.map +1 -0
- package/dist/src/commands/securityagent/setup.js +113 -0
- package/dist/src/commands/securityagent/setup.js.map +1 -0
- package/dist/src/commands/workshop/deploy-infra.d.ts +13 -0
- package/dist/src/commands/workshop/deploy-infra.d.ts.map +1 -0
- package/dist/src/commands/workshop/deploy-infra.js +73 -0
- package/dist/src/commands/workshop/deploy-infra.js.map +1 -0
- package/dist/src/commands/workshop/generate-demo-data.d.ts +16 -0
- package/dist/src/commands/workshop/generate-demo-data.d.ts.map +1 -0
- package/dist/src/commands/workshop/generate-demo-data.js +362 -0
- package/dist/src/commands/workshop/generate-demo-data.js.map +1 -0
- package/dist/src/commands/workshop/perform-pen-test.d.ts +14 -0
- package/dist/src/commands/workshop/perform-pen-test.d.ts.map +1 -0
- package/dist/src/commands/workshop/perform-pen-test.js +301 -0
- package/dist/src/commands/workshop/perform-pen-test.js.map +1 -0
- package/dist/src/commands/workshop/run-agent.d.ts +20 -0
- package/dist/src/commands/workshop/run-agent.d.ts.map +1 -0
- package/dist/src/commands/workshop/run-agent.js +89 -0
- package/dist/src/commands/workshop/run-agent.js.map +1 -0
- package/dist/src/commands/workshop/verify-setup.d.ts +14 -0
- package/dist/src/commands/workshop/verify-setup.d.ts.map +1 -0
- package/dist/src/commands/workshop/verify-setup.js +493 -0
- package/dist/src/commands/workshop/verify-setup.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +44 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/scanner/categories.d.ts +8 -0
- package/dist/src/scanner/categories.d.ts.map +1 -0
- package/dist/src/scanner/categories.js +322 -0
- package/dist/src/scanner/categories.js.map +1 -0
- package/dist/src/scanner/index.d.ts +16 -0
- package/dist/src/scanner/index.d.ts.map +1 -0
- package/dist/src/scanner/index.js +59 -0
- package/dist/src/scanner/index.js.map +1 -0
- package/dist/src/scanner/reporter.d.ts +3 -0
- package/dist/src/scanner/reporter.d.ts.map +1 -0
- package/dist/src/scanner/reporter.js +102 -0
- package/dist/src/scanner/reporter.js.map +1 -0
- package/dist/src/scanner/scoring.d.ts +7 -0
- package/dist/src/scanner/scoring.d.ts.map +1 -0
- package/dist/src/scanner/scoring.js +77 -0
- package/dist/src/scanner/scoring.js.map +1 -0
- package/dist/src/scanner/types.d.ts +41 -0
- package/dist/src/scanner/types.d.ts.map +1 -0
- package/dist/src/scanner/types.js +2 -0
- package/dist/src/scanner/types.js.map +1 -0
- package/dist/src/scanner/utils.d.ts +16 -0
- package/dist/src/scanner/utils.d.ts.map +1 -0
- package/dist/src/scanner/utils.js +54 -0
- package/dist/src/scanner/utils.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { findFiles, readSafe, buildContentCache, searchCache, dirExists, fileExists } from './utils.js';
|
|
2
|
+
import _simpleGit from 'simple-git';
|
|
3
|
+
// simple-git exports differently under ESM vs CJS; normalize the callable
|
|
4
|
+
const git = (p) => (_simpleGit.default ?? _simpleGit)(p);
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Helper: accumulate evidence into a category result
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function result(category, maxPoints, evidence) {
|
|
9
|
+
return { category, maxPoints, earnedPoints: evidence.reduce((s, e) => s + e.points, 0), evidence };
|
|
10
|
+
}
|
|
11
|
+
function ev(signal, found, points, detail) {
|
|
12
|
+
return { signal, found, points: found ? points : 0, detail };
|
|
13
|
+
}
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// 1. AI Tool Config (10 pts)
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const aiToolConfig = async (repo, cfg) => {
|
|
18
|
+
const evidence = [];
|
|
19
|
+
// CLAUDE.md (3 pts)
|
|
20
|
+
const hasClaude = fileExists(repo, 'CLAUDE.md');
|
|
21
|
+
evidence.push(ev('CLAUDE.md exists', hasClaude, 3, hasClaude ? 'Found CLAUDE.md' : 'No CLAUDE.md in repo root'));
|
|
22
|
+
// Spec-first rules in CLAUDE.md (2 pts)
|
|
23
|
+
let hasSpec = false;
|
|
24
|
+
if (hasClaude) {
|
|
25
|
+
const c = readSafe(repo, 'CLAUDE.md').toLowerCase();
|
|
26
|
+
hasSpec = ['spec', 'specification', 'spec-first', 'acceptance criteria', 'before coding'].some(p => c.includes(p));
|
|
27
|
+
}
|
|
28
|
+
evidence.push(ev('CLAUDE.md has spec-first enforcement', hasSpec, 2, hasSpec ? 'Spec-driven patterns found' : 'No spec-first rules in CLAUDE.md'));
|
|
29
|
+
// Kiro config (2 pts)
|
|
30
|
+
const hasKiro = dirExists(repo, '.kiro') || dirExists(repo, '.kiro/steering') || dirExists(repo, '.kiro/specs') || (await findFiles(repo, '**/.kiro*')).length > 0;
|
|
31
|
+
evidence.push(ev('Kiro configuration exists', hasKiro, 2, hasKiro ? 'Kiro config found' : 'No .kiro directory'));
|
|
32
|
+
// AI IDE config (1 pt)
|
|
33
|
+
const ideFiles = await findFiles(repo, ['**/.github/copilot*', '**/.copilot*', '**/.amazonq*', '**/.cursor*', '**/.continue*', '**/.aider*']);
|
|
34
|
+
evidence.push(ev('AI IDE config exists', ideFiles.length > 0, 1, ideFiles.length > 0 ? `Found: ${ideFiles[0]}` : 'No AI IDE config'));
|
|
35
|
+
// Model references (2 pts)
|
|
36
|
+
const cache = await buildContentCache(repo, '**/*.{json,yaml,yml,toml,md}', 100);
|
|
37
|
+
const modelMatch = searchCache(cache, [/bedrock/i, /anthropic\.claude/i, /claude-\d/i, /gpt-4/i, /amazon\.titan/i, /model[_-]?id/i]);
|
|
38
|
+
evidence.push(ev('Bedrock or model references', !!modelMatch, 2, modelMatch ? `${modelMatch.file} references ${modelMatch.pattern}` : 'No model references'));
|
|
39
|
+
return result('AI Tool Config', 10, evidence);
|
|
40
|
+
};
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// 2. Spec-Driven Dev (10 pts)
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
const specDriven = async (repo) => {
|
|
45
|
+
const evidence = [];
|
|
46
|
+
const specDir = ['specs', 'spec', 'specifications', '.kiro/specs', '.kiro/steering'].find(d => dirExists(repo, d));
|
|
47
|
+
evidence.push(ev('Specs directory exists', !!specDir, 2, specDir ? `Found: ${specDir}/` : 'No specs/ directory'));
|
|
48
|
+
const specFiles = await findFiles(repo, ['**/specs/**/*.{md,yaml,yml,json}', '**/spec/**/*.{md,yaml,yml,json}', '**/.kiro/specs/**/*.{md,yaml,yml,json}', '**/.kiro/steering/**/*.md', '**/*spec*.md'], ['**/*.test.*', '**/*.spec.ts', '**/*.spec.js']);
|
|
49
|
+
const count = new Set(specFiles).size;
|
|
50
|
+
const pts = count >= 10 ? 6 : count >= 4 ? 4 : count >= 1 ? 2 : 0;
|
|
51
|
+
evidence.push(ev('Spec file count', count > 0, pts, `Found ${count} spec files`));
|
|
52
|
+
let structured = false;
|
|
53
|
+
const structPats = [/## requirements/i, /## acceptance criteria/i, /acceptance[_\s-]?criteria/i, /## scope/i, /## summary/i, /## tasks/i, /## endpoint definition/i, /## request schema/i, /## design/i];
|
|
54
|
+
for (const f of specFiles.slice(0, 20)) {
|
|
55
|
+
const c = readSafe(repo, f);
|
|
56
|
+
if (structPats.filter(p => p.test(c)).length >= 2) {
|
|
57
|
+
structured = true;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
evidence.push(ev('Specs follow structured format', structured, 2, structured ? 'Structured spec format detected' : 'No structured format'));
|
|
62
|
+
return result('Spec-Driven Dev', 10, evidence);
|
|
63
|
+
};
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// 3. Commit Hygiene (15 pts)
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
const commitHygiene = async (repo, cfg) => {
|
|
68
|
+
const evidence = [];
|
|
69
|
+
const gitClient = git(repo);
|
|
70
|
+
let commits = [];
|
|
71
|
+
try {
|
|
72
|
+
const log = await gitClient.log({ maxCount: cfg.commitDepth || 200 });
|
|
73
|
+
commits = log.all.map((e) => ({ hash: e.hash, message: e.message, body: e.body || '' }));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
evidence.push(ev('Git repository accessible', false, 0, 'Could not read git log'));
|
|
77
|
+
return result('Commit Hygiene', 15, evidence);
|
|
78
|
+
}
|
|
79
|
+
if (!commits.length) {
|
|
80
|
+
evidence.push(ev('Git commits found', false, 0, 'No commits'));
|
|
81
|
+
return result('Commit Hygiene', 15, evidence);
|
|
82
|
+
}
|
|
83
|
+
const aiPats = [/AI-Origin:/i, /AI-Generated:/i, /AI-Assisted:/i, /Co-Authored-By:.*\b(claude|copilot|gpt|anthropic|amazon\s*q)\b/i, /\[ai[- ]generated\]/i, /AI-Tool:/i];
|
|
84
|
+
let aiCount = 0;
|
|
85
|
+
for (const c of commits) {
|
|
86
|
+
if (aiPats.some(p => p.test(`${c.message}\n${c.body}`)))
|
|
87
|
+
aiCount++;
|
|
88
|
+
}
|
|
89
|
+
const pct = (aiCount / commits.length) * 100;
|
|
90
|
+
const aiPts = pct > 50 ? 12 : pct > 30 ? 9 : pct > 10 ? 6 : pct > 0 ? 3 : 0;
|
|
91
|
+
evidence.push(ev('AI-Origin trailers in commits', aiCount > 0, aiPts, `${aiCount}/${commits.length} (${pct.toFixed(1)}%) have AI trailers`));
|
|
92
|
+
const modelPats = [/AI-Model:/i, /claude-\d/i, /gpt-4/i, /sonnet/i, /opus/i, /haiku/i];
|
|
93
|
+
let hasModel = false;
|
|
94
|
+
for (const c of commits) {
|
|
95
|
+
if (modelPats.some(p => p.test(`${c.message}\n${c.body}`))) {
|
|
96
|
+
hasModel = true;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
evidence.push(ev('AI-Model trailer present', hasModel, 3, hasModel ? 'Model trailers found' : 'No AI-Model trailers'));
|
|
101
|
+
return result('Commit Hygiene', 15, evidence);
|
|
102
|
+
};
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// 4. CI/CD Integration (15 pts)
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
const ciIntegration = async (repo) => {
|
|
107
|
+
const evidence = [];
|
|
108
|
+
const ciFiles = await findFiles(repo, ['.github/workflows/*.{yml,yaml}', '.gitlab-ci.yml', 'Jenkinsfile', 'buildspec.yml', '.circleci/config.yml', 'cdk.json']);
|
|
109
|
+
evidence.push(ev('CI/CD configuration exists', ciFiles.length > 0, 2, ciFiles.length > 0 ? `Found: ${ciFiles.slice(0, 3).join(', ')}` : 'No CI config'));
|
|
110
|
+
let ciContent = '';
|
|
111
|
+
for (const f of ciFiles.slice(0, 20))
|
|
112
|
+
ciContent += '\n' + readSafe(repo, f);
|
|
113
|
+
const hasAiCi = [/bedrock/i, /eval[_-]?gate/i, /ai[_-]?eval/i, /claude/i, /guardrail/i, /agent[_-]?eval/i].some(p => p.test(ciContent));
|
|
114
|
+
evidence.push(ev('CI references AI evaluation / eval gates', hasAiCi, 5, hasAiCi ? 'AI eval references in CI' : 'No AI eval in CI'));
|
|
115
|
+
const hasMetrics = [/eventbridge/i, /cloudwatch/i, /put[_-]?events/i, /metrics/i, /dora/i].some(p => p.test(ciContent));
|
|
116
|
+
evidence.push(ev('CI emits metrics/events', hasMetrics, 4, hasMetrics ? 'Metrics emission in CI' : 'No metrics in CI'));
|
|
117
|
+
const hasAiTests = [/ai[_-]?test/i, /hallucination/i, /groundedness/i, /toxicity/i].some(p => p.test(ciContent));
|
|
118
|
+
evidence.push(ev('CI has AI-specific test steps', hasAiTests, 2, hasAiTests ? 'AI test steps found' : 'No AI test steps'));
|
|
119
|
+
let tagCount = 0;
|
|
120
|
+
try {
|
|
121
|
+
tagCount = (await git(repo).tags()).all.length;
|
|
122
|
+
}
|
|
123
|
+
catch { /* ignore */ }
|
|
124
|
+
evidence.push(ev('Deployment frequency from tags', tagCount >= 3, 2, `${tagCount} git tags`));
|
|
125
|
+
return result('CI/CD Integration', 15, evidence);
|
|
126
|
+
};
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// 5. Eval & Quality (10 pts)
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
const evalQuality = async (repo) => {
|
|
131
|
+
const evidence = [];
|
|
132
|
+
const evalFiles = await findFiles(repo, ['**/eval*.*', '**/rubric*.*', '**/*eval*.{json,yaml,yml}', '**/evals/**'], ['**/*.test.*', '**/*.spec.*']);
|
|
133
|
+
evidence.push(ev('Eval rubrics or config files exist', evalFiles.length > 0, 3, evalFiles.length > 0 ? `Found: ${evalFiles.slice(0, 3).join(', ')}` : 'No eval configs'));
|
|
134
|
+
const cache = await buildContentCache(repo, '**/*.{ts,js,py,yaml,yml,json}');
|
|
135
|
+
const brMatch = searchCache(cache, [/bedrock.*eval/i, /EvaluationJob/i, /bedrock.*guardrail/i, /ApplyGuardrail/i]);
|
|
136
|
+
evidence.push(ev('Bedrock Evaluation references', !!brMatch, 3, brMatch ? `${brMatch.file} references ${brMatch.pattern}` : 'No Bedrock eval refs'));
|
|
137
|
+
const testCache = await buildContentCache(repo, ['**/*.test.{ts,js,py}', '**/*.spec.{ts,js,py}', '**/test*/**/*.{ts,js,py}'], 100);
|
|
138
|
+
const judgeMatch = searchCache(testCache, [/llm.*judge/i, /ai.*judge/i, /evaluate.*response/i, /quality.*score/i]);
|
|
139
|
+
evidence.push(ev('LLM-as-Judge patterns', !!judgeMatch, 2, judgeMatch ? `${judgeMatch.file}` : 'No LLM-as-Judge patterns'));
|
|
140
|
+
const threshMatch = searchCache(cache, [/eval.*threshold/i, /quality[_-]?gate/i, /pass[_-]?criteria/i, /min[_-]?score/i]);
|
|
141
|
+
evidence.push(ev('Eval threshold configuration', !!threshMatch, 2, threshMatch ? `${threshMatch.file}` : 'No eval thresholds'));
|
|
142
|
+
return result('Eval & Quality', 10, evidence);
|
|
143
|
+
};
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// 6. Testing Maturity (10 pts)
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
const testingMaturity = async (repo) => {
|
|
148
|
+
const evidence = [];
|
|
149
|
+
const testFiles = await findFiles(repo, ['**/*.test.{ts,tsx,js,jsx}', '**/*.spec.{ts,tsx,js,jsx}', '**/test_*.py', '**/*_test.py', '**/*_test.go', '**/Test*.java', '**/test/**/*.{ts,js,py,go,java}']);
|
|
150
|
+
const testCount = new Set(testFiles).size;
|
|
151
|
+
evidence.push(ev('Test files exist', testCount > 0, 2, `Found ${testCount} test files`));
|
|
152
|
+
const srcFiles = await findFiles(repo, ['src/**/*.{ts,tsx,js,jsx}', 'lib/**/*.{ts,tsx,js,jsx}', '**/*.py', '**/*.go', '**/*.java'], ['**/*.test.*', '**/*.spec.*', '**/test/**', '**/tests/**', '**/test_*', '**/*_test.*']);
|
|
153
|
+
const srcCount = new Set(srcFiles).size;
|
|
154
|
+
const ratio = srcCount > 0 ? testCount / srcCount : 0;
|
|
155
|
+
const ratioPts = ratio >= 0.5 ? 6 : ratio >= 0.3 ? 4 : ratio >= 0.1 ? 2 : 0;
|
|
156
|
+
evidence.push(ev('Test-to-source ratio', ratio >= 0.1, ratioPts, `${testCount}/${srcCount} = ${ratio.toFixed(2)}`));
|
|
157
|
+
const testCache = await buildContentCache(repo, ['**/*.test.{ts,js,py}', '**/*.spec.{ts,js,py}', '**/test_*.py'], 100);
|
|
158
|
+
const aiMatch = searchCache(testCache, [/hallucination/i, /groundedness/i, /toxicity/i, /faithfulness/i, /prompt.*test/i]);
|
|
159
|
+
evidence.push(ev('AI-specific test patterns', !!aiMatch, 2, aiMatch ? `${aiMatch.file}` : 'No AI test patterns'));
|
|
160
|
+
return result('Testing Maturity', 10, evidence);
|
|
161
|
+
};
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// 7. AI Observability (10 pts)
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
const aiObservability = async (repo) => {
|
|
166
|
+
const evidence = [];
|
|
167
|
+
const cache = await buildContentCache(repo, '**/*.{ts,js,py,yaml,yml,json,tf,hcl}');
|
|
168
|
+
const metricsMatch = searchCache(cache, [/cloudwatch/i, /timestream/i, /prometheus/i, /grafana/i, /opentelemetry/i, /put[_-]?metric/i]);
|
|
169
|
+
evidence.push(ev('Metrics infrastructure references', !!metricsMatch, 2, metricsMatch ? `${metricsMatch.file}` : 'No metrics infra'));
|
|
170
|
+
const aiMatch = searchCache(cache, [/prism/i, /ai[_-]?metrics/i, /dora[_-]?metrics/i, /token[_-]?usage/i, /acceptance[_-]?rate/i, /ai[_-]?latency/i]);
|
|
171
|
+
evidence.push(ev('Custom AI metrics namespace', !!aiMatch, 3, aiMatch ? `${aiMatch.file}` : 'No AI metrics namespace'));
|
|
172
|
+
const dashFiles = await findFiles(repo, ['**/dashboard*.{json,yaml,yml}', '**/dashboards/**', '**/grafana/**/*.{json,yaml,yml}']);
|
|
173
|
+
evidence.push(ev('Dashboard definitions exist', dashFiles.length > 0, 2, dashFiles.length > 0 ? `Found: ${dashFiles.slice(0, 3).join(', ')}` : 'No dashboards'));
|
|
174
|
+
const doraMatch = searchCache(cache, [/dora/i, /lead[_-]?time/i, /deployment[_-]?frequency/i, /change[_-]?failure/i, /mttr/i]);
|
|
175
|
+
evidence.push(ev('DORA metric tracking', !!doraMatch, 3, doraMatch ? `${doraMatch.file}` : 'No DORA tracking'));
|
|
176
|
+
return result('AI Observability', 10, evidence);
|
|
177
|
+
};
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// 8. Governance (5 pts)
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
const governance = async (repo) => {
|
|
182
|
+
const evidence = [];
|
|
183
|
+
const cache = await buildContentCache(repo, '**/*.{ts,js,py,yaml,yml,json,tf,hcl,md}');
|
|
184
|
+
const guardMatch = searchCache(cache, [/bedrock.*guardrail/i, /guardrail.*config/i, /content[_-]?filter/i, /responsible[_-]?ai/i]);
|
|
185
|
+
evidence.push(ev('Bedrock Guardrails config', !!guardMatch, 2, guardMatch ? `${guardMatch.file}` : 'No guardrails'));
|
|
186
|
+
const autoMatch = searchCache(cache, [/autonomy[_-]?tier/i, /agent[_-]?permission/i, /human[_-]?in[_-]?the[_-]?loop/i, /approval[_-]?gate/i, /agent[_-]?governance/i]);
|
|
187
|
+
evidence.push(ev('Autonomy tier definitions', !!autoMatch, 2, autoMatch ? `${autoMatch.file}` : 'No autonomy tiers'));
|
|
188
|
+
const secMatch = searchCache(cache, [/ai.*iam/i, /bedrock.*policy/i, /invoke[_-]?model.*policy/i, /ai[_-]?security[_-]?review/i]);
|
|
189
|
+
evidence.push(ev('AI-specific IAM or security', !!secMatch, 1, secMatch ? `${secMatch.file}` : 'No AI IAM'));
|
|
190
|
+
return result('Governance', 5, evidence);
|
|
191
|
+
};
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
// 9. Agent Workflows (8 pts)
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
const agentWorkflows = async (repo) => {
|
|
196
|
+
const evidence = [];
|
|
197
|
+
const cache = await buildContentCache(repo, '**/*.{ts,js,py,yaml,yml,json,toml}');
|
|
198
|
+
let hasAgent = false;
|
|
199
|
+
const agentMatch = searchCache(cache, [/\bstrands\b/i, /\bagentcore\b/i, /multi[_-]?agent/i, /agentic/i, /bedrock[_-]?agent/i, /crew[_-]?ai/i, /langgraph/i]);
|
|
200
|
+
if (agentMatch)
|
|
201
|
+
hasAgent = true;
|
|
202
|
+
if (!hasAgent) {
|
|
203
|
+
const dirs = await findFiles(repo, '**/{agent,agents}/**');
|
|
204
|
+
if (dirs.length > 0)
|
|
205
|
+
hasAgent = true;
|
|
206
|
+
}
|
|
207
|
+
evidence.push(ev('Agent definitions or orchestration', hasAgent, 2, hasAgent ? 'Agent patterns found' : 'No agent definitions'));
|
|
208
|
+
const mcpFiles = await findFiles(repo, ['**/.mcp*', '**/mcp/**']);
|
|
209
|
+
const mcpMatch = mcpFiles.length > 0 ? { file: mcpFiles[0] } : searchCache(cache, [/McpServer/i, /model[_-]?context[_-]?protocol/i, /@modelcontextprotocol/i, /tool[_-]?registration/i]);
|
|
210
|
+
evidence.push(ev('MCP server configs or tool registrations', !!mcpMatch, 2, mcpMatch ? `Found MCP: ${'file' in mcpMatch ? mcpMatch.file : ''}` : 'No MCP'));
|
|
211
|
+
const auditMatch = searchCache(cache, [/agent.*audit/i, /agent.*trace/i, /execution[_-]?log/i, /agent.*monitor/i]);
|
|
212
|
+
evidence.push(ev('Agent audit trail', !!auditMatch, 1, auditMatch ? `${auditMatch.file}` : 'No audit trail'));
|
|
213
|
+
const acFiles = await findFiles(repo, '**/agentcore.json');
|
|
214
|
+
const acMatch = acFiles.length > 0 ? true : !!searchCache(cache, [/AgentCoreRuntime/i, /agentcore[_-]?deploy/i]);
|
|
215
|
+
evidence.push(ev('AgentCore deployment config', acMatch, 1, acMatch ? 'AgentCore config found' : 'No AgentCore'));
|
|
216
|
+
const testFiles = await findFiles(repo, '**/*{test_agent,agent_test,agent.test,agent.spec}*');
|
|
217
|
+
const agentTestMatch = testFiles.length > 0 ? true : !!searchCache(cache, [/test[_-]?agent/i, /agent.*eval/i, /mock.*agent/i]);
|
|
218
|
+
evidence.push(ev('Agent testing and eval rubrics', agentTestMatch, 1, agentTestMatch ? 'Agent tests found' : 'No agent tests'));
|
|
219
|
+
const metricMatch = searchCache(cache, [/prism\.d1\.agent/i, /agent[_-]?invocation/i, /AgentInvocationCount/i, /agent[_-]?metric/i]);
|
|
220
|
+
evidence.push(ev('Agent metrics emission', !!metricMatch, 1, metricMatch ? `${metricMatch.file}` : 'No agent metrics'));
|
|
221
|
+
return result('Agent Workflows', 8, evidence);
|
|
222
|
+
};
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
// 10. Platform & Reuse (5 pts)
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
const platformReuse = async (repo) => {
|
|
227
|
+
const evidence = [];
|
|
228
|
+
const cache = await buildContentCache(repo, '**/*.{ts,js,py,yaml,yml,json,toml,md}');
|
|
229
|
+
const promptDirs = await findFiles(repo, '**/{prompts,prompt-library,prompt-templates}/**');
|
|
230
|
+
const promptMatch = promptDirs.length > 0 ? true : !!searchCache(cache, [/prompt[_-]?registry/i, /prompt[_-]?library/i, /shared[_-]?prompt/i]);
|
|
231
|
+
evidence.push(ev('Shared prompt library', promptMatch, 2, promptMatch ? 'Prompt library found' : 'No prompt library'));
|
|
232
|
+
const gwMatch = searchCache(cache, [/model[_-]?gateway/i, /ai[_-]?gateway/i, /llm[_-]?gateway/i, /litellm/i, /ai[_-]?platform/i]);
|
|
233
|
+
evidence.push(ev('Model gateway or centralized AI config', !!gwMatch, 2, gwMatch ? `${gwMatch.file}` : 'No model gateway'));
|
|
234
|
+
const ragMatch = searchCache(cache, [/knowledge[_-]?base/i, /retrieval[_-]?augment/i, /vector[_-]?store/i, /embedding/i, /pinecone/i, /chromadb/i, /pgvector/i]);
|
|
235
|
+
evidence.push(ev('RAG / Knowledge Base configs', !!ragMatch, 1, ragMatch ? `${ragMatch.file}` : 'No RAG configs'));
|
|
236
|
+
return result('Platform & Reuse', 5, evidence);
|
|
237
|
+
};
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
// 11. Documentation (3 pts)
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
const documentation = async (repo) => {
|
|
242
|
+
const evidence = [];
|
|
243
|
+
const cache = await buildContentCache(repo, '**/*.md', 100);
|
|
244
|
+
const guideMatch = searchCache(cache, [/ai.*guideline/i, /ai.*development.*guide/i, /ai.*coding.*standard/i, /prompt.*engineering.*guide/i]);
|
|
245
|
+
evidence.push(ev('AI development guidelines', !!guideMatch, 1, guideMatch ? `${guideMatch.file}` : 'No AI guidelines'));
|
|
246
|
+
const adrFiles = await findFiles(repo, '**/{adr,ADR,decisions,architecture-decisions}/**/*.md');
|
|
247
|
+
let hasAiAdr = false;
|
|
248
|
+
for (const f of adrFiles.slice(0, 20)) {
|
|
249
|
+
if (/\bai\b|llm|bedrock|agent/i.test(readSafe(repo, f))) {
|
|
250
|
+
hasAiAdr = true;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
evidence.push(ev('ADRs mentioning AI', hasAiAdr, 1, hasAiAdr ? 'AI-related ADR found' : 'No AI ADRs'));
|
|
255
|
+
let hasOnboard = false;
|
|
256
|
+
for (const [file, content] of cache) {
|
|
257
|
+
if (/onboard|getting[_-]?started|contributing/i.test(file + content.slice(0, 500))) {
|
|
258
|
+
if (/\bai\b|claude|copilot|amazon\s*q|cursor|bedrock/i.test(content)) {
|
|
259
|
+
hasOnboard = true;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
evidence.push(ev('Onboarding docs reference AI', hasOnboard, 1, hasOnboard ? 'AI in onboarding docs' : 'No AI in onboarding'));
|
|
265
|
+
return result('Documentation', 3, evidence);
|
|
266
|
+
};
|
|
267
|
+
// ---------------------------------------------------------------------------
|
|
268
|
+
// 12. Dependencies (2 pts)
|
|
269
|
+
// ---------------------------------------------------------------------------
|
|
270
|
+
const AI_DEPS = ['@anthropic-ai/sdk', 'anthropic', '@aws-sdk/client-bedrock', '@aws-sdk/client-bedrock-runtime', 'openai', 'langchain', '@langchain/core', '@langchain/anthropic', '@langchain/aws', 'llamaindex', 'autogen', 'crewai', 'ragas', 'deepeval', 'promptfoo', 'chromadb', 'pinecone', '@modelcontextprotocol/sdk', 'strands-agents', 'strands-agents-tools'];
|
|
271
|
+
const PY_DEPS = ['anthropic', 'boto3', 'openai', 'langchain', 'llama-index', 'autogen', 'crewai', 'ragas', 'deepeval', 'chromadb', 'pinecone', 'bedrock', 'strands-agents', 'strands-agents-tools'];
|
|
272
|
+
const dependencies = async (repo) => {
|
|
273
|
+
const evidence = [];
|
|
274
|
+
const found = [];
|
|
275
|
+
// package.json
|
|
276
|
+
if (fileExists(repo, 'package.json')) {
|
|
277
|
+
try {
|
|
278
|
+
const pkg = JSON.parse(readSafe(repo, 'package.json'));
|
|
279
|
+
const all = { ...pkg.dependencies, ...pkg.devDependencies, ...pkg.peerDependencies };
|
|
280
|
+
for (const d of AI_DEPS) {
|
|
281
|
+
if (all[d])
|
|
282
|
+
found.push(`${d} (package.json)`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch { /* skip */ }
|
|
286
|
+
}
|
|
287
|
+
// Python deps
|
|
288
|
+
for (const f of await findFiles(repo, '{requirements*.txt,pyproject.toml,Pipfile,setup.py,setup.cfg}')) {
|
|
289
|
+
const c = readSafe(repo, f).toLowerCase();
|
|
290
|
+
for (const d of PY_DEPS) {
|
|
291
|
+
if (c.includes(d))
|
|
292
|
+
found.push(`${d} (${f})`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// go.mod / Cargo.toml
|
|
296
|
+
for (const f of ['go.mod', 'Cargo.toml']) {
|
|
297
|
+
if (fileExists(repo, f) && /anthropic|bedrock|openai|langchain|llm/i.test(readSafe(repo, f)))
|
|
298
|
+
found.push(`AI SDK (${f})`);
|
|
299
|
+
}
|
|
300
|
+
const unique = [...new Set(found)];
|
|
301
|
+
evidence.push(ev('AI SDKs in dependency files', unique.length > 0, 1, unique.length > 0 ? `Found: ${unique.slice(0, 5).join(', ')}` : 'No AI SDKs'));
|
|
302
|
+
evidence.push(ev('Multiple AI dependencies (breadth)', unique.length >= 2, 1, `${unique.length} AI deps`));
|
|
303
|
+
return result('Dependencies', 2, evidence);
|
|
304
|
+
};
|
|
305
|
+
// ---------------------------------------------------------------------------
|
|
306
|
+
// Export all scanners in order
|
|
307
|
+
// ---------------------------------------------------------------------------
|
|
308
|
+
export const scanners = [
|
|
309
|
+
{ name: 'AI Tool Config', scan: aiToolConfig },
|
|
310
|
+
{ name: 'Spec-Driven Dev', scan: specDriven },
|
|
311
|
+
{ name: 'Commit Hygiene', scan: commitHygiene },
|
|
312
|
+
{ name: 'CI/CD Integration', scan: ciIntegration },
|
|
313
|
+
{ name: 'Eval & Quality', scan: evalQuality },
|
|
314
|
+
{ name: 'Testing Maturity', scan: testingMaturity },
|
|
315
|
+
{ name: 'AI Observability', scan: aiObservability },
|
|
316
|
+
{ name: 'Governance', scan: governance },
|
|
317
|
+
{ name: 'Agent Workflows', scan: agentWorkflows },
|
|
318
|
+
{ name: 'Platform & Reuse', scan: platformReuse },
|
|
319
|
+
{ name: 'Documentation', scan: documentation },
|
|
320
|
+
{ name: 'Dependencies', scan: dependencies },
|
|
321
|
+
];
|
|
322
|
+
//# sourceMappingURL=categories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../../src/scanner/categories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { scanners } from './categories.js';
|
|
2
|
+
export { buildScanResult } from './scoring.js';
|
|
3
|
+
export { formatReport } from './reporter.js';
|
|
4
|
+
export type { ScanResult, ScanConfig, CategoryScore, Evidence, OutputFormat, PRISMLevelInfo } from './types.js';
|
|
5
|
+
import type { OutputFormat, ScanResult } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Run the full PRISM scanner against a repository.
|
|
8
|
+
* Returns the structured ScanResult.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runScan(repoPath: string, options?: {
|
|
11
|
+
output?: OutputFormat;
|
|
12
|
+
outputFile?: string;
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
commitDepth?: number;
|
|
15
|
+
}): Promise<ScanResult>;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAOhH,OAAO,KAAK,EAA6B,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtF;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACpG,OAAO,CAAC,UAAU,CAAC,CA+CrB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export { scanners } from './categories.js';
|
|
2
|
+
export { buildScanResult } from './scoring.js';
|
|
3
|
+
export { formatReport } from './reporter.js';
|
|
4
|
+
import { existsSync, statSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
import { scanners } from './categories.js';
|
|
7
|
+
import { buildScanResult } from './scoring.js';
|
|
8
|
+
import { formatReport } from './reporter.js';
|
|
9
|
+
/**
|
|
10
|
+
* Run the full PRISM scanner against a repository.
|
|
11
|
+
* Returns the structured ScanResult.
|
|
12
|
+
*/
|
|
13
|
+
export async function runScan(repoPath, options = {}) {
|
|
14
|
+
const resolvedPath = resolve(repoPath);
|
|
15
|
+
if (!existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) {
|
|
16
|
+
throw new Error(`Repository path does not exist or is not a directory: ${resolvedPath}`);
|
|
17
|
+
}
|
|
18
|
+
const config = {
|
|
19
|
+
repoPath: resolvedPath,
|
|
20
|
+
verbose: options.verbose ?? false,
|
|
21
|
+
commitDepth: options.commitDepth ?? 200,
|
|
22
|
+
};
|
|
23
|
+
const format = options.output ?? 'console';
|
|
24
|
+
const categories = [];
|
|
25
|
+
if (format === 'console') {
|
|
26
|
+
console.log(`\n PRISM D1 Velocity Scanner`);
|
|
27
|
+
console.log(` Scanning: ${resolvedPath}\n`);
|
|
28
|
+
}
|
|
29
|
+
for (const scanner of scanners) {
|
|
30
|
+
const start = Date.now();
|
|
31
|
+
try {
|
|
32
|
+
if (config.verbose && format === 'console')
|
|
33
|
+
process.stdout.write(` Scanning ${scanner.name}...`);
|
|
34
|
+
const cat = await scanner.scan(resolvedPath, config);
|
|
35
|
+
categories.push(cat);
|
|
36
|
+
if (config.verbose && format === 'console')
|
|
37
|
+
console.log(` ${cat.earnedPoints}/${cat.maxPoints} (${Date.now() - start}ms)`);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (config.verbose && format === 'console')
|
|
41
|
+
console.log(` ERROR: ${err.message}`);
|
|
42
|
+
categories.push({ category: scanner.name, maxPoints: 0, earnedPoints: 0, evidence: [{ signal: 'Scanner error', found: false, points: 0, detail: `${err.message}` }] });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const scanResult = buildScanResult(resolvedPath, categories);
|
|
46
|
+
const report = formatReport(scanResult, format);
|
|
47
|
+
if (options.outputFile) {
|
|
48
|
+
writeFileSync(resolve(options.outputFile), report, 'utf-8');
|
|
49
|
+
if (format === 'console') {
|
|
50
|
+
console.log(report);
|
|
51
|
+
console.log(`\n Report written to: ${resolve(options.outputFile)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log(report);
|
|
56
|
+
}
|
|
57
|
+
return scanResult;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanner/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../src/scanner/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA6F3D,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAM7E"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
function bar(earned, max, width = 10) {
|
|
2
|
+
const filled = max > 0 ? Math.round((earned / max) * width) : 0;
|
|
3
|
+
return '█'.repeat(filled) + '░'.repeat(width - filled);
|
|
4
|
+
}
|
|
5
|
+
function pad(str, len) {
|
|
6
|
+
return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
|
|
7
|
+
}
|
|
8
|
+
function rpad(str, len) {
|
|
9
|
+
return str.length >= len ? str : ' '.repeat(len - str.length) + str;
|
|
10
|
+
}
|
|
11
|
+
// ── Console ───────────────────────────────────────────────────────
|
|
12
|
+
function formatConsole(r) {
|
|
13
|
+
const W = 58;
|
|
14
|
+
const line = (s) => `║ ${s}${' '.repeat(Math.max(0, W - 2 - s.length))}║`;
|
|
15
|
+
const top = `╔${'═'.repeat(W)}╗`;
|
|
16
|
+
const bot = `╚${'═'.repeat(W)}╝`;
|
|
17
|
+
const div = `╠${'═'.repeat(W)}╣`;
|
|
18
|
+
const empty = `║${' '.repeat(W)}║`;
|
|
19
|
+
const lines = [top];
|
|
20
|
+
lines.push(line('PRISM D1: Velocity Assessment'));
|
|
21
|
+
lines.push(line(`Repository: ${r.repoName}`));
|
|
22
|
+
lines.push(line(`Date: ${r.scanDate}`));
|
|
23
|
+
lines.push(div, empty);
|
|
24
|
+
const sBar = bar(r.totalScore, r.maxScore, 20);
|
|
25
|
+
lines.push(line(`PRISM Level: ${r.prismLevel.level} ${sBar} (${r.totalScore}/${r.maxScore})`));
|
|
26
|
+
lines.push(line(r.prismLevel.description));
|
|
27
|
+
lines.push(empty);
|
|
28
|
+
for (const c of r.categories) {
|
|
29
|
+
lines.push(line(`${pad(c.category, 20)}${bar(c.earnedPoints, c.maxPoints)} ${rpad(`${c.earnedPoints}/${c.maxPoints}`, 6)}`));
|
|
30
|
+
}
|
|
31
|
+
lines.push(empty);
|
|
32
|
+
if (r.strengths.length) {
|
|
33
|
+
lines.push(line('TOP STRENGTHS'));
|
|
34
|
+
r.strengths.forEach((s, i) => lines.push(line(` ${i + 1}. ${s}`)));
|
|
35
|
+
lines.push(empty);
|
|
36
|
+
}
|
|
37
|
+
if (r.gaps.length) {
|
|
38
|
+
lines.push(line('TOP GAPS'));
|
|
39
|
+
r.gaps.forEach((g, i) => lines.push(line(` ${i + 1}. ${g}`)));
|
|
40
|
+
lines.push(empty);
|
|
41
|
+
}
|
|
42
|
+
if (r.recommendations.length) {
|
|
43
|
+
lines.push(line('RECOMMENDED ACTIONS'));
|
|
44
|
+
r.recommendations.forEach(rec => lines.push(line(` → ${rec}`)));
|
|
45
|
+
lines.push(empty);
|
|
46
|
+
}
|
|
47
|
+
lines.push(bot);
|
|
48
|
+
return lines.join('\n');
|
|
49
|
+
}
|
|
50
|
+
// ── JSON ──────────────────────────────────────────────────────────
|
|
51
|
+
function formatJSON(r) {
|
|
52
|
+
return JSON.stringify(r, null, 2);
|
|
53
|
+
}
|
|
54
|
+
// ── Markdown ──────────────────────────────────────────────────────
|
|
55
|
+
function formatMarkdown(r) {
|
|
56
|
+
const lines = [
|
|
57
|
+
'# PRISM D1: Velocity Assessment', '',
|
|
58
|
+
`| Field | Value |`, `|-------|-------|`,
|
|
59
|
+
`| **Repository** | \`${r.repoName}\` |`,
|
|
60
|
+
`| **Date** | ${r.scanDate} |`,
|
|
61
|
+
`| **PRISM Level** | **${r.prismLevel.level}** (${r.prismLevel.label}) |`,
|
|
62
|
+
`| **Score** | **${r.totalScore}/${r.maxScore}** |`, '',
|
|
63
|
+
'## Category Breakdown', '',
|
|
64
|
+
'| Category | Score | Bar |', '|----------|-------|-----|',
|
|
65
|
+
];
|
|
66
|
+
for (const c of r.categories) {
|
|
67
|
+
lines.push(`| ${c.category} | ${c.earnedPoints}/${c.maxPoints} | \`${bar(c.earnedPoints, c.maxPoints)}\` |`);
|
|
68
|
+
}
|
|
69
|
+
lines.push('', '## Evidence Detail', '');
|
|
70
|
+
for (const c of r.categories) {
|
|
71
|
+
lines.push(`### ${c.category} (${c.earnedPoints}/${c.maxPoints})`, '');
|
|
72
|
+
for (const e of c.evidence)
|
|
73
|
+
lines.push(`- ${e.found ? '✅' : '❌'} **${e.signal}** (${e.points} pts) — ${e.detail}`);
|
|
74
|
+
lines.push('');
|
|
75
|
+
}
|
|
76
|
+
if (r.strengths.length) {
|
|
77
|
+
lines.push('## Top Strengths', '');
|
|
78
|
+
r.strengths.forEach((s, i) => lines.push(`${i + 1}. ${s}`));
|
|
79
|
+
lines.push('');
|
|
80
|
+
}
|
|
81
|
+
if (r.gaps.length) {
|
|
82
|
+
lines.push('## Top Gaps', '');
|
|
83
|
+
r.gaps.forEach((g, i) => lines.push(`${i + 1}. ${g}`));
|
|
84
|
+
lines.push('');
|
|
85
|
+
}
|
|
86
|
+
if (r.recommendations.length) {
|
|
87
|
+
lines.push('## Recommended Actions', '');
|
|
88
|
+
r.recommendations.forEach(rec => lines.push(`- ${rec}`));
|
|
89
|
+
lines.push('');
|
|
90
|
+
}
|
|
91
|
+
lines.push('---', '*Generated by PRISM D1 Velocity Scanner*');
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
// ── Dispatcher ────────────────────────────────────────────────────
|
|
95
|
+
export function formatReport(result, format) {
|
|
96
|
+
switch (format) {
|
|
97
|
+
case 'json': return formatJSON(result);
|
|
98
|
+
case 'markdown': return formatMarkdown(result);
|
|
99
|
+
default: return formatConsole(result);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/scanner/reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CategoryScore, PRISMLevelInfo, ScanResult } from './types.js';
|
|
2
|
+
export declare function computeLevel(totalScore: number): PRISMLevelInfo;
|
|
3
|
+
export declare function identifyStrengths(categories: CategoryScore[]): string[];
|
|
4
|
+
export declare function identifyGaps(categories: CategoryScore[]): string[];
|
|
5
|
+
export declare function generateRecommendations(categories: CategoryScore[]): string[];
|
|
6
|
+
export declare function buildScanResult(repoPath: string, categories: CategoryScore[]): ScanResult;
|
|
7
|
+
//# sourceMappingURL=scoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../../src/scanner/scoring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAc5E,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAK/D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAMvE;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAWlE;AAiBD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAO7E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,UAAU,CAezF"}
|