@owasp-aghast/aghast 0.8.0-beta.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 (178) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +127 -0
  3. package/assets/img/aghastowaspcaption.png +0 -0
  4. package/assets/txt/logo.txt +52 -0
  5. package/config/pricing.json +42 -0
  6. package/config/prompts/false-positive-validation.md +78 -0
  7. package/config/prompts/general-vuln-discovery.md +99 -0
  8. package/config/prompts/generic-instructions.md +59 -0
  9. package/config/prompts/test-cheaper-instructions.md +57 -0
  10. package/dist/budget.d.ts +62 -0
  11. package/dist/budget.d.ts.map +1 -0
  12. package/dist/budget.js +137 -0
  13. package/dist/budget.js.map +1 -0
  14. package/dist/build-config.d.ts +15 -0
  15. package/dist/build-config.d.ts.map +1 -0
  16. package/dist/build-config.js +568 -0
  17. package/dist/build-config.js.map +1 -0
  18. package/dist/check-library.d.ts +88 -0
  19. package/dist/check-library.d.ts.map +1 -0
  20. package/dist/check-library.js +461 -0
  21. package/dist/check-library.js.map +1 -0
  22. package/dist/check-types.d.ts +35 -0
  23. package/dist/check-types.d.ts.map +1 -0
  24. package/dist/check-types.js +66 -0
  25. package/dist/check-types.js.map +1 -0
  26. package/dist/claude-code-provider.d.ts +29 -0
  27. package/dist/claude-code-provider.d.ts.map +1 -0
  28. package/dist/claude-code-provider.js +347 -0
  29. package/dist/claude-code-provider.js.map +1 -0
  30. package/dist/cli.d.ts +13 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +109 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/colors.d.ts +7 -0
  35. package/dist/colors.d.ts.map +1 -0
  36. package/dist/colors.js +18 -0
  37. package/dist/colors.js.map +1 -0
  38. package/dist/cost-calculator.d.ts +80 -0
  39. package/dist/cost-calculator.d.ts.map +1 -0
  40. package/dist/cost-calculator.js +226 -0
  41. package/dist/cost-calculator.js.map +1 -0
  42. package/dist/defaults.d.ts +21 -0
  43. package/dist/defaults.d.ts.map +1 -0
  44. package/dist/defaults.js +21 -0
  45. package/dist/defaults.js.map +1 -0
  46. package/dist/diff-filter.d.ts +50 -0
  47. package/dist/diff-filter.d.ts.map +1 -0
  48. package/dist/diff-filter.js +130 -0
  49. package/dist/diff-filter.js.map +1 -0
  50. package/dist/diff-parser.d.ts +40 -0
  51. package/dist/diff-parser.d.ts.map +1 -0
  52. package/dist/diff-parser.js +112 -0
  53. package/dist/diff-parser.js.map +1 -0
  54. package/dist/diff-unit-matcher.d.ts +53 -0
  55. package/dist/diff-unit-matcher.d.ts.map +1 -0
  56. package/dist/diff-unit-matcher.js +156 -0
  57. package/dist/diff-unit-matcher.js.map +1 -0
  58. package/dist/discoveries/openant-discovery.d.ts +10 -0
  59. package/dist/discoveries/openant-discovery.d.ts.map +1 -0
  60. package/dist/discoveries/openant-discovery.js +56 -0
  61. package/dist/discoveries/openant-discovery.js.map +1 -0
  62. package/dist/discoveries/sarif-discovery.d.ts +9 -0
  63. package/dist/discoveries/sarif-discovery.d.ts.map +1 -0
  64. package/dist/discoveries/sarif-discovery.js +56 -0
  65. package/dist/discoveries/sarif-discovery.js.map +1 -0
  66. package/dist/discoveries/semgrep-discovery.d.ts +9 -0
  67. package/dist/discoveries/semgrep-discovery.d.ts.map +1 -0
  68. package/dist/discoveries/semgrep-discovery.js +61 -0
  69. package/dist/discoveries/semgrep-discovery.js.map +1 -0
  70. package/dist/discovery.d.ts +100 -0
  71. package/dist/discovery.d.ts.map +1 -0
  72. package/dist/discovery.js +49 -0
  73. package/dist/discovery.js.map +1 -0
  74. package/dist/error-codes.d.ts +46 -0
  75. package/dist/error-codes.d.ts.map +1 -0
  76. package/dist/error-codes.js +70 -0
  77. package/dist/error-codes.js.map +1 -0
  78. package/dist/formatters/index.d.ts +10 -0
  79. package/dist/formatters/index.d.ts.map +1 -0
  80. package/dist/formatters/index.js +23 -0
  81. package/dist/formatters/index.js.map +1 -0
  82. package/dist/formatters/json-formatter.d.ts +11 -0
  83. package/dist/formatters/json-formatter.d.ts.map +1 -0
  84. package/dist/formatters/json-formatter.js +11 -0
  85. package/dist/formatters/json-formatter.js.map +1 -0
  86. package/dist/formatters/sarif-formatter.d.ts +18 -0
  87. package/dist/formatters/sarif-formatter.d.ts.map +1 -0
  88. package/dist/formatters/sarif-formatter.js +103 -0
  89. package/dist/formatters/sarif-formatter.js.map +1 -0
  90. package/dist/formatters/types.d.ts +11 -0
  91. package/dist/formatters/types.d.ts.map +1 -0
  92. package/dist/formatters/types.js +6 -0
  93. package/dist/formatters/types.js.map +1 -0
  94. package/dist/index.d.ts +7 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +754 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/logging.d.ts +140 -0
  99. package/dist/logging.d.ts.map +1 -0
  100. package/dist/logging.js +344 -0
  101. package/dist/logging.js.map +1 -0
  102. package/dist/mock-agent-provider.d.ts +24 -0
  103. package/dist/mock-agent-provider.d.ts.map +1 -0
  104. package/dist/mock-agent-provider.js +38 -0
  105. package/dist/mock-agent-provider.js.map +1 -0
  106. package/dist/mock-ai-provider.d.ts +21 -0
  107. package/dist/mock-ai-provider.d.ts.map +1 -0
  108. package/dist/mock-ai-provider.js +31 -0
  109. package/dist/mock-ai-provider.js.map +1 -0
  110. package/dist/new-check.d.ts +13 -0
  111. package/dist/new-check.d.ts.map +1 -0
  112. package/dist/new-check.js +515 -0
  113. package/dist/new-check.js.map +1 -0
  114. package/dist/openant-loader.d.ts +105 -0
  115. package/dist/openant-loader.d.ts.map +1 -0
  116. package/dist/openant-loader.js +135 -0
  117. package/dist/openant-loader.js.map +1 -0
  118. package/dist/openant-runner.d.ts +30 -0
  119. package/dist/openant-runner.d.ts.map +1 -0
  120. package/dist/openant-runner.js +113 -0
  121. package/dist/openant-runner.js.map +1 -0
  122. package/dist/opencode-provider.d.ts +63 -0
  123. package/dist/opencode-provider.d.ts.map +1 -0
  124. package/dist/opencode-provider.js +719 -0
  125. package/dist/opencode-provider.js.map +1 -0
  126. package/dist/prompt-template.d.ts +12 -0
  127. package/dist/prompt-template.d.ts.map +1 -0
  128. package/dist/prompt-template.js +36 -0
  129. package/dist/prompt-template.js.map +1 -0
  130. package/dist/provider-registry.d.ts +15 -0
  131. package/dist/provider-registry.d.ts.map +1 -0
  132. package/dist/provider-registry.js +29 -0
  133. package/dist/provider-registry.js.map +1 -0
  134. package/dist/provider-utils.d.ts +52 -0
  135. package/dist/provider-utils.d.ts.map +1 -0
  136. package/dist/provider-utils.js +40 -0
  137. package/dist/provider-utils.js.map +1 -0
  138. package/dist/repository-analyzer.d.ts +68 -0
  139. package/dist/repository-analyzer.d.ts.map +1 -0
  140. package/dist/repository-analyzer.js +238 -0
  141. package/dist/repository-analyzer.js.map +1 -0
  142. package/dist/response-parser.d.ts +14 -0
  143. package/dist/response-parser.d.ts.map +1 -0
  144. package/dist/response-parser.js +111 -0
  145. package/dist/response-parser.js.map +1 -0
  146. package/dist/runtime-config.d.ts +15 -0
  147. package/dist/runtime-config.d.ts.map +1 -0
  148. package/dist/runtime-config.js +187 -0
  149. package/dist/runtime-config.js.map +1 -0
  150. package/dist/sarif-parser.d.ts +20 -0
  151. package/dist/sarif-parser.d.ts.map +1 -0
  152. package/dist/sarif-parser.js +76 -0
  153. package/dist/sarif-parser.js.map +1 -0
  154. package/dist/scan-history.d.ts +82 -0
  155. package/dist/scan-history.d.ts.map +1 -0
  156. package/dist/scan-history.js +127 -0
  157. package/dist/scan-history.js.map +1 -0
  158. package/dist/scan-runner.d.ts +122 -0
  159. package/dist/scan-runner.d.ts.map +1 -0
  160. package/dist/scan-runner.js +928 -0
  161. package/dist/scan-runner.js.map +1 -0
  162. package/dist/semgrep-runner.d.ts +25 -0
  163. package/dist/semgrep-runner.d.ts.map +1 -0
  164. package/dist/semgrep-runner.js +100 -0
  165. package/dist/semgrep-runner.js.map +1 -0
  166. package/dist/snippet-extractor.d.ts +25 -0
  167. package/dist/snippet-extractor.d.ts.map +1 -0
  168. package/dist/snippet-extractor.js +56 -0
  169. package/dist/snippet-extractor.js.map +1 -0
  170. package/dist/stats.d.ts +11 -0
  171. package/dist/stats.d.ts.map +1 -0
  172. package/dist/stats.js +197 -0
  173. package/dist/stats.js.map +1 -0
  174. package/dist/types.d.ts +321 -0
  175. package/dist/types.d.ts.map +1 -0
  176. package/dist/types.js +19 -0
  177. package/dist/types.js.map +1 -0
  178. package/package.json +61 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Pluggable target discovery system.
