fivosense 0.1.5 → 0.2.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 (136) hide show
  1. package/.kilo/skill/fivosense/skill.json +5 -5
  2. package/COMPLETE_SUMMARY.md +412 -0
  3. package/DEPLOYMENT_GUIDE.md +2 -2
  4. package/FINAL_VERIFICATION.md +316 -0
  5. package/GITHUB_PUSH.md +4 -4
  6. package/LICENSE +1 -1
  7. package/README.md +290 -208
  8. package/RELEASE_READY.md +3 -3
  9. package/bin/fivosense.mjs +6 -0
  10. package/dist/ai/client.d.ts +33 -0
  11. package/dist/ai/client.d.ts.map +1 -0
  12. package/dist/ai/client.js +170 -0
  13. package/dist/ai/client.js.map +1 -0
  14. package/dist/ai/judge.d.ts +9 -3
  15. package/dist/ai/judge.d.ts.map +1 -1
  16. package/dist/ai/judge.js +49 -14
  17. package/dist/ai/judge.js.map +1 -1
  18. package/dist/cli/index.d.ts +3 -1
  19. package/dist/cli/index.d.ts.map +1 -1
  20. package/dist/cli/index.js +6 -1
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/core/orchestrator.d.ts +34 -0
  23. package/dist/core/orchestrator.d.ts.map +1 -0
  24. package/dist/core/orchestrator.js +211 -0
  25. package/dist/core/orchestrator.js.map +1 -0
  26. package/dist/core/scope.d.ts +32 -0
  27. package/dist/core/scope.d.ts.map +1 -0
  28. package/dist/core/scope.js +149 -0
  29. package/dist/core/scope.js.map +1 -0
  30. package/dist/editors/vscode.d.ts +4 -2
  31. package/dist/editors/vscode.d.ts.map +1 -1
  32. package/dist/editors/vscode.js +6 -0
  33. package/dist/editors/vscode.js.map +1 -1
  34. package/dist/engine/adversary.d.ts +9 -2
  35. package/dist/engine/adversary.d.ts.map +1 -1
  36. package/dist/engine/adversary.js +47 -13
  37. package/dist/engine/adversary.js.map +1 -1
  38. package/dist/engine/graph.d.ts +4 -1
  39. package/dist/engine/graph.d.ts.map +1 -1
  40. package/dist/engine/graph.js +6 -0
  41. package/dist/engine/graph.js.map +1 -1
  42. package/dist/engine/poc.d.ts +26 -0
  43. package/dist/engine/poc.d.ts.map +1 -0
  44. package/dist/engine/poc.js +179 -0
  45. package/dist/engine/poc.js.map +1 -0
  46. package/dist/engine/reach.d.ts +4 -2
  47. package/dist/engine/reach.d.ts.map +1 -1
  48. package/dist/engine/reach.js +6 -0
  49. package/dist/engine/reach.js.map +1 -1
  50. package/dist/engine/sinks.d.ts +22 -32
  51. package/dist/engine/sinks.d.ts.map +1 -1
  52. package/dist/engine/sinks.js +338 -44
  53. package/dist/engine/sinks.js.map +1 -1
  54. package/dist/engine/sources.d.ts +11 -19
  55. package/dist/engine/sources.d.ts.map +1 -1
  56. package/dist/engine/sources.js +100 -24
  57. package/dist/engine/sources.js.map +1 -1
  58. package/dist/engine/taint.d.ts +6 -0
  59. package/dist/engine/taint.d.ts.map +1 -1
  60. package/dist/engine/taint.js +6 -0
  61. package/dist/engine/taint.js.map +1 -1
  62. package/dist/engine/verify.d.ts +4 -1
  63. package/dist/engine/verify.d.ts.map +1 -1
  64. package/dist/engine/verify.js +6 -0
  65. package/dist/engine/verify.js.map +1 -1
  66. package/dist/features/badge.d.ts +6 -0
  67. package/dist/features/badge.d.ts.map +1 -1
  68. package/dist/features/badge.js +4 -1
  69. package/dist/features/badge.js.map +1 -1
  70. package/dist/features/fix.d.ts +6 -0
  71. package/dist/features/fix.d.ts.map +1 -1
  72. package/dist/features/fix.js +4 -1
  73. package/dist/features/fix.js.map +1 -1
  74. package/dist/features/index.d.ts +6 -0
  75. package/dist/features/index.d.ts.map +1 -1
  76. package/dist/features/index.js +6 -0
  77. package/dist/features/index.js.map +1 -1
  78. package/dist/features/roast.d.ts +6 -0
  79. package/dist/features/roast.d.ts.map +1 -1
  80. package/dist/features/roast.js +4 -1
  81. package/dist/features/roast.js.map +1 -1
  82. package/dist/hooks/agent.d.ts +4 -1
  83. package/dist/hooks/agent.d.ts.map +1 -1
  84. package/dist/hooks/agent.js +6 -0
  85. package/dist/hooks/agent.js.map +1 -1
  86. package/dist/hooks/git.d.ts +34 -0
  87. package/dist/hooks/git.d.ts.map +1 -0
  88. package/dist/hooks/git.js +161 -0
  89. package/dist/hooks/git.js.map +1 -0
  90. package/dist/index.d.ts +4 -2
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +6 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/rules/destructive.d.ts +12 -21
  95. package/dist/rules/destructive.d.ts.map +1 -1
  96. package/dist/rules/destructive.js +306 -24
  97. package/dist/rules/destructive.js.map +1 -1
  98. package/dist/rules/secrets.d.ts +8 -10
  99. package/dist/rules/secrets.d.ts.map +1 -1
  100. package/dist/rules/secrets.js +294 -17
  101. package/dist/rules/secrets.js.map +1 -1
  102. package/mcp/index.js +55 -20
  103. package/mcp/package-lock.json +382 -0
  104. package/mcp/package.json +21 -4
  105. package/package.json +5 -5
  106. package/src/ai/client.ts +226 -0
  107. package/src/ai/judge.ts +58 -14
  108. package/src/cli/index.ts +7 -1
  109. package/src/core/orchestrator.ts +266 -0
  110. package/src/core/scope.ts +175 -0
  111. package/src/editors/vscode.ts +7 -0
  112. package/src/engine/adversary.ts +55 -12
  113. package/src/engine/graph.ts +7 -0
  114. package/src/engine/poc.ts +219 -0
  115. package/src/engine/reach.ts +7 -0
  116. package/src/engine/sinks.ts +358 -45
  117. package/src/engine/sources.ts +109 -24
  118. package/src/engine/taint.ts +7 -0
  119. package/src/engine/verify.ts +7 -0
  120. package/src/features/badge.ts +7 -0
  121. package/src/features/fix.ts +7 -0
  122. package/src/features/index.ts +7 -0
  123. package/src/features/roast.ts +7 -0
  124. package/src/hooks/agent.ts +7 -0
  125. package/src/hooks/git.ts +194 -0
  126. package/src/index.ts +7 -0
  127. package/src/rules/destructive.ts +316 -26
  128. package/src/rules/secrets.ts +306 -17
  129. package/vscode-extension/CHANGELOG.md +14 -2
  130. package/vscode-extension/LICENSE +1 -1
  131. package/vscode-extension/README.md +28 -23
  132. package/vscode-extension/fivosense-vscode-0.1.0.vsix +0 -0
  133. package/vscode-extension/fivosense-vscode-0.1.1.vsix +0 -0
  134. package/vscode-extension/package-lock.json +6 -6
  135. package/vscode-extension/package.json +7 -5
  136. package/vscode-extension/src/extension.ts +65 -11
