@gpc-cli/cli 0.9.63 → 0.9.65
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/README.md +19 -15
- package/dist/{__complete-QFD3SUAO.js → __complete-AZXI2O25.js} +2 -4
- package/dist/__complete-AZXI2O25.js.map +1 -0
- package/dist/{audit-M7GYID74.js → audit-BDPS5ODN.js} +4 -4
- package/dist/bin.js +2 -2
- package/dist/{changelog-MPBEELTH.js → changelog-STYBBYDC.js} +70 -6
- package/dist/changelog-STYBBYDC.js.map +1 -0
- package/dist/{chunk-QXXXY5CO.js → chunk-DQD2S5QH.js} +29 -29
- package/dist/{completion-4I3IJK3M.js → completion-ZK7RPPFD.js} +7 -3
- package/dist/{completion-4I3IJK3M.js.map → completion-ZK7RPPFD.js.map} +1 -1
- package/dist/{config-JMLIMKYJ.js → config-7TY5HS4Z.js} +5 -5
- package/dist/docs-OU6LSSJD.js +387 -0
- package/dist/docs-OU6LSSJD.js.map +1 -0
- package/dist/{doctor-2R7WLRD4.js → doctor-BSUL4C2Q.js} +5 -5
- package/dist/{enterprise-SIKXDT64.js → enterprise-L7DTIX2O.js} +4 -4
- package/dist/{external-transactions-JL3G4IG5.js → external-transactions-BP42CK3H.js} +4 -4
- package/dist/{feedback-MLQTM5EB.js → feedback-X5BBSC5I.js} +2 -2
- package/dist/generated/docs-bundle.json +1 -0
- package/dist/{grants-UHNBPIFD.js → grants-32DED5QL.js} +4 -4
- package/dist/{iap-ETOL7OAC.js → iap-EPJ76IAC.js} +4 -4
- package/dist/index.js +1 -1
- package/dist/{init-6CCSVJC2.js → init-OCBFI4VH.js} +6 -6
- package/dist/{listings-2Z6DSO3D.js → listings-QKRIVZG6.js} +6 -6
- package/dist/{one-time-products-Y5RNIPV2.js → one-time-products-OIDBVCFE.js} +4 -4
- package/dist/{publish-5HZAJEDZ.js → publish-H2IAOKP7.js} +4 -4
- package/dist/{purchases-AHWGLW6V.js → purchases-GFLYTKR3.js} +4 -4
- package/dist/{recovery-B7DZQ6XG.js → recovery-2VJJLAIQ.js} +4 -4
- package/dist/{releases-XY57V22L.js → releases-RTF5NPTD.js} +4 -4
- package/dist/{reviews-P4M6BEJI.js → reviews-GZ2VOIRN.js} +4 -4
- package/dist/{subscriptions-GTVJB4HX.js → subscriptions-JPHFBREY.js} +4 -4
- package/dist/{system-apks-L6M7QYB3.js → system-apks-KWTN5LHO.js} +4 -4
- package/dist/{testers-FGLBJAXL.js → testers-7ILUCKYB.js} +4 -4
- package/dist/{train-D2NKUW3M.js → train-G44NEK43.js} +4 -4
- package/dist/{update-MHWSESO4.js → update-POERCYHW.js} +2 -2
- package/dist/{users-FOMAT7DY.js → users-W66YCFDX.js} +4 -4
- package/dist/{version-ZHOZKZ2I.js → version-2HT32CYP.js} +2 -2
- package/package.json +5 -3
- package/dist/__complete-QFD3SUAO.js.map +0 -1
- package/dist/changelog-MPBEELTH.js.map +0 -1
- package/dist/docs-GP6AEX4N.js +0 -115
- package/dist/docs-GP6AEX4N.js.map +0 -1
- /package/dist/{audit-M7GYID74.js.map → audit-BDPS5ODN.js.map} +0 -0
- /package/dist/{chunk-QXXXY5CO.js.map → chunk-DQD2S5QH.js.map} +0 -0
- /package/dist/{config-JMLIMKYJ.js.map → config-7TY5HS4Z.js.map} +0 -0
- /package/dist/{doctor-2R7WLRD4.js.map → doctor-BSUL4C2Q.js.map} +0 -0
- /package/dist/{enterprise-SIKXDT64.js.map → enterprise-L7DTIX2O.js.map} +0 -0
- /package/dist/{external-transactions-JL3G4IG5.js.map → external-transactions-BP42CK3H.js.map} +0 -0
- /package/dist/{feedback-MLQTM5EB.js.map → feedback-X5BBSC5I.js.map} +0 -0
- /package/dist/{grants-UHNBPIFD.js.map → grants-32DED5QL.js.map} +0 -0
- /package/dist/{iap-ETOL7OAC.js.map → iap-EPJ76IAC.js.map} +0 -0
- /package/dist/{init-6CCSVJC2.js.map → init-OCBFI4VH.js.map} +0 -0
- /package/dist/{listings-2Z6DSO3D.js.map → listings-QKRIVZG6.js.map} +0 -0
- /package/dist/{one-time-products-Y5RNIPV2.js.map → one-time-products-OIDBVCFE.js.map} +0 -0
- /package/dist/{publish-5HZAJEDZ.js.map → publish-H2IAOKP7.js.map} +0 -0
- /package/dist/{purchases-AHWGLW6V.js.map → purchases-GFLYTKR3.js.map} +0 -0
- /package/dist/{recovery-B7DZQ6XG.js.map → recovery-2VJJLAIQ.js.map} +0 -0
- /package/dist/{releases-XY57V22L.js.map → releases-RTF5NPTD.js.map} +0 -0
- /package/dist/{reviews-P4M6BEJI.js.map → reviews-GZ2VOIRN.js.map} +0 -0
- /package/dist/{subscriptions-GTVJB4HX.js.map → subscriptions-JPHFBREY.js.map} +0 -0
- /package/dist/{system-apks-L6M7QYB3.js.map → system-apks-KWTN5LHO.js.map} +0 -0
- /package/dist/{testers-FGLBJAXL.js.map → testers-7ILUCKYB.js.map} +0 -0
- /package/dist/{train-D2NKUW3M.js.map → train-G44NEK43.js.map} +0 -0
- /package/dist/{update-MHWSESO4.js.map → update-POERCYHW.js.map} +0 -0
- /package/dist/{users-FOMAT7DY.js.map → users-W66YCFDX.js.map} +0 -0
- /package/dist/{version-ZHOZKZ2I.js.map → version-2HT32CYP.js.map} +0 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Ship Android apps from your terminal.** The complete CLI for the Google Play Developer API.
|
|
4
4
|
|
|
5
|
-
217 API endpoints. No Ruby. No browser. No ceremony. First publishing CLI with Managed Google Play support.
|
|
5
|
+
217 API endpoints. No Ruby. No browser. No ceremony. First publishing CLI with Managed Google Play support and AI-assisted Play Store release notes in 80+ locales.
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
npm install -g @gpc-cli/cli
|
|
@@ -14,26 +14,30 @@ npm install -g @gpc-cli/cli
|
|
|
14
14
|
gpc status # Releases + vitals + reviews in 3 seconds
|
|
15
15
|
gpc releases upload app.aab --track beta # Upload to any track
|
|
16
16
|
gpc releases promote --from beta --to production --rollout 10
|
|
17
|
+
gpc publish app.aab --track beta --notes "Bug fixes" # One-shot upload + release
|
|
17
18
|
gpc preflight app.aab # 9 offline policy scanners
|
|
18
19
|
gpc vitals crashes --threshold 2.0 # Exit code 6 if breached
|
|
19
|
-
gpc reviews list --stars 1-2 --since 7d # Filter
|
|
20
|
-
gpc
|
|
21
|
-
gpc
|
|
20
|
+
gpc reviews list --stars 1-2 --since 7d # Filter reviews
|
|
21
|
+
gpc reviews reply <review-id> --text "Thanks for the feedback!"
|
|
22
|
+
gpc listings push --dir metadata/ # Sync store metadata (Fastlane-compatible)
|
|
23
|
+
gpc changelog generate --target play-store --locales auto --ai # AI-translated "What's new" in every locale
|
|
24
|
+
gpc enterprise publish app.aab --account 123 --title "Private App" # Managed Google Play
|
|
22
25
|
gpc doctor # 20 setup checks
|
|
23
26
|
```
|
|
24
27
|
|
|
25
28
|
## Why this over Fastlane?
|
|
26
29
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
| API coverage
|
|
30
|
-
| Runtime
|
|
31
|
-
| Cold start
|
|
32
|
-
| Reviews & Vitals
|
|
33
|
-
| Subscriptions
|
|
34
|
-
| **Managed Google Play**
|
|
35
|
-
|
|
|
36
|
-
|
|
|
30
|
+
| | **GPC** | Fastlane supply |
|
|
31
|
+
| ------------------------------- | ------------------------------ | --------------- |
|
|
32
|
+
| API coverage | **217 endpoints** | ~20 |
|
|
33
|
+
| Runtime | Node.js or binary | Ruby + Bundler |
|
|
34
|
+
| Cold start | <500ms | 2-3s |
|
|
35
|
+
| Reviews & Vitals | Yes | No |
|
|
36
|
+
| Subscriptions | Yes | No |
|
|
37
|
+
| **Managed Google Play** | **Yes (Play Custom App API)** | No |
|
|
38
|
+
| **AI-translated release notes** | **Yes (80+ locales, BYO key)** | No |
|
|
39
|
+
| Preflight scanner | 9 offline checks | No |
|
|
40
|
+
| CI/CD native | JSON + exit codes | Partial |
|
|
37
41
|
|
|
38
42
|
[Migration guide](https://yasserstudio.github.io/gpc/migration/from-fastlane) with one-to-one command mapping.
|
|
39
43
|
|
|
@@ -87,7 +91,7 @@ curl -fsSL https://raw.githubusercontent.com/yasserstudio/gpc/main/scripts/insta
|
|
|
87
91
|
- [Commands reference](https://yasserstudio.github.io/gpc/commands/)
|
|
88
92
|
- [CI/CD recipes](https://yasserstudio.github.io/gpc/ci-cd/)
|
|
89
93
|
|
|
90
|
-
Free to use.
|
|
94
|
+
Free to use. 2,093 tests. 90%+ coverage. Every write operation supports `--dry-run`.
|
|
91
95
|
|
|
92
96
|
## Licensing
|
|
93
97
|
|
|
@@ -58,9 +58,7 @@ async function cachedPackageNames() {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
async function readFreshStatusCache(packageName) {
|
|
61
|
-
const entry = await readJson(
|
|
62
|
-
join(getCacheDir(), `status-${packageName}.json`)
|
|
63
|
-
);
|
|
61
|
+
const entry = await readJson(join(getCacheDir(), `status-${packageName}.json`));
|
|
64
62
|
if (!entry?.fetchedAt) return null;
|
|
65
63
|
const ttl = entry.ttl ?? 3600;
|
|
66
64
|
const ageSec = (Date.now() - new Date(entry.fetchedAt).getTime()) / 1e3;
|
|
@@ -143,4 +141,4 @@ export {
|
|
|
143
141
|
registerCompleteCommand,
|
|
144
142
|
runContext
|
|
145
143
|
};
|
|
146
|
-
//# sourceMappingURL=__complete-
|
|
144
|
+
//# sourceMappingURL=__complete-AZXI2O25.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/__complete.ts"],"sourcesContent":["import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { getCacheDir, getUserConfigPath, listProfiles } from \"@gpc-cli/config\";\n\n// Keep this file dependency-light on purpose.\n// It is called on every TAB press; loading @gpc-cli/api or @gpc-cli/auth would\n// blow the <100ms cold-start budget. Only pull from @gpc-cli/config + node:fs.\n\nconst STATIC_TRACKS = [\"production\", \"beta\", \"alpha\", \"internal\"] as const;\n\nconst DEBUG = process.env[\"GPC_DEBUG\"] === \"1\";\n\nfunction debug(msg: string): void {\n if (DEBUG) process.stderr.write(`[gpc __complete] ${msg}\\n`);\n}\n\n/** Emit one value per line; silent on any error. */\nfunction emit(values: readonly string[]): void {\n for (const v of values) {\n if (v) console.log(v);\n }\n}\n\n// Prototype-pollution defense: strip __proto__/constructor/prototype from\n// parsed JSON. Mirrors packages/config/src/loader.ts:92 so cache and config\n// files are treated consistently.\nconst DANGEROUS_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nfunction sanitize(obj: unknown): void {\n if (!obj || typeof obj !== \"object\") return;\n if (Array.isArray(obj)) {\n for (const item of obj) sanitize(item);\n return;\n }\n const record = obj as Record<string, unknown>;\n for (const key of Object.keys(record)) {\n if (DANGEROUS_KEYS.has(key)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete record[key];\n } else if (typeof record[key] === \"object\" && record[key] !== null) {\n sanitize(record[key]);\n }\n }\n}\n\nasync function readJson<T>(path: string): Promise<T | null> {\n try {\n const raw = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(raw) as T;\n sanitize(parsed);\n return parsed;\n } catch (err) {\n // Silent fallback is by design (empty/stale cache is indistinguishable\n // from corrupt from the user's POV), but under GPC_DEBUG=1 surface the\n // error so authors can diagnose bad config or cache files.\n debug(`readJson(${path}) failed: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n}\n\ninterface ProfileEntry {\n app?: string;\n}\ninterface RawConfig {\n app?: string;\n profiles?: Record<string, ProfileEntry>;\n}\n\nasync function readProjectConfig(): Promise<RawConfig | null> {\n return readJson<RawConfig>(join(process.cwd(), \".gpcrc.json\"));\n}\n\nasync function readUserConfig(): Promise<RawConfig | null> {\n return readJson<RawConfig>(getUserConfigPath());\n}\n\nasync function cachedPackageNames(): Promise<string[]> {\n try {\n const entries = await readdir(getCacheDir());\n return entries\n .filter((f) => f.startsWith(\"status-\") && f.endsWith(\".json\"))\n .map((f) => f.slice(\"status-\".length, -\".json\".length));\n } catch {\n return [];\n }\n}\n\ninterface StatusCacheEntry {\n fetchedAt?: string;\n ttl?: number;\n data?: {\n releases?: Array<{ track?: string; versionCode?: string }>;\n };\n}\n\nasync function readFreshStatusCache(packageName: string): Promise<StatusCacheEntry | null> {\n const entry = await readJson<StatusCacheEntry>(join(getCacheDir(), `status-${packageName}.json`));\n if (!entry?.fetchedAt) return null;\n const ttl = entry.ttl ?? 3600;\n const ageSec = (Date.now() - new Date(entry.fetchedAt).getTime()) / 1000;\n if (ageSec > ttl) return null;\n return entry;\n}\n\nexport async function runContext(context: string, args: readonly string[] = []): Promise<string[]> {\n switch (context) {\n case \"profiles\":\n return completeProfiles();\n case \"packages\":\n return completePackages();\n case \"tracks-for-app\":\n return completeTracksForApp(args[0]);\n case \"releases-for-track\":\n return completeReleasesForTrack(args[0], args[1]);\n default:\n return [];\n }\n}\n\nexport async function completeProfiles(): Promise<string[]> {\n return listProfiles();\n}\n\nexport async function completePackages(): Promise<string[]> {\n const seen = new Set<string>();\n const [proj, user, cached] = await Promise.all([\n readProjectConfig(),\n readUserConfig(),\n cachedPackageNames(),\n ]);\n for (const cfg of [proj, user]) {\n if (cfg?.app) seen.add(cfg.app);\n if (cfg?.profiles) {\n for (const p of Object.values(cfg.profiles)) {\n if (p?.app) seen.add(p.app);\n }\n }\n }\n for (const pkg of cached) seen.add(pkg);\n return [...seen].sort();\n}\n\nexport async function completeTracksForApp(packageName: string | undefined): Promise<string[]> {\n const tracks = new Set<string>(STATIC_TRACKS);\n if (packageName) {\n const entry = await readFreshStatusCache(packageName);\n for (const r of entry?.data?.releases ?? []) {\n if (r.track) tracks.add(r.track);\n }\n } else {\n // No package arg: shell scripts don't currently parse the already-typed\n // --app value. As a best-effort, aggregate custom track names from every\n // fresh status cache so `gpc --track <TAB>` still surfaces non-standard\n // tracks the user has published to recently.\n const packages = await cachedPackageNames();\n const entries = await Promise.all(packages.map((p) => readFreshStatusCache(p)));\n for (const entry of entries) {\n for (const r of entry?.data?.releases ?? []) {\n if (r.track) tracks.add(r.track);\n }\n }\n }\n return [...tracks];\n}\n\nexport async function completeReleasesForTrack(\n packageName: string | undefined,\n track: string | undefined,\n): Promise<string[]> {\n if (!packageName || !track) return [];\n const entry = await readFreshStatusCache(packageName);\n return (entry?.data?.releases ?? [])\n .filter((r) => r.track === track && r.versionCode)\n .map((r) => r.versionCode as string);\n}\n\n/** Register the hidden `__complete` subcommand on the program. */\nexport function registerCompleteCommand(program: Command): void {\n const complete = new Command(\"__complete\")\n .description(\"Internal: shell completion value provider (hidden)\")\n .argument(\"<context>\", \"profiles | packages | tracks-for-app | releases-for-track\")\n .argument(\"[args...]\", \"Context-specific positional args\")\n .allowUnknownOption(true)\n .action(async (context: string, args: string[]) => {\n try {\n const values = await runContext(context, args);\n emit(values);\n } catch {\n // Never throw from a completion handler.\n }\n });\n\n program.addCommand(complete, { hidden: true });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
isDryRun
|
|
4
4
|
} from "./chunk-Y3QZDAKS.js";
|
|
5
|
-
import {
|
|
6
|
-
getOutputFormat
|
|
7
|
-
} from "./chunk-ELXAK7GI.js";
|
|
8
5
|
import {
|
|
9
6
|
requireConfirm
|
|
10
7
|
} from "./chunk-RZQSEDKI.js";
|
|
8
|
+
import {
|
|
9
|
+
getOutputFormat
|
|
10
|
+
} from "./chunk-ELXAK7GI.js";
|
|
11
11
|
|
|
12
12
|
// src/commands/audit.ts
|
|
13
13
|
import { loadConfig } from "@gpc-cli/config";
|
|
@@ -122,4 +122,4 @@ function registerAuditCommands(program) {
|
|
|
122
122
|
export {
|
|
123
123
|
registerAuditCommands
|
|
124
124
|
};
|
|
125
|
-
//# sourceMappingURL=audit-
|
|
125
|
+
//# sourceMappingURL=audit-BDPS5ODN.js.map
|
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-DQD2S5QH.js";
|
|
7
7
|
import {
|
|
8
8
|
checkForUpdate,
|
|
9
9
|
formatUpdateNotification
|
|
@@ -57,7 +57,7 @@ if (!_isJsonMode && !_isQuiet && !_isSetupCommand && !existsSync(getUserConfigPa
|
|
|
57
57
|
}
|
|
58
58
|
await setupNetworking();
|
|
59
59
|
initAudit(getConfigDir());
|
|
60
|
-
var currentVersion = "0.9.
|
|
60
|
+
var currentVersion = "0.9.65";
|
|
61
61
|
var isUpdateCommand = process.argv[2] === "update";
|
|
62
62
|
var isCompletionProvider = process.argv[2] === "__complete";
|
|
63
63
|
var updateCheckPromise = isUpdateCommand || isCompletionProvider ? Promise.resolve(null) : checkForUpdate(currentVersion);
|
|
@@ -29,12 +29,49 @@ import {
|
|
|
29
29
|
formatPathLabel,
|
|
30
30
|
PROVIDER_WHITELIST,
|
|
31
31
|
resolveLocales,
|
|
32
|
+
validateBundleForApply,
|
|
33
|
+
bundleToReleaseNotes,
|
|
34
|
+
applyReleaseNotes,
|
|
32
35
|
GpcError
|
|
33
36
|
} from "@gpc-cli/core";
|
|
34
37
|
import { loadConfig } from "@gpc-cli/config";
|
|
35
38
|
var VALID_OUTPUT_MODES = ["md", "json", "prompt"];
|
|
36
39
|
var VALID_TARGETS = ["github", "play-store"];
|
|
37
40
|
var REPO_RE = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
41
|
+
async function performApply(ctx) {
|
|
42
|
+
const blocked = validateBundleForApply(ctx.bundle);
|
|
43
|
+
if (blocked.length > 0) {
|
|
44
|
+
process.stderr.write(
|
|
45
|
+
`Cannot --apply: ${blocked.length} locale(s) blocked:
|
|
46
|
+
` + blocked.map((b) => ` ${b}`).join("\n") + "\n"
|
|
47
|
+
);
|
|
48
|
+
process.exitCode = 1;
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const notes = bundleToReleaseNotes(ctx.bundle);
|
|
52
|
+
const config = await loadConfig();
|
|
53
|
+
const packageName = resolvePackageName(ctx.program.opts()["app"], config);
|
|
54
|
+
if (ctx.dryRun) {
|
|
55
|
+
const payload = {
|
|
56
|
+
dryRun: true,
|
|
57
|
+
action: "apply release notes",
|
|
58
|
+
track: ctx.track,
|
|
59
|
+
packageName,
|
|
60
|
+
localeCount: notes.length,
|
|
61
|
+
releaseNotes: notes
|
|
62
|
+
};
|
|
63
|
+
if (ctx.aiBlock) payload["ai"] = ctx.aiBlock;
|
|
64
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
const client = await getClient(config);
|
|
68
|
+
const result = await applyReleaseNotes(client, packageName, ctx.track, notes);
|
|
69
|
+
process.stderr.write(
|
|
70
|
+
`${dim(`\u2192 Applied ${result.localeCount} locale(s) to draft on ${result.track} (${packageName})`)}
|
|
71
|
+
`
|
|
72
|
+
);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
38
75
|
function registerChangelogCommand(program) {
|
|
39
76
|
const changelog = program.command("changelog").description("Show release history").option("-n, --limit <count>", "Number of releases to show", parseInt, 5).option("--tag <tag>", "Show a specific release (e.g., v0.9.43)").option("--all", "Show all releases").action(async (opts) => {
|
|
40
77
|
const config = await loadConfig();
|
|
@@ -69,10 +106,13 @@ function registerChangelogCommand(program) {
|
|
|
69
106
|
`Showing ${entries.length} releases. Use --tag <tag> for details, or --all for full history.`
|
|
70
107
|
);
|
|
71
108
|
});
|
|
72
|
-
changelog.command("generate").description("Generate release notes from local git commits").option("--from <ref>", "Starting ref (default: latest v* tag)").option("--to <ref>", "Ending ref (default: HEAD)").option("--format <mode>", "Renderer: md, json, or prompt", "md").option("--repo <owner/name>", "Override auto-detected repo (e.g., yasserstudio/gpc)").option("--target <mode>", "Output target: github or play-store", "github").option(
|
|
109
|
+
changelog.command("generate").description("Generate release notes from local git commits").option("--from <ref>", "Starting ref (default: latest v* tag)").option("--to <ref>", "Ending ref (default: HEAD)").option("--format <mode>", "Renderer: md, json, or prompt", "md").option("--repo <owner/name>", "Override auto-detected repo (e.g., yasserstudio/gpc)").option("--target <mode>", "Output target: github or play-store", "github").option(
|
|
110
|
+
"--locales <csv|auto>",
|
|
111
|
+
"Comma-separated BCP 47 locales, or 'auto' (play-store target only)"
|
|
112
|
+
).option("--ai", "Translate non-source locales via LLM (play-store target only, BYO key)").option(
|
|
73
113
|
"--provider <name>",
|
|
74
114
|
`AI provider (${PROVIDER_WHITELIST.join("|")}). Defaults to first env key detected`
|
|
75
|
-
).option("--model <id>", "Override default model for the chosen provider").option("--strict", "Exit non-zero if warnings, overflows, or translation failures occur").action(
|
|
115
|
+
).option("--model <id>", "Override default model for the chosen provider").option("--strict", "Exit non-zero if warnings, overflows, or translation failures occur").option("--apply", "Write notes into the draft release on --track (play-store target only)").option("--track <name>", "Play Store track for --apply (default: production)", "production").action(
|
|
76
116
|
async (opts) => {
|
|
77
117
|
const dryRun = !!program.opts()["dryRun"];
|
|
78
118
|
const mode = opts.format;
|
|
@@ -110,9 +150,7 @@ function registerChangelogCommand(program) {
|
|
|
110
150
|
return;
|
|
111
151
|
}
|
|
112
152
|
if (target === "github" && (opts.ai || opts.provider || opts.model)) {
|
|
113
|
-
process.stderr.write(
|
|
114
|
-
"--ai / --provider / --model only apply to --target play-store\n"
|
|
115
|
-
);
|
|
153
|
+
process.stderr.write("--ai / --provider / --model only apply to --target play-store\n");
|
|
116
154
|
process.exitCode = 2;
|
|
117
155
|
return;
|
|
118
156
|
}
|
|
@@ -123,6 +161,18 @@ function registerChangelogCommand(program) {
|
|
|
123
161
|
process.exitCode = 2;
|
|
124
162
|
return;
|
|
125
163
|
}
|
|
164
|
+
if (opts.apply && target !== "play-store") {
|
|
165
|
+
process.stderr.write("--apply only applies to --target play-store\n");
|
|
166
|
+
process.exitCode = 2;
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (opts.apply && mode === "prompt") {
|
|
170
|
+
process.stderr.write(
|
|
171
|
+
"--apply cannot be combined with --format prompt\n Hint: use --format md or --format json.\n"
|
|
172
|
+
);
|
|
173
|
+
process.exitCode = 2;
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
126
176
|
if (target === "play-store" && !opts.locales) {
|
|
127
177
|
process.stderr.write(
|
|
128
178
|
"--target play-store requires --locales <csv|auto>\n Example: --locales en-US,fr-FR,de-DE\n Example: --locales auto (reads current Play Store listing \u2014 requires --app)\n"
|
|
@@ -187,6 +237,10 @@ function registerChangelogCommand(program) {
|
|
|
187
237
|
`
|
|
188
238
|
);
|
|
189
239
|
}
|
|
240
|
+
if (opts.apply) {
|
|
241
|
+
const ok = await performApply({ bundle, program, track: opts.track, dryRun });
|
|
242
|
+
if (!ok) return;
|
|
243
|
+
}
|
|
190
244
|
const hasOverflow2 = bundle.overflows.length > 0;
|
|
191
245
|
const hasWarnings2 = generated.warnings.length > 0;
|
|
192
246
|
if (opts.strict && (hasWarnings2 || hasOverflow2)) {
|
|
@@ -292,6 +346,16 @@ function registerChangelogCommand(program) {
|
|
|
292
346
|
process.stderr.write(`${dim(`(run cost: $${costUsd.toFixed(4)})`)}
|
|
293
347
|
`);
|
|
294
348
|
}
|
|
349
|
+
if (opts.apply) {
|
|
350
|
+
const ok = await performApply({
|
|
351
|
+
bundle: translated,
|
|
352
|
+
program,
|
|
353
|
+
track: opts.track,
|
|
354
|
+
dryRun,
|
|
355
|
+
aiBlock
|
|
356
|
+
});
|
|
357
|
+
if (!ok) return;
|
|
358
|
+
}
|
|
295
359
|
const hasOverflow = translated.overflows.length > 0;
|
|
296
360
|
const hasWarnings = generated.warnings.length > 0;
|
|
297
361
|
const hasFailures = translated.failures.length > 0;
|
|
@@ -304,4 +368,4 @@ function registerChangelogCommand(program) {
|
|
|
304
368
|
export {
|
|
305
369
|
registerChangelogCommand
|
|
306
370
|
};
|
|
307
|
-
//# sourceMappingURL=changelog-
|
|
371
|
+
//# sourceMappingURL=changelog-STYBBYDC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/changelog.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport {\n fetchChangelog,\n formatChangelogEntry,\n formatOutput,\n generateChangelog,\n RENDERERS,\n renderPlayStore,\n renderPlayStoreMd,\n renderPlayStorePrompt,\n buildLocaleBundle,\n translateBundle,\n resolveAiConfig,\n createTranslator,\n fetchAggregateCost,\n formatPathLabel,\n PROVIDER_WHITELIST,\n resolveLocales,\n validateBundleForApply,\n bundleToReleaseNotes,\n applyReleaseNotes,\n GpcError,\n type OutputMode,\n type PlayStoreFormat,\n} from \"@gpc-cli/core\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { getOutputFormat } from \"../format.js\";\nimport { yellow, dim } from \"../colors.js\";\nimport { resolvePackageName, getClient } from \"../resolve.js\";\n\nconst VALID_OUTPUT_MODES: OutputMode[] = [\"md\", \"json\", \"prompt\"];\nconst VALID_TARGETS = [\"github\", \"play-store\"] as const;\ntype ChangelogTarget = (typeof VALID_TARGETS)[number];\nconst REPO_RE = /^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+$/;\n\ninterface ApplyContext {\n bundle: Parameters<typeof validateBundleForApply>[0];\n program: Command;\n track: string;\n dryRun: boolean;\n aiBlock?: Record<string, unknown>;\n}\n\nasync function performApply(ctx: ApplyContext): Promise<boolean> {\n const blocked = validateBundleForApply(ctx.bundle);\n if (blocked.length > 0) {\n process.stderr.write(\n `Cannot --apply: ${blocked.length} locale(s) blocked:\\n` +\n blocked.map((b) => ` ${b}`).join(\"\\n\") +\n \"\\n\",\n );\n process.exitCode = 1;\n return false;\n }\n const notes = bundleToReleaseNotes(ctx.bundle);\n const config = await loadConfig();\n const packageName = resolvePackageName(ctx.program.opts()[\"app\"], config);\n if (ctx.dryRun) {\n const payload: Record<string, unknown> = {\n dryRun: true,\n action: \"apply release notes\",\n track: ctx.track,\n packageName,\n localeCount: notes.length,\n releaseNotes: notes,\n };\n if (ctx.aiBlock) payload[\"ai\"] = ctx.aiBlock;\n console.log(JSON.stringify(payload, null, 2));\n return false;\n }\n const client = await getClient(config);\n const result = await applyReleaseNotes(client, packageName, ctx.track, notes);\n process.stderr.write(\n `${dim(`→ Applied ${result.localeCount} locale(s) to draft on ${result.track} (${packageName})`)}\\n`,\n );\n return true;\n}\n\nexport function registerChangelogCommand(program: Command): void {\n const changelog = program\n .command(\"changelog\")\n .description(\"Show release history\")\n .option(\"-n, --limit <count>\", \"Number of releases to show\", parseInt, 5)\n .option(\"--tag <tag>\", \"Show a specific release (e.g., v0.9.43)\")\n .option(\"--all\", \"Show all releases\")\n .action(async (opts: { limit: number; tag?: string; all?: boolean }) => {\n const config = await loadConfig();\n const format = getOutputFormat(program, config);\n\n const entries = await fetchChangelog({\n limit: opts.all ? 100 : opts.limit,\n version: opts.tag,\n });\n\n if (entries.length === 0) {\n console.log(\"No releases found.\");\n return;\n }\n\n if (format === \"json\") {\n console.log(formatOutput(entries, \"json\"));\n return;\n }\n\n if (opts.tag || entries.length === 1) {\n console.log(formatChangelogEntry(entries[0]!));\n return;\n }\n\n const header = \"VERSION DATE TITLE\";\n const separator = \"─\".repeat(header.length);\n console.log(header);\n console.log(separator);\n for (const entry of entries) {\n const version = entry.version.padEnd(12);\n const date = entry.date.padEnd(12);\n console.log(`${version} ${date} ${entry.title}`);\n }\n console.log(\"\");\n console.log(\n `Showing ${entries.length} releases. Use --tag <tag> for details, or --all for full history.`,\n );\n });\n\n changelog\n .command(\"generate\")\n .description(\"Generate release notes from local git commits\")\n .option(\"--from <ref>\", \"Starting ref (default: latest v* tag)\")\n .option(\"--to <ref>\", \"Ending ref (default: HEAD)\")\n .option(\"--format <mode>\", \"Renderer: md, json, or prompt\", \"md\")\n .option(\"--repo <owner/name>\", \"Override auto-detected repo (e.g., yasserstudio/gpc)\")\n .option(\"--target <mode>\", \"Output target: github or play-store\", \"github\")\n .option(\n \"--locales <csv|auto>\",\n \"Comma-separated BCP 47 locales, or 'auto' (play-store target only)\",\n )\n .option(\"--ai\", \"Translate non-source locales via LLM (play-store target only, BYO key)\")\n .option(\n \"--provider <name>\",\n `AI provider (${PROVIDER_WHITELIST.join(\"|\")}). Defaults to first env key detected`,\n )\n .option(\"--model <id>\", \"Override default model for the chosen provider\")\n .option(\"--strict\", \"Exit non-zero if warnings, overflows, or translation failures occur\")\n .option(\"--apply\", \"Write notes into the draft release on --track (play-store target only)\")\n .option(\"--track <name>\", \"Play Store track for --apply (default: production)\", \"production\")\n .action(\n async (opts: {\n from?: string;\n to?: string;\n format: string;\n repo?: string;\n target: string;\n locales?: string;\n strict?: boolean;\n ai?: boolean;\n provider?: string;\n model?: string;\n apply?: boolean;\n track: string;\n }) => {\n const dryRun = !!program.opts()[\"dryRun\"];\n const mode = opts.format as OutputMode;\n if (!VALID_OUTPUT_MODES.includes(mode)) {\n process.stderr.write(\n `Invalid --format \"${opts.format}\". Valid: ${VALID_OUTPUT_MODES.join(\", \")}\\n`,\n );\n process.exitCode = 2;\n return;\n }\n if (!VALID_TARGETS.includes(opts.target as ChangelogTarget)) {\n process.stderr.write(\n `Invalid --target \"${opts.target}\". Valid: ${VALID_TARGETS.join(\", \")}\\n`,\n );\n process.exitCode = 2;\n return;\n }\n const target = opts.target as ChangelogTarget;\n if (opts.repo && !REPO_RE.test(opts.repo)) {\n process.stderr.write(\n `Invalid --repo \"${opts.repo}\". Expected \"owner/name\" (e.g., yasserstudio/gpc).\\n`,\n );\n process.exitCode = 2;\n return;\n }\n if (target === \"github\" && opts.locales) {\n process.stderr.write(\n `--locales only applies to --target play-store (current target: github)\\n`,\n );\n process.exitCode = 2;\n return;\n }\n // Only block when the AI-adjacent flags are explicitly set. The root\n // program has its own `--dry-run` flag that may already be set\n // globally by the user for unrelated reasons; we silently ignore it\n // on non-AI code paths.\n if (target === \"github\" && (opts.ai || opts.provider || opts.model)) {\n process.stderr.write(\"--ai / --provider / --model only apply to --target play-store\\n\");\n process.exitCode = 2;\n return;\n }\n // --format prompt + --ai is nonsensical outside --dry-run: it would\n // render a \"please translate this\" prompt from already-translated\n // text. Either inspect the prompt via --dry-run, or pick md/json.\n if (opts.ai && opts.format === \"prompt\" && !dryRun) {\n process.stderr.write(\n \"--ai with --format prompt only makes sense with --dry-run\\n\" +\n \" (otherwise it would re-wrap translated text in a translation prompt).\\n\" +\n \" Hint: use --format md or --format json for live translation, or add --dry-run to inspect the prompt.\\n\",\n );\n process.exitCode = 2;\n return;\n }\n if (opts.apply && target !== \"play-store\") {\n process.stderr.write(\"--apply only applies to --target play-store\\n\");\n process.exitCode = 2;\n return;\n }\n if (opts.apply && mode === \"prompt\") {\n process.stderr.write(\n \"--apply cannot be combined with --format prompt\\n\" +\n \" Hint: use --format md or --format json.\\n\",\n );\n process.exitCode = 2;\n return;\n }\n if (target === \"play-store\" && !opts.locales) {\n process.stderr.write(\n \"--target play-store requires --locales <csv|auto>\\n\" +\n \" Example: --locales en-US,fr-FR,de-DE\\n\" +\n \" Example: --locales auto (reads current Play Store listing — requires --app)\\n\",\n );\n process.exitCode = 2;\n return;\n }\n\n const generated = await generateChangelog({\n from: opts.from,\n to: opts.to,\n repo: opts.repo,\n });\n\n for (const w of generated.warnings) {\n process.stderr.write(`${yellow(\"warn:\")} ${w}\\n`);\n }\n if (generated.warnings.length > 0) {\n process.stderr.write(\n `${dim(`(${generated.warnings.length} warning${generated.warnings.length === 1 ? \"\" : \"s\"} — review before publishing)`)}\\n`,\n );\n }\n\n if (target === \"github\") {\n const output = RENDERERS[mode](generated);\n console.log(output);\n if (opts.strict && generated.warnings.length > 0) {\n process.exitCode = 1;\n }\n return;\n }\n\n // target === \"play-store\"\n let locales: string[];\n try {\n if (opts.locales === \"auto\") {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n locales = await resolveLocales(\"auto\", { client, packageName });\n } else {\n locales = await resolveLocales(opts.locales!);\n }\n } catch (error) {\n if (error instanceof GpcError) {\n process.stderr.write(`${error.message}\\n`);\n if (error.suggestion) process.stderr.write(`${dim(error.suggestion)}\\n`);\n process.exitCode = error.exitCode;\n return;\n }\n throw error;\n }\n\n const playStoreFormat = mode as PlayStoreFormat;\n\n // Non-AI path: existing v0.9.62 behavior\n if (!opts.ai) {\n const { output, bundle } = renderPlayStore(generated, {\n locales,\n format: playStoreFormat,\n });\n console.log(output);\n\n for (const lang of bundle.overflows) {\n process.stderr.write(\n `${yellow(\"warn:\")} ${lang} exceeds ${bundle.limit} chars (truncated)\\n`,\n );\n }\n\n if (opts.apply) {\n const ok = await performApply({ bundle, program, track: opts.track, dryRun });\n if (!ok) return;\n }\n\n const hasOverflow = bundle.overflows.length > 0;\n const hasWarnings = generated.warnings.length > 0;\n if (opts.strict && (hasWarnings || hasOverflow)) {\n process.exitCode = 1;\n }\n return;\n }\n\n // --ai path: resolve config, translate, render with ai block\n let aiConfig;\n try {\n aiConfig = resolveAiConfig({ provider: opts.provider, model: opts.model });\n } catch (error) {\n if (error instanceof GpcError) {\n process.stderr.write(`${error.message}\\n`);\n if (error.suggestion) process.stderr.write(`${dim(error.suggestion)}\\n`);\n process.exitCode = error.exitCode;\n return;\n }\n throw error;\n }\n\n process.stderr.write(`${dim(`→ ${formatPathLabel(aiConfig)}`)}\\n`);\n\n const baseBundle = buildLocaleBundle(generated, {\n locales,\n format: playStoreFormat,\n });\n\n if (dryRun) {\n const preview = renderPlayStorePrompt(baseBundle, generated);\n console.log(preview);\n process.stderr.write(\n `${dim(\"(--dry-run: no API call was made; the prompt above is what would be sent per locale)\")}\\n`,\n );\n return;\n }\n\n const translator = await createTranslator(aiConfig);\n let translated;\n try {\n translated = await translateBundle(baseBundle, {\n translator,\n strict: opts.strict,\n onError: ({ language, reason }) => {\n process.stderr.write(\n `${yellow(\"warn:\")} ${language} translation failed: ${reason}\\n`,\n );\n },\n });\n } catch (error) {\n if (error instanceof GpcError) {\n process.stderr.write(`${error.message}\\n`);\n if (error.suggestion) process.stderr.write(`${dim(error.suggestion)}\\n`);\n process.exitCode = error.exitCode;\n return;\n }\n throw error;\n }\n\n const costUsd =\n aiConfig.path === \"gateway\" ? await fetchAggregateCost(aiConfig.runId) : undefined;\n\n const aiBlock: Record<string, unknown> = {\n path: aiConfig.path,\n provider: aiConfig.provider,\n model: aiConfig.model,\n tokensIn: translated.tokensIn,\n tokensOut: translated.tokensOut,\n };\n if (aiConfig.path === \"gateway\") {\n aiBlock[\"runId\"] = aiConfig.runId;\n if (typeof costUsd === \"number\") aiBlock[\"costUsd\"] = costUsd;\n }\n\n if (playStoreFormat === \"json\") {\n const payload = {\n from: translated.from,\n to: translated.to,\n limit: translated.limit,\n sourceLanguage: translated.sourceLanguage,\n ai: aiBlock,\n locales: translated.locales,\n overflows: translated.overflows,\n failures: translated.failures,\n };\n console.log(JSON.stringify(payload, null, 2));\n } else if (playStoreFormat === \"prompt\") {\n console.log(renderPlayStorePrompt(translated, generated));\n } else {\n console.log(renderPlayStoreMd(translated));\n }\n\n for (const lang of translated.overflows) {\n process.stderr.write(\n `${yellow(\"warn:\")} ${lang} exceeds ${translated.limit} chars (truncated)\\n`,\n );\n }\n\n if (translated.failures.length > 0) {\n process.stderr.write(\n `${dim(`(${translated.failures.length} locale${translated.failures.length === 1 ? \"\" : \"s\"} failed — see placeholders in output)`)}\\n`,\n );\n }\n\n if (typeof costUsd === \"number\") {\n process.stderr.write(`${dim(`(run cost: $${costUsd.toFixed(4)})`)}\\n`);\n }\n\n if (opts.apply) {\n const ok = await performApply({\n bundle: translated,\n program,\n track: opts.track,\n dryRun,\n aiBlock,\n });\n if (!ok) return;\n }\n\n const hasOverflow = translated.overflows.length > 0;\n const hasWarnings = generated.warnings.length > 0;\n const hasFailures = translated.failures.length > 0;\n if (opts.strict && (hasWarnings || hasOverflow || hasFailures)) {\n process.exitCode = 1;\n }\n },\n );\n}\n"],"mappings":"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","names":["hasOverflow","hasWarnings"]}
|
|
@@ -67,41 +67,41 @@ 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.65", "-V, --version").option("-o, --output <format>", "Output format: table, json, yaml, markdown, junit").option("-v, --verbose", "Enable debug logging").option("-q, --quiet", "Suppress non-essential output").option("-a, --app <package>", "App package name").option("-p, --profile <name>", "Auth profile name").option("--no-color", "Disable colored output").option("--no-interactive", "Disable interactive prompts").option("-y, --yes", "Skip confirmation prompts").option("--dry-run", "Preview changes without executing").option("--notify [target]", "Send webhook notification on completion (slack, discord, custom)").option("--ci", "Force CI mode (JSON output, no prompts, strict exit codes)").option("-j, --json", "Shorthand for --output json").option("--apps <csv>", "Comma-separated package names for multi-app operations").showSuggestionAfterError(false);
|
|
71
71
|
const commandLoaders = {
|
|
72
72
|
auth: async () => {
|
|
73
73
|
(await import("./auth-4DRT7ZH2.js")).registerAuthCommands(program);
|
|
74
74
|
},
|
|
75
75
|
config: async () => {
|
|
76
|
-
(await import("./config-
|
|
76
|
+
(await import("./config-7TY5HS4Z.js")).registerConfigCommands(program);
|
|
77
77
|
},
|
|
78
78
|
doctor: async () => {
|
|
79
|
-
(await import("./doctor-
|
|
79
|
+
(await import("./doctor-BSUL4C2Q.js")).registerDoctorCommand(program);
|
|
80
80
|
},
|
|
81
81
|
update: async () => {
|
|
82
|
-
(await import("./update-
|
|
82
|
+
(await import("./update-POERCYHW.js")).registerUpdateCommand(program);
|
|
83
83
|
},
|
|
84
84
|
docs: async () => {
|
|
85
|
-
(await import("./docs-
|
|
85
|
+
(await import("./docs-OU6LSSJD.js")).registerDocsCommand(program);
|
|
86
86
|
},
|
|
87
87
|
changelog: async () => {
|
|
88
|
-
(await import("./changelog-
|
|
88
|
+
(await import("./changelog-STYBBYDC.js")).registerChangelogCommand(program);
|
|
89
89
|
},
|
|
90
90
|
completion: async () => {
|
|
91
|
-
(await import("./completion-
|
|
91
|
+
(await import("./completion-ZK7RPPFD.js")).registerCompletionCommand(program, async () => {
|
|
92
92
|
await Promise.all(
|
|
93
93
|
Object.entries(commandLoaders).filter(([name]) => name !== "completion").map(([, loader2]) => loader2())
|
|
94
94
|
);
|
|
95
95
|
});
|
|
96
96
|
},
|
|
97
97
|
__complete: async () => {
|
|
98
|
-
(await import("./__complete-
|
|
98
|
+
(await import("./__complete-AZXI2O25.js")).registerCompleteCommand(program);
|
|
99
99
|
},
|
|
100
100
|
apps: async () => {
|
|
101
101
|
(await import("./apps-WPUQOQLL.js")).registerAppsCommands(program);
|
|
102
102
|
},
|
|
103
103
|
releases: async () => {
|
|
104
|
-
(await import("./releases-
|
|
104
|
+
(await import("./releases-RTF5NPTD.js")).registerReleasesCommands(program);
|
|
105
105
|
},
|
|
106
106
|
tracks: async () => {
|
|
107
107
|
(await import("./tracks-RH3RKVFB.js")).registerTracksCommands(program);
|
|
@@ -110,22 +110,22 @@ async function createProgram(pluginManager) {
|
|
|
110
110
|
(await import("./status-32AJ7A6O.js")).registerStatusCommand(program);
|
|
111
111
|
},
|
|
112
112
|
listings: async () => {
|
|
113
|
-
(await import("./listings-
|
|
113
|
+
(await import("./listings-QKRIVZG6.js")).registerListingsCommands(program);
|
|
114
114
|
},
|
|
115
115
|
reviews: async () => {
|
|
116
|
-
(await import("./reviews-
|
|
116
|
+
(await import("./reviews-GZ2VOIRN.js")).registerReviewsCommands(program);
|
|
117
117
|
},
|
|
118
118
|
vitals: async () => {
|
|
119
119
|
(await import("./vitals-QPHS6QFH.js")).registerVitalsCommands(program);
|
|
120
120
|
},
|
|
121
121
|
subscriptions: async () => {
|
|
122
|
-
(await import("./subscriptions-
|
|
122
|
+
(await import("./subscriptions-JPHFBREY.js")).registerSubscriptionsCommands(program);
|
|
123
123
|
},
|
|
124
124
|
iap: async () => {
|
|
125
|
-
(await import("./iap-
|
|
125
|
+
(await import("./iap-EPJ76IAC.js")).registerIapCommands(program);
|
|
126
126
|
},
|
|
127
127
|
purchases: async () => {
|
|
128
|
-
(await import("./purchases-
|
|
128
|
+
(await import("./purchases-GFLYTKR3.js")).registerPurchasesCommands(program);
|
|
129
129
|
},
|
|
130
130
|
pricing: async () => {
|
|
131
131
|
(await import("./pricing-HYQRXKNO.js")).registerPricingCommands(program);
|
|
@@ -134,25 +134,25 @@ async function createProgram(pluginManager) {
|
|
|
134
134
|
(await import("./reports-CIB2T3XT.js")).registerReportsCommands(program);
|
|
135
135
|
},
|
|
136
136
|
users: async () => {
|
|
137
|
-
(await import("./users-
|
|
137
|
+
(await import("./users-W66YCFDX.js")).registerUsersCommands(program);
|
|
138
138
|
},
|
|
139
139
|
testers: async () => {
|
|
140
|
-
(await import("./testers-
|
|
140
|
+
(await import("./testers-7ILUCKYB.js")).registerTestersCommands(program);
|
|
141
141
|
},
|
|
142
142
|
validate: async () => {
|
|
143
143
|
(await import("./validate-RHWEZYD2.js")).registerValidateCommand(program);
|
|
144
144
|
},
|
|
145
145
|
publish: async () => {
|
|
146
|
-
(await import("./publish-
|
|
146
|
+
(await import("./publish-H2IAOKP7.js")).registerPublishCommand(program);
|
|
147
147
|
},
|
|
148
148
|
recovery: async () => {
|
|
149
|
-
(await import("./recovery-
|
|
149
|
+
(await import("./recovery-2VJJLAIQ.js")).registerRecoveryCommands(program);
|
|
150
150
|
},
|
|
151
151
|
"data-safety": async () => {
|
|
152
152
|
(await import("./data-safety-46VY64OO.js")).registerDataSafetyCommands(program);
|
|
153
153
|
},
|
|
154
154
|
"external-transactions": async () => {
|
|
155
|
-
(await import("./external-transactions-
|
|
155
|
+
(await import("./external-transactions-BP42CK3H.js")).registerExternalTransactionsCommands(
|
|
156
156
|
program
|
|
157
157
|
);
|
|
158
158
|
},
|
|
@@ -160,7 +160,7 @@ async function createProgram(pluginManager) {
|
|
|
160
160
|
(await import("./device-tiers-MNZYMG3Y.js")).registerDeviceTiersCommands(program);
|
|
161
161
|
},
|
|
162
162
|
"one-time-products": async () => {
|
|
163
|
-
(await import("./one-time-products-
|
|
163
|
+
(await import("./one-time-products-OIDBVCFE.js")).registerOneTimeProductsCommands(program);
|
|
164
164
|
},
|
|
165
165
|
"internal-sharing": async () => {
|
|
166
166
|
(await import("./internal-sharing-KW6YENDG.js")).registerInternalSharingCommands(program);
|
|
@@ -169,7 +169,7 @@ async function createProgram(pluginManager) {
|
|
|
169
169
|
(await import("./generated-apks-TC33S2YN.js")).registerGeneratedApksCommands(program);
|
|
170
170
|
},
|
|
171
171
|
"system-apks": async () => {
|
|
172
|
-
(await import("./system-apks-
|
|
172
|
+
(await import("./system-apks-KWTN5LHO.js")).registerSystemApksCommands(program);
|
|
173
173
|
},
|
|
174
174
|
"purchase-options": async () => {
|
|
175
175
|
(await import("./purchase-options-KFWW4JW2.js")).registerPurchaseOptionsCommands(program);
|
|
@@ -178,7 +178,7 @@ async function createProgram(pluginManager) {
|
|
|
178
178
|
(await import("./bundle-PFTE7XMU.js")).registerBundleCommands(program);
|
|
179
179
|
},
|
|
180
180
|
audit: async () => {
|
|
181
|
-
(await import("./audit-
|
|
181
|
+
(await import("./audit-BDPS5ODN.js")).registerAuditCommands(program);
|
|
182
182
|
},
|
|
183
183
|
migrate: async () => {
|
|
184
184
|
(await import("./migrate-ZQCJGQQS.js")).registerMigrateCommands(program);
|
|
@@ -193,22 +193,22 @@ async function createProgram(pluginManager) {
|
|
|
193
193
|
(await import("./verify-H4ZUVHMZ.js")).registerVerifyCommand(program);
|
|
194
194
|
},
|
|
195
195
|
version: async () => {
|
|
196
|
-
(await import("./version-
|
|
196
|
+
(await import("./version-2HT32CYP.js")).registerVersionCommand(program);
|
|
197
197
|
},
|
|
198
198
|
cache: async () => {
|
|
199
199
|
(await import("./cache-FGNP7Y37.js")).registerCacheCommand(program);
|
|
200
200
|
},
|
|
201
201
|
feedback: async () => {
|
|
202
|
-
(await import("./feedback-
|
|
202
|
+
(await import("./feedback-X5BBSC5I.js")).registerFeedbackCommand(program);
|
|
203
203
|
},
|
|
204
204
|
quickstart: async () => {
|
|
205
205
|
(await import("./quickstart-FOWM3OKT.js")).registerQuickstartCommand(program);
|
|
206
206
|
},
|
|
207
207
|
grants: async () => {
|
|
208
|
-
(await import("./grants-
|
|
208
|
+
(await import("./grants-32DED5QL.js")).registerGrantsCommands(program);
|
|
209
209
|
},
|
|
210
210
|
train: async () => {
|
|
211
|
-
(await import("./train-
|
|
211
|
+
(await import("./train-G44NEK43.js")).registerTrainCommands(program);
|
|
212
212
|
},
|
|
213
213
|
quota: async () => {
|
|
214
214
|
(await import("./quota-MZRWYJGR.js")).registerQuotaCommand(program);
|
|
@@ -217,13 +217,13 @@ async function createProgram(pluginManager) {
|
|
|
217
217
|
(await import("./games-SVFN2YIS.js")).registerGamesCommands(program);
|
|
218
218
|
},
|
|
219
219
|
enterprise: async () => {
|
|
220
|
-
(await import("./enterprise-
|
|
220
|
+
(await import("./enterprise-L7DTIX2O.js")).registerEnterpriseCommands(program);
|
|
221
221
|
},
|
|
222
222
|
diff: async () => {
|
|
223
223
|
(await import("./diff-OBSHUSTL.js")).registerDiffCommand(program);
|
|
224
224
|
},
|
|
225
225
|
init: async () => {
|
|
226
|
-
(await import("./init-
|
|
226
|
+
(await import("./init-OCBFI4VH.js")).registerInitCommand(program);
|
|
227
227
|
},
|
|
228
228
|
preflight: async () => {
|
|
229
229
|
(await import("./preflight-KIWZPFTX.js")).registerPreflightCommand(program);
|
|
@@ -467,4 +467,4 @@ export {
|
|
|
467
467
|
createProgram,
|
|
468
468
|
handleCliError
|
|
469
469
|
};
|
|
470
|
-
//# sourceMappingURL=chunk-
|
|
470
|
+
//# sourceMappingURL=chunk-DQD2S5QH.js.map
|
|
@@ -704,10 +704,14 @@ function generateFishCompletions(tree = getCommandTree(), globals = []) {
|
|
|
704
704
|
for (const flag of flags) {
|
|
705
705
|
if (flag.startsWith("--")) {
|
|
706
706
|
const longName = flag.slice(2);
|
|
707
|
-
lines.push(
|
|
707
|
+
lines.push(
|
|
708
|
+
`complete -c gpc -l ${longName} -x -a '(gpc __complete ${context} 2>/dev/null)'`
|
|
709
|
+
);
|
|
708
710
|
} else if (flag.startsWith("-")) {
|
|
709
711
|
const shortName = flag.slice(1);
|
|
710
|
-
lines.push(
|
|
712
|
+
lines.push(
|
|
713
|
+
`complete -c gpc -s ${shortName} -x -a '(gpc __complete ${context} 2>/dev/null)'`
|
|
714
|
+
);
|
|
711
715
|
}
|
|
712
716
|
}
|
|
713
717
|
}
|
|
@@ -799,4 +803,4 @@ export {
|
|
|
799
803
|
getCommandTree,
|
|
800
804
|
registerCompletionCommand
|
|
801
805
|
};
|
|
802
|
-
//# sourceMappingURL=completion-
|
|
806
|
+
//# sourceMappingURL=completion-ZK7RPPFD.js.map
|