@m-kopa/launchpad-cli 0.34.0 → 0.36.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 +41 -0
- package/dist/cli.js +205 -7
- package/dist/commands/report.d.ts +17 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/skills.d.ts +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/dispatcher.d.ts.map +1 -1
- package/dist/report/breadcrumb.d.ts +9 -0
- package/dist/report/breadcrumb.d.ts.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/watch/model.d.ts +10 -0
- package/dist/watch/model.d.ts.map +1 -1
- package/dist/watch/phases.d.ts +14 -0
- package/dist/watch/phases.d.ts.map +1 -1
- package/dist/watch/render.d.ts.map +1 -1
- package/package.json +2 -2
- 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 +71 -0
- package/skills/launchpad-status/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,47 @@ 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.36.0 — 2026-06-18
|
|
10
|
+
|
|
11
|
+
Feature (sp-rpt9kd, ADR 0029): **`launchpad bug` / `launchpad feature`** — file a
|
|
12
|
+
bug report or feature request straight from the CLI.
|
|
13
|
+
|
|
14
|
+
- Lands as a Linear issue in the team's dedicated inbox (the AIOps
|
|
15
|
+
"Launchpad - Bugs/Features" project), tagged `kind:bug`/`kind:feature`,
|
|
16
|
+
attributed to you. Bot-brokered — the CLI never holds a Linear credential.
|
|
17
|
+
- Non-interactive (`--title`/`--message` or a positional message) so the AI can
|
|
18
|
+
drive it; a TTY prompts for what's missing. `--json` returns `{ identifier, url }`.
|
|
19
|
+
- **Seat-independent acknowledgement** (you get a reference even without a Linear
|
|
20
|
+
seat), **duplicate collapsing**, and **fail-soft** (prints your report back if
|
|
21
|
+
the tracker is unreachable).
|
|
22
|
+
- A small, fixed, non-sensitive context is attached (CLI version, OS, last command
|
|
23
|
+
**name + exit code — never its arguments**, app slug). Server-side rate-limiting
|
|
24
|
+
+ cross-reporter dedupe guard against floods.
|
|
25
|
+
|
|
26
|
+
> Requires the portal-bot deploy that ships `POST /reports` + the `ReportRateLimit`
|
|
27
|
+
> DO migration; until then the verbs fail soft.
|
|
28
|
+
|
|
29
|
+
## 0.34.1 — 2026-06-18
|
|
30
|
+
|
|
31
|
+
Fix (sp-pvf8r2, Bundle A): `launchpad watch` now shows the **real** provisioning
|
|
32
|
+
failure reason, and both `watch` and `status` advise `recover` when a failed app
|
|
33
|
+
is probably live.
|
|
34
|
+
|
|
35
|
+
- **`watch` no longer renders `✗ —: unknown`.** When a failure is recorded on the
|
|
36
|
+
registry but the `AppStatus` Durable Object never got a structured `failedAt`
|
|
37
|
+
(exactly what happens when the DO write itself is the casualty — e.g. a
|
|
38
|
+
transient Cloudflare Durable Object reset, the test-app-02 class), the watcher
|
|
39
|
+
now falls back to the registry's `lifecycleReason`, mirroring what
|
|
40
|
+
`launchpad status` already showed. The lifecycle endpoint already carried the
|
|
41
|
+
reason; only the CLI wasn't reading it — no bot change.
|
|
42
|
+
- **Recover-vs-resume advice is now stage-based.** A failure at or after
|
|
43
|
+
`ready_for_content` (infra/cert/access all completed → the app may already be
|
|
44
|
+
serving) advises `launchpad recover <slug>` instead of `deploy --resume` /
|
|
45
|
+
re-running `deploy`. Earlier-stage failures still advise fix-and-redeploy.
|
|
46
|
+
|
|
47
|
+
(Bundle B — making the provisioning Workflow treat a transient DO reset as
|
|
48
|
+
retryable instead of a terminal failure — ships separately.)
|
|
49
|
+
|
|
9
50
|
## 0.34.0 — 2026-06-18
|
|
10
51
|
|
|
11
52
|
New verb: **`launchpad redeploy [<slug>]`** (sp-rdpl41) — trigger a fresh
|
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.36.0";
|
|
23
23
|
|
|
24
24
|
// src/config.ts
|
|
25
25
|
import * as os from "node:os";
|
|
@@ -3897,6 +3897,13 @@ function ordinalOfStage(stage) {
|
|
|
3897
3897
|
const i = STAGE_ORDER.indexOf(stage);
|
|
3898
3898
|
return i < 0 ? null : i + 1;
|
|
3899
3899
|
}
|
|
3900
|
+
function isLikelyLiveFailureStage(stage) {
|
|
3901
|
+
if (!stage)
|
|
3902
|
+
return false;
|
|
3903
|
+
const ord = ordinalOfStage(stage);
|
|
3904
|
+
const threshold = ordinalOfStage("ready_for_content");
|
|
3905
|
+
return ord !== null && threshold !== null && ord >= threshold;
|
|
3906
|
+
}
|
|
3900
3907
|
function phaseOfStage(stage) {
|
|
3901
3908
|
return STAGE_TO_PHASE[stage] ?? FAILURE_STAGE_TO_PHASE[stage] ?? null;
|
|
3902
3909
|
}
|
|
@@ -3932,9 +3939,15 @@ class WatchModel {
|
|
|
3932
3939
|
this.terminal = "live";
|
|
3933
3940
|
} else if (view.state === "failed") {
|
|
3934
3941
|
this.terminal = "failed";
|
|
3935
|
-
|
|
3936
|
-
|
|
3937
|
-
|
|
3942
|
+
const synthesized = view.failedAt ?? (view.lifecycleReason !== undefined ? {
|
|
3943
|
+
stage: view.stage ?? this.currentStage ?? "unknown",
|
|
3944
|
+
message: view.lifecycleReason,
|
|
3945
|
+
retryable: false
|
|
3946
|
+
} : undefined);
|
|
3947
|
+
this.failure = synthesized ?? this.failure;
|
|
3948
|
+
const failStage = view.failedAt?.stage ?? view.stage;
|
|
3949
|
+
if (failStage)
|
|
3950
|
+
this.currentStage = failStage;
|
|
3938
3951
|
}
|
|
3939
3952
|
}
|
|
3940
3953
|
isTerminal() {
|
|
@@ -4211,7 +4224,7 @@ function renderFailedFrame(s, opts) {
|
|
|
4211
4224
|
const row = s.phases.map((p) => `${p.name} ${p.status === "failed" ? g.fail : p.status === "done" ? g.done : g.pending}`).join(" ");
|
|
4212
4225
|
const stage = s.failure ? sanitizeField(s.failure.stage, 40) : "—";
|
|
4213
4226
|
const reason = s.failure ? sanitizeField(s.failure.message, 200) : "unknown";
|
|
4214
|
-
const recovery = s.failure?.
|
|
4227
|
+
const recovery = isLikelyLiveFailureStage(s.failure?.stage) ? "recover" : "deploy --resume";
|
|
4215
4228
|
return [
|
|
4216
4229
|
` launchpad ${g.sep} ${slug} ${g.dash} provisioning failed`,
|
|
4217
4230
|
"",
|
|
@@ -4647,7 +4660,12 @@ function emit3(out, asJson, io) {
|
|
|
4647
4660
|
return;
|
|
4648
4661
|
case "provisioning_failed":
|
|
4649
4662
|
io.out(`${out.slug}: provisioning FAILED at stage ${out.stage ?? "unknown"}` + (out.failedReason ? `: ${out.failedReason}` : ""));
|
|
4650
|
-
|
|
4663
|
+
if (isLikelyLiveFailureStage(out.stage)) {
|
|
4664
|
+
io.out(` the app may already be live — run \`launchpad recover ${out.slug}\` to reconcile the record;`);
|
|
4665
|
+
io.out(" if it isn't, fix the cause and re-run `launchpad deploy`.");
|
|
4666
|
+
} else {
|
|
4667
|
+
io.out(" fix the cause and re-run `launchpad deploy`.");
|
|
4668
|
+
}
|
|
4651
4669
|
return;
|
|
4652
4670
|
case "destroying":
|
|
4653
4671
|
io.out(`${out.slug}: destroying…`);
|
|
@@ -11286,6 +11304,7 @@ var BUNDLED_SKILLS = [
|
|
|
11286
11304
|
"launchpad-status",
|
|
11287
11305
|
"launchpad-destroy",
|
|
11288
11306
|
"launchpad-identity",
|
|
11307
|
+
"launchpad-report",
|
|
11289
11308
|
"marquee-share"
|
|
11290
11309
|
];
|
|
11291
11310
|
function isBundleManaged(name) {
|
|
@@ -12906,6 +12925,179 @@ var emitTelemetryCommand = {
|
|
|
12906
12925
|
}
|
|
12907
12926
|
};
|
|
12908
12927
|
|
|
12928
|
+
// src/commands/report.ts
|
|
12929
|
+
import { createInterface as createInterface6 } from "node:readline/promises";
|
|
12930
|
+
import { platform } from "node:os";
|
|
12931
|
+
|
|
12932
|
+
// src/report/breadcrumb.ts
|
|
12933
|
+
import { writeFileSync as writeFileSync10, readFileSync as readFileSync22, mkdirSync as mkdirSync6 } from "node:fs";
|
|
12934
|
+
import { homedir as homedir6 } from "node:os";
|
|
12935
|
+
import { join as join17, dirname as dirname11 } from "node:path";
|
|
12936
|
+
function breadcrumbPath() {
|
|
12937
|
+
return join17(homedir6(), ".launchpad", "last-run.json");
|
|
12938
|
+
}
|
|
12939
|
+
function writeBreadcrumb(verb, exit) {
|
|
12940
|
+
try {
|
|
12941
|
+
const p = breadcrumbPath();
|
|
12942
|
+
mkdirSync6(dirname11(p), { recursive: true });
|
|
12943
|
+
writeFileSync10(p, JSON.stringify({ verb, exit, ts: Date.now() }), "utf8");
|
|
12944
|
+
} catch {}
|
|
12945
|
+
}
|
|
12946
|
+
function readBreadcrumb() {
|
|
12947
|
+
try {
|
|
12948
|
+
const raw = JSON.parse(readFileSync22(breadcrumbPath(), "utf8"));
|
|
12949
|
+
if (typeof raw !== "object" || raw === null)
|
|
12950
|
+
return null;
|
|
12951
|
+
const r = raw;
|
|
12952
|
+
if (typeof r.verb !== "string")
|
|
12953
|
+
return null;
|
|
12954
|
+
const exit = typeof r.exit === "number" && Number.isFinite(r.exit) ? Math.trunc(r.exit) : 0;
|
|
12955
|
+
return { verb: r.verb, exit };
|
|
12956
|
+
} catch {
|
|
12957
|
+
return null;
|
|
12958
|
+
}
|
|
12959
|
+
}
|
|
12960
|
+
|
|
12961
|
+
// src/commands/report.ts
|
|
12962
|
+
function realDeps2() {
|
|
12963
|
+
return {
|
|
12964
|
+
loadConfig,
|
|
12965
|
+
apiJson,
|
|
12966
|
+
isTty: () => process.stdout.isTTY === true && process.stdin.isTTY === true,
|
|
12967
|
+
prompt: async (question) => {
|
|
12968
|
+
const rl = createInterface6({ input: process.stdin, output: process.stdout });
|
|
12969
|
+
try {
|
|
12970
|
+
return (await rl.question(question)).trim();
|
|
12971
|
+
} finally {
|
|
12972
|
+
rl.close();
|
|
12973
|
+
}
|
|
12974
|
+
},
|
|
12975
|
+
cliVersion: CLI_VERSION,
|
|
12976
|
+
os: platform(),
|
|
12977
|
+
cwd: () => process.cwd(),
|
|
12978
|
+
readBreadcrumb
|
|
12979
|
+
};
|
|
12980
|
+
}
|
|
12981
|
+
function parseArgs15(args) {
|
|
12982
|
+
let title;
|
|
12983
|
+
let message;
|
|
12984
|
+
let positional;
|
|
12985
|
+
let json = false;
|
|
12986
|
+
for (let i = 0;i < args.length; i++) {
|
|
12987
|
+
const a = args[i];
|
|
12988
|
+
if (a === "--json")
|
|
12989
|
+
json = true;
|
|
12990
|
+
else if (a === "--title") {
|
|
12991
|
+
const v = args[i + 1];
|
|
12992
|
+
if (v !== undefined && !v.startsWith("-")) {
|
|
12993
|
+
title = v;
|
|
12994
|
+
i++;
|
|
12995
|
+
}
|
|
12996
|
+
} else if (a === "--message" || a === "-m") {
|
|
12997
|
+
const v = args[i + 1];
|
|
12998
|
+
if (v !== undefined && !v.startsWith("-")) {
|
|
12999
|
+
message = v;
|
|
13000
|
+
i++;
|
|
13001
|
+
}
|
|
13002
|
+
} else if (a !== undefined && !a.startsWith("-") && positional === undefined) {
|
|
13003
|
+
positional = a;
|
|
13004
|
+
}
|
|
13005
|
+
}
|
|
13006
|
+
return { title, message, positional, json };
|
|
13007
|
+
}
|
|
13008
|
+
var NOUN = { bug: "bug report", feature: "feature request" };
|
|
13009
|
+
async function runReport(kind, args, io, deps) {
|
|
13010
|
+
const verb = kind;
|
|
13011
|
+
const parsed = parseArgs15(args);
|
|
13012
|
+
let message = parsed.message ?? parsed.positional ?? "";
|
|
13013
|
+
let title = parsed.title ?? "";
|
|
13014
|
+
if (message === "" && deps.isTty()) {
|
|
13015
|
+
title = title || await deps.prompt(`${NOUN[kind]} — title: `);
|
|
13016
|
+
message = await deps.prompt("description: ");
|
|
13017
|
+
}
|
|
13018
|
+
if (title === "")
|
|
13019
|
+
title = deriveTitle(message);
|
|
13020
|
+
if (title === "" && message === "") {
|
|
13021
|
+
io.err(`usage: launchpad ${verb} "<description>" [--title <t>] [--json]`);
|
|
13022
|
+
return 64;
|
|
13023
|
+
}
|
|
13024
|
+
const ctx = buildContext(deps);
|
|
13025
|
+
try {
|
|
13026
|
+
const cfg = deps.loadConfig();
|
|
13027
|
+
const resp = await deps.apiJson(cfg, {
|
|
13028
|
+
method: "POST",
|
|
13029
|
+
path: "/reports",
|
|
13030
|
+
jsonBody: { kind, title, message, context: ctx },
|
|
13031
|
+
nonThrowingStatuses: [400, 429, 502, 503]
|
|
13032
|
+
});
|
|
13033
|
+
if (parsed.json) {
|
|
13034
|
+
io.out(JSON.stringify(resp));
|
|
13035
|
+
return resp.identifier !== undefined ? 0 : 1;
|
|
13036
|
+
}
|
|
13037
|
+
if (resp.identifier !== undefined) {
|
|
13038
|
+
if (resp.duplicate === true) {
|
|
13039
|
+
io.out(`✓ Already reported as ${resp.identifier} — thanks, no need to file again.`);
|
|
13040
|
+
} else {
|
|
13041
|
+
io.out(`✓ Filed your ${NOUN[kind]} as ${resp.identifier}.`);
|
|
13042
|
+
io.out(" The team is notified — no further action needed.");
|
|
13043
|
+
if (resp.url)
|
|
13044
|
+
io.out(` ${resp.url}`);
|
|
13045
|
+
}
|
|
13046
|
+
return 0;
|
|
13047
|
+
}
|
|
13048
|
+
if (resp.error === "rate_limited") {
|
|
13049
|
+
io.err(`launchpad ${verb}: ${resp.message ?? "rate limited"} (retry in ~${resp.retryAfterSec ?? 60}s).`);
|
|
13050
|
+
return 1;
|
|
13051
|
+
}
|
|
13052
|
+
if (resp.error === "bad_request") {
|
|
13053
|
+
io.err(`launchpad ${verb}: ${resp.message ?? "invalid report"}.`);
|
|
13054
|
+
return 64;
|
|
13055
|
+
}
|
|
13056
|
+
return failSoft(verb, kind, title, message, io);
|
|
13057
|
+
} catch (e) {
|
|
13058
|
+
if (e instanceof UnauthenticatedError) {
|
|
13059
|
+
io.err(`${e.message}`);
|
|
13060
|
+
return 1;
|
|
13061
|
+
}
|
|
13062
|
+
return failSoft(verb, kind, title, message, io);
|
|
13063
|
+
}
|
|
13064
|
+
}
|
|
13065
|
+
function failSoft(verb, kind, title, message, io) {
|
|
13066
|
+
io.err(`launchpad ${verb}: couldn't reach the tracker — your ${NOUN[kind]} was NOT filed.`);
|
|
13067
|
+
io.err("Here it is to paste manually:");
|
|
13068
|
+
io.err(` Title: ${title}`);
|
|
13069
|
+
if (message)
|
|
13070
|
+
io.err(` ${message}`);
|
|
13071
|
+
return 1;
|
|
13072
|
+
}
|
|
13073
|
+
function deriveTitle(message) {
|
|
13074
|
+
const firstLine = message.split(`
|
|
13075
|
+
`)[0]?.trim() ?? "";
|
|
13076
|
+
return firstLine.length > 80 ? `${firstLine.slice(0, 77)}…` : firstLine;
|
|
13077
|
+
}
|
|
13078
|
+
function buildContext(deps) {
|
|
13079
|
+
const ctx = {
|
|
13080
|
+
cliVersion: deps.cliVersion,
|
|
13081
|
+
os: deps.os
|
|
13082
|
+
};
|
|
13083
|
+
const crumb = deps.readBreadcrumb();
|
|
13084
|
+
if (crumb) {
|
|
13085
|
+
ctx.lastVerb = crumb.verb;
|
|
13086
|
+
ctx.lastExit = String(crumb.exit);
|
|
13087
|
+
}
|
|
13088
|
+
const slug = inferSlugFromCwd(deps.cwd());
|
|
13089
|
+
if (slug)
|
|
13090
|
+
ctx.appSlug = slug;
|
|
13091
|
+
return ctx;
|
|
13092
|
+
}
|
|
13093
|
+
function makeReportCommand(kind, deps = realDeps2()) {
|
|
13094
|
+
return {
|
|
13095
|
+
name: kind,
|
|
13096
|
+
summary: kind === "bug" ? "file a bug report (lands in the team's Linear inbox)" : "file a feature request (lands in the team's Linear inbox)",
|
|
13097
|
+
run: (args, io) => runReport(kind, args, io, deps)
|
|
13098
|
+
};
|
|
13099
|
+
}
|
|
13100
|
+
|
|
12909
13101
|
// src/dispatcher.ts
|
|
12910
13102
|
var COMMANDS = [
|
|
12911
13103
|
loginCommand,
|
|
@@ -12936,6 +13128,8 @@ var COMMANDS = [
|
|
|
12936
13128
|
secretsCommand,
|
|
12937
13129
|
grantEditorCommand,
|
|
12938
13130
|
revokeEditorCommand,
|
|
13131
|
+
makeReportCommand("bug"),
|
|
13132
|
+
makeReportCommand("feature"),
|
|
12939
13133
|
refreshUpdateCacheCommand,
|
|
12940
13134
|
emitTelemetryCommand
|
|
12941
13135
|
];
|
|
@@ -12957,7 +13151,11 @@ async function dispatch(argv, io, commands = COMMANDS) {
|
|
|
12957
13151
|
io.err("Run `launchpad --help` for the list of available commands.");
|
|
12958
13152
|
return 64;
|
|
12959
13153
|
}
|
|
12960
|
-
|
|
13154
|
+
const code = await cmd.run(rest, io);
|
|
13155
|
+
if (!cmd.hidden && verb !== "bug" && verb !== "feature") {
|
|
13156
|
+
writeBreadcrumb(verb, code);
|
|
13157
|
+
}
|
|
13158
|
+
return code;
|
|
12961
13159
|
}
|
|
12962
13160
|
function printHelp6(io, commands) {
|
|
12963
13161
|
io.out("launchpad — manage Launchpad-deployed apps from the command line.");
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { readBreadcrumb } from "../report/breadcrumb.js";
|
|
2
|
+
import type { CliConfig } from "../config.js";
|
|
3
|
+
import type { ApiRequestOptions } from "../http/api-client.js";
|
|
4
|
+
import type { Command } from "../dispatcher.js";
|
|
5
|
+
export type ReportKind = "bug" | "feature";
|
|
6
|
+
export interface ReportDeps {
|
|
7
|
+
readonly loadConfig: () => CliConfig;
|
|
8
|
+
readonly apiJson: <T>(cfg: CliConfig, opts: ApiRequestOptions) => Promise<T>;
|
|
9
|
+
readonly isTty: () => boolean;
|
|
10
|
+
readonly prompt: (question: string) => Promise<string>;
|
|
11
|
+
readonly cliVersion: string;
|
|
12
|
+
readonly os: string;
|
|
13
|
+
readonly cwd: () => string;
|
|
14
|
+
readonly readBreadcrumb: typeof readBreadcrumb;
|
|
15
|
+
}
|
|
16
|
+
export declare function makeReportCommand(kind: ReportKind, deps?: ReportDeps): Command;
|
|
17
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAEjE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,OAAO,cAAc,CAAC;CAChD;AA0KD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,UAAuB,GAAG,OAAO,CAS1F"}
|
|
@@ -5,7 +5,7 @@ import type { Command } from "../dispatcher.js";
|
|
|
5
5
|
* "bundled list matches the skills dir" test in `tests/skills-command.test.ts`
|
|
6
6
|
* enforces this so a newly-added skill dir can't silently go un-installed.
|
|
7
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"];
|
|
8
|
+
export declare const BUNDLED_SKILLS: readonly ["launchpad-onboard", "launchpad-deploy", "launchpad-deploy-status", "launchpad-content-pr", "launchpad-status", "launchpad-destroy", "launchpad-identity", "launchpad-report", "marquee-share"];
|
|
9
9
|
export declare const skillsCommand: Command;
|
|
10
10
|
interface InstallEnv {
|
|
11
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;AASjE;;;;;GAKG;AACH,eAAO,MAAM,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,2MAcjB,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AA0CA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC3B,MAAM,gCAAgC,CAAC;AASxC,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/dispatcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAuDA,MAAM,WAAW,KAAK;IACpB,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,wCAAwC;IACxC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxE;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,SAAS,OAAO,EAqCtC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,KAAK,EACT,QAAQ,GAAE,SAAS,OAAO,EAAa,GACtC,OAAO,CAAC,QAAQ,CAAC,CA0BnB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAyBvE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Breadcrumb {
|
|
2
|
+
readonly verb: string;
|
|
3
|
+
readonly exit: number;
|
|
4
|
+
}
|
|
5
|
+
/** Record the verb + exit code. Best-effort; never throws. */
|
|
6
|
+
export declare function writeBreadcrumb(verb: string, exit: number): void;
|
|
7
|
+
/** Read the last breadcrumb, or null. Best-effort; never throws. */
|
|
8
|
+
export declare function readBreadcrumb(): Breadcrumb | null;
|
|
9
|
+
//# sourceMappingURL=breadcrumb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../../src/report/breadcrumb.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAMD,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQhE;AAED,oEAAoE;AACpE,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CAYlD"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.
|
|
1
|
+
export declare const CLI_VERSION = "0.36.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/watch/model.d.ts
CHANGED
|
@@ -8,6 +8,16 @@ export interface LifecycleSnapshot {
|
|
|
8
8
|
readonly message: string;
|
|
9
9
|
readonly retryable: boolean;
|
|
10
10
|
};
|
|
11
|
+
/**
|
|
12
|
+
* Registry-level failure reason. Set when the failure was recorded on the
|
|
13
|
+
* registry but the AppStatus DO never got a `failedAt` — which is exactly
|
|
14
|
+
* what happens when the DO write itself is the casualty (e.g. a transient
|
|
15
|
+
* Cloudflare Durable Object reset, the test-app-02 class). Without this
|
|
16
|
+
* fallback the watcher renders "✗ —: unknown" while `launchpad status`
|
|
17
|
+
* shows the real reason. Mirrors status.ts's `failedAt?.message ??
|
|
18
|
+
* lifecycleReason` resolution.
|
|
19
|
+
*/
|
|
20
|
+
readonly lifecycleReason?: string;
|
|
11
21
|
readonly liveUrl?: string;
|
|
12
22
|
}
|
|
13
23
|
export type PhaseStatus = "pending" | "active" | "done" | "failed";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/watch/model.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,SAAS,EAKf,MAAM,aAAa,CAAC;AAErB,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EACV,cAAc,GACd,MAAM,GACN,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,gBAAgB,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;8EAC0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,wCAAwC;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;KAC7B,GAAG,IAAI,CAAC;IACT,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,qBAAa,UAAU;IAWT,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVjC,OAAO,CAAC,WAAW,CAAuB;IAC1C,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,OAAO,CAAuB;gBAET,IAAI,EAAE,MAAM;IAEzC,2CAA2C;IAC3C,MAAM,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/watch/model.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,SAAS,EAKf,MAAM,aAAa,CAAC;AAErB,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EACV,cAAc,GACd,MAAM,GACN,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,gBAAgB,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF;;;;;;;;OAQG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;8EAC0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,wCAAwC;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;KAC7B,GAAG,IAAI,CAAC;IACT,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,qBAAa,UAAU;IAWT,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVjC,OAAO,CAAC,WAAW,CAAuB;IAC1C,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,OAAO,CAAuB;gBAET,IAAI,EAAE,MAAM;IAEzC,2CAA2C;IAC3C,MAAM,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAmCpD,kEAAkE;IAClE,UAAU,IAAI,OAAO;IAIrB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa;IAsDtC;;;;;OAKG;IACH,OAAO,CAAC,YAAY;CA4BrB"}
|
package/dist/watch/phases.d.ts
CHANGED
|
@@ -10,6 +10,20 @@ export declare const STAGE_ORDER: readonly ["pending", "repo_created", "bootstra
|
|
|
10
10
|
export declare const TOTAL_STAGES: 15;
|
|
11
11
|
/** 1-based ordinal of a working stage, or null if not a working stage. */
|
|
12
12
|
export declare function ordinalOfStage(stage: string): number | null;
|
|
13
|
+
/**
|
|
14
|
+
* Did this failure stage occur AFTER the infra/cert/access stages completed —
|
|
15
|
+
* i.e. the app's resources are likely up and it may actually be serving despite
|
|
16
|
+
* a recorded `provisioning_failed`? True for `ready_for_content` and later
|
|
17
|
+
* (the Verify phase). When true, the right next step is `launchpad recover`
|
|
18
|
+
* (reconcile the record against live CF state), not `deploy --resume` /
|
|
19
|
+
* re-running `deploy` (which re-provisions an app that is probably already live).
|
|
20
|
+
*
|
|
21
|
+
* This is the test-app-02 class: a transient failure (e.g. a Cloudflare Durable
|
|
22
|
+
* Object reset) at `ready_for_content` after Repo/Build/Infra/Cert/Access all
|
|
23
|
+
* passed. Failure pseudo-stages (`tf_apply_failed`, `validator_rejected`, …) and
|
|
24
|
+
* unknown stages return false → fix-and-redeploy remains the advice.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isLikelyLiveFailureStage(stage: string | null | undefined): boolean;
|
|
13
27
|
/**
|
|
14
28
|
* The phase a stage belongs to. Returns null for an unrecognised stage
|
|
15
29
|
* (the model then keeps the last-known active phase rather than guessing).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phases.d.ts","sourceRoot":"","sources":["../../src/watch/phases.ts"],"names":[],"mappings":"AAWA,wCAAwC;AACxC,eAAO,MAAM,WAAW,wEAOd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,WAAW,4RAgBd,CAAC;AAEX,eAAO,MAAM,YAAY,IAAqB,CAAC;AAmC/C,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE5D;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEnD"}
|
|
1
|
+
{"version":3,"file":"phases.d.ts","sourceRoot":"","sources":["../../src/watch/phases.ts"],"names":[],"mappings":"AAWA,wCAAwC;AACxC,eAAO,MAAM,WAAW,wEAOd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,WAAW,4RAgBd,CAAC;AAEX,eAAO,MAAM,YAAY,IAAqB,CAAC;AAmC/C,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAKlF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE5D;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/watch/render.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/watch/render.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D,KAAK,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAoCtC,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAIzC,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAEzD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,SAAM,GAAG,MAAM,CAMpE;AAqBD,uEAAuE;AACvE,wBAAgB,uBAAuB,CACrC,CAAC,EAAE,aAAa,EAChB,IAAI,EAAE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAChD,MAAM,CAkBR;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,aAAa,EAChB,IAAI,EAAE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAChD,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAaxD;AAED,wBAAwB;AACxB,wBAAgB,eAAe,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,MAAM,CAYrF;AAED,0BAA0B;AAC1B,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,MAAM,CAqBvF;AAED;;;GAGG;AACH,qBAAa,QAAQ;IAOjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;gBAGhB,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAC1B,IAAI,EAAE,UAAU;IAKnC,yEAAyE;IACzE,IAAI,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAc5B,0EAA0E;IAC1E,QAAQ,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAchC,gFAAgF;IAChF,aAAa,IAAI,IAAI;IAOrB,OAAO,CAAC,MAAM;CAKf"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@m-kopa/launchpad-cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Launchpad CLI
|
|
3
|
+
"version": "0.36.0",
|
|
4
|
+
"description": "Launchpad CLI \u2014 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": {
|
|
7
7
|
"launchpad": "./dist/cli.js"
|
|
@@ -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.36.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.36.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.36.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.36.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.36.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.36.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: launchpad-report
|
|
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.36.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|
|
8
|
+
## Shell contract — read this first
|
|
9
|
+
|
|
10
|
+
Every fenced `bash` block below MUST be sent to the `Bash` tool **verbatim**.
|
|
11
|
+
Do not rewrite into PowerShell, cmd, zsh-isms, or "equivalent" forms.
|
|
12
|
+
|
|
13
|
+
- macOS / Linux: the `Bash` tool runs system bash.
|
|
14
|
+
- Windows: the `Bash` tool runs Git for Windows (MSYS) bash. `$HOME`,
|
|
15
|
+
forward slashes, `test -f`, `command -v`, heredocs, and `[[ … ]]` all
|
|
16
|
+
work. There is no reason to translate to `Test-Path`, `$env:USERPROFILE`,
|
|
17
|
+
`Get-Content`, `Where-Object`, `Get-ChildItem`, or backslash paths —
|
|
18
|
+
doing so will fail with `/usr/bin/bash: syntax error`.
|
|
19
|
+
|
|
20
|
+
If a step genuinely needs OS branching, branch *inside* bash:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
case "$(uname -s)" in
|
|
24
|
+
Darwin) : ;;
|
|
25
|
+
Linux) : ;;
|
|
26
|
+
MINGW*|MSYS*|CYGWIN*) : ;;
|
|
27
|
+
esac
|
|
28
|
+
```
|
|
29
|
+
<!-- END shell-contract -->
|
|
30
|
+
|
|
31
|
+
## What this does
|
|
32
|
+
|
|
33
|
+
`launchpad bug` and `launchpad feature` file a report straight into the team's
|
|
34
|
+
Linear inbox (bot-brokered — no credentials needed locally). Use them when the
|
|
35
|
+
user reports a problem or wishes for a feature.
|
|
36
|
+
|
|
37
|
+
## Rules (read first)
|
|
38
|
+
|
|
39
|
+
1. **Never file silently.** Before running the command, show the user the exact
|
|
40
|
+
title + description you're about to send and ask them to confirm. The CLI
|
|
41
|
+
attaches a little non-sensitive context automatically (CLI version, OS, last
|
|
42
|
+
command name + exit code, app slug) — you don't add it.
|
|
43
|
+
2. **Don't paste secrets.** Put only the user's description in `--message`. Never
|
|
44
|
+
include tokens, secret values, or full command lines with arguments.
|
|
45
|
+
3. **Don't double-file.** One report per issue per conversation. If you already
|
|
46
|
+
filed it (or the CLI says it's a duplicate), tell the user the reference rather
|
|
47
|
+
than filing again.
|
|
48
|
+
|
|
49
|
+
## How to file
|
|
50
|
+
|
|
51
|
+
Pick the verb by intent — a defect is a `bug`, a wish is a `feature`:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
launchpad bug --title "watch hangs after a failed deploy" \
|
|
55
|
+
--message "After a failed deploy, launchpad watch never exits." --json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
launchpad feature --title "pin a default region" \
|
|
60
|
+
--message "Allow a default region in launchpad.yaml so I don't pass --region." --json
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`--json` returns `{ "identifier": "AIO-…", "url": "…" }`. Report the `identifier`
|
|
64
|
+
back to the user as confirmation (they may not have a Linear seat to open the URL).
|
|
65
|
+
|
|
66
|
+
## Handling the result
|
|
67
|
+
|
|
68
|
+
- **Success** → tell the user: "Filed as `AIO-…` — the team's notified."
|
|
69
|
+
- **Duplicate** (`"duplicate": true`) → "That's already tracked as `AIO-…`."
|
|
70
|
+
- **Failure / non-zero exit** → the CLI prints the report back; offer it to the
|
|
71
|
+
user to file manually. Do not retry in a loop.
|
|
@@ -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.36.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|