@mayurdluffy/cbm-cli 1.0.7

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/lib/binary.js ADDED
@@ -0,0 +1,133 @@
1
+ const { execSync, spawn } = require("child_process");
2
+ const fs = require("fs");
3
+ const path = require("path");
4
+ const os = require("os");
5
+ const readline = require("readline");
6
+ const { C, log } = require("./logger");
7
+ const {
8
+ isWindows,
9
+ getHomeDir,
10
+ findBinary,
11
+ binaryExists,
12
+ getLocalBinDir,
13
+ getCacheDir,
14
+ getConfigDir,
15
+ } = require("./system");
16
+
17
+ function getBinaryVersion() {
18
+ try {
19
+ return execSync("codebase-memory-mcp --version", { encoding: "utf8" })
20
+ .trim()
21
+ .split("\n")[0]
22
+ .replace(/^codebase-memory-mcp\s+/, "");
23
+ } catch {
24
+ return "unknown";
25
+ }
26
+ }
27
+
28
+ async function ensureBinary(onMissing) {
29
+ if (binaryExists()) return;
30
+
31
+ log.warn("codebase-memory-mcp not found");
32
+ console.log(
33
+ ` ${C.cyan}codebase-memory-mcp${C.reset} is required but not installed.`,
34
+ );
35
+ console.log(` It will be installed to: ${C.bold}${getLocalBinDir()}${C.reset}`);
36
+ console.log("");
37
+
38
+ const rl = readline.createInterface({
39
+ input: process.stdin,
40
+ output: process.stdout,
41
+ });
42
+ const answer = await new Promise((resolve) => {
43
+ rl.question(` Auto-install now? [Y/n]: `, resolve);
44
+ });
45
+ rl.close();
46
+
47
+ if (answer.toLowerCase() === "n") {
48
+ log.error("Installation cancelled.");
49
+ log.info(`Run manually: ${C.cyan}cbm install${C.reset}`);
50
+ process.exit(1);
51
+ }
52
+
53
+ if (onMissing) {
54
+ await onMissing();
55
+ }
56
+ }
57
+
58
+ function killServer() {
59
+ try {
60
+ if (isWindows()) {
61
+ execSync("taskkill /F /IM codebase-memory-mcp.exe 2>nul", {
62
+ stdio: "ignore",
63
+ });
64
+ } else {
65
+ execSync('pkill -f "codebase-memory-mcp" 2>/dev/null || true', {
66
+ stdio: "ignore",
67
+ });
68
+ }
69
+ } catch {}
70
+ }
71
+
72
+ function isServerRunning() {
73
+ try {
74
+ if (isWindows()) {
75
+ execSync("tasklist | findstr codebase-memory-mcp", { stdio: "ignore" });
76
+ return true;
77
+ } else {
78
+ execSync('pgrep -f "codebase-memory-mcp" > /dev/null 2>&1', {
79
+ stdio: "ignore",
80
+ });
81
+ return true;
82
+ }
83
+ } catch {
84
+ return false;
85
+ }
86
+ }
87
+
88
+ async function installBinary() {
89
+ log.info("Downloading installer...");
90
+ const installUrl =
91
+ "https://raw.githubusercontent.com/DeusData/codebase-memory-mcp/main/install.sh";
92
+ const tempInstall = path.join(os.tmpdir(), `cbm_install_${Date.now()}.sh`);
93
+
94
+ try {
95
+ const response = await fetch(installUrl);
96
+ if (!response.ok) throw new Error("Download failed");
97
+ fs.writeFileSync(tempInstall, await response.text());
98
+
99
+ const result = spawn("bash", [tempInstall], { stdio: "inherit" });
100
+ await new Promise((resolve, reject) => {
101
+ result.on("close", (code) => {
102
+ fs.unlinkSync(tempInstall);
103
+ if (code === 0) resolve();
104
+ else reject(new Error(`Installer exited with code ${code}`));
105
+ });
106
+ });
107
+
108
+ if (binaryExists()) {
109
+ const version = getBinaryVersion();
110
+ log.ok(`Installed: ${C.cyan}${version}${C.reset}`);
111
+ } else {
112
+ log.error("Installed but not on PATH");
113
+ log.info(`Add: ${C.cyan}export PATH="$HOME/.local/bin:$PATH"${C.reset}`);
114
+ process.exit(1);
115
+ }
116
+ } catch (err) {
117
+ log.error(`Installation failed: ${err.message}`);
118
+ process.exit(1);
119
+ }
120
+ }
121
+
122
+ module.exports = {
123
+ findBinary,
124
+ binaryExists,
125
+ getBinaryVersion,
126
+ ensureBinary,
127
+ killServer,
128
+ isServerRunning,
129
+ installBinary,
130
+ getLocalBinDir,
131
+ getCacheDir,
132
+ getConfigDir,
133
+ };
@@ -0,0 +1,498 @@
1
+ const { execSync, spawn } = require("child_process");
2
+ const fs = require("fs");
3
+ const path = require("path");
4
+ const readline = require("readline");
5
+
6
+ const { C, log } = require("./logger");
7
+ const { SCRIPT_VERSION, AGENTS, NUM_AGENTS } = require("./constants");
8
+ const { showBanner, formatBox, selectAgents } = require("./ui");
9
+ const {
10
+ binaryExists,
11
+ getBinaryVersion,
12
+ ensureBinary,
13
+ killServer,
14
+ isServerRunning,
15
+ installBinary,
16
+ } = require("./binary");
17
+ const {
18
+ createWrapper,
19
+ createAgentConfig,
20
+ createGlobalConfig,
21
+ } = require("./agents");
22
+ const {
23
+ updateGitignore,
24
+ updateGitattributes,
25
+ cleanupTempFiles,
26
+ getArtifactInfo,
27
+ } = require("./git");
28
+ const { getHomeDir } = require("./system");
29
+
30
+ async function cmdInstall(options = {}) {
31
+ showBanner();
32
+ log.step("Installing codebase-memory-mcp...");
33
+
34
+ if (binaryExists()) {
35
+ const current = getBinaryVersion();
36
+ log.warn(`Already installed: ${C.cyan}${current}${C.reset}`);
37
+ if (!options.yes && process.stdin.isTTY) {
38
+ const rl = readline.createInterface({
39
+ input: process.stdin,
40
+ output: process.stdout,
41
+ });
42
+ const answer = await new Promise((resolve) =>
43
+ rl.question(" Reinstall/Update? [y/N]: ", resolve),
44
+ );
45
+ rl.close();
46
+ if (answer.toLowerCase() !== "y") {
47
+ log.info("Skipping installation.");
48
+ return;
49
+ }
50
+ }
51
+ }
52
+
53
+ await installBinary();
54
+
55
+ console.log("");
56
+ log.info("Which coding agents do you use?");
57
+ const selected = await selectAgents(
58
+ "Configure which coding agents globally?",
59
+ options,
60
+ );
61
+
62
+ if (selected.length > 0) {
63
+ log.step("Creating global agent configs...");
64
+ for (const num of selected) {
65
+ createGlobalConfig(AGENTS[num - 1]);
66
+ }
67
+ }
68
+
69
+ log.step("Enabling auto-index...");
70
+ try {
71
+ execSync("codebase-memory-mcp config set auto_index true", {
72
+ stdio: "ignore",
73
+ });
74
+ log.ok("Auto-index enabled");
75
+ } catch {
76
+ log.warn("Could not enable auto-index");
77
+ }
78
+
79
+ console.log("");
80
+ formatBox([`✅ Installation complete!`]);
81
+ console.log("");
82
+ log.info(`Next: ${C.cyan}cd your-project && cbm build${C.reset}`);
83
+ }
84
+
85
+ async function cmdBuild(options = {}) {
86
+ showBanner();
87
+ await ensureBinary(() => cmdInstall(options));
88
+
89
+ const projectDir = process.cwd();
90
+ const projectName = path.basename(projectDir);
91
+
92
+ log.step(`Building shareable graph for: ${C.bold}${projectName}${C.reset}`);
93
+ console.log("");
94
+
95
+ fs.mkdirSync(path.join(projectDir, ".codebase-memory"), { recursive: true });
96
+ createWrapper(path.join(projectDir, ".codebase-memory"));
97
+ log.ok(`Created wrapper: ${C.cyan}.codebase-memory/cbm-server.sh${C.reset}`);
98
+
99
+ console.log("");
100
+ log.info("Which agents should use this project's graph?");
101
+ const selected = await selectAgents(
102
+ "Configure which agents for this project?",
103
+ options,
104
+ );
105
+
106
+ if (selected.length > 0) {
107
+ log.step("Creating agent configs...");
108
+ for (const num of selected) {
109
+ createAgentConfig(num - 1, projectDir);
110
+ }
111
+ }
112
+
113
+ updateGitignore(projectDir);
114
+ updateGitattributes(projectDir);
115
+
116
+ log.step("Stopping any running server...");
117
+ killServer();
118
+ log.ok("Server stopped");
119
+
120
+ log.step(`Indexing ${C.bold}${projectName}${C.reset}...`);
121
+ const env = {
122
+ ...process.env,
123
+ CBM_CACHE_DIR: path.join(projectDir, ".codebase-memory"),
124
+ };
125
+
126
+ try {
127
+ execSync(
128
+ `codebase-memory-mcp cli index_repository --repo-path "${projectDir}" --persistence true`,
129
+ { env, stdio: "inherit" },
130
+ );
131
+ log.ok("Indexed successfully");
132
+ } catch (err) {
133
+ log.error("Indexing failed");
134
+ process.exit(1);
135
+ }
136
+
137
+ cleanupTempFiles(path.join(projectDir, ".codebase-memory"));
138
+
139
+ const artifact = getArtifactInfo(projectDir);
140
+ if (artifact.exists) {
141
+ log.ok(`Artifact: ${C.cyan}graph.db.zst${C.reset} (${artifact.size} MB)`);
142
+ } else {
143
+ log.warn("graph.db.zst not found. Check server logs.");
144
+ }
145
+
146
+ log.step("Ensuring auto-index is enabled...");
147
+ try {
148
+ execSync("codebase-memory-mcp config set auto_index true", {
149
+ stdio: "ignore",
150
+ });
151
+ log.ok("Auto-index enabled");
152
+ } catch {
153
+ log.warn("Could not verify auto-index status");
154
+ }
155
+
156
+ const names =
157
+ selected.length > 0
158
+ ? selected.map((n) => AGENTS[n - 1].name).join(", ")
159
+ : "none configured";
160
+
161
+ console.log("");
162
+ formatBox([`🚀 ${C.bold}${projectName}${C.reset} graph is ready to share!`]);
163
+ console.log("");
164
+ console.log(
165
+ ` ${C.cyan}Artifact:${C.reset} ${path.join(projectDir, ".codebase-memory", "graph.db.zst")}`,
166
+ );
167
+ console.log(` ${C.cyan}Agents:${C.reset} ${names}`);
168
+ console.log("");
169
+ console.log(` ${C.bold}Next:${C.reset}`);
170
+ console.log(
171
+ ` ${C.yellow}1.${C.reset} ${C.cyan}git add .codebase-memory/graph.db.zst${C.reset}`,
172
+ );
173
+ console.log(
174
+ ` ${C.yellow}2.${C.reset} ${C.cyan}git commit -m "Add shareable codebase graph"${C.reset}`,
175
+ );
176
+ console.log(
177
+ ` ${C.yellow}3.${C.reset} Teammates run ${C.cyan}cbm use${C.reset} → no indexing needed`,
178
+ );
179
+ console.log("");
180
+ }
181
+
182
+ async function cmdUse(options = {}) {
183
+ await ensureBinary(() => cmdInstall(options));
184
+
185
+ const projectDir = process.cwd();
186
+ const projectName = path.basename(projectDir);
187
+ const zstPath = path.join(projectDir, ".codebase-memory", "graph.db.zst");
188
+
189
+ if (!fs.existsSync(zstPath)) {
190
+ log.error("No graph.db.zst found");
191
+ log.info(`Run: ${C.cyan}cbm build${C.reset}`);
192
+ process.exit(1);
193
+ }
194
+
195
+ log.step(`Using shared graph for: ${C.bold}${projectName}${C.reset}`);
196
+ console.log("");
197
+
198
+ if (
199
+ !fs.existsSync(path.join(projectDir, ".codebase-memory", "cbm-server.sh"))
200
+ ) {
201
+ createWrapper(path.join(projectDir, ".codebase-memory"));
202
+ log.ok(
203
+ `Created wrapper: ${C.cyan}.codebase-memory/cbm-server.sh${C.reset}`,
204
+ );
205
+ }
206
+
207
+ console.log("");
208
+ log.info("Which agents should use this project's graph?");
209
+ const selected = await selectAgents(
210
+ "Configure which agents for this project?",
211
+ options,
212
+ );
213
+
214
+ if (selected.length > 0) {
215
+ log.step("Creating agent configs...");
216
+ for (const num of selected) {
217
+ createAgentConfig(num - 1, projectDir);
218
+ }
219
+ }
220
+
221
+ const artifact = getArtifactInfo(projectDir);
222
+ const names =
223
+ selected.length > 0
224
+ ? selected.map((n) => AGENTS[n - 1].name).join(", ")
225
+ : "none configured";
226
+
227
+ console.log("");
228
+ formatBox([
229
+ `✅ ${C.bold}${projectName}${C.reset} graph ready! No indexing needed.`,
230
+ ]);
231
+ console.log("");
232
+ console.log(
233
+ ` ${C.cyan}Artifact:${C.reset} ${zstPath} (${artifact.size} MB)`,
234
+ );
235
+ console.log(` ${C.cyan}Agents:${C.reset} ${names}`);
236
+ console.log(` ${C.cyan}Status:${C.reset} Ready to use`);
237
+ console.log("");
238
+ console.log(
239
+ ` ${C.bold}Next:${C.reset} Restart your agent and start coding!`,
240
+ );
241
+ console.log("");
242
+ }
243
+
244
+ async function cmdReindex(options = {}) {
245
+ await ensureBinary(() => cmdInstall(options));
246
+
247
+ const projectDir = process.cwd();
248
+ const projectName = path.basename(projectDir);
249
+
250
+ if (!fs.existsSync(path.join(projectDir, ".codebase-memory"))) {
251
+ log.error("No .codebase-memory/ found");
252
+ log.info(`Run: ${C.cyan}cbm build${C.reset}`);
253
+ process.exit(1);
254
+ }
255
+
256
+ log.step(`Re-indexing ${C.bold}${projectName}${C.reset}...`);
257
+
258
+ killServer();
259
+
260
+ const env = {
261
+ ...process.env,
262
+ CBM_CACHE_DIR: path.join(projectDir, ".codebase-memory"),
263
+ };
264
+
265
+ try {
266
+ execSync(
267
+ `codebase-memory-mcp cli index_repository --repo-path "${projectDir}" --persistence true`,
268
+ { env, stdio: "inherit" },
269
+ );
270
+ log.ok(`${projectName} re-indexed`);
271
+
272
+ cleanupTempFiles(path.join(projectDir, ".codebase-memory"));
273
+
274
+ const artifact = getArtifactInfo(projectDir);
275
+ log.ok(`Artifact: ${C.cyan}graph.db.zst${C.reset} (${artifact.size} MB)`);
276
+ } catch {
277
+ log.error("Re-index failed");
278
+ process.exit(1);
279
+ }
280
+ }
281
+
282
+ function cmdStatus(options = {}) {
283
+ showBanner();
284
+ const projectDir = process.cwd();
285
+ const projectName = path.basename(projectDir);
286
+
287
+ console.log(
288
+ ` ${C.bold}Project:${C.reset} ${C.cyan}${projectName}${C.reset}`,
289
+ );
290
+ console.log(` ${C.bold}Path:${C.reset} ${C.dim}${projectDir}${C.reset}`);
291
+ console.log("");
292
+
293
+ const artifact = getArtifactInfo(projectDir);
294
+ if (artifact.exists) {
295
+ log.ok(
296
+ `Shareable artifact: ${C.cyan}graph.db.zst${C.reset} (${artifact.size} MB)`,
297
+ );
298
+ } else {
299
+ log.warn("No graph.db.zst found");
300
+ }
301
+
302
+ const found = [];
303
+ for (let i = 0; i < NUM_AGENTS; i++) {
304
+ const agentConfigPath = path.join(projectDir, AGENTS[i].config);
305
+ if (fs.existsSync(agentConfigPath)) {
306
+ found.push(AGENTS[i].name);
307
+ }
308
+ if (AGENTS[i].name === "Aider") {
309
+ if (fs.existsSync(path.join(projectDir, "CONVENTIONS.md"))) {
310
+ found.push("Aider (CONVENTIONS.md)");
311
+ }
312
+ if (fs.existsSync(path.join(projectDir, "cbm-aider"))) {
313
+ found.push("Aider (cbm-aider wrapper)");
314
+ }
315
+ }
316
+ }
317
+
318
+ if (found.length > 0) {
319
+ log.ok(`Agent configs: ${C.cyan}${found.join(", ")}${C.reset}`);
320
+ } else {
321
+ log.warn("No agent configs found");
322
+ }
323
+
324
+ if (isServerRunning()) {
325
+ log.ok(`Server: ${C.green}running${C.reset}`);
326
+ } else {
327
+ log.info(`Server: ${C.cyan}idle${C.reset} (starts on agent connect)`);
328
+ }
329
+ }
330
+
331
+ async function cmdUpdate(options = {}) {
332
+ await ensureBinary(() => cmdInstall(options));
333
+
334
+ const oldVersion = getBinaryVersion();
335
+ log.info(`Current: ${C.cyan}${oldVersion}${C.reset}`);
336
+
337
+ await cmdInstall(options);
338
+
339
+ const newVersion = getBinaryVersion();
340
+ if (oldVersion !== newVersion) {
341
+ log.ok(
342
+ `Updated: ${C.cyan}${oldVersion}${C.reset} → ${C.cyan}${newVersion}${C.reset}`,
343
+ );
344
+ } else {
345
+ log.ok(`Already latest: ${C.cyan}${newVersion}${C.reset}`);
346
+ }
347
+ }
348
+
349
+ function cmdVersion(options = {}) {
350
+ showBanner();
351
+ const lines = [`cbm version ${SCRIPT_VERSION}`];
352
+ if (binaryExists()) {
353
+ lines.push(`codebase-memory-mcp version ${getBinaryVersion()}`);
354
+ } else {
355
+ lines.push(`codebase-memory-mcp not installed`);
356
+ }
357
+ formatBox(lines);
358
+ if (!binaryExists()) {
359
+ console.log("");
360
+ log.info(`Run: ${C.cyan}cbm install${C.reset}`);
361
+ }
362
+ }
363
+
364
+ function cmdKill(options = {}) {
365
+ log.step("Killing codebase-memory-mcp server...");
366
+ killServer();
367
+ log.ok("Server killed");
368
+ }
369
+
370
+ function cmdUninstall(options = {}) {
371
+ log.step("Uninstalling codebase-memory-mcp...");
372
+
373
+ cmdKill();
374
+
375
+ const binPath = path.join(
376
+ getHomeDir(),
377
+ ".local",
378
+ "bin",
379
+ "codebase-memory-mcp",
380
+ );
381
+ const cacheDir = path.join(getHomeDir(), ".cache", "codebase-memory-mcp");
382
+ const configDir = path.join(getHomeDir(), ".config", "codebase-memory-mcp");
383
+
384
+ if (fs.existsSync(binPath)) {
385
+ fs.unlinkSync(binPath);
386
+ log.ok(`Removed: ${C.cyan}${binPath}${C.reset}`);
387
+ }
388
+ if (fs.existsSync(cacheDir)) {
389
+ fs.rmSync(cacheDir, { recursive: true });
390
+ log.ok(`Removed: ${C.cyan}${cacheDir}${C.reset}`);
391
+ }
392
+ if (fs.existsSync(configDir)) {
393
+ fs.rmSync(configDir, { recursive: true });
394
+ log.ok(`Removed: ${C.cyan}${configDir}${C.reset}`);
395
+ }
396
+
397
+ console.log("");
398
+ formatBox([`🗑️ codebase-memory-mcp uninstalled successfully`]);
399
+ console.log("");
400
+ log.info(`Reinstall: ${C.cyan}cbm install${C.reset}`);
401
+ }
402
+
403
+ function cmdHelp(options = {}) {
404
+ showBanner();
405
+ console.log(` ${C.bold}Usage:${C.reset} ${C.cyan}cbm [command]${C.reset}`);
406
+ console.log("");
407
+ console.log(` ${C.bold}Setup:${C.reset}`);
408
+ console.log(
409
+ ` ${C.green}install${C.reset} ${C.dim}(i)${C.reset} Install codebase-memory-mcp + select agents`,
410
+ );
411
+ console.log(
412
+ ` ${C.green}update${C.reset} ${C.dim}(up)${C.reset} Update to latest version`,
413
+ );
414
+ console.log(` ${C.green}uninstall${C.reset} Remove from system`);
415
+ console.log(
416
+ ` ${C.green}version${C.reset} ${C.dim}(-V, -v)${C.reset} Show version info`,
417
+ );
418
+ console.log(
419
+ ` ${C.green}kill${C.reset} ${C.dim}(k)${C.reset} Stop running server`,
420
+ );
421
+ console.log(
422
+ ` ${C.green}help${C.reset} ${C.dim}(-h, --help)${C.reset} Show help`,
423
+ );
424
+ console.log("");
425
+ console.log(` ${C.bold}Project:${C.reset}`);
426
+ console.log(
427
+ ` ${C.green}build${C.reset} ${C.dim}(b)${C.reset} Index + create shareable graph + select agents`,
428
+ );
429
+ console.log(
430
+ ` ${C.green}use${C.reset} ${C.dim}(u)${C.reset} Use shared graph (no indexing needed)`,
431
+ );
432
+ console.log(
433
+ ` ${C.green}re-index${C.reset} ${C.dim}(ri)${C.reset} Force re-index + fresh artifact`,
434
+ );
435
+ console.log(
436
+ ` ${C.green}status${C.reset} ${C.dim}(s)${C.reset} Show project graph status`,
437
+ );
438
+ console.log("");
439
+ console.log(` ${C.bold}Options:${C.reset}`);
440
+ console.log(` ${C.dim}--version, -V, -v Show version${C.reset}`);
441
+ console.log(` ${C.dim}--help, -h Show help${C.reset}`);
442
+ console.log(` ${C.dim}--yes, -y Skip prompts${C.reset}`);
443
+ console.log(
444
+ ` ${C.dim}--agents, -a Specify agents (comma-separated)${C.reset}`,
445
+ );
446
+ console.log("");
447
+ console.log(` ${C.bold}Raw CLI:${C.reset}`);
448
+ console.log(
449
+ ` ${C.green}cbm <cmd>${C.reset} Any codebase-memory-mcp CLI command`,
450
+ );
451
+ console.log(
452
+ ` ${C.dim}Example: cbm cli search_graph '{"name_pattern": ".*"}'${C.reset}`,
453
+ );
454
+ console.log("");
455
+ console.log(` ${C.bold}Supported Agents:${C.reset}`);
456
+ console.log(
457
+ ` ${C.dim}Claude Code, Codex CLI, Gemini CLI, Zed, OpenCode,${C.reset}`,
458
+ );
459
+ console.log(
460
+ ` ${C.dim}Antigravity, Aider, KiloCode, VS Code, OpenClaw, Kiro${C.reset}`,
461
+ );
462
+ console.log("");
463
+ console.log(` ${C.yellow}Notes:${C.reset}`);
464
+ console.log(
465
+ ` ${C.dim}• Aider: No native MCP config — use ./cbm-aider wrapper${C.reset}`,
466
+ );
467
+ console.log(
468
+ ` ${C.dim}• Antigravity: Shares Gemini CLI config file${C.reset}`,
469
+ );
470
+ console.log("");
471
+ console.log(` ${C.yellow}Workflow:${C.reset}`);
472
+ console.log(
473
+ ` ${C.cyan}cbm install${C.reset} → select agents → ${C.cyan}cbm build${C.reset} → select agents → ${C.cyan}git push${C.reset}`,
474
+ );
475
+ console.log("");
476
+ console.log(` ${C.dim}cbm v${SCRIPT_VERSION}${C.reset}`);
477
+ console.log("");
478
+ }
479
+
480
+ async function passThrough(args, options = {}) {
481
+ await ensureBinary(() => cmdInstall(options));
482
+ const child = spawn("codebase-memory-mcp", args, { stdio: "inherit" });
483
+ child.on("close", (code) => process.exit(code || 0));
484
+ }
485
+
486
+ module.exports = {
487
+ cmdInstall,
488
+ cmdBuild,
489
+ cmdUse,
490
+ cmdReindex,
491
+ cmdStatus,
492
+ cmdUpdate,
493
+ cmdVersion,
494
+ cmdKill,
495
+ cmdUninstall,
496
+ cmdHelp,
497
+ passThrough,
498
+ };