@kanchingyg/dbwatch 0.0.0-stage → 0.1.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Augusto Cerrutti
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,99 @@
1
- # Temporary Holding Version
1
+ # dbwatch
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [![ci](https://github.com/kanchingyg/dbwatch/actions/workflows/ci.yml/badge.svg)](https://github.com/kanchingyg/dbwatch/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/%40kanchingyg%2Fdbwatch/latest?label=npm)](https://www.npmjs.com/package/@kanchingyg/dbwatch)
5
+ [![JSR](https://jsr.io/badges/@kanchingyg/dbwatch)](https://jsr.io/@kanchingyg/dbwatch)
6
+ [![JSR Score](https://jsr.io/badges/@kanchingyg/dbwatch/score)](https://jsr.io/@kanchingyg/dbwatch/score)
7
+ [![Runtime](https://img.shields.io/badge/runtime-Node_%7C_Bun_%7C_Deno-f9f1e1)](https://github.com/kanchingyg/dbwatch)
8
+ [![license](https://img.shields.io/github/license/kanchingyg/dbwatch)](https://github.com/kanchingyg/dbwatch/blob/HEAD/LICENSE)
9
+
10
+ **One line:** `npx @kanchingyg/dbwatch sqlite:./app.db -- npm test` (or `bunx @kanchingyg/dbwatch sqlite:./app.db -- bun test`): git-style SQLite/D1 row diff around any command with instant `--revert`.
11
+
12
+ ## Install
13
+
14
+ [Bun](https://bun.sh) / [npm](https://www.npmjs.com/package/@kanchingyg/dbwatch):
15
+
16
+ ```bash
17
+ bunx @kanchingyg/dbwatch sqlite:./local.db -- npm test
18
+ npx @kanchingyg/dbwatch sqlite:./local.db -- npm test
19
+
20
+ # or install in your project / globally
21
+ bun add -d @kanchingyg/dbwatch
22
+ npm i -D @kanchingyg/dbwatch
23
+ ```
24
+
25
+ [JSR](https://jsr.io/@kanchingyg/dbwatch):
26
+
27
+ ```bash
28
+ bunx jsr add @kanchingyg/dbwatch
29
+ npx jsr add @kanchingyg/dbwatch
30
+ ```
31
+
32
+ ## Quick start
33
+
34
+ ```bash
35
+ npx @kanchingyg/dbwatch sqlite:./local.db -- npm test
36
+ bunx @kanchingyg/dbwatch sqlite:./local.db -- bun test
37
+ npx @kanchingyg/dbwatch sqlite:./local.db --revert --allow-write -- npm test
38
+ npx @kanchingyg/dbwatch --mcp
39
+ ```
40
+
41
+ ## Local models
42
+
43
+ ```bash
44
+ npx @kanchingyg/dbwatch sqlite:./app.db --explain --model ollama/qwen2.5-coder:7b
45
+ ```
46
+
47
+ Point `baseUrl` in MCP `explain_side_effects` to LM Studio or vLLM (`http://127.0.0.1:1234`).
48
+
49
+ ## Supported DSNs
50
+
51
+ - `sqlite:./path/to.db` or `file:./path/to.db`
52
+ - `d1:./local-d1.sqlite` (local Cloudflare D1 SQLite file)
53
+ - Postgres DSN parsing is reserved; use SQLite/D1 for zero-config local diffs today.
54
+
55
+ ## MCP Tools Reference
56
+
57
+ | Tool | Mutates | Description |
58
+ | --- | --- | --- |
59
+ | `run_with_db_diff` | `true` | Snapshot SQLite/D1 tables, execute a child command, and return exit status plus row-level INSERT/UPDATE/DELETE diffs (requires `--allow-write`). |
60
+ | `revert_last_diff` | `true` | Execute inverse SQL statements from the most recent captured diff to restore prior table state (requires `--allow-write`). |
61
+ | `explain_side_effects` | `false` | Summarize captured row mutations in two lines via a local Ollama or OpenAI-compatible model. |
62
+
63
+ ## Editor and Agent Integration
64
+
65
+ ### Cursor (`.cursor/mcp.json`)
66
+
67
+ ```json
68
+ {
69
+ "mcpServers": {
70
+ "dbwatch": {
71
+ "command": "npx",
72
+ "args": ["-y", "@kanchingyg/dbwatch", "--mcp"]
73
+ }
74
+ }
75
+ }
76
+ ```
77
+
78
+ ### Claude Code CLI
79
+
80
+ ```bash
81
+ claude mcp add dbwatch -- npx -y @kanchingyg/dbwatch --mcp
82
+ ```
83
+
84
+ ### Programmatic Usage (JSR / TypeScript)
85
+
86
+ ```ts
87
+ import * as bridge from "jsr:@kanchingyg/dbwatch/bridge";
88
+ ```
89
+
90
+ ## Runtime Safety and Guardrails
91
+
92
+ - **Stdio frame isolation**: `--mcp` keeps JSON-RPC on `stdout` clean.
93
+ - **Read-only default**: `run_with_db_diff` / `revert_last_diff` need `--allow-write`; `--dry-run` simulates.
94
+ - **Loop breaker**: Identical MCP tool calls halt after three repeats.
95
+ - **Revert SQL**: Inverse statements use quoted identifiers and escaped literals (SQLite/D1 local files only today).
96
+
97
+ ## License
98
+
99
+ [MIT](./LICENSE)
package/SKILL.md ADDED
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: dbwatch
3
+ description: Wrap tests/commands with live SQLite/D1 row diffs and MCP rollback tools.
4
+ ---
5
+
6
+ # dbwatch
7
+
8
+ Run `npx @kanchingyg/dbwatch <dsn> -- <command>` before trusting a migration or test.
9
+
10
+ - MCP: `npx @kanchingyg/dbwatch --mcp` exposes `run_with_db_diff`, `revert_last_diff`, `explain_side_effects`.
11
+ - Destructive rollback needs `--allow-write` (default is read-only for `revert_last_diff`).
12
+ - For local reasoning on diffs, pass `--model ollama/<name>` or an OpenAI-compatible `baseUrl`.
@@ -0,0 +1,196 @@
1
+ #!/usr/bin/env node
2
+ import { createServer, type IncomingMessage, type ServerResponse } from "node:http";
3
+ /** Configuration and data shape for `McpToolDef` (mcp tool def). */
4
+ export type McpToolDef = {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: string;
9
+ properties: Record<string, unknown>;
10
+ required?: string[];
11
+ additionalProperties?: boolean;
12
+ };
13
+ annotations?: {
14
+ readOnlyHint?: boolean;
15
+ destructiveHint?: boolean;
16
+ idempotentHint?: boolean;
17
+ openWorldHint?: boolean;
18
+ };
19
+ mutates?: boolean;
20
+ };
21
+ /** Configuration and data shape for `GuardOptions` (guard options). */
22
+ export type GuardOptions = {
23
+ allowWrite?: boolean;
24
+ dryRun?: boolean;
25
+ };
26
+ /** Executes `setGuards` to set guards in `dbwatch`. */
27
+ export declare function setGuards(opts: GuardOptions): void;
28
+ /** Executes `canonicalizeJson` to canonicalize json in `dbwatch`. */
29
+ export declare function canonicalizeJson(value: unknown): string;
30
+ /** Executes `loopBreakerHash` to loop breaker hash in `dbwatch`. */
31
+ export declare function loopBreakerHash(toolName: string, args: unknown): string;
32
+ /** Executes `resetLoopBreaker` to reset loop breaker in `dbwatch`. */
33
+ export declare function resetLoopBreaker(): void;
34
+ /** Executes `checkLoopBreaker` to check loop breaker in `dbwatch`. */
35
+ export declare function checkLoopBreaker(toolName: string, args: unknown): string | null;
36
+ /** Executes `guardMutatingTool` to guard mutating tool in `dbwatch`. */
37
+ export declare function guardMutatingTool(tool: McpToolDef): {
38
+ blocked: boolean;
39
+ reason?: string;
40
+ };
41
+ /** Executes `windowsToWsl` to windows to wsl in `dbwatch`. */
42
+ export declare function windowsToWsl(p: string): string;
43
+ /** Executes `wslToWindows` to wsl to windows in `dbwatch`. */
44
+ export declare function wslToWindows(p: string): string;
45
+ /** Executes `normalizePathsDeep` to normalize paths deep in `dbwatch`. */
46
+ export declare function normalizePathsDeep<T>(value: T, toWsl: boolean): T;
47
+ /** Executes `hijackStdoutForMcp` to hijack stdout for mcp in `dbwatch`. */
48
+ export declare function hijackStdoutForMcp(): void;
49
+ /** Constant `jsonRpcFrameLog` defining json rpc frame log. */
50
+ export declare const jsonRpcFrameLog: string[];
51
+ /** Executes `writeJsonRpcFrame` to write json rpc frame in `dbwatch`. */
52
+ export declare function writeJsonRpcFrame(obj: object): void;
53
+ /** Configuration and data shape for `McpServerOptions` (mcp server options). */
54
+ export type McpServerOptions = {
55
+ repoRoot?: string;
56
+ tools?: McpToolDef[];
57
+ handlers?: Record<string, (args: Record<string, unknown>) => Promise<unknown>>;
58
+ pathToWsl?: boolean;
59
+ nCtx?: number;
60
+ };
61
+ /** Executes `startMcpServer` to start mcp server in `dbwatch`. */
62
+ export declare function startMcpServer(opts?: McpServerOptions): void;
63
+ /** Executes `dispatchMcpMessage` to dispatch mcp message in `dbwatch`. */
64
+ export declare function dispatchMcpMessage(msg: {
65
+ jsonrpc?: string;
66
+ id?: number | string;
67
+ method?: string;
68
+ params?: Record<string, unknown>;
69
+ }, opts?: McpServerOptions): void;
70
+ /** Constant `EMBED_LOCK` defining embed lock. */
71
+ export declare const EMBED_LOCK = ".dbwatch-embed-lock.json";
72
+ /** Constant `KNOWN_DIMENSIONS` defining known dimensions. */
73
+ export declare const KNOWN_DIMENSIONS: readonly [384, 768, 1024, 1536, 2560, 3072, 4096];
74
+ /** Configuration and data shape for `EmbedLock` (embed lock). */
75
+ export type EmbedLock = {
76
+ provider: string;
77
+ model: string;
78
+ dimension: number;
79
+ };
80
+ /** Executes `readEmbedLock` to read embed lock in `dbwatch`. */
81
+ export declare function readEmbedLock(repoRoot: string): EmbedLock | null;
82
+ /** Executes `writeEmbedLock` to write embed lock in `dbwatch`. */
83
+ export declare function writeEmbedLock(repoRoot: string, lock: EmbedLock): void;
84
+ /** Executes `assertDimensionFingerprint` to assert dimension fingerprint in `dbwatch`. */
85
+ export declare function assertDimensionFingerprint(lock: EmbedLock | null, dim: number): void;
86
+ /** Executes `l2Normalize` to l2 normalize in `dbwatch`. */
87
+ export declare function l2Normalize(vec: number[]): number[];
88
+ /** Executes `mrlSlice` to mrl slice in `dbwatch`. */
89
+ export declare function mrlSlice(vec: number[], dimensions: number): number[];
90
+ /** Executes `floatArrayToBase64` to float array to base64 in `dbwatch`. */
91
+ export declare function floatArrayToBase64(vec: number[]): string;
92
+ /** Executes `base64ToFloatArray` to base64 to float array in `dbwatch`. */
93
+ export declare function base64ToFloatArray(b64: string): number[];
94
+ /** Configuration and data shape for `EmbedUpstream` (embed upstream). */
95
+ export type EmbedUpstream = {
96
+ name: string;
97
+ maxBatch: number;
98
+ embed: (input: string[], model: string, dimensions?: number) => Promise<number[][]>;
99
+ };
100
+ /** Executes `chunkArray` to chunk array in `dbwatch`. */
101
+ export declare function chunkArray<T>(arr: T[], size: number): T[][];
102
+ /** Executes `normalizeEmbedBatch` to normalize embed batch in `dbwatch`. */
103
+ export declare function normalizeEmbedBatch(inputs: string[], options: {
104
+ dimensions?: number;
105
+ upstream: EmbedUpstream;
106
+ model: string;
107
+ lock?: EmbedLock | null;
108
+ }): Promise<{
109
+ embeddings: number[][];
110
+ indices: number[];
111
+ }>;
112
+ /** Configuration and data shape for `EmbedServerOptions` (embed server options). */
113
+ export type EmbedServerOptions = {
114
+ port: number;
115
+ repoRoot: string;
116
+ upstream: EmbedUpstream;
117
+ defaultModel: string;
118
+ };
119
+ /** Executes `createEmbedRequestHandler` to create embed request handler in `dbwatch`. */
120
+ export declare function createEmbedRequestHandler(opts: EmbedServerOptions): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
121
+ /** Executes `startEmbedServer` to start embed server in `dbwatch`. */
122
+ export declare function startEmbedServer(opts: EmbedServerOptions): ReturnType<typeof createServer>;
123
+ /** Executes `createDashScopeUpstream` to create dash scope upstream in `dbwatch`. */
124
+ export declare function createDashScopeUpstream(fetchImpl?: typeof fetch, opts?: {
125
+ apiKey?: string;
126
+ }): EmbedUpstream;
127
+ /** Constant `DEFAULT_N_CTX` defining default n ctx. */
128
+ export declare const DEFAULT_N_CTX = 4096;
129
+ /** Constant `TRUNCATION_MARKER` defining truncation marker. */
130
+ export declare const TRUNCATION_MARKER = "[...TRUNCATED BY DBWATCH CONTEXT GUARD...]";
131
+ /** Executes `probeNCtx` to probe nctx in `dbwatch`. */
132
+ export declare function probeNCtx(baseUrl: string, fetchImpl?: typeof fetch): Promise<{
133
+ nCtx: number;
134
+ source: string;
135
+ }>;
136
+ /** Executes `headTailTruncate` to head tail truncate in `dbwatch`. */
137
+ export declare function headTailTruncate(text: string, maxChars: number): string;
138
+ /** Executes `truncateToolOutput` to truncate tool output in `dbwatch`. */
139
+ export declare function truncateToolOutput(text: string, nCtx: number): string;
140
+ /** Executes `buildRecencyAnchor` to build recency anchor in `dbwatch`. */
141
+ export declare function buildRecencyAnchor(sigs: Array<{
142
+ name: string;
143
+ summary: string;
144
+ }>): string;
145
+ /** Executes `anchorPromptTail` to anchor prompt tail in `dbwatch`. */
146
+ export declare function anchorPromptTail(prompt: string, anchor: string): string;
147
+ /** Stateful helper class `StreamToolJsonAbort` (stream tool json abort). */
148
+ export declare class StreamToolJsonAbort {
149
+ private depth;
150
+ private started;
151
+ private acc;
152
+ /** Member `feed` (feed). */
153
+ feed(chunk: string): boolean;
154
+ }
155
+ /** Executes `stripRedactedThinking` to strip redacted thinking in `dbwatch`. */
156
+ export declare function stripRedactedThinking(text: string): string;
157
+ /** Executes `parseDirtyToolCall` to parse dirty tool call in `dbwatch`. */
158
+ export declare function parseDirtyToolCall(content: string): {
159
+ name: string;
160
+ arguments: Record<string, unknown>;
161
+ } | null;
162
+ /** Configuration and data shape for `ChatMessage` (chat message). */
163
+ export type ChatMessage = {
164
+ role: string;
165
+ content?: string | null;
166
+ tool_calls?: unknown[];
167
+ reasoning_content?: string;
168
+ };
169
+ /** Configuration and data shape for `ProviderId` (provider id). */
170
+ export type ProviderId = "deepseek" | "dashscope" | "moonshot" | "zhipu" | "minimax" | "siliconflow" | "doubao" | "generic" | "ollama" | "openai";
171
+ /** Executes `detectProvider` to detect provider in `dbwatch`. */
172
+ export declare function detectProvider(baseUrl: string, model?: string): ProviderId;
173
+ /** Executes `sanitizeRequestBody` to sanitize request body in `dbwatch`. */
174
+ export declare function sanitizeRequestBody(body: Record<string, unknown>, model: string): Record<string, unknown>;
175
+ /** Executes `normalizeToolChoice` to normalize tool choice in `dbwatch`. */
176
+ export declare function normalizeToolChoice(toolChoice: unknown, provider: ProviderId): unknown;
177
+ /** Configuration and data shape for `ReasoningState` (reasoning state). */
178
+ export type ReasoningState = {
179
+ inToolLoop: boolean;
180
+ lastUserTurnIndex: number;
181
+ };
182
+ /** Executes `createReasoningState` to create reasoning state in `dbwatch`. */
183
+ export declare function createReasoningState(): ReasoningState;
184
+ /** Executes `applyReasoningContentPolicy` to apply reasoning content policy in `dbwatch`. */
185
+ export declare function applyReasoningContentPolicy(messages: ChatMessage[], state: ReasoningState): {
186
+ messages: ChatMessage[];
187
+ state: ReasoningState;
188
+ };
189
+ /** Executes `redactSecrets` to redact secrets in `dbwatch`. */
190
+ export declare function redactSecrets(text: string): string;
191
+ /** Executes `finalizeMcpToolText` to finalize mcp tool text in `dbwatch`. */
192
+ export declare function finalizeMcpToolText(text: string, opts?: {
193
+ nCtx?: number;
194
+ toWsl?: boolean;
195
+ }): string;
196
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}