@homenshum/convex-mcp-nodebench 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.
Files changed (44) hide show
  1. package/README.md +137 -0
  2. package/dist/__tests__/tools.test.d.ts +1 -0
  3. package/dist/__tests__/tools.test.js +267 -0
  4. package/dist/__tests__/tools.test.js.map +1 -0
  5. package/dist/db.d.ts +10 -0
  6. package/dist/db.js +125 -0
  7. package/dist/db.js.map +1 -0
  8. package/dist/gotchaSeed.d.ts +126 -0
  9. package/dist/gotchaSeed.js +147 -0
  10. package/dist/gotchaSeed.js.map +1 -0
  11. package/dist/index.d.ts +15 -0
  12. package/dist/index.js +118 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/tools/componentTools.d.ts +2 -0
  15. package/dist/tools/componentTools.js +131 -0
  16. package/dist/tools/componentTools.js.map +1 -0
  17. package/dist/tools/cronTools.d.ts +2 -0
  18. package/dist/tools/cronTools.js +142 -0
  19. package/dist/tools/cronTools.js.map +1 -0
  20. package/dist/tools/deploymentTools.d.ts +2 -0
  21. package/dist/tools/deploymentTools.js +222 -0
  22. package/dist/tools/deploymentTools.js.map +1 -0
  23. package/dist/tools/functionTools.d.ts +2 -0
  24. package/dist/tools/functionTools.js +293 -0
  25. package/dist/tools/functionTools.js.map +1 -0
  26. package/dist/tools/integrationBridgeTools.d.ts +2 -0
  27. package/dist/tools/integrationBridgeTools.js +294 -0
  28. package/dist/tools/integrationBridgeTools.js.map +1 -0
  29. package/dist/tools/learningTools.d.ts +2 -0
  30. package/dist/tools/learningTools.js +155 -0
  31. package/dist/tools/learningTools.js.map +1 -0
  32. package/dist/tools/methodologyTools.d.ts +2 -0
  33. package/dist/tools/methodologyTools.js +163 -0
  34. package/dist/tools/methodologyTools.js.map +1 -0
  35. package/dist/tools/schemaTools.d.ts +2 -0
  36. package/dist/tools/schemaTools.js +346 -0
  37. package/dist/tools/schemaTools.js.map +1 -0
  38. package/dist/tools/toolRegistry.d.ts +5 -0
  39. package/dist/tools/toolRegistry.js +308 -0
  40. package/dist/tools/toolRegistry.js.map +1 -0
  41. package/dist/types.d.ts +44 -0
  42. package/dist/types.js +2 -0
  43. package/dist/types.js.map +1 -0
  44. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,137 @@
