@m-kopa/launchpad-cli 0.47.2 → 0.49.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 +57 -0
- package/dist/bundle/orchestrate.d.ts +2 -2
- package/dist/bundle/orchestrate.d.ts.map +1 -1
- package/dist/bundle/upload.d.ts +26 -6
- package/dist/bundle/upload.d.ts.map +1 -1
- package/dist/cli.js +781 -228
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/groups.d.ts.map +1 -1
- package/dist/commands/status.d.ts +17 -2
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/deploy/access-drift-offer.d.ts +15 -16
- package/dist/deploy/access-drift-offer.d.ts.map +1 -1
- package/dist/deploy/apply.d.ts +8 -0
- package/dist/deploy/apply.d.ts.map +1 -1
- package/dist/groups/client.d.ts +3 -0
- package/dist/groups/client.d.ts.map +1 -1
- package/dist/http/api-client.d.ts +1 -1
- package/dist/http/api-client.d.ts.map +1 -1
- package/dist/http/error-envelope.d.ts +43 -0
- package/dist/http/error-envelope.d.ts.map +1 -0
- package/dist/http/errors.d.ts +15 -5
- package/dist/http/errors.d.ts.map +1 -1
- package/dist/report/fault-signal.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/skills/launchpad-content-pr/SKILL.md +11 -14
- package/skills/launchpad-deploy/SKILL.md +21 -28
- 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 +15 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAEjE,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,wDAAyD,CAAC;AAChF,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAEjE,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,wDAAyD,CAAC;AAChF,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAkFD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,MAAM,CAgEtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAsEA,OAAO,EAGL,4BAA4B,EAC7B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAsEA,OAAO,EAGL,4BAA4B,EAC7B,MAAM,uBAAuB,CAAC;AAc/B,OAAO,EAAa,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAKjE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;AAEjD,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC;AAEF,UAAU,UAAU;IAClB,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAmQD;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAoBpC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CAwBpE;AAgMD,2BAA2B;AAC3B,OAAO,EAAE,4BAA4B,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/commands/groups.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/commands/groups.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAWjE,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type CliConfig } from "../config.js";
|
|
2
2
|
import { type DeploymentStatusView, type StandingExceptionView } from "../deploy/deployment-status.js";
|
|
3
|
-
import { type Manifest, type AccessDrift } from "@m-kopa/launchpad-engine";
|
|
3
|
+
import { type Manifest, type AccessDrift, type CanonicalGroupId } from "@m-kopa/launchpad-engine";
|
|
4
4
|
import type { Command } from "../dispatcher.js";
|
|
5
5
|
export declare const statusCommand: Command;
|
|
6
6
|
interface StatusArgs {
|
|
@@ -85,6 +85,18 @@ export interface StatusJsonOutput {
|
|
|
85
85
|
* this is "what I declare" vs "what the gateway actually enforces".
|
|
86
86
|
* Absent when not a gateway-KV app (`enforcedGroups` null / old bot). */
|
|
87
87
|
readonly accessDrift?: AccessDrift;
|
|
88
|
+
/** CF-Access assignment failures, separate from canonical drift identity. */
|
|
89
|
+
readonly groupIssues?: readonly StatusGroupIssue[];
|
|
90
|
+
}
|
|
91
|
+
export interface StatusGroupIssue {
|
|
92
|
+
readonly code: "group_not_assigned";
|
|
93
|
+
readonly source: "local" | "deployed";
|
|
94
|
+
readonly manifestSha: string | null;
|
|
95
|
+
readonly offendingRefs: readonly string[];
|
|
96
|
+
readonly candidates: ReadonlyArray<{
|
|
97
|
+
readonly id: string;
|
|
98
|
+
readonly displayName: string;
|
|
99
|
+
}>;
|
|
88
100
|
}
|
|
89
101
|
/** Fetch the app's provisioning lifecycle (sp-st5hw9). Returns null when the
|
|
90
102
|
* bot doesn't recognise the slug OR predates the endpoint — BOTH surface as a
|
|
@@ -101,7 +113,10 @@ export declare function fetchLifecycle(cfg: CliConfig, slug: string): Promise<Li
|
|
|
101
113
|
*
|
|
102
114
|
* Returns an empty array iff `local` and `deployed` are equivalent.
|
|
103
115
|
*/
|
|
104
|
-
export declare function computeDrift(local: Manifest, deployed: Manifest
|
|
116
|
+
export declare function computeDrift(local: Manifest, deployed: Manifest, canonicalGroups?: {
|
|
117
|
+
readonly local: readonly CanonicalGroupId[];
|
|
118
|
+
readonly deployed: readonly CanonicalGroupId[];
|
|
119
|
+
}): ReadonlyArray<{
|
|
105
120
|
path: string;
|
|
106
121
|
local: unknown;
|
|
107
122
|
deployed: unknown;
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAOjE,eAAO,MAAM,eAAe,EAAE,OAI7B,CAAC"}
|
|
@@ -1,40 +1,37 @@
|
|
|
1
1
|
import type { CliIo, ExitCode } from "../dispatcher.js";
|
|
2
2
|
import type { ApplyOptions } from "./apply.js";
|
|
3
|
+
import type { AccessReconcileOutcome } from "../bundle/upload.js";
|
|
3
4
|
/** The two-direction group diff the bot returns with a 409 `access_drift`. */
|
|
4
5
|
export interface AccessDriftBody {
|
|
5
6
|
readonly live_only?: unknown;
|
|
6
7
|
readonly manifest_only?: unknown;
|
|
7
8
|
}
|
|
8
9
|
export interface AccessDriftDeps {
|
|
9
|
-
/** True when we may prompt (stdin is a TTY). */
|
|
10
|
-
readonly interactive: boolean;
|
|
11
|
-
/** Ask a yes/no question; resolves the raw typed line. */
|
|
12
|
-
readonly prompt: (question: string) => Promise<string>;
|
|
13
10
|
/**
|
|
14
11
|
* Run the gated apply flow. Defaults to `runDeployApply` at the call site.
|
|
15
12
|
* The third arg carries an `onApplied` hook the flow fires only when a
|
|
16
13
|
* terraform apply actually completes — so we never claim success when the
|
|
17
|
-
*
|
|
14
|
+
* apply reaches a non-applied terminal state (both paths can exit 0).
|
|
18
15
|
*/
|
|
19
16
|
readonly runApply: (opts: ApplyOptions, io: CliIo, deps?: {
|
|
20
17
|
readonly onApplied?: () => void;
|
|
21
18
|
}) => Promise<ExitCode>;
|
|
22
19
|
}
|
|
23
20
|
/**
|
|
24
|
-
* The drift summary — printed
|
|
25
|
-
* directions of the divergence so the operator can see exactly what
|
|
26
|
-
* change
|
|
21
|
+
* The drift summary — printed before the automatic reconcile. Names both
|
|
22
|
+
* directions of the divergence so the operator can see exactly what is about
|
|
23
|
+
* to change.
|
|
27
24
|
*/
|
|
28
25
|
export declare function renderAccessDriftSummary(slug: string, body: AccessDriftBody): string[];
|
|
29
26
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
27
|
+
* Surface an access-drift refusal and reconcile it automatically via the gated
|
|
28
|
+
* apply flow. Returns the exit code the deploy command should return.
|
|
29
|
+
*
|
|
30
|
+
* Honest exit (carried forward from the 0.47.1 fix): the apply flow exits 0
|
|
31
|
+
* both when a terraform apply actually completes AND when it reaches a
|
|
32
|
+
* non-applied terminal state without changing anything, so we only report
|
|
33
|
+
* "reconciled" — and only return the apply's 0 — when `onApplied` fired. A bare
|
|
34
|
+
* 0 with nothing applied would be false success a script/CI would observe.
|
|
38
35
|
*/
|
|
39
36
|
export declare function handleAccessDrift(params: {
|
|
40
37
|
readonly slug: string;
|
|
@@ -42,5 +39,7 @@ export declare function handleAccessDrift(params: {
|
|
|
42
39
|
readonly body: AccessDriftBody;
|
|
43
40
|
readonly io: CliIo;
|
|
44
41
|
readonly deps: AccessDriftDeps;
|
|
42
|
+
/** Present when a capable deploy already committed content and opened apply. */
|
|
43
|
+
readonly outcome?: AccessReconcileOutcome;
|
|
45
44
|
}): Promise<ExitCode>;
|
|
46
45
|
//# sourceMappingURL=access-drift-offer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-drift-offer.d.ts","sourceRoot":"","sources":["../../src/deploy/access-drift-offer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"access-drift-offer.d.ts","sourceRoot":"","sources":["../../src/deploy/access-drift-offer.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,IAAI,EAAE,YAAY,EAClB,EAAE,EAAE,KAAK,EACT,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,KACvC,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxB;AAKD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,eAAe,GACpB,MAAM,EAAE,CAoBV;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAC3C,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4DpB"}
|
package/dist/deploy/apply.d.ts
CHANGED
|
@@ -18,6 +18,14 @@ export interface ApplyOptions {
|
|
|
18
18
|
readonly resumePrNumber?: number;
|
|
19
19
|
/** Override the 90-minute default polling timeout (AC-U2). */
|
|
20
20
|
readonly timeoutMinutes?: number;
|
|
21
|
+
/** Durable PR identity returned by the capable bundle endpoint. */
|
|
22
|
+
readonly preopenedPr?: {
|
|
23
|
+
readonly number: number;
|
|
24
|
+
readonly url: string;
|
|
25
|
+
readonly headSha: string;
|
|
26
|
+
};
|
|
27
|
+
/** True when the server's durable recovery loop remains authoritative. */
|
|
28
|
+
readonly serverRecoveryActive?: boolean;
|
|
21
29
|
}
|
|
22
30
|
export interface ApplyDeps {
|
|
23
31
|
readonly prompt?: (question: string) => Promise<string>;
|
|
@@ -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;
|
|
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,CAmOnB"}
|
package/dist/groups/client.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CliConfig } from "../config.js";
|
|
2
|
+
import { type StructuredErrorEnvelope } from "../http/error-envelope.js";
|
|
2
3
|
/** Shape of one group in the bot's response. Mirrors
|
|
3
4
|
* `portal-bot/src/graph.ts`'s `EntraGroup`. */
|
|
4
5
|
export interface EntraGroup {
|
|
@@ -26,6 +27,7 @@ export type FetchGroupsResult = {
|
|
|
26
27
|
} | {
|
|
27
28
|
kind: "error";
|
|
28
29
|
message: string;
|
|
30
|
+
envelope?: StructuredErrorEnvelope;
|
|
29
31
|
};
|
|
30
32
|
/**
|
|
31
33
|
* Resolve the Entra group list, preferring the on-disk cache
|
|
@@ -63,6 +65,7 @@ export type TenantResolveResult = {
|
|
|
63
65
|
} | {
|
|
64
66
|
kind: "error";
|
|
65
67
|
message: string;
|
|
68
|
+
envelope?: StructuredErrorEnvelope;
|
|
66
69
|
};
|
|
67
70
|
interface ResolveOptions {
|
|
68
71
|
readonly fetcher?: typeof fetch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/groups/client.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/groups/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ export declare function apiJson<T>(cfg: CliConfig, opts: ApiRequestOptions, fetc
|
|
|
26
26
|
* status check. Used for streaming endpoints (e.g. tarball clone)
|
|
27
27
|
* where buffering the body would defeat the purpose.
|
|
28
28
|
*
|
|
29
|
-
* On non-2xx, drains the body
|
|
29
|
+
* On non-2xx, drains the body into a bounded structured envelope, throws a typed
|
|
30
30
|
* error, and the caller never sees the response.
|
|
31
31
|
*/
|
|
32
32
|
export declare function apiRaw(cfg: CliConfig, opts: ApiRequestOptions, fetcher?: typeof fetch): Promise<Response>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/http/api-client.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/http/api-client.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAe9C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClD;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAC7B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAC1B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,QAAQ,CAAC,CA0FnB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured bot error decoding shared by JSON and multipart callers.
|
|
3
|
+
*
|
|
4
|
+
* Error bodies are untrusted network input. Each field is bounded separately so
|
|
5
|
+
* useful structured diagnostics survive without dumping an unbounded response.
|
|
6
|
+
*/
|
|
7
|
+
export interface StructuredIssue {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
readonly code?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface StructuredCandidate {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly displayName: string;
|
|
15
|
+
}
|
|
16
|
+
export interface StructuredErrorEnvelope {
|
|
17
|
+
readonly status: number;
|
|
18
|
+
readonly endpoint: string;
|
|
19
|
+
readonly code: string;
|
|
20
|
+
readonly message: string;
|
|
21
|
+
readonly legacyError?: string;
|
|
22
|
+
readonly source?: string;
|
|
23
|
+
readonly sourceSha?: string | null;
|
|
24
|
+
readonly manifestSha?: string;
|
|
25
|
+
readonly offendingRefs: readonly string[];
|
|
26
|
+
readonly retryable: boolean | null;
|
|
27
|
+
readonly issues: readonly StructuredIssue[];
|
|
28
|
+
readonly candidates: readonly StructuredCandidate[];
|
|
29
|
+
readonly omissions: readonly string[];
|
|
30
|
+
}
|
|
31
|
+
export interface DecodeErrorContext {
|
|
32
|
+
readonly status: number;
|
|
33
|
+
readonly endpoint: string;
|
|
34
|
+
}
|
|
35
|
+
/** Decode a JSON bot error while preserving source-aware group diagnostics. */
|
|
36
|
+
export declare function decodeErrorEnvelope(input: unknown, context: DecodeErrorContext): StructuredErrorEnvelope;
|
|
37
|
+
/** Decode a response body without preview-slicing an unstructured payload. */
|
|
38
|
+
export declare function decodeErrorText(text: string, context: DecodeErrorContext): StructuredErrorEnvelope;
|
|
39
|
+
/** Render a complete, source-aware human diagnostic. */
|
|
40
|
+
export declare function formatErrorEnvelope(envelope: StructuredErrorEnvelope): string;
|
|
41
|
+
/** Stable JSON representation for commands offering a machine-readable mode. */
|
|
42
|
+
export declare function errorEnvelopeJson(envelope: StructuredErrorEnvelope): object;
|
|
43
|
+
//# sourceMappingURL=error-envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-envelope.d.ts","sourceRoot":"","sources":["../../src/http/error-envelope.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,GAC1B,uBAAuB,CA6CzB;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kBAAkB,GAC1B,uBAAuB,CAkBzB;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,MAAM,CA8B7E;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,MAAM,CAwB3E"}
|
package/dist/http/errors.d.ts
CHANGED
|
@@ -15,13 +15,23 @@ export declare class ForbiddenError extends Error {
|
|
|
15
15
|
export declare class NotFoundError extends Error {
|
|
16
16
|
readonly code: "not_found";
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
* dumping a full HTML page. */
|
|
18
|
+
import { type StructuredErrorEnvelope } from "./error-envelope.js";
|
|
19
|
+
/** Any other non-2xx. Carries the complete bounded structured envelope. */
|
|
21
20
|
export declare class ApiError extends Error {
|
|
22
|
-
readonly
|
|
21
|
+
readonly faultCode: "api_error";
|
|
22
|
+
readonly code: string;
|
|
23
23
|
readonly status: number;
|
|
24
|
-
|
|
24
|
+
readonly endpoint: string;
|
|
25
|
+
readonly source?: string;
|
|
26
|
+
readonly sourceSha?: string | null;
|
|
27
|
+
readonly manifestSha?: string;
|
|
28
|
+
readonly offendingRefs: readonly string[];
|
|
29
|
+
readonly retryable: boolean | null;
|
|
30
|
+
readonly issues: StructuredErrorEnvelope["issues"];
|
|
31
|
+
readonly candidates: StructuredErrorEnvelope["candidates"];
|
|
32
|
+
readonly omissions: readonly string[];
|
|
33
|
+
readonly envelope: StructuredErrorEnvelope;
|
|
34
|
+
constructor(envelope: StructuredErrorEnvelope);
|
|
25
35
|
}
|
|
26
36
|
/** Network failure, JSON parse failure, anything that wasn't
|
|
27
37
|
* actually a response. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAIA;;2DAE2D;AAC3D,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAU;CAC5C;AAED;;uCAEuC;AACvC,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;CACtC;AAED;yEACyE;AACzE,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;CACtC;AAED
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAIA;;2DAE2D;AAC3D,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAU;CAC5C;AAED;;uCAEuC;AACvC,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;CACtC;AAED;yEACyE;AACzE,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;CACtC;AAED,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,qBAAqB,CAAC;AAE7B,2EAA2E;AAC3E,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,SAAS,EAAG,WAAW,CAAU;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAC3D,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;gBAE/B,QAAQ,EAAE,uBAAuB;CAgB9C;AAED;2BAC2B;AAC3B,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAU;CAC5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fault-signal.d.ts","sourceRoot":"","sources":["../../src/report/fault-signal.ts"],"names":[],"mappings":"AAgBA,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"fault-signal.d.ts","sourceRoot":"","sources":["../../src/report/fault-signal.ts"],"names":[],"mappings":"AAgBA,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAQ9C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAG1C;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,IAAI,aAAa,GAAG,IAAI,CAEhD;AAED,mDAAmD;AACnD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.
|
|
1
|
+
export declare const CLI_VERSION = "0.49.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.49.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|
|
@@ -189,19 +189,16 @@ Both are offline by default (no bot). `launchpad validate
|
|
|
189
189
|
resolves against the **whole tenant**, so a valid *unassigned* tenant
|
|
190
190
|
group passes (no need to use `deploy --dry-run` as a workaround).
|
|
191
191
|
|
|
192
|
-
> **Changing the access group
|
|
193
|
-
> `access.allowed_entra_groups` and
|
|
194
|
-
>
|
|
195
|
-
>
|
|
196
|
-
>
|
|
197
|
-
>
|
|
198
|
-
>
|
|
199
|
-
>
|
|
200
|
-
>
|
|
201
|
-
>
|
|
202
|
-
> `launchpad status`) — or just accept the inline offer. Do **not** tell
|
|
203
|
-
> the user to raise a request with the platform team — `--apply` IS the
|
|
204
|
-
> self-serve route. See `/launchpad-status` and the
|
|
192
|
+
> **Changing the access group needs no special command.**
|
|
193
|
+
> Edit `access.allowed_entra_groups` and run `launchpad deploy`.
|
|
194
|
+
> The bot commits content first, then the CLI reconciles access from that exact commit through the gated apply PR.
|
|
195
|
+
> No second deploy is required.
|
|
196
|
+
> The CLI must not report access success before the apply reaches `applied`.
|
|
197
|
+
> A local timeout exits non-zero while durable server recovery remains active.
|
|
198
|
+
> Preview with `--dry-run` and undo a bad change with `launchpad rollback <prior-sha>`.
|
|
199
|
+
> Do not tell the user to raise a request with the platform team.
|
|
200
|
+
> See
|
|
201
|
+
> `/launchpad-status` and the
|
|
205
202
|
> [auth & groups](https://get.launchpad.m-kopa.us/docs/concepts/auth-groups#changing-access-on-an-existing-app)
|
|
206
203
|
> doc.
|
|
207
204
|
|
|
@@ -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.49.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|
|
@@ -213,19 +213,15 @@ tell the user to ask IT to assign the group — that requirement was
|
|
|
213
213
|
retired. `launchpad groups resolve <name|uuid>` resolves any tenant
|
|
214
214
|
group, assigned or not (PS-1859).
|
|
215
215
|
|
|
216
|
-
When the user picks a group, pass either
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
ambiguous.
|
|
216
|
+
When the user picks a group, pass either its exact display name or UUID to `launchpad init --group <value>`.
|
|
217
|
+
The CLI accepts any non-empty authored reference and preserves it in `launchpad.yaml`.
|
|
218
|
+
The server remains the authority and canonicalises the reference to its UUID.
|
|
219
|
+
Use a UUID whenever an exact display name is ambiguous.
|
|
221
220
|
|
|
222
|
-
A group reference
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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).
|
|
221
|
+
A group reference can fail as unknown, ineligible, or ambiguous.
|
|
222
|
+
For `auth: gateway`, an eligible tenant group does not need enterprise-app assignment.
|
|
223
|
+
For `auth: access`, the group must be assigned so Entra emits it in the groups claim; the server reports `group_not_assigned` separately.
|
|
224
|
+
Never use the assigned `groups list` shortlist as identity or drift authority.
|
|
229
225
|
|
|
230
226
|
**Pre-checking a group reference.** `launchpad validate
|
|
231
227
|
--strict-groups`, `launchpad groups resolve <name|uuid>`, and
|
|
@@ -233,17 +229,13 @@ are authorised at runtime via a Microsoft Graph membership check
|
|
|
233
229
|
(PS-1859), so any of them correctly accepts a valid unassigned group.
|
|
234
230
|
Use whichever fits; `--dry-run` additionally previews the Terraform.
|
|
235
231
|
|
|
236
|
-
This `--group` flow sets the group at
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
`launchpad deploy --apply` route and exits non-zero. Either way the fix
|
|
244
|
-
is the gated Terraform apply — see `/launchpad-content-pr`. Never route
|
|
245
|
-
the user to the platform team for a group change, and never tell them
|
|
246
|
-
access drift is unfixable: the self-serve reconcile is one keystroke.
|
|
232
|
+
This `--group` flow sets the group at first deploy.
|
|
233
|
+
Changing groups on an existing app still uses a plain `launchpad deploy`.
|
|
234
|
+
The server commits content first and returns an exact manifest SHA plus durable reconcile state.
|
|
235
|
+
The CLI pins plan, apply, and polling to that SHA and reuses any server-opened PR idempotently.
|
|
236
|
+
Do not ask the user to rerun deploy after access applies because the content is already committed.
|
|
237
|
+
Do not report access success until the apply reaches its applied terminal state.
|
|
238
|
+
On a polling timeout, surface the non-zero exit and state that server recovery remains active.
|
|
247
239
|
|
|
248
240
|
If `launchpad groups list` fails with:
|
|
249
241
|
|
|
@@ -328,8 +320,9 @@ fresh slug auto-provisions:
|
|
|
328
320
|
tarball, runs the ingest gates (see below), commits the bundle
|
|
329
321
|
straight onto `main` of `launchpad-app-<slug>` via the GitHub App
|
|
330
322
|
(no PR, no merge step), and CF Pages auto-builds on the push. The
|
|
331
|
-
|
|
332
|
-
|
|
323
|
+
When access changes, the commit lands first and access reconciles from that exact SHA before the CLI prints success.
|
|
324
|
+
The CLI prints `✓ Bundle accepted - committed as <sha>`.
|
|
325
|
+
A successful deploy is **not** a live app yet - the Pages build runs
|
|
333
326
|
asynchronously and can fail after the commit lands; confirm with
|
|
334
327
|
`launchpad status <slug>`.
|
|
335
328
|
|
|
@@ -377,8 +370,8 @@ Flags — there is nothing useful to pass on the Model A path:
|
|
|
377
370
|
- `--message` is sent as a request header on the legacy path only,
|
|
378
371
|
and the bot currently **ignores** it — don't offer it as a
|
|
379
372
|
change-log mechanism.
|
|
380
|
-
- `--file <path>` is valid only with the `--dry-run`
|
|
381
|
-
|
|
373
|
+
- `--file <path>` is valid only with the `--dry-run` manifest preview
|
|
374
|
+
(and the hidden `--apply` alias), not with a bundle deploy.
|
|
382
375
|
|
|
383
376
|
### A.6 Terminal handling
|
|
384
377
|
|
|
@@ -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.49.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.49.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.49.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.49.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.49.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.49.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
|
|
@@ -135,6 +135,12 @@ union of states, not just a drift verdict. The drift pair:
|
|
|
135
135
|
`access.allowed_entra_groups`, `hostnames[0]`, `build.command`,
|
|
136
136
|
`build.destination_dir`, `build.root_dir`, `production_env.*`.
|
|
137
137
|
|
|
138
|
+
Status resolves local, deployed, and enforced group references tenant-wide before comparison.
|
|
139
|
+
An exact display name and UUID for the same group are equal.
|
|
140
|
+
The assigned `/groups` shortlist is used only to annotate `group_not_assigned` for `auth: access` and is never drift authority.
|
|
141
|
+
Human errors name `/groups/resolve` plus the actual manifest source and SHA.
|
|
142
|
+
JSON errors preserve the structured endpoint, code, source SHA, manifest SHA, offending references, retryability, issues, and candidates.
|
|
143
|
+
|
|
138
144
|
The lifecycle states (rendered without needing a local manifest):
|
|
139
145
|
|
|
140
146
|
- **`provisioning`** — the provisioning workflow is running; status
|
|
@@ -331,19 +337,14 @@ which the bot handles.)
|
|
|
331
337
|
### "drift: access.allowed_entra_groups"
|
|
332
338
|
|
|
333
339
|
Group binding changed in your local manifest. This is the
|
|
334
|
-
**load-bearing** drift — it controls who can access the app.
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
`launchpad
|
|
341
|
-
|
|
342
|
-
bot **refuses** a content deploy while the manifest's groups diverge
|
|
343
|
-
from what the gateway actually enforces (so access changes can't be
|
|
344
|
-
silently dropped); `--apply` is the gated route that reconciles the
|
|
345
|
-
enforced KV allow-list to the manifest. `launchpad status --strict`
|
|
346
|
-
exits non-zero on any drift, so it can gate CI.
|
|
340
|
+
**load-bearing** drift — it controls who can access the app.
|
|
341
|
+
|
|
342
|
+
Reconcile it by running `launchpad deploy`.
|
|
343
|
+
The content commit lands first, then access plans, applies, and polls from that exact SHA.
|
|
344
|
+
No second deploy is needed.
|
|
345
|
+
To undo a bad change, run `launchpad rollback <prior-sha>`.
|
|
346
|
+
`launchpad status --strict` exits non-zero on any drift, so it can gate
|
|
347
|
+
CI.
|
|
347
348
|
|
|
348
349
|
## Related skills
|
|
349
350
|
|