@m-kopa/launchpad-cli 0.41.0 → 0.41.1

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,23 @@ 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.1 — 2026-06-30
10
+
11
+ Docs & skills correctness fix: **any Entra group in the tenant can gate an
12
+ app — it does not need to be assigned to the Launchpad enterprise
13
+ application** (PS-1733, live 2026-06-25). The docs and bundled skills still
14
+ described the retired "assigned-only" rule, which led to users being wrongly
15
+ told to ask IT to assign a group (e.g. `G_information_security`) before they
16
+ could use it. Corrected across the auth concept, manifest reference,
17
+ `first-app`/`auth` guides, and the `validate` / `groups` / `deploy` command
18
+ pages, and in the `launchpad-deploy` / `launchpad-content-pr` skills. Key
19
+ clarification: `launchpad groups` and `launchpad validate --strict-groups`
20
+ resolve only against the **assigned** set and will **falsely reject** a valid
21
+ unassigned group — use **`launchpad deploy --dry-run`** to pre-check any
22
+ tenant group (it resolves against the whole tenant, exactly as the real
23
+ submit). A reference is rejected only when the group is unknown, ineligible (a
24
+ distribution list / hidden-membership group), or an ambiguous display name.
25
+
9
26
  ## 0.41.0 — 2026-06-28
10
27
 
11
28
  Docs & skills: documented the **app catalogue** — a new
