@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.
Files changed (85) hide show
  1. package/dist/bin/prism-cli.d.ts +3 -0
  2. package/dist/bin/prism-cli.d.ts.map +1 -0
  3. package/dist/bin/prism-cli.js +10 -0
  4. package/dist/bin/prism-cli.js.map +1 -0
  5. package/dist/src/commands/assessment/deploy-cdk.d.ts +22 -0
  6. package/dist/src/commands/assessment/deploy-cdk.d.ts.map +1 -0
  7. package/dist/src/commands/assessment/deploy-cdk.js +59 -0
  8. package/dist/src/commands/assessment/deploy-cdk.js.map +1 -0
  9. package/dist/src/commands/assessment/interview-agent.d.ts +71 -0
  10. package/dist/src/commands/assessment/interview-agent.d.ts.map +1 -0
  11. package/dist/src/commands/assessment/interview-agent.js +648 -0
  12. package/dist/src/commands/assessment/interview-agent.js.map +1 -0
  13. package/dist/src/commands/assessment/run.d.ts +20 -0
  14. package/dist/src/commands/assessment/run.d.ts.map +1 -0
  15. package/dist/src/commands/assessment/run.js +23 -0
  16. package/dist/src/commands/assessment/run.js.map +1 -0
  17. package/dist/src/commands/assessment/web.d.ts +15 -0
  18. package/dist/src/commands/assessment/web.d.ts.map +1 -0
  19. package/dist/src/commands/assessment/web.js +1393 -0
  20. package/dist/src/commands/assessment/web.js.map +1 -0
  21. package/dist/src/commands/bootstrapper/install-eval-harness.d.ts +15 -0
  22. package/dist/src/commands/bootstrapper/install-eval-harness.d.ts.map +1 -0
  23. package/dist/src/commands/bootstrapper/install-eval-harness.js +99 -0
  24. package/dist/src/commands/bootstrapper/install-eval-harness.js.map +1 -0
  25. package/dist/src/commands/bootstrapper/install-git-hooks.d.ts +15 -0
  26. package/dist/src/commands/bootstrapper/install-git-hooks.d.ts.map +1 -0
  27. package/dist/src/commands/bootstrapper/install-git-hooks.js +141 -0
  28. package/dist/src/commands/bootstrapper/install-git-hooks.js.map +1 -0
  29. package/dist/src/commands/bootstrapper/setup-github-oidc.d.ts +6 -0
  30. package/dist/src/commands/bootstrapper/setup-github-oidc.d.ts.map +1 -0
  31. package/dist/src/commands/bootstrapper/setup-github-oidc.js +157 -0
  32. package/dist/src/commands/bootstrapper/setup-github-oidc.js.map +1 -0
  33. package/dist/src/commands/securityagent/setup.d.ts +14 -0
  34. package/dist/src/commands/securityagent/setup.d.ts.map +1 -0
  35. package/dist/src/commands/securityagent/setup.js +113 -0
  36. package/dist/src/commands/securityagent/setup.js.map +1 -0
  37. package/dist/src/commands/workshop/deploy-infra.d.ts +13 -0
  38. package/dist/src/commands/workshop/deploy-infra.d.ts.map +1 -0
  39. package/dist/src/commands/workshop/deploy-infra.js +73 -0
  40. package/dist/src/commands/workshop/deploy-infra.js.map +1 -0
  41. package/dist/src/commands/workshop/generate-demo-data.d.ts +16 -0
  42. package/dist/src/commands/workshop/generate-demo-data.d.ts.map +1 -0
  43. package/dist/src/commands/workshop/generate-demo-data.js +362 -0
  44. package/dist/src/commands/workshop/generate-demo-data.js.map +1 -0
  45. package/dist/src/commands/workshop/perform-pen-test.d.ts +14 -0
  46. package/dist/src/commands/workshop/perform-pen-test.d.ts.map +1 -0
  47. package/dist/src/commands/workshop/perform-pen-test.js +301 -0
  48. package/dist/src/commands/workshop/perform-pen-test.js.map +1 -0
  49. package/dist/src/commands/workshop/run-agent.d.ts +20 -0
  50. package/dist/src/commands/workshop/run-agent.d.ts.map +1 -0
  51. package/dist/src/commands/workshop/run-agent.js +89 -0
  52. package/dist/src/commands/workshop/run-agent.js.map +1 -0
  53. package/dist/src/commands/workshop/verify-setup.d.ts +14 -0
  54. package/dist/src/commands/workshop/verify-setup.d.ts.map +1 -0
  55. package/dist/src/commands/workshop/verify-setup.js +493 -0
  56. package/dist/src/commands/workshop/verify-setup.js.map +1 -0
  57. package/dist/src/index.d.ts +13 -0
  58. package/dist/src/index.d.ts.map +1 -0
  59. package/dist/src/index.js +44 -0
  60. package/dist/src/index.js.map +1 -0
  61. package/dist/src/scanner/categories.d.ts +8 -0
  62. package/dist/src/scanner/categories.d.ts.map +1 -0
  63. package/dist/src/scanner/categories.js +322 -0
  64. package/dist/src/scanner/categories.js.map +1 -0
  65. package/dist/src/scanner/index.d.ts +16 -0
  66. package/dist/src/scanner/index.d.ts.map +1 -0
  67. package/dist/src/scanner/index.js +59 -0
  68. package/dist/src/scanner/index.js.map +1 -0
  69. package/dist/src/scanner/reporter.d.ts +3 -0
  70. package/dist/src/scanner/reporter.d.ts.map +1 -0
  71. package/dist/src/scanner/reporter.js +102 -0
  72. package/dist/src/scanner/reporter.js.map +1 -0
  73. package/dist/src/scanner/scoring.d.ts +7 -0
  74. package/dist/src/scanner/scoring.d.ts.map +1 -0
  75. package/dist/src/scanner/scoring.js +77 -0
  76. package/dist/src/scanner/scoring.js.map +1 -0
  77. package/dist/src/scanner/types.d.ts +41 -0
  78. package/dist/src/scanner/types.d.ts.map +1 -0
  79. package/dist/src/scanner/types.js +2 -0
  80. package/dist/src/scanner/types.js.map +1 -0
  81. package/dist/src/scanner/utils.d.ts +16 -0
  82. package/dist/src/scanner/utils.d.ts.map +1 -0
  83. package/dist/src/scanner/utils.js +54 -0
  84. package/dist/src/scanner/utils.js.map +1 -0
  85. 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,3 @@
1
+ import type { ScanResult, OutputFormat } from './types.js';
2
+ export declare function formatReport(result: ScanResult, format: OutputFormat): string;
3
+ //# sourceMappingURL=reporter.d.ts.map
@@ -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"}