@burdenoff/vibe-agent 1.4.0 → 2.1.0

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 (164) hide show
  1. package/dist/app-31chs2a1.js +17180 -0
  2. package/dist/app-31chs2a1.js.map +170 -0
  3. package/dist/chunk-pm1hna8x-473akrq0.js +16826 -0
  4. package/dist/chunk-pm1hna8x-473akrq0.js.map +11 -0
  5. package/dist/cli.js +4686 -1146
  6. package/dist/cli.js.map +51 -1
  7. package/dist/highlights-eq9cgrbb.scm +604 -0
  8. package/dist/highlights-ghv9g403.scm +205 -0
  9. package/dist/highlights-hk7bwhj4.scm +284 -0
  10. package/dist/highlights-r812a2qc.scm +150 -0
  11. package/dist/highlights-x6tmsnaa.scm +115 -0
  12. package/dist/index-5xngv42g.js +2546 -0
  13. package/dist/index-5xngv42g.js.map +26 -0
  14. package/dist/index-6aq4nc58.js +11429 -0
  15. package/dist/index-6aq4nc58.js.map +21 -0
  16. package/dist/index-ac2ebaf8.js +4 -0
  17. package/dist/index-ac2ebaf8.js.map +9 -0
  18. package/dist/index-g8dczzvv.js +33 -0
  19. package/dist/index-g8dczzvv.js.map +9 -0
  20. package/dist/index-gmz54dkc.js +28402 -0
  21. package/dist/index-gmz54dkc.js.map +11 -0
  22. package/dist/index-t06ktmx9.js +216 -0
  23. package/dist/index-t06ktmx9.js.map +11 -0
  24. package/dist/index.js +69 -87
  25. package/dist/index.js.map +10 -1
  26. package/dist/injections-73j83es3.scm +27 -0
  27. package/dist/package-0158fp3w.js +136 -0
  28. package/dist/package-0158fp3w.js.map +9 -0
  29. package/dist/plugin-system-bg1pzjj9.js +453 -0
  30. package/dist/plugin-system-bg1pzjj9.js.map +11 -0
  31. package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  32. package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
  33. package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  34. package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  35. package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
  36. package/package.json +25 -39
  37. package/dist/app.d.ts +0 -15
  38. package/dist/app.d.ts.map +0 -1
  39. package/dist/app.js +0 -600
  40. package/dist/app.js.map +0 -1
  41. package/dist/cli.d.ts +0 -3
  42. package/dist/cli.d.ts.map +0 -1
  43. package/dist/db/schema.d.ts +0 -121
  44. package/dist/db/schema.d.ts.map +0 -1
  45. package/dist/db/schema.js +0 -473
  46. package/dist/db/schema.js.map +0 -1
  47. package/dist/index.d.ts +0 -2
  48. package/dist/index.d.ts.map +0 -1
  49. package/dist/middleware/ModuleAuth.d.ts +0 -61
  50. package/dist/middleware/ModuleAuth.d.ts.map +0 -1
  51. package/dist/middleware/ModuleAuth.js +0 -223
  52. package/dist/middleware/ModuleAuth.js.map +0 -1
  53. package/dist/middleware/auth.d.ts +0 -3
  54. package/dist/middleware/auth.d.ts.map +0 -1
  55. package/dist/middleware/auth.js +0 -11
  56. package/dist/middleware/auth.js.map +0 -1
  57. package/dist/migrations/remove-notes-prompts.d.ts +0 -13
  58. package/dist/migrations/remove-notes-prompts.d.ts.map +0 -1
  59. package/dist/migrations/remove-notes-prompts.js +0 -148
  60. package/dist/migrations/remove-notes-prompts.js.map +0 -1
  61. package/dist/routes/bookmarks.d.ts +0 -3
  62. package/dist/routes/bookmarks.d.ts.map +0 -1
  63. package/dist/routes/bookmarks.js +0 -195
  64. package/dist/routes/bookmarks.js.map +0 -1
  65. package/dist/routes/config.d.ts +0 -3
  66. package/dist/routes/config.d.ts.map +0 -1
  67. package/dist/routes/config.js +0 -106
  68. package/dist/routes/config.js.map +0 -1
  69. package/dist/routes/files.d.ts +0 -3
  70. package/dist/routes/files.d.ts.map +0 -1
  71. package/dist/routes/files.js +0 -313
  72. package/dist/routes/files.js.map +0 -1
  73. package/dist/routes/git.d.ts +0 -3
  74. package/dist/routes/git.d.ts.map +0 -1
  75. package/dist/routes/git.js +0 -427
  76. package/dist/routes/git.js.map +0 -1
  77. package/dist/routes/logs.d.ts +0 -9
  78. package/dist/routes/logs.d.ts.map +0 -1
  79. package/dist/routes/logs.js +0 -107
  80. package/dist/routes/logs.js.map +0 -1
  81. package/dist/routes/moduleRegistry.d.ts +0 -41
  82. package/dist/routes/moduleRegistry.d.ts.map +0 -1
  83. package/dist/routes/moduleRegistry.js +0 -356
  84. package/dist/routes/moduleRegistry.js.map +0 -1
  85. package/dist/routes/notifications.d.ts +0 -3
  86. package/dist/routes/notifications.d.ts.map +0 -1
  87. package/dist/routes/notifications.js +0 -255
  88. package/dist/routes/notifications.js.map +0 -1
  89. package/dist/routes/plugin-state.d.ts +0 -19
  90. package/dist/routes/plugin-state.d.ts.map +0 -1
  91. package/dist/routes/plugin-state.js +0 -139
  92. package/dist/routes/plugin-state.js.map +0 -1
  93. package/dist/routes/plugins.d.ts +0 -3
  94. package/dist/routes/plugins.d.ts.map +0 -1
  95. package/dist/routes/plugins.js +0 -118
  96. package/dist/routes/plugins.js.map +0 -1
  97. package/dist/routes/projects.d.ts +0 -3
  98. package/dist/routes/projects.d.ts.map +0 -1
  99. package/dist/routes/projects.js +0 -456
  100. package/dist/routes/projects.js.map +0 -1
  101. package/dist/routes/tasks.d.ts +0 -3
  102. package/dist/routes/tasks.d.ts.map +0 -1
  103. package/dist/routes/tasks.js +0 -187
  104. package/dist/routes/tasks.js.map +0 -1
  105. package/dist/routes/tmux.d.ts +0 -3
  106. package/dist/routes/tmux.d.ts.map +0 -1
  107. package/dist/routes/tmux.js +0 -1287
  108. package/dist/routes/tmux.js.map +0 -1
  109. package/dist/routes/tunnel.d.ts +0 -25
  110. package/dist/routes/tunnel.d.ts.map +0 -1
  111. package/dist/routes/tunnel.js +0 -498
  112. package/dist/routes/tunnel.js.map +0 -1
  113. package/dist/services/ModulePermissions.d.ts +0 -100
  114. package/dist/services/ModulePermissions.d.ts.map +0 -1
  115. package/dist/services/ModulePermissions.js +0 -322
  116. package/dist/services/ModulePermissions.js.map +0 -1
  117. package/dist/services/ModuleRegistryService.d.ts +0 -152
  118. package/dist/services/ModuleRegistryService.d.ts.map +0 -1
  119. package/dist/services/ModuleRegistryService.js +0 -547
  120. package/dist/services/ModuleRegistryService.js.map +0 -1
  121. package/dist/services/agent.service.d.ts +0 -19
  122. package/dist/services/agent.service.d.ts.map +0 -1
  123. package/dist/services/agent.service.js +0 -91
  124. package/dist/services/agent.service.js.map +0 -1
  125. package/dist/services/bootstrap.d.ts +0 -22
  126. package/dist/services/bootstrap.d.ts.map +0 -1
  127. package/dist/services/bootstrap.js +0 -283
  128. package/dist/services/bootstrap.js.map +0 -1
  129. package/dist/services/completion.d.ts +0 -46
  130. package/dist/services/completion.d.ts.map +0 -1
  131. package/dist/services/completion.js +0 -317
  132. package/dist/services/completion.js.map +0 -1
  133. package/dist/services/gateway-client.d.ts +0 -61
  134. package/dist/services/gateway-client.d.ts.map +0 -1
  135. package/dist/services/gateway-client.js +0 -147
  136. package/dist/services/gateway-client.js.map +0 -1
  137. package/dist/services/logger.d.ts +0 -61
  138. package/dist/services/logger.d.ts.map +0 -1
  139. package/dist/services/logger.js +0 -223
  140. package/dist/services/logger.js.map +0 -1
  141. package/dist/services/plugin-manager.d.ts +0 -105
  142. package/dist/services/plugin-manager.d.ts.map +0 -1
  143. package/dist/services/plugin-manager.js +0 -250
  144. package/dist/services/plugin-manager.js.map +0 -1
  145. package/dist/services/plugin-state-backend.d.ts +0 -22
  146. package/dist/services/plugin-state-backend.d.ts.map +0 -1
  147. package/dist/services/plugin-state-backend.js +0 -103
  148. package/dist/services/plugin-state-backend.js.map +0 -1
  149. package/dist/services/plugin-state-external.d.ts +0 -36
  150. package/dist/services/plugin-state-external.d.ts.map +0 -1
  151. package/dist/services/plugin-state-external.js +0 -144
  152. package/dist/services/plugin-state-external.js.map +0 -1
  153. package/dist/services/plugin-state-router.d.ts +0 -40
  154. package/dist/services/plugin-state-router.d.ts.map +0 -1
  155. package/dist/services/plugin-state-router.js +0 -82
  156. package/dist/services/plugin-state-router.js.map +0 -1
  157. package/dist/services/port-utils.d.ts +0 -11
  158. package/dist/services/port-utils.d.ts.map +0 -1
  159. package/dist/services/port-utils.js +0 -39
  160. package/dist/services/port-utils.js.map +0 -1
  161. package/dist/services/service-manager.d.ts +0 -50
  162. package/dist/services/service-manager.d.ts.map +0 -1
  163. package/dist/services/service-manager.js +0 -389
  164. package/dist/services/service-manager.js.map +0 -1
