guardrail-cli 1.0.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +483 -10
  2. package/dist/commands/baseline.d.ts +7 -0
  3. package/dist/commands/baseline.d.ts.map +1 -0
  4. package/dist/commands/baseline.js +79 -0
  5. package/dist/commands/baseline.js.map +1 -0
  6. package/dist/commands/cache.d.ts +13 -0
  7. package/dist/commands/cache.d.ts.map +1 -0
  8. package/dist/commands/cache.js +165 -0
  9. package/dist/commands/cache.js.map +1 -0
  10. package/dist/commands/evidence.d.ts +45 -0
  11. package/dist/commands/evidence.d.ts.map +1 -0
  12. package/dist/commands/evidence.js +197 -0
  13. package/dist/commands/evidence.js.map +1 -0
  14. package/dist/commands/index.d.ts +8 -0
  15. package/dist/commands/index.d.ts.map +1 -0
  16. package/dist/commands/index.js +15 -0
  17. package/dist/commands/index.js.map +1 -0
  18. package/dist/commands/scan-secrets.d.ts +47 -0
  19. package/dist/commands/scan-secrets.d.ts.map +1 -0
  20. package/dist/commands/scan-secrets.js +225 -0
  21. package/dist/commands/scan-secrets.js.map +1 -0
  22. package/dist/commands/scan-vulnerabilities-enhanced.d.ts +41 -0
  23. package/dist/commands/scan-vulnerabilities-enhanced.d.ts.map +1 -0
  24. package/dist/commands/scan-vulnerabilities-enhanced.js +368 -0
  25. package/dist/commands/scan-vulnerabilities-enhanced.js.map +1 -0
  26. package/dist/commands/scan-vulnerabilities-osv.d.ts +58 -0
  27. package/dist/commands/scan-vulnerabilities-osv.d.ts.map +1 -0
  28. package/dist/commands/scan-vulnerabilities-osv.js +716 -0
  29. package/dist/commands/scan-vulnerabilities-osv.js.map +1 -0
  30. package/dist/commands/scan-vulnerabilities.d.ts +32 -0
  31. package/dist/commands/scan-vulnerabilities.d.ts.map +1 -0
  32. package/dist/commands/scan-vulnerabilities.js +283 -0
  33. package/dist/commands/scan-vulnerabilities.js.map +1 -0
  34. package/dist/commands/secrets-allowlist.d.ts +7 -0
  35. package/dist/commands/secrets-allowlist.d.ts.map +1 -0
  36. package/dist/commands/secrets-allowlist.js +85 -0
  37. package/dist/commands/secrets-allowlist.js.map +1 -0
  38. package/dist/fix/applicator.d.ts +44 -0
  39. package/dist/fix/applicator.d.ts.map +1 -0
  40. package/dist/fix/applicator.js +144 -0
  41. package/dist/fix/applicator.js.map +1 -0
  42. package/dist/fix/backup.d.ts +38 -0
  43. package/dist/fix/backup.d.ts.map +1 -0
  44. package/dist/fix/backup.js +154 -0
  45. package/dist/fix/backup.js.map +1 -0
  46. package/dist/fix/engine.d.ts +55 -0
  47. package/dist/fix/engine.d.ts.map +1 -0
  48. package/dist/fix/engine.js +285 -0
  49. package/dist/fix/engine.js.map +1 -0
  50. package/dist/fix/index.d.ts +5 -0
  51. package/dist/fix/index.d.ts.map +1 -0
  52. package/dist/fix/index.js +12 -0
  53. package/dist/fix/index.js.map +1 -0
  54. package/dist/fix/interactive.d.ts +22 -0
  55. package/dist/fix/interactive.d.ts.map +1 -0
  56. package/dist/fix/interactive.js +172 -0
  57. package/dist/fix/interactive.js.map +1 -0
  58. package/dist/formatters/index.d.ts +6 -0
  59. package/dist/formatters/index.d.ts.map +1 -0
  60. package/dist/formatters/index.js +11 -0
  61. package/dist/formatters/index.js.map +1 -0
  62. package/dist/formatters/sarif-enhanced.d.ts +78 -0
  63. package/dist/formatters/sarif-enhanced.d.ts.map +1 -0
  64. package/dist/formatters/sarif-enhanced.js +144 -0
  65. package/dist/formatters/sarif-enhanced.js.map +1 -0
  66. package/dist/formatters/sarif-v2.d.ts +121 -0
  67. package/dist/formatters/sarif-v2.d.ts.map +1 -0
  68. package/dist/formatters/sarif-v2.js +356 -0
  69. package/dist/formatters/sarif-v2.js.map +1 -0
  70. package/dist/formatters/sarif.d.ts +72 -0
  71. package/dist/formatters/sarif.d.ts.map +1 -0
  72. package/dist/formatters/sarif.js +146 -0
  73. package/dist/formatters/sarif.js.map +1 -0
  74. package/dist/index.js +3362 -1397
  75. package/dist/index.js.map +1 -1
  76. package/dist/init/ci-generator.d.ts +18 -0
  77. package/dist/init/ci-generator.d.ts.map +1 -0
  78. package/dist/init/ci-generator.js +251 -0
  79. package/dist/init/ci-generator.js.map +1 -0
  80. package/dist/init/detect-framework.d.ts +15 -0
  81. package/dist/init/detect-framework.d.ts.map +1 -0
  82. package/dist/init/detect-framework.js +299 -0
  83. package/dist/init/detect-framework.js.map +1 -0
  84. package/dist/init/hooks-installer.d.ts +22 -0
  85. package/dist/init/hooks-installer.d.ts.map +1 -0
  86. package/dist/init/hooks-installer.js +302 -0
  87. package/dist/init/hooks-installer.js.map +1 -0
  88. package/dist/init/index.d.ts +8 -0
  89. package/dist/init/index.d.ts.map +1 -0
  90. package/dist/init/index.js +22 -0
  91. package/dist/init/index.js.map +1 -0
  92. package/dist/init/templates.d.ts +401 -0
  93. package/dist/init/templates.d.ts.map +1 -0
  94. package/dist/init/templates.js +240 -0
  95. package/dist/init/templates.js.map +1 -0
  96. package/dist/reality/reality-runner.d.ts +76 -0
  97. package/dist/reality/reality-runner.d.ts.map +1 -0
  98. package/dist/reality/reality-runner.js +454 -0
  99. package/dist/reality/reality-runner.js.map +1 -0
  100. package/dist/runtime/auth-utils.d.ts +43 -0
  101. package/dist/runtime/auth-utils.d.ts.map +1 -0
  102. package/dist/runtime/auth-utils.js +126 -0
  103. package/dist/runtime/auth-utils.js.map +1 -0
  104. package/dist/runtime/client.d.ts +74 -0
  105. package/dist/runtime/client.d.ts.map +1 -0
  106. package/dist/runtime/client.js +222 -0
  107. package/dist/runtime/client.js.map +1 -0
  108. package/dist/runtime/creds.d.ts +48 -0
  109. package/dist/runtime/creds.d.ts.map +1 -0
  110. package/dist/runtime/creds.js +245 -0
  111. package/dist/runtime/creds.js.map +1 -0
  112. package/dist/runtime/exit-codes.d.ts +47 -0
  113. package/dist/runtime/exit-codes.d.ts.map +1 -0
  114. package/dist/runtime/exit-codes.js +91 -0
  115. package/dist/runtime/exit-codes.js.map +1 -0
  116. package/dist/runtime/index.d.ts +9 -0
  117. package/dist/runtime/index.d.ts.map +1 -0
  118. package/dist/runtime/index.js +25 -0
  119. package/dist/runtime/index.js.map +1 -0
  120. package/dist/runtime/semver.d.ts +37 -0
  121. package/dist/runtime/semver.d.ts.map +1 -0
  122. package/dist/runtime/semver.js +110 -0
  123. package/dist/runtime/semver.js.map +1 -0
  124. package/dist/scanner/baseline.d.ts +52 -0
  125. package/dist/scanner/baseline.d.ts.map +1 -0
  126. package/dist/scanner/baseline.js +85 -0
  127. package/dist/scanner/baseline.js.map +1 -0
  128. package/dist/scanner/incremental.d.ts +30 -0
  129. package/dist/scanner/incremental.d.ts.map +1 -0
  130. package/dist/scanner/incremental.js +82 -0
  131. package/dist/scanner/incremental.js.map +1 -0
  132. package/dist/scanner/parallel.d.ts +43 -0
  133. package/dist/scanner/parallel.d.ts.map +1 -0
  134. package/dist/scanner/parallel.js +99 -0
  135. package/dist/scanner/parallel.js.map +1 -0
  136. package/dist/ui/frame.d.ts +68 -0
  137. package/dist/ui/frame.d.ts.map +1 -0
  138. package/dist/ui/frame.js +165 -0
  139. package/dist/ui/frame.js.map +1 -0
  140. package/dist/ui/index.d.ts +5 -0
  141. package/dist/ui/index.d.ts.map +1 -0
  142. package/dist/ui/index.js +16 -0
  143. package/dist/ui/index.js.map +1 -0
  144. package/package.json +42 -9
