Skip to content

Commit c7182bf

Browse files
committed
feat: SqliteStore backend with annotation, audit, and cache tools
Replace lowdb with sql.js (asm.js build) for zero-dependency SQLite persistence. Bundle inline with esbuild — no native modules, no external deps at runtime. SqliteStore provides three tables: - sessions: session tracking (migrated from lowdb) - annotations: key-value annotation store with categories and metadata - query_result_cache: BQRS/SARIF result caching with subset retrieval New tools (gated by ENABLE_ANNOTATION_TOOLS env var): - annotation_create, annotation_list, annotation_search, annotation_delete - audit_store_findings, audit_list_findings, audit_add_notes, audit_clear_repo - query_results_cache_lookup, query_results_cache_retrieve, query_results_cache_clear, query_results_cache_compare Code refactoring for maintainability: - Extract database-resolver.ts from cli-tool-registry.ts - Extract query-resolver.ts from cli-tool-registry.ts - Extract result-processor.ts from cli-tool-registry.ts - Extract codeql-version.ts from cli-executor.ts Bug fixes: - Fix params.output not propagated to proce- Fix params.output not propagated to proce- Fix params.output not propagated txternal predicate conditions for direct query paths Closes #165
1 parent de78423 commit c7182bf

20 files changed

+2563
-499
lines changed

package-lock.json

Lines changed: 7 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
"dotenv": "^17.3.1",
6262
"express": "^5.2.1",
6363
"js-yaml": "^4.1.1",
64-
"lowdb": "^7.0.1",
64+
"sql.js": "^1.14.1",
6565
"zod": "^3.25.76"
6666
},
6767
"devDependencies": {

server/src/codeql-development-mcp-server.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import { registerLSPTools } from './tools/lsp';
1717
import { registerLanguageResources } from './resources/language-resources';
1818
import { registerWorkflowPrompts } from './prompts/workflow-prompts';
1919
import { registerMonitoringTools } from './tools/monitoring-tools';
20+
import { registerAnnotationTools } from './tools/annotation-tools';
21+
import { registerAuditTools } from './tools/audit-tools';
22+
import { registerCacheTools } from './tools/cache-tools';
2023
import { sessionDataManager } from './lib/session-data-manager';
2124
import { resolveCodeQLBinary, validateCodeQLBinaryReachable } from './lib/cli-executor';
2225
import { initServerManager, shutdownServerManager } from './lib/server-manager';
@@ -74,6 +77,15 @@ export async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise<Mcp
7477
// Register monitoring and reporting tools
7578
registerMonitoringTools(server);
7679

80+
// Register annotation tools (general-purpose notes/bookmarks)
81+
registerAnnotationTools(server);
82+
83+
// Register audit tools (security audit state tracking)
84+
registerAuditTools(server);
85+
86+
// Register query results cache tools
87+
registerCacheTools(server);
88+
7789
// Initialize session data manager
7890
await sessionDataManager.initialize();
7991

server/src/lib/cli-executor.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import { basename, delimiter, dirname, isAbsolute, join } from 'path';
88
import { homedir } from 'os';
99
import { promisify } from 'util';
1010
import { logger } from '../utils/logger';
11+
import { setActualCodeqlVersion, warnOnVersionMismatch } from './codeql-version';
12+
13+
// Re-export version functions so existing callers don't break
14+
export { getActualCodeqlVersion, getTargetCodeqlVersion } from './codeql-version';
1115

1216
const execFileAsync = promisify(execFile);
1317

@@ -370,9 +374,9 @@ export function resetResolvedCodeQLBinary(): void {
370374
* Validate that the resolved CodeQL binary is actually callable.
371375
*
372376
* Runs `codeql version --format=terse` and verifies the process exits
373-
* successfully. This catches the case where `CODEQL_PATH` is unset and
374-
* `codeql` is not on PATH — the server would otherwise start normally
375-
* but every tool invocation would fail.
377+
* successfully. Stores the actual version for later retrieval via
378+
* getActualCodeqlVersion(). Warns (but does not fail) if the actual
379+
* version differs from the target version in .codeql-version.
376380
*
377381
* @returns The version string reported by the CodeQL CLI.
378382
* @throws Error if the binary is not reachable or returns a non-zero exit code.
@@ -389,7 +393,15 @@ export async function validateCodeQLBinaryReachable(): Promise<string> {
389393
env,
390394
timeout: 15_000,
391395
});
392-
return stdout.trim();
396+
const version = stdout.trim();
397+
398+
// Store the actual CLI version for cache keys and diagnostics
399+
setActualCodeqlVersion(version);
400+
401+
// Compare with target version and warn on mismatch
402+
warnOnVersionMismatch(version);
403+
404+
return version;
393405
} catch (err: unknown) {
394406
const message = err instanceof Error ? err.message : String(err);
395407
throw new Error(

0 commit comments

Comments
 (0)