@m-kopa/launchpad-cli 0.25.0 → 0.27.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/dist/auth/flow.d.ts +7 -3
  3. package/dist/auth/flow.d.ts.map +1 -1
  4. package/dist/auth/gateway-flow.d.ts +76 -0
  5. package/dist/auth/gateway-flow.d.ts.map +1 -0
  6. package/dist/auth/session.d.ts +35 -2
  7. package/dist/auth/session.d.ts.map +1 -1
  8. package/dist/cli.js +871 -331
  9. package/dist/commands/deploy.d.ts +10 -13
  10. package/dist/commands/deploy.d.ts.map +1 -1
  11. package/dist/commands/destroy.d.ts +1 -1
  12. package/dist/commands/destroy.d.ts.map +1 -1
  13. package/dist/commands/envvars.d.ts +2 -2
  14. package/dist/commands/envvars.d.ts.map +1 -1
  15. package/dist/commands/infer-slug.d.ts +37 -0
  16. package/dist/commands/infer-slug.d.ts.map +1 -0
  17. package/dist/commands/login.d.ts +10 -0
  18. package/dist/commands/login.d.ts.map +1 -1
  19. package/dist/commands/logout.d.ts +7 -0
  20. package/dist/commands/logout.d.ts.map +1 -1
  21. package/dist/commands/logs.d.ts +2 -2
  22. package/dist/commands/logs.d.ts.map +1 -1
  23. package/dist/commands/merge.d.ts +2 -2
  24. package/dist/commands/merge.d.ts.map +1 -1
  25. package/dist/commands/pull.d.ts +1 -1
  26. package/dist/commands/pull.d.ts.map +1 -1
  27. package/dist/commands/recover.d.ts +12 -0
  28. package/dist/commands/recover.d.ts.map +1 -0
  29. package/dist/commands/review.d.ts +2 -2
  30. package/dist/commands/review.d.ts.map +1 -1
  31. package/dist/commands/status.d.ts +13 -3
  32. package/dist/commands/status.d.ts.map +1 -1
  33. package/dist/config.d.ts +11 -0
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/dispatcher.d.ts.map +1 -1
  36. package/dist/version.d.ts +1 -1
  37. package/package.json +1 -1
  38. package/skills/launchpad-content-pr/SKILL.md +1 -1
  39. package/skills/launchpad-deploy/SKILL.md +1 -1
  40. package/skills/launchpad-deploy-status/SKILL.md +6 -4
  41. package/skills/launchpad-destroy/SKILL.md +1 -1
  42. package/skills/launchpad-onboard/SKILL.md +1 -1
  43. package/skills/launchpad-status/SKILL.md +13 -6
@@ -1,29 +1,26 @@
1
1
  import { MAX_COMPRESSED_TARBALL_BYTES } from "../deploy/tar-pack.js";
2
+ import { inferSlugFromCwd, resolveManifestSlug } from "./infer-slug.js";
2
3
  import type { Command } from "../dispatcher.js";
4
+ export { inferSlugFromCwd, resolveManifestSlug };
3
5
  export declare const deployCommand: Command;
4
6
  interface DeployArgs {
5
7
  /** Null = infer from cwd. */
6
8
  readonly slug: string | null;
7
9
  readonly message: string | null;
8
10
  }
11
+ /**
12
+ * The deploy usage banner. Kept in ONE place (sp-devlp1 T7 rider) so
13
+ * it can't drift from the parser again: the previous copy still
14
+ * advertised `--apply --platform-repo <path>` long after the flag was
15
+ * removed (apply runs server-side via portal-bot; runDeployApply
16
+ * refuses `--platform-repo` with exit 64).
17
+ */
18
+ export declare function deployUsage(): string;
9
19
  /**
10
20
  * Parse the deploy verb's flag set. Returns null on a malformed
11
21
  * argv (so the caller can render the usage banner).
12
22
  */
13
23
  export declare function parseArgs(args: readonly string[]): DeployArgs | null;
14
- /**
15
- * Pull the `<slug>` out of a directory named `launchpad-app-<slug>`.
16
- * Returns null for any other cwd shape.
17
- */
18
- export declare function inferSlugFromCwd(cwd: string): string | null;
19
24
  /** Re-export for tests. */
