hackmyagent 0.7.2 → 0.8.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 (333) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +66 -28
  3. package/dist/arp/cli/index.d.ts +3 -0
  4. package/dist/arp/cli/index.d.ts.map +1 -0
  5. package/dist/arp/cli/index.js +219 -0
  6. package/dist/arp/cli/index.js.map +1 -0
  7. package/dist/arp/config/loader.d.ts +8 -0
  8. package/dist/arp/config/loader.d.ts.map +1 -0
  9. package/dist/arp/config/loader.js +102 -0
  10. package/dist/arp/config/loader.js.map +1 -0
  11. package/dist/arp/enforcement/kill-switch.d.ts +22 -0
  12. package/dist/arp/enforcement/kill-switch.d.ts.map +1 -0
  13. package/dist/arp/enforcement/kill-switch.js +122 -0
  14. package/dist/arp/enforcement/kill-switch.js.map +1 -0
  15. package/dist/arp/engine/event-engine.d.ts +29 -0
  16. package/dist/arp/engine/event-engine.d.ts.map +1 -0
  17. package/dist/arp/engine/event-engine.js +233 -0
  18. package/dist/arp/engine/event-engine.js.map +1 -0
  19. package/dist/arp/index.d.ts +81 -0
  20. package/dist/arp/index.d.ts.map +1 -0
  21. package/dist/arp/index.js +239 -0
  22. package/dist/arp/index.js.map +1 -0
  23. package/dist/arp/intelligence/adapters.d.ts +45 -0
  24. package/dist/arp/intelligence/adapters.d.ts.map +1 -0
  25. package/dist/arp/intelligence/adapters.js +222 -0
  26. package/dist/arp/intelligence/adapters.js.map +1 -0
  27. package/dist/arp/intelligence/anomaly.d.ts +32 -0
  28. package/dist/arp/intelligence/anomaly.d.ts.map +1 -0
  29. package/dist/arp/intelligence/anomaly.js +80 -0
  30. package/dist/arp/intelligence/anomaly.js.map +1 -0
  31. package/dist/arp/intelligence/budget.d.ts +33 -0
  32. package/dist/arp/intelligence/budget.d.ts.map +1 -0
  33. package/dist/arp/intelligence/budget.js +150 -0
  34. package/dist/arp/intelligence/budget.js.map +1 -0
  35. package/dist/arp/intelligence/coordinator.d.ts +43 -0
  36. package/dist/arp/intelligence/coordinator.d.ts.map +1 -0
  37. package/dist/arp/intelligence/coordinator.js +301 -0
  38. package/dist/arp/intelligence/coordinator.js.map +1 -0
  39. package/dist/arp/interceptors/a2a-protocol.d.ts +29 -0
  40. package/dist/arp/interceptors/a2a-protocol.d.ts.map +1 -0
  41. package/dist/arp/interceptors/a2a-protocol.js +111 -0
  42. package/dist/arp/interceptors/a2a-protocol.js.map +1 -0
  43. package/dist/arp/interceptors/filesystem.d.ts +33 -0
  44. package/dist/arp/interceptors/filesystem.d.ts.map +1 -0
  45. package/dist/arp/interceptors/filesystem.js +199 -0
  46. package/dist/arp/interceptors/filesystem.js.map +1 -0
  47. package/dist/arp/interceptors/mcp-protocol.d.ts +25 -0
  48. package/dist/arp/interceptors/mcp-protocol.d.ts.map +1 -0
  49. package/dist/arp/interceptors/mcp-protocol.js +126 -0
  50. package/dist/arp/interceptors/mcp-protocol.js.map +1 -0
  51. package/dist/arp/interceptors/network.d.ts +26 -0
  52. package/dist/arp/interceptors/network.d.ts.map +1 -0
  53. package/dist/arp/interceptors/network.js +146 -0
  54. package/dist/arp/interceptors/network.js.map +1 -0
  55. package/dist/arp/interceptors/process.d.ts +26 -0
  56. package/dist/arp/interceptors/process.d.ts.map +1 -0
  57. package/dist/arp/interceptors/process.js +157 -0
  58. package/dist/arp/interceptors/process.js.map +1 -0
  59. package/dist/arp/interceptors/prompt.d.ts +29 -0
  60. package/dist/arp/interceptors/prompt.d.ts.map +1 -0
  61. package/dist/arp/interceptors/prompt.js +82 -0
  62. package/dist/arp/interceptors/prompt.js.map +1 -0
  63. package/dist/arp/license/index.d.ts +59 -0
  64. package/dist/arp/license/index.d.ts.map +1 -0
  65. package/dist/arp/license/index.js +78 -0
  66. package/dist/arp/license/index.js.map +1 -0
  67. package/dist/arp/monitors/filesystem.d.ts +21 -0
  68. package/dist/arp/monitors/filesystem.d.ts.map +1 -0
  69. package/dist/arp/monitors/filesystem.js +141 -0
  70. package/dist/arp/monitors/filesystem.js.map +1 -0
  71. package/dist/arp/monitors/network.d.ts +32 -0
  72. package/dist/arp/monitors/network.d.ts.map +1 -0
  73. package/dist/arp/monitors/network.js +301 -0
  74. package/dist/arp/monitors/network.js.map +1 -0
  75. package/dist/arp/monitors/process.d.ts +24 -0
  76. package/dist/arp/monitors/process.d.ts.map +1 -0
  77. package/dist/arp/monitors/process.js +205 -0
  78. package/dist/arp/monitors/process.js.map +1 -0
  79. package/dist/arp/patterns/ai-threats.d.ts +48 -0
  80. package/dist/arp/patterns/ai-threats.d.ts.map +1 -0
  81. package/dist/arp/patterns/ai-threats.js +215 -0
  82. package/dist/arp/patterns/ai-threats.js.map +1 -0
  83. package/dist/arp/proxy/forward.d.ts +23 -0
  84. package/dist/arp/proxy/forward.d.ts.map +1 -0
  85. package/dist/arp/proxy/forward.js +152 -0
  86. package/dist/arp/proxy/forward.js.map +1 -0
  87. package/dist/arp/proxy/server.d.ts +45 -0
  88. package/dist/arp/proxy/server.d.ts.map +1 -0
  89. package/dist/arp/proxy/server.js +331 -0
  90. package/dist/arp/proxy/server.js.map +1 -0
  91. package/dist/arp/reporting/local-log.d.ts +22 -0
  92. package/dist/arp/reporting/local-log.d.ts.map +1 -0
  93. package/dist/arp/reporting/local-log.js +116 -0
  94. package/dist/arp/reporting/local-log.js.map +1 -0
  95. package/dist/arp/types.d.ts +230 -0
  96. package/dist/arp/types.d.ts.map +1 -0
  97. package/dist/arp/types.js +4 -0
  98. package/dist/arp/types.js.map +1 -0
  99. package/dist/attack/custom-payloads.d.ts +11 -0
  100. package/dist/attack/custom-payloads.d.ts.map +1 -0
  101. package/dist/attack/custom-payloads.js +108 -0
  102. package/dist/attack/custom-payloads.js.map +1 -0
  103. package/dist/attack/fail-policy.d.ts +16 -0
  104. package/dist/attack/fail-policy.d.ts.map +1 -0
  105. package/dist/attack/fail-policy.js +36 -0
  106. package/dist/attack/fail-policy.js.map +1 -0
  107. package/dist/attack/index.d.ts +12 -0
  108. package/dist/attack/index.d.ts.map +1 -0
  109. package/dist/attack/index.js +30 -0
  110. package/dist/attack/index.js.map +1 -0
  111. package/dist/attack/payloads/a2a-attacks.d.ts +12 -0
  112. package/dist/attack/payloads/a2a-attacks.d.ts.map +1 -0
  113. package/dist/attack/payloads/a2a-attacks.js +221 -0
  114. package/dist/attack/payloads/a2a-attacks.js.map +1 -0
  115. package/dist/attack/payloads/capability-abuse.d.ts +8 -0
  116. package/dist/attack/payloads/capability-abuse.d.ts.map +1 -0
  117. package/dist/attack/payloads/capability-abuse.js +222 -0
  118. package/dist/attack/payloads/capability-abuse.js.map +1 -0
  119. package/dist/attack/payloads/context-manipulation.d.ts +8 -0
  120. package/dist/attack/payloads/context-manipulation.d.ts.map +1 -0
  121. package/dist/attack/payloads/context-manipulation.js +217 -0
  122. package/dist/attack/payloads/context-manipulation.js.map +1 -0
  123. package/dist/attack/payloads/data-exfiltration.d.ts +8 -0
  124. package/dist/attack/payloads/data-exfiltration.d.ts.map +1 -0
  125. package/dist/attack/payloads/data-exfiltration.js +249 -0
  126. package/dist/attack/payloads/data-exfiltration.js.map +1 -0
  127. package/dist/attack/payloads/index.d.ts +29 -0
  128. package/dist/attack/payloads/index.d.ts.map +1 -0
  129. package/dist/attack/payloads/index.js +76 -0
  130. package/dist/attack/payloads/index.js.map +1 -0
  131. package/dist/attack/payloads/jailbreak.d.ts +8 -0
  132. package/dist/attack/payloads/jailbreak.d.ts.map +1 -0
  133. package/dist/attack/payloads/jailbreak.js +265 -0
  134. package/dist/attack/payloads/jailbreak.js.map +1 -0
  135. package/dist/attack/payloads/mcp-exploitation.d.ts +12 -0
  136. package/dist/attack/payloads/mcp-exploitation.d.ts.map +1 -0
  137. package/dist/attack/payloads/mcp-exploitation.js +221 -0
  138. package/dist/attack/payloads/mcp-exploitation.js.map +1 -0
  139. package/dist/attack/payloads/prompt-injection.d.ts +8 -0
  140. package/dist/attack/payloads/prompt-injection.d.ts.map +1 -0
  141. package/dist/attack/payloads/prompt-injection.js +262 -0
  142. package/dist/attack/payloads/prompt-injection.js.map +1 -0
  143. package/dist/attack/scanner.d.ts +84 -0
  144. package/dist/attack/scanner.d.ts.map +1 -0
  145. package/dist/attack/scanner.js +509 -0
  146. package/dist/attack/scanner.js.map +1 -0
  147. package/dist/attack/types.d.ts +153 -0
  148. package/dist/attack/types.d.ts.map +1 -0
  149. package/dist/attack/types.js +46 -0
  150. package/dist/attack/types.js.map +1 -0
  151. package/dist/benchmarks/index.d.ts +16 -0
  152. package/dist/benchmarks/index.d.ts.map +1 -0
  153. package/dist/benchmarks/index.js +27 -0
  154. package/dist/benchmarks/index.js.map +1 -0
  155. package/dist/benchmarks/oasb-1.d.ts +112 -0
  156. package/dist/benchmarks/oasb-1.d.ts.map +1 -0
  157. package/dist/benchmarks/oasb-1.js +1124 -0
  158. package/dist/benchmarks/oasb-1.js.map +1 -0
  159. package/dist/checker/check-skill.d.ts +48 -0
  160. package/dist/checker/check-skill.d.ts.map +1 -0
  161. package/dist/checker/check-skill.js +105 -0
  162. package/dist/checker/check-skill.js.map +1 -0
  163. package/dist/checker/index.d.ts +12 -0
  164. package/dist/checker/index.d.ts.map +1 -0
  165. package/dist/checker/index.js +16 -0
  166. package/dist/checker/index.js.map +1 -0
  167. package/dist/checker/permission-analyzer.d.ts +12 -0
  168. package/dist/checker/permission-analyzer.d.ts.map +1 -0
  169. package/dist/checker/permission-analyzer.js +84 -0
  170. package/dist/checker/permission-analyzer.js.map +1 -0
  171. package/dist/checker/publisher-verifier.d.ts +34 -0
  172. package/dist/checker/publisher-verifier.d.ts.map +1 -0
  173. package/dist/checker/publisher-verifier.js +121 -0
  174. package/dist/checker/publisher-verifier.js.map +1 -0
  175. package/dist/checker/skill-identifier.d.ts +14 -0
  176. package/dist/checker/skill-identifier.d.ts.map +1 -0
  177. package/dist/checker/skill-identifier.js +55 -0
  178. package/dist/checker/skill-identifier.js.map +1 -0
  179. package/dist/cli.d.ts +7 -0
  180. package/dist/cli.d.ts.map +1 -0
  181. package/dist/cli.js +3534 -0
  182. package/dist/cli.js.map +1 -0
  183. package/dist/hardening/index.d.ts +7 -0
  184. package/dist/hardening/index.d.ts.map +1 -0
  185. package/dist/hardening/index.js +9 -0
  186. package/dist/hardening/index.js.map +1 -0
  187. package/dist/hardening/scanner.d.ts +147 -0
  188. package/dist/hardening/scanner.d.ts.map +1 -0
  189. package/dist/hardening/scanner.js +5445 -0
  190. package/dist/hardening/scanner.js.map +1 -0
  191. package/dist/hardening/security-check.d.ts +85 -0
  192. package/dist/hardening/security-check.d.ts.map +1 -0
  193. package/dist/hardening/security-check.js +6 -0
  194. package/dist/hardening/security-check.js.map +1 -0
  195. package/dist/index.d.ts +38 -4
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +91 -3525
  198. package/dist/index.js.map +1 -1
  199. package/dist/mcp-server.js +10 -10
  200. package/dist/mcp-server.js.map +1 -1
  201. package/dist/oasb/config/dvaa-targets.d.ts +13 -0
  202. package/dist/oasb/config/dvaa-targets.d.ts.map +1 -0
  203. package/dist/oasb/config/dvaa-targets.js +89 -0
  204. package/dist/oasb/config/dvaa-targets.js.map +1 -0
  205. package/dist/oasb/harness/arp-wrapper.d.ts +29 -0
  206. package/dist/oasb/harness/arp-wrapper.d.ts.map +1 -0
  207. package/dist/oasb/harness/arp-wrapper.js +134 -0
  208. package/dist/oasb/harness/arp-wrapper.js.map +1 -0
  209. package/dist/oasb/harness/dvaa-client.d.ts +46 -0
  210. package/dist/oasb/harness/dvaa-client.d.ts.map +1 -0
  211. package/dist/oasb/harness/dvaa-client.js +98 -0
  212. package/dist/oasb/harness/dvaa-client.js.map +1 -0
  213. package/dist/oasb/harness/dvaa-manager.d.ts +17 -0
  214. package/dist/oasb/harness/dvaa-manager.d.ts.map +1 -0
  215. package/dist/oasb/harness/dvaa-manager.js +132 -0
  216. package/dist/oasb/harness/dvaa-manager.js.map +1 -0
  217. package/dist/oasb/harness/event-collector.d.ts +33 -0
  218. package/dist/oasb/harness/event-collector.d.ts.map +1 -0
  219. package/dist/oasb/harness/event-collector.js +86 -0
  220. package/dist/oasb/harness/event-collector.js.map +1 -0
  221. package/dist/oasb/harness/metrics.d.ts +14 -0
  222. package/dist/oasb/harness/metrics.d.ts.map +1 -0
  223. package/dist/oasb/harness/metrics.js +56 -0
  224. package/dist/oasb/harness/metrics.js.map +1 -0
  225. package/dist/oasb/harness/mock-llm-adapter.d.ts +34 -0
  226. package/dist/oasb/harness/mock-llm-adapter.d.ts.map +1 -0
  227. package/dist/oasb/harness/mock-llm-adapter.js +69 -0
  228. package/dist/oasb/harness/mock-llm-adapter.js.map +1 -0
  229. package/dist/oasb/harness/types.d.ts +74 -0
  230. package/dist/oasb/harness/types.d.ts.map +1 -0
  231. package/dist/oasb/harness/types.js +3 -0
  232. package/dist/oasb/harness/types.js.map +1 -0
  233. package/dist/plugins/core.d.ts +109 -0
  234. package/dist/plugins/core.d.ts.map +1 -0
  235. package/dist/plugins/core.js +30 -0
  236. package/dist/plugins/core.js.map +1 -0
  237. package/dist/plugins/credvault.d.ts +22 -0
  238. package/dist/plugins/credvault.d.ts.map +1 -0
  239. package/dist/plugins/credvault.js +374 -0
  240. package/dist/plugins/credvault.js.map +1 -0
  241. package/dist/plugins/signcrypt.d.ts +27 -0
  242. package/dist/plugins/signcrypt.d.ts.map +1 -0
  243. package/dist/plugins/signcrypt.js +317 -0
  244. package/dist/plugins/signcrypt.js.map +1 -0
  245. package/dist/plugins/skillguard.d.ts +25 -0
  246. package/dist/plugins/skillguard.d.ts.map +1 -0
  247. package/dist/plugins/skillguard.js +346 -0
  248. package/dist/plugins/skillguard.js.map +1 -0
  249. package/dist/registry/client.d.ts +125 -0
  250. package/dist/registry/client.d.ts.map +1 -0
  251. package/dist/registry/client.js +308 -0
  252. package/dist/registry/client.js.map +1 -0
  253. package/dist/registry/index.d.ts +3 -0
  254. package/dist/registry/index.d.ts.map +1 -0
  255. package/dist/registry/index.js +10 -0
  256. package/dist/registry/index.js.map +1 -0
  257. package/dist/scanner/external-scanner.d.ts +13 -0
  258. package/dist/scanner/external-scanner.d.ts.map +1 -0
  259. package/dist/scanner/external-scanner.js +299 -0
  260. package/dist/scanner/external-scanner.js.map +1 -0
  261. package/dist/scanner/index.d.ts +6 -0
  262. package/dist/scanner/index.d.ts.map +1 -0
  263. package/dist/scanner/index.js +9 -0
  264. package/dist/scanner/index.js.map +1 -0
  265. package/dist/scanner/types.d.ts +32 -0
  266. package/dist/scanner/types.d.ts.map +1 -0
  267. package/dist/scanner/types.js +6 -0
  268. package/dist/scanner/types.js.map +1 -0
  269. package/dist/semantic/deep-scan.d.ts +13 -0
  270. package/dist/semantic/deep-scan.d.ts.map +1 -0
  271. package/dist/semantic/deep-scan.js +63 -0
  272. package/dist/semantic/deep-scan.js.map +1 -0
  273. package/dist/semantic/index.d.ts +17 -0
  274. package/dist/semantic/index.d.ts.map +1 -0
  275. package/dist/semantic/index.js +39 -0
  276. package/dist/semantic/index.js.map +1 -0
  277. package/dist/semantic/integration/cost-estimator.d.ts +17 -0
  278. package/dist/semantic/integration/cost-estimator.d.ts.map +1 -0
  279. package/dist/semantic/integration/cost-estimator.js +54 -0
  280. package/dist/semantic/integration/cost-estimator.js.map +1 -0
  281. package/dist/semantic/integration/finding-adapter.d.ts +34 -0
  282. package/dist/semantic/integration/finding-adapter.d.ts.map +1 -0
  283. package/dist/semantic/integration/finding-adapter.js +41 -0
  284. package/dist/semantic/integration/finding-adapter.js.map +1 -0
  285. package/dist/semantic/integration/oasb-upgrader.d.ts +20 -0
  286. package/dist/semantic/integration/oasb-upgrader.d.ts.map +1 -0
  287. package/dist/semantic/integration/oasb-upgrader.js +47 -0
  288. package/dist/semantic/integration/oasb-upgrader.js.map +1 -0
  289. package/dist/semantic/llm/budget.d.ts +50 -0
  290. package/dist/semantic/llm/budget.d.ts.map +1 -0
  291. package/dist/semantic/llm/budget.js +139 -0
  292. package/dist/semantic/llm/budget.js.map +1 -0
  293. package/dist/semantic/llm/cache.d.ts +36 -0
  294. package/dist/semantic/llm/cache.d.ts.map +1 -0
  295. package/dist/semantic/llm/cache.js +103 -0
  296. package/dist/semantic/llm/cache.js.map +1 -0
  297. package/dist/semantic/llm/client.d.ts +49 -0
  298. package/dist/semantic/llm/client.d.ts.map +1 -0
  299. package/dist/semantic/llm/client.js +64 -0
  300. package/dist/semantic/llm/client.js.map +1 -0
  301. package/dist/semantic/llm/index.d.ts +33 -0
  302. package/dist/semantic/llm/index.d.ts.map +1 -0
  303. package/dist/semantic/llm/index.js +129 -0
  304. package/dist/semantic/llm/index.js.map +1 -0
  305. package/dist/semantic/llm/prompts.d.ts +30 -0
  306. package/dist/semantic/llm/prompts.d.ts.map +1 -0
  307. package/dist/semantic/llm/prompts.js +120 -0
  308. package/dist/semantic/llm/prompts.js.map +1 -0
  309. package/dist/semantic/structural/credential-context.d.ts +14 -0
  310. package/dist/semantic/structural/credential-context.d.ts.map +1 -0
  311. package/dist/semantic/structural/credential-context.js +295 -0
  312. package/dist/semantic/structural/credential-context.js.map +1 -0
  313. package/dist/semantic/structural/index.d.ts +28 -0
  314. package/dist/semantic/structural/index.d.ts.map +1 -0
  315. package/dist/semantic/structural/index.js +138 -0
  316. package/dist/semantic/structural/index.js.map +1 -0
  317. package/dist/semantic/structural/instruction.d.ts +19 -0
  318. package/dist/semantic/structural/instruction.d.ts.map +1 -0
  319. package/dist/semantic/structural/instruction.js +167 -0
  320. package/dist/semantic/structural/instruction.js.map +1 -0
  321. package/dist/semantic/structural/mcp-config.d.ts +22 -0
  322. package/dist/semantic/structural/mcp-config.d.ts.map +1 -0
  323. package/dist/semantic/structural/mcp-config.js +294 -0
  324. package/dist/semantic/structural/mcp-config.js.map +1 -0
  325. package/dist/semantic/structural/permission-model.d.ts +16 -0
  326. package/dist/semantic/structural/permission-model.d.ts.map +1 -0
  327. package/dist/semantic/structural/permission-model.js +121 -0
  328. package/dist/semantic/structural/permission-model.js.map +1 -0
  329. package/dist/semantic/types.d.ts +122 -0
  330. package/dist/semantic/types.d.ts.map +1 -0
  331. package/dist/semantic/types.js +10 -0
  332. package/dist/semantic/types.js.map +1 -0
  333. package/package.json +25 -14
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * LLM Prompt Templates (Layer 3)
4
+ *
5
+ * Structured prompts for each analysis type.
6
+ * Each prompt requests JSON output with line numbers, severity, and rationale.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.INSTRUCTION_ANALYSIS_PROMPT = exports.MCP_THREAT_ANALYSIS_PROMPT = exports.CREDENTIAL_DETECTION_PROMPT = void 0;
10
+ exports.buildFileAnalysisMessage = buildFileAnalysisMessage;
11
+ exports.getPromptForFileType = getPromptForFileType;
12
+ /**
13
+ * System prompt for credential detection (uses Haiku — fast classification)
14
+ */
15
+ exports.CREDENTIAL_DETECTION_PROMPT = `You are a security analyst specializing in credential detection. Analyze the following file for ANY form of credentials, secrets, tokens, or passwords.
16
+
17
+ Look for ALL credential types including:
18
+ - API keys in any format (not just known prefixes)
19
+ - Database connection strings with passwords
20
+ - JWT tokens
21
+ - OAuth tokens and refresh tokens
22
+ - Private keys (RSA, Ed25519, etc.)
23
+ - Basic auth credentials
24
+ - Session tokens
25
+ - Webhook secrets
26
+ - Encryption keys
27
+
28
+ For each credential found, respond with a JSON array:
29
+ [
30
+ {
31
+ "line": <line number>,
32
+ "type": "<credential type>",
33
+ "severity": "critical" | "high",
34
+ "description": "<what was found>",
35
+ "rationale": "<why this is a security risk in this specific file context>"
36
+ }
37
+ ]
38
+
39
+ If no credentials are found, respond with an empty array: []
40
+
41
+ IMPORTANT: Be thorough but avoid false positives. Example strings, documentation references, and redacted values (xxx, ***, REDACTED) are NOT findings.`;
42
+ /**
43
+ * System prompt for MCP threat analysis (uses Sonnet — complex reasoning)
44
+ */
45
+ exports.MCP_THREAT_ANALYSIS_PROMPT = `You are a security analyst specializing in AI agent security. Analyze the following MCP (Model Context Protocol) configuration for security threats.
46
+
47
+ Evaluate:
48
+ 1. **Capability scope**: What can each server do? Is it overprivileged?
49
+ 2. **Attack chains**: Can the combination of servers enable read→execute→exfiltrate attacks?
50
+ 3. **Secrets exposure**: Are credentials passed via args (visible to LLM) instead of env vars?
51
+ 4. **Trust boundaries**: Are servers from untrusted sources given privileged access?
52
+ 5. **Sandbox integrity**: Are there flags that bypass security sandboxes?
53
+
54
+ For each finding, respond with a JSON array:
55
+ [
56
+ {
57
+ "line": <line number or null>,
58
+ "type": "<finding type>",
59
+ "severity": "critical" | "high" | "medium" | "low",
60
+ "description": "<what was found>",
61
+ "rationale": "<why this is a security risk>",
62
+ "recommendation": "<specific fix>"
63
+ }
64
+ ]
65
+
66
+ If no issues found, respond with an empty array: []`;
67
+ /**
68
+ * System prompt for instruction analysis (uses Sonnet — nuanced reasoning)
69
+ */
70
+ exports.INSTRUCTION_ANALYSIS_PROMPT = `You are a security analyst specializing in AI agent security. Analyze the following agent instruction file for security risks.
71
+
72
+ This file is loaded into the AI agent's context window with every interaction. Evaluate:
73
+
74
+ 1. **Prompt injection vectors**: Could an attacker craft input that exploits these instructions?
75
+ 2. **Permissive behaviors**: Does the file tell the agent to bypass security controls?
76
+ 3. **Data exfiltration risks**: Could the instructions be used to leak sensitive data?
77
+ 4. **Credential exposure**: Are any secrets, tokens, or passwords present in the instructions?
78
+ 5. **Missing boundaries**: What security constraints are absent that should be present?
79
+
80
+ For each finding, respond with a JSON array:
81
+ [
82
+ {
83
+ "line": <line number or null>,
84
+ "type": "<finding type>",
85
+ "severity": "critical" | "high" | "medium" | "low",
86
+ "description": "<what was found>",
87
+ "rationale": "<why this is a security risk>",
88
+ "recommendation": "<specific fix>"
89
+ }
90
+ ]
91
+
92
+ If no issues found, respond with an empty array: []`;
93
+ /**
94
+ * Build the user message for file analysis
95
+ */
96
+ function buildFileAnalysisMessage(filePath, content, fileType) {
97
+ return `File: ${filePath}
98
+ Type: ${fileType}
99
+ Content:
100
+ \`\`\`
101
+ ${content}
102
+ \`\`\``;
103
+ }
104
+ /**
105
+ * Select the appropriate prompt for a file type
106
+ */
107
+ function getPromptForFileType(fileType) {
108
+ switch (fileType) {
109
+ case 'agent_instructions':
110
+ return { systemPrompt: exports.INSTRUCTION_ANALYSIS_PROMPT, model: 'sonnet' };
111
+ case 'mcp_config':
112
+ case 'claude_settings':
113
+ return { systemPrompt: exports.MCP_THREAT_ANALYSIS_PROMPT, model: 'sonnet' };
114
+ case 'env_file':
115
+ case 'config_file':
116
+ default:
117
+ return { systemPrompt: exports.CREDENTIAL_DETECTION_PROMPT, model: 'haiku' };
118
+ }
119
+ }
120
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/semantic/llm/prompts.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAyFH,4DAWC;AAKD,oDAcC;AArHD;;GAEG;AACU,QAAA,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;wJA0B6G,CAAC;AAEzJ;;GAEG;AACU,QAAA,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;oDAqBU,CAAC;AAErD;;GAEG;AACU,QAAA,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;oDAsBS,CAAC;AAErD;;GAEG;AACH,SAAgB,wBAAwB,CACtC,QAAgB,EAChB,OAAe,EACf,QAAgB;IAEhB,OAAO,SAAS,QAAQ;QAClB,QAAQ;;;EAGd,OAAO;OACF,CAAC;AACR,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,QAAgB;IAEhB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,oBAAoB;YACvB,OAAO,EAAE,YAAY,EAAE,mCAA2B,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACxE,KAAK,YAAY,CAAC;QAClB,KAAK,iBAAiB;YACpB,OAAO,EAAE,YAAY,EAAE,kCAA0B,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACvE,KAAK,UAAU,CAAC;QAChB,KAAK,aAAa,CAAC;QACnB;YACE,OAAO,EAAE,YAAY,EAAE,mCAA2B,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACzE,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Context-Aware Credential Detection (Layer 2)
3
+ *
4
+ * Catches credentials that regex misses by understanding structure:
5
+ * - URL passwords (postgres://admin:password123@host)
6
+ * - Generic tokens in config (key-name heuristics)
7
+ * - Short API keys below regex thresholds
8
+ * - Secrets in instruction files (CLAUDE.md, .cursorrules)
9
+ */
10
+ import type { SemanticFinding, AnalysisFile } from '../types';
11
+ export declare class CredentialContextAnalyzer {
12
+ analyze(files: AnalysisFile[]): SemanticFinding[];
13
+ }
14
+ //# sourceMappingURL=credential-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-context.d.ts","sourceRoot":"","sources":["../../../src/semantic/structural/credential-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA6T9D,qBAAa,yBAAyB;IACpC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,eAAe,EAAE;CAYlD"}
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ /**
3
+ * Context-Aware Credential Detection (Layer 2)
4
+ *
5
+ * Catches credentials that regex misses by understanding structure:
6
+ * - URL passwords (postgres://admin:password123@host)
7
+ * - Generic tokens in config (key-name heuristics)
8
+ * - Short API keys below regex thresholds
9
+ * - Secrets in instruction files (CLAUDE.md, .cursorrules)
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CredentialContextAnalyzer = void 0;
13
+ /** Key names that indicate a secret value */
14
+ const SECRET_KEY_PATTERN = /^(.*_)?(secret|token|key|password|passwd|credential|auth|apikey|api_key|access_key|private_key|client_secret|signing_key|encryption_key|master_key|jwt_secret|session_secret|db_password|database_password)(_.*)?$/i;
15
+ /** URL with embedded credentials: protocol://user:password@host
16
+ * Uses greedy .+ for password to handle @ chars in passwords.
17
+ * The greedy match backtracks to the last valid @hostname boundary. */
18
+ const URL_CREDENTIAL_PATTERN = /(?:postgres|postgresql|mysql|mongodb|redis|amqp|rabbitmq|ftp|sftp|https?):\/\/([^:]+):(.+)@([a-zA-Z0-9][-a-zA-Z0-9.]*(?::\d+)?(?:\/[^\s"',)]*)?)/gi;
19
+ /** Values that are NOT secrets (env var refs, booleans, paths, etc.) */
20
+ function isNonSecretValue(value) {
21
+ const trimmed = value.trim().replace(/^["']|["']$/g, '');
22
+ // Empty or whitespace
23
+ if (!trimmed || trimmed.length === 0)
24
+ return true;
25
+ // Env var reference
26
+ if (/^\$\{.*\}$/.test(trimmed) || /^\$[A-Z_]+$/.test(trimmed))
27
+ return true;
28
+ // Boolean
29
+ if (/^(true|false)$/i.test(trimmed))
30
+ return true;
31
+ // Pure number
32
+ if (/^\d+(\.\d+)?$/.test(trimmed))
33
+ return true;
34
+ // File path (starts with / or ./ or ~/)
35
+ if (/^[.~]?\//.test(trimmed) && !trimmed.includes('@'))
36
+ return true;
37
+ // URL without credentials
38
+ if (/^https?:\/\/[^:@]*$/.test(trimmed))
39
+ return true;
40
+ // Placeholder values
41
+ if (/^(xxx|your[-_]|change[-_]me|replace[-_]|TODO|FIXME|placeholder|example)/i.test(trimmed))
42
+ return true;
43
+ // Common non-secret config values
44
+ if (/^(localhost|127\.0\.0\.1|0\.0\.0\.0|none|null|undefined|default)$/i.test(trimmed))
45
+ return true;
46
+ return false;
47
+ }
48
+ /** Severity based on file location */
49
+ function severityForFile(filePath) {
50
+ const lower = filePath.toLowerCase();
51
+ // In LLM context window — exposed to AI provider, extractable via prompt injection
52
+ if (lower.endsWith('claude.md') ||
53
+ lower.endsWith('.cursorrules') ||
54
+ lower.endsWith('.windsurfrules') ||
55
+ lower.endsWith('.clinerules') ||
56
+ lower.includes('copilot-instructions')) {
57
+ return 'critical';
58
+ }
59
+ // MCP configs — tool config, often committed
60
+ if (lower.includes('mcp.json') ||
61
+ lower.includes('mcp.yaml')) {
62
+ return 'critical';
63
+ }
64
+ // .env files that might be committed
65
+ if (lower.includes('.env')) {
66
+ return 'high';
67
+ }
68
+ // Config files
69
+ return 'high';
70
+ }
71
+ /**
72
+ * Detect URL-embedded passwords
73
+ */
74
+ function detectUrlPasswords(file) {
75
+ const findings = [];
76
+ const lines = file.content.split('\n');
77
+ for (let i = 0; i < lines.length; i++) {
78
+ const line = lines[i];
79
+ URL_CREDENTIAL_PATTERN.lastIndex = 0;
80
+ let match;
81
+ while ((match = URL_CREDENTIAL_PATTERN.exec(line)) !== null) {
82
+ const password = match[2];
83
+ // Skip env var references in URLs
84
+ if (password.startsWith('${') || password.startsWith('$'))
85
+ continue;
86
+ // Skip very short passwords that might be ports
87
+ if (password.length < 3)
88
+ continue;
89
+ findings.push({
90
+ id: 'SEM-CRED-001',
91
+ title: 'Password embedded in URL',
92
+ description: `Database or service URL contains an inline password. The password is visible in plaintext in ${file.path}.`,
93
+ rationale: 'URL-embedded credentials are logged by proxies, shell history, and process listings. They bypass .env file protections and are easily leaked in stack traces.',
94
+ category: 'credential',
95
+ severity: severityForFile(file.path),
96
+ file: file.path,
97
+ line: i + 1,
98
+ recommendation: 'Move the password to an environment variable and reference it: postgresql://${DB_USER}:${DB_PASSWORD}@host/db',
99
+ layer: 2,
100
+ autoFixable: false,
101
+ });
102
+ }
103
+ }
104
+ return findings;
105
+ }
106
+ /**
107
+ * Detect generic tokens via key-name heuristics
108
+ */
109
+ function detectGenericTokens(file) {
110
+ const findings = [];
111
+ const lines = file.content.split('\n');
112
+ for (let i = 0; i < lines.length; i++) {
113
+ const line = lines[i];
114
+ // JSON key:value patterns
115
+ const jsonMatch = line.match(/"([^"]+)"\s*:\s*"([^"]+)"/);
116
+ if (jsonMatch) {
117
+ const [, key, value] = jsonMatch;
118
+ if (SECRET_KEY_PATTERN.test(key) && !isNonSecretValue(value)) {
119
+ // Ensure value looks like it could be a secret (min length, some entropy)
120
+ if (value.length >= 8 && !/^[a-z]+$/i.test(value)) {
121
+ findings.push({
122
+ id: 'SEM-CRED-002',
123
+ title: 'Hardcoded secret in config',
124
+ description: `Key "${key}" contains what appears to be a hardcoded secret value in ${file.path}.`,
125
+ rationale: 'Config files with hardcoded secrets are commonly committed to version control. The key name strongly indicates this value should be treated as a secret.',
126
+ category: 'credential',
127
+ severity: severityForFile(file.path),
128
+ file: file.path,
129
+ line: i + 1,
130
+ recommendation: `Move "${key}" value to an environment variable and reference it with \${${key.toUpperCase().replace(/[^A-Z0-9]/g, '_')}}`,
131
+ layer: 2,
132
+ autoFixable: false,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ // YAML key: value patterns
138
+ const yamlMatch = line.match(/^(\s*)([a-zA-Z_][a-zA-Z0-9_-]*)\s*:\s*(.+)$/);
139
+ if (yamlMatch && !jsonMatch) {
140
+ const [, , key, rawValue] = yamlMatch;
141
+ const value = rawValue.trim().replace(/^["']|["']$/g, '');
142
+ if (SECRET_KEY_PATTERN.test(key) && !isNonSecretValue(value)) {
143
+ if (value.length >= 8 && !/^[a-z]+$/i.test(value)) {
144
+ findings.push({
145
+ id: 'SEM-CRED-002',
146
+ title: 'Hardcoded secret in config',
147
+ description: `Key "${key}" contains what appears to be a hardcoded secret value in ${file.path}.`,
148
+ rationale: 'Config files with hardcoded secrets are commonly committed to version control. The key name strongly indicates this value should be treated as a secret.',
149
+ category: 'credential',
150
+ severity: severityForFile(file.path),
151
+ file: file.path,
152
+ line: i + 1,
153
+ recommendation: `Move "${key}" value to an environment variable.`,
154
+ layer: 2,
155
+ autoFixable: false,
156
+ });
157
+ }
158
+ }
159
+ }
160
+ // .env KEY=VALUE patterns
161
+ const envMatch = line.match(/^([A-Z][A-Z0-9_]*)=(.+)$/);
162
+ if (envMatch) {
163
+ const [, key, rawValue] = envMatch;
164
+ const value = rawValue.trim().replace(/^["']|["']$/g, '');
165
+ if (SECRET_KEY_PATTERN.test(key) && !isNonSecretValue(value)) {
166
+ if (value.length >= 8 && !/^[a-z]+$/i.test(value)) {
167
+ findings.push({
168
+ id: 'SEM-CRED-002',
169
+ title: 'Hardcoded secret in config',
170
+ description: `Environment variable "${key}" contains a hardcoded secret value in ${file.path}.`,
171
+ rationale: '.env files with hardcoded secrets should be gitignored. If this file is committed, the secret is exposed in version control history.',
172
+ category: 'credential',
173
+ severity: severityForFile(file.path),
174
+ file: file.path,
175
+ line: i + 1,
176
+ recommendation: `Ensure ${file.path} is in .gitignore and rotate this credential.`,
177
+ layer: 2,
178
+ autoFixable: false,
179
+ });
180
+ }
181
+ }
182
+ }
183
+ }
184
+ return findings;
185
+ }
186
+ /**
187
+ * Detect credential-like strings in instruction files
188
+ * (CLAUDE.md, .cursorrules, copilot-instructions.md)
189
+ *
190
+ * These files are loaded into the LLM context window,
191
+ * so ANY credential here is critical severity.
192
+ */
193
+ function detectCredentialsInInstructions(file) {
194
+ if (file.type !== 'agent_instructions' &&
195
+ !file.path.toLowerCase().endsWith('claude.md') &&
196
+ !file.path.toLowerCase().endsWith('.cursorrules')) {
197
+ return [];
198
+ }
199
+ const findings = [];
200
+ const lines = file.content.split('\n');
201
+ // Patterns that look like API keys/tokens (broader than core scanner's regex)
202
+ const broadCredentialPatterns = [
203
+ { name: 'API key prefix', pattern: /(?:sk-|pk-|rk-|ak-)[a-zA-Z0-9_-]{16,}/g },
204
+ { name: 'Bearer token', pattern: /Bearer\s+[a-zA-Z0-9._-]{20,}/g },
205
+ { name: 'Generic long token', pattern: /(?:token|key|secret|password)\s*[=:]\s*['"]?([a-zA-Z0-9_-]{32,})['"]?/gi },
206
+ { name: 'Base64 credential', pattern: /(?:password|secret|token|key)\s*[=:]\s*['"]?([A-Za-z0-9+/]{40,}={0,2})['"]?/gi },
207
+ ];
208
+ for (let i = 0; i < lines.length; i++) {
209
+ const line = lines[i];
210
+ for (const { name, pattern } of broadCredentialPatterns) {
211
+ pattern.lastIndex = 0;
212
+ if (pattern.test(line)) {
213
+ findings.push({
214
+ id: 'SEM-CRED-003',
215
+ title: 'Credential in agent instructions',
216
+ description: `Detected ${name} pattern in ${file.path}. This file is loaded into the LLM context window.`,
217
+ rationale: 'Agent instruction files (CLAUDE.md, .cursorrules) are sent to the AI provider with every request. Any credential in these files is exposed to the AI provider and can be extracted via prompt injection attacks.',
218
+ category: 'credential',
219
+ severity: 'critical',
220
+ file: file.path,
221
+ line: i + 1,
222
+ recommendation: 'Remove all credentials from instruction files immediately. Use environment variables or a secrets manager instead.',
223
+ layer: 2,
224
+ autoFixable: false,
225
+ });
226
+ break; // One finding per line
227
+ }
228
+ }
229
+ }
230
+ return findings;
231
+ }
232
+ /**
233
+ * Detect secrets passed via MCP server env blocks
234
+ */
235
+ function detectMcpEnvSecrets(file) {
236
+ if (file.type !== 'mcp_config' && file.type !== 'claude_settings') {
237
+ return [];
238
+ }
239
+ const findings = [];
240
+ let config;
241
+ try {
242
+ config = JSON.parse(file.content);
243
+ }
244
+ catch {
245
+ return [];
246
+ }
247
+ const servers = config.mcpServers || {};
248
+ const lines = file.content.split('\n');
249
+ for (const [serverName, serverConfig] of Object.entries(servers)) {
250
+ if (!serverConfig.env)
251
+ continue;
252
+ for (const [key, value] of Object.entries(serverConfig.env)) {
253
+ if (typeof value !== 'string')
254
+ continue;
255
+ if (SECRET_KEY_PATTERN.test(key) && !isNonSecretValue(value)) {
256
+ // Find the line number
257
+ let lineNum;
258
+ for (let i = 0; i < lines.length; i++) {
259
+ if (lines[i].includes(`"${key}"`) && lines[i].includes(value.substring(0, 20))) {
260
+ lineNum = i + 1;
261
+ break;
262
+ }
263
+ }
264
+ findings.push({
265
+ id: 'SEM-CRED-004',
266
+ title: 'Secret hardcoded in MCP server config',
267
+ description: `MCP server "${serverName}" has secret "${key}" hardcoded in env block of ${file.path}.`,
268
+ rationale: 'MCP config files are typically committed to version control. Secrets in the env block are visible in plaintext. Use environment variable references instead.',
269
+ category: 'credential',
270
+ severity: 'critical',
271
+ file: file.path,
272
+ line: lineNum,
273
+ recommendation: `Replace the hardcoded value with an env var reference: "${key}": "\${${key}}"`,
274
+ layer: 2,
275
+ autoFixable: false,
276
+ });
277
+ }
278
+ }
279
+ }
280
+ return findings;
281
+ }
282
+ class CredentialContextAnalyzer {
283
+ analyze(files) {
284
+ const findings = [];
285
+ for (const file of files) {
286
+ findings.push(...detectUrlPasswords(file));
287
+ findings.push(...detectGenericTokens(file));
288
+ findings.push(...detectCredentialsInInstructions(file));
289
+ findings.push(...detectMcpEnvSecrets(file));
290
+ }
291
+ return findings;
292
+ }
293
+ }
294
+ exports.CredentialContextAnalyzer = CredentialContextAnalyzer;
295
+ //# sourceMappingURL=credential-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-context.js","sourceRoot":"","sources":["../../../src/semantic/structural/credential-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Structural Analyzer (Layer 2 Orchestrator)
3
+ *
4
+ * Runs all Layer 2 analyzers against a target directory.
5
+ * Discovers security-relevant files, classifies them, reads content,
6
+ * and runs each analyzer.
7
+ */
8
+ import type { SemanticFinding, AnalysisFile } from '../types';
9
+ export declare class StructuralAnalyzer {
10
+ private credentialAnalyzer;
11
+ private mcpAnalyzer;
12
+ private instructionAnalyzer;
13
+ private permissionAnalyzer;
14
+ /**
15
+ * Discover and analyze all security-relevant files in the target directory.
16
+ */
17
+ analyze(targetDir: string): Promise<SemanticFinding[]>;
18
+ /**
19
+ * Discover and read security-relevant files.
20
+ * Exported for use by the MCP server's deep_scan tool.
21
+ */
22
+ discoverFiles(targetDir: string): Promise<AnalysisFile[]>;
23
+ }
24
+ export { CredentialContextAnalyzer } from './credential-context';
25
+ export { McpConfigAnalyzer } from './mcp-config';
26
+ export { InstructionAnalyzer } from './instruction';
27
+ export { PermissionModelAnalyzer } from './permission-model';
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/semantic/structural/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAY,MAAM,UAAU,CAAC;AAuCxE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,mBAAmB,CAA6B;IACxD,OAAO,CAAC,kBAAkB,CAAiC;IAE3D;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAc5D;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CA6BhE;AAED,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ /**
3
+ * Structural Analyzer (Layer 2 Orchestrator)
4
+ *
5
+ * Runs all Layer 2 analyzers against a target directory.
6
+ * Discovers security-relevant files, classifies them, reads content,
7
+ * and runs each analyzer.
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.PermissionModelAnalyzer = exports.InstructionAnalyzer = exports.McpConfigAnalyzer = exports.CredentialContextAnalyzer = exports.StructuralAnalyzer = void 0;
44
+ const fs = __importStar(require("fs/promises"));
45
+ const path = __importStar(require("path"));
46
+ const credential_context_1 = require("./credential-context");
47
+ const mcp_config_1 = require("./mcp-config");
48
+ const instruction_1 = require("./instruction");
49
+ const permission_model_1 = require("./permission-model");
50
+ /** Max file size to read (prevents OOM on huge files) */
51
+ const MAX_FILE_SIZE = 512 * 1024; // 512KB
52
+ /** Security-relevant files to look for */
53
+ const FILE_DISCOVERY = [
54
+ // Agent instruction files
55
+ { glob: 'CLAUDE.md', type: 'agent_instructions' },
56
+ { glob: '.cursorrules', type: 'agent_instructions' },
57
+ { glob: '.windsurfrules', type: 'agent_instructions' },
58
+ { glob: '.clinerules', type: 'agent_instructions' },
59
+ { glob: '.github/copilot-instructions.md', type: 'agent_instructions' },
60
+ // MCP config files
61
+ { glob: 'mcp.json', type: 'mcp_config' },
62
+ { glob: '.cursor/mcp.json', type: 'mcp_config' },
63
+ { glob: '.vscode/mcp.json', type: 'mcp_config' },
64
+ // Claude settings
65
+ { glob: '.claude/settings.json', type: 'claude_settings' },
66
+ // Env files
67
+ { glob: '.env', type: 'env_file' },
68
+ { glob: '.env.local', type: 'env_file' },
69
+ { glob: '.env.development', type: 'env_file' },
70
+ { glob: '.env.production', type: 'env_file' },
71
+ // Config files
72
+ { glob: 'config.json', type: 'config_file' },
73
+ { glob: 'config.yaml', type: 'config_file' },
74
+ { glob: 'config.yml', type: 'config_file' },
75
+ { glob: 'settings.json', type: 'config_file' },
76
+ ];
77
+ class StructuralAnalyzer {
78
+ constructor() {
79
+ this.credentialAnalyzer = new credential_context_1.CredentialContextAnalyzer();
80
+ this.mcpAnalyzer = new mcp_config_1.McpConfigAnalyzer();
81
+ this.instructionAnalyzer = new instruction_1.InstructionAnalyzer();
82
+ this.permissionAnalyzer = new permission_model_1.PermissionModelAnalyzer();
83
+ }
84
+ /**
85
+ * Discover and analyze all security-relevant files in the target directory.
86
+ */
87
+ async analyze(targetDir) {
88
+ const files = await this.discoverFiles(targetDir);
89
+ if (files.length === 0)
90
+ return [];
91
+ const findings = [];
92
+ findings.push(...this.credentialAnalyzer.analyze(files));
93
+ findings.push(...this.mcpAnalyzer.analyze(files));
94
+ findings.push(...this.instructionAnalyzer.analyze(files));
95
+ findings.push(...this.permissionAnalyzer.analyze(files));
96
+ return findings;
97
+ }
98
+ /**
99
+ * Discover and read security-relevant files.
100
+ * Exported for use by the MCP server's deep_scan tool.
101
+ */
102
+ async discoverFiles(targetDir) {
103
+ const files = [];
104
+ for (const { glob, type } of FILE_DISCOVERY) {
105
+ const filePath = path.join(targetDir, glob);
106
+ try {
107
+ const stat = await fs.stat(filePath);
108
+ if (!stat.isFile())
109
+ continue;
110
+ const truncated = stat.size > MAX_FILE_SIZE;
111
+ const content = await fs.readFile(filePath, 'utf-8');
112
+ const finalContent = truncated
113
+ ? content.substring(0, MAX_FILE_SIZE)
114
+ : content;
115
+ files.push({
116
+ path: glob,
117
+ type,
118
+ content: finalContent,
119
+ truncated,
120
+ });
121
+ }
122
+ catch {
123
+ // File doesn't exist — skip
124
+ }
125
+ }
126
+ return files;
127
+ }
128
+ }
129
+ exports.StructuralAnalyzer = StructuralAnalyzer;
130
+ var credential_context_2 = require("./credential-context");
131
+ Object.defineProperty(exports, "CredentialContextAnalyzer", { enumerable: true, get: function () { return credential_context_2.CredentialContextAnalyzer; } });
132
+ var mcp_config_2 = require("./mcp-config");
133
+ Object.defineProperty(exports, "McpConfigAnalyzer", { enumerable: true, get: function () { return mcp_config_2.McpConfigAnalyzer; } });
134
+ var instruction_2 = require("./instruction");
135
+ Object.defineProperty(exports, "InstructionAnalyzer", { enumerable: true, get: function () { return instruction_2.InstructionAnalyzer; } });
136
+ var permission_model_2 = require("./permission-model");
137
+ Object.defineProperty(exports, "PermissionModelAnalyzer", { enumerable: true, get: function () { return permission_model_2.PermissionModelAnalyzer; } });
138
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/semantic/structural/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Agent Instruction Static Analysis (Layer 2)
3
+ *
4
+ * Analyzes CLAUDE.md, .cursorrules, .windsurfrules, .clinerules,
5
+ * copilot-instructions.md for security issues:
6
+ * - Overly permissive instructions
7
+ * - Exfiltration enablement
8
+ * - Missing security boundaries
9
+ * - Large attack surface
10
+ */
11
+ import type { SemanticFinding, AnalysisFile } from '../types';
12
+ export declare class InstructionAnalyzer {
13
+ analyze(files: AnalysisFile[]): SemanticFinding[];
14
+ private checkPermissiveInstructions;
15
+ private checkExfiltrationEnablement;
16
+ private checkMissingSecurityBoundaries;
17
+ private checkLargeAttackSurface;
18
+ }
19
+ //# sourceMappingURL=instruction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instruction.d.ts","sourceRoot":"","sources":["../../../src/semantic/structural/instruction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAiD9D,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,eAAe,EAAE;IAiBjD,OAAO,CAAC,2BAA2B;IAgCnC,OAAO,CAAC,2BAA2B;IAgCnC,OAAO,CAAC,8BAA8B;IA8BtC,OAAO,CAAC,uBAAuB;CAyBhC"}