package/dist/cli.js CHANGED
@@ -19,7 +19,7 @@ var __toESM = (mod, isNodeMode, target) => {
19
19
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
20
20
 
21
21
  // src/version.ts
22
- var CLI_VERSION = "0.41.0";
22
+ var CLI_VERSION = "0.41.1";
23
23
 
24
24
  // src/config.ts
25
25
  import * as os from "node:os";
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.41.0";
1
+ export declare const CLI_VERSION = "0.41.1";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m-kopa/launchpad-cli",
3
- "version": "0.41.0",
3
+ "version": "0.41.1",
4
4
  "description": "Launchpad CLI — clone / deploy / review / merge against Launchpad-managed apps. Talks to the portal-bot endpoints (SCOPE-M-760 / T4).",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: launchpad-content-pr
3
3
  description: Push a content change to a Launchpad app via `launchpad deploy` and verify it shipped via `launchpad status`. Covers the post-first-deploy iteration loop (edit → deploy → verify) — subsequent deploys commit directly to the app repo's main and the Pages build runs asynchronously, so verification is its own step. Use when someone says "push a content change", "ship an update", "/launchpad-content-pr", "verify my deploy", or after `/launchpad-deploy` reports `done` and they want to follow up with an edit.
4
- version: 0.41.0
4
+ version: 0.41.1
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
@@ -185,7 +185,10 @@ launchpad plan
185
185
 
186
186
  Both are offline by default (no bot). `launchpad validate
187
187
  --strict-groups` opts in to an online check that resolves
188
- `access.allowed_entra_group` (needs a session).
188
+ `access.allowed_entra_group` (needs a session). Note it resolves only
189
+ against the groups **assigned** to the Launchpad enterprise app, so it
190
+ falsely fails a valid *unassigned* tenant group — pre-check those with
191
+ `launchpad deploy --dry-run` instead.
189
192
 
190
193
  ## Verify the deploy
191
194
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: launchpad-deploy
3
3
  description: Walk a Launchpad user through deploying an app from their local working directory (Model A — `launchpad init` + `launchpad deploy`). Wraps the CLI verbs end-to-end: detects the app shape, scaffolds `launchpad.yaml`, resolves the allowed Entra group via `launchpad groups`, bundles the CWD via `launchpad deploy`, and watches the rollout via `launchpad status`. Use when someone says "deploy a new app", "ship my app to Launchpad", "/launchpad-deploy", "I have an app locally — get it on Launchpad", or any variant. Resume/abandon for legacy in-flight provisioning is at the bottom.
4
- version: 0.41.0
4
+ version: 0.41.1
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
@@ -195,20 +195,45 @@ The CLI resolves Entra groups via the bot's `/groups` endpoint
195
195
  endpoint directly. Two helpers:
196
196
 
197
197
  ```bash
198
- launchpad groups list # every group assigned to the Launchpad app in Entra
198
+ launchpad groups list # groups ASSIGNED to the Launchpad app in Entra
199
199
  launchpad groups search <query> # fuzzy match by name / nickname / id
200
200
  launchpad groups show <name> # UUID + displayName + mailNickname
201
201
  launchpad groups resolve <name> # just the Entra Object-ID UUID (script-friendly)
202
202
  ```
203
203
 
204
- `groups list` is **not** the whole tenant and not caller-scoped: it
205
- lists the groups **assigned to the Launchpad enterprise application**
206
- in Entra the only groups that can actually grant sign-in to a
207
- deployed app.
204
+ **Important — `groups` only sees the *assigned* set.** All four
205
+ helpers (and `launchpad validate --strict-groups`, §A.4) list only the
206
+ groups **assigned to the Launchpad enterprise application** in Entra.
207
+ That is a discovery convenience, **not** the set of usable groups.
208
+ Since PS-1733 (live 2026-06-25) an app can be gated on **any group in
209
+ the tenant** — the group does **not** have to be assigned to the
210
+ Launchpad app first. So if the user wants a group that does not appear
211
+ in `groups list` (e.g. `G_information_security`), that is **fine**:
212
+ pass it anyway, by display name or UUID. Do **not** tell the user to
213
+ ask IT to assign the group to the enterprise app — that requirement
214
+ was retired.
208
215
 
209
216
  When the user picks a group, pass either the **displayName** or the
210
217
  **UUID** to `launchpad init --group <…>` — the CLI accepts both and
211
- the bot canonicalises to the UUID.
218
+ the bot canonicalises to the UUID. Prefer the **UUID** for a group
219
+ that is not in `groups list`, or whenever a display name could be
220
+ ambiguous.
221
+
222
+ A group reference is rejected at deploy only when it is **unknown** (no
223
+ such group anywhere in the tenant), **ineligible** (a pure distribution
224
+ list, or a hidden-membership group the platform cannot evaluate), or an
225
+ **ambiguous** display name (use the UUID). An unassigned-but-valid
226
+ group is accepted. Members who do not carry the group as a token claim
227
+ are authorised at runtime via a Microsoft Graph membership check
228
+ (employees only — guests are refused).
229
+
230
+ **Pre-checking a group reference.** Because `groups` and
231
+ `--strict-groups` are assigned-only, they **falsely reject** a valid
232
+ unassigned group. To pre-check any tenant group without mutating
233
+ anything, run `launchpad deploy --dry-run` — it resolves against the
234
+ whole tenant exactly as the real submit does. Treat `--dry-run` (not
235
+ `--strict-groups`) as the source of truth for "will this group
236
+ resolve?".
212
237
 
213
238
  If `launchpad groups list` fails with:
214
239
 
@@ -222,9 +247,10 @@ If `launchpad groups list` fails with:
222
247
  `appRoleAssignedTo` assignment list (missing admin consent on the
223
248
  Graph application permission), or Graph is unreachable. Surface
224
249
  the error body.
225
- - empty list → no groups are assigned to the Launchpad enterprise
226
- app in Entra. A group must be **assigned to the app** before it
227
- can gate anything membership alone is not enough.
250
+ - empty list → no groups are **assigned** to the Launchpad app. This
251
+ does **not** block you an unassigned tenant group can still be
252
+ used by name or UUID (above); the assigned set is just a discovery
253
+ shortlist.
228
254
 
229
255
  Use `launchpad groups whoami` to remind the user which groups
230
256
  **they** are currently a member of — handy when an app is gated and
@@ -244,7 +270,10 @@ Add `--strict-groups` to *additionally* resolve the manifest's
244
270
  allowed Entra group online against the bot's group list — it catches
245
271
  typo'd or renamed group names before deploy time. This mode needs a
246
272
  session and the network (exit 1 = group not found / ambiguous,
247
- 2 = network error, 3 = no valid session).
273
+ 2 = network error, 3 = no valid session). **Caveat:** it checks only
274
+ the **assigned** set, so it will falsely fail a valid *unassigned*
275
+ tenant group — for those, pre-check with `launchpad deploy --dry-run`
276
+ instead (see §A.3).
248
277
 
