@bouncesecurity/aghast 0.4.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +8 -3
  2. package/config/pricing.json +42 -0
  3. package/config/prompts/false-positive-validation.md +1 -0
  4. package/config/prompts/general-vuln-discovery.md +8 -3
  5. package/config/prompts/generic-instructions.md +3 -2
  6. package/dist/budget.d.ts +62 -0
  7. package/dist/budget.d.ts.map +1 -0
  8. package/dist/budget.js +137 -0
  9. package/dist/budget.js.map +1 -0
  10. package/dist/build-config.d.ts +15 -0
  11. package/dist/build-config.d.ts.map +1 -0
  12. package/dist/build-config.js +568 -0
  13. package/dist/build-config.js.map +1 -0
  14. package/dist/check-library.d.ts +1 -0
  15. package/dist/check-library.d.ts.map +1 -1
  16. package/dist/check-library.js +26 -7
  17. package/dist/check-library.js.map +1 -1
  18. package/dist/check-types.d.ts +1 -1
  19. package/dist/check-types.d.ts.map +1 -1
  20. package/dist/claude-code-provider.d.ts +6 -6
  21. package/dist/claude-code-provider.d.ts.map +1 -1
  22. package/dist/claude-code-provider.js +151 -66
  23. package/dist/claude-code-provider.js.map +1 -1
  24. package/dist/cli.js +19 -3
  25. package/dist/cli.js.map +1 -1
  26. package/dist/colors.js +4 -4
  27. package/dist/colors.js.map +1 -1
  28. package/dist/cost-calculator.d.ts +80 -0
  29. package/dist/cost-calculator.d.ts.map +1 -0
  30. package/dist/cost-calculator.js +226 -0
  31. package/dist/cost-calculator.js.map +1 -0
  32. package/dist/defaults.d.ts +21 -0
  33. package/dist/defaults.d.ts.map +1 -0
  34. package/dist/defaults.js +21 -0
  35. package/dist/defaults.js.map +1 -0
  36. package/dist/discoveries/openant-discovery.d.ts.map +1 -1
  37. package/dist/discoveries/openant-discovery.js +3 -2
  38. package/dist/discoveries/openant-discovery.js.map +1 -1
  39. package/dist/discoveries/sarif-discovery.d.ts.map +1 -1
  40. package/dist/discoveries/sarif-discovery.js +2 -1
  41. package/dist/discoveries/sarif-discovery.js.map +1 -1
  42. package/dist/discoveries/semgrep-discovery.d.ts.map +1 -1
  43. package/dist/discoveries/semgrep-discovery.js +11 -2
  44. package/dist/discoveries/semgrep-discovery.js.map +1 -1
  45. package/dist/discovery.d.ts +8 -2
  46. package/dist/discovery.d.ts.map +1 -1
  47. package/dist/discovery.js +8 -0
  48. package/dist/discovery.js.map +1 -1
  49. package/dist/error-codes.d.ts +3 -1
  50. package/dist/error-codes.d.ts.map +1 -1
  51. package/dist/error-codes.js +10 -3
  52. package/dist/error-codes.js.map +1 -1
  53. package/dist/formatters/types.d.ts +1 -1
  54. package/dist/formatters/types.js +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +257 -82
  57. package/dist/index.js.map +1 -1
  58. package/dist/logging.d.ts +1 -1
  59. package/dist/logging.d.ts.map +1 -1
  60. package/dist/logging.js +50 -31
  61. package/dist/logging.js.map +1 -1
  62. package/dist/{mock-ai-provider.d.ts → mock-agent-provider.d.ts} +10 -7
  63. package/dist/mock-agent-provider.d.ts.map +1 -0
  64. package/dist/{mock-ai-provider.js → mock-agent-provider.js} +15 -8
  65. package/dist/mock-agent-provider.js.map +1 -0
  66. package/dist/new-check.js +2 -2
  67. package/dist/new-check.js.map +1 -1
  68. package/dist/opencode-provider.d.ts +63 -0
  69. package/dist/opencode-provider.d.ts.map +1 -0
  70. package/dist/opencode-provider.js +614 -0
  71. package/dist/opencode-provider.js.map +1 -0
  72. package/dist/prompt-template.d.ts.map +1 -1
  73. package/dist/prompt-template.js +2 -1
  74. package/dist/prompt-template.js.map +1 -1
  75. package/dist/provider-registry.d.ts +6 -6
  76. package/dist/provider-registry.d.ts.map +1 -1
  77. package/dist/provider-registry.js +6 -4
  78. package/dist/provider-registry.js.map +1 -1
  79. package/dist/provider-utils.d.ts +52 -0
  80. package/dist/provider-utils.d.ts.map +1 -0
  81. package/dist/provider-utils.js +40 -0
  82. package/dist/provider-utils.js.map +1 -0
  83. package/dist/response-parser.d.ts +8 -6
  84. package/dist/response-parser.d.ts.map +1 -1
  85. package/dist/response-parser.js +8 -6
  86. package/dist/response-parser.js.map +1 -1
  87. package/dist/runtime-config.d.ts +4 -4
  88. package/dist/runtime-config.d.ts.map +1 -1
  89. package/dist/runtime-config.js +107 -8
  90. package/dist/runtime-config.js.map +1 -1
  91. package/dist/scan-history.d.ts +82 -0
  92. package/dist/scan-history.d.ts.map +1 -0
  93. package/dist/scan-history.js +127 -0
  94. package/dist/scan-history.js.map +1 -0
  95. package/dist/scan-runner.d.ts +67 -4
  96. package/dist/scan-runner.d.ts.map +1 -1
  97. package/dist/scan-runner.js +267 -51
  98. package/dist/scan-runner.js.map +1 -1
  99. package/dist/stats.d.ts +11 -0
  100. package/dist/stats.d.ts.map +1 -0
  101. package/dist/stats.js +197 -0
  102. package/dist/stats.js.map +1 -0
  103. package/dist/types.d.ts +74 -8
  104. package/dist/types.d.ts.map +1 -1
  105. package/dist/types.js +3 -3
  106. package/dist/types.js.map +1 -1
  107. package/package.json +6 -4
  108. package/dist/mock-ai-provider.d.ts.map +0 -1
  109. package/dist/mock-ai-provider.js.map +0 -1
