@nordsym/apiclaw 1.3.6 → 1.3.8

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 (214) hide show
  1. package/README.md +422 -169
  2. package/convex/_generated/api.d.ts +16 -0
  3. package/convex/agents.ts +403 -0
  4. package/convex/billing.ts +651 -216
  5. package/convex/crons.ts +17 -0
  6. package/convex/directCall.ts +80 -0
  7. package/convex/earnProgress.ts +753 -0
  8. package/convex/email.ts +135 -82
  9. package/convex/feedback.ts +265 -0
  10. package/convex/http.ts +80 -4
  11. package/convex/logs.ts +304 -0
  12. package/convex/providerKeys.ts +289 -0
  13. package/convex/providers.ts +18 -0
  14. package/convex/schema.ts +185 -1
  15. package/convex/stripeActions.ts +512 -0
  16. package/convex/webhooks.ts +494 -0
  17. package/convex/workspaces.ts +158 -3
  18. package/dist/adapters/base.d.ts +112 -0
  19. package/dist/adapters/base.d.ts.map +1 -0
  20. package/dist/adapters/base.js +247 -0
  21. package/dist/adapters/base.js.map +1 -0
  22. package/dist/adapters/claude-desktop.d.ts +12 -0
  23. package/dist/adapters/claude-desktop.d.ts.map +1 -0
  24. package/dist/adapters/claude-desktop.js +36 -0
  25. package/dist/adapters/claude-desktop.js.map +1 -0
  26. package/dist/adapters/cline.d.ts +20 -0
  27. package/dist/adapters/cline.d.ts.map +1 -0
  28. package/dist/adapters/cline.js +77 -0
  29. package/dist/adapters/cline.js.map +1 -0
  30. package/dist/adapters/continue.d.ts +26 -0
  31. package/dist/adapters/continue.d.ts.map +1 -0
  32. package/dist/adapters/continue.js +68 -0
  33. package/dist/adapters/continue.js.map +1 -0
  34. package/dist/adapters/cursor.d.ts +12 -0
  35. package/dist/adapters/cursor.d.ts.map +1 -0
  36. package/dist/adapters/cursor.js +38 -0
  37. package/dist/adapters/cursor.js.map +1 -0
  38. package/dist/adapters/custom.d.ts +47 -0
  39. package/dist/adapters/custom.d.ts.map +1 -0
  40. package/dist/adapters/custom.js +146 -0
  41. package/dist/adapters/custom.js.map +1 -0
  42. package/dist/adapters/detect.d.ts +69 -0
  43. package/dist/adapters/detect.d.ts.map +1 -0
  44. package/dist/adapters/detect.js +158 -0
  45. package/dist/adapters/detect.js.map +1 -0
  46. package/dist/adapters/index.d.ts +21 -0
  47. package/dist/adapters/index.d.ts.map +1 -0
  48. package/dist/adapters/index.js +23 -0
  49. package/dist/adapters/index.js.map +1 -0
  50. package/dist/adapters/windsurf.d.ts +12 -0
  51. package/dist/adapters/windsurf.d.ts.map +1 -0
  52. package/dist/adapters/windsurf.js +39 -0
  53. package/dist/adapters/windsurf.js.map +1 -0
  54. package/dist/bin.d.ts +9 -0
  55. package/dist/bin.d.ts.map +1 -0
  56. package/dist/bin.js +19 -0
  57. package/dist/bin.js.map +1 -0
  58. package/dist/cli/commands/doctor.d.ts +34 -0
  59. package/dist/cli/commands/doctor.d.ts.map +1 -0
  60. package/dist/cli/commands/doctor.js +312 -0
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/index.d.ts +9 -0
  63. package/dist/cli/commands/index.d.ts.map +1 -0
  64. package/dist/cli/commands/index.js +9 -0
  65. package/dist/cli/commands/index.js.map +1 -0
  66. package/dist/cli/commands/restore.d.ts +50 -0
  67. package/dist/cli/commands/restore.d.ts.map +1 -0
  68. package/dist/cli/commands/restore.js +260 -0
  69. package/dist/cli/commands/restore.js.map +1 -0
  70. package/dist/cli/commands/setup.d.ts +19 -0
  71. package/dist/cli/commands/setup.d.ts.map +1 -0
  72. package/dist/cli/commands/setup.js +206 -0
  73. package/dist/cli/commands/setup.js.map +1 -0
  74. package/dist/cli/commands/uninstall.d.ts +37 -0
  75. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  76. package/dist/cli/commands/uninstall.js +189 -0
  77. package/dist/cli/commands/uninstall.js.map +1 -0
  78. package/dist/cli/index.d.ts +7 -0
  79. package/dist/cli/index.d.ts.map +1 -0
  80. package/dist/cli/index.js +97 -0
  81. package/dist/cli/index.js.map +1 -0
  82. package/dist/discovery.d.ts +6 -2
  83. package/dist/discovery.d.ts.map +1 -1
  84. package/dist/discovery.js +296 -2
  85. package/dist/discovery.js.map +1 -1
  86. package/dist/enterprise/env.d.ts +56 -0
  87. package/dist/enterprise/env.d.ts.map +1 -0
  88. package/dist/enterprise/env.js +124 -0
  89. package/dist/enterprise/env.js.map +1 -0
  90. package/dist/enterprise/index.d.ts +7 -0
  91. package/dist/enterprise/index.d.ts.map +1 -0
  92. package/dist/enterprise/index.js +7 -0
  93. package/dist/enterprise/index.js.map +1 -0
  94. package/dist/enterprise/script-generator.d.ts +32 -0
  95. package/dist/enterprise/script-generator.d.ts.map +1 -0
  96. package/dist/enterprise/script-generator.js +461 -0
  97. package/dist/enterprise/script-generator.js.map +1 -0
  98. package/dist/execute.d.ts +21 -0
  99. package/dist/execute.d.ts.map +1 -1
  100. package/dist/execute.js +231 -0
  101. package/dist/execute.js.map +1 -1
  102. package/dist/index.js +257 -7
  103. package/dist/index.js.map +1 -1
  104. package/dist/metered.d.ts +62 -0
  105. package/dist/metered.d.ts.map +1 -0
  106. package/dist/metered.js +81 -0
  107. package/dist/metered.js.map +1 -0
  108. package/dist/stripe.d.ts +62 -0
  109. package/dist/stripe.d.ts.map +1 -1
  110. package/dist/stripe.js +212 -0
  111. package/dist/stripe.js.map +1 -1
  112. package/dist/types.d.ts +29 -0
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/ui/colors.d.ts +111 -0
  115. package/dist/ui/colors.d.ts.map +1 -0
  116. package/dist/ui/colors.js +185 -0
  117. package/dist/ui/colors.js.map +1 -0
  118. package/dist/ui/errors.d.ts +69 -0
  119. package/dist/ui/errors.d.ts.map +1 -0
  120. package/dist/ui/errors.js +334 -0
  121. package/dist/ui/errors.js.map +1 -0
  122. package/dist/ui/index.d.ts +10 -0
  123. package/dist/ui/index.d.ts.map +1 -0
  124. package/dist/ui/index.js +14 -0
  125. package/dist/ui/index.js.map +1 -0
  126. package/dist/ui/prompts.d.ts +88 -0
  127. package/dist/ui/prompts.d.ts.map +1 -0
  128. package/dist/ui/prompts.js +295 -0
  129. package/dist/ui/prompts.js.map +1 -0
  130. package/dist/ui/spinner.d.ts +112 -0
  131. package/dist/ui/spinner.d.ts.map +1 -0
  132. package/dist/ui/spinner.js +229 -0
  133. package/dist/ui/spinner.js.map +1 -0
  134. package/dist/utils/backup.d.ts +48 -0
  135. package/dist/utils/backup.d.ts.map +1 -0
  136. package/dist/utils/backup.js +182 -0
  137. package/dist/utils/backup.js.map +1 -0
  138. package/dist/utils/config.d.ts +80 -0
  139. package/dist/utils/config.d.ts.map +1 -0
  140. package/dist/utils/config.js +221 -0
  141. package/dist/utils/config.js.map +1 -0
  142. package/dist/utils/os.d.ts +45 -0
  143. package/dist/utils/os.d.ts.map +1 -0
  144. package/dist/utils/os.js +106 -0
  145. package/dist/utils/os.js.map +1 -0
  146. package/dist/utils/paths.d.ts +38 -0
  147. package/dist/utils/paths.d.ts.map +1 -0
  148. package/dist/utils/paths.js +160 -0
  149. package/dist/utils/paths.js.map +1 -0
  150. package/docs/PRD-BILLING.md +226 -0
  151. package/docs/PRD-EARN-SYSTEM.md +261 -0
  152. package/docs/PRD-MCP-AUTO-SETUP.md +623 -0
  153. package/docs/PRD-final-polish.md +117 -0
  154. package/docs/PRD-mobile-responsive.md +56 -0
  155. package/docs/PRD-navigation-expansion.md +295 -0
  156. package/docs/PRD-stripe-billing.md +312 -0
  157. package/docs/PRD-workspace-cleanup.md +200 -0
  158. package/docs/enterprise-deployment.md +728 -0
  159. package/landing/next.config.mjs +14 -0
  160. package/landing/public/stats.json +4 -2
  161. package/landing/scripts/generate-stats.js +12 -0
  162. package/landing/src/app/api/billing/checkout/route.ts +109 -0
  163. package/landing/src/app/api/billing/payment-method/route.ts +118 -0
  164. package/landing/src/app/api/billing/portal/route.ts +64 -0
  165. package/landing/src/app/api/workspace-auth/magic-link/route.ts +6 -3
  166. package/landing/src/app/auth/verify/page.tsx +31 -9
  167. package/landing/src/app/docs/page.tsx +1 -1
  168. package/landing/src/app/earn/page.tsx +6 -6
  169. package/landing/src/app/join/page.tsx +49 -0
  170. package/landing/src/app/login/page.tsx +8 -2
  171. package/landing/src/app/page.tsx +81 -96
  172. package/landing/src/app/providers/dashboard/page.tsx +1 -1
  173. package/landing/src/app/providers/register/page.tsx +1 -1
  174. package/landing/src/app/workspace/page.tsx +3269 -534
  175. package/landing/src/components/CheckoutButton.tsx +188 -0
  176. package/landing/src/components/EarnCreditsTab.tsx +842 -0
  177. package/landing/src/components/Toast.tsx +84 -0
  178. package/landing/src/lib/stats.json +3 -1
  179. package/package.json +9 -2
  180. package/src/adapters/base.ts +363 -0
  181. package/src/adapters/claude-desktop.ts +41 -0
  182. package/src/adapters/cline.ts +88 -0
  183. package/src/adapters/continue.ts +91 -0
  184. package/src/adapters/cursor.ts +43 -0
  185. package/src/adapters/custom.ts +188 -0
  186. package/src/adapters/detect.ts +202 -0
  187. package/src/adapters/index.ts +47 -0
  188. package/src/adapters/windsurf.ts +44 -0
  189. package/src/bin.ts +19 -0
  190. package/src/cli/commands/doctor.ts +367 -0
  191. package/src/cli/commands/index.ts +9 -0
  192. package/src/cli/commands/restore.ts +333 -0
  193. package/src/cli/commands/setup.ts +276 -0
  194. package/src/cli/commands/uninstall.ts +240 -0
  195. package/src/cli/index.ts +107 -0
  196. package/src/discovery.ts +328 -3
  197. package/src/enterprise/env.ts +156 -0
  198. package/src/enterprise/index.ts +7 -0
  199. package/src/enterprise/script-generator.ts +481 -0
  200. package/src/execute.ts +256 -0
  201. package/src/index.ts +290 -7
  202. package/src/metered.ts +149 -0
  203. package/src/stripe.ts +253 -0
  204. package/src/types.ts +32 -0
  205. package/src/ui/colors.ts +219 -0
  206. package/src/ui/errors.ts +394 -0
  207. package/src/ui/index.ts +17 -0
  208. package/src/ui/prompts.ts +390 -0
  209. package/src/ui/spinner.ts +325 -0
  210. package/src/utils/backup.ts +224 -0
  211. package/src/utils/config.ts +315 -0
  212. package/src/utils/os.ts +124 -0
  213. package/src/utils/paths.ts +203 -0
  214. package/landing/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Doctor Command