249
278
  ```bash
250
279
  launchpad plan
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: launchpad-deploy-status
3
3
  description: Show the current provisioning stage + failure reason for a Launchpad app via `launchpad status` (Model A drift + deployment_verified) and `launchpad apps` (lifecycle bucket), or watch provisioning live with `launchpad watch`. Renders the M-892 stage trace for in-flight provisioning, and is the canonical home for `launchpad recover` (repair a terminal-failed app record that is actually live). Use when someone says "what's the status of demo-X", "/launchpad-deploy-status", "is my deploy stuck", "watch my deploy go live", "watch provisioning", "my app says failed but it's serving", or after `/launchpad-deploy` reports a non-`done` terminal stage.
4
- version: 0.41.0
4
+ version: 0.41.1
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: launchpad-destroy
3
3
  description: Tear down a Launchpad app end-to-end via `launchpad destroy` — Cloudflare Pages project, edge-auth wiring (gateway KV/audience entries, or the Access app for `auth: access` apps), custom hostname, platform-repo TF, and the app repo (archive-renamed). Owner-only verb with a two-step destructive confirmation. Use when someone says "destroy this app", "/launchpad-destroy", "tear down `<slug>`", "delete the app", or asks to clean up a smoke-test / orphan / retired app.
4
- version: 0.41.0
4
+ version: 0.41.1
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: launchpad-identity
3
3
  description: Teach an app author how to use the signed-in user's identity inside a Launchpad app — read the gateway-forwarded X-Launchpad-User-Assertion in a Pages Function, VERIFY it with @m-kopa/platform-auth (fail-closed), and show who's logged in (sub/email/name). Use when someone says "who is logged in", "show the current user", "get the user's email in my app", "auth in my launchpad app", "read the user identity", "/launchpad-identity", or is wiring up an /api/me for a gateway-fronted app.
4
- version: 0.41.0
4
+ version: 0.41.1
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: launchpad-onboard
3
3
  description: One-time setup for the Launchpad CLI + Claude Code skill bundle. Verifies the `launchpad` CLI is installed and current, runs `launchpad whoami` to confirm the session is fresh, and checks the bundled skills are installed and in lock-step with the CLI. Idempotent — safe to re-run any time. Use when someone says "set me up for Launchpad", "I just got a new machine and want to use Launchpad", "/launchpad-onboard", or any of the other launchpad-* skills fails on a prereq check.
4
- version: 0.41.0
4
+ version: 0.41.1
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: launchpad-report
3
3
  description: File a bug report or feature request to the Launchpad team's tracker from the CLI. Use when someone reports something broken, hits an error in a launchpad command, or wishes a feature existed — e.g. "this is broken", "report a bug", "can you file that", "I wish launchpad could…", "/launchpad-bug", "/launchpad-feature". Always confirm and show exactly what you'll send before filing; never file silently.
4
- version: 0.41.0
4
+ version: 0.41.1
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: launchpad-status
3
3
  description: Show whether a Launchpad app's local launchpad.yaml matches what's deployed, and read the deployed manifest. Wraps `launchpad pull` (fetch deployed YAML) and `launchpad status` (drift report). Use when someone says "is my app in sync", "what's deployed", "show drift", "/launchpad-status", "/launchpad-pull", or after `launchpad deploy` to verify the change landed.
4
- version: 0.41.0
4
+ version: 0.41.1
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->