@claude-flow/cli 3.27.4 → 3.29.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 (464) 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/eval/human-relevance-frozen-v1.json +17 -17
  259. package/.claude/evolve-proof/generation-0.json +211 -211
  260. package/.claude/evolve-proof/real-generation-0.json +406 -406
  261. package/.claude/evolve-proof/real-generation-1.json +406 -406
  262. package/.claude/helpers/README.md +96 -96
  263. package/.claude/helpers/adr-compliance.sh +186 -186
  264. package/.claude/helpers/auto-commit.sh +178 -178
  265. package/.claude/helpers/auto-memory-hook.mjs +430 -430
  266. package/.claude/helpers/checkpoint-manager.sh +251 -251
  267. package/.claude/helpers/daemon-manager.sh +252 -252
  268. package/.claude/helpers/ddd-tracker.sh +144 -144
  269. package/.claude/helpers/github-safe.js +156 -156
  270. package/.claude/helpers/github-setup.sh +45 -45
  271. package/.claude/helpers/guidance-hook.sh +13 -13
  272. package/.claude/helpers/guidance-hooks.sh +102 -102
  273. package/.claude/helpers/health-monitor.sh +108 -108
  274. package/.claude/helpers/helpers.manifest.json +6 -6
  275. package/.claude/helpers/hook-handler.cjs +460 -460
  276. package/.claude/helpers/intelligence.cjs +1058 -1058
  277. package/.claude/helpers/learning-hooks.sh +329 -329
  278. package/.claude/helpers/learning-optimizer.sh +127 -127
  279. package/.claude/helpers/learning-service.mjs +1144 -1144
  280. package/.claude/helpers/memory.js +83 -83
  281. package/.claude/helpers/metrics-db.mjs +503 -503
  282. package/.claude/helpers/pattern-consolidator.sh +86 -86
  283. package/.claude/helpers/perf-worker.sh +160 -160
  284. package/.claude/helpers/post-commit +16 -16
  285. package/.claude/helpers/pre-commit +26 -26
  286. package/.claude/helpers/quick-start.sh +19 -19
  287. package/.claude/helpers/router.js +105 -105
  288. package/.claude/helpers/security-scanner.sh +127 -127
  289. package/.claude/helpers/session.js +157 -157
  290. package/.claude/helpers/setup-mcp.sh +18 -18
  291. package/.claude/helpers/standard-checkpoint-hooks.sh +189 -189
  292. package/.claude/helpers/statusline-hook.sh +21 -21
  293. package/.claude/helpers/statusline.cjs +925 -925
  294. package/.claude/helpers/statusline.js +352 -352
  295. package/.claude/helpers/swarm-comms.sh +353 -353
  296. package/.claude/helpers/swarm-hooks.sh +761 -761
  297. package/.claude/helpers/swarm-monitor.sh +210 -210
  298. package/.claude/helpers/sync-v3-metrics.sh +245 -245
  299. package/.claude/helpers/update-v3-progress.sh +165 -165
  300. package/.claude/helpers/v3-quick-status.sh +57 -57
  301. package/.claude/helpers/v3.sh +110 -110
  302. package/.claude/helpers/validate-v3-config.sh +215 -215
  303. package/.claude/helpers/worker-manager.sh +170 -170
  304. package/.claude/proven-config.json +1 -1
  305. package/.claude/proven-config.manifest.json +37 -37
  306. package/.claude/proven-config.signed.json +41 -41
  307. package/.claude/settings.json +182 -182
  308. package/.claude/skills/agentdb-advanced/SKILL.md +550 -550
  309. package/.claude/skills/agentdb-learning/SKILL.md +545 -545
  310. package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -339
  311. package/.claude/skills/agentdb-optimization/SKILL.md +509 -509
  312. package/.claude/skills/agentdb-vector-search/SKILL.md +339 -339
  313. package/.claude/skills/browser/SKILL.md +204 -204
  314. package/.claude/skills/dual-mode/README.md +71 -71
  315. package/.claude/skills/dual-mode/dual-collect.md +103 -103
  316. package/.claude/skills/dual-mode/dual-coordinate.md +85 -85
  317. package/.claude/skills/dual-mode/dual-spawn.md +81 -81
  318. package/.claude/skills/flow-nexus-neural/SKILL.md +727 -727
  319. package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -1154
  320. package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -604
  321. package/.claude/skills/github-code-review/SKILL.md +1125 -1125
  322. package/.claude/skills/github-multi-repo/SKILL.md +862 -862
  323. package/.claude/skills/github-project-management/SKILL.md +1262 -1262
  324. package/.claude/skills/github-release-management/SKILL.md +1064 -1064
  325. package/.claude/skills/github-workflow-automation/SKILL.md +1047 -1047
  326. package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
  327. package/.claude/skills/pair-programming/SKILL.md +1202 -1202
  328. package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -446
  329. package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -201
  330. package/.claude/skills/skill-builder/SKILL.md +910 -910
  331. package/.claude/skills/sparc-methodology/SKILL.md +1106 -1106
  332. package/.claude/skills/stream-chain/SKILL.md +560 -560
  333. package/.claude/skills/swarm-advanced/SKILL.md +970 -970
  334. package/.claude/skills/swarm-orchestration/SKILL.md +179 -179
  335. package/.claude/skills/v3-cli-modernization/SKILL.md +871 -871
  336. package/.claude/skills/v3-core-implementation/SKILL.md +796 -796
  337. package/.claude/skills/v3-ddd-architecture/SKILL.md +441 -441
  338. package/.claude/skills/v3-integration-deep/SKILL.md +240 -240
  339. package/.claude/skills/v3-mcp-optimization/SKILL.md +776 -776
  340. package/.claude/skills/v3-memory-unification/SKILL.md +173 -173
  341. package/.claude/skills/v3-performance-optimization/SKILL.md +389 -389
  342. package/.claude/skills/v3-security-overhaul/SKILL.md +81 -81
  343. package/.claude/skills/v3-swarm-coordination/SKILL.md +339 -339
  344. package/.claude/skills/verification-quality/SKILL.md +691 -691
  345. package/README.md +419 -419
  346. package/bin/cli.js +314 -314
  347. package/bin/mcp-server.js +224 -224
  348. package/bin/preinstall.cjs +2 -2
  349. package/catalog-manifest.json +2 -2
  350. package/dist/src/benchmarks/gaia-critic.js +24 -24
  351. package/dist/src/business-pods/bbs-budget-tracker.js +53 -53
  352. package/dist/src/commands/completions.js +409 -409
  353. package/dist/src/commands/daemon.d.ts +23 -0
  354. package/dist/src/commands/daemon.js +216 -44
  355. package/dist/src/commands/embeddings.js +26 -26
  356. package/dist/src/commands/funnel.d.ts +2 -0
  357. package/dist/src/commands/funnel.js +110 -2
  358. package/dist/src/commands/hive-mind.js +97 -97
  359. package/dist/src/commands/hooks.js +9 -9
  360. package/dist/src/commands/init.js +94 -38
  361. package/dist/src/commands/memory.js +85 -1
  362. package/dist/src/commands/ruvector/backup.js +23 -23
  363. package/dist/src/commands/ruvector/benchmark.js +31 -31
  364. package/dist/src/commands/ruvector/import.js +14 -14
  365. package/dist/src/commands/ruvector/init.js +115 -115
  366. package/dist/src/commands/ruvector/migrate.js +99 -99
  367. package/dist/src/commands/ruvector/optimize.js +51 -51
  368. package/dist/src/commands/ruvector/setup.js +624 -624
  369. package/dist/src/commands/ruvector/status.js +38 -38
  370. package/dist/src/config/proven-config.js +2 -2
  371. package/dist/src/funnel/disclosure.d.ts +1 -0
  372. package/dist/src/funnel/disclosure.js +12 -0
  373. package/dist/src/funnel/index.d.ts +1 -1
  374. package/dist/src/funnel/index.js +1 -1
  375. package/dist/src/init/claudemd-generator.js +231 -231
  376. package/dist/src/init/executor.js +453 -453
  377. package/dist/src/init/helper-signing.d.ts +8 -1
  378. package/dist/src/init/helper-signing.js +9 -2
  379. package/dist/src/init/helpers-generator.js +751 -751
  380. package/dist/src/init/statusline-generator.js +994 -951
  381. package/dist/src/mcp-tools/agentdb-tools.js +15 -15
  382. package/dist/src/mcp-tools/browser-intent-tools.js +19 -19
  383. package/dist/src/memory/graph-edge-writer.js +22 -22
  384. package/dist/src/memory/memory-bridge.d.ts +10 -0
  385. package/dist/src/memory/memory-bridge.js +139 -88
  386. package/dist/src/memory/memory-initializer.d.ts +18 -0
  387. package/dist/src/memory/memory-initializer.js +539 -407
  388. package/dist/src/memory/rabitq-index.js +5 -5
  389. package/dist/src/runtime/headless.js +28 -28
  390. package/dist/src/ruvector/flash-attention.d.ts +195 -0
  391. package/dist/src/ruvector/flash-attention.js +643 -0
  392. package/dist/src/ruvector/moe-router.d.ts +206 -0
  393. package/dist/src/ruvector/moe-router.js +626 -0
  394. package/dist/src/services/distill-tuning.js +7 -7
  395. package/dist/src/services/event-stream.d.ts +25 -0
  396. package/dist/src/services/event-stream.js +27 -0
  397. package/dist/src/services/global-ai-budget.d.ts +25 -0
  398. package/dist/src/services/global-ai-budget.js +56 -0
  399. package/dist/src/services/headless-worker-executor.d.ts +21 -0
  400. package/dist/src/services/headless-worker-executor.js +152 -86
  401. package/dist/src/services/loop-worker-runner.d.ts +16 -0
  402. package/dist/src/services/loop-worker-runner.js +34 -0
  403. package/dist/src/services/memory-distillation.js +4 -4
  404. package/dist/src/services/repo-supervisor.d.ts +70 -0
  405. package/dist/src/services/repo-supervisor.js +228 -0
  406. package/dist/src/services/runtime-capabilities.d.ts +22 -0
  407. package/dist/src/services/runtime-capabilities.js +45 -0
  408. package/dist/src/services/worker-daemon.d.ts +26 -0
  409. package/dist/src/services/worker-daemon.js +95 -5
  410. package/dist/src/services/workspace-lease.d.ts +55 -0
  411. package/dist/src/services/workspace-lease.js +191 -0
  412. package/dist/src/transfer/deploy-seraphine.js +23 -23
  413. package/package.json +134 -133
  414. package/plugins/ruflo-metaharness/.claude-plugin/plugin.json +32 -32
  415. package/plugins/ruflo-metaharness/README.md +72 -72
  416. package/plugins/ruflo-metaharness/agents/metaharness-architect.md +58 -58
  417. package/plugins/ruflo-metaharness/commands/ruflo-metaharness.md +48 -48
  418. package/plugins/ruflo-metaharness/scripts/_darwin.mjs +210 -210
  419. package/plugins/ruflo-metaharness/scripts/_harness.mjs +330 -330
  420. package/plugins/ruflo-metaharness/scripts/_invoke.mjs +231 -231
  421. package/plugins/ruflo-metaharness/scripts/_redblue.mjs +143 -143
  422. package/plugins/ruflo-metaharness/scripts/_similarity.mjs +161 -161
  423. package/plugins/ruflo-metaharness/scripts/_spike-similarity.mjs +223 -223
  424. package/plugins/ruflo-metaharness/scripts/audit-list.mjs +158 -158
  425. package/plugins/ruflo-metaharness/scripts/audit-trend.mjs +272 -272
  426. package/plugins/ruflo-metaharness/scripts/bench-parse-mcp-scan.mjs +146 -146
  427. package/plugins/ruflo-metaharness/scripts/bench-recordpair-overhead.mjs +186 -186
  428. package/plugins/ruflo-metaharness/scripts/bench-similarity.mjs +177 -177
  429. package/plugins/ruflo-metaharness/scripts/bench.mjs +95 -95
  430. package/plugins/ruflo-metaharness/scripts/drift-from-history.mjs +363 -363
  431. package/plugins/ruflo-metaharness/scripts/evolve.mjs +404 -404
  432. package/plugins/ruflo-metaharness/scripts/genome.mjs +80 -80
  433. package/plugins/ruflo-metaharness/scripts/gepa.mjs +153 -153
  434. package/plugins/ruflo-metaharness/scripts/learn.mjs +127 -127
  435. package/plugins/ruflo-metaharness/scripts/mcp-scan.mjs +111 -111
  436. package/plugins/ruflo-metaharness/scripts/mint.mjs +126 -126
  437. package/plugins/ruflo-metaharness/scripts/oia-audit.mjs +228 -228
  438. package/plugins/ruflo-metaharness/scripts/redblue.mjs +286 -286
  439. package/plugins/ruflo-metaharness/scripts/router-parallel-analyze.mjs +250 -250
  440. package/plugins/ruflo-metaharness/scripts/score.mjs +92 -92
  441. package/plugins/ruflo-metaharness/scripts/security-bench.mjs +174 -174
  442. package/plugins/ruflo-metaharness/scripts/similarity.mjs +158 -158
  443. package/plugins/ruflo-metaharness/scripts/smoke.sh +2353 -2353
  444. package/plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs +165 -165
  445. package/plugins/ruflo-metaharness/scripts/test-mcp-tools.mjs +472 -472
  446. package/plugins/ruflo-metaharness/scripts/test-parallel-pipeline.mjs +204 -204
  447. package/plugins/ruflo-metaharness/scripts/test-pipeline-roundtrip.mjs +586 -586
  448. package/plugins/ruflo-metaharness/scripts/test-similarity.mjs +334 -334
  449. package/plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs +229 -229
  450. package/plugins/ruflo-metaharness/scripts/threat-model.mjs +59 -59
  451. package/plugins/ruflo-metaharness/skills/harness-bench/SKILL.md +64 -64
  452. package/plugins/ruflo-metaharness/skills/harness-drift-from-history/SKILL.md +65 -65
  453. package/plugins/ruflo-metaharness/skills/harness-evolve/SKILL.md +131 -131
  454. package/plugins/ruflo-metaharness/skills/harness-genome/SKILL.md +54 -54
  455. package/plugins/ruflo-metaharness/skills/harness-gepa/SKILL.md +65 -65
  456. package/plugins/ruflo-metaharness/skills/harness-learn/SKILL.md +65 -65
  457. package/plugins/ruflo-metaharness/skills/harness-mcp-scan/SKILL.md +49 -49
  458. package/plugins/ruflo-metaharness/skills/harness-mint/SKILL.md +72 -72
  459. package/plugins/ruflo-metaharness/skills/harness-oia-audit/SKILL.md +79 -79
  460. package/plugins/ruflo-metaharness/skills/harness-score/SKILL.md +66 -66
  461. package/plugins/ruflo-metaharness/skills/harness-security-bench/SKILL.md +101 -101
  462. package/plugins/ruflo-metaharness/skills/harness-similarity/SKILL.md +67 -67
  463. package/plugins/ruflo-metaharness/skills/harness-threat-model/SKILL.md +41 -41
  464. package/scripts/postinstall.cjs +153 -153