20
25
  export { MAX_COMPRESSED_TARBALL_BYTES };
21
- /**
22
- * Resolve the app slug from a parsed `launchpad.yaml`. Manifest v1
23
- * carries it as `metadata.name`; manifest v2 (spec/status, the per-app
24
- * shape) as `metadata.slug`. Accept either so `launchpad deploy` works
25
- * against both shapes. Returns `null` when neither is a string (caller
26
- * surfaces the error). Pure — the deploy command's testable seam (AC1).
27
- */
28
- export declare function resolveManifestSlug(parsed: unknown): string | null;
29
26
  //# sourceMappingURL=deploy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAgDA,OAAO,EAGL,4BAA4B,EAC7B,MAAM,uBAAuB,CAAC;AAM/B,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAEjE,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;AAwPD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CAwBpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AA6GD,2BAA2B;AAC3B,OAAO,EAAE,4BAA4B,EAAE,CAAC;AAYxC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAalE"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAgDA,OAAO,EAGL,4BAA4B,EAC7B,MAAM,uBAAuB,CAAC;AAM/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;AAqPD;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAoBpC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CAwBpE;AA6GD,2BAA2B;AAC3B,OAAO,EAAE,4BAA4B,EAAE,CAAC"}
@@ -9,6 +9,6 @@ interface DestroyArgs {
9
9
  readonly json: boolean;
10
10
  }
11
11
  export declare function runDestroy(args: readonly string[], io: CliIo, prompt: PromptFn, isTty: () => boolean): Promise<ExitCode>;
12
- export declare function parseArgs(args: readonly string[], cwd?: string): DestroyArgs | string;
12
+ export declare function parseArgs(args: readonly string[], cwd?: string, warn?: (line: string) => void): DestroyArgs | string;
13
13
  export {};
14
14
  //# sourceMappingURL=destroy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjE,iEAAiE;AACjE,MAAM,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,cAAc,EAAE,OAI5B,CAAC;AAEF,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AA0CD,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,KAAK,EACT,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,MAAM,OAAO,GACnB,OAAO,CAAC,QAAQ,CAAC,CAqEnB;AAKD,wBAAgB,SAAS,CACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAsB,GAC1B,WAAW,GAAG,MAAM,CAkEtB"}
1
+ {"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjE,iEAAiE;AACjE,MAAM,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,cAAc,EAAE,OAI5B,CAAC;AAEF,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AA0CD,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,KAAK,EACT,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,MAAM,OAAO,GACnB,OAAO,CAAC,QAAQ,CAAC,CAqEnB;AAKD,wBAAgB,SAAS,CACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAsB,EAC3B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC5B,WAAW,GAAG,MAAM,CAsEtB"}
@@ -1,4 +1,6 @@
1
1
  import type { CliIo, Command } from "../dispatcher.js";
2
+ import { inferSlugFromCwd } from "./infer-slug.js";
3
+ export { inferSlugFromCwd };
2
4
  import type { EnvVarEntry } from "../types/api.js";
3
5
  export declare const envvarsCommand: Command;