@@ -1,46 +1,294 @@
1
1
  /**
2
- * Secret detection - finds hardcoded API keys, tokens, passwords
3
- */
4
- /**
5
- * Common secret patterns
2
+ * FivoSense - AI Security Scanner
3
+ * Copyright (c) 2026 thevinsoni
4
+ * Licensed under the MIT License
5
+ * https://github.com/thevinsoni/sense
6
6
  */
7
7
  export const SECRET_PATTERNS = [
8
+ // === AI / ML ===
8
9
  {
9
- pattern: /['"][A-Za-z0-9_]{32,}['"]/,
10
- type: 'generic_token',
11
- description: 'Generic API token (32+ chars)',
10
+ pattern: /['"]sk-proj-[A-Za-z0-9_-]{20,}['"]/,
11
+ type: 'openai_project_key',
12
+ description: 'OpenAI Project API key',
12
13
  severity: 'high',
13
14
  },
14
15
  {
15
- pattern: /['"]sk-[A-Za-z0-9]{48}['"]/,
16
+ pattern: /['"]sk-[A-Za-z0-9]{20,}['"]/,
16
17
  type: 'openai_key',
17
18
  description: 'OpenAI API key',
18
19
  severity: 'high',
19
20
  },
21
+ {
22
+ pattern: /['"]sk-ant-[A-Za-z0-9_-]{20,}['"]/,
23
+ type: 'anthropic_key',
24
+ description: 'Anthropic Claude API key',
25
+ severity: 'high',
26
+ },
20
27
  {
21
28
  pattern: /['"]AIza[A-Za-z0-9_-]{35}['"]/,
22
29
  type: 'google_api_key',
23
30
  description: 'Google API key',
24
31
  severity: 'high',
25
32
  },
33
+ {
34
+ pattern: /['"]ya29\.[A-Za-z0-9_-]+['"]/,
35
+ type: 'google_oauth_token',
36
+ description: 'Google OAuth access token',
37
+ severity: 'high',
38
+ },
39
+ {
40
+ pattern: /['"][0-9]+-[A-Za-z0-9_]{32}\.apps\.googleusercontent\.com['"]/,
41
+ type: 'google_oauth_client_id',
42
+ description: 'Google OAuth client ID',
43
+ severity: 'high',
44
+ },
45
+ // === Cloud Providers ===
26
46
  {
27
47
  pattern: /['"]AKIA[A-Z0-9]{16}['"]/,
28
48
  type: 'aws_access_key',
29
49
  description: 'AWS Access Key ID',
30
50
  severity: 'high',
31
51
  },
52
+ {
53
+ pattern: /['"]ASIA[A-Z0-9]{16}['"]/,
54
+ type: 'aws_temp_key',
55
+ description: 'AWS Temporary Access Key',
56
+ severity: 'high',
57
+ },
58
+ {
59
+ pattern: /aws[_-]?secret[_-]?access[_-]?key\s*[:=]\s*['"][A-Za-z0-9/+=]{40}['"]/i,
60
+ type: 'aws_secret_key',
61
+ description: 'AWS Secret Access Key',
62
+ severity: 'high',
63
+ },
64
+ {
65
+ pattern: /['"]arn:aws:[a-z0-9-]+:[a-z0-9-]*:[0-9]+:/,
66
+ type: 'aws_arn',
67
+ description: 'AWS ARN (resource identifier)',
68
+ severity: 'medium',
69
+ },
70
+ {
71
+ pattern: /AccountKey\s*=\s*[A-Za-z0-9+/=]{80,}/i,
72
+ type: 'azure_storage_key',
73
+ description: 'Azure Storage Account Key',
74
+ severity: 'high',
75
+ },
76
+ {
77
+ pattern: /['"][a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}['"]/,
78
+ type: 'azure_tenant_or_client',
79
+ description: 'Azure Tenant/Client UUID',
80
+ severity: 'medium',
81
+ },
82
+ {
83
+ pattern: /['"](?:AAAA)[A-Za-z0-9+/=]{40,}['"]/,
84
+ type: 'firebase_token',
85
+ description: 'Firebase authentication token',
86
+ severity: 'high',
87
+ },
88
+ {
89
+ pattern: /['"]SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}['"]/,
90
+ type: 'sendgrid_key',
91
+ description: 'SendGrid API key',
92
+ severity: 'high',
93
+ },
94
+ {
95
+ pattern: /['"]service_account['"]\s*[:=]/i,
96
+ type: 'gcp_service_account',
97
+ description: 'GCP service account',
98
+ severity: 'high',
99
+ },
100
+ {
101
+ pattern: /['"]type['"]\s*[:=]\s*['"]service_account['"]/i,
102
+ type: 'gcp_sa_json',
103
+ description: 'GCP service account JSON',
104
+ severity: 'high',
105
+ },
106
+ // === GitHub / Git ===
32
107
  {
33
108
  pattern: /['"]ghp_[A-Za-z0-9]{36}['"]/,
34
- type: 'github_token',
35
- description: 'GitHub Personal Access Token',
109
+ type: 'github_pat',
110
+ description: 'GitHub Personal Access Token (classic)',
111
+ severity: 'high',
112
+ },
113
+ {
114
+ pattern: /['"]github_pat_[A-Za-z0-9_]{22,}['"]/,
115
+ type: 'github_fine_grained_pat',
116
+ description: 'GitHub Fine-Grained PAT',
117
+ severity: 'high',
118
+ },
119
+ {
120
+ pattern: /['"]gho_[A-Za-z0-9]{36}['"]/,
121
+ type: 'github_oauth',
122
+ description: 'GitHub OAuth token',
123
+ severity: 'high',
124
+ },
125
+ {
126
+ pattern: /['"]ghs_[A-Za-z0-9]{36}['"]/,
127
+ type: 'github_app_token',
128
+ description: 'GitHub App installation token',
36
129
  severity: 'high',
37
130
  },
131
+ {
132
+ pattern: /['"]ghr_[A-Za-z0-9]{36}['"]/,
133
+ type: 'github_refresh',
134
+ description: 'GitHub refresh token',
135
+ severity: 'high',
136
+ },
137
+ {
138
+ pattern: /['"]glpat-[A-Za-z0-9_-]{20,}['"]/,
139
+ type: 'gitlab_pat',
140
+ description: 'GitLab Personal Access Token',
141
+ severity: 'high',
142
+ },
143
+ // === Communication ===
38
144
  {
39
145
  pattern: /['"]xox[baprs]-[A-Za-z0-9-]{10,}['"]/,
40
146
  type: 'slack_token',
41
147
  description: 'Slack Token',
42
148
  severity: 'high',
43
149
  },
150
+ {
151
+ pattern: /['"]https:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]+\/B[A-Z0-9]+\/[A-Za-z0-9]+['"]/,
152
+ type: 'slack_webhook',
153
+ description: 'Slack Webhook URL',
154
+ severity: 'high',
155
+ },
156
+ {
157
+ pattern: /['"][0-9]+:AA[A-Za-z0-9_-]{30,}['"]/,
158
+ type: 'telegram_bot_token',
159
+ description: 'Telegram Bot Token',
160
+ severity: 'high',
161
+ },
162
+ {
163
+ pattern: /['"]discord(app)?\.com\/api\/webhooks\/[0-9]+\/[A-Za-z0-9_-]+['"]/,
164
+ type: 'discord_webhook',
165
+ description: 'Discord Webhook URL',
166
+ severity: 'high',
167
+ },
168
+ // === Payment ===
169
+ {
170
+ pattern: /['"]sk_live_[A-Za-z0-9]{20,}['"]/,
171
+ type: 'stripe_secret_live',
172
+ description: 'Stripe Secret Key (LIVE)',
173
+ severity: 'high',
174
+ },
175
+ {
176
+ pattern: /['"]sk_test_[A-Za-z0-9]{20,}['"]/,
177
+ type: 'stripe_secret_test',
178
+ description: 'Stripe Secret Key (test)',
179
+ severity: 'high',
180
+ },
181
+ {
182
+ pattern: /['"]rk_live_[A-Za-z0-9]{20,}['"]/,
183
+ type: 'stripe_restricted_live',
184
+ description: 'Stripe Restricted Key (LIVE)',
185
+ severity: 'high',
186
+ },
187
+ {
188
+ pattern: /['"]rk_test_[A-Za-z0-9]{20,}['"]/,
189
+ type: 'stripe_restricted_test',
190
+ description: 'Stripe Restricted Key (test)',
191
+ severity: 'high',
192
+ },
193
+ {
194
+ pattern: /['"]sq0csp-[A-Za-z0-9_-]{22,}['"]/,
195
+ type: 'square_key',
196
+ description: 'Square OAuth secret',
197
+ severity: 'high',
198
+ },
199
+ // === SaaS / Dev Tools ===
200
+ {
201
+ pattern: /['"]npm_[A-Za-z0-9]{36}['"]/,
202
+ type: 'npm_token',
203
+ description: 'npm access token',
204
+ severity: 'high',
205
+ },
206
+ {
207
+ pattern: /['"]pypi-[A-Za-z0-9_-]{50,}['"]/,
208
+ type: 'pypi_token',
209
+ description: 'PyPI API token',
210
+ severity: 'high',
211
+ },
212
+ {
213
+ pattern: /['"]do_[a-zA-Z0-9]{64}['"]/,
214
+ type: 'digitalocean_token',
215
+ description: 'DigitalOcean API token',
216
+ severity: 'high',
217
+ },
218
+ {
219
+ pattern: /['"]dop_v1_[a-f0-9]{64}['"]/,
220
+ type: 'doppler_token',
221
+ description: 'Doppler service token',
222
+ severity: 'high',
223
+ },
224
+ {
225
+ pattern: /['"]NRAK-[A-Z0-9]{27}['"]/,
226
+ type: 'newrelic_key',
227
+ description: 'New Relic API key',
228
+ severity: 'high',
229
+ },
230
+ {
231
+ pattern: /['"]shpat_[a-fA-F0-9]{32}['"]/,
232
+ type: 'shopify_key',
233
+ description: 'Shopify Private App Access Token',
234
+ severity: 'high',
235
+ },
236
+ {
237
+ pattern: /['"]shpss_[a-fA-F0-9]{32}['"]/,
238
+ type: 'shopify_secret',
239
+ description: 'Shopify Shared Secret',
240
+ severity: 'high',
241
+ },
242
+ {
243
+ pattern: /['"]Bearer\s+[A-Za-z0-9_-]{20,}['"]/,
244
+ type: 'bearer_token',
245
+ description: 'Bearer authentication token',
246
+ severity: 'high',
247
+ },
248
+ {
249
+ pattern: /['"]Basic\s+[A-Za-z0-9+/=]{20,}['"]/,
250
+ type: 'basic_auth',
251
+ description: 'Basic authentication header',
252
+ severity: 'high',
253
+ },
254
+ // === Database Connection Strings ===
255
+ {
256
+ pattern: /['"]mongodb(\+srv)?:\/\/[^'"]+['"]/,
257
+ type: 'mongodb_uri',
258
+ description: 'MongoDB connection string',
259
+ severity: 'high',
260
+ },
261
+ {
262
+ pattern: /['"]postgres(ql)?:\/\/[^'"]+['"]/,
263
+ type: 'postgres_uri',
264
+ description: 'PostgreSQL connection string',
265
+ severity: 'high',
266
+ },
267
+ {
268
+ pattern: /['"]mysql:\/\/[^'"]+['"]/,
269
+ type: 'mysql_uri',
270
+ description: 'MySQL connection string',
271
+ severity: 'high',
272
+ },
273
+ {
274
+ pattern: /['"]redis:\/\/[^'"]+['"]/,
275
+ type: 'redis_uri',
276
+ description: 'Redis connection string',
277
+ severity: 'high',
278
+ },
279
+ {
280
+ pattern: /['"]amqps?:\/\/[^'"]+['"]/,
281
+ type: 'amqp_uri',
282
+ description: 'AMQP connection string',
283
+ severity: 'high',
284
+ },
285
+ {
286
+ pattern: /['"]jdbc:[^'"]+['"]/,
287
+ type: 'jdbc_uri',
288
+ description: 'JDBC connection string',
289
+ severity: 'high',
290
+ },
291
+ // === Generic Hardcoded Credentials ===
44
292
  {
45
293
  pattern: /password\s*[:=]\s*['"][^'"]+['"]/i,
46
294
  type: 'password',
@@ -59,15 +307,47 @@ export const SECRET_PATTERNS = [
59
307
  description: 'Hardcoded secret',
60
308
  severity: 'high',
61
309
  },
310
+ {
311
+ pattern: /token\s*[:=]\s*['"][^'"]{20,}['"]/i,
312
+ type: 'token',
313
+ description: 'Hardcoded token',
314
+ severity: 'high',
315
+ },
316
+ {
317
+ pattern: /private[_-]?key\s*[:=]\s*['"][^'"]+['"]/i,
318
+ type: 'private_key',
319
+ description: 'Hardcoded private key',
320
+ severity: 'high',
321
+ },
322
+ {
323
+ pattern: /access[_-]?key\s*[:=]\s*['"][^'"]+['"]/i,
324
+ type: 'access_key',
325
+ description: 'Hardcoded access key',
326
+ severity: 'high',
327
+ },
328
+ {
329
+ pattern: /auth[_-]?token\s*[:=]\s*['"][^'"]+['"]/i,
330
+ type: 'auth_token',
331
+ description: 'Hardcoded auth token',
332
+ severity: 'high',
333
+ },
334
+ {
335
+ pattern: /client[_-]?secret\s*[:=]\s*['"][^'"]+['"]/i,
336
+ type: 'client_secret',
337
+ description: 'Hardcoded client secret',
338
+ severity: 'high',
339
+ },
340
+ {
341
+ pattern: /['"][A-Za-z0-9_]{32,}['"]/,
342
+ type: 'generic_token',
343
+ description: 'Generic high-entropy token (32+ chars)',
344
+ severity: 'medium',
345
+ },
62
346
  ];
63
- /**
64
- * Detect secrets in code
65
- */
66
347
  export function detectSecrets(code) {
67
348
  const lines = code.split('\n');
68
349
  const matches = [];
69
350
  lines.forEach((line, index) => {
70
- // Skip comments
71
351
  if (line.trim().startsWith('//') || line.trim().startsWith('*')) {
72
352
  return;
73
353
  }
@@ -86,9 +366,6 @@ export function detectSecrets(code) {
86
366
  });
87
367
  return matches;
88
368
  }
89
- /**
90
- * Check if specific line contains a secret
91
- */
92
369
  export function isSecretLine(line) {
93
370
  for (const pattern of SECRET_PATTERNS) {
94
371
  if (pattern.pattern.test(line)) {
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/rules/secrets.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C;QACE,OAAO,EAAE,2BAA2B;QACpC,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,+BAA+B;QAC5C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,4BAA4B;QACrC,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,gBAAgB;QAC7B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,gBAAgB;QAC7B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,0BAA0B;QACnC,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,8BAA8B;QAC3C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,sCAAsC;QAC/C,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,mCAAmC;QAC5C,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,sCAAsC;QAC/C,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kBAAkB;QAC/B,QAAQ,EAAE,MAAM;KACjB;CACF,CAAC;AAUF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,gBAAgB;QAChB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,OAAO;QACT,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,IAAI,EAAE,KAAK,GAAG,CAAC;oBACf,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;iBACzC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/rules/secrets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,kBAAkB;IAClB;QACE,OAAO,EAAE,oCAAoC;QAC7C,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,gBAAgB;QAC7B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,mCAAmC;QAC5C,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,gBAAgB;QAC7B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,8BAA8B;QACvC,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,2BAA2B;QACxC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,+DAA+D;QACxE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,MAAM;KACjB;IAED,0BAA0B;IAC1B;QACE,OAAO,EAAE,0BAA0B;QACnC,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,0BAA0B;QACnC,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,wEAAwE;QACjF,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,uBAAuB;QACpC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,2CAA2C;QACpD,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,+BAA+B;QAC5C,QAAQ,EAAE,QAAQ;KACnB;IACD;QACE,OAAO,EAAE,uCAAuC;QAChD,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,2BAA2B;QACxC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,sEAAsE;QAC/E,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,QAAQ;KACnB;IACD;QACE,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,+BAA+B;QAC5C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,kDAAkD;QAC3D,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,kBAAkB;QAC/B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,qBAAqB;QAClC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,gDAAgD;QACzD,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,MAAM;KACjB;IAED,uBAAuB;IACvB;QACE,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,wCAAwC;QACrD,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,sCAAsC;QAC/C,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,yBAAyB;QACtC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,+BAA+B;QAC5C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,sBAAsB;QACnC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,8BAA8B;QAC3C,QAAQ,EAAE,MAAM;KACjB;IAED,wBAAwB;IACxB;QACE,OAAO,EAAE,sCAAsC;QAC/C,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,qFAAqF;QAC9F,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,mEAAmE;QAC5E,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,qBAAqB;QAClC,QAAQ,EAAE,MAAM;KACjB;IAED,kBAAkB;IAClB;QACE,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,8BAA8B;QAC3C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,8BAA8B;QAC3C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,mCAAmC;QAC5C,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,qBAAqB;QAClC,QAAQ,EAAE,MAAM;KACjB;IAED,2BAA2B;IAC3B;QACE,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,kBAAkB;QAC/B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,gBAAgB;QAC7B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,4BAA4B;QACrC,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,uBAAuB;QACpC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,2BAA2B;QACpC,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,kCAAkC;QAC/C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,uBAAuB;QACpC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,MAAM;KACjB;IAED,sCAAsC;IACtC;QACE,OAAO,EAAE,oCAAoC;QAC7C,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,2BAA2B;QACxC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,kCAAkC;QAC3C,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,8BAA8B;QAC3C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,0BAA0B;QACnC,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,yBAAyB;QACtC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,0BAA0B;QACnC,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,yBAAyB;QACtC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,2BAA2B;QACpC,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,qBAAqB;QAC9B,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,MAAM;KACjB;IAED,wCAAwC;IACxC;QACE,OAAO,EAAE,mCAAmC;QAC5C,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,sCAAsC;QAC/C,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,iCAAiC;QAC1C,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kBAAkB;QAC/B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,oCAAoC;QAC7C,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,0CAA0C;QACnD,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,uBAAuB;QACpC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,yCAAyC;QAClD,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,sBAAsB;QACnC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,yCAAyC;QAClD,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,sBAAsB;QACnC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,yBAAyB;QACtC,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,2BAA2B;QACpC,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,wCAAwC;QACrD,QAAQ,EAAE,QAAQ;KACnB;CACF,CAAC;AAUF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,OAAO;QACT,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,IAAI,EAAE,KAAK,GAAG,CAAC;oBACf,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;iBACzC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/mcp/index.js CHANGED
@@ -1,4 +1,11 @@
1
1
  #!/usr/bin/env node
2
+ /**
3
+ * FivoSense MCP Server
4
+ * Copyright (c) 2026 thevinsoni
5
+ * Licensed under the MIT License
6
+ * https://github.com/thevinsoni/sense
7
+ */
8
+
2
9
  /**
3
10
  * FivoSense MCP Server
4
11
  *
@@ -117,17 +124,33 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
117
124
  low: result.summary.low,
118
125
  };
119
126
 
120
- const findings = result.findings.map(f => ({
121
- type: f.type,
122
- severity: f.severity,
123
- message: f.message,
124
- source: f.source,
125
- sink: f.sink,
126
- cwe: f.cwe,
127
- line: f.line,
128
- evidence: f.evidence,
129
- fix: f.fix,
130
- }));
127
+ // Combine vulnerabilities and secrets
128
+ const allFindings = [
129
+ ...result.vulnerabilities.map(v => ({
130
+ type: v.category,
131
+ severity: v.severity,
132
+ message: `${v.finding} vulnerability detected`,
133
+ source: v.path[0] || 'unknown',
134
+ sink: v.path[v.path.length - 1] || 'unknown',
135
+ cwe: v.cwe,
136
+ line: v.location.line,
137
+ evidence: v.evidence.filter(e => e.line).map(e => `${e.type} at line ${e.line}`).join(', ') || 'No evidence',
138
+ fix: 'Use proper sanitization (parameterized queries, input validation, etc.)',
139
+ })),
140
+ ...result.secrets.map(s => ({
141
+ type: 'secret',
142
+ severity: 'high',
143
+ message: `${s.type} detected`,
144
+ source: 'hardcoded',
145
+ sink: 'code',
146
+ cwe: 'CWE-798',
147
+ line: s.line,
148
+ evidence: s.match,
149
+ fix: 'Use environment variables',
150
+ }))
151
+ ];
152
+
153
+ const findings = allFindings;
131
154
 
132
155
  return {
133
156
  content: [
@@ -158,17 +181,29 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
158
181
  critical: result.summary.critical,
159
182
  high: result.summary.high,
160
183
  medium: result.summary.medium,
161
- low: result.summary.low,
162
184
  };
163
185
 
164
- const findings = result.findings.map(f => ({
165
- type: f.type,
166
- severity: f.severity,
167
- message: f.message,
168
- line: f.line,
169
- evidence: f.evidence,
170
- fix: f.fix,
171
- }));
186
+ // Combine vulnerabilities and secrets
187
+ const allFindings = [
188
+ ...result.vulnerabilities.map(v => ({
189
+ type: v.category,
190
+ severity: v.severity,
191
+ message: `${v.finding} vulnerability detected`,
192
+ line: v.location.line,
193
+ evidence: v.evidence.filter(e => e.line).map(e => `${e.type} at line ${e.line}`).join(', ') || 'No evidence',
194
+ fix: 'Use proper sanitization (parameterized queries, input validation, etc.)',
195
+ })),
196
+ ...result.secrets.map(s => ({
197
+ type: 'secret',
198
+ severity: 'high',
199
+ message: `${s.type} detected`,
200
+ line: s.line,
201
+ evidence: s.match,
202
+ fix: 'Use environment variables',
203
+ }))
204
+ ];
205
+
206
+ const findings = allFindings;
172
207
 
173
208
  return {
174
209
  content: [