@claude-flow/cli 3.7.0-alpha.7 → 3.7.0-alpha.71

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.
Files changed (262) hide show
  1. package/.claude/helpers/hook-handler.cjs +12 -4
  2. package/.claude/helpers/statusline.cjs +31 -2
  3. package/.claude/helpers/statusline.js +35 -4
  4. package/README.md +51 -34
  5. package/bin/cli.js +15 -2
  6. package/bin/mcp-server.js +1 -1
  7. package/dist/src/__probe.d.ts +2 -0
  8. package/dist/src/__probe.d.ts.map +1 -0
  9. package/dist/src/__probe.js +5 -0
  10. package/dist/src/__probe.js.map +1 -0
  11. package/dist/src/commands/agent-wasm.js +2 -2
  12. package/dist/src/commands/agent-wasm.js.map +1 -1
  13. package/dist/src/commands/benchmark-cosign.d.ts +29 -0
  14. package/dist/src/commands/benchmark-cosign.d.ts.map +1 -0
  15. package/dist/src/commands/benchmark-cosign.js +222 -0
  16. package/dist/src/commands/benchmark-cosign.js.map +1 -0
  17. package/dist/src/commands/benchmark-verify.d.ts +21 -0
  18. package/dist/src/commands/benchmark-verify.d.ts.map +1 -0
  19. package/dist/src/commands/benchmark-verify.js +202 -0
  20. package/dist/src/commands/benchmark-verify.js.map +1 -0
  21. package/dist/src/commands/daemon.d.ts +20 -0
  22. package/dist/src/commands/daemon.d.ts.map +1 -1
  23. package/dist/src/commands/daemon.js +366 -7
  24. package/dist/src/commands/daemon.js.map +1 -1
  25. package/dist/src/commands/doctor.d.ts.map +1 -1
  26. package/dist/src/commands/doctor.js +224 -46
  27. package/dist/src/commands/doctor.js.map +1 -1
  28. package/dist/src/commands/embeddings.d.ts.map +1 -1
  29. package/dist/src/commands/embeddings.js +18 -9
  30. package/dist/src/commands/embeddings.js.map +1 -1
  31. package/dist/src/commands/hive-mind.d.ts.map +1 -1
  32. package/dist/src/commands/hive-mind.js +25 -7
  33. package/dist/src/commands/hive-mind.js.map +1 -1
  34. package/dist/src/commands/hooks.d.ts.map +1 -1
  35. package/dist/src/commands/hooks.js +56 -29
  36. package/dist/src/commands/hooks.js.map +1 -1
  37. package/dist/src/commands/memory.d.ts.map +1 -1
  38. package/dist/src/commands/memory.js +104 -3
  39. package/dist/src/commands/memory.js.map +1 -1
  40. package/dist/src/commands/start.js +1 -1
  41. package/dist/src/commands/start.js.map +1 -1
  42. package/dist/src/commands/swarm.js +1 -1
  43. package/dist/src/commands/swarm.js.map +1 -1
  44. package/dist/src/commands/task.d.ts.map +1 -1
  45. package/dist/src/commands/task.js +8 -4
  46. package/dist/src/commands/task.js.map +1 -1
  47. package/dist/src/config-adapter.js +1 -1
  48. package/dist/src/config-adapter.js.map +1 -1
  49. package/dist/src/index.d.ts +5 -1
  50. package/dist/src/index.d.ts.map +1 -1
  51. package/dist/src/index.js +61 -18
  52. package/dist/src/index.js.map +1 -1
  53. package/dist/src/init/executor.d.ts.map +1 -1
  54. package/dist/src/init/executor.js +92 -0
  55. package/dist/src/init/executor.js.map +1 -1
  56. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  57. package/dist/src/init/helpers-generator.js +6 -2
  58. package/dist/src/init/helpers-generator.js.map +1 -1
  59. package/dist/src/init/mcp-generator.js +4 -4
  60. package/dist/src/init/mcp-generator.js.map +1 -1
  61. package/dist/src/init/settings-generator.d.ts.map +1 -1
  62. package/dist/src/init/settings-generator.js +78 -19
  63. package/dist/src/init/settings-generator.js.map +1 -1
  64. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  65. package/dist/src/init/statusline-generator.js +75 -31
  66. package/dist/src/init/statusline-generator.js.map +1 -1
  67. package/dist/src/init/types.d.ts +7 -0
  68. package/dist/src/init/types.d.ts.map +1 -1
  69. package/dist/src/init/types.js.map +1 -1
  70. package/dist/src/mcp-client.d.ts.map +1 -1
  71. package/dist/src/mcp-client.js +12 -0
  72. package/dist/src/mcp-client.js.map +1 -1
  73. package/dist/src/mcp-server.d.ts.map +1 -1
  74. package/dist/src/mcp-server.js +38 -5
  75. package/dist/src/mcp-server.js.map +1 -1
  76. package/dist/src/mcp-tools/agent-execute-core.d.ts +3 -2
  77. package/dist/src/mcp-tools/agent-execute-core.d.ts.map +1 -1
  78. package/dist/src/mcp-tools/agent-execute-core.js +16 -9
  79. package/dist/src/mcp-tools/agent-execute-core.js.map +1 -1
  80. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
  81. package/dist/src/mcp-tools/agent-tools.js +88 -11
  82. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  83. package/dist/src/mcp-tools/agentdb-tools.d.ts +3 -0
  84. package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -1
  85. package/dist/src/mcp-tools/agentdb-tools.js +206 -21
  86. package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
  87. package/dist/src/mcp-tools/analyze-tools.js +6 -6
  88. package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
  89. package/dist/src/mcp-tools/autopilot-tools.js +10 -10
  90. package/dist/src/mcp-tools/autopilot-tools.js.map +1 -1
  91. package/dist/src/mcp-tools/browser-session-tools.d.ts.map +1 -1
  92. package/dist/src/mcp-tools/browser-session-tools.js +18 -7
  93. package/dist/src/mcp-tools/browser-session-tools.js.map +1 -1
  94. package/dist/src/mcp-tools/browser-tools.js +23 -23
  95. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  96. package/dist/src/mcp-tools/claims-tools.js +12 -12
  97. package/dist/src/mcp-tools/claims-tools.js.map +1 -1
  98. package/dist/src/mcp-tools/config-tools.js +6 -6
  99. package/dist/src/mcp-tools/config-tools.js.map +1 -1
  100. package/dist/src/mcp-tools/coordination-tools.js +7 -7
  101. package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
  102. package/dist/src/mcp-tools/daa-tools.js +8 -8
  103. package/dist/src/mcp-tools/daa-tools.js.map +1 -1
  104. package/dist/src/mcp-tools/embeddings-tools.js +10 -10
  105. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  106. package/dist/src/mcp-tools/github-tools.js +5 -5
  107. package/dist/src/mcp-tools/github-tools.js.map +1 -1
  108. package/dist/src/mcp-tools/guidance-tools.js +21 -21
  109. package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
  110. package/dist/src/mcp-tools/hive-consensus-runtime.d.ts +149 -0
  111. package/dist/src/mcp-tools/hive-consensus-runtime.d.ts.map +1 -0
  112. package/dist/src/mcp-tools/hive-consensus-runtime.js +296 -0
  113. package/dist/src/mcp-tools/hive-consensus-runtime.js.map +1 -0
  114. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  115. package/dist/src/mcp-tools/hive-mind-tools.js +53 -9
  116. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  117. package/dist/src/mcp-tools/hooks-tools.d.ts +2 -0
  118. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  119. package/dist/src/mcp-tools/hooks-tools.js +179 -46
  120. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  121. package/dist/src/mcp-tools/managed-agent-tools.d.ts +22 -0
  122. package/dist/src/mcp-tools/managed-agent-tools.d.ts.map +1 -0
  123. package/dist/src/mcp-tools/managed-agent-tools.js +357 -0
  124. package/dist/src/mcp-tools/managed-agent-tools.js.map +1 -0
  125. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  126. package/dist/src/mcp-tools/memory-tools.js +490 -68
  127. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  128. package/dist/src/mcp-tools/neural-tools.js +6 -6
  129. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  130. package/dist/src/mcp-tools/performance-tools.js +6 -6
  131. package/dist/src/mcp-tools/performance-tools.js.map +1 -1
  132. package/dist/src/mcp-tools/progress-tools.js +4 -4
  133. package/dist/src/mcp-tools/progress-tools.js.map +1 -1
  134. package/dist/src/mcp-tools/ruvllm-tools.js +10 -10
  135. package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -1
  136. package/dist/src/mcp-tools/security-tools.d.ts.map +1 -1
  137. package/dist/src/mcp-tools/security-tools.js +34 -9
  138. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  139. package/dist/src/mcp-tools/session-tools.d.ts.map +1 -1
  140. package/dist/src/mcp-tools/session-tools.js +130 -6
  141. package/dist/src/mcp-tools/session-tools.js.map +1 -1
  142. package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
  143. package/dist/src/mcp-tools/swarm-tools.js +76 -7
  144. package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
  145. package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
  146. package/dist/src/mcp-tools/system-tools.js +91 -18
  147. package/dist/src/mcp-tools/system-tools.js.map +1 -1
  148. package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
  149. package/dist/src/mcp-tools/task-tools.js +55 -7
  150. package/dist/src/mcp-tools/task-tools.js.map +1 -1
  151. package/dist/src/mcp-tools/terminal-tools.js +5 -5
  152. package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
  153. package/dist/src/mcp-tools/transfer-tools.js +11 -11
  154. package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
  155. package/dist/src/mcp-tools/wasm-agent-tools.js +11 -11
  156. package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -1
  157. package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
  158. package/dist/src/mcp-tools/workflow-tools.js +118 -10
  159. package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
  160. package/dist/src/memory/ann-router-registry.d.ts +61 -0
  161. package/dist/src/memory/ann-router-registry.d.ts.map +1 -0
  162. package/dist/src/memory/ann-router-registry.js +72 -0
  163. package/dist/src/memory/ann-router-registry.js.map +1 -0
  164. package/dist/src/memory/diskann-registry.d.ts +56 -0
  165. package/dist/src/memory/diskann-registry.d.ts.map +1 -0
  166. package/dist/src/memory/diskann-registry.js +88 -0
  167. package/dist/src/memory/diskann-registry.js.map +1 -0
  168. package/dist/src/memory/memory-bridge.d.ts +69 -0
  169. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  170. package/dist/src/memory/memory-bridge.js +293 -5
  171. package/dist/src/memory/memory-bridge.js.map +1 -1
  172. package/dist/src/memory/memory-initializer.d.ts +8 -0
  173. package/dist/src/memory/memory-initializer.d.ts.map +1 -1
  174. package/dist/src/memory/memory-initializer.js +89 -16
  175. package/dist/src/memory/memory-initializer.js.map +1 -1
  176. package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
  177. package/dist/src/memory/sona-optimizer.js +3 -0
  178. package/dist/src/memory/sona-optimizer.js.map +1 -1
  179. package/dist/src/parser.d.ts +9 -0
  180. package/dist/src/parser.d.ts.map +1 -1
  181. package/dist/src/parser.js +11 -0
  182. package/dist/src/parser.js.map +1 -1
  183. package/dist/src/plugins/store/discovery.d.ts +15 -4
  184. package/dist/src/plugins/store/discovery.d.ts.map +1 -1
  185. package/dist/src/plugins/store/discovery.js +40 -18
  186. package/dist/src/plugins/store/discovery.js.map +1 -1
  187. package/dist/src/ruvector/agent-wasm.d.ts.map +1 -1
  188. package/dist/src/ruvector/agent-wasm.js +4 -1
  189. package/dist/src/ruvector/agent-wasm.js.map +1 -1
  190. package/dist/src/ruvector/coverage-tools.js +6 -6
  191. package/dist/src/ruvector/coverage-tools.js.map +1 -1
  192. package/dist/src/services/headless-worker-executor.d.ts +6 -0
  193. package/dist/src/services/headless-worker-executor.d.ts.map +1 -1
  194. package/dist/src/services/headless-worker-executor.js +37 -3
  195. package/dist/src/services/headless-worker-executor.js.map +1 -1
  196. package/dist/src/services/worker-daemon.d.ts +80 -2
  197. package/dist/src/services/worker-daemon.d.ts.map +1 -1
  198. package/dist/src/services/worker-daemon.js +372 -11
  199. package/dist/src/services/worker-daemon.js.map +1 -1
  200. package/dist/tsconfig.tsbuildinfo +1 -1
  201. package/package.json +12 -8
  202. package/.claude/skills/agentdb-advanced/SKILL.md +0 -550
  203. package/.claude/skills/agentdb-learning/SKILL.md +0 -545
  204. package/.claude/skills/agentdb-memory-patterns/SKILL.md +0 -339
  205. package/.claude/skills/agentdb-optimization/SKILL.md +0 -509
  206. package/.claude/skills/agentdb-vector-search/SKILL.md +0 -339
  207. package/.claude/skills/agentic-jujutsu/SKILL.md +0 -645
  208. package/.claude/skills/aidefence-scan.md +0 -151
  209. package/.claude/skills/aidefence.yaml +0 -297
  210. package/.claude/skills/browser/SKILL.md +0 -204
  211. package/.claude/skills/flow-nexus-neural/SKILL.md +0 -738
  212. package/.claude/skills/flow-nexus-platform/SKILL.md +0 -1157
  213. package/.claude/skills/flow-nexus-swarm/SKILL.md +0 -610
  214. package/.claude/skills/github-code-review/SKILL.md +0 -1140
  215. package/.claude/skills/github-multi-repo/SKILL.md +0 -874
  216. package/.claude/skills/github-project-management/SKILL.md +0 -1277
  217. package/.claude/skills/github-release-management/SKILL.md +0 -1081
  218. package/.claude/skills/github-workflow-automation/SKILL.md +0 -1065
  219. package/.claude/skills/hive-mind-advanced/SKILL.md +0 -712
  220. package/.claude/skills/hooks-automation/SKILL.md +0 -1201
  221. package/.claude/skills/pair-programming/SKILL.md +0 -1202
  222. package/.claude/skills/performance-analysis/SKILL.md +0 -563
  223. package/.claude/skills/reasoningbank-agentdb/SKILL.md +0 -446
  224. package/.claude/skills/reasoningbank-intelligence/SKILL.md +0 -201
  225. package/.claude/skills/secure-review.md +0 -181
  226. package/.claude/skills/skill-builder/SKILL.md +0 -910
  227. package/.claude/skills/sparc-methodology/SKILL.md +0 -1115
  228. package/.claude/skills/stream-chain/SKILL.md +0 -563
  229. package/.claude/skills/swarm-advanced/SKILL.md +0 -973
  230. package/.claude/skills/swarm-orchestration/SKILL.md +0 -179
  231. package/.claude/skills/v3-cli-modernization/SKILL.md +0 -872
  232. package/.claude/skills/v3-core-implementation/SKILL.md +0 -797
  233. package/.claude/skills/v3-ddd-architecture/SKILL.md +0 -442
  234. package/.claude/skills/v3-integration-deep/SKILL.md +0 -241
  235. package/.claude/skills/v3-mcp-optimization/SKILL.md +0 -777
  236. package/.claude/skills/v3-memory-unification/SKILL.md +0 -174
  237. package/.claude/skills/v3-performance-optimization/SKILL.md +0 -390
  238. package/.claude/skills/v3-security-overhaul/SKILL.md +0 -82
  239. package/.claude/skills/v3-swarm-coordination/SKILL.md +0 -340
  240. package/.claude/skills/verification-quality/SKILL.md +0 -649
  241. package/.claude/skills/worker-benchmarks/skill.md +0 -135
  242. package/.claude/skills/worker-integration/skill.md +0 -154
  243. package/dist/src/ruvector/flash-attention.d.ts +0 -195
  244. package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
  245. package/dist/src/ruvector/flash-attention.js +0 -643
  246. package/dist/src/ruvector/flash-attention.js.map +0 -1
  247. package/dist/src/ruvector/moe-router.d.ts +0 -206
  248. package/dist/src/ruvector/moe-router.d.ts.map +0 -1
  249. package/dist/src/ruvector/moe-router.js +0 -626
  250. package/dist/src/ruvector/moe-router.js.map +0 -1
  251. package/dist/src/services/event-stream.d.ts +0 -25
  252. package/dist/src/services/event-stream.d.ts.map +0 -1
  253. package/dist/src/services/event-stream.js +0 -27
  254. package/dist/src/services/event-stream.js.map +0 -1
  255. package/dist/src/services/loop-worker-runner.d.ts +0 -16
  256. package/dist/src/services/loop-worker-runner.d.ts.map +0 -1
  257. package/dist/src/services/loop-worker-runner.js +0 -34
  258. package/dist/src/services/loop-worker-runner.js.map +0 -1
  259. package/dist/src/services/runtime-capabilities.d.ts +0 -22
  260. package/dist/src/services/runtime-capabilities.d.ts.map +0 -1
  261. package/dist/src/services/runtime-capabilities.js +0 -45
  262. package/dist/src/services/runtime-capabilities.js.map +0 -1
