@claude-flow/cli 3.10.46 → 3.12.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.
Files changed (481) hide show
  1. package/.claude/agents/analysis/analyze-code-quality.md +178 -178
  2. package/.claude/agents/analysis/code-analyzer.md +209 -209
  3. package/.claude/agents/analysis/code-review/analyze-code-quality.md +178 -178
  4. package/.claude/agents/architecture/arch-system-design.md +156 -156
  5. package/.claude/agents/architecture/system-design/arch-system-design.md +154 -154
  6. package/.claude/agents/browser/browser-agent.yaml +182 -182
  7. package/.claude/agents/consensus/byzantine-coordinator.md +62 -62
  8. package/.claude/agents/consensus/crdt-synchronizer.md +996 -996
  9. package/.claude/agents/consensus/gossip-coordinator.md +62 -62
  10. package/.claude/agents/consensus/performance-benchmarker.md +850 -850
  11. package/.claude/agents/consensus/quorum-manager.md +822 -822
  12. package/.claude/agents/consensus/raft-manager.md +62 -62
  13. package/.claude/agents/consensus/security-manager.md +621 -621
  14. package/.claude/agents/core/planner.md +374 -374
  15. package/.claude/agents/custom/test-long-runner.md +44 -44
  16. package/.claude/agents/data/data-ml-model.md +444 -444
  17. package/.claude/agents/data/ml/data-ml-model.md +192 -192
  18. package/.claude/agents/development/backend/dev-backend-api.md +141 -141
  19. package/.claude/agents/development/dev-backend-api.md +344 -344
  20. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +163 -163
  21. package/.claude/agents/devops/ops-cicd-github.md +164 -164
  22. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +173 -173
  23. package/.claude/agents/documentation/docs-api-openapi.md +354 -354
  24. package/.claude/agents/flow-nexus/app-store.md +87 -87
  25. package/.claude/agents/flow-nexus/authentication.md +68 -68
  26. package/.claude/agents/flow-nexus/challenges.md +80 -80
  27. package/.claude/agents/flow-nexus/neural-network.md +87 -87
  28. package/.claude/agents/flow-nexus/payments.md +82 -82
  29. package/.claude/agents/flow-nexus/sandbox.md +75 -75
  30. package/.claude/agents/flow-nexus/swarm.md +75 -75
  31. package/.claude/agents/flow-nexus/user-tools.md +95 -95
  32. package/.claude/agents/flow-nexus/workflow.md +83 -83
  33. package/.claude/agents/github/code-review-swarm.md +377 -377
  34. package/.claude/agents/github/github-modes.md +172 -172
  35. package/.claude/agents/github/issue-tracker.md +575 -575
  36. package/.claude/agents/github/multi-repo-swarm.md +552 -552
  37. package/.claude/agents/github/pr-manager.md +437 -437
  38. package/.claude/agents/github/project-board-sync.md +508 -508
  39. package/.claude/agents/github/release-manager.md +604 -604
  40. package/.claude/agents/github/release-swarm.md +582 -582
  41. package/.claude/agents/github/repo-architect.md +397 -397
  42. package/.claude/agents/github/swarm-issue.md +572 -572
  43. package/.claude/agents/github/swarm-pr.md +427 -427
  44. package/.claude/agents/github/sync-coordinator.md +451 -451
  45. package/.claude/agents/github/workflow-automation.md +902 -902
  46. package/.claude/agents/goal/agent.md +815 -815
  47. package/.claude/agents/optimization/benchmark-suite.md +664 -664
  48. package/.claude/agents/optimization/load-balancer.md +430 -430
  49. package/.claude/agents/optimization/performance-monitor.md +671 -671
  50. package/.claude/agents/optimization/resource-allocator.md +673 -673
  51. package/.claude/agents/optimization/topology-optimizer.md +807 -807
  52. package/.claude/agents/payments/agentic-payments.md +126 -126
  53. package/.claude/agents/sona/sona-learning-optimizer.md +74 -74
  54. package/.claude/agents/sparc/architecture.md +698 -698
  55. package/.claude/agents/sparc/pseudocode.md +519 -519
  56. package/.claude/agents/sparc/refinement.md +801 -801
  57. package/.claude/agents/sparc/specification.md +477 -477
  58. package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +224 -224
  59. package/.claude/agents/specialized/spec-mobile-react-native.md +226 -226
  60. package/.claude/agents/sublinear/consensus-coordinator.md +337 -337
  61. package/.claude/agents/sublinear/matrix-optimizer.md +184 -184
  62. package/.claude/agents/sublinear/pagerank-analyzer.md +298 -298
  63. package/.claude/agents/sublinear/performance-optimizer.md +367 -367
  64. package/.claude/agents/sublinear/trading-predictor.md +245 -245
  65. package/.claude/agents/swarm/adaptive-coordinator.md +1126 -1126
  66. package/.claude/agents/swarm/hierarchical-coordinator.md +709 -709
  67. package/.claude/agents/swarm/mesh-coordinator.md +962 -962
  68. package/.claude/agents/templates/automation-smart-agent.md +204 -204
  69. package/.claude/agents/templates/base-template-generator.md +289 -289
  70. package/.claude/agents/templates/coordinator-swarm-init.md +89 -89
  71. package/.claude/agents/templates/github-pr-manager.md +176 -176
  72. package/.claude/agents/templates/implementer-sparc-coder.md +258 -258
  73. package/.claude/agents/templates/memory-coordinator.md +186 -186
  74. package/.claude/agents/templates/orchestrator-task.md +138 -138
  75. package/.claude/agents/templates/performance-analyzer.md +198 -198
  76. package/.claude/agents/templates/sparc-coordinator.md +513 -513
  77. package/.claude/agents/testing/production-validator.md +394 -394
  78. package/.claude/agents/testing/tdd-london-swarm.md +243 -243
  79. package/.claude/agents/v3/aidefence-guardian.md +282 -282
  80. package/.claude/agents/v3/claims-authorizer.md +208 -208
  81. package/.claude/agents/v3/collective-intelligence-coordinator.md +993 -993
  82. package/.claude/agents/v3/ddd-domain-expert.md +220 -220
  83. package/.claude/agents/v3/injection-analyst.md +236 -236
  84. package/.claude/agents/v3/performance-engineer.md +1233 -1233
  85. package/.claude/agents/v3/pii-detector.md +151 -151
  86. package/.claude/agents/v3/reasoningbank-learner.md +213 -213
  87. package/.claude/agents/v3/security-architect-aidefence.md +410 -410
  88. package/.claude/agents/v3/security-architect.md +867 -867
  89. package/.claude/agents/v3/swarm-memory-manager.md +157 -157
  90. package/.claude/agents/v3/v3-integration-architect.md +205 -205
  91. package/.claude/commands/agents/README.md +50 -50
  92. package/.claude/commands/agents/agent-capabilities.md +140 -140
  93. package/.claude/commands/agents/agent-coordination.md +28 -28
  94. package/.claude/commands/agents/agent-spawning.md +28 -28
  95. package/.claude/commands/agents/agent-types.md +216 -216
  96. package/.claude/commands/agents/health.md +139 -139
  97. package/.claude/commands/agents/list.md +100 -100
  98. package/.claude/commands/agents/logs.md +130 -130
  99. package/.claude/commands/agents/metrics.md +122 -122
  100. package/.claude/commands/agents/pool.md +127 -127
  101. package/.claude/commands/agents/spawn.md +140 -140
  102. package/.claude/commands/agents/status.md +115 -115
  103. package/.claude/commands/agents/stop.md +102 -102
  104. package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +53 -53
  105. package/.claude/commands/analysis/README.md +9 -9
  106. package/.claude/commands/analysis/bottleneck-detect.md +162 -162
  107. package/.claude/commands/analysis/performance-bottlenecks.md +58 -58
  108. package/.claude/commands/analysis/performance-report.md +25 -25
  109. package/.claude/commands/analysis/token-efficiency.md +44 -44
  110. package/.claude/commands/analysis/token-usage.md +25 -25
  111. package/.claude/commands/automation/README.md +9 -9
  112. package/.claude/commands/automation/auto-agent.md +122 -122
  113. package/.claude/commands/automation/self-healing.md +105 -105
  114. package/.claude/commands/automation/session-memory.md +89 -89
  115. package/.claude/commands/automation/smart-agents.md +72 -72
  116. package/.claude/commands/automation/smart-spawn.md +25 -25
  117. package/.claude/commands/automation/workflow-select.md +25 -25
  118. package/.claude/commands/claude-flow-help.md +103 -103
  119. package/.claude/commands/claude-flow-memory.md +107 -107
  120. package/.claude/commands/claude-flow-swarm.md +205 -205
  121. package/.claude/commands/coordination/README.md +9 -9
  122. package/.claude/commands/coordination/agent-spawn.md +25 -25
  123. package/.claude/commands/coordination/init.md +44 -44
  124. package/.claude/commands/coordination/orchestrate.md +43 -43
  125. package/.claude/commands/coordination/spawn.md +45 -45
  126. package/.claude/commands/coordination/swarm-init.md +85 -85
  127. package/.claude/commands/coordination/task-orchestrate.md +25 -25
  128. package/.claude/commands/github/README.md +11 -11
  129. package/.claude/commands/github/code-review-swarm.md +513 -513
  130. package/.claude/commands/github/code-review.md +25 -25
  131. package/.claude/commands/github/github-modes.md +146 -146
  132. package/.claude/commands/github/github-swarm.md +121 -121
  133. package/.claude/commands/github/issue-tracker.md +291 -291
  134. package/.claude/commands/github/issue-triage.md +25 -25
  135. package/.claude/commands/github/multi-repo-swarm.md +518 -518
  136. package/.claude/commands/github/pr-enhance.md +26 -26
  137. package/.claude/commands/github/pr-manager.md +169 -169
  138. package/.claude/commands/github/project-board-sync.md +470 -470
  139. package/.claude/commands/github/release-manager.md +339 -339
  140. package/.claude/commands/github/release-swarm.md +543 -543
  141. package/.claude/commands/github/repo-analyze.md +25 -25
  142. package/.claude/commands/github/repo-architect.md +366 -366
  143. package/.claude/commands/github/swarm-issue.md +484 -484
  144. package/.claude/commands/github/swarm-pr.md +287 -287
  145. package/.claude/commands/github/sync-coordinator.md +302 -302
  146. package/.claude/commands/github/workflow-automation.md +441 -441
  147. package/.claude/commands/hive-mind/README.md +17 -17
  148. package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -8
  149. package/.claude/commands/hive-mind/hive-mind-init.md +18 -18
  150. package/.claude/commands/hive-mind/hive-mind-memory.md +8 -8
  151. package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -8
  152. package/.claude/commands/hive-mind/hive-mind-resume.md +8 -8
  153. package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -8
  154. package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -21
  155. package/.claude/commands/hive-mind/hive-mind-status.md +8 -8
  156. package/.claude/commands/hive-mind/hive-mind-stop.md +8 -8
  157. package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -8
  158. package/.claude/commands/hive-mind/hive-mind.md +27 -27
  159. package/.claude/commands/hooks/README.md +11 -11
  160. package/.claude/commands/hooks/overview.md +57 -57
  161. package/.claude/commands/hooks/post-edit.md +117 -117
  162. package/.claude/commands/hooks/post-task.md +112 -112
  163. package/.claude/commands/hooks/pre-edit.md +113 -113
  164. package/.claude/commands/hooks/pre-task.md +111 -111
  165. package/.claude/commands/hooks/session-end.md +118 -118
  166. package/.claude/commands/hooks/setup.md +102 -102
  167. package/.claude/commands/memory/README.md +9 -9
  168. package/.claude/commands/memory/memory-persist.md +25 -25
  169. package/.claude/commands/memory/memory-search.md +25 -25
  170. package/.claude/commands/memory/memory-usage.md +25 -25
  171. package/.claude/commands/memory/neural.md +47 -47
  172. package/.claude/commands/monitoring/README.md +9 -9
  173. package/.claude/commands/monitoring/agent-metrics.md +25 -25
  174. package/.claude/commands/monitoring/agents.md +44 -44
  175. package/.claude/commands/monitoring/real-time-view.md +25 -25
  176. package/.claude/commands/monitoring/status.md +46 -46
  177. package/.claude/commands/monitoring/swarm-monitor.md +25 -25
  178. package/.claude/commands/optimization/README.md +9 -9
  179. package/.claude/commands/optimization/auto-topology.md +61 -61
  180. package/.claude/commands/optimization/cache-manage.md +25 -25
  181. package/.claude/commands/optimization/parallel-execute.md +25 -25
  182. package/.claude/commands/optimization/parallel-execution.md +49 -49
  183. package/.claude/commands/optimization/topology-optimize.md +25 -25
  184. package/.claude/commands/pair/README.md +260 -260
  185. package/.claude/commands/pair/commands.md +545 -545
  186. package/.claude/commands/pair/config.md +509 -509
  187. package/.claude/commands/pair/examples.md +511 -511
  188. package/.claude/commands/pair/modes.md +347 -347
  189. package/.claude/commands/pair/session.md +406 -406
  190. package/.claude/commands/pair/start.md +208 -208
  191. package/.claude/commands/sparc/analyzer.md +51 -51
  192. package/.claude/commands/sparc/architect.md +53 -53
  193. package/.claude/commands/sparc/ask.md +97 -97
  194. package/.claude/commands/sparc/batch-executor.md +54 -54
  195. package/.claude/commands/sparc/code.md +89 -89
  196. package/.claude/commands/sparc/coder.md +54 -54
  197. package/.claude/commands/sparc/debug.md +83 -83
  198. package/.claude/commands/sparc/debugger.md +54 -54
  199. package/.claude/commands/sparc/designer.md +53 -53
  200. package/.claude/commands/sparc/devops.md +109 -109
  201. package/.claude/commands/sparc/docs-writer.md +80 -80
  202. package/.claude/commands/sparc/documenter.md +54 -54
  203. package/.claude/commands/sparc/innovator.md +54 -54
  204. package/.claude/commands/sparc/integration.md +83 -83
  205. package/.claude/commands/sparc/mcp.md +117 -117
  206. package/.claude/commands/sparc/memory-manager.md +54 -54
  207. package/.claude/commands/sparc/optimizer.md +54 -54
  208. package/.claude/commands/sparc/orchestrator.md +131 -131
  209. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -83
  210. package/.claude/commands/sparc/refinement-optimization-mode.md +83 -83
  211. package/.claude/commands/sparc/researcher.md +54 -54
  212. package/.claude/commands/sparc/reviewer.md +54 -54
  213. package/.claude/commands/sparc/security-review.md +80 -80
  214. package/.claude/commands/sparc/sparc-modes.md +174 -174
  215. package/.claude/commands/sparc/sparc.md +111 -111
  216. package/.claude/commands/sparc/spec-pseudocode.md +80 -80
  217. package/.claude/commands/sparc/supabase-admin.md +348 -348
  218. package/.claude/commands/sparc/swarm-coordinator.md +54 -54
  219. package/.claude/commands/sparc/tdd.md +54 -54
  220. package/.claude/commands/sparc/tester.md +54 -54
  221. package/.claude/commands/sparc/tutorial.md +79 -79
  222. package/.claude/commands/sparc/workflow-manager.md +54 -54
  223. package/.claude/commands/sparc.md +166 -166
  224. package/.claude/commands/stream-chain/pipeline.md +120 -120
  225. package/.claude/commands/stream-chain/run.md +69 -69
  226. package/.claude/commands/swarm/README.md +15 -15
  227. package/.claude/commands/swarm/analysis.md +95 -95
  228. package/.claude/commands/swarm/development.md +96 -96
  229. package/.claude/commands/swarm/examples.md +168 -168
  230. package/.claude/commands/swarm/maintenance.md +102 -102
  231. package/.claude/commands/swarm/optimization.md +117 -117
  232. package/.claude/commands/swarm/research.md +136 -136
  233. package/.claude/commands/swarm/swarm-analysis.md +8 -8
  234. package/.claude/commands/swarm/swarm-background.md +8 -8
  235. package/.claude/commands/swarm/swarm-init.md +19 -19
  236. package/.claude/commands/swarm/swarm-modes.md +8 -8
  237. package/.claude/commands/swarm/swarm-monitor.md +8 -8
  238. package/.claude/commands/swarm/swarm-spawn.md +19 -19
  239. package/.claude/commands/swarm/swarm-status.md +8 -8
  240. package/.claude/commands/swarm/swarm-strategies.md +8 -8
  241. package/.claude/commands/swarm/swarm.md +87 -87
  242. package/.claude/commands/swarm/testing.md +131 -131
  243. package/.claude/commands/training/README.md +9 -9
  244. package/.claude/commands/training/model-update.md +25 -25
  245. package/.claude/commands/training/neural-patterns.md +107 -107
  246. package/.claude/commands/training/neural-train.md +75 -75
  247. package/.claude/commands/training/pattern-learn.md +25 -25
  248. package/.claude/commands/training/specialization.md +62 -62
  249. package/.claude/commands/truth/start.md +142 -142
  250. package/.claude/commands/verify/check.md +49 -49
  251. package/.claude/commands/verify/start.md +127 -127
  252. package/.claude/commands/workflows/README.md +9 -9
  253. package/.claude/commands/workflows/development.md +77 -77
  254. package/.claude/commands/workflows/research.md +62 -62
  255. package/.claude/commands/workflows/workflow-create.md +25 -25
  256. package/.claude/commands/workflows/workflow-execute.md +25 -25
  257. package/.claude/commands/workflows/workflow-export.md +25 -25
  258. package/.claude/helpers/README.md +96 -96
  259. package/.claude/helpers/adr-compliance.sh +186 -186
  260. package/.claude/helpers/auto-commit.sh +178 -178
  261. package/.claude/helpers/auto-memory-hook.mjs +368 -368
  262. package/.claude/helpers/checkpoint-manager.sh +251 -251
  263. package/.claude/helpers/daemon-manager.sh +252 -252
  264. package/.claude/helpers/ddd-tracker.sh +144 -144
  265. package/.claude/helpers/github-safe.js +156 -156
  266. package/.claude/helpers/github-setup.sh +45 -45
  267. package/.claude/helpers/guidance-hook.sh +13 -13
  268. package/.claude/helpers/guidance-hooks.sh +102 -102
  269. package/.claude/helpers/health-monitor.sh +108 -108
  270. package/.claude/helpers/hook-handler.cjs +286 -286
  271. package/.claude/helpers/intelligence.cjs +1031 -1031
  272. package/.claude/helpers/learning-hooks.sh +329 -329
  273. package/.claude/helpers/learning-optimizer.sh +127 -127
  274. package/.claude/helpers/learning-service.mjs +1144 -1144
  275. package/.claude/helpers/memory.js +83 -83
  276. package/.claude/helpers/metrics-db.mjs +488 -488
  277. package/.claude/helpers/pattern-consolidator.sh +86 -86
  278. package/.claude/helpers/perf-worker.sh +160 -160
  279. package/.claude/helpers/post-commit +16 -16
  280. package/.claude/helpers/pre-commit +26 -26
  281. package/.claude/helpers/quick-start.sh +19 -19
  282. package/.claude/helpers/router.js +105 -105
  283. package/.claude/helpers/security-scanner.sh +127 -127
  284. package/.claude/helpers/session.js +157 -157
  285. package/.claude/helpers/setup-mcp.sh +18 -18
  286. package/.claude/helpers/standard-checkpoint-hooks.sh +189 -189
  287. package/.claude/helpers/statusline-hook.sh +21 -21
  288. package/.claude/helpers/statusline.cjs +604 -604
  289. package/.claude/helpers/statusline.js +352 -352
  290. package/.claude/helpers/swarm-comms.sh +353 -353
  291. package/.claude/helpers/swarm-hooks.sh +761 -761
  292. package/.claude/helpers/swarm-monitor.sh +210 -210
  293. package/.claude/helpers/sync-v3-metrics.sh +245 -245
  294. package/.claude/helpers/update-v3-progress.sh +165 -165
  295. package/.claude/helpers/v3-quick-status.sh +57 -57
  296. package/.claude/helpers/v3.sh +110 -110
  297. package/.claude/helpers/validate-v3-config.sh +215 -215
  298. package/.claude/helpers/worker-manager.sh +170 -170
  299. package/.claude/settings.json +182 -182
  300. package/.claude/skills/agentdb-advanced/SKILL.md +550 -550
  301. package/.claude/skills/agentdb-learning/SKILL.md +545 -545
  302. package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -339
  303. package/.claude/skills/agentdb-optimization/SKILL.md +509 -509
  304. package/.claude/skills/agentdb-vector-search/SKILL.md +339 -339
  305. package/.claude/skills/browser/SKILL.md +204 -204
  306. package/.claude/skills/dual-mode/README.md +71 -71
  307. package/.claude/skills/dual-mode/dual-collect.md +103 -103
  308. package/.claude/skills/dual-mode/dual-coordinate.md +85 -85
  309. package/.claude/skills/dual-mode/dual-spawn.md +81 -81
  310. package/.claude/skills/flow-nexus-neural/SKILL.md +727 -727
  311. package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -1154
  312. package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -604
  313. package/.claude/skills/github-code-review/SKILL.md +1125 -1125
  314. package/.claude/skills/github-multi-repo/SKILL.md +862 -862
  315. package/.claude/skills/github-project-management/SKILL.md +1262 -1262
  316. package/.claude/skills/github-release-management/SKILL.md +1064 -1064
  317. package/.claude/skills/github-workflow-automation/SKILL.md +1047 -1047
  318. package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
  319. package/.claude/skills/pair-programming/SKILL.md +1202 -1202
  320. package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -446
  321. package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -201
  322. package/.claude/skills/skill-builder/SKILL.md +910 -910
  323. package/.claude/skills/sparc-methodology/SKILL.md +1106 -1106
  324. package/.claude/skills/stream-chain/SKILL.md +560 -560
  325. package/.claude/skills/swarm-advanced/SKILL.md +970 -970
  326. package/.claude/skills/swarm-orchestration/SKILL.md +179 -179
  327. package/.claude/skills/v3-cli-modernization/SKILL.md +871 -871
  328. package/.claude/skills/v3-core-implementation/SKILL.md +796 -796
  329. package/.claude/skills/v3-ddd-architecture/SKILL.md +441 -441
  330. package/.claude/skills/v3-integration-deep/SKILL.md +240 -240
  331. package/.claude/skills/v3-mcp-optimization/SKILL.md +776 -776
  332. package/.claude/skills/v3-memory-unification/SKILL.md +173 -173
  333. package/.claude/skills/v3-performance-optimization/SKILL.md +389 -389
  334. package/.claude/skills/v3-security-overhaul/SKILL.md +81 -81
  335. package/.claude/skills/v3-swarm-coordination/SKILL.md +339 -339
  336. package/.claude/skills/verification-quality/SKILL.md +691 -691
  337. package/README.md +412 -412
  338. package/bin/cli.js +314 -314
  339. package/bin/mcp-server.js +224 -224
  340. package/bin/preinstall.cjs +2 -2
  341. package/dist/src/benchmarks/gaia-critic.js +24 -24
  342. package/dist/src/commands/completions.js +409 -409
  343. package/dist/src/commands/daemon.js +44 -44
  344. package/dist/src/commands/doctor.d.ts.map +1 -1
  345. package/dist/src/commands/doctor.js +175 -1
  346. package/dist/src/commands/doctor.js.map +1 -1
  347. package/dist/src/commands/eject.d.ts +33 -0
  348. package/dist/src/commands/eject.d.ts.map +1 -0
  349. package/dist/src/commands/eject.js +195 -0
  350. package/dist/src/commands/eject.js.map +1 -0
  351. package/dist/src/commands/embeddings.js +26 -26
  352. package/dist/src/commands/hive-mind.js +97 -97
  353. package/dist/src/commands/hooks.d.ts.map +1 -1
  354. package/dist/src/commands/hooks.js +11 -10
  355. package/dist/src/commands/hooks.js.map +1 -1
  356. package/dist/src/commands/index.d.ts.map +1 -1
  357. package/dist/src/commands/index.js +4 -0
  358. package/dist/src/commands/index.js.map +1 -1
  359. package/dist/src/commands/init.d.ts.map +1 -1
  360. package/dist/src/commands/init.js +3 -0
  361. package/dist/src/commands/init.js.map +1 -1
  362. package/dist/src/commands/metaharness.d.ts +39 -0
  363. package/dist/src/commands/metaharness.d.ts.map +1 -0
  364. package/dist/src/commands/metaharness.js +194 -0
  365. package/dist/src/commands/metaharness.js.map +1 -0
  366. package/dist/src/commands/neural.d.ts.map +1 -1
  367. package/dist/src/commands/neural.js +2351 -1
  368. package/dist/src/commands/neural.js.map +1 -1
  369. package/dist/src/commands/ruvector/backup.js +23 -23
  370. package/dist/src/commands/ruvector/benchmark.js +31 -31
  371. package/dist/src/commands/ruvector/import.js +14 -14
  372. package/dist/src/commands/ruvector/init.js +115 -115
  373. package/dist/src/commands/ruvector/migrate.js +99 -99
  374. package/dist/src/commands/ruvector/optimize.js +51 -51
  375. package/dist/src/commands/ruvector/setup.js +624 -624
  376. package/dist/src/commands/ruvector/status.js +38 -38
  377. package/dist/src/init/claudemd-generator.js +231 -231
  378. package/dist/src/init/executor.js +453 -453
  379. package/dist/src/init/helpers-generator.js +727 -727
  380. package/dist/src/init/statusline-generator.js +717 -717
  381. package/dist/src/mcp-client.d.ts.map +1 -1
  382. package/dist/src/mcp-client.js +4 -0
  383. package/dist/src/mcp-client.js.map +1 -1
  384. package/dist/src/mcp-tools/agent-execute-core.d.ts +23 -1
  385. package/dist/src/mcp-tools/agent-execute-core.d.ts.map +1 -1
  386. package/dist/src/mcp-tools/agent-execute-core.js +136 -9
  387. package/dist/src/mcp-tools/agent-execute-core.js.map +1 -1
  388. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
  389. package/dist/src/mcp-tools/agent-tools.js +48 -4
  390. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  391. package/dist/src/mcp-tools/agentdb-tools.js +15 -15
  392. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  393. package/dist/src/mcp-tools/hooks-tools.js +196 -0
  394. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  395. package/dist/src/mcp-tools/index.d.ts +1 -0
  396. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  397. package/dist/src/mcp-tools/index.js +2 -0
  398. package/dist/src/mcp-tools/index.js.map +1 -1
  399. package/dist/src/mcp-tools/metaharness-tools.d.ts +31 -0
  400. package/dist/src/mcp-tools/metaharness-tools.d.ts.map +1 -0
  401. package/dist/src/mcp-tools/metaharness-tools.js +372 -0
  402. package/dist/src/mcp-tools/metaharness-tools.js.map +1 -0
  403. package/dist/src/memory/graph-edge-writer.js +18 -18
  404. package/dist/src/memory/memory-bridge.js +84 -84
  405. package/dist/src/memory/memory-initializer.js +393 -393
  406. package/dist/src/memory/rabitq-index.js +5 -5
  407. package/dist/src/plugins/store/discovery.d.ts.map +1 -1
  408. package/dist/src/plugins/store/discovery.js +3 -0
  409. package/dist/src/plugins/store/discovery.js.map +1 -1
  410. package/dist/src/plugins/store/types.d.ts +6 -1
  411. package/dist/src/plugins/store/types.d.ts.map +1 -1
  412. package/dist/src/runtime/headless.js +28 -28
  413. package/dist/src/ruvector/enhanced-model-router.d.ts +5 -0
  414. package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -1
  415. package/dist/src/ruvector/enhanced-model-router.js +18 -1
  416. package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
  417. package/dist/src/ruvector/model-prices.d.ts +50 -0
  418. package/dist/src/ruvector/model-prices.d.ts.map +1 -0
  419. package/dist/src/ruvector/model-prices.js +72 -0
  420. package/dist/src/ruvector/model-prices.js.map +1 -0
  421. package/dist/src/ruvector/model-router.d.ts +147 -8
  422. package/dist/src/ruvector/model-router.d.ts.map +1 -1
  423. package/dist/src/ruvector/model-router.js +455 -18
  424. package/dist/src/ruvector/model-router.js.map +1 -1
  425. package/dist/src/ruvector/neural-router.d.ts +172 -39
  426. package/dist/src/ruvector/neural-router.d.ts.map +1 -1
  427. package/dist/src/ruvector/neural-router.js +780 -91
  428. package/dist/src/ruvector/neural-router.js.map +1 -1
  429. package/dist/src/ruvector/router-calibrator.d.ts +65 -0
  430. package/dist/src/ruvector/router-calibrator.d.ts.map +1 -0
  431. package/dist/src/ruvector/router-calibrator.js +120 -0
  432. package/dist/src/ruvector/router-calibrator.js.map +1 -0
  433. package/dist/src/ruvector/router-parallel-recorder.d.ts +127 -0
  434. package/dist/src/ruvector/router-parallel-recorder.d.ts.map +1 -0
  435. package/dist/src/ruvector/router-parallel-recorder.js +183 -0
  436. package/dist/src/ruvector/router-parallel-recorder.js.map +1 -0
  437. package/dist/src/ruvector/router-trajectory.d.ts +137 -45
  438. package/dist/src/ruvector/router-trajectory.d.ts.map +1 -1
  439. package/dist/src/ruvector/router-trajectory.js +226 -63
  440. package/dist/src/ruvector/router-trajectory.js.map +1 -1
  441. package/dist/src/ruvector/task-embedder.d.ts +56 -0
  442. package/dist/src/ruvector/task-embedder.d.ts.map +1 -0
  443. package/dist/src/ruvector/task-embedder.js +237 -0
  444. package/dist/src/ruvector/task-embedder.js.map +1 -0
  445. package/dist/src/services/headless-worker-executor.js +84 -84
  446. package/dist/src/transfer/deploy-seraphine.js +23 -23
  447. package/dist/tsconfig.tsbuildinfo +1 -1
  448. package/package.json +138 -134
  449. package/scripts/beir-bootstrap-significance.mjs +162 -162
  450. package/scripts/bench-rvagent.mjs +312 -312
  451. package/scripts/benchmark-codemods.mjs +127 -127
  452. package/scripts/benchmark-cross-repo.mjs +206 -206
  453. package/scripts/benchmark-pretrained-retrieval.mjs +305 -305
  454. package/scripts/benchmark-self-learning.mjs +241 -241
  455. package/scripts/benchmark-trajectory-mrr.mjs +191 -191
  456. package/scripts/deploy-ipfs-node.sh +153 -153
  457. package/scripts/grid-search-retrieval.mjs +216 -216
  458. package/scripts/postinstall.cjs +153 -153
  459. package/scripts/pretrain-from-github.mjs +358 -358
  460. package/scripts/publish-registry.ts +345 -345
  461. package/scripts/publish.sh +57 -57
  462. package/scripts/run-beir-bge.mjs +324 -324
  463. package/scripts/run-beir-hybrid.mjs +261 -261
  464. package/scripts/run-beir-lucene-bm25.mjs +154 -154
  465. package/scripts/run-beir-nfcorpus.mjs +231 -231
  466. package/scripts/run-beir-rrf-ablation.mjs +221 -221
  467. package/scripts/setup-ipfs-registry.md +366 -366
  468. package/dist/src/ruvector/flash-attention.d.ts +0 -195
  469. package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
  470. package/dist/src/ruvector/flash-attention.js +0 -643
  471. package/dist/src/ruvector/flash-attention.js.map +0 -1
  472. package/dist/src/ruvector/moe-router.d.ts +0 -206
  473. package/dist/src/ruvector/moe-router.d.ts.map +0 -1
  474. package/dist/src/ruvector/moe-router.js +0 -626
  475. package/dist/src/ruvector/moe-router.js.map +0 -1
  476. package/dist/src/services/event-stream.d.ts +0 -25
  477. package/dist/src/services/event-stream.js +0 -27
  478. package/dist/src/services/loop-worker-runner.d.ts +0 -16
  479. package/dist/src/services/loop-worker-runner.js +0 -34
  480. package/dist/src/services/runtime-capabilities.d.ts +0 -22
  481. package/dist/src/services/runtime-capabilities.js +0 -45
