@xenos1996/usa 2.15.0 → 2.16.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/dist/cli-args.d.ts +25 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +90 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-audit.d.ts +3 -0
- package/dist/cli-audit.d.ts.map +1 -0
- package/dist/cli-audit.js +180 -0
- package/dist/cli-audit.js.map +1 -0
- package/dist/cli-evolve.d.ts +4 -0
- package/dist/cli-evolve.d.ts.map +1 -0
- package/dist/cli-evolve.js +182 -0
- package/dist/cli-evolve.js.map +1 -0
- package/dist/cli-help.d.ts +6 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +152 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli-query.d.ts +13 -0
- package/dist/cli-query.d.ts.map +1 -0
- package/dist/cli-query.js +166 -0
- package/dist/cli-query.js.map +1 -0
- package/dist/cli-reports.d.ts +5 -0
- package/dist/cli-reports.d.ts.map +1 -0
- package/dist/cli-reports.js +111 -0
- package/dist/cli-reports.js.map +1 -0
- package/dist/cli-scaffold.d.ts +6 -0
- package/dist/cli-scaffold.d.ts.map +1 -0
- package/dist/cli-scaffold.js +129 -0
- package/dist/cli-scaffold.js.map +1 -0
- package/dist/cli-session.d.ts +18 -0
- package/dist/cli-session.d.ts.map +1 -0
- package/dist/cli-session.js +136 -0
- package/dist/cli-session.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -1097
- package/dist/cli.js.map +1 -1
- package/dist/report/html.d.ts +20 -0
- package/dist/report/html.d.ts.map +1 -0
- package/dist/report/html.js +117 -0
- package/dist/report/html.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Depth, Maturity, Severity } from './types.js';
|
|
2
|
+
/** Shared CLI plumbing: install paths, version, and argument accessors. */
|
|
3
|
+
export declare const HERE: string;
|
|
4
|
+
export declare const DEFAULT_RULES_DIR: string;
|
|
5
|
+
export declare const VERSION: string;
|
|
6
|
+
export declare const SEVERITY_ORDER: Severity[];
|
|
7
|
+
export declare const DEPTHS: Depth[];
|
|
8
|
+
export declare const MATURITIES: Maturity[];
|
|
9
|
+
export interface Args {
|
|
10
|
+
_: string[];
|
|
11
|
+
[k: string]: string | boolean | string[] | undefined;
|
|
12
|
+
}
|
|
13
|
+
export declare function parseArgs(argv: string[]): Args;
|
|
14
|
+
export declare function str(args: Args, key: string, fallback?: string): string | undefined;
|
|
15
|
+
export declare function bool(args: Args, key: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* CLI-003: every command that writes files honors --dry-run. Call after pure
|
|
18
|
+
* argument validation with the resolved paths that WOULD be written: it
|
|
19
|
+
* prints one line per path and returns false, and the caller exits 0 before
|
|
20
|
+
* doing any work — no audit run, no model calls, no disk writes. With an
|
|
21
|
+
* empty list it says so explicitly rather than silently succeeding.
|
|
22
|
+
*/
|
|
23
|
+
export declare function dryRunWrites(args: Args, files: string[]): boolean;
|
|
24
|
+
export declare function list(args: Args, key: string): string[];
|
|
25
|
+
//# sourceMappingURL=cli-args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE5D,2EAA2E;AAC3E,eAAO,MAAM,IAAI,QAA+C,CAAC;AACjE,eAAO,MAAM,iBAAiB,QAAoC,CAAC;AACnE,eAAO,MAAM,OAAO,QAAgB,CAAC;AAErC,eAAO,MAAM,cAAc,EAAE,QAAQ,EAAoD,CAAC;AAC1F,eAAO,MAAM,MAAM,EAAE,KAAK,EAAkC,CAAC;AAC7D,eAAO,MAAM,UAAU,EAAE,QAAQ,EAAyD,CAAC;AAI3F,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACtD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuB9C;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGlF;AACD,wBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAQjE;AACD,wBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAStD"}
|
package/dist/cli-args.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
/** Shared CLI plumbing: install paths, version, and argument accessors. */
|
|
5
|
+
export const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
export const DEFAULT_RULES_DIR = path.resolve(HERE, '..', 'rules');
|
|
7
|
+
export const VERSION = readVersion();
|
|
8
|
+
export const SEVERITY_ORDER = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'FUTURE'];
|
|
9
|
+
export const DEPTHS = ['quick', 'standard', 'deep'];
|
|
10
|
+
export const MATURITIES = ['prototype', 'mvp', 'beta', 'production', 'legacy'];
|
|
11
|
+
export function parseArgs(argv) {
|
|
12
|
+
const args = { _: [] };
|
|
13
|
+
for (let i = 0; i < argv.length; i++) {
|
|
14
|
+
const tok = argv[i];
|
|
15
|
+
if (!tok.startsWith('--')) {
|
|
16
|
+
args._.push(tok);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const body = tok.slice(2);
|
|
20
|
+
if (body.includes('=')) {
|
|
21
|
+
const [k, ...rest] = body.split('=');
|
|
22
|
+
args[k] = rest.join('=');
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const next = argv[i + 1];
|
|
26
|
+
if (next === undefined || next.startsWith('--')) {
|
|
27
|
+
args[body] = true;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
args[body] = next;
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return args;
|
|
35
|
+
}
|
|
36
|
+
export function str(args, key, fallback) {
|
|
37
|
+
const v = args[key];
|
|
38
|
+
return typeof v === 'string' ? v : fallback;
|
|
39
|
+
}
|
|
40
|
+
export function bool(args, key) {
|
|
41
|
+
return args[key] === true || args[key] === 'true';
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* CLI-003: every command that writes files honors --dry-run. Call after pure
|
|
45
|
+
* argument validation with the resolved paths that WOULD be written: it
|
|
46
|
+
* prints one line per path and returns false, and the caller exits 0 before
|
|
47
|
+
* doing any work — no audit run, no model calls, no disk writes. With an
|
|
48
|
+
* empty list it says so explicitly rather than silently succeeding.
|
|
49
|
+
*/
|
|
50
|
+
export function dryRunWrites(args, files) {
|
|
51
|
+
if (!bool(args, 'dry-run'))
|
|
52
|
+
return true;
|
|
53
|
+
if (files.length === 0) {
|
|
54
|
+
console.log('dry-run: nothing would be written');
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
for (const f of files)
|
|
58
|
+
console.log(`dry-run: would write ${path.resolve(f)}`);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
export function list(args, key) {
|
|
62
|
+
const v = args[key];
|
|
63
|
+
if (Array.isArray(v))
|
|
64
|
+
return v;
|
|
65
|
+
if (typeof v === 'string')
|
|
66
|
+
return v
|
|
67
|
+
.split(',')
|
|
68
|
+
.map((s) => s.trim())
|
|
69
|
+
.filter(Boolean);
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
/* ------------------------------------------------------------------ utils -- */
|
|
73
|
+
function readVersion() {
|
|
74
|
+
const candidates = [
|
|
75
|
+
path.resolve(HERE, '..', 'package.json'),
|
|
76
|
+
path.resolve(HERE, '..', '..', 'package.json'),
|
|
77
|
+
];
|
|
78
|
+
for (const c of candidates) {
|
|
79
|
+
try {
|
|
80
|
+
const pkg = JSON.parse(fs.readFileSync(c, 'utf8'));
|
|
81
|
+
if (pkg.version)
|
|
82
|
+
return pkg.version;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
/* fall through */
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return '0.0.0';
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=cli-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-audit.d.ts","sourceRoot":"","sources":["../src/cli-audit.ts"],"names":[],"mappings":"AAYA,OAAO,EAUL,KAAK,IAAI,EACV,MAAM,eAAe,CAAC;AAoEvB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CA2D3C"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { runAudit } from './engine/audit.js';
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
5
|
+
import { renderMarkdown, parseTrailer } from './report/markdown.js';
|
|
6
|
+
import { renderJson } from './report/json.js';
|
|
7
|
+
import { renderSarif } from './report/sarif.js';
|
|
8
|
+
import { renderNarrative } from './report/narrative.js';
|
|
9
|
+
import { renderHtml } from './report/html.js';
|
|
10
|
+
import { evaluateGate, evaluateNewCodeGate, parseBaselineTrailer } from './engine/gate.js';
|
|
11
|
+
import { VERSION, DEFAULT_RULES_DIR, DEPTHS, MATURITIES, SEVERITY_ORDER, bool, dryRunWrites, list, str, } from './cli-args.js';
|
|
12
|
+
import { writeTextFile } from './util/files.js';
|
|
13
|
+
const FORMATS = ['md', 'json', 'sarif', 'narrative', 'html'];
|
|
14
|
+
/** Resolves the report format from an explicit flag, else the --out suffix. */
|
|
15
|
+
function resolveFormat(flag, out) {
|
|
16
|
+
if (flag)
|
|
17
|
+
return flag.toLowerCase();
|
|
18
|
+
const ext = path.extname(out).toLowerCase();
|
|
19
|
+
if (ext === '.json')
|
|
20
|
+
return 'json';
|
|
21
|
+
if (ext === '.sarif')
|
|
22
|
+
return 'sarif';
|
|
23
|
+
if (ext === '.html' || ext === '.htm')
|
|
24
|
+
return 'html';
|
|
25
|
+
return 'md';
|
|
26
|
+
}
|
|
27
|
+
function parseCountFlag(v) {
|
|
28
|
+
if (v === undefined)
|
|
29
|
+
return undefined;
|
|
30
|
+
const n = Number(v);
|
|
31
|
+
return Number.isFinite(n) ? n : NaN;
|
|
32
|
+
}
|
|
33
|
+
function readAuditOptions(args) {
|
|
34
|
+
const out = str(args, 'out', 'AUDIT.md') ?? 'AUDIT.md';
|
|
35
|
+
return {
|
|
36
|
+
target: args._[1] ?? '.',
|
|
37
|
+
rulesDir: path.resolve(str(args, 'rules-dir', DEFAULT_RULES_DIR) ?? DEFAULT_RULES_DIR),
|
|
38
|
+
depth: str(args, 'depth', 'standard') ?? 'standard',
|
|
39
|
+
profileArg: str(args, 'profile', 'auto') ?? 'auto',
|
|
40
|
+
out,
|
|
41
|
+
format: resolveFormat(str(args, 'format'), out),
|
|
42
|
+
failOn: (str(args, 'fail-on', 'none') ?? 'none').toLowerCase(),
|
|
43
|
+
baseline: str(args, 'baseline'),
|
|
44
|
+
quiet: bool(args, 'quiet'),
|
|
45
|
+
maxFiles: parseCountFlag(str(args, 'max-files')),
|
|
46
|
+
maxBytes: parseCountFlag(str(args, 'max-bytes')),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function validateAuditOptions(o) {
|
|
50
|
+
if (!DEPTHS.includes(o.depth))
|
|
51
|
+
return `--depth must be one of ${DEPTHS.join('|')}`;
|
|
52
|
+
if (o.profileArg !== 'auto' && !MATURITIES.includes(o.profileArg)) {
|
|
53
|
+
return `--profile must be auto or one of ${MATURITIES.join('|')}`;
|
|
54
|
+
}
|
|
55
|
+
if (!FORMATS.includes(o.format))
|
|
56
|
+
return `--format must be one of ${FORMATS.join('|')}`;
|
|
57
|
+
if (o.maxFiles !== undefined && !(o.maxFiles > 0))
|
|
58
|
+
return '--max-files must be a positive number';
|
|
59
|
+
if (o.maxBytes !== undefined && !(o.maxBytes > 0))
|
|
60
|
+
return '--max-bytes must be a positive number';
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
export function cmdAudit(args) {
|
|
64
|
+
const o = readAuditOptions(args);
|
|
65
|
+
const invalid = validateAuditOptions(o);
|
|
66
|
+
if (invalid) {
|
|
67
|
+
console.error(invalid);
|
|
68
|
+
return 2;
|
|
69
|
+
}
|
|
70
|
+
if (!fs.existsSync(o.target)) {
|
|
71
|
+
console.error(`Target path does not exist: ${o.target}`);
|
|
72
|
+
return 2;
|
|
73
|
+
}
|
|
74
|
+
// CLI-003: preview the write before the (expensive) audit runs.
|
|
75
|
+
if (!dryRunWrites(args, [o.out]))
|
|
76
|
+
return 0;
|
|
77
|
+
let config;
|
|
78
|
+
try {
|
|
79
|
+
config = loadConfig(o.target, str(args, 'config'));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error(err.message);
|
|
83
|
+
return 2;
|
|
84
|
+
}
|
|
85
|
+
if (config.facts)
|
|
86
|
+
config.facts = [...config.facts, ...list(args, 'fact')];
|
|
87
|
+
const { report, warnings, profile } = runAudit({
|
|
88
|
+
target: o.target,
|
|
89
|
+
rulesDir: o.rulesDir,
|
|
90
|
+
depth: o.depth,
|
|
91
|
+
profile: o.profileArg,
|
|
92
|
+
config,
|
|
93
|
+
allowCommands: bool(args, 'allow-commands'),
|
|
94
|
+
usaVersion: VERSION,
|
|
95
|
+
includePacks: list(args, 'include'),
|
|
96
|
+
excludePacks: list(args, 'exclude'),
|
|
97
|
+
maxFiles: o.maxFiles,
|
|
98
|
+
maxBytes: o.maxBytes,
|
|
99
|
+
});
|
|
100
|
+
for (const w of warnings)
|
|
101
|
+
console.error(`warning: ${w}`);
|
|
102
|
+
const rendered = renderReport(report, profile, o.format);
|
|
103
|
+
try {
|
|
104
|
+
writeTextFile(o.out, rendered);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
// CLI-004: an unwritable --out is a usage error (exit 2), not a crash.
|
|
108
|
+
console.error(err.message);
|
|
109
|
+
return 2;
|
|
110
|
+
}
|
|
111
|
+
if (!o.quiet) {
|
|
112
|
+
console.log(summaryLine(report));
|
|
113
|
+
console.log(` report → ${o.out}`);
|
|
114
|
+
}
|
|
115
|
+
// Without --baseline the absolute gate below is byte-identical to before:
|
|
116
|
+
// same function, same arguments, same exit codes.
|
|
117
|
+
if (!o.baseline)
|
|
118
|
+
return evaluateGate(report, o.failOn, o.quiet);
|
|
119
|
+
return runBaselineGate(report, o.baseline, o.failOn, o.quiet, args);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* New-code gate: fail only on findings this change introduced or regressed,
|
|
123
|
+
* compared against a previous report's trailer. Every baseline failure mode
|
|
124
|
+
* exits 2 loudly — a gate that cannot read its baseline must never pass.
|
|
125
|
+
*/
|
|
126
|
+
function runBaselineGate(report, baselinePath, failOn, quiet, args) {
|
|
127
|
+
let text;
|
|
128
|
+
try {
|
|
129
|
+
text = fs.readFileSync(baselinePath, 'utf8');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
console.error(`--baseline file not found or unreadable: ${baselinePath}`);
|
|
133
|
+
return 2;
|
|
134
|
+
}
|
|
135
|
+
// Tolerate a raw YAML trailer file, mirroring `usa diff`.
|
|
136
|
+
const trailerYaml = parseTrailer(text) ?? text;
|
|
137
|
+
if (!trailerYaml.trim()) {
|
|
138
|
+
console.error(`--baseline has no report trailer and no YAML content: ${baselinePath}`);
|
|
139
|
+
return 2;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const baseline = parseBaselineTrailer(trailerYaml);
|
|
143
|
+
// An explicit --fail-on (even none) wins; otherwise the new-code gate
|
|
144
|
+
// defaults to HIGH so legacy MEDIUM/LOW debt never blocks adoption.
|
|
145
|
+
const threshold = failOn === 'none' && args['baseline'] !== undefined && args['fail-on'] === undefined
|
|
146
|
+
? 'high'
|
|
147
|
+
: failOn;
|
|
148
|
+
return evaluateNewCodeGate(report, baseline, threshold, quiet);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
console.error(`--baseline is malformed (${baselinePath}): ${err.message}`);
|
|
152
|
+
return 2;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function renderReport(report, profile, format) {
|
|
156
|
+
switch (format) {
|
|
157
|
+
case 'json':
|
|
158
|
+
return renderJson(report);
|
|
159
|
+
case 'sarif':
|
|
160
|
+
return renderSarif(report);
|
|
161
|
+
case 'narrative':
|
|
162
|
+
return renderNarrative(report, profile);
|
|
163
|
+
case 'html':
|
|
164
|
+
return renderHtml(report, profile);
|
|
165
|
+
default:
|
|
166
|
+
return renderMarkdown(report, profile);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function summaryLine(report) {
|
|
170
|
+
const s = report.score.severityCounts;
|
|
171
|
+
const parts = SEVERITY_ORDER.filter((k) => s[k] > 0)
|
|
172
|
+
.map((k) => `${k.toLowerCase()} ${s[k]}`)
|
|
173
|
+
.join(' · ');
|
|
174
|
+
return (`usa ${report.score.overall}/100 (${report.detection.maturity}) — ` +
|
|
175
|
+
`${report.score.counts.PASS} passed, ` +
|
|
176
|
+
(parts ? `open: ${parts}` : 'no open findings') +
|
|
177
|
+
`, ${report.score.counts.UNKNOWN} to review` +
|
|
178
|
+
` (${report.score.automationCoverage}% verified automatically)`);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=cli-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-audit.js","sourceRoot":"","sources":["../src/cli-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-evolve.d.ts","sourceRoot":"","sources":["../src/cli-evolve.ts"],"names":[],"mappings":"AAaA,OAAO,EAAuD,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAE/F,mFAAmF;AAGnF,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAsC5C"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { Store } from './store/index.js';
|
|
4
|
+
import { runEvolutionCycle } from './evolution/run.js';
|
|
5
|
+
import { loadPackFile } from './engine/loader.js';
|
|
6
|
+
import { capabilityFromPack } from './evolution/capability.js';
|
|
7
|
+
import { VERSION, DEFAULT_RULES_DIR, bool, dryRunWrites, str } from './cli-args.js';
|
|
8
|
+
/** The `evolve` loop driver: audit → gap → candidate → release, with reporting. */
|
|
9
|
+
/* ----------------------------------------------------------------- evolve -- */
|
|
10
|
+
export function cmdEvolve(args) {
|
|
11
|
+
const target = args._[1] ?? '.';
|
|
12
|
+
const rulesDir = path.resolve(str(args, 'rules-dir', DEFAULT_RULES_DIR) ?? DEFAULT_RULES_DIR);
|
|
13
|
+
if (!fs.existsSync(target)) {
|
|
14
|
+
console.error(`Target path does not exist: ${target}`);
|
|
15
|
+
return 2;
|
|
16
|
+
}
|
|
17
|
+
const storeDir = str(args, 'store');
|
|
18
|
+
// CLI-003: preview before the cycle runs (or the store dir is created).
|
|
19
|
+
if (!dryRunWrites(args, storeDir ? [path.join(storeDir, 'objects')] : []))
|
|
20
|
+
return 0;
|
|
21
|
+
const store = storeDir ? new Store(storeDir) : undefined;
|
|
22
|
+
const candidateCapability = loadEvolveCandidate(args);
|
|
23
|
+
const cases = loadEvolveCases(args, candidateCapability);
|
|
24
|
+
const learnReportPath = loadEvolveLearn(args);
|
|
25
|
+
const proposeFromGaps = bool(args, 'propose') && !candidateCapability && !learnReportPath;
|
|
26
|
+
const allGaps = bool(args, 'all-gaps');
|
|
27
|
+
const result = runEvolutionCycle({
|
|
28
|
+
target,
|
|
29
|
+
rulesDir,
|
|
30
|
+
engineVersion: VERSION,
|
|
31
|
+
candidateCapability,
|
|
32
|
+
benchmarkCases: cases,
|
|
33
|
+
store,
|
|
34
|
+
learnReportPath,
|
|
35
|
+
learnMinSeverity: str(args, 'min-severity', 'MEDIUM'),
|
|
36
|
+
proposeFromGaps,
|
|
37
|
+
allGaps,
|
|
38
|
+
onUnproposable: (gap, reason) => {
|
|
39
|
+
console.error(`warning: ${gap.id} not proposable (${reason})`);
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
printEvolutionResult(result);
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
/** Resolve `--learn <report.md>` to an existing path, or undefined. */
|
|
46
|
+
function loadEvolveLearn(args) {
|
|
47
|
+
const reportPath = str(args, 'learn');
|
|
48
|
+
if (!reportPath)
|
|
49
|
+
return undefined;
|
|
50
|
+
if (!fs.existsSync(reportPath)) {
|
|
51
|
+
console.error(`warning: learn report not found (${reportPath}) — ignoring --learn`);
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
return reportPath;
|
|
55
|
+
}
|
|
56
|
+
function loadEvolveCandidate(args) {
|
|
57
|
+
const candidateFile = str(args, 'candidate');
|
|
58
|
+
if (!candidateFile)
|
|
59
|
+
return undefined;
|
|
60
|
+
const { pack, warnings } = loadPackFile(candidateFile);
|
|
61
|
+
for (const w of warnings)
|
|
62
|
+
console.error(`warning: ${w}`);
|
|
63
|
+
if (!pack) {
|
|
64
|
+
console.error(`Could not load candidate pack: ${candidateFile}`);
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
return capabilityFromPack(pack, { createdBy: 'cli' });
|
|
68
|
+
}
|
|
69
|
+
function loadEvolveCases(args, candidateCapability) {
|
|
70
|
+
const benchDir = str(args, 'bench-dir');
|
|
71
|
+
const cases = benchDir ? loadBenchCases(benchDir) : [];
|
|
72
|
+
if (candidateCapability && cases.length === 0) {
|
|
73
|
+
console.error('warning: no benchmark cases supplied (--bench-dir). The release decision will be vacuous.');
|
|
74
|
+
}
|
|
75
|
+
return cases;
|
|
76
|
+
}
|
|
77
|
+
function loadBenchCases(dir) {
|
|
78
|
+
if (!fs.existsSync(dir))
|
|
79
|
+
return [];
|
|
80
|
+
const cases = [];
|
|
81
|
+
for (const entry of fs.readdirSync(dir)) {
|
|
82
|
+
if (!entry.endsWith('.json'))
|
|
83
|
+
continue;
|
|
84
|
+
try {
|
|
85
|
+
const raw = JSON.parse(fs.readFileSync(path.join(dir, entry), 'utf8'));
|
|
86
|
+
if (raw && raw.id && Array.isArray(raw.expected) && raw.fixture)
|
|
87
|
+
cases.push(raw);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
console.error(`warning: could not read benchmark case ${entry}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return cases;
|
|
94
|
+
}
|
|
95
|
+
function printEvolutionResult(result) {
|
|
96
|
+
console.log(`# Evolution: ${result.snapshot.root}`);
|
|
97
|
+
console.log();
|
|
98
|
+
console.log(`snapshot : ${result.snapshot.id}`);
|
|
99
|
+
printCoverage('before', result.before.coverage);
|
|
100
|
+
printGaps(result.before.gaps);
|
|
101
|
+
if (!result.candidate) {
|
|
102
|
+
console.log();
|
|
103
|
+
if (result.proposed.length > 0) {
|
|
104
|
+
console.log(`proposed : ${result.proposed.length} candidate(s) (none benchmarked)`);
|
|
105
|
+
printProposed(result.proposed);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
console.log('No candidate capability supplied (--candidate <pack.yaml>).');
|
|
109
|
+
console.log('This was the deterministic BEFORE half of the loop only.');
|
|
110
|
+
console.log('Pass --propose to auto-propose a candidate from the gaps.');
|
|
111
|
+
}
|
|
112
|
+
printQueue(result.queue);
|
|
113
|
+
printSchedule(result.schedule);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const release = result.candidate.release;
|
|
117
|
+
console.log();
|
|
118
|
+
console.log(`candidate : ${result.candidate.capabilityId} (gaps: ${result.candidate.gapIds.join(', ')})`);
|
|
119
|
+
if (result.proposed.length > 0)
|
|
120
|
+
printProposed(result.proposed);
|
|
121
|
+
if (result.learnedSuggestions !== undefined) {
|
|
122
|
+
console.log(`learned : ${result.learnedSuggestions} suggestion(s) from report`);
|
|
123
|
+
}
|
|
124
|
+
if (release) {
|
|
125
|
+
console.log(`release decision: ${release.decision}`);
|
|
126
|
+
console.log(` precision ${release.precision.toFixed(3)} · recall ${release.recall.toFixed(3)} · regressions ${release.regressions}`);
|
|
127
|
+
for (const r of release.reasons)
|
|
128
|
+
console.log(` - ${r}`);
|
|
129
|
+
}
|
|
130
|
+
if (result.after) {
|
|
131
|
+
console.log();
|
|
132
|
+
printCoverage('after', result.after.coverage);
|
|
133
|
+
const d = result.after.delta;
|
|
134
|
+
console.log(`delta : coverage +${d.coverageDelta}pt · ${d.findingsAdded.length} finding(s) added · gap reduced: ${d.gapReduced}`);
|
|
135
|
+
if (d.findingsAdded.length)
|
|
136
|
+
console.log(` new findings: ${d.findingsAdded.join(', ')}`);
|
|
137
|
+
}
|
|
138
|
+
if (result.queue) {
|
|
139
|
+
console.log(`queue : ${result.queue.open} open · ${result.queue.closed} closed · ${result.queue.total} total`);
|
|
140
|
+
}
|
|
141
|
+
printSchedule(result.schedule);
|
|
142
|
+
}
|
|
143
|
+
function printSchedule(schedule) {
|
|
144
|
+
if (!schedule)
|
|
145
|
+
return;
|
|
146
|
+
for (const c of schedule.candidates) {
|
|
147
|
+
const blocked = c.blockedReason ? ` · blocked: ${c.blockedReason}` : '';
|
|
148
|
+
console.log(`schedule : ${c.capabilityId} → ${c.outcome} ` +
|
|
149
|
+
`(precision ${c.release.precision.toFixed(3)} · recall ${c.release.recall.toFixed(3)} · ` +
|
|
150
|
+
`regressions ${c.release.regressions}, closed: ${c.closedGapIds.length} gap(s))${blocked}`);
|
|
151
|
+
}
|
|
152
|
+
console.log(`schedule : ${schedule.attempted} attempted · ${schedule.released} released · ${schedule.rejected} rejected`);
|
|
153
|
+
}
|
|
154
|
+
function printQueue(queue) {
|
|
155
|
+
if (!queue)
|
|
156
|
+
return;
|
|
157
|
+
console.log(`queue : ${queue.open} open · ${queue.closed} closed · ${queue.total} total`);
|
|
158
|
+
}
|
|
159
|
+
function printCoverage(label, cov) {
|
|
160
|
+
console.log(`${label.padEnd(16)}: language coverage ${cov.languageCoverage}% · automation ${cov.automationCoverage}%`);
|
|
161
|
+
if (cov.unsupportedLanguages.length) {
|
|
162
|
+
console.log(` unsupported : ${cov.unsupportedLanguages.join(', ')}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function printGaps(gaps) {
|
|
166
|
+
if (gaps.length === 0) {
|
|
167
|
+
console.log('gaps : none');
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
console.log(`gaps : ${gaps.length}`);
|
|
171
|
+
for (const g of gaps)
|
|
172
|
+
console.log(` - ${g.id} [${g.priority}] ${g.requiredCapability}`);
|
|
173
|
+
}
|
|
174
|
+
function printProposed(proposed) {
|
|
175
|
+
for (const c of proposed) {
|
|
176
|
+
const langs = c.capability.languages?.join(', ') ?? 'unknown';
|
|
177
|
+
const rules = c.capability.pack?.rules.length ?? 0;
|
|
178
|
+
console.log(` proposed : ${c.id} (${rules} rule(s), langs: ${langs}) → gap ${c.gapIds.join(', ')} [${c.status}]`);
|
|
179
|
+
}
|
|
180
|
+
console.log(' review required — proposals are unreviewed bootstrap packs, never registered.');
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=cli-evolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-evolve.js","sourceRoot":"","sources":["../src/cli-evolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAA6B,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAQ/D,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAa,MAAM,eAAe,CAAC;AAE/F,mFAAmF;AACnF,iFAAiF;AAEjF,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,MAAM,MAAM,GAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAwB,IAAI,GAAG,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,CAAC;IAC9F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,wEAAwE;IACxE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,eAAe,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAC/B,MAAM;QACN,QAAQ;QACR,aAAa,EAAE,OAAO;QACtB,mBAAmB;QACnB,cAAc,EAAE,KAAK;QACrB,KAAK;QACL,eAAe;QACf,gBAAgB,EAAE,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,CACD;QACnD,eAAe;QACf,OAAO;QACP,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,oBAAoB,MAAM,GAAG,CAAC,CAAC;QACjE,CAAC;KACF,CAAC,CAAC;IAEH,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,uEAAuE;AACvE,SAAS,eAAe,CAAC,IAAU;IACjC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,oCAAoC,UAAU,sBAAsB,CAAC,CAAC;QACpF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAU;IACrC,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,kCAAkC,aAAa,EAAE,CAAC,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,kBAAkB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,IAAU,EAAE,mBAA4B;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,IAAI,mBAAmB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,KAAK,CACX,2FAA2F,CAC5F,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAkB,CAAC;YACxF,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,MAA4B;IACxD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE9B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,QAAQ,CAAC,MAAM,kCAAkC,CAAC,CAAC;YAC3F,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;QACD,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CACT,qBAAqB,MAAM,CAAC,SAAS,CAAC,YAAY,WAAW,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACnG,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,kBAAkB,4BAA4B,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CACT,eAAe,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,OAAO,CAAC,WAAW,EAAE,CACzH,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7B,OAAO,CAAC,GAAG,CACT,+BAA+B,CAAC,CAAC,aAAa,QAAQ,CAAC,CAAC,aAAa,CAAC,MAAM,oCAAoC,CAAC,CAAC,UAAU,EAAE,CAC/H,CAAC;QACF,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,qBAAqB,MAAM,CAAC,KAAK,CAAC,IAAI,WAAW,MAAM,CAAC,KAAK,CAAC,MAAM,aAAa,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAC5G,CAAC;IACJ,CAAC;IACD,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,QAA0C;IAC/D,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,GAAG,CACT,qBAAqB,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,OAAO,GAAG;YACnD,cAAc,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YACzF,eAAe,CAAC,CAAC,OAAO,CAAC,WAAW,aAAa,CAAC,CAAC,YAAY,CAAC,MAAM,WAAW,OAAO,EAAE,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,CACT,qBAAqB,QAAQ,CAAC,SAAS,gBAAgB,QAAQ,CAAC,QAAQ,eAAe,QAAQ,CAAC,QAAQ,WAAW,CACpH,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAA+B;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,OAAO,CAAC,GAAG,CACT,qBAAqB,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,aAAa,KAAK,CAAC,KAAK,QAAQ,CACvF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,GAAkB;IACtD,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,uBAAuB,GAAG,CAAC,gBAAgB,kBAAkB,GAAG,CAAC,kBAAkB,GAAG,CAC1G,CAAC;IACF,IAAI,GAAG,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAqB;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,aAAa,CAAC,QAA+B;IACpD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QAC9D,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CACT,qBAAqB,CAAC,CAAC,EAAE,KAAK,KAAK,oBAAoB,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAC3G,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;AACjG,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Help texts and scaffold templates (pure data — no imports). Generated docs embed the help. */
|
|
2
|
+
export declare const MODELS_HELP_TEXT: string;
|
|
3
|
+
export declare const LIVE_HELP_TEXT: string;
|
|
4
|
+
export declare const HELP: string;
|
|
5
|
+
export declare const WORKFLOW_TEMPLATE = "# USA \u2014 Universal Software Auditor\n# Runs on every PR and pushes a Markdown summary you can read in the Actions UI.\nname: USA Audit\n\non:\n pull_request:\n push:\n branches: [master]\n workflow_dispatch:\n inputs:\n depth:\n description: Audit depth\n required: false\n default: standard\n type: choice\n options: [quick, standard, deep]\n\npermissions:\n contents: read\n";
|
|
6
|
+
//# sourceMappingURL=cli-help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-help.d.ts","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG,eAAO,MAAM,gBAAgB,QAOrB,CAAC;AAET,eAAO,MAAM,cAAc,QAcnB,CAAC;AAET,eAAO,MAAM,IAAI,QAoGT,CAAC;AAET,eAAO,MAAM,iBAAiB,mbAmB7B,CAAC"}
|