bps-kit 1.0.1 → 1.0.2

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 (368) hide show
  1. package/package.json +1 -1
  2. package/templates/.agents/agents/backend-specialist.md +263 -0
  3. package/templates/.agents/agents/code-archaeologist.md +106 -0
  4. package/templates/.agents/agents/database-architect.md +226 -0
  5. package/templates/.agents/agents/debugger.md +225 -0
  6. package/templates/.agents/agents/devops-engineer.md +242 -0
  7. package/templates/.agents/agents/documentation-writer.md +104 -0
  8. package/templates/.agents/agents/explorer-agent.md +73 -0
  9. package/templates/.agents/agents/frontend-specialist.md +593 -0
  10. package/templates/.agents/agents/game-developer.md +162 -0
  11. package/templates/.agents/agents/mobile-developer.md +377 -0
  12. package/templates/.agents/agents/orchestrator.md +416 -0
  13. package/templates/.agents/agents/penetration-tester.md +188 -0
  14. package/templates/.agents/agents/performance-optimizer.md +187 -0
  15. package/templates/.agents/agents/product-manager.md +112 -0
  16. package/templates/.agents/agents/product-owner.md +95 -0
  17. package/templates/.agents/agents/project-planner.md +406 -0
  18. package/templates/.agents/agents/qa-automation-engineer.md +103 -0
  19. package/templates/.agents/agents/security-auditor.md +170 -0
  20. package/templates/.agents/agents/seo-specialist.md +111 -0
  21. package/templates/.agents/agents/test-engineer.md +158 -0
  22. package/templates/.agents/rules/GEMINI.md +219 -0
  23. package/templates/.agents/scripts/auto_preview.py +148 -0
  24. package/templates/.agents/scripts/checklist.py +217 -0
  25. package/templates/.agents/scripts/session_manager.py +120 -0
  26. package/templates/.agents/scripts/verify_all.py +327 -0
  27. package/templates/.agents/workflows/brainstorm.md +113 -0
  28. package/templates/.agents/workflows/create.md +59 -0
  29. package/templates/.agents/workflows/debug.md +103 -0
  30. package/templates/.agents/workflows/deploy.md +176 -0
  31. package/templates/.agents/workflows/enhance.md +63 -0
  32. package/templates/.agents/workflows/orchestrate.md +237 -0
  33. package/templates/.agents/workflows/plan.md +89 -0
  34. package/templates/.agents/workflows/preview.md +81 -0
  35. package/templates/.agents/workflows/setup-brain.md +39 -0
  36. package/templates/.agents/workflows/status.md +86 -0
  37. package/templates/.agents/workflows/test.md +144 -0
  38. package/templates/.agents/workflows/ui-ux-pro-max.md +296 -0
  39. package/templates/skills_normal/api-patterns/scripts/api_validator.py +211 -0
  40. package/templates/skills_normal/database-design/scripts/schema_validator.py +172 -0
  41. package/templates/skills_normal/frontend-design/scripts/accessibility_checker.py +183 -0
  42. package/templates/skills_normal/frontend-design/scripts/ux_audit.py +722 -0
  43. package/templates/skills_normal/git-pushing/scripts/smart_commit.sh +19 -0
  44. package/templates/skills_normal/lint-and-validate/scripts/lint_runner.py +184 -0
  45. package/templates/skills_normal/lint-and-validate/scripts/type_coverage.py +173 -0
  46. package/templates/skills_normal/performance-profiling/scripts/lighthouse_audit.py +76 -0
  47. package/templates/skills_normal/senior-fullstack/scripts/code_quality_analyzer.py +114 -0
  48. package/templates/skills_normal/senior-fullstack/scripts/fullstack_scaffolder.py +114 -0
  49. package/templates/skills_normal/senior-fullstack/scripts/project_scaffolder.py +114 -0
  50. package/templates/skills_normal/seo-fundamentals/scripts/seo_checker.py +219 -0
  51. package/templates/skills_normal/testing-patterns/scripts/test_runner.py +219 -0
  52. package/templates/skills_normal/vulnerability-scanner/scripts/security_scan.py +458 -0
  53. package/templates/vault/007/scripts/config.py +472 -0
  54. package/templates/vault/007/scripts/full_audit.py +1306 -0
  55. package/templates/vault/007/scripts/quick_scan.py +481 -0
  56. package/templates/vault/007/scripts/requirements.txt +26 -0
  57. package/templates/vault/007/scripts/scanners/__init__.py +0 -0
  58. package/templates/vault/007/scripts/scanners/dependency_scanner.py +1305 -0
  59. package/templates/vault/007/scripts/scanners/injection_scanner.py +1104 -0
  60. package/templates/vault/007/scripts/scanners/secrets_scanner.py +1008 -0
  61. package/templates/vault/007/scripts/score_calculator.py +693 -0
  62. package/templates/vault/agent-orchestrator/scripts/match_skills.py +329 -0
  63. package/templates/vault/agent-orchestrator/scripts/orchestrate.py +304 -0
  64. package/templates/vault/agent-orchestrator/scripts/requirements.txt +1 -0
  65. package/templates/vault/agent-orchestrator/scripts/scan_registry.py +508 -0
  66. package/templates/vault/ai-studio-image/scripts/config.py +613 -0
  67. package/templates/vault/ai-studio-image/scripts/generate.py +630 -0
  68. package/templates/vault/ai-studio-image/scripts/prompt_engine.py +424 -0
  69. package/templates/vault/ai-studio-image/scripts/requirements.txt +4 -0
  70. package/templates/vault/ai-studio-image/scripts/templates.py +349 -0
  71. package/templates/vault/android_ui_verification/scripts/verify_ui.sh +32 -0
  72. package/templates/vault/apify-audience-analysis/reference/scripts/run_actor.js +363 -0
  73. package/templates/vault/apify-brand-reputation-monitoring/reference/scripts/run_actor.js +363 -0
  74. package/templates/vault/apify-competitor-intelligence/reference/scripts/run_actor.js +363 -0
  75. package/templates/vault/apify-content-analytics/reference/scripts/run_actor.js +363 -0
  76. package/templates/vault/apify-ecommerce/reference/scripts/package.json +3 -0
  77. package/templates/vault/apify-ecommerce/reference/scripts/run_actor.js +369 -0
  78. package/templates/vault/apify-influencer-discovery/reference/scripts/run_actor.js +363 -0
  79. package/templates/vault/apify-lead-generation/reference/scripts/run_actor.js +363 -0
  80. package/templates/vault/apify-market-research/reference/scripts/run_actor.js +363 -0
  81. package/templates/vault/apify-trend-analysis/reference/scripts/run_actor.js +363 -0
  82. package/templates/vault/apify-ultimate-scraper/reference/scripts/run_actor.js +363 -0
  83. package/templates/vault/audio-transcriber/scripts/install-requirements.sh +190 -0
  84. package/templates/vault/audio-transcriber/scripts/transcribe.py +486 -0
  85. package/templates/vault/claude-monitor/scripts/api_bench.py +240 -0
  86. package/templates/vault/claude-monitor/scripts/config.py +69 -0
  87. package/templates/vault/claude-monitor/scripts/health_check.py +362 -0
  88. package/templates/vault/claude-monitor/scripts/monitor.py +296 -0
  89. package/templates/vault/content-creator/scripts/brand_voice_analyzer.py +185 -0
  90. package/templates/vault/content-creator/scripts/seo_optimizer.py +419 -0
  91. package/templates/vault/context-agent/scripts/active_context.py +227 -0
  92. package/templates/vault/context-agent/scripts/compressor.py +149 -0
  93. package/templates/vault/context-agent/scripts/config.py +69 -0
  94. package/templates/vault/context-agent/scripts/context_loader.py +155 -0
  95. package/templates/vault/context-agent/scripts/context_manager.py +302 -0
  96. package/templates/vault/context-agent/scripts/models.py +103 -0
  97. package/templates/vault/context-agent/scripts/project_registry.py +132 -0
  98. package/templates/vault/context-agent/scripts/requirements.txt +6 -0
  99. package/templates/vault/context-agent/scripts/search.py +115 -0
  100. package/templates/vault/context-agent/scripts/session_parser.py +206 -0
  101. package/templates/vault/context-agent/scripts/session_summary.py +319 -0
  102. package/templates/vault/context-guardian/scripts/context_snapshot.py +229 -0
  103. package/templates/vault/docx/ooxml/scripts/pack.py +159 -0
  104. package/templates/vault/docx/ooxml/scripts/unpack.py +29 -0
  105. package/templates/vault/docx/ooxml/scripts/validate.py +69 -0
  106. package/templates/vault/docx/ooxml/scripts/validation/__init__.py +15 -0
  107. package/templates/vault/docx/ooxml/scripts/validation/base.py +951 -0
  108. package/templates/vault/docx/ooxml/scripts/validation/docx.py +274 -0
  109. package/templates/vault/docx/ooxml/scripts/validation/pptx.py +315 -0
  110. package/templates/vault/docx/ooxml/scripts/validation/redlining.py +279 -0
  111. package/templates/vault/docx/scripts/__init__.py +1 -0
  112. package/templates/vault/docx/scripts/document.py +1276 -0
  113. package/templates/vault/docx/scripts/templates/comments.xml +3 -0
  114. package/templates/vault/docx/scripts/templates/commentsExtended.xml +3 -0
  115. package/templates/vault/docx/scripts/templates/commentsExtensible.xml +3 -0
  116. package/templates/vault/docx/scripts/templates/commentsIds.xml +3 -0
  117. package/templates/vault/docx/scripts/templates/people.xml +3 -0
  118. package/templates/vault/docx/scripts/utilities.py +374 -0
  119. package/templates/vault/docx-official/ooxml/scripts/pack.py +159 -0
  120. package/templates/vault/docx-official/ooxml/scripts/unpack.py +29 -0
  121. package/templates/vault/docx-official/ooxml/scripts/validate.py +69 -0
  122. package/templates/vault/docx-official/ooxml/scripts/validation/__init__.py +15 -0
  123. package/templates/vault/docx-official/ooxml/scripts/validation/base.py +951 -0
  124. package/templates/vault/docx-official/ooxml/scripts/validation/docx.py +274 -0
  125. package/templates/vault/docx-official/ooxml/scripts/validation/pptx.py +315 -0
  126. package/templates/vault/docx-official/ooxml/scripts/validation/redlining.py +279 -0
  127. package/templates/vault/docx-official/scripts/__init__.py +1 -0
  128. package/templates/vault/docx-official/scripts/document.py +1276 -0
  129. package/templates/vault/docx-official/scripts/templates/comments.xml +3 -0
  130. package/templates/vault/docx-official/scripts/templates/commentsExtended.xml +3 -0
  131. package/templates/vault/docx-official/scripts/templates/commentsExtensible.xml +3 -0
  132. package/templates/vault/docx-official/scripts/templates/commentsIds.xml +3 -0
  133. package/templates/vault/docx-official/scripts/templates/people.xml +3 -0
  134. package/templates/vault/docx-official/scripts/utilities.py +374 -0
  135. package/templates/vault/geo-fundamentals/scripts/geo_checker.py +289 -0
  136. package/templates/vault/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
  137. package/templates/vault/i18n-localization/scripts/i18n_checker.py +241 -0
  138. package/templates/vault/instagram/scripts/account_setup.py +233 -0
  139. package/templates/vault/instagram/scripts/analyze.py +221 -0
  140. package/templates/vault/instagram/scripts/api_client.py +444 -0
  141. package/templates/vault/instagram/scripts/auth.py +411 -0
  142. package/templates/vault/instagram/scripts/comments.py +160 -0
  143. package/templates/vault/instagram/scripts/config.py +111 -0
  144. package/templates/vault/instagram/scripts/db.py +467 -0
  145. package/templates/vault/instagram/scripts/export.py +138 -0
  146. package/templates/vault/instagram/scripts/governance.py +233 -0
  147. package/templates/vault/instagram/scripts/hashtags.py +114 -0
  148. package/templates/vault/instagram/scripts/insights.py +170 -0
  149. package/templates/vault/instagram/scripts/media.py +65 -0
  150. package/templates/vault/instagram/scripts/messages.py +103 -0
  151. package/templates/vault/instagram/scripts/profile.py +58 -0
  152. package/templates/vault/instagram/scripts/publish.py +449 -0
  153. package/templates/vault/instagram/scripts/requirements.txt +5 -0
  154. package/templates/vault/instagram/scripts/run_all.py +189 -0
  155. package/templates/vault/instagram/scripts/schedule.py +189 -0
  156. package/templates/vault/instagram/scripts/serve_api.py +234 -0
  157. package/templates/vault/instagram/scripts/templates.py +155 -0
  158. package/templates/vault/junta-leiloeiros/scripts/db.py +216 -0
  159. package/templates/vault/junta-leiloeiros/scripts/export.py +137 -0
  160. package/templates/vault/junta-leiloeiros/scripts/requirements.txt +15 -0
  161. package/templates/vault/junta-leiloeiros/scripts/run_all.py +190 -0
  162. package/templates/vault/junta-leiloeiros/scripts/scraper/__init__.py +4 -0
  163. package/templates/vault/junta-leiloeiros/scripts/scraper/base_scraper.py +209 -0
  164. package/templates/vault/junta-leiloeiros/scripts/scraper/generic_scraper.py +110 -0
  165. package/templates/vault/junta-leiloeiros/scripts/scraper/jucap.py +110 -0
  166. package/templates/vault/junta-leiloeiros/scripts/scraper/juceac.py +72 -0
  167. package/templates/vault/junta-leiloeiros/scripts/scraper/juceal.py +72 -0
  168. package/templates/vault/junta-leiloeiros/scripts/scraper/juceb.py +68 -0
  169. package/templates/vault/junta-leiloeiros/scripts/scraper/jucec.py +63 -0
  170. package/templates/vault/junta-leiloeiros/scripts/scraper/jucema.py +211 -0
  171. package/templates/vault/junta-leiloeiros/scripts/scraper/jucemg.py +218 -0
  172. package/templates/vault/junta-leiloeiros/scripts/scraper/jucep.py +70 -0
  173. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepa.py +74 -0
  174. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepar.py +80 -0
  175. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepe.py +78 -0
  176. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepi.py +69 -0
  177. package/templates/vault/junta-leiloeiros/scripts/scraper/jucer.py +256 -0
  178. package/templates/vault/junta-leiloeiros/scripts/scraper/jucerja.py +170 -0
  179. package/templates/vault/junta-leiloeiros/scripts/scraper/jucern.py +71 -0
  180. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesc.py +89 -0
  181. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesp.py +233 -0
  182. package/templates/vault/junta-leiloeiros/scripts/scraper/jucetins.py +134 -0
  183. package/templates/vault/junta-leiloeiros/scripts/scraper/jucis_df.py +63 -0
  184. package/templates/vault/junta-leiloeiros/scripts/scraper/jucisrs.py +299 -0
  185. package/templates/vault/junta-leiloeiros/scripts/scraper/states.py +99 -0
  186. package/templates/vault/junta-leiloeiros/scripts/serve_api.py +164 -0
  187. package/templates/vault/junta-leiloeiros/scripts/web_scraper_fallback.py +233 -0
  188. package/templates/vault/last30days/scripts/last30days.py +521 -0
  189. package/templates/vault/last30days/scripts/lib/__init__.py +1 -0
  190. package/templates/vault/last30days/scripts/lib/cache.py +152 -0
  191. package/templates/vault/last30days/scripts/lib/dates.py +124 -0
  192. package/templates/vault/last30days/scripts/lib/dedupe.py +120 -0
  193. package/templates/vault/last30days/scripts/lib/env.py +149 -0
  194. package/templates/vault/last30days/scripts/lib/http.py +152 -0
  195. package/templates/vault/last30days/scripts/lib/models.py +175 -0
  196. package/templates/vault/last30days/scripts/lib/normalize.py +160 -0
  197. package/templates/vault/last30days/scripts/lib/openai_reddit.py +230 -0
  198. package/templates/vault/last30days/scripts/lib/reddit_enrich.py +232 -0
  199. package/templates/vault/last30days/scripts/lib/render.py +383 -0
  200. package/templates/vault/last30days/scripts/lib/schema.py +336 -0
  201. package/templates/vault/last30days/scripts/lib/score.py +311 -0
  202. package/templates/vault/last30days/scripts/lib/ui.py +324 -0
  203. package/templates/vault/last30days/scripts/lib/websearch.py +401 -0
  204. package/templates/vault/last30days/scripts/lib/xai_x.py +217 -0
  205. package/templates/vault/leiloeiro-avaliacao/scripts/governance.py +106 -0
  206. package/templates/vault/leiloeiro-avaliacao/scripts/requirements.txt +1 -0
  207. package/templates/vault/leiloeiro-edital/scripts/governance.py +106 -0
  208. package/templates/vault/leiloeiro-edital/scripts/requirements.txt +1 -0
  209. package/templates/vault/leiloeiro-ia/scripts/governance.py +106 -0
  210. package/templates/vault/leiloeiro-ia/scripts/requirements.txt +1 -0
  211. package/templates/vault/leiloeiro-juridico/scripts/governance.py +106 -0
  212. package/templates/vault/leiloeiro-juridico/scripts/requirements.txt +1 -0
  213. package/templates/vault/leiloeiro-mercado/scripts/governance.py +106 -0
  214. package/templates/vault/leiloeiro-mercado/scripts/requirements.txt +1 -0
  215. package/templates/vault/leiloeiro-risco/scripts/governance.py +106 -0
  216. package/templates/vault/leiloeiro-risco/scripts/requirements.txt +1 -0
  217. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/database.ts +24 -0
  218. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/db.ts +35 -0
  219. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/index.ts +2 -0
  220. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/migrations.ts +31 -0
  221. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/schema.sql +8 -0
  222. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/index.ts +44 -0
  223. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/routes/todos.ts +155 -0
  224. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/types/index.ts +35 -0
  225. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.css +384 -0
  226. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.tsx +81 -0
  227. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/api/todos.ts +57 -0
  228. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/ConfirmDialog.tsx +26 -0
  229. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/EmptyState.tsx +8 -0
  230. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoForm.tsx +43 -0
  231. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoItem.tsx +36 -0
  232. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoList.tsx +27 -0
  233. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/hooks/useTodos.ts +81 -0
  234. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/index.css +48 -0
  235. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/main.tsx +10 -0
  236. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/vite-env.d.ts +1 -0
  237. package/templates/vault/loki-mode/scripts/export-to-vibe-kanban.sh +178 -0
  238. package/templates/vault/loki-mode/scripts/loki-wrapper.sh +281 -0
  239. package/templates/vault/loki-mode/scripts/take-screenshots.js +55 -0
  240. package/templates/vault/matematico-tao/scripts/complexity_analyzer.py +544 -0
  241. package/templates/vault/matematico-tao/scripts/dependency_graph.py +538 -0
  242. package/templates/vault/mcp-builder/scripts/connections.py +151 -0
  243. package/templates/vault/mcp-builder/scripts/evaluation.py +373 -0
  244. package/templates/vault/mcp-builder/scripts/example_evaluation.xml +22 -0
  245. package/templates/vault/mcp-builder/scripts/requirements.txt +2 -0
  246. package/templates/vault/mobile-design/scripts/mobile_audit.py +670 -0
  247. package/templates/vault/notebooklm/scripts/__init__.py +81 -0
  248. package/templates/vault/notebooklm/scripts/ask_question.py +256 -0
  249. package/templates/vault/notebooklm/scripts/auth_manager.py +358 -0
  250. package/templates/vault/notebooklm/scripts/browser_session.py +255 -0
  251. package/templates/vault/notebooklm/scripts/browser_utils.py +107 -0
  252. package/templates/vault/notebooklm/scripts/cleanup_manager.py +302 -0
  253. package/templates/vault/notebooklm/scripts/config.py +44 -0
  254. package/templates/vault/notebooklm/scripts/notebook_manager.py +410 -0
  255. package/templates/vault/notebooklm/scripts/run.py +102 -0
  256. package/templates/vault/notebooklm/scripts/setup_environment.py +204 -0
  257. package/templates/vault/pdf/scripts/check_bounding_boxes.py +70 -0
  258. package/templates/vault/pdf/scripts/check_bounding_boxes_test.py +226 -0
  259. package/templates/vault/pdf/scripts/check_fillable_fields.py +12 -0
  260. package/templates/vault/pdf/scripts/convert_pdf_to_images.py +35 -0
  261. package/templates/vault/pdf/scripts/create_validation_image.py +41 -0
  262. package/templates/vault/pdf/scripts/extract_form_field_info.py +152 -0
  263. package/templates/vault/pdf/scripts/fill_fillable_fields.py +114 -0
  264. package/templates/vault/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  265. package/templates/vault/pdf-official/scripts/check_bounding_boxes.py +70 -0
  266. package/templates/vault/pdf-official/scripts/check_bounding_boxes_test.py +226 -0
  267. package/templates/vault/pdf-official/scripts/check_fillable_fields.py +12 -0
  268. package/templates/vault/pdf-official/scripts/convert_pdf_to_images.py +35 -0
  269. package/templates/vault/pdf-official/scripts/create_validation_image.py +41 -0
  270. package/templates/vault/pdf-official/scripts/extract_form_field_info.py +152 -0
  271. package/templates/vault/pdf-official/scripts/fill_fillable_fields.py +114 -0
  272. package/templates/vault/pdf-official/scripts/fill_pdf_form_with_annotations.py +108 -0
  273. package/templates/vault/planning-with-files/scripts/check-complete.sh +44 -0
  274. package/templates/vault/planning-with-files/scripts/init-session.sh +120 -0
  275. package/templates/vault/pptx/ooxml/scripts/pack.py +159 -0
  276. package/templates/vault/pptx/ooxml/scripts/unpack.py +29 -0
  277. package/templates/vault/pptx/ooxml/scripts/validate.py +69 -0
  278. package/templates/vault/pptx/ooxml/scripts/validation/__init__.py +15 -0
  279. package/templates/vault/pptx/ooxml/scripts/validation/base.py +951 -0
  280. package/templates/vault/pptx/ooxml/scripts/validation/docx.py +274 -0
  281. package/templates/vault/pptx/ooxml/scripts/validation/pptx.py +315 -0
  282. package/templates/vault/pptx/ooxml/scripts/validation/redlining.py +279 -0
  283. package/templates/vault/pptx/scripts/html2pptx.js +979 -0
  284. package/templates/vault/pptx/scripts/inventory.py +1020 -0
  285. package/templates/vault/pptx/scripts/rearrange.py +231 -0
  286. package/templates/vault/pptx/scripts/replace.py +385 -0
  287. package/templates/vault/pptx/scripts/thumbnail.py +450 -0
  288. package/templates/vault/pptx-official/ooxml/scripts/pack.py +159 -0
  289. package/templates/vault/pptx-official/ooxml/scripts/unpack.py +29 -0
  290. package/templates/vault/pptx-official/ooxml/scripts/validate.py +69 -0
  291. package/templates/vault/pptx-official/ooxml/scripts/validation/__init__.py +15 -0
  292. package/templates/vault/pptx-official/ooxml/scripts/validation/base.py +951 -0
  293. package/templates/vault/pptx-official/ooxml/scripts/validation/docx.py +274 -0
  294. package/templates/vault/pptx-official/ooxml/scripts/validation/pptx.py +315 -0
  295. package/templates/vault/pptx-official/ooxml/scripts/validation/redlining.py +279 -0
  296. package/templates/vault/pptx-official/scripts/html2pptx.js +979 -0
  297. package/templates/vault/pptx-official/scripts/inventory.py +1020 -0
  298. package/templates/vault/pptx-official/scripts/rearrange.py +231 -0
  299. package/templates/vault/pptx-official/scripts/replace.py +385 -0
  300. package/templates/vault/pptx-official/scripts/thumbnail.py +450 -0
  301. package/templates/vault/product-manager-toolkit/scripts/customer_interview_analyzer.py +441 -0
  302. package/templates/vault/product-manager-toolkit/scripts/rice_prioritizer.py +296 -0
  303. package/templates/vault/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
  304. package/templates/vault/scripts/.skill_cache.json +7538 -0
  305. package/templates/vault/scripts/skill_search.py +228 -0
  306. package/templates/vault/senior-architect/scripts/architecture_diagram_generator.py +114 -0
  307. package/templates/vault/senior-architect/scripts/dependency_analyzer.py +114 -0
  308. package/templates/vault/senior-architect/scripts/project_architect.py +114 -0
  309. package/templates/vault/shopify-development/scripts/requirements.txt +19 -0
  310. package/templates/vault/shopify-development/scripts/shopify_graphql.py +428 -0
  311. package/templates/vault/shopify-development/scripts/shopify_init.py +441 -0
  312. package/templates/vault/shopify-development/scripts/tests/test_shopify_init.py +379 -0
  313. package/templates/vault/skill-creator/scripts/init_skill.py +303 -0
  314. package/templates/vault/skill-creator/scripts/package_skill.py +110 -0
  315. package/templates/vault/skill-creator/scripts/quick_validate.py +95 -0
  316. package/templates/vault/skill-installer/scripts/detect_skills.py +318 -0
  317. package/templates/vault/skill-installer/scripts/install_skill.py +1708 -0
  318. package/templates/vault/skill-installer/scripts/package_skill.py +417 -0
  319. package/templates/vault/skill-installer/scripts/requirements.txt +1 -0
  320. package/templates/vault/skill-installer/scripts/validate_skill.py +430 -0
  321. package/templates/vault/skill-sentinel/scripts/analyzers/__init__.py +13 -0
  322. package/templates/vault/skill-sentinel/scripts/analyzers/code_quality.py +247 -0
  323. package/templates/vault/skill-sentinel/scripts/analyzers/cross_skill.py +134 -0
  324. package/templates/vault/skill-sentinel/scripts/analyzers/dependencies.py +121 -0
  325. package/templates/vault/skill-sentinel/scripts/analyzers/documentation.py +189 -0
  326. package/templates/vault/skill-sentinel/scripts/analyzers/governance_audit.py +153 -0
  327. package/templates/vault/skill-sentinel/scripts/analyzers/performance.py +164 -0
  328. package/templates/vault/skill-sentinel/scripts/analyzers/security.py +189 -0
  329. package/templates/vault/skill-sentinel/scripts/config.py +158 -0
  330. package/templates/vault/skill-sentinel/scripts/cost_optimizer.py +146 -0
  331. package/templates/vault/skill-sentinel/scripts/db.py +354 -0
  332. package/templates/vault/skill-sentinel/scripts/governance.py +58 -0
  333. package/templates/vault/skill-sentinel/scripts/recommender.py +228 -0
  334. package/templates/vault/skill-sentinel/scripts/report_generator.py +224 -0
  335. package/templates/vault/skill-sentinel/scripts/requirements.txt +1 -0
  336. package/templates/vault/skill-sentinel/scripts/run_audit.py +290 -0
  337. package/templates/vault/skill-sentinel/scripts/scanner.py +271 -0
  338. package/templates/vault/stability-ai/scripts/config.py +266 -0
  339. package/templates/vault/stability-ai/scripts/generate.py +687 -0
  340. package/templates/vault/stability-ai/scripts/requirements.txt +4 -0
  341. package/templates/vault/stability-ai/scripts/styles.py +174 -0
  342. package/templates/vault/telegram/assets/boilerplate/nodejs/src/bot-client.ts +86 -0
  343. package/templates/vault/telegram/assets/boilerplate/nodejs/src/handlers.ts +79 -0
  344. package/templates/vault/telegram/assets/boilerplate/nodejs/src/index.ts +32 -0
  345. package/templates/vault/telegram/scripts/send_message.py +143 -0
  346. package/templates/vault/telegram/scripts/setup_project.py +103 -0
  347. package/templates/vault/telegram/scripts/test_bot.py +144 -0
  348. package/templates/vault/typescript-expert/scripts/ts_diagnostic.py +203 -0
  349. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  350. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  351. package/templates/vault/ui-ux-pro-max/scripts/core.py +257 -0
  352. package/templates/vault/ui-ux-pro-max/scripts/design_system.py +487 -0
  353. package/templates/vault/ui-ux-pro-max/scripts/search.py +76 -0
  354. package/templates/vault/videodb/scripts/ws_listener.py +204 -0
  355. package/templates/vault/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  356. package/templates/vault/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  357. package/templates/vault/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  358. package/templates/vault/webapp-testing/scripts/with_server.py +106 -0
  359. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/index.ts +125 -0
  360. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/template-manager.ts +67 -0
  361. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/types.ts +216 -0
  362. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/webhook-handler.ts +173 -0
  363. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/whatsapp-client.ts +193 -0
  364. package/templates/vault/whatsapp-cloud-api/scripts/send_test_message.py +137 -0
  365. package/templates/vault/whatsapp-cloud-api/scripts/setup_project.py +118 -0
  366. package/templates/vault/whatsapp-cloud-api/scripts/validate_config.py +190 -0
  367. package/templates/vault/youtube-summarizer/scripts/extract-transcript.py +65 -0
  368. package/templates/vault/youtube-summarizer/scripts/install-dependencies.sh +28 -0