@@ -13,371 +13,371 @@ export const ATTRIBUTION_FOOTER = '🤖 Generated with [RuFlo](https://github.co
13
13
  * Generate pre-commit hook script
14
14
  */
15
15
  export function generatePreCommitHook() {
16
- return `#!/bin/bash
17
- # Ruflo Pre-Commit Hook
18
- # Validates code quality before commit
19
-
20
- set -e
21
-
22
- echo "🔍 Running Ruflo pre-commit checks..."
23
-
24
- # Get staged files
25
- STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
26
-
27
- # Run validation for each staged file
28
- for FILE in $STAGED_FILES; do
29
- if [[ "$FILE" =~ \\.(ts|js|tsx|jsx)$ ]]; then
30
- echo " Validating: $FILE"
31
- npx @claude-flow/cli hooks pre-edit --file "$FILE" --validate-syntax 2>/dev/null || true
32
- fi
33
- done
34
-
35
- # Run tests if available
36
- if [ -f "package.json" ] && grep -q '"test"' package.json; then
37
- echo "🧪 Running tests..."
38
- npm test --if-present 2>/dev/null || echo " Tests skipped or failed"
39
- fi
40
-
41
- echo "✅ Pre-commit checks complete"
16
+ return `#!/bin/bash
17
+ # Ruflo Pre-Commit Hook
18
+ # Validates code quality before commit
19
+
20
+ set -e
21
+
22
+ echo "🔍 Running Ruflo pre-commit checks..."
23
+
24
+ # Get staged files
25
+ STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
26
+
27
+ # Run validation for each staged file
28
+ for FILE in $STAGED_FILES; do
29
+ if [[ "$FILE" =~ \\.(ts|js|tsx|jsx)$ ]]; then
30
+ echo " Validating: $FILE"
31
+ npx @claude-flow/cli hooks pre-edit --file "$FILE" --validate-syntax 2>/dev/null || true
32
+ fi
33
+ done
34
+
35
+ # Run tests if available
36
+ if [ -f "package.json" ] && grep -q '"test"' package.json; then
37
+ echo "🧪 Running tests..."
38
+ npm test --if-present 2>/dev/null || echo " Tests skipped or failed"
39
+ fi
40
+
41
+ echo "✅ Pre-commit checks complete"
42
42
  `;
43
43
  }
44
44
  /**
45
45
  * Generate post-commit hook script
46
46
  */
47
47
  export function generatePostCommitHook() {
48
- return `#!/bin/bash
49
- # Ruflo Post-Commit Hook
50
- # Records commit metrics and trains patterns
51
-
52
- COMMIT_HASH=$(git rev-parse HEAD)
53
- COMMIT_MSG=$(git log -1 --pretty=%B)
54
-
55
- echo "📊 Recording commit metrics..."
56
-
57
- # Notify ruflo of commit
58
- npx ruflo@latest hooks notify \\
59
- --message "Commit: $COMMIT_MSG" \\
60
- --level info \\
61
- --metadata '{"hash": "'$COMMIT_HASH'"}' 2>/dev/null || true
62
-
63
- echo "✅ Commit recorded"
48
+ return `#!/bin/bash
49
+ # Ruflo Post-Commit Hook
50
+ # Records commit metrics and trains patterns
51
+
52
+ COMMIT_HASH=$(git rev-parse HEAD)
53
+ COMMIT_MSG=$(git log -1 --pretty=%B)
54
+
55
+ echo "📊 Recording commit metrics..."
56
+
57
+ # Notify ruflo of commit
58
+ npx ruflo@latest hooks notify \\
59
+ --message "Commit: $COMMIT_MSG" \\
60
+ --level info \\
61
+ --metadata '{"hash": "'$COMMIT_HASH'"}' 2>/dev/null || true
62
+
63
+ echo "✅ Commit recorded"
64
64
  `;
65
65
  }
