@xenos1996/usat 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +335 -0
- package/USAT.md +596 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +438 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +72 -0
- package/dist/config.js.map +1 -0
- package/dist/detect/index.d.ts +58 -0
- package/dist/detect/index.d.ts.map +1 -0
- package/dist/detect/index.js +329 -0
- package/dist/detect/index.js.map +1 -0
- package/dist/engine/audit.d.ts +21 -0
- package/dist/engine/audit.d.ts.map +1 -0
- package/dist/engine/audit.js +295 -0
- package/dist/engine/audit.js.map +1 -0
- package/dist/engine/diff.d.ts +24 -0
- package/dist/engine/diff.d.ts.map +1 -0
- package/dist/engine/diff.js +136 -0
- package/dist/engine/diff.js.map +1 -0
- package/dist/engine/evaluate.d.ts +19 -0
- package/dist/engine/evaluate.d.ts.map +1 -0
- package/dist/engine/evaluate.js +377 -0
- package/dist/engine/evaluate.js.map +1 -0
- package/dist/engine/gate.d.ts +19 -0
- package/dist/engine/gate.d.ts.map +1 -0
- package/dist/engine/gate.js +47 -0
- package/dist/engine/gate.js.map +1 -0
- package/dist/engine/loader.d.ts +22 -0
- package/dist/engine/loader.d.ts.map +1 -0
- package/dist/engine/loader.js +360 -0
- package/dist/engine/loader.js.map +1 -0
- package/dist/engine/maturity.d.ts +20 -0
- package/dist/engine/maturity.d.ts.map +1 -0
- package/dist/engine/maturity.js +157 -0
- package/dist/engine/maturity.js.map +1 -0
- package/dist/engine/score.d.ts +19 -0
- package/dist/engine/score.d.ts.map +1 -0
- package/dist/engine/score.js +141 -0
- package/dist/engine/score.js.map +1 -0
- package/dist/engine/sections.d.ts +14 -0
- package/dist/engine/sections.d.ts.map +1 -0
- package/dist/engine/sections.js +50 -0
- package/dist/engine/sections.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/report/markdown.d.ts +16 -0
- package/dist/report/markdown.d.ts.map +1 -0
- package/dist/report/markdown.js +488 -0
- package/dist/report/markdown.js.map +1 -0
- package/dist/types.d.ts +282 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/util/glob.d.ts +11 -0
- package/dist/util/glob.d.ts.map +1 -0
- package/dist/util/glob.js +86 -0
- package/dist/util/glob.js.map +1 -0
- package/dist/util/project.d.ts +72 -0
- package/dist/util/project.d.ts.map +1 -0
- package/dist/util/project.js +586 -0
- package/dist/util/project.js.map +1 -0
- package/dist/util/yaml.d.ts +28 -0
- package/dist/util/yaml.d.ts.map +1 -0
- package/dist/util/yaml.js +48 -0
- package/dist/util/yaml.js.map +1 -0
- package/docs/ARCHITECTURE.md +119 -0
- package/docs/README.md +27 -0
- package/docs/adr/0001-record-architecture-decisions.md +35 -0
- package/docs/adr/0002-typescript-engine-over-python.md +49 -0
- package/docs/adr/0003-rules-are-data-not-code.md +50 -0
- package/docs/adr/0004-markdown-only-output.md +41 -0
- package/docs/adr/0005-maturity-dampens-severity.md +56 -0
- package/docs/adr/0006-severity-status-two-axes.md +48 -0
- package/docs/adr/0007-suppressions-are-visible-and-expiring.md +46 -0
- package/docs/adr/0008-report-trailer-and-diff.md +48 -0
- package/docs/adr/0009-fail-closed-on-malformed-input.md +56 -0
- package/docs/adr/0010-detector-design.md +54 -0
- package/docs/adr/0011-coexist-with-deep-scanners.md +52 -0
- package/docs/adr/README.md +32 -0
- package/docs/agent-integration.md +129 -0
- package/docs/ci-integration.md +163 -0
- package/docs/concepts.md +196 -0
- package/docs/configuration.md +105 -0
- package/docs/detectors.md +186 -0
- package/docs/getting-started.md +99 -0
- package/docs/maturity-profiles.md +156 -0
- package/docs/reference/api.md +193 -0
- package/docs/reference/cli.md +412 -0
- package/docs/rule-packs.md +278 -0
- package/docs/standards-mapping.md +171 -0
- package/package.json +96 -0
- package/rules/core/architecture.yaml +190 -0
- package/rules/core/cicd.yaml +212 -0
- package/rules/core/code-quality.yaml +261 -0
- package/rules/core/dependencies.yaml +132 -0
- package/rules/core/documentation.yaml +119 -0
- package/rules/core/future-readiness.yaml +91 -0
- package/rules/core/release.yaml +131 -0
- package/rules/core/repo.yaml +303 -0
- package/rules/core/security.yaml +494 -0
- package/rules/core/supply-chain.yaml +357 -0
- package/rules/core/testing.yaml +260 -0
- package/rules/detectors.yaml +2255 -0
- package/rules/index.yaml +41 -0
- package/rules/profiles/maturity.yaml +135 -0
- package/rules/stacks/ai-era.yaml +193 -0
- package/rules/stacks/api-backend.yaml +121 -0
- package/rules/stacks/cli.yaml +105 -0
- package/rules/stacks/compliance.yaml +157 -0
- package/rules/stacks/containers.yaml +124 -0
- package/rules/stacks/data.yaml +165 -0
- package/rules/stacks/go.yaml +134 -0
- package/rules/stacks/iac.yaml +128 -0
- package/rules/stacks/jvm.yaml +150 -0
- package/rules/stacks/ml-ai.yaml +140 -0
- package/rules/stacks/mobile.yaml +121 -0
- package/rules/stacks/node-typescript.yaml +166 -0
- package/rules/stacks/python.yaml +175 -0
- package/rules/stacks/rust.yaml +129 -0
- package/rules/stacks/solidity.yaml +139 -0
- package/rules/stacks/web-frontend.yaml +159 -0
- package/templates/AGENTS.audit.md +135 -0
- package/templates/AUDIT_REPORT.md +155 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
const TAG = {
|
|
2
|
+
PASS: '✅',
|
|
3
|
+
FAIL: '🔴',
|
|
4
|
+
WRONG: '⚠️',
|
|
5
|
+
MISSING: '🚫',
|
|
6
|
+
DEPRECATED: '💀',
|
|
7
|
+
EXPERIMENTAL: '🧪',
|
|
8
|
+
UNKNOWN: '❓',
|
|
9
|
+
NOT_APPLICABLE: '➖',
|
|
10
|
+
};
|
|
11
|
+
const SEV_TAG = {
|
|
12
|
+
CRITICAL: '🔴',
|
|
13
|
+
HIGH: '🟠',
|
|
14
|
+
MEDIUM: '🟡',
|
|
15
|
+
LOW: '🟢',
|
|
16
|
+
FUTURE: '🔵',
|
|
17
|
+
};
|
|
18
|
+
const SEV_NAME = {
|
|
19
|
+
CRITICAL: 'CRITICAL',
|
|
20
|
+
HIGH: 'HIGH',
|
|
21
|
+
MEDIUM: 'MEDIUM',
|
|
22
|
+
LOW: 'LOW',
|
|
23
|
+
FUTURE: 'FUTURE',
|
|
24
|
+
};
|
|
25
|
+
const STATUS_NAME = {
|
|
26
|
+
PASS: 'GOOD',
|
|
27
|
+
FAIL: 'FAIL',
|
|
28
|
+
WRONG: 'WRONG',
|
|
29
|
+
MISSING: 'MISSING',
|
|
30
|
+
DEPRECATED: 'DEPRECATED',
|
|
31
|
+
EXPERIMENTAL: 'EXPERIMENTAL',
|
|
32
|
+
UNKNOWN: 'NEEDS REVIEW',
|
|
33
|
+
NOT_APPLICABLE: 'SKIPPED',
|
|
34
|
+
};
|
|
35
|
+
/** Renders the Section 14 report template from USAT.md. */
|
|
36
|
+
export function renderMarkdown(report, profile) {
|
|
37
|
+
const out = [];
|
|
38
|
+
const p = (line = '') => out.push(line);
|
|
39
|
+
const findings = report.findings;
|
|
40
|
+
const active = findings.filter((f) => !f.suppressedReason);
|
|
41
|
+
const suppressed = findings.filter((f) => Boolean(f.suppressedReason));
|
|
42
|
+
const unresolved = active.filter((f) => f.status === 'UNKNOWN');
|
|
43
|
+
const actioned = active.filter((f) => f.status !== 'PASS' && f.status !== 'UNKNOWN');
|
|
44
|
+
const passed = active.filter((f) => f.status === 'PASS');
|
|
45
|
+
renderReportHeader(p, report, profile);
|
|
46
|
+
renderExecutiveSummary(p, report, profile);
|
|
47
|
+
renderCounts(p, report, suppressed.length);
|
|
48
|
+
renderImmediate(p, actioned);
|
|
49
|
+
renderBySection(p, report, profile, actioned, passed);
|
|
50
|
+
renderJudgementQueue(p, unresolved);
|
|
51
|
+
renderSuppressed(p, suppressed);
|
|
52
|
+
renderRoadmap(p, profile, actioned);
|
|
53
|
+
renderAppendix(p, report);
|
|
54
|
+
renderTrailerBlock(p, report);
|
|
55
|
+
return out.join('\n');
|
|
56
|
+
}
|
|
57
|
+
/* --------------------------------------------------------------- header -- */
|
|
58
|
+
function renderReportHeader(p, report, profile) {
|
|
59
|
+
p('# 🔍 Universal Software Audit Report');
|
|
60
|
+
p();
|
|
61
|
+
p(`> Generated by **USAT** · schema \`${report.schema}\``);
|
|
62
|
+
p();
|
|
63
|
+
p('| | |');
|
|
64
|
+
p('|---|---|');
|
|
65
|
+
p(`| **Project** | \`${report.target.name}\` |`);
|
|
66
|
+
p(`| **Path** | \`${report.target.path}\` |`);
|
|
67
|
+
if (report.target.repoUrl)
|
|
68
|
+
p(`| **Repository** | ${report.target.repoUrl} |`);
|
|
69
|
+
p(`| **Commit** | ${report.target.commit ? `\`${report.target.commit.slice(0, 8)}\`` : 'n/a'} (${report.target.ref ?? 'detached'}) |`);
|
|
70
|
+
p(`| **Date** | ${report.generatedAt} |`);
|
|
71
|
+
p(`| **USAT version** | ${report.usatVersion} |`);
|
|
72
|
+
p(`| **Detected type** | ${humanList(report.detection.projectTypes) || 'unclassified'} |`);
|
|
73
|
+
p(`| **Platform** | ${humanList(report.detection.platforms) || 'unclassified'} |`);
|
|
74
|
+
p(`| **Stack** | ${humanList([...report.detection.languages, ...report.detection.frameworks])} |`);
|
|
75
|
+
p(`| **Maturity** | ${profile.label}${report.options.profile === 'auto' ? ' *(auto-detected)*' : ' *(forced)*'} |`);
|
|
76
|
+
p(`| **Depth** | ${report.options.depth} |`);
|
|
77
|
+
p();
|
|
78
|
+
}
|
|
79
|
+
/* -------------------------------------------------------------- summary -- */
|
|
80
|
+
function renderExecutiveSummary(p, report, profile) {
|
|
81
|
+
p('## 📊 Executive Summary');
|
|
82
|
+
p();
|
|
83
|
+
const band = report.score.expectedBand;
|
|
84
|
+
const coverage = report.score.automationCoverage;
|
|
85
|
+
const queue = report.score.counts.UNKNOWN ?? 0;
|
|
86
|
+
p(`### Overall Health Score: **${report.score.overall}/100**`);
|
|
87
|
+
p();
|
|
88
|
+
p(`${bar(report.score.overall, 100)}`);
|
|
89
|
+
p();
|
|
90
|
+
p(`Verified automatically: **${fmt(coverage)}%** of applicable checks. ` +
|
|
91
|
+
`${queue} check${queue === 1 ? '' : 's'} need a human — see the judgement queue.`);
|
|
92
|
+
p();
|
|
93
|
+
if (coverage < 60) {
|
|
94
|
+
p(`> ⚠️ **Read this score as a floor, not a grade.** Only ${fmt(coverage)}% of applicable ` +
|
|
95
|
+
`checks could be resolved without a human. The unverified ${100 - Math.round(coverage)}% ` +
|
|
96
|
+
`is not "passing" — it is unknown, and it is excluded from the arithmetic above rather ` +
|
|
97
|
+
`than counted as credit.`);
|
|
98
|
+
p();
|
|
99
|
+
}
|
|
100
|
+
p(`Expected band for **${profile.label}**: ${band[0]}–${band[1]} — ${verdict(report.score.overall, band)}`);
|
|
101
|
+
p();
|
|
102
|
+
if (profile.summary)
|
|
103
|
+
p(`> ${profile.summary.trim()}`);
|
|
104
|
+
p();
|
|
105
|
+
p('| Dimension | Score | Confidence |');
|
|
106
|
+
p('|---|---|---|');
|
|
107
|
+
for (const s of report.score.sections) {
|
|
108
|
+
p(renderSectionRow(s));
|
|
109
|
+
}
|
|
110
|
+
p();
|
|
111
|
+
p(`*Confidence = share of applicable rules the engine could verify automatically; ` +
|
|
112
|
+
`unverified checks are excluded from the score rather than counted as passes. ` +
|
|
113
|
+
`**†** = fewer than half of that section's applicable checks could be verified. ` +
|
|
114
|
+
`Automation coverage: **${fmt(coverage)}%**. The rest is in the judgement queue below.*`);
|
|
115
|
+
p();
|
|
116
|
+
}
|
|
117
|
+
function renderSectionRow(s) {
|
|
118
|
+
// A section can score 10/10 on one verified rule out of six. Mark it, so a
|
|
119
|
+
// perfect-looking table does not imply a thorough audit.
|
|
120
|
+
const thin = s.score !== null && s.confidence < 50 ? ' †' : '';
|
|
121
|
+
return s.score === null
|
|
122
|
+
? `| ${s.id} · ${s.title} | — not verified | 0% |`
|
|
123
|
+
: `| ${s.id} · ${s.title} | ${fmt(s.score)}/10${thin} | ${fmt(s.confidence)}% |`;
|
|
124
|
+
}
|
|
125
|
+
/* --------------------------------------------------------------- counts -- */
|
|
126
|
+
function countsRow(statusPart, severityPart) {
|
|
127
|
+
return `| ${statusPart} : | ${severityPart}`;
|
|
128
|
+
}
|
|
129
|
+
function renderCounts(p, report, suppressedCount) {
|
|
130
|
+
p('## 🏷️ Findings Summary');
|
|
131
|
+
p();
|
|
132
|
+
p('| Status | Count | | Severity (open findings) | Count |');
|
|
133
|
+
p('|---|--:|-|---|--:|');
|
|
134
|
+
const statusRows = [
|
|
135
|
+
'PASS',
|
|
136
|
+
'FAIL',
|
|
137
|
+
'WRONG',
|
|
138
|
+
'MISSING',
|
|
139
|
+
'DEPRECATED',
|
|
140
|
+
'EXPERIMENTAL',
|
|
141
|
+
'UNKNOWN',
|
|
142
|
+
];
|
|
143
|
+
const sevRows = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'FUTURE'];
|
|
144
|
+
for (let i = 0; i < Math.max(statusRows.length, sevRows.length); i++) {
|
|
145
|
+
p(countsRow(statusCell(report, statusRows[i]), severityCell(report, sevRows[i])));
|
|
146
|
+
}
|
|
147
|
+
p();
|
|
148
|
+
if (suppressedCount > 0) {
|
|
149
|
+
p(`*${suppressedCount} finding(s) suppressed by project policy — see [Accepted risk](#-accepted-risk-suppressions).*`);
|
|
150
|
+
p();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function statusCell(report, st) {
|
|
154
|
+
if (!st)
|
|
155
|
+
return ' | |';
|
|
156
|
+
return `${TAG[st]} ${STATUS_NAME[st]} | ${report.score.counts[st] ?? 0} |`;
|
|
157
|
+
}
|
|
158
|
+
function severityCell(report, sv) {
|
|
159
|
+
if (!sv)
|
|
160
|
+
return ' | |';
|
|
161
|
+
return `${SEV_TAG[sv]} ${SEV_NAME[sv]} | ${report.score.severityCounts[sv] ?? 0} |`;
|
|
162
|
+
}
|
|
163
|
+
/* ------------------------------------------------------------- immediate -- */
|
|
164
|
+
function renderImmediate(p, actioned) {
|
|
165
|
+
p('## 🚨 Immediate Action Required');
|
|
166
|
+
p();
|
|
167
|
+
const urgent = actioned
|
|
168
|
+
.filter((f) => f.severity === 'CRITICAL' || f.severity === 'HIGH')
|
|
169
|
+
.slice(0, 15);
|
|
170
|
+
if (urgent.length === 0) {
|
|
171
|
+
p('No CRITICAL or HIGH findings. Nice.');
|
|
172
|
+
p();
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
urgent.forEach((f, i) => renderUrgentItem(p, f, i));
|
|
176
|
+
p();
|
|
177
|
+
}
|
|
178
|
+
function renderUrgentItem(p, f, i) {
|
|
179
|
+
const loc = primaryLocation(f);
|
|
180
|
+
p(`${i + 1}. ${SEV_TAG[f.severity]} **${f.title}** · \`${f.ruleId}\``);
|
|
181
|
+
p(` - **Where:** ${loc}`);
|
|
182
|
+
p(` - **Why:** ${f.message}`);
|
|
183
|
+
if (f.remediation)
|
|
184
|
+
p(` - **Fix:** ${f.remediation}`);
|
|
185
|
+
}
|
|
186
|
+
/* ------------------------------------------------------------ by section -- */
|
|
187
|
+
function renderBySection(p, report, profile, actioned, passed) {
|
|
188
|
+
p('## 📁 Section-by-Section Findings');
|
|
189
|
+
p();
|
|
190
|
+
const sectionMeta = new Map(report.score.sections.map((s) => [s.id, s]));
|
|
191
|
+
const bySection = groupBy(actioned, (f) => f.section);
|
|
192
|
+
const sectionIds = [...new Set([...report.score.sections.map((s) => s.id), ...bySection.keys()])];
|
|
193
|
+
sectionIds.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
|
|
194
|
+
for (const id of sectionIds) {
|
|
195
|
+
renderSectionBlock(p, profile, id, sectionMeta.get(id), bySection.get(id) ?? [], passed);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function renderSectionBlock(p, profile, id, meta, items, passed) {
|
|
199
|
+
const good = passed.filter((f) => f.section === id);
|
|
200
|
+
const title = meta?.title ?? items[0]?.sectionTitle ?? id;
|
|
201
|
+
p(`### ${id} · ${title}`);
|
|
202
|
+
p();
|
|
203
|
+
if (meta) {
|
|
204
|
+
p(sectionScoreLine(meta));
|
|
205
|
+
p();
|
|
206
|
+
}
|
|
207
|
+
if (items.length === 0) {
|
|
208
|
+
p('No open findings in this section. ✅');
|
|
209
|
+
p();
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
for (const f of items.sort(severityOrder)) {
|
|
213
|
+
renderSectionFinding(p, f, profile.label);
|
|
214
|
+
}
|
|
215
|
+
renderPassingDetails(p, id, good);
|
|
216
|
+
p();
|
|
217
|
+
}
|
|
218
|
+
function sectionScoreLine(meta) {
|
|
219
|
+
return meta.score === null
|
|
220
|
+
? `**Not automatically verifiable** · ` +
|
|
221
|
+
`${meta.applicable} applicable rule(s), all requiring judgement.`
|
|
222
|
+
: `**Score ${fmt(meta.score)}/10** · ${bar(meta.score, 10)} · ` +
|
|
223
|
+
`${meta.passed} passed / ${meta.failed} open / ${meta.unknown} to review`;
|
|
224
|
+
}
|
|
225
|
+
function renderSectionFinding(p, f, profileLabel) {
|
|
226
|
+
p(`- ${TAG[f.status]} **${f.title}** \`${f.ruleId}\` — ${f.message}`);
|
|
227
|
+
if (f.locations.length > 0) {
|
|
228
|
+
p(` - 📍 ${f.locations.slice(0, 4).map(fmtLocation).join(', ')}${f.locations.length > 4 ? ` (+${f.locations.length - 4})` : ''}`);
|
|
229
|
+
}
|
|
230
|
+
if (f.dampened) {
|
|
231
|
+
p(` - 🪶 Downgraded ${f.baseSeverity} → ${f.severity} by the ${profileLabel} profile`);
|
|
232
|
+
}
|
|
233
|
+
if (f.remediation)
|
|
234
|
+
p(` - 🛠️ ${f.remediation}`);
|
|
235
|
+
if (f.references?.length)
|
|
236
|
+
p(` - 📚 ${f.references.join(' · ')}`);
|
|
237
|
+
}
|
|
238
|
+
function renderPassingDetails(p, id, good) {
|
|
239
|
+
if (good.length === 0)
|
|
240
|
+
return;
|
|
241
|
+
p();
|
|
242
|
+
p(`<details><summary>${good.length} check(s) passing in ${id}</summary>`);
|
|
243
|
+
p();
|
|
244
|
+
for (const f of good)
|
|
245
|
+
p(`- ✅ ${f.title} \`${f.ruleId}\``);
|
|
246
|
+
p();
|
|
247
|
+
p('</details>');
|
|
248
|
+
}
|
|
249
|
+
/* ------------------------------------------------------------- judgement -- */
|
|
250
|
+
function renderJudgementQueue(p, unresolved) {
|
|
251
|
+
p('## 🧠 Judgement Queue (agent / human review)');
|
|
252
|
+
p();
|
|
253
|
+
p('These checks cannot be settled by grep. Work through them with an agent or a reviewer;');
|
|
254
|
+
p('each one records the evidence required. **RULE 4: never mark ✅ without evidence.**');
|
|
255
|
+
p();
|
|
256
|
+
if (unresolved.length === 0) {
|
|
257
|
+
p('Nothing pending — every applicable rule was resolved automatically.');
|
|
258
|
+
p();
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
p('| Rule | Section | Severity | What to look for | Evidence to record |');
|
|
262
|
+
p('|---|---|---|---|---|');
|
|
263
|
+
for (const f of unresolved) {
|
|
264
|
+
p(`| \`${f.ruleId}\` ${escapeCell(f.title)} | ${f.section} | ${SEV_TAG[f.severity]} ${f.severity} | ` +
|
|
265
|
+
`${escapeCell(f.why ?? f.message)} | ${escapeCell(f.evidenceHint ?? 'file:line + reasoning')} |`);
|
|
266
|
+
}
|
|
267
|
+
p();
|
|
268
|
+
}
|
|
269
|
+
/* ------------------------------------------------------------ suppressed -- */
|
|
270
|
+
function renderSuppressed(p, suppressed) {
|
|
271
|
+
if (suppressed.length === 0)
|
|
272
|
+
return;
|
|
273
|
+
p('## 🤝 Accepted Risk (suppressions)');
|
|
274
|
+
p();
|
|
275
|
+
p('| Rule | Severity | Reason |');
|
|
276
|
+
p('|---|---|---|');
|
|
277
|
+
for (const f of suppressed) {
|
|
278
|
+
p(`| \`${f.ruleId}\` ${escapeCell(f.title)} | ${SEV_TAG[f.severity]} ${f.severity} | ${escapeCell(f.suppressedReason ?? '')} |`);
|
|
279
|
+
}
|
|
280
|
+
p();
|
|
281
|
+
}
|
|
282
|
+
/* --------------------------------------------------------------- roadmap -- */
|
|
283
|
+
function renderRoadmap(p, profile, actioned) {
|
|
284
|
+
p('## 🗺️ Recommended Roadmap');
|
|
285
|
+
p();
|
|
286
|
+
const sprint0 = actioned.filter((f) => f.severity === 'CRITICAL' || (f.severity === 'HIGH' && f.ruleClass === 'security'));
|
|
287
|
+
const sprint1 = actioned.filter((f) => f.severity === 'HIGH' && !(f.severity === 'HIGH' && f.ruleClass === 'security'));
|
|
288
|
+
roadmapBlock(p, 'SPRINT 0 · now', 'Stop the bleeding. Ship before anything else.', sprint0);
|
|
289
|
+
roadmapBlock(p, 'SPRINT 1 · next 1–2 weeks', 'Close the remaining HIGH-severity debt.', sprint1);
|
|
290
|
+
roadmapBlock(p, 'SPRINT 2 · next month', 'MEDIUM gaps — schedule them or they never happen.', actioned.filter((f) => f.severity === 'MEDIUM'));
|
|
291
|
+
roadmapBlock(p, 'BACKLOG', 'LOW and FUTURE items. Re-read after the next audit.', actioned.filter((f) => f.severity === 'LOW' || f.severity === 'FUTURE'));
|
|
292
|
+
if (profile.focus.length > 0) {
|
|
293
|
+
p(`### 🎯 What actually matters at **${profile.label}**`);
|
|
294
|
+
p();
|
|
295
|
+
for (const f of profile.focus)
|
|
296
|
+
p(`- ${f}`);
|
|
297
|
+
p();
|
|
298
|
+
}
|
|
299
|
+
if (profile.defer.length > 0) {
|
|
300
|
+
p('<details><summary>Deliberately deferred at this stage</summary>');
|
|
301
|
+
p();
|
|
302
|
+
for (const d of profile.defer)
|
|
303
|
+
p(`- ~~${d}~~`);
|
|
304
|
+
p();
|
|
305
|
+
p('</details>');
|
|
306
|
+
p();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/* -------------------------------------------------------------- appendix -- */
|
|
310
|
+
function renderAppendix(p, report) {
|
|
311
|
+
p('## 🧾 Appendix');
|
|
312
|
+
p();
|
|
313
|
+
p('<details><summary>Detection facts</summary>');
|
|
314
|
+
p();
|
|
315
|
+
p('```yaml');
|
|
316
|
+
p(`maturity: ${report.detection.maturity}`);
|
|
317
|
+
p(`languages: [${report.detection.languages.join(', ')}]`);
|
|
318
|
+
p(`frameworks: [${report.detection.frameworks.join(', ')}]`);
|
|
319
|
+
p(`package_managers: [${report.detection.packageManagers.join(', ')}]`);
|
|
320
|
+
p(`databases: [${report.detection.databases.join(', ')}]`);
|
|
321
|
+
p(`platforms: [${report.detection.platforms.join(', ')}]`);
|
|
322
|
+
p(`flags: [${report.detection.flags.join(', ')}]`);
|
|
323
|
+
p('metrics:');
|
|
324
|
+
for (const [k, v] of Object.entries(report.detection.metrics))
|
|
325
|
+
p(` ${k}: ${v}`);
|
|
326
|
+
p('```');
|
|
327
|
+
p();
|
|
328
|
+
p('Maturity signals:');
|
|
329
|
+
p();
|
|
330
|
+
for (const s of report.detection.maturitySignals)
|
|
331
|
+
p(`- ${s}`);
|
|
332
|
+
p();
|
|
333
|
+
p(`Rule packs loaded (${report.options.packsLoaded.length}): ${report.options.packsLoaded.join(', ') || 'none'}`);
|
|
334
|
+
p();
|
|
335
|
+
p(`Rule packs skipped as not applicable (${report.options.packsSkipped.length}): ${report.options.packsSkipped.join(', ') || 'none'}`);
|
|
336
|
+
p();
|
|
337
|
+
p('</details>');
|
|
338
|
+
p();
|
|
339
|
+
p('---');
|
|
340
|
+
p();
|
|
341
|
+
p('<sub>Report generated by USAT — the Universal Software Audit Template. ' +
|
|
342
|
+
'Scores are reproducible: re-run with the same rules and depth to compare. ' +
|
|
343
|
+
'USAT checks process and code hygiene; it is not a penetration test.</sub>');
|
|
344
|
+
p();
|
|
345
|
+
}
|
|
346
|
+
/* --------------------------------------------------------------- trailer -- */
|
|
347
|
+
function renderTrailerBlock(p, report) {
|
|
348
|
+
p(TRAILER_BEGIN);
|
|
349
|
+
p('```yaml');
|
|
350
|
+
p(trailer(report));
|
|
351
|
+
p('```');
|
|
352
|
+
p(TRAILER_END);
|
|
353
|
+
p();
|
|
354
|
+
}
|
|
355
|
+
/* --------------------------------------------------------------- helpers -- */
|
|
356
|
+
function roadmapBlock(p, title, blurb, items) {
|
|
357
|
+
p(`### ${title}`);
|
|
358
|
+
p();
|
|
359
|
+
p(`*${blurb}*`);
|
|
360
|
+
p();
|
|
361
|
+
if (items.length === 0) {
|
|
362
|
+
p('Nothing here. ✅');
|
|
363
|
+
p();
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
for (const f of [...items].sort(severityOrder).slice(0, 25)) {
|
|
367
|
+
p(`- ${SEV_TAG[f.severity]} \`${f.ruleId}\` ${f.title}${f.remediation ? ` → ${f.remediation}` : ''}`);
|
|
368
|
+
}
|
|
369
|
+
if (items.length > 25)
|
|
370
|
+
p(`- …and ${items.length - 25} more`);
|
|
371
|
+
p();
|
|
372
|
+
}
|
|
373
|
+
function severityOrder(a, b) {
|
|
374
|
+
const o = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, LOW: 3, FUTURE: 4 };
|
|
375
|
+
return (o[a.severity] ?? 9) - (o[b.severity] ?? 9);
|
|
376
|
+
}
|
|
377
|
+
export function primaryLocation(f) {
|
|
378
|
+
if (f.locations.length === 0)
|
|
379
|
+
return 'project-wide';
|
|
380
|
+
return f.locations.slice(0, 3).map(fmtLocation).join(', ');
|
|
381
|
+
}
|
|
382
|
+
function fmtLocation(l) {
|
|
383
|
+
return `\`${l.file}${typeof l.line === 'number' ? `:${l.line}` : ''}\``;
|
|
384
|
+
}
|
|
385
|
+
function fmt(n) {
|
|
386
|
+
return Number.isInteger(n) ? String(n) : n.toFixed(1);
|
|
387
|
+
}
|
|
388
|
+
function bar(value, max, width = 24) {
|
|
389
|
+
const filled = Math.max(0, Math.min(width, Math.round((value / max) * width)));
|
|
390
|
+
return `\`${'█'.repeat(filled)}${'░'.repeat(width - filled)}\``;
|
|
391
|
+
}
|
|
392
|
+
function verdict(score, band) {
|
|
393
|
+
if (score >= band[1])
|
|
394
|
+
return '**above the expected band** 🎉';
|
|
395
|
+
if (score >= band[0])
|
|
396
|
+
return '**within the expected band** 👍';
|
|
397
|
+
if (score >= band[0] - 15)
|
|
398
|
+
return '**just below the expected band** — close the HIGH findings';
|
|
399
|
+
return '**well below the expected band** — start with SPRINT 0';
|
|
400
|
+
}
|
|
401
|
+
function humanList(items) {
|
|
402
|
+
const uniq = [...new Set(items)];
|
|
403
|
+
if (uniq.length === 0)
|
|
404
|
+
return '';
|
|
405
|
+
if (uniq.length <= 4)
|
|
406
|
+
return uniq.join(', ');
|
|
407
|
+
return `${uniq.slice(0, 4).join(', ')} +${uniq.length - 4}`;
|
|
408
|
+
}
|
|
409
|
+
function groupBy(items, key) {
|
|
410
|
+
const m = new Map();
|
|
411
|
+
for (const item of items) {
|
|
412
|
+
const k = key(item);
|
|
413
|
+
const list = m.get(k) ?? [];
|
|
414
|
+
list.push(item);
|
|
415
|
+
m.set(k, list);
|
|
416
|
+
}
|
|
417
|
+
return m;
|
|
418
|
+
}
|
|
419
|
+
function escapeCell(s) {
|
|
420
|
+
// Backslashes first: escaping `|` without escaping `\` lets an input
|
|
421
|
+
// backslash turn into an escape for the character that follows it.
|
|
422
|
+
return s.replace(/\\/g, '\\\\').replace(/\|/g, '\\|').replace(/\n/g, ' ').trim();
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Compact, stable YAML used by `usat diff`. Kept in the Markdown on purpose —
|
|
426
|
+
* the report stays a single self-contained artifact you can commit, email, or
|
|
427
|
+
* paste into a PR.
|
|
428
|
+
*/
|
|
429
|
+
export const TRAILER_BEGIN = '<!-- USAT:TRAILER:BEGIN -->';
|
|
430
|
+
export const TRAILER_END = '<!-- USAT:TRAILER:END -->';
|
|
431
|
+
export function trailer(report) {
|
|
432
|
+
const lines = [];
|
|
433
|
+
lines.push('schema: usat-report-v1');
|
|
434
|
+
lines.push(`generated_at: ${report.generatedAt}`);
|
|
435
|
+
lines.push(`usat_version: ${report.usatVersion}`);
|
|
436
|
+
lines.push(`overall: ${report.score.overall}`);
|
|
437
|
+
lines.push('sections:');
|
|
438
|
+
for (const s of report.score.sections) {
|
|
439
|
+
lines.push(` ${s.id}: {score: ${s.score}, open: ${s.failed}, review: ${s.unknown}}`);
|
|
440
|
+
}
|
|
441
|
+
lines.push('severity_totals:');
|
|
442
|
+
for (const [k, v] of Object.entries(report.score.severityCounts)) {
|
|
443
|
+
lines.push(` ${k}: ${v}`);
|
|
444
|
+
}
|
|
445
|
+
lines.push('rules:');
|
|
446
|
+
for (const f of report.findings) {
|
|
447
|
+
lines.push(` ${yamlKey(f.ruleId)}: {status: ${f.status}, severity: ${f.severity}, section: ${f.section}}`);
|
|
448
|
+
}
|
|
449
|
+
return lines.join('\n');
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Rule IDs are pack-author-controlled input to a machine-parsed channel.
|
|
453
|
+
* An unquoted id containing `:`, `#`, a newline, or a ``` fence truncates
|
|
454
|
+
* or corrupts the YAML mapping the trailer — and therefore `usat diff`.
|
|
455
|
+
*/
|
|
456
|
+
function yamlKey(id) {
|
|
457
|
+
return `"${id.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`;
|
|
458
|
+
}
|
|
459
|
+
/** Extracts the machine-readable trailer from a previously rendered report. */
|
|
460
|
+
export function parseTrailer(markdown) {
|
|
461
|
+
// indexOf + slice rather than /BEGIN([\s\S]*?)END/: the wildcard form is
|
|
462
|
+
// polynomial on input containing many partial BEGIN markers, and this runs
|
|
463
|
+
// on documents supplied by whoever hands us a report.
|
|
464
|
+
//
|
|
465
|
+
// Find the END first and then walk back: a report that *quotes* an earlier
|
|
466
|
+
// BEGIN marker (or one concatenated with a decoy) must still yield its own
|
|
467
|
+
// trailer, so the nearest BEGIN before END is the one that matters.
|
|
468
|
+
// Last END wins: in a concatenation of reports the newest trailer is the
|
|
469
|
+
// one that matters. (First-END returned the oldest — stale diffs.)
|
|
470
|
+
const end = markdown.lastIndexOf(TRAILER_END);
|
|
471
|
+
if (end < 0)
|
|
472
|
+
return null;
|
|
473
|
+
const start = markdown.lastIndexOf(TRAILER_BEGIN, end);
|
|
474
|
+
if (start < 0)
|
|
475
|
+
return null;
|
|
476
|
+
const body = markdown.slice(start + TRAILER_BEGIN.length, end);
|
|
477
|
+
// Tolerate trailing spaces, CRLF line endings, and `yml` shorthand.
|
|
478
|
+
const fence = /```ya?ml[ \t]*\r?\n/.exec(body);
|
|
479
|
+
if (!fence)
|
|
480
|
+
return null;
|
|
481
|
+
const yamlStart = fence.index + fence[0].length;
|
|
482
|
+
// Last fence wins: a hostile rule id can legally contain ``` inside its
|
|
483
|
+
// quoted YAML string, so the first fence after the header is not
|
|
484
|
+
// necessarily the closing one. The emitted closing fence is always last.
|
|
485
|
+
const yamlEnd = body.lastIndexOf('```');
|
|
486
|
+
return yamlEnd <= yamlStart ? body.slice(yamlStart) : body.slice(yamlStart, yamlEnd);
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/report/markdown.ts"],"names":[],"mappings":"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"}
|