@aionlabsai/aion 0.2.0 → 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 (177) hide show
  1. package/README.md +283 -9
  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 +115 -121
  11. package/dist/cli/commands/audit.js.map +1 -1
  12. package/dist/cli/commands/chat.d.ts +3 -0
  13. package/dist/cli/commands/chat.d.ts.map +1 -0
  14. package/dist/cli/commands/chat.js +129 -0
  15. package/dist/cli/commands/chat.js.map +1 -0
  16. package/dist/cli/commands/context.d.ts +3 -0
  17. package/dist/cli/commands/context.d.ts.map +1 -0
  18. package/dist/cli/commands/context.js +72 -0
  19. package/dist/cli/commands/context.js.map +1 -0
  20. package/dist/cli/commands/diff.d.ts +3 -0
  21. package/dist/cli/commands/diff.d.ts.map +1 -0
  22. package/dist/cli/commands/diff.js +144 -0
  23. package/dist/cli/commands/diff.js.map +1 -0
  24. package/dist/cli/commands/health.d.ts.map +1 -1
  25. package/dist/cli/commands/health.js +17 -0
  26. package/dist/cli/commands/health.js.map +1 -1
  27. package/dist/cli/commands/init.d.ts +3 -0
  28. package/dist/cli/commands/init.d.ts.map +1 -0
  29. package/dist/cli/commands/init.js +52 -0
  30. package/dist/cli/commands/init.js.map +1 -0
  31. package/dist/cli/commands/next.d.ts +3 -0
  32. package/dist/cli/commands/next.d.ts.map +1 -0
  33. package/dist/cli/commands/next.js +49 -0
  34. package/dist/cli/commands/next.js.map +1 -0
  35. package/dist/cli/commands/report.d.ts.map +1 -1
  36. package/dist/cli/commands/report.js +52 -392
  37. package/dist/cli/commands/report.js.map +1 -1
  38. package/dist/cli/commands/search.d.ts +3 -0
  39. package/dist/cli/commands/search.d.ts.map +1 -0
  40. package/dist/cli/commands/search.js +50 -0
  41. package/dist/cli/commands/search.js.map +1 -0
  42. package/dist/cli/commands/tree.d.ts +3 -0
  43. package/dist/cli/commands/tree.d.ts.map +1 -0
  44. package/dist/cli/commands/tree.js +85 -0
  45. package/dist/cli/commands/tree.js.map +1 -0
  46. package/dist/cli/menu.d.ts.map +1 -1
  47. package/dist/cli/menu.js +56 -1
  48. package/dist/cli/menu.js.map +1 -1
  49. package/dist/core/cost-tracker.d.ts +10 -0
  50. package/dist/core/cost-tracker.d.ts.map +1 -1
  51. package/dist/core/cost-tracker.js +53 -0
  52. package/dist/core/cost-tracker.js.map +1 -1
  53. package/dist/core/orchestrator.d.ts +2 -1
  54. package/dist/core/orchestrator.d.ts.map +1 -1
  55. package/dist/core/orchestrator.js +2 -2
  56. package/dist/core/orchestrator.js.map +1 -1
  57. package/dist/core/pipelines/audit-pipeline.d.ts +13 -2
  58. package/dist/core/pipelines/audit-pipeline.d.ts.map +1 -1
  59. package/dist/core/pipelines/audit-pipeline.js +156 -37
  60. package/dist/core/pipelines/audit-pipeline.js.map +1 -1
  61. package/dist/index.js +17 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/infra/aion-config.d.ts +26 -0
  64. package/dist/infra/aion-config.d.ts.map +1 -0
  65. package/dist/infra/aion-config.js +60 -0
  66. package/dist/infra/aion-config.js.map +1 -0
  67. package/dist/infra/aion-ignore.d.ts +3 -0
  68. package/dist/infra/aion-ignore.d.ts.map +1 -0
  69. package/dist/infra/aion-ignore.js +35 -0
  70. package/dist/infra/aion-ignore.js.map +1 -0
  71. package/dist/infra/audit-cache.d.ts +40 -0
  72. package/dist/infra/audit-cache.d.ts.map +1 -0
  73. package/dist/infra/audit-cache.js +94 -0
  74. package/dist/infra/audit-cache.js.map +1 -0
  75. package/dist/infra/audit-model.d.ts +72 -0
  76. package/dist/infra/audit-model.d.ts.map +1 -0
  77. package/dist/infra/audit-model.js +146 -0
  78. package/dist/infra/audit-model.js.map +1 -0
  79. package/dist/infra/audit-report-writer.d.ts +4 -0
  80. package/dist/infra/audit-report-writer.d.ts.map +1 -0
  81. package/dist/infra/audit-report-writer.js +290 -0
  82. package/dist/infra/audit-report-writer.js.map +1 -0
  83. package/dist/infra/audit-trend.d.ts +17 -0
  84. package/dist/infra/audit-trend.d.ts.map +1 -0
  85. package/dist/infra/audit-trend.js +113 -0
  86. package/dist/infra/audit-trend.js.map +1 -0
  87. package/dist/infra/code-metrics.d.ts +11 -0
  88. package/dist/infra/code-metrics.d.ts.map +1 -1
  89. package/dist/infra/code-metrics.js +62 -0
  90. package/dist/infra/code-metrics.js.map +1 -1
  91. package/dist/infra/db/store.d.ts.map +1 -1
  92. package/dist/infra/db/store.js +14 -7
  93. package/dist/infra/db/store.js.map +1 -1
  94. package/dist/infra/embeddings.d.ts +2 -0
  95. package/dist/infra/embeddings.d.ts.map +1 -1
  96. package/dist/infra/embeddings.js +33 -15
  97. package/dist/infra/embeddings.js.map +1 -1
  98. package/dist/infra/project-report.d.ts +67 -0
  99. package/dist/infra/project-report.d.ts.map +1 -0
  100. package/dist/infra/project-report.js +159 -0
  101. package/dist/infra/project-report.js.map +1 -0
  102. package/dist/infra/repo-vectors.d.ts +31 -0
  103. package/dist/infra/repo-vectors.d.ts.map +1 -0
  104. package/dist/infra/repo-vectors.js +83 -0
  105. package/dist/infra/repo-vectors.js.map +1 -0
  106. package/dist/infra/update-check.d.ts +3 -0
  107. package/dist/infra/update-check.d.ts.map +1 -0
  108. package/dist/infra/update-check.js +84 -0
  109. package/dist/infra/update-check.js.map +1 -0
  110. package/dist/prompts/scanner.d.ts +1 -0
  111. package/dist/prompts/scanner.d.ts.map +1 -1
  112. package/dist/prompts/scanner.js +5 -1
  113. package/dist/prompts/scanner.js.map +1 -1
  114. package/dist/prompts/synthesizer.d.ts.map +1 -1
  115. package/dist/prompts/synthesizer.js +7 -23
  116. package/dist/prompts/synthesizer.js.map +1 -1
  117. package/dist/providers/cli-provider.d.ts +1 -0
  118. package/dist/providers/cli-provider.d.ts.map +1 -1
  119. package/dist/providers/cli-provider.js +22 -2
  120. package/dist/providers/cli-provider.js.map +1 -1
  121. package/package.json +24 -19
  122. package/dist/agents/planner.test.d.ts +0 -2
  123. package/dist/agents/planner.test.d.ts.map +0 -1
  124. package/dist/agents/planner.test.js +0 -21
  125. package/dist/agents/planner.test.js.map +0 -1
  126. package/dist/core/cost-tracker.test.d.ts +0 -2
  127. package/dist/core/cost-tracker.test.d.ts.map +0 -1
  128. package/dist/core/cost-tracker.test.js +0 -36
  129. package/dist/core/cost-tracker.test.js.map +0 -1
  130. package/dist/core/pipelines/audit-pipeline.test.d.ts +0 -2
  131. package/dist/core/pipelines/audit-pipeline.test.d.ts.map +0 -1
  132. package/dist/core/pipelines/audit-pipeline.test.js +0 -135
  133. package/dist/core/pipelines/audit-pipeline.test.js.map +0 -1
  134. package/dist/core/repo-context.d.ts +0 -2
  135. package/dist/core/repo-context.d.ts.map +0 -1
  136. package/dist/core/repo-context.js +0 -12
  137. package/dist/core/repo-context.js.map +0 -1
  138. package/dist/core/repo-context.test.d.ts +0 -2
  139. package/dist/core/repo-context.test.d.ts.map +0 -1
  140. package/dist/core/repo-context.test.js +0 -40
  141. package/dist/core/repo-context.test.js.map +0 -1
  142. package/dist/core/runtime-policy.test.d.ts +0 -2
  143. package/dist/core/runtime-policy.test.d.ts.map +0 -1
  144. package/dist/core/runtime-policy.test.js +0 -27
  145. package/dist/core/runtime-policy.test.js.map +0 -1
  146. package/dist/infra/bm25.test.d.ts +0 -2
  147. package/dist/infra/bm25.test.d.ts.map +0 -1
  148. package/dist/infra/bm25.test.js +0 -17
  149. package/dist/infra/bm25.test.js.map +0 -1
  150. package/dist/infra/chunker.test.d.ts +0 -2
  151. package/dist/infra/chunker.test.d.ts.map +0 -1
  152. package/dist/infra/chunker.test.js +0 -33
  153. package/dist/infra/chunker.test.js.map +0 -1
  154. package/dist/infra/db/database.d.ts +0 -4
  155. package/dist/infra/db/database.d.ts.map +0 -1
  156. package/dist/infra/db/database.js +0 -25
  157. package/dist/infra/db/database.js.map +0 -1
  158. package/dist/infra/evidence-gate.test.d.ts +0 -2
  159. package/dist/infra/evidence-gate.test.d.ts.map +0 -1
  160. package/dist/infra/evidence-gate.test.js +0 -36
  161. package/dist/infra/evidence-gate.test.js.map +0 -1
  162. package/dist/infra/repo-index.test.d.ts +0 -2
  163. package/dist/infra/repo-index.test.d.ts.map +0 -1
  164. package/dist/infra/repo-index.test.js +0 -53
  165. package/dist/infra/repo-index.test.js.map +0 -1
  166. package/dist/infra/repo-query.test.d.ts +0 -2
  167. package/dist/infra/repo-query.test.d.ts.map +0 -1
  168. package/dist/infra/repo-query.test.js +0 -34
  169. package/dist/infra/repo-query.test.js.map +0 -1
  170. package/dist/infra/semgrep.test.d.ts +0 -2
  171. package/dist/infra/semgrep.test.d.ts.map +0 -1
  172. package/dist/infra/semgrep.test.js +0 -39
  173. package/dist/infra/semgrep.test.js.map +0 -1
  174. package/dist/schemas/audit.test.d.ts +0 -2
  175. package/dist/schemas/audit.test.d.ts.map +0 -1
  176. package/dist/schemas/audit.test.js +0 -41
  177. package/dist/schemas/audit.test.js.map +0 -1
