@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.
- package/LICENSE +21 -0
- package/README.md +335 -0
- package/USA.md +597 -0
- package/dist/bootstrap/catalog.d.ts +46 -0
- package/dist/bootstrap/catalog.d.ts.map +1 -0
- package/dist/bootstrap/catalog.js +312 -0
- package/dist/bootstrap/catalog.js.map +1 -0
- package/dist/bootstrap/index.d.ts +36 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +177 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +706 -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 +88 -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 +32 -0
- package/dist/engine/audit.d.ts.map +1 -0
- package/dist/engine/audit.js +366 -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 +37 -0
- package/dist/engine/loader.d.ts.map +1 -0
- package/dist/engine/loader.js +388 -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/evolution/benchmark.d.ts +12 -0
- package/dist/evolution/benchmark.d.ts.map +1 -0
- package/dist/evolution/benchmark.js +107 -0
- package/dist/evolution/benchmark.js.map +1 -0
- package/dist/evolution/capability.d.ts +22 -0
- package/dist/evolution/capability.d.ts.map +1 -0
- package/dist/evolution/capability.js +69 -0
- package/dist/evolution/capability.js.map +1 -0
- package/dist/evolution/coverage.d.ts +15 -0
- package/dist/evolution/coverage.d.ts.map +1 -0
- package/dist/evolution/coverage.js +65 -0
- package/dist/evolution/coverage.js.map +1 -0
- package/dist/evolution/gap.d.ts +10 -0
- package/dist/evolution/gap.d.ts.map +1 -0
- package/dist/evolution/gap.js +52 -0
- package/dist/evolution/gap.js.map +1 -0
- package/dist/evolution/propose.d.ts +50 -0
- package/dist/evolution/propose.d.ts.map +1 -0
- package/dist/evolution/propose.js +188 -0
- package/dist/evolution/propose.js.map +1 -0
- package/dist/evolution/queue.d.ts +64 -0
- package/dist/evolution/queue.d.ts.map +1 -0
- package/dist/evolution/queue.js +192 -0
- package/dist/evolution/queue.js.map +1 -0
- package/dist/evolution/release.d.ts +11 -0
- package/dist/evolution/release.d.ts.map +1 -0
- package/dist/evolution/release.js +55 -0
- package/dist/evolution/release.js.map +1 -0
- package/dist/evolution/run.d.ts +88 -0
- package/dist/evolution/run.d.ts.map +1 -0
- package/dist/evolution/run.js +258 -0
- package/dist/evolution/run.js.map +1 -0
- package/dist/evolution/schedule.d.ts +59 -0
- package/dist/evolution/schedule.d.ts.map +1 -0
- package/dist/evolution/schedule.js +77 -0
- package/dist/evolution/schedule.js.map +1 -0
- package/dist/evolution/types.d.ts +174 -0
- package/dist/evolution/types.d.ts.map +1 -0
- package/dist/evolution/types.js +8 -0
- package/dist/evolution/types.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/learn/index.d.ts +27 -0
- package/dist/learn/index.d.ts.map +1 -0
- package/dist/learn/index.js +196 -0
- package/dist/learn/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/snapshot/index.d.ts +55 -0
- package/dist/snapshot/index.d.ts.map +1 -0
- package/dist/snapshot/index.js +76 -0
- package/dist/snapshot/index.js.map +1 -0
- package/dist/store/index.d.ts +31 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +69 -0
- package/dist/store/index.js.map +1 -0
- package/dist/types.d.ts +287 -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 +90 -0
- package/dist/util/project.d.ts.map +1 -0
- package/dist/util/project.js +636 -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/package.json +94 -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 +313 -0
- package/rules/core/security.yaml +496 -0
- package/rules/core/supply-chain.yaml +357 -0
- package/rules/core/testing.yaml +266 -0
- package/rules/detectors.yaml +2028 -0
- package/rules/index.yaml +42 -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/swift.yaml +100 -0
- package/rules/stacks/web-frontend.yaml +159 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the evolution layer: coverage, blind spots, capability gaps,
|
|
3
|
+
* capabilities/candidates, benchmarks, releases, audit runs, and re-audit deltas.
|
|
4
|
+
* All are plain JSON-serializable data so they can be content-addressed by the
|
|
5
|
+
* Store and reproduced byte-for-byte.
|
|
6
|
+
*/
|
|
7
|
+
import type { RulePack, Status } from '../types.js';
|
|
8
|
+
/** A place where USA measurably cannot (yet) analyze something. */
|
|
9
|
+
export interface BlindSpot {
|
|
10
|
+
kind: 'unsupported-language' | 'unverifiable-section';
|
|
11
|
+
/** Stable id, e.g. `lang:lua` or `section:S7`. */
|
|
12
|
+
id: string;
|
|
13
|
+
detail: string;
|
|
14
|
+
/** Traceable evidence backing the claim (facts, pack list, counts). */
|
|
15
|
+
evidence: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Multi-axis coverage: what USA actually examined, not what it claims it can
|
|
19
|
+
* examine. Derived solely from the audit result and detected facts — a
|
|
20
|
+
* capability that merely exists in the registry but does not apply is *not*
|
|
21
|
+
* counted as coverage.
|
|
22
|
+
*/
|
|
23
|
+
export interface CoverageModel {
|
|
24
|
+
/** Share of applicable checks the engine resolved without a human (0..100). */
|
|
25
|
+
automationCoverage: number;
|
|
26
|
+
/** Share of detected languages that a shipped pack actually covers (0..100). */
|
|
27
|
+
languageCoverage: number;
|
|
28
|
+
detectedLanguages: string[];
|
|
29
|
+
coveredLanguages: string[];
|
|
30
|
+
/** Detected languages with no production capability (bootstrap-at-best). */
|
|
31
|
+
unsupportedLanguages: string[];
|
|
32
|
+
/** Sections the engine could not verify automatically (null score). */
|
|
33
|
+
unverifiableSections: string[];
|
|
34
|
+
/** Count of open judgements requiring a human/agent. */
|
|
35
|
+
unknownFindings: number;
|
|
36
|
+
blindSpots: BlindSpot[];
|
|
37
|
+
}
|
|
38
|
+
export type GapKind = 'unsupported-technology' | 'missing-detector' | 'unverifiable-property' | 'uncertain-capability';
|
|
39
|
+
/**
|
|
40
|
+
* A measurable limitation discovered from audit evidence. A gap is *not* LLM
|
|
41
|
+
* intuition: it carries the evidence (facts, pack list, audit/snapshot ids)
|
|
42
|
+
* that explains why it exists.
|
|
43
|
+
*/
|
|
44
|
+
export interface CapabilityGap {
|
|
45
|
+
id: string;
|
|
46
|
+
kind: GapKind;
|
|
47
|
+
/** The technology/component/section the gap concerns. */
|
|
48
|
+
target: string;
|
|
49
|
+
problem: string;
|
|
50
|
+
/** Ordered, traceable evidence strings. */
|
|
51
|
+
evidence: string[];
|
|
52
|
+
/** The capability that would close the gap (e.g. `stacks/lua`). */
|
|
53
|
+
requiredCapability: string;
|
|
54
|
+
priority: 'low' | 'medium' | 'high';
|
|
55
|
+
auditRunId: string;
|
|
56
|
+
snapshotId: string;
|
|
57
|
+
createdAt: string;
|
|
58
|
+
state: 'open' | 'accepted' | 'closed';
|
|
59
|
+
}
|
|
60
|
+
export type CapabilityKind = 'data' | 'executor' | 'composite' | 'oracle';
|
|
61
|
+
/** A shipped, versioned capability. The data kind carries a rule pack. */
|
|
62
|
+
export interface Capability {
|
|
63
|
+
id: string;
|
|
64
|
+
version: string;
|
|
65
|
+
kind: CapabilityKind;
|
|
66
|
+
description: string;
|
|
67
|
+
/** The rule pack this capability contributes (signature for `data` capabilities). */
|
|
68
|
+
pack?: RulePack;
|
|
69
|
+
/** Languages this capability analyzes — used for honest coverage accounting. */
|
|
70
|
+
languages?: string[];
|
|
71
|
+
status: 'stable' | 'deprecated';
|
|
72
|
+
provenance: {
|
|
73
|
+
createdAt: string;
|
|
74
|
+
createdBy: string;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export type CandidateStatus = 'PROPOSED' | 'IMPLEMENTED' | 'TESTED' | 'BENCHMARKED' | 'REVIEWED' | 'RELEASED' | 'REJECTED';
|
|
78
|
+
/** A capability that is *not* production yet. Never in the active set. */
|
|
79
|
+
export interface CandidateCapability {
|
|
80
|
+
id: string;
|
|
81
|
+
capability: Capability;
|
|
82
|
+
gapIds: string[];
|
|
83
|
+
status: CandidateStatus;
|
|
84
|
+
createdAt: string;
|
|
85
|
+
release?: ReleaseDecision;
|
|
86
|
+
}
|
|
87
|
+
export type BenchmarkKind = 'known-positive' | 'known-negative' | 'regression';
|
|
88
|
+
export interface BenchmarkCase {
|
|
89
|
+
id: string;
|
|
90
|
+
kind: BenchmarkKind;
|
|
91
|
+
description: string;
|
|
92
|
+
/** Files to materialize as a fixture tree. */
|
|
93
|
+
fixture: Record<string, string>;
|
|
94
|
+
/** Ground truth: expected status per rule id in a full-fixture audit. */
|
|
95
|
+
expected: {
|
|
96
|
+
ruleId: string;
|
|
97
|
+
status: Status;
|
|
98
|
+
}[];
|
|
99
|
+
}
|
|
100
|
+
export interface BenchmarkCaseResult {
|
|
101
|
+
caseId: string;
|
|
102
|
+
kind: BenchmarkKind;
|
|
103
|
+
tp: number;
|
|
104
|
+
tn: number;
|
|
105
|
+
fp: number;
|
|
106
|
+
fn: number;
|
|
107
|
+
precision: number;
|
|
108
|
+
recall: number;
|
|
109
|
+
regressions: string[];
|
|
110
|
+
elapsedMs: number;
|
|
111
|
+
}
|
|
112
|
+
export interface BenchmarkResult {
|
|
113
|
+
capability: {
|
|
114
|
+
id: string;
|
|
115
|
+
version: string;
|
|
116
|
+
};
|
|
117
|
+
cases: BenchmarkCaseResult[];
|
|
118
|
+
summary: {
|
|
119
|
+
tp: number;
|
|
120
|
+
tn: number;
|
|
121
|
+
fp: number;
|
|
122
|
+
fn: number;
|
|
123
|
+
precision: number;
|
|
124
|
+
recall: number;
|
|
125
|
+
regressions: number;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export interface ReleaseGate {
|
|
129
|
+
minPrecision: number;
|
|
130
|
+
minRecall: number;
|
|
131
|
+
requireNoRegressions: boolean;
|
|
132
|
+
}
|
|
133
|
+
export interface ReleaseDecision {
|
|
134
|
+
decision: 'ACCEPT' | 'REJECT';
|
|
135
|
+
reasons: string[];
|
|
136
|
+
testsPassed: boolean;
|
|
137
|
+
benchmarkPassed: boolean;
|
|
138
|
+
precision: number;
|
|
139
|
+
recall: number;
|
|
140
|
+
regressions: number;
|
|
141
|
+
}
|
|
142
|
+
export interface AuditRun {
|
|
143
|
+
id: string;
|
|
144
|
+
repository: string;
|
|
145
|
+
snapshotId: string;
|
|
146
|
+
capabilitySetId: string;
|
|
147
|
+
engineVersion: string;
|
|
148
|
+
status: 'running' | 'completed' | 'failed';
|
|
149
|
+
startedAt: string;
|
|
150
|
+
endedAt?: string;
|
|
151
|
+
/** Content address of the stored result (report trailer data). */
|
|
152
|
+
resultId?: string;
|
|
153
|
+
provenance: {
|
|
154
|
+
modelBundleId?: string;
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export interface ReAuditDelta {
|
|
158
|
+
before: {
|
|
159
|
+
automationCoverage: number;
|
|
160
|
+
languageCoverage: number;
|
|
161
|
+
unsupported: string[];
|
|
162
|
+
};
|
|
163
|
+
after: {
|
|
164
|
+
automationCoverage: number;
|
|
165
|
+
languageCoverage: number;
|
|
166
|
+
unsupported: string[];
|
|
167
|
+
};
|
|
168
|
+
coverageDelta: number;
|
|
169
|
+
findingsAdded: string[];
|
|
170
|
+
findingsRemoved: string[];
|
|
171
|
+
gapReduced: boolean;
|
|
172
|
+
intendedFindingDetectable: boolean;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/evolution/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the evolution layer: coverage, blind spots, capability gaps,
|
|
3
|
+
* capabilities/candidates, benchmarks, releases, audit runs, and re-audit deltas.
|
|
4
|
+
* All are plain JSON-serializable data so they can be content-addressed by the
|
|
5
|
+
* Store and reproduced byte-for-byte.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/evolution/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* USA — Universal Software Auditor
|
|
3
|
+
* Programmatic API. Everything the CLI does is available here.
|
|
4
|
+
*/
|
|
5
|
+
export { Project } from './util/project.js';
|
|
6
|
+
export { detect, loadDetectors, classifyMaturity, loadDetectorFile } from './detect/index.js';
|
|
7
|
+
export { loadRulePacks, loadPackFile, parsePackText, applyRuleOverrides, validatePredicate, DEFAULT_WEIGHT, SEVERITY_LADDER, } from './engine/loader.js';
|
|
8
|
+
export { loadSections, DEFAULT_SECTIONS } from './engine/sections.js';
|
|
9
|
+
export { loadProfiles, dampen } from './engine/maturity.js';
|
|
10
|
+
export { runAudit } from './engine/audit.js';
|
|
11
|
+
export { score } from './engine/score.js';
|
|
12
|
+
export { evaluateRule, evalPredicate, ruleApplies, packApplies } from './engine/evaluate.js';
|
|
13
|
+
export { renderMarkdown, parseTrailer, trailer } from './report/markdown.js';
|
|
14
|
+
export { diffReports } from './engine/diff.js';
|
|
15
|
+
export { evaluateGate, blockingFindings } from './engine/gate.js';
|
|
16
|
+
export { loadConfig, EXAMPLE_CONFIG, CONFIG_FILE } from './config.js';
|
|
17
|
+
export { snapshotOfProject, snapshotOfDir, identityFromFiles, canonicalJson, hashText, } from './snapshot/index.js';
|
|
18
|
+
export { Store } from './store/index.js';
|
|
19
|
+
export { computeCoverage } from './evolution/coverage.js';
|
|
20
|
+
export { deriveGaps } from './evolution/gap.js';
|
|
21
|
+
export { resolveCapabilitySetId, capabilityFromPack, basePackIds } from './evolution/capability.js';
|
|
22
|
+
export { runBenchmark } from './evolution/benchmark.js';
|
|
23
|
+
export { evaluateRelease, DEFAULT_RELEASE_GATE } from './evolution/release.js';
|
|
24
|
+
export { proposeCandidate, proposeCandidates, proposeFromSuggestions, } from './evolution/propose.js';
|
|
25
|
+
export { GapQueue } from './evolution/queue.js';
|
|
26
|
+
export { scheduleCandidates } from './evolution/schedule.js';
|
|
27
|
+
export { runEvolutionCycle } from './evolution/run.js';
|
|
28
|
+
export type * from './types.js';
|
|
29
|
+
export type * from './snapshot/index.js';
|
|
30
|
+
export type * from './evolution/types.js';
|
|
31
|
+
export type { SectionDef } from './engine/sections.js';
|
|
32
|
+
export type { MaturityProfile } from './engine/maturity.js';
|
|
33
|
+
export type { AuditOutcome, AuditOptions } from './engine/audit.js';
|
|
34
|
+
export type { ScoredRule } from './engine/score.js';
|
|
35
|
+
export type { EvalContext } from './engine/evaluate.js';
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAItE,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,sBAAsB,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACpE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* USA — Universal Software Auditor
|
|
3
|
+
* Programmatic API. Everything the CLI does is available here.
|
|
4
|
+
*/
|
|
5
|
+
export { Project } from './util/project.js';
|
|
6
|
+
export { detect, loadDetectors, classifyMaturity, loadDetectorFile } from './detect/index.js';
|
|
7
|
+
export { loadRulePacks, loadPackFile, parsePackText, applyRuleOverrides, validatePredicate, DEFAULT_WEIGHT, SEVERITY_LADDER, } from './engine/loader.js';
|
|
8
|
+
export { loadSections, DEFAULT_SECTIONS } from './engine/sections.js';
|
|
9
|
+
export { loadProfiles, dampen } from './engine/maturity.js';
|
|
10
|
+
export { runAudit } from './engine/audit.js';
|
|
11
|
+
export { score } from './engine/score.js';
|
|
12
|
+
export { evaluateRule, evalPredicate, ruleApplies, packApplies } from './engine/evaluate.js';
|
|
13
|
+
export { renderMarkdown, parseTrailer, trailer } from './report/markdown.js';
|
|
14
|
+
export { diffReports } from './engine/diff.js';
|
|
15
|
+
export { evaluateGate, blockingFindings } from './engine/gate.js';
|
|
16
|
+
export { loadConfig, EXAMPLE_CONFIG, CONFIG_FILE } from './config.js';
|
|
17
|
+
// Evolution layer: the deterministic audit → gap → candidate → benchmark →
|
|
18
|
+
// release → re-audit loop.
|
|
19
|
+
export { snapshotOfProject, snapshotOfDir, identityFromFiles, canonicalJson, hashText, } from './snapshot/index.js';
|
|
20
|
+
export { Store } from './store/index.js';
|
|
21
|
+
export { computeCoverage } from './evolution/coverage.js';
|
|
22
|
+
export { deriveGaps } from './evolution/gap.js';
|
|
23
|
+
export { resolveCapabilitySetId, capabilityFromPack, basePackIds } from './evolution/capability.js';
|
|
24
|
+
export { runBenchmark } from './evolution/benchmark.js';
|
|
25
|
+
export { evaluateRelease, DEFAULT_RELEASE_GATE } from './evolution/release.js';
|
|
26
|
+
export { proposeCandidate, proposeCandidates, proposeFromSuggestions, } from './evolution/propose.js';
|
|
27
|
+
export { GapQueue } from './evolution/queue.js';
|
|
28
|
+
export { scheduleCandidates } from './evolution/schedule.js';
|
|
29
|
+
export { runEvolutionCycle } from './evolution/run.js';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtE,2EAA2E;AAC3E,2BAA2B;AAC3B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface LearnOptions {
|
|
2
|
+
reportPath: string;
|
|
3
|
+
out?: string;
|
|
4
|
+
minSeverity?: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | 'FUTURE';
|
|
5
|
+
verbose?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface Suggestion {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
section: string;
|
|
11
|
+
sectionTitle: string;
|
|
12
|
+
severity: 'HIGH' | 'MEDIUM' | 'LOW';
|
|
13
|
+
ruleClass: string;
|
|
14
|
+
check: {
|
|
15
|
+
kind: string;
|
|
16
|
+
pattern?: string;
|
|
17
|
+
files?: string[];
|
|
18
|
+
};
|
|
19
|
+
why: string;
|
|
20
|
+
remediation: string;
|
|
21
|
+
evidence?: string;
|
|
22
|
+
references?: string[];
|
|
23
|
+
triggeredBy: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function learnFromReport(options: LearnOptions): Suggestion[];
|
|
26
|
+
export declare function renderSuggestions(suggestions: Suggestion[]): string;
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/learn/index.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;IAChE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAuHD,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,EAAE,CAuBnE;AAqCD,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAmCnE"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { parse as parseYaml } from 'yaml';
|
|
3
|
+
import { parseTrailer } from '../report/markdown.js';
|
|
4
|
+
import { isMap } from '../util/yaml.js';
|
|
5
|
+
const SEVERITY_ORDER = {
|
|
6
|
+
CRITICAL: 0,
|
|
7
|
+
HIGH: 1,
|
|
8
|
+
MEDIUM: 2,
|
|
9
|
+
LOW: 3,
|
|
10
|
+
FUTURE: 4,
|
|
11
|
+
};
|
|
12
|
+
function isTrailerRuleInfo(v) {
|
|
13
|
+
return typeof v === 'object' && v !== null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse the machine-readable trailer into its YAML mapping. Returns null when
|
|
17
|
+
* there is no trailer or it is not a mapping. The trailer is untrusted input:
|
|
18
|
+
* a malformed one must produce a clear error, not a stack trace.
|
|
19
|
+
*/
|
|
20
|
+
function parseReportTrailer(reportPath) {
|
|
21
|
+
const text = fs.readFileSync(reportPath, 'utf8');
|
|
22
|
+
const yamlText = parseTrailer(text);
|
|
23
|
+
if (yamlText === null)
|
|
24
|
+
return null;
|
|
25
|
+
try {
|
|
26
|
+
const doc = parseYaml(yamlText);
|
|
27
|
+
return isMap(doc) ? doc : null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Findings recorded directly in the trailer, if it carries a full array. */
|
|
34
|
+
function findingsFromTrailerField(doc) {
|
|
35
|
+
return Array.isArray(doc.findings) ? doc.findings : [];
|
|
36
|
+
}
|
|
37
|
+
/** Compact `rules` mapping → findings-like rows (the common trailer shape). */
|
|
38
|
+
function findingsFromTrailerRules(doc) {
|
|
39
|
+
const rules = doc.rules;
|
|
40
|
+
if (!isMap(rules))
|
|
41
|
+
return [];
|
|
42
|
+
const out = [];
|
|
43
|
+
for (const [ruleId, raw] of Object.entries(rules)) {
|
|
44
|
+
const info = isTrailerRuleInfo(raw) ? raw : {};
|
|
45
|
+
const severity = info.severity ?? 'MEDIUM';
|
|
46
|
+
out.push({
|
|
47
|
+
ruleId,
|
|
48
|
+
title: `Rule ${ruleId}`,
|
|
49
|
+
section: info.section ?? 'S0',
|
|
50
|
+
sectionTitle: info.sectionTitle ?? '',
|
|
51
|
+
severity,
|
|
52
|
+
baseSeverity: severity,
|
|
53
|
+
status: info.status ?? 'UNKNOWN',
|
|
54
|
+
ruleClass: 'maintainability',
|
|
55
|
+
message: `Rule ${ruleId} was ${info.status ?? 'UNKNOWN'}`,
|
|
56
|
+
locations: [],
|
|
57
|
+
why: '',
|
|
58
|
+
remediation: '',
|
|
59
|
+
evidenceHint: 'Manual review required.',
|
|
60
|
+
references: [],
|
|
61
|
+
dampened: false,
|
|
62
|
+
suppressedReason: undefined,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
function logVerbose(options, findings, relevant) {
|
|
68
|
+
if (!options.verbose)
|
|
69
|
+
return;
|
|
70
|
+
console.error(`Found ${findings.length} findings in report.`);
|
|
71
|
+
console.error('Statuses:', findings
|
|
72
|
+
.map((f) => f.status)
|
|
73
|
+
.filter(Boolean)
|
|
74
|
+
.join(', '));
|
|
75
|
+
console.error(`Found ${relevant.length} relevant findings after filtering.`);
|
|
76
|
+
relevant.forEach((f) => console.error(` - ${f.ruleId} ${f.status} ${f.severity}`));
|
|
77
|
+
}
|
|
78
|
+
function groupBySection(findings) {
|
|
79
|
+
const bySection = new Map();
|
|
80
|
+
for (const f of findings) {
|
|
81
|
+
const key = f.section || 'S0';
|
|
82
|
+
const group = bySection.get(key);
|
|
83
|
+
if (group)
|
|
84
|
+
group.push(f);
|
|
85
|
+
else
|
|
86
|
+
bySection.set(key, [f]);
|
|
87
|
+
}
|
|
88
|
+
return bySection;
|
|
89
|
+
}
|
|
90
|
+
/** Findings worth acting on: open status AND at/above the severity threshold. */
|
|
91
|
+
function selectRelevant(findings, minScore) {
|
|
92
|
+
return findings.filter((f) => {
|
|
93
|
+
if (f.status === 'PASS' || f.status === 'NOT_APPLICABLE')
|
|
94
|
+
return false;
|
|
95
|
+
if (!f.status)
|
|
96
|
+
return false;
|
|
97
|
+
return (SEVERITY_ORDER[f.severity] ?? 9) <= minScore;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/** Extract findings from the trailer: full `findings` array, else compact `rules`. */
|
|
101
|
+
function extractFindings(doc, verbose) {
|
|
102
|
+
const direct = findingsFromTrailerField(doc);
|
|
103
|
+
if (direct.length > 0)
|
|
104
|
+
return direct;
|
|
105
|
+
const converted = findingsFromTrailerRules(doc);
|
|
106
|
+
if (verbose && converted.length > 0) {
|
|
107
|
+
console.error(`Converted ${converted.length} rules from trailer.`);
|
|
108
|
+
}
|
|
109
|
+
return converted;
|
|
110
|
+
}
|
|
111
|
+
export function learnFromReport(options) {
|
|
112
|
+
const doc = parseReportTrailer(options.reportPath);
|
|
113
|
+
if (!doc) {
|
|
114
|
+
throw new Error(`Could not parse report trailer from ${options.reportPath}. Ensure the report was generated by USA.`);
|
|
115
|
+
}
|
|
116
|
+
const findings = extractFindings(doc, options.verbose ?? false);
|
|
117
|
+
const minScore = SEVERITY_ORDER[options.minSeverity ?? 'MEDIUM'] ?? 2;
|
|
118
|
+
const relevant = selectRelevant(findings, minScore);
|
|
119
|
+
logVerbose(options, findings, relevant);
|
|
120
|
+
const suggestions = [];
|
|
121
|
+
let idCounter = 1;
|
|
122
|
+
for (const [section, items] of groupBySection(relevant)) {
|
|
123
|
+
const sectionTitle = items[0]?.sectionTitle ?? section;
|
|
124
|
+
for (const f of items) {
|
|
125
|
+
suggestions.push(generateSuggestion(f, section, sectionTitle, idCounter++));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return suggestions;
|
|
129
|
+
}
|
|
130
|
+
function generateSuggestion(finding, section, sectionTitle, idCounter) {
|
|
131
|
+
const id = `LEARN-${String(idCounter).padStart(3, '0')}`;
|
|
132
|
+
const severity = mapSeverity(finding.severity);
|
|
133
|
+
const ruleClass = finding.ruleClass ?? 'maintainability';
|
|
134
|
+
return {
|
|
135
|
+
id,
|
|
136
|
+
title: finding.title || `Missing check: ${finding.ruleId}`,
|
|
137
|
+
section,
|
|
138
|
+
sectionTitle,
|
|
139
|
+
severity,
|
|
140
|
+
ruleClass,
|
|
141
|
+
check: { kind: 'manual' },
|
|
142
|
+
why: finding.why ??
|
|
143
|
+
finding.message ??
|
|
144
|
+
'This requirement was flagged as missing or requiring review.',
|
|
145
|
+
remediation: finding.remediation ?? 'Define and implement the required control.',
|
|
146
|
+
evidence: finding.evidenceHint ?? 'Manual evidence: file:line + reasoning.',
|
|
147
|
+
references: finding.references ?? [],
|
|
148
|
+
triggeredBy: finding.ruleId,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function mapSeverity(sev) {
|
|
152
|
+
if (sev === 'CRITICAL' || sev === 'HIGH')
|
|
153
|
+
return 'HIGH';
|
|
154
|
+
if (sev === 'MEDIUM')
|
|
155
|
+
return 'MEDIUM';
|
|
156
|
+
return 'LOW';
|
|
157
|
+
}
|
|
158
|
+
export function renderSuggestions(suggestions) {
|
|
159
|
+
const lines = [];
|
|
160
|
+
lines.push('# =============================================================================');
|
|
161
|
+
lines.push('# GENERATED by `usa learn` — REVIEW REQUIRED before use.');
|
|
162
|
+
lines.push('# This pack contains suggested rules based on gaps found in the audit report.');
|
|
163
|
+
lines.push('# =============================================================================');
|
|
164
|
+
lines.push(`id: learn-suggestions`);
|
|
165
|
+
lines.push(`title: Suggestions from USA Learn`);
|
|
166
|
+
lines.push(`section: S0`);
|
|
167
|
+
lines.push(`section_title: Generated Suggestions`);
|
|
168
|
+
lines.push(`description: >`);
|
|
169
|
+
lines.push(` These rules were proposed by \`usa learn\` based on the audit findings.`);
|
|
170
|
+
lines.push(` They are not yet verified; review each and register in rules/index.yaml.`);
|
|
171
|
+
lines.push(`version: '0.1.0-learn'`);
|
|
172
|
+
lines.push('');
|
|
173
|
+
lines.push('rules:');
|
|
174
|
+
for (const s of suggestions) {
|
|
175
|
+
lines.push(` - id: ${s.id}`);
|
|
176
|
+
lines.push(` title: ${s.title}`);
|
|
177
|
+
lines.push(` section: ${s.section}`);
|
|
178
|
+
lines.push(` section_title: ${s.sectionTitle}`);
|
|
179
|
+
lines.push(` severity: ${s.severity}`);
|
|
180
|
+
lines.push(` class: ${s.ruleClass}`);
|
|
181
|
+
lines.push(` check:`);
|
|
182
|
+
lines.push(` kind: manual`);
|
|
183
|
+
lines.push(` why: ${s.why}`);
|
|
184
|
+
if (s.remediation)
|
|
185
|
+
lines.push(` remediation: ${s.remediation}`);
|
|
186
|
+
if (s.evidence)
|
|
187
|
+
lines.push(` evidence: ${s.evidence}`);
|
|
188
|
+
if (s.references && s.references.length) {
|
|
189
|
+
lines.push(` references: [${s.references.map((r) => `'${r}'`).join(', ')}]`);
|
|
190
|
+
}
|
|
191
|
+
lines.push(` # Triggered by: ${s.triggeredBy}`);
|
|
192
|
+
lines.push('');
|
|
193
|
+
}
|
|
194
|
+
return lines.join('\n');
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/learn/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AuditReport, Finding } from '../types.js';
|
|
2
|
+
import type { MaturityProfile } from '../engine/maturity.js';
|
|
3
|
+
/** Renders the Section 14 report template from USA.md. */
|
|
4
|
+
export declare function renderMarkdown(report: AuditReport, profile: MaturityProfile): string;
|
|
5
|
+
export declare function primaryLocation(f: Finding): string;
|
|
6
|
+
/**
|
|
7
|
+
* Compact, stable YAML used by `usa diff`. Kept in the Markdown on purpose —
|
|
8
|
+
* the report stays a single self-contained artifact you can commit, email, or
|
|
9
|
+
* paste into a PR.
|
|
10
|
+
*/
|
|
11
|
+
export declare const TRAILER_BEGIN = "<!-- USA:TRAILER:BEGIN -->";
|
|
12
|
+
export declare const TRAILER_END = "<!-- USA:TRAILER:END -->";
|
|
13
|
+
export declare function trailer(report: AuditReport): string;
|
|
14
|
+
/** Extracts the machine-readable trailer from a previously rendered report. */
|
|
15
|
+
export declare function parseTrailer(markdown: string): string | null;
|
|
16
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/report/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAoB,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA0C7D,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAuBpF;AAwaD,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAGlD;AA8CD;;;;GAIG;AACH,eAAO,MAAM,aAAa,+BAA+B,CAAC;AAC1D,eAAO,MAAM,WAAW,6BAA6B,CAAC;AAEtD,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqBnD;AAWD,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyB5D"}
|