@aionlabsai/aion 0.2.1 → 0.2.2

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 (87) hide show
  1. package/README.md +59 -0
  2. package/dist/agents/base-agent.d.ts.map +1 -1
  3. package/dist/agents/base-agent.js +23 -12
  4. package/dist/agents/base-agent.js.map +1 -1
  5. package/dist/agents/synthesizer.d.ts +3 -0
  6. package/dist/agents/synthesizer.d.ts.map +1 -1
  7. package/dist/agents/synthesizer.js +93 -52
  8. package/dist/agents/synthesizer.js.map +1 -1
  9. package/dist/cli/commands/audit.d.ts.map +1 -1
  10. package/dist/cli/commands/audit.js +87 -534
  11. package/dist/cli/commands/audit.js.map +1 -1
  12. package/dist/cli/commands/chat.d.ts.map +1 -1
  13. package/dist/cli/commands/chat.js +2 -1
  14. package/dist/cli/commands/chat.js.map +1 -1
  15. package/dist/cli/commands/context.d.ts +3 -0
  16. package/dist/cli/commands/context.d.ts.map +1 -0
  17. package/dist/cli/commands/context.js +72 -0
  18. package/dist/cli/commands/context.js.map +1 -0
  19. package/dist/cli/commands/next.d.ts +3 -0
  20. package/dist/cli/commands/next.d.ts.map +1 -0
  21. package/dist/cli/commands/next.js +49 -0
  22. package/dist/cli/commands/next.js.map +1 -0
  23. package/dist/cli/commands/report.d.ts.map +1 -1
  24. package/dist/cli/commands/report.js +52 -400
  25. package/dist/cli/commands/report.js.map +1 -1
  26. package/dist/cli/commands/search.d.ts +3 -0
  27. package/dist/cli/commands/search.d.ts.map +1 -0
  28. package/dist/cli/commands/search.js +50 -0
  29. package/dist/cli/commands/search.js.map +1 -0
  30. package/dist/cli/commands/tree.d.ts +3 -0
  31. package/dist/cli/commands/tree.d.ts.map +1 -0
  32. package/dist/cli/commands/tree.js +85 -0
  33. package/dist/cli/commands/tree.js.map +1 -0
  34. package/dist/cli/menu.d.ts.map +1 -1
  35. package/dist/cli/menu.js +13 -0
  36. package/dist/cli/menu.js.map +1 -1
  37. package/dist/core/cost-tracker.d.ts +10 -0
  38. package/dist/core/cost-tracker.d.ts.map +1 -1
  39. package/dist/core/cost-tracker.js +53 -0
  40. package/dist/core/cost-tracker.js.map +1 -1
  41. package/dist/core/pipelines/audit-pipeline.d.ts +4 -1
  42. package/dist/core/pipelines/audit-pipeline.d.ts.map +1 -1
  43. package/dist/core/pipelines/audit-pipeline.js +60 -30
  44. package/dist/core/pipelines/audit-pipeline.js.map +1 -1
  45. package/dist/index.js +11 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/infra/audit-cache.d.ts +2 -1
  48. package/dist/infra/audit-cache.d.ts.map +1 -1
  49. package/dist/infra/audit-cache.js +18 -6
  50. package/dist/infra/audit-cache.js.map +1 -1
  51. package/dist/infra/audit-model.d.ts +72 -0
  52. package/dist/infra/audit-model.d.ts.map +1 -0
  53. package/dist/infra/audit-model.js +146 -0
  54. package/dist/infra/audit-model.js.map +1 -0
  55. package/dist/infra/audit-report-writer.d.ts +4 -0
  56. package/dist/infra/audit-report-writer.d.ts.map +1 -0
  57. package/dist/infra/audit-report-writer.js +290 -0
  58. package/dist/infra/audit-report-writer.js.map +1 -0
  59. package/dist/infra/code-metrics.d.ts +11 -0
  60. package/dist/infra/code-metrics.d.ts.map +1 -1
  61. package/dist/infra/code-metrics.js +62 -0
  62. package/dist/infra/code-metrics.js.map +1 -1
  63. package/dist/infra/embeddings.d.ts +2 -0
  64. package/dist/infra/embeddings.d.ts.map +1 -1
  65. package/dist/infra/embeddings.js +2 -2
  66. package/dist/infra/embeddings.js.map +1 -1
  67. package/dist/infra/project-report.d.ts +67 -0
  68. package/dist/infra/project-report.d.ts.map +1 -0
  69. package/dist/infra/project-report.js +159 -0
  70. package/dist/infra/project-report.js.map +1 -0
  71. package/dist/infra/repo-vectors.d.ts +31 -0
  72. package/dist/infra/repo-vectors.d.ts.map +1 -0
  73. package/dist/infra/repo-vectors.js +83 -0
  74. package/dist/infra/repo-vectors.js.map +1 -0
  75. package/dist/infra/update-check.d.ts +3 -0
  76. package/dist/infra/update-check.d.ts.map +1 -0
  77. package/dist/infra/update-check.js +84 -0
  78. package/dist/infra/update-check.js.map +1 -0
  79. package/dist/prompts/scanner.js +1 -1
  80. package/dist/prompts/synthesizer.d.ts.map +1 -1
  81. package/dist/prompts/synthesizer.js +7 -23
  82. package/dist/prompts/synthesizer.js.map +1 -1
  83. package/dist/providers/cli-provider.d.ts +1 -0
  84. package/dist/providers/cli-provider.d.ts.map +1 -1
  85. package/dist/providers/cli-provider.js +22 -2
  86. package/dist/providers/cli-provider.js.map +1 -1
  87. package/package.json +1 -1