@@ -0,0 +1,568 @@
1
+ /**
2
+ * CLI utility for building / editing a runtime-config.json file.
3
+ *
4
+ * Interactive by default; flag-only mode skips prompts. If a config file
5
+ * already exists, its values are loaded and used as defaults — only the
6
+ * fields you change (or pass as flags) are updated.
7
+ *
8
+ * Usage:
9
+ * aghast build-config --config-dir <path> # interactive, file at <path>/runtime-config.json
10
+ * aghast build-config --runtime-config <file> # interactive, write to explicit file
11
+ * aghast build-config --config-dir <path> --provider claude-code --model sonnet # non-interactive
12
+ * aghast build-config --config-dir <path> --non-interactive # accept all current/defaults
13
+ */
14
+ import { writeFile, mkdir, access } from 'node:fs/promises';
15
+ import { resolve, dirname } from 'node:path';
16
+ import { createInterface } from 'node:readline/promises';
17
+ import { stdin, stdout } from 'node:process';
18
+ import { createRequire } from 'node:module';
19
+ import { ERROR_CODES, formatError, formatFatalError } from './error-codes.js';
20
+ import { loadRuntimeConfig } from './runtime-config.js';
21
+ import { createProviderByName, getProviderNames, DEFAULT_PROVIDER_NAME } from './provider-registry.js';
22
+ import { getAvailableFormats } from './formatters/index.js';
23
+ import { getAvailableLogTypes, isValidLogLevel, getLogLevel, setLogLevel } from './logging.js';
24
+ import { DEFAULT_MODEL } from './types.js';
25
+ import { DEFAULT_OUTPUT_FORMAT, DEFAULT_LOG_LEVEL, DEFAULT_LOG_TYPE, DEFAULT_GENERIC_PROMPT, DEFAULT_FAIL_ON_CHECK_FAILURE, } from './defaults.js';
26
+ /** Defaults shown in interactive prompts so users know what they'd get by leaving a field unset.
27
+ * Sourced from the same constants the scanner uses at runtime — no duplication. */
28
+ const SCAN_DEFAULTS = {
29
+ provider: DEFAULT_PROVIDER_NAME,
30
+ model: DEFAULT_MODEL,
31
+ outputFormat: DEFAULT_OUTPUT_FORMAT,
32
+ outputDirectory: '<repo-path>', // No constant — derived at runtime from the scanned repo path
33
+ logLevel: DEFAULT_LOG_LEVEL,
34
+ logType: DEFAULT_LOG_TYPE,
35
+ genericPrompt: DEFAULT_GENERIC_PROMPT,
36
+ failOnCheckFailure: DEFAULT_FAIL_ON_CHECK_FAILURE,
37
+ };
38
+ const VALID_LOG_LEVELS = ['error', 'warn', 'info', 'debug', 'trace'];
39
+ const VALID_BOOLS = ['true', 'false'];
40
+ const FLAG_MAP = {
41
+ '--config-dir': 'configDir',
42
+ '--runtime-config': 'runtimeConfig',
43
+ '--provider': 'provider',
44
+ '--model': 'model',
45
+ '--output-format': 'outputFormat',
46
+ '--output-directory': 'outputDirectory',
47
+ '--log-level': 'logLevel',
48
+ '--log-file': 'logFile',
49
+ '--log-type': 'logType',
50
+ '--generic-prompt': 'genericPrompt',
51
+ '--fail-on-check-failure': 'failOnCheckFailure',
52
+ };
53
+ const KNOWN_FLAGS = new Set([...Object.keys(FLAG_MAP), '--non-interactive', '--clear', '--help', '-h']);
54
+ function parseFlags(args) {
55
+ const flags = {};
56
+ const clear = [];
57
+ for (let i = 0; i < args.length; i++) {
58
+ const arg = args[i];
59
+ if (arg === '--non-interactive') {
60
+ flags.nonInteractive = true;
61
+ continue;
62
+ }
63
+ if (arg === '--clear') {
64
+ const value = args[i + 1];
65
+ if (value === undefined || value.startsWith('--')) {
66
+ console.error(formatError(ERROR_CODES.E1001, '--clear requires a field name'));
67
+ process.exit(1);
68
+ }
69
+ clear.push(value);
70
+ i++;
71
+ continue;
72
+ }
73
+ const key = FLAG_MAP[arg];
74
+ if (key) {
75
+ const value = args[i + 1];
76
+ if (value === undefined || value.startsWith('--')) {
77
+ console.error(formatError(ERROR_CODES.E1001, `${arg} requires a value`));
78
+ process.exit(1);
79
+ }
80
+ flags[key] = value;
81
+ i++;
82
+ continue;
83
+ }
84
+ if (arg.startsWith('--') || arg.startsWith('-')) {
85
+ // Unknown option — fail fast instead of silently ignoring (catches typos like `--outpt-format`).
86
+ const known = [...KNOWN_FLAGS].sort().join(', ');
87
+ console.error(formatError(ERROR_CODES.E1001, `Unknown option "${arg}". Known: ${known}`));
88
+ process.exit(1);
89
+ }
90
+ // Bare positional args are not used by build-config.
91
+ console.error(formatError(ERROR_CODES.E1001, `Unexpected positional argument "${arg}"`));
92
+ process.exit(1);
93
+ }
94
+ if (clear.length > 0) {
95
+ flags.clear = clear;
96
+ }
97
+ return flags;
98
+ }
99
+ const HELP = `Usage: aghast build-config [options]
100
+
101
+ Build or edit a runtime-config.json file. Interactive by default; pass --non-interactive
102
+ or any value flags to skip prompts. If the target file already exists, its values are
103
+ loaded as defaults — only fields you change are updated.
104
+
105
+ Target file:
106
+ --config-dir <path> Write to <path>/runtime-config.json (created if missing)
107
+ --runtime-config <path> Write to an explicit file path
108
+ (one of these is required; --runtime-config wins if both
109
+ are given)
110
+
111
+ Field flags (any value provided here skips its prompt; closed lists are validated):
112
+ --provider <name> Agent provider name (e.g. claude-code)
113
+ --model <id> Model ID. Must be one returned by the provider's
114
+ listModels() (skip flag and use interactive mode to
115
+ browse the live list).
116
+ --output-format <fmt> Output format: json | sarif
117
+ --output-directory <path> Default output directory for results
118
+ --log-level <level> Console log level: error | warn | info | debug | trace
119
+ --log-file <path> Log file path (omit to disable)
120
+ --log-type <type> Log file handler type (default: file)
121
+ --generic-prompt <file> Generic prompt template filename
122
+ --fail-on-check-failure <b> true | false
123
+
124
+ Mode flags:
125
+ --non-interactive Don't prompt — use existing values / defaults / flags only
126
+ --clear <field> Remove a field from the config. May be repeated.
127
+ Fields: provider, model, outputFormat, outputDirectory,
128
+ logLevel, logFile, logType, genericPrompt,
129
+ failOnCheckFailure
130
+ -h, --help Show this help message
131
+
132
+ Examples:
133
+ aghast build-config --config-dir ./my-checks
134
+ aghast build-config --config-dir ./my-checks --provider claude-code --model sonnet --non-interactive
135
+ aghast build-config --runtime-config ./prod.json --output-format sarif --fail-on-check-failure true
136
+ aghast build-config --config-dir ./my-checks --clear logFile --clear genericPrompt`;
137
+ const CLEARABLE_FIELDS = new Set([
138
+ 'provider',
139
+ 'model',
140
+ 'outputFormat',
141
+ 'outputDirectory',
142
+ 'logLevel',
143
+ 'logFile',
144
+ 'logType',
145
+ 'genericPrompt',
146
+ 'failOnCheckFailure',
147
+ ]);
148
+ async function fileExists(path) {
149
+ try {
150
+ await access(path);
151
+ return true;
152
+ }
153
+ catch {
154
+ return false;
155
+ }
156
+ }
157
+ function configToFlatDefaults(config) {
158
+ return {
159
+ provider: config.agentProvider?.name,
160
+ model: config.agentProvider?.model,
161
+ outputFormat: config.reporting?.outputFormat,
162
+ outputDirectory: config.reporting?.outputDirectory,
163
+ logLevel: config.logging?.level,
164
+ logFile: config.logging?.logFile,
165
+ logType: config.logging?.logType,
166
+ genericPrompt: config.genericPrompt,
167
+ failOnCheckFailure: config.failOnCheckFailure,
168
+ };
169
+ }
170
+ function buildConfig(values) {
171
+ const config = {};
172
+ if (values.provider !== undefined || values.model !== undefined) {
173
+ config.agentProvider = {};
174
+ if (values.provider !== undefined)
175
+ config.agentProvider.name = values.provider;
176
+ if (values.model !== undefined)
177
+ config.agentProvider.model = values.model;
178
+ }
179
+ if (values.outputFormat !== undefined || values.outputDirectory !== undefined) {
180
+ config.reporting = {};
181
+ if (values.outputFormat !== undefined)
182
+ config.reporting.outputFormat = values.outputFormat;
183
+ if (values.outputDirectory !== undefined)
184
+ config.reporting.outputDirectory = values.outputDirectory;
185
+ }
186
+ if (values.logLevel !== undefined || values.logFile !== undefined || values.logType !== undefined) {
187
+ config.logging = {};
188
+ if (values.logLevel !== undefined)
189
+ config.logging.level = values.logLevel;
190
+ if (values.logFile !== undefined)
191
+ config.logging.logFile = values.logFile;
192
+ if (values.logType !== undefined)
193
+ config.logging.logType = values.logType;
194
+ }
195
+ if (values.genericPrompt !== undefined)
196
+ config.genericPrompt = values.genericPrompt;
197
+ if (values.failOnCheckFailure !== undefined)
198
+ config.failOnCheckFailure = values.failOnCheckFailure;
199
+ return config;
200
+ }
201
+ async function getProviderModels(providerName) {
202
+ const provider = createProviderByName(providerName);
203
+ // Silence provider progress logs ("Starting OpenCode server...", etc.) during the
204
+ // throwaway init/teardown used to fetch the model list. The user is in an interactive
205
+ // picker and doesn't need to see transient server lifecycle noise. Errors still surface
206
+ // via thrown exceptions, which the caller catches and reports.
207
+ const savedLevel = getLogLevel();
208
+ setLogLevel('silent');
209
+ try {
210
+ // Honor the AgentProvider contract — initialize() before any other method call.
211
+ // We intentionally pass an empty config so the provider falls back to env vars (e.g.
212
+ // ANTHROPIC_API_KEY). For providers like Claude Code that require either a key or
213
+ // AGHAST_LOCAL_CLAUDE=true, initialization may throw — let it propagate so callers
214
+ // can catch and degrade (e.g. fall back to free-text model entry).
215
+ await provider.initialize({});
216
+ if (!provider.listModels) {
217
+ return [];
218
+ }
219
+ return await provider.listModels();
220
+ }
221
+ finally {
222
+ // Providers that start subprocesses/servers (e.g. OpenCode) must be cleaned up,
223
+ // or the process leaks resources until Node exits. cleanup() is documented to be
224
+ // safe on partially-initialized providers. No-op for providers without cleanup.
225
+ await provider.cleanup?.();
226
+ setLogLevel(savedLevel);
227
+ }
228
+ }
229
+ /** Memoising fetcher — call once per (providerName, run) and re-use the result.
230
+ *
231
+ * Note: this caches the Promise itself, including rejections. That's intentional —
232
+ * if the SDK call fails (e.g. no API key, no local Claude session), we want subsequent
233
+ * lookups within the same run to hit the cached failure rather than retrying and
234
+ * spamming the user with the same warning twice (once interactively, once during
235
+ * validation). Both call sites already handle the rejection by warning + degrading. */
236
+ function makeModelFetcher() {
237
+ const cache = new Map();
238
+ return (name) => {
239
+ if (!cache.has(name)) {
240
+ cache.set(name, getProviderModels(name));
241
+ }
242
+ return cache.get(name);
243
+ };
244
+ }
245
+ function formatModelChoice(m) {
246
+ const parts = [m.id];
247
+ if (m.label && m.label !== m.id)
248
+ parts.push(`— ${m.label}`);
249
+ if (m.description)
250
+ parts.push(`· ${m.description}`);
251
+ return parts.join(' ');
252
+ }
253
+ function createPromptHelpers() {
254
+ const rl = createInterface({ input: stdin, output: stdout });
255
+ function emptyHint(builtInDefault) {
256
+ if (builtInDefault !== undefined && builtInDefault !== '') {
257
+ return ` (Enter to leave unset — default: ${builtInDefault})`;
258
+ }
259
+ return ' (Enter to leave unset)';
260
+ }
261
+ function setHint() {
262
+ return ' (Enter to keep, "-" to clear)';
263
+ }
264
+ async function ask(label, current, builtInDefault) {
265
+ if (current === undefined || current === '') {
266
+ const answer = (await rl.question(`${label}${emptyHint(builtInDefault)}: `)).trim();
267
+ if (answer === '' || answer === '-')
268
+ return undefined;
269
+ return answer;
270
+ }
271
+ const annotations = [`current: ${current}`];
272
+ if (builtInDefault !== undefined && builtInDefault !== '' && builtInDefault !== current) {
273
+ annotations.push(`default if cleared: ${builtInDefault}`);
274
+ }
275
+ const answer = (await rl.question(`${label} [${annotations.join(', ')}]${setHint()}: `)).trim();
276
+ if (answer === '')
277
+ return current;
278
+ if (answer === '-')
279
+ return undefined;
280
+ return answer;
281
+ }
282
+ async function askChoice(label, choices, current, builtInDefault) {
283
+ if (choices.length === 0) {
284
+ return ask(label, current, builtInDefault);
285
+ }
286
+ const hasCurrent = current !== undefined && choices.includes(current);
287
+ const numbered = choices
288
+ .map((c, i) => {
289
+ const annotations = [];
290
+ if (hasCurrent && c === current)
291
+ annotations.push('current');
292
+ if (builtInDefault !== undefined && c === builtInDefault)
293
+ annotations.push('default');
294
+ return ` ${i + 1}) ${c}${annotations.length > 0 ? ` (${annotations.join(', ')})` : ''}`;
295
+ })
296
+ .join('\n');
297
+ // For numbered choices, the "(default)" annotation in the list above is enough —
298
+ // don't duplicate it in the hint (Enter doesn't pick the default anyway).
299
+ const hint = hasCurrent ? setHint() : ' (Enter to leave unset)';
300
+ for (let attempt = 0; attempt < 3; attempt++) {
301
+ const answer = (await rl.question(`${label}:\n${numbered}\nChoice${hint}: `)).trim();
302
+ if (answer === '')
303
+ return hasCurrent ? current : undefined;
304
+ if (answer === '-')
305
+ return undefined;
306
+ const byNumber = parseInt(answer, 10);
307
+ if (!isNaN(byNumber) && byNumber >= 1 && byNumber <= choices.length) {
308
+ return choices[byNumber - 1];
309
+ }
310
+ if (choices.includes(answer))
311
+ return answer;
312
+ console.error(`Invalid choice "${answer}". Enter a number 1-${choices.length} or the value.`);
313
+ }
314
+ throw new Error(`No valid choice for "${label}" after 3 attempts`);
315
+ }
316
+ async function askBool(label, current, builtInDefault) {
317
+ const choice = await askChoice(label, VALID_BOOLS, current === undefined ? undefined : String(current), builtInDefault === undefined ? undefined : String(builtInDefault));
318
+ if (choice === undefined)
319
+ return undefined;
320
+ return choice === 'true';
321
+ }
322
+ return { ask, askChoice, askBool, close: () => rl.close() };
323
+ }
324
+ function validateAgainst(label, value, allowed) {
325
+ if (value === undefined)
326
+ return;
327
+ if (!allowed.includes(value)) {
328
+ throw new Error(`Invalid ${label} "${value}". Must be one of: ${allowed.join(', ')}`);
329
+ }
330
+ }
331
+ export async function runBuildConfig(args) {
332
+ if (args.includes('--help') || args.includes('-h')) {
333
+ console.log(HELP);
334
+ process.exit(0);
335
+ }
336
+ const flags = parseFlags(args);
337
+ // Validate --clear field names early
338
+ if (flags.clear) {
339
+ for (const field of flags.clear) {
340
+ if (!CLEARABLE_FIELDS.has(field)) {
341
+ console.error(formatError(ERROR_CODES.E1001, `Unknown --clear field "${field}". Valid fields: ${[...CLEARABLE_FIELDS].join(', ')}`));
342
+ process.exit(1);
343
+ }
344
+ }
345
+ }
346
+ // Resolve target file path
347
+ let targetPath;
348
+ if (flags.runtimeConfig) {
349
+ targetPath = resolve(flags.runtimeConfig);
350
+ }
351
+ else if (flags.configDir) {
352
+ targetPath = resolve(flags.configDir, 'runtime-config.json');
353
+ }
354
+ else if (process.env.AGHAST_CONFIG_DIR) {
355
+ targetPath = resolve(process.env.AGHAST_CONFIG_DIR, 'runtime-config.json');
356
+ }
357
+ else {
358
+ console.error(formatError(ERROR_CODES.E2001, 'One of --config-dir or --runtime-config is required (or set AGHAST_CONFIG_DIR).'));
359
+ process.exit(1);
360
+ }
361
+ // Load existing config (or empty)
362
+ const exists = await fileExists(targetPath);
363
+ let existing = {};
364
+ if (exists) {
365
+ try {
366
+ existing = await loadRuntimeConfig(undefined, targetPath);
367
+ console.log(`Loaded existing config from ${targetPath}`);
368
+ }
369
+ catch (err) {
370
+ console.error(formatError(ERROR_CODES.E2005, err instanceof Error ? err.message : String(err)));
371
+ process.exit(1);
372
+ }
373
+ }
374
+ else {
375
+ console.log(`No existing config at ${targetPath} — creating new one.`);
376
+ }
377
+ const defaults = configToFlatDefaults(existing);
378
+ // Validate provider flag if given (so we can fetch model list)
379
+ if (flags.provider !== undefined) {
380
+ const known = getProviderNames();
381
+ if (!known.includes(flags.provider)) {
382
+ console.error(formatError(ERROR_CODES.E3002, `Unknown provider "${flags.provider}". Known: ${known.join(', ')}`));
383
+ process.exit(1);
384
+ }
385
+ }
386
+ const interactive = !flags.nonInteractive
387
+ && (process.stdin.isTTY ?? false);
388
+ // Reject conflicting --clear <field> + --<field> <value>: ambiguous intent.
389
+ // `field` here is already validated against CLEARABLE_FIELDS (which never contains
390
+ // 'clear' or 'nonInteractive'), so `flags[field]` only resolves to value-bearing flags.
391
+ if (flags.clear) {
392
+ const conflicts = [];
393
+ for (const field of flags.clear) {
394
+ if (flags[field] !== undefined) {
395
+ conflicts.push(field);
396
+ }
397
+ }
398
+ if (conflicts.length > 0) {
399
+ const list = conflicts.map((f) => `--clear ${f} and --${f.replace(/([A-Z])/g, '-$1').toLowerCase()}`).join(', ');
400
+ console.error(formatError(ERROR_CODES.E1001, `Conflicting flags: ${list}. Use one or the other for each field.`));
401
+ process.exit(1);
402
+ }
403
+ }
404
+ const result = { ...defaults };
405
+ // Apply --clear first
406
+ if (flags.clear) {
407
+ for (const field of flags.clear) {
408
+ result[field] = undefined;
409
+ }
410
+ }
411
+ // Apply explicit flag values
412
+ if (flags.provider !== undefined)
413
+ result.provider = flags.provider;
414
+ if (flags.outputFormat !== undefined)
415
+ result.outputFormat = flags.outputFormat;
416
+ if (flags.outputDirectory !== undefined)
417
+ result.outputDirectory = flags.outputDirectory;
418
+ if (flags.logLevel !== undefined)
419
+ result.logLevel = flags.logLevel;
420
+ if (flags.logFile !== undefined)
421
+ result.logFile = flags.logFile;
422
+ if (flags.logType !== undefined)
423
+ result.logType = flags.logType;
424
+ if (flags.genericPrompt !== undefined)
425
+ result.genericPrompt = flags.genericPrompt;
426
+ if (flags.failOnCheckFailure !== undefined) {
427
+ if (!VALID_BOOLS.includes(flags.failOnCheckFailure)) {
428
+ console.error(formatError(ERROR_CODES.E1001, `Invalid --fail-on-check-failure "${flags.failOnCheckFailure}". Must be true or false.`));
429
+ process.exit(1);
430
+ }
431
+ result.failOnCheckFailure = flags.failOnCheckFailure === 'true';
432
+ }
433
+ // Model is applied last, after we have a resolved provider, so we can validate against listModels
434
+ const pendingModelFlag = flags.model;
435
+ // Cache provider→models lookups so we never call the SDK twice in one run.
436
+ const fetchModels = makeModelFetcher();
437
+ // Interactive prompts (only for fields not set by flags)
438
+ if (interactive) {
439
+ const helpers = createPromptHelpers();
440
+ try {
441
+ const providers = getProviderNames();
442
+ if (flags.provider === undefined) {
443
+ result.provider = await helpers.askChoice('Agent provider', providers, result.provider, SCAN_DEFAULTS.provider);
444
+ }
445
+ // Resolve provider for model listing — fall back to default only for the SDK call,
446
+ // not as a faked "current" value in the prompt above.
447
+ const providerForModels = result.provider ?? DEFAULT_PROVIDER_NAME;
448
+ let availableModels = [];
449
+ if (providers.includes(providerForModels)) {
450
+ try {
451
+ availableModels = await fetchModels(providerForModels);
452
+ }
453
+ catch (err) {
454
+ console.error(`Warning: could not fetch model list from "${providerForModels}": ${err instanceof Error ? err.message : String(err)}`);
455
+ console.error('Falling back to free-text model entry.');
456
+ }
457
+ }
458
+ if (pendingModelFlag === undefined) {
459
+ if (availableModels.length === 0) {
460
+ result.model = await helpers.ask('AI model', result.model, SCAN_DEFAULTS.model);
461
+ }
462
+ else {
463
+ const labels = availableModels.map(formatModelChoice);
464
+ // Match by id (not string-prefix on labels) — labels may include description text
465
+ // that could collide with another model's id.
466
+ const currentIdx = result.model
467
+ ? availableModels.findIndex((m) => m.id === result.model)
468
+ : -1;
469
+ const defaultIdx = availableModels.findIndex((m) => m.id === SCAN_DEFAULTS.model);
470
+ const currentLabel = currentIdx >= 0 ? labels[currentIdx] : undefined;
471
+ const defaultLabel = defaultIdx >= 0 ? labels[defaultIdx] : undefined;
472
+ const chosen = await helpers.askChoice('AI model (from provider SDK)', labels, currentLabel, defaultLabel);
473
+ if (chosen === undefined) {
474
+ result.model = undefined;
475
+ }
476
+ else {
477
+ const idx = labels.indexOf(chosen);
478
+ result.model = idx >= 0 ? availableModels[idx].id : chosen;
479
+ }
480
+ }
481
+ }
482
+ if (flags.outputFormat === undefined) {
483
+ result.outputFormat = await helpers.askChoice('Output format', getAvailableFormats(), result.outputFormat, SCAN_DEFAULTS.outputFormat);
484
+ }
485
+ if (flags.outputDirectory === undefined) {
486
+ result.outputDirectory = await helpers.ask('Output directory', result.outputDirectory, SCAN_DEFAULTS.outputDirectory);
487
+ }
488
+ if (flags.logLevel === undefined) {
489
+ result.logLevel = await helpers.askChoice('Log level', VALID_LOG_LEVELS, result.logLevel, SCAN_DEFAULTS.logLevel);
490
+ }
491
+ if (flags.logFile === undefined) {
492
+ result.logFile = await helpers.ask('Log file path', result.logFile);
493
+ }
494
+ if (flags.logType === undefined) {
495
+ const logTypes = getAvailableLogTypes();
496
+ result.logType = await helpers.askChoice('Log type', logTypes, result.logType, SCAN_DEFAULTS.logType);
497
+ }
498
+ if (flags.genericPrompt === undefined) {
499
+ result.genericPrompt = await helpers.ask('Generic prompt template filename', result.genericPrompt, SCAN_DEFAULTS.genericPrompt);
500
+ }
501
+ if (flags.failOnCheckFailure === undefined) {
502
+ result.failOnCheckFailure = await helpers.askBool('Fail on check failure', result.failOnCheckFailure, SCAN_DEFAULTS.failOnCheckFailure);
503
+ }
504
+ }
505
+ catch (err) {
506
+ // Includes "No valid choice for X after N attempts" — surface as a usage error.
507
+ // process.exit terminates synchronously without running pending finally blocks,
508
+ // so the readline handle is left for the OS to reclaim on this path. That's fine —
509
+ // the process is dying anyway. The finally below only runs on the happy path.
510
+ console.error(formatError(ERROR_CODES.E1003, err instanceof Error ? err.message : String(err)));
511
+ process.exit(1);
512
+ }
513
+ finally {
514
+ helpers.close();
515
+ }
516
+ }
517
+ // Apply pending model flag now (after interactive may have changed provider)
518
+ if (pendingModelFlag !== undefined) {
519
+ result.model = pendingModelFlag;
520
+ }
521
+ // Validate selections against closed lists
522
+ try {
523
+ if (result.provider !== undefined) {
524
+ validateAgainst('provider', result.provider, getProviderNames());
525
+ }
526
+ if (result.model !== undefined) {
527
+ const providerForValidation = result.provider ?? DEFAULT_PROVIDER_NAME;
528
+ if (getProviderNames().includes(providerForValidation)) {
529
+ try {
530
+ const allowed = await fetchModels(providerForValidation);
531
+ if (allowed.length > 0) {
532
+ const allowedIds = allowed.map((m) => m.id);
533
+ validateAgainst(`model for provider "${providerForValidation}"`, result.model, allowedIds);
534
+ }
535
+ }
536
+ catch (err) {
537
+ console.error(`Warning: skipped model validation — could not fetch model list: ${err instanceof Error ? err.message : String(err)}`);
538
+ }
539
+ }
540
+ }
541
+ validateAgainst('output format', result.outputFormat, getAvailableFormats());
542
+ if (result.logLevel !== undefined && !isValidLogLevel(result.logLevel)) {
543
+ throw new Error(`Invalid log level "${result.logLevel}". Must be one of: ${VALID_LOG_LEVELS.join(', ')}`);
544
+ }
545
+ validateAgainst('log type', result.logType, getAvailableLogTypes());
546
+ }
547
+ catch (err) {
548
+ console.error(formatError(ERROR_CODES.E2005, err instanceof Error ? err.message : String(err)));
549
+ process.exit(1);
550
+ }
551
+ const finalConfig = buildConfig(result);
552
+ // Bootstrap parent directory if needed
553
+ await mkdir(dirname(targetPath), { recursive: true });
554
+ await writeFile(targetPath, JSON.stringify(finalConfig, null, 2) + '\n', 'utf-8');
555
+ console.log(`\nWrote runtime config to ${targetPath}`);
556
+ }
557
+ // Auto-run when executed directly, but not when imported by cli.ts.
558
+ if (!process.env._AGHAST_CLI) {
559
+ await import('dotenv/config');
560
+ runBuildConfig(process.argv.slice(2)).catch((err) => {
561
+ const require = createRequire(import.meta.url);
562
+ const pkg = require('../package.json');
563
+ console.error('');
564
+ console.error(formatFatalError(err instanceof Error ? err.message : String(err), pkg.version));
565
+ process.exit(1);
566
+ });
567
+ }
568
+ //# sourceMappingURL=build-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.js","sourceRoot":"","sources":["../src/build-config.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,7 @@ export { normalizeRepoPath } from './repository-analyzer.js';
52
52
  /**
53
53
  * Check if a single check matches the given repository URL/path.
54
54
  * Empty repositories array matches all repos.
55
+ * Entries in excludeRepositories override matches (exclusion wins).
55
56
  * Uses bidirectional substring matching on normalized paths.
56
57
  */