66
66
  /**
67
67
  * Generate session manager script
68
68
  */
69
69
  export function generateSessionManager() {
70
- return `#!/usr/bin/env node
71
- /**
72
- * Ruflo Session Manager
73
- * Handles session lifecycle: start, restore, end
74
- */
75
-
76
- const fs = require('fs');
77
- const path = require('path');
78
-
79
- const SESSION_DIR = path.join(process.cwd(), '.claude-flow', 'sessions');
80
- const SESSION_FILE = path.join(SESSION_DIR, 'current.json');
81
-
82
- const commands = {
83
- start: () => {
84
- const sessionId = \`session-\${Date.now()}\`;
85
- const session = {
86
- id: sessionId,
87
- startedAt: new Date().toISOString(),
88
- cwd: process.cwd(),
89
- context: {},
90
- metrics: {
91
- edits: 0,
92
- commands: 0,
93
- tasks: 0,
94
- errors: 0,
95
- },
96
- };
97
-
98
- fs.mkdirSync(SESSION_DIR, { recursive: true });
99
- fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
100
-
101
- console.log(\`Session started: \${sessionId}\`);
102
- return session;
103
- },
104
-
105
- restore: () => {
106
- if (!fs.existsSync(SESSION_FILE)) {
107
- console.log('No session to restore');
108
- return null;
109
- }
110
-
111
- const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
112
- session.restoredAt = new Date().toISOString();
113
- fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
114
-
115
- console.log(\`Session restored: \${session.id}\`);
116
- return session;
117
- },
118
-
119
- end: () => {
120
- if (!fs.existsSync(SESSION_FILE)) {
121
- console.log('No active session');
122
- return null;
123
- }
124
-
125
- const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
126
- session.endedAt = new Date().toISOString();
127
- session.duration = Date.now() - new Date(session.startedAt).getTime();
128
-
129
- // Archive session
130
- const archivePath = path.join(SESSION_DIR, \`\${session.id}.json\`);
131
- fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));
132
- fs.unlinkSync(SESSION_FILE);
133
-
134
- console.log(\`Session ended: \${session.id}\`);
135
- console.log(\`Duration: \${Math.round(session.duration / 1000 / 60)} minutes\`);
136
- console.log(\`Metrics: \${JSON.stringify(session.metrics)}\`);
137
-
138
- return session;
139
- },
140
-
141
- status: () => {
142
- if (!fs.existsSync(SESSION_FILE)) {
143
- console.log('No active session');
144
- return null;
145
- }
146
-
147
- const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
148
- const duration = Date.now() - new Date(session.startedAt).getTime();
149
-
150
- console.log(\`Session: \${session.id}\`);
151
- console.log(\`Started: \${session.startedAt}\`);
152
- console.log(\`Duration: \${Math.round(duration / 1000 / 60)} minutes\`);
153
- console.log(\`Metrics: \${JSON.stringify(session.metrics)}\`);
154
-
155
- return session;
156
- },
157
-
158
- update: (key, value) => {
159
- if (!fs.existsSync(SESSION_FILE)) {
160
- console.log('No active session');
161
- return null;
162
- }
163
-
164
- const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
165
- session.context[key] = value;
166
- session.updatedAt = new Date().toISOString();
167
- fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
168
-
169
- return session;
170
- },
171
-
172
- metric: (name) => {
173
- if (!fs.existsSync(SESSION_FILE)) {
174
- return null;
175
- }
176
-
177
- const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
178
- if (session.metrics[name] !== undefined) {
179
- session.metrics[name]++;
180
- fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
181
- }
182
-
183
- return session;
184
- },
185
- };
186
-
187
- // CLI
188
- const [,, command, ...args] = process.argv;
189
-
190
- if (command && commands[command]) {
191
- commands[command](...args);
192
- } else {
193
- console.log('Usage: session.js <start|restore|end|status|update|metric> [args]');
194
- }
195
-
196
- module.exports = commands;
70
+ return `#!/usr/bin/env node
71
+ /**
72
+ * Ruflo Session Manager
73
+ * Handles session lifecycle: start, restore, end
74
+ */
75
+
76
+ const fs = require('fs');
77
+ const path = require('path');
78
+
79
+ const SESSION_DIR = path.join(process.cwd(), '.claude-flow', 'sessions');
80
+ const SESSION_FILE = path.join(SESSION_DIR, 'current.json');
81
+
82
+ const commands = {
83
+ start: () => {
84
+ const sessionId = \`session-\${Date.now()}\`;
85
+ const session = {
86
+ id: sessionId,
87
+ startedAt: new Date().toISOString(),
88
+ cwd: process.cwd(),
89
+ context: {},
90
+ metrics: {
91
+ edits: 0,
92
+ commands: 0,
93
+ tasks: 0,
94
+ errors: 0,
95
+ },
96
+ };
97
+
98
+ fs.mkdirSync(SESSION_DIR, { recursive: true });
99
+ fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
100
+
101
+ console.log(\`Session started: \${sessionId}\`);
102
+ return session;
103
+ },
104
+
105
+ restore: () => {
106
+ if (!fs.existsSync(SESSION_FILE)) {
107
+ console.log('No session to restore');
108
+ return null;
109
+ }
110
+
111
+ const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
112
+ session.restoredAt = new Date().toISOString();
113
+ fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
114
+
115
+ console.log(\`Session restored: \${session.id}\`);
116
+ return session;
117
+ },
118
+
119
+ end: () => {
120
+ if (!fs.existsSync(SESSION_FILE)) {
121
+ console.log('No active session');
122
+ return null;
123
+ }
124
+
125
+ const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
126
+ session.endedAt = new Date().toISOString();
127
+ session.duration = Date.now() - new Date(session.startedAt).getTime();
128
+
129
+ // Archive session
130
+ const archivePath = path.join(SESSION_DIR, \`\${session.id}.json\`);
131
+ fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));
132
+ fs.unlinkSync(SESSION_FILE);
133
+
134
+ console.log(\`Session ended: \${session.id}\`);
135
+ console.log(\`Duration: \${Math.round(session.duration / 1000 / 60)} minutes\`);
136
+ console.log(\`Metrics: \${JSON.stringify(session.metrics)}\`);
137
+
138
+ return session;
139
+ },
140
+
141
+ status: () => {
142
+ if (!fs.existsSync(SESSION_FILE)) {
143
+ console.log('No active session');
144
+ return null;
145
+ }
146
+
147
+ const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
148
+ const duration = Date.now() - new Date(session.startedAt).getTime();
149
+
150
+ console.log(\`Session: \${session.id}\`);
151
+ console.log(\`Started: \${session.startedAt}\`);
152
+ console.log(\`Duration: \${Math.round(duration / 1000 / 60)} minutes\`);
153
+ console.log(\`Metrics: \${JSON.stringify(session.metrics)}\`);
154
+
155
+ return session;
156
+ },
157
+
158
+ update: (key, value) => {
159
+ if (!fs.existsSync(SESSION_FILE)) {
160
+ console.log('No active session');
161
+ return null;
162
+ }
163
+
164
+ const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
165
+ session.context[key] = value;
166
+ session.updatedAt = new Date().toISOString();
167
+ fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
168
+
169
+ return session;
170
+ },
171
+
172
+ metric: (name) => {
173
+ if (!fs.existsSync(SESSION_FILE)) {
174
+ return null;
175
+ }
176
+
177
+ const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
178
+ if (session.metrics[name] !== undefined) {
179
+ session.metrics[name]++;
180
+ fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
181
+ }
182
+
183
+ return session;
184
+ },
185
+ };
186
+
187
+ // CLI
188
+ const [,, command, ...args] = process.argv;
189
+
190
+ if (command && commands[command]) {
191
+ commands[command](...args);
192
+ } else {
193
+ console.log('Usage: session.js <start|restore|end|status|update|metric> [args]');
194
+ }
195
+
196
+ module.exports = commands;
197
197
  `;
198
198
  }
199
199
  /**
200
200
  * Generate agent router script
201
201
  */
202
202
  export function generateAgentRouter() {
203
- return `#!/usr/bin/env node
204
- /**
205
- * Ruflo Agent Router
206
- *
207
- * Static keyword router that suggests an agent for a task description.
208
- * NOTE: This is *not* a learned model. It is a heuristic table; "confidence"
209
- * is reported as a heuristic prior, not a calibrated probability.
210
- *
211
- * #2257 fix: patterns are now word-boundary-anchored so short tokens like
212
- * \`cd\`, \`ci\`, \`ui\`, \`add\`, \`structure\` no longer match inside unrelated
213
- * words (\`decision\`, \`infrastructure\`, \`address\`, \`addendum\`). Default
214
- * matched-confidence dropped from 0.8 to 0.6, and fall-through from 0.5 to
215
- * 0.3, to reflect that this is a static heuristic, not a learned classifier.
216
- */
217
-
218
- const AGENT_CAPABILITIES = {
219
- coder: ['code-generation', 'refactoring', 'debugging', 'implementation'],
220
- tester: ['unit-testing', 'integration-testing', 'coverage', 'test-generation'],
221
- reviewer: ['code-review', 'security-audit', 'quality-check', 'best-practices'],
222
- researcher: ['web-search', 'documentation', 'analysis', 'summarization'],
223
- architect: ['system-design', 'architecture', 'patterns', 'scalability'],
224
- 'backend-dev': ['api', 'database', 'server', 'authentication'],
225
- 'frontend-dev': ['ui', 'react', 'css', 'components'],
226
- devops: ['ci-cd', 'docker', 'deployment', 'infrastructure'],
227
- };
228
-
229
- // Each entry has a token list. Single tokens get \\b…\\b boundaries so 'cd'
230
- // won't match inside 'decide'. Phrases (whitespace or '/') match literally —
231
- // the whitespace acts as a natural boundary.
232
- const TASK_PATTERNS = [
233
- { tokens: ['implement', 'create', 'build', 'add', 'write code', 'refactor', 'debug'], agent: 'coder' },
234
- { tokens: ['test', 'tests', 'spec', 'coverage', 'unit test', 'integration test'], agent: 'tester' },
235
- { tokens: ['review', 'audit', 'check', 'validate', 'security'], agent: 'reviewer' },
236
- { tokens: ['research', 'find', 'search', 'documentation', 'explore'], agent: 'researcher' },
237
- { tokens: ['design', 'architect', 'architecture', 'structure', 'plan'], agent: 'architect' },
238
- { tokens: ['api', 'endpoint', 'server', 'backend', 'database'], agent: 'backend-dev' },
239
- { tokens: ['ui', 'frontend', 'component', 'react', 'css', 'style'], agent: 'frontend-dev' },
240
- { tokens: ['deploy', 'docker', 'ci', 'cd', 'ci/cd', 'pipeline', 'infrastructure', 'devops'], agent: 'devops' },
241
- ];
242
-
243
- function escapeRegex(s) {
244
- return s.replace(/[.*+?^\${}()|[\\]\\\\]/g, '\\\\$&');
245
- }
246
-
247
- function buildPattern(tokens) {
248
- const alternatives = tokens.map((tok) => {
249
- const escaped = escapeRegex(tok.toLowerCase());
250
- if (/\\s|\\//.test(tok)) return escaped;
251
- return \`\\\\b\${escaped}\\\\b\`;
252
- });
253
- return new RegExp(\`(?:\${alternatives.join('|')})\`, 'i');
254
- }
255
-
256
- const COMPILED_PATTERNS = TASK_PATTERNS.map((entry) => ({
257
- agent: entry.agent,
258
- tokens: entry.tokens,
259
- regex: buildPattern(entry.tokens),
260
- }));
261
-
262
- function routeTask(task) {
263
- const taskLower = String(task == null ? '' : task).toLowerCase();
264
- for (const entry of COMPILED_PATTERNS) {
265
- if (entry.regex.test(taskLower)) {
266
- return {
267
- agent: entry.agent,
268
- confidence: 0.6,
269
- reason: \`Matched keyword(s) from: \${entry.tokens.join('|')}\`,
270
- };
271
- }
272
- }
273
- return {
274
- agent: 'coder',
275
- confidence: 0.3,
276
- reason: 'Default routing - no specific keyword matched',
277
- };
278
- }
279
-
280
- // CLI
281
- const task = process.argv.slice(2).join(' ');
282
-
283
- if (task) {
284
- const result = routeTask(task);
285
- console.log(JSON.stringify(result, null, 2));
286
- } else {
287
- console.log('Usage: router.js <task description>');
288
- console.log('\\nAvailable agents:', Object.keys(AGENT_CAPABILITIES).join(', '));
289
- }
290
-
291
- module.exports = { routeTask, AGENT_CAPABILITIES, TASK_PATTERNS, buildPattern };
203
+ return `#!/usr/bin/env node
204
+ /**
205
+ * Ruflo Agent Router
206
+ *
207
+ * Static keyword router that suggests an agent for a task description.
208
+ * NOTE: This is *not* a learned model. It is a heuristic table; "confidence"
209
+ * is reported as a heuristic prior, not a calibrated probability.
210
+ *
211
+ * #2257 fix: patterns are now word-boundary-anchored so short tokens like
212
+ * \`cd\`, \`ci\`, \`ui\`, \`add\`, \`structure\` no longer match inside unrelated
213
+ * words (\`decision\`, \`infrastructure\`, \`address\`, \`addendum\`). Default
214
+ * matched-confidence dropped from 0.8 to 0.6, and fall-through from 0.5 to
215
+ * 0.3, to reflect that this is a static heuristic, not a learned classifier.
216
+ */
217
+
218
+ const AGENT_CAPABILITIES = {
219
+ coder: ['code-generation', 'refactoring', 'debugging', 'implementation'],
220
+ tester: ['unit-testing', 'integration-testing', 'coverage', 'test-generation'],
221
+ reviewer: ['code-review', 'security-audit', 'quality-check', 'best-practices'],
222
+ researcher: ['web-search', 'documentation', 'analysis', 'summarization'],
223
+ architect: ['system-design', 'architecture', 'patterns', 'scalability'],
224
+ 'backend-dev': ['api', 'database', 'server', 'authentication'],
225
+ 'frontend-dev': ['ui', 'react', 'css', 'components'],
226
+ devops: ['ci-cd', 'docker', 'deployment', 'infrastructure'],
227
+ };
228
+
229
+ // Each entry has a token list. Single tokens get \\b…\\b boundaries so 'cd'
230
+ // won't match inside 'decide'. Phrases (whitespace or '/') match literally —
231
+ // the whitespace acts as a natural boundary.
232
+ const TASK_PATTERNS = [
233
+ { tokens: ['implement', 'create', 'build', 'add', 'write code', 'refactor', 'debug'], agent: 'coder' },
234
+ { tokens: ['test', 'tests', 'spec', 'coverage', 'unit test', 'integration test'], agent: 'tester' },
235
+ { tokens: ['review', 'audit', 'check', 'validate', 'security'], agent: 'reviewer' },
236
+ { tokens: ['research', 'find', 'search', 'documentation', 'explore'], agent: 'researcher' },
237
+ { tokens: ['design', 'architect', 'architecture', 'structure', 'plan'], agent: 'architect' },
238
+ { tokens: ['api', 'endpoint', 'server', 'backend', 'database'], agent: 'backend-dev' },
239
+ { tokens: ['ui', 'frontend', 'component', 'react', 'css', 'style'], agent: 'frontend-dev' },
240
+ { tokens: ['deploy', 'docker', 'ci', 'cd', 'ci/cd', 'pipeline', 'infrastructure', 'devops'], agent: 'devops' },
241
+ ];
242
+
243
+ function escapeRegex(s) {
244
+ return s.replace(/[.*+?^\${}()|[\\]\\\\]/g, '\\\\$&');
245
+ }
246
+
247
+ function buildPattern(tokens) {
248
+ const alternatives = tokens.map((tok) => {
249
+ const escaped = escapeRegex(tok.toLowerCase());
250
+ if (/\\s|\\//.test(tok)) return escaped;
251
+ return \`\\\\b\${escaped}\\\\b\`;
252
+ });
253
+ return new RegExp(\`(?:\${alternatives.join('|')})\`, 'i');
254
+ }
255
+
256
+ const COMPILED_PATTERNS = TASK_PATTERNS.map((entry) => ({
257
+ agent: entry.agent,
258
+ tokens: entry.tokens,
259
+ regex: buildPattern(entry.tokens),
260
+ }));
261
+
262
+ function routeTask(task) {
263
+ const taskLower = String(task == null ? '' : task).toLowerCase();
264
+ for (const entry of COMPILED_PATTERNS) {
265
+ if (entry.regex.test(taskLower)) {
266
+ return {
267
+ agent: entry.agent,
268
+ confidence: 0.6,
269
+ reason: \`Matched keyword(s) from: \${entry.tokens.join('|')}\`,
270
+ };
271
+ }
272
+ }
273
+ return {
274
+ agent: 'coder',
275
+ confidence: 0.3,
276
+ reason: 'Default routing - no specific keyword matched',
277
+ };
278
+ }
279
+
280
+ // CLI
281
+ const task = process.argv.slice(2).join(' ');
282
+
283
+ if (task) {
284
+ const result = routeTask(task);
285
+ console.log(JSON.stringify(result, null, 2));
286
+ } else {
287
+ console.log('Usage: router.js <task description>');
288
+ console.log('\\nAvailable agents:', Object.keys(AGENT_CAPABILITIES).join(', '));
289
+ }
290
+
291
+ module.exports = { routeTask, AGENT_CAPABILITIES, TASK_PATTERNS, buildPattern };
292
292
  `;
293
293
  }
294
294
  /**
295
295
  * Generate memory helper script
296
296
  */
297
297
  export function generateMemoryHelper() {
298
- return `#!/usr/bin/env node
299
- /**
300
- * Ruflo Memory Helper
301
- * Simple key-value memory for cross-session context
302
- */
303
-
304
- const fs = require('fs');
305
- const path = require('path');
306
-
307
- const MEMORY_DIR = path.join(process.cwd(), '.claude-flow', 'data');
308
- const MEMORY_FILE = path.join(MEMORY_DIR, 'memory.json');
309
-
310
- function loadMemory() {
311
- try {
312
- if (fs.existsSync(MEMORY_FILE)) {
313
- return JSON.parse(fs.readFileSync(MEMORY_FILE, 'utf-8'));
314
- }
315
- } catch (e) {
316
- // Ignore
317
- }
318
- return {};
319
- }
320
-
321
- function saveMemory(memory) {
322
- fs.mkdirSync(MEMORY_DIR, { recursive: true });
323
- fs.writeFileSync(MEMORY_FILE, JSON.stringify(memory, null, 2));
324
- }
325
-
326
- const commands = {
327
- get: (key) => {
328
- const memory = loadMemory();
329
- const value = key ? memory[key] : memory;
330
- console.log(JSON.stringify(value, null, 2));
331
- return value;
332
- },
333
-
334
- set: (key, value) => {
335
- if (!key) {
336
- console.error('Key required');
337
- return;
338
- }
339
- const memory = loadMemory();
340
- memory[key] = value;
341
- memory._updated = new Date().toISOString();
342
- saveMemory(memory);
343
- console.log(\`Set: \${key}\`);
344
- },
345
-
346
- delete: (key) => {
347
- if (!key) {
348
- console.error('Key required');
349
- return;
350
- }
351
- const memory = loadMemory();
352
- delete memory[key];
353
- saveMemory(memory);
354
- console.log(\`Deleted: \${key}\`);
355
- },
356
-
357
- clear: () => {
358
- saveMemory({});
359
- console.log('Memory cleared');
360
- },
361
-
362
- keys: () => {
363
- const memory = loadMemory();
364
- const keys = Object.keys(memory).filter(k => !k.startsWith('_'));
365
- console.log(keys.join('\\n'));
366
- return keys;
367
- },
368
- };
369
-
370
- // CLI
371
- const [,, command, key, ...valueParts] = process.argv;
372
- const value = valueParts.join(' ');
373
-
374
- if (command && commands[command]) {
375
- commands[command](key, value);
376
- } else {
377
- console.log('Usage: memory.js <get|set|delete|clear|keys> [key] [value]');
378
- }
379
-
380
- module.exports = commands;
298
+ return `#!/usr/bin/env node
299
+ /**
300
+ * Ruflo Memory Helper
301
+ * Simple key-value memory for cross-session context
302
+ */
303
+
304
+ const fs = require('fs');
305
+ const path = require('path');
306
+
307
+ const MEMORY_DIR = path.join(process.cwd(), '.claude-flow', 'data');
308
+ const MEMORY_FILE = path.join(MEMORY_DIR, 'memory.json');
309
+
310
+ function loadMemory() {
311
+ try {
312
+ if (fs.existsSync(MEMORY_FILE)) {
313
+ return JSON.parse(fs.readFileSync(MEMORY_FILE, 'utf-8'));
314
+ }
315
+ } catch (e) {
316
+ // Ignore
317
+ }
318
+ return {};
319
+ }
320
+
321
+ function saveMemory(memory) {
322
+ fs.mkdirSync(MEMORY_DIR, { recursive: true });
323
+ fs.writeFileSync(MEMORY_FILE, JSON.stringify(memory, null, 2));
324
+ }
325
+
326
+ const commands = {
327
+ get: (key) => {
328
+ const memory = loadMemory();
329
+ const value = key ? memory[key] : memory;
330
+ console.log(JSON.stringify(value, null, 2));
331
+ return value;
332
+ },
333
+
334
+ set: (key, value) => {
335
+ if (!key) {
336
+ console.error('Key required');
337
+ return;
338
+ }
339
+ const memory = loadMemory();
340
+ memory[key] = value;
341
+ memory._updated = new Date().toISOString();
342
+ saveMemory(memory);
343
+ console.log(\`Set: \${key}\`);
344
+ },
345
+
346
+ delete: (key) => {
347
+ if (!key) {
348
+ console.error('Key required');
349
+ return;
350
+ }
351
+ const memory = loadMemory();
352
+ delete memory[key];
353
+ saveMemory(memory);
354
+ console.log(\`Deleted: \${key}\`);
355
+ },
356
+
357
+ clear: () => {
358
+ saveMemory({});
359
+ console.log('Memory cleared');
360
+ },
361
+
362
+ keys: () => {
363
+ const memory = loadMemory();
364
+ const keys = Object.keys(memory).filter(k => !k.startsWith('_'));
365
+ console.log(keys.join('\\n'));
366
+ return keys;
367
+ },
368
+ };
369
+
370
+ // CLI
371
+ const [,, command, key, ...valueParts] = process.argv;
372
+ const value = valueParts.join(' ');
373
+
374
+ if (command && commands[command]) {
375
+ commands[command](key, value);
376
+ } else {
377
+ console.log('Usage: memory.js <get|set|delete|clear|keys> [key] [value]');
378
+ }
379
+
380
+ module.exports = commands;
381
381
  `;
382
382
  }
383
383
  /**
@@ -841,351 +841,351 @@ export function generateIntelligenceStub() {
841
841
  * @claude-flow/memory is not installed. Gets overwritten when source copy succeeds.
842
842
  */
843
843
  export function generateAutoMemoryHook() {
844
- return `#!/usr/bin/env node
845
- /**
846
- * Auto Memory Bridge Hook (ADR-048/049) — Minimal Fallback
847
- * Full version is copied from package source when available.
848
- *
849
- * Usage:
850
- * node auto-memory-hook.mjs import # SessionStart
851
- * node auto-memory-hook.mjs sync # SessionEnd / Stop
852
- * node auto-memory-hook.mjs status # Show bridge status
853
- */
854
-
855
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
856
- import { join, dirname } from 'path';
857
- import { fileURLToPath } from 'url';
858
-
859
- const __filename = fileURLToPath(import.meta.url);
860
- const __dirname = dirname(__filename);
861
- const PROJECT_ROOT = join(__dirname, '../..');
862
- const DATA_DIR = join(PROJECT_ROOT, '.claude-flow', 'data');
863
- const STORE_PATH = join(DATA_DIR, 'auto-memory-store.json');
864
-
865
- const DIM = '\\x1b[2m';
866
- const RESET = '\\x1b[0m';
867
- const dim = (msg) => console.log(\` \${DIM}\${msg}\${RESET}\`);
868
-
869
- // Ensure data dir
870
- if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
871
-
872
- async function loadMemoryPackage() {
873
- // Strategy 1: Use createRequire for CJS-style resolution (handles nested node_modules
874
- // when installed as a transitive dependency via npx ruflo / npx claude-flow)
875
- try {
876
- const { createRequire } = await import('module');
877
- const require = createRequire(join(PROJECT_ROOT, 'package.json'));
878
- return require('@claude-flow/memory');
879
- } catch { /* fall through */ }
880
-
881
- // Strategy 2: ESM import (works when @claude-flow/memory is a direct dependency)
882
- try { return await import('@claude-flow/memory'); } catch { /* fall through */ }
883
-
884
- // Strategy 3: Walk up from PROJECT_ROOT looking for the package in any node_modules
885
- let searchDir = PROJECT_ROOT;
886
- const { parse } = await import('path');
887
- while (searchDir !== parse(searchDir).root) {
888
- const candidate = join(searchDir, 'node_modules', '@claude-flow', 'memory', 'dist', 'index.js');
889
- if (existsSync(candidate)) {
890
- try { return await import(\`file://\${candidate}\`); } catch { /* fall through */ }
891
- }
892
- searchDir = dirname(searchDir);
893
- }
894
-
895
- return null;
896
- }
897
-
898
- async function doImport() {
899
- const memPkg = await loadMemoryPackage();
900
-
901
- if (!memPkg || !memPkg.AutoMemoryBridge) {
902
- dim('Memory package not available — auto memory import skipped (non-critical)');
903
- return;
904
- }
905
-
906
- // Full implementation deferred to copied version
907
- dim('Auto memory import available — run init --upgrade for full support');
908
- }
909
-
910
- async function doSync() {
911
- if (!existsSync(STORE_PATH)) {
912
- dim('No entries to sync');
913
- return;
914
- }
915
-
916
- const memPkg = await loadMemoryPackage();
917
-
918
- if (!memPkg || !memPkg.AutoMemoryBridge) {
919
- dim('Memory package not available — sync skipped (non-critical)');
920
- return;
921
- }
922
-
923
- dim('Auto memory sync available — run init --upgrade for full support');
924
- }
925
-
926
- function doStatus() {
927
- console.log('\\n=== Auto Memory Bridge Status ===\\n');
928
- console.log(' Package: Fallback mode (run init --upgrade for full)');
929
- console.log(\` Store: \${existsSync(STORE_PATH) ? 'Initialized' : 'Not initialized'}\`);
930
- console.log('');
931
- }
932
-
933
- // Suppress unhandled rejection warnings from dynamic import() failures
934
- process.on('unhandledRejection', () => {});
935
-
936
- const command = process.argv[2] || 'status';
937
-
938
- try {
939
- switch (command) {
940
- case 'import': await doImport(); break;
941
- case 'sync': await doSync(); break;
942
- case 'status': doStatus(); break;
943
- default:
944
- console.log('Usage: auto-memory-hook.mjs <import|sync|status>');
945
- process.exit(1);
946
- }
947
- } catch (err) {
948
- // Hooks must never crash Claude Code - fail silently
949
- dim(\`Error (non-critical): \${err.message}\`);
950
- }
951
- // Ensure clean exit for Claude Code hooks (exit 0 = success)
952
- process.exit(0);
844
+ return `#!/usr/bin/env node
845
+ /**
846
+ * Auto Memory Bridge Hook (ADR-048/049) — Minimal Fallback
847
+ * Full version is copied from package source when available.
848
+ *
849
+ * Usage:
850
+ * node auto-memory-hook.mjs import # SessionStart
851
+ * node auto-memory-hook.mjs sync # SessionEnd / Stop
852
+ * node auto-memory-hook.mjs status # Show bridge status
853
+ */
854
+
855
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
856
+ import { join, dirname } from 'path';
857
+ import { fileURLToPath } from 'url';
858
+
859
+ const __filename = fileURLToPath(import.meta.url);
860
+ const __dirname = dirname(__filename);
861
+ const PROJECT_ROOT = join(__dirname, '../..');
862
+ const DATA_DIR = join(PROJECT_ROOT, '.claude-flow', 'data');
863
+ const STORE_PATH = join(DATA_DIR, 'auto-memory-store.json');
864
+
865
+ const DIM = '\\x1b[2m';
866
+ const RESET = '\\x1b[0m';
867
+ const dim = (msg) => console.log(\` \${DIM}\${msg}\${RESET}\`);
868
+
869
+ // Ensure data dir
870
+ if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
871
+
872
+ async function loadMemoryPackage() {
873
+ // Strategy 1: Use createRequire for CJS-style resolution (handles nested node_modules
874
+ // when installed as a transitive dependency via npx ruflo / npx claude-flow)
875
+ try {
876
+ const { createRequire } = await import('module');
877
+ const require = createRequire(join(PROJECT_ROOT, 'package.json'));
878
+ return require('@claude-flow/memory');
879
+ } catch { /* fall through */ }
880
+
881
+ // Strategy 2: ESM import (works when @claude-flow/memory is a direct dependency)
882
+ try { return await import('@claude-flow/memory'); } catch { /* fall through */ }
883
+
884
+ // Strategy 3: Walk up from PROJECT_ROOT looking for the package in any node_modules
885
+ let searchDir = PROJECT_ROOT;
886
+ const { parse } = await import('path');
887
+ while (searchDir !== parse(searchDir).root) {
888
+ const candidate = join(searchDir, 'node_modules', '@claude-flow', 'memory', 'dist', 'index.js');
889
+ if (existsSync(candidate)) {
890
+ try { return await import(\`file://\${candidate}\`); } catch { /* fall through */ }
891
+ }
892
+ searchDir = dirname(searchDir);
893
+ }
894
+
895
+ return null;
896
+ }
897
+
898
+ async function doImport() {
899
+ const memPkg = await loadMemoryPackage();
900
+
901
+ if (!memPkg || !memPkg.AutoMemoryBridge) {
902
+ dim('Memory package not available — auto memory import skipped (non-critical)');
903
+ return;
904
+ }
905
+
906
+ // Full implementation deferred to copied version
907
+ dim('Auto memory import available — run init --upgrade for full support');
908
+ }
909
+
910
+ async function doSync() {
911
+ if (!existsSync(STORE_PATH)) {
912
+ dim('No entries to sync');
913
+ return;
914
+ }
915
+
916
+ const memPkg = await loadMemoryPackage();
917
+
918
+ if (!memPkg || !memPkg.AutoMemoryBridge) {
919
+ dim('Memory package not available — sync skipped (non-critical)');
920
+ return;
921
+ }
922
+
923
+ dim('Auto memory sync available — run init --upgrade for full support');
924
+ }
925
+
926
+ function doStatus() {
927
+ console.log('\\n=== Auto Memory Bridge Status ===\\n');
928
+ console.log(' Package: Fallback mode (run init --upgrade for full)');
929
+ console.log(\` Store: \${existsSync(STORE_PATH) ? 'Initialized' : 'Not initialized'}\`);
930
+ console.log('');
931
+ }
932
+
933
+ // Suppress unhandled rejection warnings from dynamic import() failures
934
+ process.on('unhandledRejection', () => {});
935
+
936
+ const command = process.argv[2] || 'status';
937
+
938
+ try {
939
+ switch (command) {
940
+ case 'import': await doImport(); break;
941
+ case 'sync': await doSync(); break;
942
+ case 'status': doStatus(); break;
943
+ default:
944
+ console.log('Usage: auto-memory-hook.mjs <import|sync|status>');
945
+ process.exit(1);
946
+ }
947
+ } catch (err) {
948
+ // Hooks must never crash Claude Code - fail silently
949
+ dim(\`Error (non-critical): \${err.message}\`);
950
+ }
951
+ // Ensure clean exit for Claude Code hooks (exit 0 = success)
952
+ process.exit(0);
953
953
  `;
954
954
  }
955
955
  /**
956
956
  * Generate Windows PowerShell daemon manager
957
957
  */
958
958
  export function generateWindowsDaemonManager() {
959
- return `# RuFlo V3 Daemon Manager for Windows
960
- # PowerShell script for managing background processes
961
-
962
- param(
963
- [Parameter(Position=0)]
964
- [ValidateSet('start', 'stop', 'status', 'restart')]
965
- [string]$Action = 'status'
966
- )
967
-
968
- $ErrorActionPreference = 'SilentlyContinue'
969
- $ClaudeFlowDir = Join-Path $PWD '.claude-flow'
970
- $PidDir = Join-Path $ClaudeFlowDir 'pids'
971
-
972
- # Ensure directories exist
973
- if (-not (Test-Path $PidDir)) {
974
- New-Item -ItemType Directory -Path $PidDir -Force | Out-Null
975
- }
976
-
977
- function Get-DaemonStatus {
978
- param([string]$Name, [string]$PidFile)
979
-
980
- if (Test-Path $PidFile) {
981
- $pid = Get-Content $PidFile
982
- $process = Get-Process -Id $pid -ErrorAction SilentlyContinue
983
- if ($process) {
984
- return @{ Running = $true; Pid = $pid }
985
- }
986
- }
987
- return @{ Running = $false; Pid = $null }
988
- }
989
-
990
- function Start-SwarmMonitor {
991
- $pidFile = Join-Path $PidDir 'swarm-monitor.pid'
992
- $status = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $pidFile
993
-
994
- if ($status.Running) {
995
- Write-Host "Swarm monitor already running (PID: $($status.Pid))" -ForegroundColor Yellow
996
- return
997
- }
998
-
999
- Write-Host "Starting swarm monitor..." -ForegroundColor Cyan
1000
- $process = Start-Process -FilePath 'node' -ArgumentList @(
1001
- '-e',
1002
- 'setInterval(() => { require("fs").writeFileSync(".claude-flow/metrics/swarm-activity.json", JSON.stringify({swarm:{active:true,agent_count:0},timestamp:Date.now()})) }, 5000)'
1003
- ) -PassThru -WindowStyle Hidden
1004
-
1005
- $process.Id | Out-File $pidFile
1006
- Write-Host "Swarm monitor started (PID: $($process.Id))" -ForegroundColor Green
1007
- }
1008
-
1009
- function Stop-SwarmMonitor {
1010
- $pidFile = Join-Path $PidDir 'swarm-monitor.pid'
1011
- $status = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $pidFile
1012
-
1013
- if (-not $status.Running) {
1014
- Write-Host "Swarm monitor not running" -ForegroundColor Yellow
1015
- return
1016
- }
1017
-
1018
- Stop-Process -Id $status.Pid -Force
1019
- Remove-Item $pidFile -Force
1020
- Write-Host "Swarm monitor stopped" -ForegroundColor Green
1021
- }
1022
-
1023
- function Show-Status {
1024
- Write-Host ""
1025
- Write-Host "RuFlo V3 Daemon Status" -ForegroundColor Cyan
1026
- Write-Host "=============================" -ForegroundColor Cyan
1027
-
1028
- $swarmPid = Join-Path $PidDir 'swarm-monitor.pid'
1029
- $swarmStatus = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $swarmPid
1030
-
1031
- if ($swarmStatus.Running) {
1032
- Write-Host " Swarm Monitor: RUNNING (PID: $($swarmStatus.Pid))" -ForegroundColor Green
1033
- } else {
1034
- Write-Host " Swarm Monitor: STOPPED" -ForegroundColor Red
1035
- }
1036
- Write-Host ""
1037
- }
1038
-
1039
- switch ($Action) {
1040
- 'start' {
1041
- Start-SwarmMonitor
1042
- Show-Status
1043
- }
1044
- 'stop' {
1045
- Stop-SwarmMonitor
1046
- Show-Status
1047
- }
1048
- 'restart' {
1049
- Stop-SwarmMonitor
1050
- Start-Sleep -Seconds 1
1051
- Start-SwarmMonitor
1052
- Show-Status
1053
- }
1054
- 'status' {
1055
- Show-Status
1056
- }
1057
- }
959
+ return `# RuFlo V3 Daemon Manager for Windows
960
+ # PowerShell script for managing background processes
961
+
962
+ param(
963
+ [Parameter(Position=0)]
964
+ [ValidateSet('start', 'stop', 'status', 'restart')]
965
+ [string]$Action = 'status'
966
+ )
967
+
968
+ $ErrorActionPreference = 'SilentlyContinue'
969
+ $ClaudeFlowDir = Join-Path $PWD '.claude-flow'
970
+ $PidDir = Join-Path $ClaudeFlowDir 'pids'
971
+
972
+ # Ensure directories exist
973
+ if (-not (Test-Path $PidDir)) {
974
+ New-Item -ItemType Directory -Path $PidDir -Force | Out-Null
975
+ }
976
+
977
+ function Get-DaemonStatus {
978
+ param([string]$Name, [string]$PidFile)
979
+
980
+ if (Test-Path $PidFile) {
981
+ $pid = Get-Content $PidFile
982
+ $process = Get-Process -Id $pid -ErrorAction SilentlyContinue
983
+ if ($process) {
984
+ return @{ Running = $true; Pid = $pid }
985
+ }
986
+ }
987
+ return @{ Running = $false; Pid = $null }
988
+ }
989
+
990
+ function Start-SwarmMonitor {
991
+ $pidFile = Join-Path $PidDir 'swarm-monitor.pid'
992
+ $status = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $pidFile
993
+
994
+ if ($status.Running) {
995
+ Write-Host "Swarm monitor already running (PID: $($status.Pid))" -ForegroundColor Yellow
996
+ return
997
+ }
998
+
999
+ Write-Host "Starting swarm monitor..." -ForegroundColor Cyan
1000
+ $process = Start-Process -FilePath 'node' -ArgumentList @(
1001
+ '-e',
1002
+ 'setInterval(() => { require("fs").writeFileSync(".claude-flow/metrics/swarm-activity.json", JSON.stringify({swarm:{active:true,agent_count:0},timestamp:Date.now()})) }, 5000)'
1003
+ ) -PassThru -WindowStyle Hidden
1004
+
1005
+ $process.Id | Out-File $pidFile
1006
+ Write-Host "Swarm monitor started (PID: $($process.Id))" -ForegroundColor Green
1007
+ }
1008
+
1009
+ function Stop-SwarmMonitor {
1010
+ $pidFile = Join-Path $PidDir 'swarm-monitor.pid'
1011
+ $status = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $pidFile
1012
+
1013
+ if (-not $status.Running) {
1014
+ Write-Host "Swarm monitor not running" -ForegroundColor Yellow
1015
+ return
1016
+ }
1017
+
1018
+ Stop-Process -Id $status.Pid -Force
1019
+ Remove-Item $pidFile -Force
1020
+ Write-Host "Swarm monitor stopped" -ForegroundColor Green
1021
+ }
1022
+
1023
+ function Show-Status {
1024
+ Write-Host ""
1025
+ Write-Host "RuFlo V3 Daemon Status" -ForegroundColor Cyan
1026
+ Write-Host "=============================" -ForegroundColor Cyan
1027
+
1028
+ $swarmPid = Join-Path $PidDir 'swarm-monitor.pid'
1029
+ $swarmStatus = Get-DaemonStatus -Name 'swarm-monitor' -PidFile $swarmPid
1030
+
1031
+ if ($swarmStatus.Running) {
1032
+ Write-Host " Swarm Monitor: RUNNING (PID: $($swarmStatus.Pid))" -ForegroundColor Green
1033
+ } else {
1034
+ Write-Host " Swarm Monitor: STOPPED" -ForegroundColor Red
1035
+ }
1036
+ Write-Host ""
1037
+ }
1038
+
1039
+ switch ($Action) {
1040
+ 'start' {
1041
+ Start-SwarmMonitor
1042
+ Show-Status
1043
+ }
1044
+ 'stop' {
1045
+ Stop-SwarmMonitor
1046
+ Show-Status
1047
+ }
1048
+ 'restart' {
1049
+ Stop-SwarmMonitor
1050
+ Start-Sleep -Seconds 1
1051
+ Start-SwarmMonitor
1052
+ Show-Status
1053
+ }
1054
+ 'status' {
1055
+ Show-Status
1056
+ }
1057
+ }
1058
1058
  `;
1059
1059
  }
1060
1060
  /**
1061
1061
  * Generate Windows batch file wrapper
1062
1062
  */
1063
1063
  export function generateWindowsBatchWrapper() {
1064
- return `@echo off
1065
- REM RuFlo V3 - Windows Batch Wrapper
1066
- REM Routes to PowerShell daemon manager
1067
-
1068
- PowerShell -ExecutionPolicy Bypass -File "%~dp0daemon-manager.ps1" %*
1064
+ return `@echo off
1065
+ REM RuFlo V3 - Windows Batch Wrapper
1066
+ REM Routes to PowerShell daemon manager
1067
+
1068
+ PowerShell -ExecutionPolicy Bypass -File "%~dp0daemon-manager.ps1" %*
1069
1069
  `;
1070
1070
  }
1071
1071
  /**
1072
1072
  * Generate cross-platform session manager
1073
1073
  */
1074
1074
  export function generateCrossPlatformSessionManager() {
1075
- return `#!/usr/bin/env node
1076
- /**
1077
- * Ruflo Cross-Platform Session Manager
1078
- * Works on Windows, macOS, and Linux
1079
- */
1080
-
1081
- const fs = require('fs');
1082
- const path = require('path');
1083
- const os = require('os');
1084
-
1085
- // Platform-specific paths
1086
- const platform = os.platform();
1087
- const homeDir = os.homedir();
1088
-
1089
- // Get data directory based on platform
1090
- function getDataDir() {
1091
- const localDir = path.join(process.cwd(), '.claude-flow', 'sessions');
1092
- if (fs.existsSync(path.dirname(localDir))) {
1093
- return localDir;
1094
- }
1095
-
1096
- switch (platform) {
1097
- case 'win32':
1098
- return path.join(process.env.APPDATA || homeDir, 'claude-flow', 'sessions');
1099
- case 'darwin':
1100
- return path.join(homeDir, 'Library', 'Application Support', 'claude-flow', 'sessions');
1101
- default:
1102
- return path.join(homeDir, '.claude-flow', 'sessions');
1103
- }
1104
- }
1105
-
1106
- const SESSION_DIR = getDataDir();
1107
- const SESSION_FILE = path.join(SESSION_DIR, 'current.json');
1108
-
1109
- // Ensure directory exists
1110
- function ensureDir(dir) {
1111
- if (!fs.existsSync(dir)) {
1112
- fs.mkdirSync(dir, { recursive: true });
1113
- }
1114
- }
1115
-
1116
- const commands = {
1117
- start: () => {
1118
- ensureDir(SESSION_DIR);
1119
- const sessionId = \`session-\${Date.now()}\`;
1120
- const session = {
1121
- id: sessionId,
1122
- startedAt: new Date().toISOString(),
1123
- platform: platform,
1124
- cwd: process.cwd(),
1125
- context: {},
1126
- metrics: { edits: 0, commands: 0, tasks: 0, errors: 0 }
1127
- };
1128
- fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
1129
- console.log(\`Session started: \${sessionId}\`);
1130
- return session;
1131
- },
1132
-
1133
- restore: () => {
1134
- if (!fs.existsSync(SESSION_FILE)) {
1135
- console.log('No session to restore');
1136
- return null;
1137
- }
1138
- const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
1139
- session.restoredAt = new Date().toISOString();
1140
- fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
1141
- console.log(\`Session restored: \${session.id}\`);
1142
- return session;
1143
- },
1144
-
1145
- end: () => {
1146
- if (!fs.existsSync(SESSION_FILE)) {
1147
- console.log('No active session');
1148
- return null;
1149
- }
1150
- const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
1151
- session.endedAt = new Date().toISOString();
1152
- session.duration = Date.now() - new Date(session.startedAt).getTime();
1153
-
1154
- const archivePath = path.join(SESSION_DIR, \`\${session.id}.json\`);
1155
- fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));
1156
- fs.unlinkSync(SESSION_FILE);
1157
-
1158
- console.log(\`Session ended: \${session.id}\`);
1159
- console.log(\`Duration: \${Math.round(session.duration / 1000 / 60)} minutes\`);
1160
- return session;
1161
- },
1162
-
1163
- status: () => {
1164
- if (!fs.existsSync(SESSION_FILE)) {
1165
- console.log('No active session');
1166
- return null;
1167
- }
1168
- const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
1169
- const duration = Date.now() - new Date(session.startedAt).getTime();
1170
- console.log(\`Session: \${session.id}\`);
1171
- console.log(\`Platform: \${session.platform}\`);
1172
- console.log(\`Started: \${session.startedAt}\`);
1173
- console.log(\`Duration: \${Math.round(duration / 1000 / 60)} minutes\`);
1174
- return session;
1175
- }
1176
- };
1177
-
1178
- // CLI
1179
- const [,, command, ...args] = process.argv;
1180
- if (command && commands[command]) {
1181
- commands[command](...args);
1182
- } else {
1183
- console.log('Usage: session.js <start|restore|end|status>');
1184
- console.log(\`Platform: \${platform}\`);
1185
- console.log(\`Data dir: \${SESSION_DIR}\`);
1186
- }
1187
-
1188
- module.exports = commands;
1075
+ return `#!/usr/bin/env node
1076
+ /**
1077
+ * Ruflo Cross-Platform Session Manager
1078
+ * Works on Windows, macOS, and Linux
1079
+ */
1080
+
1081
+ const fs = require('fs');
1082
+ const path = require('path');
1083
+ const os = require('os');
1084
+
1085
+ // Platform-specific paths
1086
+ const platform = os.platform();
1087
+ const homeDir = os.homedir();
1088
+
1089
+ // Get data directory based on platform
1090
+ function getDataDir() {
1091
+ const localDir = path.join(process.cwd(), '.claude-flow', 'sessions');
1092
+ if (fs.existsSync(path.dirname(localDir))) {
1093
+ return localDir;
1094
+ }
1095
+
1096
+ switch (platform) {
1097
+ case 'win32':
1098
+ return path.join(process.env.APPDATA || homeDir, 'claude-flow', 'sessions');
1099
+ case 'darwin':
1100
+ return path.join(homeDir, 'Library', 'Application Support', 'claude-flow', 'sessions');
1101
+ default:
1102
+ return path.join(homeDir, '.claude-flow', 'sessions');
1103
+ }
1104
+ }
1105
+
1106
+ const SESSION_DIR = getDataDir();
1107
+ const SESSION_FILE = path.join(SESSION_DIR, 'current.json');
1108
+
1109
+ // Ensure directory exists
1110
+ function ensureDir(dir) {
1111
+ if (!fs.existsSync(dir)) {
1112
+ fs.mkdirSync(dir, { recursive: true });
1113
+ }
1114
+ }
1115
+
1116
+ const commands = {
1117
+ start: () => {
1118
+ ensureDir(SESSION_DIR);
1119
+ const sessionId = \`session-\${Date.now()}\`;
1120
+ const session = {
1121
+ id: sessionId,
1122
+ startedAt: new Date().toISOString(),
1123
+ platform: platform,
1124
+ cwd: process.cwd(),
1125
+ context: {},
1126
+ metrics: { edits: 0, commands: 0, tasks: 0, errors: 0 }
1127
+ };
1128
+ fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
1129
+ console.log(\`Session started: \${sessionId}\`);
1130
+ return session;
1131
+ },
1132
+
1133
+ restore: () => {
1134
+ if (!fs.existsSync(SESSION_FILE)) {
1135
+ console.log('No session to restore');
1136
+ return null;
1137
+ }
1138
+ const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
1139
+ session.restoredAt = new Date().toISOString();
1140
+ fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
1141
+ console.log(\`Session restored: \${session.id}\`);
1142
+ return session;
1143
+ },
1144
+
1145
+ end: () => {
1146
+ if (!fs.existsSync(SESSION_FILE)) {
1147
+ console.log('No active session');
1148
+ return null;
1149
+ }
1150
+ const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
1151
+ session.endedAt = new Date().toISOString();
1152
+ session.duration = Date.now() - new Date(session.startedAt).getTime();
1153
+
1154
+ const archivePath = path.join(SESSION_DIR, \`\${session.id}.json\`);
1155
+ fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));
1156
+ fs.unlinkSync(SESSION_FILE);
1157
+
1158
+ console.log(\`Session ended: \${session.id}\`);
1159
+ console.log(\`Duration: \${Math.round(session.duration / 1000 / 60)} minutes\`);
1160
+ return session;
1161
+ },
1162
+
1163
+ status: () => {
1164
+ if (!fs.existsSync(SESSION_FILE)) {
1165
+ console.log('No active session');
1166
+ return null;
1167
+ }
1168
+ const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
1169
+ const duration = Date.now() - new Date(session.startedAt).getTime();
1170
+ console.log(\`Session: \${session.id}\`);
1171
+ console.log(\`Platform: \${session.platform}\`);
1172
+ console.log(\`Started: \${session.startedAt}\`);
1173
+ console.log(\`Duration: \${Math.round(duration / 1000 / 60)} minutes\`);
1174
+ return session;
1175
+ }
1176
+ };
1177
+
1178
+ // CLI
1179
+ const [,, command, ...args] = process.argv;
1180
+ if (command && commands[command]) {
1181
+ commands[command](...args);
1182
+ } else {
1183
+ console.log('Usage: session.js <start|restore|end|status>');
1184
+ console.log(\`Platform: \${platform}\`);
1185
+ console.log(\`Data dir: \${SESSION_DIR}\`);
1186
+ }
1187
+
1188
+ module.exports = commands;
1189
1189
  `;
1190
1190
  }
1191
1191
  /**
@@ -1228,65 +1228,65 @@ export function generateHelpers(options) {
1228
1228
  * - Both: .claude/helpers/ruflo-hook.cjs available as a canonical cross-platform shim
1229
1229
  */
1230
1230
  export function generateRufloHookCjs() {
1231
- return `#!/usr/bin/env node
1232
- /**
1233
- * ruflo-hook.cjs — cross-platform Node.js port of ruflo-hook.sh (#2132)
1234
- *
1235
- * Deployed to .claude/helpers/ during ruflo init. On Windows, the
1236
- * generated .claude/settings.json hooks point here instead of the
1237
- * plugin's bash-only ruflo-hook.sh.
1238
- *
1239
- * Always exits 0 — hook subcommands are best-effort telemetry and must
1240
- * never block a Claude Code turn.
1241
- */
1242
-
1243
- 'use strict';
1244
-
1245
- const { spawnSync, execSync } = require('child_process');
1246
- const fs = require('fs');
1247
-
1248
- function done() { process.exit(0); }
1249
-
1250
- function commandExists(cmd) {
1251
- try {
1252
- const r = execSync(
1253
- process.platform === 'win32' ? 'where ' + cmd : 'command -v ' + cmd,
1254
- { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }
1255
- );
1256
- return r.trim().length > 0;
1257
- } catch { return false; }
1258
- }
1259
-
1260
- function invokeHook(bin, binArgs, hookArgs, stdinData) {
1261
- const args = [...binArgs, ...hookArgs];
1262
- const result = spawnSync(bin, args, {
1263
- shell: process.platform === 'win32',
1264
- input: stdinData || '',
1265
- encoding: 'utf8',
1266
- stdio: ['pipe', 'ignore', 'ignore'],
1267
- timeout: 30_000,
1268
- });
1269
- return result.status === 0;
1270
- }
1271
-
1272
- function main() {
1273
- const args = process.argv.slice(2);
1274
- if (args.length === 0) done();
1275
-
1276
- const [subcommand, ...rest] = args;
1277
-
1278
- let stdinData = '';
1279
- try { stdinData = fs.readFileSync(0, 'utf8'); } catch { stdinData = ''; }
1280
-
1281
- const hookArgs = ['hooks', subcommand, ...rest];
1282
-
1283
- if (commandExists('ruflo')) { invokeHook('ruflo', [], hookArgs, stdinData); done(); }
1284
- if (commandExists('claude-flow')) { invokeHook('claude-flow', [], hookArgs, stdinData); done(); }
1285
- invokeHook('npx', ['--prefer-offline', '--yes', 'ruflo@latest'], hookArgs, stdinData);
1286
- done();
1287
- }
1288
-
1289
- main();
1231
+ return `#!/usr/bin/env node
1232
+ /**
1233
+ * ruflo-hook.cjs — cross-platform Node.js port of ruflo-hook.sh (#2132)
1234
+ *
1235
+ * Deployed to .claude/helpers/ during ruflo init. On Windows, the
1236
+ * generated .claude/settings.json hooks point here instead of the
1237
+ * plugin's bash-only ruflo-hook.sh.
1238
+ *
1239
+ * Always exits 0 — hook subcommands are best-effort telemetry and must
1240
+ * never block a Claude Code turn.
1241
+ */
1242
+
1243
+ 'use strict';
1244
+
1245
+ const { spawnSync, execSync } = require('child_process');
1246
+ const fs = require('fs');
1247
+
1248
+ function done() { process.exit(0); }
1249
+
1250
+ function commandExists(cmd) {
1251
+ try {
1252
+ const r = execSync(
1253
+ process.platform === 'win32' ? 'where ' + cmd : 'command -v ' + cmd,
1254
+ { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }
1255
+ );
1256
+ return r.trim().length > 0;
1257
+ } catch { return false; }
1258
+ }
1259
+
1260
+ function invokeHook(bin, binArgs, hookArgs, stdinData) {
1261
+ const args = [...binArgs, ...hookArgs];
1262
+ const result = spawnSync(bin, args, {
1263
+ shell: process.platform === 'win32',
1264
+ input: stdinData || '',
1265
+ encoding: 'utf8',
1266
+ stdio: ['pipe', 'ignore', 'ignore'],
1267
+ timeout: 30_000,
1268
+ });
1269
+ return result.status === 0;
1270
+ }
1271
+
1272
+ function main() {
1273
+ const args = process.argv.slice(2);
1274
+ if (args.length === 0) done();
1275
+
1276
+ const [subcommand, ...rest] = args;
1277
+
1278
+ let stdinData = '';
1279
+ try { stdinData = fs.readFileSync(0, 'utf8'); } catch { stdinData = ''; }
1280
+
1281
+ const hookArgs = ['hooks', subcommand, ...rest];
1282
+
1283
+ if (commandExists('ruflo')) { invokeHook('ruflo', [], hookArgs, stdinData); done(); }
1284
+ if (commandExists('claude-flow')) { invokeHook('claude-flow', [], hookArgs, stdinData); done(); }
1285
+ invokeHook('npx', ['--prefer-offline', '--yes', 'ruflo@latest'], hookArgs, stdinData);
1286
+ done();
1287
+ }
1288
+
1289
+ main();
1290
1290
  `;
1291
1291
  }
1292
1292
  //# sourceMappingURL=helpers-generator.js.map