4
6
  interface ListArgs {
@@ -18,11 +20,9 @@ interface RmArgs {
18
20
  }
19
21
  type EnvArgs = ListArgs | SetArgs | RmArgs;
20
22
  export declare function parseArgs(args: readonly string[]): EnvArgs | null;
21
- export declare function inferSlugFromCwd(cwd: string): string | null;
22
23
  /**
23
24
  * Two-column rendering: NAME + VALUE. secret_text values render as
24
25
  * `•••` (the bot never returns them, so this is what we have).
25
26
  */
26
27
  export declare function renderList(envVars: readonly EnvVarEntry[], io: CliIo): void;
27
- export {};
28
28
  //# sourceMappingURL=envvars.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"envvars.d.ts","sourceRoot":"","sources":["../../src/commands/envvars.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EACV,WAAW,EAEZ,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,cAAc,EAAE,OAI5B,CAAC;AAEF,UAAU,QAAQ;IAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AACD,UAAU,OAAO;IACf,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AACD,UAAU,MAAM;IACd,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AACD,KAAK,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAqH3C,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAqDjE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,EAAE,EAAE,KAAK,GACR,IAAI,CAqBN"}
1
+ {"version":3,"file":"envvars.d.ts","sourceRoot":"","sources":["../../src/commands/envvars.ts"],"names":[],"mappings":"AAiCA,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,WAAW,EAEZ,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,cAAc,EAAE,OAI5B,CAAC;AAEF,UAAU,QAAQ;IAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AACD,UAAU,OAAO;IACf,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AACD,UAAU,MAAM;IACd,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AACD,KAAK,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAoH3C,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAqDjE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,EAAE,EAAE,KAAK,GACR,IAAI,CAqBN"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Pull the `<slug>` out of a directory named `launchpad-app-<slug>`.
3
+ * Returns null for any other cwd shape.
4
+ */
5
+ export declare function inferSlugFromCwd(cwd: string): string | null;
6
+ /**
7
+ * Resolve the app slug from a parsed `launchpad.yaml`. Manifest v1
8
+ * carries it as `metadata.name`; manifest v2 (spec/status, the per-app
9
+ * shape) as `metadata.slug`. Accept either so the verbs work against
10
+ * both shapes. Returns `null` when neither is a string (caller
11
+ * surfaces the error). Pure — the testable seam (M-1216 AC1).
12
+ */
13
+ export declare function resolveManifestSlug(parsed: unknown): string | null;
14
+ /**
15
+ * Read the manifest at `manifestPath` and resolve its declared slug.
16
+ * Returns null when the file is absent, unreadable, not valid YAML, or
17
+ * declares no slug — inference degrades to the directory-name
18
+ * convention in every failure mode (the file is re-read and properly
19
+ * error-mapped by whichever verb actually needs its contents).
20
+ */
21
+ export declare function inferSlugFromManifestFile(manifestPath: string): string | null;
22
+ export interface InferSlugOptions {
23
+ readonly cwd: string;
24
+ /** Manifest path override (`--file`). Relative paths resolve against
25
+ * `cwd`. Defaults to `<cwd>/launchpad.yaml`. */
26
+ readonly file?: string | undefined;
27
+ /** Sink for the manifest-vs-dirname disagreement note (stderr). */
28
+ readonly warn?: ((line: string) => void) | undefined;
29
+ }
30
+ /**
31
+ * Infer the app slug when none was passed explicitly: the local
32
+ * manifest's declared slug first, then the `launchpad-app-<slug>`
33
+ * directory-name convention. Manifest wins a disagreement (with a
34
+ * `warn` note). Returns null when neither source resolves.
35
+ */
36
+ export declare function inferSlug(opts: InferSlugOptions): string | null;
37
+ //# sourceMappingURL=infer-slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer-slug.d.ts","sourceRoot":"","sources":["../../src/commands/infer-slug.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAalE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO7E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;qDACiD;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACtD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAY/D"}
@@ -1,3 +1,13 @@
1
+ import { login } from "../auth/flow.js";
2
+ import { gatewayLogin } from "../auth/gateway-flow.js";
1
3
  import type { Command } from "../dispatcher.js";
4
+ /** Injectable seams so the dual-path order, fallback messaging and
5
+ * kill-switch are testable without a live browser or network. The
6
+ * production command wires the real flows. */
7
+ export interface LoginCommandDeps {
8
+ readonly gatewayLogin: typeof gatewayLogin;
9
+ readonly legacyLogin: typeof login;
10
+ }
2
11
  export declare const loginCommand: Command;
12
+ export declare function makeLoginCommand(deps?: LoginCommandDeps): Command;
3
13
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAmB,MAAM,kBAAkB,CAAC;AAEjE,eAAO,MAAM,YAAY,EAAE,OAI1B,CAAC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAmB,MAAM,kBAAkB,CAAC;AAEjE;;+CAE+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,EAAE,OAAO,YAAY,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,OAAO,KAAK,CAAC;CACpC;AAID,eAAO,MAAM,YAAY,EAAE,OAA4B,CAAC;AAExD,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,gBAA4B,GAAG,OAAO,CAM5E"}
@@ -1,3 +1,10 @@
1
+ import { revokeGatewaySession } from "../auth/gateway-flow.js";
1
2
  import type { Command } from "../dispatcher.js";
3
+ /** Injectable seam so the server-side revoke (and its offline
4
+ * failure path) is testable without a live gateway. */
5
+ export interface LogoutCommandDeps {
6
+ readonly revoke: typeof revokeGatewaySession;
7
+ }
2
8
  export declare const logoutCommand: Command;
9
+ export declare function makeLogoutCommand(deps?: LogoutCommandDeps): Command;
3
10
  //# sourceMappingURL=logout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAmB,MAAM,kBAAkB,CAAC;AAEjE,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC"}
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAmB,MAAM,kBAAkB,CAAC;AAEjE;wDACwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,oBAAoB,CAAC;CAC9C;AAID,eAAO,MAAM,aAAa,EAAE,OAA6B,CAAC;AAE1D,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,iBAA6B,GAAG,OAAO,CAM9E"}
@@ -1,4 +1,6 @@
1
1
  import type { CliIo, Command } from "../dispatcher.js";
2
+ import { inferSlugFromCwd } from "./infer-slug.js";
3
+ export { inferSlugFromCwd };
2
4
  import type { DeploymentSummary } from "../types/api.js";
3
5
  export declare const logsCommand: Command;
4
6
  interface LogsArgs {
@@ -6,11 +8,9 @@ interface LogsArgs {
6
8
  readonly lines: number;
7
9
  }
8
10
  export declare function parseArgs(args: readonly string[]): LogsArgs | null;
9
- export declare function inferSlugFromCwd(cwd: string): string | null;
10
11
  /**
11
12
  * Render a list of deployments. Pulled out for testing without
12
13
  * the full apiJson stack.
13
14
  */
14
15
  export declare function renderDeployments(deployments: readonly DeploymentSummary[], io: CliIo): void;
15
- export {};
16
16
  //# sourceMappingURL=logs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,WAAW,EAAE,OAIzB,CAAC;AAEF,UAAU,QAAQ;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAgFD,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,GAAG,IAAI,CA0BlE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,SAAS,iBAAiB,EAAE,EACzC,EAAE,EAAE,KAAK,GACR,IAAI,CA+BN"}
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AA8BA,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,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,WAAW,EAAE,OAIzB,CAAC;AAEF,UAAU,QAAQ;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AA+ED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,GAAG,IAAI,CA0BlE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,SAAS,iBAAiB,EAAE,EACzC,EAAE,EAAE,KAAK,GACR,IAAI,CA+BN"}
@@ -1,4 +1,6 @@
1
1
  import type { CliIo, Command } from "../dispatcher.js";
2
+ import { inferSlugFromCwd } from "./infer-slug.js";
3
+ export { inferSlugFromCwd };
2
4
  import type { BotErrorEnvelope } from "../types/api.js";
3
5
  export declare const mergeCommand: Command;
4
6
  interface MergeArgs {
@@ -10,7 +12,6 @@ interface MergeArgs {
10
12
  * positional `prNumber` is mandatory; an empty argv is a usage error.
11
13
  */
12
14
  export declare function parseArgs(args: readonly string[]): MergeArgs | null;
13
- export declare function inferSlugFromCwd(cwd: string): string | null;
14
15
  /**
15
16
  * Render the bot's structured error envelope. Pulled out so the
16
17
  * test can exercise each `error` discriminator without spinning
@@ -25,5 +26,4 @@ export declare function inferSlugFromCwd(cwd: string): string | null;
25
26
  * "blocked"`.
26
27
  */
27
28
  export declare function renderBotError(status: number, env: BotErrorEnvelope | null, io: CliIo, prNumber?: number | null): void;
28
- export {};
29
29
  //# sourceMappingURL=merge.d.ts.map
@@ -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,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;CAC3B;AA+GD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,CA8BnE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;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,CA4EN"}
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;CAC3B;AA8GD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,CA8BnE;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,CA4EN"}
@@ -7,6 +7,6 @@ interface PullArgs {
7
7
  readonly status: boolean;
8
8
  }
9
9
  /** Pure arg parser. Returns parsed shape or human-readable error string. */
10
- export declare function parseArgs(args: readonly string[], cwd?: string): PullArgs | string;
10
+ export declare function parseArgs(args: readonly string[], cwd?: string, warn?: (line: string) => void): PullArgs | string;
11
11
  export {};
12
12
  //# sourceMappingURL=pull.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAEjE,eAAO,MAAM,WAAW,EAAE,OAIzB,CAAC;AAEF,UAAU,QAAQ;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAyID,4EAA4E;AAC5E,wBAAgB,SAAS,CACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAsB,GAC1B,QAAQ,GAAG,MAAM,CA2DnB"}
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAEjE,eAAO,MAAM,WAAW,EAAE,OAIzB,CAAC;AAEF,UAAU,QAAQ;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAyID,4EAA4E;AAC5E,wBAAgB,SAAS,CACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAsB,EAC3B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC5B,QAAQ,GAAG,MAAM,CA8DnB"}
@@ -0,0 +1,12 @@
1
+ import type { Command } from "../dispatcher.js";
2
+ export declare const recoverCommand: Command;
3
+ interface RecoverArgs {
4
+ readonly slug: string;
5
+ readonly json: boolean;
6
+ }
7
+ /** Pure arg parser. Exported for tests. Slug resolution mirrors
8
+ * `launchpad status` (positional / --slug / cwd dirname) plus the
9
+ * Model A fallback: a `launchpad.yaml` at cwd names the slug. */
10
+ export declare function parseRecoverArgs(args: readonly string[], cwd?: string, warn?: (line: string) => void): RecoverArgs | string;
11
+ export {};
12
+ //# sourceMappingURL=recover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recover.d.ts","sourceRoot":"","sources":["../../src/commands/recover.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAEjE,eAAO,MAAM,cAAc,EAAE,OAI5B,CAAC;AAIF,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAiLD;;kEAEkE;AAClE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAsB,EAC3B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC5B,WAAW,GAAG,MAAM,CAgDtB"}
@@ -1,4 +1,6 @@
1
1
  import type { CliIo, Command } from "../dispatcher.js";
2
+ import { inferSlugFromCwd } from "./infer-slug.js";
3
+ export { inferSlugFromCwd };
2
4
  import type { ReviewResponse } from "../types/api.js";
3
5
  export declare const reviewCommand: Command;
4
6
  interface ReviewArgs {
@@ -11,12 +13,10 @@ interface ReviewArgs {
11
13
  * the caller can render the usage banner.
12
14
  */
13
15
  export declare function parseArgs(args: readonly string[]): ReviewArgs | null;
14
- export declare function inferSlugFromCwd(cwd: string): string | null;
15
16
  /**
16
17
  * Render the ReviewResponse to stdout. Pulled out so the test
17
18
  * can exercise the formatter directly without spinning up the
18
19
  * full apiJson stack.
19
20
  */
20
21
  export declare function renderReview(r: ReviewResponse, io: CliIo): void;
21
- export {};
22
22
  //# sourceMappingURL=review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAEV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC;AAEF,UAAU,UAAU;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAyFD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CA4BpE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,GAAG,IAAI,CA4B/D"}
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.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,EAEV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC;AAEF,UAAU,UAAU;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAwFD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CA4BpE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,GAAG,IAAI,CA4B/D"}
@@ -17,8 +17,17 @@ export interface StatusJsonOutput {
17
17
  /** Live CF Pages content exists but no platform-tracked manifest —
18
18
  * the app deploys via git integration / outside `launchpad deploy`
19
19
  * (sp-devlp1 AC6; the sp-gitst1 misreport fix). */
20
- | "live_content_untracked" | "in_sync" | "drift" | "no_deployed_manifest" | "destroying" | "destroyed" | "destroy_failed";
20
+ | "live_content_untracked" | "in_sync" | "drift"
21
+ /** The app is live and a deployed manifest exists, but there is no
22
+ * local launchpad.yaml to compare against — status degraded to the
23
+ * live-truth-only view (fix/status-slug-inference Fault 2). */
24
+ | "live_drift_unknown" | "no_deployed_manifest" | "destroying" | "destroyed" | "destroy_failed";
21
25
  readonly slug: string;
26
+ /** Drift-evaluation discriminant (fix/status-slug-inference): emitted
27
+ * as `null` when drift was NOT evaluated because no local manifest
28
+ * exists (live-truth-only degrade). Absent when drift was evaluated
29
+ * (the `state` field carries in_sync/drift) or doesn't apply. */
30
+ readonly drift?: null;
22
31
  /** Provisioning/failed only — the current (or failing) workflow stage. */
23
32
  readonly stage?: string | null;
24
33
  /** provisioning_failed only — the failure message. */
@@ -62,7 +71,8 @@ export declare function computeDrift(local: Manifest, deployed: Manifest): Reado
62
71
  local: unknown;
63
72
  deployed: unknown;
64
73
  }>;
65
- /** Pure arg parser. Exported for tests. */
66
- export declare function parseArgs(args: readonly string[], cwd?: string): StatusArgs | string;
74
+ /** Arg parser (reads the filesystem only for slug inference).
75
+ * Exported for tests. */
76
+ export declare function parseArgs(args: readonly string[], cwd?: string, warn?: (line: string) => void): StatusArgs | string;
67
77
  export {};
68
78
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAyCA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC3B,MAAM,gCAAgC,CAAC;AASxC,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAEjE,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC;AAEF,UAAU,UAAU;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAuBD;;;uEAGuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EACV,cAAc,GACd,qBAAqB,GACrB,iBAAiB;IACnB;;wDAEoD;OAClD,wBAAwB,GACxB,SAAS,GACT,OAAO,GACP,sBAAsB,GACtB,YAAY,GACZ,WAAW,GACX,gBAAgB,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,sDAAsD;IACtD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,oFAAoF;IACpF,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;QACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC5B,CAAC,CAAC;IACH;;;wCAGoC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAClD;;sDAEkD;IAClD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAChE;AAyOD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,QAAQ,GACjB,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CA2DpE;AA4PD,2CAA2C;AAC3C,wBAAgB,SAAS,CACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAsB,GAC1B,UAAU,GAAG,MAAM,CAgErB"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AA6CA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC3B,MAAM,gCAAgC,CAAC;AASxC,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,KAAK,EAAS,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAEjE,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC;AAEF,UAAU,UAAU;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAuBD;;;uEAGuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EACV,cAAc,GACd,qBAAqB,GACrB,iBAAiB;IACnB;;wDAEoD;OAClD,wBAAwB,GACxB,SAAS,GACT,OAAO;IACT;;oEAEgE;OAC9D,oBAAoB,GACpB,sBAAsB,GACtB,YAAY,GACZ,WAAW,GACX,gBAAgB,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;sEAGkE;IAClE,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,sDAAsD;IACtD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,oFAAoF;IACpF,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;QACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC5B,CAAC,CAAC;IACH;;;wCAGoC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAClD;;sDAEkD;IAClD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAChE;AAuRD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,QAAQ,GACjB,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CA2DpE;AAuRD;0BAC0B;AAC1B,wBAAgB,SAAS,CACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAsB,EAC3B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC5B,UAAU,GAAG,MAAM,CAqErB"}
package/dist/config.d.ts CHANGED
@@ -1,7 +1,18 @@
1
1
  /** Production bot URL (Cloudflare Workers `*.workers.dev` host). */
2
2
  export declare const DEFAULT_BOT_URL = "https://launchpad-portal-bot.mkopa-launchpad.workers.dev";
3
+ /** Production auth gateway — the issuer of the cli-session credential
4
+ * (`launchpad login`'s default front-channel, ADR 0026). Endpoints
5
+ * are FIXED paths on this host (no discovery). Override with
6
+ * `LAUNCHPAD_AUTH_GATEWAY_URL` for tests / preview gateways. */
7
+ export declare const DEFAULT_AUTH_GATEWAY_URL = "https://auth.launchpad.m-kopa.us";
3
8
  export interface CliConfig {
4
9
  readonly botUrl: string;
10
+ /** Base URL of the auth gateway minting cli-session credentials. */
11
+ readonly authGatewayUrl: string;
12
+ /** Kill-switch: `LAUNCHPAD_AUTH_LEGACY=1` forces `launchpad login`
13
+ * onto the legacy Cloudflare Access flow, skipping the gateway
14
+ * entirely (dual-auth window escape hatch — AC-WINDOW). */
15
+ readonly authLegacy: boolean;
5
16
  readonly sessionPath: string;
6
17
  readonly cacheDir: string;
7
18
  readonly stateDir: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AA4CA,oEAAoE;AACpE,eAAO,MAAM,eAAe,6DACgC,CAAC;AAE7D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAgB1E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAkDA,oEAAoE;AACpE,eAAO,MAAM,eAAe,6DACgC,CAAC;AAE7D;;;iEAGiE;AACjE,eAAO,MAAM,wBAAwB,qCAAqC,CAAC;AAE3E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;gEAE4D;IAC5D,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CA2B1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAgDA,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,EA6BtC,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,CAmBnB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAyBvE"}
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAiDA,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,EA8BtC,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,CAmBnB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAyBvE"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.25.0";
1
+ export declare const CLI_VERSION = "0.27.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m-kopa/launchpad-cli",
3
- "version": "0.25.0",
3
+ "version": "0.27.0",
4
4
  "description": "Launchpad CLI — clone / deploy / review / merge against Launchpad-managed apps. Talks to the portal-bot endpoints (SCOPE-M-760 / T4).",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: launchpad-content-pr
3
3
  description: Push a content change to a Launchpad app via `launchpad deploy` and verify it shipped via `launchpad status`. Covers the post-first-deploy iteration loop (edit → deploy → verify) and the stack-fit pre-flight that the bot enforces server-side. 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.25.0
4
+ version: 0.27.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 tails the resulting content PR. 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.25.0
4
+ version: 0.27.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). Renders the M-892 stage trace for legacy in-flight provisioning. Use when someone says "what's the status of demo-X", "/launchpad-deploy-status", "is my deploy stuck", or after `/launchpad-deploy` reports a non-`done` terminal stage.
4
- version: 0.25.0
4
+ version: 0.27.0
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
@@ -46,9 +46,11 @@ If that fails, run `/launchpad-onboard` first.
46
46
  ## Input
47
47
 
48
48
  Accept a **slug** (e.g. `demo-9`) as a positional argument. If the
49
- user invokes the skill without one, ask for it. If the user is
50
- sitting inside a `launchpad-app-<slug>/` clone, the slug can be
51
- inferred from cwd by every verb below.
49
+ user is sitting in a directory with a `launchpad.yaml` (any directory
50
+ name) or inside a `launchpad-app-<slug>/` clone, every verb below
51
+ infers the slug from cwd (manifest slug first, then directory name) —
52
+ do not ask. Ask for the slug only when the user gave none AND neither
53
+ inference source resolves.
52
54
 
53
55
  ## Quick triage — which verb do you want?
54
56
 
@@ -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, Access app, custom hostname, platform-repo TF entries, 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.25.0
4
+ version: 0.27.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 Cf Access 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.25.0
4
+ version: 0.27.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.25.0
4
+ version: 0.27.0
5
5
  ---
6
6
 
7
7
  <!-- BEGIN shell-contract (managed by scripts/sync-skill-contract.sh — edit skills/_partials/shell-contract.md) -->
@@ -68,16 +68,23 @@ Both verbs are owner/editor-scoped — non-members get HTTP 403 with
68
68
 
69
69
  ## Slug resolution
70
70
 
71
- Both verbs accept the slug three ways, with this precedence:
71
+ Both verbs accept the slug four ways, with this precedence:
72
72
 
73
73
  1. **`--slug <slug>`** — explicit, wins over everything.
74
74
  2. **Positional argument** — `launchpad pull horizon-clone`.
75
- 3. **Current directory inference** — if cwd is named
75
+ 3. **Local manifest inference** — the slug declared by
76
+ `./launchpad.yaml` (or `--file` on `launchpad status`); v1
77
+ `metadata.name` / v2 `metadata.slug`. Works from any directory
78
+ containing a valid manifest, whatever it is called.
79
+ 4. **Current directory inference** — if cwd is named
76
80
  `launchpad-app-<slug>/`, the slug is extracted automatically.
77
- This is the default when you've `launchpad clone`d an app.
78
81
 
79
- `--file <path>` on `launchpad status` only changes which **local**
80
- manifest is read; it does NOT change slug resolution.
82
+ When 3 and 4 both resolve and disagree, the manifest wins and a note
83
+ is printed to stderr. `--slug` / positional always override.
84
+
85
+ If `launchpad status` has a slug but NO local manifest exists, it does
86
+ not error: it renders the live-truth-only view (lifecycle + deployment;
87
+ drift not checked) and exits 0.
81
88
 
82
89
  ## `launchpad pull`
83
90