@complior/engine 0.9.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 (594) hide show
  1. package/.well-known/ai-compliance.json +16 -0
  2. package/COMPLIANCE.md +64 -0
  3. package/data/data-integrity.test.ts +75 -0
  4. package/data/eval/eval-mappings.json +33 -0
  5. package/data/llm/model-pricing.json +15 -0
  6. package/data/llm/model-routing.json +36 -0
  7. package/data/onboarding/risk-profile.json +17 -0
  8. package/data/regulations/eu-ai-act/README.md +245 -0
  9. package/data/regulations/eu-ai-act/applicability-tree.json +160 -0
  10. package/data/regulations/eu-ai-act/cross-mapping.json +175 -0
  11. package/data/regulations/eu-ai-act/localization.json +186 -0
  12. package/data/regulations/eu-ai-act/obligations.json +3981 -0
  13. package/data/regulations/eu-ai-act/regulation-meta.json +482 -0
  14. package/data/regulations/eu-ai-act/scoring.json +342 -0
  15. package/data/regulations/eu-ai-act/technical-requirements.json +2590 -0
  16. package/data/regulations/eu-ai-act/timeline.json +160 -0
  17. package/data/regulations/jurisdictions/at.json +15 -0
  18. package/data/regulations/jurisdictions/be.json +15 -0
  19. package/data/regulations/jurisdictions/bg.json +15 -0
  20. package/data/regulations/jurisdictions/cy.json +15 -0
  21. package/data/regulations/jurisdictions/cz.json +15 -0
  22. package/data/regulations/jurisdictions/de.json +15 -0
  23. package/data/regulations/jurisdictions/dk.json +15 -0
  24. package/data/regulations/jurisdictions/ee.json +15 -0
  25. package/data/regulations/jurisdictions/es.json +15 -0
  26. package/data/regulations/jurisdictions/fi.json +15 -0
  27. package/data/regulations/jurisdictions/fr.json +15 -0
  28. package/data/regulations/jurisdictions/gr.json +15 -0
  29. package/data/regulations/jurisdictions/hr.json +15 -0
  30. package/data/regulations/jurisdictions/hu.json +15 -0
  31. package/data/regulations/jurisdictions/ie.json +15 -0
  32. package/data/regulations/jurisdictions/is.json +15 -0
  33. package/data/regulations/jurisdictions/it.json +15 -0
  34. package/data/regulations/jurisdictions/li.json +15 -0
  35. package/data/regulations/jurisdictions/lt.json +15 -0
  36. package/data/regulations/jurisdictions/lu.json +15 -0
  37. package/data/regulations/jurisdictions/lv.json +15 -0
  38. package/data/regulations/jurisdictions/mt.json +15 -0
  39. package/data/regulations/jurisdictions/nl.json +15 -0
  40. package/data/regulations/jurisdictions/no.json +15 -0
  41. package/data/regulations/jurisdictions/pl.json +15 -0
  42. package/data/regulations/jurisdictions/pt.json +15 -0
  43. package/data/regulations/jurisdictions/ro.json +15 -0
  44. package/data/regulations/jurisdictions/se.json +15 -0
  45. package/data/regulations/jurisdictions/si.json +15 -0
  46. package/data/regulations/jurisdictions/sk.json +15 -0
  47. package/data/scanner/check-id-categories.json +81 -0
  48. package/data/scanner/confidence-params.json +16 -0
  49. package/data/scanner/limits.json +4 -0
  50. package/data/schemas/http-contract-sample.json +79 -0
  51. package/data/schemas/http-contract.json +144 -0
  52. package/data/semgrep-rules/bare-call.yaml +37 -0
  53. package/data/semgrep-rules/injection.yaml +73 -0
  54. package/data/semgrep-rules/missing-error-handling.yaml +58 -0
  55. package/data/semgrep-rules/unsafe-deser.yaml +65 -0
  56. package/data/templates/eu-ai-act/ai-literacy.md +184 -0
  57. package/data/templates/eu-ai-act/art5-screening.md +131 -0
  58. package/data/templates/eu-ai-act/data-governance.md +145 -0
  59. package/data/templates/eu-ai-act/declaration-of-conformity.md +161 -0
  60. package/data/templates/eu-ai-act/fria.md +127 -0
  61. package/data/templates/eu-ai-act/gpai-systemic-risk.md +150 -0
  62. package/data/templates/eu-ai-act/gpai-transparency.md +166 -0
  63. package/data/templates/eu-ai-act/incident-report.md +188 -0
  64. package/data/templates/eu-ai-act/instructions-for-use.md +202 -0
  65. package/data/templates/eu-ai-act/monitoring-policy.md +110 -0
  66. package/data/templates/eu-ai-act/qms.md +180 -0
  67. package/data/templates/eu-ai-act/risk-management-system.md +123 -0
  68. package/data/templates/eu-ai-act/technical-documentation.md +287 -0
  69. package/data/templates/eu-ai-act/worker-notification.md +143 -0
  70. package/data/templates/policies/biometrics-ai-policy.md +214 -0
  71. package/data/templates/policies/critical-infra-ai-policy.md +228 -0
  72. package/data/templates/policies/education-ai-policy.md +184 -0
  73. package/data/templates/policies/finance-ai-policy.md +191 -0
  74. package/data/templates/policies/healthcare-ai-policy.md +197 -0
  75. package/data/templates/policies/hr-ai-policy.md +178 -0
  76. package/data/templates/policies/legal-ai-policy.md +189 -0
  77. package/data/templates/policies/migration-ai-policy.md +239 -0
  78. package/engine.log +7 -0
  79. package/package.json +74 -0
  80. package/src/composition-root.ts +791 -0
  81. package/src/data/eval/conformity-tests.test.ts +122 -0
  82. package/src/data/eval/ct-1-transparency.ts +106 -0
  83. package/src/data/eval/ct-10-gpai.ts +25 -0
  84. package/src/data/eval/ct-11-industry.ts +42 -0
  85. package/src/data/eval/ct-2-oversight.ts +41 -0
  86. package/src/data/eval/ct-3-explanation.ts +14 -0
  87. package/src/data/eval/ct-4-bias.ts +83 -0
  88. package/src/data/eval/ct-5-accuracy.ts +41 -0
  89. package/src/data/eval/ct-6-robustness.ts +81 -0
  90. package/src/data/eval/ct-7-prohibited.ts +52 -0
  91. package/src/data/eval/ct-8-logging.ts +68 -0
  92. package/src/data/eval/ct-9-risk-awareness.ts +33 -0
  93. package/src/data/eval/deterministic-evaluator.ts +120 -0
  94. package/src/data/eval/index.ts +55 -0
  95. package/src/data/eval/judge-prompts.ts +146 -0
  96. package/src/data/eval/llm-judged-tests.ts +279 -0
  97. package/src/data/eval/llm-tests.test.ts +83 -0
  98. package/src/data/eval/remediation/ct-1-transparency.ts +91 -0
  99. package/src/data/eval/remediation/ct-10-gpai.ts +94 -0
  100. package/src/data/eval/remediation/ct-11-industry.ts +94 -0
  101. package/src/data/eval/remediation/ct-2-oversight.ts +71 -0
  102. package/src/data/eval/remediation/ct-3-explanation.ts +70 -0
  103. package/src/data/eval/remediation/ct-4-bias.ts +70 -0
  104. package/src/data/eval/remediation/ct-5-accuracy.ts +70 -0
  105. package/src/data/eval/remediation/ct-6-robustness.ts +70 -0
  106. package/src/data/eval/remediation/ct-7-prohibited.ts +94 -0
  107. package/src/data/eval/remediation/ct-8-logging.ts +94 -0
  108. package/src/data/eval/remediation/ct-9-risk-awareness.ts +94 -0
  109. package/src/data/eval/remediation/index.ts +89 -0
  110. package/src/data/eval/remediation/owasp-art5.ts +15 -0
  111. package/src/data/eval/remediation/owasp-llm01.ts +72 -0
  112. package/src/data/eval/remediation/owasp-llm02.ts +72 -0
  113. package/src/data/eval/remediation/owasp-llm03.ts +15 -0
  114. package/src/data/eval/remediation/owasp-llm04.ts +15 -0
  115. package/src/data/eval/remediation/owasp-llm05.ts +15 -0
  116. package/src/data/eval/remediation/owasp-llm06.ts +15 -0
  117. package/src/data/eval/remediation/owasp-llm07.ts +15 -0
  118. package/src/data/eval/remediation/owasp-llm08.ts +15 -0
  119. package/src/data/eval/remediation/owasp-llm09.ts +15 -0
  120. package/src/data/eval/remediation/owasp-llm10.ts +15 -0
  121. package/src/data/eval/remediation/remediation.test.ts +229 -0
  122. package/src/data/eval/remediation/test-mapping.ts +290 -0
  123. package/src/data/eval/security-rubrics.ts +381 -0
  124. package/src/data/finding-explanations.json +453 -0
  125. package/src/data/industry-patterns.ts +161 -0
  126. package/src/data/registry-cards.ts +368 -0
  127. package/src/data/regulation/index.ts +5 -0
  128. package/src/data/regulation/jurisdiction-data.test.ts +73 -0
  129. package/src/data/regulation/jurisdiction-data.ts +65 -0
  130. package/src/data/regulation/regulation-data.ts +19 -0
  131. package/src/data/regulation/regulation-loader.test.ts +107 -0
  132. package/src/data/regulation/regulation-loader.ts +56 -0
  133. package/src/data/scanner-constants.ts +46 -0
  134. package/src/data/schemas/schemas-core.ts +140 -0
  135. package/src/data/schemas/schemas-supplementary.ts +211 -0
  136. package/src/data/schemas/schemas.ts +28 -0
  137. package/src/data/security/attack-probes.test.ts +62 -0
  138. package/src/data/security/attack-probes.ts +496 -0
  139. package/src/data/security/eu-ai-act-security.ts +40 -0
  140. package/src/data/security/index.ts +19 -0
  141. package/src/data/security/mitre-atlas.test.ts +43 -0
  142. package/src/data/security/mitre-atlas.ts +93 -0
  143. package/src/data/security/nist-ai-rmf.ts +43 -0
  144. package/src/data/security/owasp-llm-top10.test.ts +60 -0
  145. package/src/data/security/owasp-llm-top10.ts +138 -0
  146. package/src/data/template-registry.ts +53 -0
  147. package/src/data/tool-versions.json +22 -0
  148. package/src/domain/audit/audit-package.test.ts +152 -0
  149. package/src/domain/audit/audit-package.ts +166 -0
  150. package/src/domain/audit/audit-trail.test.ts +121 -0
  151. package/src/domain/audit/audit-trail.ts +174 -0
  152. package/src/domain/audit/index.ts +8 -0
  153. package/src/domain/audit/permissions-matrix.test.ts +136 -0
  154. package/src/domain/audit/permissions-matrix.ts +121 -0
  155. package/src/domain/certification/adversarial/bias-tests.ts +95 -0
  156. package/src/domain/certification/adversarial/evaluators.ts +304 -0
  157. package/src/domain/certification/adversarial/index.ts +11 -0
  158. package/src/domain/certification/adversarial/prompt-injection.ts +103 -0
  159. package/src/domain/certification/adversarial/safety-boundary.ts +132 -0
  160. package/src/domain/certification/aiuc1-readiness.test.ts +236 -0
  161. package/src/domain/certification/aiuc1-readiness.ts +298 -0
  162. package/src/domain/certification/aiuc1-requirements.ts +235 -0
  163. package/src/domain/certification/index.ts +10 -0
  164. package/src/domain/certification/redteam-runner.test.ts +97 -0
  165. package/src/domain/certification/redteam-runner.ts +205 -0
  166. package/src/domain/certification/test-runner.test.ts +232 -0
  167. package/src/domain/certification/test-runner.ts +289 -0
  168. package/src/domain/cost/cost-estimator.test.ts +187 -0
  169. package/src/domain/cost/cost-estimator.ts +133 -0
  170. package/src/domain/disclaimer.test.ts +52 -0
  171. package/src/domain/disclaimer.ts +39 -0
  172. package/src/domain/documents/ai-enricher.test.ts +120 -0
  173. package/src/domain/documents/ai-enricher.ts +159 -0
  174. package/src/domain/documents/document-generator.test.ts +318 -0
  175. package/src/domain/documents/document-generator.ts +239 -0
  176. package/src/domain/documents/index.ts +9 -0
  177. package/src/domain/documents/passport-helpers.ts +25 -0
  178. package/src/domain/documents/policy-generator.test.ts +252 -0
  179. package/src/domain/documents/policy-generator.ts +94 -0
  180. package/src/domain/documents/worker-notification-generator.test.ts +162 -0
  181. package/src/domain/documents/worker-notification-generator.ts +141 -0
  182. package/src/domain/eval/adapters/adapter-port.ts +94 -0
  183. package/src/domain/eval/adapters/adapters.test.ts +303 -0
  184. package/src/domain/eval/adapters/anthropic-adapter.ts +57 -0
  185. package/src/domain/eval/adapters/auto-detect.ts +104 -0
  186. package/src/domain/eval/adapters/create-chat-adapter.ts +106 -0
  187. package/src/domain/eval/adapters/custom-adapter.ts +74 -0
  188. package/src/domain/eval/adapters/http-adapter.ts +66 -0
  189. package/src/domain/eval/adapters/index.ts +7 -0
  190. package/src/domain/eval/adapters/ollama-adapter.ts +48 -0
  191. package/src/domain/eval/adapters/openai-adapter.ts +58 -0
  192. package/src/domain/eval/adapters/with-timeout.ts +25 -0
  193. package/src/domain/eval/conformity-score.test.ts +161 -0
  194. package/src/domain/eval/conformity-score.ts +135 -0
  195. package/src/domain/eval/eval-constants.ts +55 -0
  196. package/src/domain/eval/eval-evidence.test.ts +85 -0
  197. package/src/domain/eval/eval-evidence.ts +103 -0
  198. package/src/domain/eval/eval-fix-generator.test.ts +421 -0
  199. package/src/domain/eval/eval-fix-generator.ts +205 -0
  200. package/src/domain/eval/eval-passport.test.ts +82 -0
  201. package/src/domain/eval/eval-passport.ts +89 -0
  202. package/src/domain/eval/eval-remediation-report.test.ts +682 -0
  203. package/src/domain/eval/eval-remediation-report.ts +170 -0
  204. package/src/domain/eval/eval-report.ts +108 -0
  205. package/src/domain/eval/eval-runner.test.ts +609 -0
  206. package/src/domain/eval/eval-runner.ts +593 -0
  207. package/src/domain/eval/eval-to-findings.test.ts +293 -0
  208. package/src/domain/eval/eval-to-findings.ts +83 -0
  209. package/src/domain/eval/index.ts +31 -0
  210. package/src/domain/eval/llm-judge.test.ts +139 -0
  211. package/src/domain/eval/llm-judge.ts +168 -0
  212. package/src/domain/eval/remediation-types.ts +90 -0
  213. package/src/domain/eval/security-integration.test.ts +196 -0
  214. package/src/domain/eval/security-integration.ts +136 -0
  215. package/src/domain/eval/types.test.ts +173 -0
  216. package/src/domain/eval/types.ts +244 -0
  217. package/src/domain/eval/verdict-utils.ts +45 -0
  218. package/src/domain/fixer/create-fixer.ts +101 -0
  219. package/src/domain/fixer/diff.ts +70 -0
  220. package/src/domain/fixer/fix-history.ts +23 -0
  221. package/src/domain/fixer/fixer.test.ts +306 -0
  222. package/src/domain/fixer/index.ts +9 -0
  223. package/src/domain/fixer/strategies/bandit-fix.ts +61 -0
  224. package/src/domain/fixer/strategies/bias-testing.ts +49 -0
  225. package/src/domain/fixer/strategies/ci-compliance.ts +57 -0
  226. package/src/domain/fixer/strategies/content-marking.ts +45 -0
  227. package/src/domain/fixer/strategies/cve-upgrade.ts +66 -0
  228. package/src/domain/fixer/strategies/data-governance.ts +65 -0
  229. package/src/domain/fixer/strategies/disclosure.ts +69 -0
  230. package/src/domain/fixer/strategies/doc-code-sync.ts +53 -0
  231. package/src/domain/fixer/strategies/documentation.ts +59 -0
  232. package/src/domain/fixer/strategies/error-handler.ts +63 -0
  233. package/src/domain/fixer/strategies/hitl-gate.ts +67 -0
  234. package/src/domain/fixer/strategies/index.ts +61 -0
  235. package/src/domain/fixer/strategies/kill-switch-test.ts +85 -0
  236. package/src/domain/fixer/strategies/kill-switch.ts +53 -0
  237. package/src/domain/fixer/strategies/license-fix.ts +57 -0
  238. package/src/domain/fixer/strategies/log-retention.ts +40 -0
  239. package/src/domain/fixer/strategies/logging.ts +59 -0
  240. package/src/domain/fixer/strategies/metadata.ts +45 -0
  241. package/src/domain/fixer/strategies/permission-guard.ts +84 -0
  242. package/src/domain/fixer/strategies/record-keeping.ts +69 -0
  243. package/src/domain/fixer/strategies/secret-rotation.ts +52 -0
  244. package/src/domain/fixer/strategies.test.ts +341 -0
  245. package/src/domain/fixer/template-engine.test.ts +64 -0
  246. package/src/domain/fixer/template-engine.ts +38 -0
  247. package/src/domain/fixer/types.ts +88 -0
  248. package/src/domain/frameworks/aiuc1-framework.test.ts +159 -0
  249. package/src/domain/frameworks/aiuc1-framework.ts +126 -0
  250. package/src/domain/frameworks/collect-foundation-metrics.test.ts +96 -0
  251. package/src/domain/frameworks/collect-foundation-metrics.ts +34 -0
  252. package/src/domain/frameworks/eu-ai-act-framework.test.ts +117 -0
  253. package/src/domain/frameworks/eu-ai-act-framework.ts +100 -0
  254. package/src/domain/frameworks/framework-registry.test.ts +91 -0
  255. package/src/domain/frameworks/framework-registry.ts +38 -0
  256. package/src/domain/frameworks/index.ts +8 -0
  257. package/src/domain/frameworks/mitre-atlas-framework.test.ts +53 -0
  258. package/src/domain/frameworks/mitre-atlas-framework.ts +53 -0
  259. package/src/domain/frameworks/owasp-llm-framework.test.ts +77 -0
  260. package/src/domain/frameworks/owasp-llm-framework.ts +54 -0
  261. package/src/domain/frameworks/score-plugin-framework.ts +117 -0
  262. package/src/domain/fria/fria-generator.test.ts +273 -0
  263. package/src/domain/fria/fria-generator.ts +366 -0
  264. package/src/domain/import/promptfoo-importer.test.ts +103 -0
  265. package/src/domain/import/promptfoo-importer.ts +151 -0
  266. package/src/domain/onboarding/guided-onboarding.test.ts +144 -0
  267. package/src/domain/onboarding/guided-onboarding.ts +135 -0
  268. package/src/domain/passport/builder/domain-mapper.ts +9 -0
  269. package/src/domain/passport/builder/manifest-builder.test.ts +546 -0
  270. package/src/domain/passport/builder/manifest-builder.ts +535 -0
  271. package/src/domain/passport/builder/manifest-diff.test.ts +105 -0
  272. package/src/domain/passport/builder/manifest-diff.ts +89 -0
  273. package/src/domain/passport/builder/manifest-files.ts +17 -0
  274. package/src/domain/passport/crypto-signer.test.ts +93 -0
  275. package/src/domain/passport/crypto-signer.ts +157 -0
  276. package/src/domain/passport/discovery/agent-discovery.test.ts +296 -0
  277. package/src/domain/passport/discovery/agent-discovery.ts +325 -0
  278. package/src/domain/passport/discovery/autonomy-analyzer.test.ts +141 -0
  279. package/src/domain/passport/discovery/autonomy-analyzer.ts +113 -0
  280. package/src/domain/passport/discovery/permission-scanner.test.ts +191 -0
  281. package/src/domain/passport/discovery/permission-scanner.ts +414 -0
  282. package/src/domain/passport/export/a2a-mapper.ts +75 -0
  283. package/src/domain/passport/export/aiuc1-mapper.ts +126 -0
  284. package/src/domain/passport/export/export.test.ts +207 -0
  285. package/src/domain/passport/export/index.ts +41 -0
  286. package/src/domain/passport/export/nist-mapper.ts +227 -0
  287. package/src/domain/passport/import/a2a-importer.test.ts +133 -0
  288. package/src/domain/passport/import/a2a-importer.ts +156 -0
  289. package/src/domain/passport/import/index.ts +2 -0
  290. package/src/domain/passport/index.ts +32 -0
  291. package/src/domain/passport/obligation-field-map.test.ts +113 -0
  292. package/src/domain/passport/obligation-field-map.ts +117 -0
  293. package/src/domain/passport/passport-validator.test.ts +156 -0
  294. package/src/domain/passport/passport-validator.ts +126 -0
  295. package/src/domain/passport/scan-to-compliance.test.ts +336 -0
  296. package/src/domain/passport/scan-to-compliance.ts +166 -0
  297. package/src/domain/passport/test-generator.test.ts +93 -0
  298. package/src/domain/passport/test-generator.ts +136 -0
  299. package/src/domain/proxy/index.ts +11 -0
  300. package/src/domain/proxy/json-rpc.test.ts +72 -0
  301. package/src/domain/proxy/json-rpc.ts +53 -0
  302. package/src/domain/proxy/policy-engine.test.ts +259 -0
  303. package/src/domain/proxy/policy-engine.ts +137 -0
  304. package/src/domain/proxy/proxy-bridge.ts +125 -0
  305. package/src/domain/proxy/proxy-interceptor.test.ts +184 -0
  306. package/src/domain/proxy/proxy-interceptor.ts +120 -0
  307. package/src/domain/proxy/proxy-types.ts +35 -0
  308. package/src/domain/registry/compute-agent-score.test.ts +279 -0
  309. package/src/domain/registry/compute-agent-score.ts +162 -0
  310. package/src/domain/reporter/audit-report.test.ts +87 -0
  311. package/src/domain/reporter/audit-report.ts +116 -0
  312. package/src/domain/reporter/badge-generator.test.ts +54 -0
  313. package/src/domain/reporter/badge-generator.ts +40 -0
  314. package/src/domain/reporter/compliance-md.ts +45 -0
  315. package/src/domain/reporter/index.ts +7 -0
  316. package/src/domain/reporter/pdf-renderer.ts +282 -0
  317. package/src/domain/reporter/share.test.ts +92 -0
  318. package/src/domain/reporter/share.ts +80 -0
  319. package/src/domain/scanner/ast/swc-analyzer.test.ts +49 -0
  320. package/src/domain/scanner/ast/swc-analyzer.ts +124 -0
  321. package/src/domain/scanner/attestations.ts +97 -0
  322. package/src/domain/scanner/checks/ai-disclosure.test.ts +90 -0
  323. package/src/domain/scanner/checks/ai-disclosure.ts +54 -0
  324. package/src/domain/scanner/checks/ai-literacy.ts +163 -0
  325. package/src/domain/scanner/checks/behavioral-constraints.test.ts +167 -0
  326. package/src/domain/scanner/checks/behavioral-constraints.ts +86 -0
  327. package/src/domain/scanner/checks/compliance-metadata.ts +63 -0
  328. package/src/domain/scanner/checks/content-marking.ts +74 -0
  329. package/src/domain/scanner/checks/dep-deep-scan.test.ts +318 -0
  330. package/src/domain/scanner/checks/dep-deep-scan.ts +137 -0
  331. package/src/domain/scanner/checks/documentation.test.ts +88 -0
  332. package/src/domain/scanner/checks/documentation.ts +79 -0
  333. package/src/domain/scanner/checks/git-history.test.ts +120 -0
  334. package/src/domain/scanner/checks/git-history.ts +163 -0
  335. package/src/domain/scanner/checks/gpai-systemic-risk.test.ts +84 -0
  336. package/src/domain/scanner/checks/gpai-systemic-risk.ts +98 -0
  337. package/src/domain/scanner/checks/gpai-transparency.ts +94 -0
  338. package/src/domain/scanner/checks/index.ts +28 -0
  339. package/src/domain/scanner/checks/industry/index.ts +40 -0
  340. package/src/domain/scanner/checks/industry/industry.test.ts +287 -0
  341. package/src/domain/scanner/checks/interaction-logging.test.ts +113 -0
  342. package/src/domain/scanner/checks/interaction-logging.ts +142 -0
  343. package/src/domain/scanner/checks/nhi-scanner.test.ts +158 -0
  344. package/src/domain/scanner/checks/nhi-scanner.ts +78 -0
  345. package/src/domain/scanner/checks/passport-completeness.test.ts +127 -0
  346. package/src/domain/scanner/checks/passport-completeness.ts +82 -0
  347. package/src/domain/scanner/checks/passport-presence.test.ts +56 -0
  348. package/src/domain/scanner/checks/passport-presence.ts +78 -0
  349. package/src/domain/scanner/checks/pattern-check-factory.ts +70 -0
  350. package/src/domain/scanner/checks/permission-scanner.test.ts +279 -0
  351. package/src/domain/scanner/checks/permission-scanner.ts +90 -0
  352. package/src/domain/scanner/checks/presence-check-factory.test.ts +124 -0
  353. package/src/domain/scanner/checks/presence-check-factory.ts +275 -0
  354. package/src/domain/scanner/compliance-diff.test.ts +165 -0
  355. package/src/domain/scanner/compliance-diff.ts +138 -0
  356. package/src/domain/scanner/confidence.test.ts +235 -0
  357. package/src/domain/scanner/confidence.ts +156 -0
  358. package/src/domain/scanner/constants.ts +13 -0
  359. package/src/domain/scanner/create-scanner.ts +573 -0
  360. package/src/domain/scanner/cross-layer.test.ts +372 -0
  361. package/src/domain/scanner/cross-layer.ts +232 -0
  362. package/src/domain/scanner/data/ai-packages.ts +82 -0
  363. package/src/domain/scanner/debt-calculator.test.ts +89 -0
  364. package/src/domain/scanner/debt-calculator.ts +111 -0
  365. package/src/domain/scanner/drift.test.ts +191 -0
  366. package/src/domain/scanner/drift.ts +73 -0
  367. package/src/domain/scanner/evidence-store.test.ts +207 -0
  368. package/src/domain/scanner/evidence-store.ts +195 -0
  369. package/src/domain/scanner/evidence.test.ts +104 -0
  370. package/src/domain/scanner/evidence.ts +71 -0
  371. package/src/domain/scanner/external/bandit-runner.test.ts +45 -0
  372. package/src/domain/scanner/external/bandit-runner.ts +90 -0
  373. package/src/domain/scanner/external/checks.ts +321 -0
  374. package/src/domain/scanner/external/dedup.test.ts +79 -0
  375. package/src/domain/scanner/external/dedup.ts +94 -0
  376. package/src/domain/scanner/external/detect-secrets-runner.test.ts +58 -0
  377. package/src/domain/scanner/external/detect-secrets-runner.ts +81 -0
  378. package/src/domain/scanner/external/external-scanner.test.ts +221 -0
  379. package/src/domain/scanner/external/external-scanner.ts +36 -0
  380. package/src/domain/scanner/external/finding-mapper.test.ts +95 -0
  381. package/src/domain/scanner/external/finding-mapper.ts +138 -0
  382. package/src/domain/scanner/external/index.ts +15 -0
  383. package/src/domain/scanner/external/mappings.ts +93 -0
  384. package/src/domain/scanner/external/modelscan-runner.test.ts +35 -0
  385. package/src/domain/scanner/external/modelscan-runner.ts +101 -0
  386. package/src/domain/scanner/external/path-utils.ts +8 -0
  387. package/src/domain/scanner/external/runner-port.ts +45 -0
  388. package/src/domain/scanner/external/semgrep-runner.test.ts +52 -0
  389. package/src/domain/scanner/external/semgrep-runner.ts +94 -0
  390. package/src/domain/scanner/external/types.ts +32 -0
  391. package/src/domain/scanner/finding-attribution.test.ts +444 -0
  392. package/src/domain/scanner/finding-attribution.ts +195 -0
  393. package/src/domain/scanner/finding-explainer.test.ts +157 -0
  394. package/src/domain/scanner/finding-explainer.ts +73 -0
  395. package/src/domain/scanner/fix-diff-builder.test.ts +272 -0
  396. package/src/domain/scanner/fix-diff-builder.ts +477 -0
  397. package/src/domain/scanner/import-graph.test.ts +162 -0
  398. package/src/domain/scanner/import-graph.ts +198 -0
  399. package/src/domain/scanner/languages/adapter.test.ts +105 -0
  400. package/src/domain/scanner/languages/adapter.ts +239 -0
  401. package/src/domain/scanner/layers/index.ts +24 -0
  402. package/src/domain/scanner/layers/layer1-files.ts +54 -0
  403. package/src/domain/scanner/layers/layer2-docs.test.ts +1207 -0
  404. package/src/domain/scanner/layers/layer2-docs.ts +297 -0
  405. package/src/domain/scanner/layers/layer2-parsing.ts +217 -0
  406. package/src/domain/scanner/layers/layer3-config.test.ts +187 -0
  407. package/src/domain/scanner/layers/layer3-config.ts +279 -0
  408. package/src/domain/scanner/layers/layer3-parsers.ts +73 -0
  409. package/src/domain/scanner/layers/layer4-patterns.test.ts +397 -0
  410. package/src/domain/scanner/layers/layer4-patterns.ts +216 -0
  411. package/src/domain/scanner/layers/layer5-docs.test.ts +99 -0
  412. package/src/domain/scanner/layers/layer5-docs.ts +250 -0
  413. package/src/domain/scanner/layers/layer5-llm.test.ts +146 -0
  414. package/src/domain/scanner/layers/layer5-llm.ts +262 -0
  415. package/src/domain/scanner/layers/layer5-targeted.test.ts +93 -0
  416. package/src/domain/scanner/layers/layer5-targeted.ts +233 -0
  417. package/src/domain/scanner/layers/lockfile-parsers.test.ts +320 -0
  418. package/src/domain/scanner/layers/lockfile-parsers.ts +184 -0
  419. package/src/domain/scanner/regulation-version.test.ts +54 -0
  420. package/src/domain/scanner/regulation-version.ts +23 -0
  421. package/src/domain/scanner/role-filter.test.ts +116 -0
  422. package/src/domain/scanner/role-filter.ts +51 -0
  423. package/src/domain/scanner/rules/banned-packages-data.ts +553 -0
  424. package/src/domain/scanner/rules/banned-packages-sdk.ts +65 -0
  425. package/src/domain/scanner/rules/banned-packages.test.ts +249 -0
  426. package/src/domain/scanner/rules/banned-packages.ts +55 -0
  427. package/src/domain/scanner/rules/comment-filter.test.ts +115 -0
  428. package/src/domain/scanner/rules/comment-filter.ts +297 -0
  429. package/src/domain/scanner/rules/index.ts +9 -0
  430. package/src/domain/scanner/rules/nhi-patterns.test.ts +128 -0
  431. package/src/domain/scanner/rules/nhi-patterns.ts +60 -0
  432. package/src/domain/scanner/rules/pattern-rules.ts +1152 -0
  433. package/src/domain/scanner/sbom.test.ts +136 -0
  434. package/src/domain/scanner/sbom.ts +103 -0
  435. package/src/domain/scanner/scan-cache.test.ts +136 -0
  436. package/src/domain/scanner/scan-cache.ts +115 -0
  437. package/src/domain/scanner/scanner.test.ts +125 -0
  438. package/src/domain/scanner/score-calculator.test.ts +363 -0
  439. package/src/domain/scanner/score-calculator.ts +189 -0
  440. package/src/domain/scanner/security-score.test.ts +107 -0
  441. package/src/domain/scanner/security-score.ts +116 -0
  442. package/src/domain/scanner/source-filter.ts +24 -0
  443. package/src/domain/scanner/validators.ts +223 -0
  444. package/src/domain/shared/compliance-constants.ts +48 -0
  445. package/src/domain/shared/disclosure-patterns.ts +16 -0
  446. package/src/domain/shared/index.ts +6 -0
  447. package/src/domain/shared/parse-dependencies.ts +21 -0
  448. package/src/domain/supply-chain/dependency-analyzer.ts +138 -0
  449. package/src/domain/supply-chain/index.ts +3 -0
  450. package/src/domain/supply-chain/supply-chain.test.ts +211 -0
  451. package/src/domain/supply-chain/types.ts +32 -0
  452. package/src/domain/whatif/config-fixer.ts +187 -0
  453. package/src/domain/whatif/index.ts +6 -0
  454. package/src/domain/whatif/scenario-engine.ts +121 -0
  455. package/src/domain/whatif/simulate-actions.test.ts +161 -0
  456. package/src/domain/whatif/simulate-actions.ts +114 -0
  457. package/src/domain/whatif/whatif.test.ts +135 -0
  458. package/src/e2e/gaps-e2e.test.ts +259 -0
  459. package/src/e2e/smoke.test.ts +101 -0
  460. package/src/hooks/hooks-export.test.ts +81 -0
  461. package/src/hooks/installer.ts +113 -0
  462. package/src/http/cors.test.ts +38 -0
  463. package/src/http/create-router.ts +259 -0
  464. package/src/http/routes/agent.route.ts +380 -0
  465. package/src/http/routes/audit.route.ts +66 -0
  466. package/src/http/routes/badge.route.ts +23 -0
  467. package/src/http/routes/cert.route.ts +66 -0
  468. package/src/http/routes/chat.route.ts +228 -0
  469. package/src/http/routes/cost.route.ts +33 -0
  470. package/src/http/routes/debt.route.ts +29 -0
  471. package/src/http/routes/disclaimer.route.ts +64 -0
  472. package/src/http/routes/eval.route.ts +161 -0
  473. package/src/http/routes/events.route.test.ts +108 -0
  474. package/src/http/routes/events.route.ts +71 -0
  475. package/src/http/routes/external-scan.route.ts +24 -0
  476. package/src/http/routes/file.route.ts +54 -0
  477. package/src/http/routes/fix.route.ts +219 -0
  478. package/src/http/routes/frameworks.route.test.ts +66 -0
  479. package/src/http/routes/frameworks.route.ts +36 -0
  480. package/src/http/routes/git.route.ts +27 -0
  481. package/src/http/routes/guided-onboarding.route.ts +65 -0
  482. package/src/http/routes/import.route.ts +64 -0
  483. package/src/http/routes/jurisdiction.route.ts +22 -0
  484. package/src/http/routes/obligations.route.test.ts +122 -0
  485. package/src/http/routes/obligations.route.ts +110 -0
  486. package/src/http/routes/onboarding.route.ts +53 -0
  487. package/src/http/routes/provider.route.ts +42 -0
  488. package/src/http/routes/proxy.route.ts +40 -0
  489. package/src/http/routes/redteam.route.ts +84 -0
  490. package/src/http/routes/report.route.ts +29 -0
  491. package/src/http/routes/scan.route.ts +104 -0
  492. package/src/http/routes/share.route.ts +44 -0
  493. package/src/http/routes/shell.route.ts +27 -0
  494. package/src/http/routes/status.route.ts +66 -0
  495. package/src/http/routes/supply-chain.route.ts +121 -0
  496. package/src/http/routes/sync.route.ts +328 -0
  497. package/src/http/routes/tools.route.ts +29 -0
  498. package/src/http/routes/whatif.route.ts +96 -0
  499. package/src/http/utils/validation.ts +31 -0
  500. package/src/index.ts +1 -0
  501. package/src/infra/bundle-fetcher.ts +77 -0
  502. package/src/infra/cache-storage.ts +34 -0
  503. package/src/infra/event-bus.ts +31 -0
  504. package/src/infra/file-collector.ts +61 -0
  505. package/src/infra/file-ops-adapter.ts +95 -0
  506. package/src/infra/file-watcher.test.ts +90 -0
  507. package/src/infra/file-watcher.ts +106 -0
  508. package/src/infra/git-adapter.ts +93 -0
  509. package/src/infra/git-history-adapter.ts +41 -0
  510. package/src/infra/headless-browser.ts +178 -0
  511. package/src/infra/llm-adapter.test.ts +83 -0
  512. package/src/infra/llm-adapter.ts +86 -0
  513. package/src/infra/logger.ts +27 -0
  514. package/src/infra/project-config.test.ts +74 -0
  515. package/src/infra/project-config.ts +35 -0
  516. package/src/infra/rate-limiter.test.ts +36 -0
  517. package/src/infra/rate-limiter.ts +34 -0
  518. package/src/infra/retry.ts +46 -0
  519. package/src/infra/saas-client.ts +123 -0
  520. package/src/infra/search-adapter.ts +113 -0
  521. package/src/infra/shell-adapter.ts +68 -0
  522. package/src/infra/tool-manager.test.ts +99 -0
  523. package/src/infra/tool-manager.ts +197 -0
  524. package/src/llm/agents/agent-modes.test.ts +44 -0
  525. package/src/llm/agents/modes.ts +68 -0
  526. package/src/llm/routing/cost-routing.test.ts +37 -0
  527. package/src/llm/routing/cost-tracker.ts +74 -0
  528. package/src/llm/routing/model-routing.test.ts +79 -0
  529. package/src/llm/routing/model-routing.ts +38 -0
  530. package/src/llm/routing/pricing.ts +19 -0
  531. package/src/llm/sse-protocol.ts +77 -0
  532. package/src/llm/tool-definitions.ts +83 -0
  533. package/src/llm/tool-executors.ts +80 -0
  534. package/src/llm/tools/types.ts +13 -0
  535. package/src/mcp/create-mcp-stack.ts +82 -0
  536. package/src/mcp/handlers.ts +245 -0
  537. package/src/mcp/index.ts +28 -0
  538. package/src/mcp/mcp-server.test.ts +80 -0
  539. package/src/mcp/server.ts +79 -0
  540. package/src/mcp/tools.ts +48 -0
  541. package/src/onboarding/auto-detect.ts +164 -0
  542. package/src/onboarding/onboarding.test.ts +89 -0
  543. package/src/onboarding/profile.ts +169 -0
  544. package/src/onboarding/questions.ts +112 -0
  545. package/src/onboarding/wizard.ts +66 -0
  546. package/src/output/github-issue.ts +32 -0
  547. package/src/output/json-output.ts +67 -0
  548. package/src/ports/browser.port.ts +23 -0
  549. package/src/ports/events.port.ts +28 -0
  550. package/src/ports/llm.port.ts +23 -0
  551. package/src/ports/logger.port.ts +6 -0
  552. package/src/ports/process.port.ts +6 -0
  553. package/src/ports/scanner.port.ts +15 -0
  554. package/src/server.ts +134 -0
  555. package/src/services/badge-service.ts +67 -0
  556. package/src/services/chat-service.test.ts +162 -0
  557. package/src/services/chat-service.ts +152 -0
  558. package/src/services/cost-service.ts +52 -0
  559. package/src/services/debt-service.ts +65 -0
  560. package/src/services/eval-integration.test.ts +132 -0
  561. package/src/services/eval-service.test.ts +373 -0
  562. package/src/services/eval-service.ts +463 -0
  563. package/src/services/external-scan-service.ts +60 -0
  564. package/src/services/file-service.ts +37 -0
  565. package/src/services/fix-service.test.ts +470 -0
  566. package/src/services/fix-service.ts +648 -0
  567. package/src/services/framework-service.test.ts +159 -0
  568. package/src/services/framework-service.ts +67 -0
  569. package/src/services/onboarding-service.ts +165 -0
  570. package/src/services/passport-audit.ts +244 -0
  571. package/src/services/passport-documents.ts +258 -0
  572. package/src/services/passport-service-utils.ts +72 -0
  573. package/src/services/passport-service.test.ts +251 -0
  574. package/src/services/passport-service.ts +339 -0
  575. package/src/services/proxy-service.ts +81 -0
  576. package/src/services/report-service.ts +72 -0
  577. package/src/services/scan-service.test.ts +470 -0
  578. package/src/services/scan-service.ts +335 -0
  579. package/src/services/share-service.ts +108 -0
  580. package/src/services/shared/backup.ts +23 -0
  581. package/src/services/status-service.ts +38 -0
  582. package/src/services/undo-service.test.ts +190 -0
  583. package/src/services/undo-service.ts +144 -0
  584. package/src/test-helpers/factories.ts +116 -0
  585. package/src/types/common.schemas.ts +147 -0
  586. package/src/types/common.types.ts +292 -0
  587. package/src/types/contract.test.ts +217 -0
  588. package/src/types/errors.ts +52 -0
  589. package/src/types/framework.types.ts +87 -0
  590. package/src/types/passport-schemas.ts +241 -0
  591. package/src/types/passport.types.ts +296 -0
  592. package/src/version.ts +1 -0
  593. package/tsconfig.json +20 -0
  594. package/vitest.config.ts +9 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * EU AI Act Security Mappings — extracted from Promptfoo (MIT License).
