cuonztech-privacy-chaos-gate 0.2.1 → 0.2.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/README.md CHANGED
@@ -210,7 +210,7 @@ Erwartet: Gate **BLOCKED**, Szenarien «auffällig» — exakt dieselben Zahlen
210
210
  ## GitHub Action
211
211
 
212
212
  ```yaml
213
- - uses: cuonztech/privacy-chaos-gate@v1
213
+ - uses: cuonztech/privacy-chaos-gate-action@v1
214
214
  id: cpcg
215
215
  with:
216
216
  staging-url: ${{ vars.STAGING_URL }}
@@ -221,8 +221,7 @@ Erwartet: Gate **BLOCKED**, Szenarien «auffällig» — exakt dieselben Zahlen
221
221
 
222
222
  Die Action installiert das veröffentlichte Paket `cuonztech-privacy-chaos-gate` in der Version, die in `action.yml`
223
223
  fest eingetragen ist (`npm install --ignore-scripts`, ohne Secrets in der Umgebung dieses Schritts), samt dem passenden
224
- Chromium (`playwright install --with-deps chromium`). Nur wenn im Action-Pfad ein eigener Build (`dist/cli.js`) liegt,
225
- etwa im CI dieses Repos, wird dieser verwendet. Kennt die installierte CLI eine angeforderte Option nicht, gibt die Action
224
+ Chromium (`playwright install --with-deps chromium`). Kennt die installierte CLI eine angeforderte Option nicht, gibt die Action
226
225
  eine Warnung aus, statt sie still wegzulassen.
227
226
 
228
227
  Scan und Konsolen-Gate laufen ohne Lizenz. `report-pdf`, `client-name`, `git-commit` und `create-pr` brauchen eine gültige Lizenz;
@@ -238,6 +237,8 @@ ohne sie werden sie mit Hinweis übersprungen.
238
237
  | `ignore` | leer | Befunde ausnehmen (Tracker-Name oder Host-Muster, eine Angabe je Zeile oder kommagetrennt) |
239
238
  | `accept-selector`, `reject-selector`, `settings-selector` | leer | Eigene CSS-Selektoren der Banner-Buttons (eine Angabe je Zeile) |
240
239
  | `banner-frame` | leer | Teil der URL des iframes mit dem Banner |
240
+ | `max-subpages` | leer (CLI: 12) | Höchstzahl verlinkter Unterseiten, die auf Tracker geprüft werden (max. 40; mehr dauert länger) |
241
+ | `banner-wait` | leer (CLI-Standard) | Sekunden, die auf ein spät erscheinendes Banner gewartet wird (1–60) |
241
242
  | `auto-fix` | `false` | Patches auf dem Runner erzeugen und anwenden; ein Gate ändert Dateien nicht stillschweigend |
242
243
  | `create-pr` | `false` | Fix als Pull Request öffnen (braucht `auto-fix: true`, `github-token` und eine Lizenz) |
243
244
  | `github-token` | leer | Token für `create-pr` (`contents: write`, `pull-requests: write`) |
@@ -248,8 +249,6 @@ ohne sie werden sie mit Hinweis übersprungen.
248
249
  | `jurisdiction` | `CH` | Rechtsraum |
249
250
  | `llm-remediation`, `api-key`, `llm-provider`, `llm-model` | `false`, leer, `openai`, `gpt-4o` | Optional: LLM-gestützte Patches. Nur OpenAI ist umgesetzt; der Quellcode wird dann an den Anbieter gesendet; ohne `llm-remediation: true` wirkt der Key nicht |
250
251
 
251
- `--max-subpages` und `--banner-wait` sind noch keine Inputs der Action. Bis dahin lassen sie sich im Job über `env:` setzen (`CPCG_MAX_SUBPAGES`, `CPCG_BANNER_WAIT`); als Inputs wären die Namen `max-subpages` und `banner-wait` (Werte wie beim CLI) vorgesehen.
252
-
253
252
  Beispiel mit Pull Request als Ergebnis:
254
253
 
255
254
  ```yaml
@@ -258,7 +257,7 @@ permissions:
258
257
  pull-requests: write
