@gpc-cli/cli 0.9.40 → 0.9.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{anomalies-KRRA75MJ.js → anomalies-NU2IN2GJ.js} +4 -9
- package/dist/anomalies-NU2IN2GJ.js.map +1 -0
- package/dist/bin.js +2 -2
- package/dist/chunk-AA577WVQ.js +23 -0
- package/dist/chunk-AA577WVQ.js.map +1 -0
- package/dist/{chunk-FIW4GLGP.js → chunk-MO6QT7L2.js} +27 -27
- package/dist/{config-36GIPNWX.js → config-222P3MKK.js} +1 -1
- package/dist/config-222P3MKK.js.map +1 -0
- package/dist/{data-safety-JR6PZ2BD.js → data-safety-L64D6ZZX.js} +5 -15
- package/dist/data-safety-L64D6ZZX.js.map +1 -0
- package/dist/{device-tiers-5SGJPSYG.js → device-tiers-UZVKC726.js} +5 -15
- package/dist/device-tiers-UZVKC726.js.map +1 -0
- package/dist/{diff-EQOPWX3M.js → diff-V77SMKAQ.js} +4 -9
- package/dist/diff-V77SMKAQ.js.map +1 -0
- package/dist/{external-transactions-O5P4QBIT.js → external-transactions-6DWF5U3Q.js} +5 -15
- package/dist/external-transactions-6DWF5U3Q.js.map +1 -0
- package/dist/{feedback-2V6MLXZH.js → feedback-J7LXP3AW.js} +2 -2
- package/dist/{games-X57AGM3E.js → games-BT777WUO.js} +8 -13
- package/dist/games-BT777WUO.js.map +1 -0
- package/dist/{generated-apks-KB2PLWDI.js → generated-apks-RJWTIX7L.js} +5 -15
- package/dist/generated-apks-RJWTIX7L.js.map +1 -0
- package/dist/{iap-BNIAHBDN.js → iap-QTO5Q6SN.js} +5 -15
- package/dist/iap-QTO5Q6SN.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/{internal-sharing-M74VNIQ2.js → internal-sharing-DEOI3ENH.js} +5 -15
- package/dist/internal-sharing-DEOI3ENH.js.map +1 -0
- package/dist/{listings-JOFAZBKU.js → listings-NJWIKN4J.js} +5 -15
- package/dist/listings-NJWIKN4J.js.map +1 -0
- package/dist/{one-time-products-3WNXDKE3.js → one-time-products-6CQNNTBX.js} +5 -15
- package/dist/one-time-products-6CQNNTBX.js.map +1 -0
- package/dist/{pricing-OZO66DVL.js → pricing-XQSDTTK5.js} +5 -15
- package/dist/pricing-XQSDTTK5.js.map +1 -0
- package/dist/{publish-EPZXLGKZ.js → publish-OJJFPDRM.js} +4 -9
- package/dist/publish-OJJFPDRM.js.map +1 -0
- package/dist/{purchases-7ZPVCN6D.js → purchases-745IKIG5.js} +5 -15
- package/dist/purchases-745IKIG5.js.map +1 -0
- package/dist/{recovery-YGPOVUFD.js → recovery-BBF6NQ4C.js} +5 -15
- package/dist/recovery-BBF6NQ4C.js.map +1 -0
- package/dist/{releases-FXVNP6VK.js → releases-C2WC2K4E.js} +8 -9
- package/dist/{releases-FXVNP6VK.js.map → releases-C2WC2K4E.js.map} +1 -1
- package/dist/{reviews-MOVGATUI.js → reviews-2B5SKNXW.js} +5 -15
- package/dist/reviews-2B5SKNXW.js.map +1 -0
- package/dist/{subscriptions-LSOJID6H.js → subscriptions-4XKNTOOL.js} +12 -17
- package/dist/subscriptions-4XKNTOOL.js.map +1 -0
- package/dist/{testers-SDLVWQ2Z.js → testers-3Y753PFW.js} +5 -15
- package/dist/testers-3Y753PFW.js.map +1 -0
- package/dist/{train-PX5Z26PQ.js → train-YA4KGVGZ.js} +4 -9
- package/dist/train-YA4KGVGZ.js.map +1 -0
- package/dist/{update-EXLKAKOD.js → update-W6INIH3K.js} +2 -2
- package/dist/{version-3O6R66WZ.js → version-FXP5WOBO.js} +2 -2
- package/dist/{vitals-6EYDCGQK.js → vitals-A4CS4MSS.js} +4 -9
- package/dist/vitals-A4CS4MSS.js.map +1 -0
- package/package.json +4 -4
- package/dist/anomalies-KRRA75MJ.js.map +0 -1
- package/dist/config-36GIPNWX.js.map +0 -1
- package/dist/data-safety-JR6PZ2BD.js.map +0 -1
- package/dist/device-tiers-5SGJPSYG.js.map +0 -1
- package/dist/diff-EQOPWX3M.js.map +0 -1
- package/dist/external-transactions-O5P4QBIT.js.map +0 -1
- package/dist/games-X57AGM3E.js.map +0 -1
- package/dist/generated-apks-KB2PLWDI.js.map +0 -1
- package/dist/iap-BNIAHBDN.js.map +0 -1
- package/dist/internal-sharing-M74VNIQ2.js.map +0 -1
- package/dist/listings-JOFAZBKU.js.map +0 -1
- package/dist/one-time-products-3WNXDKE3.js.map +0 -1
- package/dist/pricing-OZO66DVL.js.map +0 -1
- package/dist/publish-EPZXLGKZ.js.map +0 -1
- package/dist/purchases-7ZPVCN6D.js.map +0 -1
- package/dist/recovery-YGPOVUFD.js.map +0 -1
- package/dist/reviews-MOVGATUI.js.map +0 -1
- package/dist/subscriptions-LSOJID6H.js.map +0 -1
- package/dist/testers-SDLVWQ2Z.js.map +0 -1
- package/dist/train-PX5Z26PQ.js.map +0 -1
- package/dist/vitals-6EYDCGQK.js.map +0 -1
- /package/dist/{chunk-FIW4GLGP.js.map → chunk-MO6QT7L2.js.map} +0 -0
- /package/dist/{feedback-2V6MLXZH.js.map → feedback-J7LXP3AW.js.map} +0 -0
- /package/dist/{update-EXLKAKOD.js.map → update-W6INIH3K.js.map} +0 -0
- /package/dist/{version-3O6R66WZ.js.map → version-FXP5WOBO.js.map} +0 -0
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolvePackageName
|
|
4
|
+
} from "./chunk-AA577WVQ.js";
|
|
2
5
|
import {
|
|
3
6
|
getOutputFormat
|
|
4
7
|
} from "./chunk-ELXAK7GI.js";
|
|
@@ -8,14 +11,6 @@ import { loadConfig } from "@gpc-cli/config";
|
|
|
8
11
|
import { resolveAuth } from "@gpc-cli/auth";
|
|
9
12
|
import { createReportingClient } from "@gpc-cli/api";
|
|
10
13
|
import { getVitalsAnomalies, formatOutput } from "@gpc-cli/core";
|
|
11
|
-
function resolvePackageName(packageArg, config) {
|
|
12
|
-
const name = packageArg || config.app;
|
|
13
|
-
if (!name) {
|
|
14
|
-
console.error("Error: No package name. Use --app <package> or gpc config set app <package>");
|
|
15
|
-
process.exit(2);
|
|
16
|
-
}
|
|
17
|
-
return name;
|
|
18
|
-
}
|
|
19
14
|
async function getReportingClient(config) {
|
|
20
15
|
const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });
|
|
21
16
|
return createReportingClient({ auth });
|
|
@@ -56,4 +51,4 @@ function registerAnomaliesCommands(program) {
|
|
|
56
51
|
export {
|
|
57
52
|
registerAnomaliesCommands
|
|
58
53
|
};
|
|
59
|
-
//# sourceMappingURL=anomalies-
|
|
54
|
+
//# sourceMappingURL=anomalies-NU2IN2GJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/anomalies.ts"],"sourcesContent":["import { resolvePackageName } from \"../resolve.js\";\nimport type { Command } from \"commander\";\nimport type { GpcConfig } from \"@gpc-cli/config\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createReportingClient } from \"@gpc-cli/api\";\nimport { getVitalsAnomalies, formatOutput } from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\n\n\nasync function getReportingClient(config: GpcConfig) {\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n return createReportingClient({ auth });\n}\n\nexport function registerAnomaliesCommands(program: Command): void {\n const anomalies = program.command(\"anomalies\").description(\"Detect and list vitals anomalies\");\n\n anomalies\n .command(\"list\")\n .description(\"List detected vitals anomalies\")\n .action(async () => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const reporting = await getReportingClient(config);\n const format = getOutputFormat(program, config);\n\n try {\n const result = await getVitalsAnomalies(reporting, packageName);\n const items = (result as unknown as Record<string, unknown>)[\"anomalies\"] as\n | unknown[]\n | undefined;\n\n if (format !== \"json\") {\n if (!items || items.length === 0) {\n console.log(\"No anomalies detected.\");\n return;\n }\n const rows = items.map((item) => {\n const a = item as Record<string, unknown>;\n return {\n name: String(a[\"name\"] ?? \"-\"),\n metricSet: String(a[\"metricSet\"] ?? \"-\"),\n aggregationPeriod: String(a[\"aggregationPeriod\"] ?? \"-\"),\n };\n });\n console.log(formatOutput(rows, format));\n } else {\n console.log(formatOutput(result, format));\n }\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n"],"mappings":";;;;;;;;;AAGA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,6BAA6B;AACtC,SAAS,oBAAoB,oBAAoB;AAIjD,eAAe,mBAAmB,QAAmB;AACnD,QAAM,OAAO,MAAM,YAAY,EAAE,oBAAoB,OAAO,MAAM,eAAe,CAAC;AAClF,SAAO,sBAAsB,EAAE,KAAK,CAAC;AACvC;AAEO,SAAS,0BAA0B,SAAwB;AAChE,QAAM,YAAY,QAAQ,QAAQ,WAAW,EAAE,YAAY,kCAAkC;AAE7F,YACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,YAAY;AAClB,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,cAAc,mBAAmB,QAAQ,KAAK,EAAE,KAAK,GAAG,MAAM;AACpE,UAAM,YAAY,MAAM,mBAAmB,MAAM;AACjD,UAAM,SAAS,gBAAgB,SAAS,MAAM;AAE9C,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB,WAAW,WAAW;AAC9D,YAAM,QAAS,OAA8C,WAAW;AAIxE,UAAI,WAAW,QAAQ;AACrB,YAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,kBAAQ,IAAI,wBAAwB;AACpC;AAAA,QACF;AACA,cAAM,OAAO,MAAM,IAAI,CAAC,SAAS;AAC/B,gBAAM,IAAI;AACV,iBAAO;AAAA,YACL,MAAM,OAAO,EAAE,MAAM,KAAK,GAAG;AAAA,YAC7B,WAAW,OAAO,EAAE,WAAW,KAAK,GAAG;AAAA,YACvC,mBAAmB,OAAO,EAAE,mBAAmB,KAAK,GAAG;AAAA,UACzD;AAAA,QACF,CAAC;AACD,gBAAQ,IAAI,aAAa,MAAM,MAAM,CAAC;AAAA,MACxC,OAAO;AACL,gBAAQ,IAAI,aAAa,QAAQ,MAAM,CAAC;AAAA,MAC1C;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAChF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;","names":[]}
|
package/dist/bin.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
createProgram,
|
|
4
4
|
handleCliError,
|
|
5
5
|
loadPlugins
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-MO6QT7L2.js";
|
|
7
7
|
import {
|
|
8
8
|
checkForUpdate,
|
|
9
9
|
formatUpdateNotification
|
|
@@ -44,7 +44,7 @@ if (!_isJsonMode && !_isQuiet && !existsSync(getUserConfigPath())) {
|
|
|
44
44
|
}
|
|
45
45
|
await setupNetworking();
|
|
46
46
|
initAudit(getConfigDir());
|
|
47
|
-
var currentVersion = "0.9.
|
|
47
|
+
var currentVersion = "0.9.42";
|
|
48
48
|
var isUpdateCommand = process.argv[2] === "update";
|
|
49
49
|
var updateCheckPromise = isUpdateCommand ? Promise.resolve(null) : checkForUpdate(currentVersion);
|
|
50
50
|
if (process.argv.includes("--ci")) {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/resolve.ts
|
|
4
|
+
import { resolveAuth } from "@gpc-cli/auth";
|
|
5
|
+
import { createApiClient, createReportingClient } from "@gpc-cli/api";
|
|
6
|
+
function resolvePackageName(packageArg, config) {
|
|
7
|
+
const name = packageArg || config.app || process.env["GPC_APP"];
|
|
8
|
+
if (!name) {
|
|
9
|
+
console.error("Error: No package name. Use --app <package> or gpc config set app <package>");
|
|
10
|
+
process.exit(2);
|
|
11
|
+
}
|
|
12
|
+
return name;
|
|
13
|
+
}
|
|
14
|
+
async function getClient(config) {
|
|
15
|
+
const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });
|
|
16
|
+
return createApiClient({ auth });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
resolvePackageName,
|
|
21
|
+
getClient
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=chunk-AA577WVQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resolve.ts"],"sourcesContent":["// Named exports only. No default export.\n\nimport type { GpcConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createApiClient, createReportingClient } from \"@gpc-cli/api\";\n\nexport function resolvePackageName(\n packageArg: string | undefined,\n config: { app?: string },\n): string {\n const name = packageArg || config.app || process.env[\"GPC_APP\"];\n if (!name) {\n console.error(\"Error: No package name. Use --app <package> or gpc config set app <package>\");\n process.exit(2);\n }\n return name;\n}\n\nexport async function getClient(config: GpcConfig) {\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n return createApiClient({ auth });\n}\n\nexport async function getReportingClient(config: GpcConfig) {\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n return createReportingClient({ auth });\n}\n"],"mappings":";;;AAGA,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB,6BAA6B;AAEhD,SAAS,mBACd,YACA,QACQ;AACR,QAAM,OAAO,cAAc,OAAO,OAAO,QAAQ,IAAI,SAAS;AAC9D,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,6EAA6E;AAC3F,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,eAAsB,UAAU,QAAmB;AACjD,QAAM,OAAO,MAAM,YAAY,EAAE,oBAAoB,OAAO,MAAM,eAAe,CAAC;AAClF,SAAO,gBAAgB,EAAE,KAAK,CAAC;AACjC;","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.
|
|
70
|
+
program.name("gpc").description("GPC \u2014 Google Play Console CLI").version("0.9.42", "-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-XGSTT5G5.js")).registerAuthCommands(program);
|
|
74
74
|
},
|
|
75
75
|
config: async () => {
|
|
76
|
-
(await import("./config-
|
|
76
|
+
(await import("./config-222P3MKK.js")).registerConfigCommands(program);
|
|
77
77
|
},
|
|
78
78
|
doctor: async () => {
|
|
79
79
|
(await import("./doctor-3Z4ARPM2.js")).registerDoctorCommand(program);
|
|
80
80
|
},
|
|
81
81
|
update: async () => {
|
|
82
|
-
(await import("./update-
|
|
82
|
+
(await import("./update-W6INIH3K.js")).registerUpdateCommand(program);
|
|
83
83
|
},
|
|
84
84
|
docs: async () => {
|
|
85
85
|
(await import("./docs-7DUXIKA3.js")).registerDocsCommand(program);
|
|
@@ -91,7 +91,7 @@ async function createProgram(pluginManager) {
|
|
|
91
91
|
(await import("./apps-J2446UDA.js")).registerAppsCommands(program);
|
|
92
92
|
},
|
|
93
93
|
releases: async () => {
|
|
94
|
-
(await import("./releases-
|
|
94
|
+
(await import("./releases-C2WC2K4E.js")).registerReleasesCommands(program);
|
|
95
95
|
},
|
|
96
96
|
tracks: async () => {
|
|
97
97
|
(await import("./tracks-NERFFEDT.js")).registerTracksCommands(program);
|
|
@@ -100,25 +100,25 @@ async function createProgram(pluginManager) {
|
|
|
100
100
|
(await import("./status-WHGLODGV.js")).registerStatusCommand(program);
|
|
101
101
|
},
|
|
102
102
|
listings: async () => {
|
|
103
|
-
(await import("./listings-
|
|
103
|
+
(await import("./listings-NJWIKN4J.js")).registerListingsCommands(program);
|
|
104
104
|
},
|
|
105
105
|
reviews: async () => {
|
|
106
|
-
(await import("./reviews-
|
|
106
|
+
(await import("./reviews-2B5SKNXW.js")).registerReviewsCommands(program);
|
|
107
107
|
},
|
|
108
108
|
vitals: async () => {
|
|
109
|
-
(await import("./vitals-
|
|
109
|
+
(await import("./vitals-A4CS4MSS.js")).registerVitalsCommands(program);
|
|
110
110
|
},
|
|
111
111
|
subscriptions: async () => {
|
|
112
|
-
(await import("./subscriptions-
|
|
112
|
+
(await import("./subscriptions-4XKNTOOL.js")).registerSubscriptionsCommands(program);
|
|
113
113
|
},
|
|
114
114
|
iap: async () => {
|
|
115
|
-
(await import("./iap-
|
|
115
|
+
(await import("./iap-QTO5Q6SN.js")).registerIapCommands(program);
|
|
116
116
|
},
|
|
117
117
|
purchases: async () => {
|
|
118
|
-
(await import("./purchases-
|
|
118
|
+
(await import("./purchases-745IKIG5.js")).registerPurchasesCommands(program);
|
|
119
119
|
},
|
|
120
120
|
pricing: async () => {
|
|
121
|
-
(await import("./pricing-
|
|
121
|
+
(await import("./pricing-XQSDTTK5.js")).registerPricingCommands(program);
|
|
122
122
|
},
|
|
123
123
|
reports: async () => {
|
|
124
124
|
(await import("./reports-2YX3RDOS.js")).registerReportsCommands(program);
|
|
@@ -127,36 +127,36 @@ async function createProgram(pluginManager) {
|
|
|
127
127
|
(await import("./users-2YTC4Q36.js")).registerUsersCommands(program);
|
|
128
128
|
},
|
|
129
129
|
testers: async () => {
|
|
130
|
-
(await import("./testers-
|
|
130
|
+
(await import("./testers-3Y753PFW.js")).registerTestersCommands(program);
|
|
131
131
|
},
|
|
132
132
|
validate: async () => {
|
|
133
133
|
(await import("./validate-UOVTM6L3.js")).registerValidateCommand(program);
|
|
134
134
|
},
|
|
135
135
|
publish: async () => {
|
|
136
|
-
(await import("./publish-
|
|
136
|
+
(await import("./publish-OJJFPDRM.js")).registerPublishCommand(program);
|
|
137
137
|
},
|
|
138
138
|
recovery: async () => {
|
|
139
|
-
(await import("./recovery-
|
|
139
|
+
(await import("./recovery-BBF6NQ4C.js")).registerRecoveryCommands(program);
|
|
140
140
|
},
|
|
141
141
|
"data-safety": async () => {
|
|
142
|
-
(await import("./data-safety-
|
|
142
|
+
(await import("./data-safety-L64D6ZZX.js")).registerDataSafetyCommands(program);
|
|
143
143
|
},
|
|
144
144
|
"external-transactions": async () => {
|
|
145
|
-
(await import("./external-transactions-
|
|
145
|
+
(await import("./external-transactions-6DWF5U3Q.js")).registerExternalTransactionsCommands(
|
|
146
146
|
program
|
|
147
147
|
);
|
|
148
148
|
},
|
|
149
149
|
"device-tiers": async () => {
|
|
150
|
-
(await import("./device-tiers-
|
|
150
|
+
(await import("./device-tiers-UZVKC726.js")).registerDeviceTiersCommands(program);
|
|
151
151
|
},
|
|
152
152
|
"one-time-products": async () => {
|
|
153
|
-
(await import("./one-time-products-
|
|
153
|
+
(await import("./one-time-products-6CQNNTBX.js")).registerOneTimeProductsCommands(program);
|
|
154
154
|
},
|
|
155
155
|
"internal-sharing": async () => {
|
|
156
|
-
(await import("./internal-sharing-
|
|
156
|
+
(await import("./internal-sharing-DEOI3ENH.js")).registerInternalSharingCommands(program);
|
|
157
157
|
},
|
|
158
158
|
"generated-apks": async () => {
|
|
159
|
-
(await import("./generated-apks-
|
|
159
|
+
(await import("./generated-apks-RJWTIX7L.js")).registerGeneratedApksCommands(program);
|
|
160
160
|
},
|
|
161
161
|
"purchase-options": async () => {
|
|
162
162
|
(await import("./purchase-options-CKRN4VIW.js")).registerPurchaseOptionsCommands(program);
|
|
@@ -171,19 +171,19 @@ async function createProgram(pluginManager) {
|
|
|
171
171
|
(await import("./migrate-SQT6RD6T.js")).registerMigrateCommands(program);
|
|
172
172
|
},
|
|
173
173
|
anomalies: async () => {
|
|
174
|
-
(await import("./anomalies-
|
|
174
|
+
(await import("./anomalies-NU2IN2GJ.js")).registerAnomaliesCommands(program);
|
|
175
175
|
},
|
|
176
176
|
"install-skills": async () => {
|
|
177
177
|
(await import("./install-skills-OV4HVANW.js")).registerInstallSkillsCommand(program);
|
|
178
178
|
},
|
|
179
179
|
version: async () => {
|
|
180
|
-
(await import("./version-
|
|
180
|
+
(await import("./version-FXP5WOBO.js")).registerVersionCommand(program);
|
|
181
181
|
},
|
|
182
182
|
cache: async () => {
|
|
183
183
|
(await import("./cache-SLNFRTI2.js")).registerCacheCommand(program);
|
|
184
184
|
},
|
|
185
185
|
feedback: async () => {
|
|
186
|
-
(await import("./feedback-
|
|
186
|
+
(await import("./feedback-J7LXP3AW.js")).registerFeedbackCommand(program);
|
|
187
187
|
},
|
|
188
188
|
quickstart: async () => {
|
|
189
189
|
(await import("./quickstart-4HB62YEL.js")).registerQuickstartCommand(program);
|
|
@@ -192,19 +192,19 @@ async function createProgram(pluginManager) {
|
|
|
192
192
|
(await import("./grants-TKQJ3IER.js")).registerGrantsCommands(program);
|
|
193
193
|
},
|
|
194
194
|
train: async () => {
|
|
195
|
-
(await import("./train-
|
|
195
|
+
(await import("./train-YA4KGVGZ.js")).registerTrainCommands(program);
|
|
196
196
|
},
|
|
197
197
|
quota: async () => {
|
|
198
198
|
(await import("./quota-UHIQQYOY.js")).registerQuotaCommand(program);
|
|
199
199
|
},
|
|
200
200
|
games: async () => {
|
|
201
|
-
(await import("./games-
|
|
201
|
+
(await import("./games-BT777WUO.js")).registerGamesCommands(program);
|
|
202
202
|
},
|
|
203
203
|
enterprise: async () => {
|
|
204
204
|
(await import("./enterprise-7THXNBTC.js")).registerEnterpriseCommands(program);
|
|
205
205
|
},
|
|
206
206
|
diff: async () => {
|
|
207
|
-
(await import("./diff-
|
|
207
|
+
(await import("./diff-V77SMKAQ.js")).registerDiffCommand(program);
|
|
208
208
|
},
|
|
209
209
|
init: async () => {
|
|
210
210
|
(await import("./init-JZ2THPMS.js")).registerInitCommand(program);
|
|
@@ -444,4 +444,4 @@ export {
|
|
|
444
444
|
createProgram,
|
|
445
445
|
handleCliError
|
|
446
446
|
};
|
|
447
|
-
//# sourceMappingURL=chunk-
|
|
447
|
+
//# sourceMappingURL=chunk-MO6QT7L2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/config.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { loadConfig, setConfigValue, getUserConfigPath, initConfig } from \"@gpc-cli/config\";\nimport { formatOutput, writeAuditLog, createAuditEntry } from \"@gpc-cli/core\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { getOutputFormat } from \"../format.js\";\nimport { isInteractive, promptInput, promptSelect, promptConfirm } from \"../prompt.js\";\n\nconst ANDROID_PACKAGE_RE = /^[a-zA-Z][a-zA-Z0-9_]*(\\.[a-zA-Z][a-zA-Z0-9_]*)+$/;\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command(\"config\").description(\"Manage configuration\");\n\n config\n .command(\"init\")\n .description(\"Create a configuration file\")\n .option(\"--global\", \"Create in user config directory (~/.config/gpc/)\")\n .action(async (_options: { global?: boolean }) => {\n const initialConfig: Record<string, unknown> = {};\n\n if (isInteractive(program)) {\n console.log(\"\\nGPC Setup Wizard\\n\");\n\n // Package name\n const app = await promptInput(\"Default package name (e.g. com.example.app, blank to skip)\");\n if (app) {\n if (!ANDROID_PACKAGE_RE.test(app)) {\n console.error(\n ` Warning: \"${app}\" doesn't look like a valid Android package name — continuing anyway`,\n );\n }\n initialConfig[\"app\"] = app;\n }\n\n // Auth method\n const authMethod = await promptSelect(\n \"Authentication method:\",\n [\"service-account\", \"adc\", \"skip\"],\n \"service-account\",\n );\n\n if (authMethod === \"service-account\") {\n let saPath: string;\n while (true) {\n saPath = await promptInput(\"Path to service account JSON key file\");\n if (!saPath) {\n console.log(\" Skipping service account setup.\");\n break;\n }\n const resolved = resolve(saPath);\n if (existsSync(resolved)) {\n initialConfig[\"auth\"] = { serviceAccount: saPath };\n break;\n }\n console.error(` File not found: ${resolved}`);\n const retry = await promptConfirm(\"Try a different path?\");\n if (!retry) break;\n }\n } else if (authMethod === \"adc\") {\n console.log(\n \" Using Application Default Credentials — run `gcloud auth application-default login` if not already set up.\",\n );\n }\n\n // Output format\n const output = await promptSelect(\n \"Default output format:\",\n [\"table\", \"json\", \"yaml\", \"markdown\"],\n \"table\",\n );\n if (output !== \"table\") initialConfig[\"output\"] = output;\n }\n\n const path = await initConfig(initialConfig as GpcConfig);\n\n // Summary\n const configured: string[] = [];\n if (initialConfig[\"app\"]) configured.push(`app: ${initialConfig[\"app\"]}`);\n if (initialConfig[\"auth\"]) configured.push(\"auth: service account\");\n if (initialConfig[\"output\"]) configured.push(`output: ${initialConfig[\"output\"]}`);\n\n console.log(`\\nConfiguration file created: ${path}`);\n if (configured.length > 0) {\n console.log(` ${configured.join(\" · \")}`);\n }\n\n writeAuditLog(createAuditEntry(\"config init\", { path })).catch(() => {});\n\n // Run doctor inline to verify setup\n console.log(\"\\nVerifying setup...\");\n try {\n const { registerDoctorCommand } = await import(\"./doctor.js\");\n const { Command } = await import(\"commander\");\n const doctorProgram = new Command();\n doctorProgram\n .option(\"-o, --output <format>\", \"Output format\")\n .option(\"-j, --json\", \"JSON mode\");\n registerDoctorCommand(doctorProgram);\n await doctorProgram.parseAsync([\"node\", \"gpc\", \"doctor\"]);\n } catch {\n // Doctor failures should not prevent config init from succeeding\n console.log(\"Run `gpc doctor` to verify your setup.\");\n }\n });\n\n config\n .command(\"show\")\n .description(\"Display resolved configuration\")\n .action(async () => {\n const resolved = await loadConfig();\n const format = getOutputFormat(program, resolved);\n console.log(formatOutput(resolved, format));\n });\n\n config\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .action(async (key: string, value: string) => {\n await setConfigValue(key, value);\n console.log(`Set ${key} = ${value}`);\n });\n\n config\n .command(\"path\")\n .description(\"Show configuration file path\")\n .action(() => {\n console.log(getUserConfigPath());\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,27 +3,17 @@ import {
|
|
|
3
3
|
isDryRun,
|
|
4
4
|
printDryRun
|
|
5
5
|
} from "./chunk-Y3QZDAKS.js";
|
|
6
|
+
import {
|
|
7
|
+
getClient,
|
|
8
|
+
resolvePackageName
|
|
9
|
+
} from "./chunk-AA577WVQ.js";
|
|
6
10
|
import {
|
|
7
11
|
getOutputFormat
|
|
8
12
|
} from "./chunk-ELXAK7GI.js";
|
|
9
13
|
|
|
10
14
|
// src/commands/data-safety.ts
|
|
11
15
|
import { loadConfig } from "@gpc-cli/config";
|
|
12
|
-
import { resolveAuth } from "@gpc-cli/auth";
|
|
13
|
-
import { createApiClient } from "@gpc-cli/api";
|
|
14
16
|
import { importDataSafety, formatOutput } from "@gpc-cli/core";
|
|
15
|
-
function resolvePackageName(packageArg, config) {
|
|
16
|
-
const name = packageArg || config.app;
|
|
17
|
-
if (!name) {
|
|
18
|
-
console.error("Error: No package name. Use --app <package> or gpc config set app <package>");
|
|
19
|
-
process.exit(2);
|
|
20
|
-
}
|
|
21
|
-
return name;
|
|
22
|
-
}
|
|
23
|
-
async function getClient(config) {
|
|
24
|
-
const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });
|
|
25
|
-
return createApiClient({ auth });
|
|
26
|
-
}
|
|
27
17
|
function registerDataSafetyCommands(program) {
|
|
28
18
|
const dataSafety = program.command("data-safety").description("Manage data safety declarations");
|
|
29
19
|
dataSafety.command("get").description("Get the current data safety declaration").action(async () => {
|
|
@@ -79,4 +69,4 @@ function registerDataSafetyCommands(program) {
|
|
|
79
69
|
export {
|
|
80
70
|
registerDataSafetyCommands
|
|
81
71
|
};
|
|
82
|
-
//# sourceMappingURL=data-safety-
|
|
72
|
+
//# sourceMappingURL=data-safety-L64D6ZZX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/data-safety.ts"],"sourcesContent":["import { resolvePackageName, getClient } from \"../resolve.js\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\n\nimport { importDataSafety, formatOutput } from \"@gpc-cli/core\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { getOutputFormat } from \"../format.js\";\n\n\n\nexport function registerDataSafetyCommands(program: Command): void {\n const dataSafety = program.command(\"data-safety\").description(\"Manage data safety declarations\");\n\n // Get — not supported by Google Play API (no GET endpoint for data safety)\n dataSafety\n .command(\"get\")\n .description(\"Get the current data safety declaration\")\n .action(async () => {\n console.error(\n \"Error: The Google Play Developer API does not provide a GET endpoint for data safety declarations.\",\n );\n console.error(\"\");\n console.error(\"Data safety labels can only be updated (not read) via the API.\");\n console.error(\"To view your current data safety declaration, use the Google Play Console:\");\n console.error(\" https://play.google.com/console → App content → Data safety\");\n console.error(\"\");\n console.error(\n \"To update data safety via the API, use: gpc data-safety update --file <csv-file>\",\n );\n process.exit(2);\n });\n\n // Update\n dataSafety\n .command(\"update\")\n .description(\"Update data safety declaration from a JSON file\")\n .requiredOption(\"--file <path>\", \"Path to data safety JSON file\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"data-safety update\",\n action: \"update data safety from\",\n target: options.file,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const result = await importDataSafety(client, packageName, options.file);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n // Export — not supported (no GET endpoint)\n dataSafety\n .command(\"export\")\n .description(\"Export data safety declaration to a JSON file\")\n .option(\"--output <path>\", \"Output file path\", \"data-safety.json\")\n .action(async () => {\n console.error(\n \"Error: The Google Play Developer API does not provide a GET endpoint for data safety declarations.\",\n );\n console.error(\"Data safety labels cannot be exported via the API.\");\n console.error(\"\");\n console.error(\"To export your data safety declaration, use the Google Play Console:\");\n console.error(\" App content → Data safety → Export to CSV\");\n process.exit(2);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AAEA,SAAS,kBAAkB;AAE3B,SAAS,kBAAkB,oBAAoB;AAMxC,SAAS,2BAA2B,SAAwB;AACjE,QAAM,aAAa,QAAQ,QAAQ,aAAa,EAAE,YAAY,iCAAiC;AAG/F,aACG,QAAQ,KAAK,EACb,YAAY,yCAAyC,EACrD,OAAO,YAAY;AAClB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,MAAM,EAAE;AAChB,YAAQ,MAAM,gEAAgE;AAC9E,YAAQ,MAAM,4EAA4E;AAC1F,YAAQ,MAAM,yEAA+D;AAC7E,YAAQ,MAAM,EAAE;AAChB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAGH,aACG,QAAQ,QAAQ,EAChB,YAAY,iDAAiD,EAC7D,eAAe,iBAAiB,+BAA+B,EAC/D,OAAO,OAAO,YAAY;AACzB,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,cAAc,mBAAmB,QAAQ,KAAK,EAAE,KAAK,GAAG,MAAM;AACpE,UAAM,SAAS,gBAAgB,SAAS,MAAM;AAE9C,QAAI,SAAS,OAAO,GAAG;AACrB;AAAA,QACE;AAAA,UACE,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,UAAU,MAAM;AAErC,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,QAAQ,aAAa,QAAQ,IAAI;AACvE,cAAQ,IAAI,aAAa,QAAQ,MAAM,CAAC;AAAA,IAC1C,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAChF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,aACG,QAAQ,QAAQ,EAChB,YAAY,+CAA+C,EAC3D,OAAO,mBAAmB,oBAAoB,kBAAkB,EAChE,OAAO,YAAY;AAClB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,MAAM,oDAAoD;AAClE,YAAQ,MAAM,EAAE;AAChB,YAAQ,MAAM,sEAAsE;AACpF,YAAQ,MAAM,uDAA6C;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACL;","names":[]}
|
|
@@ -3,28 +3,18 @@ import {
|
|
|
3
3
|
isDryRun,
|
|
4
4
|
printDryRun
|
|
5
5
|
} from "./chunk-Y3QZDAKS.js";
|
|
6
|
+
import {
|
|
7
|
+
getClient,
|
|
8
|
+
resolvePackageName
|
|
9
|
+
} from "./chunk-AA577WVQ.js";
|
|
6
10
|
import {
|
|
7
11
|
getOutputFormat
|
|
8
12
|
} from "./chunk-ELXAK7GI.js";
|
|
9
13
|
|
|
10
14
|
// src/commands/device-tiers.ts
|
|
11
15
|
import { loadConfig } from "@gpc-cli/config";
|
|
12
|
-
import { resolveAuth } from "@gpc-cli/auth";
|
|
13
|
-
import { createApiClient } from "@gpc-cli/api";
|
|
14
16
|
import { listDeviceTiers, getDeviceTier, createDeviceTier, formatOutput } from "@gpc-cli/core";
|
|
15
17
|
import { readFile } from "fs/promises";
|
|
16
|
-
function resolvePackageName(packageArg, config) {
|
|
17
|
-
const name = packageArg || config.app;
|
|
18
|
-
if (!name) {
|
|
19
|
-
console.error("Error: No package name. Use --app <package> or gpc config set app <package>");
|
|
20
|
-
process.exit(2);
|
|
21
|
-
}
|
|
22
|
-
return name;
|
|
23
|
-
}
|
|
24
|
-
async function getClient(config) {
|
|
25
|
-
const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });
|
|
26
|
-
return createApiClient({ auth });
|
|
27
|
-
}
|
|
28
18
|
function registerDeviceTiersCommands(program) {
|
|
29
19
|
const dt = program.command("device-tiers").description("Manage device tier configurations");
|
|
30
20
|
dt.command("list").description("List device tier configurations").action(async () => {
|
|
@@ -98,4 +88,4 @@ function registerDeviceTiersCommands(program) {
|
|
|
98
88
|
export {
|
|
99
89
|
registerDeviceTiersCommands
|
|
100
90
|
};
|
|
101
|
-
//# sourceMappingURL=device-tiers-
|
|
91
|
+
//# sourceMappingURL=device-tiers-UZVKC726.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/device-tiers.ts"],"sourcesContent":["import { resolvePackageName, getClient } from \"../resolve.js\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\n\nimport { listDeviceTiers, getDeviceTier, createDeviceTier, formatOutput } from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { readFile } from \"node:fs/promises\";\n\n\n\nexport function registerDeviceTiersCommands(program: Command): void {\n const dt = program.command(\"device-tiers\").description(\"Manage device tier configurations\");\n\n dt.command(\"list\")\n .description(\"List device tier configurations\")\n .action(async () => {\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 try {\n const result = await listDeviceTiers(client, packageName);\n const configs = (result as unknown as Record<string, unknown>)[\"deviceTierConfigs\"] as\n | Record<string, unknown>[]\n | undefined;\n if (format !== \"json\" && (!configs || configs.length === 0)) {\n console.log(\"No device tier configs found.\");\n return;\n }\n if (format !== \"json\" && configs) {\n const rows = configs.map((c) => ({\n deviceTierConfigId: c[\"deviceTierConfigId\"] || \"-\",\n deviceGroups: Array.isArray(c[\"deviceGroups\"])\n ? (c[\"deviceGroups\"] as unknown[]).length\n : 0,\n deviceTierSet: c[\"deviceTierSet\"] ? \"yes\" : \"no\",\n }));\n console.log(formatOutput(rows, format));\n } else {\n console.log(formatOutput(result, format));\n }\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n dt.command(\"get <config-id>\")\n .description(\"Get a device tier configuration\")\n .action(async (configId: string) => {\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 try {\n const result = await getDeviceTier(client, packageName, configId);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n dt.command(\"create\")\n .description(\"Create a device tier configuration from a JSON file\")\n .requiredOption(\"--file <path>\", \"Path to JSON config file\")\n .action(async (opts: { file: string }) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"device-tiers create\",\n action: \"create device tier config from\",\n target: opts.file,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const raw = await readFile(opts.file, \"utf-8\");\n const tierConfig = JSON.parse(raw);\n const result = await createDeviceTier(client, packageName, tierConfig);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolvePackageName
|
|
4
|
+
} from "./chunk-AA577WVQ.js";
|
|
2
5
|
import {
|
|
3
6
|
bold,
|
|
4
7
|
dim,
|
|
@@ -15,14 +18,6 @@ import { loadConfig } from "@gpc-cli/config";
|
|
|
15
18
|
import { resolveAuth } from "@gpc-cli/auth";
|
|
16
19
|
import { createApiClient } from "@gpc-cli/api";
|
|
17
20
|
import { getReleasesStatus, diffReleases, diffListingsCommand, formatOutput } from "@gpc-cli/core";
|
|
18
|
-
function resolvePackageName(cliApp, config) {
|
|
19
|
-
const pkg = cliApp || config.app || process.env["GPC_APP"];
|
|
20
|
-
if (!pkg) {
|
|
21
|
-
console.error("Error: No package name. Use --app, set GPC_APP, or add 'app' to .gpcrc.json");
|
|
22
|
-
process.exit(2);
|
|
23
|
-
}
|
|
24
|
-
return pkg;
|
|
25
|
-
}
|
|
26
21
|
function registerDiffCommand(program) {
|
|
27
22
|
program.command("diff").description("Preview current release state and pending changes (read-only)").option("--from <track>", "Compare releases from this track").option("--to <track>", "Compare releases to this track").option("--metadata <dir>", "Compare local metadata directory vs remote listings").action(async (options) => {
|
|
28
23
|
const config = await loadConfig();
|
|
@@ -98,4 +93,4 @@ function registerDiffCommand(program) {
|
|
|
98
93
|
export {
|
|
99
94
|
registerDiffCommand
|
|
100
95
|
};
|
|
101
|
-
//# sourceMappingURL=diff-
|
|
96
|
+
//# sourceMappingURL=diff-V77SMKAQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/diff.ts"],"sourcesContent":["import { resolvePackageName } from \"../resolve.js\";\n// Named exports only. No default export.\n\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createApiClient } from \"@gpc-cli/api\";\nimport { getReleasesStatus, diffReleases, diffListingsCommand, formatOutput } from \"@gpc-cli/core\";\nimport type { ReleaseDiff } from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { green, red, yellow, dim, bold } from \"../colors.js\";\n\n\nexport function registerDiffCommand(program: Command): void {\n program\n .command(\"diff\")\n .description(\"Preview current release state and pending changes (read-only)\")\n .option(\"--from <track>\", \"Compare releases from this track\")\n .option(\"--to <track>\", \"Compare releases to this track\")\n .option(\"--metadata <dir>\", \"Compare local metadata directory vs remote listings\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n const client = createApiClient({ auth });\n\n try {\n const sections: Record<string, unknown> = {};\n\n // Always show release status across all tracks\n const releases = await getReleasesStatus(client, packageName);\n sections[\"releases\"] = releases;\n\n // Track-to-track diff if specified\n let trackDiff: { fromTrack: string; toTrack: string; diffs: ReleaseDiff[] } | undefined;\n if (options.from && options.to) {\n trackDiff = await diffReleases(client, packageName, options.from, options.to);\n sections[\"trackDiff\"] = trackDiff;\n }\n\n // Metadata diff if specified\n let metadataDiff: unknown;\n if (options.metadata) {\n metadataDiff = await diffListingsCommand(client, packageName, options.metadata);\n sections[\"metadata\"] = metadataDiff;\n }\n\n if (format === \"json\") {\n console.log(formatOutput(sections, format));\n return;\n }\n\n // Human-readable output\n console.log(bold(\"GPC Diff — Current State\"));\n console.log(\"\");\n\n // Release status\n console.log(bold(\"Releases\"));\n if (releases.length === 0) {\n console.log(dim(\" No releases found\"));\n } else {\n for (const r of releases) {\n const statusColor =\n r.status === \"completed\" ? green : r.status === \"inProgress\" ? yellow : dim;\n const fraction = r.userFraction\n ? ` ${yellow(`${Math.round(r.userFraction * 100)}%`)}`\n : \"\";\n const versions = r.versionCodes.join(\", \");\n console.log(\n ` ${r.track.padEnd(14)} ${statusColor(r.status.padEnd(12))} v${versions}${fraction}`,\n );\n }\n }\n console.log(\"\");\n\n // Track diff\n if (trackDiff) {\n console.log(bold(`Track Diff: ${trackDiff.fromTrack} → ${trackDiff.toTrack}`));\n if (trackDiff.diffs.length === 0) {\n console.log(dim(\" No differences\"));\n } else {\n for (const d of trackDiff.diffs) {\n console.log(\n ` ${d.field.padEnd(16)} ${red(d.track1Value || \"(empty)\")} → ${green(d.track2Value || \"(empty)\")}`,\n );\n }\n }\n console.log(\"\");\n }\n\n // Metadata diff\n if (metadataDiff && Array.isArray(metadataDiff)) {\n console.log(bold(\"Metadata Diff (local vs remote)\"));\n if (metadataDiff.length === 0) {\n console.log(dim(\" No differences — local matches remote\"));\n } else {\n for (const d of metadataDiff as Array<{\n language: string;\n field: string;\n status: string;\n }>) {\n const icon =\n d.status === \"added\" ? green(\"+\") : d.status === \"removed\" ? red(\"-\") : yellow(\"~\");\n console.log(` ${icon} ${d.language}/${d.field}: ${d.status}`);\n }\n }\n console.log(\"\");\n }\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,6 +3,10 @@ import {
|
|
|
3
3
|
isDryRun,
|
|
4
4
|
printDryRun
|
|
5
5
|
} from "./chunk-Y3QZDAKS.js";
|
|
6
|
+
import {
|
|
7
|
+
getClient,
|
|
8
|
+
resolvePackageName
|
|
9
|
+
} from "./chunk-AA577WVQ.js";
|
|
6
10
|
import {
|
|
7
11
|
getOutputFormat
|
|
8
12
|
} from "./chunk-ELXAK7GI.js";
|
|
@@ -12,8 +16,6 @@ import {
|
|
|
12
16
|
|
|
13
17
|
// src/commands/external-transactions.ts
|
|
14
18
|
import { loadConfig } from "@gpc-cli/config";
|
|
15
|
-
import { resolveAuth } from "@gpc-cli/auth";
|
|
16
|
-
import { createApiClient } from "@gpc-cli/api";
|
|
17
19
|
import {
|
|
18
20
|
createExternalTransaction,
|
|
19
21
|
getExternalTransaction,
|
|
@@ -21,18 +23,6 @@ import {
|
|
|
21
23
|
formatOutput
|
|
22
24
|
} from "@gpc-cli/core";
|
|
23
25
|
import { readFileSync } from "fs";
|
|
24
|
-
function resolvePackageName(packageArg, config) {
|
|
25
|
-
const name = packageArg || config.app;
|
|
26
|
-
if (!name) {
|
|
27
|
-
console.error("Error: No package name. Use --app <package> or gpc config set app <package>");
|
|
28
|
-
process.exit(2);
|
|
29
|
-
}
|
|
30
|
-
return name;
|
|
31
|
-
}
|
|
32
|
-
async function getClient(config) {
|
|
33
|
-
const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });
|
|
34
|
-
return createApiClient({ auth });
|
|
35
|
-
}
|
|
36
26
|
function registerExternalTransactionsCommands(program) {
|
|
37
27
|
const extTxn = program.command("external-transactions").alias("ext-txn").description("Manage external transactions (alternative billing)");
|
|
38
28
|
extTxn.command("create").description("Create a new external transaction").requiredOption("--file <path>", "Path to JSON file with transaction data").action(async (options) => {
|
|
@@ -127,4 +117,4 @@ function registerExternalTransactionsCommands(program) {
|
|
|
127
117
|
export {
|
|
128
118
|
registerExternalTransactionsCommands
|
|
129
119
|
};
|
|
130
|
-
//# sourceMappingURL=external-transactions-
|
|
120
|
+
//# sourceMappingURL=external-transactions-6DWF5U3Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/external-transactions.ts"],"sourcesContent":["import { resolvePackageName, getClient } from \"../resolve.js\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\n\nimport {\n createExternalTransaction,\n getExternalTransaction,\n refundExternalTransaction,\n formatOutput,\n} from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { requireConfirm } from \"../prompt.js\";\nimport { readFileSync } from \"node:fs\";\n\n\n\nexport function registerExternalTransactionsCommands(program: Command): void {\n const extTxn = program\n .command(\"external-transactions\")\n .alias(\"ext-txn\")\n .description(\"Manage external transactions (alternative billing)\");\n\n extTxn\n .command(\"create\")\n .description(\"Create a new external transaction\")\n .requiredOption(\"--file <path>\", \"Path to JSON file with transaction data\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(readFileSync(options.file, \"utf-8\"));\n } catch (err) {\n console.error(\n `Error: Could not read transaction data from ${options.file}: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(2);\n }\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"external-transactions create\",\n action: \"create external transaction\",\n target: packageName,\n details: data,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const result = await createExternalTransaction(client, packageName, data);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n extTxn\n .command(\"get <id>\")\n .description(\"Get an external transaction by ID\")\n .action(async (id: string) => {\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 try {\n const result = await getExternalTransaction(client, packageName, id);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n extTxn\n .command(\"refund <id>\")\n .description(\"Refund an external transaction\")\n .option(\"--full\", \"Full refund\")\n .option(\"--partial-amount <micros>\", \"Partial refund pre-tax amount in micros (e.g., 1990000)\")\n .option(\"--currency <code>\", \"Currency code for partial refund (e.g. USD)\")\n .action(async (id: string, options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n const refundData: Record<string, unknown> = {};\n if (options.full) {\n refundData[\"fullRefund\"] = {};\n } else if (options.partialAmount) {\n refundData[\"partialRefund\"] = {\n refundPreTaxAmount: {\n priceMicros: options.partialAmount,\n currency: options.currency,\n },\n };\n } else {\n refundData[\"fullRefund\"] = {};\n }\n\n await requireConfirm(`Refund external transaction \"${id}\"?`, program);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"external-transactions refund\",\n action: \"refund external transaction\",\n target: id,\n details: refundData,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const result = await refundExternalTransaction(client, packageName, id, refundData);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -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.
|
|
12
|
+
const version = "0.9.42";
|
|
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-
|
|
70
|
+
//# sourceMappingURL=feedback-J7LXP3AW.js.map
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolvePackageName
|
|
4
|
+
} from "./chunk-AA577WVQ.js";
|
|
2
5
|
import {
|
|
3
6
|
getOutputFormat
|
|
4
7
|
} from "./chunk-ELXAK7GI.js";
|
|
@@ -8,15 +11,7 @@ import { loadConfig } from "@gpc-cli/config";
|
|
|
8
11
|
import { resolveAuth } from "@gpc-cli/auth";
|
|
9
12
|
import { createGamesClient } from "@gpc-cli/api";
|
|
10
13
|
import { listLeaderboards, listAchievements, listEvents, formatOutput } from "@gpc-cli/core";
|
|
11
|
-
function
|
|
12
|
-
const name = packageArg || config.app;
|
|
13
|
-
if (!name) {
|
|
14
|
-
console.error("Error: No package name. Use --app <package> or gpc config set app <package>");
|
|
15
|
-
process.exit(2);
|
|
16
|
-
}
|
|
17
|
-
return name;
|
|
18
|
-
}
|
|
19
|
-
async function getClient(config) {
|
|
14
|
+
async function getGamesClient(config) {
|
|
20
15
|
const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });
|
|
21
16
|
return createGamesClient({ auth });
|
|
22
17
|
}
|
|
@@ -25,7 +20,7 @@ function registerGamesCommands(program) {
|
|
|
25
20
|
games.command("leaderboards").description("List leaderboards for the app").action(async () => {
|
|
26
21
|
const config = await loadConfig();
|
|
27
22
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
28
|
-
const client = await
|
|
23
|
+
const client = await getGamesClient(config);
|
|
29
24
|
const format = getOutputFormat(program, config);
|
|
30
25
|
try {
|
|
31
26
|
const result = await listLeaderboards(client, packageName);
|
|
@@ -42,7 +37,7 @@ function registerGamesCommands(program) {
|
|
|
42
37
|
games.command("achievements").description("List achievements for the app").action(async () => {
|
|
43
38
|
const config = await loadConfig();
|
|
44
39
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
45
|
-
const client = await
|
|
40
|
+
const client = await getGamesClient(config);
|
|
46
41
|
const format = getOutputFormat(program, config);
|
|
47
42
|
try {
|
|
48
43
|
const result = await listAchievements(client, packageName);
|
|
@@ -59,7 +54,7 @@ function registerGamesCommands(program) {
|
|
|
59
54
|
games.command("events").description("List events for the app").action(async () => {
|
|
60
55
|
const config = await loadConfig();
|
|
61
56
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
62
|
-
const client = await
|
|
57
|
+
const client = await getGamesClient(config);
|
|
63
58
|
const format = getOutputFormat(program, config);
|
|
64
59
|
try {
|
|
65
60
|
const result = await listEvents(client, packageName);
|
|
@@ -77,4 +72,4 @@ function registerGamesCommands(program) {
|
|
|
77
72
|
export {
|
|
78
73
|
registerGamesCommands
|
|
79
74
|
};
|
|
80
|
-
//# sourceMappingURL=games-
|
|
75
|
+
//# sourceMappingURL=games-BT777WUO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/games.ts"],"sourcesContent":["import { resolvePackageName } from \"../resolve.js\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createGamesClient } from \"@gpc-cli/api\";\nimport { listLeaderboards, listAchievements, listEvents, formatOutput } from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\n\nasync function getGamesClient(config: { auth?: { serviceAccount?: string } }) {\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n return createGamesClient({ auth });\n}\n\n\n\nexport function registerGamesCommands(program: Command): void {\n const games = program\n .command(\"games\")\n .description(\"Manage Play Games Services — leaderboards, achievements, events\");\n\n games\n .command(\"leaderboards\")\n .description(\"List leaderboards for the app\")\n .action(async () => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getGamesClient(config);\n const format = getOutputFormat(program, config);\n\n try {\n const result = await listLeaderboards(client, packageName);\n if (result.length === 0 && format !== \"json\") {\n console.log(\"No leaderboards found.\");\n return;\n }\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n games\n .command(\"achievements\")\n .description(\"List achievements for the app\")\n .action(async () => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getGamesClient(config);\n const format = getOutputFormat(program, config);\n\n try {\n const result = await listAchievements(client, packageName);\n if (result.length === 0 && format !== \"json\") {\n console.log(\"No achievements found.\");\n return;\n }\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n games\n .command(\"events\")\n .description(\"List events for the app\")\n .action(async () => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getGamesClient(config);\n const format = getOutputFormat(program, config);\n\n try {\n const result = await listEvents(client, packageName);\n if (result.length === 0 && format !== \"json\") {\n console.log(\"No events found.\");\n return;\n }\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n"],"mappings":";;;;;;;;;AAEA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC,SAAS,kBAAkB,kBAAkB,YAAY,oBAAoB;AAG7E,eAAe,eAAe,QAAgD;AAC5E,QAAM,OAAO,MAAM,YAAY,EAAE,oBAAoB,OAAO,MAAM,eAAe,CAAC;AAClF,SAAO,kBAAkB,EAAE,KAAK,CAAC;AACnC;AAIO,SAAS,sBAAsB,SAAwB;AAC5D,QAAM,QAAQ,QACX,QAAQ,OAAO,EACf,YAAY,sEAAiE;AAEhF,QACG,QAAQ,cAAc,EACtB,YAAY,+BAA+B,EAC3C,OAAO,YAAY;AAClB,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,cAAc,mBAAmB,QAAQ,KAAK,EAAE,KAAK,GAAG,MAAM;AACpE,UAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,UAAM,SAAS,gBAAgB,SAAS,MAAM;AAE9C,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,QAAQ,WAAW;AACzD,UAAI,OAAO,WAAW,KAAK,WAAW,QAAQ;AAC5C,gBAAQ,IAAI,wBAAwB;AACpC;AAAA,MACF;AACA,cAAQ,IAAI,aAAa,QAAQ,MAAM,CAAC;AAAA,IAC1C,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAChF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,cAAc,EACtB,YAAY,+BAA+B,EAC3C,OAAO,YAAY;AAClB,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,cAAc,mBAAmB,QAAQ,KAAK,EAAE,KAAK,GAAG,MAAM;AACpE,UAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,UAAM,SAAS,gBAAgB,SAAS,MAAM;AAE9C,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,QAAQ,WAAW;AACzD,UAAI,OAAO,WAAW,KAAK,WAAW,QAAQ;AAC5C,gBAAQ,IAAI,wBAAwB;AACpC;AAAA,MACF;AACA,cAAQ,IAAI,aAAa,QAAQ,MAAM,CAAC;AAAA,IAC1C,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAChF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,OAAO,YAAY;AAClB,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,cAAc,mBAAmB,QAAQ,KAAK,EAAE,KAAK,GAAG,MAAM;AACpE,UAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,UAAM,SAAS,gBAAgB,SAAS,MAAM;AAE9C,QAAI;AACF,YAAM,SAAS,MAAM,WAAW,QAAQ,WAAW;AACnD,UAAI,OAAO,WAAW,KAAK,WAAW,QAAQ;AAC5C,gBAAQ,IAAI,kBAAkB;AAC9B;AAAA,MACF;AACA,cAAQ,IAAI,aAAa,QAAQ,MAAM,CAAC;AAAA,IAC1C,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAChF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;","names":[]}
|
|
@@ -1,25 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getClient,
|
|
4
|
+
resolvePackageName
|
|
5
|
+
} from "./chunk-AA577WVQ.js";
|
|
2
6
|
import {
|
|
3
7
|
getOutputFormat
|
|
4
8
|
} from "./chunk-ELXAK7GI.js";
|
|
5
9
|
|
|
6
10
|
// src/commands/generated-apks.ts
|
|
7
11
|
import { loadConfig } from "@gpc-cli/config";
|
|
8
|
-
import { resolveAuth } from "@gpc-cli/auth";
|
|
9
|
-
import { createApiClient } from "@gpc-cli/api";
|
|
10
12
|
import { listGeneratedApks, downloadGeneratedApk, formatOutput } from "@gpc-cli/core";
|
|
11
|
-
function resolvePackageName(packageArg, config) {
|
|
12
|
-
const name = packageArg || config.app;
|
|
13
|
-
if (!name) {
|
|
14
|
-
console.error("Error: No package name. Use --app <package> or gpc config set app <package>");
|
|
15
|
-
process.exit(2);
|
|
16
|
-
}
|
|
17
|
-
return name;
|
|
18
|
-
}
|
|
19
|
-
async function getClient(config) {
|
|
20
|
-
const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });
|
|
21
|
-
return createApiClient({ auth });
|
|
22
|
-
}
|
|
23
13
|
function registerGeneratedApksCommands(program) {
|
|
24
14
|
const cmd = program.command("generated-apks").description("Manage device-specific APKs generated by Google Play");
|
|
25
15
|
cmd.command("list <version-code>").description("List generated APKs for a version code").action(async (versionCodeStr) => {
|
|
@@ -83,4 +73,4 @@ function registerGeneratedApksCommands(program) {
|
|
|
83
73
|
export {
|
|
84
74
|
registerGeneratedApksCommands
|
|
85
75
|
};
|
|
86
|
-
//# sourceMappingURL=generated-apks-
|
|
76
|
+
//# sourceMappingURL=generated-apks-RJWTIX7L.js.map
|