@m-kopa/launchpad-cli 0.51.0 → 0.52.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 +10 -0
- package/dist/cli.js +58 -11
- package/dist/commands/merge.d.ts +1 -0
- package/dist/commands/merge.d.ts.map +1 -1
- package/dist/deploy/apply.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/skills/launchpad-content-pr/SKILL.md +1 -1
- package/skills/launchpad-deploy/SKILL.md +1 -1
- package/skills/launchpad-deploy-status/SKILL.md +1 -1
- package/skills/launchpad-destroy/SKILL.md +1 -1
- package/skills/launchpad-identity/SKILL.md +1 -1
- package/skills/launchpad-onboard/SKILL.md +1 -1
- package/skills/launchpad-report/SKILL.md +1 -1
- package/skills/launchpad-status/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,16 @@ pre-1.0 minor bumps may carry breaking changes per ADR 0005.
|
|
|
8
8
|
|
|
9
9
|
## Unreleased
|
|
10
10
|
|
|
11
|
+
## 0.52.0 - 2026-07-18
|
|
12
|
+
|
|
13
|
+
**Server-authoritative manifest apply completion.**
|
|
14
|
+
|
|
15
|
+
- A deploy now attaches directly to the exact server-opened apply PR and head SHA.
|
|
16
|
+
It never creates a second apply attempt for the same durable reconcile intent, and an identity mismatch remains a hard protocol error that names both sides.
|
|
17
|
+
- `launchpad merge` accepts `--repo app|platform`, fails closed when the same PR number exists in both repositories, and explains that attested platform apply PRs are auto-managed.
|
|
18
|
+
- Manifest status treats the registry's successfully applied manifest SHA as primary deployed provenance, so per-app-workspace apps report a real deployed SHA without relying on legacy flat Terraform metadata.
|
|
19
|
+
- Bot-side apply completion now uses an append-only attempt ledger, exact PR and check evidence, one atomic provenance transition, webhook-first completion, sweep fallback, and fresh per-attempt branches cut from platform `main`.
|
|
20
|
+
|
|
11
21
|
## 0.51.0 - 2026-07-17
|
|
12
22
|
|
|
13
23
|
**Self-serve recovery rendering + honest guidance.**
|
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.
|
|
22
|
+
var CLI_VERSION = "0.52.0";
|
|
23
23
|
|
|
24
24
|
// src/config.ts
|
|
25
25
|
import * as os from "node:os";
|
|
@@ -6777,6 +6777,31 @@ async function runDeployApply(opts, io, deps = {}) {
|
|
|
6777
6777
|
io.err(`launchpad deploy --apply: --at expects a 40-char lowercase hex git SHA, got '${opts.atSha}'`);
|
|
6778
6778
|
return 64;
|
|
6779
6779
|
}
|
|
6780
|
+
if (opts.preopenedPr !== undefined) {
|
|
6781
|
+
if (opts.atSha === undefined) {
|
|
6782
|
+
io.err("launchpad deploy --apply: server-preopened apply attachment requires its exact manifest SHA");
|
|
6783
|
+
return 2;
|
|
6784
|
+
}
|
|
6785
|
+
io.out(`Attaching to server-preopened apply PR #${opts.preopenedPr.number} ` + `at head ${opts.preopenedPr.headSha}.`);
|
|
6786
|
+
const outcome2 = await pollUntilApplied({
|
|
6787
|
+
slug,
|
|
6788
|
+
manifestSha: opts.atSha,
|
|
6789
|
+
prNumber: opts.preopenedPr.number,
|
|
6790
|
+
expectedHeadSha: opts.preopenedPr.headSha,
|
|
6791
|
+
cfg,
|
|
6792
|
+
io,
|
|
6793
|
+
fetcher,
|
|
6794
|
+
pollIntervalSec,
|
|
6795
|
+
timeoutMs
|
|
6796
|
+
});
|
|
6797
|
+
if (outcome2.kind !== "applied") {
|
|
6798
|
+
return outcomeToExit(outcome2, opts.preopenedPr.url, io);
|
|
6799
|
+
}
|
|
6800
|
+
deletePinIfPresent(cfg, slug, io);
|
|
6801
|
+
io.out(`✓ Applied ${slug} from PR #${opts.preopenedPr.number}.`);
|
|
6802
|
+
deps.onApplied?.();
|
|
6803
|
+
return 0;
|
|
6804
|
+
}
|
|
6780
6805
|
io.out(opts.atSha !== undefined ? `Planning apply for ${slug} @ ${opts.atSha.slice(0, 7)} (managed repo) …` : `Planning apply for ${slug} (bot resolves managed main HEAD) …`);
|
|
6781
6806
|
let plan;
|
|
6782
6807
|
try {
|
|
@@ -6817,9 +6842,6 @@ async function runDeployApply(opts, io, deps = {}) {
|
|
|
6817
6842
|
return 0;
|
|
6818
6843
|
}
|
|
6819
6844
|
}
|
|
6820
|
-
if (opts.preopenedPr !== undefined) {
|
|
6821
|
-
io.out(`Server already opened exact-SHA apply PR #${opts.preopenedPr.number}; ` + "confirming it idempotently before polling.");
|
|
6822
|
-
}
|
|
6823
6845
|
let apply;
|
|
6824
6846
|
try {
|
|
6825
6847
|
apply = await apiJson(cfg, {
|
|
@@ -6834,10 +6856,6 @@ async function runDeployApply(opts, io, deps = {}) {
|
|
|
6834
6856
|
io.err(`launchpad deploy --apply: protocol failure from /apps/${slug}/manifest/apply: ` + `requested ${manifestSha}, received ${String(apply.manifestSha)}`);
|
|
6835
6857
|
return 2;
|
|
6836
6858
|
}
|
|
6837
|
-
if (opts.preopenedPr !== undefined && apply.prNumber !== opts.preopenedPr.number) {
|
|
6838
|
-
io.err(`launchpad deploy --apply: protocol failure from /apps/${slug}/manifest/apply: ` + `server-preopened PR #${opts.preopenedPr.number}, received #${apply.prNumber}`);
|
|
6839
|
-
return 2;
|
|
6840
|
-
}
|
|
6841
6859
|
io.out("");
|
|
6842
6860
|
io.out(`PR opened: ${apply.prUrl}`);
|
|
6843
6861
|
io.out(`Branch: ${apply.branch}`);
|
|
@@ -6896,6 +6914,13 @@ async function pollUntilApplied(args) {
|
|
|
6896
6914
|
await sleep(args.pollIntervalSec * 1000);
|
|
6897
6915
|
continue;
|
|
6898
6916
|
}
|
|
6917
|
+
if (args.expectedHeadSha !== undefined) {
|
|
6918
|
+
breakDots();
|
|
6919
|
+
return {
|
|
6920
|
+
kind: "transport",
|
|
6921
|
+
reason: "the bot cannot verify the exact server-preopened apply attempt"
|
|
6922
|
+
};
|
|
6923
|
+
}
|
|
6899
6924
|
breakDots();
|
|
6900
6925
|
args.io.err("! bot has no apply-status endpoint yet — falling back to the coarse merge-poll (upgrade pending bot deploy)");
|
|
6901
6926
|
mode = "legacy";
|
|
@@ -6916,6 +6941,13 @@ async function pollUntilApplied(args) {
|
|
|
6916
6941
|
reason: `protocol failure from /apps/${args.slug}/manifest/apply-status: ` + `requested ${args.manifestSha}, received ${status.manifestSha}`
|
|
6917
6942
|
};
|
|
6918
6943
|
}
|
|
6944
|
+
if (args.expectedHeadSha !== undefined && (status.prNumber !== args.prNumber || status.headSha !== args.expectedHeadSha)) {
|
|
6945
|
+
breakDots();
|
|
6946
|
+
return {
|
|
6947
|
+
kind: "transport",
|
|
6948
|
+
reason: `server-preopened PR #${args.prNumber} head ${args.expectedHeadSha}, ` + `received PR #${status.prNumber} head ${String(status.headSha)}`
|
|
6949
|
+
};
|
|
6950
|
+
}
|
|
6919
6951
|
if (status.state === "applied") {
|
|
6920
6952
|
breakDots();
|
|
6921
6953
|
return { kind: "applied" };
|
|
@@ -10337,7 +10369,7 @@ var HANDLED_STATUSES = [409, 422, 502, 503];
|
|
|
10337
10369
|
async function runMerge(args, io) {
|
|
10338
10370
|
const parsed = parseArgs8(args);
|
|
10339
10371
|
if (parsed === null) {
|
|
10340
|
-
io.err(`usage: launchpad merge <prNumber> [--slug <slug>]
|
|
10372
|
+
io.err(`usage: launchpad merge <prNumber> [--slug <slug>] [--repo app|platform]
|
|
10341
10373
|
` + " (prNumber is required; slug defaults to the cwd's `launchpad-app-<slug>` suffix)");
|
|
10342
10374
|
return 64;
|
|
10343
10375
|
}
|
|
@@ -10362,7 +10394,7 @@ async function runMerge(args, io) {
|
|
|
10362
10394
|
io.out(`Merging PR #${parsed.prNumber} on ${slug} …`);
|
|
10363
10395
|
const res = await apiRaw(cfg, {
|
|
10364
10396
|
method: "POST",
|
|
10365
|
-
path: `/apps/${slug}/merge/${parsed.prNumber}
|
|
10397
|
+
path: `/apps/${slug}/merge/${parsed.prNumber}` + (parsed.repository === null ? "" : `?repository=${parsed.repository}`),
|
|
10366
10398
|
nonThrowingStatuses: [...HANDLED_STATUSES]
|
|
10367
10399
|
});
|
|
10368
10400
|
if (res.ok) {
|
|
@@ -10416,6 +10448,7 @@ async function runMerge(args, io) {
|
|
|
10416
10448
|
}
|
|
10417
10449
|
function parseArgs8(args) {
|
|
10418
10450
|
let slug = null;
|
|
10451
|
+
let repository = null;
|
|
10419
10452
|
let prNumber = null;
|
|
10420
10453
|
let i = 0;
|
|
10421
10454
|
while (i < args.length) {
|
|
@@ -10428,6 +10461,14 @@ function parseArgs8(args) {
|
|
|
10428
10461
|
i += 2;
|
|
10429
10462
|
continue;
|
|
10430
10463
|
}
|
|
10464
|
+
if (a === "--repo") {
|
|
10465
|
+
const value = args[i + 1];
|
|
10466
|
+
if (value !== "app" && value !== "platform")
|
|
10467
|
+
return null;
|
|
10468
|
+
repository = value;
|
|
10469
|
+
i += 2;
|
|
10470
|
+
continue;
|
|
10471
|
+
}
|
|
10431
10472
|
if (/^\d+$/.test(a)) {
|
|
10432
10473
|
if (prNumber !== null)
|
|
10433
10474
|
return null;
|
|
@@ -10442,7 +10483,7 @@ function parseArgs8(args) {
|
|
|
10442
10483
|
}
|
|
10443
10484
|
if (prNumber === null)
|
|
10444
10485
|
return null;
|
|
10445
|
-
return { slug, prNumber };
|
|
10486
|
+
return { slug, prNumber, repository };
|
|
10446
10487
|
}
|
|
10447
10488
|
function renderBotError(status, env, io, prNumber = null) {
|
|
10448
10489
|
const code = env?.error ?? "unknown";
|
|
@@ -10479,6 +10520,12 @@ function renderBotError(status, env, io, prNumber = null) {
|
|
|
10479
10520
|
case "pipeline_unavailable":
|
|
10480
10521
|
io.err("launchpad merge: no review state recorded for this PR — push a commit to trigger the workflow, or wait for the first event.");
|
|
10481
10522
|
return;
|
|
10523
|
+
case "platform_apply_auto_managed":
|
|
10524
|
+
io.err("launchpad merge: this platform apply PR is auto-managed; inspect `launchpad status` or apply status.");
|
|
10525
|
+
return;
|
|
10526
|
+
case "merge_pr_ambiguous":
|
|
10527
|
+
io.err("launchpad merge: that PR number exists in both repositories; pass `--repo app` or `--repo platform`.");
|
|
10528
|
+
return;
|
|
10482
10529
|
case "credential_unavailable":
|
|
10483
10530
|
io.err("launchpad merge: bot credential is temporarily unavailable — retry in a moment.");
|
|
10484
10531
|
return;
|
package/dist/commands/merge.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAa,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAI9D,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,YAAY,EAAE,OAI1B,CAAC;AAEF,UAAU,SAAS;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAa,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAI9D,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,YAAY,EAAE,OAI1B,CAAC;AAEF,UAAU,SAAS;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC;CAChD;AAkHD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,CAsCnE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,gBAAgB,GAAG,IAAI,EAC5B,EAAE,EAAE,KAAK,EACT,QAAQ,GAAE,MAAM,GAAG,IAAW,GAC7B,IAAI,CAsFN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/deploy/apply.ts"],"names":[],"mappings":"AAqDA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAU1D,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;iCAC6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC;wDACoD;IACpD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB;;;oEAGgE;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,0EAA0E;IAC1E,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAwCD,wBAAsB,cAAc,CAClC,IAAI,EAAE,YAAY,EAClB,EAAE,EAAE,KAAK,EACT,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/deploy/apply.ts"],"names":[],"mappings":"AAqDA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAU1D,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;iCAC6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC;wDACoD;IACpD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB;;;oEAGgE;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,0EAA0E;IAC1E,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAwCD,wBAAsB,cAAc,CAClC,IAAI,EAAE,YAAY,EAClB,EAAE,EAAE,KAAK,EACT,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,QAAQ,CAAC,CAoPnB"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.
|
|
1
|
+
export declare const CLI_VERSION = "0.52.0";
|
|
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.
|
|
4
|
+
version: 0.52.0
|
|
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
|
|
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.
|
|
4
|
+
version: 0.52.0
|
|
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), 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.
|
|
4
|
+
version: 0.52.0
|
|
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.
|
|
4
|
+
version: 0.52.0
|
|
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.
|
|
4
|
+
version: 0.52.0
|
|
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.
|
|
4
|
+
version: 0.52.0
|
|
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.
|
|
4
|
+
version: 0.52.0
|
|
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.
|
|
4
|
+
version: 0.52.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|