@gpc-cli/cli 0.9.49 → 0.9.51

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 (40) hide show
  1. package/README.md +3 -3
  2. package/dist/{apps-FKD3ZG5X.js → apps-4GP3FD7O.js} +6 -3
  3. package/dist/apps-4GP3FD7O.js.map +1 -0
  4. package/dist/bin.js +2 -2
  5. package/dist/chunk-A7VRCCNS.js +17 -0
  6. package/dist/chunk-A7VRCCNS.js.map +1 -0
  7. package/dist/{chunk-7A4IKNZ5.js → chunk-NUH2MUGV.js} +14 -14
  8. package/dist/{config-JOYJ7TQC.js → config-NTDZA5TN.js} +2 -2
  9. package/dist/docs-GMFN6V4K.js +111 -0
  10. package/dist/docs-GMFN6V4K.js.map +1 -0
  11. package/dist/{doctor-Q4WI432G.js → doctor-M4AHIANK.js} +2 -2
  12. package/dist/{feedback-3JAMSICL.js → feedback-2HDEXLKJ.js} +2 -2
  13. package/dist/index.js +1 -1
  14. package/dist/{listings-7SGQ4SRX.js → listings-LNX6MQYN.js} +15 -11
  15. package/dist/listings-LNX6MQYN.js.map +1 -0
  16. package/dist/{publish-JPTI4EBT.js → publish-2VOCSEH2.js} +17 -3
  17. package/dist/publish-2VOCSEH2.js.map +1 -0
  18. package/dist/{releases-OUJ65774.js → releases-LUAHKIMY.js} +26 -6
  19. package/dist/releases-LUAHKIMY.js.map +1 -0
  20. package/dist/{testers-LSMBXCA2.js → testers-7BZXOJLN.js} +8 -5
  21. package/dist/testers-7BZXOJLN.js.map +1 -0
  22. package/dist/{tracks-DO7C5OSE.js → tracks-I4QZNZ3M.js} +8 -5
  23. package/dist/tracks-I4QZNZ3M.js.map +1 -0
  24. package/dist/{update-QSRQBFDJ.js → update-3UMY3JDP.js} +2 -2
  25. package/dist/{version-V2OQLSVG.js → version-ECUA4EAH.js} +2 -2
  26. package/package.json +5 -5
  27. package/dist/apps-FKD3ZG5X.js.map +0 -1
  28. package/dist/docs-4D2SJ4LY.js +0 -46
  29. package/dist/docs-4D2SJ4LY.js.map +0 -1
  30. package/dist/listings-7SGQ4SRX.js.map +0 -1
  31. package/dist/publish-JPTI4EBT.js.map +0 -1
  32. package/dist/releases-OUJ65774.js.map +0 -1
  33. package/dist/testers-LSMBXCA2.js.map +0 -1
  34. package/dist/tracks-DO7C5OSE.js.map +0 -1
  35. /package/dist/{chunk-7A4IKNZ5.js.map → chunk-NUH2MUGV.js.map} +0 -0
  36. /package/dist/{config-JOYJ7TQC.js.map → config-NTDZA5TN.js.map} +0 -0
  37. /package/dist/{doctor-Q4WI432G.js.map → doctor-M4AHIANK.js.map} +0 -0
  38. /package/dist/{feedback-3JAMSICL.js.map → feedback-2HDEXLKJ.js.map} +0 -0
  39. /package/dist/{update-QSRQBFDJ.js.map → update-3UMY3JDP.js.map} +0 -0
  40. /package/dist/{version-V2OQLSVG.js.map → version-ECUA4EAH.js.map} +0 -0
package/README.md CHANGED
@@ -3,14 +3,14 @@
3
3
  <p align="center"><strong>Ship Android apps from your terminal.</strong></p>
4
4
 
5
5
  <p align="center">
6
- The complete CLI for Google Play — 204 API endpoints, one tool.<br>
6
+ The complete CLI for Google Play — 208 API endpoints, one tool.<br>
7
7
  Releases, rollouts, metadata, vitals, reviews, subscriptions, reports, and more.
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
11
  <a href="https://www.npmjs.com/package/@gpc-cli/cli"><img src="https://img.shields.io/npm/v/@gpc-cli/cli?color=00D26A" alt="npm version"></a>
12
12
  <a href="https://github.com/yasserstudio/gpc"><img src="https://img.shields.io/github/stars/yasserstudio/gpc" alt="GitHub Stars"></a>
13
- <img src="https://img.shields.io/badge/Tests-1845_passing-00D26A" alt="Tests">
13
+ <img src="https://img.shields.io/badge/Tests-1860_passing-00D26A" alt="Tests">
14
14
  <img src="https://img.shields.io/badge/License-MIT-yellow" alt="License">
15
15
  </p>
16
16
 
@@ -82,7 +82,7 @@ Fastlane supply covers ~20 of 204 Google Play API endpoints. gradle-play-publish
82
82
 
83
83
  ## What You Get
84
84
 
85
- 204 API endpoints across these command groups:
85
+ 208 API endpoints across these command groups:
86
86
 
87
87
  | Group | What you can do |
88
88
  | ----------------- | -------------------------------------------------------------------------------------- |
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ buildCommitOptions
4
+ } from "./chunk-A7VRCCNS.js";
2
5
  import {
3
6
  isDryRun,
4
7
  printDryRun
@@ -34,7 +37,7 @@ function registerAppsCommands(program) {
34
37
  const format = getOutputFormat(program, config);
35
38
  console.log(formatOutput(info, format));
36
39
  });
37
- apps.command("update").description("Update app details").option("--email <email>", "Contact email").option("--phone <phone>", "Contact phone").option("--website <url>", "Contact website").option("--default-lang <lang>", "Default language").action(async (options) => {
40
+ apps.command("update").description("Update app details").option("--email <email>", "Contact email").option("--phone <phone>", "Contact phone").option("--website <url>", "Contact website").option("--default-lang <lang>", "Default language").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
38
41
  const config = await loadConfig();
39
42
  const packageName = options["app"] || program.opts()["app"] || config.app;
40
43
  if (!packageName) {
@@ -75,7 +78,7 @@ function registerAppsCommands(program) {
75
78
  serviceAccountPath: config.auth?.serviceAccount
76
79
  });
77
80
  const client = createApiClient({ auth });
78
- const result = await updateAppDetails(client, packageName, data);
81
+ const result = await updateAppDetails(client, packageName, data, buildCommitOptions(options));
79
82
  console.log(formatOutput(result, format));
80
83
  });