@@ -0,0 +1,245 @@
1
+ "use strict";
2
+ /**
3
+ * Enterprise Credential Store
4
+ * - OS keychain first (Keychain/Windows Credential Manager/libsecret)
5
+ * - Secure fallback with 0600 perms + atomic writes
6
+ * - Token-first model (short-lived tokens preferred over static API keys)
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.loadAuthState = loadAuthState;
46
+ exports.saveAuthState = saveAuthState;
47
+ exports.clearAuthState = clearAuthState;
48
+ exports.isCacheValid = isCacheValid;
49
+ exports.shouldUseCachedEntitlements = shouldUseCachedEntitlements;
50
+ exports.getConfigPath = getConfigPath;
51
+ const os_1 = __importDefault(require("os"));
52
+ const path_1 = __importDefault(require("path"));
53
+ const promises_1 = __importDefault(require("fs/promises"));
54
+ const fs_1 = require("fs");
55
+ const crypto_1 = __importDefault(require("crypto"));
56
+ const SERVICE = 'guardrail-cli';
57
+ const ACCOUNT = 'default';
58
+ function getConfigDir() {
59
+ if (process.platform === 'win32') {
60
+ return path_1.default.join(process.env.APPDATA || path_1.default.join(os_1.default.homedir(), 'AppData', 'Roaming'), 'guardrail');
61
+ }
62
+ if (process.platform === 'darwin') {
63
+ return path_1.default.join(os_1.default.homedir(), 'Library', 'Application Support', 'guardrail');
64
+ }
65
+ return path_1.default.join(process.env.XDG_CONFIG_HOME || path_1.default.join(os_1.default.homedir(), '.config'), 'guardrail');
66
+ }
67
+ const CONFIG_DIR = getConfigDir();
68
+ const CONFIG_FILE = path_1.default.join(CONFIG_DIR, 'state.json');
69
+ /**
70
+ * Try to load keytar for OS keychain access
71
+ * Returns null if keytar is not available
72
+ */
73
+ async function tryKeytar() {
74
+ try {
75
+ return require('keytar');
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ /**
82
+ * Atomic write with restrictive permissions
83
+ * Prevents partial writes and race conditions
84
+ * Security: 0600 on Unix, NTFS ACL restriction on Windows (best effort)
85
+ */
86
+ async function atomicWrite(filePath, data) {
87
+ await promises_1.default.mkdir(path_1.default.dirname(filePath), { recursive: true, mode: 0o700 });
88
+ const tmp = `${filePath}.${crypto_1.default.randomBytes(6).toString('hex')}.tmp`;
89
+ // Write with restrictive mode on Unix
90
+ await promises_1.default.writeFile(tmp, data, { encoding: 'utf8', mode: 0o600 });
91
+ // Lock down permissions
92
+ if (process.platform !== 'win32') {
93
+ // Unix: 0600 = owner read/write only
94
+ await promises_1.default.chmod(tmp, 0o600);
95
+ }
96
+ else {
97
+ // Windows: Best effort - use icacls to restrict access
98
+ // This is a no-op if it fails, as Windows file permissions are complex
99
+ try {
100
+ const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
101
+ const username = process.env.USERNAME || process.env.USER;
102
+ if (username) {
103
+ await new Promise((resolve) => {
104
+ exec(`icacls "${tmp}" /inheritance:r /grant:r "${username}:F"`, { windowsHide: true }, () => resolve() // Ignore errors
105
+ );
106
+ });
107
+ }
108
+ }
109
+ catch {
110
+ // Windows permission setting failed - continue anyway
111
+ }
112
+ }
113
+ await promises_1.default.rename(tmp, filePath);
114
+ // Also secure the directory on Unix
115
+ if (process.platform !== 'win32') {
116
+ await promises_1.default.chmod(path_1.default.dirname(filePath), 0o700).catch(() => { });
117
+ }
118
+ }
119
+ /**
120
+ * Load authentication state
121
+ * Prefers keychain for sensitive tokens, falls back to disk
122
+ */
123
+ async function loadAuthState() {
124
+ try {
125
+ if (!(0, fs_1.existsSync)(CONFIG_FILE))
126
+ return {};
127
+ const raw = await promises_1.default.readFile(CONFIG_FILE, 'utf8');
128
+ const state = JSON.parse(raw);
129
+ // If keychain is available, prefer tokens from there
130
+ const keytar = await tryKeytar();
131
+ if (keytar) {
132
+ try {
133
+ const secret = await keytar.getPassword(SERVICE, ACCOUNT);
134
+ if (secret) {
135
+ const fromKeychain = JSON.parse(secret);
136
+ return { ...state, ...fromKeychain };
137
+ }
138
+ }
139
+ catch {
140
+ // Keychain access failed, use disk state
141
+ }
142
+ }
143
+ return state;
144
+ }
145
+ catch {
146
+ return {};
147
+ }
148
+ }
149
+ /**
150
+ * Save authentication state
151
+ * Stores sensitive tokens in keychain when available, non-sensitive data on disk
152
+ */
153
+ async function saveAuthState(next) {
154
+ // Separate sensitive from non-sensitive data
155
+ const { accessToken, refreshToken, apiKey, ...diskSafe } = next;
156
+ const keytar = await tryKeytar();
157
+ if (keytar) {
158
+ try {
159
+ const secretPayload = { accessToken, refreshToken, apiKey };
160
+ await keytar.setPassword(SERVICE, ACCOUNT, JSON.stringify(secretPayload));
161
+ }
162
+ catch {
163
+ // Keychain save failed, store everything on disk
164
+ diskSafe.apiKey = apiKey;
165
+ diskSafe.accessToken = accessToken;
166
+ diskSafe.refreshToken = refreshToken;
167
+ }
168
+ }
169
+ else {
170
+ // No keychain available: fall back to disk with tight perms
171
+ diskSafe.apiKey = apiKey;
172
+ diskSafe.accessToken = accessToken;
173
+ diskSafe.refreshToken = refreshToken;
174
+ }
175
+ await atomicWrite(CONFIG_FILE, JSON.stringify(diskSafe, null, 2));
176
+ }
177
+ /**
178
+ * Clear all authentication state (logout)
179
+ */
180
+ async function clearAuthState() {
181
+ const keytar = await tryKeytar();
182
+ if (keytar) {
183
+ try {
184
+ await keytar.deletePassword(SERVICE, ACCOUNT);
185
+ }
186
+ catch {
187
+ // Keychain delete failed, continue anyway
188
+ }
189
+ }
190
+ await atomicWrite(CONFIG_FILE, JSON.stringify({}, null, 2));
191
+ }
192
+ /**
193
+ * Check if cached entitlements are still valid
194
+ * Uses the shorter of cacheUntil (local) or expiresAt (server)
195
+ */
196
+ function isCacheValid(state) {
197
+ if (!state.tier)
198
+ return false;
199
+ const now = new Date();
200
+ // Check local cache expiry
201
+ if (state.cacheUntil) {
202
+ const cacheExpiry = new Date(state.cacheUntil);
203
+ if (cacheExpiry <= now)
204
+ return false;
205
+ }
206
+ // Check server-issued expiry
207
+ if (state.expiresAt) {
208
+ const serverExpiry = new Date(state.expiresAt);
209
+ if (serverExpiry <= now)
210
+ return false;
211
+ }
212
+ // At least one expiry must be set
213
+ return Boolean(state.cacheUntil || state.expiresAt);
214
+ }
215
+ /**
216
+ * Check if entitlements should be reused from cache
217
+ * Returns true only if cache is valid AND has > 5 minutes remaining
218
+ */
219
+ function shouldUseCachedEntitlements(state) {
220
+ if (!state.tier)
221
+ return false;
222
+ const now = new Date();
223
+ const fiveMinutesFromNow = new Date(now.getTime() + 5 * 60 * 1000);
224
+ // Check if local cache has > 5 min remaining
225
+ if (state.cacheUntil) {
226
+ const cacheExpiry = new Date(state.cacheUntil);
227
+ if (cacheExpiry <= fiveMinutesFromNow)
228
+ return false;
229
+ }
230
+ // Check if server expiry has > 5 min remaining
231
+ if (state.expiresAt) {
232
+ const serverExpiry = new Date(state.expiresAt);
233
+ if (serverExpiry <= fiveMinutesFromNow)
234
+ return false;
235
+ }
236
+ // At least one expiry must be set and valid
237
+ return Boolean(state.cacheUntil || state.expiresAt);
238
+ }
239
+ /**
240
+ * Get config directory path (for display purposes)
241
+ */
242
+ function getConfigPath() {
243
+ return CONFIG_FILE;
244
+ }
245
+ //# sourceMappingURL=creds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creds.js","sourceRoot":"","sources":["../../src/runtime/creds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Enterprise Exit Codes
3
+ * Consistent, meaningful exit codes for CI/CD integration
4
+ *
5
+ * Usage:
6
+ * process.exit(ExitCode.POLICY_FAIL)
7
+ * exitWith(ExitCode.AUTH_FAILURE, 'Invalid API key')
8
+ */
9
+ export declare enum ExitCode {
10
+ /** Scan passed, no policy violations */
11
+ SUCCESS = 0,
12
+ /** Findings above threshold (policy fail) - actionable by user */
13
+ POLICY_FAIL = 1,
14
+ /** User error: invalid args, bad config, missing required options */
15
+ USER_ERROR = 2,
16
+ /** System error: crash, filesystem issues, unexpected exceptions */
17
+ SYSTEM_ERROR = 3,
18
+ /** Auth/entitlement failure: invalid key, expired token, insufficient tier */
19
+ AUTH_FAILURE = 4,
20
+ /** Network/backend failure: API unreachable, timeout */
21
+ NETWORK_FAILURE = 5
22
+ }
23
+ export declare const EXIT_CODE_DESCRIPTIONS: Record<ExitCode, string>;
24
+ /**
25
+ * Exit with code and optional message
26
+ * Logs the exit reason for debugging
27
+ */
28
+ export declare function exitWith(code: ExitCode, message?: string): never;
29
+ /**
30
+ * Map error types to exit codes
31
+ */
32
+ export declare function getExitCodeForError(err: Error): ExitCode;
33
+ /**
34
+ * Determine exit code based on scan results and policy
35
+ */
36
+ export declare function getExitCodeForFindings(findings: {
37
+ critical?: number;
38
+ high?: number;
39
+ medium?: number;
40
+ low?: number;
41
+ }, policy: {
42
+ failOnCritical?: boolean;
43
+ failOnHigh?: boolean;
44
+ failOnMedium?: boolean;
45
+ failOnAny?: boolean;
46
+ }): ExitCode;
47
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/runtime/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oBAAY,QAAQ;IAClB,wCAAwC;IACxC,OAAO,IAAI;IAEX,kEAAkE;IAClE,WAAW,IAAI;IAEf,qEAAqE;IACrE,UAAU,IAAI;IAEd,oEAAoE;IACpE,YAAY,IAAI;IAEhB,8EAA8E;IAC9E,YAAY,IAAI;IAEhB,wDAAwD;IACxD,eAAe,IAAI;CACpB;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAO3D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAShE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,KAAK,GAAG,QAAQ,CAiBxD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,EAAE,MAAM,EAAE;IACT,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,QAAQ,CAiBX"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ /**
3
+ * Enterprise Exit Codes
4
+ * Consistent, meaningful exit codes for CI/CD integration
5
+ *
6
+ * Usage:
7
+ * process.exit(ExitCode.POLICY_FAIL)
8
+ * exitWith(ExitCode.AUTH_FAILURE, 'Invalid API key')
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.EXIT_CODE_DESCRIPTIONS = exports.ExitCode = void 0;
12
+ exports.exitWith = exitWith;
13
+ exports.getExitCodeForError = getExitCodeForError;
14
+ exports.getExitCodeForFindings = getExitCodeForFindings;
15
+ var ExitCode;
16
+ (function (ExitCode) {
17
+ /** Scan passed, no policy violations */
18
+ ExitCode[ExitCode["SUCCESS"] = 0] = "SUCCESS";
19
+ /** Findings above threshold (policy fail) - actionable by user */
20
+ ExitCode[ExitCode["POLICY_FAIL"] = 1] = "POLICY_FAIL";
21
+ /** User error: invalid args, bad config, missing required options */
22
+ ExitCode[ExitCode["USER_ERROR"] = 2] = "USER_ERROR";
23
+ /** System error: crash, filesystem issues, unexpected exceptions */
24
+ ExitCode[ExitCode["SYSTEM_ERROR"] = 3] = "SYSTEM_ERROR";
25
+ /** Auth/entitlement failure: invalid key, expired token, insufficient tier */
26
+ ExitCode[ExitCode["AUTH_FAILURE"] = 4] = "AUTH_FAILURE";
27
+ /** Network/backend failure: API unreachable, timeout */
28
+ ExitCode[ExitCode["NETWORK_FAILURE"] = 5] = "NETWORK_FAILURE";
29
+ })(ExitCode || (exports.ExitCode = ExitCode = {}));
30
+ exports.EXIT_CODE_DESCRIPTIONS = {
31
+ [ExitCode.SUCCESS]: 'Scan completed successfully with no policy violations',
32
+ [ExitCode.POLICY_FAIL]: 'Findings exceed configured thresholds',
33
+ [ExitCode.USER_ERROR]: 'Invalid arguments or configuration',
34
+ [ExitCode.SYSTEM_ERROR]: 'Internal error or filesystem issue',
35
+ [ExitCode.AUTH_FAILURE]: 'Authentication or authorization failed',
36
+ [ExitCode.NETWORK_FAILURE]: 'Network or API communication failed',
37
+ };
38
+ /**
39
+ * Exit with code and optional message
40
+ * Logs the exit reason for debugging
41
+ */
42
+ function exitWith(code, message) {
43
+ if (message) {
44
+ if (code === ExitCode.SUCCESS) {
45
+ console.log(message);
46
+ }
47
+ else {
48
+ console.error(`[exit:${code}] ${message}`);
49
+ }
50
+ }
51
+ process.exit(code);
52
+ }
53
+ /**
54
+ * Map error types to exit codes
55
+ */
56
+ function getExitCodeForError(err) {
57
+ const msg = err.message.toLowerCase();
58
+ if (msg.includes('enoent') || msg.includes('permission denied') || msg.includes('eacces')) {
59
+ return ExitCode.SYSTEM_ERROR;
60
+ }
61
+ if (msg.includes('network') || msg.includes('timeout') || msg.includes('fetch')) {
62
+ return ExitCode.NETWORK_FAILURE;
63
+ }
64
+ if (msg.includes('auth') || msg.includes('unauthorized') || msg.includes('forbidden')) {
65
+ return ExitCode.AUTH_FAILURE;
66
+ }
67
+ if (msg.includes('invalid') || msg.includes('missing') || msg.includes('required')) {
68
+ return ExitCode.USER_ERROR;
69
+ }
70
+ return ExitCode.SYSTEM_ERROR;
71
+ }
72
+ /**
73
+ * Determine exit code based on scan results and policy
74
+ */
75
+ function getExitCodeForFindings(findings, policy) {
76
+ const { critical = 0, high = 0, medium = 0, low = 0 } = findings;
77
+ if (policy.failOnAny && (critical + high + medium + low) > 0) {
78
+ return ExitCode.POLICY_FAIL;
79
+ }
80
+ if (policy.failOnCritical && critical > 0) {
81
+ return ExitCode.POLICY_FAIL;
82
+ }
83
+ if (policy.failOnHigh && (critical + high) > 0) {
84
+ return ExitCode.POLICY_FAIL;
85
+ }
86
+ if (policy.failOnMedium && (critical + high + medium) > 0) {
87
+ return ExitCode.POLICY_FAIL;
88
+ }
89
+ return ExitCode.SUCCESS;
90
+ }
91
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/runtime/exit-codes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Enterprise Runtime Modules
3
+ * Re-exports all runtime utilities for clean imports
4
+ */
5
+ export * from './creds';
6
+ export * from './client';
7
+ export * from './exit-codes';
8
+ export * from './semver';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * Enterprise Runtime Modules
4
+ * Re-exports all runtime utilities for clean imports
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ __exportStar(require("./creds"), exports);
22
+ __exportStar(require("./client"), exports);
23
+ __exportStar(require("./exit-codes"), exports);
24
+ __exportStar(require("./semver"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,2CAAyB;AACzB,+CAA6B;AAC7B,2CAAyB"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Lightweight Semver Utilities
3
+ * Proper version comparison for vulnerability checking
4
+ * (Avoids incorrect lexicographic comparison like "10.0.0" < "2.0.0")
5
+ */
6
+ export interface SemverParts {
7
+ major: number;
8
+ minor: number;
9
+ patch: number;
10
+ prerelease?: string;
11
+ }
12
+ /**
13
+ * Parse a semver string into components
14
+ * Handles formats: 1.2.3, 1.2.3-beta.1, ^1.2.3, ~1.2.3
15
+ */
16
+ export declare function parseSemver(version: string): SemverParts | null;
17
+ /**
18
+ * Compare two semver versions
19
+ * Returns: -1 if a < b, 0 if a == b, 1 if a > b
20
+ */
21
+ export declare function compareSemver(a: string, b: string): number;
22
+ /**
23
+ * Check if version is less than target
24
+ * Enterprise-grade: "10.0.0" is NOT less than "2.0.0"
25
+ */
26
+ export declare function isVersionLessThan(version: string, target: string): boolean;
27
+ /**
28
+ * Check if version satisfies a range expression
29
+ * Supports: <1.2.3, <=1.2.3, >1.2.3, >=1.2.3, 1.2.3 (exact)
30
+ */
31
+ export declare function satisfiesRange(version: string, range: string): boolean;
32
+ /**
33
+ * Check if version is affected by vulnerability
34
+ * affectedVersions format: "<4.17.21" or ">=1.0.0 <2.0.0"
35
+ */
36
+ export declare function isAffected(version: string, affectedVersions: string): boolean;
37
+ //# sourceMappingURL=semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/runtime/semver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAyB/D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA4B1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAkBtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAM7E"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ /**
3
+ * Lightweight Semver Utilities
4
+ * Proper version comparison for vulnerability checking
5
+ * (Avoids incorrect lexicographic comparison like "10.0.0" < "2.0.0")
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.parseSemver = parseSemver;
9
+ exports.compareSemver = compareSemver;
10
+ exports.isVersionLessThan = isVersionLessThan;
11
+ exports.satisfiesRange = satisfiesRange;
12
+ exports.isAffected = isAffected;
13
+ /**
14
+ * Parse a semver string into components
15
+ * Handles formats: 1.2.3, 1.2.3-beta.1, ^1.2.3, ~1.2.3
16
+ */
17
+ function parseSemver(version) {
18
+ // Strip range prefixes
19
+ const cleaned = version.replace(/^[\^~>=<]+/, '').trim();
20
+ // Match semver pattern
21
+ const match = cleaned.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/);
22
+ if (!match) {
23
+ // Try partial versions (1.2, 1)
24
+ const partial = cleaned.match(/^(\d+)(?:\.(\d+))?$/);
25
+ if (partial) {
26
+ return {
27
+ major: parseInt(partial[1], 10),
28
+ minor: partial[2] ? parseInt(partial[2], 10) : 0,
29
+ patch: 0,
30
+ };
31
+ }
32
+ return null;
33
+ }
34
+ return {
35
+ major: parseInt(match[1], 10),
36
+ minor: parseInt(match[2], 10),
37
+ patch: parseInt(match[3], 10),
38
+ prerelease: match[4],
39
+ };
40
+ }
41
+ /**
42
+ * Compare two semver versions
43
+ * Returns: -1 if a < b, 0 if a == b, 1 if a > b
44
+ */
45
+ function compareSemver(a, b) {
46
+ const parsedA = parseSemver(a);
47
+ const parsedB = parseSemver(b);
48
+ if (!parsedA || !parsedB) {
49
+ // Fallback to string comparison if parsing fails
50
+ return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
51
+ }
52
+ // Compare major.minor.patch
53
+ if (parsedA.major !== parsedB.major) {
54
+ return parsedA.major < parsedB.major ? -1 : 1;
55
+ }
56
+ if (parsedA.minor !== parsedB.minor) {
57
+ return parsedA.minor < parsedB.minor ? -1 : 1;
58
+ }
59
+ if (parsedA.patch !== parsedB.patch) {
60
+ return parsedA.patch < parsedB.patch ? -1 : 1;
61
+ }
62
+ // Handle prerelease (1.0.0-alpha < 1.0.0)
63
+ if (parsedA.prerelease && !parsedB.prerelease)
64
+ return -1;
65
+ if (!parsedA.prerelease && parsedB.prerelease)
66
+ return 1;
67
+ if (parsedA.prerelease && parsedB.prerelease) {
68
+ return parsedA.prerelease.localeCompare(parsedB.prerelease);
69
+ }
70
+ return 0;
71
+ }
72
+ /**
73
+ * Check if version is less than target
74
+ * Enterprise-grade: "10.0.0" is NOT less than "2.0.0"
75
+ */
76
+ function isVersionLessThan(version, target) {
77
+ return compareSemver(version, target) < 0;
78
+ }
79
+ /**
80
+ * Check if version satisfies a range expression
81
+ * Supports: <1.2.3, <=1.2.3, >1.2.3, >=1.2.3, 1.2.3 (exact)
82
+ */
83
+ function satisfiesRange(version, range) {
84
+ const trimmed = range.trim();
85
+ if (trimmed.startsWith('<=')) {
86
+ return compareSemver(version, trimmed.slice(2)) <= 0;
87
+ }
88
+ if (trimmed.startsWith('<')) {
89
+ return compareSemver(version, trimmed.slice(1)) < 0;
90
+ }
91
+ if (trimmed.startsWith('>=')) {
92
+ return compareSemver(version, trimmed.slice(2)) >= 0;
93
+ }
94
+ if (trimmed.startsWith('>')) {
95
+ return compareSemver(version, trimmed.slice(1)) > 0;
96
+ }
97
+ // Exact match
98
+ return compareSemver(version, trimmed) === 0;
99
+ }
100
+ /**
101
+ * Check if version is affected by vulnerability
102
+ * affectedVersions format: "<4.17.21" or ">=1.0.0 <2.0.0"
103
+ */
104
+ function isAffected(version, affectedVersions) {
105
+ // Split on spaces for compound ranges
106
+ const parts = affectedVersions.split(/\s+/).filter(Boolean);
107
+ // All conditions must be satisfied
108
+ return parts.every(part => satisfiesRange(version, part));
109
+ }
110
+ //# sourceMappingURL=semver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/runtime/semver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Baseline support for suppressing known findings
3
+ */
4
+ export interface BaselineFinding {
5
+ fingerprint: string;
6
+ category: string;
7
+ title: string;
8
+ file: string;
9
+ line: number;
10
+ suppressedAt: string;
11
+ }
12
+ export interface Baseline {
13
+ version: string;
14
+ createdAt: string;
15
+ findings: BaselineFinding[];
16
+ }
17
+ export interface Finding {
18
+ type?: string;
19
+ category?: string;
20
+ title: string;
21
+ file: string;
22
+ line: number;
23
+ match?: string;
24
+ snippet?: string;
25
+ }
26
+ export declare class BaselineManager {
27
+ /**
28
+ * Generate stable fingerprint for a finding
29
+ * fingerprint = sha256(category + title + file + line + snippetNormalized)
30
+ */
31
+ static generateFingerprint(finding: Finding): string;
32
+ /**
33
+ * Load baseline from file
34
+ */
35
+ static loadBaseline(path: string): Baseline | null;
36
+ /**
37
+ * Save baseline to file
38
+ */
39
+ static saveBaseline(path: string, findings: Finding[]): void;
40
+ /**
41
+ * Check if a finding is suppressed by baseline
42
+ */
43
+ static isSuppressed(finding: Finding, baseline: Baseline | null): boolean;
44
+ /**
45
+ * Filter findings by baseline
46
+ */
47
+ static filterFindings<T extends Finding>(findings: T[], baselinePath?: string): {
48
+ filtered: T[];
49
+ suppressed: number;
50
+ };
51
+ }
52
+ //# sourceMappingURL=baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/scanner/baseline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAcpD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAalD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAiB5D;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO;IASzE;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAetH"}