@gpc-cli/cli 0.9.63 → 0.9.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +19 -15
  2. package/dist/{__complete-QFD3SUAO.js → __complete-AZXI2O25.js} +2 -4
  3. package/dist/__complete-AZXI2O25.js.map +1 -0
  4. package/dist/{audit-M7GYID74.js → audit-BDPS5ODN.js} +4 -4
  5. package/dist/bin.js +2 -2
  6. package/dist/{changelog-MPBEELTH.js → changelog-STYBBYDC.js} +70 -6
  7. package/dist/changelog-STYBBYDC.js.map +1 -0
  8. package/dist/{chunk-QXXXY5CO.js → chunk-DQD2S5QH.js} +29 -29
  9. package/dist/{completion-4I3IJK3M.js → completion-ZK7RPPFD.js} +7 -3
  10. package/dist/{completion-4I3IJK3M.js.map → completion-ZK7RPPFD.js.map} +1 -1
  11. package/dist/{config-JMLIMKYJ.js → config-7TY5HS4Z.js} +5 -5
  12. package/dist/docs-OU6LSSJD.js +387 -0
  13. package/dist/docs-OU6LSSJD.js.map +1 -0
  14. package/dist/{doctor-2R7WLRD4.js → doctor-BSUL4C2Q.js} +5 -5
  15. package/dist/{enterprise-SIKXDT64.js → enterprise-L7DTIX2O.js} +4 -4
  16. package/dist/{external-transactions-JL3G4IG5.js → external-transactions-BP42CK3H.js} +4 -4
  17. package/dist/{feedback-MLQTM5EB.js → feedback-X5BBSC5I.js} +2 -2
  18. package/dist/generated/docs-bundle.json +1 -0
  19. package/dist/{grants-UHNBPIFD.js → grants-32DED5QL.js} +4 -4
  20. package/dist/{iap-ETOL7OAC.js → iap-EPJ76IAC.js} +4 -4
  21. package/dist/index.js +1 -1
  22. package/dist/{init-6CCSVJC2.js → init-OCBFI4VH.js} +6 -6
  23. package/dist/{listings-2Z6DSO3D.js → listings-QKRIVZG6.js} +6 -6
  24. package/dist/{one-time-products-Y5RNIPV2.js → one-time-products-OIDBVCFE.js} +4 -4
  25. package/dist/{publish-5HZAJEDZ.js → publish-H2IAOKP7.js} +4 -4
  26. package/dist/{purchases-AHWGLW6V.js → purchases-GFLYTKR3.js} +4 -4
  27. package/dist/{recovery-B7DZQ6XG.js → recovery-2VJJLAIQ.js} +4 -4
  28. package/dist/{releases-XY57V22L.js → releases-RTF5NPTD.js} +4 -4
  29. package/dist/{reviews-P4M6BEJI.js → reviews-GZ2VOIRN.js} +4 -4
  30. package/dist/{subscriptions-GTVJB4HX.js → subscriptions-JPHFBREY.js} +4 -4
  31. package/dist/{system-apks-L6M7QYB3.js → system-apks-KWTN5LHO.js} +4 -4
  32. package/dist/{testers-FGLBJAXL.js → testers-7ILUCKYB.js} +4 -4
  33. package/dist/{train-D2NKUW3M.js → train-G44NEK43.js} +4 -4
  34. package/dist/{update-MHWSESO4.js → update-POERCYHW.js} +2 -2
  35. package/dist/{users-FOMAT7DY.js → users-W66YCFDX.js} +4 -4
  36. package/dist/{version-ZHOZKZ2I.js → version-2HT32CYP.js} +2 -2
  37. package/package.json +5 -3
  38. package/dist/__complete-QFD3SUAO.js.map +0 -1
  39. package/dist/changelog-MPBEELTH.js.map +0 -1
  40. package/dist/docs-GP6AEX4N.js +0 -115
  41. package/dist/docs-GP6AEX4N.js.map +0 -1
  42. /package/dist/{audit-M7GYID74.js.map → audit-BDPS5ODN.js.map} +0 -0
  43. /package/dist/{chunk-QXXXY5CO.js.map → chunk-DQD2S5QH.js.map} +0 -0
  44. /package/dist/{config-JMLIMKYJ.js.map → config-7TY5HS4Z.js.map} +0 -0
  45. /package/dist/{doctor-2R7WLRD4.js.map → doctor-BSUL4C2Q.js.map} +0 -0
  46. /package/dist/{enterprise-SIKXDT64.js.map → enterprise-L7DTIX2O.js.map} +0 -0
  47. /package/dist/{external-transactions-JL3G4IG5.js.map → external-transactions-BP42CK3H.js.map} +0 -0
  48. /package/dist/{feedback-MLQTM5EB.js.map → feedback-X5BBSC5I.js.map} +0 -0
  49. /package/dist/{grants-UHNBPIFD.js.map → grants-32DED5QL.js.map} +0 -0
  50. /package/dist/{iap-ETOL7OAC.js.map → iap-EPJ76IAC.js.map} +0 -0
  51. /package/dist/{init-6CCSVJC2.js.map → init-OCBFI4VH.js.map} +0 -0
  52. /package/dist/{listings-2Z6DSO3D.js.map → listings-QKRIVZG6.js.map} +0 -0
  53. /package/dist/{one-time-products-Y5RNIPV2.js.map → one-time-products-OIDBVCFE.js.map} +0 -0
  54. /package/dist/{publish-5HZAJEDZ.js.map → publish-H2IAOKP7.js.map} +0 -0
  55. /package/dist/{purchases-AHWGLW6V.js.map → purchases-GFLYTKR3.js.map} +0 -0
  56. /package/dist/{recovery-B7DZQ6XG.js.map → recovery-2VJJLAIQ.js.map} +0 -0
  57. /package/dist/{releases-XY57V22L.js.map → releases-RTF5NPTD.js.map} +0 -0
  58. /package/dist/{reviews-P4M6BEJI.js.map → reviews-GZ2VOIRN.js.map} +0 -0
  59. /package/dist/{subscriptions-GTVJB4HX.js.map → subscriptions-JPHFBREY.js.map} +0 -0
  60. /package/dist/{system-apks-L6M7QYB3.js.map → system-apks-KWTN5LHO.js.map} +0 -0
  61. /package/dist/{testers-FGLBJAXL.js.map → testers-7ILUCKYB.js.map} +0 -0
  62. /package/dist/{train-D2NKUW3M.js.map → train-G44NEK43.js.map} +0 -0
  63. /package/dist/{update-MHWSESO4.js.map → update-POERCYHW.js.map} +0 -0
  64. /package/dist/{users-FOMAT7DY.js.map → users-W66YCFDX.js.map} +0 -0
  65. /package/dist/{version-ZHOZKZ2I.js.map → version-2HT32CYP.js.map} +0 -0
