@claude-flow/cli 3.12.4 → 3.13.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/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +47 -6
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/mcp-tools/metaharness-tools.d.ts +7 -0
- package/dist/src/mcp-tools/metaharness-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/metaharness-tools.js +144 -0
- package/dist/src/mcp-tools/metaharness-tools.js.map +1 -1
- package/dist/src/memory/graph-edge-writer.d.ts +37 -9
- package/dist/src/memory/graph-edge-writer.d.ts.map +1 -1
- package/dist/src/memory/graph-edge-writer.js +76 -75
- package/dist/src/memory/graph-edge-writer.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/plugins/ruflo-metaharness/scripts/_darwin.mjs +200 -0
- package/plugins/ruflo-metaharness/scripts/bench.mjs +95 -0
- package/plugins/ruflo-metaharness/scripts/evolve.mjs +244 -0
- package/plugins/ruflo-metaharness/scripts/security-bench.mjs +174 -0
- package/plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs +8 -0
- package/plugins/ruflo-metaharness/skills/harness-bench/SKILL.md +64 -0
- package/plugins/ruflo-metaharness/skills/harness-evolve/SKILL.md +92 -0
- package/plugins/ruflo-metaharness/skills/harness-security-bench/SKILL.md +101 -0
|
@@ -2,15 +2,30 @@
|
|
|
2
2
|
* Graph Edge Writer — ADR-130 Phase 1
|
|
3
3
|
*
|
|
4
4
|
* Provides a minimal interface for inserting rows into the graph_edges
|
|
5
|
-
*
|
|
5
|
+
* SQLite table defined by MEMORY_SCHEMA_V3.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* #2431 fix (2026-06-22) — replaces the prior sql.js implementation. The
|
|
8
|
+
* prior version opened sql.js, performed in-memory updates, then called
|
|
9
|
+
* `fs.writeFileSync(dbPath, db.export())` after every edge insert. This
|
|
10
|
+
* whole-file flush overwrote the main `memory.db` while the better-sqlite3
|
|
11
|
+
* bridge was actively writing through its WAL — exactly the dual-write
|
|
12
|
+
* race that ADR-068 (#1257) removed. Symptom: PRAGMA integrity_check
|
|
13
|
+
* reports `database disk image is malformed (11)` after a single
|
|
14
|
+
* memory_store + causal-edge sequence.
|
|
11
15
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
16
|
+
* Fix posture: use better-sqlite3 directly (the same native engine the
|
|
17
|
+
* memory bridge uses). WAL-native, no whole-file fsync, no race. Keeps
|
|
18
|
+
* the public API surface identical so callers don't have to change.
|
|
19
|
+
*
|
|
20
|
+
* Note: this is the minimum-safe fix. The architecturally cleaner fix
|
|
21
|
+
* (route writes through the bridge's controller layer) is scoped to a
|
|
22
|
+
* future ADR — see #2431 for the discussion. Until that ADR lands, this
|
|
23
|
+
* module owns its own better-sqlite3 handle but on the same file, with
|
|
24
|
+
* WAL mode enabled (which makes concurrent writers safe by SQLite's own
|
|
25
|
+
* design — no overlapping fsync).
|
|
26
|
+
*
|
|
27
|
+
* The module is designed for fire-and-forget callers — every public
|
|
28
|
+
* function suppresses errors internally so callers never need try/catch.
|
|
14
29
|
*
|
|
15
30
|
* @module v3/cli/memory/graph-edge-writer
|
|
16
31
|
*/
|
|
@@ -20,19 +35,23 @@ import * as crypto from 'crypto';
|
|
|
20
35
|
import { getMemoryRoot } from './memory-initializer.js';
|
|
21
36
|
import { encodeEmbedding } from './embedding-quantization.js';
|
|
22
37
|
// ============================================================================
|
|
23
|
-
// Lazy-cached
|
|
38
|
+
// Lazy-cached better-sqlite3 db handle
|
|
24
39
|
// ============================================================================
|
|
25
40
|
let _db = null;
|
|
26
41
|
let _dbPath = '';
|
|
27
42
|
let _dbInitializing = false;
|
|
28
43
|
/**
|
|
29
|
-
* Return the
|
|
44
|
+
* Return the better-sqlite3 Database instance for graph_edges writes.
|
|
30
45
|
* Creates the graph_edges table if it is absent (idempotent).
|
|
31
|
-
* Returns null if
|
|
46
|
+
* Returns null if better-sqlite3 is not available or db cannot be opened.
|
|
32
47
|
*
|
|
33
48
|
* #2246 fix: `createIfMissing` (default false for back-compat) — when true,
|
|
34
49
|
* lazily creates an empty memory.db with the graph_edges schema so
|
|
35
50
|
* graph-pathfinder works on fresh environments before any memory writes.
|
|
51
|
+
*
|
|
52
|
+
* #2431 fix: better-sqlite3 + WAL mode replaces sql.js + whole-file
|
|
53
|
+
* writeFileSync. Eliminates the dual-write race that corrupted memory.db
|
|
54
|
+
* when called alongside the memory bridge's better-sqlite3 writer.
|
|
36
55
|
*/
|
|
37
56
|
export async function getBridgeDb(customDbPath, opts) {
|
|
38
57
|
const dbPath = customDbPath ?? path.join(getMemoryRoot(), 'memory.db');
|
|
@@ -46,23 +65,34 @@ export async function getBridgeDb(customDbPath, opts) {
|
|
|
46
65
|
const dbExists = fs.existsSync(dbPath);
|
|
47
66
|
if (!dbExists && !createIfMissing)
|
|
48
67
|
return null;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
let db;
|
|
52
|
-
if (dbExists) {
|
|
53
|
-
const fileBuffer = fs.readFileSync(dbPath);
|
|
54
|
-
db = new SQL.Database(fileBuffer);
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
// Lazy-create empty DB + ensure parent dir exists.
|
|
68
|
+
// Ensure parent dir exists for createIfMissing case.
|
|
69
|
+
if (!dbExists && createIfMissing) {
|
|
58
70
|
const dir = path.dirname(dbPath);
|
|
59
71
|
if (!fs.existsSync(dir))
|
|
60
72
|
fs.mkdirSync(dir, { recursive: true });
|
|
61
|
-
db = new SQL.Database();
|
|
62
73
|
}
|
|
74
|
+
// better-sqlite3 may not be available on all platforms (it's a native
|
|
75
|
+
// module, so platform-specific binaries are required). If unavailable,
|
|
76
|
+
// return null and let callers degrade gracefully — same posture as the
|
|
77
|
+
// prior sql.js version when sql.js failed to load.
|
|
78
|
+
let BetterSqlite3;
|
|
79
|
+
try {
|
|
80
|
+
BetterSqlite3 = (await import('better-sqlite3')).default;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const db = new BetterSqlite3(dbPath);
|
|
86
|
+
// WAL mode is the load-bearing piece of the #2431 fix: it lets multiple
|
|
87
|
+
// connections (this module + the memory bridge) write to the same file
|
|
88
|
+
// without overlapping fsyncs corrupting each other. SQLite's WAL is
|
|
89
|
+
// designed for exactly this case.
|
|
90
|
+
db.pragma('journal_mode = WAL');
|
|
91
|
+
db.pragma('synchronous = NORMAL'); // WAL-safe + faster than FULL
|
|
92
|
+
db.pragma('busy_timeout = 5000'); // wait up to 5s on lock contention
|
|
63
93
|
// Ensure graph_edges table exists (in case this is an older DB that
|
|
64
94
|
// predates ADR-130 Phase 1 schema migration).
|
|
65
|
-
db.
|
|
95
|
+
db.exec(`
|
|
66
96
|
CREATE TABLE IF NOT EXISTS graph_edges (
|
|
67
97
|
id TEXT PRIMARY KEY,
|
|
68
98
|
source_id TEXT NOT NULL,
|
|
@@ -76,23 +106,14 @@ export async function getBridgeDb(customDbPath, opts) {
|
|
|
76
106
|
embedding_ref TEXT,
|
|
77
107
|
metadata TEXT,
|
|
78
108
|
created_at TEXT NOT NULL
|
|
79
|
-
)
|
|
109
|
+
);
|
|
110
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges (source_id);
|
|
111
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges (target_id);
|
|
112
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_relation ON graph_edges (relation);
|
|
113
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_reinforced ON graph_edges (last_reinforced);
|
|
80
114
|
`);
|
|
81
|
-
db.run(`CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges (source_id)`);
|
|
82
|
-
db.run(`CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges (target_id)`);
|
|
83
|
-
db.run(`CREATE INDEX IF NOT EXISTS idx_graph_edges_relation ON graph_edges (relation)`);
|
|
84
|
-
db.run(`CREATE INDEX IF NOT EXISTS idx_graph_edges_reinforced ON graph_edges (last_reinforced)`);
|
|
85
115
|
_db = db;
|
|
86
116
|
_dbPath = dbPath;
|
|
87
|
-
// #2246 — if we just lazy-created the DB, persist the empty file so
|
|
88
|
-
// subsequent calls can read it back without re-creating.
|
|
89
|
-
if (!dbExists && createIfMissing) {
|
|
90
|
-
try {
|
|
91
|
-
const data = db.export();
|
|
92
|
-
fs.writeFileSync(dbPath, Buffer.from(data));
|
|
93
|
-
}
|
|
94
|
-
catch { /* non-fatal — caller will re-flush on first write */ }
|
|
95
|
-
}
|
|
96
117
|
return db;
|
|
97
118
|
}
|
|
98
119
|
catch {
|
|
@@ -102,23 +123,15 @@ export async function getBridgeDb(customDbPath, opts) {
|
|
|
102
123
|
_dbInitializing = false;
|
|
103
124
|
}
|
|
104
125
|
}
|
|
105
|
-
/**
|
|
106
|
-
* Persist the in-memory sql.js database back to disk.
|
|
107
|
-
* Called after each write to keep the file consistent.
|
|
108
|
-
*/
|
|
109
|
-
async function flushDb(db) {
|
|
110
|
-
try {
|
|
111
|
-
if (!_dbPath)
|
|
112
|
-
return;
|
|
113
|
-
const data = db.export();
|
|
114
|
-
fs.writeFileSync(_dbPath, Buffer.from(data));
|
|
115
|
-
}
|
|
116
|
-
catch { /* non-fatal */ }
|
|
117
|
-
}
|
|
118
126
|
/**
|
|
119
127
|
* Insert a single edge into graph_edges.
|
|
120
128
|
* Fire-and-forget — errors are suppressed.
|
|
121
129
|
* Returns true if the write succeeded, false otherwise.
|
|
130
|
+
*
|
|
131
|
+
* #2431 fix: uses better-sqlite3 prepared statements + implicit WAL
|
|
132
|
+
* journal. No `fs.writeFileSync` whole-file flush — the WAL handles
|
|
133
|
+
* durability without overwriting the main file out from under other
|
|
134
|
+
* writers.
|
|
122
135
|
*/
|
|
123
136
|
export async function insertGraphEdge(input) {
|
|
124
137
|
try {
|
|
@@ -132,24 +145,10 @@ export async function insertGraphEdge(input) {
|
|
|
132
145
|
embeddingRef = encodeEmbedding(input.embedding);
|
|
133
146
|
}
|
|
134
147
|
const metaStr = input.metadata ? JSON.stringify(input.metadata) : null;
|
|
135
|
-
db.
|
|
148
|
+
db.prepare(`INSERT OR IGNORE INTO graph_edges
|
|
136
149
|
(id, source_id, target_id, relation, weight, confidence, decay_rate,
|
|
137
150
|
last_reinforced, witness_id, embedding_ref, metadata, created_at)
|
|
138
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
139
|
-
id,
|
|
140
|
-
input.sourceId,
|
|
141
|
-
input.targetId,
|
|
142
|
-
input.relation,
|
|
143
|
-
input.weight ?? 1.0,
|
|
144
|
-
input.confidence ?? 1.0,
|
|
145
|
-
input.decayRate ?? 0.0,
|
|
146
|
-
input.lastReinforced ?? null,
|
|
147
|
-
input.witnessId ?? null,
|
|
148
|
-
embeddingRef,
|
|
149
|
-
metaStr,
|
|
150
|
-
createdAt,
|
|
151
|
-
]);
|
|
152
|
-
await flushDb(db);
|
|
151
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.sourceId, input.targetId, input.relation, input.weight ?? 1.0, input.confidence ?? 1.0, input.decayRate ?? 0.0, input.lastReinforced ?? null, input.witnessId ?? null, embeddingRef, metaStr, createdAt);
|
|
153
152
|
return true;
|
|
154
153
|
}
|
|
155
154
|
catch {
|
|
@@ -169,15 +168,7 @@ export async function queryEdgesBySource(sourceId, relation, dbPath) {
|
|
|
169
168
|
? `SELECT id, source_id, target_id, relation, weight FROM graph_edges WHERE source_id = ? AND relation = ? LIMIT 1000`
|
|
170
169
|
: `SELECT id, source_id, target_id, relation, weight FROM graph_edges WHERE source_id = ? LIMIT 1000`;
|
|
171
170
|
const args = relation ? [sourceId, relation] : [sourceId];
|
|
172
|
-
|
|
173
|
-
if (!result?.[0])
|
|
174
|
-
return [];
|
|
175
|
-
const cols = result[0].columns;
|
|
176
|
-
return result[0].values.map((row) => {
|
|
177
|
-
const obj = {};
|
|
178
|
-
cols.forEach((c, i) => { obj[c] = row[i]; });
|
|
179
|
-
return obj;
|
|
180
|
-
});
|
|
171
|
+
return db.prepare(sql).all(...args);
|
|
181
172
|
}
|
|
182
173
|
catch {
|
|
183
174
|
return [];
|
|
@@ -191,8 +182,8 @@ export async function countGraphEdges(dbPath) {
|
|
|
191
182
|
const db = await getBridgeDb(dbPath);
|
|
192
183
|
if (!db)
|
|
193
184
|
return 0;
|
|
194
|
-
const
|
|
195
|
-
return
|
|
185
|
+
const row = db.prepare(`SELECT COUNT(*) AS n FROM graph_edges`).get();
|
|
186
|
+
return row?.n ?? 0;
|
|
196
187
|
}
|
|
197
188
|
catch {
|
|
198
189
|
return 0;
|
|
@@ -200,8 +191,18 @@ export async function countGraphEdges(dbPath) {
|
|
|
200
191
|
}
|
|
201
192
|
/**
|
|
202
193
|
* Reset the cached db handle (for tests that need a fresh DB).
|
|
194
|
+
*
|
|
195
|
+
* #2431 fix: also explicitly closes the prior handle so file locks
|
|
196
|
+
* release immediately — better-sqlite3 holds an OS-level file handle
|
|
197
|
+
* which the prior sql.js implementation did not.
|
|
203
198
|
*/
|
|
204
199
|
export function _resetBridgeDb() {
|
|
200
|
+
if (_db) {
|
|
201
|
+
try {
|
|
202
|
+
_db.close();
|
|
203
|
+
}
|
|
204
|
+
catch { /* best-effort */ }
|
|
205
|
+
}
|
|
205
206
|
_db = null;
|
|
206
207
|
_dbPath = '';
|
|
207
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-edge-writer.js","sourceRoot":"","sources":["../../../src/memory/graph-edge-writer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"graph-edge-writer.js","sourceRoot":"","sources":["../../../src/memory/graph-edge-writer.ts"],"names":[],"mappings":"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"}
|