@aegis-scan/skills 0.5.0 → 0.5.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.
- package/ATTRIBUTION.md +93 -0
- package/package.json +1 -1
- package/sbom.cdx.json +1 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/.claude-plugin/plugin.json +108 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/CHANGELOG.md +878 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/README.md +9 -3
- package/skills/compliance/aegis-native/brutaler-anwalt/SKILL.md +93 -14
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/audit.md +193 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/avv-redline.md +246 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/az-verify.md +155 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/cold-start.md +157 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/dsar-respond.md +180 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/health.md +50 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/simulate.md +158 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/post_write.py +315 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/prompt_submit.py +144 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/session_start.py +57 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/triggers.json +191 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/INDEX.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/abmahn-templates.md +1 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/aegis-integration.md +60 -5
- package/skills/compliance/aegis-native/brutaler-anwalt/references/audit-patterns.md +745 -11
- package/skills/compliance/aegis-native/brutaler-anwalt/references/az-auffuellung-batch1.md +468 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/bgh-urteile.md +106 -30
- package/skills/compliance/aegis-native/brutaler-anwalt/references/branchenrecht.md +247 -2
- package/skills/compliance/aegis-native/brutaler-anwalt/references/checklisten.md +75 -2
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-aufsichtsbehoerden-taetigkeitsberichte-2024.md +310 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-bussgeld-argumentations-layer.md +598 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-dsk-beschluesse.md +346 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AGG/audit-relevance.md +76 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AGG/paragraphs.md +115 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AMG/audit-relevance.md +58 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AMG/paragraphs.md +95 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ArbZG/audit-relevance.md +60 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ArbZG/paragraphs.md +90 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/BetrVG/audit-relevance.md +73 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/BetrVG/paragraphs.md +114 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DDG/audit-relevance.md +72 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DDG/paragraphs.md +103 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DiGAV/audit-relevance.md +65 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DiGAV/paragraphs.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ElektroG/audit-relevance.md +66 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ElektroG/paragraphs.md +108 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/FernUSG/audit-relevance.md +80 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/FernUSG/paragraphs.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GeschGehG/audit-relevance.md +89 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GeschGehG/paragraphs.md +107 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GwG/audit-relevance.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GwG/paragraphs.md +119 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HWG/audit-relevance.md +70 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HWG/paragraphs.md +125 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HinSchG/audit-relevance.md +70 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HinSchG/paragraphs.md +116 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/INDEX.md +152 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/KWG/audit-relevance.md +64 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/KWG/paragraphs.md +110 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/LFGB/audit-relevance.md +63 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/LFGB/paragraphs.md +90 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/MPDG/audit-relevance.md +61 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/MPDG/paragraphs.md +96 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/NachwG/audit-relevance.md +54 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/NachwG/paragraphs.md +82 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/PAngV/audit-relevance.md +76 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/PAngV/paragraphs.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/RDG/audit-relevance.md +84 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/RDG/paragraphs.md +114 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/TDDDG/audit-relevance.md +92 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/TDDDG/paragraphs.md +91 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/UrhG-UrhDaG/audit-relevance.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/UrhG-UrhDaG/paragraphs.md +166 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VDuG/audit-relevance.md +71 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VDuG/paragraphs.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VERIFICATION-NOTES.md +111 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VVG/audit-relevance.md +65 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VVG/paragraphs.md +101 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VerpackG/audit-relevance.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VerpackG/paragraphs.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/WpHG/audit-relevance.md +64 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/WpHG/paragraphs.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ZAG/audit-relevance.md +68 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ZAG/paragraphs.md +110 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/dsgvo.md +55 -8
- package/skills/compliance/aegis-native/brutaler-anwalt/references/eu-edpb-guidelines.md +505 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/eu-eugh-dsgvo-schadensersatz.md +223 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BDSG/audit-relevance.md +31 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BFSG/audit-relevance.md +39 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BGB/audit-relevance.md +42 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DDG/audit-relevance.md +28 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DSGVO/audit-relevance.md +35 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/articles.md +4 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/audit-relevance.md +139 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/gpai-pflichten.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/hochrisiko-annex-iii.md +134 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/sanktionen-art-99.md +97 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/transparenz-art-50.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/uebergangsfristen.md +109 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CER-2022-2557/articles.md +42 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CRA-2024-2847/articles.md +87 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CSDDD-2024-1760/articles.md +43 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CSRD-2022-2464/articles.md +42 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DGA-2022-868/articles.md +53 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DMA-2022-1925/articles.md +55 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DORA-2022-2554/articles.md +164 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DORA-2022-2554/audit-relevance.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/articles.md +3 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/audit-relevance.md +110 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/notice-and-action.md +138 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/small-platform-pflichten.md +109 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/trusted-flaggers.md +77 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/vlop-vlose.md +130 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/Data-Act-2023-2854/articles.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/Data-Act-2023-2854/audit-relevance.md +77 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/MiCA-2023-1114/articles.md +124 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/MiCA-2023-1114/audit-relevance.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/NIS2-2022-2555/articles.md +101 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/ProdHaftRL-2024-2853/articles.md +68 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/eIDAS-2024-1183/articles.md +43 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/Finance/KWG.md +52 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/Finance/PSD2.md +67 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/Finance/ZAG.md +50 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/GlueStV/articles.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/HGB-AO/audit-relevance.md +27 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/HinSchG/articles.md +96 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/JuSchG-JMStV/articles.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/KritisDachG/articles.md +39 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/LkSG/articles.md +90 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/MedTech/DiGAV.md +60 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/MedTech/IVDR-2017-746.md +51 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/MedTech/MDR-2017-745.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/NIS2UmsuCG-BSIG/articles.md +53 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/StGB/relevante-paragraphen.md +157 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TDDDG/audit-relevance.md +33 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TDDDG/paragraphs.md +3 -2
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TKG/articles.md +73 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/UWG/audit-relevance.md +39 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/UWG/paragraphs.md +71 -3
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/VERIFICATION-STATUS.md +266 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/VSBG/audit-relevance.md +37 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/ePrivacy-RL-2002-58/articles.md +92 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/ePrivacy-RL-2002-58/audit-relevance.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/it-recht.md +115 -9
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/INDEX.md +1 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/ai/anthropic-dpa.md +87 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/astro/cookie-banner-pattern.md +202 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/astro/dse-section-pattern.md +198 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/astro/tracking-server-endpoint.md +193 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/auth0-tom.md +92 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/clerk-tom.md +84 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/django/auth-cookies-pattern.md +295 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/django/cookie-banner-pattern.md +318 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/django/gdpr-cleanup-celery.md +339 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/express/cookie-banner-pattern.md +237 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/express/gdpr-routes-pattern.md +256 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/express/helmet-csp-pattern.md +207 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/agb-versioning-pattern.md +305 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/cookie-banner-pattern.md +287 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/gdpr-models-pattern.md +290 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/tracking-config-pattern.md +263 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/auth-pattern.md +265 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/cookie-banner-pattern.md +255 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/gdpr-cleanup-cron.md +244 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/tracking-interceptor.md +239 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/api-route-bearer-auth.md +103 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/dynamic-rendering-headers.md +83 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/env-driven-tracking.md +135 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/rails/cookie-banner-pattern.md +294 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/rails/devise-dsgvo-pattern.md +262 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/rails/gdpr-anonymization-pattern.md +283 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/react/consent-gate-pattern.md +99 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/react/cookie-banner-pattern.md +204 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/strapi/cms-pii-pattern.md +301 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/strapi/notice-and-action-plugin.md +371 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/svelte/cookie-banner-pattern.md +234 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/svelte/dse-section-pattern.md +231 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/svelte/sveltekit-server-hooks-pattern.md +217 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/tracking/google-analytics-consent.md +129 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/tracking/posthog-consent.md +79 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/cookie-banner-pattern.md +208 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/dse-i18n-pattern.md +204 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/nuxt-vs-vue-only-pattern.md +197 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/tracking-pinia-pattern.md +211 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/strafrecht-steuer.md +1 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/streitwerte.json +176 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/DSFA-template.md +80 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/VVT-template-file-upload.md +98 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-EN-international.md +267 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-Audit-Klausel-Varianten.md +148 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-CH-revDSG.md +127 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-SCC-module2-controller-processor.md +180 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-SCC-module3-processor-subprocessor.md +144 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-Sub-Processor-List.md +114 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-TOMs.md +197 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-UK-IDTA.md +131 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-standard-DE.md +288 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/Joint-Controller-Vertrag-Art-26.md +265 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/scripts/health-check.sh +190 -48
- package/skills/compliance/aegis-native/brutaler-anwalt/scripts/test-triggers.sh +145 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/settings.json +90 -0
- package/skills/defensive/permoon-fork/README.md +40 -0
- package/skills/defensive/permoon-fork/multi-model-consolidation/SKILL.md +47 -0
- package/skills/defensive/permoon-fork/multi-model-severity/SKILL.md +34 -0
- package/skills/defensive/permoon-fork/multi-model-system-prompt/SKILL.md +40 -0
- package/skills/foundation/aegis-native/aegis-handover-writer/SKILL.md +1 -1
- package/skills/foundation/aegis-native/aegis-quality-gates/SKILL.md +1 -1
- package/skills/offensive/airecon-fork/ctf-crypto/SKILL.md +260 -0
- package/skills/offensive/airecon-fork/ctf-crypto-modern-ciphers/SKILL.md +688 -0
- package/skills/offensive/airecon-fork/ctf-forensics/SKILL.md +253 -0
- package/skills/offensive/airecon-fork/ctf-forensics-network/SKILL.md +480 -0
- package/skills/offensive/airecon-fork/ctf-heap-advanced/SKILL.md +336 -0
- package/skills/offensive/airecon-fork/ctf-pwn/SKILL.md +294 -0
- package/skills/offensive/airecon-fork/ctf-pwn-rop-and-shellcode/SKILL.md +392 -0
- package/skills/offensive/airecon-fork/ctf-reversing/SKILL.md +284 -0
- package/skills/offensive/airecon-fork/frameworks-django/SKILL.md +268 -0
- package/skills/offensive/airecon-fork/frameworks-dotnet/SKILL.md +280 -0
- package/skills/offensive/airecon-fork/frameworks-express/SKILL.md +266 -0
- package/skills/offensive/airecon-fork/frameworks-fastapi/SKILL.md +193 -0
- package/skills/offensive/airecon-fork/frameworks-flask/SKILL.md +297 -0
- package/skills/offensive/airecon-fork/frameworks-laravel/SKILL.md +260 -0
- package/skills/offensive/airecon-fork/frameworks-nextjs/SKILL.md +230 -0
- package/skills/offensive/airecon-fork/frameworks-php/SKILL.md +271 -0
- package/skills/offensive/airecon-fork/frameworks-rails/SKILL.md +269 -0
- package/skills/offensive/airecon-fork/frameworks-spring/SKILL.md +245 -0
- package/skills/offensive/airecon-fork/frameworks-wordpress/SKILL.md +348 -0
- package/skills/offensive/airecon-fork/payloads-command-injection/SKILL.md +459 -0
- package/skills/offensive/airecon-fork/payloads-http-parameter-pollution/SKILL.md +129 -0
- package/skills/offensive/airecon-fork/payloads-ldap-injection/SKILL.md +100 -0
- package/skills/offensive/airecon-fork/payloads-lfi/SKILL.md +485 -0
- package/skills/offensive/airecon-fork/payloads-sqli/SKILL.md +419 -0
- package/skills/offensive/airecon-fork/payloads-ssrf/SKILL.md +125 -0
- package/skills/offensive/airecon-fork/payloads-ssti/SKILL.md +443 -0
- package/skills/offensive/airecon-fork/payloads-xss/SKILL.md +447 -0
- package/skills/offensive/airecon-fork/payloads-xxe/SKILL.md +172 -0
- package/skills/offensive/airecon-fork/postexploit-ad-credential-attacks/SKILL.md +306 -0
- package/skills/offensive/airecon-fork/postexploit-container-escape/SKILL.md +299 -0
- package/skills/offensive/airecon-fork/postexploit-credential-dumping/SKILL.md +249 -0
- package/skills/offensive/airecon-fork/postexploit-lateral-movement/SKILL.md +194 -0
- package/skills/offensive/airecon-fork/postexploit-linux-privesc/SKILL.md +252 -0
- package/skills/offensive/airecon-fork/postexploit-netexec-workflow/SKILL.md +302 -0
- package/skills/offensive/airecon-fork/postexploit-pivoting/SKILL.md +205 -0
- package/skills/offensive/airecon-fork/postexploit-windows-privesc/SKILL.md +210 -0
- package/skills/offensive/airecon-fork/protocols-active-directory/SKILL.md +314 -0
- package/skills/offensive/airecon-fork/protocols-dns/SKILL.md +203 -0
- package/skills/offensive/airecon-fork/protocols-ftp/SKILL.md +159 -0
- package/skills/offensive/airecon-fork/protocols-graphql/SKILL.md +648 -0
- package/skills/offensive/airecon-fork/protocols-kerberos/SKILL.md +168 -0
- package/skills/offensive/airecon-fork/protocols-ldap/SKILL.md +245 -0
- package/skills/offensive/airecon-fork/protocols-rdp/SKILL.md +186 -0
- package/skills/offensive/airecon-fork/protocols-smb/SKILL.md +191 -0
- package/skills/offensive/airecon-fork/protocols-smtp-imap/SKILL.md +263 -0
- package/skills/offensive/airecon-fork/protocols-snmp/SKILL.md +147 -0
- package/skills/offensive/airecon-fork/protocols-ssh/SKILL.md +287 -0
- package/skills/offensive/airecon-fork/reconnaissance-asn-whois-osint/SKILL.md +236 -0
- package/skills/offensive/airecon-fork/reconnaissance-ctf-methodology/SKILL.md +435 -0
- package/skills/offensive/airecon-fork/reconnaissance-dorking/SKILL.md +182 -0
- package/skills/offensive/airecon-fork/reconnaissance-exposed-devtools-detection/SKILL.md +513 -0
- package/skills/offensive/airecon-fork/reconnaissance-full-recon/SKILL.md +305 -0
- package/skills/offensive/airecon-fork/reconnaissance-internal-pentest/SKILL.md +202 -0
- package/skills/offensive/airecon-fork/reconnaissance-javascript-analysis/SKILL.md +167 -0
- package/skills/offensive/airecon-fork/reconnaissance-js-internal-hostname-intelligence/SKILL.md +391 -0
- package/skills/offensive/airecon-fork/reconnaissance-monitoring-secrets-exposure/SKILL.md +394 -0
- package/skills/offensive/airecon-fork/reconnaissance-shodan-censys/SKILL.md +279 -0
- package/skills/offensive/airecon-fork/reconnaissance-subdomain-enum/SKILL.md +952 -0
- package/skills/offensive/airecon-fork/technologies-cicd-attacks/SKILL.md +283 -0
- package/skills/offensive/airecon-fork/technologies-cloud-security/SKILL.md +299 -0
- package/skills/offensive/airecon-fork/technologies-docker-container/SKILL.md +266 -0
- package/skills/offensive/airecon-fork/technologies-elasticsearch/SKILL.md +226 -0
- package/skills/offensive/airecon-fork/technologies-firebase-firestore/SKILL.md +213 -0
- package/skills/offensive/airecon-fork/technologies-frida-hooking/SKILL.md +387 -0
- package/skills/offensive/airecon-fork/technologies-gitlab-github/SKILL.md +259 -0
- package/skills/offensive/airecon-fork/technologies-jenkins/SKILL.md +256 -0
- package/skills/offensive/airecon-fork/technologies-kubernetes-pentest/SKILL.md +281 -0
- package/skills/offensive/airecon-fork/technologies-memcached/SKILL.md +230 -0
- package/skills/offensive/airecon-fork/technologies-mobile-app-pentesting/SKILL.md +105 -0
- package/skills/offensive/airecon-fork/technologies-mongodb/SKILL.md +257 -0
- package/skills/offensive/airecon-fork/technologies-nginx-apache/SKILL.md +280 -0
- package/skills/offensive/airecon-fork/technologies-observability-stack-attacks/SKILL.md +501 -0
- package/skills/offensive/airecon-fork/technologies-redis/SKILL.md +236 -0
- package/skills/offensive/airecon-fork/technologies-supabase/SKILL.md +270 -0
- package/skills/offensive/airecon-fork/technologies-tomcat/SKILL.md +232 -0
- package/skills/offensive/airecon-fork/tools-advanced-fuzzing/SKILL.md +351 -0
- package/skills/offensive/airecon-fork/tools-browser-automation/SKILL.md +300 -0
- package/skills/offensive/airecon-fork/tools-caido/SKILL.md +776 -0
- package/skills/offensive/airecon-fork/tools-code-review/SKILL.md +71 -0
- package/skills/offensive/airecon-fork/tools-dalfox/SKILL.md +189 -0
- package/skills/offensive/airecon-fork/tools-hashcat-john/SKILL.md +258 -0
- package/skills/offensive/airecon-fork/tools-impacket/SKILL.md +227 -0
- package/skills/offensive/airecon-fork/tools-install/SKILL.md +202 -0
- package/skills/offensive/airecon-fork/tools-metasploit/SKILL.md +270 -0
- package/skills/offensive/airecon-fork/tools-nmap/SKILL.md +211 -0
- package/skills/offensive/airecon-fork/tools-nuclei/SKILL.md +175 -0
- package/skills/offensive/airecon-fork/tools-reporting/SKILL.md +47 -0
- package/skills/offensive/airecon-fork/tools-scripting/SKILL.md +1939 -0
- package/skills/offensive/airecon-fork/tools-semgrep/SKILL.md +202 -0
- package/skills/offensive/airecon-fork/tools-source-audit/SKILL.md +308 -0
- package/skills/offensive/airecon-fork/tools-sqlmap/SKILL.md +137 -0
- package/skills/offensive/airecon-fork/tools-tool-catalog/SKILL.md +320 -0
- package/skills/offensive/airecon-fork/tools-wapiti/SKILL.md +293 -0
- package/skills/offensive/airecon-fork/vulnerabilities-2fa-bypass/SKILL.md +219 -0
- package/skills/offensive/airecon-fork/vulnerabilities-account-takeover/SKILL.md +223 -0
- package/skills/offensive/airecon-fork/vulnerabilities-api-schema-exposure/SKILL.md +849 -0
- package/skills/offensive/airecon-fork/vulnerabilities-api-testing/SKILL.md +278 -0
- package/skills/offensive/airecon-fork/vulnerabilities-auth-workflow/SKILL.md +252 -0
- package/skills/offensive/airecon-fork/vulnerabilities-authentication-jwt/SKILL.md +158 -0
- package/skills/offensive/airecon-fork/vulnerabilities-bfla/SKILL.md +156 -0
- package/skills/offensive/airecon-fork/vulnerabilities-blind-xss/SKILL.md +111 -0
- package/skills/offensive/airecon-fork/vulnerabilities-business-logic/SKILL.md +313 -0
- package/skills/offensive/airecon-fork/vulnerabilities-cors/SKILL.md +242 -0
- package/skills/offensive/airecon-fork/vulnerabilities-crlf-injection/SKILL.md +146 -0
- package/skills/offensive/airecon-fork/vulnerabilities-csrf/SKILL.md +200 -0
- package/skills/offensive/airecon-fork/vulnerabilities-csrf-advanced-bypass/SKILL.md +536 -0
- package/skills/offensive/airecon-fork/vulnerabilities-deserialization/SKILL.md +363 -0
- package/skills/offensive/airecon-fork/vulnerabilities-dom-based-vulnerabilities/SKILL.md +105 -0
- package/skills/offensive/airecon-fork/vulnerabilities-exploitation/SKILL.md +286 -0
- package/skills/offensive/airecon-fork/vulnerabilities-grpc/SKILL.md +123 -0
- package/skills/offensive/airecon-fork/vulnerabilities-host-header-injection/SKILL.md +169 -0
- package/skills/offensive/airecon-fork/vulnerabilities-http-smuggling/SKILL.md +411 -0
- package/skills/offensive/airecon-fork/vulnerabilities-idor/SKILL.md +705 -0
- package/skills/offensive/airecon-fork/vulnerabilities-information-disclosure/SKILL.md +867 -0
- package/skills/offensive/airecon-fork/vulnerabilities-insecure-file-uploads/SKILL.md +190 -0
- package/skills/offensive/airecon-fork/vulnerabilities-jwt-attacks/SKILL.md +270 -0
- package/skills/offensive/airecon-fork/vulnerabilities-kubernetes/SKILL.md +252 -0
- package/skills/offensive/airecon-fork/vulnerabilities-mass-assignment/SKILL.md +788 -0
- package/skills/offensive/airecon-fork/vulnerabilities-nosql-injection/SKILL.md +204 -0
- package/skills/offensive/airecon-fork/vulnerabilities-oauth-misconfig/SKILL.md +220 -0
- package/skills/offensive/airecon-fork/vulnerabilities-oauth-saml/SKILL.md +163 -0
- package/skills/offensive/airecon-fork/vulnerabilities-open-redirect/SKILL.md +167 -0
- package/skills/offensive/airecon-fork/vulnerabilities-password-reset-poisoning/SKILL.md +66 -0
- package/skills/offensive/airecon-fork/vulnerabilities-path-traversal/SKILL.md +192 -0
- package/skills/offensive/airecon-fork/vulnerabilities-privilege-escalation/SKILL.md +320 -0
- package/skills/offensive/airecon-fork/vulnerabilities-prototype-pollution/SKILL.md +242 -0
- package/skills/offensive/airecon-fork/vulnerabilities-race-conditions/SKILL.md +192 -0
- package/skills/offensive/airecon-fork/vulnerabilities-rce/SKILL.md +240 -0
- package/skills/offensive/airecon-fork/vulnerabilities-sensitive-file-pii-exposure/SKILL.md +589 -0
- package/skills/offensive/airecon-fork/vulnerabilities-spring4shell/SKILL.md +86 -0
- package/skills/offensive/airecon-fork/vulnerabilities-sql-injection/SKILL.md +313 -0
- package/skills/offensive/airecon-fork/vulnerabilities-ssrf/SKILL.md +183 -0
- package/skills/offensive/airecon-fork/vulnerabilities-ssti/SKILL.md +344 -0
- package/skills/offensive/airecon-fork/vulnerabilities-subdomain-takeover/SKILL.md +160 -0
- package/skills/offensive/airecon-fork/vulnerabilities-supply-chain/SKILL.md +125 -0
- package/skills/offensive/airecon-fork/vulnerabilities-unhandled-exception-differential/SKILL.md +742 -0
- package/skills/offensive/airecon-fork/vulnerabilities-waf-detection/SKILL.md +90 -0
- package/skills/offensive/airecon-fork/vulnerabilities-web-cache-poisoning/SKILL.md +233 -0
- package/skills/offensive/airecon-fork/vulnerabilities-websocket/SKILL.md +180 -0
- package/skills/offensive/airecon-fork/vulnerabilities-xss/SKILL.md +316 -0
- package/skills/offensive/airecon-fork/vulnerabilities-xxe/SKILL.md +222 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: anwalt:simulate
|
|
3
|
+
description: Abmahn-Simulation auf vorhandene Findings. Generiert Streitwert-Range pro Finding + modifizierte Unterlassungserklaerung (mUE-Template) + Anwalts-Kostenrange + Risk-Score. Eingabe: bestehender Audit-Output ODER konkretes Pattern.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Grep, Bash, WebFetch
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /anwalt:simulate — Abmahn-Schadens-Simulation
|
|
8
|
+
|
|
9
|
+
> Modus SIMULATE aus `references/abmahn-templates.md`. Nimmt verifizierte
|
|
10
|
+
> Findings (Wahrsch. > 60%) und generiert eine realistische Abmahn-Schadens-
|
|
11
|
+
> Simulation: was wuerde es kosten wenn ein Abmahn-Anwalt heute auftaucht?
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Input-Modes
|
|
16
|
+
|
|
17
|
+
### Mode A — Existing Audit
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
/anwalt:simulate audits/BRUTALER-AUDIT-2026-05-15.md
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Liest Findings, filtert nach Wahrsch. > 60%, generiert mUE-Template + Kostenrange.
|
|
24
|
+
|
|
25
|
+
### Mode B — Single Pattern
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
/anwalt:simulate "Google Fonts wird via Google-CDN eingebunden ohne Consent"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Pattern wird gegen `references/audit-patterns.md` + `references/bgh-urteile.md`
|
|
32
|
+
gematcht, dann simuliert.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Schadens-Diagnose-Formel
|
|
37
|
+
|
|
38
|
+
Aus `references/audit-patterns.md` Schadens-Formel:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Schaden_EUR = Base_Streitwert × Branche_Multiplikator × Schwere_Faktor × Aktor_Faktor
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Wobei:
|
|
45
|
+
- **Base_Streitwert** = strukturierter Wert aus `references/streitwerte.json` (v4.4.0+)
|
|
46
|
+
oder Az.-Anker aus `references/bgh-urteile.md`
|
|
47
|
+
- **Branche_Multiplikator** = 1.0 (Standard), 1.5 (Heilberuf/MedTech/Finance/Spa)
|
|
48
|
+
- **Schwere_Faktor** = LOW=0.5, MED=1.0, HIGH=2.0, CRIT=4.0
|
|
49
|
+
- **Aktor_Faktor** = 1.0 (Standard), 1.5 (Verbraucherzentrale), 2.0 (Wettbewerbszentrale), 2.5 (bekannter Abmahn-Anwalt Gravenreuth/RAK/etc.)
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Output-Struktur
|
|
54
|
+
|
|
55
|
+
Erzeuge `audits/ABMAHN-SIMULATION-<YYYY-MM-DD>.md`:
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
# Abmahn-Simulation — <Projekt> — <YYYY-MM-DD>
|
|
59
|
+
|
|
60
|
+
> **Haftungsausschluss**: Keine Rechtsberatung i.S.d. § 2 RDG. Diese Simulation
|
|
61
|
+
> ist eine **technisch-statistische Schaetzung** basierend auf historischen
|
|
62
|
+
> Bussgeld/Schadensersatz-Az. — KEIN Ersatz fuer anwaltliche Pruefung im
|
|
63
|
+
> Ernstfall.
|
|
64
|
+
|
|
65
|
+
## Simulationen pro Finding
|
|
66
|
+
|
|
67
|
+
### F-001 — <Titel> — Wahrscheinlichkeit 75%
|
|
68
|
+
|
|
69
|
+
**Realistic-Scenario** (50% wahrscheinlich):
|
|
70
|
+
- Abmahn-Anwalt: <Kategorie>
|
|
71
|
+
- Streitwert: 8.000 EUR
|
|
72
|
+
- Anwalts-Kosten (1.3-Geschaeftsgebuehr): 887,03 EUR
|
|
73
|
+
- Schadensersatz (DSGVO Art. 82 / UWG § 9): 0-500 EUR pro betroffene Person
|
|
74
|
+
- **Gesamtschaden (worst-case)**: 2.500-12.000 EUR
|
|
75
|
+
- **Az.-Anker**: BGH I ZR 113/20 [primary-source-verified] + LG Muenchen 3 O 17493/20 (Google Fonts)
|
|
76
|
+
|
|
77
|
+
**Best-Case**:
|
|
78
|
+
- Modifizierte Unterlassungserklaerung ohne Kostenuebernahme akzeptiert
|
|
79
|
+
- Nur Anwalts-Kosten der Gegenseite: 887 EUR
|
|
80
|
+
- Keine Bussgeldverfahren initiiert
|
|
81
|
+
|
|
82
|
+
**Worst-Case**:
|
|
83
|
+
- Wettbewerbszentrale schaltet sich ein → mehrere Abmahnungen gleichzeitig
|
|
84
|
+
- BfDI-Bussgeldverfahren wegen Art. 5/Art. 32 DSGVO
|
|
85
|
+
- Schadenshoehe: 20.000-100.000 EUR + Reputationsschaden
|
|
86
|
+
- Az.-Anker: BfDI-Bescheid 1&1 (9,55M EUR), Vodafone-Bescheid (15M EUR), H&M (35M EUR)
|
|
87
|
+
|
|
88
|
+
### F-002 — ...
|
|
89
|
+
|
|
90
|
+
...
|
|
91
|
+
|
|
92
|
+
## Modifizierte Unterlassungserklaerung (mUE-Template)
|
|
93
|
+
|
|
94
|
+
```markdown
|
|
95
|
+
# Modifizierte Unterlassungserklaerung
|
|
96
|
+
|
|
97
|
+
Hiermit verpflichte ich, <Firma>, vertreten durch <Geschaeftsfuehrer>,
|
|
98
|
+
|
|
99
|
+
1. es zu unterlassen, im geschaeftlichen Verkehr <konkretes Pattern>
|
|
100
|
+
ohne vorherige nachweisbare Einwilligung der Betroffenen durchzufuehren;
|
|
101
|
+
|
|
102
|
+
2. fuer jeden Fall der schuldhaften Zuwiderhandlung gegen die unter Ziffer 1
|
|
103
|
+
ausgesprochene Verpflichtung eine angemessene Vertragsstrafe, deren Hoehe
|
|
104
|
+
in das billige Ermessen des Beklagten gestellt wird und im Streitfall vom
|
|
105
|
+
zustaendigen Gericht zu ueberpruefen ist, an die Glaeubigerin zu zahlen
|
|
106
|
+
(Hamburger Brauch, BGH I ZR 30/93);
|
|
107
|
+
|
|
108
|
+
3. die Berechtigung der Abmahnung — soweit ueberhaupt zugestanden — NUR
|
|
109
|
+
teilweise und unter Vorbehalt jeglicher Bestreitung des Verschuldens
|
|
110
|
+
bzw. der Wiederholungsgefahr anzuerkennen.
|
|
111
|
+
|
|
112
|
+
Mit dieser Erklaerung wird KEIN Anspruch der Klaegerseite anerkannt, der
|
|
113
|
+
ueber die ausdrueckliche Unterlassungspflicht hinausgeht.
|
|
114
|
+
|
|
115
|
+
<Ort>, <Datum> <Unterschrift>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Gesamt-Risk-Score
|
|
119
|
+
|
|
120
|
+
| Metrik | Wert |
|
|
121
|
+
|---|---|
|
|
122
|
+
| Wahrscheinlichste Abmahn-Welle in den naechsten 6 Monaten | <%> |
|
|
123
|
+
| Erwartete Gesamtkosten (50%-Quantil) | <EUR> |
|
|
124
|
+
| Worst-Case (95%-Quantil) | <EUR> |
|
|
125
|
+
| Empfohlene Sofortaktion | <konkrete Liste> |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Empfohlene Praeventiv-Massnahmen
|
|
130
|
+
|
|
131
|
+
Vor Eintreffen einer Abmahnung:
|
|
132
|
+
1. <konkrete Mitigation pro Finding>
|
|
133
|
+
2. ...
|
|
134
|
+
|
|
135
|
+
Falls bereits Abmahnung erhalten:
|
|
136
|
+
1. **NICHT** die beigefuegte UE unterzeichnen — mUE-Template oben nutzen
|
|
137
|
+
2. Anwalt einschalten BEVOR Antwort-Frist (typ. 3-10 Tage) ablaeuft
|
|
138
|
+
3. Beweise sichern: vollstaendige Original-Abmahnung + Anlagen + Briefumschlag-Eingang archivieren
|
|
139
|
+
4. Gegenseite-Anwalts-Berechtigung pruefen (Vollmacht beifuegt?)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Halt-Conditions
|
|
145
|
+
|
|
146
|
+
- Wenn keine Findings mit Wahrsch. > 60% existieren: ABSTAND, Simulation nicht sinnvoll.
|
|
147
|
+
- Wenn Az.-Anker fehlt: STOP, `/anwalt:az-verify` zuerst.
|
|
148
|
+
- Wenn streitwerte.json fehlt (vor v4.4.0): fallback auf prose-estimates aus `references/abmahn-templates.md`.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Disclaimer
|
|
153
|
+
|
|
154
|
+
Diese Simulation ist eine **technisch-statistische Schaetzung** basierend auf
|
|
155
|
+
oeffentlichen Bussgeld/Schadensersatz-Az. und historischen Abmahn-Wellen.
|
|
156
|
+
Sie ist KEINE Rechtsberatung i.S.d. § 2 RDG (BGH I ZR 113/20 Smartlaw) und
|
|
157
|
+
KEIN Ersatz fuer anwaltliche Pruefung. Im Ernstfall: zugelassenen IT-Recht-
|
|
158
|
+
Fachanwalt einschalten.
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
PostToolUse-Hook fuer brutaler-anwalt (v4.3.0+).
|
|
4
|
+
|
|
5
|
+
Triggers nach Write/Edit auf Audit-Output-Files. Erzwingt 3 Quality-Gates:
|
|
6
|
+
|
|
7
|
+
1. DISCLAIMER-BLOCK (RDG §2, blocking warning)
|
|
8
|
+
- "Haftungsausschluss" + "Keine Rechtsberatung" in ersten 40 Zeilen
|
|
9
|
+
- stderr-Warnung non-blocking (User muss bewusst entscheiden)
|
|
10
|
+
|
|
11
|
+
2. FINDING-ID-UNIQUENESS (blocking exit 2)
|
|
12
|
+
- Audit-Output-Files: pro "## Finding (F-NNN)" Pattern duerfen IDs nicht dupliziert sein
|
|
13
|
+
- Verhindert versehentliche Dup-IDs nach Persona-Synthese
|
|
14
|
+
|
|
15
|
+
3. AZ.-PROVENANCE-GUARD (blocking exit 2, SKILL.md §5)
|
|
16
|
+
- Jede Az.-Nummer im Output braucht Source-Markierung
|
|
17
|
+
- Akzeptierte Marker: Source-URL in selber Zeile / Folgezeile
|
|
18
|
+
oder "[ungeprueft, manuelle Verifikation vor Schriftsatz erforderlich]"
|
|
19
|
+
oder "[secondary-source-verified]"
|
|
20
|
+
oder "[primary-source-verified]"
|
|
21
|
+
- Verdaechtige Pattern (Halluzinations-Indikatoren) werden separat gemeldet:
|
|
22
|
+
- "1234/22", "9999/22" Placeholder-Style
|
|
23
|
+
- Az.-Jahr vs. Urteilsjahr divergiert > 2 Jahre
|
|
24
|
+
- Az. ohne jeglichen Source-Hint im Umkreis
|
|
25
|
+
|
|
26
|
+
Input: JSON auf stdin (tool_input.file_path)
|
|
27
|
+
Output: stderr-Warnungen + Exit-Code 0/2
|
|
28
|
+
|
|
29
|
+
Aktivierung: ueber .claude-plugin/plugin.json hookSpec
|
|
30
|
+
Disable: set BRUTALER_ANWALT_HOOK_DISABLE=1 in env
|
|
31
|
+
"""
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import json
|
|
35
|
+
import os
|
|
36
|
+
import re
|
|
37
|
+
import sys
|
|
38
|
+
from typing import Iterable
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
RELEVANT_PATH_PATTERNS = [
|
|
42
|
+
re.compile(r"audits?[\\/].+\.md$"),
|
|
43
|
+
re.compile(r"compliance[\\/].+\.md$"),
|
|
44
|
+
re.compile(r"legal-audit[\\/].+\.md$"),
|
|
45
|
+
re.compile(r"BRUTALER-AUDIT.*\.md$"),
|
|
46
|
+
re.compile(r"COMPLIANCE-AUDIT.*\.md$"),
|
|
47
|
+
re.compile(r".*-AUDIT-\d{4}-\d{2}-\d{2}.*\.md$"),
|
|
48
|
+
re.compile(r"ABMAHN-SIMULATION.*\.md$"),
|
|
49
|
+
re.compile(r"FINDINGS.*\.md$"),
|
|
50
|
+
re.compile(r"LegalAudit\.md$"),
|
|
51
|
+
re.compile(r"DSAR-\d{4}-\d{2}-\d{2}.*\.md$"),
|
|
52
|
+
re.compile(r"AVV-REDLINE.*\.md$"),
|
|
53
|
+
re.compile(r"references[\\/]streitwerte\.json$"),
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
MAX_FILE_SIZE_BYTES = 5_000_000
|
|
58
|
+
|
|
59
|
+
FORBIDDEN_PATH_PREFIXES = [
|
|
60
|
+
"/etc/", "/var/", "/usr/", "/sys/", "/proc/", "/dev/",
|
|
61
|
+
"/private/etc/", "/private/var/",
|
|
62
|
+
"/Library/Keychains/", "/Library/Application Support/Keychain/",
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
DISCLAIMER_HEAD = re.compile(r"Haftungsausschluss|Disclaimer", re.IGNORECASE)
|
|
66
|
+
DISCLAIMER_BODY = re.compile(r"Keine\s+Rechtsberatung|not\s+legal\s+advice|RDG", re.IGNORECASE)
|
|
67
|
+
|
|
68
|
+
FINDING_ID_RE = re.compile(r"^##\s+Finding\s+(F-\d{3})", re.MULTILINE)
|
|
69
|
+
|
|
70
|
+
AZ_PATTERNS = [
|
|
71
|
+
re.compile(r"\bBGH\s+[IVX]+\s+ZR\s+\d{1,4}/\d{2}\b"),
|
|
72
|
+
re.compile(r"\bBGH\s+[IVX]+\s+ZB\s+\d{1,4}/\d{2}\b"),
|
|
73
|
+
re.compile(r"\bBVerfG\s+\d\s+BvR\s+\d{1,4}/\d{2}\b"),
|
|
74
|
+
re.compile(r"\bEuGH\s+C-\d{1,4}/\d{2}\b"),
|
|
75
|
+
re.compile(r"\bOLG\s+\w+\s+\d{1,2}\s+U\s+\d{1,4}/\d{2}\b"),
|
|
76
|
+
re.compile(r"\bLG\s+\w+\s+\d{1,2}\s+O\s+\d{1,4}/\d{2}\b"),
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
SOURCE_MARKER_RE = re.compile(
|
|
80
|
+
r"\["
|
|
81
|
+
r"(ungeprueft|secondary-source-verified|primary-source-verified|verified)"
|
|
82
|
+
r"[^\]]*\]"
|
|
83
|
+
r"|https?://(?:juris\.bundesgerichtshof\.de|bundesgerichtshof\.de|curia\.europa\.eu"
|
|
84
|
+
r"|eur-lex\.europa\.eu|dejure\.org|openjur\.de|rewis\.io|nrwe\.justiz\.nrw\.de"
|
|
85
|
+
r"|medien-internet-und-recht\.de|bundesanzeiger\.de|gesetze-im-internet\.de)",
|
|
86
|
+
re.IGNORECASE,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
SUSPICIOUS_AZ_PLACEHOLDERS = [
|
|
90
|
+
re.compile(r"\b1234/\d{2}\b"),
|
|
91
|
+
re.compile(r"\b9999/\d{2}\b"),
|
|
92
|
+
re.compile(r"\b1111/\d{2}\b"),
|
|
93
|
+
re.compile(r"\b0000/\d{2}\b"),
|
|
94
|
+
re.compile(r"\b5678/\d{2}\b"),
|
|
95
|
+
re.compile(r"\b(?:0123|1234|2345|3456|4567|5678|6789)/\d{2}\b"),
|
|
96
|
+
re.compile(r"\b(?:1000|2000|3000|4000|5000|6000|7000|8000)/\d{2}\b"),
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
BYPASS_AZ_CHECK_RE = re.compile(
|
|
100
|
+
r"<!--\s*brutaler-anwalt:\s*bypass-az-check"
|
|
101
|
+
r"(?:,\s*reason=(?:\"|')([^\"']+)(?:\"|'))?\s*-->",
|
|
102
|
+
re.IGNORECASE,
|
|
103
|
+
)
|
|
104
|
+
BYPASS_DISCLAIMER_RE = re.compile(
|
|
105
|
+
r"<!--\s*brutaler-anwalt:\s*bypass-disclaimer"
|
|
106
|
+
r"(?:,\s*reason=(?:\"|')([^\"']+)(?:\"|'))?\s*-->",
|
|
107
|
+
re.IGNORECASE,
|
|
108
|
+
)
|
|
109
|
+
BYPASS_ALL_RE = re.compile(
|
|
110
|
+
r"<!--\s*brutaler-anwalt:\s*bypass-all"
|
|
111
|
+
r"(?:,\s*reason=(?:\"|')([^\"']+)(?:\"|'))?\s*-->",
|
|
112
|
+
re.IGNORECASE,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def main() -> int:
|
|
117
|
+
if os.environ.get("BRUTALER_ANWALT_HOOK_DISABLE") == "1":
|
|
118
|
+
return 0
|
|
119
|
+
|
|
120
|
+
if hasattr(sys.stdout, "reconfigure"):
|
|
121
|
+
sys.stdout.reconfigure(encoding="utf-8")
|
|
122
|
+
if hasattr(sys.stderr, "reconfigure"):
|
|
123
|
+
sys.stderr.reconfigure(encoding="utf-8")
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
data = json.loads(sys.stdin.read() or "{}")
|
|
127
|
+
except Exception:
|
|
128
|
+
return 0
|
|
129
|
+
|
|
130
|
+
file_path = (data.get("tool_input") or {}).get("file_path") or ""
|
|
131
|
+
if not file_path or not os.path.isfile(file_path):
|
|
132
|
+
return 0
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
real_path = os.path.realpath(file_path)
|
|
136
|
+
except (OSError, ValueError):
|
|
137
|
+
return 0
|
|
138
|
+
|
|
139
|
+
for forbidden in FORBIDDEN_PATH_PREFIXES:
|
|
140
|
+
if real_path.startswith(forbidden):
|
|
141
|
+
print(
|
|
142
|
+
f"[brutaler-anwalt] SECURITY: Hook refused to read system-path {real_path!r} "
|
|
143
|
+
f"(matches forbidden prefix {forbidden!r}). Pfad-Traversal-Verdacht.",
|
|
144
|
+
file=sys.stderr,
|
|
145
|
+
)
|
|
146
|
+
return 0
|
|
147
|
+
|
|
148
|
+
normalized = real_path.replace("\\", "/")
|
|
149
|
+
if not any(p.search(normalized) for p in RELEVANT_PATH_PATTERNS):
|
|
150
|
+
return 0
|
|
151
|
+
|
|
152
|
+
try:
|
|
153
|
+
size = os.path.getsize(real_path)
|
|
154
|
+
except OSError:
|
|
155
|
+
return 0
|
|
156
|
+
if size > MAX_FILE_SIZE_BYTES:
|
|
157
|
+
print(
|
|
158
|
+
f"[brutaler-anwalt] WARNUNG: {real_path} ist {size} bytes > "
|
|
159
|
+
f"{MAX_FILE_SIZE_BYTES}-byte-Cap. Hook ueberspringt Validierung. "
|
|
160
|
+
f"Bitte File splitten oder bewusst akzeptieren.",
|
|
161
|
+
file=sys.stderr,
|
|
162
|
+
)
|
|
163
|
+
return 0
|
|
164
|
+
|
|
165
|
+
try:
|
|
166
|
+
with open(real_path, "r", encoding="utf-8") as f:
|
|
167
|
+
text = f.read()
|
|
168
|
+
except Exception:
|
|
169
|
+
return 0
|
|
170
|
+
|
|
171
|
+
file_path = real_path
|
|
172
|
+
|
|
173
|
+
first_lines = "\n".join(text.splitlines()[:40])
|
|
174
|
+
exit_code = 0
|
|
175
|
+
|
|
176
|
+
bypass_all_match = BYPASS_ALL_RE.search(text)
|
|
177
|
+
if bypass_all_match:
|
|
178
|
+
reason = bypass_all_match.group(1) or "<no reason given>"
|
|
179
|
+
print(
|
|
180
|
+
f"[brutaler-anwalt] BYPASS-ALL aktiv in {file_path}: {reason!r}. "
|
|
181
|
+
f"Alle Quality-Gates uebersprungen — User-eigene Verantwortung.",
|
|
182
|
+
file=sys.stderr,
|
|
183
|
+
)
|
|
184
|
+
return 0
|
|
185
|
+
|
|
186
|
+
bypass_disclaimer = bool(BYPASS_DISCLAIMER_RE.search(first_lines))
|
|
187
|
+
|
|
188
|
+
# Gate 1: Disclaimer (non-blocking warn)
|
|
189
|
+
if not bypass_disclaimer and (
|
|
190
|
+
not DISCLAIMER_HEAD.search(first_lines) or not DISCLAIMER_BODY.search(first_lines)
|
|
191
|
+
):
|
|
192
|
+
print(
|
|
193
|
+
f"[brutaler-anwalt] WARNUNG: {file_path} fehlt der verpflichtende "
|
|
194
|
+
f"Disclaimer-Block (Haftungsausschluss + Keine Rechtsberatung / RDG §2) "
|
|
195
|
+
f"in den ersten 40 Zeilen.",
|
|
196
|
+
file=sys.stderr,
|
|
197
|
+
)
|
|
198
|
+
print(
|
|
199
|
+
"[brutaler-anwalt] Vorlage:\n"
|
|
200
|
+
" > **Haftungsausschluss**: Diese Analyse ist keine Rechtsberatung\n"
|
|
201
|
+
" > i.S.d. § 2 RDG und ersetzt keinen zugelassenen Rechtsanwalt.",
|
|
202
|
+
file=sys.stderr,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
# Gate 2: Finding-ID-Uniqueness (blocking)
|
|
206
|
+
ids = FINDING_ID_RE.findall(text)
|
|
207
|
+
seen: set[str] = set()
|
|
208
|
+
dupes: set[str] = set()
|
|
209
|
+
for fid in ids:
|
|
210
|
+
if fid in seen:
|
|
211
|
+
dupes.add(fid)
|
|
212
|
+
seen.add(fid)
|
|
213
|
+
if dupes:
|
|
214
|
+
print(
|
|
215
|
+
f"[brutaler-anwalt] FEHLER: {file_path} enthaelt doppelte Finding-IDs: "
|
|
216
|
+
f"{sorted(dupes)}. Findings muessen eindeutig durchnummeriert sein.",
|
|
217
|
+
file=sys.stderr,
|
|
218
|
+
)
|
|
219
|
+
exit_code = 2
|
|
220
|
+
|
|
221
|
+
# Gate 3: Az.-Provenance (blocking)
|
|
222
|
+
is_json = file_path.endswith(".json")
|
|
223
|
+
unsourced_az = collect_unsourced_az(text, is_json=is_json)
|
|
224
|
+
suspicious_az = collect_suspicious_az(text)
|
|
225
|
+
|
|
226
|
+
if unsourced_az:
|
|
227
|
+
print(
|
|
228
|
+
f"[brutaler-anwalt] FEHLER: {file_path} enthaelt {len(unsourced_az)} "
|
|
229
|
+
f"Az. ohne Source-Marker (SKILL.md §5 Az.-Provenance-Pflicht):",
|
|
230
|
+
file=sys.stderr,
|
|
231
|
+
)
|
|
232
|
+
for az_str, line_no in unsourced_az[:10]:
|
|
233
|
+
print(f" - Zeile {line_no}: {az_str!r}", file=sys.stderr)
|
|
234
|
+
if len(unsourced_az) > 10:
|
|
235
|
+
print(f" ... ({len(unsourced_az) - 10} weitere)", file=sys.stderr)
|
|
236
|
+
print(
|
|
237
|
+
"[brutaler-anwalt] Markiere jede Az. mit einem der Tags:\n"
|
|
238
|
+
" [primary-source-verified] — Az. aus juris/curia/dejure-Volltext verifiziert\n"
|
|
239
|
+
" [secondary-source-verified] — Az. aus etablierter Sekundaerquelle (medien-internet-und-recht etc.)\n"
|
|
240
|
+
" [ungeprueft, manuelle Verifikation vor Schriftsatz erforderlich] — Skill konnte nicht verifizieren\n"
|
|
241
|
+
"Oder fuege die Source-URL in der selben oder Folgezeile ein.",
|
|
242
|
+
file=sys.stderr,
|
|
243
|
+
)
|
|
244
|
+
exit_code = 2
|
|
245
|
+
|
|
246
|
+
if suspicious_az:
|
|
247
|
+
print(
|
|
248
|
+
f"[brutaler-anwalt] HALLUZINATIONS-VERDACHT: {file_path} enthaelt "
|
|
249
|
+
f"{len(suspicious_az)} Az. mit Placeholder-Pattern (1234/22, 9999/22 etc.):",
|
|
250
|
+
file=sys.stderr,
|
|
251
|
+
)
|
|
252
|
+
for az_str, line_no in suspicious_az[:5]:
|
|
253
|
+
print(f" - Zeile {line_no}: {az_str!r}", file=sys.stderr)
|
|
254
|
+
print(
|
|
255
|
+
"[brutaler-anwalt] WebFetch zur Volltext-Verifikation pflicht "
|
|
256
|
+
"(SKILL.md §5c). Bei keinem Treffer: Az. aus Output entfernen.",
|
|
257
|
+
file=sys.stderr,
|
|
258
|
+
)
|
|
259
|
+
exit_code = 2
|
|
260
|
+
|
|
261
|
+
return exit_code
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def collect_unsourced_az(text: str, is_json: bool = False) -> list[tuple[str, int]]:
|
|
265
|
+
"""
|
|
266
|
+
Liefert alle Az.-Treffer, denen ein Source-Marker fehlt.
|
|
267
|
+
Source-Marker = explicit-tag ODER bekannte Quelle-URL ODER Reference-File-Pfad
|
|
268
|
+
in derselben Zeile oder den N folgenden Zeilen (markdown=3, json=8).
|
|
269
|
+
Per-Finding-Bypass: HTML-Comment `<!-- brutaler-anwalt: bypass-az-check -->`
|
|
270
|
+
in der selben Zeile oder den 2 vorausgehenden Zeilen blockt den Check.
|
|
271
|
+
|
|
272
|
+
JSON-Files: source_url-Felder liegen oft 4-6 Zeilen entfernt vom Az. (Schema-
|
|
273
|
+
struktur). Daher groesseres Window fuer JSON.
|
|
274
|
+
"""
|
|
275
|
+
lines = text.splitlines()
|
|
276
|
+
findings: list[tuple[str, int]] = []
|
|
277
|
+
window_size = 10 if is_json else 4
|
|
278
|
+
for i, line in enumerate(lines):
|
|
279
|
+
for pat in AZ_PATTERNS:
|
|
280
|
+
for match in pat.finditer(line):
|
|
281
|
+
az_str = match.group(0)
|
|
282
|
+
window = "\n".join(lines[i:min(i + window_size, len(lines))])
|
|
283
|
+
if SOURCE_MARKER_RE.search(window):
|
|
284
|
+
continue
|
|
285
|
+
if "references/bgh-urteile.md" in window:
|
|
286
|
+
continue
|
|
287
|
+
if "bgh-urteile.md" in window:
|
|
288
|
+
continue
|
|
289
|
+
bypass_window = "\n".join(lines[max(0, i - 2):i + 2])
|
|
290
|
+
if BYPASS_AZ_CHECK_RE.search(bypass_window):
|
|
291
|
+
continue
|
|
292
|
+
findings.append((az_str, i + 1))
|
|
293
|
+
return findings
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def collect_suspicious_az(text: str) -> list[tuple[str, int]]:
|
|
297
|
+
"""Az. mit verdaechtigen Placeholder-Patterns (1234/22, 9999/22)."""
|
|
298
|
+
lines = text.splitlines()
|
|
299
|
+
findings: list[tuple[str, int]] = []
|
|
300
|
+
for i, line in enumerate(lines):
|
|
301
|
+
for pat in AZ_PATTERNS:
|
|
302
|
+
for match in pat.finditer(line):
|
|
303
|
+
az_str = match.group(0)
|
|
304
|
+
for suspicious in SUSPICIOUS_AZ_PLACEHOLDERS:
|
|
305
|
+
if suspicious.search(az_str):
|
|
306
|
+
bypass_window = "\n".join(lines[max(0, i - 2):i + 2])
|
|
307
|
+
if BYPASS_AZ_CHECK_RE.search(bypass_window):
|
|
308
|
+
continue
|
|
309
|
+
findings.append((az_str, i + 1))
|
|
310
|
+
break
|
|
311
|
+
return findings
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
if __name__ == "__main__":
|
|
315
|
+
sys.exit(main())
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
UserPromptSubmit-Hook fuer brutaler-anwalt (v4.3.0+).
|
|
4
|
+
|
|
5
|
+
Regex-matcht User-Prompt gegen Trigger aus hooks/triggers.json.
|
|
6
|
+
Bei Match: laedt die zugeordneten reference-Files und injiziert sie
|
|
7
|
+
als additionalContext. Spart vs. Vollload des References-Trees
|
|
8
|
+
typisch 70-90% Tokens pro Audit.
|
|
9
|
+
|
|
10
|
+
Halt-Condition: wenn KEIN Trigger matcht und der Prompt offensichtlich
|
|
11
|
+
ein Audit-Auftrag ist (Keywords: audit, compliance, dsgvo, abmahnung),
|
|
12
|
+
laed wir als Fallback `audit-patterns.md` immer.
|
|
13
|
+
|
|
14
|
+
Disable: set BRUTALER_ANWALT_HOOK_DISABLE=1 in env.
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import json
|
|
19
|
+
import os
|
|
20
|
+
import re
|
|
21
|
+
import sys
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
AUDIT_FALLBACK_KEYWORDS = re.compile(
|
|
25
|
+
r"\b(audit|compliance|dsgvo|abmahn|datenschutz|impressum|cookie|agb|"
|
|
26
|
+
r"avv|drittland|consent|uwg|nis2|ai-act|dsa|tdddg|ttdsg|gobd|art-9|"
|
|
27
|
+
r"art-13|art-15|art-83|datenpanne|breach|brutaler|anwalt)\b",
|
|
28
|
+
re.IGNORECASE,
|
|
29
|
+
)
|
|
30
|
+
AUDIT_FALLBACK_FILES = ["audit-patterns.md", "dsgvo.md", "bgh-urteile.md"]
|
|
31
|
+
|
|
32
|
+
MAX_FILES_PER_PROMPT = 8
|
|
33
|
+
MAX_BYTES_PER_FILE = 80_000
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def main() -> int:
|
|
37
|
+
if os.environ.get("BRUTALER_ANWALT_HOOK_DISABLE") == "1":
|
|
38
|
+
return 0
|
|
39
|
+
|
|
40
|
+
if hasattr(sys.stdout, "reconfigure"):
|
|
41
|
+
sys.stdout.reconfigure(encoding="utf-8")
|
|
42
|
+
if hasattr(sys.stdin, "reconfigure"):
|
|
43
|
+
sys.stdin.reconfigure(encoding="utf-8")
|
|
44
|
+
|
|
45
|
+
skill_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
46
|
+
triggers_path = os.path.join(skill_root, "hooks", "triggers.json")
|
|
47
|
+
refs_dir = os.path.join(skill_root, "references")
|
|
48
|
+
|
|
49
|
+
if not os.path.isfile(triggers_path):
|
|
50
|
+
return 0
|
|
51
|
+
|
|
52
|
+
prompt = ""
|
|
53
|
+
try:
|
|
54
|
+
raw = sys.stdin.read()
|
|
55
|
+
if raw.strip():
|
|
56
|
+
data = json.loads(raw)
|
|
57
|
+
prompt = data.get("prompt", "") or ""
|
|
58
|
+
except Exception:
|
|
59
|
+
return 0
|
|
60
|
+
|
|
61
|
+
if not prompt:
|
|
62
|
+
return 0
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
with open(triggers_path, "r", encoding="utf-8") as f:
|
|
66
|
+
cfg = json.load(f)
|
|
67
|
+
except Exception:
|
|
68
|
+
return 0
|
|
69
|
+
|
|
70
|
+
matched_files: list[str] = []
|
|
71
|
+
seen: set[str] = set()
|
|
72
|
+
matched_triggers: list[str] = []
|
|
73
|
+
|
|
74
|
+
for trigger in cfg.get("triggers", []):
|
|
75
|
+
pattern = trigger.get("pattern", "")
|
|
76
|
+
name = trigger.get("name", "<unnamed>")
|
|
77
|
+
if not pattern:
|
|
78
|
+
continue
|
|
79
|
+
try:
|
|
80
|
+
if re.search(pattern, prompt, re.IGNORECASE):
|
|
81
|
+
matched_triggers.append(name)
|
|
82
|
+
for rel in trigger.get("files", []):
|
|
83
|
+
if rel not in seen:
|
|
84
|
+
seen.add(rel)
|
|
85
|
+
matched_files.append(rel)
|
|
86
|
+
except re.error:
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
if not matched_files and AUDIT_FALLBACK_KEYWORDS.search(prompt):
|
|
90
|
+
for rel in AUDIT_FALLBACK_FILES:
|
|
91
|
+
if rel not in seen:
|
|
92
|
+
seen.add(rel)
|
|
93
|
+
matched_files.append(rel)
|
|
94
|
+
matched_triggers.append("<fallback-audit>")
|
|
95
|
+
|
|
96
|
+
if not matched_files:
|
|
97
|
+
return 0
|
|
98
|
+
|
|
99
|
+
if len(matched_files) > MAX_FILES_PER_PROMPT:
|
|
100
|
+
matched_files = matched_files[:MAX_FILES_PER_PROMPT]
|
|
101
|
+
|
|
102
|
+
blocks: list[str] = []
|
|
103
|
+
for rel in matched_files:
|
|
104
|
+
full = os.path.join(refs_dir, rel.replace("/", os.sep))
|
|
105
|
+
if not os.path.isfile(full):
|
|
106
|
+
blocks.append(
|
|
107
|
+
f"### references/{rel}\n\n"
|
|
108
|
+
f"> [Hinweis] Reference-File noch nicht angelegt.\n"
|
|
109
|
+
)
|
|
110
|
+
continue
|
|
111
|
+
try:
|
|
112
|
+
with open(full, "r", encoding="utf-8") as f:
|
|
113
|
+
content = f.read(MAX_BYTES_PER_FILE)
|
|
114
|
+
if os.path.getsize(full) > MAX_BYTES_PER_FILE:
|
|
115
|
+
content += (
|
|
116
|
+
f"\n\n> [Hinweis] File >{MAX_BYTES_PER_FILE} bytes — "
|
|
117
|
+
"Inhalt abgeschnitten. Manueller `Read`-Tool-Aufruf "
|
|
118
|
+
"fuer Volltext."
|
|
119
|
+
)
|
|
120
|
+
except Exception as e:
|
|
121
|
+
content = f"> [Lese-Fehler] {e}"
|
|
122
|
+
blocks.append(f"### references/{rel}\n\n{content}\n")
|
|
123
|
+
|
|
124
|
+
header = (
|
|
125
|
+
"# brutaler-anwalt — On-Demand-KB-Chunks (via UserPromptSubmit-Hook)\n\n"
|
|
126
|
+
f"Trigger gefeuert: {', '.join(matched_triggers)}\n"
|
|
127
|
+
f"Geladene Files: {len(matched_files)}\n\n"
|
|
128
|
+
"Nutze diese als Primaer-Referenz fuer den aktuellen Prompt. "
|
|
129
|
+
"Wenn Luecken: manueller `Read` auf weitere references/ oder "
|
|
130
|
+
"WebFetch (Tier-1-Allowlist in settings.json).\n\n---\n\n"
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
out = {
|
|
134
|
+
"hookSpecificOutput": {
|
|
135
|
+
"hookEventName": "UserPromptSubmit",
|
|
136
|
+
"additionalContext": header + "\n\n---\n\n".join(blocks),
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
print(json.dumps(out, ensure_ascii=False))
|
|
140
|
+
return 0
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
if __name__ == "__main__":
|
|
144
|
+
sys.exit(main())
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
SessionStart-Hook fuer brutaler-anwalt (v4.3.0+).
|
|
4
|
+
|
|
5
|
+
Laedt einen schlanken INDEX (~5 KB) aus references/INDEX.md statt
|
|
6
|
+
des kompletten 5056-Zeilen-References-Trees. Volltext-Chunks werden
|
|
7
|
+
on-demand per UserPromptSubmit-Hook geladen, wenn Keywords matchen.
|
|
8
|
+
|
|
9
|
+
Disable: set BRUTALER_ANWALT_HOOK_DISABLE=1 in env.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def main() -> int:
|
|
19
|
+
if os.environ.get("BRUTALER_ANWALT_HOOK_DISABLE") == "1":
|
|
20
|
+
return 0
|
|
21
|
+
|
|
22
|
+
if hasattr(sys.stdout, "reconfigure"):
|
|
23
|
+
sys.stdout.reconfigure(encoding="utf-8")
|
|
24
|
+
|
|
25
|
+
skill_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
26
|
+
index_path = os.path.join(skill_root, "references", "INDEX.md")
|
|
27
|
+
|
|
28
|
+
if not os.path.isfile(index_path):
|
|
29
|
+
return 0
|
|
30
|
+
|
|
31
|
+
try:
|
|
32
|
+
with open(index_path, "r", encoding="utf-8") as f:
|
|
33
|
+
content = f.read()
|
|
34
|
+
except Exception:
|
|
35
|
+
return 0
|
|
36
|
+
|
|
37
|
+
header = (
|
|
38
|
+
"# brutaler-anwalt — Reference-INDEX (via SessionStart-Hook)\n\n"
|
|
39
|
+
"**Volltext-Inhalte werden on-demand geladen**, wenn dein Prompt "
|
|
40
|
+
"passende Keywords enthaelt (siehe `hooks/triggers.json`).\n"
|
|
41
|
+
"Manuelles Laden: `Read references/<file>.md`.\n\n"
|
|
42
|
+
"Bei Audit-Start IMMER zuerst `references/audit-patterns.md` laden "
|
|
43
|
+
"(SKILL.md Schritt 0).\n\n---\n\n"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
out = {
|
|
47
|
+
"hookSpecificOutput": {
|
|
48
|
+
"hookEventName": "SessionStart",
|
|
49
|
+
"additionalContext": header + content,
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
print(json.dumps(out, ensure_ascii=False))
|
|
53
|
+
return 0
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
if __name__ == "__main__":
|
|
57
|
+
sys.exit(main())
|