godmode 0.0.2 → 0.0.3
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/dist/{add-AJERMPEA.js → add-D74TIN3J.js} +12 -11
- package/dist/{chunk-EXWYJU2I.js → chunk-3AQ2CZKC.js} +5 -4
- package/dist/chunk-4EU5JX6C.js +160 -0
- package/dist/{chunk-GJCJO7YT.js → chunk-AWGLXW3B.js} +24 -11
- package/dist/{chunk-2J2VDCQ4.js → chunk-KHFZI7IA.js} +380 -138
- package/dist/chunk-SMQBMG24.js +102 -0
- package/dist/chunk-XFFBFBN6.js +16 -0
- package/dist/chunk-YDXTIN53.js +212 -0
- package/dist/chunk-ZTPILA7B.js +403 -0
- package/dist/dist-I5CEQ4AC.js +779 -0
- package/dist/ext-K4XEAZGS.js +102 -0
- package/dist/index.js +262 -1540
- package/dist/permissions-E4G66OUZ.js +125 -0
- package/dist/{prompt-SWOWWAOH.js → prompt-YPAZ5433.js} +12 -6
- package/dist/{server-4YVOAJJG.js → server-L3L4TKK3.js} +19 -2
- package/dist/settings-3FF5WWEY.js +17 -0
- package/package.json +10 -9
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
BUILTINS
|
|
4
|
+
} from "./chunk-KHFZI7IA.js";
|
|
5
|
+
import {
|
|
6
|
+
DIM,
|
|
7
|
+
HelpPage,
|
|
8
|
+
ITALIC,
|
|
9
|
+
RED,
|
|
10
|
+
RESET,
|
|
11
|
+
USE_COLOR
|
|
12
|
+
} from "./chunk-YDXTIN53.js";
|
|
13
|
+
|
|
14
|
+
// src/help.ts
|
|
15
|
+
import fuzzysort from "fuzzysort";
|
|
16
|
+
function buildTrie(routes) {
|
|
17
|
+
const root = { name: "", isParam: false, methods: [], children: [] };
|
|
18
|
+
for (const route of routes) {
|
|
19
|
+
let node = root;
|
|
20
|
+
for (const seg of route.segments) {
|
|
21
|
+
let child = node.children.find((c) => c.name === seg.value && c.isParam === seg.isParam);
|
|
22
|
+
if (!child) {
|
|
23
|
+
child = { name: seg.value, isParam: seg.isParam, methods: [], children: [] };
|
|
24
|
+
node.children.push(child);
|
|
25
|
+
}
|
|
26
|
+
node = child;
|
|
27
|
+
}
|
|
28
|
+
node.methods.push({ method: route.method, summary: route.summary });
|
|
29
|
+
}
|
|
30
|
+
return root;
|
|
31
|
+
}
|
|
32
|
+
function navigateTrie(root, segments) {
|
|
33
|
+
let node = root;
|
|
34
|
+
const fullPath = [];
|
|
35
|
+
const params = [];
|
|
36
|
+
for (const seg of segments) {
|
|
37
|
+
const staticChild = node.children.find((c) => !c.isParam && c.name === seg);
|
|
38
|
+
if (staticChild) {
|
|
39
|
+
fullPath.push(seg);
|
|
40
|
+
node = staticChild;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const paramChild = node.children.find((c) => c.isParam);
|
|
44
|
+
if (paramChild) {
|
|
45
|
+
const nested = paramChild.children.find((c) => !c.isParam && c.name === seg);
|
|
46
|
+
if (nested) {
|
|
47
|
+
fullPath.push(`<${paramChild.name}>`, seg);
|
|
48
|
+
params.push({ name: paramChild.name, provided: false });
|
|
49
|
+
node = nested;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
fullPath.push(seg);
|
|
53
|
+
params.push({ name: paramChild.name, provided: true, value: seg });
|
|
54
|
+
node = paramChild;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return { node, fullPath, params };
|
|
60
|
+
}
|
|
61
|
+
function getChildren(node) {
|
|
62
|
+
const statics = node.children.filter((c) => !c.isParam);
|
|
63
|
+
const params = node.children.filter((c) => c.isParam);
|
|
64
|
+
const result = [...statics];
|
|
65
|
+
for (const p of params) result.push(...p.children);
|
|
66
|
+
result.sort((a, b) => a.name.localeCompare(b.name));
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
var METHOD_LABEL = USE_COLOR ? {
|
|
70
|
+
get: "\x1B[1;38;5;34mGET\x1B[0m",
|
|
71
|
+
post: "\x1B[1;38;5;25mPOST\x1B[0m",
|
|
72
|
+
put: "\x1B[1;38;5;172mPUT\x1B[0m",
|
|
73
|
+
patch: "\x1B[1;38;5;30mPATCH\x1B[0m",
|
|
74
|
+
delete: "\x1B[1;38;5;160mDELETE\x1B[0m"
|
|
75
|
+
} : { get: "GET", post: "POST", put: "PUT", patch: "PATCH", delete: "DELETE" };
|
|
76
|
+
var INTERFACE_LABEL = {
|
|
77
|
+
api: "API",
|
|
78
|
+
graphql: "GraphQL",
|
|
79
|
+
mcp: "MCP",
|
|
80
|
+
skill: "Skill"
|
|
81
|
+
};
|
|
82
|
+
var titleCase = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
83
|
+
var ROOT_OPTION_ROWS = [
|
|
84
|
+
["-v, --version", "output version information and exit"]
|
|
85
|
+
];
|
|
86
|
+
var INTERFACE_OPTION_ROWS = [
|
|
87
|
+
["-H, --header <key:value>", "add a request header"],
|
|
88
|
+
["-A, --all", "list all resources"],
|
|
89
|
+
["-F, --filter <text>", "fuzzy-filter resources by name"],
|
|
90
|
+
["-X, --method <verb>", "filter resources by HTTP method"],
|
|
91
|
+
["-h, --help", "show help for this subcommand"],
|
|
92
|
+
["-v, --version", "show extension spec versions"]
|
|
93
|
+
];
|
|
94
|
+
function getParamName(node) {
|
|
95
|
+
return node.children.find((c) => c.isParam)?.name || null;
|
|
96
|
+
}
|
|
97
|
+
function methodLabels(node) {
|
|
98
|
+
const methods = /* @__PURE__ */ new Set();
|
|
99
|
+
for (const ep of node.methods) methods.add(ep.method);
|
|
100
|
+
const paramChild = node.children.find((c) => c.isParam);
|
|
101
|
+
if (paramChild) for (const ep of paramChild.methods) methods.add(ep.method);
|
|
102
|
+
const order = ["get", "post", "put", "patch", "delete"];
|
|
103
|
+
return order.filter((m) => methods.has(m)).map((m) => METHOD_LABEL[m]).join(" ");
|
|
104
|
+
}
|
|
105
|
+
var RootHelp = class extends HelpPage {
|
|
106
|
+
tagline() {
|
|
107
|
+
return "A control surface of agentic I/O.";
|
|
108
|
+
}
|
|
109
|
+
usage() {
|
|
110
|
+
return [
|
|
111
|
+
"godmode <extension> [args]...",
|
|
112
|
+
"godmode <extension> <interface> [args]..."
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
sections() {
|
|
116
|
+
return [
|
|
117
|
+
{ title: "Built-in extensions:", rows: [...BUILTINS].map(([slug, b]) => [slug, b.description]) },
|
|
118
|
+
{ title: "Options:", rows: ROOT_OPTION_ROWS }
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
footer() {
|
|
122
|
+
return {
|
|
123
|
+
extras: [
|
|
124
|
+
'Run "godmode ext list" to see installed extensions.',
|
|
125
|
+
'Run "godmode <extension> --help" for extension-specific usage.'
|
|
126
|
+
],
|
|
127
|
+
reportBugs: "https://github.com/tomsiwik/godmode/issues",
|
|
128
|
+
homepage: "https://godmode.so"
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
var ExtHelp = class extends HelpPage {
|
|
133
|
+
tagline() {
|
|
134
|
+
return "Install, inspect, and manage godmode extensions.";
|
|
135
|
+
}
|
|
136
|
+
usage() {
|
|
137
|
+
return ["godmode ext <command> [args]"];
|
|
138
|
+
}
|
|
139
|
+
sections() {
|
|
140
|
+
return [
|
|
141
|
+
{ title: "Commands:", rows: [
|
|
142
|
+
["install <name|folder>", "Install an extension"],
|
|
143
|
+
["uninstall <name>", "Uninstall an extension"],
|
|
144
|
+
["update <name>", "Re-fetch spec, rebuild routes"],
|
|
145
|
+
["list", "Show installed extensions"],
|
|
146
|
+
["create", "Interactive manifest wizard"]
|
|
147
|
+
] },
|
|
148
|
+
{ title: "Options:", rows: [
|
|
149
|
+
["-g, --global", "Apply to ~/.godmode (default: <cwd>/.godmode)"]
|
|
150
|
+
] }
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
var ExtensionOverview = class extends HelpPage {
|
|
155
|
+
constructor(multi) {
|
|
156
|
+
super();
|
|
157
|
+
this.multi = multi;
|
|
158
|
+
}
|
|
159
|
+
multi;
|
|
160
|
+
title() {
|
|
161
|
+
return titleCase(this.multi.name || this.multi.slug);
|
|
162
|
+
}
|
|
163
|
+
usage() {
|
|
164
|
+
const declared = Object.keys(this.multi.interfaces);
|
|
165
|
+
const args = (iface) => iface === "mcp" ? " <tool> [args]" : iface === "graphql" ? " <query> [flags]" : " <method> <resource> [id] [flags]";
|
|
166
|
+
return declared.map((iface) => `godmode ${this.multi.slug} ${iface}${args(iface)}`);
|
|
167
|
+
}
|
|
168
|
+
sections() {
|
|
169
|
+
const declared = Object.keys(this.multi.interfaces);
|
|
170
|
+
return [
|
|
171
|
+
{ title: "Interfaces:", rows: declared.map((iface) => {
|
|
172
|
+
const d = this.multi.interfaces[iface];
|
|
173
|
+
const url = d && "url" in d && d.url ? d.url : "(local)";
|
|
174
|
+
return [iface, url];
|
|
175
|
+
}) },
|
|
176
|
+
{ title: "Options:", rows: [["-v, --version", "show extension spec versions"]] }
|
|
177
|
+
];
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
var ExtensionVersionPage = class extends HelpPage {
|
|
181
|
+
constructor(multi) {
|
|
182
|
+
super();
|
|
183
|
+
this.multi = multi;
|
|
184
|
+
}
|
|
185
|
+
multi;
|
|
186
|
+
title() {
|
|
187
|
+
return titleCase(this.multi.name || this.multi.slug);
|
|
188
|
+
}
|
|
189
|
+
sections() {
|
|
190
|
+
const declared = Object.keys(this.multi.interfaces);
|
|
191
|
+
return [
|
|
192
|
+
{ title: "", rows: declared.map((iface) => {
|
|
193
|
+
const d = this.multi.interfaces[iface];
|
|
194
|
+
return [iface, d?.specVersion || "(unversioned)"];
|
|
195
|
+
}) }
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
var InterfaceHelp = class extends HelpPage {
|
|
200
|
+
constructor(manifest, apiName, rawPath = [], opts = {}) {
|
|
201
|
+
super();
|
|
202
|
+
this.manifest = manifest;
|
|
203
|
+
this.apiName = apiName;
|
|
204
|
+
this.opts = opts;
|
|
205
|
+
const HTTP_VERBS = /* @__PURE__ */ new Set(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"]);
|
|
206
|
+
const cleaned = [...rawPath];
|
|
207
|
+
while (cleaned.length && HTTP_VERBS.has(cleaned[cleaned.length - 1].toUpperCase())) {
|
|
208
|
+
cleaned.pop();
|
|
209
|
+
}
|
|
210
|
+
this.path = cleaned;
|
|
211
|
+
}
|
|
212
|
+
manifest;
|
|
213
|
+
apiName;
|
|
214
|
+
opts;
|
|
215
|
+
path;
|
|
216
|
+
get ifaceType() {
|
|
217
|
+
return this.manifest.config.type;
|
|
218
|
+
}
|
|
219
|
+
getNav() {
|
|
220
|
+
const root = buildTrie(this.manifest.routes);
|
|
221
|
+
return navigateTrie(root, this.path);
|
|
222
|
+
}
|
|
223
|
+
title() {
|
|
224
|
+
if (this.path.length) return null;
|
|
225
|
+
return `${titleCase(this.manifest.config.name || this.apiName)} ${INTERFACE_LABEL[this.ifaceType] || this.ifaceType}`;
|
|
226
|
+
}
|
|
227
|
+
authNote() {
|
|
228
|
+
const auth = this.manifest.config.auth;
|
|
229
|
+
if (!auth?.env) return null;
|
|
230
|
+
return {
|
|
231
|
+
env: auth.env,
|
|
232
|
+
authType: auth.type || "bearer",
|
|
233
|
+
present: !!process.env[auth.env]
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
usage() {
|
|
237
|
+
if (!this.path.length) {
|
|
238
|
+
const multi = this.opts.multi;
|
|
239
|
+
const declared = multi ? Object.keys(multi.interfaces) : [this.ifaceType];
|
|
240
|
+
const ordered = [this.ifaceType, ...declared.filter((k) => k !== this.ifaceType)];
|
|
241
|
+
const args = (iface) => iface === "mcp" ? " <tool> [args]" : iface === "graphql" ? " <query> [flags]" : " <method> <resource> [id] [flags]";
|
|
242
|
+
return ordered.map((iface) => `godmode ${this.apiName} ${iface}${args(iface)}`);
|
|
243
|
+
}
|
|
244
|
+
const nav = this.getNav();
|
|
245
|
+
if (!nav) return [];
|
|
246
|
+
const paramHint = getParamName(nav.node);
|
|
247
|
+
const idRef = paramHint ? ` [${paramHint}]` : "";
|
|
248
|
+
const methodSlot = this.ifaceType === "api" ? "<method> " : "";
|
|
249
|
+
return [`godmode ${this.apiName} ${this.ifaceType} ${methodSlot}${nav.fullPath.join(" ")}${idRef} [flags]`];
|
|
250
|
+
}
|
|
251
|
+
sections() {
|
|
252
|
+
const nav = this.getNav();
|
|
253
|
+
if (!nav) return [];
|
|
254
|
+
const sections = [];
|
|
255
|
+
if (!this.path.length) {
|
|
256
|
+
if (this.ifaceType === "api") {
|
|
257
|
+
const methodsPresent = new Set(this.manifest.routes.map((r) => r.method.toLowerCase()));
|
|
258
|
+
const METHOD_DESC = {
|
|
259
|
+
get: "retrieve a resource",
|
|
260
|
+
post: "create a resource or send a command",
|
|
261
|
+
put: "replace a resource",
|
|
262
|
+
patch: "modify a resource",
|
|
263
|
+
delete: "remove a resource",
|
|
264
|
+
head: "retrieve headers only"
|
|
265
|
+
};
|
|
266
|
+
const order = ["get", "post", "put", "patch", "delete", "head"];
|
|
267
|
+
const methodsHere = order.filter((m) => methodsPresent.has(m));
|
|
268
|
+
if (methodsHere.length) {
|
|
269
|
+
sections.push({
|
|
270
|
+
title: "Methods:",
|
|
271
|
+
rows: methodsHere.map((m) => [METHOD_LABEL[m] || m.toUpperCase(), METHOD_DESC[m]])
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
} else {
|
|
276
|
+
const mcpTools = this.manifest.config._mcpTools;
|
|
277
|
+
const mcpTool = mcpTools?.find((t) => t.name === this.path[this.path.length - 1]);
|
|
278
|
+
if (mcpTool?.inputSchema?.properties) {
|
|
279
|
+
const props = mcpTool.inputSchema.properties;
|
|
280
|
+
const required = new Set(mcpTool.inputSchema.required || []);
|
|
281
|
+
const rows = [];
|
|
282
|
+
for (const [name, schema] of Object.entries(props)) {
|
|
283
|
+
const req = required.has(name) ? `${RED}[REQUIRED]${RESET}` : "";
|
|
284
|
+
const desc = schema.description ? `${ITALIC}${schema.description}${RESET}` : "";
|
|
285
|
+
rows.push([name, req, desc]);
|
|
286
|
+
}
|
|
287
|
+
sections.push({ title: "Parameters:", rows });
|
|
288
|
+
} else {
|
|
289
|
+
const order = ["get", "post", "put", "patch", "delete"];
|
|
290
|
+
const pc = nav.node.children.find((c) => c.isParam);
|
|
291
|
+
const items = [];
|
|
292
|
+
for (const ep of nav.node.methods) items.push({ method: ep.method, summary: ep.summary, needsId: false });
|
|
293
|
+
if (pc) for (const ep of pc.methods) items.push({ method: ep.method, summary: ep.summary, needsId: true });
|
|
294
|
+
if (items.length) {
|
|
295
|
+
const rows = [];
|
|
296
|
+
for (const m of order) {
|
|
297
|
+
for (const r of items.filter((r2) => r2.method === m)) {
|
|
298
|
+
const label = METHOD_LABEL[m] || m.toUpperCase();
|
|
299
|
+
const idArg = r.needsId ? `<${pc.name}>` : "";
|
|
300
|
+
const desc = r.summary ? `${ITALIC}${r.summary}${RESET}` : "";
|
|
301
|
+
rows.push([label, idArg, desc]);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
sections.push({ title: "Methods:", rows });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const children = getChildren(nav.node).filter((c) => !c.isParam);
|
|
309
|
+
const childNames = [...new Set(children.map((c) => c.name))];
|
|
310
|
+
const resourceSection = buildResourceSection(
|
|
311
|
+
children,
|
|
312
|
+
childNames,
|
|
313
|
+
this.manifest,
|
|
314
|
+
this.opts.filter,
|
|
315
|
+
this.opts.methodFilter,
|
|
316
|
+
this.opts.all
|
|
317
|
+
);
|
|
318
|
+
if (resourceSection) sections.push(resourceSection.section);
|
|
319
|
+
sections.push({ title: "Options:", rows: INTERFACE_OPTION_ROWS });
|
|
320
|
+
return sections;
|
|
321
|
+
}
|
|
322
|
+
/** Drilled-in view also shows param status lines (ANSI-only). */
|
|
323
|
+
render() {
|
|
324
|
+
super.render();
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
function showHelp() {
|
|
328
|
+
new RootHelp().render();
|
|
329
|
+
}
|
|
330
|
+
function showExtHelp() {
|
|
331
|
+
new ExtHelp().render();
|
|
332
|
+
}
|
|
333
|
+
function showExtensionOverview(multi) {
|
|
334
|
+
new ExtensionOverview(multi).render();
|
|
335
|
+
}
|
|
336
|
+
function showExtensionVersion(multi) {
|
|
337
|
+
new ExtensionVersionPage(multi).render();
|
|
338
|
+
}
|
|
339
|
+
function showApiHelp(manifest, apiName, path, filter, methodFilter, all, multi) {
|
|
340
|
+
new InterfaceHelp(manifest, apiName, path, { multi, filter, methodFilter, all }).render();
|
|
341
|
+
}
|
|
342
|
+
async function showVersion() {
|
|
343
|
+
const { readFile } = await import("fs/promises");
|
|
344
|
+
const { resolve, dirname } = await import("path");
|
|
345
|
+
const { fileURLToPath } = await import("url");
|
|
346
|
+
const root = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
347
|
+
const pkg = JSON.parse(await readFile(resolve(root, "package.json"), "utf-8"));
|
|
348
|
+
const license = await readFile(resolve(root, "LICENSE"), "utf-8");
|
|
349
|
+
const copyright = license.match(/^Copyright.*$/m)?.[0] ?? "";
|
|
350
|
+
console.log(`godmode ${pkg.version}
|
|
351
|
+
|
|
352
|
+
${pkg.license} License
|
|
353
|
+
${copyright}`);
|
|
354
|
+
}
|
|
355
|
+
function buildResourceSection(children, childNames, manifest, filter, methodFilter, all) {
|
|
356
|
+
if (!childNames.length) return null;
|
|
357
|
+
const ALL_METHODS = ["get", "post", "put", "patch", "delete"];
|
|
358
|
+
const mf = methodFilter ? fuzzysort.go(methodFilter, ALL_METHODS)[0]?.target : void 0;
|
|
359
|
+
if (methodFilter && !mf) return null;
|
|
360
|
+
const candidates = mf ? childNames.filter((n) => {
|
|
361
|
+
const child = children.find((c) => c.name === n);
|
|
362
|
+
if (!child) return false;
|
|
363
|
+
const methods = /* @__PURE__ */ new Set();
|
|
364
|
+
for (const ep of child.methods) methods.add(ep.method);
|
|
365
|
+
const pc = child.children.find((c) => c.isParam);
|
|
366
|
+
if (pc) for (const ep of pc.methods) methods.add(ep.method);
|
|
367
|
+
return methods.has(mf);
|
|
368
|
+
}) : childNames;
|
|
369
|
+
const filtered = filter ? fuzzysort.go(filter, candidates).map((r) => r.target) : candidates;
|
|
370
|
+
const title = filter || mf ? `Resources${filter ? ` matching "${filter}"` : ""}${mf ? ` with ${mf.toUpperCase()}` : ""}:` : "Resources:";
|
|
371
|
+
if (!filtered.length) return { section: { title, rows: [[" No matches.", ""]] } };
|
|
372
|
+
const limit = filter || mf || all ? filtered.length : 5;
|
|
373
|
+
const shown = filtered.slice(0, limit);
|
|
374
|
+
const more = filtered.length - shown.length;
|
|
375
|
+
const rows = [];
|
|
376
|
+
for (const n of shown) {
|
|
377
|
+
const child = children.find((c) => c.name === n);
|
|
378
|
+
const labels = child ? methodLabels(child) : "";
|
|
379
|
+
const subCount = child ? getChildren(child).filter((c) => !c.isParam).length : 0;
|
|
380
|
+
const sub = subCount ? `(${subCount} sub)` : "";
|
|
381
|
+
const rawDesc = manifest.resourceDescriptions[n] || "";
|
|
382
|
+
const desc = rawDesc ? `${ITALIC}${rawDesc}${RESET}` : "";
|
|
383
|
+
const parts = [labels, sub, desc].filter(Boolean);
|
|
384
|
+
rows.push([n, parts.join(" ")]);
|
|
385
|
+
}
|
|
386
|
+
if (more) {
|
|
387
|
+
const verb = mf ? ` ${mf.toUpperCase()}` : "";
|
|
388
|
+
const hintText = `${more} more${verb} resources. Use options to display more`;
|
|
389
|
+
const dots = USE_COLOR ? `${DIM}...${RESET}` : "...";
|
|
390
|
+
const body = USE_COLOR ? `${DIM}${hintText}${RESET}` : hintText;
|
|
391
|
+
rows.push([dots, body]);
|
|
392
|
+
}
|
|
393
|
+
return { section: { title, rows } };
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
export {
|
|
397
|
+
showHelp,
|
|
398
|
+
showExtHelp,
|
|
399
|
+
showExtensionOverview,
|
|
400
|
+
showExtensionVersion,
|
|
401
|
+
showApiHelp,
|
|
402
|
+
showVersion
|
|
403
|
+
};
|