3
+ * Health check for APIClaw installation and MCP client configurations
4
+ */
5
+ export interface DoctorResult {
6
+ healthy: boolean;
7
+ checks: CheckResult[];
8
+ summary: string;
9
+ }
10
+ export interface CheckResult {
11
+ category: string;
12
+ name: string;
13
+ status: 'pass' | 'fail' | 'warn' | 'skip';
14
+ message: string;
15
+ details?: string;
16
+ }
17
+ /**
18
+ * Run all health checks
19
+ */
20
+ export declare function runDoctor(options?: {
21
+ serverName?: string;
22
+ }): Promise<DoctorResult>;
23
+ /**
24
+ * Format doctor results for display
25
+ */
26
+ export declare function formatDoctorOutput(result: DoctorResult): string;
27
+ /**
28
+ * Doctor command handler
29
+ */
30
+ export declare function doctorCommand(options?: {
31
+ serverName?: string;
32
+ json?: boolean;
33
+ }): Promise<void>;
34
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkOD;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAqC5F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAyC/D;AAcD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAaxG"}
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Doctor Command
3
+ * Health check for APIClaw installation and MCP client configurations
4
+ */
5
+ import { existsSync } from 'fs';
6
+ import { execSync } from 'child_process';
7
+ import { getAllClients, getClientConfig } from '../../utils/paths.js';
8
+ import { readConfig, hasApiclawConfig } from '../../utils/config.js';
9
+ import { getApiUrl, readEnvConfig, ENV_VARS } from '../../enterprise/env.js';
10
+ /**
11
+ * Check Node.js availability and version
12
+ */
13
+ function checkNode() {
14
+ try {
15
+ const version = execSync('node --version', { encoding: 'utf-8' }).trim();
16
+ const major = parseInt(version.replace('v', '').split('.')[0], 10);
17
+ if (major < 18) {
18
+ return {
19
+ category: 'System',
20
+ name: 'Node.js',
21
+ status: 'warn',
22
+ message: `${version} (recommend v18+)`,
23
+ };
24
+ }
25
+ return {
26
+ category: 'System',
27
+ name: 'Node.js',
28
+ status: 'pass',
29
+ message: version,
30
+ };
31
+ }
32
+ catch {
33
+ return {
34
+ category: 'System',
35
+ name: 'Node.js',
36
+ status: 'fail',
37
+ message: 'Not found',
38
+ details: 'Node.js is required. Install from https://nodejs.org',
39
+ };
40
+ }
41
+ }
42
+ /**
43
+ * Check npm availability
44
+ */
45
+ function checkNpm() {
46
+ try {
47
+ const version = execSync('npm --version', { encoding: 'utf-8' }).trim();
48
+ return {
49
+ category: 'System',
50
+ name: 'npm',
51
+ status: 'pass',
52
+ message: `v${version}`,
53
+ };
54
+ }
55
+ catch {
56
+ return {
57
+ category: 'System',
58
+ name: 'npm',
59
+ status: 'fail',
60
+ message: 'Not found',
61
+ details: 'npm is required for npx to work',
62
+ };
63
+ }
64
+ }
65
+ /**
66
+ * Check npx availability
67
+ */
68
+ function checkNpx() {
69
+ try {
70
+ execSync('npx --version', { encoding: 'utf-8', stdio: 'pipe' });
71
+ return {
72
+ category: 'System',
73
+ name: 'npx',
74
+ status: 'pass',
75
+ message: 'Available',
76
+ };
77
+ }
78
+ catch {
79
+ return {
80
+ category: 'System',
81
+ name: 'npx',
82
+ status: 'fail',
83
+ message: 'Not found',
84
+ details: 'npx is required for MCP server execution',
85
+ };
86
+ }
87
+ }
88
+ /**
89
+ * Check MCP client configuration
90
+ */
91
+ function checkClient(client, serverName = 'apiclaw') {
92
+ const config = getClientConfig(client);
93
+ const configPath = config.configPath;
94
+ // Check if config file exists
95
+ if (!existsSync(configPath)) {
96
+ // Check if config directory exists (client might be installed but not configured)
97
+ const dirExists = existsSync(config.configDir);
98
+ if (dirExists) {
99
+ return {
100
+ category: 'MCP Clients',
101
+ name: config.displayName,
102
+ status: 'warn',
103
+ message: 'Installed but not configured',
104
+ details: `Config file: ${configPath}`,
105
+ };
106
+ }
107
+ return {
108
+ category: 'MCP Clients',
109
+ name: config.displayName,
110
+ status: 'skip',
111
+ message: 'Not installed',
112
+ };
113
+ }
114
+ // Read and check config
115
+ const readResult = readConfig(configPath);
116
+ if (!readResult.success) {
117
+ return {
118
+ category: 'MCP Clients',
119
+ name: config.displayName,
120
+ status: 'fail',
121
+ message: 'Invalid config',
122
+ details: readResult.error,
123
+ };
124
+ }
125
+ // Check if APIClaw is configured
126
+ if (readResult.config && hasApiclawConfig(readResult.config, serverName)) {
127
+ return {
128
+ category: 'MCP Clients',
129
+ name: config.displayName,
130
+ status: 'pass',
131
+ message: 'Configured',
132
+ };
133
+ }
134
+ return {
135
+ category: 'MCP Clients',
136
+ name: config.displayName,
137
+ status: 'warn',
138
+ message: 'APIClaw not configured',
139
+ details: `Run: npx @nordsym/apiclaw setup --client ${client}`,
140
+ };
141
+ }
142
+ /**
143
+ * Check API connectivity
144
+ */
145
+ async function checkConnectivity() {
146
+ const apiUrl = getApiUrl();
147
+ const testUrl = `${apiUrl}/health`;
148
+ try {
149
+ const controller = new AbortController();
150
+ const timeout = setTimeout(() => controller.abort(), 5000);
151
+ const response = await fetch(testUrl, {
152
+ method: 'GET',
153
+ signal: controller.signal,
154
+ });
155
+ clearTimeout(timeout);
156
+ if (response.ok) {
157
+ return {
158
+ category: 'Connectivity',
159
+ name: 'API Server',
160
+ status: 'pass',
161
+ message: `${apiUrl} reachable`,
162
+ };
163
+ }
164
+ return {
165
+ category: 'Connectivity',
166
+ name: 'API Server',
167
+ status: 'warn',
168
+ message: `${apiUrl} returned ${response.status}`,
169
+ };
170
+ }
171
+ catch (error) {
172
+ // For now, skip connectivity check if fetch fails (might be offline mode)
173
+ return {
174
+ category: 'Connectivity',
175
+ name: 'API Server',
176
+ status: 'skip',
177
+ message: 'Could not reach API (offline?)',
178
+ details: `URL: ${testUrl}`,
179
+ };
180
+ }
181
+ }
182
+ /**
183
+ * Check environment variables
184
+ */
185
+ function checkEnvVars() {
186
+ const envConfig = readEnvConfig();
187
+ const results = [];
188
+ if (envConfig.workspace) {
189
+ results.push({
190
+ category: 'Environment',
191
+ name: ENV_VARS.WORKSPACE,
192
+ status: 'pass',
193
+ message: envConfig.workspace,
194
+ });
195
+ }
196
+ if (envConfig.apiUrl) {
197
+ results.push({
198
+ category: 'Environment',
199
+ name: ENV_VARS.API_URL,
200
+ status: 'pass',
201
+ message: envConfig.apiUrl,
202
+ });
203
+ }
204
+ if (envConfig.disableTelemetry) {
205
+ results.push({
206
+ category: 'Environment',
207
+ name: ENV_VARS.DISABLE_TELEMETRY,
208
+ status: 'pass',
209
+ message: 'true',
210
+ });
211
+ }
212
+ return results;
213
+ }
214
+ /**
215
+ * Run all health checks
216
+ */
217
+ export async function runDoctor(options = {}) {
218
+ const checks = [];
219
+ const serverName = options.serverName || 'apiclaw';
220
+ // System checks
221
+ checks.push(checkNode());
222
+ checks.push(checkNpm());
223
+ checks.push(checkNpx());
224
+ // Client checks
225
+ for (const client of getAllClients()) {
226
+ checks.push(checkClient(client, serverName));
227
+ }
228
+ // Connectivity check
229
+ checks.push(await checkConnectivity());
230
+ // Environment checks
231
+ checks.push(...checkEnvVars());
232
+ // Calculate health status
233
+ const failures = checks.filter(c => c.status === 'fail');
234
+ const warnings = checks.filter(c => c.status === 'warn');
235
+ const passes = checks.filter(c => c.status === 'pass');
236
+ let healthy = failures.length === 0;
237
+ let summary;
238
+ if (failures.length > 0) {
239
+ summary = `${failures.length} issue(s) found`;
240
+ }
241
+ else if (warnings.length > 0) {
242
+ summary = `All systems operational (${warnings.length} warning(s))`;
243
+ }
244
+ else {
245
+ summary = 'All systems operational ✓';
246
+ }
247
+ return { healthy, checks, summary };
248
+ }
249
+ /**
250
+ * Format doctor results for display
251
+ */
252
+ export function formatDoctorOutput(result) {
253
+ const lines = [];
254
+ lines.push('');
255
+ lines.push('🔍 APIClaw Health Check');
256
+ lines.push('========================');
257
+ lines.push('');
258
+ // Group checks by category
259
+ const categories = new Map();
260
+ for (const check of result.checks) {
261
+ const existing = categories.get(check.category) || [];
262
+ existing.push(check);
263
+ categories.set(check.category, existing);
264
+ }
265
+ // Format each category
266
+ for (const [category, checks] of categories) {
267
+ // Skip empty categories
268
+ if (checks.length === 0)
269
+ continue;
270
+ lines.push(`${category}:`);
271
+ for (const check of checks) {
272
+ const icon = getStatusIcon(check.status);
273
+ lines.push(` ${icon} ${check.name} - ${check.message}`);
274
+ if (check.details && (check.status === 'fail' || check.status === 'warn')) {
275
+ lines.push(` ${check.details}`);
276
+ }
277
+ }
278
+ lines.push('');
279
+ }
280
+ // Summary
281
+ lines.push(`Status: ${result.summary}`);
282
+ lines.push('');
283
+ return lines.join('\n');
284
+ }
285
+ /**
286
+ * Get icon for status
287
+ */
288
+ function getStatusIcon(status) {
289
+ switch (status) {
290
+ case 'pass': return '✓';
291
+ case 'fail': return '✗';
292
+ case 'warn': return '⚠';
293
+ case 'skip': return '○';
294
+ }
295
+ }
296
+ /**
297
+ * Doctor command handler
298
+ */
299
+ export async function doctorCommand(options = {}) {
300
+ const result = await runDoctor(options);
301
+ if (options.json) {
302
+ console.log(JSON.stringify(result, null, 2));
303
+ }
304
+ else {
305
+ console.log(formatDoctorOutput(result));
306
+ }
307
+ // Exit with error code if unhealthy
308
+ if (!result.healthy) {
309
+ process.exit(1);
310
+ }
311
+ }
312
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI Commands Index
3
+ * Exports all command handlers
4
+ */
5
+ export * from './setup.js';
6
+ export * from './doctor.js';
7
+ export * from './restore.js';
8
+ export * from './uninstall.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI Commands Index
3
+ * Exports all command handlers
4
+ */
5
+ export * from './setup.js';
6
+ export * from './doctor.js';
7
+ export * from './restore.js';
8
+ export * from './uninstall.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Restore Command
3
+ * Rollback MCP client configs from backups
4
+ */
5
+ import { BackupInfo } from '../../utils/backup.js';
6
+ import { MCPClient } from '../../utils/paths.js';
7
+ export interface RestoreOptions {
8
+ client?: string;
9
+ backup?: string;
10
+ list?: boolean;
11
+ all?: boolean;
12
+ interactive?: boolean;
13
+ dryRun?: boolean;
14
+ }
15
+ export interface RestoreResult {
16
+ success: boolean;
17
+ client: string;
18
+ message: string;
19
+ backupUsed?: string;
20
+ preRestoreBackup?: string;
21
+ }
22
+ /**
23
+ * List all backups across all clients
24
+ */
25
+ export declare function listAllBackups(): Map<MCPClient, BackupInfo[]>;
26
+ /**
27
+ * Format backup list for display
28
+ */
29
+ export declare function formatBackupList(backups: Map<MCPClient, BackupInfo[]>): string;
30
+ /**
31
+ * Restore a specific client to its latest backup
32
+ */
33
+ export declare function restoreClient(client: MCPClient): RestoreResult;
34
+ /**
35
+ * Restore from a specific backup file
36
+ */
37
+ export declare function restoreFromFile(backupPath: string, client?: MCPClient): RestoreResult;
38
+ /**
39
+ * Restore all clients to their latest backups
40
+ */
41
+ export declare function restoreAll(): RestoreResult[];
42
+ /**
43
+ * Format restore results for display
44
+ */
45
+ export declare function formatRestoreResults(results: RestoreResult[]): string;
46
+ /**
47
+ * Restore command handler
48
+ */
49
+ export declare function restoreCommand(options?: RestoreOptions): Promise<void>;
50
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/restore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAKL,UAAU,EACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAkC,SAAS,EAAkB,MAAM,sBAAsB,CAAC;AAEjG,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAUD;;GAEG;AACH,wBAAgB,cAAc,IAAI,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAW7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,GAAG,MAAM,CAoC9E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CA0C9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,aAAa,CA+CrF;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,aAAa,EAAE,CAgB5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAqCrE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEhF"}