81
84
  apps.command("list").description("List configured applications").option("--limit <n>", "Maximum results to return").option("--next-page <token>", "Pagination token for next page").action(async (_options) => {
@@ -98,4 +101,4 @@ function registerAppsCommands(program) {
98
101
  export {
99
102
  registerAppsCommands
100
103
  };
101
- //# sourceMappingURL=apps-FKD3ZG5X.js.map
104
+ //# sourceMappingURL=apps-4GP3FD7O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/apps.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createApiClient } from \"@gpc-cli/api\";\nimport { getAppInfo, updateAppDetails, GpcError } from \"@gpc-cli/core\";\nimport { formatOutput } from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { buildCommitOptions } from \"../commit-options.js\";\n\nexport function registerAppsCommands(program: Command): void {\n const apps = program.command(\"apps\").description(\"Manage applications\");\n\n apps\n .command(\"info [package]\")\n .description(\"Show app details\")\n .action(async (packageArg?: string) => {\n const config = await loadConfig();\n const packageName = packageArg || config.app;\n\n if (!packageName) {\n throw new GpcError(\n \"No package name provided. Usage: gpc apps info <package>\",\n \"MISSING_PACKAGE\",\n 2,\n \"gpc config set app com.example.app\",\n );\n }\n\n const auth = await resolveAuth({\n serviceAccountPath: config.auth?.serviceAccount,\n });\n const client = createApiClient({ auth });\n const info = await getAppInfo(client, packageName);\n const format = getOutputFormat(program, config);\n console.log(formatOutput(info, format));\n });\n\n apps\n .command(\"update\")\n .description(\"Update app details\")\n .option(\"--email <email>\", \"Contact email\")\n .option(\"--phone <phone>\", \"Contact phone\")\n .option(\"--website <url>\", \"Contact website\")\n .option(\"--default-lang <lang>\", \"Default language\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = options[\"app\"] || program.opts()[\"app\"] || config.app;\n\n if (!packageName) {\n throw new GpcError(\n \"No package name provided. Usage: gpc apps update --email user@example.com\",\n \"MISSING_PACKAGE\",\n 2,\n \"gpc config set app com.example.app\",\n );\n }\n\n const data: Record<string, string> = {};\n if (options[\"email\"]) data[\"contactEmail\"] = options[\"email\"];\n if (options[\"phone\"]) data[\"contactPhone\"] = options[\"phone\"];\n if (options[\"website\"]) data[\"contactWebsite\"] = options[\"website\"];\n if (options[\"defaultLang\"]) data[\"defaultLanguage\"] = options[\"defaultLang\"];\n\n if (Object.keys(data).length === 0) {\n throw new GpcError(\n \"Provide at least one field to update (--email, --phone, --website, --default-lang).\",\n \"MISSING_OPTION\",\n 2,\n );\n }\n\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"apps update\",\n action: \"update app details for\",\n target: packageName,\n details: data,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const auth = await resolveAuth({\n serviceAccountPath: config.auth?.serviceAccount,\n });\n const client = createApiClient({ auth });\n const result = await updateAppDetails(client, packageName, data, buildCommitOptions(options));\n console.log(formatOutput(result, format));\n });\n\n apps\n .command(\"list\")\n .description(\"List configured applications\")\n .option(\"--limit <n>\", \"Maximum results to return\")\n .option(\"--next-page <token>\", \"Pagination token for next page\")\n .action(async (_options) => {\n const config = await loadConfig();\n const format = getOutputFormat(program, config);\n\n if (config.app) {\n const apps = [{ packageName: config.app, source: \"config\" }];\n console.log(formatOutput(apps, format));\n } else {\n console.log(\"No apps configured.\");\n console.log(\"\");\n console.log(\"Set a default app:\");\n console.log(\" gpc config set app com.example.myapp\");\n console.log(\"\");\n console.log(\"Or use the --app flag:\");\n console.log(\" gpc apps info --app com.example.myapp\");\n }\n });\n}\n"],"mappings":"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","names":["apps"]}
package/dist/bin.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  createProgram,
4
4
  handleCliError,
5
5
  loadPlugins
6
- } from "./chunk-7A4IKNZ5.js";
6
+ } from "./chunk-NUH2MUGV.js";
7
7
  import {
8
8
  checkForUpdate,
9
9
  formatUpdateNotification
@@ -46,7 +46,7 @@ if (!_isJsonMode && !_isQuiet && !_isSetupCommand && !existsSync(getUserConfigPa
46
46
  }
47
47
  await setupNetworking();
48
48
  initAudit(getConfigDir());
49
- var currentVersion = "0.9.49";
49
+ var currentVersion = "0.9.51";
50
50
  var isUpdateCommand = process.argv[2] === "update";
51
51
  var updateCheckPromise = isUpdateCommand ? Promise.resolve(null) : checkForUpdate(currentVersion);
52
52
  if (process.argv.includes("--ci")) {
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/commit-options.ts
4
+ function buildCommitOptions(opts) {
5
+ const notSent = !!opts.changesNotSentForReview;
6
+ const errorIfReview = !!opts.errorIfInReview;
7
+ if (!notSent && !errorIfReview) return void 0;
8
+ return {
9
+ ...notSent && { changesNotSentForReview: true },
10
+ ...errorIfReview && { changesInReviewBehavior: "ERROR_IF_IN_REVIEW" }
11
+ };
12
+ }
13
+
14
+ export {
15
+ buildCommitOptions
16
+ };
17
+ //# sourceMappingURL=chunk-A7VRCCNS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commit-options.ts"],"sourcesContent":["import type { EditCommitOptions } from \"@gpc-cli/api\";\n\nexport function buildCommitOptions(opts: Record<string, unknown>): EditCommitOptions | undefined {\n const notSent = !!opts.changesNotSentForReview;\n const errorIfReview = !!opts.errorIfInReview;\n if (!notSent && !errorIfReview) return undefined;\n return {\n ...(notSent && { changesNotSentForReview: true }),\n ...(errorIfReview && { changesInReviewBehavior: \"ERROR_IF_IN_REVIEW\" as const }),\n };\n}\n"],"mappings":";;;AAEO,SAAS,mBAAmB,MAA8D;AAC/F,QAAM,UAAU,CAAC,CAAC,KAAK;AACvB,QAAM,gBAAgB,CAAC,CAAC,KAAK;AAC7B,MAAI,CAAC,WAAW,CAAC,cAAe,QAAO;AACvC,SAAO;AAAA,IACL,GAAI,WAAW,EAAE,yBAAyB,KAAK;AAAA,IAC/C,GAAI,iBAAiB,EAAE,yBAAyB,qBAA8B;AAAA,EAChF;AACF;","names":[]}
@@ -67,22 +67,22 @@ 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.49", "-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.51", "-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-BA4FE2PO.js")).registerAuthCommands(program);
74
74
  },
75
75
  config: async () => {
76
- (await import("./config-JOYJ7TQC.js")).registerConfigCommands(program);
76
+ (await import("./config-NTDZA5TN.js")).registerConfigCommands(program);
77
77
  },
78
78
  doctor: async () => {
79
- (await import("./doctor-Q4WI432G.js")).registerDoctorCommand(program);
79
+ (await import("./doctor-M4AHIANK.js")).registerDoctorCommand(program);
80
80
  },
81
81
  update: async () => {
82
- (await import("./update-QSRQBFDJ.js")).registerUpdateCommand(program);
82
+ (await import("./update-3UMY3JDP.js")).registerUpdateCommand(program);
83
83
  },
84
84
  docs: async () => {
85
- (await import("./docs-4D2SJ4LY.js")).registerDocsCommand(program);
85
+ (await import("./docs-GMFN6V4K.js")).registerDocsCommand(program);
86
86
  },
87
87
  changelog: async () => {
88
88
  (await import("./changelog-QLDFG5TV.js")).registerChangelogCommand(program);
@@ -91,19 +91,19 @@ async function createProgram(pluginManager) {
91
91
  (await import("./completion-BCHRJSAT.js")).registerCompletionCommand(program);
92
92
  },
93
93
  apps: async () => {
94
- (await import("./apps-FKD3ZG5X.js")).registerAppsCommands(program);
94
+ (await import("./apps-4GP3FD7O.js")).registerAppsCommands(program);
95
95
  },
96
96
  releases: async () => {
97
- (await import("./releases-OUJ65774.js")).registerReleasesCommands(program);
97
+ (await import("./releases-LUAHKIMY.js")).registerReleasesCommands(program);
98
98
  },
99
99
  tracks: async () => {
100
- (await import("./tracks-DO7C5OSE.js")).registerTracksCommands(program);
100
+ (await import("./tracks-I4QZNZ3M.js")).registerTracksCommands(program);
101
101
  },
102
102
  status: async () => {
103
103
  (await import("./status-3HXBBXG6.js")).registerStatusCommand(program);
104
104
  },
105
105
  listings: async () => {
106
- (await import("./listings-7SGQ4SRX.js")).registerListingsCommands(program);
106
+ (await import("./listings-LNX6MQYN.js")).registerListingsCommands(program);
107
107
  },
108
108
  reviews: async () => {
109
109
  (await import("./reviews-YCBBM656.js")).registerReviewsCommands(program);
@@ -130,13 +130,13 @@ async function createProgram(pluginManager) {
130
130
  (await import("./users-UKG7VIQH.js")).registerUsersCommands(program);
131
131
  },
132
132
  testers: async () => {
133
- (await import("./testers-LSMBXCA2.js")).registerTestersCommands(program);
133
+ (await import("./testers-7BZXOJLN.js")).registerTestersCommands(program);
134
134
  },
135
135
  validate: async () => {
136
136
  (await import("./validate-QIYSA3N7.js")).registerValidateCommand(program);
137
137
  },
138
138
  publish: async () => {
139
- (await import("./publish-JPTI4EBT.js")).registerPublishCommand(program);
139
+ (await import("./publish-2VOCSEH2.js")).registerPublishCommand(program);
140
140
  },
141
141
  recovery: async () => {
142
142
  (await import("./recovery-YE3Z7NIN.js")).registerRecoveryCommands(program);
@@ -183,13 +183,13 @@ async function createProgram(pluginManager) {
183
183
  (await import("./verify-UUQNQMPG.js")).registerVerifyCommand(program);
184
184
  },
185
185
  version: async () => {
186
- (await import("./version-V2OQLSVG.js")).registerVersionCommand(program);
186
+ (await import("./version-ECUA4EAH.js")).registerVersionCommand(program);
187
187
  },
188
188
  cache: async () => {
189
189
  (await import("./cache-XKPLZYEB.js")).registerCacheCommand(program);
190
190
  },
191
191
  feedback: async () => {
192
- (await import("./feedback-3JAMSICL.js")).registerFeedbackCommand(program);
192
+ (await import("./feedback-2HDEXLKJ.js")).registerFeedbackCommand(program);
193
193
  },
194
194
  quickstart: async () => {
195
195
  (await import("./quickstart-Z5Y3FYJU.js")).registerQuickstartCommand(program);
@@ -457,4 +457,4 @@ export {
457
457
  createProgram,
458
458
  handleCliError
459
459
  };
460
- //# sourceMappingURL=chunk-7A4IKNZ5.js.map
460
+ //# sourceMappingURL=chunk-NUH2MUGV.js.map
@@ -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-Q4WI432G.js");
81
+ const { registerDoctorCommand } = await import("./doctor-M4AHIANK.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-JOYJ7TQC.js.map
110
+ //# sourceMappingURL=config-NTDZA5TN.js.map
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/commands/docs.ts
4
+ import * as cp from "child_process";
5
+ var PAGE_MAP = {
6
+ // Guide
7
+ installation: "guide/installation",
8
+ "quick-start": "guide/quick-start",
9
+ authentication: "guide/authentication",
10
+ configuration: "guide/configuration",
11
+ "developer-verification": "guide/developer-verification",
12
+ faq: "guide/faq",
13
+ // Commands
14
+ anomalies: "commands/anomalies",
15
+ apps: "commands/apps",
16
+ auth: "commands/auth",
17
+ bundle: "commands/bundle",
18
+ changelog: "commands/changelog",
19
+ config: "commands/config",
20
+ "data-safety": "commands/data-safety",
21
+ "device-tiers": "commands/device-tiers",
22
+ diff: "commands/diff",
23
+ enterprise: "commands/enterprise",
24
+ "external-transactions": "commands/external-transactions",
25
+ games: "commands/games",
26
+ "generated-apks": "commands/generated-apks",
27
+ grants: "commands/grants",
28
+ iap: "commands/iap",
29
+ init: "commands/init",
30
+ "install-skills": "commands/install-skills",
31
+ "internal-sharing": "commands/internal-sharing",
32
+ listings: "commands/listings",
33
+ migrate: "commands/migrate",
34
+ "one-time-products": "commands/one-time-products",
35
+ plugins: "commands/plugins",
36
+ preflight: "commands/preflight",
37
+ pricing: "commands/pricing",
38
+ publish: "commands/publish",
39
+ "purchase-options": "commands/purchase-options",
40
+ purchases: "commands/purchases",
41
+ quota: "commands/quota",
42
+ recovery: "commands/recovery",
43
+ releases: "commands/releases",
44
+ reports: "commands/reports",
45
+ reviews: "commands/reviews",
46
+ rtdn: "commands/rtdn",
47
+ status: "commands/status",
48
+ subscriptions: "commands/subscriptions",
49
+ testers: "commands/testers",
50
+ tracks: "commands/tracks",
51
+ train: "commands/train",
52
+ users: "commands/users",
53
+ verify: "commands/verify",
54
+ utility: "commands/utility",
55
+ vitals: "commands/vitals",
56
+ // Advanced
57
+ architecture: "advanced/architecture",
58
+ conventions: "advanced/conventions",
59
+ "error-codes": "advanced/error-codes",
60
+ plugins: "advanced/plugins",
61
+ "sdk-usage": "advanced/sdk-usage",
62
+ security: "advanced/security",
63
+ skills: "advanced/skills",
64
+ troubleshooting: "advanced/troubleshooting",
65
+ // CI/CD
66
+ bitbucket: "ci-cd/bitbucket",
67
+ circleci: "ci-cd/circleci",
68
+ "github-actions": "ci-cd/github-actions",
69
+ "gitlab-ci": "ci-cd/gitlab-ci",
70
+ "vitals-gates": "ci-cd/vitals-gates",
71
+ // Reference
72
+ "api-coverage": "reference/api-coverage",
73
+ changelog: "reference/changelog",
74
+ deprecations: "reference/deprecations",
75
+ "environment-variables": "reference/environment-variables",
76
+ "exit-codes": "reference/exit-codes",
77
+ "json-contract": "reference/json-contract",
78
+ // Migration
79
+ "from-console-ui": "migration/from-console-ui",
80
+ "from-fastlane": "migration/from-fastlane",
81
+ // Alternatives
82
+ fastlane: "alternatives/fastlane"
83
+ };
84
+ var BASE = "https://yasserstudio.github.io/gpc/";
85
+ function registerDocsCommand(program) {
86
+ program.command("docs [topic]").description("Open documentation in browser").option("--list", "List available documentation topics").action((topic, opts) => {
87
+ if (opts?.list) {
88
+ console.log("Available topics:");
89
+ for (const key of Object.keys(PAGE_MAP)) console.log(` gpc docs ${key}`);
90
+ return;
91
+ }
92
+ const path = topic ? PAGE_MAP[topic] : void 0;
93
+ if (topic && !path) {
94
+ const err = new Error(`Unknown topic "${topic}".`);
95
+ Object.assign(err, { code: "USAGE_ERROR", exitCode: 2, suggestion: "Run: gpc docs --list" });
96
+ throw err;
97
+ }
98
+ const url = path ? `${BASE}${path}` : BASE;
99
+ const platform = process.platform;
100
+ const cmd = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
101
+ cp.execFile(cmd, [url], (error) => {
102
+ if (error) {
103
+ console.log(`Open in your browser: ${url}`);
104
+ }
105
+ });
106
+ });
107
+ }
108
+ export {
109
+ registerDocsCommand
110
+ };
111
+ //# sourceMappingURL=docs-GMFN6V4K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/docs.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport * as cp from \"node:child_process\";\n\nconst PAGE_MAP: Record<string, string> = {\n // Guide\n installation: \"guide/installation\",\n \"quick-start\": \"guide/quick-start\",\n authentication: \"guide/authentication\",\n configuration: \"guide/configuration\",\n \"developer-verification\": \"guide/developer-verification\",\n faq: \"guide/faq\",\n\n // Commands\n anomalies: \"commands/anomalies\",\n apps: \"commands/apps\",\n auth: \"commands/auth\",\n bundle: \"commands/bundle\",\n changelog: \"commands/changelog\",\n config: \"commands/config\",\n \"data-safety\": \"commands/data-safety\",\n \"device-tiers\": \"commands/device-tiers\",\n diff: \"commands/diff\",\n enterprise: \"commands/enterprise\",\n \"external-transactions\": \"commands/external-transactions\",\n games: \"commands/games\",\n \"generated-apks\": \"commands/generated-apks\",\n grants: \"commands/grants\",\n iap: \"commands/iap\",\n init: \"commands/init\",\n \"install-skills\": \"commands/install-skills\",\n \"internal-sharing\": \"commands/internal-sharing\",\n listings: \"commands/listings\",\n migrate: \"commands/migrate\",\n \"one-time-products\": \"commands/one-time-products\",\n plugins: \"commands/plugins\",\n preflight: \"commands/preflight\",\n pricing: \"commands/pricing\",\n publish: \"commands/publish\",\n \"purchase-options\": \"commands/purchase-options\",\n purchases: \"commands/purchases\",\n quota: \"commands/quota\",\n recovery: \"commands/recovery\",\n releases: \"commands/releases\",\n reports: \"commands/reports\",\n reviews: \"commands/reviews\",\n rtdn: \"commands/rtdn\",\n status: \"commands/status\",\n subscriptions: \"commands/subscriptions\",\n testers: \"commands/testers\",\n tracks: \"commands/tracks\",\n train: \"commands/train\",\n users: \"commands/users\",\n verify: \"commands/verify\",\n utility: \"commands/utility\",\n vitals: \"commands/vitals\",\n\n // Advanced\n architecture: \"advanced/architecture\",\n conventions: \"advanced/conventions\",\n \"error-codes\": \"advanced/error-codes\",\n plugins: \"advanced/plugins\",\n \"sdk-usage\": \"advanced/sdk-usage\",\n security: \"advanced/security\",\n skills: \"advanced/skills\",\n troubleshooting: \"advanced/troubleshooting\",\n\n // CI/CD\n bitbucket: \"ci-cd/bitbucket\",\n circleci: \"ci-cd/circleci\",\n \"github-actions\": \"ci-cd/github-actions\",\n \"gitlab-ci\": \"ci-cd/gitlab-ci\",\n \"vitals-gates\": \"ci-cd/vitals-gates\",\n\n // Reference\n \"api-coverage\": \"reference/api-coverage\",\n changelog: \"reference/changelog\",\n deprecations: \"reference/deprecations\",\n \"environment-variables\": \"reference/environment-variables\",\n \"exit-codes\": \"reference/exit-codes\",\n \"json-contract\": \"reference/json-contract\",\n\n // Migration\n \"from-console-ui\": \"migration/from-console-ui\",\n \"from-fastlane\": \"migration/from-fastlane\",\n\n // Alternatives\n fastlane: \"alternatives/fastlane\",\n};\n\nconst BASE = \"https://yasserstudio.github.io/gpc/\";\n\nexport function registerDocsCommand(program: Command): void {\n program\n .command(\"docs [topic]\")\n .description(\"Open documentation in browser\")\n .option(\"--list\", \"List available documentation topics\")\n .action((topic?: string, opts?: { list?: boolean }) => {\n if (opts?.list) {\n console.log(\"Available topics:\");\n for (const key of Object.keys(PAGE_MAP)) console.log(` gpc docs ${key}`);\n return;\n }\n const path = topic ? PAGE_MAP[topic] : undefined;\n if (topic && !path) {\n const err = new Error(`Unknown topic \"${topic}\".`);\n Object.assign(err, { code: \"USAGE_ERROR\", exitCode: 2, suggestion: \"Run: gpc docs --list\" });\n throw err;\n }\n const url = path ? `${BASE}${path}` : BASE;\n const platform = process.platform;\n const cmd = platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"start\" : \"xdg-open\";\n cp.execFile(cmd, [url], (error) => {\n if (error) {\n console.log(`Open in your browser: ${url}`);\n }\n });\n });\n}\n"],"mappings":";;;AACA,YAAY,QAAQ;AAEpB,IAAM,WAAmC;AAAA;AAAA,EAEvC,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,0BAA0B;AAAA,EAC1B,KAAK;AAAA;AAAA,EAGL,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,yBAAyB;AAAA,EACzB,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA;AAAA,EAGR,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,iBAAiB;AAAA;AAAA,EAGjB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,gBAAgB;AAAA;AAAA,EAGhB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,yBAAyB;AAAA,EACzB,cAAc;AAAA,EACd,iBAAiB;AAAA;AAAA,EAGjB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,UAAU;AACZ;AAEA,IAAM,OAAO;AAEN,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,cAAc,EACtB,YAAY,+BAA+B,EAC3C,OAAO,UAAU,qCAAqC,EACtD,OAAO,CAAC,OAAgB,SAA8B;AACrD,QAAI,MAAM,MAAM;AACd,cAAQ,IAAI,mBAAmB;AAC/B,iBAAW,OAAO,OAAO,KAAK,QAAQ,EAAG,SAAQ,IAAI,cAAc,GAAG,EAAE;AACxE;AAAA,IACF;AACA,UAAM,OAAO,QAAQ,SAAS,KAAK,IAAI;AACvC,QAAI,SAAS,CAAC,MAAM;AAClB,YAAM,MAAM,IAAI,MAAM,kBAAkB,KAAK,IAAI;AACjD,aAAO,OAAO,KAAK,EAAE,MAAM,eAAe,UAAU,GAAG,YAAY,uBAAuB,CAAC;AAC3F,YAAM;AAAA,IACR;AACA,UAAM,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,KAAK;AACtC,UAAM,WAAW,QAAQ;AACzB,UAAM,MAAM,aAAa,WAAW,SAAS,aAAa,UAAU,UAAU;AAC9E,IAAG,YAAS,KAAK,CAAC,GAAG,GAAG,CAAC,UAAU;AACjC,UAAI,OAAO;AACT,gBAAQ,IAAI,yBAAyB,GAAG,EAAE;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACL;","names":[]}
@@ -141,7 +141,7 @@ function checkCiEnvironment() {
141
141
  };
142
142
  }
143
143
  async function checkGpcVersion() {
144
- const currentVersion = "0.9.49";
144
+ const currentVersion = "0.9.51";
145
145
  if (currentVersion === "0.0.0") {
146
146
  return { name: "version", status: "info", message: "GPC development build" };
147
147
  }
@@ -740,4 +740,4 @@ export {
740
740
  checkVerificationDeadline,
741
741
  registerDoctorCommand
742
742
  };
743
- //# sourceMappingURL=doctor-Q4WI432G.js.map
743
+ //# sourceMappingURL=doctor-M4AHIANK.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.49";
12
+ const version = "0.9.51";
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-3JAMSICL.js.map
70
+ //# sourceMappingURL=feedback-2HDEXLKJ.js.map
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  createProgram,
4
4
  handleCliError
5
- } from "./chunk-7A4IKNZ5.js";
5
+ } from "./chunk-NUH2MUGV.js";
6
6
  export {
7
7
  createProgram,
8
8
  handleCliError
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ buildCommitOptions
4
+ } from "./chunk-A7VRCCNS.js";
2
5
  import {
3
6
  getClient,
4
7
  resolvePackageName
@@ -71,7 +74,7 @@ function registerListingsCommands(program) {
71
74
  const result = await getListings(client, packageName, options.lang);
72
75
  console.log(formatOutput(result, format));
73
76
  });
74
- listings.command("update").description("Update a store listing").option("--lang <language>", "Language code (BCP 47)").option("--title <text>", "App title").option("--short <text>", "Short description").option("--full <text>", "Full description").option("--full-file <path>", "Read full description from file").option("--video <url>", "Video URL").action(async (options) => {
77
+ listings.command("update").description("Update a store listing").option("--lang <language>", "Language code (BCP 47)").option("--title <text>", "App title").option("--short <text>", "Short description").option("--full <text>", "Full description").option("--full-file <path>", "Read full description from file").option("--video <url>", "Video URL").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
75
78
  const config = await loadConfig();
76
79
  const packageName = resolvePackageName(program.opts()["app"], config);
77
80
  const interactive = isInteractive(program);
@@ -116,10 +119,10 @@ function registerListingsCommands(program) {
116
119
  return;
117
120
  }
118
121
  const client = await getClient(config);
119
- const result = await updateListing(client, packageName, options.lang, data);
122
+ const result = await updateListing(client, packageName, options.lang, data, buildCommitOptions(options));
120
123
  console.log(formatOutput(result, format));
121
124
  });
122
- listings.command("delete").description("Delete a store listing for a language").option("--lang <language>", "Language code (BCP 47)").action(async (options) => {
125
+ listings.command("delete").description("Delete a store listing for a language").option("--lang <language>", "Language code (BCP 47)").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
123
126
  const config = await loadConfig();
124
127
  const packageName = resolvePackageName(program.opts()["app"], config);
125
128
  const interactive = isInteractive(program);
@@ -146,7 +149,7 @@ function registerListingsCommands(program) {
146
149
  return;
147
150
  }
148
151
  const client = await getClient(config);
149
- await deleteListing(client, packageName, options.lang);
152
+ await deleteListing(client, packageName, options.lang, buildCommitOptions(options));
150
153
  console.log(`Listing for "${options.lang}" deleted.`);
151
154
  });
152
155
  listings.command("pull").description("Download listings to Fastlane-format directory").option("--dir <path>", "Target directory (default: metadata)", "metadata").action(async (options) => {
@@ -166,7 +169,7 @@ function registerListingsCommands(program) {
166
169
  )
167
170
  );
168
171
  });
169
- listings.command("push").description("Upload listings from Fastlane-format directory").option("--dir <path>", "Source directory (default: metadata)", "metadata").option("--force", "Push even if fields exceed character limits").action(async (options) => {
172
+ listings.command("push").description("Upload listings from Fastlane-format directory").option("--dir <path>", "Source directory (default: metadata)", "metadata").option("--force", "Push even if fields exceed character limits").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
170
173
  const config = await loadConfig();
171
174
  const packageName = resolvePackageName(program.opts()["app"], config);
172
175
  const client = await getClient(config);
@@ -177,7 +180,8 @@ function registerListingsCommands(program) {
177
180
  const dryRun = isDryRun(program);
178
181
  const result = await pushListings(client, packageName, options.dir, {
179
182
  dryRun,
180
- force: options.force
183
+ force: options.force,
184
+ commitOptions: buildCommitOptions(options)
181
185
  });
182
186
  spinner.stop(dryRun ? "Dry-run complete (no changes made)" : "Listings pushed");
183
187
  console.log(formatOutput(result, format));
@@ -315,7 +319,7 @@ Missing locales: ${missingLocales.join(", ")}`);
315
319
  const result = await listImages(client, packageName, options.lang, imageType);
316
320
  console.log(formatOutput(result, format));
317
321
  });
318
- images.command("upload <file>").description("Upload an image").option("--lang <language>", "Language code (BCP 47)").option("--type <type>", "Image type").action(async (file, options) => {
322
+ images.command("upload <file>").description("Upload an image").option("--lang <language>", "Language code (BCP 47)").option("--type <type>", "Image type").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (file, options) => {
319
323
  const config = await loadConfig();
320
324
  const packageName = resolvePackageName(program.opts()["app"], config);
321
325
  const interactive = isInteractive(program);
@@ -343,7 +347,7 @@ Missing locales: ${missingLocales.join(", ")}`);
343
347
  const spinner = createSpinner("Uploading image...");
344
348
  if (!program.opts()["quiet"] && process.stderr.isTTY) spinner.start();
345
349
  try {
346
- const result = await uploadImage(client, packageName, options.lang, imageType, file);
350
+ const result = await uploadImage(client, packageName, options.lang, imageType, file, buildCommitOptions(options));
347
351
  spinner.stop("Image uploaded");
348
352
  console.log(formatOutput(result, format));
349
353
  } catch (error) {
@@ -351,7 +355,7 @@ Missing locales: ${missingLocales.join(", ")}`);
351
355
  throw error;
352
356
  }
353
357
  });
354
- images.command("delete").description("Delete an image").option("--lang <language>", "Language code (BCP 47)").option("--type <type>", "Image type").option("--id <imageId>", "Image ID to delete").action(async (options) => {
358
+ images.command("delete").description("Delete an image").option("--lang <language>", "Language code (BCP 47)").option("--type <type>", "Image type").option("--id <imageId>", "Image ID to delete").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
355
359
  const config = await loadConfig();
356
360
  const packageName = resolvePackageName(program.opts()["app"], config);
357
361
  const interactive = isInteractive(program);
@@ -383,7 +387,7 @@ Missing locales: ${missingLocales.join(", ")}`);
383
387
  await requireConfirm(`Delete image "${options.id}"?`, program);
384
388
  const client = await getClient(config);
385
389
  const imageType = validateImageType(options.type);
386
- await deleteImage(client, packageName, options.lang, imageType, options.id);
390
+ await deleteImage(client, packageName, options.lang, imageType, options.id, buildCommitOptions(options));
387
391
  console.log(`Image "${options.id}" deleted.`);
388
392
  });
389
393
  images.command("export").description("Export all images to a local directory").option("--dir <path>", "Output directory", "images").option("--lang <language>", "Language code (BCP 47) \u2014 export only this language").option("--type <type>", "Image type \u2014 export only this type").action(async (options) => {
@@ -424,4 +428,4 @@ Missing locales: ${missingLocales.join(", ")}`);
424
428
  export {
425
429
  registerListingsCommands
426
430
  };
427
- //# sourceMappingURL=listings-7SGQ4SRX.js.map
431
+ //# sourceMappingURL=listings-LNX6MQYN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/listings.ts"],"sourcesContent":["import { resolvePackageName, getClient } from \"../resolve.js\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\n\nimport type { ImageType } from \"@gpc-cli/api\";\nimport {\n getListings,\n updateListing,\n deleteListing,\n pullListings,\n pushListings,\n diffListingsEnhanced,\n lintLocalListings,\n analyzeRemoteListings,\n listImages,\n uploadImage,\n deleteImage,\n exportImages,\n getCountryAvailability,\n formatOutput,\n createSpinner,\n GpcError,\n} from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { isInteractive, requireOption, requireConfirm } from \"../prompt.js\";\nimport { green, red } from \"../colors.js\";\nimport { buildCommitOptions } from \"../commit-options.js\";\n\n\n\nconst VALID_IMAGE_TYPES: ImageType[] = [\n \"phoneScreenshots\",\n \"sevenInchScreenshots\",\n \"tenInchScreenshots\",\n \"tvScreenshots\",\n \"wearScreenshots\",\n \"icon\",\n \"featureGraphic\",\n \"tvBanner\",\n];\n\nfunction validateImageType(type: string): ImageType {\n if (!VALID_IMAGE_TYPES.includes(type as ImageType)) {\n throw new GpcError(\n `Invalid image type \"${type}\". Valid types: ${VALID_IMAGE_TYPES.join(\", \")}`,\n \"LISTINGS_USAGE_ERROR\",\n 2,\n `Use one of: ${VALID_IMAGE_TYPES.join(\", \")}`,\n );\n }\n return type as ImageType;\n}\n\nexport function registerListingsCommands(program: Command): void {\n const listings = program.command(\"listings\").description(\"Manage store listings and metadata\");\n\n // Get\n listings\n .command(\"get\")\n .description(\"Get store listing(s)\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await getListings(client, packageName, options.lang);\n console.log(formatOutput(result, format));\n });\n\n // Update\n listings\n .command(\"update\")\n .description(\"Update a store listing\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--title <text>\", \"App title\")\n .option(\"--short <text>\", \"Short description\")\n .option(\"--full <text>\", \"Full description\")\n .option(\"--full-file <path>\", \"Read full description from file\")\n .option(\"--video <url>\", \"Video URL\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n default: \"en-US\",\n },\n interactive,\n );\n const format = getOutputFormat(program, config);\n\n const data: Record<string, string> = {};\n if (options[\"title\"]) data[\"title\"] = options[\"title\"];\n if (options[\"short\"]) data[\"shortDescription\"] = options[\"short\"];\n if (options[\"full\"]) data[\"fullDescription\"] = options[\"full\"];\n if (options[\"fullFile\"]) {\n const { readFile } = await import(\"node:fs/promises\");\n data[\"fullDescription\"] = (await readFile(options[\"fullFile\"], \"utf-8\")).trimEnd();\n }\n if (options[\"video\"]) data[\"video\"] = options[\"video\"];\n\n if (Object.keys(data).length === 0) {\n throw new GpcError(\n \"Provide at least one field to update (--title, --short, --full, --full-file, --video).\",\n \"LISTINGS_USAGE_ERROR\",\n 2,\n \"Pass at least one of: --title, --short, --full, --full-file, --video\",\n );\n }\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"listings update\",\n action: \"update listing for\",\n target: options.lang,\n details: data,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n const result = await updateListing(client, packageName, options.lang, data, buildCommitOptions(options));\n console.log(formatOutput(result, format));\n });\n\n // Delete\n listings\n .command(\"delete\")\n .description(\"Delete a store listing for a language\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n },\n interactive,\n );\n\n await requireConfirm(`Delete listing for \"${options.lang}\"?`, program);\n\n if (isDryRun(program)) {\n const format = getOutputFormat(program, config);\n printDryRun(\n {\n command: \"listings delete\",\n action: \"delete listing for\",\n target: options.lang,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n await deleteListing(client, packageName, options.lang, buildCommitOptions(options));\n console.log(`Listing for \"${options.lang}\" deleted.`);\n });\n\n // Pull\n listings\n .command(\"pull\")\n .description(\"Download listings to Fastlane-format directory\")\n .option(\"--dir <path>\", \"Target directory (default: metadata)\", \"metadata\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await pullListings(client, packageName, options.dir);\n console.log(\n formatOutput(\n {\n directory: options.dir,\n languages: result.listings.map((l) => l.language),\n count: result.listings.length,\n },\n format,\n ),\n );\n });\n\n // Push\n listings\n .command(\"push\")\n .description(\"Upload listings from Fastlane-format directory\")\n .option(\"--dir <path>\", \"Source directory (default: metadata)\", \"metadata\")\n .option(\"--force\", \"Push even if fields exceed character limits\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const spinner = createSpinner(\"Pushing listings...\");\n if (!program.opts()[\"quiet\"] && process.stderr.isTTY) spinner.start();\n\n try {\n const dryRun = isDryRun(program);\n const result = await pushListings(client, packageName, options.dir, {\n dryRun,\n force: options.force,\n commitOptions: buildCommitOptions(options),\n });\n spinner.stop(dryRun ? \"Dry-run complete (no changes made)\" : \"Listings pushed\");\n console.log(formatOutput(result, format));\n } catch (error) {\n spinner.fail(\"Push failed\");\n throw error;\n }\n });\n\n // Diff (enhanced: --lang filter, word-level inline diff)\n listings\n .command(\"diff\")\n .description(\"Compare local Fastlane-format metadata against remote listings\")\n .option(\"--dir <path>\", \"Local metadata directory\", \"metadata\")\n .option(\"--lang <language>\", \"Filter diff to a specific language\")\n .option(\"--word-diff\", \"Show word-level inline diff for fullDescription\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const diffs = await diffListingsEnhanced(client, packageName, options.dir, {\n lang: options.lang,\n wordLevel: options.wordDiff,\n });\n\n if (diffs.length === 0) {\n if (format === \"json\") {\n console.log(formatOutput([], format));\n } else {\n console.log(\"No differences found.\");\n }\n return;\n }\n\n if (format === \"json\") {\n console.log(formatOutput(diffs, format));\n } else {\n for (const diff of diffs) {\n const charInfo = (diff as unknown as Record<string, unknown>)[\"chars\"]\n ? ` (${(diff as unknown as Record<string, unknown>)[\"chars\"]} chars)`\n : \"\";\n console.log(`[${diff.language}] ${diff.field}:${charInfo}`);\n if ((diff as unknown as Record<string, unknown>)[\"diffSummary\"]) {\n console.log(` ${(diff as unknown as Record<string, unknown>)[\"diffSummary\"]}`);\n } else {\n console.log(green(` + local: ${diff.local || \"(empty)\"}`));\n console.log(red(` - remote: ${diff.remote || \"(empty)\"}`));\n }\n }\n }\n });\n\n // Lint (local, no API)\n listings\n .command(\"lint\")\n .description(\"Lint local listing metadata for Play Store character limits (no API)\")\n .option(\"--dir <path>\", \"Metadata directory\", \"metadata\")\n .action(async (options) => {\n const format = getOutputFormat(program, await loadConfig());\n const results = await lintLocalListings(options.dir);\n if (format === \"json\") {\n console.log(formatOutput(results, format));\n return;\n }\n let hasErrors = false;\n for (const r of results) {\n console.log(`\\n[${r.language}] ${r.valid ? green(\"✓ valid\") : red(\"✗ over limit\")}`);\n const rows = r.fields.map((f) => ({\n field: f.field,\n chars: f.chars,\n limit: f.limit,\n pct: `${f.pct}%`,\n status: f.status === \"ok\" ? green(\"✓\") : f.status === \"warn\" ? \"⚠\" : red(\"✗\"),\n }));\n console.log(formatOutput(rows, \"table\"));\n if (!r.valid) hasErrors = true;\n }\n if (hasErrors) {\n process.exitCode = 1;\n }\n });\n\n // Analyze (live, fetches remote)\n listings\n .command(\"analyze\")\n .description(\"Analyze live Play Store listings for character limit compliance\")\n .option(\"--expected <locales>\", \"Comma-separated list of expected locale codes\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const spinner = createSpinner(\"Fetching remote listings...\");\n if (!program.opts()[\"quiet\"] && process.stderr.isTTY) spinner.start();\n\n try {\n const expectedLocales = options.expected\n ? (options.expected as string).split(\",\").map((s: string) => s.trim())\n : undefined;\n const { results, missingLocales } = await analyzeRemoteListings(client, packageName, {\n expectedLocales,\n });\n spinner.stop(\"Done\");\n\n if (format === \"json\") {\n console.log(formatOutput({ results, missingLocales }, format));\n return;\n }\n\n let hasErrors = false;\n for (const r of results) {\n console.log(`\\n[${r.language}] ${r.valid ? green(\"✓ valid\") : red(\"✗ over limit\")}`);\n const rows = r.fields.map((f) => ({\n field: f.field,\n chars: f.chars,\n limit: f.limit,\n pct: `${f.pct}%`,\n status: f.status === \"ok\" ? green(\"✓\") : f.status === \"warn\" ? \"⚠\" : red(\"✗\"),\n }));\n console.log(formatOutput(rows, \"table\"));\n if (!r.valid) hasErrors = true;\n }\n\n if (missingLocales && missingLocales.length > 0) {\n console.log(`\\nMissing locales: ${missingLocales.join(\", \")}`);\n }\n\n if (hasErrors) {\n process.exitCode = 1;\n }\n } catch (error) {\n spinner.fail(\"Analysis failed\");\n throw error;\n }\n });\n\n // Images subcommand\n const images = listings.command(\"images\").description(\"Manage listing images\");\n\n // Images list\n images\n .command(\"list\")\n .description(\"List images for a language and type\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--type <type>\", \"Image type\")\n .option(\"--limit <n>\", \"Maximum results to return\")\n .option(\"--next-page <token>\", \"Pagination token for next page\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n default: \"en-US\",\n },\n interactive,\n );\n\n options.type = await requireOption(\n \"type\",\n options.type,\n {\n message: \"Image type:\",\n choices: VALID_IMAGE_TYPES as unknown as string[],\n },\n interactive,\n );\n\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n const imageType = validateImageType(options.type);\n\n const result = await listImages(client, packageName, options.lang, imageType);\n console.log(formatOutput(result, format));\n });\n\n // Images upload\n images\n .command(\"upload <file>\")\n .description(\"Upload an image\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--type <type>\", \"Image type\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (file: string, options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n default: \"en-US\",\n },\n interactive,\n );\n\n options.type = await requireOption(\n \"type\",\n options.type,\n {\n message: \"Image type:\",\n choices: VALID_IMAGE_TYPES as unknown as string[],\n },\n interactive,\n );\n\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n const imageType = validateImageType(options.type);\n\n const spinner = createSpinner(\"Uploading image...\");\n if (!program.opts()[\"quiet\"] && process.stderr.isTTY) spinner.start();\n\n try {\n const result = await uploadImage(client, packageName, options.lang, imageType, file, buildCommitOptions(options));\n spinner.stop(\"Image uploaded\");\n console.log(formatOutput(result, format));\n } catch (error) {\n spinner.fail(\"Image upload failed\");\n throw error;\n }\n });\n\n // Images delete\n images\n .command(\"delete\")\n .description(\"Delete an image\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--type <type>\", \"Image type\")\n .option(\"--id <imageId>\", \"Image ID to delete\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n },\n interactive,\n );\n\n options.type = await requireOption(\n \"type\",\n options.type,\n {\n message: \"Image type:\",\n choices: VALID_IMAGE_TYPES as unknown as string[],\n },\n interactive,\n );\n\n options.id = await requireOption(\n \"id\",\n options.id,\n {\n message: \"Image ID to delete:\",\n },\n interactive,\n );\n\n await requireConfirm(`Delete image \"${options.id}\"?`, program);\n\n const client = await getClient(config);\n const imageType = validateImageType(options.type);\n\n await deleteImage(client, packageName, options.lang, imageType, options.id, buildCommitOptions(options));\n console.log(`Image \"${options.id}\" deleted.`);\n });\n\n // Images export\n images\n .command(\"export\")\n .description(\"Export all images to a local directory\")\n .option(\"--dir <path>\", \"Output directory\", \"images\")\n .option(\"--lang <language>\", \"Language code (BCP 47) — export only this language\")\n .option(\"--type <type>\", \"Image type — export only this type\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const exportOpts: { lang?: string; type?: ImageType } = {};\n if (options.lang) exportOpts.lang = options.lang;\n if (options.type) {\n exportOpts.type = validateImageType(options.type);\n }\n\n const spinner = createSpinner(\"Exporting images...\");\n if (!program.opts()[\"quiet\"] && process.stderr.isTTY) spinner.start();\n\n try {\n const result = await exportImages(client, packageName, options.dir, exportOpts);\n spinner.stop(\"Images exported\");\n console.log(formatOutput(result, format));\n } catch (error) {\n spinner.fail(\"Image export failed\");\n throw error;\n }\n });\n\n // Availability\n listings\n .command(\"availability\")\n .description(\"Get country availability for a track\")\n .option(\"--track <track>\", \"Track name\", \"production\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await getCountryAvailability(client, packageName, options.track);\n const countries = (result as unknown as Record<string, unknown>)[\"countryTargeting\"] as\n | unknown[]\n | undefined;\n if (\n format !== \"json\" &&\n (!countries || (Array.isArray(countries) && countries.length === 0)) &&\n Object.keys(result as object).length === 0\n ) {\n console.log(\"No availability data.\");\n return;\n }\n console.log(formatOutput(result, format));\n });\n}\n"],"mappings":"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","names":[]}