chainwall 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 (348) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +278 -0
  3. package/commands/security-scan.md +35 -0
  4. package/dist/auditor/access-mapper.d.ts +3 -0
  5. package/dist/auditor/access-mapper.d.ts.map +1 -0
  6. package/dist/auditor/access-mapper.js +15 -0
  7. package/dist/auditor/access-mapper.js.map +1 -0
  8. package/dist/auditor/cli-detector.d.ts +7 -0
  9. package/dist/auditor/cli-detector.d.ts.map +1 -0
  10. package/dist/auditor/cli-detector.js +63 -0
  11. package/dist/auditor/cli-detector.js.map +1 -0
  12. package/dist/auditor/cross-reference.d.ts +4 -0
  13. package/dist/auditor/cross-reference.d.ts.map +1 -0
  14. package/dist/auditor/cross-reference.js +16 -0
  15. package/dist/auditor/cross-reference.js.map +1 -0
  16. package/dist/auditor/env-auditor.d.ts +9 -0
  17. package/dist/auditor/env-auditor.d.ts.map +1 -0
  18. package/dist/auditor/env-auditor.js +83 -0
  19. package/dist/auditor/env-auditor.js.map +1 -0
  20. package/dist/auditor/mcp-analyzer.d.ts +11 -0
  21. package/dist/auditor/mcp-analyzer.d.ts.map +1 -0
  22. package/dist/auditor/mcp-analyzer.js +145 -0
  23. package/dist/auditor/mcp-analyzer.js.map +1 -0
  24. package/dist/auditor/mcp-detector.d.ts +17 -0
  25. package/dist/auditor/mcp-detector.d.ts.map +1 -0
  26. package/dist/auditor/mcp-detector.js +86 -0
  27. package/dist/auditor/mcp-detector.js.map +1 -0
  28. package/dist/auditor/remediation.d.ts +26 -0
  29. package/dist/auditor/remediation.d.ts.map +1 -0
  30. package/dist/auditor/remediation.js +222 -0
  31. package/dist/auditor/remediation.js.map +1 -0
  32. package/dist/auditor/tool-detector.d.ts +15 -0
  33. package/dist/auditor/tool-detector.d.ts.map +1 -0
  34. package/dist/auditor/tool-detector.js +241 -0
  35. package/dist/auditor/tool-detector.js.map +1 -0
  36. package/dist/auditor/types.d.ts +31 -0
  37. package/dist/auditor/types.d.ts.map +1 -0
  38. package/dist/auditor/types.js +2 -0
  39. package/dist/auditor/types.js.map +1 -0
  40. package/dist/auditor/vscode-extension-scanner.d.ts +8 -0
  41. package/dist/auditor/vscode-extension-scanner.d.ts.map +1 -0
  42. package/dist/auditor/vscode-extension-scanner.js +51 -0
  43. package/dist/auditor/vscode-extension-scanner.js.map +1 -0
  44. package/dist/cli.d.ts +3 -0
  45. package/dist/cli.d.ts.map +1 -0
  46. package/dist/cli.js +159 -0
  47. package/dist/cli.js.map +1 -0
  48. package/dist/commands/audit.d.ts +8 -0
  49. package/dist/commands/audit.d.ts.map +1 -0
  50. package/dist/commands/audit.js +151 -0
  51. package/dist/commands/audit.js.map +1 -0
  52. package/dist/commands/init.d.ts +2 -0
  53. package/dist/commands/init.d.ts.map +1 -0
  54. package/dist/commands/init.js +34 -0
  55. package/dist/commands/init.js.map +1 -0
  56. package/dist/commands/remediate-cli.d.ts +3 -0
  57. package/dist/commands/remediate-cli.d.ts.map +1 -0
  58. package/dist/commands/remediate-cli.js +96 -0
  59. package/dist/commands/remediate-cli.js.map +1 -0
  60. package/dist/commands/scan.d.ts +11 -0
  61. package/dist/commands/scan.d.ts.map +1 -0
  62. package/dist/commands/scan.js +138 -0
  63. package/dist/commands/scan.js.map +1 -0
  64. package/dist/commands/watch.d.ts +6 -0
  65. package/dist/commands/watch.d.ts.map +1 -0
  66. package/dist/commands/watch.js +203 -0
  67. package/dist/commands/watch.js.map +1 -0
  68. package/dist/config.d.ts +19 -0
  69. package/dist/config.d.ts.map +1 -0
  70. package/dist/config.js +235 -0
  71. package/dist/config.js.map +1 -0
  72. package/dist/mcp-server/index.d.ts +3 -0
  73. package/dist/mcp-server/index.d.ts.map +1 -0
  74. package/dist/mcp-server/index.js +69 -0
  75. package/dist/mcp-server/index.js.map +1 -0
  76. package/dist/mcp-server/schemas.d.ts +13 -0
  77. package/dist/mcp-server/schemas.d.ts.map +1 -0
  78. package/dist/mcp-server/schemas.js +13 -0
  79. package/dist/mcp-server/schemas.js.map +1 -0
  80. package/dist/mcp-server/tools/audit-status.d.ts +3 -0
  81. package/dist/mcp-server/tools/audit-status.d.ts.map +1 -0
  82. package/dist/mcp-server/tools/audit-status.js +46 -0
  83. package/dist/mcp-server/tools/audit-status.js.map +1 -0
  84. package/dist/mcp-server/tools/check-command.d.ts +4 -0
  85. package/dist/mcp-server/tools/check-command.d.ts.map +1 -0
  86. package/dist/mcp-server/tools/check-command.js +30 -0
  87. package/dist/mcp-server/tools/check-command.js.map +1 -0
  88. package/dist/mcp-server/tools/scan-content.d.ts +4 -0
  89. package/dist/mcp-server/tools/scan-content.d.ts.map +1 -0
  90. package/dist/mcp-server/tools/scan-content.js +18 -0
  91. package/dist/mcp-server/tools/scan-content.js.map +1 -0
  92. package/dist/mcp-server/tools/scan-file.d.ts +4 -0
  93. package/dist/mcp-server/tools/scan-file.d.ts.map +1 -0
  94. package/dist/mcp-server/tools/scan-file.js +48 -0
  95. package/dist/mcp-server/tools/scan-file.js.map +1 -0
  96. package/dist/mcp-server/types.d.ts +15 -0
  97. package/dist/mcp-server/types.d.ts.map +1 -0
  98. package/dist/mcp-server/types.js +2 -0
  99. package/dist/mcp-server/types.js.map +1 -0
  100. package/dist/reporter/audit-report.d.ts +4 -0
  101. package/dist/reporter/audit-report.d.ts.map +1 -0
  102. package/dist/reporter/audit-report.js +186 -0
  103. package/dist/reporter/audit-report.js.map +1 -0
  104. package/dist/reporter/json-report.d.ts +3 -0
  105. package/dist/reporter/json-report.d.ts.map +1 -0
  106. package/dist/reporter/json-report.js +4 -0
  107. package/dist/reporter/json-report.js.map +1 -0
  108. package/dist/reporter/remediation-text.d.ts +3 -0
  109. package/dist/reporter/remediation-text.d.ts.map +1 -0
  110. package/dist/reporter/remediation-text.js +12 -0
  111. package/dist/reporter/remediation-text.js.map +1 -0
  112. package/dist/reporter/risk-scorer.d.ts +8 -0
  113. package/dist/reporter/risk-scorer.d.ts.map +1 -0
  114. package/dist/reporter/risk-scorer.js +40 -0
  115. package/dist/reporter/risk-scorer.js.map +1 -0
  116. package/dist/reporter/sarif-report.d.ts +3 -0
  117. package/dist/reporter/sarif-report.d.ts.map +1 -0
  118. package/dist/reporter/sarif-report.js +80 -0
  119. package/dist/reporter/sarif-report.js.map +1 -0
  120. package/dist/reporter/shared.d.ts +11 -0
  121. package/dist/reporter/shared.d.ts.map +1 -0
  122. package/dist/reporter/shared.js +85 -0
  123. package/dist/reporter/shared.js.map +1 -0
  124. package/dist/reporter/summary-generator.d.ts +16 -0
  125. package/dist/reporter/summary-generator.d.ts.map +1 -0
  126. package/dist/reporter/summary-generator.js +89 -0
  127. package/dist/reporter/summary-generator.js.map +1 -0
  128. package/dist/reporter/terminal-report.d.ts +4 -0
  129. package/dist/reporter/terminal-report.d.ts.map +1 -0
  130. package/dist/reporter/terminal-report.js +135 -0
  131. package/dist/reporter/terminal-report.js.map +1 -0
  132. package/dist/rules/crypto-rules.d.ts +3 -0
  133. package/dist/rules/crypto-rules.d.ts.map +1 -0
  134. package/dist/rules/crypto-rules.js +252 -0
  135. package/dist/rules/crypto-rules.js.map +1 -0
  136. package/dist/rules/default-rules.d.ts +9 -0
  137. package/dist/rules/default-rules.d.ts.map +1 -0
  138. package/dist/rules/default-rules.js +1319 -0
  139. package/dist/rules/default-rules.js.map +1 -0
  140. package/dist/rules/index.d.ts +7 -0
  141. package/dist/rules/index.d.ts.map +1 -0
  142. package/dist/rules/index.js +7 -0
  143. package/dist/rules/index.js.map +1 -0
  144. package/dist/rules/injection-rules.d.ts +8 -0
  145. package/dist/rules/injection-rules.d.ts.map +1 -0
  146. package/dist/rules/injection-rules.js +108 -0
  147. package/dist/rules/injection-rules.js.map +1 -0
  148. package/dist/rules/types.d.ts +52 -0
  149. package/dist/rules/types.d.ts.map +1 -0
  150. package/dist/rules/types.js +2 -0
  151. package/dist/rules/types.js.map +1 -0
  152. package/dist/scanner/filesystem-scanner.d.ts +26 -0
  153. package/dist/scanner/filesystem-scanner.d.ts.map +1 -0
  154. package/dist/scanner/filesystem-scanner.js +369 -0
  155. package/dist/scanner/filesystem-scanner.js.map +1 -0
  156. package/dist/scanner/injection-scanner.d.ts +12 -0
  157. package/dist/scanner/injection-scanner.d.ts.map +1 -0
  158. package/dist/scanner/injection-scanner.js +136 -0
  159. package/dist/scanner/injection-scanner.js.map +1 -0
  160. package/dist/scanner/permission-checker.d.ts +4 -0
  161. package/dist/scanner/permission-checker.d.ts.map +1 -0
  162. package/dist/scanner/permission-checker.js +37 -0
  163. package/dist/scanner/permission-checker.js.map +1 -0
  164. package/dist/scanner/redact.d.ts +3 -0
  165. package/dist/scanner/redact.d.ts.map +1 -0
  166. package/dist/scanner/redact.js +17 -0
  167. package/dist/scanner/redact.js.map +1 -0
  168. package/dist/scanner/rule-engine.d.ts +9 -0
  169. package/dist/scanner/rule-engine.d.ts.map +1 -0
  170. package/dist/scanner/rule-engine.js +129 -0
  171. package/dist/scanner/rule-engine.js.map +1 -0
  172. package/dist/scanner/system-targets.d.ts +17 -0
  173. package/dist/scanner/system-targets.d.ts.map +1 -0
  174. package/dist/scanner/system-targets.js +81 -0
  175. package/dist/scanner/system-targets.js.map +1 -0
  176. package/dist/tui/App.d.ts +6 -0
  177. package/dist/tui/App.d.ts.map +1 -0
  178. package/dist/tui/App.js +224 -0
  179. package/dist/tui/App.js.map +1 -0
  180. package/dist/tui/components/BootSequence.d.ts +6 -0
  181. package/dist/tui/components/BootSequence.d.ts.map +1 -0
  182. package/dist/tui/components/BootSequence.js +40 -0
  183. package/dist/tui/components/BootSequence.js.map +1 -0
  184. package/dist/tui/components/BorderedSection.d.ts +12 -0
  185. package/dist/tui/components/BorderedSection.d.ts.map +1 -0
  186. package/dist/tui/components/BorderedSection.js +7 -0
  187. package/dist/tui/components/BorderedSection.js.map +1 -0
  188. package/dist/tui/components/ErrorBoundary.d.ts +18 -0
  189. package/dist/tui/components/ErrorBoundary.d.ts.map +1 -0
  190. package/dist/tui/components/ErrorBoundary.js +36 -0
  191. package/dist/tui/components/ErrorBoundary.js.map +1 -0
  192. package/dist/tui/components/FirstUseHint.d.ts +7 -0
  193. package/dist/tui/components/FirstUseHint.d.ts.map +1 -0
  194. package/dist/tui/components/FirstUseHint.js +20 -0
  195. package/dist/tui/components/FirstUseHint.js.map +1 -0
  196. package/dist/tui/components/Footer.d.ts +10 -0
  197. package/dist/tui/components/Footer.d.ts.map +1 -0
  198. package/dist/tui/components/Footer.js +51 -0
  199. package/dist/tui/components/Footer.js.map +1 -0
  200. package/dist/tui/components/MetricCard.d.ts +11 -0
  201. package/dist/tui/components/MetricCard.d.ts.map +1 -0
  202. package/dist/tui/components/MetricCard.js +8 -0
  203. package/dist/tui/components/MetricCard.js.map +1 -0
  204. package/dist/tui/components/Panel.d.ts +15 -0
  205. package/dist/tui/components/Panel.d.ts.map +1 -0
  206. package/dist/tui/components/Panel.js +25 -0
  207. package/dist/tui/components/Panel.js.map +1 -0
  208. package/dist/tui/components/RemediationMenu.d.ts +10 -0
  209. package/dist/tui/components/RemediationMenu.d.ts.map +1 -0
  210. package/dist/tui/components/RemediationMenu.js +84 -0
  211. package/dist/tui/components/RemediationMenu.js.map +1 -0
  212. package/dist/tui/components/RiskGauge.d.ts +7 -0
  213. package/dist/tui/components/RiskGauge.d.ts.map +1 -0
  214. package/dist/tui/components/RiskGauge.js +55 -0
  215. package/dist/tui/components/RiskGauge.js.map +1 -0
  216. package/dist/tui/components/ScrollableList.d.ts +11 -0
  217. package/dist/tui/components/ScrollableList.d.ts.map +1 -0
  218. package/dist/tui/components/ScrollableList.js +14 -0
  219. package/dist/tui/components/ScrollableList.js.map +1 -0
  220. package/dist/tui/components/Section.d.ts +9 -0
  221. package/dist/tui/components/Section.d.ts.map +1 -0
  222. package/dist/tui/components/Section.js +7 -0
  223. package/dist/tui/components/Section.js.map +1 -0
  224. package/dist/tui/components/SectionHeader.d.ts +8 -0
  225. package/dist/tui/components/SectionHeader.d.ts.map +1 -0
  226. package/dist/tui/components/SectionHeader.js +15 -0
  227. package/dist/tui/components/SectionHeader.js.map +1 -0
  228. package/dist/tui/components/SeverityBadge.d.ts +5 -0
  229. package/dist/tui/components/SeverityBadge.d.ts.map +1 -0
  230. package/dist/tui/components/SeverityBadge.js +7 -0
  231. package/dist/tui/components/SeverityBadge.js.map +1 -0
  232. package/dist/tui/components/Sidebar.d.ts +2 -0
  233. package/dist/tui/components/Sidebar.d.ts.map +1 -0
  234. package/dist/tui/components/Sidebar.js +40 -0
  235. package/dist/tui/components/Sidebar.js.map +1 -0
  236. package/dist/tui/components/StatusIndicator.d.ts +8 -0
  237. package/dist/tui/components/StatusIndicator.d.ts.map +1 -0
  238. package/dist/tui/components/StatusIndicator.js +15 -0
  239. package/dist/tui/components/StatusIndicator.js.map +1 -0
  240. package/dist/tui/components/Table.d.ts +21 -0
  241. package/dist/tui/components/Table.d.ts.map +1 -0
  242. package/dist/tui/components/Table.js +38 -0
  243. package/dist/tui/components/Table.js.map +1 -0
  244. package/dist/tui/components/Transition.d.ts +8 -0
  245. package/dist/tui/components/Transition.d.ts.map +1 -0
  246. package/dist/tui/components/Transition.js +38 -0
  247. package/dist/tui/components/Transition.js.map +1 -0
  248. package/dist/tui/components/WelcomeScreen.d.ts +6 -0
  249. package/dist/tui/components/WelcomeScreen.d.ts.map +1 -0
  250. package/dist/tui/components/WelcomeScreen.js +14 -0
  251. package/dist/tui/components/WelcomeScreen.js.map +1 -0
  252. package/dist/tui/educational.d.ts +32 -0
  253. package/dist/tui/educational.d.ts.map +1 -0
  254. package/dist/tui/educational.js +117 -0
  255. package/dist/tui/educational.js.map +1 -0
  256. package/dist/tui/hooks/useAudit.d.ts +24 -0
  257. package/dist/tui/hooks/useAudit.d.ts.map +1 -0
  258. package/dist/tui/hooks/useAudit.js +263 -0
  259. package/dist/tui/hooks/useAudit.js.map +1 -0
  260. package/dist/tui/hooks/useConfig.d.ts +18 -0
  261. package/dist/tui/hooks/useConfig.d.ts.map +1 -0
  262. package/dist/tui/hooks/useConfig.js +85 -0
  263. package/dist/tui/hooks/useConfig.js.map +1 -0
  264. package/dist/tui/hooks/useHookStatus.d.ts +10 -0
  265. package/dist/tui/hooks/useHookStatus.d.ts.map +1 -0
  266. package/dist/tui/hooks/useHookStatus.js +59 -0
  267. package/dist/tui/hooks/useHookStatus.js.map +1 -0
  268. package/dist/tui/hooks/useLogs.d.ts +42 -0
  269. package/dist/tui/hooks/useLogs.d.ts.map +1 -0
  270. package/dist/tui/hooks/useLogs.js +105 -0
  271. package/dist/tui/hooks/useLogs.js.map +1 -0
  272. package/dist/tui/hooks/useScan.d.ts +39 -0
  273. package/dist/tui/hooks/useScan.d.ts.map +1 -0
  274. package/dist/tui/hooks/useScan.js +255 -0
  275. package/dist/tui/hooks/useScan.js.map +1 -0
  276. package/dist/tui/hooks/useTerminalSize.d.ts +10 -0
  277. package/dist/tui/hooks/useTerminalSize.d.ts.map +1 -0
  278. package/dist/tui/hooks/useTerminalSize.js +27 -0
  279. package/dist/tui/hooks/useTerminalSize.js.map +1 -0
  280. package/dist/tui/index.d.ts +2 -0
  281. package/dist/tui/index.d.ts.map +1 -0
  282. package/dist/tui/index.js +8 -0
  283. package/dist/tui/index.js.map +1 -0
  284. package/dist/tui/screens/AuditPanel.d.ts +7 -0
  285. package/dist/tui/screens/AuditPanel.d.ts.map +1 -0
  286. package/dist/tui/screens/AuditPanel.js +467 -0
  287. package/dist/tui/screens/AuditPanel.js.map +1 -0
  288. package/dist/tui/screens/LogsPanel.d.ts +2 -0
  289. package/dist/tui/screens/LogsPanel.d.ts.map +1 -0
  290. package/dist/tui/screens/LogsPanel.js +127 -0
  291. package/dist/tui/screens/LogsPanel.js.map +1 -0
  292. package/dist/tui/screens/OverviewPanel.d.ts +2 -0
  293. package/dist/tui/screens/OverviewPanel.d.ts.map +1 -0
  294. package/dist/tui/screens/OverviewPanel.js +84 -0
  295. package/dist/tui/screens/OverviewPanel.js.map +1 -0
  296. package/dist/tui/screens/ScanPanel.d.ts +2 -0
  297. package/dist/tui/screens/ScanPanel.d.ts.map +1 -0
  298. package/dist/tui/screens/ScanPanel.js +188 -0
  299. package/dist/tui/screens/ScanPanel.js.map +1 -0
  300. package/dist/tui/screens/ScanResultsPanel.d.ts +2 -0
  301. package/dist/tui/screens/ScanResultsPanel.d.ts.map +1 -0
  302. package/dist/tui/screens/ScanResultsPanel.js +394 -0
  303. package/dist/tui/screens/ScanResultsPanel.js.map +1 -0
  304. package/dist/tui/screens/SettingsPanel.d.ts +2 -0
  305. package/dist/tui/screens/SettingsPanel.d.ts.map +1 -0
  306. package/dist/tui/screens/SettingsPanel.js +353 -0
  307. package/dist/tui/screens/SettingsPanel.js.map +1 -0
  308. package/dist/tui/state.d.ts +35 -0
  309. package/dist/tui/state.d.ts.map +1 -0
  310. package/dist/tui/state.js +13 -0
  311. package/dist/tui/state.js.map +1 -0
  312. package/dist/tui/theme.d.ts +58 -0
  313. package/dist/tui/theme.d.ts.map +1 -0
  314. package/dist/tui/theme.js +80 -0
  315. package/dist/tui/theme.js.map +1 -0
  316. package/dist/version.d.ts +2 -0
  317. package/dist/version.d.ts.map +1 -0
  318. package/dist/version.js +5 -0
  319. package/dist/version.js.map +1 -0
  320. package/hooks/audit-logger.sh +74 -0
  321. package/hooks/detection-lib.sh +301 -0
  322. package/hooks/git-pre-commit.sh +195 -0
  323. package/hooks/git-pre-push.sh +125 -0
  324. package/hooks/git-safety.sh +152 -0
  325. package/hooks/security-scanner.sh +527 -0
  326. package/install.sh +543 -0
  327. package/package.json +67 -0
  328. package/patterns/credentials.yaml +317 -0
  329. package/patterns/dangerous-commands.yaml +167 -0
  330. package/patterns/pii.yaml +95 -0
  331. package/patterns/prompt-injection.yaml +131 -0
  332. package/patterns/supply-chain.yaml +119 -0
  333. package/rules/AGENTS.md +60 -0
  334. package/rules/SECURITY-RULES.md +177 -0
  335. package/rules/claude.md +9 -0
  336. package/rules/clinerules +29 -0
  337. package/rules/continuerules +29 -0
  338. package/rules/copilot-instructions.md +9 -0
  339. package/rules/cursor-security.mdc +14 -0
  340. package/rules/gemini.md +9 -0
  341. package/rules/kiro-security.md +29 -0
  342. package/rules/roocode-security.md +29 -0
  343. package/rules/trae-security.md +29 -0
  344. package/rules/windsurfrules +9 -0
  345. package/skill/llm-antivirus/SKILL.md +73 -0
  346. package/skill/llm-antivirus/references/threat-patterns.yaml +82 -0
  347. package/skill/llm-antivirus/scripts/security-audit.sh +244 -0
  348. package/uninstall.sh +215 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 consulalialpric
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,278 @@
1
+ <div align="center">
2
+
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset=".github/images/logo-dark.svg">
5
+ <source media="(prefers-color-scheme: light)" srcset=".github/images/logo-light.svg">
6
+ <img alt="ChainWall" src=".github/images/logo-light.svg" width="480">
7
+ </picture>
8
+
9
+ <br><br>
10
+
11
+ [![CI](https://github.com/consulalialpric/chainwall/actions/workflows/tests.yml/badge.svg)](https://github.com/consulalialpric/chainwall/actions/workflows/tests.yml)
12
+ [![npm version](https://img.shields.io/npm/v/chainwall.svg)](https://www.npmjs.com/package/chainwall)
13
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
14
+ [![Tests](https://img.shields.io/badge/tests-520_passing-brightgreen?logo=vitest&logoColor=white)](#testing)
15
+
16
+ **Antivirus for AI coding agents.**
17
+
18
+ Scans your machine, maps which AI tools can reach your secrets, and blocks threats before they happen.
19
+
20
+ </div>
21
+
22
+ ---
23
+
24
+ ## The Problem
25
+
26
+ AI coding agents have broad filesystem access. They can read your AWS credentials, SSH keys, `.env` files, crypto wallets, and browser cookies — most users have no idea how exposed they are.
27
+
28
+ A single prompt injection, a hallucinated shell command, or a compromised MCP server turns that access into a breach. The agent doesn't need to be malicious — it just needs to be tricked.
29
+
30
+ ChainWall closes the gap. Scan, audit, protect — in under a minute.
31
+
32
+ ## Quick Start
33
+
34
+ ```bash
35
+ npm install -g chainwall
36
+
37
+ chainwall scan # find secrets, keys, and PII on your machine
38
+ chainwall audit # map which AI tools can reach those secrets
39
+ chainwall init # install real-time protection hooks
40
+ chainwall # launch interactive dashboard
41
+ ```
42
+
43
+ <details>
44
+ <summary><b>Install from source (or hooks-only without Node.js)</b></summary>
45
+ <br>
46
+
47
+ **Full CLI:**
48
+ ```bash
49
+ git clone https://github.com/consulalialpric/chainwall.git
50
+ cd chainwall && npm install && npm run build && npm link
51
+ ```
52
+
53
+ **Hooks only (bash 3.2 + jq, no Node.js):**
54
+ ```bash
55
+ git clone https://github.com/consulalialpric/chainwall.git ~/tools/chainwall
56
+ cd your-project && ~/tools/chainwall/install.sh
57
+ ```
58
+
59
+ Pure bash, executes in under 50ms, zero network calls.
60
+
61
+ </details>
62
+
63
+ ## Demo
64
+
65
+ <p align="center">
66
+ <a href="https://asciinema.org/a/DASHBOARD_ID">
67
+ <img src="https://asciinema.org/a/DASHBOARD_ID.svg" width="600" alt="ChainWall Dashboard"/>
68
+ </a>
69
+ </p>
70
+
71
+ > See also: [scan demo](https://asciinema.org/a/SCAN_ID) · [audit demo](https://asciinema.org/a/AUDIT_ID)
72
+
73
+ ## What It Does
74
+
75
+ 1. **Scan** — finds secrets, credentials, crypto keys, and PII across your filesystem using 156 regex patterns with entropy validation
76
+ 2. **Audit** — detects 18 AI tools on your machine and cross-references their access levels against discovered secrets to build an exposure map
77
+ 3. **Protect** — real-time bash hooks intercept dangerous operations before they execute (pre-commit, pre-push, PreToolUse/PostToolUse)
78
+
79
+ Both layers are fully independent. Bash hooks work without Node.js. The TypeScript CLI works without hooks.
80
+
81
+ ## What It Catches
82
+
83
+ 156 patterns across 8 categories, with entropy validation to reduce false positives.
84
+
85
+ | Category | Patterns | Examples |
86
+ |:---------|:--------:|:---------|
87
+ | **Credentials** | 55 | AWS, GitHub, Stripe, OpenAI, Slack, GCP, Azure, Anthropic, Twilio + 20 more |
88
+ | **Private Keys** | 5 | RSA, DSA, EC, OpenSSH, PGP private key headers |
89
+ | **Crypto / Web3** | 26 | BIP39 seeds, ETH/SOL/BTC private keys, exchange APIs, wallet files |
90
+ | **Dangerous Commands** | 26 | `rm -rf`, `curl\|bash`, `chmod 777`, reverse shells, Docker escapes |
91
+ | **PII** | 15 | SSN (with AAA validation), credit cards (Luhn), medical records, IBAN, passports |
92
+ | **Supply Chain** | 16 | Dependency confusion, lifecycle exploits, lock file deletion |
93
+ | **Prompt Injection** | 18 | Instruction override, role confusion, jailbreaks, base64 obfuscation |
94
+ | **Permissions** | 11 | File permission audit: SSH keys, AWS creds, GPG keyrings |
95
+
96
+ > 156 compiled rules + 10 contextual injection patterns + 3 shell history patterns loaded separately.
97
+
98
+ <details>
99
+ <summary><b>More detection capabilities</b></summary>
100
+ <br>
101
+
102
+ - **Environment variable audit** — scans process.env for 33 sensitive key patterns
103
+ - **Prompt injection scanning** — 27 patterns across 19 instruction file types (`.cursorrules`, `CLAUDE.md`, `.windsurfrules`, etc.)
104
+ - **Entropy-based validation** — Shannon entropy filtering on tokens
105
+ - **Base64 obfuscation detection** — catches `base64 -d | bash` and encoded payloads
106
+ - **Docker escape detection** — socket mounts, `--privileged`, host PID/network, `CAP_SYS_ADMIN`
107
+ - **SARIF 2.1.0 export** — `chainwall scan --format sarif` for CI/CD integration
108
+ - **Real-time watch mode** — `chainwall watch` with debounce and content-hash caching
109
+
110
+ </details>
111
+
112
+ ## Supported Tools
113
+
114
+ ChainWall detects and audits 18 AI coding tools, grouped by filesystem access level.
115
+
116
+ | Access Level | Tools |
117
+ |:-------------|:------|
118
+ | **Full** (any file on disk) | Claude Code, Codex CLI, Aider, Trae IDE, Bolt |
119
+ | **Workspace** (project files) | Cursor, Windsurf, Continue.dev, Gemini Code Assist, Cline, RooCode, Amazon Q, JetBrains AI, Augment, BLACKBOXAI, Qodo Gen, Kiro |
120
+ | **Limited** (open files only) | GitHub Copilot |
121
+
122
+ The auditor cross-references each tool's access level against your secrets to show exactly which tools can reach which sensitive files.
123
+
124
+ Instruction files are deployed to 11 tools via `chainwall init`.
125
+
126
+ ## Interactive TUI
127
+
128
+ Launch with `chainwall` (no arguments) for a keyboard-driven dashboard.
129
+
130
+ - **Overview** — protection status, recent activity, system summary
131
+ - **Scan** — mode selection, grouped results, severity/category filtering, search
132
+ - **Audit** — 7-section accordion (summary, tools, exposure, MCP, CLIs, VS Code, env), remediation actions
133
+ - **Settings** — allowlist/blocklist/skipDirs, toggle protection, global/project scope
134
+ - **Logs** — audit trail with severity filtering and real-time reload
135
+
136
+ Keyboard: `1`-`5` switch panels, `p` toggles protection, `?` for help, `q` to quit.
137
+
138
+ ## Commands
139
+
140
+ | Command | Description |
141
+ |:--------|:-----------|
142
+ | `chainwall` | Launch interactive TUI |
143
+ | `chainwall scan [dir]` | Scan for secrets, keys, and PII |
144
+ | `chainwall scan --system` | System credential locations only |
145
+ | `chainwall audit [dir]` | Map AI tool access + cross-reference exposure |
146
+ | `chainwall watch [dir]` | Real-time file monitoring |
147
+ | `chainwall init [dir]` | Install hooks for detected AI tools |
148
+ | `chainwall enable` / `disable` | Toggle real-time protection |
149
+ | `chainwall status` | Show protection status |
150
+ | `chainwall allow <path>` | Add path to allowlist |
151
+ | `chainwall allow --rule <id>` | Disable a detection rule |
152
+ | `chainwall mcp` | Start MCP security server (stdio transport) |
153
+
154
+ <details>
155
+ <summary><b>Flags</b></summary>
156
+ <br>
157
+
158
+ | Flag | Applies to | Description |
159
+ |:-----|:-----------|:-----------|
160
+ | `--format sarif\|json\|text` | scan | Output format (default: text) |
161
+ | `--json` | audit | Output as JSON |
162
+ | `--crypto-only` | scan | Only run crypto/web3 rules |
163
+ | `--include-tests` | scan | Include test directories (normally skipped) |
164
+ | `--verbose` | scan | Show match details |
165
+ | `--grouped` | scan | Group findings by category |
166
+ | `--remediate` | audit | Interactive remediation prompts |
167
+ | `--deep` | audit | Full recursive home directory walk |
168
+
169
+ </details>
170
+
171
+ ## Configuration
172
+
173
+ ```
174
+ ~/.llm-av/config.json global (all projects)
175
+ .llm-av/config.json project (this repo only)
176
+ ```
177
+
178
+ ```jsonc
179
+ {
180
+ "enabled": true,
181
+ "allowlist": {
182
+ "paths": ["test-fixtures/", "vendor/"],
183
+ "patterns": ["EXAMPLE_KEY"],
184
+ "rules": ["generic-api-key-assignment"]
185
+ },
186
+ "blocklist": {
187
+ "paths": [".env.production"],
188
+ "patterns": ["MY_SECRET_PREFIX"]
189
+ },
190
+ "skipDirs": ["test-integration", "__vitest__"]
191
+ }
192
+ ```
193
+
194
+ Blocklist always wins. `LLMAV_SKIP=1` bypasses all checks for one invocation (always logged).
195
+
196
+ ## How It's Different
197
+
198
+ | Feature | ChainWall | git-secrets | truffleHog | gitleaks |
199
+ |:--------|:---------:|:-----------:|:----------:|:--------:|
200
+ | Real-time hook blocking | Yes | No | No | No |
201
+ | Pre-commit scanning | Yes | Yes | Yes | Yes |
202
+ | AI tool access auditing | Yes | No | No | No |
203
+ | MCP server detection | Yes | No | No | No |
204
+ | Instruction file deployment | 11 tools | No | No | No |
205
+ | Entropy validation | Yes | No | Yes | Yes |
206
+ | PII detection | Yes | No | No | No |
207
+ | Crypto/Web3 patterns | 26 | No | Limited | Limited |
208
+ | SARIF export | Yes | No | Yes | Yes |
209
+ | Interactive TUI | Yes | No | No | No |
210
+ | Zero-dependency hooks | bash + jq | bash + git | Go binary | Go binary |
211
+
212
+ **git-secrets** catches secrets at commit time but has no awareness of AI tools, MCP servers, or real-time interception. **truffleHog** and **gitleaks** are excellent for scanning repos and CI pipelines but don't operate in real-time, don't audit which AI tools can reach your secrets, and don't deploy protective instruction files.
213
+
214
+ ChainWall is designed specifically for the AI coding agent threat model — where the risk isn't just committing a secret, but an agent reading, exfiltrating, or acting on it.
215
+
216
+ ## MCP Server
217
+
218
+ ChainWall includes an MCP server that AI agents can call for security checks:
219
+
220
+ | Tool | Description |
221
+ |:-----|:-----------|
222
+ | `scan_file` | Scan a file for secrets (restricted to cwd) |
223
+ | `scan_content` | Scan arbitrary text for secrets |
224
+ | `check_command` | Check if a shell command is dangerous |
225
+ | `audit_status` | Get current protection status |
226
+
227
+ Start with `chainwall mcp` or configure in Claude Desktop / Cursor settings via `chainwall init`.
228
+
229
+ This is separate from the **MCP detector** — which audits MCP servers already configured on your system, analyzes their source code for risky capabilities (filesystem, exec, network), and computes risk scores.
230
+
231
+ <details>
232
+ <summary><b>Architecture</b></summary>
233
+ <br>
234
+
235
+ ```
236
+ hooks/ Bash hooks (PreToolUse/PostToolUse, git pre-commit/pre-push)
237
+ patterns/ YAML pattern databases (5 files)
238
+ rules/ Instruction files for 11 AI tools
239
+ src/
240
+ commands/ scan, audit, init, watch, allow handlers
241
+ rules/ 156 patterns as pre-compiled RegExp
242
+ scanner/ Async filesystem walker + rule engine
243
+ auditor/ 18-tool detector + MCP/CLI/VS Code scanner
244
+ reporter/ Terminal, JSON, SARIF, audit reports
245
+ tui/ Interactive TUI (Ink + React)
246
+ mcp-server/ 4-tool MCP server (stdio transport)
247
+ test/ Vitest tests (20 files)
248
+ tests/ Bash test suite (11 suites)
249
+ install.sh Universal installer
250
+ ```
251
+
252
+ The two layers (bash hooks + TypeScript CLI) are fully independent. Bash hooks need only bash 3.2 + jq. The CLI needs Node.js 18.17+. Use either or both.
253
+
254
+ </details>
255
+
256
+ ## Testing
257
+
258
+ ```bash
259
+ ./tests/run-all.sh # 223 bash hook tests (11 suites)
260
+ npm test # 297 vitest tests (20 test files)
261
+ ```
262
+
263
+ **520 tests total**, all passing.
264
+
265
+ ## Requirements
266
+
267
+ | Component | Requires |
268
+ |:----------|:---------|
269
+ | Bash hooks | bash 3.2+, jq |
270
+ | ChainWall CLI | Node.js 18.17+ |
271
+
272
+ ## Contributing
273
+
274
+ See [CONTRIBUTING.md](docs/CONTRIBUTING.md).
275
+
276
+ ## License
277
+
278
+ MIT
@@ -0,0 +1,35 @@
1
+ # /security-scan
2
+
3
+ Run a comprehensive security audit of the project.
4
+
5
+ ## Instructions
6
+
7
+ Execute the security audit script and report findings:
8
+
9
+ ```bash
10
+ ./skill/llm-antivirus/scripts/security-audit.sh
11
+ ```
12
+
13
+ After the scan completes:
14
+
15
+ 1. **If findings are detected** (exit code 1):
16
+ - List each finding grouped by severity (Critical, High, Medium, Low)
17
+ - For each Critical/High finding, explain the risk and suggest remediation
18
+ - Check if any findings are false positives based on file context
19
+
20
+ 2. **If no findings** (exit code 0):
21
+ - Confirm the project is clean
22
+ - Mention which categories were scanned
23
+
24
+ 3. **Always include**:
25
+ - Total finding count by severity
26
+ - Reminder to check `.llm-av/config.json` for allowlist if false positives exist
27
+
28
+ ## Arguments
29
+
30
+ - No arguments: scans entire project
31
+ - Path argument: scans specific directory or file
32
+ ```
33
+ /security-scan src/
34
+ /security-scan config/database.yml
35
+ ```
@@ -0,0 +1,3 @@
1
+ import type { AITool } from './types.js';
2
+ export declare function canToolAccessPath(tool: AITool, filePath: string, workspaceRoot: string): boolean;
3
+ //# sourceMappingURL=access-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-mapper.d.ts","sourceRoot":"","sources":["../../src/auditor/access-mapper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAYhG"}
@@ -0,0 +1,15 @@
1
+ import { resolve, sep } from 'node:path';
2
+ export function canToolAccessPath(tool, filePath, workspaceRoot) {
3
+ switch (tool.accessLevel) {
4
+ case 'full':
5
+ return true;
6
+ case 'workspace': {
7
+ const wsRoot = resolve(workspaceRoot);
8
+ const resolved = resolve(filePath);
9
+ return resolved === wsRoot || resolved.startsWith(wsRoot + sep);
10
+ }
11
+ case 'limited':
12
+ return false;
13
+ }
14
+ }
15
+ //# sourceMappingURL=access-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-mapper.js","sourceRoot":"","sources":["../../src/auditor/access-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,QAAgB,EAAE,aAAqB;IACrF,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface DetectedCLI {
2
+ name: string;
3
+ path: string;
4
+ source: 'which' | 'npm-global';
5
+ }
6
+ export declare function detectAICLIs(): DetectedCLI[];
7
+ //# sourceMappingURL=cli-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-detector.d.ts","sourceRoot":"","sources":["../../src/auditor/cli-detector.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,YAAY,CAAC;CAChC;AA+CD,wBAAgB,YAAY,IAAI,WAAW,EAAE,CAoB5C"}
@@ -0,0 +1,63 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ const KNOWN_AI_CLIS = ['aider', 'codex', 'cursor', 'continue', 'cline', 'claude', 'amazon-q', 'augment', 'bolt'];
3
+ // Normalize npm package names to their CLI/canonical names for dedup
4
+ const NAME_MAP = {
5
+ 'aider-chat': 'aider',
6
+ '@anthropic-ai/claude-code': 'claude',
7
+ '@openai/codex': 'codex',
8
+ };
9
+ function tryWhich(name) {
10
+ try {
11
+ const result = execFileSync('which', [name], { timeout: 5000, encoding: 'utf-8' }).trim();
12
+ return result || null;
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ const KNOWN_NPM_AI_PACKAGES = [
19
+ '@anthropic-ai/claude-code',
20
+ '@openai/codex',
21
+ 'aider-chat',
22
+ 'cline',
23
+ 'augment',
24
+ 'bolt',
25
+ ];
26
+ function tryNpmGlobal() {
27
+ const clis = [];
28
+ try {
29
+ const raw = execFileSync('npm', ['list', '-g', '--depth=0', '--json'], { timeout: 5000, encoding: 'utf-8' });
30
+ const parsed = JSON.parse(raw);
31
+ if (!parsed.dependencies)
32
+ return clis;
33
+ for (const pkg of KNOWN_NPM_AI_PACKAGES) {
34
+ if (pkg in parsed.dependencies) {
35
+ clis.push({ name: pkg, path: 'npm-global', source: 'npm-global' });
36
+ }
37
+ }
38
+ }
39
+ catch {
40
+ // npm not available or timeout
41
+ }
42
+ return clis;
43
+ }
44
+ export function detectAICLIs() {
45
+ const clis = [];
46
+ for (const name of KNOWN_AI_CLIS) {
47
+ const path = tryWhich(name);
48
+ if (path) {
49
+ clis.push({ name, path, source: 'which' });
50
+ }
51
+ }
52
+ clis.push(...tryNpmGlobal());
53
+ // Deduplicate by canonical name (normalizes npm packages to CLI names)
54
+ const seen = new Set();
55
+ return clis.filter((cli) => {
56
+ const canonical = NAME_MAP[cli.name] ?? cli.name;
57
+ if (seen.has(canonical))
58
+ return false;
59
+ seen.add(canonical);
60
+ return true;
61
+ });
62
+ }
63
+ //# sourceMappingURL=cli-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-detector.js","sourceRoot":"","sources":["../../src/auditor/cli-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAEjH,qEAAqE;AACrE,MAAM,QAAQ,GAA2B;IACvC,YAAY,EAAE,OAAO;IACrB,2BAA2B,EAAE,QAAQ;IACrC,eAAe,EAAE,OAAO;CACzB,CAAC;AAEF,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1F,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,qBAAqB,GAAG;IAC5B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,OAAO;IACP,SAAS;IACT,MAAM;CACP,CAAC;AAEF,SAAS,YAAY;IACnB,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7G,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+C,CAAC;QAC7E,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAEtC,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;YACxC,IAAI,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,IAAI,GAAkB,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,CAAC;IAE7B,uEAAuE;IACvE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACzB,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ScanFinding } from '../rules/types.js';
2
+ import type { AITool, ToolExposure } from './types.js';
3
+ export declare function crossReference(tools: AITool[], findings: ScanFinding[], workspaceRoot: string): ToolExposure[];
4
+ //# sourceMappingURL=cross-reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-reference.d.ts","sourceRoot":"","sources":["../../src/auditor/cross-reference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAY,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKvD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,WAAW,EAAE,EACvB,aAAa,EAAE,MAAM,GACpB,YAAY,EAAE,CAehB"}
@@ -0,0 +1,16 @@
1
+ import { canToolAccessPath } from './access-mapper.js';
2
+ const ACCESS_ORDER = { full: 0, workspace: 1, limited: 2 };
3
+ export function crossReference(tools, findings, workspaceRoot) {
4
+ const exposures = [];
5
+ for (const tool of tools) {
6
+ const exposed = findings.filter((f) => canToolAccessPath(tool, f.filePath, workspaceRoot));
7
+ const counts = { critical: 0, high: 0, medium: 0, low: 0 };
8
+ for (const f of exposed) {
9
+ counts[f.severity]++;
10
+ }
11
+ exposures.push({ tool, exposedFindings: exposed, counts });
12
+ }
13
+ exposures.sort((a, b) => ACCESS_ORDER[a.tool.accessLevel] - ACCESS_ORDER[b.tool.accessLevel]);
14
+ return exposures;
15
+ }
16
+ //# sourceMappingURL=cross-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-reference.js","sourceRoot":"","sources":["../../src/auditor/cross-reference.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAW,CAAC;AAEpE,MAAM,UAAU,cAAc,CAC5B,KAAe,EACf,QAAuB,EACvB,aAAqB;IAErB,MAAM,SAAS,GAAmB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QAC3F,MAAM,MAAM,GAA6B,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACrF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAE9F,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Severity } from '../rules/types.js';
2
+ export interface EnvExposure {
3
+ key: string;
4
+ severity: Severity;
5
+ reason: string;
6
+ valueHint: string;
7
+ }
8
+ export declare function auditEnvironment(env?: Record<string, string | undefined>): EnvExposure[];
9
+ //# sourceMappingURL=env-auditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-auditor.d.ts","sourceRoot":"","sources":["../../src/auditor/env-auditor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AA8CD,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,WAAW,EAAE,CA6CrG"}
@@ -0,0 +1,83 @@
1
+ // Sensitive key patterns — ordered by severity
2
+ const SENSITIVE_KEY_PATTERNS = [
3
+ // Critical: known secret env vars
4
+ { regex: /^(AWS_SECRET_ACCESS_KEY|AWS_SESSION_TOKEN)$/i, severity: 'critical', reason: 'AWS credential' },
5
+ { regex: /^(OPENAI_API_KEY|ANTHROPIC_API_KEY|GOOGLE_API_KEY)$/i, severity: 'critical', reason: 'AI provider API key' },
6
+ { regex: /^(GITHUB_TOKEN|GH_TOKEN|GITLAB_TOKEN)$/i, severity: 'critical', reason: 'Git provider token' },
7
+ { regex: /^(STRIPE_SECRET_KEY|STRIPE_API_KEY)$/i, severity: 'critical', reason: 'Payment provider key' },
8
+ { regex: /^(DATABASE_URL|MONGODB_URI|REDIS_URL)$/i, severity: 'critical', reason: 'Database connection string' },
9
+ { regex: /^(SLACK_TOKEN|SLACK_BOT_TOKEN|SLACK_WEBHOOK_URL)$/i, severity: 'high', reason: 'Slack credential' },
10
+ { regex: /^(SENDGRID_API_KEY|MAILGUN_API_KEY)$/i, severity: 'high', reason: 'Email service key' },
11
+ { regex: /^(TWILIO_AUTH_TOKEN|TWILIO_API_KEY)$/i, severity: 'high', reason: 'Twilio credential' },
12
+ { regex: /^(NPM_TOKEN|NPM_AUTH_TOKEN)$/i, severity: 'high', reason: 'Package registry token' },
13
+ { regex: /^(DOCKER_PASSWORD|DOCKER_AUTH)$/i, severity: 'high', reason: 'Docker credential' },
14
+ { regex: /^(SUPABASE_SERVICE_ROLE_KEY|FIREBASE_TOKEN)$/i, severity: 'high', reason: 'Cloud service key' },
15
+ { regex: /^(VERCEL_TOKEN|NETLIFY_AUTH_TOKEN|HEROKU_API_KEY)$/i, severity: 'high', reason: 'Platform token' },
16
+ // High: generic patterns for secrets
17
+ { regex: /_SECRET$/i, severity: 'high', reason: 'Variable name ends with _SECRET' },
18
+ { regex: /_API_KEY$/i, severity: 'high', reason: 'Variable name ends with _API_KEY' },
19
+ { regex: /_TOKEN$/i, severity: 'medium', reason: 'Variable name ends with _TOKEN' },
20
+ { regex: /_PASSWORD$/i, severity: 'high', reason: 'Variable name contains password' },
21
+ { regex: /^(SECRET|TOKEN|PASSWORD|PRIVATE_KEY)$/i, severity: 'high', reason: 'Generic secret variable name' },
22
+ { regex: /_PRIVATE_KEY$/i, severity: 'critical', reason: 'Private key in environment' },
23
+ // Medium: access key IDs (not secret but sensitive)
24
+ { regex: /^AWS_ACCESS_KEY_ID$/i, severity: 'medium', reason: 'AWS access key ID (not secret but sensitive)' },
25
+ { regex: /_CLIENT_SECRET$/i, severity: 'high', reason: 'OAuth client secret' },
26
+ ];
27
+ // Value patterns that indicate real secrets (not placeholders)
28
+ const VALUE_PATTERNS = [
29
+ { regex: /^sk-[a-zA-Z0-9]{20,}/, severity: 'critical', reason: 'OpenAI/Stripe key pattern in value' },
30
+ { regex: /^sk-ant-[a-zA-Z0-9_-]{20,}/, severity: 'critical', reason: 'Anthropic key pattern in value' },
31
+ { regex: /^ghp_[a-zA-Z0-9]{20,}/, severity: 'critical', reason: 'GitHub PAT in value' },
32
+ { regex: /^xox[pboa]-/, severity: 'critical', reason: 'Slack token in value' },
33
+ { regex: /^AKIA[0-9A-Z]{16}/, severity: 'critical', reason: 'AWS access key in value' },
34
+ { regex: /^SG\.[a-zA-Z0-9_-]{22}\./, severity: 'critical', reason: 'SendGrid key in value' },
35
+ ];
36
+ function getValueHint(value) {
37
+ if (value.length <= 8)
38
+ return '[set]';
39
+ return value.substring(0, 4) + '...';
40
+ }
41
+ export function auditEnvironment(env = process.env) {
42
+ const exposures = [];
43
+ const seen = new Set();
44
+ for (const [key, value] of Object.entries(env)) {
45
+ if (!value || value.length === 0)
46
+ continue;
47
+ // Check key patterns
48
+ for (const pattern of SENSITIVE_KEY_PATTERNS) {
49
+ if (pattern.regex.test(key)) {
50
+ if (!seen.has(key)) {
51
+ seen.add(key);
52
+ exposures.push({
53
+ key,
54
+ severity: pattern.severity,
55
+ reason: pattern.reason,
56
+ valueHint: getValueHint(value),
57
+ });
58
+ }
59
+ break; // first match wins (highest priority)
60
+ }
61
+ }
62
+ // Check value patterns (only if key wasn't already matched)
63
+ if (!seen.has(key)) {
64
+ for (const pattern of VALUE_PATTERNS) {
65
+ if (pattern.regex.test(value)) {
66
+ seen.add(key);
67
+ exposures.push({
68
+ key,
69
+ severity: pattern.severity,
70
+ reason: pattern.reason,
71
+ valueHint: getValueHint(value),
72
+ });
73
+ break;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ // Sort by severity
79
+ const order = { critical: 0, high: 1, medium: 2, low: 3 };
80
+ exposures.sort((a, b) => order[a.severity] - order[b.severity]);
81
+ return exposures;
82
+ }
83
+ //# sourceMappingURL=env-auditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-auditor.js","sourceRoot":"","sources":["../../src/auditor/env-auditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MCPServer } from './mcp-detector.js';
2
+ export interface MCPAnalysis {
3
+ riskScore: number;
4
+ riskLabel: string;
5
+ toolNames: string[];
6
+ resourceNames: string[];
7
+ capabilities: string[];
8
+ analysisMethod: 'source' | 'args-only';
9
+ }
10
+ export declare function analyzeMCPServer(server: MCPServer, serverDef?: Record<string, unknown>): MCPAnalysis;
11
+ //# sourceMappingURL=mcp-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-analyzer.d.ts","sourceRoot":"","sources":["../../src/auditor/mcp-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,QAAQ,GAAG,WAAW,CAAC;CACxC;AAmGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CA2DpG"}