@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.
@@ -0,0 +1,226 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import { spawnSync } from "node:child_process";
3
+ import { existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync, } from "node:fs";
4
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
5
+ import { diffSnapshots, formatDiffLine, inverseSql, rowKey, } from "./differ.js";
6
+ const WIN_DRIVE_RE = /^([A-Za-z]):\\(.*)$/;
7
+ const WSL_RE = /^\/mnt\/([a-z])\/(.*)$/i;
8
+ function windowsToWsl(p) {
9
+ const m = p.match(WIN_DRIVE_RE);
10
+ if (!m)
11
+ return p;
12
+ return `/mnt/${m[1].toLowerCase()}/${m[2].replace(/\\/g, "/")}`;
13
+ }
14
+ function wslToWindows(p) {
15
+ const m = p.match(WSL_RE);
16
+ if (!m)
17
+ return p;
18
+ return `${m[1].toUpperCase()}:\\${m[2].replace(/\//g, "\\")}`;
19
+ }
20
+ const diffStore = new Map();
21
+ function diffStoreDirForDsn(dsn, cwd = process.cwd()) {
22
+ const dbPath = resolveSqlitePath(dsn, cwd);
23
+ const base = dbPath === ":memory:" || dbPath === "" ? cwd : dirname(dbPath);
24
+ return join(base, ".dbwatch", "diffs");
25
+ }
26
+ function diffFilePath(id, dsn) {
27
+ return join(diffStoreDirForDsn(dsn), `${id}.json`);
28
+ }
29
+ function collectDiffDirs() {
30
+ const dirs = new Set();
31
+ dirs.add(join(process.cwd(), ".dbwatch", "diffs"));
32
+ for (const rec of diffStore.values()) {
33
+ dirs.add(diffStoreDirForDsn(rec.dsn));
34
+ }
35
+ return [...dirs];
36
+ }
37
+ function persistDiffRecord(rec) {
38
+ const dir = diffStoreDirForDsn(rec.dsn);
39
+ mkdirSync(dir, { recursive: true });
40
+ writeFileSync(join(dir, `${rec.id}.json`), JSON.stringify(rec), "utf8");
41
+ }
42
+ function loadDiffRecord(id, dsnHint) {
43
+ if (dsnHint) {
44
+ const hinted = join(diffStoreDirForDsn(dsnHint), `${id}.json`);
45
+ if (existsSync(hinted)) {
46
+ return JSON.parse(readFileSync(hinted, "utf8"));
47
+ }
48
+ }
49
+ for (const dir of collectDiffDirs()) {
50
+ const path = join(dir, `${id}.json`);
51
+ if (existsSync(path)) {
52
+ return JSON.parse(readFileSync(path, "utf8"));
53
+ }
54
+ }
55
+ return undefined;
56
+ }
57
+ function removeDiffRecord(id, dsn) {
58
+ const path = diffFilePath(id, dsn);
59
+ if (existsSync(path))
60
+ unlinkSync(path);
61
+ }
62
+ export function clearDiffStore() {
63
+ diffStore.clear();
64
+ }
65
+ export function getDiffRecord(id, dsnHint) {
66
+ const cached = diffStore.get(id);
67
+ if (cached)
68
+ return cached;
69
+ const loaded = loadDiffRecord(id, dsnHint);
70
+ if (loaded)
71
+ diffStore.set(id, loaded);
72
+ return loaded;
73
+ }
74
+ export function listDiffIds() {
75
+ const ids = new Set(diffStore.keys());
76
+ for (const dir of collectDiffDirs()) {
77
+ if (!existsSync(dir))
78
+ continue;
79
+ for (const name of readdirSync(dir)) {
80
+ if (name.endsWith(".json"))
81
+ ids.add(name.slice(0, -".json".length));
82
+ }
83
+ }
84
+ return [...ids].sort();
85
+ }
86
+ export function assertPathContainedUnderCwd(path, cwd = process.cwd()) {
87
+ if (path === ":memory:" || path === "")
88
+ return path;
89
+ const resolved = isAbsolute(path) ? resolve(path) : resolve(cwd, path);
90
+ const rel = relative(cwd, resolved);
91
+ if (rel.startsWith("..") || isAbsolute(rel)) {
92
+ throw new Error(`Database path must stay under cwd (${cwd}): ${path}`);
93
+ }
94
+ return resolved;
95
+ }
96
+ export function resolveSqlitePath(dsn, cwd = process.cwd()) {
97
+ let p = dsn;
98
+ if (p.startsWith("sqlite:"))
99
+ p = p.slice("sqlite:".length);
100
+ if (p.startsWith("file:"))
101
+ p = p.slice("file:".length);
102
+ if (p.startsWith("d1:"))
103
+ p = p.slice("d1:".length);
104
+ if (p.startsWith("/mnt/"))
105
+ p = wslToWindows(p);
106
+ return assertPathContainedUnderCwd(p, cwd);
107
+ }
108
+ export function openSqlite(dsn, cwd = process.cwd()) {
109
+ const path = resolveSqlitePath(dsn, cwd);
110
+ if (path === ":memory:" || path === "") {
111
+ return new DatabaseSync(":memory:");
112
+ }
113
+ return new DatabaseSync(path);
114
+ }
115
+ export function detectPkCol(db, table) {
116
+ const info = db.prepare(`PRAGMA table_info(${quote(table)})`).all();
117
+ const pk = info.find((c) => c.pk > 0);
118
+ if (pk)
119
+ return pk.name;
120
+ return "rowid";
121
+ }
122
+ function quote(table) {
123
+ return `"${table.replace(/"/g, '""')}"`;
124
+ }
125
+ export function listUserTables(db) {
126
+ const rows = db
127
+ .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'`)
128
+ .all();
129
+ return rows.map((r) => r.name);
130
+ }
131
+ export function captureSnapshot(db) {
132
+ const snap = {};
133
+ const pkCols = {};
134
+ for (const table of listUserTables(db)) {
135
+ const pkCol = detectPkCol(db, table);
136
+ pkCols[table] = pkCol;
137
+ const rows = db.prepare(`SELECT * FROM ${quote(table)}`).all();
138
+ const indexed = {};
139
+ for (const row of rows) {
140
+ const key = rowKey(table, pkCol, row);
141
+ indexed[key] = row;
142
+ }
143
+ snap[table] = indexed;
144
+ }
145
+ return { snap, pkCols };
146
+ }
147
+ export function applyInverseSql(db, sql) {
148
+ for (const stmt of sql) {
149
+ db.exec(stmt);
150
+ }
151
+ }
152
+ export function runWithSqliteDiff(dsn, cmd, opts = {}) {
153
+ const db = openSqlite(dsn);
154
+ const before = captureSnapshot(db);
155
+ const env = {
156
+ ...Object.fromEntries(Object.entries(process.env).filter(([, v]) => v !== undefined)),
157
+ ...opts.env,
158
+ DBWATCH_DSN: resolveSqlitePath(dsn),
159
+ };
160
+ const normalizedDsn = windowsToWsl(resolveSqlitePath(dsn));
161
+ if (normalizedDsn !== resolveSqlitePath(dsn)) {
162
+ env.DBWATCH_DSN_WSL = normalizedDsn;
163
+ }
164
+ const child = spawnSync(cmd[0], cmd.slice(1), {
165
+ env,
166
+ stdio: "inherit",
167
+ shell: false,
168
+ });
169
+ const exitCode = child.status ?? 1;
170
+ const after = captureSnapshot(db);
171
+ const changes = diffSnapshots(before.snap, after.snap, before.pkCols);
172
+ const lines = changes.map(formatDiffLine);
173
+ const inverse = changes.map((c) => inverseSql(c, before.pkCols[c.table] ?? "rowid"));
174
+ const id = `diff_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
175
+ const record = {
176
+ id,
177
+ dsn,
178
+ changes,
179
+ pkCols: before.pkCols,
180
+ lines,
181
+ inverse,
182
+ };
183
+ diffStore.set(id, record);
184
+ persistDiffRecord(record);
185
+ db.close();
186
+ return { exitCode, diffId: id, changes, lines };
187
+ }
188
+ export function revertDiff(diffId, dryRun) {
189
+ const rec = getDiffRecord(diffId);
190
+ if (!rec)
191
+ throw new Error(`Unknown diffId: ${diffId}`);
192
+ if (dryRun)
193
+ return { sql: rec.inverse, applied: false };
194
+ const db = openSqlite(rec.dsn);
195
+ applyInverseSql(db, rec.inverse);
196
+ db.close();
197
+ diffStore.delete(diffId);
198
+ removeDiffRecord(diffId, rec.dsn);
199
+ return { sql: rec.inverse, applied: true };
200
+ }
201
+ export function runScriptOnDb(db, sql) {
202
+ db.exec(sql);
203
+ }
204
+ export function runWithSqliteMutation(dsn, mutate) {
205
+ const db = openSqlite(dsn);
206
+ const before = captureSnapshot(db);
207
+ mutate(db);
208
+ const after = captureSnapshot(db);
209
+ const changes = diffSnapshots(before.snap, after.snap, before.pkCols);
210
+ const lines = changes.map(formatDiffLine);
211
+ const inverse = changes.map((c) => inverseSql(c, before.pkCols[c.table] ?? "rowid"));
212
+ const id = `diff_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
213
+ const record = {
214
+ id,
215
+ dsn,
216
+ changes,
217
+ pkCols: before.pkCols,
218
+ lines,
219
+ inverse,
220
+ };
221
+ diffStore.set(id, record);
222
+ persistDiffRecord(record);
223
+ db.close();
224
+ return { exitCode: 0, diffId: id, changes, lines };
225
+ }
226
+ //# sourceMappingURL=sqlite-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-tracker.js","sourceRoot":"","sources":["../src/sqlite-tracker.ts"],"names":[],"mappings":"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"}
package/jsr.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@kanchingyg/dbwatch",
3
+ "version": "0.1.1",
4
+ "description": "Git-style live row diff for SQLite/D1/Postgres around any command, with instant rollback",
5
+ "license": "MIT",
6
+ "exports": {
7
+ ".": "./src/cli.ts",
8
+ "./bridge": "./src/bridge.ts"
9
+ },
10
+ "publish": {
11
+ "include": [
12
+ "src/**/*.ts",
13
+ "LICENSE",
14
+ "README.md",
15
+ "SKILL.md",
16
+ "jsr.json"
17
+ ],
18
+ "exclude": [
19
+ "src/**/*.test.ts",
20
+ "src/**/*.spec.ts"
21
+ ]
22
+ }
23
+ }
package/package.json CHANGED
@@ -1,6 +1,58 @@
1
1
  {
2
2
  "name": "@kanchingyg/dbwatch",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "Git-style live row diff for SQLite/D1/Postgres around any command, with instant rollback",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "dbwatch": "./dist/cli.js"
9
+ },
10
+ "main": "./dist/cli.js",
11
+ "exports": {
12
+ ".": "./dist/cli.js",
13
+ "./bridge": "./dist/bridge.js"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "SKILL.md",
18
+ "README.md",
19
+ "LICENSE",
20
+ "jsr.json"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "test": "npm run build && vitest run",
25
+ "prepublishOnly": "npm run build",
26
+ "prepack": "npm run build"
27
+ },
28
+ "engines": {
29
+ "node": ">=22.5.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^22.10.0",
33
+ "publint": "^0.3.12",
34
+ "typescript": "^5.7.2",
35
+ "vitest": "^3.0.5"
36
+ },
37
+ "author": "Augusto Cerrutti <augustocerruttisatto@gmail.com>",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/kanchingyg/dbwatch.git"
41
+ },
42
+ "mcpName": "io.github.kanchingyg/dbwatch",
43
+ "homepage": "https://github.com/kanchingyg/dbwatch#readme",
44
+ "keywords": [
45
+ "mcp",
46
+ "mcp-server",
47
+ "model-context-protocol",
48
+ "cli",
49
+ "typescript",
50
+ "sqlite",
51
+ "postgresql",
52
+ "cloudflare-d1",
53
+ "database",
54
+ "diff",
55
+ "testing",
56
+ "rollback"
57
+ ]
58
+ }