@xenos1996/usa 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +335 -0
  3. package/USA.md +597 -0
  4. package/dist/bootstrap/catalog.d.ts +46 -0
  5. package/dist/bootstrap/catalog.d.ts.map +1 -0
  6. package/dist/bootstrap/catalog.js +312 -0
  7. package/dist/bootstrap/catalog.js.map +1 -0
  8. package/dist/bootstrap/index.d.ts +36 -0
  9. package/dist/bootstrap/index.d.ts.map +1 -0
  10. package/dist/bootstrap/index.js +177 -0
  11. package/dist/bootstrap/index.js.map +1 -0
  12. package/dist/cli.d.ts +5 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +706 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/config.d.ts +7 -0
  17. package/dist/config.d.ts.map +1 -0
  18. package/dist/config.js +88 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/detect/index.d.ts +58 -0
  21. package/dist/detect/index.d.ts.map +1 -0
  22. package/dist/detect/index.js +329 -0
  23. package/dist/detect/index.js.map +1 -0
  24. package/dist/engine/audit.d.ts +32 -0
  25. package/dist/engine/audit.d.ts.map +1 -0
  26. package/dist/engine/audit.js +366 -0
  27. package/dist/engine/audit.js.map +1 -0
  28. package/dist/engine/diff.d.ts +24 -0
  29. package/dist/engine/diff.d.ts.map +1 -0
  30. package/dist/engine/diff.js +136 -0
  31. package/dist/engine/diff.js.map +1 -0
  32. package/dist/engine/evaluate.d.ts +19 -0
  33. package/dist/engine/evaluate.d.ts.map +1 -0
  34. package/dist/engine/evaluate.js +377 -0
  35. package/dist/engine/evaluate.js.map +1 -0
  36. package/dist/engine/gate.d.ts +19 -0
  37. package/dist/engine/gate.d.ts.map +1 -0
  38. package/dist/engine/gate.js +47 -0
  39. package/dist/engine/gate.js.map +1 -0
  40. package/dist/engine/loader.d.ts +37 -0
  41. package/dist/engine/loader.d.ts.map +1 -0
  42. package/dist/engine/loader.js +388 -0
  43. package/dist/engine/loader.js.map +1 -0
  44. package/dist/engine/maturity.d.ts +20 -0
  45. package/dist/engine/maturity.d.ts.map +1 -0
  46. package/dist/engine/maturity.js +157 -0
  47. package/dist/engine/maturity.js.map +1 -0
  48. package/dist/engine/score.d.ts +19 -0
  49. package/dist/engine/score.d.ts.map +1 -0
  50. package/dist/engine/score.js +141 -0
  51. package/dist/engine/score.js.map +1 -0
  52. package/dist/engine/sections.d.ts +14 -0
  53. package/dist/engine/sections.d.ts.map +1 -0
  54. package/dist/engine/sections.js +50 -0
  55. package/dist/engine/sections.js.map +1 -0
  56. package/dist/evolution/benchmark.d.ts +12 -0
  57. package/dist/evolution/benchmark.d.ts.map +1 -0
  58. package/dist/evolution/benchmark.js +107 -0
  59. package/dist/evolution/benchmark.js.map +1 -0
  60. package/dist/evolution/capability.d.ts +22 -0
  61. package/dist/evolution/capability.d.ts.map +1 -0
  62. package/dist/evolution/capability.js +69 -0
  63. package/dist/evolution/capability.js.map +1 -0
  64. package/dist/evolution/coverage.d.ts +15 -0
  65. package/dist/evolution/coverage.d.ts.map +1 -0
  66. package/dist/evolution/coverage.js +65 -0
  67. package/dist/evolution/coverage.js.map +1 -0
  68. package/dist/evolution/gap.d.ts +10 -0
  69. package/dist/evolution/gap.d.ts.map +1 -0
  70. package/dist/evolution/gap.js +52 -0
  71. package/dist/evolution/gap.js.map +1 -0
  72. package/dist/evolution/propose.d.ts +50 -0
  73. package/dist/evolution/propose.d.ts.map +1 -0
  74. package/dist/evolution/propose.js +188 -0
  75. package/dist/evolution/propose.js.map +1 -0
  76. package/dist/evolution/queue.d.ts +64 -0
  77. package/dist/evolution/queue.d.ts.map +1 -0
  78. package/dist/evolution/queue.js +192 -0
  79. package/dist/evolution/queue.js.map +1 -0
  80. package/dist/evolution/release.d.ts +11 -0
  81. package/dist/evolution/release.d.ts.map +1 -0
  82. package/dist/evolution/release.js +55 -0
  83. package/dist/evolution/release.js.map +1 -0
  84. package/dist/evolution/run.d.ts +88 -0
  85. package/dist/evolution/run.d.ts.map +1 -0
  86. package/dist/evolution/run.js +258 -0
  87. package/dist/evolution/run.js.map +1 -0
  88. package/dist/evolution/schedule.d.ts +59 -0
  89. package/dist/evolution/schedule.d.ts.map +1 -0
  90. package/dist/evolution/schedule.js +77 -0
  91. package/dist/evolution/schedule.js.map +1 -0
  92. package/dist/evolution/types.d.ts +174 -0
  93. package/dist/evolution/types.d.ts.map +1 -0
  94. package/dist/evolution/types.js +8 -0
  95. package/dist/evolution/types.js.map +1 -0
  96. package/dist/index.d.ts +36 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +30 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/learn/index.d.ts +27 -0
  101. package/dist/learn/index.d.ts.map +1 -0
  102. package/dist/learn/index.js +196 -0
  103. package/dist/learn/index.js.map +1 -0
  104. package/dist/report/markdown.d.ts +16 -0
  105. package/dist/report/markdown.d.ts.map +1 -0
  106. package/dist/report/markdown.js +488 -0
  107. package/dist/report/markdown.js.map +1 -0
  108. package/dist/snapshot/index.d.ts +55 -0
  109. package/dist/snapshot/index.d.ts.map +1 -0
  110. package/dist/snapshot/index.js +76 -0
  111. package/dist/snapshot/index.js.map +1 -0
  112. package/dist/store/index.d.ts +31 -0
  113. package/dist/store/index.d.ts.map +1 -0
  114. package/dist/store/index.js +69 -0
  115. package/dist/store/index.js.map +1 -0
  116. package/dist/types.d.ts +287 -0
  117. package/dist/types.d.ts.map +1 -0
  118. package/dist/types.js +16 -0
  119. package/dist/types.js.map +1 -0
  120. package/dist/util/glob.d.ts +11 -0
  121. package/dist/util/glob.d.ts.map +1 -0
  122. package/dist/util/glob.js +86 -0
  123. package/dist/util/glob.js.map +1 -0
  124. package/dist/util/project.d.ts +90 -0
  125. package/dist/util/project.d.ts.map +1 -0
  126. package/dist/util/project.js +636 -0
  127. package/dist/util/project.js.map +1 -0
  128. package/dist/util/yaml.d.ts +28 -0
  129. package/dist/util/yaml.d.ts.map +1 -0
  130. package/dist/util/yaml.js +48 -0
  131. package/dist/util/yaml.js.map +1 -0
  132. package/package.json +94 -0
  133. package/rules/core/architecture.yaml +190 -0
  134. package/rules/core/cicd.yaml +212 -0
  135. package/rules/core/code-quality.yaml +261 -0
  136. package/rules/core/dependencies.yaml +132 -0
  137. package/rules/core/documentation.yaml +119 -0
  138. package/rules/core/future-readiness.yaml +91 -0
  139. package/rules/core/release.yaml +131 -0
  140. package/rules/core/repo.yaml +313 -0
  141. package/rules/core/security.yaml +496 -0
  142. package/rules/core/supply-chain.yaml +357 -0
  143. package/rules/core/testing.yaml +266 -0
  144. package/rules/detectors.yaml +2028 -0
  145. package/rules/index.yaml +42 -0
  146. package/rules/profiles/maturity.yaml +135 -0
  147. package/rules/stacks/ai-era.yaml +193 -0
  148. package/rules/stacks/api-backend.yaml +121 -0
  149. package/rules/stacks/cli.yaml +105 -0
  150. package/rules/stacks/compliance.yaml +157 -0
  151. package/rules/stacks/containers.yaml +124 -0
  152. package/rules/stacks/data.yaml +165 -0
  153. package/rules/stacks/go.yaml +134 -0
  154. package/rules/stacks/iac.yaml +128 -0
  155. package/rules/stacks/jvm.yaml +150 -0
  156. package/rules/stacks/ml-ai.yaml +140 -0
  157. package/rules/stacks/mobile.yaml +121 -0
  158. package/rules/stacks/node-typescript.yaml +166 -0
  159. package/rules/stacks/python.yaml +175 -0
  160. package/rules/stacks/rust.yaml +129 -0
  161. package/rules/stacks/solidity.yaml +139 -0
  162. package/rules/stacks/swift.yaml +100 -0
  163. package/rules/stacks/web-frontend.yaml +159 -0