@@ -1,91 +0,0 @@
1
- import { startServer } from "../app.js";
2
- import { spawn } from "child_process";
3
- import ora from "ora";
4
- export class AgentService {
5
- app = null;
6
- config = null;
7
- async start(config) {
8
- this.config = config;
9
- const spinner = ora("Starting VibeControls Agent...").start();
10
- try {
11
- // Set environment variables
12
- process.env.PORT = config.port.toString();
13
- process.env.DB_PATH = config.dbPath;
14
- // Start the server
15
- this.app = await startServer();
16
- await this.app.listen({
17
- port: config.port,
18
- host: "0.0.0.0",
19
- });
20
- spinner.succeed(`🚀 VibeControls Agent '${config.name}' is running on http://localhost:${config.port}`);
21
- // Handle graceful shutdown
22
- process.on("SIGTERM", () => this.stop());
23
- process.on("SIGINT", () => this.stop());
24
- }
25
- catch (error) {
26
- spinner.fail("Failed to start agent");
27
- throw error;
28
- }
29
- }
30
- async stop() {
31
- if (this.app) {
32
- const spinner = ora("Stopping VibeControls Agent...").start();
33
- try {
34
- await this.app.close();
35
- spinner.succeed("✅ VibeControls Agent stopped");
36
- process.exit(0);
37
- }
38
- catch (error) {
39
- spinner.fail("Failed to stop agent gracefully");
40
- process.exit(1);
41
- }
42
- }
43
- }
44
- async startDaemon(config) {
45
- const spinner = ora("Starting VibeControls Agent as daemon...").start();
46
- try {
47
- // Spawn the process as a daemon
48
- const child = spawn(process.execPath, [
49
- process.argv[1], // CLI script path
50
- "start",
51
- "--port",
52
- config.port.toString(),
53
- "--name",
54
- config.name,
55
- "--db-path",
56
- config.dbPath,
57
- ], {
58
- detached: true,
59
- stdio: "ignore",
60
- });
61
- // Unreference the child process so parent can exit
62
- child.unref();
63
- spinner.succeed(`🚀 VibeControls Agent '${config.name}' started as daemon (PID: ${child.pid})`);
64
- // Save process info for management
65
- await this.saveProcessInfo(config.name, child.pid, config);
66
- }
67
- catch (error) {
68
- spinner.fail("Failed to start daemon");
69
- throw error;
70
- }
71
- }
72
- async saveProcessInfo(name, pid, config) {
73
- // This would typically save to a process registry file or database
74
- // For now, we'll implement a simple file-based approach
75
- const processInfo = {
76
- name,
77
- pid,
78
- config,
79
- startTime: new Date().toISOString(),
80
- };
81
- // Save to a registry file (implementation would depend on requirements)
82
- console.log("Process info saved:", processInfo);
83
- }
84
- getStatus() {
85
- return {
86
- running: this.app !== null,
87
- config: this.config,
88
- };
89
- }
90
- }
91
- //# sourceMappingURL=agent.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.service.js","sourceRoot":"","sources":["../../src/services/agent.service.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- interface BootstrapResult {
2
- tool: string;
3
- status: "installed" | "already_present" | "failed";
4
- version?: string;
5
- error?: string;
6
- }
7
- /**
8
- * Run full bootstrap - installs all required dependencies.
9
- * Safe to run multiple times (idempotent).
10
- */
11
- export declare function bootstrap(options?: {
12
- verbose?: boolean;
13
- }): Promise<BootstrapResult[]>;
14
- /**
15
- * Check which dependencies are available without installing.
16
- */
17
- export declare function checkDependencies(): Record<string, {
18
- available: boolean;
19
- version?: string;
20
- }>;
21
- export {};
22
- //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/services/bootstrap.ts"],"names":[],"mappings":"AAeA,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,QAAQ,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+OD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA4B7B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CACzC,MAAM,EACN;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CACzC,CAeA"}
@@ -1,283 +0,0 @@
1
- /**
2
- * Bootstrap Service
3
- *
4
- * Auto-installs all required system dependencies for the vibecontrols-agent:
5
- * - tmux (terminal multiplexer)
6
- * - ttyd (terminal web server)
7
- * - cloudflared (Cloudflare tunnel)
8
- * - bun (runtime - if not already present)
9
- *
10
- * Detects OS and uses appropriate package manager.
11
- */
12
- import { execSync } from "child_process";
13
- import { platform, arch } from "os";
14
- const execOpts = { stdio: "pipe", timeout: 120000 };
15
- function commandExists(cmd) {
16
- try {
17
- execSync(`which ${cmd}`, execOpts);
18
- return true;
19
- }
20
- catch {
21
- return false;
22
- }
23
- }
24
- function getVersion(cmd, flag = "--version") {
25
- try {
26
- return execSync(`${cmd} ${flag}`, execOpts)
27
- .toString()
28
- .trim()
29
- .split("\n")[0];
30
- }
31
- catch {
32
- return "unknown";
33
- }
34
- }
35
- function isRoot() {
36
- try {
37
- return execSync("id -u", execOpts).toString().trim() === "0";
38
- }
39
- catch {
40
- return false;
41
- }
42
- }
43
- function sudo(cmd) {
44
- return isRoot() ? cmd : `sudo ${cmd}`;
45
- }
46
- function detectPackageManager() {
47
- if (commandExists("apt-get"))
48
- return "apt";
49
- if (commandExists("dnf"))
50
- return "dnf";
51
- if (commandExists("yum"))
52
- return "yum";
53
- if (commandExists("apk"))
54
- return "apk";
55
- if (commandExists("brew"))
56
- return "brew";
57
- return "unknown";
58
- }
59
- function installTmux() {
60
- if (commandExists("tmux")) {
61
- return {
62
- tool: "tmux",
63
- status: "already_present",
64
- version: getVersion("tmux", "-V"),
65
- };
66
- }
67
- try {
68
- const pm = detectPackageManager();
69
- switch (pm) {
70
- case "apt":
71
- execSync(sudo("apt-get update -qq && apt-get install -y -qq tmux"), {
72
- ...execOpts,
73
- timeout: 180000,
74
- });
75
- break;
76
- case "dnf":
77
- case "yum":
78
- execSync(sudo(`${pm} install -y tmux`), execOpts);
79
- break;
80
- case "apk":
81
- execSync(sudo("apk add --no-cache tmux"), execOpts);
82
- break;
83
- case "brew":
84
- execSync("brew install tmux", execOpts);
85
- break;
86
- default:
87
- return {
88
- tool: "tmux",
89
- status: "failed",
90
- error: "Unknown package manager",
91
- };
92
- }
93
- return {
94
- tool: "tmux",
95
- status: "installed",
96
- version: getVersion("tmux", "-V"),
97
- };
98
- }
99
- catch (e) {
100
- return { tool: "tmux", status: "failed", error: e.message };
101
- }
102
- }
103
- function installTtyd() {
104
- if (commandExists("ttyd")) {
105
- return {
106
- tool: "ttyd",
107
- status: "already_present",
108
- version: getVersion("ttyd", "--version"),
109
- };
110
- }
111
- try {
112
- const pm = detectPackageManager();
113
- const osArch = arch();
114
- // Try package manager first
115
- if (pm === "apt") {
116
- try {
117
- execSync(sudo("apt-get update -qq && apt-get install -y -qq ttyd"), {
118
- ...execOpts,
119
- timeout: 180000,
120
- });
121
- if (commandExists("ttyd")) {
122
- return {
123
- tool: "ttyd",
124
- status: "installed",
125
- version: getVersion("ttyd", "--version"),
126
- };
127
- }
128
- }
129
- catch {
130
- // Fall through to binary download
131
- }
132
- }
133
- // Download pre-built binary
134
- const archMap = {
135
- x64: "x86_64",
136
- arm64: "aarch64",
137
- arm: "armhf",
138
- };
139
- const ttydArch = archMap[osArch] || "x86_64";
140
- const url = `https://github.com/tsl0922/ttyd/releases/latest/download/ttyd.${ttydArch}`;
141
- execSync(`curl -fsSL "${url}" -o /tmp/ttyd && chmod +x /tmp/ttyd`, {
142
- ...execOpts,
143
- timeout: 60000,
144
- });
145
- execSync(sudo("mv /tmp/ttyd /usr/local/bin/ttyd"), execOpts);
146
- return {
147
- tool: "ttyd",
148
- status: "installed",
149
- version: getVersion("ttyd", "--version"),
150
- };
151
- }
152
- catch (e) {
153
- return { tool: "ttyd", status: "failed", error: e.message };
154
- }
155
- }
156
- function installCloudflared() {
157
- if (commandExists("cloudflared")) {
158
- return {
159
- tool: "cloudflared",
160
- status: "already_present",
161
- version: getVersion("cloudflared", "--version"),
162
- };
163
- }
164
- try {
165
- const os = platform();
166
- const osArch = arch();
167
- if (os === "linux") {
168
- const archMap = {
169
- x64: "amd64",
170
- arm64: "arm64",
171
- arm: "arm",
172
- };
173
- const cfArch = archMap[osArch] || "amd64";
174
- const url = `https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-${cfArch}`;
175
- execSync(`curl -fsSL "${url}" -o /tmp/cloudflared && chmod +x /tmp/cloudflared`, { ...execOpts, timeout: 60000 });
176
- execSync(sudo("mv /tmp/cloudflared /usr/local/bin/cloudflared"), execOpts);
177
- }
178
- else if (os === "darwin") {
179
- if (commandExists("brew")) {
180
- execSync("brew install cloudflared", { ...execOpts, timeout: 180000 });
181
- }
182
- else {
183
- return {
184
- tool: "cloudflared",
185
- status: "failed",
186
- error: "Install Homebrew first or download manually",
187
- };
188
- }
189
- }
190
- else {
191
- return {
192
- tool: "cloudflared",
193
- status: "failed",
194
- error: `Unsupported OS: ${os}`,
195
- };
196
- }
197
- return {
198
- tool: "cloudflared",
199
- status: "installed",
200
- version: getVersion("cloudflared", "--version"),
201
- };
202
- }
203
- catch (e) {
204
- return {
205
- tool: "cloudflared",
206
- status: "failed",
207
- error: e.message,
208
- };
209
- }
210
- }
211
- function installBun() {
212
- if (commandExists("bun")) {
213
- return {
214
- tool: "bun",
215
- status: "already_present",
216
- version: getVersion("bun", "--version"),
217
- };
218
- }
219
- try {
220
- execSync("curl -fsSL https://bun.sh/install | bash", {
221
- ...execOpts,
222
- timeout: 120000,
223
- });
224
- return {
225
- tool: "bun",
226
- status: "installed",
227
- version: getVersion("bun", "--version"),
228
- };
229
- }
230
- catch (e) {
231
- return { tool: "bun", status: "failed", error: e.message };
232
- }
233
- }
234
- /**
235
- * Run full bootstrap - installs all required dependencies.
236
- * Safe to run multiple times (idempotent).
237
- */
238
- export async function bootstrap(options) {
239
- const verbose = options?.verbose ?? true;
240
- const results = [];
241
- const tools = [
242
- { name: "bun", installer: installBun },
243
- { name: "tmux", installer: installTmux },
244
- { name: "ttyd", installer: installTtyd },
245
- { name: "cloudflared", installer: installCloudflared },
246
- ];
247
- for (const tool of tools) {
248
- if (verbose)
249
- process.stdout.write(` Checking ${tool.name}... `);
250
- const result = tool.installer();
251
- results.push(result);
252
- if (verbose) {
253
- if (result.status === "already_present") {
254
- console.log(`✅ already installed (${result.version})`);
255
- }
256
- else if (result.status === "installed") {
257
- console.log(`📦 installed (${result.version})`);
258
- }
259
- else {
260
- console.log(`❌ failed: ${result.error}`);
261
- }
262
- }
263
- }
264
- return results;
265
- }
266
- /**
267
- * Check which dependencies are available without installing.
268
- */
269
- export function checkDependencies() {
270
- const deps = ["bun", "tmux", "ttyd", "cloudflared"];
271
- const result = {};
272
- for (const dep of deps) {
273
- const available = commandExists(dep);
274
- result[dep] = {
275
- available,
276
- version: available
277
- ? getVersion(dep, dep === "tmux" ? "-V" : "--version")
278
- : undefined,
279
- };
280
- }
281
- return result;
282
- }
283
- //# sourceMappingURL=bootstrap.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/services/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -1,46 +0,0 @@
1
- /**
2
- * Shell completion generators for Bash, Zsh, and Fish.
3
- *
4
- * Produces scripts that auto-complete all built-in commands, subcommands,
5
- * and options. After plugins register their CLI commands the completion
6
- * data is re-scanned from the Commander.js program tree, so plugin
7
- * commands are included automatically.
8
- */
9
- import type { Command } from "commander";
10
- interface CommandInfo {
11
- name: string;
12
- description: string;
13
- options: Array<{
14
- flags: string;
15
- description: string;
16
- }>;
17
- subcommands: CommandInfo[];
18
- }
19
- /**
20
- * Walk the Commander.js program tree and collect command metadata.
21
- */
22
- export declare function collectCommands(cmd: Command): CommandInfo[];
23
- export declare function generateBash(cmds: CommandInfo[]): string;
24
- export declare function generateZsh(cmds: CommandInfo[]): string;
25
- export declare function generateFish(cmds: CommandInfo[]): string;
26
- type Shell = "bash" | "zsh" | "fish";
27
- /**
28
- * Detect the user's current shell.
29
- */
30
- export declare function detectShell(): Shell;
31
- /**
32
- * Install completion for the detected (or specified) shell.
33
- */
34
- export declare function installCompletion(cmds: CommandInfo[], shell?: Shell): {
35
- shell: Shell;
36
- path: string;
37
- };
38
- /**
39
- * Uninstall vibe completion from the detected (or specified) shell.
40
- */
41
- export declare function uninstallCompletion(shell?: Shell): {
42
- shell: Shell;
43
- path: string;
44
- };
45
- export {};
46
- //# sourceMappingURL=completion.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/services/completion.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,WAAW,EAAE,WAAW,EAAE,CAAC;CAC5B;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,EAAE,CAU3D;AAoBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,CA+DxD;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,CAsDvD;AAQD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,CAkExD;AAiBD,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAErC;;GAEG;AACH,wBAAgB,WAAW,IAAI,KAAK,CAKnC;AAcD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,EAAE,EACnB,KAAK,CAAC,EAAE,KAAK,GACZ;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4BhC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG;IAClD,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAyBA"}