@gpc-cli/cli 0.9.59 → 0.9.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/__complete-QFD3SUAO.js +146 -0
- package/dist/__complete-QFD3SUAO.js.map +1 -0
- package/dist/bin.js +14 -11
- package/dist/bin.js.map +1 -1
- package/dist/changelog-PPTJ7BHJ.js +100 -0
- package/dist/changelog-PPTJ7BHJ.js.map +1 -0
- package/dist/{chunk-2AM4XW7Q.js → chunk-CWJJ2BNH.js} +15 -12
- package/dist/chunk-CWJJ2BNH.js.map +1 -0
- package/dist/{completion-KRZLHV7V.js → completion-4I3IJK3M.js} +80 -21
- package/dist/completion-4I3IJK3M.js.map +1 -0
- package/dist/{config-ZLXFAFMN.js → config-FNZAEO4G.js} +2 -2
- package/dist/{doctor-PACXOJZ2.js → doctor-2DWDH7FC.js} +2 -2
- package/dist/{feedback-RO76QRIZ.js → feedback-O4HR6XLM.js} +2 -2
- package/dist/index.js +1 -1
- package/dist/{listings-MOHHHNE6.js → listings-2Z6DSO3D.js} +4 -4
- package/dist/{publish-26SSZ2W3.js → publish-5HZAJEDZ.js} +4 -4
- package/dist/{testers-QUWZHO6M.js → testers-FGLBJAXL.js} +4 -4
- package/dist/{update-PDYA3B45.js → update-HIJOMQGO.js} +2 -2
- package/dist/{version-FGBT5A7I.js → version-55ADSAN4.js} +2 -2
- package/package.json +6 -6
- package/dist/changelog-QLDFG5TV.js +0 -48
- package/dist/changelog-QLDFG5TV.js.map +0 -1
- package/dist/chunk-2AM4XW7Q.js.map +0 -1
- package/dist/completion-KRZLHV7V.js.map +0 -1
- /package/dist/{config-ZLXFAFMN.js.map → config-FNZAEO4G.js.map} +0 -0
- /package/dist/{doctor-PACXOJZ2.js.map → doctor-2DWDH7FC.js.map} +0 -0
- /package/dist/{feedback-RO76QRIZ.js.map → feedback-O4HR6XLM.js.map} +0 -0
- /package/dist/{listings-MOHHHNE6.js.map → listings-2Z6DSO3D.js.map} +0 -0
- /package/dist/{publish-26SSZ2W3.js.map → publish-5HZAJEDZ.js.map} +0 -0
- /package/dist/{testers-QUWZHO6M.js.map → testers-FGLBJAXL.js.map} +0 -0
- /package/dist/{update-PDYA3B45.js.map → update-HIJOMQGO.js.map} +0 -0
- /package/dist/{version-FGBT5A7I.js.map → version-55ADSAN4.js.map} +0 -0
package/README.md
CHANGED
|
@@ -87,7 +87,7 @@ curl -fsSL https://raw.githubusercontent.com/yasserstudio/gpc/main/scripts/insta
|
|
|
87
87
|
- [Commands reference](https://yasserstudio.github.io/gpc/commands/)
|
|
88
88
|
- [CI/CD recipes](https://yasserstudio.github.io/gpc/ci-cd/)
|
|
89
89
|
|
|
90
|
-
Free to use. 1,
|
|
90
|
+
Free to use. 1,978 tests. 90%+ coverage. Every write operation supports `--dry-run`.
|
|
91
91
|
|
|
92
92
|
## Licensing
|
|
93
93
|
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/__complete.ts
|
|
4
|
+
import { readFile, readdir } from "fs/promises";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import { getCacheDir, getUserConfigPath, listProfiles } from "@gpc-cli/config";
|
|
8
|
+
var STATIC_TRACKS = ["production", "beta", "alpha", "internal"];
|
|
9
|
+
var DEBUG = process.env["GPC_DEBUG"] === "1";
|
|
10
|
+
function debug(msg) {
|
|
11
|
+
if (DEBUG) process.stderr.write(`[gpc __complete] ${msg}
|
|
12
|
+
`);
|
|
13
|
+
}
|
|
14
|
+
function emit(values) {
|
|
15
|
+
for (const v of values) {
|
|
16
|
+
if (v) console.log(v);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
var DANGEROUS_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
|
|
20
|
+
function sanitize(obj) {
|
|
21
|
+
if (!obj || typeof obj !== "object") return;
|
|
22
|
+
if (Array.isArray(obj)) {
|
|
23
|
+
for (const item of obj) sanitize(item);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const record = obj;
|
|
27
|
+
for (const key of Object.keys(record)) {
|
|
28
|
+
if (DANGEROUS_KEYS.has(key)) {
|
|
29
|
+
delete record[key];
|
|
30
|
+
} else if (typeof record[key] === "object" && record[key] !== null) {
|
|
31
|
+
sanitize(record[key]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function readJson(path) {
|
|
36
|
+
try {
|
|
37
|
+
const raw = await readFile(path, "utf-8");
|
|
38
|
+
const parsed = JSON.parse(raw);
|
|
39
|
+
sanitize(parsed);
|
|
40
|
+
return parsed;
|
|
41
|
+
} catch (err) {
|
|
42
|
+
debug(`readJson(${path}) failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function readProjectConfig() {
|
|
47
|
+
return readJson(join(process.cwd(), ".gpcrc.json"));
|
|
48
|
+
}
|
|
49
|
+
async function readUserConfig() {
|
|
50
|
+
return readJson(getUserConfigPath());
|
|
51
|
+
}
|
|
52
|
+
async function cachedPackageNames() {
|
|
53
|
+
try {
|
|
54
|
+
const entries = await readdir(getCacheDir());
|
|
55
|
+
return entries.filter((f) => f.startsWith("status-") && f.endsWith(".json")).map((f) => f.slice("status-".length, -".json".length));
|
|
56
|
+
} catch {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function readFreshStatusCache(packageName) {
|
|
61
|
+
const entry = await readJson(
|
|
62
|
+
join(getCacheDir(), `status-${packageName}.json`)
|
|
63
|
+
);
|
|
64
|
+
if (!entry?.fetchedAt) return null;
|
|
65
|
+
const ttl = entry.ttl ?? 3600;
|
|
66
|
+
const ageSec = (Date.now() - new Date(entry.fetchedAt).getTime()) / 1e3;
|
|
67
|
+
if (ageSec > ttl) return null;
|
|
68
|
+
return entry;
|
|
69
|
+
}
|
|
70
|
+
async function runContext(context, args = []) {
|
|
71
|
+
switch (context) {
|
|
72
|
+
case "profiles":
|
|
73
|
+
return completeProfiles();
|
|
74
|
+
case "packages":
|
|
75
|
+
return completePackages();
|
|
76
|
+
case "tracks-for-app":
|
|
77
|
+
return completeTracksForApp(args[0]);
|
|
78
|
+
case "releases-for-track":
|
|
79
|
+
return completeReleasesForTrack(args[0], args[1]);
|
|
80
|
+
default:
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function completeProfiles() {
|
|
85
|
+
return listProfiles();
|
|
86
|
+
}
|
|
87
|
+
async function completePackages() {
|
|
88
|
+
const seen = /* @__PURE__ */ new Set();
|
|
89
|
+
const [proj, user, cached] = await Promise.all([
|
|
90
|
+
readProjectConfig(),
|
|
91
|
+
readUserConfig(),
|
|
92
|
+
cachedPackageNames()
|
|
93
|
+
]);
|
|
94
|
+
for (const cfg of [proj, user]) {
|
|
95
|
+
if (cfg?.app) seen.add(cfg.app);
|
|
96
|
+
if (cfg?.profiles) {
|
|
97
|
+
for (const p of Object.values(cfg.profiles)) {
|
|
98
|
+
if (p?.app) seen.add(p.app);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
for (const pkg of cached) seen.add(pkg);
|
|
103
|
+
return [...seen].sort();
|
|
104
|
+
}
|
|
105
|
+
async function completeTracksForApp(packageName) {
|
|
106
|
+
const tracks = new Set(STATIC_TRACKS);
|
|
107
|
+
if (packageName) {
|
|
108
|
+
const entry = await readFreshStatusCache(packageName);
|
|
109
|
+
for (const r of entry?.data?.releases ?? []) {
|
|
110
|
+
if (r.track) tracks.add(r.track);
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
const packages = await cachedPackageNames();
|
|
114
|
+
const entries = await Promise.all(packages.map((p) => readFreshStatusCache(p)));
|
|
115
|
+
for (const entry of entries) {
|
|
116
|
+
for (const r of entry?.data?.releases ?? []) {
|
|
117
|
+
if (r.track) tracks.add(r.track);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return [...tracks];
|
|
122
|
+
}
|
|
123
|
+
async function completeReleasesForTrack(packageName, track) {
|
|
124
|
+
if (!packageName || !track) return [];
|
|
125
|
+
const entry = await readFreshStatusCache(packageName);
|
|
126
|
+
return (entry?.data?.releases ?? []).filter((r) => r.track === track && r.versionCode).map((r) => r.versionCode);
|
|
127
|
+
}
|
|
128
|
+
function registerCompleteCommand(program) {
|
|
129
|
+
const complete = new Command("__complete").description("Internal: shell completion value provider (hidden)").argument("<context>", "profiles | packages | tracks-for-app | releases-for-track").argument("[args...]", "Context-specific positional args").allowUnknownOption(true).action(async (context, args) => {
|
|
130
|
+
try {
|
|
131
|
+
const values = await runContext(context, args);
|
|
132
|
+
emit(values);
|
|
133
|
+
} catch {
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
program.addCommand(complete, { hidden: true });
|
|
137
|
+
}
|
|
138
|
+
export {
|
|
139
|
+
completePackages,
|
|
140
|
+
completeProfiles,
|
|
141
|
+
completeReleasesForTrack,
|
|
142
|
+
completeTracksForApp,
|
|
143
|
+
registerCompleteCommand,
|
|
144
|
+
runContext
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=__complete-QFD3SUAO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/__complete.ts"],"sourcesContent":["import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { getCacheDir, getUserConfigPath, listProfiles } from \"@gpc-cli/config\";\n\n// Keep this file dependency-light on purpose.\n// It is called on every TAB press; loading @gpc-cli/api or @gpc-cli/auth would\n// blow the <100ms cold-start budget. Only pull from @gpc-cli/config + node:fs.\n\nconst STATIC_TRACKS = [\"production\", \"beta\", \"alpha\", \"internal\"] as const;\n\nconst DEBUG = process.env[\"GPC_DEBUG\"] === \"1\";\n\nfunction debug(msg: string): void {\n if (DEBUG) process.stderr.write(`[gpc __complete] ${msg}\\n`);\n}\n\n/** Emit one value per line; silent on any error. */\nfunction emit(values: readonly string[]): void {\n for (const v of values) {\n if (v) console.log(v);\n }\n}\n\n// Prototype-pollution defense: strip __proto__/constructor/prototype from\n// parsed JSON. Mirrors packages/config/src/loader.ts:92 so cache and config\n// files are treated consistently.\nconst DANGEROUS_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nfunction sanitize(obj: unknown): void {\n if (!obj || typeof obj !== \"object\") return;\n if (Array.isArray(obj)) {\n for (const item of obj) sanitize(item);\n return;\n }\n const record = obj as Record<string, unknown>;\n for (const key of Object.keys(record)) {\n if (DANGEROUS_KEYS.has(key)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete record[key];\n } else if (typeof record[key] === \"object\" && record[key] !== null) {\n sanitize(record[key]);\n }\n }\n}\n\nasync function readJson<T>(path: string): Promise<T | null> {\n try {\n const raw = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(raw) as T;\n sanitize(parsed);\n return parsed;\n } catch (err) {\n // Silent fallback is by design (empty/stale cache is indistinguishable\n // from corrupt from the user's POV), but under GPC_DEBUG=1 surface the\n // error so authors can diagnose bad config or cache files.\n debug(`readJson(${path}) failed: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n}\n\ninterface ProfileEntry {\n app?: string;\n}\ninterface RawConfig {\n app?: string;\n profiles?: Record<string, ProfileEntry>;\n}\n\nasync function readProjectConfig(): Promise<RawConfig | null> {\n return readJson<RawConfig>(join(process.cwd(), \".gpcrc.json\"));\n}\n\nasync function readUserConfig(): Promise<RawConfig | null> {\n return readJson<RawConfig>(getUserConfigPath());\n}\n\nasync function cachedPackageNames(): Promise<string[]> {\n try {\n const entries = await readdir(getCacheDir());\n return entries\n .filter((f) => f.startsWith(\"status-\") && f.endsWith(\".json\"))\n .map((f) => f.slice(\"status-\".length, -\".json\".length));\n } catch {\n return [];\n }\n}\n\ninterface StatusCacheEntry {\n fetchedAt?: string;\n ttl?: number;\n data?: {\n releases?: Array<{ track?: string; versionCode?: string }>;\n };\n}\n\nasync function readFreshStatusCache(packageName: string): Promise<StatusCacheEntry | null> {\n const entry = await readJson<StatusCacheEntry>(\n join(getCacheDir(), `status-${packageName}.json`),\n );\n if (!entry?.fetchedAt) return null;\n const ttl = entry.ttl ?? 3600;\n const ageSec = (Date.now() - new Date(entry.fetchedAt).getTime()) / 1000;\n if (ageSec > ttl) return null;\n return entry;\n}\n\nexport async function runContext(context: string, args: readonly string[] = []): Promise<string[]> {\n switch (context) {\n case \"profiles\":\n return completeProfiles();\n case \"packages\":\n return completePackages();\n case \"tracks-for-app\":\n return completeTracksForApp(args[0]);\n case \"releases-for-track\":\n return completeReleasesForTrack(args[0], args[1]);\n default:\n return [];\n }\n}\n\nexport async function completeProfiles(): Promise<string[]> {\n return listProfiles();\n}\n\nexport async function completePackages(): Promise<string[]> {\n const seen = new Set<string>();\n const [proj, user, cached] = await Promise.all([\n readProjectConfig(),\n readUserConfig(),\n cachedPackageNames(),\n ]);\n for (const cfg of [proj, user]) {\n if (cfg?.app) seen.add(cfg.app);\n if (cfg?.profiles) {\n for (const p of Object.values(cfg.profiles)) {\n if (p?.app) seen.add(p.app);\n }\n }\n }\n for (const pkg of cached) seen.add(pkg);\n return [...seen].sort();\n}\n\nexport async function completeTracksForApp(packageName: string | undefined): Promise<string[]> {\n const tracks = new Set<string>(STATIC_TRACKS);\n if (packageName) {\n const entry = await readFreshStatusCache(packageName);\n for (const r of entry?.data?.releases ?? []) {\n if (r.track) tracks.add(r.track);\n }\n } else {\n // No package arg: shell scripts don't currently parse the already-typed\n // --app value. As a best-effort, aggregate custom track names from every\n // fresh status cache so `gpc --track <TAB>` still surfaces non-standard\n // tracks the user has published to recently.\n const packages = await cachedPackageNames();\n const entries = await Promise.all(packages.map((p) => readFreshStatusCache(p)));\n for (const entry of entries) {\n for (const r of entry?.data?.releases ?? []) {\n if (r.track) tracks.add(r.track);\n }\n }\n }\n return [...tracks];\n}\n\nexport async function completeReleasesForTrack(\n packageName: string | undefined,\n track: string | undefined,\n): Promise<string[]> {\n if (!packageName || !track) return [];\n const entry = await readFreshStatusCache(packageName);\n return (entry?.data?.releases ?? [])\n .filter((r) => r.track === track && r.versionCode)\n .map((r) => r.versionCode as string);\n}\n\n/** Register the hidden `__complete` subcommand on the program. */\nexport function registerCompleteCommand(program: Command): void {\n const complete = new Command(\"__complete\")\n .description(\"Internal: shell completion value provider (hidden)\")\n .argument(\"<context>\", \"profiles | packages | tracks-for-app | releases-for-track\")\n .argument(\"[args...]\", \"Context-specific positional args\")\n .allowUnknownOption(true)\n .action(async (context: string, args: string[]) => {\n try {\n const values = await runContext(context, args);\n emit(values);\n } catch {\n // Never throw from a completion handler.\n }\n });\n\n program.addCommand(complete, { hidden: true });\n}\n"],"mappings":"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","names":[]}
|
package/dist/bin.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
createProgram,
|
|
4
4
|
handleCliError,
|
|
5
5
|
loadPlugins
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-CWJJ2BNH.js";
|
|
7
7
|
import {
|
|
8
8
|
checkForUpdate,
|
|
9
9
|
formatUpdateNotification
|
|
@@ -57,9 +57,10 @@ if (!_isJsonMode && !_isQuiet && !_isSetupCommand && !existsSync(getUserConfigPa
|
|
|
57
57
|
}
|
|
58
58
|
await setupNetworking();
|
|
59
59
|
initAudit(getConfigDir());
|
|
60
|
-
var currentVersion = "0.9.
|
|
60
|
+
var currentVersion = "0.9.61";
|
|
61
61
|
var isUpdateCommand = process.argv[2] === "update";
|
|
62
|
-
var
|
|
62
|
+
var isCompletionProvider = process.argv[2] === "__complete";
|
|
63
|
+
var updateCheckPromise = isUpdateCommand || isCompletionProvider ? Promise.resolve(null) : checkForUpdate(currentVersion);
|
|
63
64
|
if (process.argv.includes("--ci")) {
|
|
64
65
|
process.env["CI"] = "1";
|
|
65
66
|
if (!process.argv.some((a) => a.startsWith("--output") || a.startsWith("-o"))) {
|
|
@@ -115,16 +116,18 @@ if (notifyOpt !== void 0 && notifyOpt !== false) {
|
|
|
115
116
|
} catch {
|
|
116
117
|
}
|
|
117
118
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
process.
|
|
119
|
+
if (!isCompletionProvider) {
|
|
120
|
+
try {
|
|
121
|
+
const result = await Promise.race([
|
|
122
|
+
updateCheckPromise,
|
|
123
|
+
new Promise((resolve) => setTimeout(() => resolve(null), 3e3))
|
|
124
|
+
]);
|
|
125
|
+
if (result && result.updateAvailable && !isUpdateCommand && process.stdout.isTTY && !process.argv.includes("--json") && program.opts()["output"] !== "json") {
|
|
126
|
+
process.stderr.write(`
|
|
125
127
|
${formatUpdateNotification(result)}
|
|
126
128
|
`);
|
|
129
|
+
}
|
|
130
|
+
} catch {
|
|
127
131
|
}
|
|
128
|
-
} catch {
|
|
129
132
|
}
|
|
130
133
|
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin.ts","../src/networking.ts","../src/argv-profile.ts"],"sourcesContent":["if (process.env[\"GPC_NO_COLOR\"] === \"1\") process.env[\"NO_COLOR\"] = \"1\";\nif (process.argv.includes(\"--no-color\")) {\n process.env[\"NO_COLOR\"] = \"1\";\n}\nimport { existsSync } from \"node:fs\";\nimport { setupNetworking } from \"./networking.js\";\nimport { createProgram } from \"./program.js\";\nimport { loadPlugins } from \"./plugins.js\";\nimport { handleCliError } from \"./error-handler.js\";\nimport { initAudit, sendWebhook } from \"@gpc-cli/core\";\nimport type { WebhookPayload } from \"@gpc-cli/core\";\nimport { getConfigDir, loadConfig, getUserConfigPath } from \"@gpc-cli/config\";\nimport { checkForUpdate, formatUpdateNotification } from \"./update-check.js\";\n\n// First-run banner\nconst _isJsonMode =\n process.argv.includes(\"--json\") ||\n process.argv.includes(\"-j\") ||\n process.argv.includes(\"--ci\") ||\n (process.argv.includes(\"--output\") &&\n process.argv[process.argv.indexOf(\"--output\") + 1] === \"json\") ||\n (process.argv.includes(\"-o\") && process.argv[process.argv.indexOf(\"-o\") + 1] === \"json\");\nconst _isQuiet = process.argv.includes(\"--quiet\") || process.argv.includes(\"-q\");\n\nconst _setupCommands = new Set([\"config\", \"auth\", \"quickstart\", \"doctor\", \"init\", \"setup-gcp\"]);\nconst _isSetupCommand = _setupCommands.has(process.argv[2] ?? \"\");\n\nif (!_isJsonMode && !_isQuiet && !_isSetupCommand && !existsSync(getUserConfigPath())) {\n process.stderr.write(\"\\u2726 First time? Run gpc config init to get set up.\\n\\n\");\n}\n\nawait setupNetworking();\ninitAudit(getConfigDir());\n\nconst currentVersion = process.env[\"__GPC_VERSION\"] || \"0.0.0\";\n\n// Skip passive update check when the user is explicitly running `gpc update` —\n// that command does its own check against the GitHub Releases API.\nconst isUpdateCommand = process.argv[2] === \"update\";\n\n// Start update check before command execution (non-blocking)\nconst updateCheckPromise = isUpdateCommand ? Promise.resolve(null) : checkForUpdate(currentVersion);\n\n// Handle --ci and --json flags early (before command parsing)\nif (process.argv.includes(\"--ci\")) {\n process.env[\"CI\"] = \"1\";\n // --ci implies --output json --no-interactive --no-color\n if (!process.argv.some((a) => a.startsWith(\"--output\") || a.startsWith(\"-o\"))) {\n process.argv.push(\"--output\", \"json\");\n }\n if (!process.argv.includes(\"--no-interactive\")) {\n process.argv.push(\"--no-interactive\");\n }\n if (!process.argv.includes(\"--no-color\")) {\n process.argv.push(\"--no-color\");\n }\n}\nif (process.argv.includes(\"--json\") || process.argv.includes(\"-j\")) {\n if (!process.argv.some((a) => a.startsWith(\"--output\") || a.startsWith(\"-o\"))) {\n process.argv.push(\"--output\", \"json\");\n }\n}\n\n// Propagate --profile / -p to GPC_PROFILE env var so loadConfig() picks it up.\n// Must run before any loadConfig() call (commands read env, not program.opts).\nimport { extractProfileFromArgv } from \"./argv-profile.js\";\n{\n const profile = extractProfileFromArgv(process.argv);\n if (profile) process.env[\"GPC_PROFILE\"] = profile;\n}\n\nconst pluginManager = await loadPlugins();\nconst program = await createProgram(pluginManager);\n\n// GPC_DEBUG=1 enables verbose mode without mutating process.argv\nif (process.env[\"GPC_DEBUG\"] === \"1\") {\n program.setOptionValueWithSource(\"verbose\", true, \"env\");\n}\n\nconst startTime = Date.now();\nlet commandSuccess = true;\nlet commandError: string | undefined;\n\nawait program.parseAsync(process.argv).catch((error: unknown) => {\n commandSuccess = false;\n commandError = error instanceof Error ? error.message : String(error);\n const exitCode = handleCliError(error);\n process.exit(exitCode);\n});\n\n// Send webhook notification if --notify was set\nconst notifyOpt = program.opts()[\"notify\"] as string | boolean | undefined;\nif (notifyOpt !== undefined && notifyOpt !== false) {\n try {\n const config = await loadConfig();\n if (config.webhooks) {\n const commandName = process.argv\n .slice(2)\n .filter((a) => !a.startsWith(\"--notify\"))\n .join(\" \");\n const payload: WebhookPayload = {\n command: commandName || \"unknown\",\n success: commandSuccess,\n duration: Date.now() - startTime,\n app: program.opts()[\"app\"] as string | undefined,\n error: commandError,\n };\n\n const target = typeof notifyOpt === \"string\" ? notifyOpt : undefined;\n // Fire-and-forget — do not block exit\n sendWebhook(config.webhooks, payload, target).catch(() => {});\n }\n } catch {\n // Never let webhook logic break the CLI\n }\n}\n\n// After command completes, show update notification if available\n// isUpdateCommand is declared above — update check was skipped for this command\ntry {\n const result = await Promise.race([\n updateCheckPromise,\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 3000)),\n ]);\n\n if (\n result &&\n result.updateAvailable &&\n !isUpdateCommand &&\n process.stdout.isTTY &&\n !process.argv.includes(\"--json\") &&\n program.opts()[\"output\"] !== \"json\"\n ) {\n process.stderr.write(`\\n${formatUpdateNotification(result)}\\n`);\n }\n} catch {\n // Silently ignore update check failures\n}\n","/**\n * Set up proxy and custom CA certificate support.\n * Must be called before any fetch() calls.\n */\nexport async function setupNetworking(): Promise<void> {\n // Map GPC_CA_CERT to NODE_EXTRA_CA_CERTS (works in both Node and Bun)\n const caCert = process.env[\"GPC_CA_CERT\"];\n if (caCert && !process.env[\"NODE_EXTRA_CA_CERTS\"]) {\n process.env[\"NODE_EXTRA_CA_CERTS\"] = caCert;\n }\n\n // In standalone binary mode, Bun handles HTTPS_PROXY/HTTP_PROXY natively\n if (process.env[\"__GPC_BINARY\"] === \"1\") return;\n\n const proxyUrl =\n process.env[\"HTTPS_PROXY\"] ||\n process.env[\"https_proxy\"] ||\n process.env[\"HTTP_PROXY\"] ||\n process.env[\"http_proxy\"];\n if (proxyUrl) {\n try {\n // @ts-expect-error undici types not available in all environments\n const { ProxyAgent, setGlobalDispatcher } = await import(\"undici\");\n setGlobalDispatcher(new ProxyAgent(proxyUrl));\n } catch {\n console.error(\"Warning: Proxy support requires Node.js 20+. HTTPS_PROXY will be ignored.\");\n }\n }\n}\n","/**\n * Extract the value of --profile or -p from argv, if present.\n * Returns undefined if the flag is missing or its value looks like another flag.\n */\nexport function extractProfileFromArgv(argv: readonly string[]): string | undefined {\n const idx = Math.max(argv.indexOf(\"--profile\"), argv.indexOf(\"-p\"));\n if (idx === -1 || idx + 1 >= argv.length) return undefined;\n const val = argv[idx + 1];\n if (!val || val.startsWith(\"-\")) return undefined;\n return val;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/bin.ts","../src/networking.ts","../src/argv-profile.ts"],"sourcesContent":["if (process.env[\"GPC_NO_COLOR\"] === \"1\") process.env[\"NO_COLOR\"] = \"1\";\nif (process.argv.includes(\"--no-color\")) {\n process.env[\"NO_COLOR\"] = \"1\";\n}\nimport { existsSync } from \"node:fs\";\nimport { setupNetworking } from \"./networking.js\";\nimport { createProgram } from \"./program.js\";\nimport { loadPlugins } from \"./plugins.js\";\nimport { handleCliError } from \"./error-handler.js\";\nimport { initAudit, sendWebhook } from \"@gpc-cli/core\";\nimport type { WebhookPayload } from \"@gpc-cli/core\";\nimport { getConfigDir, loadConfig, getUserConfigPath } from \"@gpc-cli/config\";\nimport { checkForUpdate, formatUpdateNotification } from \"./update-check.js\";\n\n// First-run banner\nconst _isJsonMode =\n process.argv.includes(\"--json\") ||\n process.argv.includes(\"-j\") ||\n process.argv.includes(\"--ci\") ||\n (process.argv.includes(\"--output\") &&\n process.argv[process.argv.indexOf(\"--output\") + 1] === \"json\") ||\n (process.argv.includes(\"-o\") && process.argv[process.argv.indexOf(\"-o\") + 1] === \"json\");\nconst _isQuiet = process.argv.includes(\"--quiet\") || process.argv.includes(\"-q\");\n\nconst _setupCommands = new Set([\"config\", \"auth\", \"quickstart\", \"doctor\", \"init\", \"setup-gcp\"]);\nconst _isSetupCommand = _setupCommands.has(process.argv[2] ?? \"\");\n\nif (!_isJsonMode && !_isQuiet && !_isSetupCommand && !existsSync(getUserConfigPath())) {\n process.stderr.write(\"\\u2726 First time? Run gpc config init to get set up.\\n\\n\");\n}\n\nawait setupNetworking();\ninitAudit(getConfigDir());\n\nconst currentVersion = process.env[\"__GPC_VERSION\"] || \"0.0.0\";\n\n// Skip passive update check when the user is explicitly running `gpc update` —\n// that command does its own check against the GitHub Releases API. Also skip\n// for `__complete` (shell-completion hot path — must stay under the latency\n// budget; users see TAB lag otherwise).\nconst isUpdateCommand = process.argv[2] === \"update\";\nconst isCompletionProvider = process.argv[2] === \"__complete\";\n\n// Start update check before command execution (non-blocking)\nconst updateCheckPromise =\n isUpdateCommand || isCompletionProvider ? Promise.resolve(null) : checkForUpdate(currentVersion);\n\n// Handle --ci and --json flags early (before command parsing)\nif (process.argv.includes(\"--ci\")) {\n process.env[\"CI\"] = \"1\";\n // --ci implies --output json --no-interactive --no-color\n if (!process.argv.some((a) => a.startsWith(\"--output\") || a.startsWith(\"-o\"))) {\n process.argv.push(\"--output\", \"json\");\n }\n if (!process.argv.includes(\"--no-interactive\")) {\n process.argv.push(\"--no-interactive\");\n }\n if (!process.argv.includes(\"--no-color\")) {\n process.argv.push(\"--no-color\");\n }\n}\nif (process.argv.includes(\"--json\") || process.argv.includes(\"-j\")) {\n if (!process.argv.some((a) => a.startsWith(\"--output\") || a.startsWith(\"-o\"))) {\n process.argv.push(\"--output\", \"json\");\n }\n}\n\n// Propagate --profile / -p to GPC_PROFILE env var so loadConfig() picks it up.\n// Must run before any loadConfig() call (commands read env, not program.opts).\nimport { extractProfileFromArgv } from \"./argv-profile.js\";\n{\n const profile = extractProfileFromArgv(process.argv);\n if (profile) process.env[\"GPC_PROFILE\"] = profile;\n}\n\nconst pluginManager = await loadPlugins();\nconst program = await createProgram(pluginManager);\n\n// GPC_DEBUG=1 enables verbose mode without mutating process.argv\nif (process.env[\"GPC_DEBUG\"] === \"1\") {\n program.setOptionValueWithSource(\"verbose\", true, \"env\");\n}\n\nconst startTime = Date.now();\nlet commandSuccess = true;\nlet commandError: string | undefined;\n\nawait program.parseAsync(process.argv).catch((error: unknown) => {\n commandSuccess = false;\n commandError = error instanceof Error ? error.message : String(error);\n const exitCode = handleCliError(error);\n process.exit(exitCode);\n});\n\n// Send webhook notification if --notify was set\nconst notifyOpt = program.opts()[\"notify\"] as string | boolean | undefined;\nif (notifyOpt !== undefined && notifyOpt !== false) {\n try {\n const config = await loadConfig();\n if (config.webhooks) {\n const commandName = process.argv\n .slice(2)\n .filter((a) => !a.startsWith(\"--notify\"))\n .join(\" \");\n const payload: WebhookPayload = {\n command: commandName || \"unknown\",\n success: commandSuccess,\n duration: Date.now() - startTime,\n app: program.opts()[\"app\"] as string | undefined,\n error: commandError,\n };\n\n const target = typeof notifyOpt === \"string\" ? notifyOpt : undefined;\n // Fire-and-forget — do not block exit\n sendWebhook(config.webhooks, payload, target).catch(() => {});\n }\n } catch {\n // Never let webhook logic break the CLI\n }\n}\n\n// After command completes, show update notification if available\n// isUpdateCommand is declared above — update check was skipped for this command.\n// Skip entirely for __complete: the setTimeout below would keep the event loop\n// alive for 3s, blowing the completion latency budget.\nif (!isCompletionProvider) {\n try {\n const result = await Promise.race([\n updateCheckPromise,\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 3000)),\n ]);\n\n if (\n result &&\n result.updateAvailable &&\n !isUpdateCommand &&\n process.stdout.isTTY &&\n !process.argv.includes(\"--json\") &&\n program.opts()[\"output\"] !== \"json\"\n ) {\n process.stderr.write(`\\n${formatUpdateNotification(result)}\\n`);\n }\n } catch {\n // Silently ignore update check failures\n }\n}\n","/**\n * Set up proxy and custom CA certificate support.\n * Must be called before any fetch() calls.\n */\nexport async function setupNetworking(): Promise<void> {\n // Map GPC_CA_CERT to NODE_EXTRA_CA_CERTS (works in both Node and Bun)\n const caCert = process.env[\"GPC_CA_CERT\"];\n if (caCert && !process.env[\"NODE_EXTRA_CA_CERTS\"]) {\n process.env[\"NODE_EXTRA_CA_CERTS\"] = caCert;\n }\n\n // In standalone binary mode, Bun handles HTTPS_PROXY/HTTP_PROXY natively\n if (process.env[\"__GPC_BINARY\"] === \"1\") return;\n\n const proxyUrl =\n process.env[\"HTTPS_PROXY\"] ||\n process.env[\"https_proxy\"] ||\n process.env[\"HTTP_PROXY\"] ||\n process.env[\"http_proxy\"];\n if (proxyUrl) {\n try {\n // @ts-expect-error undici types not available in all environments\n const { ProxyAgent, setGlobalDispatcher } = await import(\"undici\");\n setGlobalDispatcher(new ProxyAgent(proxyUrl));\n } catch {\n console.error(\"Warning: Proxy support requires Node.js 20+. HTTPS_PROXY will be ignored.\");\n }\n }\n}\n","/**\n * Extract the value of --profile or -p from argv, if present.\n * Returns undefined if the flag is missing or its value looks like another flag.\n */\nexport function extractProfileFromArgv(argv: readonly string[]): string | undefined {\n const idx = Math.max(argv.indexOf(\"--profile\"), argv.indexOf(\"-p\"));\n if (idx === -1 || idx + 1 >= argv.length) return undefined;\n const val = argv[idx + 1];\n if (!val || val.startsWith(\"-\")) return undefined;\n return val;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
dim,
|
|
4
|
+
yellow
|
|
5
|
+
} from "./chunk-FAN4ZITI.js";
|
|
6
|
+
import {
|
|
7
|
+
getOutputFormat
|
|
8
|
+
} from "./chunk-ELXAK7GI.js";
|
|
9
|
+
|
|
10
|
+
// src/commands/changelog.ts
|
|
11
|
+
import {
|
|
12
|
+
fetchChangelog,
|
|
13
|
+
formatChangelogEntry,
|
|
14
|
+
formatOutput,
|
|
15
|
+
generateChangelog,
|
|
16
|
+
RENDERERS
|
|
17
|
+
} from "@gpc-cli/core";
|
|
18
|
+
import { loadConfig } from "@gpc-cli/config";
|
|
19
|
+
var VALID_OUTPUT_MODES = ["md", "json", "prompt"];
|
|
20
|
+
var REPO_RE = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
21
|
+
function registerChangelogCommand(program) {
|
|
22
|
+
const changelog = program.command("changelog").description("Show release history").option("-n, --limit <count>", "Number of releases to show", parseInt, 5).option("--tag <tag>", "Show a specific release (e.g., v0.9.43)").option("--all", "Show all releases").action(async (opts) => {
|
|
23
|
+
const config = await loadConfig();
|
|
24
|
+
const format = getOutputFormat(program, config);
|
|
25
|
+
const entries = await fetchChangelog({
|
|
26
|
+
limit: opts.all ? 100 : opts.limit,
|
|
27
|
+
version: opts.tag
|
|
28
|
+
});
|
|
29
|
+
if (entries.length === 0) {
|
|
30
|
+
console.log("No releases found.");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (format === "json") {
|
|
34
|
+
console.log(formatOutput(entries, "json"));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (opts.tag || entries.length === 1) {
|
|
38
|
+
console.log(formatChangelogEntry(entries[0]));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const header = "VERSION DATE TITLE";
|
|
42
|
+
const separator = "\u2500".repeat(header.length);
|
|
43
|
+
console.log(header);
|
|
44
|
+
console.log(separator);
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
const version = entry.version.padEnd(12);
|
|
47
|
+
const date = entry.date.padEnd(12);
|
|
48
|
+
console.log(`${version} ${date} ${entry.title}`);
|
|
49
|
+
}
|
|
50
|
+
console.log("");
|
|
51
|
+
console.log(
|
|
52
|
+
`Showing ${entries.length} releases. Use --tag <tag> for details, or --all for full history.`
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
changelog.command("generate").description("Generate release notes from local git commits").option("--from <ref>", "Starting ref (default: latest v* tag)").option("--to <ref>", "Ending ref (default: HEAD)").option("--format <mode>", "Renderer: md, json, or prompt", "md").option("--repo <owner/name>", "Override auto-detected repo (e.g., yasserstudio/gpc)").option("--strict", "Exit non-zero if linter warnings are emitted").action(
|
|
56
|
+
async (opts) => {
|
|
57
|
+
const mode = opts.format;
|
|
58
|
+
if (!VALID_OUTPUT_MODES.includes(mode)) {
|
|
59
|
+
process.stderr.write(
|
|
60
|
+
`Invalid --format "${opts.format}". Valid: ${VALID_OUTPUT_MODES.join(", ")}
|
|
61
|
+
`
|
|
62
|
+
);
|
|
63
|
+
process.exitCode = 2;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (opts.repo && !REPO_RE.test(opts.repo)) {
|
|
67
|
+
process.stderr.write(
|
|
68
|
+
`Invalid --repo "${opts.repo}". Expected "owner/name" (e.g., yasserstudio/gpc).
|
|
69
|
+
`
|
|
70
|
+
);
|
|
71
|
+
process.exitCode = 2;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const generated = await generateChangelog({
|
|
75
|
+
from: opts.from,
|
|
76
|
+
to: opts.to,
|
|
77
|
+
repo: opts.repo
|
|
78
|
+
});
|
|
79
|
+
for (const w of generated.warnings) {
|
|
80
|
+
process.stderr.write(`${yellow("warn:")} ${w}
|
|
81
|
+
`);
|
|
82
|
+
}
|
|
83
|
+
if (generated.warnings.length > 0) {
|
|
84
|
+
process.stderr.write(
|
|
85
|
+
`${dim(`(${generated.warnings.length} warning${generated.warnings.length === 1 ? "" : "s"} \u2014 review before publishing)`)}
|
|
86
|
+
`
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
const output = RENDERERS[mode](generated);
|
|
90
|
+
console.log(output);
|
|
91
|
+
if (opts.strict && generated.warnings.length > 0) {
|
|
92
|
+
process.exitCode = 1;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
registerChangelogCommand
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=changelog-PPTJ7BHJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/changelog.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport {\n fetchChangelog,\n formatChangelogEntry,\n formatOutput,\n generateChangelog,\n RENDERERS,\n type OutputMode,\n} from \"@gpc-cli/core\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { getOutputFormat } from \"../format.js\";\nimport { yellow, dim } from \"../colors.js\";\n\nconst VALID_OUTPUT_MODES: OutputMode[] = [\"md\", \"json\", \"prompt\"];\nconst REPO_RE = /^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+$/;\n\nexport function registerChangelogCommand(program: Command): void {\n const changelog = program\n .command(\"changelog\")\n .description(\"Show release history\")\n .option(\"-n, --limit <count>\", \"Number of releases to show\", parseInt, 5)\n .option(\"--tag <tag>\", \"Show a specific release (e.g., v0.9.43)\")\n .option(\"--all\", \"Show all releases\")\n .action(async (opts: { limit: number; tag?: string; all?: boolean }) => {\n const config = await loadConfig();\n const format = getOutputFormat(program, config);\n\n const entries = await fetchChangelog({\n limit: opts.all ? 100 : opts.limit,\n version: opts.tag,\n });\n\n if (entries.length === 0) {\n console.log(\"No releases found.\");\n return;\n }\n\n if (format === \"json\") {\n console.log(formatOutput(entries, \"json\"));\n return;\n }\n\n if (opts.tag || entries.length === 1) {\n console.log(formatChangelogEntry(entries[0]!));\n return;\n }\n\n const header = \"VERSION DATE TITLE\";\n const separator = \"─\".repeat(header.length);\n console.log(header);\n console.log(separator);\n for (const entry of entries) {\n const version = entry.version.padEnd(12);\n const date = entry.date.padEnd(12);\n console.log(`${version} ${date} ${entry.title}`);\n }\n console.log(\"\");\n console.log(\n `Showing ${entries.length} releases. Use --tag <tag> for details, or --all for full history.`,\n );\n });\n\n changelog\n .command(\"generate\")\n .description(\"Generate release notes from local git commits\")\n .option(\"--from <ref>\", \"Starting ref (default: latest v* tag)\")\n .option(\"--to <ref>\", \"Ending ref (default: HEAD)\")\n .option(\"--format <mode>\", \"Renderer: md, json, or prompt\", \"md\")\n .option(\"--repo <owner/name>\", \"Override auto-detected repo (e.g., yasserstudio/gpc)\")\n .option(\"--strict\", \"Exit non-zero if linter warnings are emitted\")\n .action(\n async (opts: {\n from?: string;\n to?: string;\n format: string;\n repo?: string;\n strict?: boolean;\n }) => {\n const mode = opts.format as OutputMode;\n if (!VALID_OUTPUT_MODES.includes(mode)) {\n process.stderr.write(\n `Invalid --format \"${opts.format}\". Valid: ${VALID_OUTPUT_MODES.join(\", \")}\\n`,\n );\n process.exitCode = 2;\n return;\n }\n if (opts.repo && !REPO_RE.test(opts.repo)) {\n process.stderr.write(\n `Invalid --repo \"${opts.repo}\". Expected \"owner/name\" (e.g., yasserstudio/gpc).\\n`,\n );\n process.exitCode = 2;\n return;\n }\n\n const generated = await generateChangelog({\n from: opts.from,\n to: opts.to,\n repo: opts.repo,\n });\n\n for (const w of generated.warnings) {\n process.stderr.write(`${yellow(\"warn:\")} ${w}\\n`);\n }\n if (generated.warnings.length > 0) {\n process.stderr.write(\n `${dim(`(${generated.warnings.length} warning${generated.warnings.length === 1 ? \"\" : \"s\"} — review before publishing)`)}\\n`,\n );\n }\n\n const output = RENDERERS[mode](generated);\n console.log(output);\n\n if (opts.strict && generated.warnings.length > 0) {\n process.exitCode = 1;\n }\n },\n );\n}\n"],"mappings":";;;;;;;;;;AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,kBAAkB;AAI3B,IAAM,qBAAmC,CAAC,MAAM,QAAQ,QAAQ;AAChE,IAAM,UAAU;AAET,SAAS,yBAAyB,SAAwB;AAC/D,QAAM,YAAY,QACf,QAAQ,WAAW,EACnB,YAAY,sBAAsB,EAClC,OAAO,uBAAuB,8BAA8B,UAAU,CAAC,EACvE,OAAO,eAAe,yCAAyC,EAC/D,OAAO,SAAS,mBAAmB,EACnC,OAAO,OAAO,SAAyD;AACtE,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,SAAS,gBAAgB,SAAS,MAAM;AAE9C,UAAM,UAAU,MAAM,eAAe;AAAA,MACnC,OAAO,KAAK,MAAM,MAAM,KAAK;AAAA,MAC7B,SAAS,KAAK;AAAA,IAChB,CAAC;AAED,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI,oBAAoB;AAChC;AAAA,IACF;AAEA,QAAI,WAAW,QAAQ;AACrB,cAAQ,IAAI,aAAa,SAAS,MAAM,CAAC;AACzC;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,QAAQ,WAAW,GAAG;AACpC,cAAQ,IAAI,qBAAqB,QAAQ,CAAC,CAAE,CAAC;AAC7C;AAAA,IACF;AAEA,UAAM,SAAS;AACf,UAAM,YAAY,SAAI,OAAO,OAAO,MAAM;AAC1C,YAAQ,IAAI,MAAM;AAClB,YAAQ,IAAI,SAAS;AACrB,eAAW,SAAS,SAAS;AAC3B,YAAM,UAAU,MAAM,QAAQ,OAAO,EAAE;AACvC,YAAM,OAAO,MAAM,KAAK,OAAO,EAAE;AACjC,cAAQ,IAAI,GAAG,OAAO,IAAI,IAAI,IAAI,MAAM,KAAK,EAAE;AAAA,IACjD;AACA,YAAQ,IAAI,EAAE;AACd,YAAQ;AAAA,MACN,WAAW,QAAQ,MAAM;AAAA,IAC3B;AAAA,EACF,CAAC;AAEH,YACG,QAAQ,UAAU,EAClB,YAAY,+CAA+C,EAC3D,OAAO,gBAAgB,uCAAuC,EAC9D,OAAO,cAAc,4BAA4B,EACjD,OAAO,mBAAmB,iCAAiC,IAAI,EAC/D,OAAO,uBAAuB,sDAAsD,EACpF,OAAO,YAAY,8CAA8C,EACjE;AAAA,IACC,OAAO,SAMD;AACJ,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,mBAAmB,SAAS,IAAI,GAAG;AACtC,gBAAQ,OAAO;AAAA,UACb,qBAAqB,KAAK,MAAM,aAAa,mBAAmB,KAAK,IAAI,CAAC;AAAA;AAAA,QAC5E;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,UAAI,KAAK,QAAQ,CAAC,QAAQ,KAAK,KAAK,IAAI,GAAG;AACzC,gBAAQ,OAAO;AAAA,UACb,mBAAmB,KAAK,IAAI;AAAA;AAAA,QAC9B;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,YAAM,YAAY,MAAM,kBAAkB;AAAA,QACxC,MAAM,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,MACb,CAAC;AAED,iBAAW,KAAK,UAAU,UAAU;AAClC,gBAAQ,OAAO,MAAM,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC;AAAA,CAAI;AAAA,MAClD;AACA,UAAI,UAAU,SAAS,SAAS,GAAG;AACjC,gBAAQ,OAAO;AAAA,UACb,GAAG,IAAI,IAAI,UAAU,SAAS,MAAM,WAAW,UAAU,SAAS,WAAW,IAAI,KAAK,GAAG,mCAA8B,CAAC;AAAA;AAAA,QAC1H;AAAA,MACF;AAEA,YAAM,SAAS,UAAU,IAAI,EAAE,SAAS;AACxC,cAAQ,IAAI,MAAM;AAElB,UAAI,KAAK,UAAU,UAAU,SAAS,SAAS,GAAG;AAChD,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACJ;","names":[]}
|
|
@@ -67,33 +67,36 @@ function registerPluginCommands(program, manager) {
|
|
|
67
67
|
import { Command } from "commander";
|
|
68
68
|
async function createProgram(pluginManager) {
|
|
69
69
|
const program = new Command();
|
|
70
|
-
program.name("gpc").description("GPC \u2014 Google Play Console CLI").version("0.9.
|
|
70
|
+
program.name("gpc").description("GPC \u2014 Google Play Console CLI").version("0.9.61", "-V, --version").option("-o, --output <format>", "Output format: table, json, yaml, markdown, junit").option("-v, --verbose", "Enable debug logging").option("-q, --quiet", "Suppress non-essential output").option("-a, --app <package>", "App package name").option("-p, --profile <name>", "Auth profile name").option("--no-color", "Disable colored output").option("--no-interactive", "Disable interactive prompts").option("-y, --yes", "Skip confirmation prompts").option("--dry-run", "Preview changes without executing").option("--notify [target]", "Send webhook notification on completion (slack, discord, custom)").option("--ci", "Force CI mode (JSON output, no prompts, strict exit codes)").option("-j, --json", "Shorthand for --output json").option("--apps <csv>", "Comma-separated package names for multi-app operations").showSuggestionAfterError(false);
|
|
71
71
|
const commandLoaders = {
|
|
72
72
|
auth: async () => {
|
|
73
73
|
(await import("./auth-4DRT7ZH2.js")).registerAuthCommands(program);
|
|
74
74
|
},
|
|
75
75
|
config: async () => {
|
|
76
|
-
(await import("./config-
|
|
76
|
+
(await import("./config-FNZAEO4G.js")).registerConfigCommands(program);
|
|
77
77
|
},
|
|
78
78
|
doctor: async () => {
|
|
79
|
-
(await import("./doctor-
|
|
79
|
+
(await import("./doctor-2DWDH7FC.js")).registerDoctorCommand(program);
|
|
80
80
|
},
|
|
81
81
|
update: async () => {
|
|
82
|
-
(await import("./update-
|
|
82
|
+
(await import("./update-HIJOMQGO.js")).registerUpdateCommand(program);
|
|
83
83
|
},
|
|
84
84
|
docs: async () => {
|
|
85
85
|
(await import("./docs-GP6AEX4N.js")).registerDocsCommand(program);
|
|
86
86
|
},
|
|
87
87
|
changelog: async () => {
|
|
88
|
-
(await import("./changelog-
|
|
88
|
+
(await import("./changelog-PPTJ7BHJ.js")).registerChangelogCommand(program);
|
|
89
89
|
},
|
|
90
90
|
completion: async () => {
|
|
91
|
-
(await import("./completion-
|
|
91
|
+
(await import("./completion-4I3IJK3M.js")).registerCompletionCommand(program, async () => {
|
|
92
92
|
await Promise.all(
|
|
93
93
|
Object.entries(commandLoaders).filter(([name]) => name !== "completion").map(([, loader2]) => loader2())
|
|
94
94
|
);
|
|
95
95
|
});
|
|
96
96
|
},
|
|
97
|
+
__complete: async () => {
|
|
98
|
+
(await import("./__complete-QFD3SUAO.js")).registerCompleteCommand(program);
|
|
99
|
+
},
|
|
97
100
|
apps: async () => {
|
|
98
101
|
(await import("./apps-WPUQOQLL.js")).registerAppsCommands(program);
|
|
99
102
|
},
|
|
@@ -107,7 +110,7 @@ async function createProgram(pluginManager) {
|
|
|
107
110
|
(await import("./status-32AJ7A6O.js")).registerStatusCommand(program);
|
|
108
111
|
},
|
|
109
112
|
listings: async () => {
|
|
110
|
-
(await import("./listings-
|
|
113
|
+
(await import("./listings-2Z6DSO3D.js")).registerListingsCommands(program);
|
|
111
114
|
},
|
|
112
115
|
reviews: async () => {
|
|
113
116
|
(await import("./reviews-P4M6BEJI.js")).registerReviewsCommands(program);
|
|
@@ -134,13 +137,13 @@ async function createProgram(pluginManager) {
|
|
|
134
137
|
(await import("./users-FOMAT7DY.js")).registerUsersCommands(program);
|
|
135
138
|
},
|
|
136
139
|
testers: async () => {
|
|
137
|
-
(await import("./testers-
|
|
140
|
+
(await import("./testers-FGLBJAXL.js")).registerTestersCommands(program);
|
|
138
141
|
},
|
|
139
142
|
validate: async () => {
|
|
140
143
|
(await import("./validate-RHWEZYD2.js")).registerValidateCommand(program);
|
|
141
144
|
},
|
|
142
145
|
publish: async () => {
|
|
143
|
-
(await import("./publish-
|
|
146
|
+
(await import("./publish-5HZAJEDZ.js")).registerPublishCommand(program);
|
|
144
147
|
},
|
|
145
148
|
recovery: async () => {
|
|
146
149
|
(await import("./recovery-B7DZQ6XG.js")).registerRecoveryCommands(program);
|
|
@@ -190,13 +193,13 @@ async function createProgram(pluginManager) {
|
|
|
190
193
|
(await import("./verify-H4ZUVHMZ.js")).registerVerifyCommand(program);
|
|
191
194
|
},
|
|
192
195
|
version: async () => {
|
|
193
|
-
(await import("./version-
|
|
196
|
+
(await import("./version-55ADSAN4.js")).registerVersionCommand(program);
|
|
194
197
|
},
|
|
195
198
|
cache: async () => {
|
|
196
199
|
(await import("./cache-FGNP7Y37.js")).registerCacheCommand(program);
|
|
197
200
|
},
|
|
198
201
|
feedback: async () => {
|
|
199
|
-
(await import("./feedback-
|
|
202
|
+
(await import("./feedback-O4HR6XLM.js")).registerFeedbackCommand(program);
|
|
200
203
|
},
|
|
201
204
|
quickstart: async () => {
|
|
202
205
|
(await import("./quickstart-FOWM3OKT.js")).registerQuickstartCommand(program);
|
|
@@ -464,4 +467,4 @@ export {
|
|
|
464
467
|
createProgram,
|
|
465
468
|
handleCliError
|
|
466
469
|
};
|
|
467
|
-
//# sourceMappingURL=chunk-
|
|
470
|
+
//# sourceMappingURL=chunk-CWJJ2BNH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugins.ts","../src/program.ts","../src/error-handler.ts"],"sourcesContent":["import { PluginManager, discoverPlugins } from \"@gpc-cli/core\";\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(\n opt.flags,\n opt.description,\n opt.defaultValue as string | boolean | string[] | undefined,\n );\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 } 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(\"GPC — Google Play Console CLI\")\n .version(process.env[\"__GPC_VERSION\"] || \"0.0.0\", \"-V, --version\")\n .option(\"-o, --output <format>\", \"Output format: table, json, yaml, markdown, junit\")\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 .option(\"--notify [target]\", \"Send webhook notification on completion (slack, discord, custom)\")\n .option(\"--ci\", \"Force CI mode (JSON output, no prompts, strict exit codes)\")\n .option(\"-j, --json\", \"Shorthand for --output json\")\n .option(\"--apps <csv>\", \"Comma-separated package names for multi-app operations\")\n .showSuggestionAfterError(false);\n\n const commandLoaders: Record<string, () => Promise<void>> = {\n auth: async () => {\n (await import(\"./commands/auth.js\")).registerAuthCommands(program);\n },\n config: async () => {\n (await import(\"./commands/config.js\")).registerConfigCommands(program);\n },\n doctor: async () => {\n (await import(\"./commands/doctor.js\")).registerDoctorCommand(program);\n },\n update: async () => {\n (await import(\"./commands/update.js\")).registerUpdateCommand(program);\n },\n docs: async () => {\n (await import(\"./commands/docs.js\")).registerDocsCommand(program);\n },\n changelog: async () => {\n (await import(\"./commands/changelog.js\")).registerChangelogCommand(program);\n },\n completion: async () => {\n (await import(\"./commands/completion.js\")).registerCompletionCommand(program, async () => {\n // Force-load every non-completion command so the introspection walker\n // sees the full tree (including plugins registered later in createProgram).\n await Promise.all(\n Object.entries(commandLoaders)\n .filter(([name]) => name !== \"completion\")\n .map(([, loader]) => loader()),\n );\n });\n },\n __complete: async () => {\n (await import(\"./commands/__complete.js\")).registerCompleteCommand(program);\n },\n apps: async () => {\n (await import(\"./commands/apps.js\")).registerAppsCommands(program);\n },\n releases: async () => {\n (await import(\"./commands/releases.js\")).registerReleasesCommands(program);\n },\n tracks: async () => {\n (await import(\"./commands/tracks.js\")).registerTracksCommands(program);\n },\n status: async () => {\n (await import(\"./commands/status.js\")).registerStatusCommand(program);\n },\n listings: async () => {\n (await import(\"./commands/listings.js\")).registerListingsCommands(program);\n },\n reviews: async () => {\n (await import(\"./commands/reviews.js\")).registerReviewsCommands(program);\n },\n vitals: async () => {\n (await import(\"./commands/vitals.js\")).registerVitalsCommands(program);\n },\n subscriptions: async () => {\n (await import(\"./commands/subscriptions.js\")).registerSubscriptionsCommands(program);\n },\n iap: async () => {\n (await import(\"./commands/iap.js\")).registerIapCommands(program);\n },\n purchases: async () => {\n (await import(\"./commands/purchases.js\")).registerPurchasesCommands(program);\n },\n pricing: async () => {\n (await import(\"./commands/pricing.js\")).registerPricingCommands(program);\n },\n reports: async () => {\n (await import(\"./commands/reports.js\")).registerReportsCommands(program);\n },\n users: async () => {\n (await import(\"./commands/users.js\")).registerUsersCommands(program);\n },\n testers: async () => {\n (await import(\"./commands/testers.js\")).registerTestersCommands(program);\n },\n validate: async () => {\n (await import(\"./commands/validate.js\")).registerValidateCommand(program);\n },\n publish: async () => {\n (await import(\"./commands/publish.js\")).registerPublishCommand(program);\n },\n recovery: async () => {\n (await import(\"./commands/recovery.js\")).registerRecoveryCommands(program);\n },\n \"data-safety\": async () => {\n (await import(\"./commands/data-safety.js\")).registerDataSafetyCommands(program);\n },\n \"external-transactions\": async () => {\n (await import(\"./commands/external-transactions.js\")).registerExternalTransactionsCommands(\n program,\n );\n },\n \"device-tiers\": async () => {\n (await import(\"./commands/device-tiers.js\")).registerDeviceTiersCommands(program);\n },\n \"one-time-products\": async () => {\n (await import(\"./commands/one-time-products.js\")).registerOneTimeProductsCommands(program);\n },\n \"internal-sharing\": async () => {\n (await import(\"./commands/internal-sharing.js\")).registerInternalSharingCommands(program);\n },\n \"generated-apks\": async () => {\n (await import(\"./commands/generated-apks.js\")).registerGeneratedApksCommands(program);\n },\n \"system-apks\": async () => {\n (await import(\"./commands/system-apks.js\")).registerSystemApksCommands(program);\n },\n \"purchase-options\": async () => {\n (await import(\"./commands/purchase-options.js\")).registerPurchaseOptionsCommands(program);\n },\n bundle: async () => {\n (await import(\"./commands/bundle.js\")).registerBundleCommands(program);\n },\n audit: async () => {\n (await import(\"./commands/audit.js\")).registerAuditCommands(program);\n },\n migrate: async () => {\n (await import(\"./commands/migrate.js\")).registerMigrateCommands(program);\n },\n anomalies: async () => {\n (await import(\"./commands/anomalies.js\")).registerAnomaliesCommands(program);\n },\n \"install-skills\": async () => {\n (await import(\"./commands/install-skills.js\")).registerInstallSkillsCommand(program);\n },\n verify: async () => {\n (await import(\"./commands/verify.js\")).registerVerifyCommand(program);\n },\n version: async () => {\n (await import(\"./commands/version.js\")).registerVersionCommand(program);\n },\n cache: async () => {\n (await import(\"./commands/cache.js\")).registerCacheCommand(program);\n },\n feedback: async () => {\n (await import(\"./commands/feedback.js\")).registerFeedbackCommand(program);\n },\n quickstart: async () => {\n (await import(\"./commands/quickstart.js\")).registerQuickstartCommand(program);\n },\n grants: async () => {\n (await import(\"./commands/grants.js\")).registerGrantsCommands(program);\n },\n train: async () => {\n (await import(\"./commands/train.js\")).registerTrainCommands(program);\n },\n quota: async () => {\n (await import(\"./commands/quota.js\")).registerQuotaCommand(program);\n },\n games: async () => {\n (await import(\"./commands/games.js\")).registerGamesCommands(program);\n },\n enterprise: async () => {\n (await import(\"./commands/enterprise.js\")).registerEnterpriseCommands(program);\n },\n diff: async () => {\n (await import(\"./commands/diff.js\")).registerDiffCommand(program);\n },\n init: async () => {\n (await import(\"./commands/init.js\")).registerInitCommand(program);\n },\n preflight: async () => {\n (await import(\"./commands/preflight.js\")).registerPreflightCommand(program);\n },\n plugins: async () => {\n registerPluginsCommand(program, pluginManager);\n },\n rtdn: async () => {\n (await import(\"./commands/rtdn.js\")).registerRtdnCommands(program);\n },\n };\n\n // \"Did you mean?\" suggestions for unknown commands\n function levenshtein(a: string, b: string): number {\n const m = a.length,\n n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, (_, i) =>\n Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)),\n );\n const cell = (r: number, c: number): number => dp[r]?.[c] ?? 0;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n (dp[i] as number[])[j] =\n a[i - 1] === b[j - 1]\n ? cell(i - 1, j - 1)\n : 1 + Math.min(cell(i - 1, j), cell(i, j - 1), cell(i - 1, j - 1));\n }\n }\n return cell(m, n);\n }\n\n program.on(\"command:*\", (operands: string[]) => {\n const cmd = operands[0] ?? \"\";\n const names = Object.keys(commandLoaders);\n const best = names\n .map((name) => ({ name, d: levenshtein(cmd, name) }))\n .sort((a, b) => a.d - b.d)[0];\n console.error(`Error: Unknown command \"${cmd}\".`);\n if (best && best.d <= 3) console.error(`Did you mean: gpc ${best.name}?`);\n console.error(`Run \"gpc --help\" to see all commands.`);\n process.exit(2);\n });\n\n // Resolve command aliases for lazy loading\n const commandAliases: Record<string, string> = {\n \"ext-txn\": \"external-transactions\",\n otp: \"one-time-products\",\n };\n\n const rawTarget = process.argv[2];\n const target = rawTarget ? (commandAliases[rawTarget] ?? rawTarget) : undefined;\n\n const loader = target ? commandLoaders[target] : undefined;\n if (loader) {\n await loader();\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 const REGISTRY_URL =\n \"https://raw.githubusercontent.com/yasserstudio/gpc-plugins/main/registry.json\";\n\n interface RegistryPlugin {\n name: string;\n description: string;\n version: string;\n author?: string;\n tags?: string[];\n }\n\n cmd\n .command(\"search [query]\")\n .description(\"Search the GPC plugin registry\")\n .action(async (query?: string) => {\n try {\n const res = await fetch(REGISTRY_URL);\n if (!res.ok) throw new Error(`Registry fetch failed: ${res.status}`);\n const plugins = (await res.json()) as RegistryPlugin[];\n const filtered = query\n ? plugins.filter(\n (p) =>\n p.name.includes(query) ||\n p.description?.toLowerCase().includes(query.toLowerCase()),\n )\n : plugins;\n\n if (filtered.length === 0) {\n console.log(`No plugins found${query ? ` matching \"${query}\"` : \"\"}.`);\n return;\n }\n\n for (const p of filtered) {\n console.log(` ${p.name}@${p.version}`);\n if (p.description) console.log(` ${p.description}`);\n }\n console.log(`\\nInstall: gpc plugins install <name>`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n cmd\n .command(\"install <name>\")\n .description(\"Install a plugin from npm\")\n .action(async (name: string) => {\n const { spawnSync } = await import(\"node:child_process\");\n console.log(`Installing plugin \"${name}\"...`);\n try {\n // Use spawnSync with an array to avoid shell injection — no shell is invoked\n const result = spawnSync(\"npm\", [\"install\", \"-g\", name], { stdio: \"inherit\" });\n if (result.status !== 0) {\n throw new Error(`npm install exited with code ${result.status ?? \"unknown\"}`);\n }\n const { approvePlugin } = await import(\"@gpc-cli/config\");\n await approvePlugin(name);\n console.log(`\\nPlugin \"${name}\" installed and approved. It will be loaded on next run.`);\n console.log(`Configure it in .gpcrc.json: { \"plugins\": [\"${name}\"] }`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n cmd\n .command(\"uninstall <name>\")\n .description(\"Uninstall a plugin and revoke its approval\")\n .action(async (name: string) => {\n const { spawnSync } = await import(\"node:child_process\");\n console.log(`Uninstalling plugin \"${name}\"...`);\n try {\n // Use spawnSync with an array to avoid shell injection — no shell is invoked\n const result = spawnSync(\"npm\", [\"uninstall\", \"-g\", name], { stdio: \"inherit\" });\n if (result.status !== 0) {\n throw new Error(`npm uninstall exited with code ${result.status ?? \"unknown\"}`);\n }\n const { revokePluginApproval } = await import(\"@gpc-cli/config\");\n await revokePluginApproval(name);\n console.log(`\\nPlugin \"${name}\" uninstalled and approval revoked.`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\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 unknown as Record<string, unknown>)[\"__pluginEvent\"] = event;\n\n await manager.runBeforeCommand(event);\n });\n\n program.hook(\"postAction\", async (thisCommand) => {\n const event: CommandEvent = (thisCommand as unknown as Record<string, unknown>)[\n \"__pluginEvent\"\n ] as CommandEvent;\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","/**\n * Shared error formatting for CLI output.\n * Extracts error code, message, and suggestion from typed errors (GpcError, AuthError, ApiError, ConfigError).\n */\n\ninterface TypedError {\n message: string;\n code?: string;\n suggestion?: string;\n exitCode?: number;\n /** When true, error handler prints nothing (e.g., user-aborted operations). */\n silent?: boolean;\n}\n\nfunction isTypedError(error: unknown): error is Error & TypedError {\n return (\n error instanceof Error && \"code\" in error && typeof (error as TypedError).code === \"string\"\n );\n}\n\nconst AUTH_KEYWORDS = [\"AUTH\", \"UNAUTHENTICATED\", \"PERMISSION_DENIED\", \"401\", \"403\"];\n\nfunction isAuthRelatedError(error: unknown): boolean {\n if (isTypedError(error)) {\n // Update errors hit GitHub, not Google Play — never an auth issue\n if (error.code?.startsWith(\"UPDATE_\")) return false;\n if (error.exitCode === 3) return true;\n if (error.code && AUTH_KEYWORDS.some((k) => error.code?.includes(k))) return true;\n }\n const msg = error instanceof Error ? error.message : String(error);\n return AUTH_KEYWORDS.some((k) => msg.includes(k));\n}\n\n/**\n * Format an error for CLI output. Prints:\n * Error [CODE]: message\n * Suggestion: suggestion (if available)\n *\n * Returns the appropriate exit code.\n */\nexport function handleCliError(error: unknown): number {\n // Silent errors (e.g., user abort) — don't print anything\n if (isTypedError(error) && error.silent) {\n return error.exitCode ?? 0;\n }\n\n const authHint = isAuthRelatedError(error)\n ? \"\\n\\u2192 Run gpc doctor to diagnose your credentials.\"\n : \"\";\n\n if (isTypedError(error)) {\n console.error(`Error [${error.code}]: ${error.message}`);\n if (error.suggestion) {\n console.error(`Suggestion: ${error.suggestion}`);\n }\n if (authHint) console.error(authHint);\n return error.exitCode ?? 1;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n if (authHint) console.error(authHint);\n return 1;\n}\n"],"mappings":"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","names":["loader","_"]}
|