@@ -0,0 +1,472 @@
1
+ """
2
+ 007 Security Skill - Central Configuration Hub
3
+ ================================================
4
+
5
+ Central configuration for all 007 security scanners, analyzers, and reporting
6
+ tools. Every script in the 007 ecosystem imports from here to ensure consistent
7
+ behavior, scoring, severity levels, detection patterns, and output paths.
8
+
9
+ Designed to run with Python stdlib only -- no external dependencies required.
10
+
11
+ Usage:
12
+ from config import (
13
+ BASE_DIR, DATA_DIR, REPORTS_DIR,
14
+ SEVERITY, SCORING_WEIGHTS, VERDICT_THRESHOLDS,
15
+ SECRET_PATTERNS, DANGEROUS_PATTERNS,
16
+ TIMEOUTS, get_timestamp,
17
+ )
18
+ """
19
+
20
+ import json
21
+ import logging
22
+ import re
23
+ from datetime import datetime, timezone
24
+ from pathlib import Path
25
+
26
+
27
+ # ---------------------------------------------------------------------------
28
+ # Directory Layout
29
+ # ---------------------------------------------------------------------------
30
+ # All paths use pathlib for Windows / Linux portability.
31
+
32
+ BASE_DIR = Path(__file__).resolve().parent.parent # 007/
33
+ SCRIPTS_DIR = BASE_DIR / "scripts"
34
+ SCANNERS_DIR = SCRIPTS_DIR / "scanners"
35
+ ANALYZERS_DIR = SCRIPTS_DIR / "analyzers"
36
+ DATA_DIR = BASE_DIR / "data"
37
+ REPORTS_DIR = DATA_DIR / "reports"
38
+ PLAYBOOKS_DIR = DATA_DIR / "playbooks"
39
+ REFERENCES_DIR = BASE_DIR / "references"
40
+ ASSETS_DIR = BASE_DIR / "assets"
41
+
42
+ # Audit log written by every 007 operation for full traceability.
43
+ AUDIT_LOG_PATH = DATA_DIR / "audit_log.json"
44
+
45
+ # Historical scores for trend analysis.
46
+ SCORE_HISTORY_PATH = DATA_DIR / "score_history.json"
47
+
48
+
49
+ # ---------------------------------------------------------------------------
50
+ # Ensure required directories exist (safe to call repeatedly)
51
+ # ---------------------------------------------------------------------------
52
+
53
+ def ensure_directories() -> None:
54
+ """Create data directories if they do not already exist."""
55
+ for directory in (DATA_DIR, REPORTS_DIR, PLAYBOOKS_DIR):
56
+ directory.mkdir(parents=True, exist_ok=True)
57
+
58
+
59
+ # ---------------------------------------------------------------------------
60
+ # Severity Levels
61
+ # ---------------------------------------------------------------------------
62
+ # Numeric weights enable arithmetic comparison and sorting.
63
+ # Higher weight = more severe.
64
+
65
+ SEVERITY = {
66
+ "CRITICAL": 5,
67
+ "HIGH": 4,
68
+ "MEDIUM": 3,
69
+ "LOW": 2,
70
+ "INFO": 1,
71
+ }
72
+
73
+ # Reverse lookup: weight -> label
74
+ SEVERITY_LABEL = {v: k for k, v in SEVERITY.items()}
75
+
76
+
77
+ # ---------------------------------------------------------------------------
78
+ # Scoring Weights by Security Domain (sum = 1.0)
79
+ # ---------------------------------------------------------------------------
80
+ # Weights mirror the SKILL.md Phase 6 scoring table exactly.
81
+
82
+ SCORING_WEIGHTS = {
83
+ "secrets": 0.20, # Secrets & Credentials (20%)
84
+ "input_validation": 0.15, # Input Validation (15%)
85
+ "authn_authz": 0.15, # Authentication & AuthZ (15%)
86
+ "data_protection": 0.15, # Data Protection (15%)
87
+ "resilience": 0.10, # Resilience (10%)
88
+ "monitoring": 0.10, # Monitoring (10%)
89
+ "supply_chain": 0.10, # Supply Chain (10%)
90
+ "compliance": 0.05, # Compliance ( 5%)
91
+ }
92
+
93
+ # Human-readable labels for reports
94
+ SCORING_LABELS = {
95
+ "secrets": "Segredos & Credenciais",
96
+ "input_validation": "Input Validation",
97
+ "authn_authz": "Autenticacao & Autorizacao",
98
+ "data_protection": "Protecao de Dados",
99
+ "resilience": "Resiliencia",
100
+ "monitoring": "Monitoramento",
101
+ "supply_chain": "Supply Chain",
102
+ "compliance": "Compliance",
103
+ }
104
+
105
+
106
+ # ---------------------------------------------------------------------------
107
+ # Verdict Thresholds
108
+ # ---------------------------------------------------------------------------
109
+ # Applied to the weighted final score (0-100).
110
+
111
+ VERDICT_THRESHOLDS = {
112
+ "approved": {
113
+ "min": 90,
114
+ "max": 100,
115
+ "label": "Aprovado",
116
+ "description": "Pronto para producao",
117
+ "emoji": "[PASS]",
118
+ },
119
+ "approved_with_caveats": {
120
+ "min": 70,
121
+ "max": 89,
122
+ "label": "Aprovado com Ressalvas",
123
+ "description": "Pode ir para producao com mitigacoes documentadas",
124
+ "emoji": "[WARN]",
125
+ },
126
+ "partial_block": {
127
+ "min": 50,
128
+ "max": 69,
129
+ "label": "Bloqueado Parcial",
130
+ "description": "Precisa correcoes antes de producao",
131
+ "emoji": "[BLOCK]",
132
+ },
133
+ "total_block": {
134
+ "min": 0,
135
+ "max": 49,
136
+ "label": "Bloqueado Total",
137
+ "description": "Inseguro, requer redesign",
138
+ "emoji": "[CRITICAL]",
139
+ },
140
+ }
141
+
142
+
143
+ def get_verdict(score: float) -> dict:
144
+ """Return the verdict dict that matches the given score (0-100).
145
+
146
+ Args:
147
+ score: Weighted security score between 0 and 100.
148
+
149
+ Returns:
150
+ A dict with keys: min, max, label, description, emoji.
151
+ """
152
+ score = max(0.0, min(100.0, score))
153
+ for verdict in VERDICT_THRESHOLDS.values():
154
+ if verdict["min"] <= score <= verdict["max"]:
155
+ return verdict
156
+ # Fallback (should never happen)
157
+ return VERDICT_THRESHOLDS["total_block"]
158
+
159
+
160
+ # ---------------------------------------------------------------------------
161
+ # Secret Detection Patterns
162
+ # ---------------------------------------------------------------------------
163
+ # Compiled regexes for high-speed scanning of source files.
164
+ # Each entry: (pattern_name, compiled_regex, severity)
165
+
166
+ _SECRET_PATTERN_DEFS = [
167
+ # Generic API keys (long hex/base64 strings assigned to key-like variables)
168
+ (
169
+ "generic_api_key",
170
+ r"""(?i)(?:api[_-]?key|apikey|api[_-]?secret|api[_-]?token)\s*[:=]\s*['\"]\S{8,}['\"]""",
171
+ "HIGH",
172
+ ),
173
+ # AWS Access Key ID
174
+ (
175
+ "aws_access_key",
176
+ r"""(?:A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}""",
177
+ "CRITICAL",
178
+ ),
179
+ # AWS Secret Access Key (40 chars base64)
180
+ (
181
+ "aws_secret_key",
182
+ r"""(?i)aws[_-]?secret[_-]?access[_-]?key\s*[:=]\s*['\"]\S{40}['\"]""",
183
+ "CRITICAL",
184
+ ),
185
+ # Generic passwords in assignments
186
+ (
187
+ "password_assignment",
188
+ r"""(?i)(?:password|passwd|pwd|senha)\s*[:=]\s*['\"][^'\"]{4,}['\"]""",
189
+ "HIGH",
190
+ ),
191
+ # Generic token assignments
192
+ (
193
+ "token_assignment",
194
+ r"""(?i)(?:token|bearer|auth[_-]?token|access[_-]?token|refresh[_-]?token)\s*[:=]\s*['\"][^'\"]{8,}['\"]""",
195
+ "HIGH",
196
+ ),
197
+ # Private key blocks (PEM)
198
+ (
199
+ "private_key",
200
+ r"""-----BEGIN\s+(?:RSA|DSA|EC|OPENSSH|PGP)?\s*PRIVATE\s+KEY-----""",
201
+ "CRITICAL",
202
+ ),
203
+ # GitHub personal access tokens
204
+ (
205
+ "github_token",
206
+ r"""(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,}""",
207
+ "CRITICAL",
208
+ ),
209
+ # Slack tokens
210
+ (
211
+ "slack_token",
212
+ r"""xox[bpors]-[0-9]{10,}-[A-Za-z0-9-]+""",
213
+ "CRITICAL",
214
+ ),
215
+ # Generic secret assignments (broad catch-all, lower severity)
216
+ (
217
+ "generic_secret",
218
+ r"""(?i)(?:secret|client[_-]?secret|signing[_-]?key|encryption[_-]?key)\s*[:=]\s*['\"][^'\"]{8,}['\"]""",
219
+ "MEDIUM",
220
+ ),
221
+ # Database connection strings with embedded credentials
222
+ (
223
+ "db_connection_string",
224
+ r"""(?i)(?:mysql|postgres|postgresql|mongodb|redis|amqp):\/\/[^:]+:[^@]+@""",
225
+ "HIGH",
226
+ ),
227
+ # .env-style secrets (KEY=value in non-.env source files)
228
+ (
229
+ "env_inline_secret",
230
+ r"""(?i)^(?:DATABASE_URL|SECRET_KEY|JWT_SECRET|ENCRYPTION_KEY)\s*=\s*\S+""",
231
+ "HIGH",
232
+ ),
233
+ ]
234
+
235
+ SECRET_PATTERNS = [
236
+ (name, re.compile(pattern), severity)
237
+ for name, pattern, severity in _SECRET_PATTERN_DEFS
238
+ ]
239
+ """List of (name: str, regex: re.Pattern, severity: str) tuples for secret detection."""
240
+
241
+
242
+ # ---------------------------------------------------------------------------
243
+ # Dangerous Code Patterns
244
+ # ---------------------------------------------------------------------------
245
+ # Patterns that indicate risky constructs. Each scanner may apply its own
246
+ # context-aware filtering on top of these to reduce false positives.
247
+
248
+ _DANGEROUS_PATTERN_DEFS = [
249
+ # Python dangerous functions
250
+ ("eval_usage", r"""\beval\s*\(""", "CRITICAL"),
251
+ ("exec_usage", r"""\bexec\s*\(""", "CRITICAL"),
252
+ ("subprocess_shell_true", r"""subprocess\.\w+\(.*shell\s*=\s*True""", "CRITICAL"),
253
+ ("os_system", r"""\bos\.system\s*\(""", "HIGH"),
254
+ ("os_popen", r"""\bos\.popen\s*\(""", "HIGH"),
255
+ ("pickle_loads", r"""\bpickle\.loads?\s*\(""", "HIGH"),
256
+ ("yaml_unsafe_load", r"""\byaml\.load\s*\((?!.*Loader\s*=)""", "HIGH"),
257
+ ("marshal_loads", r"""\bmarshal\.loads?\s*\(""", "MEDIUM"),
258
+ ("shelve_open", r"""\bshelve\.open\s*\(""", "MEDIUM"),
259
+ ("compile_usage", r"""\bcompile\s*\([^)]*\bexec\b""", "HIGH"),
260
+
261
+ # Dynamic imports
262
+ ("importlib_import", r"""\b__import__\s*\(""", "MEDIUM"),
263
+ ("importlib_module", r"""\bimportlib\.import_module\s*\(""", "MEDIUM"),
264
+
265
+ # Shell/command injection vectors
266
+ ("shell_injection", r"""\bos\.(?:system|popen|exec\w*)\s*\(""", "CRITICAL"),
267
+
268
+ # File operations with external input (heuristic)
269
+ ("open_write", r"""\bopen\s*\([^)]*['\"]\s*w""", "LOW"),
270
+
271
+ # Network without TLS verification
272
+ ("requests_no_verify", r"""verify\s*=\s*False""", "HIGH"),
273
+ ("ssl_no_verify", r"""(?i)ssl[_.]?verify\s*=\s*(?:False|0|None)""", "HIGH"),
274
+
275
+ # SQL injection indicators
276
+ ("sql_string_format", r"""(?i)(?:execute|cursor\.execute)\s*\(\s*[f'\"]+.*\{""", "CRITICAL"),
277
+ ("sql_percent_format", r"""(?i)(?:execute|cursor\.execute)\s*\(\s*['\"].*%s.*%""","MEDIUM"),
278
+
279
+ # JavaScript / Node.js dangerous patterns
280
+ ("js_eval", r"""\beval\s*\(""", "CRITICAL"),
281
+ ("child_process_exec", r"""\bchild_process\.\s*exec\s*\(""", "CRITICAL"),
282
+ ("innerHTML_assignment", r"""\.innerHTML\s*=""", "HIGH"),
283
+
284
+ # Dangerous deserialization (general)
285
+ ("deserialize_untrusted", r"""(?i)\b(?:unserialize|deserialize|fromjson)\s*\(""", "MEDIUM"),
286
+ ]
287
+
288
+ DANGEROUS_PATTERNS = [
289
+ (name, re.compile(pattern), severity)
290
+ for name, pattern, severity in _DANGEROUS_PATTERN_DEFS
291
+ ]
292
+ """List of (name: str, regex: re.Pattern, severity: str) tuples for dangerous code detection."""
293
+
294
+
295
+ # ---------------------------------------------------------------------------
296
+ # File Extension Filters
297
+ # ---------------------------------------------------------------------------
298
+ # Which files to scan by default. Others are ignored unless explicitly included.
299
+
300
+ SCANNABLE_EXTENSIONS = {
301
+ ".py", ".js", ".ts", ".jsx", ".tsx",
302
+ ".mjs", ".cjs",
303
+ ".java", ".kt", ".scala",
304
+ ".go", ".rs", ".rb", ".php",
305
+ ".sh", ".bash", ".zsh", ".ps1",
306
+ ".yml", ".yaml", ".toml", ".ini", ".cfg", ".conf",
307
+ ".json", ".env", ".env.example",
308
+ ".sql",
309
+ ".html", ".htm", ".xml",
310
+ ".md", # may contain inline code or secrets
311
+ ".txt", # may contain secrets
312
+ ".dockerfile", ".docker-compose.yml",
313
+ }
314
+
315
+ # Directories to always skip during recursive scans
316
+ SKIP_DIRECTORIES = {
317
+ ".git", ".hg", ".svn",
318
+ "__pycache__", ".mypy_cache", ".pytest_cache", ".ruff_cache",
319
+ "node_modules", "bower_components",
320
+ "venv", ".venv", "env", ".env",
321
+ ".tox", ".nox",
322
+ "dist", "build", "egg-info",
323
+ ".next", ".nuxt",
324
+ "vendor",
325
+ "coverage", ".coverage",
326
+ ".terraform",
327
+ }
328
+
329
+
330
+ # ---------------------------------------------------------------------------
331
+ # Default Timeouts & Limits
332
+ # ---------------------------------------------------------------------------
333
+
334
+ TIMEOUTS = {
335
+ "file_read_seconds": 10, # Max time to read a single file
336
+ "scan_total_seconds": 300, # Max time for a full scan operation
337
+ "network_seconds": 30, # Max time for any network call
338
+ }
339
+
340
+ LIMITS = {
341
+ "max_file_size_bytes": 5 * 1024 * 1024, # 5 MB -- skip larger files
342
+ "max_files_per_scan": 10_000, # Safety cap
343
+ "max_findings_per_file": 200, # Truncate findings beyond this
344
+ "max_report_findings": 1_000, # Total findings cap per report
345
+ }
346
+
347
+
348
+ # ---------------------------------------------------------------------------
349
+ # Logging Configuration
350
+ # ---------------------------------------------------------------------------
351
+
352
+ LOG_FORMAT = "%(asctime)s | %(name)s | %(levelname)s | %(message)s"
353
+ LOG_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S"
354
+
355
+ def setup_logging(name: str = "007", level: int = logging.INFO) -> logging.Logger:
356
+ """Configure and return a logger for 007 scripts.
357
+
358
+ The logger writes to stderr (console). Audit events are written
359
+ separately to AUDIT_LOG_PATH via ``log_audit_event()``.
360
+
361
+ Args:
362
+ name: Logger name (appears in log lines).
363
+ level: Logging level (default INFO).
364
+
365
+ Returns:
366
+ Configured ``logging.Logger`` instance.
367
+ """
368
+ logger = logging.getLogger(name)
369
+ if not logger.handlers:
370
+ handler = logging.StreamHandler()
371
+ handler.setFormatter(logging.Formatter(LOG_FORMAT, datefmt=LOG_DATE_FORMAT))
372
+ logger.addHandler(handler)
373
+ logger.setLevel(level)
374
+ return logger
375
+
376
+
377
+ # ---------------------------------------------------------------------------
378
+ # Audit Log Utilities
379
+ # ---------------------------------------------------------------------------
380
+
381
+ def get_timestamp() -> str:
382
+ """Return current UTC timestamp in ISO 8601 format.
383
+
384
+ Example:
385
+ '2026-02-26T14:30:00Z'
386
+ """
387
+ return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
388
+
389
+
390
+ def log_audit_event(
391
+ action: str,
392
+ target: str,
393
+ result: str,
394
+ details: dict | None = None,
395
+ ) -> None:
396
+ """Append an audit event to the JSON audit log.
397
+
398
+ Each event is a JSON object on its own line (JSON Lines format) so the
399
+ file can be appended to atomically without reading the whole log.
400
+
401
+ Args:
402
+ action: What was done (e.g. 'quick_scan', 'full_audit', 'score').
403
+ target: Path or identifier of what was scanned/audited.
404
+ result: Outcome summary (e.g. 'approved', 'blocked', '3 findings').
405
+ details: Optional dict with extra context.
406
+ """
407
+ ensure_directories()
408
+ event = {
409
+ "timestamp": get_timestamp(),
410
+ "action": action,
411
+ "target": str(target),
412
+ "result": result,
413
+ }
414
+ if details:
415
+ event["details"] = details
416
+
417
+ with open(AUDIT_LOG_PATH, "a", encoding="utf-8") as fh:
418
+ fh.write(json.dumps(event, ensure_ascii=False) + "\n")
419
+
420
+
421
+ # ---------------------------------------------------------------------------
422
+ # Score Calculation Helpers
423
+ # ---------------------------------------------------------------------------
424
+
425
+ def calculate_weighted_score(domain_scores: dict[str, float]) -> float:
426
+ """Compute the weighted final security score.
427
+
428
+ Args:
429
+ domain_scores: Mapping of domain key -> score (0-100).
430
+ Keys must be from SCORING_WEIGHTS.
431
+ Missing domains are treated as 0.
432
+
433
+ Returns:
434
+ Weighted score between 0.0 and 100.0.
435
+ """
436
+ total = 0.0
437
+ for domain, weight in SCORING_WEIGHTS.items():
438
+ score = domain_scores.get(domain, 0.0)
439
+ total += score * weight
440
+ return round(total, 2)
441
+
442
+
443
+ # ---------------------------------------------------------------------------
444
+ # Module Self-Test
445
+ # ---------------------------------------------------------------------------
446
+
447
+ if __name__ == "__main__":
448
+ # Quick sanity check when run directly
449
+ print(f"BASE_DIR: {BASE_DIR}")
450
+ print(f"DATA_DIR: {DATA_DIR}")
451
+ print(f"REPORTS_DIR: {REPORTS_DIR}")
452
+ print(f"AUDIT_LOG_PATH: {AUDIT_LOG_PATH}")
453
+ print()
454
+
455
+ # Verify scoring weights sum to 1.0
456
+ total_weight = sum(SCORING_WEIGHTS.values())
457
+ assert abs(total_weight - 1.0) < 1e-9, f"Weights sum to {total_weight}, expected 1.0"
458
+ print(f"Scoring weights sum: {total_weight} [OK]")
459
+
460
+ # Verify all patterns compile successfully (they already are, but double-check)
461
+ print(f"Secret patterns loaded: {len(SECRET_PATTERNS)}")
462
+ print(f"Dangerous patterns loaded: {len(DANGEROUS_PATTERNS)}")
463
+
464
+ # Test verdict thresholds
465
+ for test_score in (95, 75, 55, 30):
466
+ v = get_verdict(test_score)
467
+ print(f"Score {test_score}: {v['emoji']} {v['label']}")
468
+
469
+ # Test timestamp
470
+ print(f"Timestamp: {get_timestamp()}")
471
+
472
+ print("\n007 config.py -- all checks passed.")