@claude-flow/cli 3.7.0 → 3.9.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.
- package/README.md +4 -1
- package/dist/src/mcp-tools/agentdb-tools.d.ts +2 -0
- package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.js +492 -2
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +39 -0
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts +4 -0
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/wasm-agent-tools.js +549 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -1
- package/dist/src/memory/embedding-quantization.d.ts +62 -0
- package/dist/src/memory/embedding-quantization.d.ts.map +1 -0
- package/dist/src/memory/embedding-quantization.js +147 -0
- package/dist/src/memory/embedding-quantization.js.map +1 -0
- package/dist/src/memory/graph-edge-writer.d.ts +61 -0
- package/dist/src/memory/graph-edge-writer.d.ts.map +1 -0
- package/dist/src/memory/graph-edge-writer.js +183 -0
- package/dist/src/memory/graph-edge-writer.js.map +1 -0
- package/dist/src/memory/memory-initializer.d.ts +1 -1
- package/dist/src/memory/memory-initializer.d.ts.map +1 -1
- package/dist/src/memory/memory-initializer.js +37 -0
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.d.ts +46 -11
- package/dist/src/ruvector/agent-wasm.d.ts.map +1 -1
- package/dist/src/ruvector/agent-wasm.js +134 -25
- package/dist/src/ruvector/agent-wasm.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/scripts/bench-rvagent.mjs +312 -0
- package/dist/src/__probe.d.ts +0 -2
- package/dist/src/__probe.d.ts.map +0 -1
- package/dist/src/__probe.js +0 -5
- package/dist/src/__probe.js.map +0 -1
- package/dist/src/commands/benchmark-cosign.d.ts +0 -29
- package/dist/src/commands/benchmark-cosign.d.ts.map +0 -1
- package/dist/src/commands/benchmark-cosign.js +0 -222
- package/dist/src/commands/benchmark-cosign.js.map +0 -1
- package/dist/src/commands/benchmark-verify.d.ts +0 -21
- package/dist/src/commands/benchmark-verify.d.ts.map +0 -1
- package/dist/src/commands/benchmark-verify.js +0 -202
- package/dist/src/commands/benchmark-verify.js.map +0 -1
- package/dist/src/mcp-tools/hive-consensus-runtime.d.ts +0 -149
- package/dist/src/mcp-tools/hive-consensus-runtime.d.ts.map +0 -1
- package/dist/src/mcp-tools/hive-consensus-runtime.js +0 -296
- package/dist/src/mcp-tools/hive-consensus-runtime.js.map +0 -1
- package/dist/src/memory/ann-router-registry.d.ts +0 -61
- package/dist/src/memory/ann-router-registry.d.ts.map +0 -1
- package/dist/src/memory/ann-router-registry.js +0 -72
- package/dist/src/memory/ann-router-registry.js.map +0 -1
- package/dist/src/memory/diskann-registry.d.ts +0 -56
- package/dist/src/memory/diskann-registry.d.ts.map +0 -1
- package/dist/src/memory/diskann-registry.js +0 -88
- package/dist/src/memory/diskann-registry.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claude-flow/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Ruflo CLI - Enterprise AI agent orchestration with 60+ specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ADR-129 rvagent benchmark suite.
|
|
4
|
+
*
|
|
5
|
+
* Measures the four performance wins introduced by ADR-129 Phases 1–4:
|
|
6
|
+
*
|
|
7
|
+
* P1 — Provider routing latency (JsModelProvider wiring).
|
|
8
|
+
* Compares echo-stub round-trip (keyless baseline) against provider
|
|
9
|
+
* attachment overhead (measured with a fake key that will 401 — we
|
|
10
|
+
* capture the latency to the WASM call boundary, not the network hop).
|
|
11
|
+
*
|
|
12
|
+
* P2 — wasm_agent_compose throughput with N=10/50/100 MCP tools.
|
|
13
|
+
* Shows cost of allowlist validation + descriptor building at scale.
|
|
14
|
+
*
|
|
15
|
+
* P3 — Gallery CRUD throughput: add → list → import → export → remove.
|
|
16
|
+
* Validates that the 10 new gallery operations land in <1 ms each.
|
|
17
|
+
*
|
|
18
|
+
* P4 — Plugin enumeration overhead: wasm_agent_compose with/without
|
|
19
|
+
* includePlugins. Measures manifest-lookup cost when the plugin
|
|
20
|
+
* directory does not exist (graceful no-op path).
|
|
21
|
+
*
|
|
22
|
+
* Output: docs/benchmarks/rvagent-baseline.json
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* node v3/@claude-flow/cli/scripts/bench-rvagent.mjs [--tag=baseline] [--trials=5]
|
|
26
|
+
*
|
|
27
|
+
* Pattern: mirrors v3/@claude-flow/guidance/scripts/bench-phase-1.mjs.
|
|
28
|
+
* Standalone — does NOT require the test runner, only Node ≥20 + the WASM
|
|
29
|
+
* package (@ruvector/rvagent-wasm must be installed for realistic numbers;
|
|
30
|
+
* the bench gracefully degrades to timing the WASM-unavailable error path).
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import { performance } from 'node:perf_hooks';
|
|
34
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
35
|
+
import { fileURLToPath } from 'node:url';
|
|
36
|
+
import { dirname, resolve } from 'node:path';
|
|
37
|
+
|
|
38
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
const REPO_ROOT = resolve(__dirname, '../../../..');
|
|
40
|
+
const OUT_DIR = resolve(REPO_ROOT, 'docs', 'benchmarks');
|
|
41
|
+
|
|
42
|
+
const args = Object.fromEntries(
|
|
43
|
+
process.argv.slice(2).map(a => {
|
|
44
|
+
const [k, v] = a.replace(/^--/, '').split('=');
|
|
45
|
+
return [k, v ?? true];
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const TAG = args.tag || 'baseline';
|
|
50
|
+
const TRIALS = Math.max(3, parseInt(args.trials || '5', 10));
|
|
51
|
+
|
|
52
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
53
|
+
// Timing harness — 5-trial median, same as bench-phase-1.mjs
|
|
54
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Time N async calls (or sync if fn returns non-Promise), return median ms.
|
|
58
|
+
*/
|
|
59
|
+
async function bench(name, fn, reps = 20) {
|
|
60
|
+
// Warmup — trigger any lazy init so it doesn't inflate the first trial.
|
|
61
|
+
for (let i = 0; i < Math.min(3, reps); i++) {
|
|
62
|
+
try { await fn(); } catch { /* ignore warmup errors */ }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const latencies = [];
|
|
66
|
+
for (let t = 0; t < TRIALS; t++) {
|
|
67
|
+
const start = performance.now();
|
|
68
|
+
for (let i = 0; i < reps; i++) {
|
|
69
|
+
try { await fn(); } catch { /* measure call overhead, not success */ }
|
|
70
|
+
}
|
|
71
|
+
latencies.push((performance.now() - start) / reps);
|
|
72
|
+
}
|
|
73
|
+
latencies.sort((a, b) => a - b);
|
|
74
|
+
const median = latencies[Math.floor(TRIALS / 2)];
|
|
75
|
+
const min = latencies[0];
|
|
76
|
+
const max = latencies[TRIALS - 1];
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
name,
|
|
80
|
+
trials: TRIALS,
|
|
81
|
+
reps,
|
|
82
|
+
medianMs: Math.round(median * 1000) / 1000,
|
|
83
|
+
minMs: Math.round(min * 1000) / 1000,
|
|
84
|
+
maxMs: Math.round(max * 1000) / 1000,
|
|
85
|
+
variance: Math.round(((max - min) / (median || 1)) * 1000) / 1000,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
90
|
+
// Load the live agent-wasm module (dist preferred, src fallback)
|
|
91
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
92
|
+
|
|
93
|
+
// dist layout: dist/src/**/*.js (tsc rootDir=.)
|
|
94
|
+
const DIST_SRC = resolve(__dirname, '../dist/src');
|
|
95
|
+
let wasmMod;
|
|
96
|
+
try {
|
|
97
|
+
wasmMod = await import(resolve(DIST_SRC, 'ruvector/agent-wasm.js'));
|
|
98
|
+
} catch {
|
|
99
|
+
console.warn('[bench] Could not load agent-wasm dist — using stub metrics only.');
|
|
100
|
+
wasmMod = null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Load the wasm tools module to bench wasm_agent_compose handler directly
|
|
104
|
+
let composeHandler;
|
|
105
|
+
let galleryHandlers = {};
|
|
106
|
+
try {
|
|
107
|
+
const toolsMod = await import(resolve(DIST_SRC, 'mcp-tools/wasm-agent-tools.js'));
|
|
108
|
+
const tools = toolsMod.wasmAgentTools ?? toolsMod.default ?? [];
|
|
109
|
+
const findHandler = (name) => tools.find(t => t.name === name)?.handler;
|
|
110
|
+
composeHandler = findHandler('wasm_agent_compose');
|
|
111
|
+
galleryHandlers = {
|
|
112
|
+
add: findHandler('wasm_gallery_add_custom'),
|
|
113
|
+
list: findHandler('wasm_gallery_list'),
|
|
114
|
+
importFn: findHandler('wasm_gallery_import'),
|
|
115
|
+
exportFn: findHandler('wasm_gallery_export'),
|
|
116
|
+
remove: findHandler('wasm_gallery_remove_custom'),
|
|
117
|
+
categories: findHandler('wasm_gallery_categories'),
|
|
118
|
+
listByCategory: findHandler('wasm_gallery_list_by_category'),
|
|
119
|
+
loadRvf: findHandler('wasm_gallery_load_rvf'),
|
|
120
|
+
active: findHandler('wasm_gallery_active'),
|
|
121
|
+
config: findHandler('wasm_gallery_config'),
|
|
122
|
+
};
|
|
123
|
+
} catch {
|
|
124
|
+
// Handlers unavailable — bench will time the missing-module error path.
|
|
125
|
+
composeHandler = null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
129
|
+
// P1 — Provider routing latency
|
|
130
|
+
//
|
|
131
|
+
// Baseline: echo-stub path (no keys set) — measures raw WASM call overhead.
|
|
132
|
+
// Provider: createWasmAgent with a fake ANTHROPIC_API_KEY. The key is 401'd
|
|
133
|
+
// by the Anthropic API before any tokens are billed, but the routing
|
|
134
|
+
// logic (attachJsModelProvider, JsModelProvider instantiation, provider
|
|
135
|
+
// lookup) runs synchronously before the network call. We measure the
|
|
136
|
+
// in-process portion only by timing createWasmAgent + promptWasmAgent
|
|
137
|
+
// with a deliberately short input and catching the 401 network error.
|
|
138
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
const originalKey = process.env.ANTHROPIC_API_KEY;
|
|
141
|
+
|
|
142
|
+
console.log('\nADR-129 rvagent benchmark suite');
|
|
143
|
+
console.log('================================');
|
|
144
|
+
console.log(`tag=${TAG} trials=${TRIALS} node=${process.version}`);
|
|
145
|
+
console.log('');
|
|
146
|
+
|
|
147
|
+
// P1a — echo-stub baseline (no key)
|
|
148
|
+
console.log('P1a: provider routing — echo-stub baseline (keyless)...');
|
|
149
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
150
|
+
delete process.env.OPENROUTER_API_KEY;
|
|
151
|
+
delete process.env.OLLAMA_API_KEY;
|
|
152
|
+
|
|
153
|
+
const r_p1_echo = await bench('P1-echo-stub: createWasmAgent (keyless)', async () => {
|
|
154
|
+
if (!wasmMod) return; // module unavailable — timing the absence
|
|
155
|
+
try {
|
|
156
|
+
const info = await wasmMod.createWasmAgent({ maxTurns: 1 });
|
|
157
|
+
wasmMod.terminateWasmAgent(info.id);
|
|
158
|
+
} catch { /* WASM unavailable is expected in keyless CI */ }
|
|
159
|
+
}, 5);
|
|
160
|
+
|
|
161
|
+
// P1b — provider-path: fake key triggers attachJsModelProvider logic
|
|
162
|
+
console.log('P1b: provider routing — with fake key (measures attach overhead)...');
|
|
163
|
+
process.env.ANTHROPIC_API_KEY = 'sk-ant-bench-fake-key-00000000000000000000000000';
|
|
164
|
+
|
|
165
|
+
const r_p1_provider = await bench('P1-provider-path: createWasmAgent (fake key)', async () => {
|
|
166
|
+
if (!wasmMod) return;
|
|
167
|
+
try {
|
|
168
|
+
const info = await wasmMod.createWasmAgent({ maxTurns: 1 });
|
|
169
|
+
wasmMod.terminateWasmAgent(info.id);
|
|
170
|
+
} catch { /* 401 expected */ }
|
|
171
|
+
}, 5);
|
|
172
|
+
|
|
173
|
+
// Restore original key state
|
|
174
|
+
if (originalKey !== undefined) {
|
|
175
|
+
process.env.ANTHROPIC_API_KEY = originalKey;
|
|
176
|
+
} else {
|
|
177
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
181
|
+
// P2 — wasm_agent_compose throughput with N=10/50/100 MCP tools
|
|
182
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
183
|
+
|
|
184
|
+
console.log('P2: compose throughput — N=10/50/100 MCP tools...');
|
|
185
|
+
|
|
186
|
+
function makeMcpToolList(n) {
|
|
187
|
+
return Array.from({ length: n }, (_, i) => `memory_search_${i % 30 === 0 ? i : 'search'}`);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function timeCompose(toolCount) {
|
|
191
|
+
if (!composeHandler) return null;
|
|
192
|
+
const tools = makeMcpToolList(toolCount);
|
|
193
|
+
return bench(`P2-compose: ${toolCount} MCP tools`, async () => {
|
|
194
|
+
await composeHandler({ mcpTools: tools, skills: [], prompts: [], tools: [] });
|
|
195
|
+
}, 10);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const r_p2_10 = await timeCompose(10);
|
|
199
|
+
const r_p2_50 = await timeCompose(50);
|
|
200
|
+
const r_p2_100 = await timeCompose(100);
|
|
201
|
+
|
|
202
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
203
|
+
// P3 — Gallery CRUD throughput: full add → list → import → export → remove cycle
|
|
204
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
205
|
+
|
|
206
|
+
console.log('P3: gallery CRUD — add/list/import/export/remove cycle...');
|
|
207
|
+
|
|
208
|
+
const CUSTOM_TEMPLATE = JSON.stringify({
|
|
209
|
+
id: 'bench-custom-1',
|
|
210
|
+
name: 'bench-template',
|
|
211
|
+
description: 'Benchmark custom template',
|
|
212
|
+
category: 'testing',
|
|
213
|
+
tags: ['bench'],
|
|
214
|
+
version: '0.1.0',
|
|
215
|
+
author: 'bench',
|
|
216
|
+
builtin: false,
|
|
217
|
+
tools: [],
|
|
218
|
+
prompts: [],
|
|
219
|
+
skills: [],
|
|
220
|
+
mcp_tools: [],
|
|
221
|
+
capabilities: [],
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const r_p3_cycle = await bench('P3-gallery-crud: add→list→import→export→remove', async () => {
|
|
225
|
+
const fns = galleryHandlers;
|
|
226
|
+
if (fns.add) await fns.add({ template: JSON.parse(CUSTOM_TEMPLATE) }).catch(() => {});
|
|
227
|
+
if (fns.list) await fns.list({}).catch(() => {});
|
|
228
|
+
if (fns.importFn) await fns.importFn({ templatesJson: `[${CUSTOM_TEMPLATE}]` }).catch(() => {});
|
|
229
|
+
if (fns.exportFn) await fns.exportFn({}).catch(() => {});
|
|
230
|
+
if (fns.remove) await fns.remove({ id: 'bench-custom-1' }).catch(() => {});
|
|
231
|
+
}, 5);
|
|
232
|
+
|
|
233
|
+
const r_p3_categories = await bench('P3-gallery-categories: getCategories', async () => {
|
|
234
|
+
if (galleryHandlers.categories) await galleryHandlers.categories({}).catch(() => {});
|
|
235
|
+
}, 10);
|
|
236
|
+
|
|
237
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
238
|
+
// P4 — Plugin enumeration: compose with/without includePlugins
|
|
239
|
+
//
|
|
240
|
+
// Tests the manifest-lookup path for plugins that don't exist on disk
|
|
241
|
+
// (graceful no-op / warning). This measures that skipping absent plugins
|
|
242
|
+
// doesn't add significant overhead.
|
|
243
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
244
|
+
|
|
245
|
+
console.log('P4: plugin enumeration — compose with/without includePlugins...');
|
|
246
|
+
|
|
247
|
+
const r_p4_without = await bench('P4-plugin-enum: compose WITHOUT includePlugins', async () => {
|
|
248
|
+
if (!composeHandler) return;
|
|
249
|
+
await composeHandler({ mcpTools: ['memory_search'], skills: [], prompts: [], tools: [] });
|
|
250
|
+
}, 10);
|
|
251
|
+
|
|
252
|
+
const r_p4_with = await bench('P4-plugin-enum: compose WITH includePlugins (absent plugins)', async () => {
|
|
253
|
+
if (!composeHandler) return;
|
|
254
|
+
await composeHandler({
|
|
255
|
+
mcpTools: ['memory_search'],
|
|
256
|
+
includePlugins: ['nonexistent-plugin-a', 'nonexistent-plugin-b'],
|
|
257
|
+
skills: [],
|
|
258
|
+
prompts: [],
|
|
259
|
+
tools: [],
|
|
260
|
+
});
|
|
261
|
+
}, 10);
|
|
262
|
+
|
|
263
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
264
|
+
// Emit results
|
|
265
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
266
|
+
|
|
267
|
+
const results = [
|
|
268
|
+
r_p1_echo,
|
|
269
|
+
r_p1_provider,
|
|
270
|
+
r_p2_10,
|
|
271
|
+
r_p2_50,
|
|
272
|
+
r_p2_100,
|
|
273
|
+
r_p3_cycle,
|
|
274
|
+
r_p3_categories,
|
|
275
|
+
r_p4_without,
|
|
276
|
+
r_p4_with,
|
|
277
|
+
].filter(Boolean);
|
|
278
|
+
|
|
279
|
+
const out = {
|
|
280
|
+
tag: TAG,
|
|
281
|
+
trials: TRIALS,
|
|
282
|
+
node: process.version,
|
|
283
|
+
platform: `${process.platform}-${process.arch}`,
|
|
284
|
+
capturedAt: new Date().toISOString(),
|
|
285
|
+
adr: 'ADR-129',
|
|
286
|
+
phases: ['P1-provider-routing', 'P2-compose-throughput', 'P3-gallery-crud', 'P4-plugin-enum'],
|
|
287
|
+
results,
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
mkdirSync(OUT_DIR, { recursive: true });
|
|
291
|
+
const outPath = resolve(OUT_DIR, `rvagent-${TAG}.json`);
|
|
292
|
+
writeFileSync(outPath, JSON.stringify(out, null, 2));
|
|
293
|
+
|
|
294
|
+
console.log(`\nWrote ${outPath}\n`);
|
|
295
|
+
|
|
296
|
+
const COL_NAME = 52;
|
|
297
|
+
const COL_MS = 10;
|
|
298
|
+
const COL_VAR = 8;
|
|
299
|
+
|
|
300
|
+
console.log(`| ${'Benchmark'.padEnd(COL_NAME)} | ${'Median ms'.padStart(COL_MS)} | ${'Variance'.padStart(COL_VAR)} |`);
|
|
301
|
+
console.log(`|${'-'.repeat(COL_NAME + 2)}|${'-'.repeat(COL_MS + 2)}|${'-'.repeat(COL_VAR + 2)}|`);
|
|
302
|
+
|
|
303
|
+
for (const r of results) {
|
|
304
|
+
const name = r.name.padEnd(COL_NAME).slice(0, COL_NAME);
|
|
305
|
+
const ms = String(r.medianMs).padStart(COL_MS);
|
|
306
|
+
const vari = String(r.variance).padStart(COL_VAR);
|
|
307
|
+
console.log(`| ${name} | ${ms} | ${vari} |`);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
console.log('');
|
|
311
|
+
console.log('Note: ms values measure in-process overhead including WASM unavailable error path.');
|
|
312
|
+
console.log('When @ruvector/rvagent-wasm is not installed, timings reflect the import error cost only.');
|
package/dist/src/__probe.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"__probe.d.ts","sourceRoot":"","sources":["../../src/__probe.ts"],"names":[],"mappings":""}
|
package/dist/src/__probe.js
DELETED
package/dist/src/__probe.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"__probe.js","sourceRoot":"","sources":["../../src/__probe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,yBAAyB,CAAC;AAC7C,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC;AACvB,MAAM,EAAE,GAAG,CAAC,CAAC,yBAAyB,CAAC;AACvC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ADR-121 Phase 26 — `ruflo benchmark cosign` CLI subcommand.
|
|
3
|
-
*
|
|
4
|
-
* Phase 24 shipped the M-of-N cryptographic primitive (`coSign()`).
|
|
5
|
-
* Phase 25 shipped the consumer-facing verify command. This phase
|
|
6
|
-
* closes the loop with the **third-party-verifier workflow**:
|
|
7
|
-
*
|
|
8
|
-
* # vendor publishes ledger.json + a benchmark claim
|
|
9
|
-
* # third party reviews + co-signs
|
|
10
|
-
* npx ruflo benchmark cosign vendor-ledger.json \
|
|
11
|
-
* --entry 11 \
|
|
12
|
-
* --label "independent-auditor" \
|
|
13
|
-
* --out audited-ledger.json
|
|
14
|
-
*
|
|
15
|
-
* # downstream consumers check the audited ledger requires
|
|
16
|
-
* # two signatures per entry
|
|
17
|
-
* npx ruflo benchmark verify audited-ledger.json --threshold 2
|
|
18
|
-
*
|
|
19
|
-
* Auto-generates an ephemeral Ed25519 keypair (writes the public
|
|
20
|
-
* key alongside the cosignature in the output ledger; private key
|
|
21
|
-
* not persisted by default). Pass `--key <path>` to persist the
|
|
22
|
-
* keypair (or read from a previously-persisted file) so the same
|
|
23
|
-
* signer can attest multiple entries / multiple ledgers with a
|
|
24
|
-
* stable identity.
|
|
25
|
-
*/
|
|
26
|
-
import type { Command } from '../types.js';
|
|
27
|
-
export declare const benchmarkCosignCommand: Command;
|
|
28
|
-
export default benchmarkCosignCommand;
|
|
29
|
-
//# sourceMappingURL=benchmark-cosign.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"benchmark-cosign.d.ts","sourceRoot":"","sources":["../../../src/commands/benchmark-cosign.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AAkC1E,eAAO,MAAM,sBAAsB,EAAE,OAwKpC,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ADR-121 Phase 26 — `ruflo benchmark cosign` CLI subcommand.
|
|
3
|
-
*
|
|
4
|
-
* Phase 24 shipped the M-of-N cryptographic primitive (`coSign()`).
|
|
5
|
-
* Phase 25 shipped the consumer-facing verify command. This phase
|
|
6
|
-
* closes the loop with the **third-party-verifier workflow**:
|
|
7
|
-
*
|
|
8
|
-
* # vendor publishes ledger.json + a benchmark claim
|
|
9
|
-
* # third party reviews + co-signs
|
|
10
|
-
* npx ruflo benchmark cosign vendor-ledger.json \
|
|
11
|
-
* --entry 11 \
|
|
12
|
-
* --label "independent-auditor" \
|
|
13
|
-
* --out audited-ledger.json
|
|
14
|
-
*
|
|
15
|
-
* # downstream consumers check the audited ledger requires
|
|
16
|
-
* # two signatures per entry
|
|
17
|
-
* npx ruflo benchmark verify audited-ledger.json --threshold 2
|
|
18
|
-
*
|
|
19
|
-
* Auto-generates an ephemeral Ed25519 keypair (writes the public
|
|
20
|
-
* key alongside the cosignature in the output ledger; private key
|
|
21
|
-
* not persisted by default). Pass `--key <path>` to persist the
|
|
22
|
-
* keypair (or read from a previously-persisted file) so the same
|
|
23
|
-
* signer can attest multiple entries / multiple ledgers with a
|
|
24
|
-
* stable identity.
|
|
25
|
-
*/
|
|
26
|
-
import { promises as fs } from 'node:fs';
|
|
27
|
-
import { resolve } from 'node:path';
|
|
28
|
-
import { generateKeyPairSync, createPrivateKey, createPublicKey } from 'node:crypto';
|
|
29
|
-
import { output } from '../output.js';
|
|
30
|
-
async function loadOrGenerateKeypair(keyPath) {
|
|
31
|
-
if (keyPath) {
|
|
32
|
-
const abs = resolve(process.cwd(), keyPath);
|
|
33
|
-
try {
|
|
34
|
-
const raw = await fs.readFile(abs, 'utf8');
|
|
35
|
-
const parsed = JSON.parse(raw);
|
|
36
|
-
const privateKey = createPrivateKey({ key: Buffer.from(parsed.privateKey, 'hex'), format: 'der', type: 'pkcs8' });
|
|
37
|
-
const publicKey = createPublicKey({ key: Buffer.from(parsed.publicKey, 'hex'), format: 'der', type: 'spki' });
|
|
38
|
-
return { keypair: { privateKey, publicKey }, source: 'loaded' };
|
|
39
|
-
}
|
|
40
|
-
catch (err) {
|
|
41
|
-
// File doesn't exist yet — generate a fresh keypair and persist it.
|
|
42
|
-
const kp = generateKeyPairSync('ed25519');
|
|
43
|
-
const pkcs8 = kp.privateKey.export({ type: 'pkcs8', format: 'der' }).toString('hex');
|
|
44
|
-
const spki = kp.publicKey.export({ type: 'spki', format: 'der' }).toString('hex');
|
|
45
|
-
await fs.writeFile(abs, JSON.stringify({ privateKey: pkcs8, publicKey: spki }, null, 2));
|
|
46
|
-
return { keypair: kp, source: 'persisted' };
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return { keypair: generateKeyPairSync('ed25519'), source: 'generated' };
|
|
50
|
-
}
|
|
51
|
-
export const benchmarkCosignCommand = {
|
|
52
|
-
name: 'cosign',
|
|
53
|
-
description: 'Add a third-party co-signature to an entry in a benchmark ledger (Phase 24 M-of-N attestation)',
|
|
54
|
-
options: [
|
|
55
|
-
{
|
|
56
|
-
name: 'entry',
|
|
57
|
-
short: 'e',
|
|
58
|
-
type: 'number',
|
|
59
|
-
description: 'Entry sequence number to co-sign (1-based). Default: last entry.',
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
name: 'label',
|
|
63
|
-
short: 'l',
|
|
64
|
-
type: 'string',
|
|
65
|
-
description: 'Human-readable label for this signer (e.g. "third-party-verifier")',
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
name: 'out',
|
|
69
|
-
short: 'o',
|
|
70
|
-
type: 'string',
|
|
71
|
-
description: 'Output path for the updated ledger. Default: overwrite the input.',
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
name: 'key',
|
|
75
|
-
short: 'k',
|
|
76
|
-
type: 'string',
|
|
77
|
-
description: 'Path to a JSON keypair file (pkcs8 + spki hex). If missing, a fresh ephemeral key is generated; if path doesn\'t exist, a new key is generated and persisted there.',
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
name: 'all',
|
|
81
|
-
type: 'boolean',
|
|
82
|
-
description: 'Co-sign EVERY entry in the ledger (useful for batch attestation by a single signer).',
|
|
83
|
-
default: 'false',
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
name: 'json',
|
|
87
|
-
type: 'boolean',
|
|
88
|
-
description: 'Output JSON instead of human-readable',
|
|
89
|
-
default: 'false',
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
examples: [
|
|
93
|
-
{ command: 'ruflo benchmark cosign ledger.json --entry 11 --label "auditor-A"', description: 'Co-sign entry 11 with an ephemeral key' },
|
|
94
|
-
{ command: 'ruflo benchmark cosign ledger.json --all --label "release-gate" --key ./auditor.key.json', description: 'Co-sign every entry with a persisted key' },
|
|
95
|
-
{ command: 'ruflo benchmark cosign ledger.json -e 11 -o audited.json', description: 'Write the cosigned ledger to a new file' },
|
|
96
|
-
],
|
|
97
|
-
action: async (ctx) => {
|
|
98
|
-
const pathArg = ctx.args[0];
|
|
99
|
-
const asJson = ctx.flags.json === true || ctx.flags.json === 'true';
|
|
100
|
-
const all = ctx.flags.all === true || ctx.flags.all === 'true';
|
|
101
|
-
const entryFlag = ctx.flags.entry !== undefined ? Number(ctx.flags.entry) : undefined;
|
|
102
|
-
const label = ctx.flags.label;
|
|
103
|
-
const outPath = ctx.flags.out;
|
|
104
|
-
const keyPath = ctx.flags.key;
|
|
105
|
-
if (!pathArg || typeof pathArg !== 'string') {
|
|
106
|
-
const err = 'usage: ruflo benchmark cosign <path-to-ledger.json> [--entry N | --all] [--label "name"] [--out path] [--key path] [--json]';
|
|
107
|
-
if (asJson)
|
|
108
|
-
output.printJson({ ok: false, error: err });
|
|
109
|
-
else
|
|
110
|
-
output.printError(err);
|
|
111
|
-
return { success: false, exitCode: 1 };
|
|
112
|
-
}
|
|
113
|
-
if (!all && entryFlag !== undefined && (!Number.isFinite(entryFlag) || entryFlag < 1)) {
|
|
114
|
-
const err = `--entry must be a positive integer, got: ${ctx.flags.entry}`;
|
|
115
|
-
if (asJson)
|
|
116
|
-
output.printJson({ ok: false, error: err });
|
|
117
|
-
else
|
|
118
|
-
output.printError(err);
|
|
119
|
-
return { success: false, exitCode: 1 };
|
|
120
|
-
}
|
|
121
|
-
const inPath = resolve(process.cwd(), pathArg);
|
|
122
|
-
let raw;
|
|
123
|
-
try {
|
|
124
|
-
raw = await fs.readFile(inPath, 'utf8');
|
|
125
|
-
}
|
|
126
|
-
catch (err) {
|
|
127
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
128
|
-
if (asJson)
|
|
129
|
-
output.printJson({ ok: false, error: `cannot read ${inPath}: ${msg}` });
|
|
130
|
-
else
|
|
131
|
-
output.printError(`Cannot read ${inPath}: ${msg}`);
|
|
132
|
-
return { success: false, exitCode: 1 };
|
|
133
|
-
}
|
|
134
|
-
let ledger;
|
|
135
|
-
try {
|
|
136
|
-
ledger = JSON.parse(raw);
|
|
137
|
-
}
|
|
138
|
-
catch (err) {
|
|
139
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
140
|
-
if (asJson)
|
|
141
|
-
output.printJson({ ok: false, error: `not valid JSON: ${msg}` });
|
|
142
|
-
else
|
|
143
|
-
output.printError(`Not valid JSON: ${msg}`);
|
|
144
|
-
return { success: false, exitCode: 1 };
|
|
145
|
-
}
|
|
146
|
-
if (typeof ledger.version !== 'number' || !Array.isArray(ledger.entries) || ledger.entries.length === 0) {
|
|
147
|
-
const err = `not a benchmark ledger — expected { version: number, entries: [non-empty] }`;
|
|
148
|
-
if (asJson)
|
|
149
|
-
output.printJson({ ok: false, error: err });
|
|
150
|
-
else
|
|
151
|
-
output.printError(err);
|
|
152
|
-
return { success: false, exitCode: 1 };
|
|
153
|
-
}
|
|
154
|
-
// Load or generate the signing keypair.
|
|
155
|
-
const { keypair, source: keypairSource } = await loadOrGenerateKeypair(keyPath);
|
|
156
|
-
// Determine which entries to co-sign.
|
|
157
|
-
let targetIndices;
|
|
158
|
-
if (all) {
|
|
159
|
-
targetIndices = ledger.entries.map((_, i) => i);
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
const seq = entryFlag ?? ledger.entries[ledger.entries.length - 1].sequence;
|
|
163
|
-
const idx = ledger.entries.findIndex(e => e.sequence === seq);
|
|
164
|
-
if (idx === -1) {
|
|
165
|
-
const err = `entry sequence ${seq} not found in ledger (chain has ${ledger.entries.length} entries with sequences 1..${ledger.entries.length})`;
|
|
166
|
-
if (asJson)
|
|
167
|
-
output.printJson({ ok: false, error: err });
|
|
168
|
-
else
|
|
169
|
-
output.printError(err);
|
|
170
|
-
return { success: false, exitCode: 1 };
|
|
171
|
-
}
|
|
172
|
-
targetIndices = [idx];
|
|
173
|
-
}
|
|
174
|
-
// Lazy-load the cosign primitive from the published embeddings package.
|
|
175
|
-
const { coSign } = await import('@claude-flow/embeddings/witness-ledger');
|
|
176
|
-
// Mutate a copy of the ledger.
|
|
177
|
-
const newEntries = ledger.entries.map((e, i) => targetIndices.includes(i)
|
|
178
|
-
? coSign(e, keypair, label ? { signerLabel: label } : {})
|
|
179
|
-
: e);
|
|
180
|
-
const newLedger = { ...ledger, entries: newEntries };
|
|
181
|
-
// Write output.
|
|
182
|
-
const writePath = resolve(process.cwd(), outPath ?? pathArg);
|
|
183
|
-
await fs.writeFile(writePath, JSON.stringify(newLedger, null, 2));
|
|
184
|
-
const publicKeyHex = keypair.publicKey.export({ type: 'spki', format: 'der' }).toString('hex');
|
|
185
|
-
if (asJson) {
|
|
186
|
-
output.printJson({
|
|
187
|
-
ok: true,
|
|
188
|
-
inPath,
|
|
189
|
-
outPath: writePath,
|
|
190
|
-
entriesCosigned: targetIndices.length,
|
|
191
|
-
targetSequences: targetIndices.map(i => ledger.entries[i].sequence),
|
|
192
|
-
signerLabel: label ?? null,
|
|
193
|
-
publicKey: publicKeyHex,
|
|
194
|
-
keypairSource,
|
|
195
|
-
});
|
|
196
|
-
return { success: true, exitCode: 0 };
|
|
197
|
-
}
|
|
198
|
-
output.writeln();
|
|
199
|
-
output.writeln(output.bold(`Co-signed ${targetIndices.length} entr${targetIndices.length === 1 ? 'y' : 'ies'}`));
|
|
200
|
-
output.writeln(output.dim('─'.repeat(60)));
|
|
201
|
-
output.writeln(` input: ${inPath}`);
|
|
202
|
-
output.writeln(` output: ${writePath}`);
|
|
203
|
-
output.writeln(` signer label: ${label ?? '(unlabeled)'}`);
|
|
204
|
-
output.writeln(` signer pubkey: ${publicKeyHex.slice(0, 32)}...`);
|
|
205
|
-
output.writeln(` keypair: ${keypairSource}${keyPath ? ` → ${keyPath}` : ''}`);
|
|
206
|
-
output.writeln();
|
|
207
|
-
output.writeln(' entries:');
|
|
208
|
-
for (const i of targetIndices) {
|
|
209
|
-
const e = newEntries[i];
|
|
210
|
-
const cosigCount = Array.isArray(e.cosignatures) ? e.cosignatures.length : 0;
|
|
211
|
-
const hashShort = e.contentHash.slice(0, 12) + '…';
|
|
212
|
-
output.writeln(` [${String(e.sequence).padStart(2)}] ${e.benchmark.padEnd(28)} now ${1 + cosigCount} sigs (${hashShort})`);
|
|
213
|
-
}
|
|
214
|
-
output.writeln();
|
|
215
|
-
output.writeln(`Next: verify the cosigned ledger with the new threshold:`);
|
|
216
|
-
output.writeln(output.dim(` npx ruflo benchmark verify ${writePath} --threshold 2`));
|
|
217
|
-
output.writeln();
|
|
218
|
-
return { success: true, exitCode: 0 };
|
|
219
|
-
},
|
|
220
|
-
};
|
|
221
|
-
export default benchmarkCosignCommand;
|
|
222
|
-
//# sourceMappingURL=benchmark-cosign.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"benchmark-cosign.js","sourceRoot":"","sources":["../../../src/commands/benchmark-cosign.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ADR-121 Phase 25 — `ruflo benchmark verify` CLI subcommand.
|
|
3
|
-
*
|
|
4
|
-
* Makes the Phase 15-24 witness story end-user-accessible. Anyone
|
|
5
|
-
* publishing benchmark numbers with a witness manifest (single
|
|
6
|
-
* `.json`) or a chained ledger (`bench-witness/ledger.json`) can
|
|
7
|
-
* tell consumers:
|
|
8
|
-
*
|
|
9
|
-
* npx ruflo benchmark verify ./ledger.json
|
|
10
|
-
*
|
|
11
|
-
* The command auto-detects whether the input is a single witness or
|
|
12
|
-
* a ledger (presence of `version` + `entries[]` → ledger), runs the
|
|
13
|
-
* appropriate verifier, and prints a human-readable or JSON report.
|
|
14
|
-
*
|
|
15
|
-
* For Phase 24 multi-signer entries, pass `--threshold N` to require
|
|
16
|
-
* N or more valid signatures per entry.
|
|
17
|
-
*/
|
|
18
|
-
import type { Command } from '../types.js';
|
|
19
|
-
export declare const benchmarkVerifyCommand: Command;
|
|
20
|
-
export default benchmarkVerifyCommand;
|
|
21
|
-
//# sourceMappingURL=benchmark-verify.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"benchmark-verify.d.ts","sourceRoot":"","sources":["../../../src/commands/benchmark-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AAkC1E,eAAO,MAAM,sBAAsB,EAAE,OAuKpC,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|