@m-kopa/launchpad-cli 0.32.0 → 0.32.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/CHANGELOG.md +31 -0
- package/dist/cli.js +2 -1
- package/dist/commands/skills.d.ts +7 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/skills/launchpad-content-pr/SKILL.md +25 -13
- package/skills/launchpad-deploy/SKILL.md +1 -1
- package/skills/launchpad-deploy-status/SKILL.md +2 -2
- package/skills/launchpad-destroy/SKILL.md +1 -1
- package/skills/launchpad-identity/SKILL.md +1 -1
- package/skills/launchpad-onboard/SKILL.md +4 -4
- package/skills/launchpad-status/SKILL.md +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,37 @@ 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.32.2 — 2026-06-17
|
|
10
|
+
|
|
11
|
+
Docs: skill-accuracy sweep. Audited all bundled skills against the live
|
|
12
|
+
CLI/bot/`platform-auth` source and corrected three stale claims:
|
|
13
|
+
|
|
14
|
+
- **`launchpad-content-pr`** — the deploy section said `launchpad deploy` is
|
|
15
|
+
fire-and-forget and "always verify with `launchpad status`". Since sp-dplvfy,
|
|
16
|
+
a Model-A deploy **verifies the served content in-line by default** (waits for
|
|
17
|
+
the Pages build, byte-compares the entrypoint, exits non-zero on
|
|
18
|
+
failure/mismatch). Documented the default-verify behaviour and the
|
|
19
|
+
`--no-verify` / `--verify-timeout=<secs>` flags; `launchpad status` is now
|
|
20
|
+
framed as the fallback when verify is skipped or times out at `pending`.
|
|
21
|
+
- **`launchpad-deploy-status` + `launchpad-status`** — the drift-report field
|
|
22
|
+
list named `access.allowed_entra_group` (singular); the path the CLI actually
|
|
23
|
+
emits in `driftFields` / the `drift:` line is `access.allowed_entra_groups`
|
|
24
|
+
(plural, `status.ts:478`). Corrected (3 occurrences).
|
|
25
|
+
- **`launchpad-onboard`** — the sibling-skill list omitted `/launchpad-identity`
|
|
26
|
+
(added to the bundle in 0.32.1). Added it.
|
|
27
|
+
|
|
28
|
+
Skill content only — no behaviour change. Re-run `launchpad update` (or
|
|
29
|
+
`launchpad skills update`) to pick up the corrected skills.
|
|
30
|
+
|
|
31
|
+
## 0.32.1 — 2026-06-17
|
|
32
|
+
|
|
33
|
+
Fix: `launchpad skills install/update` now installs `launchpad-identity`. The
|
|
34
|
+
0.32.0 skill shipped as a `skills/` directory but was missing from the
|
|
35
|
+
installer's `BUNDLED_SKILLS` list, so it was never copied into
|
|
36
|
+
`~/.claude/skills/`. Added it, and added an anti-drift test that fails if any
|
|
37
|
+
`launchpad-*` skill directory is missing from `BUNDLED_SKILLS` (so this can't
|
|
38
|
+
recur). Re-run `launchpad update` (or `launchpad skills update`) to pick it up.
|
|
39
|
+
|
|
9
40
|
## 0.32.0 — 2026-06-17
|
|
10
41
|
|
|
11
42
|
New Claude Code skill: `/launchpad-identity` (sp-idnt7k). Teaches app authors how
|
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.32.
|
|
22
|
+
var CLI_VERSION = "0.32.2";
|
|
23
23
|
|
|
24
24
|
// src/config.ts
|
|
25
25
|
import * as os from "node:os";
|
|
@@ -10260,6 +10260,7 @@ var BUNDLED_SKILLS = [
|
|
|
10260
10260
|
"launchpad-content-pr",
|
|
10261
10261
|
"launchpad-status",
|
|
10262
10262
|
"launchpad-destroy",
|
|
10263
|
+
"launchpad-identity",
|
|
10263
10264
|
"marquee-share"
|
|
10264
10265
|
];
|
|
10265
10266
|
function isBundleManaged(name) {
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { Command } from "../dispatcher.js";
|
|
2
|
+
/**
|
|
3
|
+
* Skills shipped in this version of the CLI. Must match the `launchpad-*`
|
|
4
|
+
* dirs under `<pkg>/skills/` (plus the cross-repo `marquee-share`); the
|
|
5
|
+
* "bundled list matches the skills dir" test in `tests/skills-command.test.ts`
|
|
6
|
+
* enforces this so a newly-added skill dir can't silently go un-installed.
|
|
7
|
+
*/
|
|
8
|
+
export declare const BUNDLED_SKILLS: readonly ["launchpad-onboard", "launchpad-deploy", "launchpad-deploy-status", "launchpad-content-pr", "launchpad-status", "launchpad-destroy", "launchpad-identity", "marquee-share"];
|
|
2
9
|
export declare const skillsCommand: Command;
|
|
3
10
|
interface InstallEnv {
|
|
4
11
|
readonly bundleDir: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AASjE;;;;;GAKG;AACH,eAAO,MAAM,cAAc,uLAajB,CAAC;AAcX,eAAO,MAAM,aAAa,EAAE,OAK3B,CAAC;AA2CF,UAAU,UAAU;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,CAQ9C"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.32.
|
|
1
|
+
export declare const CLI_VERSION = "0.32.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/package.json
CHANGED
|
@@ -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.32.
|
|
4
|
+
version: 0.32.2
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|
|
@@ -96,11 +96,17 @@ What happens:
|
|
|
96
96
|
the bundle **directly to `main`** on `launchpad-app-<slug>` via
|
|
97
97
|
the Git Data API — you are the commit author, the bot is the
|
|
98
98
|
committer. No PR, no merge step.
|
|
99
|
-
- The CLI
|
|
100
|
-
committed as <sha>`, then "Committed; build pending".
|
|
101
|
-
**
|
|
102
|
-
|
|
103
|
-
the
|
|
99
|
+
- The CLI prints the bot's 202 ack — `✓ Bundle accepted —
|
|
100
|
+
committed as <sha>`, then "Committed; build pending". By default it
|
|
101
|
+
then **waits for the Pages build and verifies it** (up to ~180s):
|
|
102
|
+
it byte-compares the served entrypoint against what you shipped and
|
|
103
|
+
prints `✓ Verified — the live deployment serves exactly what you
|
|
104
|
+
shipped`, or exits non-zero if the build fails or the served bytes
|
|
105
|
+
don't match (sp-dplvfy). Tune with `--verify-timeout=<secs>`, or skip
|
|
106
|
+
it with `--no-verify` (commit only, return immediately). When verify
|
|
107
|
+
is skipped or times out (`pending`), the commit landed but the build
|
|
108
|
+
is still async and can fail afterwards — confirm with
|
|
109
|
+
`launchpad status`.
|
|
104
110
|
|
|
105
111
|
Flags worth knowing:
|
|
106
112
|
|
|
@@ -117,11 +123,15 @@ Flags worth knowing:
|
|
|
117
123
|
Exit codes:
|
|
118
124
|
|
|
119
125
|
- **0** — bundle accepted and committed (or "nothing to deploy"
|
|
120
|
-
when `main` already matches the bundle)
|
|
121
|
-
|
|
126
|
+
when `main` already matches the bundle), **and** default in-line
|
|
127
|
+
verification confirmed the live deployment serves it. With
|
|
128
|
+
`--no-verify`, or if verification times out at `pending`, exit 0
|
|
129
|
+
means only that the commit landed — confirm with `launchpad status`.
|
|
122
130
|
- **non-zero** — gate rejections are rendered with per-file detail
|
|
123
|
-
on stderr; fix the bundle and re-run.
|
|
124
|
-
|
|
131
|
+
on stderr; fix the bundle and re-run. A build failure or a
|
|
132
|
+
served-content mismatch caught by default verification also exits
|
|
133
|
+
non-zero. For provisioning-phase failures see
|
|
134
|
+
`/launchpad-deploy-status <slug>`.
|
|
125
135
|
|
|
126
136
|
## What the bot enforces on every bundle
|
|
127
137
|
|
|
@@ -263,9 +273,11 @@ Once you've shipped first content, the daily-use verbs are:
|
|
|
263
273
|
hand-rolled change bypasses the bundle policy, secret-scan,
|
|
264
274
|
build-command gates, and the standing-exception ledger. Use
|
|
265
275
|
`launchpad deploy`.
|
|
266
|
-
- Do **not** treat exit 0 from `launchpad deploy`
|
|
267
|
-
|
|
268
|
-
|
|
276
|
+
- Do **not** treat exit 0 from `launchpad deploy --no-verify` (or a
|
|
277
|
+
run whose verification timed out at `pending`) as "live". The commit
|
|
278
|
+
landed, but the build is still async and can fail afterwards —
|
|
279
|
+
verify with `launchpad status`. A default deploy (verification on)
|
|
280
|
+
already byte-checks the served content before exiting 0.
|
|
269
281
|
- Do **not** re-implement the server-side gates locally.
|
|
270
282
|
`launchpad validate` plus the CLI's own app-boundary pre-flight
|
|
271
283
|
cover the local half; the bot enforces the rest server-side and
|
|
@@ -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.32.
|
|
4
|
+
version: 0.32.2
|
|
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-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). 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", "my app says failed but it's serving", or after `/launchpad-deploy` reports a non-`done` terminal stage.
|
|
4
|
-
version: 0.32.
|
|
4
|
+
version: 0.32.2
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|
|
@@ -90,7 +90,7 @@ Live-app states:
|
|
|
90
90
|
- **`drift: <field list>`** — local and deployed differ on at least
|
|
91
91
|
one v1 closed-set field (`metadata.name`, `metadata.team`,
|
|
92
92
|
`metadata.owner`, `metadata.description`, `deployment.type`,
|
|
93
|
-
`access.
|
|
93
|
+
`access.allowed_entra_groups`, `hostnames[0]`, `build.command`,
|
|
94
94
|
`build.destination_dir`, `build.root_dir`, `production_env.*`).
|
|
95
95
|
Run `launchpad deploy` to roll the local manifest out.
|
|
96
96
|
- **`live_no_content`** — provisioned, but no content deployed yet.
|
|
@@ -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.32.
|
|
4
|
+
version: 0.32.2
|
|
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.32.
|
|
4
|
+
version: 0.32.2
|
|
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.32.
|
|
4
|
+
version: 0.32.2
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|
|
@@ -39,9 +39,9 @@ a copy-pasteable fix for any red row.
|
|
|
39
39
|
This is the **only** skill that mutates the user's machine (it can
|
|
40
40
|
trigger `launchpad login` and suggest installs). The other skills
|
|
41
41
|
(`/launchpad-deploy`, `/launchpad-deploy-status`,
|
|
42
|
-
`/launchpad-content-pr`, `/launchpad-status`, `/launchpad-destroy
|
|
43
|
-
assume the machine is already onboarded and fail
|
|
44
|
-
missing — pointing back here.
|
|
42
|
+
`/launchpad-content-pr`, `/launchpad-status`, `/launchpad-destroy`,
|
|
43
|
+
`/launchpad-identity`) assume the machine is already onboarded and fail
|
|
44
|
+
loudly if a prereq is missing — pointing back here.
|
|
45
45
|
|
|
46
46
|
## Zero non-Launchpad dependencies
|
|
47
47
|
|
|
@@ -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.32.
|
|
4
|
+
version: 0.32.2
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|
|
@@ -132,7 +132,7 @@ union of states, not just a drift verdict. The drift pair:
|
|
|
132
132
|
one field in the v1 closed set:
|
|
133
133
|
`metadata.name`, `metadata.team`, `metadata.owner`,
|
|
134
134
|
`metadata.description`, `deployment.type`,
|
|
135
|
-
`access.
|
|
135
|
+
`access.allowed_entra_groups`, `hostnames[0]`, `build.command`,
|
|
136
136
|
`build.destination_dir`, `build.root_dir`, `production_env.*`.
|
|
137
137
|
|
|
138
138
|
The lifecycle states (rendered without needing a local manifest):
|
|
@@ -328,7 +328,7 @@ edge-auth + cert re-issuance — the gateway hostname/cert for an
|
|
|
328
328
|
`auth: gateway` app, or the Cf Access app for an `auth: access` one —
|
|
329
329
|
which the bot handles.)
|
|
330
330
|
|
|
331
|
-
### "drift: access.
|
|
331
|
+
### "drift: access.allowed_entra_groups"
|
|
332
332
|
|
|
333
333
|
Group binding changed in your local manifest. This is the
|
|
334
334
|
**load-bearing** drift — it controls who can access the app. After
|