@gpc-cli/cli 0.9.58 → 0.9.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +1 -1
  2. package/dist/__complete-QFD3SUAO.js +146 -0
  3. package/dist/__complete-QFD3SUAO.js.map +1 -0
  4. package/dist/bin.js +14 -11
  5. package/dist/bin.js.map +1 -1
  6. package/dist/{chunk-2SVDYAY4.js → chunk-CSNCSWUV.js} +15 -12
  7. package/dist/chunk-CSNCSWUV.js.map +1 -0
  8. package/dist/{completion-KRZLHV7V.js → completion-4I3IJK3M.js} +80 -21
  9. package/dist/completion-4I3IJK3M.js.map +1 -0
  10. package/dist/{config-WXGCYY3U.js → config-ZNAM2IHA.js} +2 -2
  11. package/dist/{doctor-VET7CGBM.js → doctor-G2L2KVOO.js} +2 -2
  12. package/dist/{feedback-3TCRBPSI.js → feedback-WXSCASJK.js} +2 -2
  13. package/dist/index.js +1 -1
  14. package/dist/{listings-MOHHHNE6.js → listings-2Z6DSO3D.js} +4 -4
  15. package/dist/{publish-26SSZ2W3.js → publish-5HZAJEDZ.js} +4 -4
  16. package/dist/{testers-QUWZHO6M.js → testers-FGLBJAXL.js} +4 -4
  17. package/dist/{update-ZYW63YX3.js → update-WA6X6LNQ.js} +2 -2
  18. package/dist/{version-G3WWEAHE.js → version-DYTSDZH2.js} +2 -2
  19. package/dist/{vitals-RETD7K55.js → vitals-QPHS6QFH.js} +2 -2
  20. package/dist/vitals-QPHS6QFH.js.map +1 -0
  21. package/package.json +6 -6
  22. package/dist/chunk-2SVDYAY4.js.map +0 -1
  23. package/dist/completion-KRZLHV7V.js.map +0 -1
  24. package/dist/vitals-RETD7K55.js.map +0 -1
  25. /package/dist/{config-WXGCYY3U.js.map → config-ZNAM2IHA.js.map} +0 -0
  26. /package/dist/{doctor-VET7CGBM.js.map → doctor-G2L2KVOO.js.map} +0 -0
  27. /package/dist/{feedback-3TCRBPSI.js.map → feedback-WXSCASJK.js.map} +0 -0
  28. /package/dist/{listings-MOHHHNE6.js.map → listings-2Z6DSO3D.js.map} +0 -0
  29. /package/dist/{publish-26SSZ2W3.js.map → publish-5HZAJEDZ.js.map} +0 -0
  30. /package/dist/{testers-QUWZHO6M.js.map → testers-FGLBJAXL.js.map} +0 -0
  31. /package/dist/{update-ZYW63YX3.js.map → update-WA6X6LNQ.js.map} +0 -0
  32. /package/dist/{version-G3WWEAHE.js.map → version-DYTSDZH2.js.map} +0 -0
@@ -319,6 +319,9 @@ function optionToDef(opt) {
319
319
  takesValue
320
320
  };
321
321
  }