@@ -0,0 +1,228 @@
1
+ /**
2
+ * #2661 root-fix — one repository-level supervisor.
3
+ *
4
+ * Ten worktree daemons of the same repository independently deciding "is it
5
+ * time to run audit/optimize/testgaps" every tick is the redundant-scheduler
6
+ * half of the original cardinality bug — the budget ledger and job dedup
7
+ * (global-ai-budget.ts, ai-job-dedup.ts) already bound and dedupe the actual
8
+ * `claude --print` spend, but every daemon still runs its own timer and its
9
+ * own "should I launch" decision. This module elects exactly ONE daemon per
10
+ * repositoryId to own the recurring AI-worker schedule; every other worktree
11
+ * of that repository stays a lease-only participant (workspace-lease.ts) —
12
+ * it keeps running its cheap, $0 local-only workers (map/consolidate/backup)
13
+ * on its own schedule, but does not attempt headless (`claude --print`)
14
+ * execution for its recurring ticks. An explicit `daemon trigger --headless`
15
+ * in a non-supervisor worktree is still honored (still budget/dedup-gated) —
16
+ * this module only governs the unattended recurring schedule.
17
+ *
18
+ * Election is a simple lock-protected takeover, same pattern as
19
+ * global-ai-budget.ts:
20
+ * - No record, a dead PID, or a stale heartbeat (>SUPERVISOR_STALE_MS) →
21
+ * the calling daemon takes over.
22
+ * - A live supervisor with a fresh heartbeat → the calling daemon is not
23
+ * elected; it does nothing (never overwrites a healthy supervisor).
24
+ *
25
+ * The registry lives under the user's home directory so every worktree's
26
+ * daemon can see it:
27
+ *
28
+ * ~/.claude-flow/supervisors/<repositoryId>.json
29
+ */
30
+ import * as fs from 'fs';
31
+ import { join } from 'path';
32
+ import { homedir } from 'os';
33
+ // Longer than any plausible daemon heartbeat interval (daemons renew via the
34
+ // existing 60s lifecycle-monitor tick) so a merely-slow tick never triggers
35
+ // a false takeover, but short enough that a crashed supervisor's worktree
36
+ // yields the schedule within a few minutes rather than indefinitely.
37
+ export const SUPERVISOR_STALE_MS = 3 * 60 * 1000;
38
+ const LOCK_STALE_MS = 10_000;
39
+ function delay(ms) {
40
+ return new Promise((r) => setTimeout(r, ms));
41
+ }
42
+ function isProcessAlive(pid) {
43
+ try {
44
+ process.kill(pid, 0);
45
+ return true;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ /** Invariant 9 (#2661): registry files must never be symlinks. */
52
+ function assertNotSymlink(path) {
53
+ try {
54
+ const st = fs.lstatSync(path);
55
+ if (st.isSymbolicLink()) {
56
+ throw new Error(`Repo-supervisor file is a symlink (refusing): ${path}`);
57
+ }
58
+ }
59
+ catch (e) {
60
+ if (e.code === 'ENOENT')
61
+ return;
62
+ throw e;
63
+ }
64
+ }
65
+ export class RepoSupervisorRegistry {
66
+ dir;
67
+ constructor(options) {
68
+ this.dir = options?.baseDir
69
+ ?? process.env.RUFLO_AI_BUDGET_DIR
70
+ ?? join(homedir(), '.claude-flow');
71
+ }
72
+ fileFor(repositoryId) {
73
+ return join(this.dir, 'supervisors', `${repositoryId}.json`);
74
+ }
75
+ ensureDir() {
76
+ const dir = join(this.dir, 'supervisors');
77
+ if (!fs.existsSync(dir))
78
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
79
+ }
80
+ async withLock(repositoryId, fn) {
81
+ this.ensureDir();
82
+ const lockFile = `${this.fileFor(repositoryId)}.lock`;
83
+ const deadline = Date.now() + 2000;
84
+ for (;;) {
85
+ try {
86
+ const fd = fs.openSync(lockFile, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY, 0o600);
87
+ fs.writeSync(fd, String(process.pid));
88
+ fs.closeSync(fd);
89
+ try {
90
+ return fn();
91
+ }
92
+ finally {
93
+ try {
94
+ fs.unlinkSync(lockFile);
95
+ }
96
+ catch { /* already gone */ }
97
+ }
98
+ }
99
+ catch (e) {
100
+ if (e.code !== 'EEXIST')
101
+ throw e;
102
+ try {
103
+ const st = fs.lstatSync(lockFile);
104
+ if (Date.now() - st.mtimeMs > LOCK_STALE_MS) {
105
+ fs.unlinkSync(lockFile);
106
+ continue;
107
+ }
108
+ }
109
+ catch { /* raced — retry */ }
110
+ if (Date.now() > deadline)
111
+ throw new Error('timed out acquiring repo-supervisor lock');
112
+ await delay(25);
113
+ }
114
+ }
115
+ }
116
+ readRecord(repositoryId) {
117
+ const file = this.fileFor(repositoryId);
118
+ assertNotSymlink(file);
119
+ if (!fs.existsSync(file))
120
+ return null;
121
+ try {
122
+ const raw = JSON.parse(fs.readFileSync(file, 'utf-8'));
123
+ if (raw && typeof raw.pid === 'number' && typeof raw.lastHeartbeat === 'number') {
124
+ return raw;
125
+ }
126
+ }
127
+ catch { /* corrupt — treat as absent */ }
128
+ return null;
129
+ }
130
+ writeRecord(repositoryId, record) {
131
+ const file = this.fileFor(repositoryId);
132
+ assertNotSymlink(file);
133
+ const tmp = `${file}.tmp.${process.pid}`;
134
+ fs.writeFileSync(tmp, JSON.stringify(record), { mode: 0o600 });
135
+ fs.renameSync(tmp, file);
136
+ }
137
+ isStale(record, now) {
138
+ return now - record.lastHeartbeat > SUPERVISOR_STALE_MS || !isProcessAlive(record.pid);
139
+ }
140
+ /**
141
+ * Attempt election (or renewal, if this process already holds it). Safe
142
+ * and cheap to call on every daemon tick — a no-op write when nothing
143
+ * needs to change would still cost a lock+read+write, so callers should
144
+ * still throttle to their own heartbeat cadence rather than calling this
145
+ * per-worker-tick.
146
+ */
147
+ async electOrRenew(repositoryId, worktreeRoot) {
148
+ try {
149
+ return await this.withLock(repositoryId, () => {
150
+ const now = Date.now();
151
+ const existing = this.readRecord(repositoryId);
152
+ if (existing && existing.pid === process.pid && existing.worktreeRoot === worktreeRoot) {
153
+ const renewed = { ...existing, lastHeartbeat: now };
154
+ this.writeRecord(repositoryId, renewed);
155
+ return { isSupervisor: true, record: renewed };
156
+ }
157
+ if (!existing || this.isStale(existing, now)) {
158
+ const record = { worktreeRoot, pid: process.pid, electedAt: now, lastHeartbeat: now };
159
+ this.writeRecord(repositoryId, record);
160
+ return { isSupervisor: true, record };
161
+ }
162
+ // A live supervisor already owns this repository — never overwrite it.
163
+ return { isSupervisor: false, record: existing };
164
+ });
165
+ }
166
+ catch {
167
+ // Fail closed on the SCHEDULE side too: if we can't safely coordinate,
168
+ // assume we are NOT the supervisor rather than risk two daemons both
169
+ // believing they own the schedule. The budget ledger is the actual
170
+ // hard invariant either way.
171
+ return { isSupervisor: false, record: null };
172
+ }
173
+ }
174
+ /** Cheap read-only check — does NOT renew or elect. */
175
+ isSupervisor(repositoryId, worktreeRoot) {
176
+ try {
177
+ const existing = this.readRecord(repositoryId);
178
+ if (!existing)
179
+ return false;
180
+ const now = Date.now();
181
+ if (this.isStale(existing, now))
182
+ return false;
183
+ return existing.pid === process.pid && existing.worktreeRoot === worktreeRoot;
184
+ }
185
+ catch {
186
+ return false;
187
+ }
188
+ }
189
+ /** Release supervisor status on graceful shutdown, so the next tick elsewhere can take over promptly. Best-effort. */
190
+ async release(repositoryId, worktreeRoot) {
191
+ try {
192
+ await this.withLock(repositoryId, () => {
193
+ const existing = this.readRecord(repositoryId);
194
+ if (existing && existing.pid === process.pid && existing.worktreeRoot === worktreeRoot) {
195
+ const file = this.fileFor(repositoryId);
196
+ try {
197
+ fs.unlinkSync(file);
198
+ }
199
+ catch { /* already gone */ }
200
+ }
201
+ });
202
+ }
203
+ catch { /* best-effort */ }
204
+ }
205
+ /** Snapshot for `daemon status --all`. Read-only, never mutates. */
206
+ getRecord(repositoryId) {
207
+ try {
208
+ const existing = this.readRecord(repositoryId);
209
+ if (!existing || this.isStale(existing, Date.now()))
210
+ return null;
211
+ return existing;
212
+ }
213
+ catch {
214
+ return null;
215
+ }
216
+ }
217
+ }
218
+ let registryInstance = null;
219
+ export function getRepoSupervisorRegistry() {
220
+ if (!registryInstance)
221
+ registryInstance = new RepoSupervisorRegistry();
222
+ return registryInstance;
223
+ }
224
+ /** Test hook: reset the singleton (e.g. after changing RUFLO_AI_BUDGET_DIR). */
225
+ export function resetRepoSupervisorRegistryForTests() {
226
+ registryInstance = null;
227
+ }
228
+ //# sourceMappingURL=repo-supervisor.js.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * ADR-091 Phase 1 -- Runtime Capabilities Detection
3
+ *
4
+ * Detects the host environment and exposes which execution primitives are
5
+ * available so that higher-level services can choose the right path:
6
+ * 1. claude-code-native -- full Claude Code tooling (loop, monitor, cron, teams)
7
+ * 2. mcp-fallback -- MCP transport active but native tools missing
8
+ * 3. ci-daemon -- headless / CI, use detached daemon
9
+ */
10
+ export interface RuntimeCapabilities {
11
+ loop: boolean;
12
+ monitor: boolean;
13
+ cron: boolean;
14
+ teams: boolean;
15
+ worktreeIsolation: boolean;
16
+ pushNotification: boolean;
17
+ }
18
+ export type RuntimeTier = 'claude-code-native' | 'mcp-fallback' | 'ci-daemon';
19
+ export declare function detectCapabilities(): RuntimeCapabilities;
20
+ export declare function getRuntimeTier(): RuntimeTier;
21
+ export declare function getCacheWarmDelay(providerCacheTtlSeconds?: number): number;
22
+ //# sourceMappingURL=runtime-capabilities.d.ts.map
@@ -0,0 +1,45 @@
1
+ /**
2
+ * ADR-091 Phase 1 -- Runtime Capabilities Detection
3
+ *
4
+ * Detects the host environment and exposes which execution primitives are
5
+ * available so that higher-level services can choose the right path:
6
+ * 1. claude-code-native -- full Claude Code tooling (loop, monitor, cron, teams)
7
+ * 2. mcp-fallback -- MCP transport active but native tools missing
8
+ * 3. ci-daemon -- headless / CI, use detached daemon
9
+ */
10
+ function isClaudeCodeNative() {
11
+ return !!(process.env.CLAUDE_CODE ||
12
+ process.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS);
13
+ }
14
+ function isMcpTransportActive() {
15
+ return (!process.stdin.isTTY &&
16
+ process.env.CLAUDE_FLOW_MCP_TRANSPORT === 'stdio');
17
+ }
18
+ function isCiOrHeadless() {
19
+ return !!(process.env.CI || process.env.CLAUDE_FLOW_HEADLESS);
20
+ }
21
+ export function detectCapabilities() {
22
+ const native = isClaudeCodeNative();
23
+ const teamsEnabled = !!process.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS;
24
+ return {
25
+ loop: native,
26
+ monitor: native,
27
+ cron: native,
28
+ teams: native && teamsEnabled,
29
+ worktreeIsolation: native,
30
+ pushNotification: native,
31
+ };
32
+ }
33
+ export function getRuntimeTier() {
34
+ if (isClaudeCodeNative())
35
+ return 'claude-code-native';
36
+ if (isMcpTransportActive())
37
+ return 'mcp-fallback';
38
+ if (isCiOrHeadless())
39
+ return 'ci-daemon';
40
+ return 'mcp-fallback';
41
+ }
42
+ export function getCacheWarmDelay(providerCacheTtlSeconds) {
43
+ return Math.min(270, (providerCacheTtlSeconds ?? 300) * 0.9);
44
+ }
45
+ //# sourceMappingURL=runtime-capabilities.js.map
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import { EventEmitter } from 'events';
14
14
  import { HeadlessWorkerExecutor } from './headless-worker-executor.js';
15
+ import { type SupervisorRecord } from './repo-supervisor.js';
15
16
  export type WorkerType = 'ultralearn' | 'optimize' | 'consolidate' | 'predict' | 'audit' | 'map' | 'preload' | 'deepdive' | 'document' | 'refactor' | 'benchmark' | 'testgaps' | 'backup' | 'harness';
16
17
  interface WorkerConfig {
17
18
  type: WorkerType;
@@ -45,6 +46,12 @@ interface DaemonStatus {
45
46
  startedAt?: Date;
46
47
  workers: Map<WorkerType, WorkerState>;
47
48
  config: DaemonConfig;
49
+ supervisor?: {
50
+ repositoryId: string;
51
+ isSupervisor: boolean;
52
+ record: SupervisorRecord | null;
53
+ activeLeases: number;
54
+ } | null;
48
55
  }
49
56
  export interface DaemonConfig {
50
57
  autoStart: boolean;
@@ -79,6 +86,8 @@ export declare class WorkerDaemon extends EventEmitter {
79
86
  private headlessAvailable;
80
87
  private headlessInitPromise;
81
88
  private originalConfig?;
89
+ private gitIdentity;
90
+ private lastSupervisorRenewalMs;
82
91
  constructor(projectRoot: string, config?: Partial<DaemonConfig>);
83
92
  /**
84
93
  * Initialize headless executor if Claude Code is available
@@ -264,6 +273,23 @@ export declare class WorkerDaemon extends EventEmitter {
264
273
  * service timers — leaving a zombie that reports stopped but never exits.
265
274
  */
266
275
  private selfShutdown;
276
+ /**
277
+ * #2661 root-fix — heartbeat this worktree's lease and attempt/renew
278
+ * repository-supervisor election. Best-effort: any failure here must
279
+ * never affect worker scheduling correctness (the budget ledger remains
280
+ * the hard invariant regardless of supervisor state) — a daemon that
281
+ * can't safely coordinate simply falls back to "not supervisor" and runs
282
+ * its cheap local-only workers, same as any other lease-only worktree.
283
+ */
284
+ private renewLeaseAndSupervisor;
285
+ /**
286
+ * Cheap read-only check: does THIS daemon currently hold repository
287
+ * supervisor status? Used to gate recurring headless (`claude --print`)
288
+ * execution — see repo-supervisor.ts's module doc comment for the full
289
+ * rationale. Never true when AI workers are disabled or the git identity
290
+ * couldn't be resolved (e.g. a non-git directory).
291
+ */
292
+ private isRepositorySupervisor;
267
293
  /**
268
294
  * Get daemon status
269
295
  */
@@ -22,6 +22,9 @@ import { HeadlessWorkerExecutor, isHeadlessWorker, } from './headless-worker-exe
22
22
  // quick_check-gated, so it's safe to call unconditionally on every tick.
23
23
  import { runDistillation, defaultMemoryDbPath } from './memory-distillation.js';
24
24
  import { backupMemoryDb } from './memory-backup.js';
25
+ import { resolveGitWorkspaceIdentity } from './git-workspace-identity.js';
26
+ import { getWorkspaceLeaseRegistry } from './workspace-lease.js';
27
+ import { getRepoSupervisorRegistry } from './repo-supervisor.js';
25
28
  // Default worker configurations with improved intervals (P0 fix: map 5min -> 15min)
26
29
  const DEFAULT_WORKERS = [
27
30
  { type: 'map', intervalMs: 15 * 60 * 1000, offsetMs: 0, priority: 'normal', description: 'Codebase mapping', enabled: true },
@@ -112,6 +115,11 @@ export class WorkerDaemon extends EventEmitter {
112
115
  // Preserve the original constructor config so we can detect explicit overrides
113
116
  // during state restoration (R1: constructor config takes priority over stale state)
114
117
  originalConfig;
118
+ // #2661 root-fix — resolved once (git identity doesn't change at runtime)
119
+ // and reused for lease heartbeats + supervisor election, both gated on
120
+ // aiWorkersEnabled since they only matter for the recurring AI schedule.
121
+ gitIdentity = null;
122
+ lastSupervisorRenewalMs = 0;
115
123
  constructor(projectRoot, config) {
116
124
  super();
117
125
  this.projectRoot = projectRoot;
@@ -739,6 +747,14 @@ export class WorkerDaemon extends EventEmitter {
739
747
  this.startedAt = new Date();
740
748
  this.writePidFile();
741
749
  this.emit('started', { pid: process.pid, startedAt: this.startedAt });
750
+ // #2661 root-fix — resolve repository identity and register/attempt
751
+ // election immediately at start, not just on the first 60s lifecycle
752
+ // tick, so `daemon status` reflects supervisor state right away. Only
753
+ // meaningful when AI workers are enabled (see field doc comment).
754
+ if (this.config.aiWorkersEnabled) {
755
+ this.gitIdentity = resolveGitWorkspaceIdentity(this.projectRoot);
756
+ void this.renewLeaseAndSupervisor();
757
+ }
742
758
  // Schedule all enabled workers
743
759
  for (const workerConfig of this.config.workers) {
744
760
  if (workerConfig.enabled) {
@@ -867,6 +883,19 @@ export class WorkerDaemon extends EventEmitter {
867
883
  }
868
884
  catch { /* best-effort */ }
869
885
  }
886
+ // #2661 root-fix — release this worktree's lease and, if held,
887
+ // supervisor status, so a sibling worktree's daemon can take over the
888
+ // schedule within its next tick instead of waiting out the 3-minute
889
+ // supervisor staleness window. Best-effort — a graceful release is an
890
+ // optimization; the staleness timeout is what actually bounds a crash.
891
+ if (this.config.aiWorkersEnabled && this.gitIdentity) {
892
+ const { repositoryId, worktreeRoot } = this.gitIdentity;
893
+ try {
894
+ await getRepoSupervisorRegistry().release(repositoryId, worktreeRoot);
895
+ await getWorkspaceLeaseRegistry().release(repositoryId, worktreeRoot);
896
+ }
897
+ catch { /* best-effort */ }
898
+ }
870
899
  this.running = false;
871
900
  this.removePidFile();
872
901
  this.saveState();
@@ -896,6 +925,13 @@ export class WorkerDaemon extends EventEmitter {
896
925
  const reason = this.lifecycleShutdownReason(Date.now());
897
926
  if (reason) {
898
927
  void this.selfShutdown(reason);
928
+ return;
929
+ }
930
+ // #2661 root-fix — renew this worktree's lease + supervisor status on
931
+ // the same cadence. Both windows (15min lease TTL, 3min supervisor
932
+ // staleness) comfortably outlive a single missed 60s tick.
933
+ if (this.config.aiWorkersEnabled) {
934
+ void this.renewLeaseAndSupervisor();
899
935
  }
900
936
  }, CHECK_INTERVAL_MS);
901
937
  if (typeof this.lifecycleTimer.unref === 'function') {
@@ -971,16 +1007,58 @@ export class WorkerDaemon extends EventEmitter {
971
1007
  catch { /* best-effort — we are exiting regardless */ }
972
1008
  process.exit(0);
973
1009
  }
1010
+ /**
1011
+ * #2661 root-fix — heartbeat this worktree's lease and attempt/renew
1012
+ * repository-supervisor election. Best-effort: any failure here must
1013
+ * never affect worker scheduling correctness (the budget ledger remains
1014
+ * the hard invariant regardless of supervisor state) — a daemon that
1015
+ * can't safely coordinate simply falls back to "not supervisor" and runs
1016
+ * its cheap local-only workers, same as any other lease-only worktree.
1017
+ */
1018
+ async renewLeaseAndSupervisor() {
1019
+ if (!this.gitIdentity)
1020
+ return;
1021
+ const { repositoryId, worktreeRoot } = this.gitIdentity;
1022
+ try {
1023
+ await getWorkspaceLeaseRegistry().heartbeat(repositoryId, worktreeRoot);
1024
+ await getRepoSupervisorRegistry().electOrRenew(repositoryId, worktreeRoot);
1025
+ this.lastSupervisorRenewalMs = Date.now();
1026
+ }
1027
+ catch { /* best-effort — see docstring */ }
1028
+ }
1029
+ /**
1030
+ * Cheap read-only check: does THIS daemon currently hold repository
1031
+ * supervisor status? Used to gate recurring headless (`claude --print`)
1032
+ * execution — see repo-supervisor.ts's module doc comment for the full
1033
+ * rationale. Never true when AI workers are disabled or the git identity
1034
+ * couldn't be resolved (e.g. a non-git directory).
1035
+ */
1036
+ isRepositorySupervisor() {
1037
+ if (!this.config.aiWorkersEnabled || !this.gitIdentity)
1038
+ return false;
1039
+ return getRepoSupervisorRegistry().isSupervisor(this.gitIdentity.repositoryId, this.gitIdentity.worktreeRoot);
1040
+ }
974
1041
  /**
975
1042
  * Get daemon status
976
1043
  */
977
1044
  getStatus() {
1045
+ let supervisor = null;
1046
+ if (this.config.aiWorkersEnabled && this.gitIdentity) {
1047
+ const { repositoryId, worktreeRoot } = this.gitIdentity;
1048
+ supervisor = {
1049
+ repositoryId,
1050
+ isSupervisor: getRepoSupervisorRegistry().isSupervisor(repositoryId, worktreeRoot),
1051
+ record: getRepoSupervisorRegistry().getRecord(repositoryId),
1052
+ activeLeases: getWorkspaceLeaseRegistry().listActive(repositoryId).length,
1053
+ };
1054
+ }
978
1055
  return {
979
1056
  running: this.running,
980
1057
  pid: process.pid,
981
1058
  startedAt: this.startedAt,
982
1059
  workers: new Map(this.workers),
983
1060
  config: this.config,
1061
+ supervisor,
984
1062
  };
985
1063
  }
986
1064
  /**
@@ -1038,7 +1116,7 @@ export class WorkerDaemon extends EventEmitter {
1038
1116
  /**
1039
1117
  * Execute a worker with timeout protection
1040
1118
  */
1041
- async executeWorker(workerConfig) {
1119
+ async executeWorker(workerConfig, opts) {
1042
1120
  const state = this.workers.get(workerConfig.type);
1043
1121
  const workerId = `${workerConfig.type}_${Date.now()}`;
1044
1122
  const startTime = Date.now();
@@ -1052,7 +1130,7 @@ export class WorkerDaemon extends EventEmitter {
1052
1130
  try {
1053
1131
  // Execute worker logic with timeout (P1 fix)
1054
1132
  // Pass cleanup callback to kill orphan child processes on timeout (#1117)
1055
- const output = await this.runWithTimeout(() => this.runWorkerLogic(workerConfig), this.config.workerTimeoutMs, `Worker ${workerConfig.type} timed out after ${this.config.workerTimeoutMs / 1000}s`, () => {
1133
+ const output = await this.runWithTimeout(() => this.runWorkerLogic(workerConfig, opts), this.config.workerTimeoutMs, `Worker ${workerConfig.type} timed out after ${this.config.workerTimeoutMs / 1000}s`, () => {
1056
1134
  // On timeout, cancel any headless execution to prevent orphan processes
1057
1135
  if (this.headlessExecutor) {
1058
1136
  this.headlessExecutor.cancelAll();
@@ -1148,12 +1226,21 @@ export class WorkerDaemon extends EventEmitter {
1148
1226
  /**
1149
1227
  * Run the actual worker logic
1150
1228
  */
1151
- async runWorkerLogic(workerConfig) {
1229
+ async runWorkerLogic(workerConfig, opts) {
1152
1230
  // Check if this is a headless worker type and headless execution is available.
1153
1231
  // #2661 — aiWorkersEnabled is re-checked here (not just at init) as
1154
1232
  // defence in depth: no code path may promote a worker to `claude --print`
1155
1233
  // without explicit consent.
1156
- if (this.config.aiWorkersEnabled && isHeadlessWorker(workerConfig.type) && this.headlessAvailable && this.headlessExecutor) {
1234
+ //
1235
+ // #2661 root-fix — the RECURRING schedule additionally requires this
1236
+ // daemon to be the elected repository supervisor (see repo-supervisor.ts):
1237
+ // ten worktree daemons of one repository must not each independently
1238
+ // decide "is it time to run audit" every tick. An explicit
1239
+ // `daemon trigger --headless` (opts.manualTrigger) is still honored
1240
+ // regardless of supervisor status — it's a one-off, user-initiated
1241
+ // action, still budget/dedup-gated the same as any other launch.
1242
+ const supervisorGateOk = opts?.manualTrigger === true || this.isRepositorySupervisor();
1243
+ if (this.config.aiWorkersEnabled && supervisorGateOk && isHeadlessWorker(workerConfig.type) && this.headlessAvailable && this.headlessExecutor) {
1157
1244
  try {
1158
1245
  this.log('info', `Running ${workerConfig.type} in headless mode (Claude Code AI)`);
1159
1246
  const result = await this.headlessExecutor.execute(workerConfig.type);
@@ -1671,7 +1758,10 @@ export class WorkerDaemon extends EventEmitter {
1671
1758
  // use headless correctly. Scheduled fires already wait long enough
1672
1759
  // (timer + offset) that this is a no-op for them.
1673
1760
  await this.headlessInitPromise;
1674
- return this.executeWorker(workerConfig);
1761
+ // #2661 root-fix — an explicit manual trigger bypasses the repository-
1762
+ // supervisor gate (still budget/dedup-gated) — see runWorkerLogic()'s
1763
+ // doc comment.
1764
+ return this.executeWorker(workerConfig, { manualTrigger: true });
1675
1765
  }
1676
1766
  /**
1677
1767
  * Enable/disable a worker
@@ -0,0 +1,55 @@
1
+ /**
2
+ * #2661 root-fix — worktree leases.
3
+ *
4
+ * Registers which worktrees of a repository are currently "alive" (have a
5
+ * running daemon actively heartbeating), independent of whether that
6
+ * worktree's daemon is the elected repository supervisor (see
7
+ * repo-supervisor.ts). A lease expires after 15 minutes without a heartbeat
8
+ * — a removed worktree, or a daemon that crashed without a graceful
9
+ * shutdown, becomes ineligible within one expiry window instead of lingering
10
+ * forever in the registry.
11
+ *
12
+ * The registry lives under the user's home directory (not the workspace) so
13
+ * it is visible to every worktree's daemon, keyed by repositoryId:
14
+ *
15
+ * ~/.claude-flow/leases/<repositoryId>.json
16
+ *
17
+ * This is deliberately a thin, single-purpose registry — repo-supervisor.ts
18
+ * is the piece that actually elects one process to own the recurring AI
19
+ * worker schedule; leases only answer "which worktrees are currently live"
20
+ * for status reporting and future supervisor-dispatched work.
21
+ */
22
+ export declare const LEASE_TTL_MS: number;
23
+ export interface LeaseRecord {
24
+ worktreeRoot: string;
25
+ pid: number;
26
+ registeredAt: number;
27
+ lastHeartbeat: number;
28
+ }
29
+ export declare class WorkspaceLeaseRegistry {
30
+ private readonly dir;
31
+ constructor(options?: {
32
+ baseDir?: string;
33
+ });
34
+ private fileFor;
35
+ private ensureDir;
36
+ private withLock;
37
+ private readFile;
38
+ private writeFile;
39
+ /** Register or renew this process's lease on a worktree. Best-effort. */
40
+ heartbeat(repositoryId: string, worktreeRoot: string): Promise<void>;
41
+ /** Release this worktree's lease on graceful shutdown. Best-effort. */
42
+ release(repositoryId: string, worktreeRoot: string): Promise<void>;
43
+ /**
44
+ * Active leases for a repository — expired (>15 min stale) or dead-PID
45
+ * entries are excluded, not just filtered at read time, so callers never
46
+ * see a worktree that's actually gone.
47
+ */
48
+ listActive(repositoryId: string): LeaseRecord[];
49
+ /** True when the given worktree currently holds a live (non-expired) lease. */
50
+ isLeaseActive(repositoryId: string, worktreeRoot: string): boolean;
51
+ }
52
+ export declare function getWorkspaceLeaseRegistry(): WorkspaceLeaseRegistry;
53
+ /** Test hook: reset the singleton (e.g. after changing RUFLO_AI_BUDGET_DIR). */
54
+ export declare function resetWorkspaceLeaseRegistryForTests(): void;
55
+ //# sourceMappingURL=workspace-lease.d.ts.map