@@ -0,0 +1,222 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark-cosign.js","sourceRoot":"","sources":["../../../src/commands/benchmark-cosign.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,202 @@
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 { promises as fs } from 'node:fs';
19
+ import { resolve } from 'node:path';
20
+ import { output } from '../output.js';
21
+ function isLedger(parsed) {
22
+ return typeof parsed.version === 'number' && Array.isArray(parsed.entries);
23
+ }
24
+ function isWrappedWitness(parsed) {
25
+ return parsed.witness !== undefined && typeof parsed.witness === 'object';
26
+ }
27
+ function isRawWitness(parsed) {
28
+ return typeof parsed.contentHash === 'string' && typeof parsed.signature === 'string';
29
+ }
30
+ export const benchmarkVerifyCommand = {
31
+ name: 'verify',
32
+ description: 'Verify a benchmark witness manifest or chained ledger via the published @claude-flow/embeddings cryptographic primitives',
33
+ options: [
34
+ {
35
+ name: 'threshold',
36
+ short: 't',
37
+ type: 'number',
38
+ description: 'Phase 24 M-of-N: minimum signatures required per entry. Default 1.',
39
+ default: '1',
40
+ },
41
+ {
42
+ name: 'json',
43
+ type: 'boolean',
44
+ description: 'Output JSON instead of human-readable',
45
+ default: 'false',
46
+ },
47
+ ],
48
+ examples: [
49
+ { command: 'ruflo benchmark verify ./bench-witness/ledger.json', description: 'Verify a chained ledger' },
50
+ { command: 'ruflo benchmark verify ./bench-witness/rag-real-text-*.json', description: 'Verify a single witness manifest' },
51
+ { command: 'ruflo benchmark verify ledger.json --threshold 3', description: 'Require ≥3 signatures per entry (M-of-N)' },
52
+ { command: 'ruflo benchmark verify ledger.json --json', description: 'Machine-readable output for CI gating' },
53
+ ],
54
+ action: async (ctx) => {
55
+ const pathArg = ctx.args[0];
56
+ const threshold = Number(ctx.flags.threshold ?? 1);
57
+ const asJson = ctx.flags.json === true || ctx.flags.json === 'true';
58
+ if (!pathArg || typeof pathArg !== 'string') {
59
+ const err = 'usage: ruflo benchmark verify <path-to-ledger.json-or-witness.json> [--threshold N] [--json]';
60
+ if (asJson)
61
+ output.printJson({ ok: false, error: err });
62
+ else
63
+ output.printError(err);
64
+ return { success: false, exitCode: 1 };
65
+ }
66
+ if (!Number.isFinite(threshold) || threshold < 1) {
67
+ const err = `--threshold must be a positive integer, got: ${ctx.flags.threshold}`;
68
+ if (asJson)
69
+ output.printJson({ ok: false, error: err });
70
+ else
71
+ output.printError(err);
72
+ return { success: false, exitCode: 1 };
73
+ }
74
+ const absPath = resolve(process.cwd(), pathArg);
75
+ let raw;
76
+ try {
77
+ raw = await fs.readFile(absPath, 'utf8');
78
+ }
79
+ catch (err) {
80
+ const msg = err instanceof Error ? err.message : String(err);
81
+ if (asJson)
82
+ output.printJson({ ok: false, error: `cannot read ${absPath}: ${msg}` });
83
+ else
84
+ output.printError(`Cannot read ${absPath}: ${msg}`);
85
+ return { success: false, exitCode: 1 };
86
+ }
87
+ let parsed;
88
+ try {
89
+ parsed = JSON.parse(raw);
90
+ }
91
+ catch (err) {
92
+ const msg = err instanceof Error ? err.message : String(err);
93
+ if (asJson)
94
+ output.printJson({ ok: false, error: `not valid JSON: ${msg}` });
95
+ else
96
+ output.printError(`Not valid JSON: ${msg}`);
97
+ return { success: false, exitCode: 1 };
98
+ }
99
+ // Lazy-import the embeddings verifiers so the CLI startup stays fast
100
+ // when this command isn't used.
101
+ const { verify } = await import('@claude-flow/embeddings/witness');
102
+ const { verifyLedger, verifyEntry } = await import('@claude-flow/embeddings/witness-ledger');
103
+ // === Path 1: chained ledger ===
104
+ if (isLedger(parsed)) {
105
+ const ledger = parsed;
106
+ const result = verifyLedger(ledger, { minSignatures: threshold });
107
+ if (asJson) {
108
+ output.printJson({
109
+ ok: result.valid,
110
+ kind: 'ledger',
111
+ entryCount: result.entryCount,
112
+ firstFailureAt: result.firstFailureAt,
113
+ reason: result.reason,
114
+ threshold,
115
+ path: absPath,
116
+ });
117
+ return { success: result.valid, exitCode: result.valid ? 0 : 1 };
118
+ }
119
+ output.writeln();
120
+ output.writeln(output.bold(`Ledger verification (${absPath})`));
121
+ output.writeln(output.dim('─'.repeat(60)));
122
+ output.writeln(` entries: ${result.entryCount}`);
123
+ output.writeln(` threshold: minSignatures = ${threshold}`);
124
+ output.writeln(` verifyLedger(): ${result.valid ? output.success('TRUE') : output.error('FALSE')}`);
125
+ if (!result.valid) {
126
+ output.writeln(` failure at: entry ${result.firstFailureAt}`);
127
+ output.writeln(` reason: ${result.reason}`);
128
+ }
129
+ // Per-entry summary table
130
+ const entries = ledger.entries;
131
+ output.writeln();
132
+ output.writeln(' per-entry:');
133
+ for (const e of entries) {
134
+ const cosigCount = Array.isArray(e.cosignatures) ? e.cosignatures.length : 0;
135
+ const ok = verifyEntry(e, { minSignatures: threshold });
136
+ const verdict = ok ? output.success('✓') : output.error('✗');
137
+ const hashShort = e.contentHash.slice(0, 12) + '…';
138
+ output.writeln(` [${String(e.sequence).padStart(2)}] ${e.benchmark.padEnd(28)} sigs=${1 + cosigCount} ${hashShort} ${verdict}`);
139
+ }
140
+ output.writeln();
141
+ return { success: result.valid, exitCode: result.valid ? 0 : 1 };
142
+ }
143
+ // === Path 2: wrapped single witness (the bench scripts' output shape) ===
144
+ if (isWrappedWitness(parsed)) {
145
+ const w = parsed.witness;
146
+ const ok = verify(w);
147
+ if (asJson) {
148
+ output.printJson({
149
+ ok,
150
+ kind: 'witness',
151
+ benchmark: w.benchmark,
152
+ contentHash: w.contentHash,
153
+ path: absPath,
154
+ });
155
+ return { success: ok, exitCode: ok ? 0 : 1 };
156
+ }
157
+ output.writeln();
158
+ output.writeln(output.bold(`Witness verification (${absPath})`));
159
+ output.writeln(output.dim('─'.repeat(60)));
160
+ output.writeln(` benchmark: ${w.benchmark}`);
161
+ output.writeln(` contentHash: ${w.contentHash}`);
162
+ output.writeln(` signature: ${w.signature.slice(0, 32)}...`);
163
+ output.writeln(` publicKey: ${w.publicKey.slice(0, 32)}...`);
164
+ output.writeln(` algorithm: ${w.signatureAlgorithm}`);
165
+ output.writeln(` verify(): ${ok ? output.success('TRUE') : output.error('FALSE')}`);
166
+ output.writeln();
167
+ return { success: ok, exitCode: ok ? 0 : 1 };
168
+ }
169
+ // === Path 3: raw single witness (top-level fields, no wrapper) ===
170
+ if (isRawWitness(parsed)) {
171
+ const w = parsed;
172
+ const ok = verify(w);
173
+ if (asJson) {
174
+ output.printJson({
175
+ ok,
176
+ kind: 'witness-raw',
177
+ benchmark: w.benchmark,
178
+ contentHash: w.contentHash,
179
+ path: absPath,
180
+ });
181
+ return { success: ok, exitCode: ok ? 0 : 1 };
182
+ }
183
+ output.writeln();
184
+ output.writeln(output.bold(`Witness verification (${absPath})`));
185
+ output.writeln(output.dim('─'.repeat(60)));
186
+ output.writeln(` benchmark: ${w.benchmark}`);
187
+ output.writeln(` contentHash: ${w.contentHash}`);
188
+ output.writeln(` verify(): ${ok ? output.success('TRUE') : output.error('FALSE')}`);
189
+ output.writeln();
190
+ return { success: ok, exitCode: ok ? 0 : 1 };
191
+ }
192
+ // === Path 4: unknown shape ===
193
+ const err = `unrecognized file shape — expected a benchmark ledger ({version, entries}), a wrapped witness ({witness: {...}}), or a raw witness ({contentHash, signature, publicKey})`;
194
+ if (asJson)
195
+ output.printJson({ ok: false, error: err, path: absPath });
196
+ else
197
+ output.printError(err);
198
+ return { success: false, exitCode: 1 };
199
+ },
200
+ };
201
+ export default benchmarkVerifyCommand;
202
+ //# sourceMappingURL=benchmark-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark-verify.js","sourceRoot":"","sources":["../../../src/commands/benchmark-verify.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,26 @@
3
3
  * Manages background worker daemon (Node.js-based, similar to shell helpers)