259
258
  steps:
260
259
  - uses: actions/checkout@v4
261
- - uses: cuonztech/privacy-chaos-gate@v1
260
+ - uses: cuonztech/privacy-chaos-gate-action@v1
262
261
  with:
263
262
  staging-url: ${{ vars.STAGING_URL }}
264
263
  license: ${{ secrets.CPCG_LICENSE }}
@@ -273,7 +272,13 @@ Beispiel: `if: steps.cpcg.outputs.gate_state == 'blocked'`.
273
272
 
274
273
  ## Jurisdiktion
275
274
 
276
- `--jurisdiction CH|EU|UK|US-CA|BR|ROW` — gleicher Befund, unterschiedliche Einordnung:
275
+ `--jurisdiction CH|EU|UK|US-CA|BR|ROW` — gleicher Befund, unterschiedliche Einordnung.
276
+
277
+ > **Wichtig:** Das Gate selbst prüft in jedem Rechtsraum nach der strengen **Opt-in-Linie (EU)**: Jeder nicht-essenzielle
278
+ > Tracker vor einer Einwilligung blockiert (Exit 1). Das Profil ändert nur Schweregrad und Begleittext im Bericht, nicht das
279
+ > Ergebnis. Für eine reine Schweizer Seite mit Opt-out-Modell ist das Gate damit strenger als das Recht; ein «BLOCKED» ist
280
+ > dort nicht automatisch ein Rechtsverstoss. Eine Bewertung nach Rechtsraum (CH und US-CA als Opt-out) ist für 0.3 geplant.
281
+
277
282
 
278
283
  - **EU:** Opt-In-Pflicht für nicht-essenzielle Tracker. Ein beobachteter Request ist ein
279
284
  schwerwiegender Hinweis — die Einstufung als Verstoß erfordert die Prüfung von Zweck,
package/action.yml CHANGED
@@ -139,7 +139,7 @@ runs:
139
139
  using: "composite"
140
140
  steps:
141
141
  - name: Setup Node.js
142
- uses: actions/setup-node@v4
142
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
143
143
  with:
144
144
  node-version: "20"
145
145
 
@@ -149,7 +149,7 @@ runs:
149
149
  shell: bash
150
150
  env:
151
151
  ACTION_PATH: ${{ github.action_path }}
152
- CPCG_PINNED_VERSION: "0.2.1" # = package.json version; bei jedem Release mit anheben (tests/action-pin.test.ts prüft das)
152
+ CPCG_PINNED_VERSION: "0.2.2" # = package.json version; bei jedem Release mit anheben (tests/action-pin.test.ts prüft das)
153
153
  run: |
154
154
  set -euo pipefail
155
155
 
@@ -4257,6 +4257,16 @@ var ChaosScanner = class {
4257
4257
  });
4258
4258
  }
4259
4259
  }
