@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
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* USAT — Universal Software Audit Template
|
|
3
|
+
* Core type definitions.
|
|
4
|
+
*
|
|
5
|
+
* Design note: USAT deliberately separates two orthogonal axes that most audit
|
|
6
|
+
* checklists conflate:
|
|
7
|
+
*
|
|
8
|
+
* SEVERITY = how bad it is *if this rule is violated* (impact).
|
|
9
|
+
* STATUS = what the audit actually observed (outcome).
|
|
10
|
+
*
|
|
11
|
+
* The emoji tags in USAT.md map onto these two axes (see `TAG_TABLE`) so the
|
|
12
|
+
* report still reads like a classic severity-tagged audit while the underlying
|
|
13
|
+
* model stays machine-checkable and scoreable.
|
|
14
|
+
*/
|
|
15
|
+
/** Impact axis — attached to a rule, meaning "severity when violated". */
|
|
16
|
+
export type Severity = 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | 'FUTURE';
|
|
17
|
+
/** Outcome axis — what the engine or the agent observed. */
|
|
18
|
+
export type Status = 'PASS' | 'FAIL' | 'WRONG' | 'MISSING' | 'DEPRECATED' | 'EXPERIMENTAL' | 'UNKNOWN' | 'NOT_APPLICABLE';
|
|
19
|
+
/** Why a rule exists — used by maturity profiles to decide what may be relaxed. */
|
|
20
|
+
export type RuleClass = 'security' | 'supply-chain' | 'correctness' | 'maintainability' | 'operations' | 'performance' | 'compliance' | 'documentation' | 'style';
|
|
21
|
+
/** How thorough the audit should be. */
|
|
22
|
+
export type Depth = 'quick' | 'standard' | 'deep';
|
|
23
|
+
/** Lifecycle stage — drives maturity-aware severity dampening. */
|
|
24
|
+
export type Maturity = 'prototype' | 'mvp' | 'beta' | 'production' | 'legacy';
|
|
25
|
+
export interface Location {
|
|
26
|
+
file: string;
|
|
27
|
+
line?: number;
|
|
28
|
+
excerpt?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface Finding {
|
|
31
|
+
ruleId: string;
|
|
32
|
+
title: string;
|
|
33
|
+
section: string;
|
|
34
|
+
sectionTitle: string;
|
|
35
|
+
/** Severity after the maturity profile has been applied. */
|
|
36
|
+
severity: Severity;
|
|
37
|
+
/** Severity declared by the rule pack, before dampening. */
|
|
38
|
+
baseSeverity: Severity;
|
|
39
|
+
status: Status;
|
|
40
|
+
ruleClass: RuleClass;
|
|
41
|
+
/** True when the finding was downgraded by the maturity profile. */
|
|
42
|
+
dampened: boolean;
|
|
43
|
+
message: string;
|
|
44
|
+
locations: Location[];
|
|
45
|
+
/** Why the rule exists — surfaces in the judgement queue. */
|
|
46
|
+
why?: string;
|
|
47
|
+
/** What the agent/human must produce to resolve a judgement call. */
|
|
48
|
+
evidenceHint?: string;
|
|
49
|
+
remediation?: string;
|
|
50
|
+
references?: string[];
|
|
51
|
+
/** Set when a project-level suppression (`nack:`) hid this finding. */
|
|
52
|
+
suppressedReason?: string;
|
|
53
|
+
}
|
|
54
|
+
export type Predicate = {
|
|
55
|
+
all: Predicate[];
|
|
56
|
+
} | {
|
|
57
|
+
any: Predicate[];
|
|
58
|
+
} | {
|
|
59
|
+
not: Predicate;
|
|
60
|
+
} | {
|
|
61
|
+
fact: string;
|
|
62
|
+
op?: FactOp;
|
|
63
|
+
value?: string | number | string[];
|
|
64
|
+
};
|
|
65
|
+
export type FactOp = 'exists' | 'absent' | 'eq' | 'neq' | 'in' | 'includes' | 'gt' | 'lt' | 'matches';
|
|
66
|
+
export type Check = {
|
|
67
|
+
kind: 'manual';
|
|
68
|
+
}
|
|
69
|
+
/** PASS when at least one of `files` exists. */
|
|
70
|
+
| {
|
|
71
|
+
kind: 'file_exists';
|
|
72
|
+
files: string[];
|
|
73
|
+
}
|
|
74
|
+
/** PASS when none of `files` exist (fail → MISSING/FAIL). */
|
|
75
|
+
| {
|
|
76
|
+
kind: 'file_absent';
|
|
77
|
+
files: string[];
|
|
78
|
+
}
|
|
79
|
+
/** PASS when at least one file matches `patterns`. */
|
|
80
|
+
| {
|
|
81
|
+
kind: 'any_file';
|
|
82
|
+
patterns: string[];
|
|
83
|
+
}
|
|
84
|
+
/** PASS when `pattern` is found in the scanned files. */
|
|
85
|
+
| {
|
|
86
|
+
kind: 'grep_present';
|
|
87
|
+
pattern: string;
|
|
88
|
+
include: string[];
|
|
89
|
+
exclude?: string[];
|
|
90
|
+
flags?: string;
|
|
91
|
+
}
|
|
92
|
+
/** PASS when `pattern` is NOT found. Any hit is a FAIL with a location. */
|
|
93
|
+
| {
|
|
94
|
+
kind: 'grep_absent';
|
|
95
|
+
pattern: string;
|
|
96
|
+
include: string[];
|
|
97
|
+
exclude?: string[];
|
|
98
|
+
flags?: string;
|
|
99
|
+
}
|
|
100
|
+
/** Any hit is ⚠️ WRONG — present but implemented incorrectly. */
|
|
101
|
+
| {
|
|
102
|
+
kind: 'grep_wrong';
|
|
103
|
+
pattern: string;
|
|
104
|
+
include: string[];
|
|
105
|
+
exclude?: string[];
|
|
106
|
+
flags?: string;
|
|
107
|
+
}
|
|
108
|
+
/** Any hit is 💀 DEPRECATED — present but EOL / abandoned. */
|
|
109
|
+
| {
|
|
110
|
+
kind: 'grep_deprecated';
|
|
111
|
+
pattern: string;
|
|
112
|
+
include: string[];
|
|
113
|
+
exclude?: string[];
|
|
114
|
+
flags?: string;
|
|
115
|
+
}
|
|
116
|
+
/** PASS when `path` resolves in the JSON file (`equals` optional). */
|
|
117
|
+
| {
|
|
118
|
+
kind: 'json_path';
|
|
119
|
+
file: string;
|
|
120
|
+
path: string;
|
|
121
|
+
equals?: string | number | boolean;
|
|
122
|
+
}
|
|
123
|
+
/** PASS when at least one file matching `patterns` is TRACKED by git. */
|
|
124
|
+
| {
|
|
125
|
+
kind: 'tracked_present';
|
|
126
|
+
patterns: string[];
|
|
127
|
+
}
|
|
128
|
+
/** PASS when NO file matching `patterns` is tracked by git (committed junk). */
|
|
129
|
+
| {
|
|
130
|
+
kind: 'tracked_absent';
|
|
131
|
+
patterns: string[];
|
|
132
|
+
}
|
|
133
|
+
/** PASS when the number of distinct files matching `patterns` >= `min`. */
|
|
134
|
+
| {
|
|
135
|
+
kind: 'count_min';
|
|
136
|
+
patterns: string[];
|
|
137
|
+
min: number;
|
|
138
|
+
}
|
|
139
|
+
/** PASS when no indexed file matching `patterns` exceeds `max_lines`. */
|
|
140
|
+
| {
|
|
141
|
+
kind: 'file_lines_max';
|
|
142
|
+
patterns: string[];
|
|
143
|
+
max_lines: number;
|
|
144
|
+
}
|
|
145
|
+
/** PASS when the command exits with `expect_exit` (default 0). Opt-in. */
|
|
146
|
+
| {
|
|
147
|
+
kind: 'command';
|
|
148
|
+
run: string;
|
|
149
|
+
expect_exit?: number;
|
|
150
|
+
}
|
|
151
|
+
/** Never evaluated — informational context for the reader/agent. */
|
|
152
|
+
| {
|
|
153
|
+
kind: 'info';
|
|
154
|
+
};
|
|
155
|
+
export interface Rule {
|
|
156
|
+
id: string;
|
|
157
|
+
title: string;
|
|
158
|
+
section: string;
|
|
159
|
+
sectionTitle?: string;
|
|
160
|
+
severity: Severity;
|
|
161
|
+
weight?: number;
|
|
162
|
+
ruleClass: RuleClass;
|
|
163
|
+
appliesWhen?: Predicate;
|
|
164
|
+
/** Depths at which the rule participates. Omit = always. */
|
|
165
|
+
depths?: Depth[];
|
|
166
|
+
check: Check;
|
|
167
|
+
/** Why this rule matters — keeps agents from cargo-culting. */
|
|
168
|
+
why?: string;
|
|
169
|
+
/** Required proof. Mandatory for `manual` checks (RULE 4). */
|
|
170
|
+
evidence?: string;
|
|
171
|
+
remediation?: string;
|
|
172
|
+
references?: string[];
|
|
173
|
+
tags?: string[];
|
|
174
|
+
}
|
|
175
|
+
export interface RulePack {
|
|
176
|
+
id: string;
|
|
177
|
+
title: string;
|
|
178
|
+
description?: string;
|
|
179
|
+
version?: string;
|
|
180
|
+
/** Section id this pack primarily contributes to. */
|
|
181
|
+
section?: string;
|
|
182
|
+
sectionTitle?: string;
|
|
183
|
+
/** Facts that, if present, cause the whole pack to be skipped. */
|
|
184
|
+
skipWhen?: Predicate;
|
|
185
|
+
/** Extra facts this pack contributes simply by being loaded. */
|
|
186
|
+
provides?: string[];
|
|
187
|
+
rules: Rule[];
|
|
188
|
+
source?: string;
|
|
189
|
+
}
|
|
190
|
+
export interface Facts {
|
|
191
|
+
/** Set membership facts, e.g. `lang:typescript`, `has:ci`, `maturity:beta`. */
|
|
192
|
+
flags: Set<string>;
|
|
193
|
+
/** Numeric facts, e.g. `commits`, `contributors`, `loc`, `daysSinceCommit`. */
|
|
194
|
+
metrics: Record<string, number>;
|
|
195
|
+
}
|
|
196
|
+
export interface Suppression {
|
|
197
|
+
rule: string;
|
|
198
|
+
reason: string;
|
|
199
|
+
until?: string;
|
|
200
|
+
}
|
|
201
|
+
export interface UsatConfig {
|
|
202
|
+
version: 1;
|
|
203
|
+
/** Override auto-detection: force a maturity stage. */
|
|
204
|
+
maturity?: Maturity;
|
|
205
|
+
/** Rule pack ids to always load, even if `appliesWhen` says no. */
|
|
206
|
+
include?: string[];
|
|
207
|
+
/** Rule pack ids to never load. */
|
|
208
|
+
exclude?: string[];
|
|
209
|
+
/** Per-rule overrides: severity, weight, or full suppression. */
|
|
210
|
+
rules?: Record<string, {
|
|
211
|
+
severity?: Severity;
|
|
212
|
+
weight?: number;
|
|
213
|
+
disabled?: boolean;
|
|
214
|
+
reason?: string;
|
|
215
|
+
}>;
|
|
216
|
+
/** Suppressed findings — must carry a reason (auditable). */
|
|
217
|
+
suppressions?: Suppression[];
|
|
218
|
+
/** Extra globs to ignore while indexing. */
|
|
219
|
+
ignore?: string[];
|
|
220
|
+
/** Extra facts asserted by the operator. */
|
|
221
|
+
facts?: string[];
|
|
222
|
+
/** Restrict the report to these sections. */
|
|
223
|
+
sections?: string[];
|
|
224
|
+
}
|
|
225
|
+
export interface SectionScore {
|
|
226
|
+
id: string;
|
|
227
|
+
title: string;
|
|
228
|
+
/** null when no rule in the section could be resolved automatically. */
|
|
229
|
+
score: number | null;
|
|
230
|
+
weight: number;
|
|
231
|
+
applicable: number;
|
|
232
|
+
resolved: number;
|
|
233
|
+
passed: number;
|
|
234
|
+
failed: number;
|
|
235
|
+
unknown: number;
|
|
236
|
+
/** resolved / applicable — how much of this section the tool could verify. */
|
|
237
|
+
confidence: number;
|
|
238
|
+
}
|
|
239
|
+
export interface ScoreCard {
|
|
240
|
+
overall: number;
|
|
241
|
+
sections: SectionScore[];
|
|
242
|
+
counts: Record<Status, number>;
|
|
243
|
+
severityCounts: Record<Severity, number>;
|
|
244
|
+
/** Share of applicable rules the engine could verify without a human. */
|
|
245
|
+
automationCoverage: number;
|
|
246
|
+
/** Expected score band for the detected maturity stage. */
|
|
247
|
+
expectedBand: [number, number];
|
|
248
|
+
}
|
|
249
|
+
export interface AuditReport {
|
|
250
|
+
schema: 'usat-report-v1';
|
|
251
|
+
generatedAt: string;
|
|
252
|
+
usatVersion: string;
|
|
253
|
+
target: {
|
|
254
|
+
path: string;
|
|
255
|
+
name: string;
|
|
256
|
+
commit?: string;
|
|
257
|
+
ref?: string;
|
|
258
|
+
repoUrl?: string;
|
|
259
|
+
};
|
|
260
|
+
detection: {
|
|
261
|
+
maturity: Maturity;
|
|
262
|
+
maturitySignals: string[];
|
|
263
|
+
projectTypes: string[];
|
|
264
|
+
platforms: string[];
|
|
265
|
+
languages: string[];
|
|
266
|
+
frameworks: string[];
|
|
267
|
+
packageManagers: string[];
|
|
268
|
+
databases: string[];
|
|
269
|
+
flags: string[];
|
|
270
|
+
metrics: Record<string, number>;
|
|
271
|
+
};
|
|
272
|
+
options: {
|
|
273
|
+
depth: Depth;
|
|
274
|
+
profile: Maturity | 'auto';
|
|
275
|
+
rulesDir: string;
|
|
276
|
+
packsLoaded: string[];
|
|
277
|
+
packsSkipped: string[];
|
|
278
|
+
};
|
|
279
|
+
score: ScoreCard;
|
|
280
|
+
findings: Finding[];
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* USAT — Universal Software Audit Template
|
|
3
|
+
* Core type definitions.
|
|
4
|
+
*
|
|
5
|
+
* Design note: USAT deliberately separates two orthogonal axes that most audit
|
|
6
|
+
* checklists conflate:
|
|
7
|
+
*
|
|
8
|
+
* SEVERITY = how bad it is *if this rule is violated* (impact).
|
|
9
|
+
* STATUS = what the audit actually observed (outcome).
|
|
10
|
+
*
|
|
11
|
+
* The emoji tags in USAT.md map onto these two axes (see `TAG_TABLE`) so the
|
|
12
|
+
* report still reads like a classic severity-tagged audit while the underlying
|
|
13
|
+
* model stays machine-checkable and scoreable.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal, dependency-free glob matching.
|
|
3
|
+
* Supports: `**`, `*`, `?`, `{a,b}` alternation, and `[abc]` character classes.
|
|
4
|
+
* Enough for rule packs; avoids pulling in a glob dependency.
|
|
5
|
+
*/
|
|
6
|
+
export declare function globToRegExp(glob: string): RegExp;
|
|
7
|
+
export declare function matchesGlob(path: string, glob: string): boolean;
|
|
8
|
+
export declare function matchesAny(path: string, globs: string[]): boolean;
|
|
9
|
+
/** A glob that looks like it targets a literal path (no magic chars). */
|
|
10
|
+
export declare function isLiteralPath(glob: string): boolean;
|
|
11
|
+
//# sourceMappingURL=glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/util/glob.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOjD;AAkED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjE;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal, dependency-free glob matching.
|
|
3
|
+
* Supports: `**`, `*`, `?`, `{a,b}` alternation, and `[abc]` character classes.
|
|
4
|
+
* Enough for rule packs; avoids pulling in a glob dependency.
|
|
5
|
+
*/
|
|
6
|
+
const GLOB_CACHE = new Map();
|
|
7
|
+
export function globToRegExp(glob) {
|
|
8
|
+
const cached = GLOB_CACHE.get(glob);
|
|
9
|
+
if (cached)
|
|
10
|
+
return cached;
|
|
11
|
+
const compiled = new RegExp(`^${translateGlob(glob)}$`);
|
|
12
|
+
GLOB_CACHE.set(glob, compiled);
|
|
13
|
+
return compiled;
|
|
14
|
+
}
|
|
15
|
+
function translateGlob(glob) {
|
|
16
|
+
let re = '';
|
|
17
|
+
let i = 0;
|
|
18
|
+
while (i < glob.length) {
|
|
19
|
+
const step = matchStar(glob, i) ?? matchQuestion(glob, i) ?? matchBrace(glob, i) ?? matchBracket(glob, i);
|
|
20
|
+
if (step) {
|
|
21
|
+
re += step.text;
|
|
22
|
+
i = step.next;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
re += glob[i].replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
26
|
+
i += 1;
|
|
27
|
+
}
|
|
28
|
+
return re;
|
|
29
|
+
}
|
|
30
|
+
function matchStar(glob, i) {
|
|
31
|
+
if (glob[i] !== '*')
|
|
32
|
+
return null;
|
|
33
|
+
if (glob[i + 1] === '*') {
|
|
34
|
+
// `**`
|
|
35
|
+
if (glob[i + 2] === '/')
|
|
36
|
+
return { text: '(?:.*/)?', next: i + 3 };
|
|
37
|
+
return { text: '.*', next: i + 2 };
|
|
38
|
+
}
|
|
39
|
+
return { text: '[^/]*', next: i + 1 };
|
|
40
|
+
}
|
|
41
|
+
function matchQuestion(glob, i) {
|
|
42
|
+
return glob[i] === '?' ? { text: '[^/]', next: i + 1 } : null;
|
|
43
|
+
}
|
|
44
|
+
function matchBrace(glob, i) {
|
|
45
|
+
if (glob[i] !== '{')
|
|
46
|
+
return null;
|
|
47
|
+
const end = findClosing(glob, i, '{', '}');
|
|
48
|
+
if (end === -1)
|
|
49
|
+
return { text: '\\{', next: i + 1 };
|
|
50
|
+
return { text: `(?:${glob.slice(i + 1, end).replace(/,/g, '|')})`, next: end + 1 };
|
|
51
|
+
}
|
|
52
|
+
function matchBracket(glob, i) {
|
|
53
|
+
if (glob[i] !== '[')
|
|
54
|
+
return null;
|
|
55
|
+
const end = findClosing(glob, i, '[', ']');
|
|
56
|
+
if (end === -1)
|
|
57
|
+
return { text: '\\[', next: i + 1 };
|
|
58
|
+
let body = glob.slice(i + 1, end);
|
|
59
|
+
if (body.startsWith('!'))
|
|
60
|
+
body = '^' + body.slice(1);
|
|
61
|
+
return { text: `[${body}]`, next: end + 1 };
|
|
62
|
+
}
|
|
63
|
+
function findClosing(s, start, open, close) {
|
|
64
|
+
let depth = 0;
|
|
65
|
+
for (let i = start; i < s.length; i++) {
|
|
66
|
+
if (s[i] === open)
|
|
67
|
+
depth++;
|
|
68
|
+
else if (s[i] === close) {
|
|
69
|
+
depth--;
|
|
70
|
+
if (depth === 0)
|
|
71
|
+
return i;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return -1;
|
|
75
|
+
}
|
|
76
|
+
export function matchesGlob(path, glob) {
|
|
77
|
+
return globToRegExp(glob).test(path);
|
|
78
|
+
}
|
|
79
|
+
export function matchesAny(path, globs) {
|
|
80
|
+
return globs.some((g) => matchesGlob(path, g));
|
|
81
|
+
}
|
|
82
|
+
/** A glob that looks like it targets a literal path (no magic chars). */
|
|
83
|
+
export function isLiteralPath(glob) {
|
|
84
|
+
return !/[*?[\]{}]/.test(glob);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/util/glob.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Files that ARE part of the project index but should never be grepped or read:
|
|
3
|
+
* lockfiles, minified bundles, source maps. They must stay in the index (a rule
|
|
4
|
+
* asking "is a lockfile committed?" has to see them) but scanning them produces
|
|
5
|
+
* noise, false positives, and a lot of wasted I/O.
|
|
6
|
+
*/
|
|
7
|
+
export declare const GREP_SKIP: string[];
|
|
8
|
+
/** Directories and files never worth auditing. */
|
|
9
|
+
export declare const DEFAULT_IGNORES: string[];
|
|
10
|
+
export interface GrepHit {
|
|
11
|
+
file: string;
|
|
12
|
+
line: number;
|
|
13
|
+
excerpt: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A snapshot of the audited tree. Built once, reused by every rule evaluation —
|
|
17
|
+
* the whole audit is O(files) on disk and O(patterns × files) in memory.
|
|
18
|
+
*/
|
|
19
|
+
export declare class Project {
|
|
20
|
+
readonly root: string;
|
|
21
|
+
readonly files: string[];
|
|
22
|
+
private readonly ignores;
|
|
23
|
+
private readonly contentCache;
|
|
24
|
+
private readonly dirCache;
|
|
25
|
+
private tracked;
|
|
26
|
+
constructor(root: string, extraIgnores?: string[]);
|
|
27
|
+
private walk;
|
|
28
|
+
private visitEntry;
|
|
29
|
+
/** All files matching at least one of `globs`. */
|
|
30
|
+
glob(globs: string[]): string[];
|
|
31
|
+
has(glob: string): boolean;
|
|
32
|
+
dirExists(dir: string): boolean;
|
|
33
|
+
/** Directories present directly under root, one level deep. */
|
|
34
|
+
topLevelDirs(): string[];
|
|
35
|
+
/** True when at least one file matches `patterns`. */
|
|
36
|
+
anyFile(patterns: string[]): boolean;
|
|
37
|
+
/** Number of distinct files matching `patterns`. */
|
|
38
|
+
count(patterns: string[]): number;
|
|
39
|
+
/** File contents, or null when unreadable / binary / too large. */
|
|
40
|
+
read(rel: string): string | null;
|
|
41
|
+
readJson(rel: string): unknown | null;
|
|
42
|
+
/**
|
|
43
|
+
* Grep across the project. `include`/`exclude` are globs; when `include` is
|
|
44
|
+
* empty every indexed file is scanned.
|
|
45
|
+
*/
|
|
46
|
+
grep(pattern: string, include: string[], exclude?: string[], flags?: string): GrepHit[];
|
|
47
|
+
private grepFile;
|
|
48
|
+
/**
|
|
49
|
+
* Files tracked by git. The tree index skips build output and vendored code
|
|
50
|
+
* for speed and signal quality, but some checks ("is `.env` committed?",
|
|
51
|
+
* "are build artifacts in the repo?") can only be answered from git.
|
|
52
|
+
*/
|
|
53
|
+
trackedFiles(): string[];
|
|
54
|
+
trackedGlob(globs: string[]): string[];
|
|
55
|
+
gitInfo(): {
|
|
56
|
+
commit?: string;
|
|
57
|
+
ref?: string;
|
|
58
|
+
repoUrl?: string;
|
|
59
|
+
commits: number;
|
|
60
|
+
contributors: number;
|
|
61
|
+
tags: number;
|
|
62
|
+
daysSinceLastCommit?: number;
|
|
63
|
+
branches: number;
|
|
64
|
+
isRepo: boolean;
|
|
65
|
+
};
|
|
66
|
+
private gitRun;
|
|
67
|
+
private gitIdentity;
|
|
68
|
+
private gitStats;
|
|
69
|
+
}
|
|
70
|
+
/** package.json / tsconfig.json style comments + trailing commas. */
|
|
71
|
+
export declare function stripJsonComments(text: string): string;
|
|
72
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/util/project.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,eAAO,MAAM,SAAS,UAqBrB,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,eAAe,UAuC3B,CAAC;AA2HF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,OAAO,CAAyB;gBAE5B,IAAI,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO;IAQrD,OAAO,CAAC,IAAI;IAwBZ,OAAO,CAAC,UAAU;IAmBlB,kDAAkD;IAClD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAS/B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAS/B,+DAA+D;IAC/D,YAAY,IAAI,MAAM,EAAE;IAIxB,sDAAsD;IACtD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO;IAIpC,oDAAoD;IACpD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM;IAIjC,mEAAmE;IACnE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAmBhC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAUrC;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,MAAM,EAAO,EAAE,KAAK,SAAK,GAAG,OAAO,EAAE;IAYvF,OAAO,CAAC,QAAQ;IAwBhB;;;;OAIG;IACH,YAAY,IAAI,MAAM,EAAE;IAsBxB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAItC,OAAO,IAAI;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC;KACjB;IAQD,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,QAAQ;CAyBjB;AAiGD,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWtD"}
|