@gpc-cli/cli 0.9.59 → 0.9.60

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 (29) hide show
  1. package/README.md +1 -1
  2. package/dist/__complete-QFD3SUAO.js +146 -0
  3. package/dist/__complete-QFD3SUAO.js.map +1 -0
  4. package/dist/bin.js +14 -11
  5. package/dist/bin.js.map +1 -1
  6. package/dist/{chunk-2AM4XW7Q.js → chunk-CSNCSWUV.js} +14 -11
  7. package/dist/chunk-CSNCSWUV.js.map +1 -0
  8. package/dist/{completion-KRZLHV7V.js → completion-4I3IJK3M.js} +80 -21
  9. package/dist/completion-4I3IJK3M.js.map +1 -0
  10. package/dist/{config-ZLXFAFMN.js → config-ZNAM2IHA.js} +2 -2
  11. package/dist/{doctor-PACXOJZ2.js → doctor-G2L2KVOO.js} +2 -2
  12. package/dist/{feedback-RO76QRIZ.js → feedback-WXSCASJK.js} +2 -2
  13. package/dist/index.js +1 -1
  14. package/dist/{listings-MOHHHNE6.js → listings-2Z6DSO3D.js} +4 -4
  15. package/dist/{publish-26SSZ2W3.js → publish-5HZAJEDZ.js} +4 -4
  16. package/dist/{testers-QUWZHO6M.js → testers-FGLBJAXL.js} +4 -4
  17. package/dist/{update-PDYA3B45.js → update-WA6X6LNQ.js} +2 -2
  18. package/dist/{version-FGBT5A7I.js → version-DYTSDZH2.js} +2 -2
  19. package/package.json +6 -6
  20. package/dist/chunk-2AM4XW7Q.js.map +0 -1
  21. package/dist/completion-KRZLHV7V.js.map +0 -1
  22. /package/dist/{config-ZLXFAFMN.js.map → config-ZNAM2IHA.js.map} +0 -0
  23. /package/dist/{doctor-PACXOJZ2.js.map → doctor-G2L2KVOO.js.map} +0 -0
  24. /package/dist/{feedback-RO76QRIZ.js.map → feedback-WXSCASJK.js.map} +0 -0
  25. /package/dist/{listings-MOHHHNE6.js.map → listings-2Z6DSO3D.js.map} +0 -0
  26. /package/dist/{publish-26SSZ2W3.js.map → publish-5HZAJEDZ.js.map} +0 -0
  27. /package/dist/{testers-QUWZHO6M.js.map → testers-FGLBJAXL.js.map} +0 -0
  28. /package/dist/{update-PDYA3B45.js.map → update-WA6X6LNQ.js.map} +0 -0
  29. /package/dist/{version-FGBT5A7I.js.map → version-DYTSDZH2.js.map} +0 -0