57
58
  export declare function checkMatchesRepository(check: SecurityCheck, repositoryUrl: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"check-library.d.ts","sourceRoot":"","sources":["../src/check-library.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EAChB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0DjF;AAID;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgI3F;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2B9B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,aAAa,EAAE,CAAC,CAoD1B;AAID,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiChF;AAID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AAKD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAcT;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,aAAa,EAAE,EACvB,aAAa,EAAE,MAAM,GACpB,aAAa,EAAE,CAIjB;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAoB7E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAgBvB;AAOD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,MAAM,EAAE,CAOV;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,MAAM,EAAE,CAOV;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,aAAa,GACnB,MAAM,EAAE,CAGV"}
1
+ {"version":3,"file":"check-library.d.ts","sourceRoot":"","sources":["../src/check-library.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EAChB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAwEjF;AAID;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAmI3F;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2B9B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,aAAa,EAAE,CAAC,CAqD1B;AAID,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiChF;AAID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AAKD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAoBT;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,aAAa,EAAE,EACvB,aAAa,EAAE,MAAM,GACpB,aAAa,EAAE,CAIjB;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAoB7E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAgBvB;AAOD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,MAAM,EAAE,CAOV;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,MAAM,EAAE,CAOV;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,aAAa,GACnB,MAAM,EAAE,CAGV"}