4
4
  */
5
5
  import type { Command } from '../types.js';
6
+ /**
7
+ * #1914: Resolve the `--workspace` flag to an absolute path, or return null
8
+ * if it is absent / not a usable string. Rejects values with null bytes or
9
+ * shell metacharacters (defence-in-depth — the value is later embedded in a
10
+ * forked child's argv and compared against `ps`/`tasklist` output).
11
+ */
12
+ export declare function resolveWorkspaceFlag(raw: unknown): string | null;
13
+ /**
14
+ * #1914: True when a process command line (from `ps -eo command` on POSIX or
15
+ * the tasklist Window Title column on Windows) belongs to a daemon started
16
+ * for `workspaceRoot`. The launcher (`startBackgroundDaemon`) always appends
17
+ * `--workspace <root>` as the FINAL argv entry, so an exact trailing match
18
+ * after stripping trailing whitespace/quotes is unambiguous — even for
19
+ * workspace paths containing spaces — and never a bare path-prefix match,
20
+ * so workspace `/a/proj` does not reap `/a/proj-other`'s daemon. A daemon
21
+ * whose argv puts `--workspace` mid-list (only possible via a hand-rolled
22
+ * invocation) simply won't be auto-reaped — `daemon stop` still handles it
23
+ * via the PID file.
24
+ */
25
+ export declare function daemonCommandLineBelongsToWorkspace(commandLine: string, workspaceRoot: string): boolean;
6
26
  export declare const daemonCommand: Command;
7
27
  export default daemonCommand;
8
28
  //# sourceMappingURL=daemon.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AAyuB1E,eAAO,MAAM,aAAa,EAAE,OA6D3B,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AA2O1E;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMhE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mCAAmC,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAEvG;AAq0BD,eAAO,MAAM,aAAa,EAAE,OA+D3B,CAAC;AAEF,eAAe,aAAa,CAAC"}