package/README.md CHANGED
@@ -87,7 +87,7 @@ curl -fsSL https://raw.githubusercontent.com/yasserstudio/gpc/main/scripts/insta
87
87
  - [Commands reference](https://yasserstudio.github.io/gpc/commands/)
88
88
  - [CI/CD recipes](https://yasserstudio.github.io/gpc/ci-cd/)
89
89
 
90
- Free to use. 1,866 tests. 90%+ coverage. Every write operation supports `--dry-run`.
90
+ Free to use. 1,941 tests. 90%+ coverage. Every write operation supports `--dry-run`.
91
91
 
92
92
  ## Licensing
93
93
 
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/commands/__complete.ts
4
+ import { readFile, readdir } from "fs/promises";
5
+ import { join } from "path";
6
+ import { Command } from "commander";
7
+ import { getCacheDir, getUserConfigPath, listProfiles } from "@gpc-cli/config";
8
+ var STATIC_TRACKS = ["production", "beta", "alpha", "internal"];
9
+ var DEBUG = process.env["GPC_DEBUG"] === "1";
10
+ function debug(msg) {
11
+ if (DEBUG) process.stderr.write(`[gpc __complete] ${msg}
12
+ `);
13
+ }
14
+ function emit(values) {
15
+ for (const v of values) {
16
+ if (v) console.log(v);
17
+ }
18
+ }
19
+ var DANGEROUS_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
20
+ function sanitize(obj) {
21
+ if (!obj || typeof obj !== "object") return;
22
+ if (Array.isArray(obj)) {
23
+ for (const item of obj) sanitize(item);
24
+ return;
25
+ }
26
+ const record = obj;
27
+ for (const key of Object.keys(record)) {
28
+ if (DANGEROUS_KEYS.has(key)) {
29
+ delete record[key];
30
+ } else if (typeof record[key] === "object" && record[key] !== null) {
31
+ sanitize(record[key]);
32
+ }
33
+ }
34
+ }
35
+ async function readJson(path) {
36
+ try {
37
+ const raw = await readFile(path, "utf-8");
38
+ const parsed = JSON.parse(raw);
39
+ sanitize(parsed);
40
+ return parsed;
41
+ } catch (err) {
42
+ debug(`readJson(${path}) failed: ${err instanceof Error ? err.message : String(err)}`);
43
+ return null;
44
+ }
45
+ }
46
+ async function readProjectConfig() {
47
+ return readJson(join(process.cwd(), ".gpcrc.json"));
48
+ }
49
+ async function readUserConfig() {
50
+ return readJson(getUserConfigPath());
51
+ }
52
+ async function cachedPackageNames() {
53
+ try {
54
+ const entries = await readdir(getCacheDir());
55
+ return entries.filter((f) => f.startsWith("status-") && f.endsWith(".json")).map((f) => f.slice("status-".length, -".json".length));
56
+ } catch {
57
+ return [];
58
+ }
59
+ }
60
+ async function readFreshStatusCache(packageName) {
61
+ const entry = await readJson(
62
+ join(getCacheDir(), `status-${packageName}.json`)
63
+ );
64
+ if (!entry?.fetchedAt) return null;
65
+ const ttl = entry.ttl ?? 3600;
66
+ const ageSec = (Date.now() - new Date(entry.fetchedAt).getTime()) / 1e3;
67
+ if (ageSec > ttl) return null;
68
+ return entry;
69
+ }
70
+ async function runContext(context, args = []) {
71
+ switch (context) {
72
+ case "profiles":
73
+ return completeProfiles();
74
+ case "packages":
75
+ return completePackages();
76
+ case "tracks-for-app":
77
+ return completeTracksForApp(args[0]);
78
+ case "releases-for-track":
79
+ return completeReleasesForTrack(args[0], args[1]);
80
+ default:
81
+ return [];
82
+ }
83
+ }
84
+ async function completeProfiles() {
85
+ return listProfiles();
86
+ }
87
+ async function completePackages() {
88
+ const seen = /* @__PURE__ */ new Set();
89
+ const [proj, user, cached] = await Promise.all([
90
+ readProjectConfig(),
91
+ readUserConfig(),
92
+ cachedPackageNames()
93
+ ]);
94
+ for (const cfg of [proj, user]) {
95
+ if (cfg?.app) seen.add(cfg.app);
96
+ if (cfg?.profiles) {
97
+ for (const p of Object.values(cfg.profiles)) {
98
+ if (p?.app) seen.add(p.app);
99
+ }
100
+ }
101
+ }
102
+ for (const pkg of cached) seen.add(pkg);
103
+ return [...seen].sort();
104
+ }
105
+ async function completeTracksForApp(packageName) {
106
+ const tracks = new Set(STATIC_TRACKS);
107
+ if (packageName) {
108
+ const entry = await readFreshStatusCache(packageName);
109
+ for (const r of entry?.data?.releases ?? []) {
110
+ if (r.track) tracks.add(r.track);
111
+ }
112
+ } else {
113
+ const packages = await cachedPackageNames();
114
+ const entries = await Promise.all(packages.map((p) => readFreshStatusCache(p)));
115
+ for (const entry of entries) {
116
+ for (const r of entry?.data?.releases ?? []) {
117
+ if (r.track) tracks.add(r.track);
118
+ }
119
+ }
120
+ }
121
+ return [...tracks];
122
+ }
123
+ async function completeReleasesForTrack(packageName, track) {
124
+ if (!packageName || !track) return [];
125
+ const entry = await readFreshStatusCache(packageName);
126
+ return (entry?.data?.releases ?? []).filter((r) => r.track === track && r.versionCode).map((r) => r.versionCode);
127
+ }
128
+ function registerCompleteCommand(program) {
129
+ const complete = new Command("__complete").description("Internal: shell completion value provider (hidden)").argument("<context>", "profiles | packages | tracks-for-app | releases-for-track").argument("[args...]", "Context-specific positional args").allowUnknownOption(true).action(async (context, args) => {
130
+ try {
131
+ const values = await runContext(context, args);
132
+ emit(values);
133
+ } catch {
134
+ }
135
+ });
136
+ program.addCommand(complete, { hidden: true });
137
+ }
138
+ export {
139
+ completePackages,
140
+ completeProfiles,
141
+ completeReleasesForTrack,
142
+ completeTracksForApp,
143
+ registerCompleteCommand,
144
+ runContext
145
+ };
146
+ //# sourceMappingURL=__complete-QFD3SUAO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/__complete.ts"],"sourcesContent":["import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { getCacheDir, getUserConfigPath, listProfiles } from \"@gpc-cli/config\";\n\n// Keep this file dependency-light on purpose.\n// It is called on every TAB press; loading @gpc-cli/api or @gpc-cli/auth would\n// blow the <100ms cold-start budget. Only pull from @gpc-cli/config + node:fs.\n\nconst STATIC_TRACKS = [\"production\", \"beta\", \"alpha\", \"internal\"] as const;\n\nconst DEBUG = process.env[\"GPC_DEBUG\"] === \"1\";\n\nfunction debug(msg: string): void {\n if (DEBUG) process.stderr.write(`[gpc __complete] ${msg}\\n`);\n}\n\n/** Emit one value per line; silent on any error. */\nfunction emit(values: readonly string[]): void {\n for (const v of values) {\n if (v) console.log(v);\n }\n}\n\n// Prototype-pollution defense: strip __proto__/constructor/prototype from\n// parsed JSON. Mirrors packages/config/src/loader.ts:92 so cache and config\n// files are treated consistently.\nconst DANGEROUS_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nfunction sanitize(obj: unknown): void {\n if (!obj || typeof obj !== \"object\") return;\n if (Array.isArray(obj)) {\n for (const item of obj) sanitize(item);\n return;\n }\n const record = obj as Record<string, unknown>;\n for (const key of Object.keys(record)) {\n if (DANGEROUS_KEYS.has(key)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete record[key];\n } else if (typeof record[key] === \"object\" && record[key] !== null) {\n sanitize(record[key]);\n }\n }\n}\n\nasync function readJson<T>(path: string): Promise<T | null> {\n try {\n const raw = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(raw) as T;\n sanitize(parsed);\n return parsed;\n } catch (err) {\n // Silent fallback is by design (empty/stale cache is indistinguishable\n // from corrupt from the user's POV), but under GPC_DEBUG=1 surface the\n // error so authors can diagnose bad config or cache files.\n debug(`readJson(${path}) failed: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n}\n\ninterface ProfileEntry {\n app?: string;\n}\ninterface RawConfig {\n app?: string;\n profiles?: Record<string, ProfileEntry>;\n}\n\nasync function readProjectConfig(): Promise<RawConfig | null> {\n return readJson<RawConfig>(join(process.cwd(), \".gpcrc.json\"));\n}\n\nasync function readUserConfig(): Promise<RawConfig | null> {\n return readJson<RawConfig>(getUserConfigPath());\n}\n\nasync function cachedPackageNames(): Promise<string[]> {\n try {\n const entries = await readdir(getCacheDir());\n return entries\n .filter((f) => f.startsWith(\"status-\") && f.endsWith(\".json\"))\n .map((f) => f.slice(\"status-\".length, -\".json\".length));\n } catch {\n return [];\n }\n}\n\ninterface StatusCacheEntry {\n fetchedAt?: string;\n ttl?: number;\n data?: {\n releases?: Array<{ track?: string; versionCode?: string }>;\n };\n}\n\nasync function readFreshStatusCache(packageName: string): Promise<StatusCacheEntry | null> {\n const entry = await readJson<StatusCacheEntry>(\n join(getCacheDir(), `status-${packageName}.json`),\n );\n if (!entry?.fetchedAt) return null;\n const ttl = entry.ttl ?? 3600;\n const ageSec = (Date.now() - new Date(entry.fetchedAt).getTime()) / 1000;\n if (ageSec > ttl) return null;\n return entry;\n}\n\nexport async function runContext(context: string, args: readonly string[] = []): Promise<string[]> {\n switch (context) {\n case \"profiles\":\n return completeProfiles();\n case \"packages\":\n return completePackages();\n case \"tracks-for-app\":\n return completeTracksForApp(args[0]);\n case \"releases-for-track\":\n return completeReleasesForTrack(args[0], args[1]);\n default:\n return [];\n }\n}\n\nexport async function completeProfiles(): Promise<string[]> {\n return listProfiles();\n}\n\nexport async function completePackages(): Promise<string[]> {\n const seen = new Set<string>();\n const [proj, user, cached] = await Promise.all([\n readProjectConfig(),\n readUserConfig(),\n cachedPackageNames(),\n ]);\n for (const cfg of [proj, user]) {\n if (cfg?.app) seen.add(cfg.app);\n if (cfg?.profiles) {\n for (const p of Object.values(cfg.profiles)) {\n if (p?.app) seen.add(p.app);\n }\n }\n }\n for (const pkg of cached) seen.add(pkg);\n return [...seen].sort();\n}\n\nexport async function completeTracksForApp(packageName: string | undefined): Promise<string[]> {\n const tracks = new Set<string>(STATIC_TRACKS);\n if (packageName) {\n const entry = await readFreshStatusCache(packageName);\n for (const r of entry?.data?.releases ?? []) {\n if (r.track) tracks.add(r.track);\n }\n } else {\n // No package arg: shell scripts don't currently parse the already-typed\n // --app value. As a best-effort, aggregate custom track names from every\n // fresh status cache so `gpc --track <TAB>` still surfaces non-standard\n // tracks the user has published to recently.\n const packages = await cachedPackageNames();\n const entries = await Promise.all(packages.map((p) => readFreshStatusCache(p)));\n for (const entry of entries) {\n for (const r of entry?.data?.releases ?? []) {\n if (r.track) tracks.add(r.track);\n }\n }\n }\n return [...tracks];\n}\n\nexport async function completeReleasesForTrack(\n packageName: string | undefined,\n track: string | undefined,\n): Promise<string[]> {\n if (!packageName || !track) return [];\n const entry = await readFreshStatusCache(packageName);\n return (entry?.data?.releases ?? [])\n .filter((r) => r.track === track && r.versionCode)\n .map((r) => r.versionCode as string);\n}\n\n/** Register the hidden `__complete` subcommand on the program. */\nexport function registerCompleteCommand(program: Command): void {\n const complete = new Command(\"__complete\")\n .description(\"Internal: shell completion value provider (hidden)\")\n .argument(\"<context>\", \"profiles | packages | tracks-for-app | releases-for-track\")\n .argument(\"[args...]\", \"Context-specific positional args\")\n .allowUnknownOption(true)\n .action(async (context: string, args: string[]) => {\n try {\n const values = await runContext(context, args);\n emit(values);\n } catch {\n // Never throw from a completion handler.\n }\n });\n\n program.addCommand(complete, { hidden: true });\n}\n"],"mappings":"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","names":[]}
package/dist/bin.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  createProgram,
4
4
  handleCliError,
5
5
  loadPlugins
6
- } from "./chunk-2AM4XW7Q.js";
6
+ } from "./chunk-CSNCSWUV.js";
7
7
  import {
8
8
  checkForUpdate,
9
9
  formatUpdateNotification
@@ -57,9 +57,10 @@ if (!_isJsonMode && !_isQuiet && !_isSetupCommand && !existsSync(getUserConfigPa
57
57
  }
58
58
  await setupNetworking();
59
59
  initAudit(getConfigDir());
60
- var currentVersion = "0.9.59";
60
+ var currentVersion = "0.9.60";
61
61
  var isUpdateCommand = process.argv[2] === "update";
62
- var updateCheckPromise = isUpdateCommand ? Promise.resolve(null) : checkForUpdate(currentVersion);
62
+ var isCompletionProvider = process.argv[2] === "__complete";
63
+ var updateCheckPromise = isUpdateCommand || isCompletionProvider ? Promise.resolve(null) : checkForUpdate(currentVersion);
63
64
  if (process.argv.includes("--ci")) {
64
65
  process.env["CI"] = "1";
65
66
  if (!process.argv.some((a) => a.startsWith("--output") || a.startsWith("-o"))) {
@@ -115,16 +116,18 @@ if (notifyOpt !== void 0 && notifyOpt !== false) {
115
116
  } catch {
116
117
  }
117
118
  }
118
- try {
119
- const result = await Promise.race([
120
- updateCheckPromise,
121
- new Promise((resolve) => setTimeout(() => resolve(null), 3e3))
122
- ]);
123
- if (result && result.updateAvailable && !isUpdateCommand && process.stdout.isTTY && !process.argv.includes("--json") && program.opts()["output"] !== "json") {
124
- process.stderr.write(`
119
+ if (!isCompletionProvider) {
120
+ try {
121
+ const result = await Promise.race([
122
+ updateCheckPromise,
123
+ new Promise((resolve) => setTimeout(() => resolve(null), 3e3))
124
+ ]);
125
+ if (result && result.updateAvailable && !isUpdateCommand && process.stdout.isTTY && !process.argv.includes("--json") && program.opts()["output"] !== "json") {
126
+ process.stderr.write(`
125
127
  ${formatUpdateNotification(result)}
126
128
  `);
129
+ }
130
+ } catch {
127
131
  }
128
- } catch {
129
132
  }
130
133
  //# sourceMappingURL=bin.js.map
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts","../src/networking.ts","../src/argv-profile.ts"],"sourcesContent":["if (process.env[\"GPC_NO_COLOR\"] === \"1\") process.env[\"NO_COLOR\"] = \"1\";\nif (process.argv.includes(\"--no-color\")) {\n process.env[\"NO_COLOR\"] = \"1\";\n}\nimport { existsSync } from \"node:fs\";\nimport { setupNetworking } from \"./networking.js\";\nimport { createProgram } from \"./program.js\";\nimport { loadPlugins } from \"./plugins.js\";\nimport { handleCliError } from \"./error-handler.js\";\nimport { initAudit, sendWebhook } from \"@gpc-cli/core\";\nimport type { WebhookPayload } from \"@gpc-cli/core\";\nimport { getConfigDir, loadConfig, getUserConfigPath } from \"@gpc-cli/config\";\nimport { checkForUpdate, formatUpdateNotification } from \"./update-check.js\";\n\n// First-run banner\nconst _isJsonMode =\n process.argv.includes(\"--json\") ||\n process.argv.includes(\"-j\") ||\n process.argv.includes(\"--ci\") ||\n (process.argv.includes(\"--output\") &&\n process.argv[process.argv.indexOf(\"--output\") + 1] === \"json\") ||\n (process.argv.includes(\"-o\") && process.argv[process.argv.indexOf(\"-o\") + 1] === \"json\");\nconst _isQuiet = process.argv.includes(\"--quiet\") || process.argv.includes(\"-q\");\n\nconst _setupCommands = new Set([\"config\", \"auth\", \"quickstart\", \"doctor\", \"init\", \"setup-gcp\"]);\nconst _isSetupCommand = _setupCommands.has(process.argv[2] ?? \"\");\n\nif (!_isJsonMode && !_isQuiet && !_isSetupCommand && !existsSync(getUserConfigPath())) {\n process.stderr.write(\"\\u2726 First time? Run gpc config init to get set up.\\n\\n\");\n}\n\nawait setupNetworking();\ninitAudit(getConfigDir());\n\nconst currentVersion = process.env[\"__GPC_VERSION\"] || \"0.0.0\";\n\n// Skip passive update check when the user is explicitly running `gpc update` —\n// that command does its own check against the GitHub Releases API.\nconst isUpdateCommand = process.argv[2] === \"update\";\n\n// Start update check before command execution (non-blocking)\nconst updateCheckPromise = isUpdateCommand ? Promise.resolve(null) : checkForUpdate(currentVersion);\n\n// Handle --ci and --json flags early (before command parsing)\nif (process.argv.includes(\"--ci\")) {\n process.env[\"CI\"] = \"1\";\n // --ci implies --output json --no-interactive --no-color\n if (!process.argv.some((a) => a.startsWith(\"--output\") || a.startsWith(\"-o\"))) {\n process.argv.push(\"--output\", \"json\");\n }\n if (!process.argv.includes(\"--no-interactive\")) {\n process.argv.push(\"--no-interactive\");\n }\n if (!process.argv.includes(\"--no-color\")) {\n process.argv.push(\"--no-color\");\n }\n}\nif (process.argv.includes(\"--json\") || process.argv.includes(\"-j\")) {\n if (!process.argv.some((a) => a.startsWith(\"--output\") || a.startsWith(\"-o\"))) {\n process.argv.push(\"--output\", \"json\");\n }\n}\n\n// Propagate --profile / -p to GPC_PROFILE env var so loadConfig() picks it up.\n// Must run before any loadConfig() call (commands read env, not program.opts).\nimport { extractProfileFromArgv } from \"./argv-profile.js\";\n{\n const profile = extractProfileFromArgv(process.argv);\n if (profile) process.env[\"GPC_PROFILE\"] = profile;\n}\n\nconst pluginManager = await loadPlugins();\nconst program = await createProgram(pluginManager);\n\n// GPC_DEBUG=1 enables verbose mode without mutating process.argv\nif (process.env[\"GPC_DEBUG\"] === \"1\") {\n program.setOptionValueWithSource(\"verbose\", true, \"env\");\n}\n\nconst startTime = Date.now();\nlet commandSuccess = true;\nlet commandError: string | undefined;\n\nawait program.parseAsync(process.argv).catch((error: unknown) => {\n commandSuccess = false;\n commandError = error instanceof Error ? error.message : String(error);\n const exitCode = handleCliError(error);\n process.exit(exitCode);\n});\n\n// Send webhook notification if --notify was set\nconst notifyOpt = program.opts()[\"notify\"] as string | boolean | undefined;\nif (notifyOpt !== undefined && notifyOpt !== false) {\n try {\n const config = await loadConfig();\n if (config.webhooks) {\n const commandName = process.argv\n .slice(2)\n .filter((a) => !a.startsWith(\"--notify\"))\n .join(\" \");\n const payload: WebhookPayload = {\n command: commandName || \"unknown\",\n success: commandSuccess,\n duration: Date.now() - startTime,\n app: program.opts()[\"app\"] as string | undefined,\n error: commandError,\n };\n\n const target = typeof notifyOpt === \"string\" ? notifyOpt : undefined;\n // Fire-and-forget — do not block exit\n sendWebhook(config.webhooks, payload, target).catch(() => {});\n }\n } catch {\n // Never let webhook logic break the CLI\n }\n}\n\n// After command completes, show update notification if available\n// isUpdateCommand is declared above — update check was skipped for this command\ntry {\n const result = await Promise.race([\n updateCheckPromise,\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 3000)),\n ]);\n\n if (\n result &&\n result.updateAvailable &&\n !isUpdateCommand &&\n process.stdout.isTTY &&\n !process.argv.includes(\"--json\") &&\n program.opts()[\"output\"] !== \"json\"\n ) {\n process.stderr.write(`\\n${formatUpdateNotification(result)}\\n`);\n }\n} catch {\n // Silently ignore update check failures\n}\n","/**\n * Set up proxy and custom CA certificate support.\n * Must be called before any fetch() calls.\n */\nexport async function setupNetworking(): Promise<void> {\n // Map GPC_CA_CERT to NODE_EXTRA_CA_CERTS (works in both Node and Bun)\n const caCert = process.env[\"GPC_CA_CERT\"];\n if (caCert && !process.env[\"NODE_EXTRA_CA_CERTS\"]) {\n process.env[\"NODE_EXTRA_CA_CERTS\"] = caCert;\n }\n\n // In standalone binary mode, Bun handles HTTPS_PROXY/HTTP_PROXY natively\n if (process.env[\"__GPC_BINARY\"] === \"1\") return;\n\n const proxyUrl =\n process.env[\"HTTPS_PROXY\"] ||\n process.env[\"https_proxy\"] ||\n process.env[\"HTTP_PROXY\"] ||\n process.env[\"http_proxy\"];\n if (proxyUrl) {\n try {\n // @ts-expect-error undici types not available in all environments\n const { ProxyAgent, setGlobalDispatcher } = await import(\"undici\");\n setGlobalDispatcher(new ProxyAgent(proxyUrl));\n } catch {\n console.error(\"Warning: Proxy support requires Node.js 20+. HTTPS_PROXY will be ignored.\");\n }\n }\n}\n","/**\n * Extract the value of --profile or -p from argv, if present.\n * Returns undefined if the flag is missing or its value looks like another flag.\n */\nexport function extractProfileFromArgv(argv: readonly string[]): string | undefined {\n const idx = Math.max(argv.indexOf(\"--profile\"), argv.indexOf(\"-p\"));\n if (idx === -1 || idx + 1 >= argv.length) return undefined;\n const val = argv[idx + 1];\n if (!val || val.startsWith(\"-\")) return undefined;\n return val;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/bin.ts","../src/networking.ts","../src/argv-profile.ts"],"sourcesContent":["if (process.env[\"GPC_NO_COLOR\"] === \"1\") process.env[\"NO_COLOR\"] = \"1\";\nif (process.argv.includes(\"--no-color\")) {\n process.env[\"NO_COLOR\"] = \"1\";\n}\nimport { existsSync } from \"node:fs\";\nimport { setupNetworking } from \"./networking.js\";\nimport { createProgram } from \"./program.js\";\nimport { loadPlugins } from \"./plugins.js\";\nimport { handleCliError } from \"./error-handler.js\";\nimport { initAudit, sendWebhook } from \"@gpc-cli/core\";\nimport type { WebhookPayload } from \"@gpc-cli/core\";\nimport { getConfigDir, loadConfig, getUserConfigPath } from \"@gpc-cli/config\";\nimport { checkForUpdate, formatUpdateNotification } from \"./update-check.js\";\n\n// First-run banner\nconst _isJsonMode =\n process.argv.includes(\"--json\") ||\n process.argv.includes(\"-j\") ||\n process.argv.includes(\"--ci\") ||\n (process.argv.includes(\"--output\") &&\n process.argv[process.argv.indexOf(\"--output\") + 1] === \"json\") ||\n (process.argv.includes(\"-o\") && process.argv[process.argv.indexOf(\"-o\") + 1] === \"json\");\nconst _isQuiet = process.argv.includes(\"--quiet\") || process.argv.includes(\"-q\");\n\nconst _setupCommands = new Set([\"config\", \"auth\", \"quickstart\", \"doctor\", \"init\", \"setup-gcp\"]);\nconst _isSetupCommand = _setupCommands.has(process.argv[2] ?? \"\");\n\nif (!_isJsonMode && !_isQuiet && !_isSetupCommand && !existsSync(getUserConfigPath())) {\n process.stderr.write(\"\\u2726 First time? Run gpc config init to get set up.\\n\\n\");\n}\n\nawait setupNetworking();\ninitAudit(getConfigDir());\n\nconst currentVersion = process.env[\"__GPC_VERSION\"] || \"0.0.0\";\n\n// Skip passive update check when the user is explicitly running `gpc update` —\n// that command does its own check against the GitHub Releases API. Also skip\n// for `__complete` (shell-completion hot path — must stay under the latency\n// budget; users see TAB lag otherwise).\nconst isUpdateCommand = process.argv[2] === \"update\";\nconst isCompletionProvider = process.argv[2] === \"__complete\";\n\n// Start update check before command execution (non-blocking)\nconst updateCheckPromise =\n isUpdateCommand || isCompletionProvider ? Promise.resolve(null) : checkForUpdate(currentVersion);\n\n// Handle --ci and --json flags early (before command parsing)\nif (process.argv.includes(\"--ci\")) {\n process.env[\"CI\"] = \"1\";\n // --ci implies --output json --no-interactive --no-color\n if (!process.argv.some((a) => a.startsWith(\"--output\") || a.startsWith(\"-o\"))) {\n process.argv.push(\"--output\", \"json\");\n }\n if (!process.argv.includes(\"--no-interactive\")) {\n process.argv.push(\"--no-interactive\");\n }\n if (!process.argv.includes(\"--no-color\")) {\n process.argv.push(\"--no-color\");\n }\n}\nif (process.argv.includes(\"--json\") || process.argv.includes(\"-j\")) {\n if (!process.argv.some((a) => a.startsWith(\"--output\") || a.startsWith(\"-o\"))) {\n process.argv.push(\"--output\", \"json\");\n }\n}\n\n// Propagate --profile / -p to GPC_PROFILE env var so loadConfig() picks it up.\n// Must run before any loadConfig() call (commands read env, not program.opts).\nimport { extractProfileFromArgv } from \"./argv-profile.js\";\n{\n const profile = extractProfileFromArgv(process.argv);\n if (profile) process.env[\"GPC_PROFILE\"] = profile;\n}\n\nconst pluginManager = await loadPlugins();\nconst program = await createProgram(pluginManager);\n\n// GPC_DEBUG=1 enables verbose mode without mutating process.argv\nif (process.env[\"GPC_DEBUG\"] === \"1\") {\n program.setOptionValueWithSource(\"verbose\", true, \"env\");\n}\n\nconst startTime = Date.now();\nlet commandSuccess = true;\nlet commandError: string | undefined;\n\nawait program.parseAsync(process.argv).catch((error: unknown) => {\n commandSuccess = false;\n commandError = error instanceof Error ? error.message : String(error);\n const exitCode = handleCliError(error);\n process.exit(exitCode);\n});\n\n// Send webhook notification if --notify was set\nconst notifyOpt = program.opts()[\"notify\"] as string | boolean | undefined;\nif (notifyOpt !== undefined && notifyOpt !== false) {\n try {\n const config = await loadConfig();\n if (config.webhooks) {\n const commandName = process.argv\n .slice(2)\n .filter((a) => !a.startsWith(\"--notify\"))\n .join(\" \");\n const payload: WebhookPayload = {\n command: commandName || \"unknown\",\n success: commandSuccess,\n duration: Date.now() - startTime,\n app: program.opts()[\"app\"] as string | undefined,\n error: commandError,\n };\n\n const target = typeof notifyOpt === \"string\" ? notifyOpt : undefined;\n // Fire-and-forget — do not block exit\n sendWebhook(config.webhooks, payload, target).catch(() => {});\n }\n } catch {\n // Never let webhook logic break the CLI\n }\n}\n\n// After command completes, show update notification if available\n// isUpdateCommand is declared above — update check was skipped for this command.\n// Skip entirely for __complete: the setTimeout below would keep the event loop\n// alive for 3s, blowing the completion latency budget.\nif (!isCompletionProvider) {\n try {\n const result = await Promise.race([\n updateCheckPromise,\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 3000)),\n ]);\n\n if (\n result &&\n result.updateAvailable &&\n !isUpdateCommand &&\n process.stdout.isTTY &&\n !process.argv.includes(\"--json\") &&\n program.opts()[\"output\"] !== \"json\"\n ) {\n process.stderr.write(`\\n${formatUpdateNotification(result)}\\n`);\n }\n } catch {\n // Silently ignore update check failures\n }\n}\n","/**\n * Set up proxy and custom CA certificate support.\n * Must be called before any fetch() calls.\n */\nexport async function setupNetworking(): Promise<void> {\n // Map GPC_CA_CERT to NODE_EXTRA_CA_CERTS (works in both Node and Bun)\n const caCert = process.env[\"GPC_CA_CERT\"];\n if (caCert && !process.env[\"NODE_EXTRA_CA_CERTS\"]) {\n process.env[\"NODE_EXTRA_CA_CERTS\"] = caCert;\n }\n\n // In standalone binary mode, Bun handles HTTPS_PROXY/HTTP_PROXY natively\n if (process.env[\"__GPC_BINARY\"] === \"1\") return;\n\n const proxyUrl =\n process.env[\"HTTPS_PROXY\"] ||\n process.env[\"https_proxy\"] ||\n process.env[\"HTTP_PROXY\"] ||\n process.env[\"http_proxy\"];\n if (proxyUrl) {\n try {\n // @ts-expect-error undici types not available in all environments\n const { ProxyAgent, setGlobalDispatcher } = await import(\"undici\");\n setGlobalDispatcher(new ProxyAgent(proxyUrl));\n } catch {\n console.error(\"Warning: Proxy support requires Node.js 20+. HTTPS_PROXY will be ignored.\");\n }\n }\n}\n","/**\n * Extract the value of --profile or -p from argv, if present.\n * Returns undefined if the flag is missing or its value looks like another flag.\n */\nexport function extractProfileFromArgv(argv: readonly string[]): string | undefined {\n const idx = Math.max(argv.indexOf(\"--profile\"), argv.indexOf(\"-p\"));\n if (idx === -1 || idx + 1 >= argv.length) return undefined;\n const val = argv[idx + 1];\n if (!val || val.startsWith(\"-\")) return undefined;\n return val;\n}\n"],"mappings":"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","names":[]}
@@ -67,19 +67,19 @@ function registerPluginCommands(program, manager) {
67
67
  import { Command } from "commander";
68
68
  async function createProgram(pluginManager) {
69
69
  const program = new Command();
70
- program.name("gpc").description("GPC \u2014 Google Play Console CLI").version("0.9.59", "-V, --version").option("-o, --output <format>", "Output format: table, json, yaml, markdown, junit").option("-v, --verbose", "Enable debug logging").option("-q, --quiet", "Suppress non-essential output").option("-a, --app <package>", "App package name").option("-p, --profile <name>", "Auth profile name").option("--no-color", "Disable colored output").option("--no-interactive", "Disable interactive prompts").option("-y, --yes", "Skip confirmation prompts").option("--dry-run", "Preview changes without executing").option("--notify [target]", "Send webhook notification on completion (slack, discord, custom)").option("--ci", "Force CI mode (JSON output, no prompts, strict exit codes)").option("-j, --json", "Shorthand for --output json").option("--apps <csv>", "Comma-separated package names for multi-app operations").showSuggestionAfterError(false);
70
+ program.name("gpc").description("GPC \u2014 Google Play Console CLI").version("0.9.60", "-V, --version").option("-o, --output <format>", "Output format: table, json, yaml, markdown, junit").option("-v, --verbose", "Enable debug logging").option("-q, --quiet", "Suppress non-essential output").option("-a, --app <package>", "App package name").option("-p, --profile <name>", "Auth profile name").option("--no-color", "Disable colored output").option("--no-interactive", "Disable interactive prompts").option("-y, --yes", "Skip confirmation prompts").option("--dry-run", "Preview changes without executing").option("--notify [target]", "Send webhook notification on completion (slack, discord, custom)").option("--ci", "Force CI mode (JSON output, no prompts, strict exit codes)").option("-j, --json", "Shorthand for --output json").option("--apps <csv>", "Comma-separated package names for multi-app operations").showSuggestionAfterError(false);
71
71
  const commandLoaders = {
72
72
  auth: async () => {
73
73
  (await import("./auth-4DRT7ZH2.js")).registerAuthCommands(program);
74
74
  },
75
75
  config: async () => {
76
- (await import("./config-ZLXFAFMN.js")).registerConfigCommands(program);
76
+ (await import("./config-ZNAM2IHA.js")).registerConfigCommands(program);
77
77
  },
78
78
  doctor: async () => {
79
- (await import("./doctor-PACXOJZ2.js")).registerDoctorCommand(program);
79
+ (await import("./doctor-G2L2KVOO.js")).registerDoctorCommand(program);
80
80
  },
81
81
  update: async () => {
82
- (await import("./update-PDYA3B45.js")).registerUpdateCommand(program);
82
+ (await import("./update-WA6X6LNQ.js")).registerUpdateCommand(program);
83
83
  },
84
84
  docs: async () => {
85
85
  (await import("./docs-GP6AEX4N.js")).registerDocsCommand(program);
@@ -88,12 +88,15 @@ async function createProgram(pluginManager) {
88
88
  (await import("./changelog-QLDFG5TV.js")).registerChangelogCommand(program);
89
89
  },
90
90
  completion: async () => {
91
- (await import("./completion-KRZLHV7V.js")).registerCompletionCommand(program, async () => {
91
+ (await import("./completion-4I3IJK3M.js")).registerCompletionCommand(program, async () => {
92
92
  await Promise.all(
93
93
  Object.entries(commandLoaders).filter(([name]) => name !== "completion").map(([, loader2]) => loader2())
94
94
  );
95
95
  });
96
96
  },
97
+ __complete: async () => {
98
+ (await import("./__complete-QFD3SUAO.js")).registerCompleteCommand(program);
99
+ },
97
100
  apps: async () => {
98
101
  (await import("./apps-WPUQOQLL.js")).registerAppsCommands(program);
99
102
  },
@@ -107,7 +110,7 @@ async function createProgram(pluginManager) {
107
110
  (await import("./status-32AJ7A6O.js")).registerStatusCommand(program);
108
111
  },
109
112
  listings: async () => {
110
- (await import("./listings-MOHHHNE6.js")).registerListingsCommands(program);
113
+ (await import("./listings-2Z6DSO3D.js")).registerListingsCommands(program);
111
114
  },
112
115
  reviews: async () => {
113
116
  (await import("./reviews-P4M6BEJI.js")).registerReviewsCommands(program);
@@ -134,13 +137,13 @@ async function createProgram(pluginManager) {
134
137
  (await import("./users-FOMAT7DY.js")).registerUsersCommands(program);
135
138
  },
136
139
  testers: async () => {
137
- (await import("./testers-QUWZHO6M.js")).registerTestersCommands(program);
140
+ (await import("./testers-FGLBJAXL.js")).registerTestersCommands(program);
138
141
  },
139
142
  validate: async () => {
140
143
  (await import("./validate-RHWEZYD2.js")).registerValidateCommand(program);
141
144
  },
142
145
  publish: async () => {
143
- (await import("./publish-26SSZ2W3.js")).registerPublishCommand(program);
146
+ (await import("./publish-5HZAJEDZ.js")).registerPublishCommand(program);
144
147
  },
145
148
  recovery: async () => {
146
149
  (await import("./recovery-B7DZQ6XG.js")).registerRecoveryCommands(program);
@@ -190,13 +193,13 @@ async function createProgram(pluginManager) {
190
193
  (await import("./verify-H4ZUVHMZ.js")).registerVerifyCommand(program);
191
194
  },
192
195
  version: async () => {
193
- (await import("./version-FGBT5A7I.js")).registerVersionCommand(program);
196
+ (await import("./version-DYTSDZH2.js")).registerVersionCommand(program);
194
197
  },
195
198
  cache: async () => {
196
199
  (await import("./cache-FGNP7Y37.js")).registerCacheCommand(program);
197
200
  },
198
201
  feedback: async () => {
199
- (await import("./feedback-RO76QRIZ.js")).registerFeedbackCommand(program);
202
+ (await import("./feedback-WXSCASJK.js")).registerFeedbackCommand(program);
200
203
  },
201
204
  quickstart: async () => {
202
205
  (await import("./quickstart-FOWM3OKT.js")).registerQuickstartCommand(program);
@@ -464,4 +467,4 @@ export {
464
467
  createProgram,
465
468
  handleCliError
466
469
  };
467
- //# sourceMappingURL=chunk-2AM4XW7Q.js.map
470
+ //# sourceMappingURL=chunk-CSNCSWUV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins.ts","../src/program.ts","../src/error-handler.ts"],"sourcesContent":["import { PluginManager, discoverPlugins } from \"@gpc-cli/core\";\nimport type { Command } from \"commander\";\n\n/**\n * Load and initialize all plugins.\n * First-party plugins (@gpc-cli/*) are auto-trusted.\n * Third-party plugins require prior approval stored in config.\n * Plugin loading is disabled in standalone binary mode.\n */\nexport async function loadPlugins(): Promise<PluginManager> {\n const manager = new PluginManager();\n\n // Standalone binary cannot resolve external npm packages at runtime\n if (process.env[\"__GPC_BINARY\"] === \"1\") {\n return manager;\n }\n\n try {\n const { loadConfig } = await import(\"@gpc-cli/config\");\n const config = await loadConfig();\n const plugins = await discoverPlugins({ configPlugins: config.plugins });\n const approved = new Set(config.approvedPlugins ?? []);\n\n for (const plugin of plugins) {\n const isTrusted = plugin.name.startsWith(\"@gpc-cli/\");\n\n if (!isTrusted && !approved.has(plugin.name)) {\n // Skip unapproved third-party plugins silently in non-interactive mode\n // In interactive mode, the user would run `gpc plugins approve <name>` first\n const isQuiet = process.argv.includes(\"--quiet\") || process.argv.includes(\"-q\");\n if (!isQuiet) {\n console.error(\n `Plugin \"${plugin.name}\" is not approved. Run: gpc plugins approve ${plugin.name}`,\n );\n }\n continue;\n }\n\n try {\n await manager.load(plugin);\n } catch {\n // Skip plugins that fail to load — don't block the CLI\n }\n }\n } catch {\n // Config loading failure shouldn't block plugin-free commands\n }\n\n return manager;\n}\n\n/**\n * Register plugin-defined commands with the Commander program.\n */\nexport function registerPluginCommands(program: Command, manager: PluginManager): void {\n for (const def of manager.getRegisteredCommands()) {\n const cmd = program.command(def.name).description(def.description);\n\n if (def.arguments) {\n for (const arg of def.arguments) {\n const syntax = arg.required ? `<${arg.name}>` : `[${arg.name}]`;\n cmd.argument(syntax, arg.description);\n }\n }\n\n if (def.options) {\n for (const opt of def.options) {\n cmd.option(\n opt.flags,\n opt.description,\n opt.defaultValue as string | boolean | string[] | undefined,\n );\n }\n }\n\n cmd.action(async (...rawArgs: unknown[]) => {\n const opts = rawArgs[rawArgs.length - 2] as Record<string, unknown>;\n const args: Record<string, unknown> = {};\n\n if (def.arguments) {\n def.arguments.forEach((argDef, i) => {\n args[argDef.name] = rawArgs[i];\n });\n }\n\n await def.action(args, opts);\n });\n }\n}\n","import { Command } from \"commander\";\nimport type { PluginManager } from \"@gpc-cli/core\";\nimport type { CommandEvent, CommandResult } from \"@gpc-cli/plugin-sdk\";\nimport { registerPluginCommands } from \"./plugins.js\";\n\nexport async function createProgram(pluginManager?: PluginManager): Promise<Command> {\n const program = new Command();\n\n program\n .name(\"gpc\")\n .description(\"GPC — Google Play Console CLI\")\n .version(process.env[\"__GPC_VERSION\"] || \"0.0.0\", \"-V, --version\")\n .option(\"-o, --output <format>\", \"Output format: table, json, yaml, markdown, junit\")\n .option(\"-v, --verbose\", \"Enable debug logging\")\n .option(\"-q, --quiet\", \"Suppress non-essential output\")\n .option(\"-a, --app <package>\", \"App package name\")\n .option(\"-p, --profile <name>\", \"Auth profile name\")\n .option(\"--no-color\", \"Disable colored output\")\n .option(\"--no-interactive\", \"Disable interactive prompts\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--dry-run\", \"Preview changes without executing\")\n .option(\"--notify [target]\", \"Send webhook notification on completion (slack, discord, custom)\")\n .option(\"--ci\", \"Force CI mode (JSON output, no prompts, strict exit codes)\")\n .option(\"-j, --json\", \"Shorthand for --output json\")\n .option(\"--apps <csv>\", \"Comma-separated package names for multi-app operations\")\n .showSuggestionAfterError(false);\n\n const commandLoaders: Record<string, () => Promise<void>> = {\n auth: async () => {\n (await import(\"./commands/auth.js\")).registerAuthCommands(program);\n },\n config: async () => {\n (await import(\"./commands/config.js\")).registerConfigCommands(program);\n },\n doctor: async () => {\n (await import(\"./commands/doctor.js\")).registerDoctorCommand(program);\n },\n update: async () => {\n (await import(\"./commands/update.js\")).registerUpdateCommand(program);\n },\n docs: async () => {\n (await import(\"./commands/docs.js\")).registerDocsCommand(program);\n },\n changelog: async () => {\n (await import(\"./commands/changelog.js\")).registerChangelogCommand(program);\n },\n completion: async () => {\n (await import(\"./commands/completion.js\")).registerCompletionCommand(program, async () => {\n // Force-load every non-completion command so the introspection walker\n // sees the full tree (including plugins registered later in createProgram).\n await Promise.all(\n Object.entries(commandLoaders)\n .filter(([name]) => name !== \"completion\")\n .map(([, loader]) => loader()),\n );\n });\n },\n __complete: async () => {\n (await import(\"./commands/__complete.js\")).registerCompleteCommand(program);\n },\n apps: async () => {\n (await import(\"./commands/apps.js\")).registerAppsCommands(program);\n },\n releases: async () => {\n (await import(\"./commands/releases.js\")).registerReleasesCommands(program);\n },\n tracks: async () => {\n (await import(\"./commands/tracks.js\")).registerTracksCommands(program);\n },\n status: async () => {\n (await import(\"./commands/status.js\")).registerStatusCommand(program);\n },\n listings: async () => {\n (await import(\"./commands/listings.js\")).registerListingsCommands(program);\n },\n reviews: async () => {\n (await import(\"./commands/reviews.js\")).registerReviewsCommands(program);\n },\n vitals: async () => {\n (await import(\"./commands/vitals.js\")).registerVitalsCommands(program);\n },\n subscriptions: async () => {\n (await import(\"./commands/subscriptions.js\")).registerSubscriptionsCommands(program);\n },\n iap: async () => {\n (await import(\"./commands/iap.js\")).registerIapCommands(program);\n },\n purchases: async () => {\n (await import(\"./commands/purchases.js\")).registerPurchasesCommands(program);\n },\n pricing: async () => {\n (await import(\"./commands/pricing.js\")).registerPricingCommands(program);\n },\n reports: async () => {\n (await import(\"./commands/reports.js\")).registerReportsCommands(program);\n },\n users: async () => {\n (await import(\"./commands/users.js\")).registerUsersCommands(program);\n },\n testers: async () => {\n (await import(\"./commands/testers.js\")).registerTestersCommands(program);\n },\n validate: async () => {\n (await import(\"./commands/validate.js\")).registerValidateCommand(program);\n },\n publish: async () => {\n (await import(\"./commands/publish.js\")).registerPublishCommand(program);\n },\n recovery: async () => {\n (await import(\"./commands/recovery.js\")).registerRecoveryCommands(program);\n },\n \"data-safety\": async () => {\n (await import(\"./commands/data-safety.js\")).registerDataSafetyCommands(program);\n },\n \"external-transactions\": async () => {\n (await import(\"./commands/external-transactions.js\")).registerExternalTransactionsCommands(\n program,\n );\n },\n \"device-tiers\": async () => {\n (await import(\"./commands/device-tiers.js\")).registerDeviceTiersCommands(program);\n },\n \"one-time-products\": async () => {\n (await import(\"./commands/one-time-products.js\")).registerOneTimeProductsCommands(program);\n },\n \"internal-sharing\": async () => {\n (await import(\"./commands/internal-sharing.js\")).registerInternalSharingCommands(program);\n },\n \"generated-apks\": async () => {\n (await import(\"./commands/generated-apks.js\")).registerGeneratedApksCommands(program);\n },\n \"system-apks\": async () => {\n (await import(\"./commands/system-apks.js\")).registerSystemApksCommands(program);\n },\n \"purchase-options\": async () => {\n (await import(\"./commands/purchase-options.js\")).registerPurchaseOptionsCommands(program);\n },\n bundle: async () => {\n (await import(\"./commands/bundle.js\")).registerBundleCommands(program);\n },\n audit: async () => {\n (await import(\"./commands/audit.js\")).registerAuditCommands(program);\n },\n migrate: async () => {\n (await import(\"./commands/migrate.js\")).registerMigrateCommands(program);\n },\n anomalies: async () => {\n (await import(\"./commands/anomalies.js\")).registerAnomaliesCommands(program);\n },\n \"install-skills\": async () => {\n (await import(\"./commands/install-skills.js\")).registerInstallSkillsCommand(program);\n },\n verify: async () => {\n (await import(\"./commands/verify.js\")).registerVerifyCommand(program);\n },\n version: async () => {\n (await import(\"./commands/version.js\")).registerVersionCommand(program);\n },\n cache: async () => {\n (await import(\"./commands/cache.js\")).registerCacheCommand(program);\n },\n feedback: async () => {\n (await import(\"./commands/feedback.js\")).registerFeedbackCommand(program);\n },\n quickstart: async () => {\n (await import(\"./commands/quickstart.js\")).registerQuickstartCommand(program);\n },\n grants: async () => {\n (await import(\"./commands/grants.js\")).registerGrantsCommands(program);\n },\n train: async () => {\n (await import(\"./commands/train.js\")).registerTrainCommands(program);\n },\n quota: async () => {\n (await import(\"./commands/quota.js\")).registerQuotaCommand(program);\n },\n games: async () => {\n (await import(\"./commands/games.js\")).registerGamesCommands(program);\n },\n enterprise: async () => {\n (await import(\"./commands/enterprise.js\")).registerEnterpriseCommands(program);\n },\n diff: async () => {\n (await import(\"./commands/diff.js\")).registerDiffCommand(program);\n },\n init: async () => {\n (await import(\"./commands/init.js\")).registerInitCommand(program);\n },\n preflight: async () => {\n (await import(\"./commands/preflight.js\")).registerPreflightCommand(program);\n },\n plugins: async () => {\n registerPluginsCommand(program, pluginManager);\n },\n rtdn: async () => {\n (await import(\"./commands/rtdn.js\")).registerRtdnCommands(program);\n },\n };\n\n // \"Did you mean?\" suggestions for unknown commands\n function levenshtein(a: string, b: string): number {\n const m = a.length,\n n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, (_, i) =>\n Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)),\n );\n const cell = (r: number, c: number): number => dp[r]?.[c] ?? 0;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n (dp[i] as number[])[j] =\n a[i - 1] === b[j - 1]\n ? cell(i - 1, j - 1)\n : 1 + Math.min(cell(i - 1, j), cell(i, j - 1), cell(i - 1, j - 1));\n }\n }\n return cell(m, n);\n }\n\n program.on(\"command:*\", (operands: string[]) => {\n const cmd = operands[0] ?? \"\";\n const names = Object.keys(commandLoaders);\n const best = names\n .map((name) => ({ name, d: levenshtein(cmd, name) }))\n .sort((a, b) => a.d - b.d)[0];\n console.error(`Error: Unknown command \"${cmd}\".`);\n if (best && best.d <= 3) console.error(`Did you mean: gpc ${best.name}?`);\n console.error(`Run \"gpc --help\" to see all commands.`);\n process.exit(2);\n });\n\n // Resolve command aliases for lazy loading\n const commandAliases: Record<string, string> = {\n \"ext-txn\": \"external-transactions\",\n otp: \"one-time-products\",\n };\n\n const rawTarget = process.argv[2];\n const target = rawTarget ? (commandAliases[rawTarget] ?? rawTarget) : undefined;\n\n const loader = target ? commandLoaders[target] : undefined;\n if (loader) {\n await loader();\n } else {\n await Promise.all(Object.values(commandLoaders).map((loader) => loader()));\n }\n\n // Register plugin-defined commands\n if (pluginManager) {\n registerPluginCommands(program, pluginManager);\n }\n\n // Wire plugin lifecycle hooks around command execution\n if (pluginManager) {\n wrapCommandHooks(program, pluginManager);\n }\n\n return program;\n}\n\n/**\n * `gpc plugins` — manage plugins.\n */\nfunction registerPluginsCommand(program: Command, manager?: PluginManager): void {\n const cmd = program.command(\"plugins\").description(\"Manage plugins\");\n\n cmd\n .command(\"list\")\n .description(\"List loaded plugins\")\n .action(() => {\n const plugins = manager?.getLoadedPlugins() ?? [];\n const opts = program.opts();\n\n if (opts[\"output\"] === \"json\") {\n console.log(JSON.stringify(plugins, null, 2));\n return;\n }\n\n if (plugins.length === 0) {\n console.log(\"No plugins loaded.\");\n console.log('\\nConfigure plugins in .gpcrc.json: { \"plugins\": [\"@gpc-cli/plugin-ci\"] }');\n return;\n }\n\n console.log(\"Loaded plugins:\\n\");\n for (const p of plugins) {\n const trust = p.trusted ? \"trusted\" : \"third-party\";\n console.log(` ${p.name}@${p.version} (${trust})`);\n }\n\n const commands = manager?.getRegisteredCommands() ?? [];\n if (commands.length > 0) {\n console.log(\"\\nPlugin commands:\\n\");\n for (const c of commands) {\n console.log(` gpc ${c.name} — ${c.description}`);\n }\n }\n });\n\n cmd\n .command(\"init <name>\")\n .description(\"Scaffold a new plugin project\")\n .option(\"-d, --dir <path>\", \"Output directory (defaults to ./gpc-plugin-<name>)\")\n .option(\"--description <text>\", \"Plugin description\")\n .action(async (name: string, opts: { dir?: string; description?: string }) => {\n const { scaffoldPlugin } = await import(\"@gpc-cli/core\");\n const pluginName = name.startsWith(\"gpc-plugin-\") ? name : `gpc-plugin-${name}`;\n const dir = opts.dir ?? `./${pluginName}`;\n\n const result = await scaffoldPlugin({ name, dir, description: opts.description });\n\n console.log(`Plugin scaffolded at ${result.dir}/\\n`);\n console.log(\"Files created:\");\n for (const f of result.files) {\n console.log(` ${f}`);\n }\n console.log(`\\nNext steps:`);\n console.log(` cd ${pluginName}`);\n console.log(` npm install`);\n console.log(` npm run build`);\n console.log(` npm test`);\n });\n\n cmd\n .command(\"approve <name>\")\n .description(\"Approve a third-party plugin for loading\")\n .action(async (name: string) => {\n const { approvePlugin } = await import(\"@gpc-cli/config\");\n await approvePlugin(name);\n console.log(`Plugin \"${name}\" approved. It will be loaded on next run.`);\n });\n\n cmd\n .command(\"revoke <name>\")\n .description(\"Revoke approval for a third-party plugin\")\n .action(async (name: string) => {\n const { revokePluginApproval } = await import(\"@gpc-cli/config\");\n const removed = await revokePluginApproval(name);\n if (removed) {\n console.log(`Plugin \"${name}\" approval revoked.`);\n } else {\n console.log(`Plugin \"${name}\" was not in the approved list.`);\n }\n });\n\n const REGISTRY_URL =\n \"https://raw.githubusercontent.com/yasserstudio/gpc-plugins/main/registry.json\";\n\n interface RegistryPlugin {\n name: string;\n description: string;\n version: string;\n author?: string;\n tags?: string[];\n }\n\n cmd\n .command(\"search [query]\")\n .description(\"Search the GPC plugin registry\")\n .action(async (query?: string) => {\n try {\n const res = await fetch(REGISTRY_URL);\n if (!res.ok) throw new Error(`Registry fetch failed: ${res.status}`);\n const plugins = (await res.json()) as RegistryPlugin[];\n const filtered = query\n ? plugins.filter(\n (p) =>\n p.name.includes(query) ||\n p.description?.toLowerCase().includes(query.toLowerCase()),\n )\n : plugins;\n\n if (filtered.length === 0) {\n console.log(`No plugins found${query ? ` matching \"${query}\"` : \"\"}.`);\n return;\n }\n\n for (const p of filtered) {\n console.log(` ${p.name}@${p.version}`);\n if (p.description) console.log(` ${p.description}`);\n }\n console.log(`\\nInstall: gpc plugins install <name>`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n cmd\n .command(\"install <name>\")\n .description(\"Install a plugin from npm\")\n .action(async (name: string) => {\n const { spawnSync } = await import(\"node:child_process\");\n console.log(`Installing plugin \"${name}\"...`);\n try {\n // Use spawnSync with an array to avoid shell injection — no shell is invoked\n const result = spawnSync(\"npm\", [\"install\", \"-g\", name], { stdio: \"inherit\" });\n if (result.status !== 0) {\n throw new Error(`npm install exited with code ${result.status ?? \"unknown\"}`);\n }\n const { approvePlugin } = await import(\"@gpc-cli/config\");\n await approvePlugin(name);\n console.log(`\\nPlugin \"${name}\" installed and approved. It will be loaded on next run.`);\n console.log(`Configure it in .gpcrc.json: { \"plugins\": [\"${name}\"] }`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n cmd\n .command(\"uninstall <name>\")\n .description(\"Uninstall a plugin and revoke its approval\")\n .action(async (name: string) => {\n const { spawnSync } = await import(\"node:child_process\");\n console.log(`Uninstalling plugin \"${name}\"...`);\n try {\n // Use spawnSync with an array to avoid shell injection — no shell is invoked\n const result = spawnSync(\"npm\", [\"uninstall\", \"-g\", name], { stdio: \"inherit\" });\n if (result.status !== 0) {\n throw new Error(`npm uninstall exited with code ${result.status ?? \"unknown\"}`);\n }\n const { revokePluginApproval } = await import(\"@gpc-cli/config\");\n await revokePluginApproval(name);\n console.log(`\\nPlugin \"${name}\" uninstalled and approval revoked.`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n\n/**\n * Wrap all registered commands so plugin hooks fire before/after each command.\n */\nfunction wrapCommandHooks(program: Command, manager: PluginManager): void {\n program.hook(\"preAction\", async (thisCommand) => {\n const event: CommandEvent = {\n command: getFullCommandName(thisCommand),\n args: thisCommand.opts(),\n app: program.opts()[\"app\"] as string | undefined,\n startedAt: new Date(),\n };\n\n // Store on the command for afterCommand/onError\n (thisCommand as unknown as Record<string, unknown>)[\"__pluginEvent\"] = event;\n\n await manager.runBeforeCommand(event);\n });\n\n program.hook(\"postAction\", async (thisCommand) => {\n const event: CommandEvent = (thisCommand as unknown as Record<string, unknown>)[\n \"__pluginEvent\"\n ] as CommandEvent;\n if (!event) return;\n\n const result: CommandResult = {\n success: true,\n durationMs: Date.now() - event.startedAt.getTime(),\n exitCode: 0,\n };\n\n await manager.runAfterCommand(event, result);\n });\n}\n\nfunction getFullCommandName(cmd: Command): string {\n const parts: string[] = [];\n let current: Command | null = cmd;\n while (current && current.name() !== \"gpc\") {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n","/**\n * Shared error formatting for CLI output.\n * Extracts error code, message, and suggestion from typed errors (GpcError, AuthError, ApiError, ConfigError).\n */\n\ninterface TypedError {\n message: string;\n code?: string;\n suggestion?: string;\n exitCode?: number;\n /** When true, error handler prints nothing (e.g., user-aborted operations). */\n silent?: boolean;\n}\n\nfunction isTypedError(error: unknown): error is Error & TypedError {\n return (\n error instanceof Error && \"code\" in error && typeof (error as TypedError).code === \"string\"\n );\n}\n\nconst AUTH_KEYWORDS = [\"AUTH\", \"UNAUTHENTICATED\", \"PERMISSION_DENIED\", \"401\", \"403\"];\n\nfunction isAuthRelatedError(error: unknown): boolean {\n if (isTypedError(error)) {\n // Update errors hit GitHub, not Google Play — never an auth issue\n if (error.code?.startsWith(\"UPDATE_\")) return false;\n if (error.exitCode === 3) return true;\n if (error.code && AUTH_KEYWORDS.some((k) => error.code?.includes(k))) return true;\n }\n const msg = error instanceof Error ? error.message : String(error);\n return AUTH_KEYWORDS.some((k) => msg.includes(k));\n}\n\n/**\n * Format an error for CLI output. Prints:\n * Error [CODE]: message\n * Suggestion: suggestion (if available)\n *\n * Returns the appropriate exit code.\n */\nexport function handleCliError(error: unknown): number {\n // Silent errors (e.g., user abort) — don't print anything\n if (isTypedError(error) && error.silent) {\n return error.exitCode ?? 0;\n }\n\n const authHint = isAuthRelatedError(error)\n ? \"\\n\\u2192 Run gpc doctor to diagnose your credentials.\"\n : \"\";\n\n if (isTypedError(error)) {\n console.error(`Error [${error.code}]: ${error.message}`);\n if (error.suggestion) {\n console.error(`Suggestion: ${error.suggestion}`);\n }\n if (authHint) console.error(authHint);\n return error.exitCode ?? 1;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n if (authHint) console.error(authHint);\n return 1;\n}\n"],"mappings":"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","names":["loader","_"]}
@@ -319,6 +319,9 @@ function optionToDef(opt) {
319
319
  takesValue
320
320
  };
321
321
  }
322
+ function isHidden(cmd) {
323
+ return cmd._hidden === true;
324
+ }
322
325
  function commandToDef(cmd) {
323
326
  const def = {
324
327
  description: cmd.description() ?? ""
@@ -327,7 +330,7 @@ function commandToDef(cmd) {
327
330
  if (options.length > 0) {
328
331
  def.options = options;
329
332
  }
330
- const subs = cmd.commands.filter((c) => c.name() !== "help");
333
+ const subs = cmd.commands.filter((c) => c.name() !== "help" && !isHidden(c));
331
334
  if (subs.length > 0) {
332
335
  def.subcommands = {};
333
336
  for (const sub of subs) {
@@ -339,7 +342,7 @@ function commandToDef(cmd) {
339
342
  function buildCommandTreeFromProgram(program) {
340
343
  const tree = {};
341
344
  for (const cmd of program.commands) {
342
- if (cmd.name() === "help") continue;
345
+ if (cmd.name() === "help" || isHidden(cmd)) continue;
343
346
  tree[cmd.name()] = commandToDef(cmd);
344
347
  }
345
348
  return tree;
@@ -379,11 +382,27 @@ function completableOptions(options) {
379
382
  return true;
380
383
  });
381
384
  }
385
+ var DYNAMIC_FLAG_CONTEXTS = [
386
+ { flags: ["--profile", "-p"], context: "profiles" },
387
+ { flags: ["--app", "-a"], context: "packages" },
388
+ { flags: ["--apps"], context: "packages" },
389
+ { flags: ["--track"], context: "tracks-for-app" }
390
+ ];
382
391
  function generateBashCompletions(tree = getCommandTree(), globals = []) {
383
392
  const topLevelNames = Object.keys(tree).join(" ");
384
393
  const globalFlags = completableOptions(globals).map((o) => o.long ?? "").filter(Boolean).join(" ");
385
394
  const caseEntries = [];
386
395
  const flagCases = [];
396
+ for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {
397
+ for (const flag of flags) {
398
+ flagCases.push(
399
+ ` ${flag})
400
+ COMPREPLY=( $(compgen -W "$(gpc __complete ${context} 2>/dev/null)" -- "\${cur}") )
401
+ return 0
402
+ ;;`
403
+ );
404
+ }
405
+ }
387
406
  const allCommandNames = /* @__PURE__ */ new Set();
388
407
  const collectNames = (defs) => {
389
408
  for (const [name, def] of Object.entries(defs)) {
@@ -418,7 +437,7 @@ function generateBashCompletions(tree = getCommandTree(), globals = []) {
418
437
  if (opt.choices && opt.long) {
419
438
  flagCases.push(
420
439
  ` ${opt.long})
421
- COMPREPLY=( $(compgen -W "${opt.choices.join(" ")}" -- "\${cur}") )
440
+ COMPREPLY=( $(compgen -W "${joinBashChoices(opt.choices)}" -- "\${cur}") )
422
441
  return 0
423
442
  ;;`
424
443
  );
@@ -432,7 +451,7 @@ function generateBashCompletions(tree = getCommandTree(), globals = []) {
432
451
  if (opt.choices && opt.long) {
433
452
  flagCases.push(
434
453
  ` ${opt.long})
435
- COMPREPLY=( $(compgen -W "${opt.choices.join(" ")}" -- "\${cur}") )
454
+ COMPREPLY=( $(compgen -W "${joinBashChoices(opt.choices)}" -- "\${cur}") )
436
455
  return 0
437
456
  ;;`
438
457
  );
@@ -530,33 +549,57 @@ ${subEntries}
530
549
  }
531
550
  }
532
551
  const localDecls = varNames.map((v) => ` local -a ${v}`).join("\n");
533
- const flagHints = [];
534
- const walkFlags = (defs, path) => {
535
- for (const [name, def] of Object.entries(defs)) {
552
+ const choiceSpecs = /* @__PURE__ */ new Set();
553
+ const walkChoices = (defs) => {
554
+ for (const def of Object.values(defs)) {
536
555
  for (const opt of completableOptions(def.options)) {
537
- if (opt.choices) {
538
- flagHints.push(
539
- `# ${path}${name} ${opt.long}: (${opt.choices.join(" ")}) \u2014 ${escapeZsh(opt.description)}`
556
+ if (opt.choices && opt.long) {
557
+ choiceSpecs.add(
558
+ `'${opt.long}[${escapeZsh(opt.description)}]:value:(${opt.choices.join(" ")})'`
540
559
  );
541
560
  }
542
561
  }
543
- if (def.subcommands) walkFlags(def.subcommands, `${path}${name} `);
562
+ if (def.subcommands) walkChoices(def.subcommands);
544
563
  }
545
564
  };
546
- walkFlags(tree, "");
565
+ walkChoices(tree);
547
566
  for (const opt of completableOptions(globals)) {
548
- if (opt.choices) {
549
- flagHints.push(
550
- `# (global) ${opt.long}: (${opt.choices.join(" ")}) \u2014 ${escapeZsh(opt.description)}`
567
+ if (opt.choices && opt.long) {
568
+ choiceSpecs.add(
569
+ `'${opt.long}[${escapeZsh(opt.description)}]:value:(${opt.choices.join(" ")})'`
551
570
  );
552
571
  }
553
572
  }
573
+ const dynamicSpecs = [];
574
+ for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {
575
+ for (const flag of flags) {
576
+ const fn = `_gpc_${context.replace(/-/g, "_")}`;
577
+ dynamicSpecs.push(`'${flag}[]:value:${fn}'`);
578
+ }
579
+ }
580
+ const helperFns = `
581
+ _gpc_profiles() {
582
+ local -a items
583
+ items=(\${(f)"$(gpc __complete profiles 2>/dev/null)"})
584
+ compadd -a items
585
+ }
586
+ _gpc_packages() {
587
+ local -a items
588
+ items=(\${(f)"$(gpc __complete packages 2>/dev/null)"})
589
+ compadd -a items
590
+ }
591
+ _gpc_tracks_for_app() {
592
+ local -a items
593
+ items=(\${(f)"$(gpc __complete tracks-for-app 2>/dev/null)"})
594
+ compadd -a items
595
+ }`;
596
+ const allSpecs = [...choiceSpecs, ...dynamicSpecs];
597
+ const extraArgs = allSpecs.length > 0 ? ` \\
598
+ ${allSpecs.join(" \\\n ")}` : "";
554
599
  return `#compdef gpc
555
600
  # Install: gpc completion zsh > ~/.zsh/completions/_gpc
556
- ${flagHints.length > 0 ? `
557
- # --- Flag choices (reference) ---
558
- ${flagHints.join("\n")}
559
- ` : ""}
601
+ ${helperFns}
602
+
560
603
  _gpc() {
561
604
  ${localDecls}
562
605
 
@@ -566,7 +609,7 @@ ${arrayDefs.join("\n\n")}
566
609
  '1: :->command' \\
567
610
  '2: :->subcommand' \\
568
611
  '3: :->subsubcommand' \\
569
- '*::arg:->args'
612
+ '*::arg:->args'${extraArgs}
570
613
 
571
614
  case "$state" in
572
615
  command)
@@ -655,6 +698,19 @@ function generateFishCompletions(tree = getCommandTree(), globals = []) {
655
698
  }
656
699
  };
657
700
  walkFlags(tree);
701
+ lines.push("");
702
+ lines.push("# Dynamic values (shell out to __complete)");
703
+ for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {
704
+ for (const flag of flags) {
705
+ if (flag.startsWith("--")) {
706
+ const longName = flag.slice(2);
707
+ lines.push(`complete -c gpc -l ${longName} -x -a '(gpc __complete ${context} 2>/dev/null)'`);
708
+ } else if (flag.startsWith("-")) {
709
+ const shortName = flag.slice(1);
710
+ lines.push(`complete -c gpc -s ${shortName} -x -a '(gpc __complete ${context} 2>/dev/null)'`);
711
+ }
712
+ }
713
+ }
658
714
  return lines.join("\n");
659
715
  }
660
716
  function generatePowerShellCompletions(tree = getCommandTree(), globals = []) {
@@ -720,6 +776,9 @@ ${level3Cases.join("\n")}
720
776
  }
721
777
  }`;
722
778
  }
779
+ function joinBashChoices(choices) {
780
+ return choices.map((c) => c.replace(/([\\"$`])/g, "\\$1").replace(/ /g, "\\ ")).join(" ");
781
+ }
723
782
  function escapeZsh(str) {
724
783
  return str.replace(/'/g, "'\\''");
725
784
  }
@@ -740,4 +799,4 @@ export {
740
799
  getCommandTree,
741
800
  registerCompletionCommand
742
801
  };
743
- //# sourceMappingURL=completion-KRZLHV7V.js.map
802
+ //# sourceMappingURL=completion-4I3IJK3M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/completion.ts"],"sourcesContent":["import type { Command, Option } from \"commander\";\n\nexport type ShellType = \"bash\" | \"zsh\" | \"fish\" | \"powershell\";\n\nexport const SUPPORTED_SHELLS: readonly ShellType[] = [\n \"bash\",\n \"zsh\",\n \"fish\",\n \"powershell\",\n] as const;\n\nexport interface OptionDef {\n flags: string;\n long?: string;\n short?: string;\n description: string;\n choices?: string[];\n takesValue: boolean;\n}\n\nexport interface CommandDef {\n description: string;\n subcommands?: Record<string, CommandDef>;\n options?: OptionDef[];\n}\n\n/**\n * Hand-maintained fallback tree. Used by unit tests and as a safety net when\n * the walker cannot introspect the program (e.g. when the generator is called\n * without a live Command instance). Runtime `gpc completion <shell>` uses the\n * introspected tree from `buildCommandTreeFromProgram` so new commands and\n * plugins auto-complete without requiring edits here.\n */\nexport function getCommandTree(): Record<string, CommandDef> {\n return {\n auth: {\n description: \"Manage authentication\",\n subcommands: {\n login: { description: \"Authenticate with Google Play Developer API\" },\n status: { description: \"Show current authentication status\" },\n logout: { description: \"Remove stored credentials\" },\n whoami: { description: \"Show the authenticated account\" },\n },\n },\n config: {\n description: \"Manage configuration\",\n subcommands: {\n init: { description: \"Create a configuration file\" },\n show: { description: \"Show current configuration\" },\n set: { description: \"Set a configuration value\" },\n path: { description: \"Show the configuration file path\" },\n },\n },\n apps: {\n description: \"Manage applications\",\n subcommands: {\n info: { description: \"Show app details\" },\n update: { description: \"Update app details\" },\n list: { description: \"List configured applications\" },\n },\n },\n releases: {\n description: \"Manage releases and rollouts\",\n subcommands: {\n upload: { description: \"Upload AAB/APK and assign to a track\" },\n status: { description: \"Show current release status across tracks\" },\n promote: { description: \"Promote a release from one track to another\" },\n rollout: {\n description: \"Manage staged rollouts\",\n subcommands: {\n increase: { description: \"Increase a staged rollout\" },\n halt: { description: \"Halt a staged rollout\" },\n resume: { description: \"Resume a staged rollout\" },\n complete: { description: \"Complete a staged rollout\" },\n },\n },\n notes: { description: \"Set release notes\" },\n },\n },\n tracks: {\n description: \"Manage tracks\",\n subcommands: {\n list: { description: \"List all tracks\" },\n },\n },\n status: { description: \"Cross-track release overview\" },\n listings: {\n description: \"Manage store listings and metadata\",\n subcommands: {\n get: { description: \"Get store listing(s)\" },\n update: { description: \"Update a store listing\" },\n delete: { description: \"Delete a store listing for a language\" },\n pull: { description: \"Download listings to Fastlane-format directory\" },\n push: { description: \"Upload listings from Fastlane-format directory\" },\n images: {\n description: \"Manage listing images\",\n subcommands: {\n list: { description: \"List images for a language and type\" },\n upload: { description: \"Upload an image\" },\n delete: { description: \"Delete an image\" },\n },\n },\n availability: { description: \"Get country availability for a track\" },\n },\n },\n reviews: {\n description: \"Manage user reviews and ratings\",\n subcommands: {\n list: { description: \"List user reviews\" },\n get: { description: \"Get a single review\" },\n reply: { description: \"Reply to a review\" },\n export: { description: \"Export reviews to JSON or CSV\" },\n },\n },\n vitals: {\n description: \"Monitor app vitals and performance metrics\",\n subcommands: {\n overview: { description: \"Dashboard summary of all vital metrics\" },\n crashes: { description: \"Query crash rate metrics\" },\n anr: { description: \"Query ANR rate metrics\" },\n startup: { description: \"Query slow startup metrics\" },\n rendering: { description: \"Query slow rendering metrics\" },\n battery: { description: \"Query excessive wakeup metrics\" },\n memory: { description: \"Query stuck wakelock metrics\" },\n anomalies: { description: \"Detect anomalies in app vitals\" },\n errors: {\n description: \"Search and view error issues\",\n subcommands: {\n search: { description: \"Search error issues\" },\n },\n },\n compare: { description: \"Compare metric trend between periods\" },\n },\n },\n subscriptions: {\n description: \"Manage subscriptions and base plans\",\n subcommands: {\n list: { description: \"List subscriptions\" },\n get: { description: \"Get a subscription\" },\n create: { description: \"Create a subscription from JSON file\" },\n update: { description: \"Update a subscription from JSON file\" },\n delete: { description: \"Delete a subscription\" },\n \"base-plans\": {\n description: \"Manage base plans\",\n subcommands: {\n activate: { description: \"Activate a base plan\" },\n deactivate: { description: \"Deactivate a base plan\" },\n delete: { description: \"Delete a base plan\" },\n \"migrate-prices\": { description: \"Migrate base plan prices\" },\n },\n },\n offers: {\n description: \"Manage subscription offers\",\n subcommands: {\n list: { description: \"List offers for a base plan\" },\n get: { description: \"Get an offer\" },\n create: { description: \"Create an offer from JSON file\" },\n update: { description: \"Update an offer from JSON file\" },\n delete: { description: \"Delete an offer\" },\n activate: { description: \"Activate an offer\" },\n deactivate: { description: \"Deactivate an offer\" },\n },\n },\n },\n },\n iap: {\n description: \"Manage in-app products\",\n subcommands: {\n list: { description: \"List in-app products\" },\n get: { description: \"Get an in-app product\" },\n create: { description: \"Create an in-app product from JSON file\" },\n update: { description: \"Update an in-app product from JSON file\" },\n delete: { description: \"Delete an in-app product\" },\n sync: { description: \"Sync in-app products from a directory\" },\n },\n },\n purchases: {\n description: \"Manage purchases and orders\",\n subcommands: {\n get: { description: \"Get a product purchase\" },\n acknowledge: { description: \"Acknowledge a product purchase\" },\n consume: { description: \"Consume a product purchase\" },\n subscription: {\n description: \"Manage subscription purchases\",\n subcommands: {\n get: { description: \"Get a subscription purchase\" },\n cancel: { description: \"Cancel a subscription\" },\n defer: { description: \"Defer a subscription expiry\" },\n revoke: { description: \"Revoke a subscription\" },\n },\n },\n voided: { description: \"List voided purchases\" },\n orders: {\n description: \"Manage orders\",\n subcommands: {\n refund: { description: \"Refund an order\" },\n },\n },\n },\n },\n pricing: {\n description: \"Pricing and regional price conversion\",\n subcommands: {\n convert: { description: \"Convert a price to all regional prices\" },\n },\n },\n reports: {\n description: \"Download financial and stats reports\",\n subcommands: {\n list: { description: \"List available report buckets\" },\n download: {\n description: \"Download a report\",\n subcommands: {\n financial: { description: \"Download a financial report\" },\n stats: { description: \"Download a stats report\" },\n },\n },\n },\n },\n users: {\n description: \"Manage developer account users and permissions\",\n subcommands: {\n list: { description: \"List all users in the developer account\" },\n get: { description: \"Get user details\" },\n invite: { description: \"Invite a user to the developer account\" },\n update: { description: \"Update user permissions\" },\n remove: { description: \"Remove a user from the developer account\" },\n },\n },\n testers: {\n description: \"Manage testers and tester groups\",\n subcommands: {\n list: { description: \"List testers for a track\" },\n add: { description: \"Add testers to a track\" },\n remove: { description: \"Remove testers from a track\" },\n import: { description: \"Import testers from a CSV file\" },\n },\n },\n recovery: {\n description: \"Manage app recovery actions\",\n subcommands: {\n list: { description: \"List app recovery actions\" },\n cancel: { description: \"Cancel a recovery action\" },\n deploy: { description: \"Deploy a recovery action\" },\n create: { description: \"Create a recovery action\" },\n \"add-targeting\": { description: \"Add targeting to a recovery action\" },\n },\n },\n \"data-safety\": {\n description: \"Manage data safety declarations\",\n subcommands: {\n get: { description: \"Get data safety declaration\" },\n update: { description: \"Update data safety declaration\" },\n export: { description: \"Export data safety declaration\" },\n },\n },\n \"external-transactions\": {\n description: \"Manage external transactions\",\n subcommands: {\n create: { description: \"Create an external transaction\" },\n get: { description: \"Get an external transaction\" },\n refund: { description: \"Refund an external transaction\" },\n },\n },\n \"device-tiers\": {\n description: \"Manage device tier configurations\",\n subcommands: {\n list: { description: \"List device tier configurations\" },\n get: { description: \"Get a device tier configuration\" },\n create: { description: \"Create a device tier configuration\" },\n },\n },\n \"one-time-products\": {\n description: \"Manage one-time products\",\n subcommands: {\n list: { description: \"List one-time products\" },\n get: { description: \"Get a one-time product\" },\n create: { description: \"Create a one-time product\" },\n update: { description: \"Update a one-time product\" },\n delete: { description: \"Delete a one-time product\" },\n offers: {\n description: \"Manage one-time product offers\",\n subcommands: {\n list: { description: \"List offers for a one-time product\" },\n get: { description: \"Get a one-time product offer\" },\n create: { description: \"Create a one-time product offer\" },\n update: { description: \"Update a one-time product offer\" },\n delete: { description: \"Delete a one-time product offer\" },\n },\n },\n },\n },\n \"internal-sharing\": {\n description: \"Manage internal app sharing\",\n subcommands: {\n upload: { description: \"Upload an artifact for internal sharing\" },\n },\n },\n \"generated-apks\": {\n description: \"Manage generated APKs from app bundles\",\n subcommands: {\n list: { description: \"List generated APKs for a version\" },\n download: { description: \"Download a generated APK\" },\n },\n },\n doctor: { description: \"Verify setup and connectivity\" },\n docs: { description: \"Open documentation in browser\" },\n validate: { description: \"Pre-submission validation checks\" },\n publish: { description: \"Validate, upload, and release in one step\" },\n completion: {\n description: \"Generate shell completions\",\n subcommands: {\n bash: { description: \"Generate bash completions\" },\n zsh: { description: \"Generate zsh completions\" },\n fish: { description: \"Generate fish completions\" },\n powershell: { description: \"Generate PowerShell completions\" },\n },\n },\n plugins: {\n description: \"Manage plugins\",\n subcommands: {\n list: { description: \"List loaded plugins\" },\n init: { description: \"Scaffold a new plugin project\" },\n approve: { description: \"Approve a third-party plugin for loading\" },\n revoke: { description: \"Revoke approval for a third-party plugin\" },\n },\n },\n };\n}\n\n/** Map a Commander Option to an OptionDef used by the shell generators. */\nfunction optionToDef(opt: Option): OptionDef {\n const flags = opt.flags;\n // Commander exposes parsed long/short on the Option; fall back to parsing `.flags` if missing.\n const long = opt.long ?? undefined;\n const short = opt.short ?? undefined;\n // `takesValue` is true when the raw flags contain <placeholder> or [placeholder].\n const takesValue = /[<[][^>\\]]+[>\\]]/.test(flags);\n // Commander 14 exposes `.argChoices`; fall back gracefully if absent.\n const rawChoices = (opt as unknown as { argChoices?: readonly string[] }).argChoices;\n const choices = rawChoices && rawChoices.length > 0 ? Array.from(rawChoices) : undefined;\n return {\n flags,\n long: long ?? undefined,\n short: short ?? undefined,\n description: opt.description ?? \"\",\n choices,\n takesValue,\n };\n}\n\n/** Whether a Commander command was registered with `{ hidden: true }`. */\nfunction isHidden(cmd: Command): boolean {\n return (cmd as unknown as { _hidden?: boolean })._hidden === true;\n}\n\n/** Recursively walk a Commander Command into the completion tree shape. */\nfunction commandToDef(cmd: Command): CommandDef {\n const def: CommandDef = {\n description: cmd.description() ?? \"\",\n };\n const options = cmd.options\n .filter((o) => !o.hidden)\n .map(optionToDef)\n .filter((o) => o.long || o.short);\n if (options.length > 0) {\n def.options = options;\n }\n const subs = cmd.commands.filter((c) => c.name() !== \"help\" && !isHidden(c));\n if (subs.length > 0) {\n def.subcommands = {};\n for (const sub of subs) {\n def.subcommands[sub.name()] = commandToDef(sub);\n }\n }\n return def;\n}\n\n/** Build a completion tree by introspecting a fully-loaded Commander program. */\nexport function buildCommandTreeFromProgram(program: Command): Record<string, CommandDef> {\n const tree: Record<string, CommandDef> = {};\n for (const cmd of program.commands) {\n if (cmd.name() === \"help\" || isHidden(cmd)) continue;\n tree[cmd.name()] = commandToDef(cmd);\n }\n return tree;\n}\n\n/** Collect global options declared on the root program. */\nexport function collectGlobalOptions(program: Command): OptionDef[] {\n return program.options\n .filter((o) => !o.hidden)\n .map(optionToDef)\n .filter((o) => o.long || o.short);\n}\n\nexport function registerCompletionCommand(\n program: Command,\n ensureAllCommandsLoaded?: () => Promise<void>,\n): void {\n const completion = program.command(\"completion\").description(\"Generate shell completions\");\n\n const generate = async (\n shell: ShellType,\n gen: (tree: Record<string, CommandDef>, globals: OptionDef[]) => string,\n ): Promise<void> => {\n if (ensureAllCommandsLoaded) {\n await ensureAllCommandsLoaded();\n }\n const tree = ensureAllCommandsLoaded ? buildCommandTreeFromProgram(program) : getCommandTree();\n const globals = collectGlobalOptions(program);\n // Suppress unused-shell warning; shell type reserved for future per-shell tuning.\n void shell;\n console.log(gen(tree, globals));\n };\n\n completion\n .command(\"bash\")\n .description(\"Generate bash completions\")\n .action(async () => {\n await generate(\"bash\", generateBashCompletions);\n });\n\n completion\n .command(\"zsh\")\n .description(\"Generate zsh completions\")\n .action(async () => {\n await generate(\"zsh\", generateZshCompletions);\n });\n\n completion\n .command(\"fish\")\n .description(\"Generate fish completions\")\n .action(async () => {\n await generate(\"fish\", generateFishCompletions);\n });\n\n completion\n .command(\"powershell\")\n .description(\"Generate PowerShell completions\")\n .action(async () => {\n await generate(\"powershell\", generatePowerShellCompletions);\n });\n}\n\n/**\n * Return only options that have choices or long flags useful for completion\n * suggestion. `-V/--version` and `-h/--help` are filtered out to avoid noise.\n */\nfunction completableOptions(options: OptionDef[] | undefined): OptionDef[] {\n if (!options) return [];\n return options.filter((o) => {\n if (!o.long) return false;\n if (o.long === \"--help\" || o.long === \"--version\") return false;\n return true;\n });\n}\n\n/**\n * Shell-completion flag slots that carry dynamic values (profiles, package\n * names, track names). Generated scripts shell out to `gpc __complete <ctx>`\n * to resolve these at TAB time. Shared across bash / zsh / fish generators.\n */\nconst DYNAMIC_FLAG_CONTEXTS: Array<{ flags: string[]; context: string }> = [\n { flags: [\"--profile\", \"-p\"], context: \"profiles\" },\n { flags: [\"--app\", \"-a\"], context: \"packages\" },\n { flags: [\"--apps\"], context: \"packages\" },\n { flags: [\"--track\"], context: \"tracks-for-app\" },\n];\n\nexport function generateBashCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const topLevelNames = Object.keys(tree).join(\" \");\n\n const globalFlags = completableOptions(globals)\n .map((o) => o.long ?? \"\")\n .filter(Boolean)\n .join(\" \");\n\n // Build case entries for each command that has subcommands (up to 3 levels)\n // and emit flag completion branches for commands with options.\n const caseEntries: string[] = [];\n const flagCases: string[] = [];\n\n // Dynamic flag-value completion: shell out to `gpc __complete <ctx>`.\n for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {\n for (const flag of flags) {\n flagCases.push(\n ` ${flag})\\n COMPREPLY=( $(compgen -W \"$(gpc __complete ${context} 2>/dev/null)\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n\n const allCommandNames = new Set<string>();\n const collectNames = (defs: Record<string, CommandDef>) => {\n for (const [name, def] of Object.entries(defs)) {\n allCommandNames.add(name);\n if (def.subcommands) collectNames(def.subcommands);\n }\n };\n collectNames(tree);\n\n for (const [cmd, def] of Object.entries(tree)) {\n if (def.subcommands) {\n const subNames = Object.keys(def.subcommands).join(\" \");\n caseEntries.push(\n ` ${cmd})\\n COMPREPLY=( $(compgen -W \"${subNames}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n const subSubNames = Object.keys(subDef.subcommands).join(\" \");\n caseEntries.push(\n ` ${sub})\\n COMPREPLY=( $(compgen -W \"${subSubNames}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n }\n\n // Collect flags that carry choices from this command + its subtree.\n const walk = (d: CommandDef) => {\n for (const opt of completableOptions(d.options)) {\n if (opt.choices && opt.long) {\n flagCases.push(\n ` ${opt.long})\\n COMPREPLY=( $(compgen -W \"${joinBashChoices(opt.choices)}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n if (d.subcommands) for (const s of Object.values(d.subcommands)) walk(s);\n };\n walk(def);\n }\n\n // Global-option choices (e.g. --output table|json|yaml|markdown|junit).\n for (const opt of completableOptions(globals)) {\n if (opt.choices && opt.long) {\n flagCases.push(\n ` ${opt.long})\\n COMPREPLY=( $(compgen -W \"${joinBashChoices(opt.choices)}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n\n return `# bash completion for gpc\n# Install: gpc completion bash >> ~/.bashrc\n_gpc() {\n local cur prev commands globals\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n\n commands=\"${topLevelNames}\"\n globals=\"${globalFlags}\"\n\n # Flag-value completion (choices)\n case \"\\${prev}\" in\n${flagCases.join(\"\\n\")}\n esac\n\n # When the current word starts with '-', complete known flags\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=( $(compgen -W \"\\${globals}\" -- \"\\${cur}\") )\n return 0\n fi\n\n case \"\\${prev}\" in\n gpc)\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n ;;\n${caseEntries.join(\"\\n\")}\n esac\n\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n}\n\ncomplete -F _gpc gpc`;\n}\n\nexport function generateZshCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const arrayDefs: string[] = [];\n const caseBranches: string[] = [];\n\n const topEntries = Object.entries(tree)\n .map(([name, def]) => ` '${name}:${escapeZsh(def.description)}'`)\n .join(\"\\n\");\n arrayDefs.push(` commands=(\\n${topEntries}\\n )`);\n\n for (const [cmd, def] of Object.entries(tree)) {\n if (def.subcommands) {\n const varName = `${cmd.replace(/-/g, \"_\")}_commands`;\n const entries = Object.entries(def.subcommands)\n .map(([name, sub]) => ` '${name}:${escapeZsh(sub.description)}'`)\n .join(\"\\n\");\n arrayDefs.push(` ${varName}=(\\n${entries}\\n )`);\n caseBranches.push(\n ` ${cmd})\\n _describe -t ${varName} '${cmd} commands' ${varName}\\n ;;`,\n );\n\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n const subVarName = `${cmd.replace(/-/g, \"_\")}_${sub.replace(/-/g, \"_\")}_commands`;\n const subEntries = Object.entries(subDef.subcommands)\n .map(([name, s]) => ` '${name}:${escapeZsh(s.description)}'`)\n .join(\"\\n\");\n arrayDefs.push(` ${subVarName}=(\\n${subEntries}\\n )`);\n }\n }\n }\n }\n\n const level3Cases: string[] = [];\n for (const [cmd, def] of Object.entries(tree)) {\n if (!def.subcommands) continue;\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n const subVarName = `${cmd.replace(/-/g, \"_\")}_${sub.replace(/-/g, \"_\")}_commands`;\n level3Cases.push(\n ` ${sub})\\n _describe -t ${subVarName} '${sub} commands' ${subVarName}\\n ;;`,\n );\n }\n }\n }\n\n const varNames: string[] = [\"commands\"];\n for (const [cmd, def] of Object.entries(tree)) {\n if (def.subcommands) {\n varNames.push(`${cmd.replace(/-/g, \"_\")}_commands`);\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n varNames.push(`${cmd.replace(/-/g, \"_\")}_${sub.replace(/-/g, \"_\")}_commands`);\n }\n }\n }\n }\n\n const localDecls = varNames.map((v) => ` local -a ${v}`).join(\"\\n\");\n\n // Static flag-choice option specs (e.g. --output table|json|yaml) harvested\n // from Commander's `.choices()` across the entire tree. Emitted into the\n // main _arguments call so zsh menu-completes them.\n const choiceSpecs = new Set<string>();\n const walkChoices = (defs: Record<string, CommandDef>) => {\n for (const def of Object.values(defs)) {\n for (const opt of completableOptions(def.options)) {\n if (opt.choices && opt.long) {\n choiceSpecs.add(\n `'${opt.long}[${escapeZsh(opt.description)}]:value:(${opt.choices.join(\" \")})'`,\n );\n }\n }\n if (def.subcommands) walkChoices(def.subcommands);\n }\n };\n walkChoices(tree);\n for (const opt of completableOptions(globals)) {\n if (opt.choices && opt.long) {\n choiceSpecs.add(\n `'${opt.long}[${escapeZsh(opt.description)}]:value:(${opt.choices.join(\" \")})'`,\n );\n }\n }\n\n // Dynamic-value option specs: each dynamic flag gets wired to a helper\n // function that shells out to `gpc __complete <ctx>`.\n const dynamicSpecs: string[] = [];\n for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {\n for (const flag of flags) {\n const fn = `_gpc_${context.replace(/-/g, \"_\")}`;\n dynamicSpecs.push(`'${flag}[]:value:${fn}'`);\n }\n }\n\n const helperFns = `\n_gpc_profiles() {\n local -a items\n items=(\\${(f)\"$(gpc __complete profiles 2>/dev/null)\"})\n compadd -a items\n}\n_gpc_packages() {\n local -a items\n items=(\\${(f)\"$(gpc __complete packages 2>/dev/null)\"})\n compadd -a items\n}\n_gpc_tracks_for_app() {\n local -a items\n items=(\\${(f)\"$(gpc __complete tracks-for-app 2>/dev/null)\"})\n compadd -a items\n}`;\n\n const allSpecs = [...choiceSpecs, ...dynamicSpecs];\n const extraArgs = allSpecs.length > 0 ? ` \\\\\\n ${allSpecs.join(\" \\\\\\n \")}` : \"\";\n\n return `#compdef gpc\n# Install: gpc completion zsh > ~/.zsh/completions/_gpc\n${helperFns}\n\n_gpc() {\n${localDecls}\n\n${arrayDefs.join(\"\\n\\n\")}\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '2: :->subcommand' \\\\\n '3: :->subsubcommand' \\\\\n '*::arg:->args'${extraArgs}\n\n case \"$state\" in\n command)\n _describe -t commands 'gpc commands' commands\n ;;\n subcommand)\n case \"$words[2]\" in\n${caseBranches.join(\"\\n\")}\n esac\n ;;\n subsubcommand)\n case \"$words[3]\" in\n${level3Cases.join(\"\\n\")}\n esac\n ;;\n esac\n}\n\n_gpc \"$@\"`;\n}\n\nexport function generateFishCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const lines: string[] = [\n \"# fish completions for gpc\",\n \"# Install: gpc completion fish > ~/.config/fish/completions/gpc.fish\",\n \"\",\n \"# Disable file completions by default\",\n \"complete -c gpc -f\",\n \"\",\n \"# Top-level commands\",\n ];\n\n for (const [cmd, def] of Object.entries(tree)) {\n lines.push(\n `complete -c gpc -n '__fish_use_subcommand' -a ${cmd} -d '${escapeFish(def.description)}'`,\n );\n }\n\n // Level 2 subcommands\n for (const [cmd, def] of Object.entries(tree)) {\n if (!def.subcommands) continue;\n lines.push(\"\");\n lines.push(`# ${cmd} subcommands`);\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n lines.push(\n `complete -c gpc -n '__fish_seen_subcommand_from ${cmd}; and not __fish_seen_subcommand_from ${Object.keys(def.subcommands).join(\" \")}' -a ${sub} -d '${escapeFish(subDef.description)}'`,\n );\n }\n\n // Level 3 subcommands\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (!subDef.subcommands) continue;\n lines.push(\"\");\n lines.push(`# ${cmd} ${sub} subcommands`);\n for (const [subsub, subsubDef] of Object.entries(subDef.subcommands)) {\n lines.push(\n `complete -c gpc -n '__fish_seen_subcommand_from ${sub}; and not __fish_seen_subcommand_from ${Object.keys(subDef.subcommands).join(\" \")}' -a ${subsub} -d '${escapeFish(subsubDef.description)}'`,\n );\n }\n }\n }\n\n // Global + per-command flag completions with choice lists.\n lines.push(\"\");\n lines.push(\"# Global flags\");\n for (const opt of completableOptions(globals)) {\n if (!opt.long) continue;\n const longName = opt.long.replace(/^--/, \"\");\n const shortName = opt.short ? opt.short.replace(/^-/, \"\") : undefined;\n const choiceArg = opt.choices ? ` -a '${opt.choices.join(\" \")}'` : \"\";\n const shortArg = shortName ? ` -s ${shortName}` : \"\";\n lines.push(\n `complete -c gpc -l ${longName}${shortArg} -d '${escapeFish(opt.description)}'${choiceArg}`,\n );\n }\n\n const walkFlags = (defs: Record<string, CommandDef>) => {\n for (const [name, def] of Object.entries(defs)) {\n const flags = completableOptions(def.options);\n if (flags.length > 0) {\n lines.push(\"\");\n lines.push(`# ${name} flags`);\n for (const opt of flags) {\n if (!opt.long) continue;\n const longName = opt.long.replace(/^--/, \"\");\n const shortName = opt.short ? opt.short.replace(/^-/, \"\") : undefined;\n const choiceArg = opt.choices ? ` -a '${opt.choices.join(\" \")}'` : \"\";\n const shortArg = shortName ? ` -s ${shortName}` : \"\";\n lines.push(\n `complete -c gpc -n '__fish_seen_subcommand_from ${name}' -l ${longName}${shortArg} -d '${escapeFish(opt.description)}'${choiceArg}`,\n );\n }\n }\n if (def.subcommands) walkFlags(def.subcommands);\n }\n };\n walkFlags(tree);\n\n // Dynamic flag-value completion: shell out to `gpc __complete <ctx>`.\n // Fish merges multiple `complete` directives for the same flag, so these\n // layer on top of the description-only lines emitted above.\n lines.push(\"\");\n lines.push(\"# Dynamic values (shell out to __complete)\");\n for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {\n for (const flag of flags) {\n if (flag.startsWith(\"--\")) {\n const longName = flag.slice(2);\n lines.push(`complete -c gpc -l ${longName} -x -a '(gpc __complete ${context} 2>/dev/null)'`);\n } else if (flag.startsWith(\"-\")) {\n const shortName = flag.slice(1);\n lines.push(`complete -c gpc -s ${shortName} -x -a '(gpc __complete ${context} 2>/dev/null)'`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function generatePowerShellCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const completionEntries: string[] = [];\n\n // Top-level completions\n for (const [cmd, def] of Object.entries(tree)) {\n completionEntries.push(\n ` [CompletionResult]::new('${cmd}', '${cmd}', [CompletionResultType]::ParameterValue, '${escapePowerShell(def.description)}')`,\n );\n }\n\n // Global flag completions (as parameters available from any state)\n for (const opt of completableOptions(globals)) {\n if (!opt.long) continue;\n completionEntries.push(\n ` [CompletionResult]::new('${opt.long}', '${opt.long}', [CompletionResultType]::ParameterName, '${escapePowerShell(opt.description)}')`,\n );\n }\n\n const subcommandCases: string[] = [];\n const level3Cases: string[] = [];\n\n for (const [cmd, def] of Object.entries(tree)) {\n if (!def.subcommands) continue;\n const subEntries = Object.entries(def.subcommands)\n .map(\n ([sub, subDef]) =>\n ` [CompletionResult]::new('${sub}', '${sub}', [CompletionResultType]::ParameterValue, '${escapePowerShell(subDef.description)}')`,\n )\n .join(\"\\n\");\n subcommandCases.push(` '${cmd}' {\\n${subEntries}\\n }`);\n\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (!subDef.subcommands) continue;\n const subSubEntries = Object.entries(subDef.subcommands)\n .map(\n ([subsub, subsubDef]) =>\n ` [CompletionResult]::new('${subsub}', '${subsub}', [CompletionResultType]::ParameterValue, '${escapePowerShell(subsubDef.description)}')`,\n )\n .join(\"\\n\");\n level3Cases.push(` '${sub}' {\\n${subSubEntries}\\n }`);\n }\n }\n\n return `# PowerShell completions for gpc\n# Install: gpc completion powershell >> $PROFILE\n\nusing namespace System.Management.Automation\n\nRegister-ArgumentCompleter -CommandName gpc -Native -ScriptBlock {\n param($wordToComplete, $commandAst, $cursorPosition)\n\n $tokens = $commandAst.ToString().Substring(0, $cursorPosition).Trim() -split '\\\\s+'\n $tokenCount = $tokens.Count\n\n # Determine context\n if ($tokenCount -le 1 -or ($tokenCount -eq 2 -and $wordToComplete)) {\n # Top-level commands\n${completionEntries.join(\"\\n\")}\n } elseif ($tokenCount -eq 2 -or ($tokenCount -eq 3 -and $wordToComplete)) {\n # Subcommands\n $command = $tokens[1]\n switch ($command) {\n${subcommandCases.join(\"\\n\")}\n }\n } elseif ($tokenCount -eq 3 -or ($tokenCount -eq 4 -and $wordToComplete)) {\n # Sub-subcommands\n $subcommand = $tokens[2]\n switch ($subcommand) {\n${level3Cases.join(\"\\n\")}\n }\n }\n}`;\n}\n\n/**\n * Escape a `.choices()` value for safe inclusion in a bash `compgen -W \"...\"`\n * list. Choices in practice come from CLI source (not user input), but we\n * defend anyway so a future `.choices([\"yes\", \"no thanks\"])` doesn't split on\n * whitespace or interpolate a stray `$var`.\n */\nfunction joinBashChoices(choices: readonly string[]): string {\n return choices\n .map((c) => c.replace(/([\\\\\"$`])/g, \"\\\\$1\").replace(/ /g, \"\\\\ \"))\n .join(\" \");\n}\n\nfunction escapeZsh(str: string): string {\n return str.replace(/'/g, \"'\\\\''\");\n}\n\nfunction escapeFish(str: string): string {\n return str.replace(/'/g, \"\\\\'\");\n}\n\nfunction escapePowerShell(str: string): string {\n return str.replace(/'/g, \"''\");\n}\n"],"mappings":"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","names":[]}
@@ -78,7 +78,7 @@ Configuration file created: ${path}`);
78
78
  });
79
79
  console.log("\nVerifying setup...");
80
80
  try {
81
- const { registerDoctorCommand } = await import("./doctor-PACXOJZ2.js");
81
+ const { registerDoctorCommand } = await import("./doctor-G2L2KVOO.js");
82
82
  const { Command } = await import("commander");
83
83
  const doctorProgram = new Command();
84
84
  doctorProgram.option("-o, --output <format>", "Output format").option("-j, --json", "JSON mode");
@@ -107,4 +107,4 @@ Configuration file created: ${path}`);
107
107
  export {
108
108
  registerConfigCommands
109
109
  };
110
- //# sourceMappingURL=config-ZLXFAFMN.js.map
110
+ //# sourceMappingURL=config-ZNAM2IHA.js.map
@@ -141,7 +141,7 @@ function checkCiEnvironment() {
141
141
  };
142
142
  }
143
143
  async function checkGpcVersion() {
144
- const currentVersion = "0.9.59";
144
+ const currentVersion = "0.9.60";
145
145
  if (currentVersion === "0.0.0") {
146
146
  return { name: "version", status: "info", message: "GPC development build" };
147
147
  }
@@ -800,4 +800,4 @@ export {
800
800
  checkVerificationDeadline,
801
801
  registerDoctorCommand
802
802
  };
803
- //# sourceMappingURL=doctor-PACXOJZ2.js.map
803
+ //# sourceMappingURL=doctor-G2L2KVOO.js.map
@@ -9,7 +9,7 @@ import { execFile } from "child_process";
9
9
  import { listAuditEvents } from "@gpc-cli/core";
10
10
  function registerFeedbackCommand(program) {
11
11
  program.command("feedback").description("Open a pre-filled GitHub issue with system diagnostics").option("--title <title>", "Issue title").option("--print", "Print the report to stdout instead of opening a browser").action(async (opts) => {
12
- const version = "0.9.59";
12
+ const version = "0.9.60";
13
13
  let lastCommand = "";
14
14
  try {
15
15
  const events = await listAuditEvents({ limit: 3 });
@@ -67,4 +67,4 @@ ${url}`);
67
67
  export {
68
68
  registerFeedbackCommand
69
69
  };
70
- //# sourceMappingURL=feedback-RO76QRIZ.js.map
70
+ //# sourceMappingURL=feedback-WXSCASJK.js.map
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  createProgram,
4
4
  handleCliError
5
- } from "./chunk-2AM4XW7Q.js";
5
+ } from "./chunk-CSNCSWUV.js";
6
6
  export {
7
7
  createProgram,
8
8
  handleCliError
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- buildCommitOptions
4
- } from "./chunk-WSLFHX5X.js";
5
2
  import {
6
3
  getClient,
7
4
  resolvePackageName
8
5
  } from "./chunk-JDRY7HK5.js";
6
+ import {
7
+ buildCommitOptions
8
+ } from "./chunk-WSLFHX5X.js";
9
9
  import {
10
10
  isDryRun,
11
11
  printDryRun
@@ -448,4 +448,4 @@ Missing locales: ${missingLocales.join(", ")}`);
448
448
  export {
449
449
  registerListingsCommands
450
450
  };
451
- //# sourceMappingURL=listings-MOHHHNE6.js.map
451
+ //# sourceMappingURL=listings-2Z6DSO3D.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- buildCommitOptions
4
- } from "./chunk-WSLFHX5X.js";
5
2
  import {
6
3
  resolvePackageName
7
4
  } from "./chunk-JDRY7HK5.js";
5
+ import {
6
+ buildCommitOptions
7
+ } from "./chunk-WSLFHX5X.js";
8
8
  import {
9
9
  isDryRun
10
10
  } from "./chunk-Y3QZDAKS.js";
@@ -227,4 +227,4 @@ function registerPublishCommand(program) {
227
227
  export {
228
228
  registerPublishCommand
229
229
  };
230
- //# sourceMappingURL=publish-26SSZ2W3.js.map
230
+ //# sourceMappingURL=publish-5HZAJEDZ.js.map
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- buildCommitOptions
4
- } from "./chunk-WSLFHX5X.js";
5
2
  import {
6
3
  getClient,
7
4
  resolvePackageName
8
5
  } from "./chunk-JDRY7HK5.js";
6
+ import {
7
+ buildCommitOptions
8
+ } from "./chunk-WSLFHX5X.js";
9
9
  import {
10
10
  isDryRun,
11
11
  printDryRun
@@ -188,4 +188,4 @@ function registerTestersCommands(program) {
188
188
  export {
189
189
  registerTestersCommands
190
190
  };
191
- //# sourceMappingURL=testers-QUWZHO6M.js.map
191
+ //# sourceMappingURL=testers-FGLBJAXL.js.map
@@ -17,7 +17,7 @@ function registerUpdateCommand(program) {
17
17
  program.command("update").description("Update gpc to the latest version").option("--check", "Check for updates without installing (exits 0 always)").option("--force", "Update even if already on the latest version").action(async (opts, cmd) => {
18
18
  const parentOpts = cmd.parent?.opts() ?? {};
19
19
  const jsonMode = !!(parentOpts["json"] || parentOpts["output"] === "json");
20
- const currentVersion = "0.9.59";
20
+ const currentVersion = "0.9.60";
21
21
  if (currentVersion === "0.0.0") {
22
22
  if (jsonMode) {
23
23
  console.log(
@@ -172,4 +172,4 @@ Run: gpc update`);
172
172
  export {
173
173
  registerUpdateCommand
174
174
  };
175
- //# sourceMappingURL=update-PDYA3B45.js.map
175
+ //# sourceMappingURL=update-WA6X6LNQ.js.map
@@ -7,7 +7,7 @@ import "./chunk-3SJ6OXCZ.js";
7
7
  // src/commands/version.ts
8
8
  function registerVersionCommand(program) {
9
9
  program.command("version").description("Show version information").action(() => {
10
- const version = "0.9.59";
10
+ const version = "0.9.60";
11
11
  if (program.opts()["output"] === "json") {
12
12
  console.log(
13
13
  JSON.stringify({
@@ -25,4 +25,4 @@ function registerVersionCommand(program) {
25
25
  export {
26
26
  registerVersionCommand
27
27
  };
28
- //# sourceMappingURL=version-FGBT5A7I.js.map
28
+ //# sourceMappingURL=version-DYTSDZH2.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gpc-cli/cli",
3
- "version": "0.9.59",
3
+ "version": "0.9.60",
4
4
  "description": "GPC — Google Play Console CLI. 217 API endpoints including Managed Google Play. Upload AABs, manage releases, monitor vitals, publish private enterprise apps. Fastlane alternative for Android.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,11 +19,11 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "commander": "^14.0.3",
22
- "@gpc-cli/api": "1.0.34",
23
- "@gpc-cli/auth": "0.9.12",
24
- "@gpc-cli/config": "0.9.12",
25
- "@gpc-cli/core": "0.9.49",
26
- "@gpc-cli/plugin-sdk": "0.9.8"
22
+ "@gpc-cli/api": "1.0.35",
23
+ "@gpc-cli/auth": "0.9.13",
24
+ "@gpc-cli/config": "0.9.13",
25
+ "@gpc-cli/core": "0.9.50",
26
+ "@gpc-cli/plugin-sdk": "0.9.9"
27
27
  },
28
28
  "keywords": [
29
29
  "google-play",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/plugins.ts","../src/program.ts","../src/error-handler.ts"],"sourcesContent":["import { PluginManager, discoverPlugins } from \"@gpc-cli/core\";\nimport type { Command } from \"commander\";\n\n/**\n * Load and initialize all plugins.\n * First-party plugins (@gpc-cli/*) are auto-trusted.\n * Third-party plugins require prior approval stored in config.\n * Plugin loading is disabled in standalone binary mode.\n */\nexport async function loadPlugins(): Promise<PluginManager> {\n const manager = new PluginManager();\n\n // Standalone binary cannot resolve external npm packages at runtime\n if (process.env[\"__GPC_BINARY\"] === \"1\") {\n return manager;\n }\n\n try {\n const { loadConfig } = await import(\"@gpc-cli/config\");\n const config = await loadConfig();\n const plugins = await discoverPlugins({ configPlugins: config.plugins });\n const approved = new Set(config.approvedPlugins ?? []);\n\n for (const plugin of plugins) {\n const isTrusted = plugin.name.startsWith(\"@gpc-cli/\");\n\n if (!isTrusted && !approved.has(plugin.name)) {\n // Skip unapproved third-party plugins silently in non-interactive mode\n // In interactive mode, the user would run `gpc plugins approve <name>` first\n const isQuiet = process.argv.includes(\"--quiet\") || process.argv.includes(\"-q\");\n if (!isQuiet) {\n console.error(\n `Plugin \"${plugin.name}\" is not approved. Run: gpc plugins approve ${plugin.name}`,\n );\n }\n continue;\n }\n\n try {\n await manager.load(plugin);\n } catch {\n // Skip plugins that fail to load — don't block the CLI\n }\n }\n } catch {\n // Config loading failure shouldn't block plugin-free commands\n }\n\n return manager;\n}\n\n/**\n * Register plugin-defined commands with the Commander program.\n */\nexport function registerPluginCommands(program: Command, manager: PluginManager): void {\n for (const def of manager.getRegisteredCommands()) {\n const cmd = program.command(def.name).description(def.description);\n\n if (def.arguments) {\n for (const arg of def.arguments) {\n const syntax = arg.required ? `<${arg.name}>` : `[${arg.name}]`;\n cmd.argument(syntax, arg.description);\n }\n }\n\n if (def.options) {\n for (const opt of def.options) {\n cmd.option(\n opt.flags,\n opt.description,\n opt.defaultValue as string | boolean | string[] | undefined,\n );\n }\n }\n\n cmd.action(async (...rawArgs: unknown[]) => {\n const opts = rawArgs[rawArgs.length - 2] as Record<string, unknown>;\n const args: Record<string, unknown> = {};\n\n if (def.arguments) {\n def.arguments.forEach((argDef, i) => {\n args[argDef.name] = rawArgs[i];\n });\n }\n\n await def.action(args, opts);\n });\n }\n}\n","import { Command } from \"commander\";\nimport type { PluginManager } from \"@gpc-cli/core\";\nimport type { CommandEvent, CommandResult } from \"@gpc-cli/plugin-sdk\";\nimport { registerPluginCommands } from \"./plugins.js\";\n\nexport async function createProgram(pluginManager?: PluginManager): Promise<Command> {\n const program = new Command();\n\n program\n .name(\"gpc\")\n .description(\"GPC — Google Play Console CLI\")\n .version(process.env[\"__GPC_VERSION\"] || \"0.0.0\", \"-V, --version\")\n .option(\"-o, --output <format>\", \"Output format: table, json, yaml, markdown, junit\")\n .option(\"-v, --verbose\", \"Enable debug logging\")\n .option(\"-q, --quiet\", \"Suppress non-essential output\")\n .option(\"-a, --app <package>\", \"App package name\")\n .option(\"-p, --profile <name>\", \"Auth profile name\")\n .option(\"--no-color\", \"Disable colored output\")\n .option(\"--no-interactive\", \"Disable interactive prompts\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--dry-run\", \"Preview changes without executing\")\n .option(\"--notify [target]\", \"Send webhook notification on completion (slack, discord, custom)\")\n .option(\"--ci\", \"Force CI mode (JSON output, no prompts, strict exit codes)\")\n .option(\"-j, --json\", \"Shorthand for --output json\")\n .option(\"--apps <csv>\", \"Comma-separated package names for multi-app operations\")\n .showSuggestionAfterError(false);\n\n const commandLoaders: Record<string, () => Promise<void>> = {\n auth: async () => {\n (await import(\"./commands/auth.js\")).registerAuthCommands(program);\n },\n config: async () => {\n (await import(\"./commands/config.js\")).registerConfigCommands(program);\n },\n doctor: async () => {\n (await import(\"./commands/doctor.js\")).registerDoctorCommand(program);\n },\n update: async () => {\n (await import(\"./commands/update.js\")).registerUpdateCommand(program);\n },\n docs: async () => {\n (await import(\"./commands/docs.js\")).registerDocsCommand(program);\n },\n changelog: async () => {\n (await import(\"./commands/changelog.js\")).registerChangelogCommand(program);\n },\n completion: async () => {\n (await import(\"./commands/completion.js\")).registerCompletionCommand(program, async () => {\n // Force-load every non-completion command so the introspection walker\n // sees the full tree (including plugins registered later in createProgram).\n await Promise.all(\n Object.entries(commandLoaders)\n .filter(([name]) => name !== \"completion\")\n .map(([, loader]) => loader()),\n );\n });\n },\n apps: async () => {\n (await import(\"./commands/apps.js\")).registerAppsCommands(program);\n },\n releases: async () => {\n (await import(\"./commands/releases.js\")).registerReleasesCommands(program);\n },\n tracks: async () => {\n (await import(\"./commands/tracks.js\")).registerTracksCommands(program);\n },\n status: async () => {\n (await import(\"./commands/status.js\")).registerStatusCommand(program);\n },\n listings: async () => {\n (await import(\"./commands/listings.js\")).registerListingsCommands(program);\n },\n reviews: async () => {\n (await import(\"./commands/reviews.js\")).registerReviewsCommands(program);\n },\n vitals: async () => {\n (await import(\"./commands/vitals.js\")).registerVitalsCommands(program);\n },\n subscriptions: async () => {\n (await import(\"./commands/subscriptions.js\")).registerSubscriptionsCommands(program);\n },\n iap: async () => {\n (await import(\"./commands/iap.js\")).registerIapCommands(program);\n },\n purchases: async () => {\n (await import(\"./commands/purchases.js\")).registerPurchasesCommands(program);\n },\n pricing: async () => {\n (await import(\"./commands/pricing.js\")).registerPricingCommands(program);\n },\n reports: async () => {\n (await import(\"./commands/reports.js\")).registerReportsCommands(program);\n },\n users: async () => {\n (await import(\"./commands/users.js\")).registerUsersCommands(program);\n },\n testers: async () => {\n (await import(\"./commands/testers.js\")).registerTestersCommands(program);\n },\n validate: async () => {\n (await import(\"./commands/validate.js\")).registerValidateCommand(program);\n },\n publish: async () => {\n (await import(\"./commands/publish.js\")).registerPublishCommand(program);\n },\n recovery: async () => {\n (await import(\"./commands/recovery.js\")).registerRecoveryCommands(program);\n },\n \"data-safety\": async () => {\n (await import(\"./commands/data-safety.js\")).registerDataSafetyCommands(program);\n },\n \"external-transactions\": async () => {\n (await import(\"./commands/external-transactions.js\")).registerExternalTransactionsCommands(\n program,\n );\n },\n \"device-tiers\": async () => {\n (await import(\"./commands/device-tiers.js\")).registerDeviceTiersCommands(program);\n },\n \"one-time-products\": async () => {\n (await import(\"./commands/one-time-products.js\")).registerOneTimeProductsCommands(program);\n },\n \"internal-sharing\": async () => {\n (await import(\"./commands/internal-sharing.js\")).registerInternalSharingCommands(program);\n },\n \"generated-apks\": async () => {\n (await import(\"./commands/generated-apks.js\")).registerGeneratedApksCommands(program);\n },\n \"system-apks\": async () => {\n (await import(\"./commands/system-apks.js\")).registerSystemApksCommands(program);\n },\n \"purchase-options\": async () => {\n (await import(\"./commands/purchase-options.js\")).registerPurchaseOptionsCommands(program);\n },\n bundle: async () => {\n (await import(\"./commands/bundle.js\")).registerBundleCommands(program);\n },\n audit: async () => {\n (await import(\"./commands/audit.js\")).registerAuditCommands(program);\n },\n migrate: async () => {\n (await import(\"./commands/migrate.js\")).registerMigrateCommands(program);\n },\n anomalies: async () => {\n (await import(\"./commands/anomalies.js\")).registerAnomaliesCommands(program);\n },\n \"install-skills\": async () => {\n (await import(\"./commands/install-skills.js\")).registerInstallSkillsCommand(program);\n },\n verify: async () => {\n (await import(\"./commands/verify.js\")).registerVerifyCommand(program);\n },\n version: async () => {\n (await import(\"./commands/version.js\")).registerVersionCommand(program);\n },\n cache: async () => {\n (await import(\"./commands/cache.js\")).registerCacheCommand(program);\n },\n feedback: async () => {\n (await import(\"./commands/feedback.js\")).registerFeedbackCommand(program);\n },\n quickstart: async () => {\n (await import(\"./commands/quickstart.js\")).registerQuickstartCommand(program);\n },\n grants: async () => {\n (await import(\"./commands/grants.js\")).registerGrantsCommands(program);\n },\n train: async () => {\n (await import(\"./commands/train.js\")).registerTrainCommands(program);\n },\n quota: async () => {\n (await import(\"./commands/quota.js\")).registerQuotaCommand(program);\n },\n games: async () => {\n (await import(\"./commands/games.js\")).registerGamesCommands(program);\n },\n enterprise: async () => {\n (await import(\"./commands/enterprise.js\")).registerEnterpriseCommands(program);\n },\n diff: async () => {\n (await import(\"./commands/diff.js\")).registerDiffCommand(program);\n },\n init: async () => {\n (await import(\"./commands/init.js\")).registerInitCommand(program);\n },\n preflight: async () => {\n (await import(\"./commands/preflight.js\")).registerPreflightCommand(program);\n },\n plugins: async () => {\n registerPluginsCommand(program, pluginManager);\n },\n rtdn: async () => {\n (await import(\"./commands/rtdn.js\")).registerRtdnCommands(program);\n },\n };\n\n // \"Did you mean?\" suggestions for unknown commands\n function levenshtein(a: string, b: string): number {\n const m = a.length,\n n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, (_, i) =>\n Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)),\n );\n const cell = (r: number, c: number): number => dp[r]?.[c] ?? 0;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n (dp[i] as number[])[j] =\n a[i - 1] === b[j - 1]\n ? cell(i - 1, j - 1)\n : 1 + Math.min(cell(i - 1, j), cell(i, j - 1), cell(i - 1, j - 1));\n }\n }\n return cell(m, n);\n }\n\n program.on(\"command:*\", (operands: string[]) => {\n const cmd = operands[0] ?? \"\";\n const names = Object.keys(commandLoaders);\n const best = names\n .map((name) => ({ name, d: levenshtein(cmd, name) }))\n .sort((a, b) => a.d - b.d)[0];\n console.error(`Error: Unknown command \"${cmd}\".`);\n if (best && best.d <= 3) console.error(`Did you mean: gpc ${best.name}?`);\n console.error(`Run \"gpc --help\" to see all commands.`);\n process.exit(2);\n });\n\n // Resolve command aliases for lazy loading\n const commandAliases: Record<string, string> = {\n \"ext-txn\": \"external-transactions\",\n otp: \"one-time-products\",\n };\n\n const rawTarget = process.argv[2];\n const target = rawTarget ? (commandAliases[rawTarget] ?? rawTarget) : undefined;\n\n const loader = target ? commandLoaders[target] : undefined;\n if (loader) {\n await loader();\n } else {\n await Promise.all(Object.values(commandLoaders).map((loader) => loader()));\n }\n\n // Register plugin-defined commands\n if (pluginManager) {\n registerPluginCommands(program, pluginManager);\n }\n\n // Wire plugin lifecycle hooks around command execution\n if (pluginManager) {\n wrapCommandHooks(program, pluginManager);\n }\n\n return program;\n}\n\n/**\n * `gpc plugins` — manage plugins.\n */\nfunction registerPluginsCommand(program: Command, manager?: PluginManager): void {\n const cmd = program.command(\"plugins\").description(\"Manage plugins\");\n\n cmd\n .command(\"list\")\n .description(\"List loaded plugins\")\n .action(() => {\n const plugins = manager?.getLoadedPlugins() ?? [];\n const opts = program.opts();\n\n if (opts[\"output\"] === \"json\") {\n console.log(JSON.stringify(plugins, null, 2));\n return;\n }\n\n if (plugins.length === 0) {\n console.log(\"No plugins loaded.\");\n console.log('\\nConfigure plugins in .gpcrc.json: { \"plugins\": [\"@gpc-cli/plugin-ci\"] }');\n return;\n }\n\n console.log(\"Loaded plugins:\\n\");\n for (const p of plugins) {\n const trust = p.trusted ? \"trusted\" : \"third-party\";\n console.log(` ${p.name}@${p.version} (${trust})`);\n }\n\n const commands = manager?.getRegisteredCommands() ?? [];\n if (commands.length > 0) {\n console.log(\"\\nPlugin commands:\\n\");\n for (const c of commands) {\n console.log(` gpc ${c.name} — ${c.description}`);\n }\n }\n });\n\n cmd\n .command(\"init <name>\")\n .description(\"Scaffold a new plugin project\")\n .option(\"-d, --dir <path>\", \"Output directory (defaults to ./gpc-plugin-<name>)\")\n .option(\"--description <text>\", \"Plugin description\")\n .action(async (name: string, opts: { dir?: string; description?: string }) => {\n const { scaffoldPlugin } = await import(\"@gpc-cli/core\");\n const pluginName = name.startsWith(\"gpc-plugin-\") ? name : `gpc-plugin-${name}`;\n const dir = opts.dir ?? `./${pluginName}`;\n\n const result = await scaffoldPlugin({ name, dir, description: opts.description });\n\n console.log(`Plugin scaffolded at ${result.dir}/\\n`);\n console.log(\"Files created:\");\n for (const f of result.files) {\n console.log(` ${f}`);\n }\n console.log(`\\nNext steps:`);\n console.log(` cd ${pluginName}`);\n console.log(` npm install`);\n console.log(` npm run build`);\n console.log(` npm test`);\n });\n\n cmd\n .command(\"approve <name>\")\n .description(\"Approve a third-party plugin for loading\")\n .action(async (name: string) => {\n const { approvePlugin } = await import(\"@gpc-cli/config\");\n await approvePlugin(name);\n console.log(`Plugin \"${name}\" approved. It will be loaded on next run.`);\n });\n\n cmd\n .command(\"revoke <name>\")\n .description(\"Revoke approval for a third-party plugin\")\n .action(async (name: string) => {\n const { revokePluginApproval } = await import(\"@gpc-cli/config\");\n const removed = await revokePluginApproval(name);\n if (removed) {\n console.log(`Plugin \"${name}\" approval revoked.`);\n } else {\n console.log(`Plugin \"${name}\" was not in the approved list.`);\n }\n });\n\n const REGISTRY_URL =\n \"https://raw.githubusercontent.com/yasserstudio/gpc-plugins/main/registry.json\";\n\n interface RegistryPlugin {\n name: string;\n description: string;\n version: string;\n author?: string;\n tags?: string[];\n }\n\n cmd\n .command(\"search [query]\")\n .description(\"Search the GPC plugin registry\")\n .action(async (query?: string) => {\n try {\n const res = await fetch(REGISTRY_URL);\n if (!res.ok) throw new Error(`Registry fetch failed: ${res.status}`);\n const plugins = (await res.json()) as RegistryPlugin[];\n const filtered = query\n ? plugins.filter(\n (p) =>\n p.name.includes(query) ||\n p.description?.toLowerCase().includes(query.toLowerCase()),\n )\n : plugins;\n\n if (filtered.length === 0) {\n console.log(`No plugins found${query ? ` matching \"${query}\"` : \"\"}.`);\n return;\n }\n\n for (const p of filtered) {\n console.log(` ${p.name}@${p.version}`);\n if (p.description) console.log(` ${p.description}`);\n }\n console.log(`\\nInstall: gpc plugins install <name>`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n cmd\n .command(\"install <name>\")\n .description(\"Install a plugin from npm\")\n .action(async (name: string) => {\n const { spawnSync } = await import(\"node:child_process\");\n console.log(`Installing plugin \"${name}\"...`);\n try {\n // Use spawnSync with an array to avoid shell injection — no shell is invoked\n const result = spawnSync(\"npm\", [\"install\", \"-g\", name], { stdio: \"inherit\" });\n if (result.status !== 0) {\n throw new Error(`npm install exited with code ${result.status ?? \"unknown\"}`);\n }\n const { approvePlugin } = await import(\"@gpc-cli/config\");\n await approvePlugin(name);\n console.log(`\\nPlugin \"${name}\" installed and approved. It will be loaded on next run.`);\n console.log(`Configure it in .gpcrc.json: { \"plugins\": [\"${name}\"] }`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n cmd\n .command(\"uninstall <name>\")\n .description(\"Uninstall a plugin and revoke its approval\")\n .action(async (name: string) => {\n const { spawnSync } = await import(\"node:child_process\");\n console.log(`Uninstalling plugin \"${name}\"...`);\n try {\n // Use spawnSync with an array to avoid shell injection — no shell is invoked\n const result = spawnSync(\"npm\", [\"uninstall\", \"-g\", name], { stdio: \"inherit\" });\n if (result.status !== 0) {\n throw new Error(`npm uninstall exited with code ${result.status ?? \"unknown\"}`);\n }\n const { revokePluginApproval } = await import(\"@gpc-cli/config\");\n await revokePluginApproval(name);\n console.log(`\\nPlugin \"${name}\" uninstalled and approval revoked.`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n\n/**\n * Wrap all registered commands so plugin hooks fire before/after each command.\n */\nfunction wrapCommandHooks(program: Command, manager: PluginManager): void {\n program.hook(\"preAction\", async (thisCommand) => {\n const event: CommandEvent = {\n command: getFullCommandName(thisCommand),\n args: thisCommand.opts(),\n app: program.opts()[\"app\"] as string | undefined,\n startedAt: new Date(),\n };\n\n // Store on the command for afterCommand/onError\n (thisCommand as unknown as Record<string, unknown>)[\"__pluginEvent\"] = event;\n\n await manager.runBeforeCommand(event);\n });\n\n program.hook(\"postAction\", async (thisCommand) => {\n const event: CommandEvent = (thisCommand as unknown as Record<string, unknown>)[\n \"__pluginEvent\"\n ] as CommandEvent;\n if (!event) return;\n\n const result: CommandResult = {\n success: true,\n durationMs: Date.now() - event.startedAt.getTime(),\n exitCode: 0,\n };\n\n await manager.runAfterCommand(event, result);\n });\n}\n\nfunction getFullCommandName(cmd: Command): string {\n const parts: string[] = [];\n let current: Command | null = cmd;\n while (current && current.name() !== \"gpc\") {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n","/**\n * Shared error formatting for CLI output.\n * Extracts error code, message, and suggestion from typed errors (GpcError, AuthError, ApiError, ConfigError).\n */\n\ninterface TypedError {\n message: string;\n code?: string;\n suggestion?: string;\n exitCode?: number;\n /** When true, error handler prints nothing (e.g., user-aborted operations). */\n silent?: boolean;\n}\n\nfunction isTypedError(error: unknown): error is Error & TypedError {\n return (\n error instanceof Error && \"code\" in error && typeof (error as TypedError).code === \"string\"\n );\n}\n\nconst AUTH_KEYWORDS = [\"AUTH\", \"UNAUTHENTICATED\", \"PERMISSION_DENIED\", \"401\", \"403\"];\n\nfunction isAuthRelatedError(error: unknown): boolean {\n if (isTypedError(error)) {\n // Update errors hit GitHub, not Google Play — never an auth issue\n if (error.code?.startsWith(\"UPDATE_\")) return false;\n if (error.exitCode === 3) return true;\n if (error.code && AUTH_KEYWORDS.some((k) => error.code?.includes(k))) return true;\n }\n const msg = error instanceof Error ? error.message : String(error);\n return AUTH_KEYWORDS.some((k) => msg.includes(k));\n}\n\n/**\n * Format an error for CLI output. Prints:\n * Error [CODE]: message\n * Suggestion: suggestion (if available)\n *\n * Returns the appropriate exit code.\n */\nexport function handleCliError(error: unknown): number {\n // Silent errors (e.g., user abort) — don't print anything\n if (isTypedError(error) && error.silent) {\n return error.exitCode ?? 0;\n }\n\n const authHint = isAuthRelatedError(error)\n ? \"\\n\\u2192 Run gpc doctor to diagnose your credentials.\"\n : \"\";\n\n if (isTypedError(error)) {\n console.error(`Error [${error.code}]: ${error.message}`);\n if (error.suggestion) {\n console.error(`Suggestion: ${error.suggestion}`);\n }\n if (authHint) console.error(authHint);\n return error.exitCode ?? 1;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n if (authHint) console.error(authHint);\n return 1;\n}\n"],"mappings":"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","names":["loader","_"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/completion.ts"],"sourcesContent":["import type { Command, Option } from \"commander\";\n\nexport type ShellType = \"bash\" | \"zsh\" | \"fish\" | \"powershell\";\n\nexport const SUPPORTED_SHELLS: readonly ShellType[] = [\n \"bash\",\n \"zsh\",\n \"fish\",\n \"powershell\",\n] as const;\n\nexport interface OptionDef {\n flags: string;\n long?: string;\n short?: string;\n description: string;\n choices?: string[];\n takesValue: boolean;\n}\n\nexport interface CommandDef {\n description: string;\n subcommands?: Record<string, CommandDef>;\n options?: OptionDef[];\n}\n\n/**\n * Hand-maintained fallback tree. Used by unit tests and as a safety net when\n * the walker cannot introspect the program (e.g. when the generator is called\n * without a live Command instance). Runtime `gpc completion <shell>` uses the\n * introspected tree from `buildCommandTreeFromProgram` so new commands and\n * plugins auto-complete without requiring edits here.\n */\nexport function getCommandTree(): Record<string, CommandDef> {\n return {\n auth: {\n description: \"Manage authentication\",\n subcommands: {\n login: { description: \"Authenticate with Google Play Developer API\" },\n status: { description: \"Show current authentication status\" },\n logout: { description: \"Remove stored credentials\" },\n whoami: { description: \"Show the authenticated account\" },\n },\n },\n config: {\n description: \"Manage configuration\",\n subcommands: {\n init: { description: \"Create a configuration file\" },\n show: { description: \"Show current configuration\" },\n set: { description: \"Set a configuration value\" },\n path: { description: \"Show the configuration file path\" },\n },\n },\n apps: {\n description: \"Manage applications\",\n subcommands: {\n info: { description: \"Show app details\" },\n update: { description: \"Update app details\" },\n list: { description: \"List configured applications\" },\n },\n },\n releases: {\n description: \"Manage releases and rollouts\",\n subcommands: {\n upload: { description: \"Upload AAB/APK and assign to a track\" },\n status: { description: \"Show current release status across tracks\" },\n promote: { description: \"Promote a release from one track to another\" },\n rollout: {\n description: \"Manage staged rollouts\",\n subcommands: {\n increase: { description: \"Increase a staged rollout\" },\n halt: { description: \"Halt a staged rollout\" },\n resume: { description: \"Resume a staged rollout\" },\n complete: { description: \"Complete a staged rollout\" },\n },\n },\n notes: { description: \"Set release notes\" },\n },\n },\n tracks: {\n description: \"Manage tracks\",\n subcommands: {\n list: { description: \"List all tracks\" },\n },\n },\n status: { description: \"Cross-track release overview\" },\n listings: {\n description: \"Manage store listings and metadata\",\n subcommands: {\n get: { description: \"Get store listing(s)\" },\n update: { description: \"Update a store listing\" },\n delete: { description: \"Delete a store listing for a language\" },\n pull: { description: \"Download listings to Fastlane-format directory\" },\n push: { description: \"Upload listings from Fastlane-format directory\" },\n images: {\n description: \"Manage listing images\",\n subcommands: {\n list: { description: \"List images for a language and type\" },\n upload: { description: \"Upload an image\" },\n delete: { description: \"Delete an image\" },\n },\n },\n availability: { description: \"Get country availability for a track\" },\n },\n },\n reviews: {\n description: \"Manage user reviews and ratings\",\n subcommands: {\n list: { description: \"List user reviews\" },\n get: { description: \"Get a single review\" },\n reply: { description: \"Reply to a review\" },\n export: { description: \"Export reviews to JSON or CSV\" },\n },\n },\n vitals: {\n description: \"Monitor app vitals and performance metrics\",\n subcommands: {\n overview: { description: \"Dashboard summary of all vital metrics\" },\n crashes: { description: \"Query crash rate metrics\" },\n anr: { description: \"Query ANR rate metrics\" },\n startup: { description: \"Query slow startup metrics\" },\n rendering: { description: \"Query slow rendering metrics\" },\n battery: { description: \"Query excessive wakeup metrics\" },\n memory: { description: \"Query stuck wakelock metrics\" },\n anomalies: { description: \"Detect anomalies in app vitals\" },\n errors: {\n description: \"Search and view error issues\",\n subcommands: {\n search: { description: \"Search error issues\" },\n },\n },\n compare: { description: \"Compare metric trend between periods\" },\n },\n },\n subscriptions: {\n description: \"Manage subscriptions and base plans\",\n subcommands: {\n list: { description: \"List subscriptions\" },\n get: { description: \"Get a subscription\" },\n create: { description: \"Create a subscription from JSON file\" },\n update: { description: \"Update a subscription from JSON file\" },\n delete: { description: \"Delete a subscription\" },\n \"base-plans\": {\n description: \"Manage base plans\",\n subcommands: {\n activate: { description: \"Activate a base plan\" },\n deactivate: { description: \"Deactivate a base plan\" },\n delete: { description: \"Delete a base plan\" },\n \"migrate-prices\": { description: \"Migrate base plan prices\" },\n },\n },\n offers: {\n description: \"Manage subscription offers\",\n subcommands: {\n list: { description: \"List offers for a base plan\" },\n get: { description: \"Get an offer\" },\n create: { description: \"Create an offer from JSON file\" },\n update: { description: \"Update an offer from JSON file\" },\n delete: { description: \"Delete an offer\" },\n activate: { description: \"Activate an offer\" },\n deactivate: { description: \"Deactivate an offer\" },\n },\n },\n },\n },\n iap: {\n description: \"Manage in-app products\",\n subcommands: {\n list: { description: \"List in-app products\" },\n get: { description: \"Get an in-app product\" },\n create: { description: \"Create an in-app product from JSON file\" },\n update: { description: \"Update an in-app product from JSON file\" },\n delete: { description: \"Delete an in-app product\" },\n sync: { description: \"Sync in-app products from a directory\" },\n },\n },\n purchases: {\n description: \"Manage purchases and orders\",\n subcommands: {\n get: { description: \"Get a product purchase\" },\n acknowledge: { description: \"Acknowledge a product purchase\" },\n consume: { description: \"Consume a product purchase\" },\n subscription: {\n description: \"Manage subscription purchases\",\n subcommands: {\n get: { description: \"Get a subscription purchase\" },\n cancel: { description: \"Cancel a subscription\" },\n defer: { description: \"Defer a subscription expiry\" },\n revoke: { description: \"Revoke a subscription\" },\n },\n },\n voided: { description: \"List voided purchases\" },\n orders: {\n description: \"Manage orders\",\n subcommands: {\n refund: { description: \"Refund an order\" },\n },\n },\n },\n },\n pricing: {\n description: \"Pricing and regional price conversion\",\n subcommands: {\n convert: { description: \"Convert a price to all regional prices\" },\n },\n },\n reports: {\n description: \"Download financial and stats reports\",\n subcommands: {\n list: { description: \"List available report buckets\" },\n download: {\n description: \"Download a report\",\n subcommands: {\n financial: { description: \"Download a financial report\" },\n stats: { description: \"Download a stats report\" },\n },\n },\n },\n },\n users: {\n description: \"Manage developer account users and permissions\",\n subcommands: {\n list: { description: \"List all users in the developer account\" },\n get: { description: \"Get user details\" },\n invite: { description: \"Invite a user to the developer account\" },\n update: { description: \"Update user permissions\" },\n remove: { description: \"Remove a user from the developer account\" },\n },\n },\n testers: {\n description: \"Manage testers and tester groups\",\n subcommands: {\n list: { description: \"List testers for a track\" },\n add: { description: \"Add testers to a track\" },\n remove: { description: \"Remove testers from a track\" },\n import: { description: \"Import testers from a CSV file\" },\n },\n },\n recovery: {\n description: \"Manage app recovery actions\",\n subcommands: {\n list: { description: \"List app recovery actions\" },\n cancel: { description: \"Cancel a recovery action\" },\n deploy: { description: \"Deploy a recovery action\" },\n create: { description: \"Create a recovery action\" },\n \"add-targeting\": { description: \"Add targeting to a recovery action\" },\n },\n },\n \"data-safety\": {\n description: \"Manage data safety declarations\",\n subcommands: {\n get: { description: \"Get data safety declaration\" },\n update: { description: \"Update data safety declaration\" },\n export: { description: \"Export data safety declaration\" },\n },\n },\n \"external-transactions\": {\n description: \"Manage external transactions\",\n subcommands: {\n create: { description: \"Create an external transaction\" },\n get: { description: \"Get an external transaction\" },\n refund: { description: \"Refund an external transaction\" },\n },\n },\n \"device-tiers\": {\n description: \"Manage device tier configurations\",\n subcommands: {\n list: { description: \"List device tier configurations\" },\n get: { description: \"Get a device tier configuration\" },\n create: { description: \"Create a device tier configuration\" },\n },\n },\n \"one-time-products\": {\n description: \"Manage one-time products\",\n subcommands: {\n list: { description: \"List one-time products\" },\n get: { description: \"Get a one-time product\" },\n create: { description: \"Create a one-time product\" },\n update: { description: \"Update a one-time product\" },\n delete: { description: \"Delete a one-time product\" },\n offers: {\n description: \"Manage one-time product offers\",\n subcommands: {\n list: { description: \"List offers for a one-time product\" },\n get: { description: \"Get a one-time product offer\" },\n create: { description: \"Create a one-time product offer\" },\n update: { description: \"Update a one-time product offer\" },\n delete: { description: \"Delete a one-time product offer\" },\n },\n },\n },\n },\n \"internal-sharing\": {\n description: \"Manage internal app sharing\",\n subcommands: {\n upload: { description: \"Upload an artifact for internal sharing\" },\n },\n },\n \"generated-apks\": {\n description: \"Manage generated APKs from app bundles\",\n subcommands: {\n list: { description: \"List generated APKs for a version\" },\n download: { description: \"Download a generated APK\" },\n },\n },\n doctor: { description: \"Verify setup and connectivity\" },\n docs: { description: \"Open documentation in browser\" },\n validate: { description: \"Pre-submission validation checks\" },\n publish: { description: \"Validate, upload, and release in one step\" },\n completion: {\n description: \"Generate shell completions\",\n subcommands: {\n bash: { description: \"Generate bash completions\" },\n zsh: { description: \"Generate zsh completions\" },\n fish: { description: \"Generate fish completions\" },\n powershell: { description: \"Generate PowerShell completions\" },\n },\n },\n plugins: {\n description: \"Manage plugins\",\n subcommands: {\n list: { description: \"List loaded plugins\" },\n init: { description: \"Scaffold a new plugin project\" },\n approve: { description: \"Approve a third-party plugin for loading\" },\n revoke: { description: \"Revoke approval for a third-party plugin\" },\n },\n },\n };\n}\n\n/** Map a Commander Option to an OptionDef used by the shell generators. */\nfunction optionToDef(opt: Option): OptionDef {\n const flags = opt.flags;\n // Commander exposes parsed long/short on the Option; fall back to parsing `.flags` if missing.\n const long = opt.long ?? undefined;\n const short = opt.short ?? undefined;\n // `takesValue` is true when the raw flags contain <placeholder> or [placeholder].\n const takesValue = /[<[][^>\\]]+[>\\]]/.test(flags);\n // Commander 14 exposes `.argChoices`; fall back gracefully if absent.\n const rawChoices = (opt as unknown as { argChoices?: readonly string[] }).argChoices;\n const choices = rawChoices && rawChoices.length > 0 ? Array.from(rawChoices) : undefined;\n return {\n flags,\n long: long ?? undefined,\n short: short ?? undefined,\n description: opt.description ?? \"\",\n choices,\n takesValue,\n };\n}\n\n/** Recursively walk a Commander Command into the completion tree shape. */\nfunction commandToDef(cmd: Command): CommandDef {\n const def: CommandDef = {\n description: cmd.description() ?? \"\",\n };\n const options = cmd.options\n .filter((o) => !o.hidden)\n .map(optionToDef)\n .filter((o) => o.long || o.short);\n if (options.length > 0) {\n def.options = options;\n }\n const subs = cmd.commands.filter((c) => c.name() !== \"help\");\n if (subs.length > 0) {\n def.subcommands = {};\n for (const sub of subs) {\n def.subcommands[sub.name()] = commandToDef(sub);\n }\n }\n return def;\n}\n\n/** Build a completion tree by introspecting a fully-loaded Commander program. */\nexport function buildCommandTreeFromProgram(program: Command): Record<string, CommandDef> {\n const tree: Record<string, CommandDef> = {};\n for (const cmd of program.commands) {\n if (cmd.name() === \"help\") continue;\n tree[cmd.name()] = commandToDef(cmd);\n }\n return tree;\n}\n\n/** Collect global options declared on the root program. */\nexport function collectGlobalOptions(program: Command): OptionDef[] {\n return program.options\n .filter((o) => !o.hidden)\n .map(optionToDef)\n .filter((o) => o.long || o.short);\n}\n\nexport function registerCompletionCommand(\n program: Command,\n ensureAllCommandsLoaded?: () => Promise<void>,\n): void {\n const completion = program.command(\"completion\").description(\"Generate shell completions\");\n\n const generate = async (\n shell: ShellType,\n gen: (tree: Record<string, CommandDef>, globals: OptionDef[]) => string,\n ): Promise<void> => {\n if (ensureAllCommandsLoaded) {\n await ensureAllCommandsLoaded();\n }\n const tree = ensureAllCommandsLoaded ? buildCommandTreeFromProgram(program) : getCommandTree();\n const globals = collectGlobalOptions(program);\n // Suppress unused-shell warning; shell type reserved for future per-shell tuning.\n void shell;\n console.log(gen(tree, globals));\n };\n\n completion\n .command(\"bash\")\n .description(\"Generate bash completions\")\n .action(async () => {\n await generate(\"bash\", generateBashCompletions);\n });\n\n completion\n .command(\"zsh\")\n .description(\"Generate zsh completions\")\n .action(async () => {\n await generate(\"zsh\", generateZshCompletions);\n });\n\n completion\n .command(\"fish\")\n .description(\"Generate fish completions\")\n .action(async () => {\n await generate(\"fish\", generateFishCompletions);\n });\n\n completion\n .command(\"powershell\")\n .description(\"Generate PowerShell completions\")\n .action(async () => {\n await generate(\"powershell\", generatePowerShellCompletions);\n });\n}\n\n/**\n * Return only options that have choices or long flags useful for completion\n * suggestion. `-V/--version` and `-h/--help` are filtered out to avoid noise.\n */\nfunction completableOptions(options: OptionDef[] | undefined): OptionDef[] {\n if (!options) return [];\n return options.filter((o) => {\n if (!o.long) return false;\n if (o.long === \"--help\" || o.long === \"--version\") return false;\n return true;\n });\n}\n\nexport function generateBashCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const topLevelNames = Object.keys(tree).join(\" \");\n\n const globalFlags = completableOptions(globals)\n .map((o) => o.long ?? \"\")\n .filter(Boolean)\n .join(\" \");\n\n // Build case entries for each command that has subcommands (up to 3 levels)\n // and emit flag completion branches for commands with options.\n const caseEntries: string[] = [];\n const flagCases: string[] = [];\n\n const allCommandNames = new Set<string>();\n const collectNames = (defs: Record<string, CommandDef>) => {\n for (const [name, def] of Object.entries(defs)) {\n allCommandNames.add(name);\n if (def.subcommands) collectNames(def.subcommands);\n }\n };\n collectNames(tree);\n\n for (const [cmd, def] of Object.entries(tree)) {\n if (def.subcommands) {\n const subNames = Object.keys(def.subcommands).join(\" \");\n caseEntries.push(\n ` ${cmd})\\n COMPREPLY=( $(compgen -W \"${subNames}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n const subSubNames = Object.keys(subDef.subcommands).join(\" \");\n caseEntries.push(\n ` ${sub})\\n COMPREPLY=( $(compgen -W \"${subSubNames}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n }\n\n // Collect flags that carry choices from this command + its subtree.\n const walk = (d: CommandDef) => {\n for (const opt of completableOptions(d.options)) {\n if (opt.choices && opt.long) {\n flagCases.push(\n ` ${opt.long})\\n COMPREPLY=( $(compgen -W \"${opt.choices.join(\" \")}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n if (d.subcommands) for (const s of Object.values(d.subcommands)) walk(s);\n };\n walk(def);\n }\n\n // Global-option choices (e.g. --output table|json|yaml|markdown|junit).\n for (const opt of completableOptions(globals)) {\n if (opt.choices && opt.long) {\n flagCases.push(\n ` ${opt.long})\\n COMPREPLY=( $(compgen -W \"${opt.choices.join(\" \")}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n\n return `# bash completion for gpc\n# Install: gpc completion bash >> ~/.bashrc\n_gpc() {\n local cur prev commands globals\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n\n commands=\"${topLevelNames}\"\n globals=\"${globalFlags}\"\n\n # Flag-value completion (choices)\n case \"\\${prev}\" in\n${flagCases.join(\"\\n\")}\n esac\n\n # When the current word starts with '-', complete known flags\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=( $(compgen -W \"\\${globals}\" -- \"\\${cur}\") )\n return 0\n fi\n\n case \"\\${prev}\" in\n gpc)\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n ;;\n${caseEntries.join(\"\\n\")}\n esac\n\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n}\n\ncomplete -F _gpc gpc`;\n}\n\nexport function generateZshCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const arrayDefs: string[] = [];\n const caseBranches: string[] = [];\n\n const topEntries = Object.entries(tree)\n .map(([name, def]) => ` '${name}:${escapeZsh(def.description)}'`)\n .join(\"\\n\");\n arrayDefs.push(` commands=(\\n${topEntries}\\n )`);\n\n for (const [cmd, def] of Object.entries(tree)) {\n if (def.subcommands) {\n const varName = `${cmd.replace(/-/g, \"_\")}_commands`;\n const entries = Object.entries(def.subcommands)\n .map(([name, sub]) => ` '${name}:${escapeZsh(sub.description)}'`)\n .join(\"\\n\");\n arrayDefs.push(` ${varName}=(\\n${entries}\\n )`);\n caseBranches.push(\n ` ${cmd})\\n _describe -t ${varName} '${cmd} commands' ${varName}\\n ;;`,\n );\n\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n const subVarName = `${cmd.replace(/-/g, \"_\")}_${sub.replace(/-/g, \"_\")}_commands`;\n const subEntries = Object.entries(subDef.subcommands)\n .map(([name, s]) => ` '${name}:${escapeZsh(s.description)}'`)\n .join(\"\\n\");\n arrayDefs.push(` ${subVarName}=(\\n${subEntries}\\n )`);\n }\n }\n }\n }\n\n const level3Cases: string[] = [];\n for (const [cmd, def] of Object.entries(tree)) {\n if (!def.subcommands) continue;\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n const subVarName = `${cmd.replace(/-/g, \"_\")}_${sub.replace(/-/g, \"_\")}_commands`;\n level3Cases.push(\n ` ${sub})\\n _describe -t ${subVarName} '${sub} commands' ${subVarName}\\n ;;`,\n );\n }\n }\n }\n\n const varNames: string[] = [\"commands\"];\n for (const [cmd, def] of Object.entries(tree)) {\n if (def.subcommands) {\n varNames.push(`${cmd.replace(/-/g, \"_\")}_commands`);\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n varNames.push(`${cmd.replace(/-/g, \"_\")}_${sub.replace(/-/g, \"_\")}_commands`);\n }\n }\n }\n }\n\n const localDecls = varNames.map((v) => ` local -a ${v}`).join(\"\\n\");\n\n // Flag entries — emit `_arguments`-style hints collected across the tree.\n // Keeps the existing `_describe` structure above; shell will still complete\n // commands first, but flags with choices are surfaced as hint comments that\n // power-users can read and some completers auto-detect. A fuller\n // `_arguments` integration is deferred to v0.9.59 (dynamic-value release).\n const flagHints: string[] = [];\n const walkFlags = (defs: Record<string, CommandDef>, path: string) => {\n for (const [name, def] of Object.entries(defs)) {\n for (const opt of completableOptions(def.options)) {\n if (opt.choices) {\n flagHints.push(\n `# ${path}${name} ${opt.long}: (${opt.choices.join(\" \")}) — ${escapeZsh(opt.description)}`,\n );\n }\n }\n if (def.subcommands) walkFlags(def.subcommands, `${path}${name} `);\n }\n };\n walkFlags(tree, \"\");\n for (const opt of completableOptions(globals)) {\n if (opt.choices) {\n flagHints.push(\n `# (global) ${opt.long}: (${opt.choices.join(\" \")}) — ${escapeZsh(opt.description)}`,\n );\n }\n }\n\n return `#compdef gpc\n# Install: gpc completion zsh > ~/.zsh/completions/_gpc\n${flagHints.length > 0 ? `\\n# --- Flag choices (reference) ---\\n${flagHints.join(\"\\n\")}\\n` : \"\"}\n_gpc() {\n${localDecls}\n\n${arrayDefs.join(\"\\n\\n\")}\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '2: :->subcommand' \\\\\n '3: :->subsubcommand' \\\\\n '*::arg:->args'\n\n case \"$state\" in\n command)\n _describe -t commands 'gpc commands' commands\n ;;\n subcommand)\n case \"$words[2]\" in\n${caseBranches.join(\"\\n\")}\n esac\n ;;\n subsubcommand)\n case \"$words[3]\" in\n${level3Cases.join(\"\\n\")}\n esac\n ;;\n esac\n}\n\n_gpc \"$@\"`;\n}\n\nexport function generateFishCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const lines: string[] = [\n \"# fish completions for gpc\",\n \"# Install: gpc completion fish > ~/.config/fish/completions/gpc.fish\",\n \"\",\n \"# Disable file completions by default\",\n \"complete -c gpc -f\",\n \"\",\n \"# Top-level commands\",\n ];\n\n for (const [cmd, def] of Object.entries(tree)) {\n lines.push(\n `complete -c gpc -n '__fish_use_subcommand' -a ${cmd} -d '${escapeFish(def.description)}'`,\n );\n }\n\n // Level 2 subcommands\n for (const [cmd, def] of Object.entries(tree)) {\n if (!def.subcommands) continue;\n lines.push(\"\");\n lines.push(`# ${cmd} subcommands`);\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n lines.push(\n `complete -c gpc -n '__fish_seen_subcommand_from ${cmd}; and not __fish_seen_subcommand_from ${Object.keys(def.subcommands).join(\" \")}' -a ${sub} -d '${escapeFish(subDef.description)}'`,\n );\n }\n\n // Level 3 subcommands\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (!subDef.subcommands) continue;\n lines.push(\"\");\n lines.push(`# ${cmd} ${sub} subcommands`);\n for (const [subsub, subsubDef] of Object.entries(subDef.subcommands)) {\n lines.push(\n `complete -c gpc -n '__fish_seen_subcommand_from ${sub}; and not __fish_seen_subcommand_from ${Object.keys(subDef.subcommands).join(\" \")}' -a ${subsub} -d '${escapeFish(subsubDef.description)}'`,\n );\n }\n }\n }\n\n // Global + per-command flag completions with choice lists.\n lines.push(\"\");\n lines.push(\"# Global flags\");\n for (const opt of completableOptions(globals)) {\n if (!opt.long) continue;\n const longName = opt.long.replace(/^--/, \"\");\n const shortName = opt.short ? opt.short.replace(/^-/, \"\") : undefined;\n const choiceArg = opt.choices ? ` -a '${opt.choices.join(\" \")}'` : \"\";\n const shortArg = shortName ? ` -s ${shortName}` : \"\";\n lines.push(\n `complete -c gpc -l ${longName}${shortArg} -d '${escapeFish(opt.description)}'${choiceArg}`,\n );\n }\n\n const walkFlags = (defs: Record<string, CommandDef>) => {\n for (const [name, def] of Object.entries(defs)) {\n const flags = completableOptions(def.options);\n if (flags.length > 0) {\n lines.push(\"\");\n lines.push(`# ${name} flags`);\n for (const opt of flags) {\n if (!opt.long) continue;\n const longName = opt.long.replace(/^--/, \"\");\n const shortName = opt.short ? opt.short.replace(/^-/, \"\") : undefined;\n const choiceArg = opt.choices ? ` -a '${opt.choices.join(\" \")}'` : \"\";\n const shortArg = shortName ? ` -s ${shortName}` : \"\";\n lines.push(\n `complete -c gpc -n '__fish_seen_subcommand_from ${name}' -l ${longName}${shortArg} -d '${escapeFish(opt.description)}'${choiceArg}`,\n );\n }\n }\n if (def.subcommands) walkFlags(def.subcommands);\n }\n };\n walkFlags(tree);\n\n return lines.join(\"\\n\");\n}\n\nexport function generatePowerShellCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const completionEntries: string[] = [];\n\n // Top-level completions\n for (const [cmd, def] of Object.entries(tree)) {\n completionEntries.push(\n ` [CompletionResult]::new('${cmd}', '${cmd}', [CompletionResultType]::ParameterValue, '${escapePowerShell(def.description)}')`,\n );\n }\n\n // Global flag completions (as parameters available from any state)\n for (const opt of completableOptions(globals)) {\n if (!opt.long) continue;\n completionEntries.push(\n ` [CompletionResult]::new('${opt.long}', '${opt.long}', [CompletionResultType]::ParameterName, '${escapePowerShell(opt.description)}')`,\n );\n }\n\n const subcommandCases: string[] = [];\n const level3Cases: string[] = [];\n\n for (const [cmd, def] of Object.entries(tree)) {\n if (!def.subcommands) continue;\n const subEntries = Object.entries(def.subcommands)\n .map(\n ([sub, subDef]) =>\n ` [CompletionResult]::new('${sub}', '${sub}', [CompletionResultType]::ParameterValue, '${escapePowerShell(subDef.description)}')`,\n )\n .join(\"\\n\");\n subcommandCases.push(` '${cmd}' {\\n${subEntries}\\n }`);\n\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (!subDef.subcommands) continue;\n const subSubEntries = Object.entries(subDef.subcommands)\n .map(\n ([subsub, subsubDef]) =>\n ` [CompletionResult]::new('${subsub}', '${subsub}', [CompletionResultType]::ParameterValue, '${escapePowerShell(subsubDef.description)}')`,\n )\n .join(\"\\n\");\n level3Cases.push(` '${sub}' {\\n${subSubEntries}\\n }`);\n }\n }\n\n return `# PowerShell completions for gpc\n# Install: gpc completion powershell >> $PROFILE\n\nusing namespace System.Management.Automation\n\nRegister-ArgumentCompleter -CommandName gpc -Native -ScriptBlock {\n param($wordToComplete, $commandAst, $cursorPosition)\n\n $tokens = $commandAst.ToString().Substring(0, $cursorPosition).Trim() -split '\\\\s+'\n $tokenCount = $tokens.Count\n\n # Determine context\n if ($tokenCount -le 1 -or ($tokenCount -eq 2 -and $wordToComplete)) {\n # Top-level commands\n${completionEntries.join(\"\\n\")}\n } elseif ($tokenCount -eq 2 -or ($tokenCount -eq 3 -and $wordToComplete)) {\n # Subcommands\n $command = $tokens[1]\n switch ($command) {\n${subcommandCases.join(\"\\n\")}\n }\n } elseif ($tokenCount -eq 3 -or ($tokenCount -eq 4 -and $wordToComplete)) {\n # Sub-subcommands\n $subcommand = $tokens[2]\n switch ($subcommand) {\n${level3Cases.join(\"\\n\")}\n }\n }\n}`;\n}\n\nfunction escapeZsh(str: string): string {\n return str.replace(/'/g, \"'\\\\''\");\n}\n\nfunction escapeFish(str: string): string {\n return str.replace(/'/g, \"\\\\'\");\n}\n\nfunction escapePowerShell(str: string): string {\n return str.replace(/'/g, \"''\");\n}\n"],"mappings":"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","names":[]}