@gpc-cli/cli 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/dist/apps-BBYNHB2H.js +83 -0
  3. package/dist/apps-BBYNHB2H.js.map +1 -0
  4. package/dist/auth-T7IDSMVX.js +129 -0
  5. package/dist/auth-T7IDSMVX.js.map +1 -0
  6. package/dist/bin.d.ts +2 -0
  7. package/dist/bin.js +36 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/chunk-4QV4WD3F.js +103 -0
  10. package/dist/chunk-4QV4WD3F.js.map +1 -0
  11. package/dist/chunk-IVVT73IP.js +245 -0
  12. package/dist/chunk-IVVT73IP.js.map +1 -0
  13. package/dist/chunk-QMKZYXDJ.js +24 -0
  14. package/dist/chunk-QMKZYXDJ.js.map +1 -0
  15. package/dist/completion-U44CGHRH.js +145 -0
  16. package/dist/completion-U44CGHRH.js.map +1 -0
  17. package/dist/config-K7UJKIXT.js +44 -0
  18. package/dist/config-K7UJKIXT.js.map +1 -0
  19. package/dist/docs-CVTWIVMS.js +20 -0
  20. package/dist/docs-CVTWIVMS.js.map +1 -0
  21. package/dist/doctor-VDDUPTIM.js +59 -0
  22. package/dist/doctor-VDDUPTIM.js.map +1 -0
  23. package/dist/iap-QIV4CXKZ.js +158 -0
  24. package/dist/iap-QIV4CXKZ.js.map +1 -0
  25. package/dist/index.d.ts +6 -0
  26. package/dist/index.js +8 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/listings-PF5FDXKQ.js +261 -0
  29. package/dist/listings-PF5FDXKQ.js.map +1 -0
  30. package/dist/pricing-S4SB5FXJ.js +52 -0
  31. package/dist/pricing-S4SB5FXJ.js.map +1 -0
  32. package/dist/prompt-VP5LURRP.js +20 -0
  33. package/dist/prompt-VP5LURRP.js.map +1 -0
  34. package/dist/publish-3BAIN4NQ.js +114 -0
  35. package/dist/publish-3BAIN4NQ.js.map +1 -0
  36. package/dist/purchases-E6A2T5WQ.js +231 -0
  37. package/dist/purchases-E6A2T5WQ.js.map +1 -0
  38. package/dist/releases-464IMEEF.js +231 -0
  39. package/dist/releases-464IMEEF.js.map +1 -0
  40. package/dist/reports-3YAD4U4F.js +129 -0
  41. package/dist/reports-3YAD4U4F.js.map +1 -0
  42. package/dist/reviews-2CLM53E3.js +125 -0
  43. package/dist/reviews-2CLM53E3.js.map +1 -0
  44. package/dist/status-M7U3YNMU.js +32 -0
  45. package/dist/status-M7U3YNMU.js.map +1 -0
  46. package/dist/subscriptions-PUHH4FBB.js +376 -0
  47. package/dist/subscriptions-PUHH4FBB.js.map +1 -0
  48. package/dist/testers-WWZMLB7J.js +145 -0
  49. package/dist/testers-WWZMLB7J.js.map +1 -0
  50. package/dist/tracks-427E34S3.js +39 -0
  51. package/dist/tracks-427E34S3.js.map +1 -0
  52. package/dist/users-E5Y5HI6K.js +145 -0
  53. package/dist/users-E5Y5HI6K.js.map +1 -0
  54. package/dist/validate-TPKVSIMR.js +37 -0
  55. package/dist/validate-TPKVSIMR.js.map +1 -0
  56. package/dist/vitals-YMZMUPNA.js +166 -0
  57. package/dist/vitals-YMZMUPNA.js.map +1 -0
  58. package/package.json +48 -0
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/plugins.ts
4
+ import { PluginManager, discoverPlugins } from "@gpc-cli/core";
5
+ async function loadPlugins() {
6
+ const manager = new PluginManager();
7
+ if (process.env["__GPC_BINARY"] === "1") {
8
+ return manager;
9
+ }
10
+ try {
11
+ const { loadConfig } = await import("@gpc-cli/config");
12
+ const config = await loadConfig();
13
+ const plugins = await discoverPlugins({ configPlugins: config.plugins });
14
+ const approved = new Set(config.approvedPlugins ?? []);
15
+ for (const plugin of plugins) {
16
+ const isTrusted = plugin.name.startsWith("@gpc-cli/");
17
+ if (!isTrusted && !approved.has(plugin.name)) {
18
+ const isQuiet = process.argv.includes("--quiet") || process.argv.includes("-q");
19
+ if (!isQuiet) {
20
+ console.error(
21
+ `Plugin "${plugin.name}" is not approved. Run: gpc plugins approve ${plugin.name}`
22
+ );
23
+ }
24
+ continue;
25
+ }
26
+ try {
27
+ await manager.load(plugin);
28
+ } catch {
29
+ }
30
+ }
31
+ } catch {
32
+ }
33
+ return manager;
34
+ }
35
+ function registerPluginCommands(program, manager) {
36
+ for (const def of manager.getRegisteredCommands()) {
37
+ const cmd = program.command(def.name).description(def.description);
38
+ if (def.arguments) {
39
+ for (const arg of def.arguments) {
40
+ const syntax = arg.required ? `<${arg.name}>` : `[${arg.name}]`;
41
+ cmd.argument(syntax, arg.description);
42
+ }
43
+ }
44
+ if (def.options) {
45
+ for (const opt of def.options) {
46
+ cmd.option(opt.flags, opt.description, opt.defaultValue);
47
+ }
48
+ }
49
+ cmd.action(async (...rawArgs) => {
50
+ const opts = rawArgs[rawArgs.length - 2];
51
+ const args = {};
52
+ if (def.arguments) {
53
+ def.arguments.forEach((argDef, i) => {
54
+ args[argDef.name] = rawArgs[i];
55
+ });
56
+ }
57
+ await def.action(args, opts);
58
+ });
59
+ }
60
+ }
61
+
62
+ // src/program.ts
63
+ import { Command } from "commander";
64
+ async function createProgram(pluginManager) {
65
+ const program = new Command();
66
+ program.name("gpc").description("The complete Google Play CLI").version(process.env["__GPC_VERSION"] || "0.0.0", "-V, --version").option("-o, --output <format>", "Output format: table, json, yaml, markdown").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");
67
+ const commandLoaders = {
68
+ auth: async () => {
69
+ (await import("./auth-T7IDSMVX.js")).registerAuthCommands(program);
70
+ },
71
+ config: async () => {
72
+ (await import("./config-K7UJKIXT.js")).registerConfigCommands(program);
73
+ },
74
+ doctor: async () => {
75
+ (await import("./doctor-VDDUPTIM.js")).registerDoctorCommand(program);
76
+ },
77
+ docs: async () => {
78
+ (await import("./docs-CVTWIVMS.js")).registerDocsCommand(program);
79
+ },
80
+ completion: async () => {
81
+ (await import("./completion-U44CGHRH.js")).registerCompletionCommand(program);
82
+ },
83
+ apps: async () => {
84
+ (await import("./apps-BBYNHB2H.js")).registerAppsCommands(program);
85
+ },
86
+ releases: async () => {
87
+ (await import("./releases-464IMEEF.js")).registerReleasesCommands(program);
88
+ },
89
+ tracks: async () => {
90
+ (await import("./tracks-427E34S3.js")).registerTracksCommands(program);
91
+ },
92
+ status: async () => {
93
+ (await import("./status-M7U3YNMU.js")).registerStatusCommand(program);
94
+ },
95
+ listings: async () => {
96
+ (await import("./listings-PF5FDXKQ.js")).registerListingsCommands(program);
97
+ },
98
+ reviews: async () => {
99
+ (await import("./reviews-2CLM53E3.js")).registerReviewsCommands(program);
100
+ },
101
+ vitals: async () => {
102
+ (await import("./vitals-YMZMUPNA.js")).registerVitalsCommands(program);
103
+ },
104
+ subscriptions: async () => {
105
+ (await import("./subscriptions-PUHH4FBB.js")).registerSubscriptionsCommands(program);
106
+ },
107
+ iap: async () => {
108
+ (await import("./iap-QIV4CXKZ.js")).registerIapCommands(program);
109
+ },
110
+ purchases: async () => {
111
+ (await import("./purchases-E6A2T5WQ.js")).registerPurchasesCommands(program);
112
+ },
113
+ pricing: async () => {
114
+ (await import("./pricing-S4SB5FXJ.js")).registerPricingCommands(program);
115
+ },
116
+ reports: async () => {
117
+ (await import("./reports-3YAD4U4F.js")).registerReportsCommands(program);
118
+ },
119
+ users: async () => {
120
+ (await import("./users-E5Y5HI6K.js")).registerUsersCommands(program);
121
+ },
122
+ testers: async () => {
123
+ (await import("./testers-WWZMLB7J.js")).registerTestersCommands(program);
124
+ },
125
+ validate: async () => {
126
+ (await import("./validate-TPKVSIMR.js")).registerValidateCommand(program);
127
+ },
128
+ publish: async () => {
129
+ (await import("./publish-3BAIN4NQ.js")).registerPublishCommand(program);
130
+ },
131
+ plugins: async () => {
132
+ registerPluginsCommand(program, pluginManager);
133
+ }
134
+ };
135
+ const target = process.argv[2];
136
+ if (target && target in commandLoaders) {
137
+ await commandLoaders[target]();
138
+ } else {
139
+ await Promise.all(Object.values(commandLoaders).map((loader) => loader()));
140
+ }
141
+ if (pluginManager) {
142
+ registerPluginCommands(program, pluginManager);
143
+ }
144
+ if (pluginManager) {
145
+ wrapCommandHooks(program, pluginManager);
146
+ }
147
+ return program;
148
+ }
149
+ function registerPluginsCommand(program, manager) {
150
+ const cmd = program.command("plugins").description("Manage plugins");
151
+ cmd.command("list").description("List loaded plugins").action(() => {
152
+ const plugins = manager?.getLoadedPlugins() ?? [];
153
+ const opts = program.opts();
154
+ if (opts["output"] === "json") {
155
+ console.log(JSON.stringify(plugins, null, 2));
156
+ return;
157
+ }
158
+ if (plugins.length === 0) {
159
+ console.log("No plugins loaded.");
160
+ console.log('\nConfigure plugins in .gpcrc.json: { "plugins": ["@gpc-cli/plugin-ci"] }');
161
+ return;
162
+ }
163
+ console.log("Loaded plugins:\n");
164
+ for (const p of plugins) {
165
+ const trust = p.trusted ? "trusted" : "third-party";
166
+ console.log(` ${p.name}@${p.version} (${trust})`);
167
+ }
168
+ const commands = manager?.getRegisteredCommands() ?? [];
169
+ if (commands.length > 0) {
170
+ console.log("\nPlugin commands:\n");
171
+ for (const c of commands) {
172
+ console.log(` gpc ${c.name} \u2014 ${c.description}`);
173
+ }
174
+ }
175
+ });
176
+ cmd.command("init <name>").description("Scaffold a new plugin project").option("-d, --dir <path>", "Output directory (defaults to ./gpc-plugin-<name>)").option("--description <text>", "Plugin description").action(async (name, opts) => {
177
+ const { scaffoldPlugin } = await import("@gpc-cli/core");
178
+ const pluginName = name.startsWith("gpc-plugin-") ? name : `gpc-plugin-${name}`;
179
+ const dir = opts.dir ?? `./${pluginName}`;
180
+ const result = await scaffoldPlugin({ name, dir, description: opts.description });
181
+ console.log(`Plugin scaffolded at ${result.dir}/
182
+ `);
183
+ console.log("Files created:");
184
+ for (const f of result.files) {
185
+ console.log(` ${f}`);
186
+ }
187
+ console.log(`
188
+ Next steps:`);
189
+ console.log(` cd ${pluginName}`);
190
+ console.log(` npm install`);
191
+ console.log(` npm run build`);
192
+ console.log(` npm test`);
193
+ });
194
+ cmd.command("approve <name>").description("Approve a third-party plugin for loading").action(async (name) => {
195
+ const { approvePlugin } = await import("@gpc-cli/config");
196
+ await approvePlugin(name);
197
+ console.log(`Plugin "${name}" approved. It will be loaded on next run.`);
198
+ });
199
+ cmd.command("revoke <name>").description("Revoke approval for a third-party plugin").action(async (name) => {
200
+ const { revokePluginApproval } = await import("@gpc-cli/config");
201
+ const removed = await revokePluginApproval(name);
202
+ if (removed) {
203
+ console.log(`Plugin "${name}" approval revoked.`);
204
+ } else {
205
+ console.log(`Plugin "${name}" was not in the approved list.`);
206
+ }
207
+ });
208
+ }
209
+ function wrapCommandHooks(program, manager) {
210
+ program.hook("preAction", async (thisCommand) => {
211
+ const event = {
212
+ command: getFullCommandName(thisCommand),
213
+ args: thisCommand.opts(),
214
+ app: program.opts()["app"],
215
+ startedAt: /* @__PURE__ */ new Date()
216
+ };
217
+ thisCommand.__pluginEvent = event;
218
+ await manager.runBeforeCommand(event);
219
+ });
220
+ program.hook("postAction", async (thisCommand) => {
221
+ const event = thisCommand.__pluginEvent;
222
+ if (!event) return;
223
+ const result = {
224
+ success: true,
225
+ durationMs: Date.now() - event.startedAt.getTime(),
226
+ exitCode: 0
227
+ };
228
+ await manager.runAfterCommand(event, result);
229
+ });
230
+ }
231
+ function getFullCommandName(cmd) {
232
+ const parts = [];
233
+ let current = cmd;
234
+ while (current && current.name() !== "gpc") {
235
+ parts.unshift(current.name());
236
+ current = current.parent;
237
+ }
238
+ return parts.join(" ");
239
+ }
240
+
241
+ export {
242
+ loadPlugins,
243
+ createProgram
244
+ };
245
+ //# sourceMappingURL=chunk-IVVT73IP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins.ts","../src/program.ts"],"sourcesContent":["import { PluginManager, discoverPlugins } from \"@gpc-cli/core\";\nimport type { GpcPlugin } from \"@gpc-cli/plugin-sdk\";\nimport type { Command } from \"commander\";\n\n/**\n * Load and initialize all plugins.\n * First-party plugins (@gpc-cli/*) are auto-trusted.\n * Third-party plugins require prior approval stored in config.\n * Plugin loading is disabled in standalone binary mode.\n */\nexport async function loadPlugins(): Promise<PluginManager> {\n const manager = new PluginManager();\n\n // Standalone binary cannot resolve external npm packages at runtime\n if (process.env[\"__GPC_BINARY\"] === \"1\") {\n return manager;\n }\n\n try {\n const { loadConfig } = await import(\"@gpc-cli/config\");\n const config = await loadConfig();\n const plugins = await discoverPlugins({ configPlugins: config.plugins });\n const approved = new Set(config.approvedPlugins ?? []);\n\n for (const plugin of plugins) {\n const isTrusted = plugin.name.startsWith(\"@gpc-cli/\");\n\n if (!isTrusted && !approved.has(plugin.name)) {\n // Skip unapproved third-party plugins silently in non-interactive mode\n // In interactive mode, the user would run `gpc plugins approve <name>` first\n const isQuiet = process.argv.includes(\"--quiet\") || process.argv.includes(\"-q\");\n if (!isQuiet) {\n console.error(\n `Plugin \"${plugin.name}\" is not approved. Run: gpc plugins approve ${plugin.name}`,\n );\n }\n continue;\n }\n\n try {\n await manager.load(plugin);\n } catch {\n // Skip plugins that fail to load — don't block the CLI\n }\n }\n } catch {\n // Config loading failure shouldn't block plugin-free commands\n }\n\n return manager;\n}\n\n/**\n * Register plugin-defined commands with the Commander program.\n */\nexport function registerPluginCommands(program: Command, manager: PluginManager): void {\n for (const def of manager.getRegisteredCommands()) {\n const cmd = program.command(def.name).description(def.description);\n\n if (def.arguments) {\n for (const arg of def.arguments) {\n const syntax = arg.required ? `<${arg.name}>` : `[${arg.name}]`;\n cmd.argument(syntax, arg.description);\n }\n }\n\n if (def.options) {\n for (const opt of def.options) {\n cmd.option(opt.flags, opt.description, opt.defaultValue);\n }\n }\n\n cmd.action(async (...rawArgs: unknown[]) => {\n const opts = rawArgs[rawArgs.length - 2] as Record<string, unknown>;\n const args: Record<string, unknown> = {};\n\n if (def.arguments) {\n def.arguments.forEach((argDef, i) => {\n args[argDef.name] = rawArgs[i];\n });\n }\n\n await def.action(args, opts);\n });\n }\n}\n","import { Command } from \"commander\";\nimport type { PluginManager } from \"@gpc-cli/core\";\nimport type { CommandEvent, CommandResult, PluginError } from \"@gpc-cli/plugin-sdk\";\nimport { registerPluginCommands } from \"./plugins.js\";\n\nexport async function createProgram(pluginManager?: PluginManager): Promise<Command> {\n const program = new Command();\n\n program\n .name(\"gpc\")\n .description(\"The complete Google Play CLI\")\n .version(process.env[\"__GPC_VERSION\"] || \"0.0.0\", \"-V, --version\")\n .option(\"-o, --output <format>\", \"Output format: table, json, yaml, markdown\")\n .option(\"-v, --verbose\", \"Enable debug logging\")\n .option(\"-q, --quiet\", \"Suppress non-essential output\")\n .option(\"-a, --app <package>\", \"App package name\")\n .option(\"-p, --profile <name>\", \"Auth profile name\")\n .option(\"--no-color\", \"Disable colored output\")\n .option(\"--no-interactive\", \"Disable interactive prompts\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--dry-run\", \"Preview changes without executing\");\n\n const commandLoaders: Record<string, () => Promise<void>> = {\n auth: async () => { (await import(\"./commands/auth.js\")).registerAuthCommands(program); },\n config: async () => { (await import(\"./commands/config.js\")).registerConfigCommands(program); },\n doctor: async () => { (await import(\"./commands/doctor.js\")).registerDoctorCommand(program); },\n docs: async () => { (await import(\"./commands/docs.js\")).registerDocsCommand(program); },\n completion: async () => { (await import(\"./commands/completion.js\")).registerCompletionCommand(program); },\n apps: async () => { (await import(\"./commands/apps.js\")).registerAppsCommands(program); },\n releases: async () => { (await import(\"./commands/releases.js\")).registerReleasesCommands(program); },\n tracks: async () => { (await import(\"./commands/tracks.js\")).registerTracksCommands(program); },\n status: async () => { (await import(\"./commands/status.js\")).registerStatusCommand(program); },\n listings: async () => { (await import(\"./commands/listings.js\")).registerListingsCommands(program); },\n reviews: async () => { (await import(\"./commands/reviews.js\")).registerReviewsCommands(program); },\n vitals: async () => { (await import(\"./commands/vitals.js\")).registerVitalsCommands(program); },\n subscriptions: async () => { (await import(\"./commands/subscriptions.js\")).registerSubscriptionsCommands(program); },\n iap: async () => { (await import(\"./commands/iap.js\")).registerIapCommands(program); },\n purchases: async () => { (await import(\"./commands/purchases.js\")).registerPurchasesCommands(program); },\n pricing: async () => { (await import(\"./commands/pricing.js\")).registerPricingCommands(program); },\n reports: async () => { (await import(\"./commands/reports.js\")).registerReportsCommands(program); },\n users: async () => { (await import(\"./commands/users.js\")).registerUsersCommands(program); },\n testers: async () => { (await import(\"./commands/testers.js\")).registerTestersCommands(program); },\n validate: async () => { (await import(\"./commands/validate.js\")).registerValidateCommand(program); },\n publish: async () => { (await import(\"./commands/publish.js\")).registerPublishCommand(program); },\n plugins: async () => { registerPluginsCommand(program, pluginManager); },\n };\n\n const target = process.argv[2];\n\n if (target && target in commandLoaders) {\n await commandLoaders[target]!();\n } else {\n await Promise.all(Object.values(commandLoaders).map((loader) => loader()));\n }\n\n // Register plugin-defined commands\n if (pluginManager) {\n registerPluginCommands(program, pluginManager);\n }\n\n // Wire plugin lifecycle hooks around command execution\n if (pluginManager) {\n wrapCommandHooks(program, pluginManager);\n }\n\n return program;\n}\n\n/**\n * `gpc plugins` — manage plugins.\n */\nfunction registerPluginsCommand(program: Command, manager?: PluginManager): void {\n const cmd = program.command(\"plugins\").description(\"Manage plugins\");\n\n cmd\n .command(\"list\")\n .description(\"List loaded plugins\")\n .action(() => {\n const plugins = manager?.getLoadedPlugins() ?? [];\n const opts = program.opts();\n\n if (opts[\"output\"] === \"json\") {\n console.log(JSON.stringify(plugins, null, 2));\n return;\n }\n\n if (plugins.length === 0) {\n console.log(\"No plugins loaded.\");\n console.log('\\nConfigure plugins in .gpcrc.json: { \"plugins\": [\"@gpc-cli/plugin-ci\"] }');\n return;\n }\n\n console.log(\"Loaded plugins:\\n\");\n for (const p of plugins) {\n const trust = p.trusted ? \"trusted\" : \"third-party\";\n console.log(` ${p.name}@${p.version} (${trust})`);\n }\n\n const commands = manager?.getRegisteredCommands() ?? [];\n if (commands.length > 0) {\n console.log(\"\\nPlugin commands:\\n\");\n for (const c of commands) {\n console.log(` gpc ${c.name} — ${c.description}`);\n }\n }\n });\n\n cmd\n .command(\"init <name>\")\n .description(\"Scaffold a new plugin project\")\n .option(\"-d, --dir <path>\", \"Output directory (defaults to ./gpc-plugin-<name>)\")\n .option(\"--description <text>\", \"Plugin description\")\n .action(async (name: string, opts: { dir?: string; description?: string }) => {\n const { scaffoldPlugin } = await import(\"@gpc-cli/core\");\n const pluginName = name.startsWith(\"gpc-plugin-\") ? name : `gpc-plugin-${name}`;\n const dir = opts.dir ?? `./${pluginName}`;\n\n const result = await scaffoldPlugin({ name, dir, description: opts.description });\n\n console.log(`Plugin scaffolded at ${result.dir}/\\n`);\n console.log(\"Files created:\");\n for (const f of result.files) {\n console.log(` ${f}`);\n }\n console.log(`\\nNext steps:`);\n console.log(` cd ${pluginName}`);\n console.log(` npm install`);\n console.log(` npm run build`);\n console.log(` npm test`);\n });\n\n cmd\n .command(\"approve <name>\")\n .description(\"Approve a third-party plugin for loading\")\n .action(async (name: string) => {\n const { approvePlugin } = await import(\"@gpc-cli/config\");\n await approvePlugin(name);\n console.log(`Plugin \"${name}\" approved. It will be loaded on next run.`);\n });\n\n cmd\n .command(\"revoke <name>\")\n .description(\"Revoke approval for a third-party plugin\")\n .action(async (name: string) => {\n const { revokePluginApproval } = await import(\"@gpc-cli/config\");\n const removed = await revokePluginApproval(name);\n if (removed) {\n console.log(`Plugin \"${name}\" approval revoked.`);\n } else {\n console.log(`Plugin \"${name}\" was not in the approved list.`);\n }\n });\n}\n\n/**\n * Wrap all registered commands so plugin hooks fire before/after each command.\n */\nfunction wrapCommandHooks(program: Command, manager: PluginManager): void {\n program.hook(\"preAction\", async (thisCommand) => {\n const event: CommandEvent = {\n command: getFullCommandName(thisCommand),\n args: thisCommand.opts(),\n app: program.opts()[\"app\"] as string | undefined,\n startedAt: new Date(),\n };\n\n // Store on the command for afterCommand/onError\n (thisCommand as any).__pluginEvent = event;\n\n await manager.runBeforeCommand(event);\n });\n\n program.hook(\"postAction\", async (thisCommand) => {\n const event: CommandEvent = (thisCommand as any).__pluginEvent;\n if (!event) return;\n\n const result: CommandResult = {\n success: true,\n durationMs: Date.now() - event.startedAt.getTime(),\n exitCode: 0,\n };\n\n await manager.runAfterCommand(event, result);\n });\n}\n\nfunction getFullCommandName(cmd: Command): string {\n const parts: string[] = [];\n let current: Command | null = cmd;\n while (current && current.name() !== \"gpc\") {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/dry-run.ts
4
+ function isDryRun(program) {
5
+ let cmd = program;
6
+ while (cmd.parent) {
7
+ cmd = cmd.parent;
8
+ }
9
+ return !!cmd.opts().dryRun;
10
+ }
11
+ function printDryRun(preview, format, formatOutput) {
12
+ const output = {
13
+ dryRun: true,
14
+ ...preview,
15
+ message: `Would ${preview.action} ${preview.target}`
16
+ };
17
+ console.log(formatOutput(output, format));
18
+ }
19
+
20
+ export {
21
+ isDryRun,
22
+ printDryRun
23
+ };
24
+ //# sourceMappingURL=chunk-QMKZYXDJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dry-run.ts"],"sourcesContent":["export interface DryRunPreview {\n command: string;\n action: string;\n target: string;\n details?: Record<string, unknown>;\n}\n\nexport function isDryRun(program: { opts(): Record<string, unknown> }): boolean {\n let cmd = program as any;\n while (cmd.parent) {\n cmd = cmd.parent;\n }\n return !!cmd.opts().dryRun;\n}\n\nexport function printDryRun(preview: DryRunPreview, format: string, formatOutput: (data: unknown, format: string) => string): void {\n const output = {\n dryRun: true,\n ...preview,\n message: `Would ${preview.action} ${preview.target}`,\n };\n console.log(formatOutput(output, format));\n}\n"],"mappings":";;;AAOO,SAAS,SAAS,SAAuD;AAC9E,MAAI,MAAM;AACV,SAAO,IAAI,QAAQ;AACjB,UAAM,IAAI;AAAA,EACZ;AACA,SAAO,CAAC,CAAC,IAAI,KAAK,EAAE;AACtB;AAEO,SAAS,YAAY,SAAwB,QAAgB,cAA+D;AACjI,QAAM,SAAS;AAAA,IACb,QAAQ;AAAA,IACR,GAAG;AAAA,IACH,SAAS,SAAS,QAAQ,MAAM,IAAI,QAAQ,MAAM;AAAA,EACpD;AACA,UAAQ,IAAI,aAAa,QAAQ,MAAM,CAAC;AAC1C;","names":[]}
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/commands/completion.ts
4
+ function registerCompletionCommand(program) {
5
+ const completion = program.command("completion").description("Generate shell completions");
6
+ completion.command("bash").description("Generate bash completions").action(() => {
7
+ console.log(generateBashCompletions());
8
+ });
9
+ completion.command("zsh").description("Generate zsh completions").action(() => {
10
+ console.log(generateZshCompletions());
11
+ });
12
+ completion.command("fish").description("Generate fish completions").action(() => {
13
+ console.log(generateFishCompletions());
14
+ });
15
+ }
16
+ function generateBashCompletions() {
17
+ return `# bash completion for gpc
18
+ _gpc() {
19
+ local cur prev commands
20
+ COMPREPLY=()
21
+ cur="\${COMP_WORDS[COMP_CWORD]}"
22
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
23
+
24
+ commands="auth config doctor docs completion"
25
+
26
+ case "\${prev}" in
27
+ gpc)
28
+ COMPREPLY=( $(compgen -W "\${commands}" -- "\${cur}") )
29
+ return 0
30
+ ;;
31
+ auth)
32
+ COMPREPLY=( $(compgen -W "login status logout whoami" -- "\${cur}") )
33
+ return 0
34
+ ;;
35
+ config)
36
+ COMPREPLY=( $(compgen -W "init show set path" -- "\${cur}") )
37
+ return 0
38
+ ;;
39
+ completion)
40
+ COMPREPLY=( $(compgen -W "bash zsh fish" -- "\${cur}") )
41
+ return 0
42
+ ;;
43
+ esac
44
+
45
+ COMPREPLY=( $(compgen -W "\${commands}" -- "\${cur}") )
46
+ return 0
47
+ }
48
+
49
+ complete -F _gpc gpc`;
50
+ }
51
+ function generateZshCompletions() {
52
+ return `#compdef gpc
53
+
54
+ _gpc() {
55
+ local -a commands auth_commands config_commands completion_commands
56
+
57
+ commands=(
58
+ 'auth:Manage authentication'
59
+ 'config:Manage CLI configuration'
60
+ 'doctor:Check environment and configuration'
61
+ 'docs:Open documentation'
62
+ 'completion:Generate shell completions'
63
+ )
64
+
65
+ auth_commands=(
66
+ 'login:Authenticate with Google Play Console'
67
+ 'status:Show current authentication status'
68
+ 'logout:Remove stored credentials'
69
+ 'whoami:Show the authenticated account'
70
+ )
71
+
72
+ config_commands=(
73
+ 'init:Initialize a new configuration'
74
+ 'show:Show current configuration'
75
+ 'set:Set a configuration value'
76
+ 'path:Show the configuration file path'
77
+ )
78
+
79
+ completion_commands=(
80
+ 'bash:Generate bash completions'
81
+ 'zsh:Generate zsh completions'
82
+ 'fish:Generate fish completions'
83
+ )
84
+
85
+ _arguments -C \\
86
+ '1: :->command' \\
87
+ '2: :->subcommand' \\
88
+ '*::arg:->args'
89
+
90
+ case "$state" in
91
+ command)
92
+ _describe -t commands 'gpc commands' commands
93
+ ;;
94
+ subcommand)
95
+ case "$words[2]" in
96
+ auth)
97
+ _describe -t auth_commands 'auth commands' auth_commands
98
+ ;;
99
+ config)
100
+ _describe -t config_commands 'config commands' config_commands
101
+ ;;
102
+ completion)
103
+ _describe -t completion_commands 'completion commands' completion_commands
104
+ ;;
105
+ esac
106
+ ;;
107
+ esac
108
+ }
109
+
110
+ _gpc "$@"`;
111
+ }
112
+ function generateFishCompletions() {
113
+ return `# fish completions for gpc
114
+
115
+ # Disable file completions by default
116
+ complete -c gpc -f
117
+
118
+ # Top-level commands
119
+ complete -c gpc -n '__fish_use_subcommand' -a auth -d 'Manage authentication'
120
+ complete -c gpc -n '__fish_use_subcommand' -a config -d 'Manage CLI configuration'
121
+ complete -c gpc -n '__fish_use_subcommand' -a doctor -d 'Check environment and configuration'
122
+ complete -c gpc -n '__fish_use_subcommand' -a docs -d 'Open documentation'
123
+ complete -c gpc -n '__fish_use_subcommand' -a completion -d 'Generate shell completions'
124
+
125
+ # auth subcommands
126
+ complete -c gpc -n '__fish_seen_subcommand_from auth' -a login -d 'Authenticate with Google Play Console'
127
+ complete -c gpc -n '__fish_seen_subcommand_from auth' -a status -d 'Show current authentication status'
128
+ complete -c gpc -n '__fish_seen_subcommand_from auth' -a logout -d 'Remove stored credentials'
129
+ complete -c gpc -n '__fish_seen_subcommand_from auth' -a whoami -d 'Show the authenticated account'
130
+
131
+ # config subcommands
132
+ complete -c gpc -n '__fish_seen_subcommand_from config' -a init -d 'Initialize a new configuration'
133
+ complete -c gpc -n '__fish_seen_subcommand_from config' -a show -d 'Show current configuration'
134
+ complete -c gpc -n '__fish_seen_subcommand_from config' -a set -d 'Set a configuration value'
135
+ complete -c gpc -n '__fish_seen_subcommand_from config' -a path -d 'Show the configuration file path'
136
+
137
+ # completion subcommands
138
+ complete -c gpc -n '__fish_seen_subcommand_from completion' -a bash -d 'Generate bash completions'
139
+ complete -c gpc -n '__fish_seen_subcommand_from completion' -a zsh -d 'Generate zsh completions'
140
+ complete -c gpc -n '__fish_seen_subcommand_from completion' -a fish -d 'Generate fish completions'`;
141
+ }
142
+ export {
143
+ registerCompletionCommand
144
+ };
145
+ //# sourceMappingURL=completion-U44CGHRH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/completion.ts"],"sourcesContent":["import type { Command } from \"commander\";\n\nexport function registerCompletionCommand(program: Command): void {\n const completion = program\n .command(\"completion\")\n .description(\"Generate shell completions\");\n\n completion\n .command(\"bash\")\n .description(\"Generate bash completions\")\n .action(() => {\n console.log(generateBashCompletions());\n });\n\n completion\n .command(\"zsh\")\n .description(\"Generate zsh completions\")\n .action(() => {\n console.log(generateZshCompletions());\n });\n\n completion\n .command(\"fish\")\n .description(\"Generate fish completions\")\n .action(() => {\n console.log(generateFishCompletions());\n });\n}\n\nfunction generateBashCompletions(): string {\n return `# bash completion for gpc\n_gpc() {\n local cur prev commands\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n\n commands=\"auth config doctor docs completion\"\n\n case \"\\${prev}\" in\n gpc)\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n ;;\n auth)\n COMPREPLY=( $(compgen -W \"login status logout whoami\" -- \"\\${cur}\") )\n return 0\n ;;\n config)\n COMPREPLY=( $(compgen -W \"init show set path\" -- \"\\${cur}\") )\n return 0\n ;;\n completion)\n COMPREPLY=( $(compgen -W \"bash zsh fish\" -- \"\\${cur}\") )\n return 0\n ;;\n esac\n\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n}\n\ncomplete -F _gpc gpc`;\n}\n\nfunction generateZshCompletions(): string {\n return `#compdef gpc\n\n_gpc() {\n local -a commands auth_commands config_commands completion_commands\n\n commands=(\n 'auth:Manage authentication'\n 'config:Manage CLI configuration'\n 'doctor:Check environment and configuration'\n 'docs:Open documentation'\n 'completion:Generate shell completions'\n )\n\n auth_commands=(\n 'login:Authenticate with Google Play Console'\n 'status:Show current authentication status'\n 'logout:Remove stored credentials'\n 'whoami:Show the authenticated account'\n )\n\n config_commands=(\n 'init:Initialize a new configuration'\n 'show:Show current configuration'\n 'set:Set a configuration value'\n 'path:Show the configuration file path'\n )\n\n completion_commands=(\n 'bash:Generate bash completions'\n 'zsh:Generate zsh completions'\n 'fish:Generate fish completions'\n )\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '2: :->subcommand' \\\\\n '*::arg:->args'\n\n case \"\\$state\" in\n command)\n _describe -t commands 'gpc commands' commands\n ;;\n subcommand)\n case \"\\$words[2]\" in\n auth)\n _describe -t auth_commands 'auth commands' auth_commands\n ;;\n config)\n _describe -t config_commands 'config commands' config_commands\n ;;\n completion)\n _describe -t completion_commands 'completion commands' completion_commands\n ;;\n esac\n ;;\n esac\n}\n\n_gpc \"\\$@\"`;\n}\n\nfunction generateFishCompletions(): string {\n return `# fish completions for gpc\n\n# Disable file completions by default\ncomplete -c gpc -f\n\n# Top-level commands\ncomplete -c gpc -n '__fish_use_subcommand' -a auth -d 'Manage authentication'\ncomplete -c gpc -n '__fish_use_subcommand' -a config -d 'Manage CLI configuration'\ncomplete -c gpc -n '__fish_use_subcommand' -a doctor -d 'Check environment and configuration'\ncomplete -c gpc -n '__fish_use_subcommand' -a docs -d 'Open documentation'\ncomplete -c gpc -n '__fish_use_subcommand' -a completion -d 'Generate shell completions'\n\n# auth subcommands\ncomplete -c gpc -n '__fish_seen_subcommand_from auth' -a login -d 'Authenticate with Google Play Console'\ncomplete -c gpc -n '__fish_seen_subcommand_from auth' -a status -d 'Show current authentication status'\ncomplete -c gpc -n '__fish_seen_subcommand_from auth' -a logout -d 'Remove stored credentials'\ncomplete -c gpc -n '__fish_seen_subcommand_from auth' -a whoami -d 'Show the authenticated account'\n\n# config subcommands\ncomplete -c gpc -n '__fish_seen_subcommand_from config' -a init -d 'Initialize a new configuration'\ncomplete -c gpc -n '__fish_seen_subcommand_from config' -a show -d 'Show current configuration'\ncomplete -c gpc -n '__fish_seen_subcommand_from config' -a set -d 'Set a configuration value'\ncomplete -c gpc -n '__fish_seen_subcommand_from config' -a path -d 'Show the configuration file path'\n\n# completion subcommands\ncomplete -c gpc -n '__fish_seen_subcommand_from completion' -a bash -d 'Generate bash completions'\ncomplete -c gpc -n '__fish_seen_subcommand_from completion' -a zsh -d 'Generate zsh completions'\ncomplete -c gpc -n '__fish_seen_subcommand_from completion' -a fish -d 'Generate fish completions'`;\n}\n"],"mappings":";;;AAEO,SAAS,0BAA0B,SAAwB;AAChE,QAAM,aAAa,QAChB,QAAQ,YAAY,EACpB,YAAY,4BAA4B;AAE3C,aACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,OAAO,MAAM;AACZ,YAAQ,IAAI,wBAAwB,CAAC;AAAA,EACvC,CAAC;AAEH,aACG,QAAQ,KAAK,EACb,YAAY,0BAA0B,EACtC,OAAO,MAAM;AACZ,YAAQ,IAAI,uBAAuB,CAAC;AAAA,EACtC,CAAC;AAEH,aACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,OAAO,MAAM;AACZ,YAAQ,IAAI,wBAAwB,CAAC;AAAA,EACvC,CAAC;AACL;AAEA,SAAS,0BAAkC;AACzC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCT;AAEA,SAAS,yBAAiC;AACxC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DT;AAEA,SAAS,0BAAkC;AACzC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BT;","names":[]}
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isInteractive,
4
+ promptInput,
5
+ promptSelect
6
+ } from "./chunk-4QV4WD3F.js";
7
+
8
+ // src/commands/config.ts
9
+ import { loadConfig, setConfigValue, getUserConfigPath, initConfig } from "@gpc-cli/config";
10
+ import { detectOutputFormat, formatOutput, writeAuditLog, createAuditEntry } from "@gpc-cli/core";
11
+ function registerConfigCommands(program) {
12
+ const config = program.command("config").description("Manage configuration");
13
+ config.command("init").description("Create a configuration file").option("--global", "Create in user config directory (~/.config/gpc/)").action(async (_options) => {
14
+ let initialConfig = {};
15
+ if (isInteractive(program)) {
16
+ const app = await promptInput("Default package name (e.g. com.example.app, blank to skip)");
17
+ if (app) initialConfig["app"] = app;
18
+ const output = await promptSelect("Default output format:", ["table", "json", "yaml", "markdown"], "table");
19
+ if (output !== "table") initialConfig["output"] = output;
20
+ const sa = await promptInput("Service account JSON path (blank to skip)");
21
+ if (sa) initialConfig["auth"] = { serviceAccount: sa };
22
+ }
23
+ const path = await initConfig(initialConfig);
24
+ console.log(`Configuration file created at: ${path}`);
25
+ writeAuditLog(createAuditEntry("config init", { path })).catch(() => {
26
+ });
27
+ });
28
+ config.command("show").description("Display resolved configuration").action(async () => {
29
+ const resolved = await loadConfig();
30
+ const format = detectOutputFormat();
31
+ console.log(formatOutput(resolved, format));
32
+ });
33
+ config.command("set <key> <value>").description("Set a configuration value").action(async (key, value) => {
34
+ await setConfigValue(key, value);
35
+ console.log(`Set ${key} = ${value}`);
36
+ });
37
+ config.command("path").description("Show configuration file path").action(() => {
38
+ console.log(getUserConfigPath());
39
+ });
40
+ }
41
+ export {
42
+ registerConfigCommands
43
+ };
44
+ //# sourceMappingURL=config-K7UJKIXT.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 { detectOutputFormat, formatOutput, writeAuditLog, createAuditEntry } from \"@gpc-cli/core\";\nimport { isInteractive, promptInput, promptSelect } from \"../prompt.js\";\n\nexport function registerConfigCommands(program: Command): void {\n const config = program\n .command(\"config\")\n .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 let initialConfig: Record<string, unknown> = {};\n\n if (isInteractive(program)) {\n const app = await promptInput(\"Default package name (e.g. com.example.app, blank to skip)\");\n if (app) initialConfig[\"app\"] = app;\n\n const output = await promptSelect(\"Default output format:\", [\"table\", \"json\", \"yaml\", \"markdown\"], \"table\");\n if (output !== \"table\") initialConfig[\"output\"] = output;\n\n const sa = await promptInput(\"Service account JSON path (blank to skip)\");\n if (sa) initialConfig[\"auth\"] = { serviceAccount: sa };\n }\n\n const path = await initConfig(initialConfig as any);\n console.log(`Configuration file created at: ${path}`);\n writeAuditLog(createAuditEntry(\"config init\", { path })).catch(() => {});\n });\n\n config\n .command(\"show\")\n .description(\"Display resolved configuration\")\n .action(async () => {\n const resolved = await loadConfig();\n const format = detectOutputFormat();\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":";;;;;;;;AACA,SAAS,YAAY,gBAAgB,mBAAmB,kBAAkB;AAC1E,SAAS,oBAAoB,cAAc,eAAe,wBAAwB;AAG3E,SAAS,uBAAuB,SAAwB;AAC7D,QAAM,SAAS,QACZ,QAAQ,QAAQ,EAChB,YAAY,sBAAsB;AAErC,SACG,QAAQ,MAAM,EACd,YAAY,6BAA6B,EACzC,OAAO,YAAY,kDAAkD,EACrE,OAAO,OAAO,aAAmC;AAChD,QAAI,gBAAyC,CAAC;AAE9C,QAAI,cAAc,OAAO,GAAG;AAC1B,YAAM,MAAM,MAAM,YAAY,4DAA4D;AAC1F,UAAI,IAAK,eAAc,KAAK,IAAI;AAEhC,YAAM,SAAS,MAAM,aAAa,0BAA0B,CAAC,SAAS,QAAQ,QAAQ,UAAU,GAAG,OAAO;AAC1G,UAAI,WAAW,QAAS,eAAc,QAAQ,IAAI;AAElD,YAAM,KAAK,MAAM,YAAY,2CAA2C;AACxE,UAAI,GAAI,eAAc,MAAM,IAAI,EAAE,gBAAgB,GAAG;AAAA,IACvD;AAEA,UAAM,OAAO,MAAM,WAAW,aAAoB;AAClD,YAAQ,IAAI,kCAAkC,IAAI,EAAE;AACpD,kBAAc,iBAAiB,eAAe,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACzE,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,YAAY;AAClB,UAAM,WAAW,MAAM,WAAW;AAClC,UAAM,SAAS,mBAAmB;AAClC,YAAQ,IAAI,aAAa,UAAU,MAAM,CAAC;AAAA,EAC5C,CAAC;AAEH,SACG,QAAQ,mBAAmB,EAC3B,YAAY,2BAA2B,EACvC,OAAO,OAAO,KAAa,UAAkB;AAC5C,UAAM,eAAe,KAAK,KAAK;AAC/B,YAAQ,IAAI,OAAO,GAAG,MAAM,KAAK,EAAE;AAAA,EACrC,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,8BAA8B,EAC1C,OAAO,MAAM;AACZ,YAAQ,IAAI,kBAAkB,CAAC;AAAA,EACjC,CAAC;AACL;","names":[]}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/commands/docs.ts
4
+ import { execFile } from "child_process";
5
+ function registerDocsCommand(program) {
6
+ program.command("docs").description("Open documentation in browser").action(() => {
7
+ const url = "https://github.com/yasserstudio/gpc#readme";
8
+ const platform = process.platform;
9
+ const cmd = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
10
+ execFile(cmd, [url], (error) => {
11
+ if (error) {
12
+ console.log(`Open in your browser: ${url}`);
13
+ }
14
+ });
15
+ });
16
+ }
17
+ export {
18
+ registerDocsCommand
19
+ };
20
+ //# sourceMappingURL=docs-CVTWIVMS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/docs.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { execFile } from \"node:child_process\";\n\nexport function registerDocsCommand(program: Command): void {\n program\n .command(\"docs\")\n .description(\"Open documentation in browser\")\n .action(() => {\n const url = \"https://github.com/yasserstudio/gpc#readme\";\n const platform = process.platform;\n const cmd = platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"start\" : \"xdg-open\";\n execFile(cmd, [url], (error) => {\n if (error) {\n console.log(`Open in your browser: ${url}`);\n }\n });\n });\n}\n"],"mappings":";;;AACA,SAAS,gBAAgB;AAElB,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,OAAO,MAAM;AACZ,UAAM,MAAM;AACZ,UAAM,WAAW,QAAQ;AACzB,UAAM,MAAM,aAAa,WAAW,SAAS,aAAa,UAAU,UAAU;AAC9E,aAAS,KAAK,CAAC,GAAG,GAAG,CAAC,UAAU;AAC9B,UAAI,OAAO;AACT,gBAAQ,IAAI,yBAAyB,GAAG,EAAE;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACL;","names":[]}
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/commands/doctor.ts
4
+ import { loadConfig } from "@gpc-cli/config";
5
+ import { resolveAuth, AuthError } from "@gpc-cli/auth";
6
+ function registerDoctorCommand(program) {
7
+ program.command("doctor").description("Verify setup and connectivity").action(async () => {
8
+ console.log("GPC Doctor\n");
9
+ let allGood = true;
10
+ const nodeVersion = process.versions.node;
11
+ const major = parseInt(nodeVersion.split(".")[0], 10);
12
+ if (major >= 20) {
13
+ console.log(` \u2713 Node.js ${nodeVersion}`);
14
+ } else {
15
+ console.log(` \u2717 Node.js ${nodeVersion} (requires >=20)`);
16
+ allGood = false;
17
+ }
18
+ try {
19
+ const config = await loadConfig();
20
+ console.log(` \u2713 Configuration loaded`);
21
+ if (config.app) {
22
+ console.log(` \u2713 Default app: ${config.app}`);
23
+ } else {
24
+ console.log(` - No default app configured (use --app flag or gpc config set app <package>)`);
25
+ }
26
+ } catch {
27
+ console.log(" \u2717 Configuration error");
28
+ allGood = false;
29
+ }
30
+ try {
31
+ const config = await loadConfig();
32
+ const client = await resolveAuth({
33
+ serviceAccountPath: config.auth?.serviceAccount
34
+ });
35
+ console.log(` \u2713 Authenticated as ${client.getClientEmail()}`);
36
+ await client.getAccessToken();
37
+ console.log(" \u2713 API connectivity verified");
38
+ } catch (error) {
39
+ if (error instanceof AuthError) {
40
+ console.log(` \u2717 Authentication: ${error.message}`);
41
+ if (error.suggestion) console.log(` ${error.suggestion}`);
42
+ } else {
43
+ console.log(" \u2717 API connectivity failed");
44
+ }
45
+ allGood = false;
46
+ }
47
+ console.log("");
48
+ if (allGood) {
49
+ console.log("All checks passed!");
50
+ } else {
51
+ console.log("Some checks failed. Fix the issues above and run again.");
52
+ process.exit(1);
53
+ }
54
+ });
55
+ }
56
+ export {
57
+ registerDoctorCommand
58
+ };
59
+ //# sourceMappingURL=doctor-VDDUPTIM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/doctor.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth, AuthError } from \"@gpc-cli/auth\";\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command(\"doctor\")\n .description(\"Verify setup and connectivity\")\n .action(async () => {\n console.log(\"GPC Doctor\\n\");\n let allGood = true;\n\n // Check Node.js version\n const nodeVersion = process.versions.node;\n const major = parseInt(nodeVersion.split(\".\")[0]!, 10);\n if (major >= 20) {\n console.log(` \\u2713 Node.js ${nodeVersion}`);\n } else {\n console.log(` \\u2717 Node.js ${nodeVersion} (requires >=20)`);\n allGood = false;\n }\n\n // Check config\n try {\n const config = await loadConfig();\n console.log(` \\u2713 Configuration loaded`);\n if (config.app) {\n console.log(` \\u2713 Default app: ${config.app}`);\n } else {\n console.log(` - No default app configured (use --app flag or gpc config set app <package>)`);\n }\n } catch {\n console.log(\" \\u2717 Configuration error\");\n allGood = false;\n }\n\n // Check auth\n try {\n const config = await loadConfig();\n const client = await resolveAuth({\n serviceAccountPath: config.auth?.serviceAccount,\n });\n console.log(` \\u2713 Authenticated as ${client.getClientEmail()}`);\n\n // Try to get a token to verify connectivity\n await client.getAccessToken();\n console.log(\" \\u2713 API connectivity verified\");\n } catch (error) {\n if (error instanceof AuthError) {\n console.log(` \\u2717 Authentication: ${error.message}`);\n if (error.suggestion) console.log(` ${error.suggestion}`);\n } else {\n console.log(\" \\u2717 API connectivity failed\");\n }\n allGood = false;\n }\n\n console.log(\"\");\n if (allGood) {\n console.log(\"All checks passed!\");\n } else {\n console.log(\"Some checks failed. Fix the issues above and run again.\");\n process.exit(1);\n }\n });\n}\n"],"mappings":";;;AACA,SAAS,kBAAkB;AAC3B,SAAS,aAAa,iBAAiB;AAEhC,SAAS,sBAAsB,SAAwB;AAC5D,UACG,QAAQ,QAAQ,EAChB,YAAY,+BAA+B,EAC3C,OAAO,YAAY;AAClB,YAAQ,IAAI,cAAc;AAC1B,QAAI,UAAU;AAGd,UAAM,cAAc,QAAQ,SAAS;AACrC,UAAM,QAAQ,SAAS,YAAY,MAAM,GAAG,EAAE,CAAC,GAAI,EAAE;AACrD,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,oBAAoB,WAAW,EAAE;AAAA,IAC/C,OAAO;AACL,cAAQ,IAAI,oBAAoB,WAAW,kBAAkB;AAC7D,gBAAU;AAAA,IACZ;AAGA,QAAI;AACF,YAAM,SAAS,MAAM,WAAW;AAChC,cAAQ,IAAI,+BAA+B;AAC3C,UAAI,OAAO,KAAK;AACd,gBAAQ,IAAI,yBAAyB,OAAO,GAAG,EAAE;AAAA,MACnD,OAAO;AACL,gBAAQ,IAAI,gFAAgF;AAAA,MAC9F;AAAA,IACF,QAAQ;AACN,cAAQ,IAAI,8BAA8B;AAC1C,gBAAU;AAAA,IACZ;AAGA,QAAI;AACF,YAAM,SAAS,MAAM,WAAW;AAChC,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B,oBAAoB,OAAO,MAAM;AAAA,MACnC,CAAC;AACD,cAAQ,IAAI,6BAA6B,OAAO,eAAe,CAAC,EAAE;AAGlE,YAAM,OAAO,eAAe;AAC5B,cAAQ,IAAI,oCAAoC;AAAA,IAClD,SAAS,OAAO;AACd,UAAI,iBAAiB,WAAW;AAC9B,gBAAQ,IAAI,4BAA4B,MAAM,OAAO,EAAE;AACvD,YAAI,MAAM,WAAY,SAAQ,IAAI,OAAO,MAAM,UAAU,EAAE;AAAA,MAC7D,OAAO;AACL,gBAAQ,IAAI,kCAAkC;AAAA,MAChD;AACA,gBAAU;AAAA,IACZ;AAEA,YAAQ,IAAI,EAAE;AACd,QAAI,SAAS;AACX,cAAQ,IAAI,oBAAoB;AAAA,IAClC,OAAO;AACL,cAAQ,IAAI,yDAAyD;AACrE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;","names":[]}