opena2a-cli 0.1.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 (150) hide show
  1. package/dist/adapters/docker.d.ts +8 -0
  2. package/dist/adapters/docker.d.ts.map +1 -0
  3. package/dist/adapters/docker.js +60 -0
  4. package/dist/adapters/docker.js.map +1 -0
  5. package/dist/adapters/import.d.ts +12 -0
  6. package/dist/adapters/import.d.ts.map +1 -0
  7. package/dist/adapters/import.js +76 -0
  8. package/dist/adapters/import.js.map +1 -0
  9. package/dist/adapters/index.d.ts +9 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +40 -0
  12. package/dist/adapters/index.js.map +1 -0
  13. package/dist/adapters/python.d.ts +9 -0
  14. package/dist/adapters/python.d.ts.map +1 -0
  15. package/dist/adapters/python.js +73 -0
  16. package/dist/adapters/python.js.map +1 -0
  17. package/dist/adapters/registry.d.ts +6 -0
  18. package/dist/adapters/registry.d.ts.map +1 -0
  19. package/dist/adapters/registry.js +86 -0
  20. package/dist/adapters/registry.js.map +1 -0
  21. package/dist/adapters/spawn.d.ts +9 -0
  22. package/dist/adapters/spawn.d.ts.map +1 -0
  23. package/dist/adapters/spawn.js +63 -0
  24. package/dist/adapters/spawn.js.map +1 -0
  25. package/dist/adapters/types.d.ts +35 -0
  26. package/dist/adapters/types.d.ts.map +1 -0
  27. package/dist/adapters/types.js +3 -0
  28. package/dist/adapters/types.js.map +1 -0
  29. package/dist/branding.d.ts +3 -0
  30. package/dist/branding.d.ts.map +1 -0
  31. package/dist/branding.js +21 -0
  32. package/dist/branding.js.map +1 -0
  33. package/dist/commands/baselines.d.ts +14 -0
  34. package/dist/commands/baselines.d.ts.map +1 -0
  35. package/dist/commands/baselines.js +269 -0
  36. package/dist/commands/baselines.js.map +1 -0
  37. package/dist/commands/guard.d.ts +38 -0
  38. package/dist/commands/guard.d.ts.map +1 -0
  39. package/dist/commands/guard.js +307 -0
  40. package/dist/commands/guard.js.map +1 -0
  41. package/dist/commands/init.d.ts +14 -0
  42. package/dist/commands/init.d.ts.map +1 -0
  43. package/dist/commands/init.js +356 -0
  44. package/dist/commands/init.js.map +1 -0
  45. package/dist/commands/onepassword-migration.d.ts +23 -0
  46. package/dist/commands/onepassword-migration.d.ts.map +1 -0
  47. package/dist/commands/onepassword-migration.js +179 -0
  48. package/dist/commands/onepassword-migration.js.map +1 -0
  49. package/dist/commands/protect.d.ts +34 -0
  50. package/dist/commands/protect.d.ts.map +1 -0
  51. package/dist/commands/protect.js +642 -0
  52. package/dist/commands/protect.js.map +1 -0
  53. package/dist/commands/runtime.d.ts +28 -0
  54. package/dist/commands/runtime.d.ts.map +1 -0
  55. package/dist/commands/runtime.js +309 -0
  56. package/dist/commands/runtime.js.map +1 -0
  57. package/dist/commands/self-register.d.ts +39 -0
  58. package/dist/commands/self-register.d.ts.map +1 -0
  59. package/dist/commands/self-register.js +528 -0
  60. package/dist/commands/self-register.js.map +1 -0
  61. package/dist/commands/verify.d.ts +25 -0
  62. package/dist/commands/verify.d.ts.map +1 -0
  63. package/dist/commands/verify.js +300 -0
  64. package/dist/commands/verify.js.map +1 -0
  65. package/dist/contextual/advisor.d.ts +12 -0
  66. package/dist/contextual/advisor.d.ts.map +1 -0
  67. package/dist/contextual/advisor.js +94 -0
  68. package/dist/contextual/advisor.js.map +1 -0
  69. package/dist/contextual/index.d.ts +3 -0
  70. package/dist/contextual/index.d.ts.map +1 -0
  71. package/dist/contextual/index.js +7 -0
  72. package/dist/contextual/index.js.map +1 -0
  73. package/dist/guided/attack-walkthrough.d.ts +13 -0
  74. package/dist/guided/attack-walkthrough.d.ts.map +1 -0
  75. package/dist/guided/attack-walkthrough.js +113 -0
  76. package/dist/guided/attack-walkthrough.js.map +1 -0
  77. package/dist/guided/wizard.d.ts +2 -0
  78. package/dist/guided/wizard.d.ts.map +1 -0
  79. package/dist/guided/wizard.js +108 -0
  80. package/dist/guided/wizard.js.map +1 -0
  81. package/dist/index.d.ts +3 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +326 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/natural/index.d.ts +4 -0
  86. package/dist/natural/index.d.ts.map +1 -0
  87. package/dist/natural/index.js +9 -0
  88. package/dist/natural/index.js.map +1 -0
  89. package/dist/natural/intent-map.d.ts +7 -0
  90. package/dist/natural/intent-map.d.ts.map +1 -0
  91. package/dist/natural/intent-map.js +145 -0
  92. package/dist/natural/intent-map.js.map +1 -0
  93. package/dist/natural/llm-fallback.d.ts +8 -0
  94. package/dist/natural/llm-fallback.d.ts.map +1 -0
  95. package/dist/natural/llm-fallback.js +143 -0
  96. package/dist/natural/llm-fallback.js.map +1 -0
  97. package/dist/report/interactive-html.d.ts +51 -0
  98. package/dist/report/interactive-html.d.ts.map +1 -0
  99. package/dist/report/interactive-html.js +508 -0
  100. package/dist/report/interactive-html.js.map +1 -0
  101. package/dist/router.d.ts +23 -0
  102. package/dist/router.d.ts.map +1 -0
  103. package/dist/router.js +132 -0
  104. package/dist/router.js.map +1 -0
  105. package/dist/semantic/command-index.json +182 -0
  106. package/dist/semantic/index.d.ts +3 -0
  107. package/dist/semantic/index.d.ts.map +1 -0
  108. package/dist/semantic/index.js +28 -0
  109. package/dist/semantic/index.js.map +1 -0
  110. package/dist/semantic/search.d.ts +17 -0
  111. package/dist/semantic/search.d.ts.map +1 -0
  112. package/dist/semantic/search.js +123 -0
  113. package/dist/semantic/search.js.map +1 -0
  114. package/dist/util/action-prompt.d.ts +29 -0
  115. package/dist/util/action-prompt.d.ts.map +1 -0
  116. package/dist/util/action-prompt.js +126 -0
  117. package/dist/util/action-prompt.js.map +1 -0
  118. package/dist/util/advisories.d.ts +43 -0
  119. package/dist/util/advisories.d.ts.map +1 -0
  120. package/dist/util/advisories.js +229 -0
  121. package/dist/util/advisories.js.map +1 -0
  122. package/dist/util/colors.d.ts +9 -0
  123. package/dist/util/colors.d.ts.map +1 -0
  124. package/dist/util/colors.js +18 -0
  125. package/dist/util/colors.js.map +1 -0
  126. package/dist/util/credential-patterns.d.ts +38 -0
  127. package/dist/util/credential-patterns.d.ts.map +1 -0
  128. package/dist/util/credential-patterns.js +203 -0
  129. package/dist/util/credential-patterns.js.map +1 -0
  130. package/dist/util/detect.d.ts +11 -0
  131. package/dist/util/detect.d.ts.map +1 -0
  132. package/dist/util/detect.js +49 -0
  133. package/dist/util/detect.js.map +1 -0
  134. package/dist/util/format.d.ts +6 -0
  135. package/dist/util/format.d.ts.map +1 -0
  136. package/dist/util/format.js +49 -0
  137. package/dist/util/format.js.map +1 -0
  138. package/dist/util/report-submission.d.ts +64 -0
  139. package/dist/util/report-submission.d.ts.map +1 -0
  140. package/dist/util/report-submission.js +109 -0
  141. package/dist/util/report-submission.js.map +1 -0
  142. package/dist/util/spinner.d.ts +10 -0
  143. package/dist/util/spinner.d.ts.map +1 -0
  144. package/dist/util/spinner.js +38 -0
  145. package/dist/util/spinner.js.map +1 -0
  146. package/dist/util/version.d.ts +5 -0
  147. package/dist/util/version.d.ts.map +1 -0
  148. package/dist/util/version.js +24 -0
  149. package/dist/util/version.js.map +1 -0
  150. package/package.json +47 -0
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ /**
3
+ * Advisory check utility -- fetches security advisories from the OpenA2A Registry
4
+ * and warns users about flagged tools in their project.
5
+ *
6
+ * Called during `opena2a init` and `opena2a scan` to surface intelligence from
7
+ * community scan reports.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.checkAdvisories = checkAdvisories;
44
+ exports.printAdvisoryWarnings = printAdvisoryWarnings;
45
+ const fs = __importStar(require("node:fs"));
46
+ const path = __importStar(require("node:path"));
47
+ const colors_js_1 = require("./colors.js");
48
+ // --- Cache ---
49
+ const CACHE_DIR = '.opena2a/cache';
50
+ const CACHE_FILE = 'advisories.json';
51
+ const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
52
+ function getCachePath(dir) {
53
+ return path.join(dir, CACHE_DIR, CACHE_FILE);
54
+ }
55
+ function readCache(dir) {
56
+ const cachePath = getCachePath(dir);
57
+ if (!fs.existsSync(cachePath))
58
+ return null;
59
+ try {
60
+ const raw = fs.readFileSync(cachePath, 'utf-8');
61
+ const cached = JSON.parse(raw);
62
+ if (Date.now() - cached.fetchedAt < CACHE_TTL_MS) {
63
+ return cached;
64
+ }
65
+ }
66
+ catch {
67
+ // Corrupted cache
68
+ }
69
+ return null;
70
+ }
71
+ function writeCache(dir, data) {
72
+ const cachePath = getCachePath(dir);
73
+ const cacheDir = path.dirname(cachePath);
74
+ try {
75
+ fs.mkdirSync(cacheDir, { recursive: true });
76
+ fs.writeFileSync(cachePath, JSON.stringify({
77
+ fetchedAt: Date.now(),
78
+ data,
79
+ }), 'utf-8');
80
+ }
81
+ catch {
82
+ // Cache write failure is non-critical
83
+ }
84
+ }
85
+ // --- Fetch ---
86
+ async function fetchAdvisories(registryUrl) {
87
+ try {
88
+ // Fetch advisories from the last 30 days
89
+ const since = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
90
+ const url = `${registryUrl}/api/v1/trust/advisories?since=${since}&limit=100`;
91
+ const response = await fetch(url, {
92
+ method: 'GET',
93
+ headers: { 'Accept': 'application/json' },
94
+ signal: AbortSignal.timeout(5_000),
95
+ });
96
+ if (!response.ok)
97
+ return null;
98
+ return await response.json();
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ // --- Package detection ---
105
+ function detectProjectPackages(dir) {
106
+ const packages = [];
107
+ // Read package.json dependencies
108
+ const pkgPath = path.join(dir, 'package.json');
109
+ if (fs.existsSync(pkgPath)) {
110
+ try {
111
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
112
+ const deps = {
113
+ ...pkg.dependencies,
114
+ ...pkg.devDependencies,
115
+ ...pkg.optionalDependencies,
116
+ };
117
+ packages.push(...Object.keys(deps ?? {}));
118
+ }
119
+ catch {
120
+ // Invalid package.json
121
+ }
122
+ }
123
+ // Read go.mod dependencies
124
+ const goModPath = path.join(dir, 'go.mod');
125
+ if (fs.existsSync(goModPath)) {
126
+ try {
127
+ const content = fs.readFileSync(goModPath, 'utf-8');
128
+ const requireBlock = content.match(/require\s*\(([\s\S]*?)\)/);
129
+ if (requireBlock) {
130
+ const lines = requireBlock[1].split('\n');
131
+ for (const line of lines) {
132
+ const match = line.trim().match(/^(\S+)\s/);
133
+ if (match)
134
+ packages.push(match[1]);
135
+ }
136
+ }
137
+ }
138
+ catch {
139
+ // Invalid go.mod
140
+ }
141
+ }
142
+ // Read requirements.txt
143
+ const reqPath = path.join(dir, 'requirements.txt');
144
+ if (fs.existsSync(reqPath)) {
145
+ try {
146
+ const content = fs.readFileSync(reqPath, 'utf-8');
147
+ for (const line of content.split('\n')) {
148
+ const trimmed = line.trim();
149
+ if (trimmed && !trimmed.startsWith('#')) {
150
+ const name = trimmed.split(/[=<>!~]/)[0].trim();
151
+ if (name)
152
+ packages.push(name);
153
+ }
154
+ }
155
+ }
156
+ catch {
157
+ // Invalid requirements.txt
158
+ }
159
+ }
160
+ return packages;
161
+ }
162
+ // --- Main check ---
163
+ async function checkAdvisories(dir, registryUrl) {
164
+ const url = registryUrl ?? 'https://registry.opena2a.org';
165
+ // Check cache first
166
+ const cached = readCache(dir);
167
+ let data;
168
+ let fromCache = false;
169
+ if (cached) {
170
+ data = cached.data;
171
+ fromCache = true;
172
+ }
173
+ else {
174
+ const fetched = await fetchAdvisories(url);
175
+ if (!fetched) {
176
+ return { advisories: [], matchedPackages: [], total: 0, fromCache: false };
177
+ }
178
+ data = fetched;
179
+ writeCache(dir, data);
180
+ }
181
+ if (data.advisories.length === 0) {
182
+ return { advisories: [], matchedPackages: [], total: 0, fromCache };
183
+ }
184
+ // Match advisories against project packages
185
+ const projectPackages = new Set(detectProjectPackages(dir));
186
+ const matched = [];
187
+ const matchedNames = [];
188
+ for (const advisory of data.advisories) {
189
+ for (const affected of advisory.affected ?? []) {
190
+ const pkgName = affected.package?.name;
191
+ if (pkgName && projectPackages.has(pkgName)) {
192
+ matched.push(advisory);
193
+ if (!matchedNames.includes(pkgName)) {
194
+ matchedNames.push(pkgName);
195
+ }
196
+ break;
197
+ }
198
+ }
199
+ }
200
+ return {
201
+ advisories: matched,
202
+ matchedPackages: matchedNames,
203
+ total: data.total,
204
+ fromCache,
205
+ };
206
+ }
207
+ // --- Output ---
208
+ function printAdvisoryWarnings(check) {
209
+ if (check.advisories.length === 0)
210
+ return;
211
+ process.stdout.write('\n');
212
+ process.stdout.write((0, colors_js_1.red)((0, colors_js_1.bold)(' Security Advisories')) + '\n');
213
+ process.stdout.write((0, colors_js_1.dim)(' ' + '-'.repeat(47)) + '\n');
214
+ for (const advisory of check.advisories) {
215
+ const severity = advisory.severity?.[0]?.score ?? 'UNKNOWN';
216
+ const severityColor = severity === 'CRITICAL' ? colors_js_1.red
217
+ : severity === 'HIGH' ? colors_js_1.red
218
+ : severity === 'MODERATE' ? colors_js_1.yellow
219
+ : colors_js_1.dim;
220
+ const packages = (advisory.affected ?? []).map(a => a.package?.name).filter(Boolean);
221
+ process.stdout.write(` ${severityColor(`[${severity}]`.padEnd(12))} ${advisory.summary}\n`);
222
+ process.stdout.write(` ${' '.repeat(12)} ${(0, colors_js_1.dim)(`ID: ${advisory.id} Packages: ${packages.join(', ')}`)}\n`);
223
+ }
224
+ process.stdout.write((0, colors_js_1.dim)(' ' + '-'.repeat(47)) + '\n');
225
+ process.stdout.write(` ${(0, colors_js_1.yellow)(`${check.advisories.length} advisory(ies)`)} affecting ${(0, colors_js_1.cyan)(check.matchedPackages.join(', '))}\n`);
226
+ process.stdout.write((0, colors_js_1.dim)(` Run: opena2a verify --package <name> for details\n`));
227
+ process.stdout.write('\n');
228
+ }
229
+ //# sourceMappingURL=advisories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisories.js","sourceRoot":"","sources":["../../src/util/advisories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const bold: (text: string) => string;
2
+ export declare const dim: (text: string) => string;
3
+ export declare const red: (text: string) => string;
4
+ export declare const green: (text: string) => string;
5
+ export declare const yellow: (text: string) => string;
6
+ export declare const blue: (text: string) => string;
7
+ export declare const cyan: (text: string) => string;
8
+ export declare const gray: (text: string) => string;
9
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/util/colors.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,IAAI,SALsC,MAAM,KAAK,MAKnC,CAAC;AAChC,eAAO,MAAM,GAAG,SANuC,MAAM,KAAK,MAMpC,CAAC;AAC/B,eAAO,MAAM,GAAG,SAPuC,MAAM,KAAK,MAOnC,CAAC;AAChC,eAAO,MAAM,KAAK,SARqC,MAAM,KAAK,MAQjC,CAAC;AAClC,eAAO,MAAM,MAAM,SAToC,MAAM,KAAK,MAShC,CAAC;AACnC,eAAO,MAAM,IAAI,SAVsC,MAAM,KAAK,MAUlC,CAAC;AACjC,eAAO,MAAM,IAAI,SAXsC,MAAM,KAAK,MAWlC,CAAC;AACjC,eAAO,MAAM,IAAI,SAZsC,MAAM,KAAK,MAYlC,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gray = exports.cyan = exports.blue = exports.yellow = exports.green = exports.red = exports.dim = exports.bold = void 0;
4
+ const enabled = process.env.NO_COLOR === undefined && process.stdout.isTTY;
5
+ function wrap(code, resetCode) {
6
+ if (!enabled)
7
+ return (text) => text;
8
+ return (text) => `\x1b[${code}m${text}\x1b[${resetCode}m`;
9
+ }
10
+ exports.bold = wrap(1, 22);
11
+ exports.dim = wrap(2, 22);
12
+ exports.red = wrap(31, 39);
13
+ exports.green = wrap(32, 39);
14
+ exports.yellow = wrap(33, 39);
15
+ exports.blue = wrap(34, 39);
16
+ exports.cyan = wrap(36, 39);
17
+ exports.gray = wrap(90, 39);
18
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/util/colors.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAE3E,SAAS,IAAI,CAAC,IAAY,EAAE,SAAiB;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC;IAC5C,OAAO,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,IAAI,IAAI,IAAI,QAAQ,SAAS,GAAG,CAAC;AACpE,CAAC;AAEY,QAAA,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACnB,QAAA,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,QAAA,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnB,QAAA,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACrB,QAAA,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACtB,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACpB,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACpB,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Shared credential detection patterns used by protect and init commands.
3
+ */
4
+ export interface CredentialPattern {
5
+ id: string;
6
+ title: string;
7
+ pattern: RegExp;
8
+ envVarPrefix: string;
9
+ severity: string;
10
+ explanation: string;
11
+ businessImpact: string;
12
+ }
13
+ export interface CredentialMatch {
14
+ /** Original matched value (e.g., "sk-ant-api03-...") */
15
+ value: string;
16
+ /** File where the credential was found */
17
+ filePath: string;
18
+ /** Line number in the file */
19
+ line: number;
20
+ /** Finding ID (e.g., "CRED-001", "DRIFT-001") */
21
+ findingId: string;
22
+ /** Suggested environment variable name */
23
+ envVar: string;
24
+ /** Severity from the scanner */
25
+ severity: string;
26
+ /** Human-readable title */
27
+ title: string;
28
+ /** Plain-language explanation of the risk */
29
+ explanation?: string;
30
+ /** Business impact description */
31
+ businessImpact?: string;
32
+ }
33
+ export declare const CREDENTIAL_PATTERNS: CredentialPattern[];
34
+ export declare const SKIP_DIRS: Set<string>;
35
+ export declare const SKIP_EXTENSIONS: Set<string>;
36
+ export declare function walkFiles(dir: string, callback: (filePath: string) => void): void;
37
+ export declare function quickCredentialScan(targetDir: string): CredentialMatch[];
38
+ //# sourceMappingURL=credential-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-patterns.d.ts","sourceRoot":"","sources":["../../src/util/credential-patterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EAuDlD,CAAC;AAGF,eAAO,MAAM,SAAS,aAIpB,CAAC;AAEH,eAAO,MAAM,eAAe,aAQ1B,CAAC;AAIH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CA8BjF;AAID,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAsDxE"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ /**
3
+ * Shared credential detection patterns used by protect and init commands.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SKIP_EXTENSIONS = exports.SKIP_DIRS = exports.CREDENTIAL_PATTERNS = void 0;
40
+ exports.walkFiles = walkFiles;
41
+ exports.quickCredentialScan = quickCredentialScan;
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ // --- Patterns ---
45
+ exports.CREDENTIAL_PATTERNS = [
46
+ {
47
+ id: 'CRED-001',
48
+ title: 'Anthropic API Key',
49
+ pattern: /sk-ant-api\d{2}-[A-Za-z0-9_-]{80,}/g,
50
+ envVarPrefix: 'ANTHROPIC_API_KEY',
51
+ severity: 'critical',
52
+ explanation: 'Anthropic API key hardcoded in source. Anyone who reads this file can use your Anthropic account and access Claude models.',
53
+ businessImpact: 'Thousands in unauthorized API charges within hours. Bots actively scan for exposed keys in public repos.',
54
+ },
55
+ {
56
+ id: 'CRED-002',
57
+ title: 'OpenAI API Key',
58
+ pattern: /sk-(?:proj-|test-|svcacct-|live-)?[A-Za-z0-9_-]{20,}/g,
59
+ envVarPrefix: 'OPENAI_API_KEY',
60
+ severity: 'critical',
61
+ explanation: 'OpenAI API key hardcoded in source. Grants full API access to anyone with the source code.',
62
+ businessImpact: 'Unauthorized model usage, data extraction, and billing abuse. Exposed keys are exploited within minutes.',
63
+ },
64
+ {
65
+ id: 'DRIFT-001',
66
+ title: 'Google API Key (Gemini drift risk)',
67
+ pattern: /AIza[0-9A-Za-z_-]{35,}/g,
68
+ envVarPrefix: 'GOOGLE_API_KEY',
69
+ severity: 'high',
70
+ explanation: 'Google API key may have been provisioned for Maps but also grants Gemini AI access. Scope drift means the key can do more than intended.',
71
+ businessImpact: 'Attacker could run AI workloads billed to your account. Cross-service scope drift means you pay for services you did not authorize.',
72
+ },
73
+ {
74
+ id: 'DRIFT-002',
75
+ title: 'AWS Access Key (Bedrock drift risk)',
76
+ pattern: /AKIA[0-9A-Z]{16}/g,
77
+ envVarPrefix: 'AWS_ACCESS_KEY_ID',
78
+ severity: 'high',
79
+ explanation: 'AWS access key may grant Bedrock LLM access beyond its intended S3/EC2 scope. IAM policies often over-provision.',
80
+ businessImpact: 'Cross-service privilege escalation. AI model invocations billed to your account. Potential data exfiltration via Bedrock.',
81
+ },
82
+ {
83
+ id: 'CRED-003',
84
+ title: 'GitHub Token',
85
+ pattern: /gh[ps]_[A-Za-z0-9_]{36,}/g,
86
+ envVarPrefix: 'GITHUB_TOKEN',
87
+ severity: 'high',
88
+ explanation: 'GitHub token hardcoded in source. Grants repository access, potentially including private repos and org resources.',
89
+ businessImpact: 'Code theft, supply chain injection via unauthorized commits, and access to private repositories.',
90
+ },
91
+ {
92
+ id: 'CRED-004',
93
+ title: 'Generic API Key in Assignment',
94
+ pattern: /(?:api[_-]?key|apikey|secret[_-]?key)\s*[:=]\s*['"]([A-Za-z0-9_\-/.]{20,})['"]/gi,
95
+ envVarPrefix: 'API_KEY',
96
+ severity: 'medium',
97
+ explanation: 'Generic API key found in a variable assignment. The pattern suggests a secret intended for environment variables, not source code.',
98
+ businessImpact: 'Depends on the service -- could expose billing, data, or administrative access. Rotate immediately.',
99
+ },
100
+ ];
101
+ // Files/dirs to skip during scanning
102
+ exports.SKIP_DIRS = new Set([
103
+ 'node_modules', '.git', 'dist', 'build', 'coverage',
104
+ '.next', '.nuxt', '__pycache__', '.venv', 'venv',
105
+ '.tox', '.mypy_cache', '.pytest_cache',
106
+ ]);
107
+ exports.SKIP_EXTENSIONS = new Set([
108
+ '.png', '.jpg', '.jpeg', '.gif', '.ico', '.svg', '.webp',
109
+ '.woff', '.woff2', '.ttf', '.eot', '.otf',
110
+ '.zip', '.tar', '.gz', '.bz2', '.7z',
111
+ '.mp3', '.mp4', '.avi', '.mov', '.wav',
112
+ '.pdf', '.doc', '.docx', '.xls', '.xlsx',
113
+ '.exe', '.dll', '.so', '.dylib', '.o',
114
+ '.lock', '.map',
115
+ ]);
116
+ // --- File walker ---
117
+ function walkFiles(dir, callback) {
118
+ let entries;
119
+ try {
120
+ entries = fs.readdirSync(dir, { withFileTypes: true });
121
+ }
122
+ catch {
123
+ return;
124
+ }
125
+ // Dot-files to scan (credential sources)
126
+ const SCAN_DOTFILES = new Set(['.env', '.env.example', '.env.local', '.env.development', '.env.production', '.env.staging', '.env.test']);
127
+ for (const entry of entries) {
128
+ if (entry.name.startsWith('.') && !SCAN_DOTFILES.has(entry.name))
129
+ continue;
130
+ if (entry.isDirectory()) {
131
+ if (exports.SKIP_DIRS.has(entry.name))
132
+ continue;
133
+ walkFiles(path.join(dir, entry.name), callback);
134
+ }
135
+ else if (entry.isFile()) {
136
+ const ext = path.extname(entry.name).toLowerCase();
137
+ if (exports.SKIP_EXTENSIONS.has(ext))
138
+ continue;
139
+ // Skip large files (>1MB)
140
+ try {
141
+ const stat = fs.statSync(path.join(dir, entry.name));
142
+ if (stat.size > 1_048_576)
143
+ return;
144
+ }
145
+ catch {
146
+ return;
147
+ }
148
+ callback(path.join(dir, entry.name));
149
+ }
150
+ }
151
+ }
152
+ // --- Quick scan (used by init) ---
153
+ function quickCredentialScan(targetDir) {
154
+ const matches = [];
155
+ const seen = new Set();
156
+ walkFiles(targetDir, (filePath) => {
157
+ let content;
158
+ try {
159
+ content = fs.readFileSync(filePath, 'utf-8');
160
+ }
161
+ catch {
162
+ return;
163
+ }
164
+ const lines = content.split('\n');
165
+ for (const pattern of exports.CREDENTIAL_PATTERNS) {
166
+ for (let i = 0; i < lines.length; i++) {
167
+ const line = lines[i];
168
+ const re = new RegExp(pattern.pattern.source, pattern.pattern.flags);
169
+ let match;
170
+ while ((match = re.exec(line)) !== null) {
171
+ const value = match[1] ?? match[0];
172
+ const dedupKey = `${value}:${filePath}`;
173
+ if (seen.has(dedupKey))
174
+ continue;
175
+ seen.add(dedupKey);
176
+ // Skip if it looks like an env var reference already
177
+ const before = line.slice(0, match.index);
178
+ if (/process\.env\.\w*$/.test(before) ||
179
+ /\$\{?\w*$/.test(before) ||
180
+ /os\.environ\[['"]?\w*$/.test(before) ||
181
+ /getenv\(['"]?\w*$/.test(before))
182
+ continue;
183
+ const base = pattern.envVarPrefix;
184
+ const existing = matches.filter(m => m.envVar.startsWith(base));
185
+ const envVar = existing.length === 0 ? base : `${base}_${existing.length + 1}`;
186
+ matches.push({
187
+ value,
188
+ filePath,
189
+ line: i + 1,
190
+ findingId: pattern.id,
191
+ envVar,
192
+ severity: pattern.severity,
193
+ title: pattern.title,
194
+ explanation: pattern.explanation,
195
+ businessImpact: pattern.businessImpact,
196
+ });
197
+ }
198
+ }
199
+ }
200
+ });
201
+ return matches;
202
+ }
203
+ //# sourceMappingURL=credential-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-patterns.js","sourceRoot":"","sources":["../../src/util/credential-patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type ProjectType = 'node' | 'go' | 'python' | 'unknown';
2
+ export interface ProjectInfo {
3
+ type: ProjectType;
4
+ name: string | null;
5
+ version: string | null;
6
+ hasMcp: boolean;
7
+ hasEnv: boolean;
8
+ hasGit: boolean;
9
+ }
10
+ export declare function detectProject(dir: string): ProjectInfo;
11
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/util/detect.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAiDtD"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectProject = detectProject;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ function detectProject(dir) {
7
+ const info = {
8
+ type: 'unknown',
9
+ name: null,
10
+ version: null,
11
+ hasMcp: false,
12
+ hasEnv: false,
13
+ hasGit: (0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, '.git')),
14
+ };
15
+ // Check for Node.js project
16
+ const pkgPath = (0, node_path_1.resolve)(dir, 'package.json');
17
+ if ((0, node_fs_1.existsSync)(pkgPath)) {
18
+ info.type = 'node';
19
+ try {
20
+ const { readFileSync } = require('node:fs');
21
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
22
+ info.name = pkg.name ?? null;
23
+ info.version = pkg.version ?? null;
24
+ }
25
+ catch {
26
+ // Ignore parse errors
27
+ }
28
+ }
29
+ // Check for Go project
30
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'go.mod'))) {
31
+ info.type = 'go';
32
+ }
33
+ // Check for Python project
34
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'pyproject.toml')) ||
35
+ (0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'setup.py')) ||
36
+ (0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'requirements.txt'))) {
37
+ info.type = 'python';
38
+ }
39
+ // Check for MCP configuration
40
+ info.hasMcp =
41
+ (0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'mcp.json')) ||
42
+ (0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, '.mcp.json'));
43
+ // Check for environment files
44
+ info.hasEnv =
45
+ (0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, '.env')) ||
46
+ (0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, '.env.local'));
47
+ return info;
48
+ }
49
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/util/detect.ts"],"names":[],"mappings":";;AAcA,sCAiDC;AA/DD,qCAAqC;AACrC,yCAAoC;AAapC,SAAgB,aAAa,CAAC,GAAW;IACvC,MAAM,IAAI,GAAgB;QACxB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;KACzC,CAAC;IAEF,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,2BAA2B;IAC3B,IACE,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC1C,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACpC,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,EAC5C,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,MAAM;QACT,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACpC,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAExC,8BAA8B;IAC9B,IAAI,CAAC,MAAM;QACT,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAChC,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAEzC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function severityColor(severity: string): (text: string) => string;
2
+ export declare function severityLabel(severity: string): string;
3
+ export declare function formatCount(count: number, label: string): string;
4
+ export declare function formatDuration(ms: number): string;
5
+ export declare function table(rows: string[][], headers?: string[]): string;
6
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/util/format.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAQxE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBlE"}