cuonztech-privacy-chaos-gate 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -10,13 +10,13 @@ import {
10
10
  requestedLicensedFeatures,
11
11
  resolveEntitlement,
12
12
  resolveGateConfig,
13
- resolveJurisdiction
14
- } from "./chunk-42D7PLVP.js";
13
+ resolveJurisdictions
14
+ } from "./chunk-YOWEZW3W.js";
15
15
 
16
16
  // src/cli.ts
17
17
  import { Command, CommanderError } from "commander";
18
18
  import pc from "picocolors";
19
- var VERSION = true ? "0.2.2" : "dev";
19
+ var VERSION = true ? "0.3.0" : "dev";
20
20
  loadProjectEnv();
21
21
  function finish(code) {
22
22
  process.exitCode = code;
@@ -43,9 +43,9 @@ Lizenz:
43
43
  `;
44
44
  var collect = (value, previous) => [...previous, value];
45
45
  var program = new Command();
46
- program.name("cpcg").description("Cuonztech Privacy Chaos Gate - CI/CD Shift-Left Consent Scanner & Auto-Remediation").version(VERSION).option("-u, --url <url>", "Staging- oder localhost-URL (http/https) \u2014 Pflicht").option("-k, --api-key <key>", "LLM-API-Key; wirkt nur mit --llm-remediation (Env-Fallback nur passend zum Provider)").option("--llm-remediation [boolean]", "Opt-in: Quellcode darf zur Patch-Erzeugung an den LLM-Anbieter gesendet werden (default: false)").option("-p, --llm-provider <provider>", "LLM-Provider: openai | anthropic | gemini (umgesetzt ist derzeit nur openai; sonst greift die Regel-Engine) (default: openai)").option("-m, --llm-model <model>", "LLM-Modell (default: gpt-4o)").option("--auto-fix [boolean]", "Code-Patches erzeugen und im Quellverzeichnis anwenden (default: true nur mit ausdr\xFCcklichem --source-dir, sonst false)").option("--fail-on-leak [boolean]", "Build blockieren (Exit 1), wenn Leaks bleiben (default: true)").option("--fail-on-uncheckable [boolean]", "Exit 4, wenn Kernszenarien nicht pr\xFCfbar sind; bei false Exit 0, das Ergebnis bleibt als unvollst\xE4ndig markiert (default: true)").option("-r, --report-output <path>", "Pfad des JSON-Reports (default: reports/privacy-chaos-report.json)").option("-s, --source-dir <dir>", "Quellcode-Verzeichnis f\xFCr Auto-Fix; ausdr\xFCcklich angeben, um Auto-Fix zu aktivieren").option("--git-commit [boolean]", "Fixes automatisch in den Git-Branch committen \u2014 Lizenz erforderlich (default: false)").option("--create-pr [boolean]", "Fix-Branch anlegen und GitHub-PR \xF6ffnen; hat Vorrang vor --git-commit \u2014 Lizenz erforderlich (default: false)").option("--github-token <token>", "GitHub-Token f\xFCr PR-Erstellung (besser: Env GITHUB_TOKEN)").option("--base-branch <branch>", "PR-Basisbranch (default: Default-Branch des Remotes)").option("--branch-prefix <prefix>", "Branch-Pr\xE4fix f\xFCr Fix-PRs (default: fix/cpcg-privacy)").option("--headless [boolean]", "Browser headless starten (default: true)").option("--timeout-ms <ms>", "Timeout je Szenario-Navigation und f\xFCr den Erreichbarkeits-Check in ms, positive ganze Zahl (default: 30000)").option("--strict [boolean]", "Hinweise (rein funktionale Drittanbieter wie Google Fonts) blockieren das Gate ebenfalls (default: false)").option("--ignore <liste>", "Befunde ignorieren: Tracker-Name oder Host-Muster, kommagetrennt oder mehrfach (z. B. fonts.googleapis.com,*.hotjar.com); im Report als \xABignoriert\xBB ausgewiesen; `*`/`**` und nackte TLDs (com, ch) werden immer abgelehnt (zum Abschalten der Blockierung --fail-on-leak false), ganze Zonen (*.com) ohne --allow-broad-ignore", collect, []).option("--allow-broad-ignore [boolean]", "Ganze Zonen als --ignore-Muster (*.com, *.co.uk, .ch) bewusst zulassen; sie werden in Konsole und Report als Warnung ausgewiesen; `*` und nackte TLDs bleiben abgelehnt (default: false)").option("--accept-selector <css>", "Eigener CSS-Selektor des Akzeptieren-Buttons (mehrfach oder kommagetrennt)", collect, []).option("--reject-selector <css>", "Eigener CSS-Selektor des Ablehnen-Buttons (mehrfach oder kommagetrennt)", collect, []).option("--settings-selector <css>", "Eigener CSS-Selektor des Einstellungen-Buttons (mehrfach oder kommagetrennt)", collect, []).option("--banner-frame <teilstring>", "Teilstring der URL des Banner-iframes (CMP im Frame)").option("--max-subpages <n>", "Obergrenze der Unterseiten-Stichprobe (Szenario subpage-spa), ganze Zahl 1\u201340 (default: 12; Env CPCG_MAX_SUBPAGES). Bleibt die Stichprobe unvollst\xE4ndig, weist das Gate das aus (Exit-Code unver\xE4ndert)").option("--banner-wait <sekunden>", "Wartefenster auf einen (sp\xE4t erscheinenden) Banner in Sekunden, 1\u201360 (default: 8, bei Seiten ohne Banner-Hinweis fr\xFCher beendet; mit Angabe wird das Fenster ausgesch\xF6pft, auch bei --accept-selector/--reject-selector; Env CPCG_BANNER_WAIT)").option("--license <token>", "Cuonztech CPCG Lizenzcode CPCG-\u2026 oder Kunden-Key CPCG-K-\u2026 (oder Env CPCG_LICENSE) \u2014 nach Online-Kauf per E-Mail").option(
46
+ program.name("cpcg").description("Cuonztech Privacy Chaos Gate - CI/CD Shift-Left Consent Scanner & Auto-Remediation").version(VERSION).option("-u, --url <url>", "Staging- oder localhost-URL (http/https) \u2014 Pflicht").option("-k, --api-key <key>", "LLM-API-Key; wirkt nur mit --llm-remediation (Env-Fallback nur passend zum Provider)").option("--allow-custom-banner-fix [boolean]", "Auto-Fix darf auch bei eigenem Banner (kein erkanntes CMP) Skripte \xE4ndern. Standard aus: dann nur Anleitung (default: false)").option("--llm-remediation [boolean]", "Opt-in: Quellcode darf zur Patch-Erzeugung an den LLM-Anbieter gesendet werden (default: false)").option("-p, --llm-provider <provider>", "LLM-Provider: openai | anthropic | gemini (umgesetzt ist derzeit nur openai; sonst greift die Regel-Engine) (default: openai)").option("-m, --llm-model <model>", "LLM-Modell (default: gpt-4o)").option("--auto-fix [boolean]", "Code-Patches erzeugen und im Quellverzeichnis anwenden (default: true nur mit ausdr\xFCcklichem --source-dir, sonst false)").option("--fail-on-leak [boolean]", "Build blockieren (Exit 1), wenn Leaks bleiben (default: true)").option("--fail-on-uncheckable [boolean]", "Exit 4, wenn Kernszenarien nicht pr\xFCfbar sind; bei false Exit 0, das Ergebnis bleibt als unvollst\xE4ndig markiert (default: true)").option("-r, --report-output <path>", "Pfad des JSON-Reports (default: reports/privacy-chaos-report.json)").option("-s, --source-dir <dir>", "Quellcode-Verzeichnis f\xFCr Auto-Fix; ausdr\xFCcklich angeben, um Auto-Fix zu aktivieren").option("--git-commit [boolean]", "Fixes automatisch in den Git-Branch committen \u2014 Lizenz erforderlich (default: false)").option("--create-pr [boolean]", "Fix-Branch anlegen und GitHub-PR \xF6ffnen; hat Vorrang vor --git-commit \u2014 Lizenz erforderlich (default: false)").option("--github-token <token>", "GitHub-Token f\xFCr PR-Erstellung (besser: Env GITHUB_TOKEN)").option("--base-branch <branch>", "PR-Basisbranch (default: Default-Branch des Remotes)").option("--branch-prefix <prefix>", "Branch-Pr\xE4fix f\xFCr Fix-PRs (default: fix/cpcg-privacy)").option("--headless [boolean]", "Browser headless starten (default: true)").option("--timeout-ms <ms>", "Timeout je Szenario-Navigation und f\xFCr den Erreichbarkeits-Check in ms, positive ganze Zahl (default: 30000)").option("--strict [boolean]", "Hinweise (rein funktionale Drittanbieter wie Google Fonts) blockieren das Gate ebenfalls (default: false)").option("--ignore <liste>", "Befunde ignorieren: Tracker-Name oder Host-Muster, kommagetrennt oder mehrfach (z. B. fonts.googleapis.com,*.hotjar.com); im Report als \xABignoriert\xBB ausgewiesen; `*`/`**` und nackte TLDs (com, ch) werden immer abgelehnt (zum Abschalten der Blockierung --fail-on-leak false), ganze Zonen (*.com) ohne --allow-broad-ignore", collect, []).option("--allow-broad-ignore [boolean]", "Ganze Zonen als --ignore-Muster (*.com, *.co.uk, .ch) bewusst zulassen; sie werden in Konsole und Report als Warnung ausgewiesen; `*` und nackte TLDs bleiben abgelehnt (default: false)").option("--accept-selector <css>", "Eigener CSS-Selektor des Akzeptieren-Buttons (mehrfach oder kommagetrennt)", collect, []).option("--reject-selector <css>", "Eigener CSS-Selektor des Ablehnen-Buttons (mehrfach oder kommagetrennt)", collect, []).option("--settings-selector <css>", "Eigener CSS-Selektor des Einstellungen-Buttons (mehrfach oder kommagetrennt)", collect, []).option("--banner-frame <teilstring>", "Teilstring der URL des Banner-iframes (CMP im Frame)").option("--max-subpages <n>", "Obergrenze der Unterseiten-Stichprobe (Szenario subpage-spa), ganze Zahl 1\u201340 (default: 12; Env CPCG_MAX_SUBPAGES). Bleibt die Stichprobe unvollst\xE4ndig, weist das Gate das aus (Exit-Code unver\xE4ndert)").option("--sitemap [boolean]", "Sitemap-Tiefenlauf: Unterseiten aus robots.txt/sitemap.xml und den Links der Startseite pr\xFCfen, bis --deep-budget verbraucht ist (statt --max-subpages; Env CPCG_SITEMAP)").option("--deep-budget <sekunden>", "Zeitbudget des Sitemap-Tiefenlaufs f\xFCr die Unterseiten, 30\u20133600 (default: 300; Env CPCG_DEEP_BUDGET)").option("--deep-state <pfad>", "Zustandsdatei des Tiefenlaufs: der n\xE4chste Lauf setzt bei den noch nicht gepr\xFCften Unterseiten fort (Env CPCG_DEEP_STATE)").option("--baseline <pfad>", "Report (JSON) eines fr\xFCheren Laufs: der Bericht nennt neue, weggefallene und gleich gebliebene Befunde (Env CPCG_BASELINE)").option("--har [boolean]", "HAR-Mitschnitt je Browser-Kontext ohne Inhalte nach evidence/har neben dem Report (Env CPCG_HAR); enth\xE4lt Adressen und Header der Zielseite").option("--verify-url <url>", "Geschlossener Kreis: hat die Ziel-URL Befunde, zus\xE4tzlich diese URL pr\xFCfen (z. B. Vorschau des Fix-PRs); nur ein sauberer, vollst\xE4ndiger Scan dort heisst \xABFix verifiziert\xBB (Env CPCG_VERIFY_URL)").option("--verify-wait <sekunden>", "So lange auf die Erreichbarkeit der Verify-URL warten, 0\u20131800 (default: 0; Env CPCG_VERIFY_WAIT)").option("--target-header <name: wert>", "Freigabe-Header nur f\xFCr die gepr\xFCfte Website (mehrfach), z. B. f\xFCr eine WAF-Ausnahme oder Vercel \xABx-vercel-protection-bypass: \u2026\xBB; geht nie an Drittanbieter, Werte erscheinen in keinem Report. Im CI besser \xFCber Env CPCG_TARGET_HEADERS (eine Zeile je Header)", collect, []).option("--banner-wait <sekunden>", "Wartefenster auf einen (sp\xE4t erscheinenden) Banner in Sekunden, 1\u201360 (default: 8, bei Seiten ohne Banner-Hinweis fr\xFCher beendet; mit Angabe wird das Fenster ausgesch\xF6pft, auch bei --accept-selector/--reject-selector; Env CPCG_BANNER_WAIT)").option("--license <token>", "Cuonztech CPCG Lizenzcode CPCG-\u2026 oder Kunden-Key CPCG-K-\u2026 (oder Env CPCG_LICENSE) \u2014 nach Online-Kauf per E-Mail").option(
47
47
  "--jurisdiction <code>",
48
- "Rechtsraum, der in Konsole und report.json hervorgehoben wird: CH | EU | UK | US-CA | BR | ROW (default: CH). Der Report f\xFChrt alle Rechtsr\xE4ume auf."
48
+ "Rechtsr\xE4ume, komma-getrennt: CH | EU | UK | US-CA | BR | ROW (default: CH,EU). Der strengste Befund je Rechtsraum gewinnt; der Report f\xFChrt alle auf."
49
49
  ).option("--report-pdf [boolean]", "Deluxe-PDF (Deckblatt + Evidence) nach dem Scan erzeugen \u2014 Lizenz erforderlich").option("--client <name>", "Kundenname f\xFCr Kundenreport und PDF-Deckblatt \u2014 Lizenz erforderlich (PDF-default: Host der Ziel-URL)").option("--demo [boolean]", "Demo-Lauf \u2014 Report wird als synthetische Testdaten gekennzeichnet").addHelpText("after", EXIT_CODES_HELP).allowExcessArguments(false).showHelpAfterError("(cpcg --help zeigt alle Optionen)").exitOverride().action(async (options) => {
50
50
  try {
51
51
  if (!options.url && !process.env.CPCG_TARGET_URL && !process.env.STAGING_URL) {
@@ -84,12 +84,15 @@ program.name("cpcg").description("Cuonztech Privacy Chaos Gate - CI/CD Shift-Lef
84
84
  );
85
85
  }
86
86
  }
87
+ if (config.allowCustomBannerFix) {
88
+ console.log(pc.yellow("\u26A0 --allow-custom-banner-fix aktiv: der Auto-Fix darf bei eigenem Banner Skripte \xE4ndern. Die Einwilligung muss im Banner an cpcgGrantConsent() angebunden sein."));
89
+ }
87
90
  if (!config.llmRemediation && (options.apiKey || process.env.CPCG_LLM_API_KEY)) {
88
91
  console.log(pc.yellow("\u26A0 LLM-API-Key gesetzt, aber --llm-remediation fehlt: Quellcode wird NICHT an einen LLM-Anbieter gesendet."));
89
92
  }
90
- const juris = resolveJurisdiction(config.jurisdiction);
91
- console.log(pc.blue("\u2139 Jurisdiktion: "), pc.white(`${juris.label} (${juris.code})`));
92
- console.log(pc.dim(` ${juris.frameworks.join(" \xB7 ")}`));
93
+ const juris = resolveJurisdictions(config.jurisdiction);
94
+ console.log(pc.blue("\u2139 Jurisdiktion: "), pc.white(juris.map((j) => `${j.label} (${j.code}, ${j.consentModel})`).join(" + ")));
95
+ for (const j of juris) console.log(pc.dim(` ${j.frameworks.join(" \xB7 ")}`));
93
96
  const gate = new PrivacyChaosGate();
94
97
  const result = await gate.run(config);
95
98
  finish(result.exitCode);