@revealui/mcp 0.0.1-pre.0 → 0.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.
- package/.env.example +9 -0
- package/MCP_MAINTENANCE.md +265 -0
- package/README.md +260 -0
- package/__tests__/crdt.integration.test.ts +156 -0
- package/configs/README.md +77 -0
- package/configs/claude-template.json +54 -0
- package/dist/packages/core/src/database/ssl-config.d.ts +9 -0
- package/dist/packages/core/src/database/ssl-config.d.ts.map +1 -0
- package/dist/packages/core/src/database/ssl-config.js +8 -0
- package/dist/packages/core/src/database/ssl-config.js.map +1 -0
- package/dist/packages/core/src/features.d.ts +86 -0
- package/dist/packages/core/src/features.d.ts.map +1 -0
- package/dist/packages/core/src/features.js +93 -0
- package/dist/packages/core/src/features.js.map +1 -0
- package/dist/packages/core/src/license.d.ts +75 -0
- package/dist/packages/core/src/license.d.ts.map +1 -0
- package/dist/packages/core/src/license.js +174 -0
- package/dist/packages/core/src/license.js.map +1 -0
- package/dist/packages/core/src/monitoring/alerts.d.ts +118 -0
- package/dist/packages/core/src/monitoring/alerts.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/alerts.js +325 -0
- package/dist/packages/core/src/monitoring/alerts.js.map +1 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.d.ts +71 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.js +227 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.js.map +1 -0
- package/dist/packages/core/src/monitoring/health-monitor.d.ts +22 -0
- package/dist/packages/core/src/monitoring/health-monitor.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/health-monitor.js +143 -0
- package/dist/packages/core/src/monitoring/health-monitor.js.map +1 -0
- package/dist/packages/core/src/monitoring/index.d.ts +14 -0
- package/dist/packages/core/src/monitoring/index.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/index.js +18 -0
- package/dist/packages/core/src/monitoring/index.js.map +1 -0
- package/dist/packages/core/src/monitoring/process-registry.d.ts +97 -0
- package/dist/packages/core/src/monitoring/process-registry.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/process-registry.js +223 -0
- package/dist/packages/core/src/monitoring/process-registry.js.map +1 -0
- package/dist/packages/core/src/monitoring/types.d.ts +231 -0
- package/dist/packages/core/src/monitoring/types.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/types.js +43 -0
- package/dist/packages/core/src/monitoring/types.js.map +1 -0
- package/dist/packages/core/src/monitoring/zombie-detector.d.ts +81 -0
- package/dist/packages/core/src/monitoring/zombie-detector.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/zombie-detector.js +232 -0
- package/dist/packages/core/src/monitoring/zombie-detector.js.map +1 -0
- package/dist/packages/core/src/observability/logger.d.ts +47 -0
- package/dist/packages/core/src/observability/logger.d.ts.map +1 -0
- package/dist/packages/core/src/observability/logger.js +141 -0
- package/dist/packages/core/src/observability/logger.js.map +1 -0
- package/dist/packages/core/src/utils/logger-server.d.ts +32 -0
- package/dist/packages/core/src/utils/logger-server.d.ts.map +1 -0
- package/dist/packages/core/src/utils/logger-server.js +69 -0
- package/dist/packages/core/src/utils/logger-server.js.map +1 -0
- package/dist/packages/core/src/utils/request-context.d.ts +143 -0
- package/dist/packages/core/src/utils/request-context.d.ts.map +1 -0
- package/dist/packages/core/src/utils/request-context.js +169 -0
- package/dist/packages/core/src/utils/request-context.js.map +1 -0
- package/dist/packages/dev/src/code-validator/index.d.ts +20 -0
- package/dist/packages/dev/src/code-validator/index.d.ts.map +1 -0
- package/dist/packages/dev/src/code-validator/index.js +20 -0
- package/dist/packages/dev/src/code-validator/index.js.map +1 -0
- package/dist/packages/dev/src/code-validator/types.d.ts +67 -0
- package/dist/packages/dev/src/code-validator/types.d.ts.map +1 -0
- package/dist/packages/dev/src/code-validator/types.js +7 -0
- package/dist/packages/dev/src/code-validator/types.js.map +1 -0
- package/dist/packages/dev/src/code-validator/validator.d.ts +48 -0
- package/dist/packages/dev/src/code-validator/validator.d.ts.map +1 -0
- package/dist/packages/dev/src/code-validator/validator.js +176 -0
- package/dist/packages/dev/src/code-validator/validator.js.map +1 -0
- package/dist/packages/mcp/src/adapters/db.d.ts +46 -0
- package/dist/packages/mcp/src/adapters/db.d.ts.map +1 -0
- package/dist/packages/mcp/src/adapters/db.js +127 -0
- package/dist/packages/mcp/src/adapters/db.js.map +1 -0
- package/dist/packages/mcp/src/config/index.d.ts +11 -0
- package/dist/packages/mcp/src/config/index.d.ts.map +1 -0
- package/dist/packages/mcp/src/config/index.js +18 -0
- package/dist/packages/mcp/src/config/index.js.map +1 -0
- package/dist/packages/mcp/src/contracts.d.ts +131 -0
- package/dist/packages/mcp/src/contracts.d.ts.map +1 -0
- package/dist/packages/mcp/src/contracts.js +153 -0
- package/dist/packages/mcp/src/contracts.js.map +1 -0
- package/dist/packages/mcp/src/hypervisor.d.ts +132 -0
- package/dist/packages/mcp/src/hypervisor.d.ts.map +1 -0
- package/dist/packages/mcp/src/hypervisor.js +359 -0
- package/dist/packages/mcp/src/hypervisor.js.map +1 -0
- package/dist/packages/mcp/src/index.d.ts +25 -0
- package/dist/packages/mcp/src/index.d.ts.map +1 -0
- package/dist/packages/mcp/src/index.js +41 -0
- package/dist/packages/mcp/src/index.js.map +1 -0
- package/dist/packages/mcp/src/servers/adapter.d.ts +199 -0
- package/dist/packages/mcp/src/servers/adapter.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/adapter.js +487 -0
- package/dist/packages/mcp/src/servers/adapter.js.map +1 -0
- package/dist/packages/mcp/src/servers/code-validator.d.ts +24 -0
- package/dist/packages/mcp/src/servers/code-validator.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/code-validator.js +156 -0
- package/dist/packages/mcp/src/servers/code-validator.js.map +1 -0
- package/dist/packages/mcp/src/servers/neon.d.ts +11 -0
- package/dist/packages/mcp/src/servers/neon.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/neon.js +90 -0
- package/dist/packages/mcp/src/servers/neon.js.map +1 -0
- package/dist/packages/mcp/src/servers/next-devtools.d.ts +11 -0
- package/dist/packages/mcp/src/servers/next-devtools.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/next-devtools.js +215 -0
- package/dist/packages/mcp/src/servers/next-devtools.js.map +1 -0
- package/dist/packages/mcp/src/servers/playwright.d.ts +11 -0
- package/dist/packages/mcp/src/servers/playwright.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/playwright.js +68 -0
- package/dist/packages/mcp/src/servers/playwright.js.map +1 -0
- package/dist/packages/mcp/src/servers/stripe.d.ts +11 -0
- package/dist/packages/mcp/src/servers/stripe.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/stripe.js +86 -0
- package/dist/packages/mcp/src/servers/stripe.js.map +1 -0
- package/dist/packages/mcp/src/servers/supabase.d.ts +11 -0
- package/dist/packages/mcp/src/servers/supabase.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/supabase.js +144 -0
- package/dist/packages/mcp/src/servers/supabase.js.map +1 -0
- package/dist/packages/mcp/src/servers/vercel.d.ts +11 -0
- package/dist/packages/mcp/src/servers/vercel.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/vercel.js +87 -0
- package/dist/packages/mcp/src/servers/vercel.js.map +1 -0
- package/dist/packages/mcp/src/servers/vultr-test.d.ts +3 -0
- package/dist/packages/mcp/src/servers/vultr-test.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/vultr-test.js +82 -0
- package/dist/packages/mcp/src/servers/vultr-test.js.map +1 -0
- package/dist/scripts/lib/analyzers/console-analyzer.d.ts +188 -0
- package/dist/scripts/lib/analyzers/console-analyzer.d.ts.map +1 -0
- package/dist/scripts/lib/analyzers/console-analyzer.js +432 -0
- package/dist/scripts/lib/analyzers/console-analyzer.js.map +1 -0
- package/dist/scripts/lib/analyzers/index.d.ts +11 -0
- package/dist/scripts/lib/analyzers/index.d.ts.map +1 -0
- package/dist/scripts/lib/analyzers/index.js +11 -0
- package/dist/scripts/lib/analyzers/index.js.map +1 -0
- package/dist/scripts/lib/args.d.ts +104 -0
- package/dist/scripts/lib/args.d.ts.map +1 -0
- package/dist/scripts/lib/args.js +304 -0
- package/dist/scripts/lib/args.js.map +1 -0
- package/dist/scripts/lib/cache.d.ts +185 -0
- package/dist/scripts/lib/cache.d.ts.map +1 -0
- package/dist/scripts/lib/cache.js +390 -0
- package/dist/scripts/lib/cache.js.map +1 -0
- package/dist/scripts/lib/cli/dispatch.d.ts +116 -0
- package/dist/scripts/lib/cli/dispatch.d.ts.map +1 -0
- package/dist/scripts/lib/cli/dispatch.js +206 -0
- package/dist/scripts/lib/cli/dispatch.js.map +1 -0
- package/dist/scripts/lib/cli/index.d.ts +10 -0
- package/dist/scripts/lib/cli/index.d.ts.map +1 -0
- package/dist/scripts/lib/cli/index.js +10 -0
- package/dist/scripts/lib/cli/index.js.map +1 -0
- package/dist/scripts/lib/database/ssl-config.d.ts +26 -0
- package/dist/scripts/lib/database/ssl-config.d.ts.map +1 -0
- package/dist/scripts/lib/database/ssl-config.js +47 -0
- package/dist/scripts/lib/database/ssl-config.js.map +1 -0
- package/dist/scripts/lib/errors.d.ts +218 -0
- package/dist/scripts/lib/errors.d.ts.map +1 -0
- package/dist/scripts/lib/errors.js +543 -0
- package/dist/scripts/lib/errors.js.map +1 -0
- package/dist/scripts/lib/exec.d.ts +107 -0
- package/dist/scripts/lib/exec.d.ts.map +1 -0
- package/dist/scripts/lib/exec.js +232 -0
- package/dist/scripts/lib/exec.js.map +1 -0
- package/dist/scripts/lib/index.d.ts +50 -0
- package/dist/scripts/lib/index.d.ts.map +1 -0
- package/dist/scripts/lib/index.js +65 -0
- package/dist/scripts/lib/index.js.map +1 -0
- package/dist/scripts/lib/logger.d.ts +50 -0
- package/dist/scripts/lib/logger.d.ts.map +1 -0
- package/dist/scripts/lib/logger.js +159 -0
- package/dist/scripts/lib/logger.js.map +1 -0
- package/dist/scripts/lib/output.d.ts +149 -0
- package/dist/scripts/lib/output.d.ts.map +1 -0
- package/dist/scripts/lib/output.js +263 -0
- package/dist/scripts/lib/output.js.map +1 -0
- package/dist/scripts/lib/parallel.d.ts +164 -0
- package/dist/scripts/lib/parallel.d.ts.map +1 -0
- package/dist/scripts/lib/parallel.js +355 -0
- package/dist/scripts/lib/parallel.js.map +1 -0
- package/dist/scripts/lib/paths.d.ts +92 -0
- package/dist/scripts/lib/paths.d.ts.map +1 -0
- package/dist/scripts/lib/paths.js +171 -0
- package/dist/scripts/lib/paths.js.map +1 -0
- package/dist/scripts/lib/state/adapters/memory.d.ts +42 -0
- package/dist/scripts/lib/state/adapters/memory.d.ts.map +1 -0
- package/dist/scripts/lib/state/adapters/memory.js +110 -0
- package/dist/scripts/lib/state/adapters/memory.js.map +1 -0
- package/dist/scripts/lib/state/adapters/pglite.d.ts +46 -0
- package/dist/scripts/lib/state/adapters/pglite.d.ts.map +1 -0
- package/dist/scripts/lib/state/adapters/pglite.js +256 -0
- package/dist/scripts/lib/state/adapters/pglite.js.map +1 -0
- package/dist/scripts/lib/state/index.d.ts +16 -0
- package/dist/scripts/lib/state/index.d.ts.map +1 -0
- package/dist/scripts/lib/state/index.js +16 -0
- package/dist/scripts/lib/state/index.js.map +1 -0
- package/dist/scripts/lib/state/types.d.ts +111 -0
- package/dist/scripts/lib/state/types.d.ts.map +1 -0
- package/dist/scripts/lib/state/types.js +8 -0
- package/dist/scripts/lib/state/types.js.map +1 -0
- package/dist/scripts/lib/state/workflow-state.d.ts +110 -0
- package/dist/scripts/lib/state/workflow-state.d.ts.map +1 -0
- package/dist/scripts/lib/state/workflow-state.js +331 -0
- package/dist/scripts/lib/state/workflow-state.js.map +1 -0
- package/dist/scripts/lib/telemetry.d.ts +194 -0
- package/dist/scripts/lib/telemetry.d.ts.map +1 -0
- package/dist/scripts/lib/telemetry.js +394 -0
- package/dist/scripts/lib/telemetry.js.map +1 -0
- package/dist/scripts/lib/utils.d.ts +270 -0
- package/dist/scripts/lib/utils.d.ts.map +1 -0
- package/dist/scripts/lib/utils.js +473 -0
- package/dist/scripts/lib/utils.js.map +1 -0
- package/dist/scripts/lib/validation/database.d.ts +83 -0
- package/dist/scripts/lib/validation/database.d.ts.map +1 -0
- package/dist/scripts/lib/validation/database.js +199 -0
- package/dist/scripts/lib/validation/database.js.map +1 -0
- package/dist/scripts/lib/validation/env.d.ts +80 -0
- package/dist/scripts/lib/validation/env.d.ts.map +1 -0
- package/dist/scripts/lib/validation/env.js +246 -0
- package/dist/scripts/lib/validation/env.js.map +1 -0
- package/dist/scripts/lib/validation/index.d.ts +16 -0
- package/dist/scripts/lib/validation/index.d.ts.map +1 -0
- package/dist/scripts/lib/validation/index.js +16 -0
- package/dist/scripts/lib/validation/index.js.map +1 -0
- package/dist/scripts/lib/validation/post-execution.d.ts +74 -0
- package/dist/scripts/lib/validation/post-execution.d.ts.map +1 -0
- package/dist/scripts/lib/validation/post-execution.js +110 -0
- package/dist/scripts/lib/validation/post-execution.js.map +1 -0
- package/dist/scripts/lib/validation/pre-execution.d.ts +165 -0
- package/dist/scripts/lib/validation/pre-execution.d.ts.map +1 -0
- package/dist/scripts/lib/validation/pre-execution.js +466 -0
- package/dist/scripts/lib/validation/pre-execution.js.map +1 -0
- package/dist/scripts/lib/validators/documentation-validator.d.ts +242 -0
- package/dist/scripts/lib/validators/documentation-validator.d.ts.map +1 -0
- package/dist/scripts/lib/validators/documentation-validator.js +584 -0
- package/dist/scripts/lib/validators/documentation-validator.js.map +1 -0
- package/dist/scripts/lib/validators/index.d.ts +11 -0
- package/dist/scripts/lib/validators/index.d.ts.map +1 -0
- package/dist/scripts/lib/validators/index.js +11 -0
- package/dist/scripts/lib/validators/index.js.map +1 -0
- package/docker-compose.yml +46 -0
- package/docs/INDEX.md +88 -0
- package/docs/README.md +774 -0
- package/docs/SETUP.md +264 -0
- package/docs/servers/code-validator.md +586 -0
- package/eslint.config.js +7 -0
- package/migrations/0001_add_crdt_columns.sql +8 -0
- package/migrations/0001_rollback.sql +6 -0
- package/migrations/005_performance_indexes.sql +190 -0
- package/migrations/backfill_crdt_meta.js +45 -0
- package/package.json +21 -85
- package/src/__tests__/hypervisor.test.ts +212 -0
- package/src/adapters/db.ts +180 -0
- package/src/config/config.json +49 -0
- package/src/config/index.ts +30 -0
- package/src/contracts.ts +221 -0
- package/src/hypervisor.ts +464 -0
- package/src/index.ts +87 -0
- package/src/servers/adapter.ts +643 -0
- package/src/servers/code-validator.ts +188 -0
- package/src/servers/neon.ts +103 -0
- package/src/servers/next-devtools.ts +230 -0
- package/src/servers/playwright.ts +77 -0
- package/src/servers/stripe.ts +99 -0
- package/src/servers/supabase.ts +161 -0
- package/src/servers/vercel.ts +100 -0
- package/src/servers/vultr-test.ts +97 -0
- package/tsconfig.json +12 -0
- package/vitest.config.ts +22 -0
- package/LICENSE +0 -202
- package/dist/index.js +0 -10990
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Stripe MCP Server Launcher
|
|
4
|
+
*
|
|
5
|
+
* Starts the Stripe MCP server for AI-powered payment management.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* pnpm mcp:stripe
|
|
9
|
+
*/
|
|
10
|
+
import { spawn } from 'node:child_process';
|
|
11
|
+
import { createLogger, getProjectRoot } from '@revealui/scripts';
|
|
12
|
+
import { ErrorCode } from '@revealui/scripts/errors';
|
|
13
|
+
import { config } from 'dotenv';
|
|
14
|
+
import { checkMcpLicense } from '../index.js';
|
|
15
|
+
const logger = createLogger();
|
|
16
|
+
// Load environment variables
|
|
17
|
+
config();
|
|
18
|
+
const MAX_RESTARTS = 3;
|
|
19
|
+
const RESTART_DELAYS_MS = [2000, 4000, 8000];
|
|
20
|
+
async function spawnStripe(stripeSecretKey) {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const child = spawn('pnpm', ['dlx', '@stripe/mcp', '--tools=all'], {
|
|
23
|
+
stdio: 'inherit',
|
|
24
|
+
env: { ...process.env, STRIPE_SECRET_KEY: stripeSecretKey },
|
|
25
|
+
});
|
|
26
|
+
child.on('error', (error) => {
|
|
27
|
+
logger.error(`Failed to start Stripe MCP server: ${error.message}`);
|
|
28
|
+
resolve(ErrorCode.CONFIG_ERROR);
|
|
29
|
+
});
|
|
30
|
+
child.on('exit', (code) => resolve(code ?? 0));
|
|
31
|
+
process.on('SIGINT', () => {
|
|
32
|
+
child.kill('SIGINT');
|
|
33
|
+
});
|
|
34
|
+
process.on('SIGTERM', () => {
|
|
35
|
+
child.kill('SIGTERM');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async function startStripeMCP() {
|
|
40
|
+
try {
|
|
41
|
+
await getProjectRoot(import.meta.url);
|
|
42
|
+
const stripeSecretKey = process.env.STRIPE_SECRET_KEY;
|
|
43
|
+
if (!stripeSecretKey) {
|
|
44
|
+
logger.error('STRIPE_SECRET_KEY environment variable is required');
|
|
45
|
+
logger.info(' Get your key from: https://dashboard.stripe.com/apikeys');
|
|
46
|
+
process.exit(ErrorCode.CONFIG_ERROR);
|
|
47
|
+
}
|
|
48
|
+
const withRestart = process.argv.includes('--restart');
|
|
49
|
+
logger.header('Starting Stripe MCP Server');
|
|
50
|
+
logger.info(` Secret Key: ${stripeSecretKey.substring(0, 12)}...`);
|
|
51
|
+
if (withRestart)
|
|
52
|
+
logger.info(' Restart mode: enabled (up to 3 attempts)');
|
|
53
|
+
let attempt = 0;
|
|
54
|
+
while (true) {
|
|
55
|
+
const code = await spawnStripe(stripeSecretKey);
|
|
56
|
+
if (!withRestart || attempt >= MAX_RESTARTS) {
|
|
57
|
+
process.exit(code ?? 0);
|
|
58
|
+
}
|
|
59
|
+
const delay = RESTART_DELAYS_MS[attempt] ?? 8000;
|
|
60
|
+
attempt++;
|
|
61
|
+
logger.warning(` Server exited (code ${code}). Restarting in ${delay / 1000}s (attempt ${attempt}/${MAX_RESTARTS})...`);
|
|
62
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
logger.error(`Script failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
67
|
+
process.exit(ErrorCode.EXECUTION_ERROR);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Main function
|
|
72
|
+
*/
|
|
73
|
+
async function main() {
|
|
74
|
+
try {
|
|
75
|
+
if (!(await checkMcpLicense())) {
|
|
76
|
+
process.exit(ErrorCode.CONFIG_ERROR);
|
|
77
|
+
}
|
|
78
|
+
await startStripeMCP();
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
logger.error(`Script failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
process.exit(ErrorCode.EXECUTION_ERROR);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
main();
|
|
86
|
+
//# sourceMappingURL=stripe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../../../../src/servers/stripe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../../../../src/servers/supabase.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Supabase MCP Server Launcher
|
|
4
|
+
*
|
|
5
|
+
* Starts the Supabase MCP server for AI-powered database management.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* pnpm mcp:supabase
|
|
9
|
+
*/
|
|
10
|
+
import { spawn } from 'node:child_process';
|
|
11
|
+
import { randomBytes } from 'node:crypto';
|
|
12
|
+
import { createLogger, getProjectRoot } from '@revealui/scripts';
|
|
13
|
+
import { ErrorCode } from '@revealui/scripts/errors';
|
|
14
|
+
import { config } from 'dotenv';
|
|
15
|
+
import { checkMcpLicense } from '../index.js';
|
|
16
|
+
const logger = createLogger();
|
|
17
|
+
// Load environment variables
|
|
18
|
+
config();
|
|
19
|
+
async function startSupabaseMCP() {
|
|
20
|
+
try {
|
|
21
|
+
await getProjectRoot(import.meta.url);
|
|
22
|
+
// Supabase MCP uses local package supabase-mcp
|
|
23
|
+
// Verified: Package expects SUPABASE_URL, SUPABASE_ANON_KEY, and SUPABASE_SERVICE_ROLE_KEY
|
|
24
|
+
// Source: node_modules/supabase-mcp/dist/esm/config.js and services/supabase.js
|
|
25
|
+
//
|
|
26
|
+
// NEW API KEY SUPPORT (2025):
|
|
27
|
+
// Supabase introduced new API keys: sb_publishable_... (replaces anon) and sb_secret_... (replaces service_role)
|
|
28
|
+
// Legacy keys (anon/service_role JWT) still work but will be deprecated in Nov 2025
|
|
29
|
+
// The @supabase/supabase-js client accepts any key format, so we support both
|
|
30
|
+
// Reference: https://github.com/orgs/supabase/discussions/29260
|
|
31
|
+
const supabaseUrl = process.env.SUPABASE_URL;
|
|
32
|
+
// Support both legacy and new API key formats
|
|
33
|
+
// New format: SUPABASE_PUBLISHABLE_KEY (sb_publishable_...) or SUPABASE_ANON_KEY (legacy)
|
|
34
|
+
// New format: SUPABASE_SECRET_KEY (sb_secret_...) or SUPABASE_SERVICE_ROLE_KEY (legacy)
|
|
35
|
+
const supabaseAnonKey = process.env.SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_ANON_KEY;
|
|
36
|
+
const supabaseServiceRoleKey = process.env.SUPABASE_SECRET_KEY || process.env.SUPABASE_SERVICE_ROLE_KEY;
|
|
37
|
+
if (!supabaseUrl) {
|
|
38
|
+
logger.error('SUPABASE_URL is required');
|
|
39
|
+
logger.info(' Get your credentials from: https://supabase.com/dashboard → Settings → API');
|
|
40
|
+
process.exit(ErrorCode.CONFIG_ERROR);
|
|
41
|
+
}
|
|
42
|
+
if (!supabaseAnonKey) {
|
|
43
|
+
logger.error('SUPABASE_ANON_KEY or SUPABASE_PUBLISHABLE_KEY is required');
|
|
44
|
+
logger.info(' Legacy: SUPABASE_ANON_KEY (anon JWT key)');
|
|
45
|
+
logger.info(' New: SUPABASE_PUBLISHABLE_KEY (sb_publishable_... key)');
|
|
46
|
+
logger.info(' Get from: https://supabase.com/dashboard → Settings → API');
|
|
47
|
+
process.exit(ErrorCode.CONFIG_ERROR);
|
|
48
|
+
}
|
|
49
|
+
if (!supabaseServiceRoleKey) {
|
|
50
|
+
logger.error('SUPABASE_SERVICE_ROLE_KEY or SUPABASE_SECRET_KEY is required');
|
|
51
|
+
logger.info(' Legacy: SUPABASE_SERVICE_ROLE_KEY (service_role JWT key)');
|
|
52
|
+
logger.info(' New: SUPABASE_SECRET_KEY (sb_secret_... key)');
|
|
53
|
+
logger.info(' Note: Required for MCP server operations (full database access)');
|
|
54
|
+
logger.info(' Get from: https://supabase.com/dashboard → Settings → API');
|
|
55
|
+
process.exit(ErrorCode.CONFIG_ERROR);
|
|
56
|
+
}
|
|
57
|
+
// MCP_API_KEY is required by supabase-mcp package for server authentication
|
|
58
|
+
// This is NOT a Supabase key - it's a key you generate yourself to secure the MCP server
|
|
59
|
+
let mcpApiKey = process.env.MCP_API_KEY;
|
|
60
|
+
if (!mcpApiKey) {
|
|
61
|
+
// Auto-generate a secure random key if not provided
|
|
62
|
+
mcpApiKey = randomBytes(32).toString('hex');
|
|
63
|
+
logger.warning('⚠️ MCP_API_KEY not set - auto-generated a secure key');
|
|
64
|
+
logger.warning(' Add this to your .env file to persist it:');
|
|
65
|
+
logger.warning(` MCP_API_KEY=${mcpApiKey}`);
|
|
66
|
+
logger.warning(' (This key secures your MCP server endpoint)');
|
|
67
|
+
}
|
|
68
|
+
const withRestart = process.argv.includes('--restart');
|
|
69
|
+
logger.header('Starting Supabase MCP Server (Local)');
|
|
70
|
+
logger.info(` Supabase URL: ${supabaseUrl}`);
|
|
71
|
+
if (withRestart)
|
|
72
|
+
logger.info(' Restart mode: enabled (up to 3 attempts)');
|
|
73
|
+
// Detect key format for logging
|
|
74
|
+
const usingNewKeys = process.env.SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_SECRET_KEY;
|
|
75
|
+
if (usingNewKeys) {
|
|
76
|
+
logger.info(' Using new API key format (sb_publishable_/sb_secret_)');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
logger.info(' Using legacy API key format (anon/service_role JWT)');
|
|
80
|
+
logger.warning(' ⚠️ Consider migrating to new keys before Nov 2025');
|
|
81
|
+
logger.info(' See: https://github.com/orgs/supabase/discussions/29260');
|
|
82
|
+
}
|
|
83
|
+
// Build env once — used for all spawn attempts
|
|
84
|
+
// Package validates: SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY, MCP_API_KEY
|
|
85
|
+
// We map new keys to legacy variable names for package compatibility
|
|
86
|
+
const spawnEnv = {
|
|
87
|
+
...process.env,
|
|
88
|
+
SUPABASE_URL: supabaseUrl,
|
|
89
|
+
SUPABASE_ANON_KEY: supabaseAnonKey,
|
|
90
|
+
SUPABASE_SERVICE_ROLE_KEY: supabaseServiceRoleKey,
|
|
91
|
+
MCP_API_KEY: mcpApiKey,
|
|
92
|
+
SUPABASE_PUBLISHABLE_KEY: process.env.SUPABASE_PUBLISHABLE_KEY,
|
|
93
|
+
SUPABASE_SECRET_KEY: process.env.SUPABASE_SECRET_KEY,
|
|
94
|
+
};
|
|
95
|
+
const MaxRestarts = 3;
|
|
96
|
+
const RestartDelaysMs = [2000, 4000, 8000];
|
|
97
|
+
const spawnSupabase = () => new Promise((resolve) => {
|
|
98
|
+
const child = spawn('pnpm', ['dlx', 'supabase-mcp'], { stdio: 'inherit', env: spawnEnv });
|
|
99
|
+
child.on('error', (error) => {
|
|
100
|
+
logger.error(`Failed to start Supabase MCP server: ${error.message}`);
|
|
101
|
+
resolve(ErrorCode.CONFIG_ERROR);
|
|
102
|
+
});
|
|
103
|
+
child.on('exit', (code) => resolve(code ?? 0));
|
|
104
|
+
process.on('SIGINT', () => {
|
|
105
|
+
child.kill('SIGINT');
|
|
106
|
+
});
|
|
107
|
+
process.on('SIGTERM', () => {
|
|
108
|
+
child.kill('SIGTERM');
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
let attempt = 0;
|
|
112
|
+
while (true) {
|
|
113
|
+
const code = await spawnSupabase();
|
|
114
|
+
if (!withRestart || attempt >= MaxRestarts) {
|
|
115
|
+
process.exit(code ?? 0);
|
|
116
|
+
}
|
|
117
|
+
const delay = RestartDelaysMs[attempt] ?? 8000;
|
|
118
|
+
attempt++;
|
|
119
|
+
logger.warning(` Server exited (code ${code}). Restarting in ${delay / 1000}s (attempt ${attempt}/${MaxRestarts})...`);
|
|
120
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger.error(`Script failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
125
|
+
process.exit(ErrorCode.EXECUTION_ERROR);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Main function
|
|
130
|
+
*/
|
|
131
|
+
async function main() {
|
|
132
|
+
try {
|
|
133
|
+
if (!(await checkMcpLicense())) {
|
|
134
|
+
process.exit(ErrorCode.CONFIG_ERROR);
|
|
135
|
+
}
|
|
136
|
+
await startSupabaseMCP();
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
logger.error(`Script failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
140
|
+
process.exit(ErrorCode.EXECUTION_ERROR);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
main();
|
|
144
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../../../../src/servers/supabase.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;AAE7B,6BAA6B;AAC7B,MAAM,EAAE,CAAA;AAER,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrC,+CAA+C;QAC/C,2FAA2F;QAC3F,gFAAgF;QAChF,EAAE;QACF,8BAA8B;QAC9B,iHAAiH;QACjH,oFAAoF;QACpF,8EAA8E;QAC9E,gEAAgE;QAChE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;QAE5C,8CAA8C;QAC9C,0FAA0F;QAC1F,wFAAwF;QACxF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;QAC7F,MAAM,sBAAsB,GAC1B,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAA;QAE1E,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;YACxC,MAAM,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAA;YAC5F,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAA;YACzE,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;YAC1D,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;YACxE,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAA;YAC3E,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;QAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAA;YAC5E,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;YAC1E,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;YAC9D,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;YACjF,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAA;YAC3E,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;QAED,4EAA4E;QAC5E,yFAAyF;QACzF,IAAI,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;QACvC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,oDAAoD;YACpD,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC3C,MAAM,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAA;YACvE,MAAM,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAA;YAC9D,MAAM,CAAC,OAAO,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAA;YAC7C,MAAM,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAA;QAClE,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACtD,MAAM,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAA;QAC9C,IAAI,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;QAE3E,gCAAgC;QAChC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAA;QAC5F,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;QACzE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;YACrE,MAAM,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAA;YACvE,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;QAC3E,CAAC;QAED,+CAA+C;QAC/C,6FAA6F;QAC7F,qEAAqE;QACrE,MAAM,QAAQ,GAAG;YACf,GAAG,OAAO,CAAC,GAAG;YACd,YAAY,EAAE,WAAW;YACzB,iBAAiB,EAAE,eAAe;YAClC,yBAAyB,EAAE,sBAAsB;YACjD,WAAW,EAAE,SAAS;YACtB,wBAAwB,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;YAC9D,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;SACrD,CAAA;QAED,MAAM,WAAW,GAAG,CAAC,CAAA;QACrB,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAE1C,MAAM,aAAa,GAAG,GAA2B,EAAE,CACjD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAA;YACzF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1B,MAAM,CAAC,KAAK,CAAC,wCAAwC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;gBACrE,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;YACjC,CAAC,CAAC,CAAA;YACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;YAC9C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACxB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACtB,CAAC,CAAC,CAAA;YACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACzB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACvB,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEJ,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAA;YAClC,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;YACzB,CAAC;YACD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;YAC9C,OAAO,EAAE,CAAA;YACT,MAAM,CAAC,OAAO,CACZ,0BAA0B,IAAI,oBAAoB,KAAK,GAAG,IAAI,cAAc,OAAO,IAAI,WAAW,MAAM,CACzG,CAAA;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACxF,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;QACD,MAAM,gBAAgB,EAAE,CAAA;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACxF,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../../../../src/servers/vercel.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Vercel MCP Server Launcher
|
|
4
|
+
*
|
|
5
|
+
* Starts the Vercel MCP server for AI-powered Vercel management.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* pnpm mcp:vercel
|
|
9
|
+
*/
|
|
10
|
+
import { spawn } from 'node:child_process';
|
|
11
|
+
import { createLogger, getProjectRoot } from '@revealui/scripts';
|
|
12
|
+
import { ErrorCode } from '@revealui/scripts/errors';
|
|
13
|
+
import { config } from 'dotenv';
|
|
14
|
+
import { checkMcpLicense } from '../index.js';
|
|
15
|
+
const logger = createLogger();
|
|
16
|
+
// Load environment variables
|
|
17
|
+
config();
|
|
18
|
+
const MAX_RESTARTS = 3;
|
|
19
|
+
const RESTART_DELAYS_MS = [2000, 4000, 8000];
|
|
20
|
+
async function spawnVercel(vercelApiKey) {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
// Pass credentials via environment only — never as CLI arguments (visible in ps aux).
|
|
23
|
+
const child = spawn('pnpm', ['exec', 'vercel-mcp'], {
|
|
24
|
+
stdio: 'inherit',
|
|
25
|
+
env: { ...process.env, VERCEL_API_KEY: vercelApiKey },
|
|
26
|
+
});
|
|
27
|
+
child.on('error', (error) => {
|
|
28
|
+
logger.error(`Failed to start Vercel MCP server: ${error.message}`);
|
|
29
|
+
resolve(ErrorCode.CONFIG_ERROR);
|
|
30
|
+
});
|
|
31
|
+
child.on('exit', (code) => resolve(code ?? 0));
|
|
32
|
+
process.on('SIGINT', () => {
|
|
33
|
+
child.kill('SIGINT');
|
|
34
|
+
});
|
|
35
|
+
process.on('SIGTERM', () => {
|
|
36
|
+
child.kill('SIGTERM');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async function startVercelMCP() {
|
|
41
|
+
try {
|
|
42
|
+
await getProjectRoot(import.meta.url);
|
|
43
|
+
const vercelApiKey = process.env.VERCEL_API_KEY ?? process.env.VERCEL_TOKEN;
|
|
44
|
+
if (!vercelApiKey) {
|
|
45
|
+
logger.error('VERCEL_API_KEY environment variable is required');
|
|
46
|
+
logger.info(' Get your token from: https://vercel.com/account/tokens');
|
|
47
|
+
process.exit(ErrorCode.CONFIG_ERROR);
|
|
48
|
+
}
|
|
49
|
+
const withRestart = process.argv.includes('--restart');
|
|
50
|
+
logger.header('Starting Vercel MCP Server');
|
|
51
|
+
logger.info(` API Key: ${vercelApiKey.substring(0, 8)}...`);
|
|
52
|
+
if (withRestart)
|
|
53
|
+
logger.info(' Restart mode: enabled (up to 3 attempts)');
|
|
54
|
+
let attempt = 0;
|
|
55
|
+
while (true) {
|
|
56
|
+
const code = await spawnVercel(vercelApiKey);
|
|
57
|
+
if (!withRestart || attempt >= MAX_RESTARTS) {
|
|
58
|
+
process.exit(code ?? 0);
|
|
59
|
+
}
|
|
60
|
+
const delay = RESTART_DELAYS_MS[attempt] ?? 8000;
|
|
61
|
+
attempt++;
|
|
62
|
+
logger.warning(` Server exited (code ${code}). Restarting in ${delay / 1000}s (attempt ${attempt}/${MAX_RESTARTS})...`);
|
|
63
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logger.error(`Script failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
68
|
+
process.exit(ErrorCode.EXECUTION_ERROR);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Main function
|
|
73
|
+
*/
|
|
74
|
+
async function main() {
|
|
75
|
+
try {
|
|
76
|
+
if (!(await checkMcpLicense())) {
|
|
77
|
+
process.exit(ErrorCode.CONFIG_ERROR);
|
|
78
|
+
}
|
|
79
|
+
await startVercelMCP();
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
logger.error(`Script failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
83
|
+
process.exit(ErrorCode.EXECUTION_ERROR);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
main();
|
|
87
|
+
//# sourceMappingURL=vercel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../../../../src/servers/vercel.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;AAE7B,6BAA6B;AAC7B,MAAM,EAAE,CAAA;AAER,MAAM,YAAY,GAAG,CAAC,CAAA;AACtB,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAE5C,KAAK,UAAU,WAAW,CAAC,YAAoB;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,sFAAsF;QACtF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE;YAClD,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE;SACtD,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,CAAC,KAAK,CAAC,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YACnE,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;QAE9C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;QAE3E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAA;YAC/D,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;YACxE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACtD,MAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAA;QAC3C,MAAM,CAAC,IAAI,CAAC,eAAe,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;QAC7D,IAAI,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;QAE3E,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAA;YAC5C,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;YACzB,CAAC;YACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;YAChD,OAAO,EAAE,CAAA;YACT,MAAM,CAAC,OAAO,CACZ,0BAA0B,IAAI,oBAAoB,KAAK,GAAG,IAAI,cAAc,OAAO,IAAI,YAAY,MAAM,CAC1G,CAAA;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACxF,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;QACD,MAAM,cAAc,EAAE,CAAA;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACxF,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vultr-test.d.ts","sourceRoot":"","sources":["../../../../../src/servers/vultr-test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Demo script to exercise Vultr Inference (chat + embeddings)
|
|
3
|
+
// Usage:
|
|
4
|
+
// Use ts-node or compile to JS. Example with ts-node:
|
|
5
|
+
// VULTR_API_KEY=your_key VULTR_MODEL=your-model-id ts-node packages/ai/scripts/test-vultr.ts
|
|
6
|
+
import { logger } from '@revealui/core/observability/logger';
|
|
7
|
+
import { checkMcpLicense } from '../index.js';
|
|
8
|
+
const KEY = process.env.VULTR_API_KEY;
|
|
9
|
+
const MODEL = process.env.VULTR_MODEL;
|
|
10
|
+
const BASE = process.env.VULTR_BASE_URL || 'https://api.vultrinference.com/v1';
|
|
11
|
+
if (!(KEY && MODEL)) {
|
|
12
|
+
logger.error('Missing VULTR_API_KEY or VULTR_MODEL environment variables', new Error('Missing required environment variables'));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const headers = {
|
|
16
|
+
'Content-Type': 'application/json',
|
|
17
|
+
// biome-ignore lint/style/useNamingConvention: API field name
|
|
18
|
+
Authorization: `Bearer ${KEY}`,
|
|
19
|
+
};
|
|
20
|
+
async function chat(prompt) {
|
|
21
|
+
const body = {
|
|
22
|
+
model: MODEL,
|
|
23
|
+
messages: [{ role: 'user', content: prompt }],
|
|
24
|
+
max_tokens: 256,
|
|
25
|
+
};
|
|
26
|
+
const res = await fetch(`${BASE}/chat/completions`, {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers,
|
|
29
|
+
body: JSON.stringify(body),
|
|
30
|
+
});
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
const err = await res.text().catch(() => res.statusText);
|
|
33
|
+
throw new Error(`Chat request failed: ${res.status} ${err}`);
|
|
34
|
+
}
|
|
35
|
+
const data = (await res.json());
|
|
36
|
+
logger.info('Chat response', { data });
|
|
37
|
+
const choice = Array.isArray(data.choices)
|
|
38
|
+
? data.choices[0]
|
|
39
|
+
: undefined;
|
|
40
|
+
const message = choice?.message
|
|
41
|
+
? choice.message
|
|
42
|
+
: choice?.text
|
|
43
|
+
? { content: choice.text }
|
|
44
|
+
: undefined;
|
|
45
|
+
if (message) {
|
|
46
|
+
logger.info('Assistant output', {
|
|
47
|
+
content: typeof message.content === 'string' ? message.content : JSON.stringify(message),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function embed(inputs) {
|
|
52
|
+
const body = {
|
|
53
|
+
model: MODEL,
|
|
54
|
+
input: Array.isArray(inputs) ? inputs : [inputs],
|
|
55
|
+
};
|
|
56
|
+
const res = await fetch(`${BASE}/embeddings`, {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers,
|
|
59
|
+
body: JSON.stringify(body),
|
|
60
|
+
});
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
const err = await res.text().catch(() => res.statusText);
|
|
63
|
+
throw new Error(`Embeddings request failed: ${res.status} ${err}`);
|
|
64
|
+
}
|
|
65
|
+
const data = await res.json();
|
|
66
|
+
logger.info('Embeddings response', { data });
|
|
67
|
+
}
|
|
68
|
+
async function main() {
|
|
69
|
+
if (!(await checkMcpLicense())) {
|
|
70
|
+
process.exit(2);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
await chat('What is the capital of France?');
|
|
74
|
+
await embed('This is a test embedding.');
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
logger.error('Error during demo', err instanceof Error ? err : new Error(String(err)));
|
|
78
|
+
process.exitCode = 2;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
await main();
|
|
82
|
+
//# sourceMappingURL=vultr-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vultr-test.js","sourceRoot":"","sources":["../../../../../src/servers/vultr-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Console Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Provides both AST-based and regex-based console statement detection.
|
|
5
|
+
* Consolidates logic from analyze/console-usage.ts and validate/console-statements.ts
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - AST mode: TypeScript AST parsing for accurate detection with production guard awareness
|
|
9
|
+
* - Regex mode: Fast pattern matching for simple validation
|
|
10
|
+
* - Auto mode: Intelligently picks best approach based on file type
|
|
11
|
+
* - File categorization: production, test, script, unknown
|
|
12
|
+
* - Production guard detection: Recognizes if (process.env.NODE_ENV !== 'production')
|
|
13
|
+
*
|
|
14
|
+
* @dependencies
|
|
15
|
+
* - node:fs - File system operations for reading files
|
|
16
|
+
* - node:path - Path manipulation utilities
|
|
17
|
+
* - typescript - TypeScript compiler API for AST parsing
|
|
18
|
+
*/
|
|
19
|
+
export interface ConsoleUsage {
|
|
20
|
+
file: string;
|
|
21
|
+
line: number;
|
|
22
|
+
column: number;
|
|
23
|
+
method: 'log' | 'error' | 'warn' | 'debug' | 'info' | 'trace';
|
|
24
|
+
code: string;
|
|
25
|
+
category: 'production' | 'test' | 'script' | 'unknown';
|
|
26
|
+
}
|
|
27
|
+
export interface ConsoleAnalysisResult {
|
|
28
|
+
usages: ConsoleUsage[];
|
|
29
|
+
summary: {
|
|
30
|
+
total: number;
|
|
31
|
+
production: number;
|
|
32
|
+
test: number;
|
|
33
|
+
script: number;
|
|
34
|
+
unknown: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export type AnalysisMode = 'ast' | 'regex' | 'auto';
|
|
38
|
+
/**
|
|
39
|
+
* Categorize a file based on its path to determine the appropriate context
|
|
40
|
+
* for console statement analysis.
|
|
41
|
+
*
|
|
42
|
+
* @param filePath - Absolute path to the file to categorize
|
|
43
|
+
* @param workspaceRoot - Root directory of the workspace/project
|
|
44
|
+
* @returns File category: 'production', 'test', 'script', or 'unknown'
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const category = categorizeFile('/app/src/components/Button.tsx', '/app')
|
|
49
|
+
* console.log(category) // 'production'
|
|
50
|
+
*
|
|
51
|
+
* const testCategory = categorizeFile('/app/src/__tests__/Button.test.tsx', '/app')
|
|
52
|
+
* console.log(testCategory) // 'test'
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function categorizeFile(filePath: string, workspaceRoot: string): 'production' | 'test' | 'script' | 'unknown';
|
|
56
|
+
/**
|
|
57
|
+
* Analyze file using TypeScript AST parsing for accurate console statement detection.
|
|
58
|
+
* More accurate but slower than regex. Detects production guards and appropriate
|
|
59
|
+
* console methods (e.g., console.error is acceptable in production).
|
|
60
|
+
*
|
|
61
|
+
* @param filePath - Absolute path to the file to analyze
|
|
62
|
+
* @param workspaceRoot - Root directory of the workspace/project
|
|
63
|
+
* @returns Array of console usages found in the file
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const usages = analyzeFileAST('/app/src/utils/logger.ts', '/app')
|
|
68
|
+
* console.log(`Found ${usages.length} console statements`)
|
|
69
|
+
* usages.forEach(u => console.log(`${u.file}:${u.line} - ${u.method}`))
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @see {@link analyzeFileRegex} for faster regex-based analysis
|
|
73
|
+
* @see {@link analyzeFile} for automatic mode selection
|
|
74
|
+
*/
|
|
75
|
+
export declare function analyzeFileAST(filePath: string, workspaceRoot: string): ConsoleUsage[];
|
|
76
|
+
/**
|
|
77
|
+
* Analyze file using regex pattern matching for fast console statement detection.
|
|
78
|
+
* Faster but less accurate than AST - cannot detect production guards or
|
|
79
|
+
* complex conditional logic.
|
|
80
|
+
*
|
|
81
|
+
* @param filePath - Absolute path to the file to analyze
|
|
82
|
+
* @param workspaceRoot - Root directory of the workspace/project
|
|
83
|
+
* @returns Promise resolving to array of console usages found
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const usages = await analyzeFileRegex('/app/src/index.js', '/app')
|
|
88
|
+
* console.log(`Found ${usages.length} console statements (regex mode)`)
|
|
89
|
+
* ```
|
|
90
|
+
*
|
|
91
|
+
* @see {@link analyzeFileAST} for more accurate AST-based analysis
|
|
92
|
+
* @see {@link analyzeFile} for automatic mode selection
|
|
93
|
+
*/
|
|
94
|
+
export declare function analyzeFileRegex(filePath: string, workspaceRoot: string): Promise<ConsoleUsage[]>;
|
|
95
|
+
/**
|
|
96
|
+
* Analyze file with automatic or explicit mode selection.
|
|
97
|
+
* Auto mode intelligently selects AST for TypeScript files and regex for JavaScript.
|
|
98
|
+
*
|
|
99
|
+
* @param filePath - Absolute path to the file to analyze
|
|
100
|
+
* @param workspaceRoot - Root directory of the workspace/project
|
|
101
|
+
* @param mode - Analysis mode: 'auto' (default), 'ast', or 'regex'
|
|
102
|
+
* @returns Promise resolving to array of console usages found
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* // Auto mode - picks best approach
|
|
107
|
+
* const usages = await analyzeFile('/app/src/components/Button.tsx', '/app')
|
|
108
|
+
*
|
|
109
|
+
* // Force AST mode
|
|
110
|
+
* const astUsages = await analyzeFile('/app/src/index.js', '/app', 'ast')
|
|
111
|
+
*
|
|
112
|
+
* // Force regex mode for speed
|
|
113
|
+
* const regexUsages = await analyzeFile('/app/src/utils.ts', '/app', 'regex')
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @see {@link analyzeFiles} to analyze multiple files at once
|
|
117
|
+
*/
|
|
118
|
+
export declare function analyzeFile(filePath: string, workspaceRoot: string, mode?: AnalysisMode): Promise<ConsoleUsage[]>;
|
|
119
|
+
/**
|
|
120
|
+
* Analyze multiple files and aggregate results with categorized summary.
|
|
121
|
+
* Provides comprehensive analysis across many files with performance optimization.
|
|
122
|
+
*
|
|
123
|
+
* @param filePaths - Array of absolute file paths to analyze
|
|
124
|
+
* @param workspaceRoot - Root directory of the workspace/project
|
|
125
|
+
* @param mode - Analysis mode: 'auto' (default), 'ast', or 'regex'
|
|
126
|
+
* @returns Promise resolving to analysis result with usages and summary statistics
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const files = await scanDirectoryAll('./src', { extensions: ['.ts', '.tsx'] })
|
|
131
|
+
* const result = await analyzeFiles(files, process.cwd())
|
|
132
|
+
*
|
|
133
|
+
* console.log(`Total console statements: ${result.summary.total}`)
|
|
134
|
+
* console.log(`Production issues: ${result.summary.production}`)
|
|
135
|
+
* console.log(`Test files: ${result.summary.test}`)
|
|
136
|
+
*
|
|
137
|
+
* result.usages.forEach(usage => {
|
|
138
|
+
* console.log(`${usage.file}:${usage.line} - ${usage.method} (${usage.category})`)
|
|
139
|
+
* })
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
export declare function analyzeFiles(filePaths: string[], workspaceRoot: string, mode?: AnalysisMode): Promise<ConsoleAnalysisResult>;
|
|
143
|
+
/**
|
|
144
|
+
* Console Analyzer class for object-oriented usage.
|
|
145
|
+
* Provides a convenient API for analyzing console statements across a project.
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```typescript
|
|
149
|
+
* const analyzer = new ConsoleAnalyzer('/path/to/project')
|
|
150
|
+
*
|
|
151
|
+
* // Analyze single file
|
|
152
|
+
* const usages = await analyzer.analyze('src/app.ts')
|
|
153
|
+
*
|
|
154
|
+
* // Analyze multiple files with summary
|
|
155
|
+
* const files = await scanDirectoryAll('./src', { extensions: ['.ts'] })
|
|
156
|
+
* const result = await analyzer.analyzeMultiple(files, 'auto')
|
|
157
|
+
* console.log(`Found ${result.summary.total} console statements`)
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
export declare class ConsoleAnalyzer {
|
|
161
|
+
private workspaceRoot;
|
|
162
|
+
/**
|
|
163
|
+
* Create a new ConsoleAnalyzer instance.
|
|
164
|
+
*
|
|
165
|
+
* @param workspaceRoot - Root directory of the workspace/project
|
|
166
|
+
*/
|
|
167
|
+
constructor(workspaceRoot: string);
|
|
168
|
+
/**
|
|
169
|
+
* Analyze file using TypeScript AST parsing.
|
|
170
|
+
*
|
|
171
|
+
* @param filePath - Absolute path to file to analyze
|
|
172
|
+
* @returns Array of console usages found
|
|
173
|
+
*/
|
|
174
|
+
analyzeAST(filePath: string): ConsoleUsage[];
|
|
175
|
+
/**
|
|
176
|
+
* Analyze using regex pattern matching
|
|
177
|
+
*/
|
|
178
|
+
analyzeRegex(filePath: string): Promise<ConsoleUsage[]>;
|
|
179
|
+
/**
|
|
180
|
+
* Smart analysis with automatic mode selection
|
|
181
|
+
*/
|
|
182
|
+
analyze(filePath: string, mode?: AnalysisMode): Promise<ConsoleUsage[]>;
|
|
183
|
+
/**
|
|
184
|
+
* Analyze multiple files
|
|
185
|
+
*/
|
|
186
|
+
analyzeMultiple(filePaths: string[], mode?: AnalysisMode): Promise<ConsoleAnalysisResult>;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=console-analyzer.d.ts.map
|