1
+ # convex-mcp-nodebench
2
+
3
+ Convex-specific MCP server applying NodeBench self-instruct diligence patterns to Convex development. Schema audit, function compliance, deployment gates, persistent gotcha DB, and methodology guidance.
4
+
5
+ **Complements** Context7 (raw library docs) and the official Convex MCP (deployment introspection) with structured verification workflows and persistent Convex knowledge.
6
+
7
+ ## 11 Tools across 5 Categories
8
+
9
+ ### Schema Tools
10
+ | Tool | Description |
11
+ |------|-------------|
12
+ | `convex_audit_schema` | Scan schema.ts for anti-patterns: deprecated validators, reserved field names, missing indexes, naming violations |
13
+ | `convex_suggest_indexes` | Analyze query patterns across all functions and suggest missing indexes |
14
+ | `convex_check_validator_coverage` | Check all exported functions have args + returns validators |
15
+
16
+ ### Function Tools
17
+ | Tool | Description |
18
+ |------|-------------|
19
+ | `convex_audit_functions` | Audit function registration, missing validators, public/internal misuse, action anti-patterns |
20
+ | `convex_check_function_refs` | Validate api.x.y / internal.x.y references, detect direct function passing |
21
+
22
+ ### Deployment Tools
23
+ | Tool | Description |
24
+ |------|-------------|
25
+ | `convex_pre_deploy_gate` | Pre-deployment quality gate: schema, auth, validators, recent audit results |
26
+ | `convex_check_env_vars` | Check env vars referenced in code exist in .env files |
27
+
28
+ ### Learning Tools
29
+ | Tool | Description |
30
+ |------|-------------|
31
+ | `convex_record_gotcha` | Persist a Convex gotcha/edge case for future reference |
32
+ | `convex_search_gotchas` | Full-text search across known Convex gotchas |
33
+
34
+ ### Methodology Tools
35
+ | Tool | Description |
36
+ |------|-------------|
37
+ | `convex_get_methodology` | Step-by-step guides: schema audit, function compliance, deploy verification, knowledge management |
38
+ | `convex_discover_tools` | Search available tools by keyword, category, or task description |
39
+
40
+ ## Self-Instruct QuickRefs
41
+
42
+ Every tool response includes a `quickRef` block telling the agent what to do next:
43
+
44
+ ```json
45
+ {
46
+ "nextAction": "Run convex_check_validator_coverage to ensure all functions have validators",
47
+ "nextTools": ["convex_check_validator_coverage", "convex_audit_functions"],
48
+ "methodology": "convex_schema_audit",
49
+ "relatedGotchas": ["returns_validator_required", "new_function_syntax"],
50
+ "confidence": "high"
51
+ }
52
+ ```
53
+
54
+ ## Pre-Seeded Gotcha Database
55
+
56
+ Ships with 20 gotchas extracted from Convex best practices:
57
+
58
+ - `validator_bigint_deprecated` -- Use v.int64() not v.bigint()
59
+ - `undefined_not_valid` -- Use null, never undefined
60
+ - `index_field_order` -- Query fields must match index definition order
61
+ - `no_map_set_validators` -- Use v.record() instead
62
+ - `returns_validator_required` -- Every function needs a returns validator
63
+ - `action_from_action` -- Only cross-runtime, otherwise use helpers
64
+ - And 14 more...
65
+
66
+ ## Quick Start
67
+
68
+ ### Install
69
+ ```bash
70
+ cd packages/convex-mcp-nodebench
71
+ npm install
72
+ npm run build
73
+ ```
74
+
75
+ ### Run (stdio)
76
+ ```bash
77
+ node dist/index.js
78
+ ```
79
+
80
+ ### Dev mode
81
+ ```bash
82
+ npx tsx src/index.ts
83
+ ```
84
+
85
+ ### Add to MCP config
86
+ ```json
87
+ {
88
+ "mcpServers": {
89
+ "convex-mcp-nodebench": {
90
+ "command": "node",
91
+ "args": ["/path/to/packages/convex-mcp-nodebench/dist/index.js"]
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ ### First prompt
98
+ ```
99
+ Search convex gotchas for "validator" then audit the schema at /path/to/my-project
100
+ ```
101
+
102
+ ## Data Storage
103
+
104
+ Persistent SQLite database at `~/.convex-mcp-nodebench/convex.db`:
105
+
106
+ - **convex_gotchas** -- Gotcha knowledge base with FTS5 search
107
+ - **schema_snapshots** -- Schema history for diffing
108
+ - **deploy_checks** -- Deployment gate audit trail
109
+ - **audit_results** -- Per-file analysis cache
110
+
111
+ ## Testing
112
+
113
+ ```bash
114
+ npm test
115
+ ```
116
+
117
+ All 15 tests verify tools work against the real nodebench-ai codebase (3,138 Convex functions).
118
+
119
+ ## Architecture
120
+
121
+ ```
122
+ packages/convex-mcp-nodebench/
123
+ src/
124
+ index.ts -- MCP server entry, tool assembly
125
+ db.ts -- SQLite schema + seed logic
126
+ types.ts -- Tool types, QuickRef interface
127
+ gotchaSeed.ts -- 20 pre-seeded Convex gotchas
128
+ tools/
129
+ schemaTools.ts -- Schema audit, index suggestions, validator coverage
130
+ functionTools.ts -- Function audit, reference checking
131
+ deploymentTools.ts -- Pre-deploy gate, env var checking
132
+ learningTools.ts -- Gotcha recording + search
133
+ methodologyTools.ts -- Methodology guides, tool discovery
134
+ toolRegistry.ts -- Central catalog with quickRef metadata
135
+ __tests__/
136
+ tools.test.ts -- 15 integration tests
137
+ ```
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,267 @@
1
+ import { describe, it, expect, beforeAll } from "vitest";
2
+ import { resolve } from "node:path";
3
+ import { schemaTools } from "../tools/schemaTools.js";
4
+ import { functionTools } from "../tools/functionTools.js";
5
+ import { deploymentTools } from "../tools/deploymentTools.js";
6
+ import { learningTools } from "../tools/learningTools.js";
7
+ import { methodologyTools } from "../tools/methodologyTools.js";
8
+ import { integrationBridgeTools } from "../tools/integrationBridgeTools.js";
9
+ import { cronTools } from "../tools/cronTools.js";
10
+ import { componentTools } from "../tools/componentTools.js";
11
+ import { getDb, seedGotchasIfEmpty } from "../db.js";
12
+ import { CONVEX_GOTCHAS } from "../gotchaSeed.js";
13
+ // Path to the actual nodebench-ai project root
14
+ const PROJECT_DIR = resolve(__dirname, "../../../..");
15
+ beforeAll(() => {
16
+ getDb();
17
+ seedGotchasIfEmpty(CONVEX_GOTCHAS);
18
+ });
19
+ describe("Schema Tools", () => {
20
+ it("convex_audit_schema runs against nodebench-ai", async () => {
21
+ const tool = schemaTools.find((t) => t.name === "convex_audit_schema");
22
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
23
+ expect(result).toBeDefined();
24
+ expect(result.error).toBeUndefined();
25
+ expect(result.summary).toBeDefined();
26
+ expect(typeof result.summary.totalIssues).toBe("number");
27
+ console.log(`Schema audit: ${result.summary.totalIssues} issues (${result.summary.critical} critical, ${result.summary.warnings} warnings)`);
28
+ });
29
+ it("convex_suggest_indexes runs against nodebench-ai", async () => {
30
+ const tool = schemaTools.find((t) => t.name === "convex_suggest_indexes");
31
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
32
+ expect(result).toBeDefined();
33
+ expect(result.error).toBeUndefined();
34
+ expect(typeof result.totalSuggestions).toBe("number");
35
+ console.log(`Index suggestions: ${result.totalSuggestions}`);
36
+ }, 60_000);
37
+ it("convex_check_validator_coverage runs against nodebench-ai", async () => {
38
+ const tool = schemaTools.find((t) => t.name === "convex_check_validator_coverage");
39
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
40
+ expect(result).toBeDefined();
41
+ expect(result.error).toBeUndefined();
42
+ expect(result.summary).toBeDefined();
43
+ expect(typeof result.summary.totalFunctions).toBe("number");
44
+ console.log(`Validator coverage: ${result.summary.argsValidatorCoverage} args, ${result.summary.returnsValidatorCoverage} returns, ${result.summary.oldSyntaxCount} old syntax`);
45
+ });
46
+ });
47
+ describe("Function Tools", () => {
48
+ it("convex_audit_functions runs against nodebench-ai", async () => {
49
+ const tool = functionTools.find((t) => t.name === "convex_audit_functions");
50
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
51
+ expect(result).toBeDefined();
52
+ expect(result.error).toBeUndefined();
53
+ expect(result.summary).toBeDefined();
54
+ expect(typeof result.summary.totalFunctions).toBe("number");
55
+ console.log(`Function audit: ${result.summary.totalFunctions} functions, ${result.summary.totalIssues} issues (${result.summary.critical} critical)`);
56
+ });
57
+ it("convex_check_function_refs runs against nodebench-ai", async () => {
58
+ const tool = functionTools.find((t) => t.name === "convex_check_function_refs");
59
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
60
+ expect(result).toBeDefined();
61
+ expect(result.error).toBeUndefined();
62
+ expect(result.summary).toBeDefined();
63
+ console.log(`Function refs: ${result.summary.totalReferences} refs, ${result.summary.directPassAntiPatterns} direct pass anti-patterns`);
64
+ });
65
+ });
66
+ describe("Deployment Tools", () => {
67
+ it("convex_pre_deploy_gate runs against nodebench-ai", async () => {
68
+ const tool = deploymentTools.find((t) => t.name === "convex_pre_deploy_gate");
69
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
70
+ expect(result).toBeDefined();
71
+ expect(typeof result.passed).toBe("boolean");
72
+ expect(result.checks).toBeDefined();
73
+ expect(Array.isArray(result.checks)).toBe(true);
74
+ console.log(`Deploy gate: ${result.passed ? "PASSED" : "BLOCKED"} (${result.checks.length} checks, ${result.blockers.length} blockers)`);
75
+ });
76
+ it("convex_check_env_vars runs against nodebench-ai", async () => {
77
+ const tool = deploymentTools.find((t) => t.name === "convex_check_env_vars");
78
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
79
+ expect(result).toBeDefined();
80
+ expect(result.envFilesFound).toBeDefined();
81
+ console.log(`Env vars: ${result.envVarsInCode.length} in code, ${result.envVarsInEnvFile.length} in env files, ${result.missingInEnvFile.length} missing`);
82
+ });
83
+ });
84
+ describe("Learning Tools", () => {
85
+ it("convex_search_gotchas finds seeded gotchas", async () => {
86
+ const tool = learningTools.find((t) => t.name === "convex_search_gotchas");
87
+ const result = (await tool.handler({ query: "bigint deprecated" }));
88
+ expect(result).toBeDefined();
89
+ expect(result.totalResults).toBeGreaterThan(0);
90
+ expect(result.gotchas[0].key).toBe("validator_bigint_deprecated");
91
+ console.log(`Gotcha search 'bigint deprecated': ${result.totalResults} results`);
92
+ });
93
+ it("convex_search_gotchas finds index gotchas", async () => {
94
+ const tool = learningTools.find((t) => t.name === "convex_search_gotchas");
95
+ const result = (await tool.handler({ query: "index order field" }));
96
+ expect(result).toBeDefined();
97
+ expect(result.totalResults).toBeGreaterThan(0);
98
+ console.log(`Gotcha search 'index order field': ${result.totalResults} results`);
99
+ });
100
+ it("convex_record_gotcha creates and updates", async () => {
101
+ const tool = learningTools.find((t) => t.name === "convex_record_gotcha");
102
+ const result1 = (await tool.handler({
103
+ key: "test_gotcha_vitest",
104
+ content: "Test gotcha from vitest",
105
+ category: "general",
106
+ severity: "info",
107
+ tags: "test,vitest",
108
+ }));
109
+ expect(["created", "updated"]).toContain(result1.action);
110
+ const result2 = (await tool.handler({
111
+ key: "test_gotcha_vitest",
112
+ content: "Updated test gotcha from vitest",
113
+ category: "general",
114
+ severity: "info",
115
+ }));
116
+ expect(result2.action).toBe("updated");
117
+ });
118
+ });
119
+ describe("Methodology Tools", () => {
120
+ it("convex_get_methodology returns overview", async () => {
121
+ const tool = methodologyTools.find((t) => t.name === "convex_get_methodology");
122
+ const result = (await tool.handler({ topic: "overview" }));
123
+ expect(result).toBeDefined();
124
+ expect(result.title).toContain("Overview");
125
+ expect(result.steps.length).toBeGreaterThan(0);
126
+ });
127
+ it("convex_get_methodology returns schema_audit steps", async () => {
128
+ const tool = methodologyTools.find((t) => t.name === "convex_get_methodology");
129
+ const result = (await tool.handler({ topic: "convex_schema_audit" }));
130
+ expect(result).toBeDefined();
131
+ expect(result.steps.length).toBeGreaterThan(0);
132
+ expect(result.tools.length).toBeGreaterThan(0);
133
+ });
134
+ it("convex_discover_tools finds schema tools", async () => {
135
+ const tool = methodologyTools.find((t) => t.name === "convex_discover_tools");
136
+ const result = (await tool.handler({ query: "schema audit" }));
137
+ expect(result).toBeDefined();
138
+ expect(result.matchingTools).toBeGreaterThan(0);
139
+ console.log(`Discover 'schema audit': ${result.matchingTools} tools found`);
140
+ });
141
+ it("convex_discover_tools filters by category", async () => {
142
+ const tool = methodologyTools.find((t) => t.name === "convex_discover_tools");
143
+ const result = (await tool.handler({ query: "deploy", category: "deployment" }));
144
+ expect(result).toBeDefined();
145
+ expect(result.tools.every((t) => t.category === "deployment")).toBe(true);
146
+ });
147
+ });
148
+ describe("Integration Bridge Tools", () => {
149
+ it("convex_generate_rules_md generates rules content", async () => {
150
+ const tool = integrationBridgeTools.find((t) => t.name === "convex_generate_rules_md");
151
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
152
+ expect(result).toBeDefined();
153
+ expect(result.action).toBe("generated");
154
+ expect(result.content).toContain("Convex Development Rules");
155
+ expect(result.lines).toBeGreaterThan(10);
156
+ console.log(`Rules generation: ${result.lines} lines`);
157
+ });
158
+ it("convex_snapshot_schema captures snapshot", async () => {
159
+ const tool = integrationBridgeTools.find((t) => t.name === "convex_snapshot_schema");
160
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
161
+ expect(result).toBeDefined();
162
+ expect(result.snapshotId).toBeDefined();
163
+ expect(result.tableCount).toBeGreaterThan(0);
164
+ console.log(`Schema snapshot: ${result.tableCount} tables`);
165
+ });
166
+ it("convex_bootstrap_project scans project", async () => {
167
+ const tool = integrationBridgeTools.find((t) => t.name === "convex_bootstrap_project");
168
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
169
+ expect(result).toBeDefined();
170
+ expect(result.checks).toBeDefined();
171
+ expect(result.summary).toBeDefined();
172
+ expect(result.improvementPlan).toBeDefined();
173
+ console.log(`Bootstrap: ${result.summary.good} good, ${result.summary.warnings} warnings, ${result.summary.criticals} criticals`);
174
+ });
175
+ });
176
+ // ── BM25 A/B Comparison Tests ─────────────────────────────────────────────
177
+ import { findTools } from "../tools/toolRegistry.js";
178
+ describe("BM25 Tool Discovery — A/B Comparison", () => {
179
+ it("ranks exact-name match above tag-only match", () => {
180
+ const results = findTools("audit schema");
181
+ expect(results.length).toBeGreaterThan(0);
182
+ expect(results[0].name).toBe("convex_audit_schema");
183
+ });
184
+ it("uses OR logic — partial terms still return results", () => {
185
+ const results = findTools("deploy");
186
+ expect(results.length).toBeGreaterThanOrEqual(2);
187
+ const names = results.map((r) => r.name);
188
+ expect(names).toContain("convex_pre_deploy_gate");
189
+ expect(names).toContain("convex_check_env_vars");
190
+ });
191
+ it("field weighting: name > tags", () => {
192
+ const results = findTools("gotcha");
193
+ expect(results.length).toBeGreaterThanOrEqual(2);
194
+ // Both gotcha tools should rank in top 2 (name contains 'gotcha')
195
+ const top2 = results.slice(0, 2).map((r) => r.name);
196
+ expect(top2).toContain("convex_record_gotcha");
197
+ expect(top2).toContain("convex_search_gotchas");
198
+ });
199
+ it("IDF: rare term 'bootstrap' ranks convex_bootstrap_project first", () => {
200
+ const results = findTools("bootstrap");
201
+ expect(results.length).toBeGreaterThan(0);
202
+ expect(results[0].name).toBe("convex_bootstrap_project");
203
+ });
204
+ });
205
+ describe("BM25 Gotcha Search — A/B Comparison", () => {
206
+ it("FTS5 primary path finds relevant gotchas", async () => {
207
+ const tool = learningTools.find((t) => t.name === "convex_search_gotchas");
208
+ const result = (await tool.handler({ query: "validator deprecated bigint" }));
209
+ expect(result).toBeDefined();
210
+ expect(result.totalResults).toBeGreaterThan(0);
211
+ });
212
+ it("searches across multiple seeded gotchas", async () => {
213
+ const tool = learningTools.find((t) => t.name === "convex_search_gotchas");
214
+ const result = (await tool.handler({ query: "function action mutation" }));
215
+ expect(result).toBeDefined();
216
+ expect(result.totalResults).toBeGreaterThan(0);
217
+ });
218
+ it("category filter works with search", async () => {
219
+ const tool = learningTools.find((t) => t.name === "convex_search_gotchas");
220
+ const result = (await tool.handler({ query: "index", category: "schema" }));
221
+ expect(result).toBeDefined();
222
+ if (result.totalResults > 0) {
223
+ expect(result.gotchas.every((g) => g.category === "schema")).toBe(true);
224
+ }
225
+ });
226
+ });
227
+ describe("Cron Tools", () => {
228
+ it("convex_check_crons validates crons.ts", async () => {
229
+ const tool = cronTools.find((t) => t.name === "convex_check_crons");
230
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
231
+ expect(result).toBeDefined();
232
+ expect(result.hasCrons).toBe(true);
233
+ expect(result.totalCrons).toBeGreaterThan(10);
234
+ console.log(`Crons: ${result.totalCrons} total (${result.byType.interval} interval, ${result.byType.daily} daily, ${result.byType.weekly} weekly, ${result.byType.monthly} monthly)`);
235
+ console.log(`Cron issues: ${result.issues.total} (${result.issues.critical} critical, ${result.issues.warnings} warnings)`);
236
+ });
237
+ });
238
+ describe("Component Tools", () => {
239
+ it("convex_analyze_components parses convex.config.ts", async () => {
240
+ const tool = componentTools.find((t) => t.name === "convex_analyze_components");
241
+ const result = (await tool.handler({ projectDir: PROJECT_DIR }));
242
+ expect(result).toBeDefined();
243
+ expect(result.hasConfig).toBe(true);
244
+ expect(result.totalComponents).toBeGreaterThan(5);
245
+ expect(result.activeComponents).toBeGreaterThan(0);
246
+ console.log(`Components: ${result.totalComponents} total, ${result.activeComponents} active, ${result.conditionalComponents} conditional`);
247
+ console.log(`Component issues: ${result.issues.total}`);
248
+ });
249
+ });
250
+ describe("Tool Count", () => {
251
+ it("has exactly 16 tools", () => {
252
+ const allTools = [
253
+ ...schemaTools,
254
+ ...functionTools,
255
+ ...deploymentTools,
256
+ ...learningTools,
257
+ ...methodologyTools,
258
+ ...integrationBridgeTools,
259
+ ...cronTools,
260
+ ...componentTools,
261
+ ];
262
+ expect(allTools.length).toBe(16);
263
+ console.log(`Total tools: ${allTools.length}`);
264
+ console.log("Tools:", allTools.map((t) => t.name).join(", "));
265
+ });
266
+ });
267
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import Database from "better-sqlite3";
2
+ export declare function getDb(): Database.Database;
3
+ export declare function genId(prefix: string): string;
4
+ export declare function seedGotchasIfEmpty(gotchas: Array<{
5
+ key: string;
6
+ content: string;
7
+ category: string;
8
+ severity: string;
9
+ tags: string;
10
+ }>): void;
package/dist/db.js ADDED
@@ -0,0 +1,125 @@
1
+ import Database from "better-sqlite3";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { mkdirSync } from "node:fs";
5
+ let _db = null;
6
+ const SCHEMA_SQL = `
7
+ PRAGMA journal_mode = WAL;
8
+ PRAGMA busy_timeout = 5000;
9
+ PRAGMA foreign_keys = ON;
10
+
11
+ -- ═══════════════════════════════════════════
12
+ -- CONVEX GOTCHAS (Persistent knowledge base)
13
+ -- ═══════════════════════════════════════════
14
+
15
+ CREATE TABLE IF NOT EXISTS convex_gotchas (
16
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17
+ key TEXT NOT NULL UNIQUE,
18
+ content TEXT NOT NULL,
19
+ category TEXT NOT NULL DEFAULT 'general',
20
+ severity TEXT NOT NULL DEFAULT 'warning',
21
+ convex_version TEXT,
22
+ tags TEXT,
23
+ source TEXT NOT NULL DEFAULT 'seed',
24
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
25
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
26
+ );
27
+
28
+ CREATE VIRTUAL TABLE IF NOT EXISTS convex_gotchas_fts USING fts5(
29
+ key,
30
+ content,
31
+ category,
32
+ tags,
33
+ content='convex_gotchas',
34
+ content_rowid='id'
35
+ );
36
+
37
+ CREATE TRIGGER IF NOT EXISTS gotchas_fts_insert AFTER INSERT ON convex_gotchas BEGIN
38
+ INSERT INTO convex_gotchas_fts(rowid, key, content, category, tags)
39
+ VALUES (new.id, new.key, new.content, new.category, COALESCE(new.tags, ''));
40
+ END;
41
+
42
+ CREATE TRIGGER IF NOT EXISTS gotchas_fts_delete AFTER DELETE ON convex_gotchas BEGIN
43
+ INSERT INTO convex_gotchas_fts(convex_gotchas_fts, rowid, key, content, category, tags)
44
+ VALUES ('delete', old.id, old.key, old.content, old.category, COALESCE(old.tags, ''));
45
+ END;
46
+
47
+ CREATE TRIGGER IF NOT EXISTS gotchas_fts_update AFTER UPDATE ON convex_gotchas BEGIN
48
+ INSERT INTO convex_gotchas_fts(convex_gotchas_fts, rowid, key, content, category, tags)
49
+ VALUES ('delete', old.id, old.key, old.content, old.category, COALESCE(old.tags, ''));
50
+ INSERT INTO convex_gotchas_fts(rowid, key, content, category, tags)
51
+ VALUES (new.id, new.key, new.content, new.category, COALESCE(new.tags, ''));
52
+ END;
53
+
54
+ -- ═══════════════════════════════════════════
55
+ -- SCHEMA SNAPSHOTS (for diff/audit history)
56
+ -- ═══════════════════════════════════════════
57
+
58
+ CREATE TABLE IF NOT EXISTS schema_snapshots (
59
+ id TEXT PRIMARY KEY,
60
+ project_dir TEXT NOT NULL,
61
+ schema_json TEXT NOT NULL,
62
+ function_spec TEXT,
63
+ snapshot_at TEXT NOT NULL DEFAULT (datetime('now'))
64
+ );
65
+
66
+ CREATE INDEX IF NOT EXISTS idx_schema_snapshots_project ON schema_snapshots(project_dir);
67
+
68
+ -- ═══════════════════════════════════════════
69
+ -- DEPLOYMENT CHECKS (audit trail)
70
+ -- ═══════════════════════════════════════════
71
+
72
+ CREATE TABLE IF NOT EXISTS deploy_checks (
73
+ id TEXT PRIMARY KEY,
74
+ project_dir TEXT NOT NULL,
75
+ check_type TEXT NOT NULL,
76
+ passed INTEGER NOT NULL DEFAULT 0,
77
+ findings TEXT,
78
+ checked_at TEXT NOT NULL DEFAULT (datetime('now'))
79
+ );
80
+
81
+ CREATE INDEX IF NOT EXISTS idx_deploy_checks_project ON deploy_checks(project_dir);
82
+
83
+ -- ═══════════════════════════════════════════
84
+ -- AUDIT RESULTS (per-file analysis cache)
85
+ -- ═══════════════════════════════════════════
86
+
87
+ CREATE TABLE IF NOT EXISTS audit_results (
88
+ id TEXT PRIMARY KEY,
89
+ project_dir TEXT NOT NULL,
90
+ audit_type TEXT NOT NULL,
91
+ file_path TEXT,
92
+ issues_json TEXT NOT NULL,
93
+ issue_count INTEGER NOT NULL DEFAULT 0,
94
+ audited_at TEXT NOT NULL DEFAULT (datetime('now'))
95
+ );
96
+
97
+ CREATE INDEX IF NOT EXISTS idx_audit_results_project ON audit_results(project_dir);
98
+ CREATE INDEX IF NOT EXISTS idx_audit_results_type ON audit_results(audit_type);
99
+ `;
100
+ export function getDb() {
101
+ if (_db)
102
+ return _db;
103
+ const dir = join(homedir(), ".convex-mcp-nodebench");
104
+ mkdirSync(dir, { recursive: true });
105
+ _db = new Database(join(dir, "convex.db"));
106
+ _db.exec(SCHEMA_SQL);
107
+ return _db;
108
+ }
109
+ export function genId(prefix) {
110
+ return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
111
+ }
112
+ export function seedGotchasIfEmpty(gotchas) {
113
+ const db = getDb();
114
+ const count = db.prepare("SELECT COUNT(*) as c FROM convex_gotchas").get().c;
115
+ if (count > 0)
116
+ return;
117
+ const insert = db.prepare("INSERT OR IGNORE INTO convex_gotchas (key, content, category, severity, tags, source) VALUES (?, ?, ?, ?, ?, 'seed')");
118
+ const tx = db.transaction(() => {
119
+ for (const g of gotchas) {
120
+ insert.run(g.key, g.content, g.category, g.severity, g.tags);
121
+ }
122
+ });
123
+ tx();
124
+ }
125
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,IAAI,GAAG,GAA6B,IAAI,CAAC;AAEzC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6FlB,CAAC;AAEF,MAAM,UAAU,KAAK;IACnB,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;IACrD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAkG;IACnI,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAAU,CAAC,CAAC,CAAC;IACtF,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO;IAEtB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,sHAAsH,CACvH,CAAC;IACF,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,EAAE,CAAC;AACP,CAAC"}