@@ -1,416 +1,68 @@
1
- import { mkdirSync, writeFileSync, existsSync, readdirSync, readFileSync } from 'fs';
2
- import { join } from 'path';
3
1
  import { spawnSync } from 'child_process';
4
- import { GraphAgent } from '../../agents/graph-agent.js';
5
- import { buildChurnReport } from '../../infra/git-analysis.js';
6
- import { detectPatterns } from '../../infra/pattern-detect.js';
7
- import { computeHealthScore } from '../../infra/health-score.js';
8
- import { measureCognitiveLoad, buildApiMap, auditEnvVars, scanCurrentSecrets } from '../../infra/code-metrics.js';
9
- import { buildSbom } from '../../infra/sbom.js';
10
- function esc(s) {
11
- return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
2
+ import chalk from 'chalk';
3
+ import { buildProjectReportData, latestAuditPointer, writeProjectReport } from '../../infra/project-report.js';
4
+ function openFile(path) {
5
+ const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
6
+ const args = process.platform === 'win32' ? ['/c', 'start', '', path] : [path];
7
+ spawnSync(opener, args, { stdio: 'ignore', timeout: 5000 });
12
8
  }
13
- function loadLatestAudit(cwd) {
14
- const dir = join(cwd, '.ai-runtime', 'reports');
15
- if (!existsSync(dir))
16
- return null;
17
- try {
18
- const latest = join(dir, 'latest-audit.json');
19
- if (existsSync(latest)) {
20
- const pointer = JSON.parse(readFileSync(latest, 'utf8'));
21
- const reportPath = pointer.report ?? (pointer.runDir ? join(pointer.runDir, 'report.json') : undefined);
22
- if (reportPath && existsSync(reportPath)) {
23
- return JSON.parse(readFileSync(reportPath, 'utf8'));
24
- }
25
- }
26
- const files = readdirSync(dir).filter((f) => f.startsWith('audit-') && f.endsWith('.json')).sort().reverse();
27
- if (!files[0])
28
- return null;
29
- return JSON.parse(readFileSync(join(dir, files[0]), 'utf8'));
30
- }
31
- catch {
32
- return null;
9
+ function printLatest(cwd) {
10
+ const latest = latestAuditPointer(cwd);
11
+ if (!latest) {
12
+ console.log(chalk.yellow('No audit report found. Run: aion audit . --local-only'));
13
+ return;
33
14
  }
34
- }
35
- function renderReport(data) {
36
- const { projectName, health, audit, churn, patterns, cognitive } = data;
37
- const gradeColor = { A: '#3fb950', B: '#3fb950', C: '#e3b341', D: '#f85149', F: '#f85149' }[health.grade] ?? '#8b949e';
38
- const findingRows = (audit?.findings ?? []).slice(0, 50).map((f) => {
39
- const sevColor = { critical: '#f85149', high: '#e3b341', medium: '#79c0ff', low: '#8b949e', info: '#484f58' }[f.severity] ?? '#8b949e';
40
- return `<tr>
41
- <td><span class="badge" style="background:${sevColor}20;color:${sevColor}">${esc(f.severity)}</span></td>
42
- <td class="mono">${esc(f.file)}${f.line ? ':' + f.line : ''}</td>
43
- <td>${esc(f.category)}</td>
44
- <td>${esc(f.finding)}</td>
45
- </tr>`;
46
- }).join('');
47
- const churnRows = churn.churn.slice(0, 20).map((c) => {
48
- const riskColor = { critical: '#f85149', high: '#e3b341', medium: '#79c0ff', low: '#484f58' }[c.risk] ?? '#484f58';
49
- return `<tr>
50
- <td class="mono">${esc(c.file)}</td>
51
- <td style="color:${riskColor}">${c.commits}</td>
52
- <td>${c.authors}</td>
53
- <td><span class="badge" style="background:${riskColor}20;color:${riskColor}">${c.risk}</span></td>
54
- </tr>`;
55
- }).join('');
56
- const patternRows = patterns.detected.map((p) => `<tr>
57
- <td><strong>${esc(p.pattern)}</strong></td>
58
- <td>${esc(p.category)}</td>
59
- <td><span class="badge ${p.confidence}">${p.confidence}</span></td>
60
- <td>${p.evidence.filter(Boolean).map((e) => esc(e)).join('<br>')}</td>
61
- </tr>`).join('');
62
- const antiRows = patterns.antiPatterns.map((a) => `<tr>
63
- <td style="color:#f85149"><strong>${esc(a.name)}</strong></td>
64
- <td>${esc(a.severity)}</td>
65
- <td>${esc(a.description)}</td>
66
- <td>${a.evidence.slice(0, 2).map((e) => esc(e)).join('<br>')}</td>
67
- </tr>`).join('');
68
- const cogRows = cognitive.slice(0, 15).map((c) => `<tr>
69
- <td class="mono">${esc(c.file)}</td>
70
- <td style="color:${c.score >= 40 ? '#f85149' : c.score >= 20 ? '#e3b341' : '#3fb950'}">${c.score}</td>
71
- <td>${c.maxNesting}</td>
72
- <td>${c.longFunctions}</td>
73
- <td>${c.loc}</td>
74
- </tr>`).join('');
75
- const dimBars = health.dimensions.map((d) => {
76
- const pct = d.score;
77
- const color = pct >= 80 ? '#3fb950' : pct >= 60 ? '#e3b341' : '#f85149';
78
- return `<div class="dim-row">
79
- <div class="dim-name">${esc(d.name)}</div>
80
- <div class="dim-bar-wrap"><div class="dim-bar" style="width:${pct}%;background:${color}"></div></div>
81
- <div class="dim-score" style="color:${color}">${pct}</div>
82
- <div class="dim-detail">${esc(d.detail)}</div>
83
- </div>`;
84
- }).join('');
85
- return `<!DOCTYPE html>
86
- <html lang="en">
87
- <head>
88
- <meta charset="UTF-8">
89
- <title>${esc(projectName)} — Project Report</title>
90
- <style>
91
- *{box-sizing:border-box;margin:0;padding:0}
92
- body{background:#0d1117;color:#e6edf3;font-family:-apple-system,BlinkMacSystemFont,sans-serif;font-size:14px;line-height:1.6}
93
- a{color:#79c0ff;text-decoration:none}.mono{font-family:monospace;font-size:12px}
94
- nav{background:#161b22;border-bottom:1px solid #30363d;padding:12px 24px;display:flex;gap:20px;position:sticky;top:0;z-index:100}
95
- nav a{color:#8b949e;font-size:13px}nav a:hover{color:#e6edf3}
96
- .container{max-width:1200px;margin:0 auto;padding:24px}
97
- h1{font-size:24px;margin-bottom:4px}h2{font-size:18px;margin:32px 0 16px;color:#79c0ff;border-bottom:1px solid #21262d;padding-bottom:8px}
98
- h3{font-size:14px;color:#8b949e;margin-bottom:12px}
99
- .header{background:#161b22;border:1px solid #30363d;border-radius:12px;padding:24px;margin-bottom:24px;display:flex;justify-content:space-between;align-items:center}
100
- .score-big{font-size:64px;font-weight:bold;color:${gradeColor};line-height:1}
101
- .score-grade{font-size:32px;color:${gradeColor};margin-left:8px}
102
- .meta{color:#8b949e;font-size:13px;margin-top:4px}
103
- .dim-row{display:grid;grid-template-columns:140px 1fr 40px 1fr;gap:12px;align-items:center;margin:6px 0}
104
- .dim-name{font-size:13px;color:#8b949e}.dim-bar-wrap{background:#21262d;border-radius:4px;height:8px}
105
- .dim-bar{height:8px;border-radius:4px;transition:width 0.3s}.dim-score{font-size:13px;font-weight:bold;text-align:right}
106
- .dim-detail{font-size:11px;color:#484f58}
107
- table{width:100%;border-collapse:collapse;font-size:13px}
108
- th{text-align:left;padding:8px 12px;border-bottom:2px solid #30363d;color:#8b949e;font-weight:600}
109
- td{padding:8px 12px;border-bottom:1px solid #21262d;vertical-align:top}
110
- tr:hover td{background:#161b22}.badge{display:inline-block;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600}
111
- .badge.high{background:#3fb95020;color:#3fb950}.badge.medium{background:#e3b34120;color:#e3b341}.badge.low{background:#48495820;color:#8b949e}
112
- .risk-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:24px}
113
- .risk-card{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:16px}
114
- .risk-card .num{font-size:32px;font-weight:bold}.risk-card .label{color:#8b949e;font-size:12px}
115
- .rec-card{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:16px;margin-bottom:12px}
116
- .rec-card h4{color:#79c0ff;margin-bottom:6px}.rec-card ul{margin-left:16px;color:#8b949e;font-size:13px}
117
- .section{margin-bottom:40px}
118
- </style>
119
- </head>
120
- <body>
121
- <nav>
122
- <a href="#health">Health</a>
123
- <a href="#audit">Audit</a>
124
- <a href="#patterns">Patterns</a>
125
- <a href="#churn">Churn</a>
126
- <a href="#cognitive">Complexity</a>
127
- ${data.graphExists ? '<a href="graph.html">Graph →</a>' : ''}
128
- </nav>
129
- <div class="container">
130
- <div class="header">
131
- <div>
132
- <h1>${esc(projectName)}</h1>
133
- <div class="meta">Generated ${esc(data.generatedAt)} · ${audit ? audit.totalFiles + ' files audited' : 'no audit data'}</div>
134
- </div>
135
- <div style="text-align:right">
136
- <span class="score-big">${health.total}</span><span class="score-grade">${health.grade}</span>
137
- <div class="meta">Health Score / 100</div>
138
- </div>
139
- </div>
140
-
141
- <div class="section" id="health">
142
- <h2>Health Dimensions</h2>
143
- ${dimBars}
144
- ${health.topRisks.length > 0 ? `<div style="margin-top:16px">${health.topRisks.map((r) => `<div style="color:#f85149;font-size:13px;margin:4px 0">✗ ${esc(r)}</div>`).join('')}</div>` : ''}
145
- </div>
146
-
147
- ${audit ? `<div class="section" id="audit">
148
- <h2>Audit Findings</h2>
149
- <div class="risk-grid">
150
- <div class="risk-card"><div class="num" style="color:#f85149">${audit.criticalCount}</div><div class="label">Critical</div></div>
151
- <div class="risk-card"><div class="num" style="color:#e3b341">${audit.highCount}</div><div class="label">High</div></div>
152
- <div class="risk-card"><div class="num">${audit.findings.length}</div><div class="label">Total Findings</div></div>
153
- </div>
154
- <p style="color:#8b949e;margin-bottom:16px;font-size:13px">${esc(audit.summary)}</p>
155
- <table><tr><th>Severity</th><th>Location</th><th>Category</th><th>Finding</th></tr>${findingRows}</table>
156
- ${audit.findings.length > 50 ? `<p style="color:#8b949e;font-size:12px;margin-top:8px">Showing 50 of ${audit.findings.length} findings</p>` : ''}
157
- </div>` : ''}
158
-
159
- <div class="section" id="patterns">
160
- <h2>Architecture Patterns</h2>
161
- ${patterns.detected.length > 0 ? `<h3>Detected</h3><table><tr><th>Pattern</th><th>Category</th><th>Confidence</th><th>Evidence</th></tr>${patternRows}</table>` : ''}
162
- ${patterns.antiPatterns.length > 0 ? `<h3 style="margin-top:20px">Anti-Patterns</h3><table><tr><th>Name</th><th>Severity</th><th>Description</th><th>Evidence</th></tr>${antiRows}</table>` : ''}
163
- ${patterns.recommendations.length > 0 ? `<h3 style="margin-top:20px">Recommendations</h3>${patterns.recommendations.map((r) => `<div class="rec-card"><h4>${esc(r.pattern)}</h4><p style="color:#8b949e;font-size:13px;margin-bottom:8px">${esc(r.reason)}</p><ul>${r.fixes.map((f) => `<li>${esc(f)}</li>`).join('')}</ul></div>`).join('')}` : ''}
164
- </div>
165
-
166
- ${churn.churn.length > 0 ? `<div class="section" id="churn">
167
- <h2>Git Churn (last ${churn.periodDays} days)</h2>
168
- <p style="color:#8b949e;font-size:13px;margin-bottom:16px">${churn.totalCommits} total commits</p>
169
- <table><tr><th>File</th><th>Commits</th><th>Authors</th><th>Risk</th></tr>${churnRows}</table>
170
- </div>` : ''}
171
-
172
- ${cognitive.length > 0 ? `<div class="section" id="cognitive">
173
- <h2>Cognitive Load</h2>
174
- <table><tr><th>File</th><th>Score</th><th>Max Nesting</th><th>Long Functions</th><th>LOC</th></tr>${cogRows}</table>
175
- </div>` : ''}
176
-
177
- </div>
178
- </body>
179
- </html>`;
180
- }
181
- function renderMarkdown(data) {
182
- const { projectName, health, audit, churn, patterns, cognitive, hotspots, apiEndpoints, envAudit, secrets, sbom } = data;
183
- const lines = [];
184
- lines.push(`# ${projectName} — AI Analysis Context`);
185
- lines.push(`> Generated: ${data.generatedAt} · Use this document to ask an AI for refactoring, architecture, and improvement recommendations.`);
186
- lines.push('');
187
- // Health
188
- lines.push(`## Health Score: ${health.total}/100 (${health.grade})`);
189
- lines.push('');
190
- lines.push('| Dimension | Score | Detail |');
191
- lines.push('|---|---|---|');
192
- health.dimensions.forEach((d) => lines.push(`| ${d.name} | ${d.score}/100 | ${d.detail} |`));
193
- lines.push('');
194
- if (health.topRisks.length > 0) {
195
- lines.push('**Top risks:**');
196
- health.topRisks.forEach((r) => lines.push(`- ${r}`));
197
- lines.push('');
198
- }
199
- // Project overview
200
- lines.push('## Project Overview');
201
- lines.push(`- **Files:** ${data.totalFiles} | **Symbols:** ${data.totalSymbols}`);
202
- lines.push(`- **Dependency cycles:** ${data.cycles}`);
203
- lines.push(`- **Git commits (90d):** ${churn.totalCommits}`);
204
- lines.push('');
205
- // Architecture patterns
206
- lines.push('## Architecture Patterns');
207
- lines.push('');
208
- lines.push('### Detected');
209
- patterns.detected.forEach((p) => {
210
- lines.push(`- **${p.pattern}** [${p.category}] (${p.confidence} confidence): ${p.evidence.filter(Boolean).join(', ')}`);
211
- });
212
- lines.push('');
213
- if (patterns.antiPatterns.length > 0) {
214
- lines.push('### Anti-Patterns');
215
- patterns.antiPatterns.forEach((a) => {
216
- lines.push(`- **${a.name}** [${a.severity}]: ${a.description}`);
217
- a.evidence.slice(0, 2).forEach((e) => lines.push(` - \`${e}\``));
218
- });
219
- lines.push('');
220
- }
221
- if (patterns.recommendations.length > 0) {
222
- lines.push('### Recommendations');
223
- patterns.recommendations.forEach((r) => {
224
- lines.push(`- **${r.pattern}** [${r.priority} priority]: ${r.reason}`);
225
- r.fixes.forEach((f) => lines.push(` - ${f}`));
226
- });
227
- lines.push('');
228
- }
229
- // Hotspots
230
- if (hotspots.length > 0) {
231
- lines.push('## Hotspot Files (Highest Coupling)');
232
- lines.push('');
233
- lines.push('| File | FanIn | FanOut | Risk |');
234
- lines.push('|---|---|---|---|');
235
- hotspots.slice(0, 10).forEach((h) => {
236
- const risk = h.fanIn >= 30 ? 'CRITICAL' : h.fanIn >= 15 ? 'HIGH' : 'MEDIUM';
237
- lines.push(`| \`${h.file}\` | ${h.fanIn} | ${h.fanOut} | ${risk} |`);
238
- });
239
- lines.push('');
240
- }
241
- // Audit findings
242
- if (audit) {
243
- lines.push('## Audit Findings');
244
- lines.push(`**${audit.criticalCount} critical · ${audit.highCount} high · ${audit.findings.length} total**`);
245
- lines.push('');
246
- lines.push(audit.summary);
247
- lines.push('');
248
- const critical = audit.findings.filter((f) => f.severity === 'critical');
249
- const high = audit.findings.filter((f) => f.severity === 'high');
250
- if (critical.length > 0) {
251
- lines.push('### Critical Findings');
252
- critical.forEach((f) => {
253
- const persona = f.persona ? ` (persona: ${f.persona})` : '';
254
- lines.push(`- \`${f.file}${f.line ? ':' + f.line : ''}\` [${f.category}]${persona} ${f.finding}`);
255
- lines.push(` → ${f.recommendation}`);
256
- });
257
- lines.push('');
258
- }
259
- if (high.length > 0) {
260
- lines.push('### High Findings');
261
- high.slice(0, 15).forEach((f) => {
262
- const persona = f.persona ? ` (persona: ${f.persona})` : '';
263
- lines.push(`- \`${f.file}${f.line ? ':' + f.line : ''}\` [${f.category}]${persona} ${f.finding}`);
264
- lines.push(` → ${f.recommendation}`);
265
- });
266
- lines.push('');
267
- }
268
- }
269
- // Churn
270
- if (churn.churn.length > 0) {
271
- lines.push('## Git Churn (90 days)');
272
- lines.push('');
273
- lines.push('| File | Commits | Authors | Risk |');
274
- lines.push('|---|---|---|---|');
275
- churn.churn.slice(0, 15).forEach((c) => lines.push(`| \`${c.file}\` | ${c.commits} | ${c.authors} | ${c.risk} |`));
276
- lines.push('');
277
- const intersection = churn.busFactor
278
- .filter((b) => b.risk === 'critical')
279
- .filter((b) => churn.churn.find((c) => c.file === b.file && (c.risk === 'critical' || c.risk === 'high')));
280
- if (intersection.length > 0) {
281
- lines.push('### High Risk: High Churn + Single Author');
282
- intersection.forEach((b) => lines.push(`- \`${b.file}\` — ${b.primaryPercent}% commits by one author`));
283
- lines.push('');
284
- }
285
- }
286
- // API Map (no-auth endpoints)
287
- const noAuthEndpoints = apiEndpoints.filter((e) => !e.hasAuth);
288
- if (noAuthEndpoints.length > 0) {
289
- lines.push('## Unprotected API Endpoints');
290
- lines.push('');
291
- noAuthEndpoints.forEach((e) => {
292
- lines.push(`- \`${e.method} ${e.path}\` — \`${e.file}:${e.line}\``);
293
- });
294
- lines.push('');
295
- }
296
- // Undocumented env vars
297
- if (envAudit.undocumented.length > 0) {
298
- lines.push('## Undocumented Environment Variables');
299
- lines.push(`${envAudit.undocumented.length} variables used in code but not in .env.example:`);
300
- lines.push('');
301
- envAudit.undocumented.slice(0, 20).forEach((v) => lines.push(`- \`${v}\``));
302
- lines.push('');
303
- }
304
- // Secrets
305
- if (secrets.length > 0) {
306
- lines.push('## Hardcoded Secrets Detected');
307
- secrets.forEach((s) => lines.push(`- \`${s.file}:${s.line}\` [${s.pattern}]`));
308
- lines.push('');
309
- }
310
- // Cognitive load
311
- if (cognitive.length > 0) {
312
- lines.push('## High Cognitive Load Files');
313
- lines.push('');
314
- lines.push('| File | Score | Max Nesting | Long Functions | LOC |');
315
- lines.push('|---|---|---|---|---|');
316
- cognitive.slice(0, 10).forEach((c) => lines.push(`| \`${c.file}\` | ${c.score} | ${c.maxNesting} | ${c.longFunctions} | ${c.loc} |`));
317
- lines.push('');
318
- }
319
- // SBOM unpinned
320
- if (sbom.unpinned.length > 0) {
321
- lines.push('## Unpinned Dependencies (Supply Chain Risk)');
322
- sbom.unpinned.slice(0, 20).forEach((p) => lines.push(`- \`${p.lang}\` \`${p.name}\` ${p.version}`));
323
- lines.push('');
324
- }
325
- // AI prompt footer
326
- lines.push('---');
327
- lines.push('## Suggested AI Prompts');
328
- lines.push('');
329
- lines.push('Copy this document and use with any of these prompts:');
330
- lines.push('');
331
- lines.push('- *"Based on this analysis, create a prioritized refactoring roadmap with effort estimates"*');
332
- lines.push('- *"Propose a migration plan from the current architecture to Clean Architecture + Repository Pattern"*');
333
- lines.push('- *"Which critical findings should be fixed first and why? Write the fixes."*');
334
- lines.push('- *"Identify which hotspot files should be split and how"*');
335
- lines.push('- *"What tests should be written first given the 7% test coverage and these hotspots?"*');
336
- return lines.join('\n');
15
+ console.log(chalk.bold.cyan('\nLatest Audit Report\n'));
16
+ if (latest.createdAt)
17
+ console.log(` created: ${latest.createdAt}`);
18
+ if (latest.runDir)
19
+ console.log(` run dir: ${latest.runDir}`);
20
+ if (latest.html)
21
+ console.log(` html: ${latest.html}`);
22
+ if (latest.digest)
23
+ console.log(` digest: ${latest.digest}`);
24
+ if (latest.aiContext)
25
+ console.log(` ai context: ${latest.aiContext}`);
26
+ console.log('');
27
+ console.log(chalk.bold('Recommended:'));
28
+ console.log(` Human review: ${chalk.cyan(latest.digest ?? latest.runDir ?? '')}`);
29
+ console.log(` Send to AI: ${chalk.cyan(latest.aiContext ?? '')}`);
337
30
  }
338
31
  export function registerReport(program) {
339
- program
32
+ const report = program
340
33
  .command('report')
341
- .description('Generate full HTML + Markdown project report')
34
+ .description('Generate full HTML + Markdown project report, or inspect latest audit report');
35
+ report
36
+ .command('latest')
37
+ .description('Show the latest audit report paths and recommended files')
38
+ .option('--open', 'open latest HTML report')
39
+ .action((options) => {
40
+ const cwd = process.cwd();
41
+ const latest = latestAuditPointer(cwd);
42
+ printLatest(cwd);
43
+ if (options.open && latest?.html)
44
+ openFile(latest.html);
45
+ });
46
+ report
342
47
  .option('--no-open', 'generate without opening browser')
343
48
  .option('--md', 'generate only Markdown (AI-ready context file)')
344
49
  .option('--days <n>', 'git lookback for churn analysis', '90')
345
50
  .action(async (options) => {
346
51
  const cwd = process.cwd();
347
52
  const days = parseInt(options.days, 10) || 90;
348
- const projectName = cwd.split('/').pop() ?? 'project';
349
- console.log(`Building report for ${projectName}…`);
350
- const graph = new GraphAgent(cwd);
351
- const index = await graph.ensureIndex();
352
- let hotspots = [];
353
- try {
354
- const { detectLang } = await import('../../infra/lang-detect.js');
355
- const { buildDepGraph } = await import('../../infra/dep-graph.js');
356
- const { buildPythonDepGraph } = await import('../../infra/dep-graph-python.js');
357
- const lang = detectLang(cwd);
358
- const dep = lang.lang === 'python' ? buildPythonDepGraph(cwd) : buildDepGraph(cwd);
359
- hotspots = dep.hotspots;
360
- }
361
- catch { /* best-effort */ }
362
- const audit = loadLatestAudit(cwd);
363
- const churn = buildChurnReport(cwd, hotspots.map((h) => h.file), days);
364
- const patterns = detectPatterns(cwd, hotspots);
365
- const cognitive = measureCognitiveLoad(cwd, 30);
366
- const apiEndpoints = buildApiMap(cwd);
367
- const envAudit = auditEnvVars(cwd);
368
- const secrets = scanCurrentSecrets(cwd);
369
- const sbom = buildSbom(cwd);
370
- let cycles = 0;
371
- try {
372
- const { detectLang } = await import('../../infra/lang-detect.js');
373
- const { buildDepGraph } = await import('../../infra/dep-graph.js');
374
- const { buildPythonDepGraph } = await import('../../infra/dep-graph-python.js');
375
- const lang = detectLang(cwd);
376
- const dep = lang.lang === 'python' ? buildPythonDepGraph(cwd) : buildDepGraph(cwd);
377
- cycles = dep.cycles.length;
378
- }
379
- catch { /* best-effort */ }
380
- const health = computeHealthScore({
381
- totalFiles: index.stats.files, totalSymbols: index.stats.symbols,
382
- cycles, hotspots: hotspots.length,
383
- testFileRatio: index.files.filter((f) => f.isTest).length / Math.max(index.files.length, 1),
384
- churn: churn.churn, busFactor: churn.busFactor, cognitiveLoad: cognitive,
385
- patterns, auditCriticals: audit?.criticalCount, auditHighs: audit?.highCount,
386
- });
387
- const outDir = join(cwd, '.ai-runtime');
388
- mkdirSync(outDir, { recursive: true });
389
- const generatedAt = new Date().toLocaleString();
390
- const mdData = { projectName, health, audit, churn, patterns, cognitive, generatedAt,
391
- totalFiles: index.stats.files, totalSymbols: index.stats.symbols, cycles,
392
- hotspots, apiEndpoints, envAudit, secrets, sbom };
393
- // Always generate markdown
394
- const md = renderMarkdown(mdData);
395
- const mdFile = join(outDir, 'context.md');
396
- writeFileSync(mdFile, md, 'utf8');
397
- console.log(`Markdown: ${mdFile}`);
398
- if (!options.md) {
399
- const graphExists = existsSync(join(outDir, 'graph.html'));
400
- const html = renderReport({ projectName, health, audit, churn, patterns, cognitive, graphExists, generatedAt });
401
- const outFile = join(outDir, 'report.html');
402
- writeFileSync(outFile, html, 'utf8');
403
- console.log(`HTML: ${outFile}`);
404
- if (options.open !== false) {
405
- const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
406
- const args = process.platform === 'win32' ? ['/c', 'start', '', outFile] : [outFile];
407
- spawnSync(opener, args, { stdio: 'ignore', timeout: 5000 });
408
- }
53
+ console.log(`Building report for ${cwd.split('/').pop() ?? 'project'}...`);
54
+ const data = await buildProjectReportData(cwd, days);
55
+ const written = writeProjectReport(cwd, data, Boolean(options.md));
56
+ console.log(`Markdown: ${written.mdFile}`);
57
+ if (written.htmlFile) {
58
+ console.log(`HTML: ${written.htmlFile}`);
59
+ if (options.open !== false)
60
+ openFile(written.htmlFile);
409
61
  }
410
- console.log(` Health: ${health.badge}`);
411
- if (audit)
412
- console.log(` Findings: ${audit.criticalCount} critical, ${audit.highCount} high`);
413
- console.log(` Size: ~${Math.round(md.length / 1000)}k chars (~${Math.round(md.length / 4)} tokens)`);
62
+ console.log(` Health: ${data.health.badge}`);
63
+ if (data.audit)
64
+ console.log(` Findings: ${data.audit.criticalCount} critical, ${data.audit.highCount} high`);
65
+ console.log(` Size: ~${Math.round(written.md.length / 1000)}k chars (~${Math.round(written.md.length / 4)} tokens)`);
414
66
  });
415
67
  }
416
68
  //# sourceMappingURL=report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSearch(program: Command): void;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8CrD"}
@@ -0,0 +1,50 @@
1
+ import chalk from 'chalk';
2
+ import { GraphAgent } from '../../agents/graph-agent.js';
3
+ import { ensureRepoVectorIndex, queryRepoVectors } from '../../infra/repo-vectors.js';
4
+ export function registerSearch(program) {
5
+ program
6
+ .command('search <query...>')
7
+ .description('Search the repo index by file, symbol, and code chunks without AI tokens')
8
+ .option('--limit <n>', 'number of matches to show', '10')
9
+ .option('--semantic', 'use chunk-level semantic-style search over indexed code')
10
+ .option('--rebuild', 'rebuild the repository index before searching')
11
+ .action(async (queryWords, options) => {
12
+ const cwd = process.cwd();
13
+ const query = queryWords.join(' ');
14
+ const limit = Math.max(1, Math.min(50, parseInt(options.limit, 10) || 10));
15
+ const graph = new GraphAgent(cwd);
16
+ const index = options.rebuild ? await graph.buildIndex() : await graph.ensureIndex();
17
+ console.log(chalk.bold.cyan(`\nSearch: ${query}\n`));
18
+ if (options.semantic) {
19
+ const vectors = ensureRepoVectorIndex(cwd, index, Boolean(options.rebuild));
20
+ const results = queryRepoVectors(vectors, query, limit);
21
+ if (results.length === 0) {
22
+ console.log(chalk.yellow('No vector matches.'));
23
+ return;
24
+ }
25
+ results.forEach((item, i) => {
26
+ console.log(`${chalk.cyan(`${i + 1}.`)} ${chalk.bold(item.file)}:${item.startLine}-${item.endLine} ${chalk.gray(`[${item.type} ${item.score.toFixed(3)}]`)}`);
27
+ console.log(chalk.dim(` ${item.name}`));
28
+ if (item.text)
29
+ console.log(chalk.gray(item.text.split('\n').slice(0, 4).map((line) => ` ${line}`).join('\n')));
30
+ console.log();
31
+ });
32
+ return;
33
+ }
34
+ const result = graph.query(query, limit);
35
+ if (!result) {
36
+ console.log(chalk.yellow('No repository index available.'));
37
+ return;
38
+ }
39
+ result.files.forEach((file, i) => console.log(`${chalk.cyan(`${i + 1}.`)} ${chalk.bold(file.path)} ${chalk.gray(`${file.loc} loc${file.isTest ? ', test' : ''}`)}`));
40
+ if (result.symbols.length > 0) {
41
+ console.log(chalk.bold('\nSymbols:'));
42
+ result.symbols.forEach((symbol) => console.log(` ${chalk.cyan(symbol.name)} ${chalk.gray(symbol.kind)} ${symbol.file}:${symbol.line}`));
43
+ }
44
+ if (result.tests.length > 0) {
45
+ console.log(chalk.bold('\nProbable tests:'));
46
+ result.tests.forEach((link) => console.log(` ${link.source} <= ${link.tests.join(', ')}`));
47
+ }
48
+ });
49
+ }
50
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerTree(program: Command): void;
3
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuEzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuBnD"}