3
+ * Data source: promptfoo/src/redteam/constants/frameworks.ts
4
+ *
5
+ * Art. 5 (Prohibited practices) + Annex III (High-risk use-cases).
6
+ * Zero runtime dependency on Promptfoo.
7
+ */
8
+
9
+ import type { Severity } from '../../types/common.types.js';
10
+
11
+ export interface EuAiActSecurityEntry {
12
+ readonly id: string;
13
+ readonly euId: string;
14
+ readonly name: string;
15
+ readonly description: string;
16
+ readonly category: 'art5-prohibited' | 'annex3-high-risk';
17
+ readonly severity: Severity;
18
+ readonly plugins: readonly string[];
19
+ readonly strategies: readonly string[];
20
+ }
21
+
22
+ export const EU_AI_ACT_SECURITY_ENTRIES: readonly EuAiActSecurityEntry[] = Object.freeze([
23
+ // Art. 5 — Prohibited practices
24
+ { id: 'EU-SEC-01', euId: 'eu:ai-act:art5:subliminal-manipulation', name: 'Subliminal Manipulation', description: 'Art. 5(1)(a) — tests for goal hijacking, intent manipulation, excessive agency, and misinformation.', category: 'art5-prohibited', severity: 'critical', plugins: ['hijacking', 'intent', 'excessive-agency', 'harmful:misinformation-disinformation'], strategies: ['jailbreak', 'jailbreak:tree', 'jailbreak:composite', 'jailbreak-templates'] },
25
+ { id: 'EU-SEC-02', euId: 'eu:ai-act:art5:exploitation-of-vulnerabilities', name: 'Exploitation of Vulnerabilities', description: 'Art. 5(1)(b) — targets age, disability, social/economic situation.', category: 'art5-prohibited', severity: 'critical', plugins: ['hijacking', 'imitation', 'harmful:misinformation-disinformation', 'bias:age', 'bias:disability'], strategies: ['jailbreak'] },
26
+ { id: 'EU-SEC-03', euId: 'eu:ai-act:art5:social-scoring', name: 'Social Scoring', description: 'Art. 5(1)(c) — discriminatory classification of persons.', category: 'art5-prohibited', severity: 'critical', plugins: ['harmful:misinformation-disinformation', 'overreliance', 'bias:age', 'bias:gender', 'bias:race', 'bias:disability'], strategies: [] },
27
+ { id: 'EU-SEC-04', euId: 'eu:ai-act:art5:biometric-categorisation', name: 'Biometric Categorisation', description: 'Art. 5(1)(g) — biometric categorisation by sensitive characteristics.', category: 'art5-prohibited', severity: 'critical', plugins: ['pii:direct', 'pii:session', 'harmful:privacy'], strategies: [] },
28
+ { id: 'EU-SEC-05', euId: 'eu:ai-act:art5:remote-biometric-id-live', name: 'Remote Biometric ID (Live)', description: 'Art. 5(1)(h) — real-time remote biometric identification.', category: 'art5-prohibited', severity: 'critical', plugins: ['pii:session', 'pii:direct', 'harmful:privacy'], strategies: [] },
29
+ { id: 'EU-SEC-06', euId: 'eu:ai-act:art5:remote-biometric-id-post', name: 'Remote Biometric ID (Post)', description: 'Art. 5(1)(h) — post remote biometric identification.', category: 'art5-prohibited', severity: 'critical', plugins: ['pii:api-db', 'pii:direct', 'harmful:privacy'], strategies: [] },
30
+
31
+ // Annex III — High-risk use-cases
32
+ { id: 'EU-SEC-07', euId: 'eu:ai-act:annex3:biometric-id', name: 'Biometric Identification', description: 'Annex III §1 — biometric identification and categorisation.', category: 'annex3-high-risk', severity: 'high', plugins: ['pii:direct', 'pii:session', 'harmful:privacy'], strategies: [] },
33
+ { id: 'EU-SEC-08', euId: 'eu:ai-act:annex3:critical-infrastructure', name: 'Critical Infrastructure', description: 'Annex III §2 — management of critical digital infrastructure.', category: 'annex3-high-risk', severity: 'critical', plugins: ['shell-injection', 'sql-injection', 'ssrf', 'excessive-agency'], strategies: ['jailbreak', 'jailbreak-templates'] },
34
+ { id: 'EU-SEC-09', euId: 'eu:ai-act:annex3:education', name: 'Education', description: 'Annex III §3 — access to education, learning outcomes.', category: 'annex3-high-risk', severity: 'high', plugins: ['harmful:misinformation-disinformation', 'hallucination', 'overreliance', 'bias:race', 'bias:gender', 'bias:disability'], strategies: [] },
35
+ { id: 'EU-SEC-10', euId: 'eu:ai-act:annex3:employment', name: 'Employment', description: 'Annex III §4 — recruitment, selection, promotion, termination.', category: 'annex3-high-risk', severity: 'high', plugins: ['imitation', 'pii:direct', 'overreliance', 'bias:gender', 'bias:race', 'bias:age', 'bias:disability'], strategies: [] },
36
+ { id: 'EU-SEC-11', euId: 'eu:ai-act:annex3:essential-services', name: 'Essential Services', description: 'Annex III §5 — creditworthiness, emergency dispatch, public services.', category: 'annex3-high-risk', severity: 'high', plugins: ['pii:direct', 'pii:session', 'excessive-agency', 'bias:race', 'bias:gender'], strategies: [] },
37
+ { id: 'EU-SEC-12', euId: 'eu:ai-act:annex3:law-enforcement', name: 'Law Enforcement', description: 'Annex III §6 — risk assessments, profiling, evidence evaluation.', category: 'annex3-high-risk', severity: 'high', plugins: ['pii:direct', 'pii:api-db', 'harmful:privacy', 'bias:race'], strategies: [] },
38
+ { id: 'EU-SEC-13', euId: 'eu:ai-act:annex3:migration-border', name: 'Migration & Border', description: 'Annex III §7 — verification, risk assessments, document authenticity.', category: 'annex3-high-risk', severity: 'high', plugins: ['pii:direct', 'harmful:hate', 'harmful:privacy', 'bias:race'], strategies: [] },
39
+ { id: 'EU-SEC-14', euId: 'eu:ai-act:annex3:justice-democracy', name: 'Justice & Democracy', description: 'Annex III §8 — interpreting facts/law, applying law to facts.', category: 'annex3-high-risk', severity: 'high', plugins: ['hallucination', 'harmful:misinformation-disinformation', 'pii:direct', 'bias:race', 'bias:gender'], strategies: [] },
40
+ ]);
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Security data barrel — re-exports all security framework data.
3
+ * Data extracted from Promptfoo (MIT License), zero runtime dependency.
4
+ */
5
+
6
+ export { OWASP_LLM_TOP_10, getOwaspCategory, getOwaspCategoryByOwaspId, getOwaspCategoriesForPlugin } from './owasp-llm-top10.js';
7
+ export type { OwaspLlmCategory } from './owasp-llm-top10.js';
8
+
9
+ export { MITRE_ATLAS_TACTICS, getMitreAtlasTactic, getMitreAtlasByMitreId } from './mitre-atlas.js';
10
+ export type { MitreAtlasTactic } from './mitre-atlas.js';
11
+
12
+ export { NIST_AI_RMF_SUBCATEGORIES } from './nist-ai-rmf.js';
13
+ export type { NistAiRmfSubcategory } from './nist-ai-rmf.js';
14
+
15
+ export { EU_AI_ACT_SECURITY_ENTRIES } from './eu-ai-act-security.js';
16
+ export type { EuAiActSecurityEntry } from './eu-ai-act-security.js';
17
+
18
+ export { ATTACK_PROBES, getProbesByCategory, getProbesByPlugin, getProbesBySeverity, probeCountByCategory } from './attack-probes.js';
19
+ export type { AttackProbe } from './attack-probes.js';
@@ -0,0 +1,43 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { MITRE_ATLAS_TACTICS, getMitreAtlasTactic, getMitreAtlasByMitreId } from './mitre-atlas.js';
3
+
4
+ describe('MITRE ATLAS data', () => {
5
+ it('has 6 tactics', () => {
6
+ expect(MITRE_ATLAS_TACTICS).toHaveLength(6);
7
+ });
8
+
9
+ it('has unique IDs', () => {
10
+ const ids = MITRE_ATLAS_TACTICS.map((t) => t.id);
11
+ expect(new Set(ids).size).toBe(6);
12
+ });
13
+
14
+ it('has unique mitreIds', () => {
15
+ const ids = MITRE_ATLAS_TACTICS.map((t) => t.mitreId);
16
+ expect(new Set(ids).size).toBe(6);
17
+ });
18
+
19
+ it('all tactics have valid severity', () => {
20
+ const validSeverities = ['critical', 'high', 'medium', 'low', 'info'];
21
+ for (const t of MITRE_ATLAS_TACTICS) {
22
+ expect(validSeverities).toContain(t.severity);
23
+ }
24
+ });
25
+
26
+ it('all tactics have plugins', () => {
27
+ for (const t of MITRE_ATLAS_TACTICS) {
28
+ expect(t.plugins.length).toBeGreaterThan(0);
29
+ }
30
+ });
31
+
32
+ it('getMitreAtlasTactic finds by ID', () => {
33
+ const t = getMitreAtlasTactic('AML.TA0003');
34
+ expect(t).toBeDefined();
35
+ expect(t!.name).toBe('Initial Access');
36
+ });
37
+
38
+ it('getMitreAtlasByMitreId finds by mitreId', () => {
39
+ const t = getMitreAtlasByMitreId('mitre:atlas:exfiltration');
40
+ expect(t).toBeDefined();
41
+ expect(t!.name).toBe('Exfiltration');
42
+ });
43
+ });
@@ -0,0 +1,93 @@
1
+ /**
2
+ * MITRE ATLAS Tactics — extracted from Promptfoo (MIT License).
3
+ * Data source: promptfoo/src/redteam/constants/frameworks.ts
4
+ *
5
+ * Zero runtime dependency on Promptfoo. Static data only.
6
+ */
7
+
8
+ import type { Severity } from '../../types/common.types.js';
9
+
10
+ export interface MitreAtlasTactic {
11
+ readonly id: string;
12
+ readonly mitreId: string;
13
+ readonly name: string;
14
+ readonly tactic: string;
15
+ readonly description: string;
16
+ readonly severity: Severity;
17
+ readonly plugins: readonly string[];
18
+ readonly obligationIds: readonly string[];
19
+ }
20
+
21
+ /**
22
+ * MITRE ATLAS tactics with Promptfoo plugin mappings and EU AI Act obligation cross-references.
23
+ */
24
+ export const MITRE_ATLAS_TACTICS: readonly MitreAtlasTactic[] = Object.freeze([
25
+ {
26
+ id: 'AML.TA0001',
27
+ mitreId: 'mitre:atlas:reconnaissance',
28
+ name: 'Reconnaissance',
29
+ tactic: 'reconnaissance',
30
+ description: 'Tests for enumeration of competitors, policy extraction, system prompt disclosure, and role-based access control bypass to gather intelligence about the target system.',
31
+ severity: 'medium',
32
+ plugins: ['competitors', 'policy', 'prompt-extraction', 'rbac'],
33
+ obligationIds: ['OBL-22'],
34
+ },
35
+ {
36
+ id: 'AML.TA0002',
37
+ mitreId: 'mitre:atlas:resource-development',
38
+ name: 'Resource Development',
39
+ tactic: 'resource-development',
40
+ description: 'Tests for cybercrime content, illegal drug information, and weapons-related content that could be used for attack resource development.',
41
+ severity: 'high',
42
+ plugins: ['harmful:cybercrime', 'harmful:illegal-drugs', 'harmful:indiscriminate-weapons'],
43
+ obligationIds: ['OBL-1', 'OBL-2', 'OBL-3'],
44
+ },
45
+ {
46
+ id: 'AML.TA0003',
47
+ mitreId: 'mitre:atlas:initial-access',
48
+ name: 'Initial Access',
49
+ tactic: 'initial-access',
50
+ description: 'Tests for debug interface exposure, cybercrime exploitation, command injection, SQL injection, and SSRF vulnerabilities as initial access vectors.',
51
+ severity: 'critical',
52
+ plugins: ['debug-access', 'harmful:cybercrime', 'shell-injection', 'sql-injection', 'ssrf'],
53
+ obligationIds: ['OBL-22', 'OBL-67'],
54
+ },
55
+ {
56
+ id: 'AML.TA0004',
57
+ mitreId: 'mitre:atlas:ml-attack-staging',
58
+ name: 'ML Attack Staging',
59
+ tactic: 'ml-attack-staging',
60
+ description: 'Tests for ASCII smuggling, excessive agency exploitation, hallucination induction, and indirect prompt injection for staging ML-specific attacks.',
61
+ severity: 'high',
62
+ plugins: ['ascii-smuggling', 'excessive-agency', 'hallucination', 'indirect-prompt-injection'],
63
+ obligationIds: ['OBL-22', 'OBL-23'],
64
+ },
65
+ {
66
+ id: 'AML.TA0005',
67
+ mitreId: 'mitre:atlas:exfiltration',
68
+ name: 'Exfiltration',
69
+ tactic: 'exfiltration',
70
+ description: 'Tests for data exfiltration via ASCII smuggling, privacy violations, indirect prompt injection, PII exposure through multiple vectors, and system prompt extraction.',
71
+ severity: 'critical',
72
+ plugins: ['ascii-smuggling', 'harmful:privacy', 'indirect-prompt-injection', 'pii:api-db', 'pii:direct', 'pii:session', 'pii:social', 'prompt-extraction'],
73
+ obligationIds: ['OBL-24', 'OBL-25', 'OBL-69'],
74
+ },
75
+ {
76
+ id: 'AML.TA0006',
77
+ mitreId: 'mitre:atlas:impact',
78
+ name: 'Impact',
79
+ tactic: 'impact',
80
+ description: 'Tests for excessive agency exploitation, malicious content generation, resource hijacking, and entity impersonation to measure potential impact of successful attacks.',
81
+ severity: 'high',
82
+ plugins: ['excessive-agency', 'harmful', 'hijacking', 'imitation'],
83
+ obligationIds: ['OBL-14', 'OBL-15'],
84
+ },
85
+ ]);
86
+
87
+ /** Lookup a tactic by short ID (e.g. 'AML.TA0001'). */
88
+ export const getMitreAtlasTactic = (id: string): MitreAtlasTactic | undefined =>
89
+ MITRE_ATLAS_TACTICS.find((t) => t.id === id);
90
+
91
+ /** Lookup by mitreId (e.g. 'mitre:atlas:reconnaissance'). */
92
+ export const getMitreAtlasByMitreId = (mitreId: string): MitreAtlasTactic | undefined =>
93
+ MITRE_ATLAS_TACTICS.find((t) => t.mitreId === mitreId);
@@ -0,0 +1,43 @@
1
+ /**
2
+ * NIST AI RMF (Risk Management Framework) — extracted from Promptfoo (MIT License).
3
+ * Data source: promptfoo/src/redteam/constants/frameworks.ts
4
+ *
5
+ * 21 subcategories under the MEASURE function.
6
+ * Zero runtime dependency on Promptfoo.
7
+ */
8
+
9
+ import type { Severity } from '../../types/common.types.js';
10
+
11
+ export interface NistAiRmfSubcategory {
12
+ readonly id: string;
13
+ readonly nistId: string;
14
+ readonly name: string;
15
+ readonly description: string;
16
+ readonly severity: Severity;
17
+ readonly plugins: readonly string[];
18
+ readonly strategies: readonly string[];
19
+ }
20
+
21
+ export const NIST_AI_RMF_SUBCATEGORIES: readonly NistAiRmfSubcategory[] = Object.freeze([
22
+ { id: 'MEASURE-1.1', nistId: 'nist:ai:measure:1.1', name: 'Appropriate methods & metrics', description: 'Tests excessive agency and misinformation handling.', severity: 'medium', plugins: ['excessive-agency', 'harmful:misinformation-disinformation'], strategies: ['jailbreak', 'jailbreak-templates'] },
23
+ { id: 'MEASURE-1.2', nistId: 'nist:ai:measure:1.2', name: 'Computational evaluation of AI system', description: 'Tests excessive agency and misinformation handling.', severity: 'medium', plugins: ['excessive-agency', 'harmful:misinformation-disinformation'], strategies: ['jailbreak', 'jailbreak-templates'] },
24
+ { id: 'MEASURE-2.1', nistId: 'nist:ai:measure:2.1', name: 'Privacy risk', description: 'Tests for PII exposure and privacy violations.', severity: 'high', plugins: ['harmful:privacy', 'pii:api-db', 'pii:direct', 'pii:session', 'pii:social'], strategies: [] },
25
+ { id: 'MEASURE-2.2', nistId: 'nist:ai:measure:2.2', name: 'Privacy values', description: 'Tests for PII exposure and privacy violations.', severity: 'high', plugins: ['harmful:privacy', 'pii:api-db', 'pii:direct', 'pii:session', 'pii:social'], strategies: [] },
26
+ { id: 'MEASURE-2.3', nistId: 'nist:ai:measure:2.3', name: 'AI system performance', description: 'Tests for excessive agency.', severity: 'medium', plugins: ['excessive-agency'], strategies: [] },
27
+ { id: 'MEASURE-2.4', nistId: 'nist:ai:measure:2.4', name: 'Bias, equity, and fairness', description: 'Tests excessive agency and misinformation handling.', severity: 'medium', plugins: ['excessive-agency', 'harmful:misinformation-disinformation'], strategies: ['jailbreak', 'jailbreak-templates'] },
28
+ { id: 'MEASURE-2.5', nistId: 'nist:ai:measure:2.5', name: 'AI system trustworthiness', description: 'Tests for excessive agency.', severity: 'medium', plugins: ['excessive-agency'], strategies: [] },
29
+ { id: 'MEASURE-2.6', nistId: 'nist:ai:measure:2.6', name: 'Safety measurement', description: 'Tests for WMD content, weapons, and unsafe practices.', severity: 'high', plugins: ['harmful:chemical-biological-weapons', 'harmful:indiscriminate-weapons', 'harmful:unsafe-practices'], strategies: [] },
30
+ { id: 'MEASURE-2.7', nistId: 'nist:ai:measure:2.7', name: 'Cybersecurity', description: 'Tests for cybercrime, command injection, and SQL injection.', severity: 'high', plugins: ['harmful:cybercrime', 'shell-injection', 'sql-injection'], strategies: ['jailbreak', 'jailbreak-templates'] },
31
+ { id: 'MEASURE-2.8', nistId: 'nist:ai:measure:2.8', name: 'Access control', description: 'Tests BFLA, BOLA, and RBAC implementations.', severity: 'high', plugins: ['bfla', 'bola', 'rbac'], strategies: [] },
32
+ { id: 'MEASURE-2.9', nistId: 'nist:ai:measure:2.9', name: 'Human oversight', description: 'Tests for excessive agency.', severity: 'medium', plugins: ['excessive-agency'], strategies: [] },
33
+ { id: 'MEASURE-2.10', nistId: 'nist:ai:measure:2.10', name: 'Privacy measurement', description: 'Tests for PII exposure and privacy violations.', severity: 'high', plugins: ['harmful:privacy', 'pii:api-db', 'pii:direct', 'pii:session', 'pii:social'], strategies: [] },
34
+ { id: 'MEASURE-2.11', nistId: 'nist:ai:measure:2.11', name: 'Fairness in AI', description: 'Tests for harassment, hate speech, and insults.', severity: 'medium', plugins: ['harmful:harassment-bullying', 'harmful:hate', 'harmful:insults'], strategies: [] },
35
+ { id: 'MEASURE-2.12', nistId: 'nist:ai:measure:2.12', name: 'Environmental impact', description: 'Environmental impact measurement (no automated tests).', severity: 'low', plugins: [], strategies: [] },
36
+ { id: 'MEASURE-2.13', nistId: 'nist:ai:measure:2.13', name: 'Explainability', description: 'Tests for excessive agency.', severity: 'medium', plugins: ['excessive-agency'], strategies: [] },
37
+ { id: 'MEASURE-3.1', nistId: 'nist:ai:measure:3.1', name: 'Risk monitoring', description: 'Tests excessive agency and misinformation handling.', severity: 'medium', plugins: ['excessive-agency', 'harmful:misinformation-disinformation'], strategies: ['jailbreak', 'jailbreak-templates'] },
38
+ { id: 'MEASURE-3.2', nistId: 'nist:ai:measure:3.2', name: 'Stakeholder feedback', description: 'Tests for excessive agency.', severity: 'low', plugins: ['excessive-agency'], strategies: [] },
39
+ { id: 'MEASURE-3.3', nistId: 'nist:ai:measure:3.3', name: 'Risk documentation', description: 'Tests for excessive agency.', severity: 'low', plugins: ['excessive-agency'], strategies: [] },
40
+ { id: 'MEASURE-4.1', nistId: 'nist:ai:measure:4.1', name: 'Post-deployment monitoring', description: 'Tests for excessive agency.', severity: 'medium', plugins: ['excessive-agency'], strategies: [] },
41
+ { id: 'MEASURE-4.2', nistId: 'nist:ai:measure:4.2', name: 'Deployment assessment', description: 'Tests excessive agency and misinformation handling.', severity: 'medium', plugins: ['excessive-agency', 'harmful:misinformation-disinformation'], strategies: [] },
42
+ { id: 'MEASURE-4.3', nistId: 'nist:ai:measure:4.3', name: 'Impact assessment', description: 'Tests for excessive agency.', severity: 'medium', plugins: ['excessive-agency'], strategies: [] },
43
+ ]);
@@ -0,0 +1,60 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { OWASP_LLM_TOP_10, getOwaspCategory, getOwaspCategoryByOwaspId, getOwaspCategoriesForPlugin } from './owasp-llm-top10.js';
3
+
4
+ describe('OWASP LLM Top 10 data', () => {
5
+ it('has exactly 10 categories', () => {
6
+ expect(OWASP_LLM_TOP_10).toHaveLength(10);
7
+ });
8
+
9
+ it('has unique IDs', () => {
10
+ const ids = OWASP_LLM_TOP_10.map((c) => c.id);
11
+ expect(new Set(ids).size).toBe(10);
12
+ });
13
+
14
+ it('has unique owaspIds', () => {
15
+ const ids = OWASP_LLM_TOP_10.map((c) => c.owaspId);
16
+ expect(new Set(ids).size).toBe(10);
17
+ });
18
+
19
+ it('IDs follow LLM01-LLM10 pattern', () => {
20
+ for (let i = 0; i < 10; i++) {
21
+ expect(OWASP_LLM_TOP_10[i]!.id).toBe(`LLM${String(i + 1).padStart(2, '0')}`);
22
+ }
23
+ });
24
+
25
+ it('all categories have valid severity', () => {
26
+ const validSeverities = ['critical', 'high', 'medium', 'low', 'info'];
27
+ for (const cat of OWASP_LLM_TOP_10) {
28
+ expect(validSeverities).toContain(cat.severity);
29
+ }
30
+ });
31
+
32
+ it('all categories have names and descriptions', () => {
33
+ for (const cat of OWASP_LLM_TOP_10) {
34
+ expect(cat.name.length).toBeGreaterThan(0);
35
+ expect(cat.description.length).toBeGreaterThan(0);
36
+ }
37
+ });
38
+
39
+ it('getOwaspCategory finds by ID', () => {
40
+ const cat = getOwaspCategory('LLM01');
41
+ expect(cat).toBeDefined();
42
+ expect(cat!.name).toBe('Prompt Injection');
43
+ });
44
+
45
+ it('getOwaspCategoryByOwaspId finds by owasp ID', () => {
46
+ const cat = getOwaspCategoryByOwaspId('owasp:llm:06');
47
+ expect(cat).toBeDefined();
48
+ expect(cat!.name).toBe('Excessive Agency');
49
+ });
50
+
51
+ it('getOwaspCategoriesForPlugin maps plugin to categories', () => {
52
+ const cats = getOwaspCategoriesForPlugin('prompt-extraction');
53
+ expect(cats.length).toBeGreaterThanOrEqual(1);
54
+ expect(cats.some((c) => c.id === 'LLM01')).toBe(true);
55
+ });
56
+
57
+ it('returns empty for unknown plugin', () => {
58
+ expect(getOwaspCategoriesForPlugin('nonexistent-plugin')).toHaveLength(0);
59
+ });
60
+ });
@@ -0,0 +1,138 @@
1
+ /**
2
+ * OWASP LLM Top 10 (2025) — extracted from Promptfoo (MIT License).
3
+ * Data source: promptfoo/src/redteam/constants/frameworks.ts + metadata.ts
4
+ *
5
+ * Zero runtime dependency on Promptfoo. Static data only.
6
+ */
7
+
8
+ import type { Severity } from '../../types/common.types.js';
9
+
10
+ export interface OwaspLlmCategory {
11
+ readonly id: string;
12
+ readonly owaspId: string;
13
+ readonly name: string;
14
+ readonly description: string;
15
+ readonly severity: Severity;
16
+ readonly plugins: readonly string[];
17
+ readonly strategies: readonly string[];
18
+ readonly obligationIds: readonly string[];
19
+ }
20
+
21
+ /**
22
+ * OWASP LLM Top 10 categories with Promptfoo plugin mappings,
23
+ * severity ratings, and EU AI Act obligation cross-references.
24
+ */
25
+ export const OWASP_LLM_TOP_10: readonly OwaspLlmCategory[] = Object.freeze([
26
+ {
27
+ id: 'LLM01',
28
+ owaspId: 'owasp:llm:01',
29
+ name: 'Prompt Injection',
30
+ description: 'Tests vulnerability to Unicode tag-based instruction smuggling, indirect prompt injection, system prompt extraction, and harmful content generation via prompt manipulation.',
31
+ severity: 'critical',
32
+ plugins: ['ascii-smuggling', 'indirect-prompt-injection', 'prompt-extraction', 'harmful'],
33
+ strategies: ['jailbreak', 'jailbreak-templates', 'jailbreak:composite'],
34
+ obligationIds: ['OBL-22', 'OBL-23', 'OBL-67'],
35
+ },
36
+ {
37
+ id: 'LLM02',
38
+ owaspId: 'owasp:llm:02',
39
+ name: 'Sensitive Information Disclosure',
40
+ description: 'Tests for PII exposure via API/database, direct exposure, session data leaks, social engineering vectors, privacy violations, cross-session data leakage, and system prompt disclosure.',
41
+ severity: 'high',
42
+ plugins: ['pii:api-db', 'pii:direct', 'pii:session', 'pii:social', 'harmful:privacy', 'cross-session-leak', 'prompt-extraction'],
43
+ strategies: ['jailbreak', 'jailbreak-templates', 'jailbreak:composite'],
44
+ obligationIds: ['OBL-24', 'OBL-25', 'OBL-69'],
45
+ },
46
+ {
47
+ id: 'LLM03',
48
+ owaspId: 'owasp:llm:03',
49
+ name: 'Supply Chain',
50
+ description: 'Tests for supply chain vulnerabilities in AI model dependencies, training data, and third-party integrations.',
51
+ severity: 'high',
52
+ plugins: [],
53
+ strategies: [],
54
+ obligationIds: ['OBL-41', 'OBL-42'],
55
+ },
56
+ {
57
+ id: 'LLM04',
58
+ owaspId: 'owasp:llm:04',
59
+ name: 'Data and Model Poisoning',
60
+ description: 'Tests for misinformation/disinformation handling, hate speech, bias across age/disability/gender/race dimensions, radicalization content, and unauthorized professional advice.',
61
+ severity: 'high',
62
+ plugins: ['harmful:misinformation-disinformation', 'harmful:hate', 'bias:age', 'bias:disability', 'bias:gender', 'bias:race', 'harmful:radicalization', 'harmful:specialized-advice'],
63
+ strategies: ['jailbreak', 'jailbreak-templates', 'jailbreak:composite'],
64
+ obligationIds: ['OBL-10', 'OBL-11', 'OBL-61'],
65
+ },
66
+ {
67
+ id: 'LLM05',
68
+ owaspId: 'owasp:llm:05',
69
+ name: 'Improper Output Handling',
70
+ description: 'Tests for command injection, SQL injection, SSRF, and debug interface exposure vulnerabilities in LLM output processing.',
71
+ severity: 'high',
72
+ plugins: ['shell-injection', 'sql-injection', 'ssrf', 'debug-access'],
73
+ strategies: ['jailbreak', 'jailbreak-templates'],
74
+ obligationIds: ['OBL-22', 'OBL-67'],
75
+ },
76
+ {
77
+ id: 'LLM06',
78
+ owaspId: 'owasp:llm:06',
79
+ name: 'Excessive Agency',
80
+ description: 'Tests for unauthorized actions beyond system boundaries, role-based access control failures, broken function/object-level authorization, and injection attacks enabling privilege escalation.',
81
+ severity: 'critical',
82
+ plugins: ['excessive-agency', 'rbac', 'bfla', 'bola', 'shell-injection', 'sql-injection', 'ssrf'],
83
+ strategies: ['jailbreak', 'jailbreak-templates', 'jailbreak:composite'],
84
+ obligationIds: ['OBL-14', 'OBL-15', 'OBL-64'],
85
+ },
86
+ {
87
+ id: 'LLM07',
88
+ owaspId: 'owasp:llm:07',
89
+ name: 'System Prompt Leakage',
90
+ description: 'Tests for system prompt disclosure, role-based access bypass, privacy violations, and PII exposure through various attack vectors targeting system configuration.',
91
+ severity: 'medium',
92
+ plugins: ['prompt-extraction', 'rbac', 'harmful:privacy', 'pii:api-db', 'pii:direct', 'pii:session', 'pii:social'],
93
+ strategies: ['jailbreak', 'jailbreak-templates', 'jailbreak:composite'],
94
+ obligationIds: ['OBL-22', 'OBL-24'],
95
+ },
96
+ {
97
+ id: 'LLM08',
98
+ owaspId: 'owasp:llm:08',
99
+ name: 'Vector and Embedding Weaknesses',
100
+ description: 'Tests for cross-session data leakage, privacy violations, and PII exposure through vector database and embedding system vulnerabilities.',
101
+ severity: 'medium',
102
+ plugins: ['cross-session-leak', 'harmful:privacy', 'pii:api-db', 'pii:direct', 'pii:session', 'pii:social'],
103
+ strategies: ['jailbreak', 'jailbreak-templates', 'jailbreak:composite'],
104
+ obligationIds: ['OBL-24', 'OBL-25'],
105
+ },
106
+ {
107
+ id: 'LLM09',
108
+ owaspId: 'owasp:llm:09',
109
+ name: 'Misinformation',
110
+ description: 'Tests for hallucination, overreliance on model assumptions, misinformation/disinformation campaigns, and unauthorized professional advice generation.',
111
+ severity: 'medium',
112
+ plugins: ['hallucination', 'overreliance', 'harmful:misinformation-disinformation', 'harmful:specialized-advice'],
113
+ strategies: ['jailbreak', 'jailbreak-templates', 'jailbreak:composite'],
114
+ obligationIds: ['OBL-13', 'OBL-62'],
115
+ },
116
+ {
117
+ id: 'LLM10',
118
+ owaspId: 'owasp:llm:10',
119
+ name: 'Unbounded Consumption',
120
+ description: 'Tests for training data leaks through repetitive pattern exploitation and computational resource exhaustion through excessive reasoning patterns.',
121
+ severity: 'low',
122
+ plugins: ['divergent-repetition', 'reasoning-dos'],
123
+ strategies: [],
124
+ obligationIds: ['OBL-67'],
125
+ },
126
+ ]);
127
+
128
+ /** Lookup a category by its short ID (e.g. 'LLM01'). */
129
+ export const getOwaspCategory = (id: string): OwaspLlmCategory | undefined =>
130
+ OWASP_LLM_TOP_10.find((c) => c.id === id);
131
+
132
+ /** Lookup a category by its owaspId (e.g. 'owasp:llm:01'). */
133
+ export const getOwaspCategoryByOwaspId = (owaspId: string): OwaspLlmCategory | undefined =>
134
+ OWASP_LLM_TOP_10.find((c) => c.owaspId === owaspId);
135
+
136
+ /** Map a Promptfoo plugin name to the OWASP category(ies) it belongs to. */
137
+ export const getOwaspCategoriesForPlugin = (pluginId: string): readonly OwaspLlmCategory[] =>
138
+ OWASP_LLM_TOP_10.filter((c) => c.plugins.includes(pluginId));
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Single source of truth for EU AI Act document templates.
3
+ * All template mappings (fixer, document-generator, passport-service)
4
+ * MUST derive from this registry to prevent duplication.
5
+ */
6
+
7
+ export interface TemplateRegistryEntry {
8
+ readonly docType: string;
9
+ readonly obligationId: string;
10
+ readonly article: string;
11
+ readonly templateFile: string;
12
+ readonly outputFile: string;
13
+ readonly description: string;
14
+ readonly docIdPrefix: string;
15
+ }
16
+
17
+ export const TEMPLATE_REGISTRY: readonly TemplateRegistryEntry[] = [
18
+ { docType: 'ai-literacy', obligationId: 'eu-ai-act-OBL-001', article: 'Art. 4', templateFile: 'ai-literacy.md', outputFile: 'docs/compliance/ai-literacy-policy.md', description: 'AI Literacy Policy', docIdPrefix: 'ALP' },
19
+ { docType: 'art5-screening', obligationId: 'eu-ai-act-OBL-002', article: 'Art. 5', templateFile: 'art5-screening.md', outputFile: 'docs/compliance/art5-screening-report.md', description: 'Article 5 Screening Report', docIdPrefix: 'ART5' },
20
+ { docType: 'technical-documentation', obligationId: 'eu-ai-act-OBL-005', article: 'Art. 11', templateFile: 'technical-documentation.md', outputFile: 'docs/compliance/technical-documentation.md', description: 'Technical Documentation', docIdPrefix: 'TDD' },
21
+ { docType: 'incident-report', obligationId: 'eu-ai-act-OBL-021', article: 'Art. 73', templateFile: 'incident-report.md', outputFile: 'docs/compliance/incident-report.md', description: 'Serious Incident Report', docIdPrefix: 'INC' },
22
+ { docType: 'declaration-of-conformity', obligationId: 'eu-ai-act-OBL-019', article: 'Art. 47', templateFile: 'declaration-of-conformity.md', outputFile: 'docs/compliance/declaration-of-conformity.md', description: 'Declaration of Conformity', docIdPrefix: 'DOC' },
23
+ { docType: 'monitoring-policy', obligationId: 'eu-ai-act-OBL-011', article: 'Art. 26', templateFile: 'monitoring-policy.md', outputFile: 'docs/compliance/monitoring-policy.md', description: 'Post-Market Monitoring Policy', docIdPrefix: 'MON' },
24
+ { docType: 'fria', obligationId: 'eu-ai-act-OBL-013', article: 'Art. 27', templateFile: 'fria.md', outputFile: 'docs/compliance/fria.md', description: 'Fundamental Rights Impact Assessment', docIdPrefix: 'FRIA' },
25
+ { docType: 'worker-notification', obligationId: 'eu-ai-act-OBL-012', article: 'Art. 26(7)', templateFile: 'worker-notification.md', outputFile: 'docs/compliance/worker-notification.md', description: 'Worker Notification', docIdPrefix: 'WRK' },
26
+ { docType: 'risk-management', obligationId: 'eu-ai-act-OBL-003', article: 'Art. 9', templateFile: 'risk-management-system.md', outputFile: 'docs/compliance/risk-management-system.md', description: 'Risk Management System', docIdPrefix: 'RMS' },
27
+ { docType: 'data-governance', obligationId: 'eu-ai-act-OBL-004', article: 'Art. 10', templateFile: 'data-governance.md', outputFile: 'docs/compliance/data-governance.md', description: 'Data Governance Policy', docIdPrefix: 'DGP' },
28
+ { docType: 'qms', obligationId: 'eu-ai-act-OBL-010', article: 'Art. 17', templateFile: 'qms.md', outputFile: 'docs/compliance/qms.md', description: 'Quality Management System', docIdPrefix: 'QMS' },
29
+ { docType: 'instructions-for-use', obligationId: 'eu-ai-act-OBL-007', article: 'Art. 13', templateFile: 'instructions-for-use.md', outputFile: 'docs/compliance/instructions-for-use.md', description: 'Instructions for Use', docIdPrefix: 'IFU' },
30
+ { docType: 'gpai-transparency', obligationId: 'eu-ai-act-OBL-022', article: 'Art. 53', templateFile: 'gpai-transparency.md', outputFile: 'docs/compliance/gpai-transparency.md', description: 'GPAI Transparency Documentation', docIdPrefix: 'GPAI' },
31
+ { docType: 'gpai-systemic-risk', obligationId: 'eu-ai-act-OBL-023', article: 'Art. 55', templateFile: 'gpai-systemic-risk.md', outputFile: 'docs/compliance/gpai-systemic-risk.md', description: 'GPAI Systemic Risk Assessment', docIdPrefix: 'GSR' },
32
+ ] as const;
33
+
34
+ /** Derive DocType union from registry. */
35
+ export type DocType = (typeof TEMPLATE_REGISTRY)[number]['docType'];
36
+
37
+ /** All doc types as array (for iteration). */
38
+ export const ALL_DOC_TYPES: readonly DocType[] = TEMPLATE_REGISTRY.map((e) => e.docType);
39
+
40
+ /** docType → templateFile mapping (for document-generator). */
41
+ export const TEMPLATE_FILE_MAP: Record<string, string> = Object.fromEntries(
42
+ TEMPLATE_REGISTRY.map((e) => [e.docType, e.templateFile]),
43
+ );
44
+
45
+ /** docType → docIdPrefix mapping (for document-generator). */
46
+ export const DOC_ID_PREFIX_MAP: Record<string, string> = Object.fromEntries(
47
+ TEMPLATE_REGISTRY.map((e) => [e.docType, e.docIdPrefix]),
48
+ );
49
+
50
+ /** docType → docId pattern mapping (for document-generator). */
51
+ export const DOC_ID_PATTERN_MAP: Record<string, string> = Object.fromEntries(
52
+ TEMPLATE_REGISTRY.map((e) => [e.docType, `${e.docIdPrefix}-[YYYY]-[NNN]`]),
53
+ );
@@ -0,0 +1,22 @@
1
+ {
2
+ "semgrep": {
3
+ "package": "semgrep",
4
+ "version": "1.67.0",
5
+ "description": "Lightweight static analysis for many languages"
6
+ },
7
+ "bandit": {
8
+ "package": "bandit",
9
+ "version": "1.7.8",
10
+ "description": "Python security linter (AST-based)"
11
+ },
12
+ "modelscan": {
13
+ "package": "modelscan",
14
+ "version": "0.8.1",
15
+ "description": "Scan ML models for unsafe operations"
16
+ },
17
+ "detect-secrets": {
18
+ "package": "detect-secrets",
19
+ "version": "1.4.0",
20
+ "description": "Detect secrets and credentials in code"
21
+ }
22
+ }