@@ -0,0 +1,377 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { DEFAULT_WEIGHT } from './loader.js';
3
+ /* ------------------------------------------------------------ applicability */
4
+ export function evalPredicate(p, facts) {
5
+ if (!p)
6
+ return true;
7
+ // Programmatic callers can hand us anything (the loader validates
8
+ // file-loaded packs and warns). Malformed applicability fails closed —
9
+ // a rule no one can parse must not silently apply to every repo.
10
+ if (typeof p !== 'object')
11
+ return false;
12
+ if (Object.keys(p).length === 0)
13
+ return true;
14
+ return evalPredicateKeys(p, facts);
15
+ }
16
+ function evalPredicateKeys(p, facts) {
17
+ if ('all' in p && Array.isArray(p.all))
18
+ return p.all.every((x) => evalPredicate(x, facts));
19
+ if ('any' in p && Array.isArray(p.any))
20
+ return p.any.some((x) => evalPredicate(x, facts));
21
+ if ('not' in p && p.not)
22
+ return !evalPredicate(p.not, facts);
23
+ if ('fact' in p && typeof p.fact === 'string')
24
+ return evalFact(p, facts);
25
+ return false;
26
+ }
27
+ /** One predicate operator per entry — adding an operator means adding a line. */
28
+ const OP_HANDLERS = {
29
+ absent: (o) => (o.isMetric ? o.metric === undefined : !o.present),
30
+ exists: (o) => (o.isMetric ? o.metric !== undefined : o.present),
31
+ eq: (o) => (o.isMetric ? o.metric === Number(o.value) : o.present === Boolean(o.value)),
32
+ neq: (o) => (o.isMetric ? o.metric !== Number(o.value) : o.present !== Boolean(o.value)),
33
+ in: (o) => {
34
+ // Membership only means something for metric facts (numbers). Flag facts
35
+ // are presence-only — there is no value to test membership against.
36
+ if (!o.isMetric || !Array.isArray(o.value))
37
+ return false;
38
+ return o.value.some((v) => v === o.metric || String(v) === String(o.metric ?? ''));
39
+ },
40
+ includes: (o) => {
41
+ // Same contract as `in`: the metric value must appear in the listed
42
+ // values. Presence alone never satisfies a value comparison.
43
+ if (!o.isMetric || !Array.isArray(o.value))
44
+ return false;
45
+ return o.value.some((v) => v === o.metric || String(v) === String(o.metric ?? ''));
46
+ },
47
+ gt: (o) => typeof o.metric === 'number' && o.metric > Number(o.value ?? 0),
48
+ lt: (o) => typeof o.metric === 'number' && o.metric < Number(o.value ?? 0),
49
+ matches: (o) => {
50
+ if (typeof o.value !== 'string')
51
+ return false;
52
+ try {
53
+ return new RegExp(o.value).test(String(o.metric ?? ''));
54
+ }
55
+ catch {
56
+ // Invalid regex fails closed; the loader warns at pack load time.
57
+ return false;
58
+ }
59
+ },
60
+ };
61
+ function evalFact(p, facts) {
62
+ const { fact, op = 'exists', value } = p;
63
+ const isMetric = fact.startsWith('metric:');
64
+ const key = isMetric ? fact.slice('metric:'.length) : fact;
65
+ // Unknown operators fail closed (rule skipped), never silently applied.
66
+ // The loader warns at pack load time; this is the programmatic-API backstop.
67
+ const handler = OP_HANDLERS[op] ?? (() => false);
68
+ return handler({
69
+ isMetric,
70
+ present: facts.flags.has(fact),
71
+ metric: facts.metrics[key],
72
+ value,
73
+ });
74
+ }
75
+ export function ruleApplies(rule, facts, depth, includeAll = false) {
76
+ // Forced packs apply wholesale — that is the documented contract of
77
+ // `include` ("always load, even if appliesWhen says no"). Depth *and*
78
+ // applicability are both bypassed when the operator forces a pack on.
79
+ if (includeAll)
80
+ return true;
81
+ if (rule.depths && rule.depths.length > 0 && !rule.depths.includes(depth)) {
82
+ return false;
83
+ }
84
+ return evalPredicate(rule.appliesWhen, facts);
85
+ }
86
+ export function packApplies(pack, facts) {
87
+ return evalPredicate(pack.skipWhen ? { not: pack.skipWhen } : undefined, facts);
88
+ }
89
+ /* -------------------------------------------------------------- evaluation */
90
+ export function evaluateRule(rule, ctx) {
91
+ const base = {
92
+ ruleId: rule.id,
93
+ title: rule.title,
94
+ section: rule.section,
95
+ sectionTitle: rule.sectionTitle ?? rule.section,
96
+ baseSeverity: rule.severity,
97
+ ruleClass: rule.ruleClass,
98
+ why: rule.why,
99
+ evidenceHint: rule.evidence,
100
+ remediation: rule.remediation,
101
+ references: rule.references,
102
+ };
103
+ if (ctx.disabled.has(rule.id)) {
104
+ return {
105
+ ...base,
106
+ status: 'NOT_APPLICABLE',
107
+ severity: rule.severity,
108
+ dampened: false,
109
+ message: 'Disabled by project configuration.',
110
+ locations: [],
111
+ };
112
+ }
113
+ const suppressed = ctx.suppressions.get(rule.id);
114
+ const { status, message, locations } = runCheck(rule, ctx, rule.check);
115
+ const finding = {
116
+ ...base,
117
+ status,
118
+ severity: rule.severity,
119
+ dampened: false,
120
+ message,
121
+ locations,
122
+ };
123
+ if (suppressed && status !== 'PASS' && status !== 'NOT_APPLICABLE') {
124
+ finding.suppressedReason = suppressed;
125
+ }
126
+ return finding;
127
+ }
128
+ function missingOutcome(detail) {
129
+ return { status: 'MISSING', message: `Not detected — ${detail}.`, locations: [] };
130
+ }
131
+ function passOutcome(detail, locations = []) {
132
+ return { status: 'PASS', message: `Verified — ${detail}.`, locations };
133
+ }
134
+ function unknownOutcome(message) {
135
+ return { status: 'UNKNOWN', message, locations: [] };
136
+ }
137
+ function queryGrep(project, check) {
138
+ return project.grep(check.pattern, check.include, check.exclude ?? [], check.flags ?? '');
139
+ }
140
+ function checkManual(_check, _h) {
141
+ return unknownOutcome('Requires judgement — no automated evidence recorded.');
142
+ }
143
+ function checkInfo(_check, _h) {
144
+ return { status: 'NOT_APPLICABLE', message: 'Context only.', locations: [] };
145
+ }
146
+ function checkFileExists(check, h) {
147
+ const found = check.files.flatMap((f) => h.project.glob([f]));
148
+ if (found.length === 0)
149
+ return h.missing(`none of [${check.files.join(', ')}] found`);
150
+ return h.pass(`found ${found.slice(0, 5).join(', ')}`, found.slice(0, 5).map(toLocation));
151
+ }
152
+ function checkFileAbsent(check, h) {
153
+ const found = check.files.flatMap((f) => h.project.glob([f]));
154
+ if (found.length === 0)
155
+ return h.pass(`none of [${check.files.join(', ')}] present`);
156
+ return {
157
+ status: 'FAIL',
158
+ message: `${found.length} forbidden path(s) present: ${found.slice(0, 5).join(', ')}.`,
159
+ locations: found.slice(0, 5).map(toLocation),
160
+ };
161
+ }
162
+ function checkAnyFile(check, h) {
163
+ const found = h.project.glob(check.patterns);
164
+ if (found.length === 0)
165
+ return h.missing(`no files matching ${check.patterns.join(', ')}`);
166
+ return h.pass(`${found.length} file(s) matching ${check.patterns.join(', ')}`, found.slice(0, 5).map(toLocation));
167
+ }
168
+ function checkGrepPresent(check, h) {
169
+ const hits = queryGrep(h.project, check);
170
+ if (hits.length === 0)
171
+ return h.missing(`pattern not found in ${check.include.join(', ')}`);
172
+ return h.pass(`${hits.length} match(es)`, toLocations(hits));
173
+ }
174
+ function checkGrepAbsent(check, h) {
175
+ const hits = queryGrep(h.project, check);
176
+ if (hits.length === 0)
177
+ return h.pass(`no matches in ${check.include.join(', ')}`);
178
+ return {
179
+ status: 'FAIL',
180
+ message: `${hits.length} occurrence(s)${describedBy(hits)}`,
181
+ locations: toLocations(hits),
182
+ };
183
+ }
184
+ function checkGrepWrong(check, h) {
185
+ const hits = queryGrep(h.project, check);
186
+ if (hits.length === 0)
187
+ return h.pass(`no incorrect usage of \`${trimPattern(check.pattern)}\``);
188
+ return {
189
+ status: 'WRONG',
190
+ message: `${hits.length} instance(s) of an incorrect implementation${describedBy(hits)}`,
191
+ locations: toLocations(hits),
192
+ };
193
+ }
194
+ function checkGrepDeprecated(check, h) {
195
+ const hits = queryGrep(h.project, check);
196
+ if (hits.length === 0)
197
+ return h.pass('no deprecated usage detected');
198
+ return {
199
+ status: 'DEPRECATED',
200
+ message: `${hits.length} deprecated usage(s) detected.`,
201
+ locations: toLocations(hits),
202
+ };
203
+ }
204
+ function checkFileLinesMax(check, h) {
205
+ const offenders = [];
206
+ for (const file of h.project.glob(check.patterns)) {
207
+ const text = h.project.read(file);
208
+ if (text === null)
209
+ continue;
210
+ const lines = text.split('\n').length;
211
+ if (lines > check.max_lines)
212
+ offenders.push({ file, excerpt: `${lines} lines` });
213
+ }
214
+ if (offenders.length === 0) {
215
+ return h.pass(`no file over ${check.max_lines} lines`);
216
+ }
217
+ // A god object is a violation (FAIL, 0 credit), not a partial
218
+ // implementation: WRONG would award 0.15 credit for failing modularity.
219
+ return {
220
+ status: 'FAIL',
221
+ message: `${offenders.length} file(s) exceed ${check.max_lines} lines — likely god objects.`,
222
+ locations: offenders.slice(0, 8),
223
+ };
224
+ }
225
+ function checkTrackedPresent(check, h) {
226
+ const found = h.project.trackedGlob(check.patterns);
227
+ if (found.length === 0)
228
+ return h.missing(`nothing matching ${check.patterns.join(', ')} is tracked by git`);
229
+ return h.pass(`${found.length} tracked file(s)`, found.slice(0, 5).map(toLocation));
230
+ }
231
+ function checkTrackedAbsent(check, h) {
232
+ const found = h.project.trackedGlob(check.patterns);
233
+ if (found.length === 0)
234
+ return h.pass(`no tracked files matching ${check.patterns.join(', ')}`);
235
+ return {
236
+ status: 'FAIL',
237
+ message: `${found.length} tracked file(s) should not be committed: ${found.slice(0, 5).join(', ')}.`,
238
+ locations: found.slice(0, 5).map(toLocation),
239
+ };
240
+ }
241
+ function checkJsonPath(check, h) {
242
+ const files = h.project.glob([check.file]);
243
+ if (files.length === 0)
244
+ return h.missing(`${check.file} not found`);
245
+ const json = h.project.readJson(files[0]);
246
+ if (json === null)
247
+ return h.missing(`${check.file} unreadable`);
248
+ const value = resolvePath(json, check.path);
249
+ if (value === undefined)
250
+ return h.missing(`\`${check.path}\` not set in ${check.file}`);
251
+ if (check.equals !== undefined && value !== check.equals) {
252
+ return {
253
+ status: 'WRONG',
254
+ message: `\`${check.path}\` is ${JSON.stringify(value)}, expected ${JSON.stringify(check.equals)}.`,
255
+ locations: [toLocation(files[0])],
256
+ };
257
+ }
258
+ return h.pass(`\`${check.path}\` is ${JSON.stringify(value)}`, [toLocation(files[0])]);
259
+ }
260
+ function checkCountMin(check, h) {
261
+ const n = h.project.count(check.patterns);
262
+ if (n >= check.min)
263
+ return h.pass(`${n} file(s), threshold ${check.min}`);
264
+ // Below threshold means required files are absent — MISSING, not FAIL.
265
+ // FAIL is a violated condition; MISSING is an absent one (see types.ts).
266
+ return h.missing(`Found ${n} file(s) matching ${check.patterns.join(', ')} — expected at least ${check.min}.`);
267
+ }
268
+ function runShellCheck(project, run, expected, pass) {
269
+ try {
270
+ // NOTE: pack-supplied shell runs synchronously in the audit loop with a
271
+ // 60 s timeout and a 10 MB output cap. Pack authors get arbitrary shell
272
+ // by design (opt-in via --allow-commands, UNKNOWN otherwise) — review
273
+ // third-party packs like production dependencies before enabling.
274
+ const out = execFileSync('sh', ['-c', run], {
275
+ cwd: project.root,
276
+ encoding: 'utf8',
277
+ timeout: 60_000,
278
+ maxBuffer: 10 * 1024 * 1024,
279
+ stdio: ['ignore', 'pipe', 'pipe'],
280
+ }).trim();
281
+ if (expected === 0) {
282
+ return pass(`\`${run}\` succeeded${out ? `: ${truncate(out.replace(/\s+/g, ' '), 160)}` : ''}`);
283
+ }
284
+ return {
285
+ status: 'FAIL',
286
+ message: `\`${run}\` exited 0 but ${expected} was expected.`,
287
+ locations: [],
288
+ };
289
+ }
290
+ catch (err) {
291
+ if (expected !== 0)
292
+ return pass(`\`${run}\` exited non-zero as expected`);
293
+ const detail = err instanceof Error ? truncate(err.message.replace(/\s+/g, ' '), 200) : '';
294
+ return {
295
+ status: 'FAIL',
296
+ message: `\`${run}\` failed${detail ? `: ${detail}` : ''}.`,
297
+ locations: [],
298
+ };
299
+ }
300
+ }
301
+ function checkCommand(check, h) {
302
+ if (!h.allowCommands) {
303
+ return unknownOutcome('Shell check skipped (enable with --allow-commands).');
304
+ }
305
+ return runShellCheck(h.project, check.run, check.expect_exit ?? 0, h.pass);
306
+ }
307
+ /** One check kind per entry — adding a kind means adding a line, not a branch. */
308
+ const CHECK_HANDLERS = {
309
+ manual: checkManual,
310
+ info: checkInfo,
311
+ file_exists: checkFileExists,
312
+ file_absent: checkFileAbsent,
313
+ any_file: checkAnyFile,
314
+ grep_present: checkGrepPresent,
315
+ grep_absent: checkGrepAbsent,
316
+ grep_wrong: checkGrepWrong,
317
+ grep_deprecated: checkGrepDeprecated,
318
+ file_lines_max: checkFileLinesMax,
319
+ tracked_present: checkTrackedPresent,
320
+ tracked_absent: checkTrackedAbsent,
321
+ json_path: checkJsonPath,
322
+ count_min: checkCountMin,
323
+ command: checkCommand,
324
+ };
325
+ function runCheck(_rule, ctx, check) {
326
+ const h = {
327
+ project: ctx.project,
328
+ allowCommands: ctx.allowCommands,
329
+ missing: missingOutcome,
330
+ pass: passOutcome,
331
+ };
332
+ const handler = CHECK_HANDLERS[check.kind];
333
+ return handler(check, h);
334
+ }
335
+ /* ----------------------------------------------------------------- helpers */
336
+ function toLocation(file) {
337
+ return { file };
338
+ }
339
+ function toLocations(hits) {
340
+ return hits.slice(0, 8).map((h) => ({ file: h.file, line: h.line, excerpt: h.excerpt }));
341
+ }
342
+ /**
343
+ * "…: `api_key: '...'` at src/config.js:3" — the line that actually tripped
344
+ * the rule, not the regex. A report that quotes its own pattern tells the
345
+ * reader nothing they can act on.
346
+ */
347
+ function describedBy(hits) {
348
+ const first = hits[0];
349
+ if (!first)
350
+ return '.';
351
+ const excerpt = truncate(first.excerpt.trim(), 80);
352
+ const more = hits.length > 1 ? ` (+${hits.length - 1} more)` : '';
353
+ return `: \`${excerpt}\` at ${first.file}:${first.line}${more}.`;
354
+ }
355
+ function truncate(s, n) {
356
+ return s.length <= n ? s : `${s.slice(0, n - 1)}…`;
357
+ }
358
+ function trimPattern(p) {
359
+ return p.length <= 70 ? p : `${p.slice(0, 69)}…`;
360
+ }
361
+ export function resolvePath(obj, dotted) {
362
+ let cur = obj;
363
+ for (const key of dotted.split('.')) {
364
+ if (cur === null || typeof cur !== 'object')
365
+ return undefined;
366
+ cur = cur[key];
367
+ }
368
+ return cur;
369
+ }
370
+ /** Effective weight of a rule: explicit override, else the severity default. */
371
+ export function ruleWeight(rule) {
372
+ return rule.weight ?? DEFAULT_WEIGHT[rule.severity];
373
+ }
374
+ export function severityRank(s) {
375
+ return { FUTURE: 0, LOW: 1, MEDIUM: 2, HIGH: 3, CRITICAL: 4 }[s];
376
+ }
377
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/engine/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AuditReport, Finding, Severity } from '../types.js';
2
+ /**
3
+ * Findings that should block a build: anything at or above `threshold` that is
4
+ * neither passing, unverified, nor explicitly accepted by project policy.
5
+ *
6
+ * Suppressed findings never block — that is the entire point of recording an
7
+ * accepted risk in `.usa.yaml`. UNKNOWN never blocks either: "needs a human"
8
+ * is not "failed", and gating on it would make every manual rule a CI failure.
9
+ */
10
+ export declare function blockingFindings(report: AuditReport, threshold: Severity): Finding[];
11
+ /**
12
+ * `--fail-on` gate. Returns a process exit code.
13
+ *
14
+ * The ladder is ascending (`FUTURE` … `CRITICAL`), so "at or above" means
15
+ * *higher* index. Getting this backwards makes `--fail-on critical` fail on
16
+ * every finding in the report, which is a memorable way to lose a CI pipeline.
17
+ */
18
+ export declare function evaluateGate(report: AuditReport, failOn: string, quiet: boolean): number;
19
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/engine/gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGlE;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO,EAAE,CAUpF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAuBxF"}
@@ -0,0 +1,47 @@
1
+ import { SEVERITY_LADDER } from './loader.js';
2
+ /**
3
+ * Findings that should block a build: anything at or above `threshold` that is
4
+ * neither passing, unverified, nor explicitly accepted by project policy.
5
+ *
6
+ * Suppressed findings never block — that is the entire point of recording an
7
+ * accepted risk in `.usa.yaml`. UNKNOWN never blocks either: "needs a human"
8
+ * is not "failed", and gating on it would make every manual rule a CI failure.
9
+ */
10
+ export function blockingFindings(report, threshold) {
11
+ const open = report.findings.filter((f) => f.status !== 'PASS' &&
12
+ f.status !== 'NOT_APPLICABLE' &&
13
+ f.status !== 'UNKNOWN' &&
14
+ !f.suppressedReason);
15
+ const min = SEVERITY_LADDER.indexOf(threshold);
16
+ return open.filter((f) => SEVERITY_LADDER.indexOf(f.severity) >= min);
17
+ }
18
+ /**
19
+ * `--fail-on` gate. Returns a process exit code.
20
+ *
21
+ * The ladder is ascending (`FUTURE` … `CRITICAL`), so "at or above" means
22
+ * *higher* index. Getting this backwards makes `--fail-on critical` fail on
23
+ * every finding in the report, which is a memorable way to lose a CI pipeline.
24
+ */
25
+ export function evaluateGate(report, failOn, quiet) {
26
+ if (failOn === 'none')
27
+ return 0;
28
+ const threshold = failOn.toUpperCase();
29
+ if (!SEVERITY_LADDER.includes(threshold)) {
30
+ console.error(`--fail-on must be none or one of ${[...SEVERITY_LADDER].reverse().join('|').toLowerCase()}`);
31
+ return 2;
32
+ }
33
+ const blocking = blockingFindings(report, threshold);
34
+ if (blocking.length === 0)
35
+ return 0;
36
+ if (!quiet) {
37
+ console.error(`\nGate failed: ${blocking.length} finding(s) at or above ${threshold}.`);
38
+ for (const f of blocking.slice(0, 10)) {
39
+ const where = f.locations[0] ? ` (${f.locations[0].file}:${f.locations[0].line})` : '';
40
+ console.error(` ${f.severity.padEnd(8)} ${f.ruleId} ${f.title}${where}`);
41
+ }
42
+ if (blocking.length > 10)
43
+ console.error(` … and ${blocking.length - 10} more`);
44
+ }
45
+ return 1;
46
+ }
47
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/engine/gate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB,EAAE,SAAmB;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,KAAK,MAAM;QACnB,CAAC,CAAC,MAAM,KAAK,gBAAgB;QAC7B,CAAC,CAAC,MAAM,KAAK,SAAS;QACtB,CAAC,CAAC,CAAC,gBAAgB,CACtB,CAAC;IACF,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB,EAAE,MAAc,EAAE,KAAc;IAC9E,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAEhC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAc,CAAC;IACnD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CACX,oCAAoC,CAAC,GAAG,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAC7F,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,2BAA2B,SAAS,GAAG,CAAC,CAAC;QACxF,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,CAAC,KAAK,CAAC,WAAW,QAAQ,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { RuleClass, RulePack, Severity } from '../types.js';
2
+ export declare const SEVERITY_LADDER: Severity[];
3
+ export declare const RULE_CLASSES: RuleClass[];
4
+ export declare const DEFAULT_WEIGHT: Record<Severity, number>;
5
+ export interface LoaderResult {
6
+ packs: RulePack[];
7
+ warnings: string[];
8
+ }
9
+ /**
10
+ * Load a single pack file (not the registry). Used by the evolution CLI to load
11
+ * a candidate capability pack that is *not* (yet) in `rules/index.yaml`.
12
+ */
13
+ export declare function loadPackFile(file: string): {
14
+ pack: RulePack | null;
15
+ warnings: string[];
16
+ };
17
+ /** Read `rules/index.yaml` and every pack it references. */
18
+ export declare function loadRulePacks(rulesDir: string): LoaderResult;
19
+ /**
20
+ * Parse a rule pack from YAML text in memory. Shared by the file loader and the
21
+ * evolution proposal stage, which renders a candidate pack (from the bootstrap
22
+ * catalog) without ever touching the checked-in registry. `sourceName` is only
23
+ * used in warnings and as the fallback pack id.
24
+ */
25
+ export declare function parsePackText(text: string, sourceName: string, seenRuleIds?: Map<string, string>, warnings?: string[]): RulePack | null;
26
+ /**
27
+ * `applies_when` is author-controlled input to the audit hot loop. An unknown
28
+ * key, a non-list `all`/`any`, or an uncompilable `matches` regex must warn at
29
+ * load time, because evaluation fails closed (rule skipped) on all of them.
30
+ */
31
+ export declare function validatePredicate(p: unknown, where: string, warnings: string[]): void;
32
+ /** Merge config-driven rule overrides onto loaded packs. */
33
+ export declare function applyRuleOverrides(packs: RulePack[], overrides: Record<string, {
34
+ severity?: Severity;
35
+ weight?: number;
36
+ }>): void;
37
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/engine/loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAsB,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAErF,eAAO,MAAM,eAAe,EAAE,QAAQ,EAAoD,CAAC;AAC3F,eAAO,MAAM,YAAY,EAAE,SAAS,EAUnC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAMnD,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAKxF;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CA2B5D;AA4CD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa,EAC5C,QAAQ,GAAE,MAAM,EAAO,GACtB,QAAQ,GAAG,IAAI,CA8CjB;AAqKD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAWrF;AAgFD,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,QAAQ,EAAE,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAClE,IAAI,CASN"}