@m-kopa/launchpad-cli 0.39.0 → 0.41.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/CHANGELOG.md CHANGED
@@ -6,6 +6,90 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
  This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html);
7
7
  pre-1.0 minor bumps may carry breaking changes per ADR 0005.
8
8
 
9
+ ## 0.41.0 — 2026-06-28
10
+
11
+ Docs & skills: documented the **app catalogue** — a new
12
+ [`concepts/catalogue`](./docs/concepts/catalogue.md) page (listed by default,
13
+ opt out with `catalogue: { listed: false }`, and why **listing is not access**),
14
+ plus a **runtime-vs-administrative access** section (owner / co-owner / editor)
15
+ in the auth concept. Bundled skills refreshed (synced in place by
16
+ `launchpad update`): the `launchpad-status` skill now points access-drift
17
+ reconciliation at `launchpad deploy --apply`, `launchpad-deploy` notes the
18
+ catalogue opt-out at scaffold time, and `launchpad-content-pr` surfaces
19
+ `redeploy` as a general verb (activate a pushed secret on a Pages tier / force a
20
+ clean rebuild).
21
+
22
+ Feature (PS-1755 / PS-1762, T3): **`launchpad deploy` now refuses to ship
23
+ content when a gateway app's declared access groups don't match what the gateway
24
+ enforces** — the bot checks this server-side (unbypassable) on every deploy to
25
+ an existing gateway app and rejects with a clear message naming both directions
26
+ (over-grant + declared-not-enforced). `launchpad deploy` ships content only and
27
+ can't reconcile access; change it via the gated Terraform route, then redeploy.
28
+ The refuse is gated by a **default-OFF** server-side kill-switch, so the
29
+ operational rollout controls go-live and benign pre-existing drift can't break
30
+ deploys on day one; while OFF, drift is surfaced as a warning instead. See
31
+ [`deploy`](./docs/commands/deploy.md).
32
+
33
+ Feature (PS-1755 / PS-1763, T4): **`launchpad status` now reports access
34
+ drift** for gateway apps — whether the gateway actually enforces the Entra
35
+ groups your manifest declares. Because changing `access.allowed_entra_groups`
36
+ and re-running `launchpad deploy` ships content only (it does not re-apply the
37
+ gateway policy), the declared and enforced allow-lists can silently diverge.
38
+
39
+ - Surfaces both directions: **enforced but not declared** (an over-grant — still
40
+ reachable) and **declared but not enforced** (locked out despite the manifest).
41
+ Group names and UUIDs for the same group are treated as equal.
42
+ - `--strict` now exits `1` on access drift as well as manifest drift; `--json`
43
+ carries an `accessDrift` object. Non-gateway (Cloudflare Access) apps and
44
+ older bots show no access-drift line.
45
+ - A fleet-wide audit across all gateway apps lives at
46
+ `scripts/fleet/access-drift-audit.mjs` (`--list` for the offline app
47
+ enumeration). See [`status`](./docs/commands/status.md).
48
+
49
+ Feature (sp-bx7q2m, PS-1572 / PS-1584): the platform now runs a **server-side
50
+ anonymous-reachability check** at deploy time and blocks a deploy whose
51
+ `pages.dev` origin serves content/data to unauthenticated callers — closing the
52
+ class behind the dsr-photo-watch leak at the deploy layer.
53
+
54
+ - New optional manifest key **`verify.protected_path`** (`react`/`react+api`):
55
+ declare a representative protected route (e.g. `/api/health`) the deploy gate
56
+ probes anonymously and requires to return `401`/`403`, not `2xx`. `static`
57
+ apps need no declaration — their whole origin is probed. See the
58
+ [`verify`](./docs/manifest/index.md#verify-deploy-gate-checks) reference.
59
+ - `launchpad validate` accepts and shape-checks the new `verify` block
60
+ (root-relative path required). Backward-compatible — omitting it is valid.
61
+ - Enforcement is server-side in portal-bot; this CLI release only adds the
62
+ manifest field + validation. Version bump deferred to merge.
63
+ - New optional manifest key **`confine_origin`** (boolean, gateway pages apps):
64
+ opt a `react`/`react+api` app's `<id>.pages.dev` apex into service-token
65
+ confinement, once it verifies the gateway's `X-Launchpad-User-Assertion`
66
+ header. Default unchanged (verifier apps unconfined, static always confined);
67
+ `false` is rejected on static apps. See the
68
+ [`confine_origin`](./docs/manifest/index.md#confine_origin-apex-confinement)
69
+ reference (PS-1572 / ADR 0031).
70
+
71
+ ## 0.40.0 — 2026-06-21
72
+
73
+ Feature (sp-rptndg, PS-1601): `launchpad` now nudges you toward `launchpad bug`
74
+ when a command fails because the **platform** misbehaved — so the reporting verbs
75
+ are discoverable at the moment they're needed, not only to people who already
76
+ know they exist.
77
+
78
+ - A single one-line, **non-actionable** reminder prints (stderr) on platform
79
+ faults only: a bot 5xx, a network error, `✗ NO NEW DEPLOYMENT WAS CREATED`
80
+ (exit 69), or an unexpected crash. Classified by the typed HTTP error, **not**
81
+ an exit-code allowlist — the common platform faults (5xx / network) are caught
82
+ and returned as exit 1 inside commands, so an exit-code check would miss them.
83
+ - Stays **quiet** for your-side failures (auth/401, forbidden/403,
84
+ not-found/404, `ApiError` 4xx, bad input, usage errors) and on non-interactive
85
+ output (CI, pipes, `--json`).
86
+ - It **never files anything** — filing still shows you the report and asks you to
87
+ confirm first; the report carries only the last command name, never its args.
88
+ - The `launchpad-deploy` and `launchpad-deploy-status` skills now point an agent
89
+ at `/launchpad-report` on a platform fault, preserving "never file silently".
90
+
91
+ No portal-bot change.
92
+
9
93
  ## 0.39.0 — 2026-06-20
10
94
 
11
95
  Feature (sp-bld9kq, PS-1590): `launchpad deploy` now confirms a Cloudflare