@@ -0,0 +1,290 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { buildActionItems, buildFileHotspots, groupFindings, maxSeverity, markdownLocation, renderAiContext, renderDigest, SEVERITY_RANK, } from './audit-model.js';
4
+ function esc(value) {
5
+ return String(value ?? '')
6
+ .replace(/&/g, '&')
7
+ .replace(/</g, '&lt;')
8
+ .replace(/>/g, '&gt;')
9
+ .replace(/"/g, '&quot;');
10
+ }
11
+ function fmtUsd(n) { return `$${n.toFixed(4)}`; }
12
+ function fmtDur(ms) { return `${(ms / 1000).toFixed(1)}s`; }
13
+ function filterOptions(items) {
14
+ return items.map(([key]) => `<option value="${esc(key)}">${esc(key)}</option>`).join('');
15
+ }
16
+ function statList(items, label) {
17
+ return items.map(([key, findings]) => {
18
+ const severity = maxSeverity(findings);
19
+ return `<li><span>${esc(key)}</span><strong class="sev-text-${esc(severity)}">${findings.length}</strong><small>${esc(label)} · max ${esc(severity)}</small></li>`;
20
+ }).join('');
21
+ }
22
+ function renderCostSection(cost, durationMs) {
23
+ if (!cost)
24
+ return '';
25
+ const rows = cost.perAgent.map((a) => `
26
+ <tr>
27
+ <td>${esc(a.name)}</td>
28
+ <td>${esc(fmtUsd(a.costUsd))}</td>
29
+ <td>${a.inputTokens.toLocaleString()}</td>
30
+ <td>${a.outputTokens.toLocaleString()}</td>
31
+ </tr>`).join('');
32
+ return `
33
+ <section id="cost">
34
+ <h2>Cost &amp; Performance</h2>
35
+ <div class="cards">
36
+ <div class="card"><div class="num">${esc(fmtUsd(cost.totalUsd))}</div><div class="muted">Total Cost</div></div>
37
+ <div class="card"><div class="num">${cost.perAgent.length}</div><div class="muted">Agents</div></div>
38
+ <div class="card"><div class="num">${esc(fmtDur(durationMs))}</div><div class="muted">Duration</div></div>
39
+ <div class="card"><div class="num sev-text-medium">${esc(cost.model.replace('claude-', ''))}</div><div class="muted">Model</div></div>
40
+ </div>
41
+ ${rows ? `<table style="margin-top:14px"><thead><tr><th>Agent</th><th>Cost</th><th>Input Tokens</th><th>Output Tokens</th></tr></thead><tbody>${rows}</tbody></table>` : ''}
42
+ </section>`;
43
+ }
44
+ function renderHistorySection(history, currentStamp) {
45
+ if (history.length === 0)
46
+ return '';
47
+ const rows = history.slice().reverse().map((h, i) => {
48
+ const isCurrent = h.stamp === currentStamp;
49
+ const prev = history[history.length - 2 - i];
50
+ const critTrend = prev ? (h.criticalCount < prev.criticalCount ? '↓' : h.criticalCount > prev.criticalCount ? '↑' : '=') : '';
51
+ const critClass = critTrend === '↓' ? 'sev-text-medium' : critTrend === '↑' ? 'sev-text-critical' : '';
52
+ const link = isCurrent ? '<strong>current</strong>' : `<a href="../${esc(h.runRelDir)}/index.html">${new Date(h.createdAt).toLocaleString()}</a>`;
53
+ return `<tr${isCurrent ? ' style="background:#161b22"' : ''}>
54
+ <td>${link}</td>
55
+ <td class="sev-text-critical">${h.criticalCount} <span class="${critClass}">${critTrend}</span></td>
56
+ <td class="sev-text-high">${h.highCount}</td>
57
+ <td>${h.totalFiles}</td>
58
+ <td>${esc(fmtUsd(h.costUsd))}</td>
59
+ <td class="muted">${esc(fmtDur(h.durationMs))}</td>
60
+ </tr>`;
61
+ }).join('');
62
+ return `
63
+ <section id="history">
64
+ <h2>Run History (${history.length} runs)</h2>
65
+ <table><thead><tr><th>Run</th><th>Critical</th><th>High</th><th>Files</th><th>Cost</th><th>Duration</th></tr></thead>
66
+ <tbody>${rows}</tbody></table>
67
+ </section>`;
68
+ }
69
+ function renderHtml(report, history) {
70
+ const actions = buildActionItems(report.findings);
71
+ const hotspots = buildFileHotspots(report.findings);
72
+ const byPersona = Object.entries(groupFindings(report.findings, (f) => f.persona ?? 'local')).sort((a, b) => b[1].length - a[1].length);
73
+ const bySeverity = Object.entries(groupFindings(report.findings, (f) => f.severity)).sort((a, b) => (SEVERITY_RANK[b[0]] ?? 0) - (SEVERITY_RANK[a[0]] ?? 0));
74
+ const byCategory = Object.entries(groupFindings(report.findings, (f) => f.category)).sort((a, b) => b[1].length - a[1].length);
75
+ const actionCards = actions.map((item) => `
76
+ <article class="card action" data-severity="${esc(item.severity)}" data-category="${esc(item.category)}">
77
+ <div class="row"><span class="badge sev-${esc(item.severity)}">${esc(item.severity)}</span><span class="muted">#${item.id} · ${item.findings.length} findings · ${item.files.length} files</span></div>
78
+ <h3>${esc(item.title)}</h3><p>${esc(item.recommendation)}</p>
79
+ <details><summary>Evidence and files</summary>
80
+ <ul>${item.files.map((file) => `<li><code>${esc(file.file)}${file.lines.length ? ':' + esc(file.lines.slice(0, 8).join(',')) : ''}</code></li>`).join('')}</ul>
81
+ <ol>${item.findings.slice(0, 6).map((finding) => `<li><code>${esc(markdownLocation(finding))}</code> ${esc(finding.finding)}</li>`).join('')}</ol>
82
+ </details>
83
+ </article>`).join('');
84
+ const rows = report.findings.map((f) => `
85
+ <tr data-severity="${esc(f.severity)}" data-category="${esc(f.category)}" data-persona="${esc(f.persona ?? 'local')}" data-file="${esc(f.file)}">
86
+ <td><span class="badge sev-${esc(f.severity)}">${esc(f.severity)}</span></td><td>${esc(f.category)}</td><td>${esc(f.persona ?? 'local')}</td>
87
+ <td><code>${esc(markdownLocation(f))}</code></td><td>${esc(f.finding)}<div class="recommendation">${esc(f.recommendation)}</div></td>
88
+ </tr>`).join('');
89
+ const sectionsByDomain = report.sections ?? [];
90
+ const currentStamp = report.createdAt.replace(/[:.]/g, '-');
91
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
92
+ <title>Aion Audit · ${esc(new Date(report.createdAt).toLocaleDateString())}</title><style>
93
+ :root{color-scheme:dark;--bg:#0d1117;--panel:#161b22;--line:#30363d;--text:#e6edf3;--muted:#8b949e;--blue:#79c0ff;--yellow:#e3b341;--red:#f85149;--green:#3fb950}
94
+ *{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 system-ui,sans-serif}a{color:var(--blue)}code{font-family:ui-monospace,Menlo,monospace;font-size:12px}
95
+ .layout{display:grid;grid-template-columns:220px 1fr;min-height:100vh}.sidebar{position:sticky;top:0;height:100vh;border-right:1px solid var(--line);background:#010409;padding:18px;overflow:auto}
96
+ .sidebar a{display:block;padding:5px 0;color:var(--muted);text-decoration:none;font-size:13px}.sidebar a:hover{color:var(--blue)}.sidebar .sep{border-top:1px solid var(--line);margin:10px 0}
97
+ main{padding:28px;max-width:1300px}.hero{display:flex;justify-content:space-between;gap:20px;border-bottom:1px solid var(--line);padding-bottom:22px;margin-bottom:22px}
98
+ h2{font-size:18px;margin:32px 0 12px;color:var(--blue);border-bottom:1px solid var(--line);padding-bottom:6px}h3{font-size:15px;margin:10px 0}
99
+ .muted,.meta{color:var(--muted);font-size:12px}.cards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}.card{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:14px}
100
+ .num{font-size:32px;font-weight:700}.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
101
+ .badge{display:inline-flex;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:700;text-transform:uppercase}
102
+ .sev-critical{background:#f8514920;color:var(--red)}.sev-high{background:#e3b34120;color:var(--yellow)}.sev-medium{background:#79c0ff20;color:var(--blue)}.sev-low,.sev-info{background:#8b949e20;color:var(--muted)}
103
+ .sev-text-critical{color:var(--red)}.sev-text-high{color:var(--yellow)}.sev-text-medium{color:var(--blue)}.sev-text-low,.sev-text-info,.sev-text-local{color:var(--muted)}.sev-text-green{color:var(--green)}
104
+ .action{margin-bottom:10px}details summary{cursor:pointer;color:var(--muted);font-size:12px;margin-top:6px}
105
+ .stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.stats ul{list-style:none;margin:0;padding:0}.stats li{display:grid;grid-template-columns:1fr auto;gap:3px;border-bottom:1px solid #21262d;padding:8px 0}.stats small{grid-column:1/-1;color:var(--muted)}
106
+ .filters{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}.filters input,.filters select{background:#010409;color:var(--text);border:1px solid var(--line);border-radius:6px;padding:8px}
107
+ table{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--line);border-radius:6px;overflow:hidden}th,td{text-align:left;vertical-align:top;border-bottom:1px solid #21262d;padding:9px}th{color:var(--muted);font-size:12px}
108
+ .recommendation{color:var(--muted);font-size:12px;margin-top:4px}.hotspots{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.hotspot{display:grid;grid-template-columns:1fr auto;gap:4px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:10px}
109
+ .domain-pill{display:inline-block;background:#21262d;border-radius:4px;padding:2px 7px;font-size:11px;margin:2px}
110
+ @media(max-width:900px){.layout{grid-template-columns:1fr}.sidebar{position:relative;height:auto}.cards,.stats,.hotspots{grid-template-columns:1fr}.hero{display:block}}
111
+ </style></head><body><div class="layout">
112
+ <nav class="sidebar">
113
+ <h1 style="font-size:15px;margin:0 0 4px">Aion Audit</h1>
114
+ <p class="muted" style="margin:0 0 12px;font-size:11px">${esc(new Date(report.createdAt).toLocaleString())}</p>
115
+ <a href="../../index.html" style="color:var(--blue);font-size:12px">← Dashboard</a>
116
+ <div class="sep"></div>
117
+ <a href="#overview">Overview</a>
118
+ <a href="#cost">Cost &amp; Performance</a>
119
+ <a href="#actions">Action Plan</a>
120
+ <a href="#findings">Findings</a>
121
+ <a href="#personas">Personas</a>
122
+ <a href="#files">File Hotspots</a>
123
+ ${sectionsByDomain.length > 0 ? '<a href="#domain-breakdown">Domain Breakdown</a>' : ''}
124
+ <a href="#history">History</a>
125
+ <a href="#raw">Raw Data</a>
126
+ <div class="sep"></div>
127
+ <div class="muted" style="font-size:11px">${report.findings.length} findings · ${report.totalFiles} files</div>
128
+ </nav>
129
+ <main>
130
+
131
+ <section class="hero" id="overview">
132
+ <div><h1>Audit Report</h1><p class="muted">${esc(report.summary)}</p></div>
133
+ <div class="meta">Duration ${esc(fmtDur(report.durationMs))} · ${report.totalFiles} files · ${esc(new Date(report.createdAt).toLocaleString())}</div>
134
+ </section>
135
+ <section class="cards">
136
+ <div class="card"><div class="num">${report.findings.length}</div><div class="muted">Findings</div></div>
137
+ <div class="card"><div class="num sev-text-critical">${report.criticalCount}</div><div class="muted">Critical</div></div>
138
+ <div class="card"><div class="num sev-text-high">${report.highCount}</div><div class="muted">High</div></div>
139
+ <div class="card"><div class="num">${actions.length}</div><div class="muted">Actions</div></div>
140
+ </section>
141
+ <section><h2 style="border:none;padding:0;margin-top:18px">Top Priorities</h2><ol>${report.topPriorities.length ? report.topPriorities.map((p) => `<li>${esc(p)}</li>`).join('') : '<li>No top priorities.</li>'}</ol></section>
142
+
143
+ ${renderCostSection(report.costSummary, report.durationMs)}
144
+
145
+ <section id="actions"><h2>Action Plan (${actions.length})</h2>${actionCards || '<p class="muted">No action items.</p>'}</section>
146
+
147
+ <section id="findings"><h2>Findings (${report.findings.length})</h2>
148
+ <div class="filters">
149
+ <input id="q" placeholder="Search findings, files, recommendations">
150
+ <select id="severity"><option value="">All severities</option>${filterOptions(bySeverity)}</select>
151
+ <select id="persona"><option value="">All personas</option>${filterOptions(byPersona)}</select>
152
+ <select id="category"><option value="">All categories</option>${filterOptions(byCategory)}</select>
153
+ </div>
154
+ <table id="findingsTable"><thead><tr><th>Severity</th><th>Category</th><th>Persona</th><th>Location</th><th>Finding</th></tr></thead><tbody>${rows}</tbody></table>
155
+ </section>
156
+
157
+ <section id="personas"><h2>Personas &amp; Categories</h2>
158
+ <div class="stats">
159
+ <div class="card"><h3>By Persona</h3><ul>${statList(byPersona, 'persona')}</ul></div>
160
+ <div class="card"><h3>By Severity</h3><ul>${statList(bySeverity, 'severity')}</ul></div>
161
+ <div class="card"><h3>By Category</h3><ul>${statList(byCategory, 'category')}</ul></div>
162
+ </div>
163
+ </section>
164
+
165
+ ${sectionsByDomain.length > 0 ? `
166
+ <section id="domain-breakdown"><h2>Domain Breakdown</h2>
167
+ ${sectionsByDomain.sort((a, b) => b.findings.length - a.findings.length).map((s) => {
168
+ const crit = s.findings.filter((f) => f.severity === 'critical').length;
169
+ const high = s.findings.filter((f) => f.severity === 'high').length;
170
+ const badge = crit > 0 ? `<span class="badge sev-critical">${crit} critical</span>` : high > 0 ? `<span class="badge sev-high">${high} high</span>` : '';
171
+ return `<details style="margin-bottom:8px;background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:10px">
172
+ <summary style="cursor:pointer;color:var(--text);font-weight:600">${esc(s.domain)} ${badge} <span class="muted">${s.findings.length} finding(s)</span></summary>
173
+ <p class="muted" style="margin:8px 0">${esc(s.summary)}</p>
174
+ <ul>${s.findings.slice(0, 10).map((f) => `<li><span class="badge sev-${esc(f.severity)}">${esc(f.severity)}</span> <code>${esc(markdownLocation(f))}</code> ${esc(f.finding)}</li>`).join('')}</ul>
175
+ </details>`;
176
+ }).join('')}
177
+ </section>` : ''}
178
+
179
+ <section id="files"><h2>File Hotspots</h2>
180
+ <div class="hotspots">${hotspots.slice(0, 30).map((h) => `<div class="hotspot"><div><code>${esc(h.file)}</code><div style="margin-top:4px">${h.categories.map((c) => `<span class="domain-pill">${esc(c)}</span>`).join('')}</div></div><strong class="sev-text-${esc(h.maxSeverity)}">${h.findings}</strong></div>`).join('') || '<p class="muted">No hotspots.</p>'}</div>
181
+ </section>
182
+
183
+ ${renderHistorySection(history, currentStamp)}
184
+
185
+ <section id="raw"><h2>Raw Data</h2>
186
+ <ul><li><a href="digest.md">digest.md</a></li><li><a href="ai-context.md">ai-context.md</a></li><li><a href="report.json">report.json</a></li></ul>
187
+ </section>
188
+
189
+ </main></div>
190
+ <script>
191
+ const q=document.getElementById('q'),severity=document.getElementById('severity'),persona=document.getElementById('persona'),category=document.getElementById('category'),rows=Array.from(document.querySelectorAll('#findingsTable tbody tr'));
192
+ function applyFilters(){const text=q.value.toLowerCase();for(const row of rows){const okText=!text||row.textContent.toLowerCase().includes(text),okSeverity=!severity.value||row.dataset.severity===severity.value,okPersona=!persona.value||row.dataset.persona===persona.value,okCategory=!category.value||row.dataset.category===category.value;row.style.display=okText&&okSeverity&&okPersona&&okCategory?'':'none';}}
193
+ [q,severity,persona,category].forEach((el)=>el.addEventListener('input',applyFilters));
194
+ </script></body></html>`;
195
+ }
196
+ function renderDashboardHtml(history) {
197
+ const sorted = history.slice().reverse();
198
+ const latest = sorted[0];
199
+ const rows = sorted.map((h, i) => {
200
+ const prev = sorted[i + 1];
201
+ const critChange = prev ? h.criticalCount - prev.criticalCount : 0;
202
+ const critBadge = critChange > 0 ? `<span style="color:var(--red)">↑${critChange}</span>` : critChange < 0 ? `<span style="color:var(--green)">↓${Math.abs(critChange)}</span>` : '';
203
+ return `<tr>
204
+ <td><a href="${esc(h.runRelDir)}/index.html">${esc(new Date(h.createdAt).toLocaleString())}</a>${i === 0 ? ' <span class="badge sev-medium">latest</span>' : ''}</td>
205
+ <td class="sev-text-critical">${h.criticalCount} ${critBadge}</td>
206
+ <td class="sev-text-high">${h.highCount}</td>
207
+ <td>${h.totalFiles}</td>
208
+ <td>${esc(fmtUsd(h.costUsd))}</td>
209
+ <td class="muted">${esc(fmtDur(h.durationMs))}</td>
210
+ </tr>`;
211
+ }).join('');
212
+ const totalCost = history.reduce((s, h) => s + h.costUsd, 0);
213
+ const avgCrit = history.length > 0 ? (history.reduce((s, h) => s + h.criticalCount, 0) / history.length).toFixed(1) : '0';
214
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
215
+ <title>Aion Audit Dashboard</title><style>
216
+ :root{color-scheme:dark;--bg:#0d1117;--panel:#161b22;--line:#30363d;--text:#e6edf3;--muted:#8b949e;--blue:#79c0ff;--yellow:#e3b341;--red:#f85149;--green:#3fb950}
217
+ *{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 system-ui,sans-serif;padding:28px}a{color:var(--blue)}code{font-family:ui-monospace,Menlo,monospace;font-size:12px}
218
+ h1{font-size:22px;margin:0 0 6px}h2{font-size:16px;color:var(--blue);border-bottom:1px solid var(--line);padding-bottom:6px;margin:28px 0 12px}
219
+ .muted{color:var(--muted);font-size:12px}.badge{display:inline-flex;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:700;text-transform:uppercase}
220
+ .sev-medium{background:#79c0ff20;color:var(--blue)}.sev-critical{background:#f8514920;color:var(--red)}.sev-high{background:#e3b34120;color:var(--yellow)}
221
+ .sev-text-critical{color:var(--red)}.sev-text-high{color:var(--yellow)}
222
+ .cards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:28px}.card{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:14px}
223
+ .num{font-size:28px;font-weight:700}
224
+ table{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--line);border-radius:6px;overflow:hidden}th,td{text-align:left;border-bottom:1px solid #21262d;padding:9px}th{color:var(--muted);font-size:12px}
225
+ </style></head><body>
226
+ <h1>Aion Audit Dashboard</h1>
227
+ <p class="muted">${history.length} run(s) · ${esc(new Date().toLocaleString())}</p>
228
+ ${latest ? `<p>Latest: <a href="${esc(latest.runRelDir)}/index.html">${esc(new Date(latest.createdAt).toLocaleString())}</a> — <span class="sev-text-critical">${latest.criticalCount} critical</span>, <span class="sev-text-high">${latest.highCount} high</span></p>` : ''}
229
+ <div class="cards">
230
+ <div class="card"><div class="num">${history.length}</div><div class="muted">Total Runs</div></div>
231
+ <div class="card"><div class="num sev-text-critical">${latest?.criticalCount ?? 0}</div><div class="muted">Critical (latest)</div></div>
232
+ <div class="card"><div class="num">${avgCrit}</div><div class="muted">Avg Critical</div></div>
233
+ <div class="card"><div class="num">${esc(fmtUsd(totalCost))}</div><div class="muted">Total Spent</div></div>
234
+ </div>
235
+ <h2>All Runs</h2>
236
+ <table><thead><tr><th>Run</th><th>Critical</th><th>High</th><th>Files</th><th>Cost</th><th>Duration</th></tr></thead>
237
+ <tbody>${rows}</tbody></table>
238
+ </body></html>`;
239
+ }
240
+ function updateAuditHistory(reportsDir, entry) {
241
+ const historyFile = join(reportsDir, 'audit-history.json');
242
+ let history = [];
243
+ if (existsSync(historyFile)) {
244
+ try {
245
+ history = JSON.parse(readFileSync(historyFile, 'utf8'));
246
+ }
247
+ catch { /* ignore */ }
248
+ }
249
+ history.push(entry);
250
+ if (history.length > 50)
251
+ history = history.slice(-50);
252
+ writeFileSync(historyFile, JSON.stringify(history, null, 2), 'utf8');
253
+ return history;
254
+ }
255
+ export function saveAuditReport(cwd, report, durationMs, aiContextBudget = 8000, costSummary) {
256
+ const dir = join(cwd, '.ai-runtime', 'reports');
257
+ mkdirSync(dir, { recursive: true });
258
+ const now = new Date();
259
+ const stamp = now.toISOString().replace(/[:.]/g, '-');
260
+ const createdAt = now.toISOString();
261
+ const fullReport = { ...report, durationMs, createdAt, costSummary };
262
+ const runDir = join(dir, 'audits', stamp);
263
+ mkdirSync(runDir, { recursive: true });
264
+ const paths = {
265
+ runDir,
266
+ html: join(runDir, 'index.html'),
267
+ digest: join(runDir, 'digest.md'),
268
+ aiContext: join(runDir, 'ai-context.md'),
269
+ report: join(runDir, 'report.json'),
270
+ dashboard: join(dir, 'index.html'),
271
+ };
272
+ const history = updateAuditHistory(dir, {
273
+ stamp,
274
+ createdAt,
275
+ runRelDir: `audits/${stamp}`,
276
+ criticalCount: report.criticalCount,
277
+ highCount: report.highCount,
278
+ totalFiles: report.totalFiles,
279
+ durationMs,
280
+ costUsd: costSummary?.totalUsd ?? 0,
281
+ });
282
+ writeFileSync(paths.report, JSON.stringify(fullReport, null, 2), 'utf8');
283
+ writeFileSync(paths.digest, renderDigest(fullReport), 'utf8');
284
+ writeFileSync(paths.aiContext, renderAiContext(fullReport, aiContextBudget), 'utf8');
285
+ writeFileSync(paths.html, renderHtml(fullReport, history), 'utf8');
286
+ writeFileSync(join(dir, 'index.html'), renderDashboardHtml(history), 'utf8');
287
+ writeFileSync(join(dir, 'latest-audit.json'), JSON.stringify({ ...paths, createdAt }, null, 2), 'utf8');
288
+ return paths;
289
+ }
290
+ //# sourceMappingURL=audit-report-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-report-writer.js","sourceRoot":"","sources":["../../src/infra/audit-report-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface TrendEntry {
2
+ timestamp: string;
3
+ gitSha?: string;
4
+ gitBranch?: string;
5
+ score: number;
6
+ grade: string;
7
+ dimensions: Record<string, number>;
8
+ totalFiles?: number;
9
+ }
10
+ export interface HealthTrend {
11
+ version: 1;
12
+ entries: TrendEntry[];
13
+ }
14
+ export declare function loadTrend(cwd: string): HealthTrend;
15
+ export declare function appendTrend(cwd: string, entry: Omit<TrendEntry, 'gitSha' | 'gitBranch'>): void;
16
+ export declare function renderTrendChart(entries: TrendEntry[]): void;
17
+ //# sourceMappingURL=audit-trend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-trend.d.ts","sourceRoot":"","sources":["../../src/infra/audit-trend.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAQlD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC,GAAG,IAAI,CAiB9F;AAiCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAsD5D"}
@@ -0,0 +1,113 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { execFileSync } from 'child_process';
4
+ import chalk from 'chalk';
5
+ const TREND_FILE = '.ai-runtime/health-trend.json';
6
+ const MAX_ENTRIES = 90;
7
+ export function loadTrend(cwd) {
8
+ const path = join(cwd, TREND_FILE);
9
+ if (!existsSync(path))
10
+ return { version: 1, entries: [] };
11
+ try {
12
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
13
+ if (parsed.version !== 1)
14
+ return { version: 1, entries: [] };
15
+ return parsed;
16
+ }
17
+ catch {
18
+ return { version: 1, entries: [] };
19
+ }
20
+ }
21
+ export function appendTrend(cwd, entry) {
22
+ const trend = loadTrend(cwd);
23
+ let gitSha;
24
+ let gitBranch;
25
+ try {
26
+ gitSha = execFileSync('git', ['rev-parse', '--short', 'HEAD'], { cwd, stdio: ['pipe', 'pipe', 'ignore'] }).toString().trim();
27
+ gitBranch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, stdio: ['pipe', 'pipe', 'ignore'] }).toString().trim();
28
+ }
29
+ catch { /* not a git repo */ }
30
+ trend.entries.push({ ...entry, gitSha, gitBranch });
31
+ if (trend.entries.length > MAX_ENTRIES) {
32
+ trend.entries = trend.entries.slice(trend.entries.length - MAX_ENTRIES);
33
+ }
34
+ mkdirSync(join(cwd, '.ai-runtime'), { recursive: true });
35
+ writeFileSync(join(cwd, TREND_FILE), JSON.stringify(trend, null, 2), 'utf8');
36
+ }
37
+ function downsample(entries, width) {
38
+ if (entries.length <= width)
39
+ return entries;
40
+ const result = [];
41
+ const step = entries.length / width;
42
+ for (let i = 0; i < width; i++) {
43
+ const idx = Math.min(Math.round(i * step), entries.length - 1);
44
+ result.push(entries[idx]);
45
+ }
46
+ return result;
47
+ }
48
+ function colorScore(score, text) {
49
+ const label = text ?? `${score}/100`;
50
+ if (score >= 85)
51
+ return chalk.green(label);
52
+ if (score >= 70)
53
+ return chalk.yellow(label);
54
+ return chalk.red(label);
55
+ }
56
+ function colorDot(score) {
57
+ if (score >= 85)
58
+ return chalk.green('●');
59
+ if (score >= 70)
60
+ return chalk.yellow('●');
61
+ return chalk.red('●');
62
+ }
63
+ function formatDate(iso) {
64
+ try {
65
+ const d = new Date(iso);
66
+ return `${(d.getMonth() + 1).toString().padStart(2, '0')}-${d.getDate().toString().padStart(2, '0')}`;
67
+ }
68
+ catch {
69
+ return iso.slice(5, 10);
70
+ }
71
+ }
72
+ export function renderTrendChart(entries) {
73
+ if (entries.length === 0) {
74
+ console.log(chalk.dim(' No trend data yet. Run `aion health` a few times to build history.'));
75
+ return;
76
+ }
77
+ const CHART_WIDTH = 50;
78
+ const CHART_HEIGHT = 10;
79
+ const scores = entries.map((e) => e.score);
80
+ const minScore = Math.max(0, Math.min(...scores) - 5);
81
+ const maxScore = Math.min(100, Math.max(...scores) + 5);
82
+ const range = maxScore - minScore || 1;
83
+ const sampled = downsample(entries, CHART_WIDTH);
84
+ // Build grid: rows from top (high score) to bottom (low score)
85
+ const grid = Array.from({ length: CHART_HEIGHT }, () => Array.from({ length: sampled.length }, () => ({ char: ' ', score: 0 })));
86
+ for (let col = 0; col < sampled.length; col++) {
87
+ const e = sampled[col];
88
+ const rowF = ((e.score - minScore) / range) * (CHART_HEIGHT - 1);
89
+ const row = Math.max(0, Math.min(CHART_HEIGHT - 1, CHART_HEIGHT - 1 - Math.round(rowF)));
90
+ grid[row][col] = { char: '●', score: e.score };
91
+ }
92
+ console.log('');
93
+ for (let row = 0; row < CHART_HEIGHT; row++) {
94
+ const scoreAtRow = Math.round(maxScore - (row / (CHART_HEIGHT - 1)) * range);
95
+ const label = (row === 0 || row === CHART_HEIGHT - 1) ? String(scoreAtRow).padStart(3) : ' ';
96
+ const line = grid[row].map((cell) => cell.char === '●' ? colorDot(cell.score) : chalk.dim('·')).join('');
97
+ process.stdout.write(` ${chalk.dim(label)} │${line}\n`);
98
+ }
99
+ const axis = '─'.repeat(sampled.length);
100
+ console.log(` └${axis}`);
101
+ const first = formatDate(sampled[0].timestamp);
102
+ const last = formatDate(sampled[sampled.length - 1].timestamp);
103
+ const pad = Math.max(0, sampled.length - first.length - last.length);
104
+ console.log(` ${chalk.dim(first)}${' '.repeat(pad)}${chalk.dim(last)}`);
105
+ console.log('');
106
+ const latest = entries[entries.length - 1];
107
+ const prev = entries.length > 1 ? entries[entries.length - 2] : null;
108
+ const delta = prev ? latest.score - prev.score : 0;
109
+ const deltaStr = delta > 0 ? chalk.green(`+${delta}`) : delta < 0 ? chalk.red(String(delta)) : chalk.gray('±0');
110
+ const trendIcon = delta > 2 ? chalk.green('↑') : delta < -2 ? chalk.red('↓') : chalk.gray('→');
111
+ console.log(` Latest: ${colorScore(latest.score)} grade ${latest.grade} ${trendIcon} ${deltaStr} vs prev (${entries.length} data points)`);
112
+ }
113
+ //# sourceMappingURL=audit-trend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-trend.js","sourceRoot":"","sources":["../../src/infra/audit-trend.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,14 @@
1
+ export interface RankedFile {
2
+ file: string;
3
+ score: number;
4
+ reasons: string[];
5
+ }
6
+ export declare function rankFilesByRisk(files: string[], options?: {
7
+ churnCounts?: Map<string, number>;
8
+ depFanIn?: Map<string, number>;
9
+ semgrepFiles?: Set<string>;
10
+ cognitiveScores?: Map<string, number>;
11
+ }): RankedFile[];
1
12
  export interface ApiEndpoint {
2
13
  method: string;
3
14
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"code-metrics.d.ts","sourceRoot":"","sources":["../../src/infra/code-metrics.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAuCD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAuCtD;AAMD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAiCxD;AA4CD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,cAAc,EAAE,CAa9E;AAcD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAuB3D"}
1
+ {"version":3,"file":"code-metrics.d.ts","sourceRoot":"","sources":["../../src/infra/code-metrics.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,GACL,UAAU,EAAE,CAyCd;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAuCD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAuCtD;AAMD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAiCxD;AA4CD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,cAAc,EAAE,CAa9E;AAcD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAuB3D"}
@@ -1,6 +1,68 @@
1
1
  import { readdirSync, readFileSync, statSync } from 'fs';
2
2
  import { join, relative, extname } from 'path';
3
3
  import { spawnSync } from 'child_process';
4
+ export function rankFilesByRisk(files, options = {}) {
5
+ const { churnCounts, depFanIn, semgrepFiles, cognitiveScores } = options;
6
+ return files.map((file) => {
7
+ let score = 0;
8
+ const reasons = [];
9
+ const base = file.split('/').pop() ?? '';
10
+ const depth = file.split('/').length;
11
+ score += Math.max(0, 6 - depth) * 3;
12
+ if (/^(index|main|app|server|router|handler|controller|service|middleware|auth|api)\.[a-z]+$/.test(base)) {
13
+ score += 10;
14
+ reasons.push('key-module');
15
+ }
16
+ if (churnCounts) {
17
+ const c = churnCounts.get(file) ?? 0;
18
+ if (c > 10) {
19
+ score += 15;
20
+ reasons.push(`churn:${c}`);
21
+ }
22
+ else if (c > 5) {
23
+ score += 8;
24
+ reasons.push(`churn:${c}`);
25
+ }
26
+ else if (c > 2) {
27
+ score += 4;
28
+ reasons.push(`churn:${c}`);
29
+ }
30
+ }
31
+ if (depFanIn) {
32
+ const f = depFanIn.get(file) ?? 0;
33
+ if (f > 10) {
34
+ score += 15;
35
+ reasons.push(`dep-central:${f}`);
36
+ }
37
+ else if (f > 5) {
38
+ score += 8;
39
+ reasons.push(`dep-central:${f}`);
40
+ }
41
+ else if (f > 2) {
42
+ score += 4;
43
+ reasons.push(`dep-central:${f}`);
44
+ }
45
+ }
46
+ if (semgrepFiles?.has(file)) {
47
+ score += 12;
48
+ reasons.push('semgrep-hit');
49
+ }
50
+ if (cognitiveScores) {
51
+ const cx = cognitiveScores.get(file) ?? 0;
52
+ if (cx > 30) {
53
+ score += 10;
54
+ reasons.push(`complexity:${cx}`);
55
+ }
56
+ else if (cx > 15) {
57
+ score += 5;
58
+ reasons.push(`complexity:${cx}`);
59
+ }
60
+ }
61
+ if (/\.(test|spec)\.[a-z]+$/.test(file))
62
+ score -= 5;
63
+ return { file, score, reasons };
64
+ }).sort((a, b) => b.score - a.score);
65
+ }
4
66
  const IGNORE_DIRS = new Set([
5
67
  'node_modules', 'dist', 'build', '.git', '__pycache__',
6
68
  '.venv', 'venv', 'env', 'coverage', '.next',
@@ -1 +1 @@
1
- {"version":3,"file":"code-metrics.js","sourceRoot":"","sources":["../../src/infra/code-metrics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"code-metrics.js","sourceRoot":"","sources":["../../src/infra/code-metrics.ts"],"names":[],"mappings":"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"}