3
+ *
4
+ * Separates "how targets are found" (discovery) from "what happens with them"
5
+ * (execution). Each discovery mechanism implements the TargetDiscovery interface
6
+ * and is registered in a central registry.
7
+ */
8
+ import type { SecurityCheck } from './types.js';
9
+ /**
10
+ * A target discovered by a discovery mechanism, ready for AI analysis.
11
+ * Contains location information plus optional discovery-specific enrichment.
12
+ */
13
+ export interface DiscoveredTarget {
14
+ /** File path relative to the repository root. */
15
+ file: string;
16
+ /** Start line number (1-based). */
17
+ startLine: number;
18
+ /** End line number (1-based). */
19
+ endLine: number;
20
+ /** Display label for logging (e.g. "[target 1/10]"). */
21
+ label: string;
22
+ /** Extra context appended to prompt per target (e.g. call graph for openant, finding details for sarif). */
23
+ promptEnrichment?: string;
24
+ /** Discovery-specific agent provider options (e.g. maxTurns for openant). */
25
+ agentOptions?: {
26
+ maxTurns?: number;
27
+ };
28
+ /** Message from the discovery tool (e.g. Semgrep finding description). */
29
+ message?: string;
30
+ /** Code snippet from the discovery tool (e.g. Semgrep snippet). */
31
+ snippet?: string;
32
+ }
33
+ /**
34
+ * Options passed to a discovery implementation.
35
+ *
36
+ * Diff-related values (diffRef, diffFile) intentionally don't live here.
37
+ * Diff filtering is applied by the scan runner after discovery completes,
38
+ * so the discovery implementations don't need to know about the diff.
39
+ */
40
+ export interface DiscoveryOptions {
41
+ /** Path to the target repository. */
42
+ repositoryPath: string;
43
+ /**
44
+ * Path to a pre-generated OpenAnt dataset.
45
+ * When provided, discoveries that use OpenAnt (currently `openant`) skip their
46
+ * internal runOpenAnt call and read from this file instead. The scan runner sets
47
+ * this to share one OpenAnt invocation across discovery and the diff filter.
48
+ */
49
+ openantDatasetPath?: string;
50
+ }
51
+ /**
52
+ * Interface for pluggable target discovery mechanisms.
53
+ * Each implementation knows how to find targets and enrich them with context.
54
+ */
55
+ export interface TargetDiscovery {
56
+ /** Discovery mechanism name (e.g. 'semgrep', 'openant', 'sarif'). */
57
+ readonly name: string;
58
+ /** Default generic prompt filename used for this discovery type. */
59
+ readonly defaultGenericPrompt: string;
60
+ /** Whether checks using this discovery require an instructions file. */
61
+ readonly needsInstructions: boolean;
62
+ /**
63
+ * Whether this discovery opts into automatic diff filtering when a diff
64
+ * source is available at scan time. True for all built-in discoveries today
65
+ * (semgrep, sarif, openant), since each returns targets with file/line info
66
+ * that can meaningfully be narrowed by the diff. Set false on a discovery
67
+ * whose output lacks file/line granularity or whose semantics make diff
68
+ * scoping nonsensical.
69
+ */
70
+ readonly supportsDiffFilter: boolean;
71
+ /**
72
+ * Discover targets in the repository for the given check.
73
+ * Returns an array of targets with optional prompt enrichment.
74
+ */
75
+ discover(check: SecurityCheck, repoPath: string, options?: DiscoveryOptions): Promise<DiscoveredTarget[]>;
76
+ }
77
+ /**
78
+ * Register a discovery implementation.
79
+ */
80
+ export declare function registerDiscovery(discovery: TargetDiscovery): void;
81
+ /**
82
+ * Get a discovery implementation by name.
83
+ * Throws if the discovery type is not registered.
84
+ */
85
+ export declare function getDiscovery(name: string): TargetDiscovery;
86
+ /**
87
+ * Get all registered discovery type names.
88
+ */
89
+ export declare function getRegisteredDiscoveries(): string[];
90
+ /**
91
+ * Clear all registered discoveries. For testing only.
92
+ */
93
+ export declare function clearDiscoveryRegistry(): void;
94
+ /**
95
+ * Remove a single discovery by name. Returns true if the entry existed.
96
+ * Intended for tests that want to register a one-off discovery and clean
97
+ * it up without disturbing the standard registrations.
98
+ */
99
+ export declare function unregisterDiscovery(name: string): boolean;
100
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,wEAAwE;IACxE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC;;;OAGG;IACH,QAAQ,CACN,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CAChC;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAElE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAS1D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pluggable target discovery system.
3
+ *
4
+ * Separates "how targets are found" (discovery) from "what happens with them"
5
+ * (execution). Each discovery mechanism implements the TargetDiscovery interface
6
+ * and is registered in a central registry.
7
+ */
8
+ import { ERROR_CODES, formatError } from './error-codes.js';
9
+ // --- Discovery Registry ---
10
+ const discoveryRegistry = new Map();
11
+ /**
12
+ * Register a discovery implementation.
13
+ */
14
+ export function registerDiscovery(discovery) {
15
+ discoveryRegistry.set(discovery.name, discovery);
16
+ }
17
+ /**
18
+ * Get a discovery implementation by name.
19
+ * Throws if the discovery type is not registered.
20
+ */
21
+ export function getDiscovery(name) {
22
+ const discovery = discoveryRegistry.get(name);
23
+ if (!discovery) {
24
+ const available = [...discoveryRegistry.keys()].join(', ');
25
+ throw new Error(formatError(ERROR_CODES.E2004, `Unknown discovery type: "${name}". Available: ${available || '(none registered)'}`));
26
+ }
27
+ return discovery;
28
+ }
29
+ /**
30
+ * Get all registered discovery type names.
31
+ */
32
+ export function getRegisteredDiscoveries() {
33
+ return [...discoveryRegistry.keys()];
34
+ }
35
+ /**
36
+ * Clear all registered discoveries. For testing only.
37
+ */
38
+ export function clearDiscoveryRegistry() {
39
+ discoveryRegistry.clear();
40
+ }
41
+ /**
42
+ * Remove a single discovery by name. Returns true if the entry existed.
43
+ * Intended for tests that want to register a one-off discovery and clean
44
+ * it up without disturbing the standard registrations.
45
+ */
46
+ export function unregisterDiscovery(name) {
47
+ return discoveryRegistry.delete(name);
48
+ }
49
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAiF5D,6BAA6B;AAE7B,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA2B,CAAC;AAE7D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAA0B;IAC1D,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,4BAA4B,IAAI,iBAAiB,SAAS,IAAI,mBAAmB,EAAE,CAAC,CACpH,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Trackable error codes for CLI error paths.
3
+ *
4
+ * Numbering scheme:
5
+ * E1xxx — CLI parsing (argument/flag/command errors)
6
+ * E2xxx — Configuration (config dir, checks, runtime config)
7
+ * E3xxx — Agent provider
8
+ * E4xxx — Repository/target validation
9
+ * E5xxx — Semgrep
10
+ * E6xxx — OpenAnt
11
+ * E9xxx — Internal/fatal
12
+ */
13
+ export interface ErrorCode {
14
+ code: string;
15
+ label: string;
16
+ }
17
+ export declare const ERROR_CODES: {
18
+ readonly E1001: ErrorCode;
19
+ readonly E1002: ErrorCode;
20
+ readonly E1003: ErrorCode;
21
+ readonly E2001: ErrorCode;
22
+ readonly E2002: ErrorCode;
23
+ readonly E2003: ErrorCode;
24
+ readonly E2004: ErrorCode;
25
+ readonly E2005: ErrorCode;
26
+ readonly E3001: ErrorCode;
27
+ readonly E3002: ErrorCode;
28
+ readonly E3003: ErrorCode;
29
+ readonly E3004: ErrorCode;
30
+ readonly E4001: ErrorCode;
31
+ readonly E5001: ErrorCode;
32
+ readonly E6001: ErrorCode;
33
+ readonly E6002: ErrorCode;
34
+ readonly E7001: ErrorCode;
35
+ readonly E9001: ErrorCode;
36
+ };
37
+ /**
38
+ * Format an error message with a trackable error code.
39
+ * Output: "Error [E1001]: <message>"
40
+ */
41
+ export declare function formatError(errorCode: ErrorCode, message: string): string;
42
+ /**
43
+ * Format a fatal error with version and bug report URL.
44
+ */
45
+ export declare function formatFatalError(message: string, version: string): string;
46
+ //# sourceMappingURL=error-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../src/error-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;CAsCd,CAAC;AAEX;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAWzE"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Trackable error codes for CLI error paths.
3
+ *
4
+ * Numbering scheme:
5
+ * E1xxx — CLI parsing (argument/flag/command errors)
6
+ * E2xxx — Configuration (config dir, checks, runtime config)
7
+ * E3xxx — Agent provider
8
+ * E4xxx — Repository/target validation
9
+ * E5xxx — Semgrep
10
+ * E6xxx — OpenAnt
11
+ * E9xxx — Internal/fatal
12
+ */
13
+ function ec(code, label) {
14
+ return { code, label };
15
+ }
16
+ export const ERROR_CODES = {
17
+ // E1xxx — CLI parsing
18
+ E1001: ec('E1001', 'Missing required flag argument'),
19
+ E1002: ec('E1002', 'Unknown command'),
20
+ E1003: ec('E1003', 'Required input missing'),
21
+ // E2xxx — Configuration
22
+ E2001: ec('E2001', 'Config directory not specified'),
23
+ E2002: ec('E2002', 'Config directory structure invalid'),
24
+ E2003: ec('E2003', 'No checks found'),
25
+ E2004: ec('E2004', 'Invalid check definition'),
26
+ E2005: ec('E2005', 'Configuration error'),
27
+ // E3xxx — Agent provider
28
+ E3001: ec('E3001', 'API key missing'),
29
+ E3002: ec('E3002', 'Unknown agent provider'),
30
+ // E3003 retains "AI" intentionally: it refers to the file containing the
31
+ // mocked AI/LLM response body, not the agent harness. Same rationale as
32
+ // AGHAST_MOCK_AI / AGHAST_AI_MODEL — the model and its output are AI
33
+ // concerns; only the provider/harness layer was renamed to "agent".
34
+ E3003: ec('E3003', 'Mock AI response file not found'),
35
+ E3004: ec('E3004', 'OpenCode not installed'),
36
+ // E4xxx — Repository/target validation
37
+ E4001: ec('E4001', 'Repository path not found'),
38
+ // E5xxx — Semgrep
39
+ E5001: ec('E5001', 'Semgrep not installed'),
40
+ // E6xxx — OpenAnt
41
+ E6001: ec('E6001', 'OpenAnt not installed'),
42
+ E6002: ec('E6002', 'OpenAnt execution failed'),
43
+ // E7xxx — Budget / cost controls
44
+ E7001: ec('E7001', 'Budget limit exceeded'),
45
+ // E9xxx — Internal
46
+ E9001: ec('E9001', 'Fatal internal error'),
47
+ };
48
+ /**
49
+ * Format an error message with a trackable error code.
50
+ * Output: "Error [E1001]: <message>"
51
+ */
52
+ export function formatError(errorCode, message) {
53
+ return `Error [${errorCode.code}]: ${message}`;
54
+ }
55
+ /**
56
+ * Format a fatal error with version and bug report URL.
57
+ */
58
+ export function formatFatalError(message, version) {
59
+ const title = encodeURIComponent(`[Bug] ${message}`);
60
+ const body = encodeURIComponent(`**Version:** ${version}\n\n**Error:**\n${message}`);
61
+ const url = `https://github.com/owasp-aghast/aghast/issues/new?title=${title}&body=${body}&labels=bug`;
62
+ return [
63
+ `AGHAST Fatal Error [${ERROR_CODES.E9001.code}]: ${message}`,
64
+ `Version: ${version}`,
65
+ '',
66
+ `If this is unexpected, please report it:`,
67
+ ` ${url}`,
68
+ ].join('\n');
69
+ }
70
+ //# sourceMappingURL=error-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-codes.js","sourceRoot":"","sources":["../src/error-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,SAAS,EAAE,CAAC,IAAY,EAAE,KAAa;IACrC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,sBAAsB;IACtB,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,gCAAgC,CAAC;IACpD,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACrC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAE5C,wBAAwB;IACxB,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,gCAAgC,CAAC;IACpD,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,oCAAoC,CAAC;IACxD,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACrC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAC9C,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC;IAEzC,yBAAyB;IACzB,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACrC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC5C,yEAAyE;IACzE,wEAAwE;IACxE,qEAAqE;IACrE,oEAAoE;IACpE,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,iCAAiC,CAAC;IACrD,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAE5C,uCAAuC;IACvC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAE/C,kBAAkB;IAClB,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,uBAAuB,CAAC;IAE3C,kBAAkB;IAClB,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,uBAAuB,CAAC;IAC3C,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAE9C,iCAAiC;IACjC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,uBAAuB,CAAC;IAE3C,mBAAmB;IACnB,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC;CAClC,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,SAAoB,EAAE,OAAe;IAC/D,OAAO,UAAU,SAAS,CAAC,IAAI,MAAM,OAAO,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAe;IAC/D,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,kBAAkB,CAAC,gBAAgB,OAAO,mBAAmB,OAAO,EAAE,CAAC,CAAC;IACrF,MAAM,GAAG,GAAG,2DAA2D,KAAK,SAAS,IAAI,aAAa,CAAC;IACvG,OAAO;QACL,uBAAuB,WAAW,CAAC,KAAK,CAAC,IAAI,MAAM,OAAO,EAAE;QAC5D,YAAY,OAAO,EAAE;QACrB,EAAE;QACF,0CAA0C;QAC1C,KAAK,GAAG,EAAE;KACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Formatter registry — resolves output format IDs to formatter instances.
3
+ */
4
+ import type { OutputFormatter } from './types.js';
5
+ export type { OutputFormatter } from './types.js';
6
+ /** Returns the formatter for the given ID, or throws listing available formats. */
7
+ export declare function getFormatter(id: string): OutputFormatter;
8
+ /** Returns all registered format IDs. */
9
+ export declare function getAvailableFormats(): string[];
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOlD,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,CAOxD;AAED,yCAAyC;AACzC,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Formatter registry — resolves output format IDs to formatter instances.
3
+ */
4
+ import { JsonFormatter } from './json-formatter.js';
5
+ import { SarifFormatter } from './sarif-formatter.js';
6
+ const formatters = new Map([
7
+ ['json', new JsonFormatter()],
8
+ ['sarif', new SarifFormatter()],
9
+ ]);
10
+ /** Returns the formatter for the given ID, or throws listing available formats. */
11
+ export function getFormatter(id) {
12
+ const formatter = formatters.get(id);
13
+ if (!formatter) {
14
+ const available = getAvailableFormats().join(', ');
15
+ throw new Error(`Unknown output format "${id}". Available formats: ${available}`);
16
+ }
17
+ return formatter;
18
+ }
19
+ /** Returns all registered format IDs. */
20
+ export function getAvailableFormats() {
21
+ return Array.from(formatters.keys());
22
+ }
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,MAAM,UAAU,GAAG,IAAI,GAAG,CAA0B;IAClD,CAAC,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;IAC7B,CAAC,OAAO,EAAE,IAAI,cAAc,EAAE,CAAC;CAChC,CAAC,CAAC;AAEH,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,0BAA0B,EAAE,yBAAyB,SAAS,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * JSON output formatter — reproduces current default behavior.
3
+ */
4
+ import type { ScanResults } from '../types.js';
5
+ import type { OutputFormatter } from './types.js';
6
+ export declare class JsonFormatter implements OutputFormatter {
7
+ readonly id = "json";
8
+ readonly fileExtension = ".json";
9
+ format(results: ScanResults): string;
10
+ }
11
+ //# sourceMappingURL=json-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-formatter.d.ts","sourceRoot":"","sources":["../../src/formatters/json-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,aAAa,WAAW;IAEjC,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;CAGrC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * JSON output formatter — reproduces current default behavior.
3
+ */
4
+ export class JsonFormatter {
5
+ id = 'json';
6
+ fileExtension = '.json';
7
+ format(results) {
8
+ return JSON.stringify(results, null, 2);
9
+ }
10
+ }
11
+ //# sourceMappingURL=json-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-formatter.js","sourceRoot":"","sources":["../../src/formatters/json-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,OAAO,aAAa;IACf,EAAE,GAAG,MAAM,CAAC;IACZ,aAAa,GAAG,OAAO,CAAC;IAEjC,MAAM,CAAC,OAAoB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * SARIF 2.1.0 output formatter.
3
+ * Maps ScanResults to the SARIF schema for integration with
4
+ * code scanning UIs (e.g. GitHub Code Scanning) and SARIF viewers.
5
+ */
6
+ import type { ScanResults } from '../types.js';
7
+ import type { OutputFormatter } from './types.js';
8
+ /** Maps aghast severity to SARIF result level. */
9
+ export declare function mapSeverityToLevel(severity: string | undefined): 'error' | 'warning' | 'note';
10
+ export declare class SarifFormatter implements OutputFormatter {
11
+ readonly id = "sarif";
12
+ readonly fileExtension = ".sarif";
13
+ format(results: ScanResults): string;
14
+ private buildRules;
15
+ private buildResults;
16
+ private buildCodeFlow;
17
+ }
18
+ //# sourceMappingURL=sarif-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif-formatter.d.ts","sourceRoot":"","sources":["../../src/formatters/sarif-formatter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAY7F;AA0DD,qBAAa,cAAe,YAAW,eAAe;IACpD,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,aAAa,YAAY;IAElC,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAwBpC,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,aAAa;CAiBtB"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * SARIF 2.1.0 output formatter.
3
+ * Maps ScanResults to the SARIF schema for integration with
4
+ * code scanning UIs (e.g. GitHub Code Scanning) and SARIF viewers.
5
+ */
6
+ /** Maps aghast severity to SARIF result level. */
7
+ export function mapSeverityToLevel(severity) {
8
+ switch (severity) {
9
+ case 'critical':
10
+ case 'high':
11
+ return 'error';
12
+ case 'medium':
13
+ return 'warning';
14
+ case 'low':
15
+ case 'informational':
16
+ default:
17
+ return 'note';
18
+ }
19
+ }
20
+ export class SarifFormatter {
21
+ id = 'sarif';
22
+ fileExtension = '.sarif';
23
+ format(results) {
24
+ const rules = this.buildRules(results);
25
+ const sarifResults = this.buildResults(results.issues);
26
+ const sarif = {
27
+ $schema: 'https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/schemas/sarif-schema-2.1.0.json',
28
+ version: '2.1.0',
29
+ runs: [
30
+ {
31
+ tool: {
32
+ driver: {
33
+ name: 'aghast',
34
+ semanticVersion: results.version,
35
+ rules,
36
+ },
37
+ },
38
+ results: sarifResults,
39
+ },
40
+ ],
41
+ };
42
+ return JSON.stringify(sarif, null, 2);
43
+ }
44
+ buildRules(results) {
45
+ const seen = new Map();
46
+ for (const check of results.checks) {
47
+ if (!seen.has(check.checkId)) {
48
+ seen.set(check.checkId, {
49
+ id: check.checkId,
50
+ name: check.checkName,
51
+ shortDescription: { text: check.checkName },
52
+ });
53
+ }
54
+ }
55
+ return Array.from(seen.values());
56
+ }
57
+ buildResults(issues) {
58
+ return issues.map((issue) => {
59
+ const region = {
60
+ startLine: issue.startLine,
61
+ endLine: issue.endLine,
62
+ };
63
+ if (issue.codeSnippet) {
64
+ region.snippet = { text: issue.codeSnippet };
65
+ }
66
+ const result = {
67
+ ruleId: issue.checkId,
68
+ message: { text: issue.description },
69
+ level: mapSeverityToLevel(issue.severity),
70
+ locations: [
71
+ {
72
+ physicalLocation: {
73
+ artifactLocation: { uri: issue.file },
74
+ region,
75
+ },
76
+ },
77
+ ],
78
+ };
79
+ if (issue.dataFlow && issue.dataFlow.length > 0) {
80
+ result.codeFlows = [this.buildCodeFlow(issue.dataFlow)];
81
+ }
82
+ return result;
83
+ });
84
+ }
85
+ buildCodeFlow(steps) {
86
+ return {
87
+ threadFlows: [
88
+ {
89
+ locations: steps.map((step) => ({
90
+ location: {
91
+ physicalLocation: {
92
+ artifactLocation: { uri: step.file },
93
+ region: { startLine: step.lineNumber },
94
+ },
95
+ message: { text: step.label },
96
+ },
97
+ })),
98
+ },
99
+ ],
100
+ };
101
+ }
102
+ }
103
+ //# sourceMappingURL=sarif-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif-formatter.js","sourceRoot":"","sources":["../../src/formatters/sarif-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Output formatter interface for scan results.
3
+ * Follows the AgentProvider interface pattern from src/types.ts.
4
+ */
5
+ import type { ScanResults } from '../types.js';
6
+ export interface OutputFormatter {
7
+ readonly id: string;
8
+ readonly fileExtension: string;
9
+ format(results: ScanResults): string;
10
+ }
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/formatters/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC;CACtC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Output formatter interface for scan results.
3
+ * Follows the AgentProvider interface pattern from src/types.ts.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/formatters/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CLI entry point for aghast.
3
+ * Usage: aghast scan <repository-path> --config-dir <path> [options]
4
+ */
5
+ import 'dotenv/config';
6
+ export declare function runScan(args: string[]): Promise<void>;
7
+ //# 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,CAAC;AA4YvB,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsa3D"}