322
+ function isHidden(cmd) {
323
+ return cmd._hidden === true;
324
+ }
322
325
  function commandToDef(cmd) {
323
326
  const def = {
324
327
  description: cmd.description() ?? ""
@@ -327,7 +330,7 @@ function commandToDef(cmd) {
327
330
  if (options.length > 0) {
328
331
  def.options = options;
329
332
  }
330
- const subs = cmd.commands.filter((c) => c.name() !== "help");
333
+ const subs = cmd.commands.filter((c) => c.name() !== "help" && !isHidden(c));
331
334
  if (subs.length > 0) {
332
335
  def.subcommands = {};
333
336
  for (const sub of subs) {
@@ -339,7 +342,7 @@ function commandToDef(cmd) {
339
342
  function buildCommandTreeFromProgram(program) {
340
343
  const tree = {};
341
344
  for (const cmd of program.commands) {
342
- if (cmd.name() === "help") continue;
345
+ if (cmd.name() === "help" || isHidden(cmd)) continue;
343
346
  tree[cmd.name()] = commandToDef(cmd);
344
347
  }
345
348
  return tree;
@@ -379,11 +382,27 @@ function completableOptions(options) {
379
382
  return true;
380
383
  });
381
384
  }
385
+ var DYNAMIC_FLAG_CONTEXTS = [
386
+ { flags: ["--profile", "-p"], context: "profiles" },
387
+ { flags: ["--app", "-a"], context: "packages" },
388
+ { flags: ["--apps"], context: "packages" },
389
+ { flags: ["--track"], context: "tracks-for-app" }
390
+ ];
382
391
  function generateBashCompletions(tree = getCommandTree(), globals = []) {
383
392
  const topLevelNames = Object.keys(tree).join(" ");
384
393
  const globalFlags = completableOptions(globals).map((o) => o.long ?? "").filter(Boolean).join(" ");
385
394
  const caseEntries = [];
386
395
  const flagCases = [];
396
+ for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {
397
+ for (const flag of flags) {
398
+ flagCases.push(
399
+ ` ${flag})
400
+ COMPREPLY=( $(compgen -W "$(gpc __complete ${context} 2>/dev/null)" -- "\${cur}") )
401
+ return 0
402
+ ;;`
403
+ );
404
+ }
405
+ }
387
406
  const allCommandNames = /* @__PURE__ */ new Set();
388
407
  const collectNames = (defs) => {
389
408
  for (const [name, def] of Object.entries(defs)) {
@@ -418,7 +437,7 @@ function generateBashCompletions(tree = getCommandTree(), globals = []) {
418
437
  if (opt.choices && opt.long) {
419
438
  flagCases.push(
420
439
  ` ${opt.long})
421
- COMPREPLY=( $(compgen -W "${opt.choices.join(" ")}" -- "\${cur}") )
440
+ COMPREPLY=( $(compgen -W "${joinBashChoices(opt.choices)}" -- "\${cur}") )
422
441
  return 0
423
442
  ;;`
424
443
  );
@@ -432,7 +451,7 @@ function generateBashCompletions(tree = getCommandTree(), globals = []) {
432
451
  if (opt.choices && opt.long) {
433
452
  flagCases.push(
434
453
  ` ${opt.long})
435
- COMPREPLY=( $(compgen -W "${opt.choices.join(" ")}" -- "\${cur}") )
454
+ COMPREPLY=( $(compgen -W "${joinBashChoices(opt.choices)}" -- "\${cur}") )
436
455
  return 0
437
456
  ;;`
438
457
  );
@@ -530,33 +549,57 @@ ${subEntries}
530
549
  }
531
550
  }
532
551
  const localDecls = varNames.map((v) => ` local -a ${v}`).join("\n");
533
- const flagHints = [];
534
- const walkFlags = (defs, path) => {
535
- for (const [name, def] of Object.entries(defs)) {
552
+ const choiceSpecs = /* @__PURE__ */ new Set();
553
+ const walkChoices = (defs) => {
554
+ for (const def of Object.values(defs)) {
536
555
  for (const opt of completableOptions(def.options)) {
537
- if (opt.choices) {
538
- flagHints.push(
539
- `# ${path}${name} ${opt.long}: (${opt.choices.join(" ")}) \u2014 ${escapeZsh(opt.description)}`
556
+ if (opt.choices && opt.long) {
557
+ choiceSpecs.add(
558
+ `'${opt.long}[${escapeZsh(opt.description)}]:value:(${opt.choices.join(" ")})'`
540
559
  );
541
560
  }
542
561
  }
543
- if (def.subcommands) walkFlags(def.subcommands, `${path}${name} `);
562
+ if (def.subcommands) walkChoices(def.subcommands);
544
563
  }
545
564
  };
546
- walkFlags(tree, "");
565
+ walkChoices(tree);
547
566
  for (const opt of completableOptions(globals)) {
548
- if (opt.choices) {
549
- flagHints.push(
550
- `# (global) ${opt.long}: (${opt.choices.join(" ")}) \u2014 ${escapeZsh(opt.description)}`
567
+ if (opt.choices && opt.long) {
568
+ choiceSpecs.add(
569
+ `'${opt.long}[${escapeZsh(opt.description)}]:value:(${opt.choices.join(" ")})'`
551
570
  );
552
571
  }
553
572
  }
573
+ const dynamicSpecs = [];
574
+ for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {
575
+ for (const flag of flags) {
576
+ const fn = `_gpc_${context.replace(/-/g, "_")}`;
577
+ dynamicSpecs.push(`'${flag}[]:value:${fn}'`);
578
+ }
579
+ }
580
+ const helperFns = `
581
+ _gpc_profiles() {
582
+ local -a items
583
+ items=(\${(f)"$(gpc __complete profiles 2>/dev/null)"})
584
+ compadd -a items
585
+ }
586
+ _gpc_packages() {
587
+ local -a items
588
+ items=(\${(f)"$(gpc __complete packages 2>/dev/null)"})
589
+ compadd -a items
590
+ }
591
+ _gpc_tracks_for_app() {
592
+ local -a items
593
+ items=(\${(f)"$(gpc __complete tracks-for-app 2>/dev/null)"})
594
+ compadd -a items
595
+ }`;
596
+ const allSpecs = [...choiceSpecs, ...dynamicSpecs];
597
+ const extraArgs = allSpecs.length > 0 ? ` \\
598
+ ${allSpecs.join(" \\\n ")}` : "";
554
599
  return `#compdef gpc
555
600
  # Install: gpc completion zsh > ~/.zsh/completions/_gpc
556
- ${flagHints.length > 0 ? `
557
- # --- Flag choices (reference) ---
558
- ${flagHints.join("\n")}
559
- ` : ""}
601
+ ${helperFns}
602
+
560
603
  _gpc() {
561
604
  ${localDecls}
562
605
 
@@ -566,7 +609,7 @@ ${arrayDefs.join("\n\n")}
566
609
  '1: :->command' \\
567
610
  '2: :->subcommand' \\
568
611
  '3: :->subsubcommand' \\
569
- '*::arg:->args'
612
+ '*::arg:->args'${extraArgs}
570
613
 
571
614
  case "$state" in
572
615
  command)
@@ -655,6 +698,19 @@ function generateFishCompletions(tree = getCommandTree(), globals = []) {
655
698
  }
656
699
  };
657
700
  walkFlags(tree);
701
+ lines.push("");
702
+ lines.push("# Dynamic values (shell out to __complete)");
703
+ for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {
704
+ for (const flag of flags) {
705
+ if (flag.startsWith("--")) {
706
+ const longName = flag.slice(2);
707
+ lines.push(`complete -c gpc -l ${longName} -x -a '(gpc __complete ${context} 2>/dev/null)'`);
708
+ } else if (flag.startsWith("-")) {
709
+ const shortName = flag.slice(1);
710
+ lines.push(`complete -c gpc -s ${shortName} -x -a '(gpc __complete ${context} 2>/dev/null)'`);
711
+ }
712
+ }
713
+ }
658
714
  return lines.join("\n");
659
715
  }
660
716
  function generatePowerShellCompletions(tree = getCommandTree(), globals = []) {
@@ -720,6 +776,9 @@ ${level3Cases.join("\n")}
720
776
  }
721
777
  }`;
722
778
  }
779
+ function joinBashChoices(choices) {
780
+ return choices.map((c) => c.replace(/([\\"$`])/g, "\\$1").replace(/ /g, "\\ ")).join(" ");
781
+ }
723
782
  function escapeZsh(str) {
724
783
  return str.replace(/'/g, "'\\''");
725
784
  }
@@ -740,4 +799,4 @@ export {
740
799
  getCommandTree,
741
800
  registerCompletionCommand
742
801
  };
743
- //# sourceMappingURL=completion-KRZLHV7V.js.map
802
+ //# sourceMappingURL=completion-4I3IJK3M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/completion.ts"],"sourcesContent":["import type { Command, Option } from \"commander\";\n\nexport type ShellType = \"bash\" | \"zsh\" | \"fish\" | \"powershell\";\n\nexport const SUPPORTED_SHELLS: readonly ShellType[] = [\n \"bash\",\n \"zsh\",\n \"fish\",\n \"powershell\",\n] as const;\n\nexport interface OptionDef {\n flags: string;\n long?: string;\n short?: string;\n description: string;\n choices?: string[];\n takesValue: boolean;\n}\n\nexport interface CommandDef {\n description: string;\n subcommands?: Record<string, CommandDef>;\n options?: OptionDef[];\n}\n\n/**\n * Hand-maintained fallback tree. Used by unit tests and as a safety net when\n * the walker cannot introspect the program (e.g. when the generator is called\n * without a live Command instance). Runtime `gpc completion <shell>` uses the\n * introspected tree from `buildCommandTreeFromProgram` so new commands and\n * plugins auto-complete without requiring edits here.\n */\nexport function getCommandTree(): Record<string, CommandDef> {\n return {\n auth: {\n description: \"Manage authentication\",\n subcommands: {\n login: { description: \"Authenticate with Google Play Developer API\" },\n status: { description: \"Show current authentication status\" },\n logout: { description: \"Remove stored credentials\" },\n whoami: { description: \"Show the authenticated account\" },\n },\n },\n config: {\n description: \"Manage configuration\",\n subcommands: {\n init: { description: \"Create a configuration file\" },\n show: { description: \"Show current configuration\" },\n set: { description: \"Set a configuration value\" },\n path: { description: \"Show the configuration file path\" },\n },\n },\n apps: {\n description: \"Manage applications\",\n subcommands: {\n info: { description: \"Show app details\" },\n update: { description: \"Update app details\" },\n list: { description: \"List configured applications\" },\n },\n },\n releases: {\n description: \"Manage releases and rollouts\",\n subcommands: {\n upload: { description: \"Upload AAB/APK and assign to a track\" },\n status: { description: \"Show current release status across tracks\" },\n promote: { description: \"Promote a release from one track to another\" },\n rollout: {\n description: \"Manage staged rollouts\",\n subcommands: {\n increase: { description: \"Increase a staged rollout\" },\n halt: { description: \"Halt a staged rollout\" },\n resume: { description: \"Resume a staged rollout\" },\n complete: { description: \"Complete a staged rollout\" },\n },\n },\n notes: { description: \"Set release notes\" },\n },\n },\n tracks: {\n description: \"Manage tracks\",\n subcommands: {\n list: { description: \"List all tracks\" },\n },\n },\n status: { description: \"Cross-track release overview\" },\n listings: {\n description: \"Manage store listings and metadata\",\n subcommands: {\n get: { description: \"Get store listing(s)\" },\n update: { description: \"Update a store listing\" },\n delete: { description: \"Delete a store listing for a language\" },\n pull: { description: \"Download listings to Fastlane-format directory\" },\n push: { description: \"Upload listings from Fastlane-format directory\" },\n images: {\n description: \"Manage listing images\",\n subcommands: {\n list: { description: \"List images for a language and type\" },\n upload: { description: \"Upload an image\" },\n delete: { description: \"Delete an image\" },\n },\n },\n availability: { description: \"Get country availability for a track\" },\n },\n },\n reviews: {\n description: \"Manage user reviews and ratings\",\n subcommands: {\n list: { description: \"List user reviews\" },\n get: { description: \"Get a single review\" },\n reply: { description: \"Reply to a review\" },\n export: { description: \"Export reviews to JSON or CSV\" },\n },\n },\n vitals: {\n description: \"Monitor app vitals and performance metrics\",\n subcommands: {\n overview: { description: \"Dashboard summary of all vital metrics\" },\n crashes: { description: \"Query crash rate metrics\" },\n anr: { description: \"Query ANR rate metrics\" },\n startup: { description: \"Query slow startup metrics\" },\n rendering: { description: \"Query slow rendering metrics\" },\n battery: { description: \"Query excessive wakeup metrics\" },\n memory: { description: \"Query stuck wakelock metrics\" },\n anomalies: { description: \"Detect anomalies in app vitals\" },\n errors: {\n description: \"Search and view error issues\",\n subcommands: {\n search: { description: \"Search error issues\" },\n },\n },\n compare: { description: \"Compare metric trend between periods\" },\n },\n },\n subscriptions: {\n description: \"Manage subscriptions and base plans\",\n subcommands: {\n list: { description: \"List subscriptions\" },\n get: { description: \"Get a subscription\" },\n create: { description: \"Create a subscription from JSON file\" },\n update: { description: \"Update a subscription from JSON file\" },\n delete: { description: \"Delete a subscription\" },\n \"base-plans\": {\n description: \"Manage base plans\",\n subcommands: {\n activate: { description: \"Activate a base plan\" },\n deactivate: { description: \"Deactivate a base plan\" },\n delete: { description: \"Delete a base plan\" },\n \"migrate-prices\": { description: \"Migrate base plan prices\" },\n },\n },\n offers: {\n description: \"Manage subscription offers\",\n subcommands: {\n list: { description: \"List offers for a base plan\" },\n get: { description: \"Get an offer\" },\n create: { description: \"Create an offer from JSON file\" },\n update: { description: \"Update an offer from JSON file\" },\n delete: { description: \"Delete an offer\" },\n activate: { description: \"Activate an offer\" },\n deactivate: { description: \"Deactivate an offer\" },\n },\n },\n },\n },\n iap: {\n description: \"Manage in-app products\",\n subcommands: {\n list: { description: \"List in-app products\" },\n get: { description: \"Get an in-app product\" },\n create: { description: \"Create an in-app product from JSON file\" },\n update: { description: \"Update an in-app product from JSON file\" },\n delete: { description: \"Delete an in-app product\" },\n sync: { description: \"Sync in-app products from a directory\" },\n },\n },\n purchases: {\n description: \"Manage purchases and orders\",\n subcommands: {\n get: { description: \"Get a product purchase\" },\n acknowledge: { description: \"Acknowledge a product purchase\" },\n consume: { description: \"Consume a product purchase\" },\n subscription: {\n description: \"Manage subscription purchases\",\n subcommands: {\n get: { description: \"Get a subscription purchase\" },\n cancel: { description: \"Cancel a subscription\" },\n defer: { description: \"Defer a subscription expiry\" },\n revoke: { description: \"Revoke a subscription\" },\n },\n },\n voided: { description: \"List voided purchases\" },\n orders: {\n description: \"Manage orders\",\n subcommands: {\n refund: { description: \"Refund an order\" },\n },\n },\n },\n },\n pricing: {\n description: \"Pricing and regional price conversion\",\n subcommands: {\n convert: { description: \"Convert a price to all regional prices\" },\n },\n },\n reports: {\n description: \"Download financial and stats reports\",\n subcommands: {\n list: { description: \"List available report buckets\" },\n download: {\n description: \"Download a report\",\n subcommands: {\n financial: { description: \"Download a financial report\" },\n stats: { description: \"Download a stats report\" },\n },\n },\n },\n },\n users: {\n description: \"Manage developer account users and permissions\",\n subcommands: {\n list: { description: \"List all users in the developer account\" },\n get: { description: \"Get user details\" },\n invite: { description: \"Invite a user to the developer account\" },\n update: { description: \"Update user permissions\" },\n remove: { description: \"Remove a user from the developer account\" },\n },\n },\n testers: {\n description: \"Manage testers and tester groups\",\n subcommands: {\n list: { description: \"List testers for a track\" },\n add: { description: \"Add testers to a track\" },\n remove: { description: \"Remove testers from a track\" },\n import: { description: \"Import testers from a CSV file\" },\n },\n },\n recovery: {\n description: \"Manage app recovery actions\",\n subcommands: {\n list: { description: \"List app recovery actions\" },\n cancel: { description: \"Cancel a recovery action\" },\n deploy: { description: \"Deploy a recovery action\" },\n create: { description: \"Create a recovery action\" },\n \"add-targeting\": { description: \"Add targeting to a recovery action\" },\n },\n },\n \"data-safety\": {\n description: \"Manage data safety declarations\",\n subcommands: {\n get: { description: \"Get data safety declaration\" },\n update: { description: \"Update data safety declaration\" },\n export: { description: \"Export data safety declaration\" },\n },\n },\n \"external-transactions\": {\n description: \"Manage external transactions\",\n subcommands: {\n create: { description: \"Create an external transaction\" },\n get: { description: \"Get an external transaction\" },\n refund: { description: \"Refund an external transaction\" },\n },\n },\n \"device-tiers\": {\n description: \"Manage device tier configurations\",\n subcommands: {\n list: { description: \"List device tier configurations\" },\n get: { description: \"Get a device tier configuration\" },\n create: { description: \"Create a device tier configuration\" },\n },\n },\n \"one-time-products\": {\n description: \"Manage one-time products\",\n subcommands: {\n list: { description: \"List one-time products\" },\n get: { description: \"Get a one-time product\" },\n create: { description: \"Create a one-time product\" },\n update: { description: \"Update a one-time product\" },\n delete: { description: \"Delete a one-time product\" },\n offers: {\n description: \"Manage one-time product offers\",\n subcommands: {\n list: { description: \"List offers for a one-time product\" },\n get: { description: \"Get a one-time product offer\" },\n create: { description: \"Create a one-time product offer\" },\n update: { description: \"Update a one-time product offer\" },\n delete: { description: \"Delete a one-time product offer\" },\n },\n },\n },\n },\n \"internal-sharing\": {\n description: \"Manage internal app sharing\",\n subcommands: {\n upload: { description: \"Upload an artifact for internal sharing\" },\n },\n },\n \"generated-apks\": {\n description: \"Manage generated APKs from app bundles\",\n subcommands: {\n list: { description: \"List generated APKs for a version\" },\n download: { description: \"Download a generated APK\" },\n },\n },\n doctor: { description: \"Verify setup and connectivity\" },\n docs: { description: \"Open documentation in browser\" },\n validate: { description: \"Pre-submission validation checks\" },\n publish: { description: \"Validate, upload, and release in one step\" },\n completion: {\n description: \"Generate shell completions\",\n subcommands: {\n bash: { description: \"Generate bash completions\" },\n zsh: { description: \"Generate zsh completions\" },\n fish: { description: \"Generate fish completions\" },\n powershell: { description: \"Generate PowerShell completions\" },\n },\n },\n plugins: {\n description: \"Manage plugins\",\n subcommands: {\n list: { description: \"List loaded plugins\" },\n init: { description: \"Scaffold a new plugin project\" },\n approve: { description: \"Approve a third-party plugin for loading\" },\n revoke: { description: \"Revoke approval for a third-party plugin\" },\n },\n },\n };\n}\n\n/** Map a Commander Option to an OptionDef used by the shell generators. */\nfunction optionToDef(opt: Option): OptionDef {\n const flags = opt.flags;\n // Commander exposes parsed long/short on the Option; fall back to parsing `.flags` if missing.\n const long = opt.long ?? undefined;\n const short = opt.short ?? undefined;\n // `takesValue` is true when the raw flags contain <placeholder> or [placeholder].\n const takesValue = /[<[][^>\\]]+[>\\]]/.test(flags);\n // Commander 14 exposes `.argChoices`; fall back gracefully if absent.\n const rawChoices = (opt as unknown as { argChoices?: readonly string[] }).argChoices;\n const choices = rawChoices && rawChoices.length > 0 ? Array.from(rawChoices) : undefined;\n return {\n flags,\n long: long ?? undefined,\n short: short ?? undefined,\n description: opt.description ?? \"\",\n choices,\n takesValue,\n };\n}\n\n/** Whether a Commander command was registered with `{ hidden: true }`. */\nfunction isHidden(cmd: Command): boolean {\n return (cmd as unknown as { _hidden?: boolean })._hidden === true;\n}\n\n/** Recursively walk a Commander Command into the completion tree shape. */\nfunction commandToDef(cmd: Command): CommandDef {\n const def: CommandDef = {\n description: cmd.description() ?? \"\",\n };\n const options = cmd.options\n .filter((o) => !o.hidden)\n .map(optionToDef)\n .filter((o) => o.long || o.short);\n if (options.length > 0) {\n def.options = options;\n }\n const subs = cmd.commands.filter((c) => c.name() !== \"help\" && !isHidden(c));\n if (subs.length > 0) {\n def.subcommands = {};\n for (const sub of subs) {\n def.subcommands[sub.name()] = commandToDef(sub);\n }\n }\n return def;\n}\n\n/** Build a completion tree by introspecting a fully-loaded Commander program. */\nexport function buildCommandTreeFromProgram(program: Command): Record<string, CommandDef> {\n const tree: Record<string, CommandDef> = {};\n for (const cmd of program.commands) {\n if (cmd.name() === \"help\" || isHidden(cmd)) continue;\n tree[cmd.name()] = commandToDef(cmd);\n }\n return tree;\n}\n\n/** Collect global options declared on the root program. */\nexport function collectGlobalOptions(program: Command): OptionDef[] {\n return program.options\n .filter((o) => !o.hidden)\n .map(optionToDef)\n .filter((o) => o.long || o.short);\n}\n\nexport function registerCompletionCommand(\n program: Command,\n ensureAllCommandsLoaded?: () => Promise<void>,\n): void {\n const completion = program.command(\"completion\").description(\"Generate shell completions\");\n\n const generate = async (\n shell: ShellType,\n gen: (tree: Record<string, CommandDef>, globals: OptionDef[]) => string,\n ): Promise<void> => {\n if (ensureAllCommandsLoaded) {\n await ensureAllCommandsLoaded();\n }\n const tree = ensureAllCommandsLoaded ? buildCommandTreeFromProgram(program) : getCommandTree();\n const globals = collectGlobalOptions(program);\n // Suppress unused-shell warning; shell type reserved for future per-shell tuning.\n void shell;\n console.log(gen(tree, globals));\n };\n\n completion\n .command(\"bash\")\n .description(\"Generate bash completions\")\n .action(async () => {\n await generate(\"bash\", generateBashCompletions);\n });\n\n completion\n .command(\"zsh\")\n .description(\"Generate zsh completions\")\n .action(async () => {\n await generate(\"zsh\", generateZshCompletions);\n });\n\n completion\n .command(\"fish\")\n .description(\"Generate fish completions\")\n .action(async () => {\n await generate(\"fish\", generateFishCompletions);\n });\n\n completion\n .command(\"powershell\")\n .description(\"Generate PowerShell completions\")\n .action(async () => {\n await generate(\"powershell\", generatePowerShellCompletions);\n });\n}\n\n/**\n * Return only options that have choices or long flags useful for completion\n * suggestion. `-V/--version` and `-h/--help` are filtered out to avoid noise.\n */\nfunction completableOptions(options: OptionDef[] | undefined): OptionDef[] {\n if (!options) return [];\n return options.filter((o) => {\n if (!o.long) return false;\n if (o.long === \"--help\" || o.long === \"--version\") return false;\n return true;\n });\n}\n\n/**\n * Shell-completion flag slots that carry dynamic values (profiles, package\n * names, track names). Generated scripts shell out to `gpc __complete <ctx>`\n * to resolve these at TAB time. Shared across bash / zsh / fish generators.\n */\nconst DYNAMIC_FLAG_CONTEXTS: Array<{ flags: string[]; context: string }> = [\n { flags: [\"--profile\", \"-p\"], context: \"profiles\" },\n { flags: [\"--app\", \"-a\"], context: \"packages\" },\n { flags: [\"--apps\"], context: \"packages\" },\n { flags: [\"--track\"], context: \"tracks-for-app\" },\n];\n\nexport function generateBashCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const topLevelNames = Object.keys(tree).join(\" \");\n\n const globalFlags = completableOptions(globals)\n .map((o) => o.long ?? \"\")\n .filter(Boolean)\n .join(\" \");\n\n // Build case entries for each command that has subcommands (up to 3 levels)\n // and emit flag completion branches for commands with options.\n const caseEntries: string[] = [];\n const flagCases: string[] = [];\n\n // Dynamic flag-value completion: shell out to `gpc __complete <ctx>`.\n for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {\n for (const flag of flags) {\n flagCases.push(\n ` ${flag})\\n COMPREPLY=( $(compgen -W \"$(gpc __complete ${context} 2>/dev/null)\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n\n const allCommandNames = new Set<string>();\n const collectNames = (defs: Record<string, CommandDef>) => {\n for (const [name, def] of Object.entries(defs)) {\n allCommandNames.add(name);\n if (def.subcommands) collectNames(def.subcommands);\n }\n };\n collectNames(tree);\n\n for (const [cmd, def] of Object.entries(tree)) {\n if (def.subcommands) {\n const subNames = Object.keys(def.subcommands).join(\" \");\n caseEntries.push(\n ` ${cmd})\\n COMPREPLY=( $(compgen -W \"${subNames}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n const subSubNames = Object.keys(subDef.subcommands).join(\" \");\n caseEntries.push(\n ` ${sub})\\n COMPREPLY=( $(compgen -W \"${subSubNames}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n }\n\n // Collect flags that carry choices from this command + its subtree.\n const walk = (d: CommandDef) => {\n for (const opt of completableOptions(d.options)) {\n if (opt.choices && opt.long) {\n flagCases.push(\n ` ${opt.long})\\n COMPREPLY=( $(compgen -W \"${joinBashChoices(opt.choices)}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n if (d.subcommands) for (const s of Object.values(d.subcommands)) walk(s);\n };\n walk(def);\n }\n\n // Global-option choices (e.g. --output table|json|yaml|markdown|junit).\n for (const opt of completableOptions(globals)) {\n if (opt.choices && opt.long) {\n flagCases.push(\n ` ${opt.long})\\n COMPREPLY=( $(compgen -W \"${joinBashChoices(opt.choices)}\" -- \"\\${cur}\") )\\n return 0\\n ;;`,\n );\n }\n }\n\n return `# bash completion for gpc\n# Install: gpc completion bash >> ~/.bashrc\n_gpc() {\n local cur prev commands globals\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n\n commands=\"${topLevelNames}\"\n globals=\"${globalFlags}\"\n\n # Flag-value completion (choices)\n case \"\\${prev}\" in\n${flagCases.join(\"\\n\")}\n esac\n\n # When the current word starts with '-', complete known flags\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=( $(compgen -W \"\\${globals}\" -- \"\\${cur}\") )\n return 0\n fi\n\n case \"\\${prev}\" in\n gpc)\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n ;;\n${caseEntries.join(\"\\n\")}\n esac\n\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n return 0\n}\n\ncomplete -F _gpc gpc`;\n}\n\nexport function generateZshCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const arrayDefs: string[] = [];\n const caseBranches: string[] = [];\n\n const topEntries = Object.entries(tree)\n .map(([name, def]) => ` '${name}:${escapeZsh(def.description)}'`)\n .join(\"\\n\");\n arrayDefs.push(` commands=(\\n${topEntries}\\n )`);\n\n for (const [cmd, def] of Object.entries(tree)) {\n if (def.subcommands) {\n const varName = `${cmd.replace(/-/g, \"_\")}_commands`;\n const entries = Object.entries(def.subcommands)\n .map(([name, sub]) => ` '${name}:${escapeZsh(sub.description)}'`)\n .join(\"\\n\");\n arrayDefs.push(` ${varName}=(\\n${entries}\\n )`);\n caseBranches.push(\n ` ${cmd})\\n _describe -t ${varName} '${cmd} commands' ${varName}\\n ;;`,\n );\n\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n const subVarName = `${cmd.replace(/-/g, \"_\")}_${sub.replace(/-/g, \"_\")}_commands`;\n const subEntries = Object.entries(subDef.subcommands)\n .map(([name, s]) => ` '${name}:${escapeZsh(s.description)}'`)\n .join(\"\\n\");\n arrayDefs.push(` ${subVarName}=(\\n${subEntries}\\n )`);\n }\n }\n }\n }\n\n const level3Cases: string[] = [];\n for (const [cmd, def] of Object.entries(tree)) {\n if (!def.subcommands) continue;\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n const subVarName = `${cmd.replace(/-/g, \"_\")}_${sub.replace(/-/g, \"_\")}_commands`;\n level3Cases.push(\n ` ${sub})\\n _describe -t ${subVarName} '${sub} commands' ${subVarName}\\n ;;`,\n );\n }\n }\n }\n\n const varNames: string[] = [\"commands\"];\n for (const [cmd, def] of Object.entries(tree)) {\n if (def.subcommands) {\n varNames.push(`${cmd.replace(/-/g, \"_\")}_commands`);\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (subDef.subcommands) {\n varNames.push(`${cmd.replace(/-/g, \"_\")}_${sub.replace(/-/g, \"_\")}_commands`);\n }\n }\n }\n }\n\n const localDecls = varNames.map((v) => ` local -a ${v}`).join(\"\\n\");\n\n // Static flag-choice option specs (e.g. --output table|json|yaml) harvested\n // from Commander's `.choices()` across the entire tree. Emitted into the\n // main _arguments call so zsh menu-completes them.\n const choiceSpecs = new Set<string>();\n const walkChoices = (defs: Record<string, CommandDef>) => {\n for (const def of Object.values(defs)) {\n for (const opt of completableOptions(def.options)) {\n if (opt.choices && opt.long) {\n choiceSpecs.add(\n `'${opt.long}[${escapeZsh(opt.description)}]:value:(${opt.choices.join(\" \")})'`,\n );\n }\n }\n if (def.subcommands) walkChoices(def.subcommands);\n }\n };\n walkChoices(tree);\n for (const opt of completableOptions(globals)) {\n if (opt.choices && opt.long) {\n choiceSpecs.add(\n `'${opt.long}[${escapeZsh(opt.description)}]:value:(${opt.choices.join(\" \")})'`,\n );\n }\n }\n\n // Dynamic-value option specs: each dynamic flag gets wired to a helper\n // function that shells out to `gpc __complete <ctx>`.\n const dynamicSpecs: string[] = [];\n for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {\n for (const flag of flags) {\n const fn = `_gpc_${context.replace(/-/g, \"_\")}`;\n dynamicSpecs.push(`'${flag}[]:value:${fn}'`);\n }\n }\n\n const helperFns = `\n_gpc_profiles() {\n local -a items\n items=(\\${(f)\"$(gpc __complete profiles 2>/dev/null)\"})\n compadd -a items\n}\n_gpc_packages() {\n local -a items\n items=(\\${(f)\"$(gpc __complete packages 2>/dev/null)\"})\n compadd -a items\n}\n_gpc_tracks_for_app() {\n local -a items\n items=(\\${(f)\"$(gpc __complete tracks-for-app 2>/dev/null)\"})\n compadd -a items\n}`;\n\n const allSpecs = [...choiceSpecs, ...dynamicSpecs];\n const extraArgs = allSpecs.length > 0 ? ` \\\\\\n ${allSpecs.join(\" \\\\\\n \")}` : \"\";\n\n return `#compdef gpc\n# Install: gpc completion zsh > ~/.zsh/completions/_gpc\n${helperFns}\n\n_gpc() {\n${localDecls}\n\n${arrayDefs.join(\"\\n\\n\")}\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '2: :->subcommand' \\\\\n '3: :->subsubcommand' \\\\\n '*::arg:->args'${extraArgs}\n\n case \"$state\" in\n command)\n _describe -t commands 'gpc commands' commands\n ;;\n subcommand)\n case \"$words[2]\" in\n${caseBranches.join(\"\\n\")}\n esac\n ;;\n subsubcommand)\n case \"$words[3]\" in\n${level3Cases.join(\"\\n\")}\n esac\n ;;\n esac\n}\n\n_gpc \"$@\"`;\n}\n\nexport function generateFishCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const lines: string[] = [\n \"# fish completions for gpc\",\n \"# Install: gpc completion fish > ~/.config/fish/completions/gpc.fish\",\n \"\",\n \"# Disable file completions by default\",\n \"complete -c gpc -f\",\n \"\",\n \"# Top-level commands\",\n ];\n\n for (const [cmd, def] of Object.entries(tree)) {\n lines.push(\n `complete -c gpc -n '__fish_use_subcommand' -a ${cmd} -d '${escapeFish(def.description)}'`,\n );\n }\n\n // Level 2 subcommands\n for (const [cmd, def] of Object.entries(tree)) {\n if (!def.subcommands) continue;\n lines.push(\"\");\n lines.push(`# ${cmd} subcommands`);\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n lines.push(\n `complete -c gpc -n '__fish_seen_subcommand_from ${cmd}; and not __fish_seen_subcommand_from ${Object.keys(def.subcommands).join(\" \")}' -a ${sub} -d '${escapeFish(subDef.description)}'`,\n );\n }\n\n // Level 3 subcommands\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (!subDef.subcommands) continue;\n lines.push(\"\");\n lines.push(`# ${cmd} ${sub} subcommands`);\n for (const [subsub, subsubDef] of Object.entries(subDef.subcommands)) {\n lines.push(\n `complete -c gpc -n '__fish_seen_subcommand_from ${sub}; and not __fish_seen_subcommand_from ${Object.keys(subDef.subcommands).join(\" \")}' -a ${subsub} -d '${escapeFish(subsubDef.description)}'`,\n );\n }\n }\n }\n\n // Global + per-command flag completions with choice lists.\n lines.push(\"\");\n lines.push(\"# Global flags\");\n for (const opt of completableOptions(globals)) {\n if (!opt.long) continue;\n const longName = opt.long.replace(/^--/, \"\");\n const shortName = opt.short ? opt.short.replace(/^-/, \"\") : undefined;\n const choiceArg = opt.choices ? ` -a '${opt.choices.join(\" \")}'` : \"\";\n const shortArg = shortName ? ` -s ${shortName}` : \"\";\n lines.push(\n `complete -c gpc -l ${longName}${shortArg} -d '${escapeFish(opt.description)}'${choiceArg}`,\n );\n }\n\n const walkFlags = (defs: Record<string, CommandDef>) => {\n for (const [name, def] of Object.entries(defs)) {\n const flags = completableOptions(def.options);\n if (flags.length > 0) {\n lines.push(\"\");\n lines.push(`# ${name} flags`);\n for (const opt of flags) {\n if (!opt.long) continue;\n const longName = opt.long.replace(/^--/, \"\");\n const shortName = opt.short ? opt.short.replace(/^-/, \"\") : undefined;\n const choiceArg = opt.choices ? ` -a '${opt.choices.join(\" \")}'` : \"\";\n const shortArg = shortName ? ` -s ${shortName}` : \"\";\n lines.push(\n `complete -c gpc -n '__fish_seen_subcommand_from ${name}' -l ${longName}${shortArg} -d '${escapeFish(opt.description)}'${choiceArg}`,\n );\n }\n }\n if (def.subcommands) walkFlags(def.subcommands);\n }\n };\n walkFlags(tree);\n\n // Dynamic flag-value completion: shell out to `gpc __complete <ctx>`.\n // Fish merges multiple `complete` directives for the same flag, so these\n // layer on top of the description-only lines emitted above.\n lines.push(\"\");\n lines.push(\"# Dynamic values (shell out to __complete)\");\n for (const { flags, context } of DYNAMIC_FLAG_CONTEXTS) {\n for (const flag of flags) {\n if (flag.startsWith(\"--\")) {\n const longName = flag.slice(2);\n lines.push(`complete -c gpc -l ${longName} -x -a '(gpc __complete ${context} 2>/dev/null)'`);\n } else if (flag.startsWith(\"-\")) {\n const shortName = flag.slice(1);\n lines.push(`complete -c gpc -s ${shortName} -x -a '(gpc __complete ${context} 2>/dev/null)'`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function generatePowerShellCompletions(\n tree: Record<string, CommandDef> = getCommandTree(),\n globals: OptionDef[] = [],\n): string {\n const completionEntries: string[] = [];\n\n // Top-level completions\n for (const [cmd, def] of Object.entries(tree)) {\n completionEntries.push(\n ` [CompletionResult]::new('${cmd}', '${cmd}', [CompletionResultType]::ParameterValue, '${escapePowerShell(def.description)}')`,\n );\n }\n\n // Global flag completions (as parameters available from any state)\n for (const opt of completableOptions(globals)) {\n if (!opt.long) continue;\n completionEntries.push(\n ` [CompletionResult]::new('${opt.long}', '${opt.long}', [CompletionResultType]::ParameterName, '${escapePowerShell(opt.description)}')`,\n );\n }\n\n const subcommandCases: string[] = [];\n const level3Cases: string[] = [];\n\n for (const [cmd, def] of Object.entries(tree)) {\n if (!def.subcommands) continue;\n const subEntries = Object.entries(def.subcommands)\n .map(\n ([sub, subDef]) =>\n ` [CompletionResult]::new('${sub}', '${sub}', [CompletionResultType]::ParameterValue, '${escapePowerShell(subDef.description)}')`,\n )\n .join(\"\\n\");\n subcommandCases.push(` '${cmd}' {\\n${subEntries}\\n }`);\n\n for (const [sub, subDef] of Object.entries(def.subcommands)) {\n if (!subDef.subcommands) continue;\n const subSubEntries = Object.entries(subDef.subcommands)\n .map(\n ([subsub, subsubDef]) =>\n ` [CompletionResult]::new('${subsub}', '${subsub}', [CompletionResultType]::ParameterValue, '${escapePowerShell(subsubDef.description)}')`,\n )\n .join(\"\\n\");\n level3Cases.push(` '${sub}' {\\n${subSubEntries}\\n }`);\n }\n }\n\n return `# PowerShell completions for gpc\n# Install: gpc completion powershell >> $PROFILE\n\nusing namespace System.Management.Automation\n\nRegister-ArgumentCompleter -CommandName gpc -Native -ScriptBlock {\n param($wordToComplete, $commandAst, $cursorPosition)\n\n $tokens = $commandAst.ToString().Substring(0, $cursorPosition).Trim() -split '\\\\s+'\n $tokenCount = $tokens.Count\n\n # Determine context\n if ($tokenCount -le 1 -or ($tokenCount -eq 2 -and $wordToComplete)) {\n # Top-level commands\n${completionEntries.join(\"\\n\")}\n } elseif ($tokenCount -eq 2 -or ($tokenCount -eq 3 -and $wordToComplete)) {\n # Subcommands\n $command = $tokens[1]\n switch ($command) {\n${subcommandCases.join(\"\\n\")}\n }\n } elseif ($tokenCount -eq 3 -or ($tokenCount -eq 4 -and $wordToComplete)) {\n # Sub-subcommands\n $subcommand = $tokens[2]\n switch ($subcommand) {\n${level3Cases.join(\"\\n\")}\n }\n }\n}`;\n}\n\n/**\n * Escape a `.choices()` value for safe inclusion in a bash `compgen -W \"...\"`\n * list. Choices in practice come from CLI source (not user input), but we\n * defend anyway so a future `.choices([\"yes\", \"no thanks\"])` doesn't split on\n * whitespace or interpolate a stray `$var`.\n */\nfunction joinBashChoices(choices: readonly string[]): string {\n return choices\n .map((c) => c.replace(/([\\\\\"$`])/g, \"\\\\$1\").replace(/ /g, \"\\\\ \"))\n .join(\" \");\n}\n\nfunction escapeZsh(str: string): string {\n return str.replace(/'/g, \"'\\\\''\");\n}\n\nfunction escapeFish(str: string): string {\n return str.replace(/'/g, \"\\\\'\");\n}\n\nfunction escapePowerShell(str: string): string {\n return str.replace(/'/g, \"''\");\n}\n"],"mappings":"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","names":[]}
@@ -78,7 +78,7 @@ Configuration file created: ${path}`);
78
78
  });
79
79
  console.log("\nVerifying setup...");
80
80
  try {
81
- const { registerDoctorCommand } = await import("./doctor-VET7CGBM.js");
81
+ const { registerDoctorCommand } = await import("./doctor-G2L2KVOO.js");
82
82
  const { Command } = await import("commander");
83
83
  const doctorProgram = new Command();
84
84
  doctorProgram.option("-o, --output <format>", "Output format").option("-j, --json", "JSON mode");
@@ -107,4 +107,4 @@ Configuration file created: ${path}`);
107
107
  export {
108
108
  registerConfigCommands
109
109
  };
110
- //# sourceMappingURL=config-WXGCYY3U.js.map
110
+ //# sourceMappingURL=config-ZNAM2IHA.js.map
@@ -141,7 +141,7 @@ function checkCiEnvironment() {
141
141
  };
142
142
  }
143
143
  async function checkGpcVersion() {
144
- const currentVersion = "0.9.58";
144
+ const currentVersion = "0.9.60";
145
145
  if (currentVersion === "0.0.0") {
146
146
  return { name: "version", status: "info", message: "GPC development build" };
147
147
  }
@@ -800,4 +800,4 @@ export {
800
800
  checkVerificationDeadline,
801
801
  registerDoctorCommand
802
802
  };
803
- //# sourceMappingURL=doctor-VET7CGBM.js.map
803
+ //# sourceMappingURL=doctor-G2L2KVOO.js.map
@@ -9,7 +9,7 @@ import { execFile } from "child_process";
9
9
  import { listAuditEvents } from "@gpc-cli/core";
10
10
  function registerFeedbackCommand(program) {
11
11
  program.command("feedback").description("Open a pre-filled GitHub issue with system diagnostics").option("--title <title>", "Issue title").option("--print", "Print the report to stdout instead of opening a browser").action(async (opts) => {
12
- const version = "0.9.58";
12
+ const version = "0.9.60";
13
13
  let lastCommand = "";
14
14
  try {
15
15
  const events = await listAuditEvents({ limit: 3 });
@@ -67,4 +67,4 @@ ${url}`);
67
67
  export {
68
68
  registerFeedbackCommand
69
69
  };
70
- //# sourceMappingURL=feedback-3TCRBPSI.js.map
70
+ //# sourceMappingURL=feedback-WXSCASJK.js.map
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  createProgram,
4
4
  handleCliError
5
- } from "./chunk-2SVDYAY4.js";
5
+ } from "./chunk-CSNCSWUV.js";
6
6
  export {
7
7
  createProgram,
8
8
  handleCliError
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- buildCommitOptions
4
- } from "./chunk-WSLFHX5X.js";
5
2
  import {
6
3
  getClient,
7
4
  resolvePackageName
8
5
  } from "./chunk-JDRY7HK5.js";
6
+ import {
7
+ buildCommitOptions
8
+ } from "./chunk-WSLFHX5X.js";
9
9
  import {
10
10
  isDryRun,
11
11
  printDryRun
@@ -448,4 +448,4 @@ Missing locales: ${missingLocales.join(", ")}`);
448
448
  export {
449
449
  registerListingsCommands
450
450
  };
451
- //# sourceMappingURL=listings-MOHHHNE6.js.map
451
+ //# sourceMappingURL=listings-2Z6DSO3D.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- buildCommitOptions
4
- } from "./chunk-WSLFHX5X.js";
5
2
  import {
6
3
  resolvePackageName
7
4
  } from "./chunk-JDRY7HK5.js";
5
+ import {
6
+ buildCommitOptions
7
+ } from "./chunk-WSLFHX5X.js";
8
8
  import {
9
9
  isDryRun
10
10
  } from "./chunk-Y3QZDAKS.js";
@@ -227,4 +227,4 @@ function registerPublishCommand(program) {
227
227
  export {
228
228
  registerPublishCommand
229
229
  };
230
- //# sourceMappingURL=publish-26SSZ2W3.js.map
230
+ //# sourceMappingURL=publish-5HZAJEDZ.js.map
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- buildCommitOptions
4
- } from "./chunk-WSLFHX5X.js";
5
2
  import {
6
3
  getClient,
7
4
  resolvePackageName
8
5
  } from "./chunk-JDRY7HK5.js";
6
+ import {
7
+ buildCommitOptions
8
+ } from "./chunk-WSLFHX5X.js";
9
9
  import {
10
10
  isDryRun,
11
11
  printDryRun
@@ -188,4 +188,4 @@ function registerTestersCommands(program) {
188
188
  export {
189
189
  registerTestersCommands
190
190
  };
191
- //# sourceMappingURL=testers-QUWZHO6M.js.map
191
+ //# sourceMappingURL=testers-FGLBJAXL.js.map
@@ -17,7 +17,7 @@ function registerUpdateCommand(program) {
17
17
  program.command("update").description("Update gpc to the latest version").option("--check", "Check for updates without installing (exits 0 always)").option("--force", "Update even if already on the latest version").action(async (opts, cmd) => {
18
18
  const parentOpts = cmd.parent?.opts() ?? {};
19
19
  const jsonMode = !!(parentOpts["json"] || parentOpts["output"] === "json");
20
- const currentVersion = "0.9.58";
20
+ const currentVersion = "0.9.60";
21
21
  if (currentVersion === "0.0.0") {
22
22
  if (jsonMode) {
23
23
  console.log(
@@ -172,4 +172,4 @@ Run: gpc update`);
172
172
  export {
173
173
  registerUpdateCommand
174
174
  };
175
- //# sourceMappingURL=update-ZYW63YX3.js.map
175
+ //# sourceMappingURL=update-WA6X6LNQ.js.map
@@ -7,7 +7,7 @@ import "./chunk-3SJ6OXCZ.js";
7
7
  // src/commands/version.ts
8
8
  function registerVersionCommand(program) {
9
9
  program.command("version").description("Show version information").action(() => {
10
- const version = "0.9.58";
10
+ const version = "0.9.60";
11
11
  if (program.opts()["output"] === "json") {
12
12
  console.log(
13
13
  JSON.stringify({
@@ -25,4 +25,4 @@ function registerVersionCommand(program) {
25
25
  export {
26
26
  registerVersionCommand
27
27
  };
28
- //# sourceMappingURL=version-G3WWEAHE.js.map
28
+ //# sourceMappingURL=version-DYTSDZH2.js.map
@@ -297,7 +297,7 @@ function registerVitalsCommands(program) {
297
297
  battery: "excessiveWakeupRateMetricSet",
298
298
  memory: "stuckBackgroundWakelockRateMetricSet",
299
299
  wakeup: "excessiveWakeupRateMetricSet",
300
- lmk: "lowMemoryKillerRateMetricSet",
300
+ lmk: "lmkRateMetricSet",
301
301
  "error-count": "errorCountMetricSet"
302
302
  };
303
303
  vitals.command("compare <metric>").description("Compare metric trend: this period vs previous period").option("--days <n>", "Period length in days", (v) => parseInt(v, 10), 7).action(async (metric, options) => {
@@ -434,4 +434,4 @@ ${red("\u2717")} Threshold breached (${(value * 100).toFixed(3)}% > ${options.th
434
434
  export {
435
435
  registerVitalsCommands
436
436
  };
437
- //# sourceMappingURL=vitals-RETD7K55.js.map
437
+ //# sourceMappingURL=vitals-QPHS6QFH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/vitals.ts"],"sourcesContent":["import { resolvePackageName } from \"../resolve.js\";\nimport type { Command } from \"commander\";\nimport type { GpcConfig } from \"@gpc-cli/config\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createReportingClient, PlayApiError } from \"@gpc-cli/api\";\nimport type { ReportingDimension } from \"@gpc-cli/api\";\nimport type { VitalsMetricSet } from \"@gpc-cli/api\";\nimport {\n getVitalsOverview,\n getVitalsCrashes,\n getVitalsAnr,\n getVitalsStartup,\n getVitalsRendering,\n getVitalsBattery,\n getVitalsMemory,\n getVitalsLmk,\n getVitalsErrorCount,\n getVitalsAnomalies,\n searchVitalsErrors,\n compareVitalsTrend,\n compareVersionVitals,\n watchVitalsWithAutoHalt,\n checkThreshold,\n formatOutput,\n GpcError,\n} from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { red, yellow, green } from \"../colors.js\";\n\nasync function getReportingClient(config: GpcConfig) {\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n return createReportingClient({ auth });\n}\n\nconst VALID_DIMENSIONS: ReportingDimension[] = [\n \"apiLevel\",\n \"versionCode\",\n \"deviceModel\",\n \"deviceType\",\n \"countryCode\",\n \"deviceRamBucket\",\n \"deviceSocName\",\n \"deviceCpuMakeModel\",\n \"deviceGlEsVersion\",\n \"deviceVulkanVersion\",\n \"deviceOpenGlVersion\",\n \"deviceBrand\",\n \"startType\", // Required dimension for slowStartRateMetricSet\n];\n\nconst THRESHOLD_CONFIG_KEYS: Record<string, string> = {\n crashes: \"crashRate\",\n anr: \"anrRate\",\n startup: \"slowStartRate\",\n rendering: \"slowRenderingRate\",\n battery: \"excessiveWakeupRate\",\n memory: \"stuckWakelockRate\",\n wakeup: \"excessiveWakeupRate\",\n lmk: \"lmkRate\",\n \"error-count\": \"errorReportCount\",\n};\n\nfunction validateDimension(dim: string): ReportingDimension {\n if (!(VALID_DIMENSIONS as readonly string[]).includes(dim)) {\n throw new GpcError(\n `Invalid dimension \"${dim}\". Valid dimensions: ${VALID_DIMENSIONS.join(\", \")}`,\n \"VITALS_USAGE_ERROR\",\n 2,\n `Use one of: ${VALID_DIMENSIONS.join(\", \")}`,\n );\n }\n return dim as ReportingDimension;\n}\n\ntype MetricFn = typeof getVitalsCrashes;\n\nfunction registerMetricCommand(\n parent: Command,\n name: string,\n description: string,\n fn: MetricFn,\n program: Command,\n): void {\n parent\n .command(name)\n .description(description)\n .option(\"--dim <dimension>\", \"Group by dimension\")\n .option(\"--days <n>\", \"Number of days to query\", parseInt)\n .option(\"--threshold <value>\", \"Threshold value for CI alerting\", parseFloat)\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const reporting = await getReportingClient(config);\n const format = getOutputFormat(program, config);\n\n let result;\n try {\n result = await fn(reporting, packageName, {\n dimension: options.dim ? validateDimension(options.dim) : undefined,\n days: options.days,\n });\n } catch (err) {\n if (err instanceof PlayApiError && err.statusCode === 403) {\n if (format === \"json\") {\n console.log(\n formatOutput(\n { rows: [], message: \"Reporting API not enabled or insufficient permissions\" },\n format,\n ),\n );\n } else {\n console.log(\n `${yellow(\"⚠\")} No vitals data available. The Reporting API may not be enabled for this project.`,\n );\n console.log(\n ` Enable it at: https://console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com`,\n );\n }\n return;\n }\n throw err;\n }\n if (format !== \"json\" && (!result.rows || result.rows.length === 0)) {\n console.log(`${yellow(\"⚠\")} No vitals data available.`);\n return;\n }\n if (format !== \"json\" && result.rows) {\n const rows = result.rows.map((row: unknown) => {\n const rowR = row as Record<string, unknown>;\n const startTime = rowR[\"startTime\"] as Record<string, unknown> | undefined;\n const metrics = rowR[\"metrics\"] as\n | Record<string, Record<string, unknown>>\n | unknown[]\n | undefined;\n const flat: Record<string, unknown> = {\n date: startTime\n ? `${startTime[\"year\"]}-${String(startTime[\"month\"]).padStart(2, \"0\")}-${String(startTime[\"day\"]).padStart(2, \"0\")}`\n : \"-\",\n };\n if (metrics && !Array.isArray(metrics)) {\n for (const [key, val] of Object.entries(metrics)) {\n flat[key] =\n (val as Record<string, unknown>)?.[\"decimalValue\"] !== undefined\n ? ((val as Record<string, Record<string, unknown>>)?.[\"decimalValue\"]?.[\n \"value\"\n ] ?? \"-\")\n : \"-\";\n }\n } else if (Array.isArray(metrics)) {\n // Fallback: if API returns metrics as array, use metric names from config\n for (let i = 0; i < metrics.length; i++) {\n const val = metrics[i] as Record<string, unknown> | undefined;\n const metricName = val?.[\"metric\"] as string | undefined;\n const key = metricName ?? `metric${i}`;\n flat[key] =\n (val as Record<string, unknown>)?.[\"decimalValue\"] !== undefined\n ? ((val as Record<string, Record<string, unknown>>)?.[\"decimalValue\"]?.[\n \"value\"\n ] ?? \"-\")\n : \"-\";\n }\n }\n const dims = rowR[\"dimensions\"] as Record<string, unknown> | unknown[] | undefined;\n if (dims && !Array.isArray(dims)) {\n for (const [key, val] of Object.entries(dims)) {\n flat[key] = (val as Record<string, unknown>)?.[\"stringValue\"] ?? \"-\";\n }\n } else if (Array.isArray(dims)) {\n // Fallback: if API returns dimensions as array\n for (let i = 0; i < dims.length; i++) {\n const val = dims[i] as Record<string, unknown> | undefined;\n const dimName = val?.[\"dimension\"] as string | undefined;\n flat[dimName ?? `dim${i}`] = val?.[\"stringValue\"] ?? val?.[\"int64Value\"] ?? \"-\";\n }\n }\n return flat;\n });\n console.log(formatOutput(rows, format));\n } else {\n console.log(formatOutput(result, format));\n }\n\n // Check threshold from flag or config\n const configKey = THRESHOLD_CONFIG_KEYS[name];\n const configThreshold = configKey\n ? (config as unknown as Record<string, unknown>)[\"vitals\"]\n ? ((config as unknown as Record<string, unknown>)[\"vitals\"] as Record<string, unknown>)[\n \"thresholds\"\n ]\n ? (\n (\n (config as unknown as Record<string, unknown>)[\"vitals\"] as Record<\n string,\n unknown\n >\n )[\"thresholds\"] as Record<string, unknown>\n )[configKey]\n : undefined\n : undefined\n : undefined;\n const threshold =\n options.threshold ?? (configThreshold !== undefined ? Number(configThreshold) : undefined);\n if (threshold !== undefined) {\n const latestRow = result.rows?.[result.rows.length - 1];\n const metricKeys = latestRow?.metrics ? Object.keys(latestRow.metrics) : [];\n const firstMetric = metricKeys[0];\n const value = firstMetric\n ? Number(latestRow?.metrics[firstMetric]?.decimalValue?.value)\n : undefined;\n const check = checkThreshold(value, threshold);\n if (check.breached) {\n console.error(`${red(\"✗\")} Threshold breached: ${check.value} > ${check.threshold}`);\n process.exitCode = 6;\n }\n }\n });\n}\n\nexport function registerVitalsCommands(program: Command): void {\n const vitals = program\n .command(\"vitals\")\n .description(\"Monitor app vitals, crash rates, and performance metrics\");\n\n vitals\n .command(\"overview\")\n .description(\"Dashboard summary of all vital metrics\")\n .action(async () => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const reporting = await getReportingClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await getVitalsOverview(reporting, packageName);\n if (Object.keys(result).length === 0) {\n if (format === \"json\") {\n console.log(formatOutput({ vitals: [], message: \"No vitals data available\" }, format));\n } else {\n console.log(\"No vitals data available.\");\n }\n return;\n }\n if (format !== \"json\") {\n const overview = result as Record<string, unknown>;\n const rows = Object.entries(overview).map(([metric, data]) => {\n const metricRows = data as Record<string, unknown>[] | undefined;\n const latest = metricRows?.[metricRows.length - 1];\n const metrics = latest?.[\"metrics\"] as\n | Record<string, Record<string, unknown>>\n | undefined;\n const firstKey = metrics ? Object.keys(metrics)[0] : undefined;\n const value = firstKey\n ? (metrics?.[firstKey]?.[\"decimalValue\"] as Record<string, unknown> | undefined)?.[\n \"value\"\n ]\n : undefined;\n return {\n metric,\n dataPoints: metricRows?.length || 0,\n latestValue: value ?? \"-\",\n };\n });\n console.log(formatOutput(rows, format));\n } else {\n console.log(formatOutput(result, format));\n }\n });\n\n registerMetricCommand(vitals, \"crashes\", \"Query crash rate metrics\", getVitalsCrashes, program);\n registerMetricCommand(vitals, \"anr\", \"Query ANR rate metrics\", getVitalsAnr, program);\n registerMetricCommand(vitals, \"startup\", \"Query slow startup metrics\", getVitalsStartup, program);\n registerMetricCommand(\n vitals,\n \"rendering\",\n \"Query slow rendering metrics\",\n getVitalsRendering,\n program,\n );\n registerMetricCommand(\n vitals,\n \"battery\",\n \"Query excessive wakeup metrics\",\n getVitalsBattery,\n program,\n );\n registerMetricCommand(vitals, \"memory\", \"Query stuck wakelock metrics\", getVitalsMemory, program);\n registerMetricCommand(\n vitals,\n \"wakeup\",\n \"Query excessive wakeup rate metrics\",\n getVitalsBattery,\n program,\n );\n registerMetricCommand(\n vitals,\n \"lmk\",\n \"Query low-memory kill (stuck wakelock) metrics\",\n getVitalsLmk,\n program,\n );\n registerMetricCommand(\n vitals,\n \"error-count\",\n \"Query error report count metrics\",\n getVitalsErrorCount,\n program,\n );\n\n vitals\n .command(\"anomalies\")\n .description(\"Detect anomalies in app vitals\")\n .action(async () => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const reporting = await getReportingClient(config);\n const format = getOutputFormat(program, config);\n\n let result;\n try {\n result = await getVitalsAnomalies(reporting, packageName);\n } catch (err) {\n if (err instanceof PlayApiError && err.statusCode === 403) {\n if (format === \"json\") {\n console.log(\n formatOutput(\n { anomalies: [], message: \"Reporting API not enabled or insufficient permissions\" },\n format,\n ),\n );\n } else {\n console.log(\n `${yellow(\"⚠\")} No anomaly data available. The Reporting API may not be enabled for this project.`,\n );\n console.log(\n ` Enable it at: https://console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com`,\n );\n }\n return;\n }\n throw err;\n }\n console.log(formatOutput(result, format));\n });\n\n const errors = vitals.command(\"errors\").description(\"Search and view error issues\");\n\n errors\n .command(\"search\")\n .description(\"Search error issues\")\n .option(\"--filter <text>\", \"Filter expression\")\n .option(\"--max <n>\", \"Maximum results\", parseInt)\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const reporting = await getReportingClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await searchVitalsErrors(reporting, packageName, {\n filter: options.filter,\n maxResults: options.max,\n });\n const issues = (result as unknown as Record<string, unknown>)[\"errorIssues\"] as\n | unknown[]\n | undefined;\n if (format !== \"json\" && (!issues || issues.length === 0)) {\n console.log(\"No error issues found.\");\n return;\n }\n console.log(formatOutput(result, format));\n });\n\n const METRIC_MAP: Record<string, VitalsMetricSet> = {\n crashes: \"crashRateMetricSet\",\n anr: \"anrRateMetricSet\",\n startup: \"slowStartRateMetricSet\",\n rendering: \"slowRenderingRateMetricSet\",\n battery: \"excessiveWakeupRateMetricSet\",\n memory: \"stuckBackgroundWakelockRateMetricSet\",\n wakeup: \"excessiveWakeupRateMetricSet\",\n lmk: \"lmkRateMetricSet\",\n \"error-count\": \"errorCountMetricSet\",\n };\n\n vitals\n .command(\"compare <metric>\")\n .description(\"Compare metric trend: this period vs previous period\")\n .option(\"--days <n>\", \"Period length in days\", (v) => parseInt(v, 10), 7)\n .action(async (metric: string, options) => {\n const metricSet = METRIC_MAP[metric];\n if (!metricSet) {\n throw new GpcError(\n `Unknown metric \"${metric}\". Use: ${Object.keys(METRIC_MAP).join(\", \")}`,\n \"VITALS_USAGE_ERROR\",\n 2,\n `Valid metrics: ${Object.keys(METRIC_MAP).join(\", \")}`,\n );\n }\n\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const reporting = await getReportingClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await compareVitalsTrend(reporting, packageName, metricSet, options.days);\n console.log(formatOutput(result, format));\n });\n\n vitals\n .command(\"compare-versions <v1> <v2>\")\n .description(\"Compare vitals side-by-side for two version codes\")\n .option(\"--days <n>\", \"Number of days to query\", (v) => parseInt(v, 10), 30)\n .action(async (v1: string, v2: string, options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const reporting = await getReportingClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await compareVersionVitals(reporting, packageName, v1, v2, {\n days: options.days,\n });\n\n if (format === \"json\") {\n console.log(formatOutput(result, format));\n return;\n }\n\n const metrics: [keyof typeof result.v1, string][] = [\n [\"crashRate\", \"Crash Rate\"],\n [\"anrRate\", \"ANR Rate\"],\n [\"slowStartRate\", \"Slow Start Rate\"],\n [\"slowRenderingRate\", \"Slow Rendering Rate\"],\n ];\n\n console.log(`\\nVersion Comparison — ${packageName}`);\n console.log(`${\"─\".repeat(60)}`);\n console.log(`${\"Metric\".padEnd(22)} ${\"v\" + v1.padEnd(14)} ${\"v\" + v2.padEnd(14)} Change`);\n console.log(`${\"─\".repeat(60)}`);\n\n for (const [key, label] of metrics) {\n const val1 = result.v1[key] as number | undefined;\n const val2 = result.v2[key] as number | undefined;\n const s1 = val1 !== undefined ? (val1 * 100).toFixed(3) + \"%\" : \"N/A\";\n const s2 = val2 !== undefined ? (val2 * 100).toFixed(3) + \"%\" : \"N/A\";\n const isRegression = result.regressions.includes(key as string);\n const change =\n val1 !== undefined && val2 !== undefined ? ((val2 - val1) / val1) * 100 : undefined;\n const changeStr =\n change !== undefined ? (change > 0 ? \"+\" : \"\") + change.toFixed(1) + \"%\" : \"N/A\";\n const colorFn = isRegression\n ? red\n : change !== undefined && change < -1\n ? green\n : (s: string) => s;\n console.log(\n `${label.padEnd(22)} ${s1.padEnd(15)} ${colorFn(s2.padEnd(15))} ${colorFn(changeStr)}`,\n );\n }\n\n if (result.regressions.length > 0) {\n console.log(`\\n${red(\"✗\")} Regressions detected: ${result.regressions.join(\", \")}`);\n } else {\n console.log(`\\n${green(\"✓\")} No regressions detected.`);\n }\n });\n\n vitals\n .command(\"watch\")\n .description(\"Monitor vitals continuously and optionally auto-halt rollout on breach\")\n .requiredOption(\"--threshold <value>\", \"Breach threshold value\", parseFloat)\n .option(\n \"--metric <name>\",\n \"Metric to monitor (crashes, anr, startup, rendering, battery, memory, wakeup, lmk, error-count)\",\n \"crashes\",\n )\n .option(\"--interval <seconds>\", \"Polling interval in seconds\", (v) => parseInt(v, 10), 300)\n .option(\"--auto-halt-rollout\", \"Automatically halt rollout if threshold is breached\")\n .option(\"--track <name>\", \"Track to halt rollout on (required with --auto-halt-rollout)\")\n .action(async (options) => {\n const metricSet = METRIC_MAP[options.metric as string];\n if (!metricSet) {\n throw new GpcError(\n `Unknown metric \"${options.metric}\". Use: ${Object.keys(METRIC_MAP).join(\", \")}`,\n \"VITALS_USAGE_ERROR\",\n 2,\n `Valid metrics: ${Object.keys(METRIC_MAP).join(\", \")}`,\n );\n }\n\n if (options.autoHaltRollout && !options.track) {\n throw new GpcError(\n \"--track <name> is required when using --auto-halt-rollout\",\n \"VITALS_USAGE_ERROR\",\n 2,\n \"Add --track <name> to specify which track to halt on breach.\",\n );\n }\n\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const reporting = await getReportingClient(config);\n const intervalMs = (options.interval as number) * 1000;\n\n console.log(`Watching ${options.metric} for ${packageName}`);\n console.log(`Threshold: ${options.threshold} Interval: ${options.interval}s`);\n if (options.autoHaltRollout) {\n console.log(`Auto-halt enabled on track: ${options.track}`);\n }\n console.log(\"Press Ctrl+C to stop.\\n\");\n\n const stop = watchVitalsWithAutoHalt(reporting, packageName, {\n intervalMs,\n threshold: options.threshold as number,\n metricSet,\n onPoll: (value, breached) => {\n const ts = new Date().toISOString();\n const valStr = value !== undefined ? (value * 100).toFixed(3) + \"%\" : \"N/A\";\n const indicator = breached ? red(\"✗ BREACH\") : green(\"✓ OK\");\n console.log(`[${ts}] ${options.metric}: ${valStr} — ${indicator}`);\n },\n onHalt: options.autoHaltRollout\n ? async (value: number) => {\n console.error(\n `\\n${red(\"✗\")} Threshold breached (${(value * 100).toFixed(3)}% > ${options.threshold}%). Halting rollout on track \"${options.track}\"...`,\n );\n try {\n const { resolveAuth } = await import(\"@gpc-cli/auth\");\n const { createApiClient } = await import(\"@gpc-cli/api\");\n const { updateRollout } = await import(\"@gpc-cli/core\");\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n const apiClient = createApiClient({ auth });\n await updateRollout(apiClient, packageName, options.track as string, \"halt\");\n console.error(`${red(\"⚠\")} Rollout halted on track \"${options.track}\".`);\n } catch (err) {\n console.error(\n `Failed to halt rollout: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n stop();\n process.exitCode = 6;\n }\n : undefined,\n });\n\n process.on(\"SIGINT\", () => {\n stop();\n console.log(\"\\nWatch stopped.\");\n });\n });\n}\n"],"mappings":"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","names":["resolveAuth"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gpc-cli/cli",
3
- "version": "0.9.58",
3
+ "version": "0.9.60",
4
4
  "description": "GPC — Google Play Console CLI. 217 API endpoints including Managed Google Play. Upload AABs, manage releases, monitor vitals, publish private enterprise apps. Fastlane alternative for Android.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,11 +19,11 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "commander": "^14.0.3",
22
- "@gpc-cli/api": "1.0.33",
23
- "@gpc-cli/auth": "0.9.12",
24
- "@gpc-cli/core": "0.9.48",
25
- "@gpc-cli/plugin-sdk": "0.9.8",
26
- "@gpc-cli/config": "0.9.12"
22
+ "@gpc-cli/api": "1.0.35",
23
+ "@gpc-cli/auth": "0.9.13",
24
+ "@gpc-cli/config": "0.9.13",
25
+ "@gpc-cli/core": "0.9.50",
26
+ "@gpc-cli/plugin-sdk": "0.9.9"
27
27
  },
28
28
  "keywords": [
29
29
  "google-play",