4260
+ /** Seite, auf der ein Request ausgelöst wurde (für Befunde auf Unterseiten); leer, wenn nicht ermittelbar. */
4261
+ pageHint(req) {
4262
+ try {
4263
+ const u = new URL(req.frame()?.url() ?? "");
4264
+ if (u.protocol !== "http:" && u.protocol !== "https:") return "";
4265
+ return ` (Seite: ${u.pathname}${u.search ? "?\u2026" : ""})`;
4266
+ } catch {
4267
+ return "";
4268
+ }
4269
+ }
4260
4270
  /**
4261
4271
  * Unterseiten & SPA: echte, auf der Startseite verlinkte Same-Origin-Pfade (HTTP-Status geprüft)
4262
4272
  * als Direkteinstieg, danach clientseitige Navigation (Link-Klick ohne Dokument-Reload,
@@ -4285,7 +4295,7 @@ var ChaosScanner = class {
4285
4295
  requestUrl: req.url(),
4286
4296
  method: req.method(),
4287
4297
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
4288
- description: `${hit.name} feuert auf Unterseite/SPA-Navigation ohne Consent.`
4298
+ description: `${hit.name} feuert auf Unterseite/SPA-Navigation ohne Consent${this.pageHint(req)}.`
4289
4299
  });
4290
4300
  }
4291
4301
  });
@@ -7054,7 +7064,7 @@ function buildEvidenceMarkdown(report, title = "Evidence Report", options = {})
7054
7064
  if (!e.screenshots?.length && !e.screenshotPath) continue;
7055
7065
  lines.push(`### ${escapeMarkdownText(e.scenario)}`, "");
7056
7066
  for (const s of e.screenshots ?? []) {
7057
- lines.push(`- **${escapeMarkdownText(s.label)}** (${escapeMarkdownText(s.at)}): \`evidence/${escapeCell(path5.basename(s.path))}\``);
7067
+ lines.push(`- **${escapeMarkdownText(s.label)}** (${escapeMarkdownText(s.at)}): \`evidence/${escapeCell(path5.win32.basename(s.path))}\``);
7058
7068
  }
7059
7069
  if (e.storageAfter?.cookies?.length) {
7060
7070
  lines.push(`- Cookies nachher: ${escapeMarkdownText(e.storageAfter.cookies.slice(0, 8).join(", "))}`);
@@ -7226,7 +7236,7 @@ function buildEvidenceHtml(report, title = "Evidence Report", options = {}) {
7226
7236
  const shots = e.screenshots ?? (e.screenshotPath ? [{ label: "Screenshot", path: e.screenshotPath, at: e.checkedAt }] : []);
7227
7237
  const gallery = shots.length ? `<div class="shots">${shots.map((s) => {
7228
7238
  const src = shotSrc(s.path, options.shotSources);
7229
- const media = src ? `<img class="shot" src="${src}" alt="${esc2(s.label)}" loading="lazy">` : `<code class="shot-path">evidence/${esc2(path5.basename(s.path))}</code>`;
7239
+ const media = src ? `<img class="shot" src="${src}" alt="${esc2(s.label)}" loading="lazy">` : `<code class="shot-path">evidence/${esc2(path5.win32.basename(s.path))}</code>`;
7230
7240
  return `<figure>
7231
7241
  <figcaption><span class="shot-label">${esc2(s.label)}</span>
7232
7242
  <span class="ts">${esc2(fmtTime(s.at))}</span></figcaption>
package/dist/cli.js CHANGED
@@ -11,12 +11,12 @@ import {
11
11
  resolveEntitlement,
12
12
  resolveGateConfig,
13
13
  resolveJurisdiction
14
- } from "./chunk-WOGRBCGS.js";
14
+ } from "./chunk-42D7PLVP.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.1" : "dev";
19
+ var VERSION = true ? "0.2.2" : "dev";
20
20
  loadProjectEnv();
21
21
  function finish(code) {
22
22
  process.exitCode = code;
package/dist/index.d.ts CHANGED
@@ -1829,6 +1829,8 @@ declare class ChaosScanner implements ChaosScannerInterface {
1829
1829
  * dann «not-checkable» statt «passed».
1830
1830
  */
1831
1831
  private runCmpFailureScenario;
1832
+ /** Seite, auf der ein Request ausgelöst wurde (für Befunde auf Unterseiten); leer, wenn nicht ermittelbar. */
1833
+ private pageHint;
1832
1834
  /**
1833
1835
  * Unterseiten & SPA: echte, auf der Startseite verlinkte Same-Origin-Pfade (HTTP-Status geprüft)
1834
1836
  * als Direkteinstieg, danach clientseitige Navigation (Link-Klick ohne Dokument-Reload,
package/dist/index.js CHANGED
@@ -46,7 +46,7 @@ import {
46
46
  resolveReportGate,
47
47
  statusLabelOf,
48
48
  uncheckableReasons
49
- } from "./chunk-WOGRBCGS.js";
49
+ } from "./chunk-42D7PLVP.js";
50
50
 
51
51
  // src/index.ts
52
52
  async function runGate(optionsOrConfig) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cuonztech-privacy-chaos-gate",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "CuonzTech Privacy Chaos Gate — CI/CD Consent-Scanner, Chaos-Szenarien und Auto-Fix-PR",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",