@@ -0,0 +1,387 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ bold,
4
+ dim,
5
+ gray,
6
+ green,
7
+ yellow
8
+ } from "./chunk-FAN4ZITI.js";
9
+ import {
10
+ getOutputFormat
11
+ } from "./chunk-ELXAK7GI.js";
12
+
13
+ // src/commands/docs.ts
14
+ import * as cp from "child_process";
15
+ import { readFile, writeFile } from "fs/promises";
16
+ import { join, dirname } from "path";
17
+ import { existsSync, readFileSync } from "fs";
18
+ import { fileURLToPath } from "url";
19
+
20
+ // src/docs-renderer.ts
21
+ function renderMarkdown(content) {
22
+ const lines = content.split("\n");
23
+ const out = [];
24
+ let inCodeBlock = false;
25
+ for (const line of lines) {
26
+ if (line.startsWith("```")) {
27
+ inCodeBlock = !inCodeBlock;
28
+ if (inCodeBlock) {
29
+ out.push(dim(" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
30
+ } else {
31
+ out.push(dim(" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
32
+ }
33
+ continue;
34
+ }
35
+ if (inCodeBlock) {
36
+ out.push(dim(` \u2502 ${line}`));
37
+ continue;
38
+ }
39
+ const h1 = line.match(/^# (.+)$/);
40
+ if (h1) {
41
+ out.push("");
42
+ out.push(bold(green(` ${h1[1]}`)));
43
+ out.push(green(" " + "\u2500".repeat(h1[1].length)));
44
+ out.push("");
45
+ continue;
46
+ }
47
+ const h2 = line.match(/^## (.+)$/);
48
+ if (h2) {
49
+ out.push("");
50
+ out.push(bold(yellow(` ${h2[1]}`)));
51
+ out.push("");
52
+ continue;
53
+ }
54
+ const h3 = line.match(/^### (.+)$/);
55
+ if (h3) {
56
+ out.push(bold(` ${h3[1]}`));
57
+ continue;
58
+ }
59
+ if (line.startsWith("> ")) {
60
+ out.push(dim(` \u2502 ${renderInline(line.slice(2))}`));
61
+ continue;
62
+ }
63
+ if (line.startsWith("|")) {
64
+ if (line.match(/^\|[\s-|]+\|$/)) {
65
+ out.push(gray(" " + "\u2500".repeat(Math.min(line.length, 60))));
66
+ continue;
67
+ }
68
+ const cells = line.split("|").filter(Boolean).map((c) => c.trim());
69
+ out.push(" " + cells.join(" "));
70
+ continue;
71
+ }
72
+ if (line.match(/^\s*[-*]\s/)) {
73
+ out.push(` ${renderInline(line)}`);
74
+ continue;
75
+ }
76
+ if (line.match(/^\s*\d+\.\s/)) {
77
+ out.push(` ${renderInline(line)}`);
78
+ continue;
79
+ }
80
+ out.push(` ${renderInline(line)}`);
81
+ }
82
+ if (inCodeBlock) {
83
+ out.push(dim(" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
84
+ }
85
+ return out.join("\n");
86
+ }
87
+ function renderInline(text) {
88
+ let result = text.replace(/\*\*(.+?)\*\*/g, (_, t) => bold(t));
89
+ result = result.replace(/`([^`]+)`/g, (_, t) => dim(t));
90
+ result = result.replace(
91
+ /\[([^\]]+)\]\(([^)]+)\)/g,
92
+ (_, label, url) => `${label} ${dim(`(${url})`)}`
93
+ );
94
+ return result;
95
+ }
96
+ function formatSearchResult(slug, title, snippet, score) {
97
+ const header = bold(slug) + dim(` (score: ${score})`);
98
+ const titleLine = ` ${title}`;
99
+ const snippetLines = snippet.split("\n").slice(0, 3).map((l) => gray(` ${l.trim()}`)).join("\n");
100
+ return `${header}
101
+ ${titleLine}
102
+ ${snippetLines}`;
103
+ }
104
+
105
+ // src/commands/docs.ts
106
+ import { loadConfig } from "@gpc-cli/config";
107
+ import { formatOutput, GpcError } from "@gpc-cli/core";
108
+ var _bundle;
109
+ var _pageMap;
110
+ function getBundle() {
111
+ if (!_bundle) {
112
+ const moduleDir = dirname(fileURLToPath(import.meta.url));
113
+ const candidates = [
114
+ join(moduleDir, "..", "generated", "docs-bundle.json"),
115
+ join(moduleDir, "generated", "docs-bundle.json")
116
+ ];
117
+ const bundlePath = candidates.find((p) => existsSync(p));
118
+ if (!bundlePath) {
119
+ throw new GpcError(
120
+ "Embedded docs bundle not found. Run the build first.",
121
+ "DOCS_BUNDLE_MISSING",
122
+ 1,
123
+ "Run: pnpm build --filter @gpc-cli/cli"
124
+ );
125
+ }
126
+ _bundle = JSON.parse(readFileSync(bundlePath, "utf-8"));
127
+ }
128
+ return _bundle;
129
+ }
130
+ function getPageMap() {
131
+ if (!_pageMap) {
132
+ const bundle = getBundle();
133
+ _pageMap = /* @__PURE__ */ new Map();
134
+ for (const page of bundle.pages) {
135
+ _pageMap.set(page.slug, page);
136
+ }
137
+ }
138
+ return _pageMap;
139
+ }
140
+ function fuzzyMatch(query, pages) {
141
+ const q = query.toLowerCase();
142
+ const exact = pages.find((p) => p.slug === q);
143
+ if (exact) return exact;
144
+ const byName = pages.find((p) => p.slug.endsWith(`/${q}`));
145
+ if (byName) return byName;
146
+ const prefix = pages.find((p) => {
147
+ const name = p.slug.split("/").pop() || "";
148
+ return name.startsWith(q);
149
+ });
150
+ if (prefix) return prefix;
151
+ const contains = pages.find((p) => p.slug.includes(q));
152
+ if (contains) return contains;
153
+ const titleMatch = pages.find((p) => p.title.toLowerCase().includes(q));
154
+ if (titleMatch) return titleMatch;
155
+ return void 0;
156
+ }
157
+ function searchPages(query, bundle) {
158
+ const words = query.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").split(/\s+/).filter((w) => w.length > 2);
159
+ if (words.length === 0) return [];
160
+ const pageMap = getPageMap();
161
+ const scores = /* @__PURE__ */ new Map();
162
+ for (const word of words) {
163
+ const entries = bundle.searchIndex[word];
164
+ if (!entries) continue;
165
+ for (const entry of entries) {
166
+ scores.set(entry.slug, (scores.get(entry.slug) || 0) + entry.score);
167
+ }
168
+ }
169
+ const results = [];
170
+ for (const [slug, score] of scores) {
171
+ const page = pageMap.get(slug);
172
+ if (!page) continue;
173
+ const snippet = extractSnippet(page.content, words);
174
+ results.push({ page, score, snippet });
175
+ }
176
+ results.sort((a, b) => b.score - a.score);
177
+ return results.slice(0, 15);
178
+ }
179
+ function extractSnippet(content, words) {
180
+ const lines = content.split("\n");
181
+ for (let i = 0; i < lines.length; i++) {
182
+ const lower = lines[i].toLowerCase();
183
+ if (words.some((w) => lower.includes(w))) {
184
+ const start = Math.max(0, i - 1);
185
+ const end = Math.min(lines.length, i + 2);
186
+ return lines.slice(start, end).join("\n");
187
+ }
188
+ }
189
+ return lines.slice(0, 3).join("\n");
190
+ }
191
+ var DOCS_BASE = "https://yasserstudio.github.io/gpc/";
192
+ function openInBrowser(url) {
193
+ const platform = process.platform;
194
+ if (platform === "win32") {
195
+ cp.exec(`start "" "${url}"`, (error) => {
196
+ if (error) console.log(`Open in your browser: ${url}`);
197
+ });
198
+ } else {
199
+ const cmd = platform === "darwin" ? "open" : "xdg-open";
200
+ cp.execFile(cmd, [url], (error) => {
201
+ if (error) console.log(`Open in your browser: ${url}`);
202
+ });
203
+ }
204
+ }
205
+ function registerDocsCommand(program) {
206
+ const docs = program.command("docs").description("Access embedded documentation (list, show, search, init, web)");
207
+ docs.command("list").description("List all available documentation topics").action(async () => {
208
+ const config = await loadConfig();
209
+ const format = getOutputFormat(program, config);
210
+ const bundle = getBundle();
211
+ if (format === "json") {
212
+ const data = bundle.pages.map((p) => ({
213
+ slug: p.slug,
214
+ section: p.section,
215
+ title: p.title,
216
+ description: p.description
217
+ }));
218
+ console.log(formatOutput(data, "json"));
219
+ return;
220
+ }
221
+ const bySection = /* @__PURE__ */ new Map();
222
+ for (const page of bundle.pages) {
223
+ if (!bySection.has(page.section)) bySection.set(page.section, []);
224
+ bySection.get(page.section).push(page);
225
+ }
226
+ for (const [section, pages] of bySection) {
227
+ console.log(bold(`
228
+ ${section.toUpperCase()}`));
229
+ for (const page of pages) {
230
+ const label = page.slug.padEnd(36);
231
+ console.log(` ${label} ${dim(page.title || page.slug)}`);
232
+ }
233
+ }
234
+ console.log("");
235
+ console.log(dim(` ${bundle.pageCount} topics. Use: gpc docs show <topic>`));
236
+ });
237
+ docs.command("show <topic>").description("Show a documentation page in the terminal").action(async (topic) => {
238
+ const config = await loadConfig();
239
+ const format = getOutputFormat(program, config);
240
+ const bundle = getBundle();
241
+ const page = fuzzyMatch(topic, bundle.pages);
242
+ if (!page) {
243
+ const suggestions = bundle.pages.filter((p) => p.slug.includes(topic.toLowerCase().slice(0, 3))).slice(0, 5).map((p) => p.slug);
244
+ throw new GpcError(
245
+ `No documentation found for "${topic}"`,
246
+ "DOCS_NOT_FOUND",
247
+ 2,
248
+ suggestions.length > 0 ? `Did you mean: ${suggestions.join(", ")}?
249
+ Run: gpc docs list` : "Run: gpc docs list"
250
+ );
251
+ }
252
+ if (format === "json") {
253
+ console.log(
254
+ formatOutput(
255
+ { slug: page.slug, section: page.section, title: page.title, content: page.content },
256
+ "json"
257
+ )
258
+ );
259
+ return;
260
+ }
261
+ console.log(renderMarkdown(page.content));
262
+ });
263
+ docs.command("search <query>").description("Search documentation").action(async (query) => {
264
+ const config = await loadConfig();
265
+ const format = getOutputFormat(program, config);
266
+ const bundle = getBundle();
267
+ const results = searchPages(query, bundle);
268
+ if (results.length === 0) {
269
+ console.log(dim(` No results for "${query}".`));
270
+ console.log(dim(" Try a different search term, or: gpc docs list"));
271
+ return;
272
+ }
273
+ if (format === "json") {
274
+ const data = results.map((r) => ({
275
+ slug: r.page.slug,
276
+ section: r.page.section,
277
+ title: r.page.title,
278
+ score: r.score
279
+ }));
280
+ console.log(formatOutput(data, "json"));
281
+ return;
282
+ }
283
+ console.log(bold(`
284
+ Search results for "${query}"
285
+ `));
286
+ for (const r of results) {
287
+ console.log(" " + formatSearchResult(r.page.slug, r.page.title, r.snippet, r.score));
288
+ console.log("");
289
+ }
290
+ console.log(
291
+ dim(
292
+ ` ${results.length} result${results.length === 1 ? "" : "s"}. Use: gpc docs show <topic>`
293
+ )
294
+ );
295
+ });
296
+ docs.command("init").description("Create GPC.md quick-reference for AI agents in this directory").option("--force", "Overwrite existing GPC.md").option("--path <dir>", "Output directory", ".").action(async (opts) => {
297
+ const outDir = opts.path;
298
+ const outFile = join(outDir, "GPC.md");
299
+ if (existsSync(outFile) && !opts.force) {
300
+ throw new GpcError(
301
+ `GPC.md already exists at ${outFile}`,
302
+ "DOCS_INIT_EXISTS",
303
+ 1,
304
+ "Use --force to overwrite."
305
+ );
306
+ }
307
+ const bundle = getBundle();
308
+ const content = generateQuickReference(bundle);
309
+ await writeFile(outFile, content, "utf-8");
310
+ console.log(`Created ${outFile} (${bundle.pageCount} topics indexed)`);
311
+ for (const agentFile of ["CLAUDE.md", "AGENTS.md"]) {
312
+ const agentPath = join(outDir, agentFile);
313
+ if (existsSync(agentPath)) {
314
+ const existing = await readFile(agentPath, "utf-8");
315
+ if (!existing.includes("GPC.md")) {
316
+ const separator = existing.endsWith("\n") ? "\n" : "\n\n";
317
+ await writeFile(
318
+ agentPath,
319
+ existing + separator + "See also: @GPC.md for GPC CLI reference.\n",
320
+ "utf-8"
321
+ );
322
+ console.log(`Updated ${agentPath} (added @GPC.md reference)`);
323
+ }
324
+ }
325
+ }
326
+ });
327
+ docs.command("web [topic]").description("Open documentation in browser").action((topic) => {
328
+ const bundle = getBundle();
329
+ if (!topic) {
330
+ openInBrowser(DOCS_BASE);
331
+ return;
332
+ }
333
+ const page = fuzzyMatch(topic, bundle.pages);
334
+ if (page) {
335
+ openInBrowser(`${DOCS_BASE}${page.slug}`);
336
+ } else {
337
+ openInBrowser(DOCS_BASE);
338
+ console.log(dim(`Topic "${topic}" not found. Opened docs home page.`));
339
+ }
340
+ });
341
+ }
342
+ function generateQuickReference(bundle) {
343
+ const lines = [
344
+ "# GPC Quick Reference",
345
+ "",
346
+ "> Auto-generated by `gpc docs init`. See full docs: https://yasserstudio.github.io/gpc/",
347
+ "",
348
+ "## Commands",
349
+ ""
350
+ ];
351
+ const commandPages = bundle.pages.filter((p) => p.section === "commands").sort((a, b) => a.slug.localeCompare(b.slug));
352
+ for (const page of commandPages) {
353
+ const desc = page.description || page.title;
354
+ lines.push(`- **gpc ${page.slug}** -- ${desc}`);
355
+ }
356
+ lines.push("", "## Guides", "");
357
+ const guidePages = bundle.pages.filter((p) => p.section === "guide").sort((a, b) => a.slug.localeCompare(b.slug));
358
+ for (const page of guidePages) {
359
+ lines.push(`- **${page.title || page.slug}** -- \`gpc docs show ${page.slug}\``);
360
+ }
361
+ lines.push(
362
+ "",
363
+ "## Quick Workflows",
364
+ "",
365
+ "```bash",
366
+ "# Upload and publish",
367
+ "gpc publish app.aab",
368
+ "",
369
+ "# Check vitals before release",
370
+ "gpc preflight app.aab",
371
+ "",
372
+ "# Generate changelog with AI translation",
373
+ "gpc changelog generate --target play-store --locales auto --ai",
374
+ "",
375
+ "# Staged rollout",
376
+ "gpc releases rollout --fraction 0.1 --app com.example.app",
377
+ "```",
378
+ "",
379
+ `*${bundle.pageCount} docs pages available offline via \`gpc docs show <topic>\`*`,
380
+ ""
381
+ );
382
+ return lines.join("\n");
383
+ }
384
+ export {
385
+ registerDocsCommand
386
+ };
387
+ //# sourceMappingURL=docs-OU6LSSJD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/docs.ts","../src/docs-renderer.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport * as cp from \"node:child_process\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { renderMarkdown, formatSearchResult } from \"../docs-renderer.js\";\nimport { bold, dim } from \"../colors.js\";\nimport { getOutputFormat } from \"../format.js\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { formatOutput, GpcError } from \"@gpc-cli/core\";\nimport type { DocPage, DocsBundle } from \"../generated/docs-types.js\";\n\nlet _bundle: DocsBundle | undefined;\nlet _pageMap: Map<string, DocPage> | undefined;\n\nfunction getBundle(): DocsBundle {\n if (!_bundle) {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n // Works from src/commands/ (dev/test) and dist/ (built output)\n const candidates = [\n join(moduleDir, \"..\", \"generated\", \"docs-bundle.json\"),\n join(moduleDir, \"generated\", \"docs-bundle.json\"),\n ];\n const bundlePath = candidates.find((p) => existsSync(p));\n if (!bundlePath) {\n throw new GpcError(\n \"Embedded docs bundle not found. Run the build first.\",\n \"DOCS_BUNDLE_MISSING\",\n 1,\n \"Run: pnpm build --filter @gpc-cli/cli\",\n );\n }\n _bundle = JSON.parse(readFileSync(bundlePath, \"utf-8\")) as DocsBundle;\n }\n return _bundle;\n}\n\nfunction getPageMap(): Map<string, DocPage> {\n if (!_pageMap) {\n const bundle = getBundle();\n _pageMap = new Map<string, DocPage>();\n for (const page of bundle.pages) {\n _pageMap.set(page.slug, page);\n }\n }\n return _pageMap;\n}\n\nfunction fuzzyMatch(query: string, pages: DocPage[]): DocPage | undefined {\n const q = query.toLowerCase();\n // Exact full slug match (e.g., \"guide/authentication\")\n const exact = pages.find((p) => p.slug === q);\n if (exact) return exact;\n // Match on the filename part (e.g., \"authentication\" matches \"guide/authentication\")\n const byName = pages.find((p) => p.slug.endsWith(`/${q}`));\n if (byName) return byName;\n // Prefix match on filename part\n const prefix = pages.find((p) => {\n const name = p.slug.split(\"/\").pop() || \"\";\n return name.startsWith(q);\n });\n if (prefix) return prefix;\n // Contains match anywhere in slug\n const contains = pages.find((p) => p.slug.includes(q));\n if (contains) return contains;\n // Title match\n const titleMatch = pages.find((p) => p.title.toLowerCase().includes(q));\n if (titleMatch) return titleMatch;\n return undefined;\n}\n\nfunction searchPages(\n query: string,\n bundle: DocsBundle,\n): { page: DocPage; score: number; snippet: string }[] {\n const words = query\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 2);\n\n if (words.length === 0) return [];\n\n const pageMap = getPageMap();\n const scores = new Map<string, number>();\n for (const word of words) {\n const entries = bundle.searchIndex[word];\n if (!entries) continue;\n for (const entry of entries) {\n scores.set(entry.slug, (scores.get(entry.slug) || 0) + entry.score);\n }\n }\n\n const results: { page: DocPage; score: number; snippet: string }[] = [];\n for (const [slug, score] of scores) {\n const page = pageMap.get(slug);\n if (!page) continue;\n const snippet = extractSnippet(page.content, words);\n results.push({ page, score, snippet });\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, 15);\n}\n\nfunction extractSnippet(content: string, words: string[]): string {\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const lower = lines[i]!.toLowerCase();\n if (words.some((w) => lower.includes(w))) {\n const start = Math.max(0, i - 1);\n const end = Math.min(lines.length, i + 2);\n return lines.slice(start, end).join(\"\\n\");\n }\n }\n return lines.slice(0, 3).join(\"\\n\");\n}\n\nconst DOCS_BASE = \"https://yasserstudio.github.io/gpc/\";\n\nfunction openInBrowser(url: string): void {\n const platform = process.platform;\n if (platform === \"win32\") {\n cp.exec(`start \"\" \"${url}\"`, (error) => {\n if (error) console.log(`Open in your browser: ${url}`);\n });\n } else {\n const cmd = platform === \"darwin\" ? \"open\" : \"xdg-open\";\n cp.execFile(cmd, [url], (error) => {\n if (error) console.log(`Open in your browser: ${url}`);\n });\n }\n}\n\nexport function registerDocsCommand(program: Command): void {\n const docs = program\n .command(\"docs\")\n .description(\"Access embedded documentation (list, show, search, init, web)\");\n\n docs\n .command(\"list\")\n .description(\"List all available documentation topics\")\n .action(async () => {\n const config = await loadConfig();\n const format = getOutputFormat(program, config);\n const bundle = getBundle();\n\n if (format === \"json\") {\n const data = bundle.pages.map((p) => ({\n slug: p.slug,\n section: p.section,\n title: p.title,\n description: p.description,\n }));\n console.log(formatOutput(data, \"json\"));\n return;\n }\n\n const bySection = new Map<string, DocPage[]>();\n for (const page of bundle.pages) {\n if (!bySection.has(page.section)) bySection.set(page.section, []);\n bySection.get(page.section)!.push(page);\n }\n\n for (const [section, pages] of bySection) {\n console.log(bold(`\\n ${section.toUpperCase()}`));\n for (const page of pages) {\n const label = page.slug.padEnd(36);\n console.log(` ${label} ${dim(page.title || page.slug)}`);\n }\n }\n console.log(\"\");\n console.log(dim(` ${bundle.pageCount} topics. Use: gpc docs show <topic>`));\n });\n\n docs\n .command(\"show <topic>\")\n .description(\"Show a documentation page in the terminal\")\n .action(async (topic: string) => {\n const config = await loadConfig();\n const format = getOutputFormat(program, config);\n const bundle = getBundle();\n\n const page = fuzzyMatch(topic, bundle.pages);\n if (!page) {\n const suggestions = bundle.pages\n .filter((p) => p.slug.includes(topic.toLowerCase().slice(0, 3)))\n .slice(0, 5)\n .map((p) => p.slug);\n\n throw new GpcError(\n `No documentation found for \"${topic}\"`,\n \"DOCS_NOT_FOUND\",\n 2,\n suggestions.length > 0\n ? `Did you mean: ${suggestions.join(\", \")}?\\nRun: gpc docs list`\n : \"Run: gpc docs list\",\n );\n }\n\n if (format === \"json\") {\n console.log(\n formatOutput(\n { slug: page.slug, section: page.section, title: page.title, content: page.content },\n \"json\",\n ),\n );\n return;\n }\n\n console.log(renderMarkdown(page.content));\n });\n\n docs\n .command(\"search <query>\")\n .description(\"Search documentation\")\n .action(async (query: string) => {\n const config = await loadConfig();\n const format = getOutputFormat(program, config);\n const bundle = getBundle();\n\n const results = searchPages(query, bundle);\n\n if (results.length === 0) {\n console.log(dim(` No results for \"${query}\".`));\n console.log(dim(\" Try a different search term, or: gpc docs list\"));\n return;\n }\n\n if (format === \"json\") {\n const data = results.map((r) => ({\n slug: r.page.slug,\n section: r.page.section,\n title: r.page.title,\n score: r.score,\n }));\n console.log(formatOutput(data, \"json\"));\n return;\n }\n\n console.log(bold(`\\n Search results for \"${query}\"\\n`));\n for (const r of results) {\n console.log(\" \" + formatSearchResult(r.page.slug, r.page.title, r.snippet, r.score));\n console.log(\"\");\n }\n console.log(\n dim(\n ` ${results.length} result${results.length === 1 ? \"\" : \"s\"}. Use: gpc docs show <topic>`,\n ),\n );\n });\n\n docs\n .command(\"init\")\n .description(\"Create GPC.md quick-reference for AI agents in this directory\")\n .option(\"--force\", \"Overwrite existing GPC.md\")\n .option(\"--path <dir>\", \"Output directory\", \".\")\n .action(async (opts: { force?: boolean; path: string }) => {\n const outDir = opts.path;\n const outFile = join(outDir, \"GPC.md\");\n\n if (existsSync(outFile) && !opts.force) {\n throw new GpcError(\n `GPC.md already exists at ${outFile}`,\n \"DOCS_INIT_EXISTS\",\n 1,\n \"Use --force to overwrite.\",\n );\n }\n\n const bundle = getBundle();\n const content = generateQuickReference(bundle);\n await writeFile(outFile, content, \"utf-8\");\n console.log(`Created ${outFile} (${bundle.pageCount} topics indexed)`);\n\n for (const agentFile of [\"CLAUDE.md\", \"AGENTS.md\"]) {\n const agentPath = join(outDir, agentFile);\n if (existsSync(agentPath)) {\n const existing = await readFile(agentPath, \"utf-8\");\n if (!existing.includes(\"GPC.md\")) {\n const separator = existing.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n await writeFile(\n agentPath,\n existing + separator + \"See also: @GPC.md for GPC CLI reference.\\n\",\n \"utf-8\",\n );\n console.log(`Updated ${agentPath} (added @GPC.md reference)`);\n }\n }\n }\n });\n\n docs\n .command(\"web [topic]\")\n .description(\"Open documentation in browser\")\n .action((topic?: string) => {\n const bundle = getBundle();\n if (!topic) {\n openInBrowser(DOCS_BASE);\n return;\n }\n const page = fuzzyMatch(topic, bundle.pages);\n if (page) {\n openInBrowser(`${DOCS_BASE}${page.slug}`);\n } else {\n openInBrowser(DOCS_BASE);\n console.log(dim(`Topic \"${topic}\" not found. Opened docs home page.`));\n }\n });\n}\n\nfunction generateQuickReference(bundle: DocsBundle): string {\n const lines: string[] = [\n \"# GPC Quick Reference\",\n \"\",\n \"> Auto-generated by `gpc docs init`. See full docs: https://yasserstudio.github.io/gpc/\",\n \"\",\n \"## Commands\",\n \"\",\n ];\n\n const commandPages = bundle.pages\n .filter((p) => p.section === \"commands\")\n .sort((a, b) => a.slug.localeCompare(b.slug));\n\n for (const page of commandPages) {\n const desc = page.description || page.title;\n lines.push(`- **gpc ${page.slug}** -- ${desc}`);\n }\n\n lines.push(\"\", \"## Guides\", \"\");\n\n const guidePages = bundle.pages\n .filter((p) => p.section === \"guide\")\n .sort((a, b) => a.slug.localeCompare(b.slug));\n\n for (const page of guidePages) {\n lines.push(`- **${page.title || page.slug}** -- \\`gpc docs show ${page.slug}\\``);\n }\n\n lines.push(\n \"\",\n \"## Quick Workflows\",\n \"\",\n \"```bash\",\n \"# Upload and publish\",\n \"gpc publish app.aab\",\n \"\",\n \"# Check vitals before release\",\n \"gpc preflight app.aab\",\n \"\",\n \"# Generate changelog with AI translation\",\n \"gpc changelog generate --target play-store --locales auto --ai\",\n \"\",\n \"# Staged rollout\",\n \"gpc releases rollout --fraction 0.1 --app com.example.app\",\n \"```\",\n \"\",\n `*${bundle.pageCount} docs pages available offline via \\`gpc docs show <topic>\\`*`,\n \"\",\n );\n\n return lines.join(\"\\n\");\n}\n","import { bold, dim, yellow, green, gray } from \"./colors.js\";\n\nexport function renderMarkdown(content: string): string {\n const lines = content.split(\"\\n\");\n const out: string[] = [];\n\n let inCodeBlock = false;\n\n for (const line of lines) {\n if (line.startsWith(\"```\")) {\n inCodeBlock = !inCodeBlock;\n if (inCodeBlock) {\n out.push(dim(\" ┌─────────────────────────────────────\"));\n } else {\n out.push(dim(\" └─────────────────────────────────────\"));\n }\n continue;\n }\n\n if (inCodeBlock) {\n out.push(dim(` │ ${line}`));\n continue;\n }\n\n // Headers\n const h1 = line.match(/^# (.+)$/);\n if (h1) {\n out.push(\"\");\n out.push(bold(green(` ${h1[1]!}`)));\n out.push(green(\" \" + \"─\".repeat(h1[1]!.length)));\n out.push(\"\");\n continue;\n }\n const h2 = line.match(/^## (.+)$/);\n if (h2) {\n out.push(\"\");\n out.push(bold(yellow(` ${h2[1]}`)));\n out.push(\"\");\n continue;\n }\n const h3 = line.match(/^### (.+)$/);\n if (h3) {\n out.push(bold(` ${h3[1]}`));\n continue;\n }\n\n // Blockquotes (converted from ::: containers)\n if (line.startsWith(\"> \")) {\n out.push(dim(` │ ${renderInline(line.slice(2))}`));\n continue;\n }\n\n // Table rows\n if (line.startsWith(\"|\")) {\n if (line.match(/^\\|[\\s-|]+\\|$/)) {\n out.push(gray(\" \" + \"─\".repeat(Math.min(line.length, 60))));\n continue;\n }\n const cells = line\n .split(\"|\")\n .filter(Boolean)\n .map((c) => c.trim());\n out.push(\" \" + cells.join(\" \"));\n continue;\n }\n\n // List items\n if (line.match(/^\\s*[-*]\\s/)) {\n out.push(` ${renderInline(line)}`);\n continue;\n }\n\n // Numbered list items\n if (line.match(/^\\s*\\d+\\.\\s/)) {\n out.push(` ${renderInline(line)}`);\n continue;\n }\n\n // Regular text\n out.push(` ${renderInline(line)}`);\n }\n\n // Close unclosed code block gracefully\n if (inCodeBlock) {\n out.push(dim(\" └─────────────────────────────────────\"));\n }\n\n return out.join(\"\\n\");\n}\n\nfunction renderInline(text: string): string {\n let result = text.replace(/\\*\\*(.+?)\\*\\*/g, (_, t) => bold(t));\n result = result.replace(/`([^`]+)`/g, (_, t) => dim(t));\n result = result.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n (_, label, url) => `${label} ${dim(`(${url})`)}`,\n );\n return result;\n}\n\nexport function formatSearchResult(\n slug: string,\n title: string,\n snippet: string,\n score: number,\n): string {\n const header = bold(slug) + dim(` (score: ${score})`);\n const titleLine = ` ${title}`;\n const snippetLines = snippet\n .split(\"\\n\")\n .slice(0, 3)\n .map((l) => gray(` ${l.trim()}`))\n .join(\"\\n\");\n return `${header}\\n${titleLine}\\n${snippetLines}`;\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ isNewerVersion
4
+ } from "./chunk-3SJ6OXCZ.js";
2
5
  import {
3
6
  green,
4
7
  red,
5
8
  yellow
6
9
  } from "./chunk-FAN4ZITI.js";
7
- import {
8
- isNewerVersion
9
- } from "./chunk-3SJ6OXCZ.js";
10
10
 
11
11
  // src/commands/doctor.ts
12
12
  import { loadConfig, getCacheDir, getConfigDir } from "@gpc-cli/config";
@@ -141,7 +141,7 @@ function checkCiEnvironment() {
141
141
  };
142
142
  }
143
143
  async function checkGpcVersion() {
144
- const currentVersion = "0.9.63";
144
+ const currentVersion = "0.9.65";
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-2R7WLRD4.js.map
803
+ //# sourceMappingURL=doctor-BSUL4C2Q.js.map
@@ -3,6 +3,9 @@ import {
3
3
  isDryRun,
4
4
  printDryRun
5
5
  } from "./chunk-Y3QZDAKS.js";
6
+ import {
7
+ requireConfirm
8
+ } from "./chunk-RZQSEDKI.js";
6
9
  import {
7
10
  bold,
8
11
  dim,
@@ -11,9 +14,6 @@ import {
11
14
  import {
12
15
  getOutputFormat
13
16
  } from "./chunk-ELXAK7GI.js";
14
- import {
15
- requireConfirm
16
- } from "./chunk-RZQSEDKI.js";
17
17
 
18
18
  // src/commands/enterprise.ts
19
19
  import { loadConfig } from "@gpc-cli/config";
@@ -216,4 +216,4 @@ function registerEnterpriseCommands(program) {
216
216
  export {
217
217
  registerEnterpriseCommands
218
218
  };
219
- //# sourceMappingURL=enterprise-SIKXDT64.js.map
219
+ //# sourceMappingURL=enterprise-L7DTIX2O.js.map
@@ -7,12 +7,12 @@ import {
7
7
  isDryRun,
8
8
  printDryRun
9
9
  } from "./chunk-Y3QZDAKS.js";
10
- import {
11
- getOutputFormat
12
- } from "./chunk-ELXAK7GI.js";
13
10
  import {
14
11
  requireConfirm
15
12
  } from "./chunk-RZQSEDKI.js";
13
+ import {
14
+ getOutputFormat
15
+ } from "./chunk-ELXAK7GI.js";
16
16
 
17
17
  // src/commands/external-transactions.ts
18
18
  import { loadConfig } from "@gpc-cli/config";
@@ -107,4 +107,4 @@ function registerExternalTransactionsCommands(program) {
107
107
  export {
108
108
  registerExternalTransactionsCommands
109
109
  };
110
- //# sourceMappingURL=external-transactions-JL3G4IG5.js.map
110
+ //# sourceMappingURL=external-transactions-BP42CK3H.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.63";
12
+ const version = "0.9.65";
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-MLQTM5EB.js.map
70
+ //# sourceMappingURL=feedback-X5BBSC5I.js.map