@aigentic/claude-flow 3.7.0-alpha.69

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 (807) hide show
  1. package/.claude/agents/MIGRATION_SUMMARY.md +222 -0
  2. package/.claude/agents/analysis/analyze-code-quality.md +58 -0
  3. package/.claude/agents/analysis/code-analyzer.md +189 -0
  4. package/.claude/agents/analysis/code-review/analyze-code-quality.md +58 -0
  5. package/.claude/agents/architecture/arch-system-design.md +157 -0
  6. package/.claude/agents/architecture/system-design/arch-system-design.md +36 -0
  7. package/.claude/agents/base-template-generator.md +41 -0
  8. package/.claude/agents/browser/browser-agent.yaml +182 -0
  9. package/.claude/agents/consensus/byzantine-coordinator.md +43 -0
  10. package/.claude/agents/consensus/crdt-synchronizer.md +977 -0
  11. package/.claude/agents/consensus/gossip-coordinator.md +43 -0
  12. package/.claude/agents/consensus/performance-benchmarker.md +831 -0
  13. package/.claude/agents/consensus/quorum-manager.md +803 -0
  14. package/.claude/agents/consensus/raft-manager.md +43 -0
  15. package/.claude/agents/consensus/security-manager.md +602 -0
  16. package/.claude/agents/core/coder.md +255 -0
  17. package/.claude/agents/core/planner.md +152 -0
  18. package/.claude/agents/core/researcher.md +174 -0
  19. package/.claude/agents/core/reviewer.md +309 -0
  20. package/.claude/agents/core/tester.md +300 -0
  21. package/.claude/agents/custom/test-long-runner.md +43 -0
  22. package/.claude/agents/data/data-ml-model.md +445 -0
  23. package/.claude/agents/data/ml/data-ml-model.md +76 -0
  24. package/.claude/agents/database-specialist.md +9 -0
  25. package/.claude/agents/development/backend/dev-backend-api.md +29 -0
  26. package/.claude/agents/development/dev-backend-api.md +178 -0
  27. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +52 -0
  28. package/.claude/agents/devops/ops-cicd-github.md +165 -0
  29. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +63 -0
  30. package/.claude/agents/documentation/docs-api-openapi.md +355 -0
  31. package/.claude/agents/dual-mode/codex-coordinator.md +206 -0
  32. package/.claude/agents/dual-mode/codex-worker.md +190 -0
  33. package/.claude/agents/dual-mode/dual-orchestrator.md +253 -0
  34. package/.claude/agents/flow-nexus/app-store.md +88 -0
  35. package/.claude/agents/flow-nexus/authentication.md +69 -0
  36. package/.claude/agents/flow-nexus/challenges.md +81 -0
  37. package/.claude/agents/flow-nexus/neural-network.md +88 -0
  38. package/.claude/agents/flow-nexus/payments.md +83 -0
  39. package/.claude/agents/flow-nexus/sandbox.md +76 -0
  40. package/.claude/agents/flow-nexus/swarm.md +76 -0
  41. package/.claude/agents/flow-nexus/user-tools.md +96 -0
  42. package/.claude/agents/flow-nexus/workflow.md +84 -0
  43. package/.claude/agents/github/code-review-swarm.md +521 -0
  44. package/.claude/agents/github/github-modes.md +154 -0
  45. package/.claude/agents/github/issue-tracker.md +299 -0
  46. package/.claude/agents/github/multi-repo-swarm.md +525 -0
  47. package/.claude/agents/github/pr-manager.md +163 -0
  48. package/.claude/agents/github/project-board-sync.md +478 -0
  49. package/.claude/agents/github/release-manager.md +336 -0
  50. package/.claude/agents/github/release-swarm.md +551 -0
  51. package/.claude/agents/github/repo-architect.md +365 -0
  52. package/.claude/agents/github/swarm-issue.md +548 -0
  53. package/.claude/agents/github/swarm-pr.md +399 -0
  54. package/.claude/agents/github/sync-coordinator.md +423 -0
  55. package/.claude/agents/github/workflow-automation.md +605 -0
  56. package/.claude/agents/goal/agent.md +817 -0
  57. package/.claude/agents/goal/code-goal-planner.md +445 -0
  58. package/.claude/agents/goal/goal-planner.md +168 -0
  59. package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +129 -0
  60. package/.claude/agents/hive-mind/queen-coordinator.md +202 -0
  61. package/.claude/agents/hive-mind/scout-explorer.md +241 -0
  62. package/.claude/agents/hive-mind/swarm-memory-manager.md +192 -0
  63. package/.claude/agents/hive-mind/worker-specialist.md +216 -0
  64. package/.claude/agents/neural/safla-neural.md +74 -0
  65. package/.claude/agents/optimization/benchmark-suite.md +663 -0
  66. package/.claude/agents/optimization/load-balancer.md +429 -0
  67. package/.claude/agents/optimization/performance-monitor.md +670 -0
  68. package/.claude/agents/optimization/resource-allocator.md +672 -0
  69. package/.claude/agents/optimization/topology-optimizer.md +806 -0
  70. package/.claude/agents/payments/agentic-payments.md +126 -0
  71. package/.claude/agents/project-coordinator.md +8 -0
  72. package/.claude/agents/python-specialist.md +9 -0
  73. package/.claude/agents/reasoning/agent.md +817 -0
  74. package/.claude/agents/reasoning/goal-planner.md +73 -0
  75. package/.claude/agents/security-auditor.md +9 -0
  76. package/.claude/agents/sona/sona-learning-optimizer.md +65 -0
  77. package/.claude/agents/sparc/architecture.md +453 -0
  78. package/.claude/agents/sparc/pseudocode.md +299 -0
  79. package/.claude/agents/sparc/refinement.md +504 -0
  80. package/.claude/agents/sparc/specification.md +258 -0
  81. package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +88 -0
  82. package/.claude/agents/specialized/spec-mobile-react-native.md +227 -0
  83. package/.claude/agents/sublinear/consensus-coordinator.md +338 -0
  84. package/.claude/agents/sublinear/matrix-optimizer.md +185 -0
  85. package/.claude/agents/sublinear/pagerank-analyzer.md +299 -0
  86. package/.claude/agents/sublinear/performance-optimizer.md +368 -0
  87. package/.claude/agents/sublinear/trading-predictor.md +246 -0
  88. package/.claude/agents/swarm/adaptive-coordinator.md +364 -0
  89. package/.claude/agents/swarm/hierarchical-coordinator.md +300 -0
  90. package/.claude/agents/swarm/mesh-coordinator.md +363 -0
  91. package/.claude/agents/templates/automation-smart-agent.md +185 -0
  92. package/.claude/agents/templates/base-template-generator.md +289 -0
  93. package/.claude/agents/templates/coordinator-swarm-init.md +83 -0
  94. package/.claude/agents/templates/github-pr-manager.md +155 -0
  95. package/.claude/agents/templates/implementer-sparc-coder.md +243 -0
  96. package/.claude/agents/templates/memory-coordinator.md +163 -0
  97. package/.claude/agents/templates/migration-plan.md +724 -0
  98. package/.claude/agents/templates/orchestrator-task.md +120 -0
  99. package/.claude/agents/templates/performance-analyzer.md +179 -0
  100. package/.claude/agents/templates/sparc-coordinator.md +163 -0
  101. package/.claude/agents/testing/production-validator.md +373 -0
  102. package/.claude/agents/testing/tdd-london-swarm.md +222 -0
  103. package/.claude/agents/testing/unit/tdd-london-swarm.md +222 -0
  104. package/.claude/agents/testing/validation/production-validator.md +373 -0
  105. package/.claude/agents/typescript-specialist.md +9 -0
  106. package/.claude/agents/v3/adr-architect.md +184 -0
  107. package/.claude/agents/v3/aidefence-guardian.md +282 -0
  108. package/.claude/agents/v3/claims-authorizer.md +208 -0
  109. package/.claude/agents/v3/collective-intelligence-coordinator.md +993 -0
  110. package/.claude/agents/v3/database-specialist.md +9 -0
  111. package/.claude/agents/v3/ddd-domain-expert.md +220 -0
  112. package/.claude/agents/v3/injection-analyst.md +236 -0
  113. package/.claude/agents/v3/memory-specialist.md +995 -0
  114. package/.claude/agents/v3/performance-engineer.md +1233 -0
  115. package/.claude/agents/v3/pii-detector.md +151 -0
  116. package/.claude/agents/v3/project-coordinator.md +8 -0
  117. package/.claude/agents/v3/python-specialist.md +9 -0
  118. package/.claude/agents/v3/reasoningbank-learner.md +213 -0
  119. package/.claude/agents/v3/security-architect-aidefence.md +410 -0
  120. package/.claude/agents/v3/security-architect.md +867 -0
  121. package/.claude/agents/v3/security-auditor.md +771 -0
  122. package/.claude/agents/v3/sparc-orchestrator.md +182 -0
  123. package/.claude/agents/v3/swarm-memory-manager.md +157 -0
  124. package/.claude/agents/v3/test-architect.md +9 -0
  125. package/.claude/agents/v3/typescript-specialist.md +9 -0
  126. package/.claude/agents/v3/v3-integration-architect.md +312 -0
  127. package/.claude/agents/v3/v3-memory-specialist.md +281 -0
  128. package/.claude/agents/v3/v3-performance-engineer.md +363 -0
  129. package/.claude/agents/v3/v3-queen-coordinator.md +63 -0
  130. package/.claude/agents/v3/v3-security-architect.md +140 -0
  131. package/.claude/checkpoints/1767754460.json +8 -0
  132. package/.claude/commands/agents/README.md +10 -0
  133. package/.claude/commands/agents/agent-capabilities.md +21 -0
  134. package/.claude/commands/agents/agent-coordination.md +28 -0
  135. package/.claude/commands/agents/agent-spawning.md +28 -0
  136. package/.claude/commands/agents/agent-types.md +26 -0
  137. package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +54 -0
  138. package/.claude/commands/analysis/README.md +9 -0
  139. package/.claude/commands/analysis/bottleneck-detect.md +162 -0
  140. package/.claude/commands/analysis/performance-bottlenecks.md +59 -0
  141. package/.claude/commands/analysis/performance-report.md +25 -0
  142. package/.claude/commands/analysis/token-efficiency.md +45 -0
  143. package/.claude/commands/analysis/token-usage.md +25 -0
  144. package/.claude/commands/automation/README.md +9 -0
  145. package/.claude/commands/automation/auto-agent.md +122 -0
  146. package/.claude/commands/automation/self-healing.md +106 -0
  147. package/.claude/commands/automation/session-memory.md +90 -0
  148. package/.claude/commands/automation/smart-agents.md +73 -0
  149. package/.claude/commands/automation/smart-spawn.md +25 -0
  150. package/.claude/commands/automation/workflow-select.md +25 -0
  151. package/.claude/commands/claude-flow-help.md +103 -0
  152. package/.claude/commands/claude-flow-memory.md +107 -0
  153. package/.claude/commands/claude-flow-swarm.md +205 -0
  154. package/.claude/commands/coordination/README.md +9 -0
  155. package/.claude/commands/coordination/agent-spawn.md +25 -0
  156. package/.claude/commands/coordination/init.md +44 -0
  157. package/.claude/commands/coordination/orchestrate.md +43 -0
  158. package/.claude/commands/coordination/spawn.md +45 -0
  159. package/.claude/commands/coordination/swarm-init.md +85 -0
  160. package/.claude/commands/coordination/task-orchestrate.md +25 -0
  161. package/.claude/commands/flow-nexus/app-store.md +124 -0
  162. package/.claude/commands/flow-nexus/challenges.md +120 -0
  163. package/.claude/commands/flow-nexus/login-registration.md +65 -0
  164. package/.claude/commands/flow-nexus/neural-network.md +134 -0
  165. package/.claude/commands/flow-nexus/payments.md +116 -0
  166. package/.claude/commands/flow-nexus/sandbox.md +83 -0
  167. package/.claude/commands/flow-nexus/swarm.md +87 -0
  168. package/.claude/commands/flow-nexus/user-tools.md +152 -0
  169. package/.claude/commands/flow-nexus/workflow.md +115 -0
  170. package/.claude/commands/github/README.md +11 -0
  171. package/.claude/commands/github/code-review-swarm.md +514 -0
  172. package/.claude/commands/github/code-review.md +25 -0
  173. package/.claude/commands/github/github-modes.md +147 -0
  174. package/.claude/commands/github/github-swarm.md +121 -0
  175. package/.claude/commands/github/issue-tracker.md +292 -0
  176. package/.claude/commands/github/issue-triage.md +25 -0
  177. package/.claude/commands/github/multi-repo-swarm.md +519 -0
  178. package/.claude/commands/github/pr-enhance.md +26 -0
  179. package/.claude/commands/github/pr-manager.md +170 -0
  180. package/.claude/commands/github/project-board-sync.md +471 -0
  181. package/.claude/commands/github/release-manager.md +338 -0
  182. package/.claude/commands/github/release-swarm.md +544 -0
  183. package/.claude/commands/github/repo-analyze.md +25 -0
  184. package/.claude/commands/github/repo-architect.md +367 -0
  185. package/.claude/commands/github/swarm-issue.md +482 -0
  186. package/.claude/commands/github/swarm-pr.md +285 -0
  187. package/.claude/commands/github/sync-coordinator.md +301 -0
  188. package/.claude/commands/github/workflow-automation.md +442 -0
  189. package/.claude/commands/hive-mind/README.md +17 -0
  190. package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -0
  191. package/.claude/commands/hive-mind/hive-mind-init.md +18 -0
  192. package/.claude/commands/hive-mind/hive-mind-memory.md +8 -0
  193. package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -0
  194. package/.claude/commands/hive-mind/hive-mind-resume.md +8 -0
  195. package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -0
  196. package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -0
  197. package/.claude/commands/hive-mind/hive-mind-status.md +8 -0
  198. package/.claude/commands/hive-mind/hive-mind-stop.md +8 -0
  199. package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -0
  200. package/.claude/commands/hive-mind/hive-mind.md +27 -0
  201. package/.claude/commands/hooks/README.md +11 -0
  202. package/.claude/commands/hooks/overview.md +58 -0
  203. package/.claude/commands/hooks/post-edit.md +117 -0
  204. package/.claude/commands/hooks/post-task.md +112 -0
  205. package/.claude/commands/hooks/pre-edit.md +113 -0
  206. package/.claude/commands/hooks/pre-task.md +111 -0
  207. package/.claude/commands/hooks/session-end.md +118 -0
  208. package/.claude/commands/hooks/setup.md +103 -0
  209. package/.claude/commands/memory/README.md +9 -0
  210. package/.claude/commands/memory/memory-persist.md +25 -0
  211. package/.claude/commands/memory/memory-search.md +25 -0
  212. package/.claude/commands/memory/memory-usage.md +25 -0
  213. package/.claude/commands/memory/neural.md +47 -0
  214. package/.claude/commands/monitoring/README.md +9 -0
  215. package/.claude/commands/monitoring/agent-metrics.md +25 -0
  216. package/.claude/commands/monitoring/agents.md +44 -0
  217. package/.claude/commands/monitoring/real-time-view.md +25 -0
  218. package/.claude/commands/monitoring/status.md +46 -0
  219. package/.claude/commands/monitoring/swarm-monitor.md +25 -0
  220. package/.claude/commands/optimization/README.md +9 -0
  221. package/.claude/commands/optimization/auto-topology.md +62 -0
  222. package/.claude/commands/optimization/cache-manage.md +25 -0
  223. package/.claude/commands/optimization/parallel-execute.md +25 -0
  224. package/.claude/commands/optimization/parallel-execution.md +50 -0
  225. package/.claude/commands/optimization/topology-optimize.md +25 -0
  226. package/.claude/commands/pair/README.md +261 -0
  227. package/.claude/commands/pair/commands.md +546 -0
  228. package/.claude/commands/pair/config.md +510 -0
  229. package/.claude/commands/pair/examples.md +512 -0
  230. package/.claude/commands/pair/modes.md +348 -0
  231. package/.claude/commands/pair/session.md +407 -0
  232. package/.claude/commands/pair/start.md +209 -0
  233. package/.claude/commands/sparc/analyzer.md +52 -0
  234. package/.claude/commands/sparc/architect.md +53 -0
  235. package/.claude/commands/sparc/ask.md +97 -0
  236. package/.claude/commands/sparc/batch-executor.md +54 -0
  237. package/.claude/commands/sparc/code.md +89 -0
  238. package/.claude/commands/sparc/coder.md +54 -0
  239. package/.claude/commands/sparc/debug.md +83 -0
  240. package/.claude/commands/sparc/debugger.md +54 -0
  241. package/.claude/commands/sparc/designer.md +53 -0
  242. package/.claude/commands/sparc/devops.md +109 -0
  243. package/.claude/commands/sparc/docs-writer.md +80 -0
  244. package/.claude/commands/sparc/documenter.md +54 -0
  245. package/.claude/commands/sparc/innovator.md +54 -0
  246. package/.claude/commands/sparc/integration.md +83 -0
  247. package/.claude/commands/sparc/mcp.md +117 -0
  248. package/.claude/commands/sparc/memory-manager.md +54 -0
  249. package/.claude/commands/sparc/optimizer.md +54 -0
  250. package/.claude/commands/sparc/orchestrator.md +132 -0
  251. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -0
  252. package/.claude/commands/sparc/refinement-optimization-mode.md +83 -0
  253. package/.claude/commands/sparc/researcher.md +54 -0
  254. package/.claude/commands/sparc/reviewer.md +54 -0
  255. package/.claude/commands/sparc/security-review.md +80 -0
  256. package/.claude/commands/sparc/sparc-modes.md +174 -0
  257. package/.claude/commands/sparc/sparc.md +111 -0
  258. package/.claude/commands/sparc/spec-pseudocode.md +80 -0
  259. package/.claude/commands/sparc/supabase-admin.md +348 -0
  260. package/.claude/commands/sparc/swarm-coordinator.md +54 -0
  261. package/.claude/commands/sparc/tdd.md +54 -0
  262. package/.claude/commands/sparc/tester.md +54 -0
  263. package/.claude/commands/sparc/tutorial.md +79 -0
  264. package/.claude/commands/sparc/workflow-manager.md +54 -0
  265. package/.claude/commands/sparc.md +166 -0
  266. package/.claude/commands/stream-chain/pipeline.md +121 -0
  267. package/.claude/commands/stream-chain/run.md +70 -0
  268. package/.claude/commands/swarm/README.md +15 -0
  269. package/.claude/commands/swarm/analysis.md +95 -0
  270. package/.claude/commands/swarm/development.md +96 -0
  271. package/.claude/commands/swarm/examples.md +168 -0
  272. package/.claude/commands/swarm/maintenance.md +102 -0
  273. package/.claude/commands/swarm/optimization.md +117 -0
  274. package/.claude/commands/swarm/research.md +136 -0
  275. package/.claude/commands/swarm/swarm-analysis.md +8 -0
  276. package/.claude/commands/swarm/swarm-background.md +8 -0
  277. package/.claude/commands/swarm/swarm-init.md +19 -0
  278. package/.claude/commands/swarm/swarm-modes.md +8 -0
  279. package/.claude/commands/swarm/swarm-monitor.md +8 -0
  280. package/.claude/commands/swarm/swarm-spawn.md +19 -0
  281. package/.claude/commands/swarm/swarm-status.md +8 -0
  282. package/.claude/commands/swarm/swarm-strategies.md +8 -0
  283. package/.claude/commands/swarm/swarm.md +27 -0
  284. package/.claude/commands/swarm/testing.md +131 -0
  285. package/.claude/commands/training/README.md +9 -0
  286. package/.claude/commands/training/model-update.md +25 -0
  287. package/.claude/commands/training/neural-patterns.md +74 -0
  288. package/.claude/commands/training/neural-train.md +25 -0
  289. package/.claude/commands/training/pattern-learn.md +25 -0
  290. package/.claude/commands/training/specialization.md +63 -0
  291. package/.claude/commands/truth/start.md +143 -0
  292. package/.claude/commands/verify/check.md +50 -0
  293. package/.claude/commands/verify/start.md +128 -0
  294. package/.claude/commands/workflows/README.md +9 -0
  295. package/.claude/commands/workflows/development.md +78 -0
  296. package/.claude/commands/workflows/research.md +63 -0
  297. package/.claude/commands/workflows/workflow-create.md +25 -0
  298. package/.claude/commands/workflows/workflow-execute.md +25 -0
  299. package/.claude/commands/workflows/workflow-export.md +25 -0
  300. package/.claude/config/v3-dependency-optimization.json +266 -0
  301. package/.claude/config/v3-performance-targets.json +251 -0
  302. package/.claude/helpers/README.md +97 -0
  303. package/.claude/helpers/adr-compliance.sh +186 -0
  304. package/.claude/helpers/aggressive-microcompact.mjs +36 -0
  305. package/.claude/helpers/auto-commit.sh +178 -0
  306. package/.claude/helpers/auto-memory-hook.mjs +564 -0
  307. package/.claude/helpers/checkpoint-manager.sh +251 -0
  308. package/.claude/helpers/context-persistence-hook.mjs +1979 -0
  309. package/.claude/helpers/daemon-manager.sh +252 -0
  310. package/.claude/helpers/ddd-tracker.sh +144 -0
  311. package/.claude/helpers/github-safe.js +106 -0
  312. package/.claude/helpers/github-setup.sh +28 -0
  313. package/.claude/helpers/guidance-hook.sh +13 -0
  314. package/.claude/helpers/guidance-hooks.sh +102 -0
  315. package/.claude/helpers/health-monitor.sh +108 -0
  316. package/.claude/helpers/hook-handler.cjs +269 -0
  317. package/.claude/helpers/intelligence.cjs +230 -0
  318. package/.claude/helpers/learning-hooks.sh +329 -0
  319. package/.claude/helpers/learning-optimizer.sh +127 -0
  320. package/.claude/helpers/learning-service.mjs +1144 -0
  321. package/.claude/helpers/memory.cjs +84 -0
  322. package/.claude/helpers/memory.js +83 -0
  323. package/.claude/helpers/metrics-db.mjs +488 -0
  324. package/.claude/helpers/patch-aggressive-prune.mjs +184 -0
  325. package/.claude/helpers/pattern-consolidator.sh +86 -0
  326. package/.claude/helpers/perf-worker.sh +160 -0
  327. package/.claude/helpers/post-commit +16 -0
  328. package/.claude/helpers/pre-commit +26 -0
  329. package/.claude/helpers/quick-start.sh +19 -0
  330. package/.claude/helpers/router.cjs +62 -0
  331. package/.claude/helpers/router.js +66 -0
  332. package/.claude/helpers/security-scanner.sh +127 -0
  333. package/.claude/helpers/session.cjs +125 -0
  334. package/.claude/helpers/session.js +135 -0
  335. package/.claude/helpers/setup-mcp.sh +18 -0
  336. package/.claude/helpers/standard-checkpoint-hooks.sh +189 -0
  337. package/.claude/helpers/statusline-hook.sh +21 -0
  338. package/.claude/helpers/statusline.cjs +878 -0
  339. package/.claude/helpers/statusline.js +352 -0
  340. package/.claude/helpers/swarm-comms.sh +353 -0
  341. package/.claude/helpers/swarm-hooks.sh +761 -0
  342. package/.claude/helpers/swarm-monitor.sh +211 -0
  343. package/.claude/helpers/sync-v3-metrics.sh +245 -0
  344. package/.claude/helpers/update-v3-progress.sh +166 -0
  345. package/.claude/helpers/v3-quick-status.sh +58 -0
  346. package/.claude/helpers/v3.sh +111 -0
  347. package/.claude/helpers/validate-v3-config.sh +216 -0
  348. package/.claude/helpers/worker-manager.sh +170 -0
  349. package/.claude/mcp.json +13 -0
  350. package/.claude/scheduled_tasks.lock +1 -0
  351. package/.claude/settings.json +285 -0
  352. package/.claude/settings.json.bak +526 -0
  353. package/.claude/skills/agentdb-advanced/SKILL.md +550 -0
  354. package/.claude/skills/agentdb-learning/SKILL.md +545 -0
  355. package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -0
  356. package/.claude/skills/agentdb-optimization/SKILL.md +509 -0
  357. package/.claude/skills/agentdb-vector-search/SKILL.md +339 -0
  358. package/.claude/skills/agentic-jujutsu/SKILL.md +645 -0
  359. package/.claude/skills/browser/SKILL.md +204 -0
  360. package/.claude/skills/dual-mode/README.md +71 -0
  361. package/.claude/skills/dual-mode/dual-collect.md +103 -0
  362. package/.claude/skills/dual-mode/dual-coordinate.md +85 -0
  363. package/.claude/skills/dual-mode/dual-spawn.md +81 -0
  364. package/.claude/skills/flow-nexus-neural/SKILL.md +727 -0
  365. package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -0
  366. package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -0
  367. package/.claude/skills/github-code-review/SKILL.md +1125 -0
  368. package/.claude/skills/github-multi-repo/SKILL.md +862 -0
  369. package/.claude/skills/github-project-management/SKILL.md +1263 -0
  370. package/.claude/skills/github-release-management/SKILL.md +1064 -0
  371. package/.claude/skills/github-workflow-automation/SKILL.md +1047 -0
  372. package/.claude/skills/hive-mind-advanced/SKILL.md +709 -0
  373. package/.claude/skills/hooks-automation/SKILL.md +1201 -0
  374. package/.claude/skills/pair-programming/SKILL.md +1202 -0
  375. package/.claude/skills/performance-analysis/SKILL.md +560 -0
  376. package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -0
  377. package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -0
  378. package/.claude/skills/skill-builder/SKILL.md +910 -0
  379. package/.claude/skills/sparc-methodology/SKILL.md +1106 -0
  380. package/.claude/skills/stream-chain/SKILL.md +560 -0
  381. package/.claude/skills/swarm-advanced/SKILL.md +970 -0
  382. package/.claude/skills/swarm-orchestration/SKILL.md +179 -0
  383. package/.claude/skills/v3-cli-modernization/SKILL.md +872 -0
  384. package/.claude/skills/v3-core-implementation/SKILL.md +797 -0
  385. package/.claude/skills/v3-ddd-architecture/SKILL.md +442 -0
  386. package/.claude/skills/v3-integration-deep/SKILL.md +241 -0
  387. package/.claude/skills/v3-mcp-optimization/SKILL.md +777 -0
  388. package/.claude/skills/v3-memory-unification/SKILL.md +174 -0
  389. package/.claude/skills/v3-performance-optimization/SKILL.md +390 -0
  390. package/.claude/skills/v3-security-overhaul/SKILL.md +82 -0
  391. package/.claude/skills/v3-swarm-coordination/SKILL.md +340 -0
  392. package/.claude/skills/verification-quality/SKILL.md +691 -0
  393. package/.claude/skills/worker-benchmarks/SKILL.md +129 -0
  394. package/.claude/skills/worker-integration/SKILL.md +147 -0
  395. package/.claude/statusline-command.sh +176 -0
  396. package/.claude/statusline.mjs +109 -0
  397. package/.claude/statusline.sh +431 -0
  398. package/.claude-plugin/README.md +720 -0
  399. package/.claude-plugin/docs/INSTALLATION.md +261 -0
  400. package/.claude-plugin/docs/PLUGIN_SUMMARY.md +361 -0
  401. package/.claude-plugin/docs/QUICKSTART.md +361 -0
  402. package/.claude-plugin/docs/STRUCTURE.md +128 -0
  403. package/.claude-plugin/hooks/hooks.json +75 -0
  404. package/.claude-plugin/marketplace.json +170 -0
  405. package/.claude-plugin/plugin.json +71 -0
  406. package/.claude-plugin/scripts/install.sh +234 -0
  407. package/.claude-plugin/scripts/ruflo-hook.sh +33 -0
  408. package/.claude-plugin/scripts/uninstall.sh +36 -0
  409. package/.claude-plugin/scripts/verify.sh +108 -0
  410. package/LICENSE +21 -0
  411. package/README.md +410 -0
  412. package/bin/cli.js +11 -0
  413. package/bin/npx-repair.js +7 -0
  414. package/bin/npx-safe-launch.js +9 -0
  415. package/package.json +159 -0
  416. package/v3/@claude-flow/cli/README.md +410 -0
  417. package/v3/@claude-flow/cli/bin/cli.js +233 -0
  418. package/v3/@claude-flow/cli/bin/mcp-server.js +224 -0
  419. package/v3/@claude-flow/cli/bin/preinstall.cjs +2 -0
  420. package/v3/@claude-flow/cli/dist/src/appliance/gguf-engine.d.ts +91 -0
  421. package/v3/@claude-flow/cli/dist/src/appliance/gguf-engine.js +425 -0
  422. package/v3/@claude-flow/cli/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
  423. package/v3/@claude-flow/cli/dist/src/appliance/ruvllm-bridge.js +292 -0
  424. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-builder.d.ts +44 -0
  425. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-builder.js +329 -0
  426. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-distribution.d.ts +97 -0
  427. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-distribution.js +370 -0
  428. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-format.d.ts +111 -0
  429. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-format.js +393 -0
  430. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-runner.d.ts +69 -0
  431. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-runner.js +237 -0
  432. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-signing.d.ts +123 -0
  433. package/v3/@claude-flow/cli/dist/src/appliance/rvfa-signing.js +347 -0
  434. package/v3/@claude-flow/cli/dist/src/autopilot-state.d.ts +77 -0
  435. package/v3/@claude-flow/cli/dist/src/autopilot-state.js +271 -0
  436. package/v3/@claude-flow/cli/dist/src/benchmarks/pretrain/index.d.ts +58 -0
  437. package/v3/@claude-flow/cli/dist/src/benchmarks/pretrain/index.js +404 -0
  438. package/v3/@claude-flow/cli/dist/src/commands/agent-wasm.d.ts +14 -0
  439. package/v3/@claude-flow/cli/dist/src/commands/agent-wasm.js +333 -0
  440. package/v3/@claude-flow/cli/dist/src/commands/agent.d.ts +8 -0
  441. package/v3/@claude-flow/cli/dist/src/commands/agent.js +927 -0
  442. package/v3/@claude-flow/cli/dist/src/commands/analyze.d.ts +19 -0
  443. package/v3/@claude-flow/cli/dist/src/commands/analyze.js +2048 -0
  444. package/v3/@claude-flow/cli/dist/src/commands/appliance-advanced.d.ts +9 -0
  445. package/v3/@claude-flow/cli/dist/src/commands/appliance-advanced.js +215 -0
  446. package/v3/@claude-flow/cli/dist/src/commands/appliance.d.ts +8 -0
  447. package/v3/@claude-flow/cli/dist/src/commands/appliance.js +404 -0
  448. package/v3/@claude-flow/cli/dist/src/commands/autopilot.d.ts +15 -0
  449. package/v3/@claude-flow/cli/dist/src/commands/autopilot.js +362 -0
  450. package/v3/@claude-flow/cli/dist/src/commands/benchmark.d.ts +10 -0
  451. package/v3/@claude-flow/cli/dist/src/commands/benchmark.js +460 -0
  452. package/v3/@claude-flow/cli/dist/src/commands/claims.d.ts +10 -0
  453. package/v3/@claude-flow/cli/dist/src/commands/claims.js +620 -0
  454. package/v3/@claude-flow/cli/dist/src/commands/cleanup.d.ts +13 -0
  455. package/v3/@claude-flow/cli/dist/src/commands/cleanup.js +250 -0
  456. package/v3/@claude-flow/cli/dist/src/commands/completions.d.ts +10 -0
  457. package/v3/@claude-flow/cli/dist/src/commands/completions.js +539 -0
  458. package/v3/@claude-flow/cli/dist/src/commands/config.d.ts +8 -0
  459. package/v3/@claude-flow/cli/dist/src/commands/config.js +430 -0
  460. package/v3/@claude-flow/cli/dist/src/commands/daemon.d.ts +28 -0
  461. package/v3/@claude-flow/cli/dist/src/commands/daemon.js +1093 -0
  462. package/v3/@claude-flow/cli/dist/src/commands/deployment.d.ts +10 -0
  463. package/v3/@claude-flow/cli/dist/src/commands/deployment.js +672 -0
  464. package/v3/@claude-flow/cli/dist/src/commands/doctor.d.ts +10 -0
  465. package/v3/@claude-flow/cli/dist/src/commands/doctor.js +885 -0
  466. package/v3/@claude-flow/cli/dist/src/commands/embeddings.d.ts +18 -0
  467. package/v3/@claude-flow/cli/dist/src/commands/embeddings.js +1623 -0
  468. package/v3/@claude-flow/cli/dist/src/commands/guidance.d.ts +8 -0
  469. package/v3/@claude-flow/cli/dist/src/commands/guidance.js +556 -0
  470. package/v3/@claude-flow/cli/dist/src/commands/hive-mind.d.ts +11 -0
  471. package/v3/@claude-flow/cli/dist/src/commands/hive-mind.js +1297 -0
  472. package/v3/@claude-flow/cli/dist/src/commands/hooks.d.ts +8 -0
  473. package/v3/@claude-flow/cli/dist/src/commands/hooks.js +4499 -0
  474. package/v3/@claude-flow/cli/dist/src/commands/index.d.ts +118 -0
  475. package/v3/@claude-flow/cli/dist/src/commands/index.js +344 -0
  476. package/v3/@claude-flow/cli/dist/src/commands/init.d.ts +8 -0
  477. package/v3/@claude-flow/cli/dist/src/commands/init.js +997 -0
  478. package/v3/@claude-flow/cli/dist/src/commands/issues.d.ts +21 -0
  479. package/v3/@claude-flow/cli/dist/src/commands/issues.js +567 -0
  480. package/v3/@claude-flow/cli/dist/src/commands/mcp.d.ts +11 -0
  481. package/v3/@claude-flow/cli/dist/src/commands/mcp.js +718 -0
  482. package/v3/@claude-flow/cli/dist/src/commands/memory.d.ts +8 -0
  483. package/v3/@claude-flow/cli/dist/src/commands/memory.js +1456 -0
  484. package/v3/@claude-flow/cli/dist/src/commands/migrate.d.ts +8 -0
  485. package/v3/@claude-flow/cli/dist/src/commands/migrate.js +742 -0
  486. package/v3/@claude-flow/cli/dist/src/commands/neural.d.ts +10 -0
  487. package/v3/@claude-flow/cli/dist/src/commands/neural.js +1531 -0
  488. package/v3/@claude-flow/cli/dist/src/commands/performance.d.ts +10 -0
  489. package/v3/@claude-flow/cli/dist/src/commands/performance.js +583 -0
  490. package/v3/@claude-flow/cli/dist/src/commands/plugins.d.ts +11 -0
  491. package/v3/@claude-flow/cli/dist/src/commands/plugins.js +826 -0
  492. package/v3/@claude-flow/cli/dist/src/commands/process.d.ts +10 -0
  493. package/v3/@claude-flow/cli/dist/src/commands/process.js +694 -0
  494. package/v3/@claude-flow/cli/dist/src/commands/progress.d.ts +11 -0
  495. package/v3/@claude-flow/cli/dist/src/commands/progress.js +259 -0
  496. package/v3/@claude-flow/cli/dist/src/commands/providers.d.ts +10 -0
  497. package/v3/@claude-flow/cli/dist/src/commands/providers.js +502 -0
  498. package/v3/@claude-flow/cli/dist/src/commands/route.d.ts +16 -0
  499. package/v3/@claude-flow/cli/dist/src/commands/route.js +813 -0
  500. package/v3/@claude-flow/cli/dist/src/commands/ruvector/backup.d.ts +11 -0
  501. package/v3/@claude-flow/cli/dist/src/commands/ruvector/backup.js +747 -0
  502. package/v3/@claude-flow/cli/dist/src/commands/ruvector/benchmark.d.ts +11 -0
  503. package/v3/@claude-flow/cli/dist/src/commands/ruvector/benchmark.js +490 -0
  504. package/v3/@claude-flow/cli/dist/src/commands/ruvector/import.d.ts +18 -0
  505. package/v3/@claude-flow/cli/dist/src/commands/ruvector/import.js +373 -0
  506. package/v3/@claude-flow/cli/dist/src/commands/ruvector/index.d.ts +29 -0
  507. package/v3/@claude-flow/cli/dist/src/commands/ruvector/index.js +129 -0
  508. package/v3/@claude-flow/cli/dist/src/commands/ruvector/init.d.ts +11 -0
  509. package/v3/@claude-flow/cli/dist/src/commands/ruvector/init.js +467 -0
  510. package/v3/@claude-flow/cli/dist/src/commands/ruvector/migrate.d.ts +11 -0
  511. package/v3/@claude-flow/cli/dist/src/commands/ruvector/migrate.js +498 -0
  512. package/v3/@claude-flow/cli/dist/src/commands/ruvector/optimize.d.ts +11 -0
  513. package/v3/@claude-flow/cli/dist/src/commands/ruvector/optimize.js +505 -0
  514. package/v3/@claude-flow/cli/dist/src/commands/ruvector/pg-utils.d.ts +14 -0
  515. package/v3/@claude-flow/cli/dist/src/commands/ruvector/pg-utils.js +41 -0
  516. package/v3/@claude-flow/cli/dist/src/commands/ruvector/setup.d.ts +18 -0
  517. package/v3/@claude-flow/cli/dist/src/commands/ruvector/setup.js +765 -0
  518. package/v3/@claude-flow/cli/dist/src/commands/ruvector/status.d.ts +11 -0
  519. package/v3/@claude-flow/cli/dist/src/commands/ruvector/status.js +479 -0
  520. package/v3/@claude-flow/cli/dist/src/commands/security.d.ts +10 -0
  521. package/v3/@claude-flow/cli/dist/src/commands/security.js +920 -0
  522. package/v3/@claude-flow/cli/dist/src/commands/session.d.ts +8 -0
  523. package/v3/@claude-flow/cli/dist/src/commands/session.js +757 -0
  524. package/v3/@claude-flow/cli/dist/src/commands/start.d.ts +8 -0
  525. package/v3/@claude-flow/cli/dist/src/commands/start.js +418 -0
  526. package/v3/@claude-flow/cli/dist/src/commands/status.d.ts +8 -0
  527. package/v3/@claude-flow/cli/dist/src/commands/status.js +591 -0
  528. package/v3/@claude-flow/cli/dist/src/commands/swarm.d.ts +8 -0
  529. package/v3/@claude-flow/cli/dist/src/commands/swarm.js +887 -0
  530. package/v3/@claude-flow/cli/dist/src/commands/task.d.ts +8 -0
  531. package/v3/@claude-flow/cli/dist/src/commands/task.js +675 -0
  532. package/v3/@claude-flow/cli/dist/src/commands/transfer-store.d.ts +13 -0
  533. package/v3/@claude-flow/cli/dist/src/commands/transfer-store.js +428 -0
  534. package/v3/@claude-flow/cli/dist/src/commands/update.d.ts +8 -0
  535. package/v3/@claude-flow/cli/dist/src/commands/update.js +276 -0
  536. package/v3/@claude-flow/cli/dist/src/commands/verify.d.ts +19 -0
  537. package/v3/@claude-flow/cli/dist/src/commands/verify.js +261 -0
  538. package/v3/@claude-flow/cli/dist/src/commands/workflow.d.ts +8 -0
  539. package/v3/@claude-flow/cli/dist/src/commands/workflow.js +617 -0
  540. package/v3/@claude-flow/cli/dist/src/config-adapter.d.ts +15 -0
  541. package/v3/@claude-flow/cli/dist/src/config-adapter.js +186 -0
  542. package/v3/@claude-flow/cli/dist/src/encryption/vault.d.ts +94 -0
  543. package/v3/@claude-flow/cli/dist/src/encryption/vault.js +172 -0
  544. package/v3/@claude-flow/cli/dist/src/fs-secure.d.ts +67 -0
  545. package/v3/@claude-flow/cli/dist/src/fs-secure.js +74 -0
  546. package/v3/@claude-flow/cli/dist/src/index.d.ts +81 -0
  547. package/v3/@claude-flow/cli/dist/src/index.js +538 -0
  548. package/v3/@claude-flow/cli/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
  549. package/v3/@claude-flow/cli/dist/src/infrastructure/in-memory-repositories.js +264 -0
  550. package/v3/@claude-flow/cli/dist/src/init/claudemd-generator.d.ts +16 -0
  551. package/v3/@claude-flow/cli/dist/src/init/claudemd-generator.js +363 -0
  552. package/v3/@claude-flow/cli/dist/src/init/executor.d.ts +41 -0
  553. package/v3/@claude-flow/cli/dist/src/init/executor.js +1904 -0
  554. package/v3/@claude-flow/cli/dist/src/init/helpers-generator.d.ts +60 -0
  555. package/v3/@claude-flow/cli/dist/src/init/helpers-generator.js +1185 -0
  556. package/v3/@claude-flow/cli/dist/src/init/index.d.ts +13 -0
  557. package/v3/@claude-flow/cli/dist/src/init/index.js +15 -0
  558. package/v3/@claude-flow/cli/dist/src/init/mcp-generator.d.ts +26 -0
  559. package/v3/@claude-flow/cli/dist/src/init/mcp-generator.js +116 -0
  560. package/v3/@claude-flow/cli/dist/src/init/settings-generator.d.ts +14 -0
  561. package/v3/@claude-flow/cli/dist/src/init/settings-generator.js +456 -0
  562. package/v3/@claude-flow/cli/dist/src/init/statusline-generator.d.ts +28 -0
  563. package/v3/@claude-flow/cli/dist/src/init/statusline-generator.js +937 -0
  564. package/v3/@claude-flow/cli/dist/src/init/types.d.ts +308 -0
  565. package/v3/@claude-flow/cli/dist/src/init/types.js +263 -0
  566. package/v3/@claude-flow/cli/dist/src/log-filters.d.ts +22 -0
  567. package/v3/@claude-flow/cli/dist/src/log-filters.js +36 -0
  568. package/v3/@claude-flow/cli/dist/src/mcp-client.d.ts +92 -0
  569. package/v3/@claude-flow/cli/dist/src/mcp-client.js +287 -0
  570. package/v3/@claude-flow/cli/dist/src/mcp-server.d.ts +163 -0
  571. package/v3/@claude-flow/cli/dist/src/mcp-server.js +732 -0
  572. package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-execute-core.d.ts +92 -0
  573. package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-execute-core.js +328 -0
  574. package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-tools.d.ts +9 -0
  575. package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-tools.js +716 -0
  576. package/v3/@claude-flow/cli/dist/src/mcp-tools/agentdb-tools.d.ts +33 -0
  577. package/v3/@claude-flow/cli/dist/src/mcp-tools/agentdb-tools.js +867 -0
  578. package/v3/@claude-flow/cli/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
  579. package/v3/@claude-flow/cli/dist/src/mcp-tools/analyze-tools.js +346 -0
  580. package/v3/@claude-flow/cli/dist/src/mcp-tools/auto-install.d.ts +83 -0
  581. package/v3/@claude-flow/cli/dist/src/mcp-tools/auto-install.js +131 -0
  582. package/v3/@claude-flow/cli/dist/src/mcp-tools/autopilot-tools.d.ts +12 -0
  583. package/v3/@claude-flow/cli/dist/src/mcp-tools/autopilot-tools.js +231 -0
  584. package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-session-tools.d.ts +23 -0
  585. package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-session-tools.js +324 -0
  586. package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-tools.d.ts +13 -0
  587. package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-tools.js +757 -0
  588. package/v3/@claude-flow/cli/dist/src/mcp-tools/claims-tools.d.ts +12 -0
  589. package/v3/@claude-flow/cli/dist/src/mcp-tools/claims-tools.js +863 -0
  590. package/v3/@claude-flow/cli/dist/src/mcp-tools/config-tools.d.ts +8 -0
  591. package/v3/@claude-flow/cli/dist/src/mcp-tools/config-tools.js +411 -0
  592. package/v3/@claude-flow/cli/dist/src/mcp-tools/coordination-tools.d.ts +13 -0
  593. package/v3/@claude-flow/cli/dist/src/mcp-tools/coordination-tools.js +729 -0
  594. package/v3/@claude-flow/cli/dist/src/mcp-tools/daa-tools.d.ts +13 -0
  595. package/v3/@claude-flow/cli/dist/src/mcp-tools/daa-tools.js +534 -0
  596. package/v3/@claude-flow/cli/dist/src/mcp-tools/embeddings-tools.d.ts +9 -0
  597. package/v3/@claude-flow/cli/dist/src/mcp-tools/embeddings-tools.js +904 -0
  598. package/v3/@claude-flow/cli/dist/src/mcp-tools/github-tools.d.ts +9 -0
  599. package/v3/@claude-flow/cli/dist/src/mcp-tools/github-tools.js +659 -0
  600. package/v3/@claude-flow/cli/dist/src/mcp-tools/guidance-tools.d.ts +15 -0
  601. package/v3/@claude-flow/cli/dist/src/mcp-tools/guidance-tools.js +639 -0
  602. package/v3/@claude-flow/cli/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
  603. package/v3/@claude-flow/cli/dist/src/mcp-tools/hive-mind-tools.js +953 -0
  604. package/v3/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.d.ts +46 -0
  605. package/v3/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.js +3939 -0
  606. package/v3/@claude-flow/cli/dist/src/mcp-tools/index.d.ts +27 -0
  607. package/v3/@claude-flow/cli/dist/src/mcp-tools/index.js +26 -0
  608. package/v3/@claude-flow/cli/dist/src/mcp-tools/managed-agent-tools.d.ts +22 -0
  609. package/v3/@claude-flow/cli/dist/src/mcp-tools/managed-agent-tools.js +357 -0
  610. package/v3/@claude-flow/cli/dist/src/mcp-tools/memory-tools.d.ts +14 -0
  611. package/v3/@claude-flow/cli/dist/src/mcp-tools/memory-tools.js +1240 -0
  612. package/v3/@claude-flow/cli/dist/src/mcp-tools/neural-tools.d.ts +16 -0
  613. package/v3/@claude-flow/cli/dist/src/mcp-tools/neural-tools.js +793 -0
  614. package/v3/@claude-flow/cli/dist/src/mcp-tools/performance-tools.d.ts +16 -0
  615. package/v3/@claude-flow/cli/dist/src/mcp-tools/performance-tools.js +675 -0
  616. package/v3/@claude-flow/cli/dist/src/mcp-tools/progress-tools.d.ts +14 -0
  617. package/v3/@claude-flow/cli/dist/src/mcp-tools/progress-tools.js +348 -0
  618. package/v3/@claude-flow/cli/dist/src/mcp-tools/request-tracker.d.ts +17 -0
  619. package/v3/@claude-flow/cli/dist/src/mcp-tools/request-tracker.js +27 -0
  620. package/v3/@claude-flow/cli/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
  621. package/v3/@claude-flow/cli/dist/src/mcp-tools/ruvllm-tools.js +339 -0
  622. package/v3/@claude-flow/cli/dist/src/mcp-tools/security-tools.d.ts +18 -0
  623. package/v3/@claude-flow/cli/dist/src/mcp-tools/security-tools.js +556 -0
  624. package/v3/@claude-flow/cli/dist/src/mcp-tools/session-tools.d.ts +8 -0
  625. package/v3/@claude-flow/cli/dist/src/mcp-tools/session-tools.js +517 -0
  626. package/v3/@claude-flow/cli/dist/src/mcp-tools/swarm-tools.d.ts +9 -0
  627. package/v3/@claude-flow/cli/dist/src/mcp-tools/swarm-tools.js +388 -0
  628. package/v3/@claude-flow/cli/dist/src/mcp-tools/system-tools.d.ts +13 -0
  629. package/v3/@claude-flow/cli/dist/src/mcp-tools/system-tools.js +674 -0
  630. package/v3/@claude-flow/cli/dist/src/mcp-tools/task-tools.d.ts +8 -0
  631. package/v3/@claude-flow/cli/dist/src/mcp-tools/task-tools.js +487 -0
  632. package/v3/@claude-flow/cli/dist/src/mcp-tools/terminal-tools.d.ts +8 -0
  633. package/v3/@claude-flow/cli/dist/src/mcp-tools/terminal-tools.js +306 -0
  634. package/v3/@claude-flow/cli/dist/src/mcp-tools/transfer-tools.d.ts +14 -0
  635. package/v3/@claude-flow/cli/dist/src/mcp-tools/transfer-tools.js +447 -0
  636. package/v3/@claude-flow/cli/dist/src/mcp-tools/types.d.ts +8 -0
  637. package/v3/@claude-flow/cli/dist/src/mcp-tools/types.js +8 -0
  638. package/v3/@claude-flow/cli/dist/src/mcp-tools/validate-input.d.ts +9 -0
  639. package/v3/@claude-flow/cli/dist/src/mcp-tools/validate-input.js +9 -0
  640. package/v3/@claude-flow/cli/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
  641. package/v3/@claude-flow/cli/dist/src/mcp-tools/wasm-agent-tools.js +291 -0
  642. package/v3/@claude-flow/cli/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
  643. package/v3/@claude-flow/cli/dist/src/mcp-tools/workflow-tools.js +884 -0
  644. package/v3/@claude-flow/cli/dist/src/memory/ewc-consolidation.d.ts +295 -0
  645. package/v3/@claude-flow/cli/dist/src/memory/ewc-consolidation.js +601 -0
  646. package/v3/@claude-flow/cli/dist/src/memory/intelligence.d.ts +357 -0
  647. package/v3/@claude-flow/cli/dist/src/memory/intelligence.js +1200 -0
  648. package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.d.ts +492 -0
  649. package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.js +2101 -0
  650. package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.d.ts +420 -0
  651. package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.js +2376 -0
  652. package/v3/@claude-flow/cli/dist/src/memory/neural-package-bridge.d.ts +48 -0
  653. package/v3/@claude-flow/cli/dist/src/memory/neural-package-bridge.js +87 -0
  654. package/v3/@claude-flow/cli/dist/src/memory/rabitq-index.d.ts +60 -0
  655. package/v3/@claude-flow/cli/dist/src/memory/rabitq-index.js +242 -0
  656. package/v3/@claude-flow/cli/dist/src/memory/sona-optimizer.d.ts +267 -0
  657. package/v3/@claude-flow/cli/dist/src/memory/sona-optimizer.js +779 -0
  658. package/v3/@claude-flow/cli/dist/src/output.d.ts +9 -0
  659. package/v3/@claude-flow/cli/dist/src/output.js +9 -0
  660. package/v3/@claude-flow/cli/dist/src/parser.d.ts +69 -0
  661. package/v3/@claude-flow/cli/dist/src/parser.js +473 -0
  662. package/v3/@claude-flow/cli/dist/src/plugins/manager.d.ts +133 -0
  663. package/v3/@claude-flow/cli/dist/src/plugins/manager.js +402 -0
  664. package/v3/@claude-flow/cli/dist/src/plugins/store/discovery.d.ts +91 -0
  665. package/v3/@claude-flow/cli/dist/src/plugins/store/discovery.js +1202 -0
  666. package/v3/@claude-flow/cli/dist/src/plugins/store/index.d.ts +76 -0
  667. package/v3/@claude-flow/cli/dist/src/plugins/store/index.js +141 -0
  668. package/v3/@claude-flow/cli/dist/src/plugins/store/search.d.ts +46 -0
  669. package/v3/@claude-flow/cli/dist/src/plugins/store/search.js +230 -0
  670. package/v3/@claude-flow/cli/dist/src/plugins/store/types.d.ts +274 -0
  671. package/v3/@claude-flow/cli/dist/src/plugins/store/types.js +7 -0
  672. package/v3/@claude-flow/cli/dist/src/plugins/tests/demo-plugin-store.d.ts +7 -0
  673. package/v3/@claude-flow/cli/dist/src/plugins/tests/demo-plugin-store.js +126 -0
  674. package/v3/@claude-flow/cli/dist/src/plugins/tests/standalone-test.d.ts +12 -0
  675. package/v3/@claude-flow/cli/dist/src/plugins/tests/standalone-test.js +188 -0
  676. package/v3/@claude-flow/cli/dist/src/plugins/tests/test-plugin-store.d.ts +7 -0
  677. package/v3/@claude-flow/cli/dist/src/plugins/tests/test-plugin-store.js +206 -0
  678. package/v3/@claude-flow/cli/dist/src/production/circuit-breaker.d.ts +101 -0
  679. package/v3/@claude-flow/cli/dist/src/production/circuit-breaker.js +241 -0
  680. package/v3/@claude-flow/cli/dist/src/production/error-handler.d.ts +92 -0
  681. package/v3/@claude-flow/cli/dist/src/production/error-handler.js +299 -0
  682. package/v3/@claude-flow/cli/dist/src/production/index.d.ts +23 -0
  683. package/v3/@claude-flow/cli/dist/src/production/index.js +18 -0
  684. package/v3/@claude-flow/cli/dist/src/production/monitoring.d.ts +161 -0
  685. package/v3/@claude-flow/cli/dist/src/production/monitoring.js +356 -0
  686. package/v3/@claude-flow/cli/dist/src/production/rate-limiter.d.ts +80 -0
  687. package/v3/@claude-flow/cli/dist/src/production/rate-limiter.js +201 -0
  688. package/v3/@claude-flow/cli/dist/src/production/retry.d.ts +48 -0
  689. package/v3/@claude-flow/cli/dist/src/production/retry.js +179 -0
  690. package/v3/@claude-flow/cli/dist/src/prompt.d.ts +44 -0
  691. package/v3/@claude-flow/cli/dist/src/prompt.js +501 -0
  692. package/v3/@claude-flow/cli/dist/src/runtime/headless.d.ts +60 -0
  693. package/v3/@claude-flow/cli/dist/src/runtime/headless.js +284 -0
  694. package/v3/@claude-flow/cli/dist/src/ruvector/agent-wasm.d.ts +193 -0
  695. package/v3/@claude-flow/cli/dist/src/ruvector/agent-wasm.js +354 -0
  696. package/v3/@claude-flow/cli/dist/src/ruvector/ast-analyzer.d.ts +67 -0
  697. package/v3/@claude-flow/cli/dist/src/ruvector/ast-analyzer.js +277 -0
  698. package/v3/@claude-flow/cli/dist/src/ruvector/coverage-router.d.ts +160 -0
  699. package/v3/@claude-flow/cli/dist/src/ruvector/coverage-router.js +531 -0
  700. package/v3/@claude-flow/cli/dist/src/ruvector/coverage-tools.d.ts +33 -0
  701. package/v3/@claude-flow/cli/dist/src/ruvector/coverage-tools.js +157 -0
  702. package/v3/@claude-flow/cli/dist/src/ruvector/diff-classifier.d.ts +175 -0
  703. package/v3/@claude-flow/cli/dist/src/ruvector/diff-classifier.js +699 -0
  704. package/v3/@claude-flow/cli/dist/src/ruvector/diskann-backend.d.ts +78 -0
  705. package/v3/@claude-flow/cli/dist/src/ruvector/diskann-backend.js +310 -0
  706. package/v3/@claude-flow/cli/dist/src/ruvector/enhanced-model-router.d.ts +146 -0
  707. package/v3/@claude-flow/cli/dist/src/ruvector/enhanced-model-router.js +529 -0
  708. package/v3/@claude-flow/cli/dist/src/ruvector/graph-analyzer.d.ts +187 -0
  709. package/v3/@claude-flow/cli/dist/src/ruvector/graph-analyzer.js +929 -0
  710. package/v3/@claude-flow/cli/dist/src/ruvector/graph-backend.d.ts +79 -0
  711. package/v3/@claude-flow/cli/dist/src/ruvector/graph-backend.js +220 -0
  712. package/v3/@claude-flow/cli/dist/src/ruvector/index.d.ts +38 -0
  713. package/v3/@claude-flow/cli/dist/src/ruvector/index.js +82 -0
  714. package/v3/@claude-flow/cli/dist/src/ruvector/lora-adapter.d.ts +240 -0
  715. package/v3/@claude-flow/cli/dist/src/ruvector/lora-adapter.js +550 -0
  716. package/v3/@claude-flow/cli/dist/src/ruvector/model-router.d.ts +241 -0
  717. package/v3/@claude-flow/cli/dist/src/ruvector/model-router.js +608 -0
  718. package/v3/@claude-flow/cli/dist/src/ruvector/q-learning-router.d.ts +211 -0
  719. package/v3/@claude-flow/cli/dist/src/ruvector/q-learning-router.js +681 -0
  720. package/v3/@claude-flow/cli/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
  721. package/v3/@claude-flow/cli/dist/src/ruvector/ruvllm-wasm.js +367 -0
  722. package/v3/@claude-flow/cli/dist/src/ruvector/semantic-router.d.ts +77 -0
  723. package/v3/@claude-flow/cli/dist/src/ruvector/semantic-router.js +178 -0
  724. package/v3/@claude-flow/cli/dist/src/ruvector/vector-db.d.ts +73 -0
  725. package/v3/@claude-flow/cli/dist/src/ruvector/vector-db.js +264 -0
  726. package/v3/@claude-flow/cli/dist/src/services/agentic-flow-bridge.d.ts +50 -0
  727. package/v3/@claude-flow/cli/dist/src/services/agentic-flow-bridge.js +95 -0
  728. package/v3/@claude-flow/cli/dist/src/services/claim-service.d.ts +204 -0
  729. package/v3/@claude-flow/cli/dist/src/services/claim-service.js +818 -0
  730. package/v3/@claude-flow/cli/dist/src/services/config-file-manager.d.ts +37 -0
  731. package/v3/@claude-flow/cli/dist/src/services/config-file-manager.js +233 -0
  732. package/v3/@claude-flow/cli/dist/src/services/container-worker-pool.d.ts +197 -0
  733. package/v3/@claude-flow/cli/dist/src/services/container-worker-pool.js +583 -0
  734. package/v3/@claude-flow/cli/dist/src/services/headless-worker-executor.d.ts +310 -0
  735. package/v3/@claude-flow/cli/dist/src/services/headless-worker-executor.js +1058 -0
  736. package/v3/@claude-flow/cli/dist/src/services/index.d.ts +13 -0
  737. package/v3/@claude-flow/cli/dist/src/services/index.js +11 -0
  738. package/v3/@claude-flow/cli/dist/src/services/registry-api.d.ts +58 -0
  739. package/v3/@claude-flow/cli/dist/src/services/registry-api.js +146 -0
  740. package/v3/@claude-flow/cli/dist/src/services/ruvector-training.d.ts +222 -0
  741. package/v3/@claude-flow/cli/dist/src/services/ruvector-training.js +688 -0
  742. package/v3/@claude-flow/cli/dist/src/services/worker-daemon.d.ts +323 -0
  743. package/v3/@claude-flow/cli/dist/src/services/worker-daemon.js +1323 -0
  744. package/v3/@claude-flow/cli/dist/src/services/worker-queue.d.ts +194 -0
  745. package/v3/@claude-flow/cli/dist/src/services/worker-queue.js +513 -0
  746. package/v3/@claude-flow/cli/dist/src/suggest.d.ts +53 -0
  747. package/v3/@claude-flow/cli/dist/src/suggest.js +200 -0
  748. package/v3/@claude-flow/cli/dist/src/transfer/anonymization/index.d.ts +25 -0
  749. package/v3/@claude-flow/cli/dist/src/transfer/anonymization/index.js +175 -0
  750. package/v3/@claude-flow/cli/dist/src/transfer/deploy-seraphine.d.ts +13 -0
  751. package/v3/@claude-flow/cli/dist/src/transfer/deploy-seraphine.js +205 -0
  752. package/v3/@claude-flow/cli/dist/src/transfer/export.d.ts +25 -0
  753. package/v3/@claude-flow/cli/dist/src/transfer/export.js +113 -0
  754. package/v3/@claude-flow/cli/dist/src/transfer/index.d.ts +12 -0
  755. package/v3/@claude-flow/cli/dist/src/transfer/index.js +31 -0
  756. package/v3/@claude-flow/cli/dist/src/transfer/ipfs/client.d.ts +109 -0
  757. package/v3/@claude-flow/cli/dist/src/transfer/ipfs/client.js +307 -0
  758. package/v3/@claude-flow/cli/dist/src/transfer/ipfs/upload.d.ts +95 -0
  759. package/v3/@claude-flow/cli/dist/src/transfer/ipfs/upload.js +413 -0
  760. package/v3/@claude-flow/cli/dist/src/transfer/models/seraphine.d.ts +72 -0
  761. package/v3/@claude-flow/cli/dist/src/transfer/models/seraphine.js +373 -0
  762. package/v3/@claude-flow/cli/dist/src/transfer/serialization/cfp.d.ts +49 -0
  763. package/v3/@claude-flow/cli/dist/src/transfer/serialization/cfp.js +183 -0
  764. package/v3/@claude-flow/cli/dist/src/transfer/storage/gcs.d.ts +82 -0
  765. package/v3/@claude-flow/cli/dist/src/transfer/storage/gcs.js +272 -0
  766. package/v3/@claude-flow/cli/dist/src/transfer/storage/index.d.ts +6 -0
  767. package/v3/@claude-flow/cli/dist/src/transfer/storage/index.js +6 -0
  768. package/v3/@claude-flow/cli/dist/src/transfer/store/discovery.d.ts +84 -0
  769. package/v3/@claude-flow/cli/dist/src/transfer/store/discovery.js +382 -0
  770. package/v3/@claude-flow/cli/dist/src/transfer/store/download.d.ts +70 -0
  771. package/v3/@claude-flow/cli/dist/src/transfer/store/download.js +334 -0
  772. package/v3/@claude-flow/cli/dist/src/transfer/store/index.d.ts +84 -0
  773. package/v3/@claude-flow/cli/dist/src/transfer/store/index.js +153 -0
  774. package/v3/@claude-flow/cli/dist/src/transfer/store/publish.d.ts +76 -0
  775. package/v3/@claude-flow/cli/dist/src/transfer/store/publish.js +294 -0
  776. package/v3/@claude-flow/cli/dist/src/transfer/store/registry.d.ts +58 -0
  777. package/v3/@claude-flow/cli/dist/src/transfer/store/registry.js +285 -0
  778. package/v3/@claude-flow/cli/dist/src/transfer/store/search.d.ts +54 -0
  779. package/v3/@claude-flow/cli/dist/src/transfer/store/search.js +232 -0
  780. package/v3/@claude-flow/cli/dist/src/transfer/store/tests/standalone-test.d.ts +12 -0
  781. package/v3/@claude-flow/cli/dist/src/transfer/store/tests/standalone-test.js +190 -0
  782. package/v3/@claude-flow/cli/dist/src/transfer/store/types.d.ts +193 -0
  783. package/v3/@claude-flow/cli/dist/src/transfer/store/types.js +6 -0
  784. package/v3/@claude-flow/cli/dist/src/transfer/test-seraphine.d.ts +6 -0
  785. package/v3/@claude-flow/cli/dist/src/transfer/test-seraphine.js +105 -0
  786. package/v3/@claude-flow/cli/dist/src/transfer/tests/test-store.d.ts +7 -0
  787. package/v3/@claude-flow/cli/dist/src/transfer/tests/test-store.js +214 -0
  788. package/v3/@claude-flow/cli/dist/src/transfer/types.d.ts +245 -0
  789. package/v3/@claude-flow/cli/dist/src/transfer/types.js +6 -0
  790. package/v3/@claude-flow/cli/dist/src/types.d.ts +13 -0
  791. package/v3/@claude-flow/cli/dist/src/types.js +13 -0
  792. package/v3/@claude-flow/cli/dist/src/update/checker.d.ts +34 -0
  793. package/v3/@claude-flow/cli/dist/src/update/checker.js +191 -0
  794. package/v3/@claude-flow/cli/dist/src/update/executor.d.ts +33 -0
  795. package/v3/@claude-flow/cli/dist/src/update/executor.js +217 -0
  796. package/v3/@claude-flow/cli/dist/src/update/index.d.ts +33 -0
  797. package/v3/@claude-flow/cli/dist/src/update/index.js +64 -0
  798. package/v3/@claude-flow/cli/dist/src/update/rate-limiter.d.ts +20 -0
  799. package/v3/@claude-flow/cli/dist/src/update/rate-limiter.js +96 -0
  800. package/v3/@claude-flow/cli/dist/src/update/validator.d.ts +17 -0
  801. package/v3/@claude-flow/cli/dist/src/update/validator.js +123 -0
  802. package/v3/@claude-flow/cli/package.json +133 -0
  803. package/v3/@claude-flow/guidance/README.md +1195 -0
  804. package/v3/@claude-flow/guidance/package.json +198 -0
  805. package/v3/@claude-flow/shared/README.md +323 -0
  806. package/v3/@claude-flow/shared/package.json +43 -0
  807. package/v3/README.md +493 -0
@@ -0,0 +1,1093 @@
1
+ /**
2
+ * V3 CLI Daemon Command
3
+ * Manages background worker daemon (Node.js-based, similar to shell helpers)
4
+ */
5
+ import { output } from '../output.js';
6
+ import { getDaemon, startDaemon, stopDaemon } from '../services/worker-daemon.js';
7
+ import { fork } from 'child_process';
8
+ import { fileURLToPath } from 'url';
9
+ import { dirname, join, resolve } from 'path';
10
+ import * as fs from 'fs';
11
+ // Start daemon subcommand
12
+ const startCommand = {
13
+ name: 'start',
14
+ description: 'Start the worker daemon with all enabled background workers',
15
+ options: [
16
+ { name: 'workers', short: 'w', type: 'string', description: 'Comma-separated list of workers to enable (default: map,audit,optimize,consolidate,testgaps)' },
17
+ { name: 'quiet', short: 'Q', type: 'boolean', description: 'Suppress output' },
18
+ { name: 'background', short: 'b', type: 'boolean', description: 'Run daemon in background (detached process)', default: true },
19
+ { name: 'foreground', short: 'f', type: 'boolean', description: 'Run daemon in foreground (blocks terminal)' },
20
+ { name: 'headless', type: 'boolean', description: 'Enable headless worker execution (E2B sandbox)' },
21
+ { name: 'sandbox', type: 'string', description: 'Default sandbox mode for headless workers', choices: ['strict', 'permissive', 'disabled'] },
22
+ { name: 'max-cpu-load', type: 'string', description: 'Override maxCpuLoad resource threshold (e.g. 4.0)' },
23
+ { name: 'min-free-memory', type: 'string', description: 'Override minFreeMemoryPercent resource threshold (e.g. 15)' },
24
+ // #1914: workspace root for this daemon. Set automatically when the
25
+ // background launcher forks the foreground child so the daemon process
26
+ // carries its workspace path in argv — `killStaleDaemons` then only
27
+ // reaps daemons belonging to the current workspace (ADR-014 scope).
28
+ { name: 'workspace', type: 'string', description: 'Workspace root for this daemon (internal — set automatically when forking)' },
29
+ ],
30
+ examples: [
31
+ { command: 'claude-flow daemon start', description: 'Start daemon in background (default)' },
32
+ { command: 'claude-flow daemon start --foreground', description: 'Start in foreground (blocks terminal)' },
33
+ { command: 'claude-flow daemon start -w map,audit,optimize', description: 'Start with specific workers' },
34
+ { command: 'claude-flow daemon start --headless --sandbox strict', description: 'Start with headless workers in strict sandbox' },
35
+ ],
36
+ action: async (ctx) => {
37
+ const quiet = ctx.flags.quiet;
38
+ const foreground = ctx.flags.foreground;
39
+ // #1914: a forked daemon child receives --workspace <root>; the launcher
40
+ // and interactive invocations have no flag and fall back to cwd.
41
+ const projectRoot = resolveWorkspaceFlag(ctx.flags.workspace) ?? process.cwd();
42
+ const isDaemonProcess = process.env.CLAUDE_FLOW_DAEMON === '1';
43
+ // Parse resource threshold overrides from CLI flags
44
+ const config = {};
45
+ const rawMaxCpu = ctx.flags['max-cpu-load'];
46
+ const rawMinMem = ctx.flags['min-free-memory'];
47
+ // Strict numeric pattern to prevent command injection when forwarding to subprocess (S1)
48
+ const NUMERIC_RE = /^\d+(\.\d+)?$/;
49
+ const sanitize = (s) => s.replace(/[\x00-\x1f\x7f-\x9f]/g, '');
50
+ if (rawMaxCpu || rawMinMem) {
51
+ const thresholds = {};
52
+ if (rawMaxCpu) {
53
+ const val = parseFloat(rawMaxCpu);
54
+ if (NUMERIC_RE.test(rawMaxCpu) && isFinite(val) && val > 0 && val <= 1000) {
55
+ thresholds.maxCpuLoad = val;
56
+ }
57
+ else if (!quiet) {
58
+ output.printWarning(`Ignoring invalid --max-cpu-load value: ${sanitize(rawMaxCpu)}`);
59
+ }
60
+ }
61
+ if (rawMinMem) {
62
+ const val = parseFloat(rawMinMem);
63
+ if (NUMERIC_RE.test(rawMinMem) && isFinite(val) && val >= 0 && val <= 100) {
64
+ thresholds.minFreeMemoryPercent = val;
65
+ }
66
+ else if (!quiet) {
67
+ output.printWarning(`Ignoring invalid --min-free-memory value: ${sanitize(rawMinMem)}`);
68
+ }
69
+ }
70
+ if (thresholds.maxCpuLoad !== undefined || thresholds.minFreeMemoryPercent !== undefined) {
71
+ config.resourceThresholds = thresholds;
72
+ }
73
+ }
74
+ // Check if background daemon already running (skip if we ARE the daemon process)
75
+ if (!isDaemonProcess) {
76
+ const bgPid = getBackgroundDaemonPid(projectRoot);
77
+ if (bgPid && isProcessRunning(bgPid)) {
78
+ if (!quiet) {
79
+ output.printWarning(`Daemon already running in background (PID: ${bgPid}). Stop it first with: daemon stop`);
80
+ }
81
+ return { success: true };
82
+ }
83
+ // #1551: Kill any stale daemon processes that weren't tracked by PID file
84
+ await killStaleDaemons(projectRoot, quiet);
85
+ }
86
+ // Background mode (default): fork a detached process.
87
+ // #1968: previously only forwarded resource thresholds — `--workers`,
88
+ // `--headless`, and `--sandbox` were dropped on the floor when the
89
+ // launcher forked the foreground child, so `daemon start --workers map`
90
+ // got the full default worker set instead.
91
+ if (!foreground) {
92
+ return startBackgroundDaemon(projectRoot, quiet, {
93
+ maxCpuLoad: rawMaxCpu,
94
+ minFreeMemory: rawMinMem,
95
+ workers: ctx.flags.workers,
96
+ headless: ctx.flags.headless,
97
+ sandbox: ctx.flags.sandbox,
98
+ });
99
+ }
100
+ // Foreground mode: run in current process (blocks terminal)
101
+ try {
102
+ const stateDir = join(projectRoot, '.claude-flow');
103
+ const pidFile = join(stateDir, 'daemon.pid');
104
+ // Ensure state directory exists
105
+ if (!fs.existsSync(stateDir)) {
106
+ fs.mkdirSync(stateDir, { recursive: true });
107
+ }
108
+ // NOTE: Do NOT write PID file here — startDaemon() writes it internally.
109
+ // Writing it before startDaemon() causes checkExistingDaemon() to detect
110
+ // our own PID and return early, leaving no workers scheduled (#1478 Bug 1).
111
+ // Clean up PID file on exit
112
+ const cleanup = () => {
113
+ try {
114
+ if (fs.existsSync(pidFile)) {
115
+ fs.unlinkSync(pidFile);
116
+ }
117
+ }
118
+ catch { /* ignore */ }
119
+ };
120
+ process.on('exit', cleanup);
121
+ process.on('SIGINT', () => { cleanup(); process.exit(0); });
122
+ process.on('SIGTERM', () => { cleanup(); process.exit(0); });
123
+ // Ignore SIGHUP on macOS/Linux — prevents daemon death when terminal closes (#1283)
124
+ if (process.platform !== 'win32') {
125
+ process.on('SIGHUP', () => { });
126
+ }
127
+ if (!quiet) {
128
+ const spinner = output.createSpinner({ text: 'Starting worker daemon...', spinner: 'dots' });
129
+ spinner.start();
130
+ const daemon = await startDaemon(projectRoot, config);
131
+ const status = daemon.getStatus();
132
+ spinner.succeed('Worker daemon started (foreground mode)');
133
+ output.writeln();
134
+ output.printBox([
135
+ `PID: ${status.pid}`,
136
+ `Started: ${status.startedAt?.toISOString()}`,
137
+ `Workers: ${status.config.workers.filter(w => w.enabled).length} enabled`,
138
+ `Max Concurrent: ${status.config.maxConcurrent}`,
139
+ `Max CPU Load: ${status.config.resourceThresholds.maxCpuLoad}`,
140
+ `Min Free Memory: ${status.config.resourceThresholds.minFreeMemoryPercent}%`,
141
+ ].join('\n'), 'Daemon Status');
142
+ output.writeln();
143
+ output.writeln(output.bold('Scheduled Workers'));
144
+ output.printTable({
145
+ columns: [
146
+ { key: 'type', header: 'Worker', width: 15 },
147
+ { key: 'interval', header: 'Interval', width: 12 },
148
+ { key: 'priority', header: 'Priority', width: 10 },
149
+ { key: 'description', header: 'Description', width: 30 },
150
+ ],
151
+ data: status.config.workers
152
+ .filter(w => w.enabled)
153
+ .map(w => ({
154
+ type: output.highlight(w.type),
155
+ interval: `${Math.round(w.intervalMs / 60000)}min`,
156
+ priority: w.priority === 'critical' ? output.error(w.priority) :
157
+ w.priority === 'high' ? output.warning(w.priority) :
158
+ output.dim(w.priority),
159
+ description: w.description,
160
+ })),
161
+ });
162
+ output.writeln();
163
+ output.writeln(output.dim('Press Ctrl+C to stop daemon'));
164
+ // Listen for worker events
165
+ daemon.on('worker:start', ({ type }) => {
166
+ output.writeln(output.dim(`[daemon] Worker starting: ${type}`));
167
+ });
168
+ daemon.on('worker:complete', ({ type, durationMs }) => {
169
+ output.writeln(output.success(`[daemon] Worker completed: ${type} (${durationMs}ms)`));
170
+ });
171
+ daemon.on('worker:error', ({ type, error }) => {
172
+ output.writeln(output.error(`[daemon] Worker failed: ${type} - ${error}`));
173
+ });
174
+ // Keep process alive — setInterval creates a ref'd handle that prevents
175
+ // Node.js from exiting even when startDaemon's timers are unref'd (#1478 Bug 2).
176
+ setInterval(() => { }, 60_000);
177
+ await new Promise(() => { }); // Never resolves - daemon runs until killed
178
+ }
179
+ else {
180
+ await startDaemon(projectRoot, config);
181
+ setInterval(() => { }, 60_000); // Keep alive with ref'd handle (#1478)
182
+ await new Promise(() => { }); // Keep alive
183
+ }
184
+ return { success: true };
185
+ }
186
+ catch (error) {
187
+ output.printError(`Failed to start daemon: ${error instanceof Error ? error.message : String(error)}`);
188
+ return { success: false, exitCode: 1 };
189
+ }
190
+ },
191
+ };
192
+ /**
193
+ * Validate path for security - prevents path traversal and injection
194
+ */
195
+ function validatePath(path, label) {
196
+ // Must be absolute after resolution
197
+ const resolved = resolve(path);
198
+ // Check for null bytes (injection attack)
199
+ if (path.includes('\0')) {
200
+ throw new Error(`${label} contains null bytes`);
201
+ }
202
+ // Check for shell metacharacters in path components
203
+ if (/[;&|`$<>]/.test(path)) {
204
+ throw new Error(`${label} contains shell metacharacters`);
205
+ }
206
+ // Prevent path traversal outside expected directories
207
+ if (!resolved.includes('.claude-flow') && !resolved.includes('bin')) {
208
+ // Allow only paths within project structure
209
+ const cwd = process.cwd();
210
+ if (!resolved.startsWith(cwd)) {
211
+ throw new Error(`${label} escapes project directory`);
212
+ }
213
+ }
214
+ }
215
+ /**
216
+ * #1914: Resolve the `--workspace` flag to an absolute path, or return null
217
+ * if it is absent / not a usable string. Rejects values with null bytes or
218
+ * shell metacharacters (defence-in-depth — the value is later embedded in a
219
+ * forked child's argv and compared against `ps`/`tasklist` output).
220
+ */
221
+ export function resolveWorkspaceFlag(raw) {
222
+ if (typeof raw !== 'string')
223
+ return null;
224
+ const trimmed = raw.trim();
225
+ if (!trimmed)
226
+ return null;
227
+ if (trimmed.includes('\0') || /[;&|`$<>]/.test(trimmed))
228
+ return null;
229
+ return resolve(trimmed);
230
+ }
231
+ /**
232
+ * #1914: True when a process command line (from `ps -eo command` on POSIX or
233
+ * the tasklist Window Title column on Windows) belongs to a daemon started
234
+ * for `workspaceRoot`. The launcher (`startBackgroundDaemon`) always appends
235
+ * `--workspace <root>` as the FINAL argv entry, so an exact trailing match
236
+ * after stripping trailing whitespace/quotes is unambiguous — even for
237
+ * workspace paths containing spaces — and never a bare path-prefix match,
238
+ * so workspace `/a/proj` does not reap `/a/proj-other`'s daemon. A daemon
239
+ * whose argv puts `--workspace` mid-list (only possible via a hand-rolled
240
+ * invocation) simply won't be auto-reaped — `daemon stop` still handles it
241
+ * via the PID file.
242
+ */
243
+ export function daemonCommandLineBelongsToWorkspace(commandLine, workspaceRoot) {
244
+ return commandLine.replace(/[\s"']+$/u, '').endsWith(`--workspace ${workspaceRoot}`);
245
+ }
246
+ async function startBackgroundDaemon(projectRoot, quiet, forwarded = {}) {
247
+ const { maxCpuLoad, minFreeMemory, workers, headless, sandbox } = forwarded;
248
+ // Validate and resolve project root
249
+ const resolvedRoot = resolve(projectRoot);
250
+ validatePath(resolvedRoot, 'Project root');
251
+ const stateDir = join(resolvedRoot, '.claude-flow');
252
+ const pidFile = join(stateDir, 'daemon.pid');
253
+ const logFile = join(stateDir, 'daemon.log');
254
+ // Validate all paths
255
+ validatePath(stateDir, 'State directory');
256
+ validatePath(pidFile, 'PID file');
257
+ validatePath(logFile, 'Log file');
258
+ // Ensure state directory exists
259
+ if (!fs.existsSync(stateDir)) {
260
+ fs.mkdirSync(stateDir, { recursive: true });
261
+ }
262
+ // Get path to CLI (from dist/src/commands/daemon.js -> bin/cli.js)
263
+ const __filename = fileURLToPath(import.meta.url);
264
+ const __dirname = dirname(__filename);
265
+ // dist/src/commands -> dist/src -> dist -> package root -> bin/cli.js
266
+ const cliPath = resolve(join(__dirname, '..', '..', '..', 'bin', 'cli.js'));
267
+ validatePath(cliPath, 'CLI path');
268
+ // Verify CLI path exists
269
+ if (!fs.existsSync(cliPath)) {
270
+ output.printError(`CLI not found at: ${cliPath}`);
271
+ return { success: false, exitCode: 1 };
272
+ }
273
+ // Platform-aware spawn flags. We use child_process.fork() because the daemon
274
+ // child is itself a Node script — fork() spawns Node directly and skips the
275
+ // cmd.exe interpretation pass that broke Windows + Node 25 when
276
+ // process.execPath contained a space (#1691). It also avoids the [DEP0190]
277
+ // shell:true security warning.
278
+ const isWin = process.platform === 'win32';
279
+ const forkOpts = {
280
+ cwd: resolvedRoot,
281
+ // detached: true on every platform (#1766). On Windows, leaving detached:false
282
+ // kept the child in the parent's process group AND the IPC pipe held the
283
+ // child to npx — when npx exited, the IPC pipe tore down and the daemon
284
+ // died within ~1s. detached:true + child.disconnect() (below) gives the
285
+ // child its own session/pgid and breaks the IPC pipe so the daemon
286
+ // genuinely survives parent exit. On POSIX, detached:true was already the
287
+ // path; this just makes Windows match.
288
+ detached: true,
289
+ // Use 'ignore' for all stdio + 'ignore' for the IPC channel via silent:true off.
290
+ // fork() defaults to creating an IPC channel; we don't need it here, so we
291
+ // pass stdio explicitly. Passing fs.openSync() FDs causes the child to die
292
+ // on Windows when the parent exits and closes the FDs (#1478 Bug 3) — the
293
+ // daemon writes its own logs via appendFileSync to .claude-flow/logs/.
294
+ stdio: ['ignore', 'ignore', 'ignore', 'ipc'],
295
+ windowsHide: true,
296
+ env: {
297
+ ...process.env,
298
+ CLAUDE_FLOW_DAEMON: '1',
299
+ // Prevent macOS SIGHUP kill when terminal closes
300
+ ...(process.platform === 'darwin' ? { NOHUP: '1' } : {}),
301
+ },
302
+ };
303
+ // Forward args to the foreground child. fork() resolves the script path
304
+ // via Node's normal module resolution, so cliPath does not need to be
305
+ // shell-quoted even when it contains spaces.
306
+ const forkArgs = ['daemon', 'start', '--foreground', '--quiet'];
307
+ // Validate with strict numeric pattern to prevent injection via crafted flags.
308
+ const SPAWN_NUMERIC_RE = /^\d+(\.\d+)?$/;
309
+ if (maxCpuLoad && SPAWN_NUMERIC_RE.test(maxCpuLoad)) {
310
+ forkArgs.push('--max-cpu-load', maxCpuLoad);
311
+ }
312
+ if (minFreeMemory && SPAWN_NUMERIC_RE.test(minFreeMemory)) {
313
+ forkArgs.push('--min-free-memory', minFreeMemory);
314
+ }
315
+ // #1968: forward worker-selection / sandbox flags. The previous launcher
316
+ // dropped these, so `daemon start --workers map` ran with the default
317
+ // five-worker set instead of just `map`. Validate each before passing
318
+ // through — argv goes straight to a forked process so reject anything
319
+ // that doesn't look like a comma-separated worker-name list or one of
320
+ // the allowed sandbox modes.
321
+ const WORKERS_RE = /^[a-z][a-z0-9_-]*(,[a-z][a-z0-9_-]*)*$/;
322
+ if (typeof workers === 'string' && workers.length > 0 && WORKERS_RE.test(workers)) {
323
+ forkArgs.push('--workers', workers);
324
+ }
325
+ if (headless === true) {
326
+ forkArgs.push('--headless');
327
+ }
328
+ if (typeof sandbox === 'string' && (sandbox === 'strict' || sandbox === 'permissive' || sandbox === 'disabled')) {
329
+ forkArgs.push('--sandbox', sandbox);
330
+ }
331
+ // #1914: stamp the workspace into argv (kept LAST) so the foreground daemon
332
+ // process is self-identifying and `killStaleDaemons` only reaps daemons
333
+ // belonging to this workspace. resolvedRoot was validatePath()'d above.
334
+ forkArgs.push('--workspace', resolvedRoot);
335
+ const child = fork(cliPath, forkArgs, forkOpts);
336
+ // Get PID from spawned process directly (no shell echo needed)
337
+ const pid = child.pid;
338
+ if (!pid || pid <= 0) {
339
+ output.printError('Failed to get daemon PID');
340
+ return { success: false, exitCode: 1 };
341
+ }
342
+ // Unref BEFORE writing PID file — prevents race where parent exits
343
+ // but child hasn't fully detached yet (fixes macOS daemon death #1283).
344
+ child.unref();
345
+ // #1766: also break the IPC pipe explicitly. unref() releases the libuv
346
+ // handle but does NOT close the IPC channel; on Windows the open IPC
347
+ // pipe keeps the daemon tied to its parent npx, and when npx exits the
348
+ // pipe is torn down and the daemon exits with it. disconnect() severs
349
+ // the IPC pipe so the daemon truly stands on its own. Wrapped in try
350
+ // because disconnect() throws if the IPC channel is already gone.
351
+ try {
352
+ child.disconnect();
353
+ }
354
+ catch { /* IPC channel already closed */ }
355
+ // Longer delay to let the child process start and write its own PID file.
356
+ // 100ms was too short on Windows; the child's checkExistingDaemon() would
357
+ // find the parent-written PID and return early (#1478 Bug 1).
358
+ await new Promise(resolve => setTimeout(resolve, 500));
359
+ // Write PID file only if the child hasn't already written its own.
360
+ // The foreground child calls writePidFile() internally, but on some platforms
361
+ // it may not have started yet, so we write as a fallback.
362
+ if (!fs.existsSync(pidFile)) {
363
+ fs.writeFileSync(pidFile, String(pid));
364
+ }
365
+ if (!quiet) {
366
+ output.printSuccess(`Daemon started in background (PID: ${pid})`);
367
+ output.printInfo(`Logs: ${logFile}`);
368
+ output.printInfo(`Stop with: claude-flow daemon stop`);
369
+ }
370
+ return { success: true };
371
+ }
372
+ // Stop daemon subcommand
373
+ const stopCommand = {
374
+ name: 'stop',
375
+ description: 'Stop the worker daemon and all background workers',
376
+ options: [
377
+ { name: 'quiet', short: 'Q', type: 'boolean', description: 'Suppress output' },
378
+ ],
379
+ examples: [
380
+ { command: 'claude-flow daemon stop', description: 'Stop the daemon' },
381
+ ],
382
+ action: async (ctx) => {
383
+ const quiet = ctx.flags.quiet;
384
+ const projectRoot = process.cwd();
385
+ try {
386
+ if (!quiet) {
387
+ const spinner = output.createSpinner({ text: 'Stopping worker daemon...', spinner: 'dots' });
388
+ spinner.start();
389
+ // Try to stop in-process daemon first
390
+ await stopDaemon();
391
+ // Also kill any background daemon by PID
392
+ const killed = await killBackgroundDaemon(projectRoot);
393
+ // #1551: Also kill stale daemon processes not tracked by PID file
394
+ await killStaleDaemons(projectRoot, true);
395
+ spinner.succeed(killed ? 'Worker daemon stopped' : 'Worker daemon was not running');
396
+ }
397
+ else {
398
+ await stopDaemon();
399
+ await killBackgroundDaemon(projectRoot);
400
+ await killStaleDaemons(projectRoot, true);
401
+ }
402
+ return { success: true };
403
+ }
404
+ catch (error) {
405
+ output.printError(`Failed to stop daemon: ${error instanceof Error ? error.message : String(error)}`);
406
+ return { success: false, exitCode: 1 };
407
+ }
408
+ },
409
+ };
410
+ /**
411
+ * Kill background daemon process using PID file
412
+ */
413
+ async function killBackgroundDaemon(projectRoot) {
414
+ const pidFile = join(projectRoot, '.claude-flow', 'daemon.pid');
415
+ if (!fs.existsSync(pidFile)) {
416
+ return false;
417
+ }
418
+ try {
419
+ const pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
420
+ if (isNaN(pid)) {
421
+ fs.unlinkSync(pidFile);
422
+ return false;
423
+ }
424
+ // Check if process is running
425
+ try {
426
+ process.kill(pid, 0); // Signal 0 = check if alive
427
+ }
428
+ catch {
429
+ // Process not running, clean up stale PID file
430
+ fs.unlinkSync(pidFile);
431
+ return false;
432
+ }
433
+ // Kill the process
434
+ process.kill(pid, 'SIGTERM');
435
+ // Wait a moment then force kill if needed
436
+ await new Promise(resolve => setTimeout(resolve, 1000));
437
+ try {
438
+ process.kill(pid, 0);
439
+ // Still alive, force kill
440
+ process.kill(pid, 'SIGKILL');
441
+ }
442
+ catch {
443
+ // Process terminated
444
+ }
445
+ // Clean up PID file
446
+ if (fs.existsSync(pidFile)) {
447
+ fs.unlinkSync(pidFile);
448
+ }
449
+ return true;
450
+ }
451
+ catch (error) {
452
+ // Clean up PID file on any error
453
+ if (fs.existsSync(pidFile)) {
454
+ fs.unlinkSync(pidFile);
455
+ }
456
+ return false;
457
+ }
458
+ }
459
+ /**
460
+ * Kill stale daemon processes not tracked by the PID file (#1551, #1857).
461
+ * Uses `ps` on POSIX and `tasklist` on Windows to find all daemon
462
+ * processes for this project and kill them.
463
+ */
464
+ async function killStaleDaemons(projectRoot, quiet) {
465
+ if (process.platform === 'win32') {
466
+ return killStaleDaemonsWindows(projectRoot, quiet);
467
+ }
468
+ return killStaleDaemonsPosix(projectRoot, quiet);
469
+ }
470
+ async function killStaleDaemonsPosix(projectRoot, quiet) {
471
+ try {
472
+ const { execFileSync } = await import('child_process');
473
+ const psOutput = execFileSync('ps', ['-eo', 'pid,command'], { encoding: 'utf-8', timeout: 5000 });
474
+ const lines = psOutput.split('\n');
475
+ const currentPid = process.pid;
476
+ const trackedPid = getBackgroundDaemonPid(projectRoot);
477
+ // #1914: only ever reap daemons belonging to THIS workspace (ADR-014).
478
+ const resolvedRoot = resolve(projectRoot);
479
+ let killed = 0;
480
+ for (const line of lines) {
481
+ if (!line.includes('daemon start --foreground'))
482
+ continue;
483
+ if (!line.includes('claude-flow') && !line.includes('@claude-flow/cli'))
484
+ continue;
485
+ // #1914: skip daemons from other workspaces (or pre-#1914 versions that
486
+ // didn't stamp --workspace — let `daemon stop` handle those via PID file).
487
+ if (!daemonCommandLineBelongsToWorkspace(line, resolvedRoot))
488
+ continue;
489
+ const pidStr = line.trim().split(/\s+/)[0];
490
+ const pid = parseInt(pidStr, 10);
491
+ if (isNaN(pid) || pid === currentPid || pid === trackedPid)
492
+ continue;
493
+ if (!isProcessRunning(pid))
494
+ continue;
495
+ try {
496
+ process.kill(pid, 'SIGTERM');
497
+ killed++;
498
+ if (!quiet) {
499
+ output.printWarning(`Killed stale daemon process (PID: ${pid})`);
500
+ }
501
+ }
502
+ catch { /* ignore — may have exited between check and kill */ }
503
+ }
504
+ if (killed > 0 && !quiet) {
505
+ output.printInfo(`Cleaned up ${killed} stale daemon process(es)`);
506
+ }
507
+ }
508
+ catch {
509
+ // ps not available or failed — skip stale cleanup
510
+ }
511
+ }
512
+ /**
513
+ * #1857: Windows replacement for the POSIX `ps -eo pid,command` path.
514
+ * Uses `tasklist /v /fo csv` which returns CSV with the full Window
515
+ * Title column (last field) — Node-spawned daemon processes carry
516
+ * their command line there. Best-effort like the POSIX path: any
517
+ * tooling failure (tasklist missing, parse error, etc.) is swallowed
518
+ * silently so cleanup doesn't break daemon start.
519
+ */
520
+ async function killStaleDaemonsWindows(projectRoot, quiet) {
521
+ try {
522
+ const { execFileSync } = await import('child_process');
523
+ // /v includes the Window Title; /fo csv uses comma-separated quoted fields
524
+ const out = execFileSync('tasklist', ['/v', '/fo', 'csv', '/nh'], { encoding: 'utf-8', timeout: 5000 });
525
+ const lines = out.split(/\r?\n/);
526
+ const currentPid = process.pid;
527
+ const trackedPid = getBackgroundDaemonPid(projectRoot);
528
+ // #1914: only ever reap daemons belonging to THIS workspace (ADR-014).
529
+ const resolvedRoot = resolve(projectRoot);
530
+ let killed = 0;
531
+ for (const line of lines) {
532
+ if (!line.trim())
533
+ continue;
534
+ // Match daemon command line markers — the Window Title field
535
+ // typically holds the full invocation. Skip rows that aren't ours.
536
+ if (!line.includes('daemon start --foreground'))
537
+ continue;
538
+ if (!line.includes('claude-flow') && !line.includes('@claude-flow/cli'))
539
+ continue;
540
+ // #1914: skip daemons from other workspaces (or pre-#1914 versions).
541
+ if (!daemonCommandLineBelongsToWorkspace(line, resolvedRoot))
542
+ continue;
543
+ // Parse CSV: tasklist quotes each field, so split on `","`
544
+ const fields = line.split(/","/).map(f => f.replace(/^"|"$/g, ''));
545
+ // fields[0] = Image Name, fields[1] = PID, …
546
+ const pidStr = fields[1];
547
+ const pid = parseInt(pidStr ?? '', 10);
548
+ if (isNaN(pid) || pid === currentPid || pid === trackedPid)
549
+ continue;
550
+ if (!isProcessRunning(pid))
551
+ continue;
552
+ try {
553
+ // taskkill is the Windows equivalent of kill — /pid <n> /f forces.
554
+ // Use SIGTERM-equivalent (no /f) first; the daemon's signal handler
555
+ // catches and cleans up; force-kill is the next start's job.
556
+ execFileSync('taskkill', ['/pid', String(pid), '/t'], { encoding: 'utf-8', timeout: 5000 });
557
+ killed++;
558
+ if (!quiet) {
559
+ output.printWarning(`Killed stale daemon process (PID: ${pid})`);
560
+ }
561
+ }
562
+ catch { /* taskkill failed — process may have exited; ignore */ }
563
+ }
564
+ if (killed > 0 && !quiet) {
565
+ output.printInfo(`Cleaned up ${killed} stale daemon process(es)`);
566
+ }
567
+ }
568
+ catch {
569
+ // tasklist not available or failed — skip stale cleanup. Defensive
570
+ // shape matches the POSIX path. Not tested on Windows by the
571
+ // maintainer; please report regressions on the issue tracker.
572
+ }
573
+ }
574
+ /**
575
+ * Get PID of background daemon from PID file
576
+ */
577
+ function getBackgroundDaemonPid(projectRoot) {
578
+ const pidFile = join(projectRoot, '.claude-flow', 'daemon.pid');
579
+ if (!fs.existsSync(pidFile)) {
580
+ return null;
581
+ }
582
+ try {
583
+ const pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
584
+ return isNaN(pid) ? null : pid;
585
+ }
586
+ catch {
587
+ return null;
588
+ }
589
+ }
590
+ /**
591
+ * Check if a process is running
592
+ */
593
+ function isProcessRunning(pid) {
594
+ try {
595
+ process.kill(pid, 0); // Signal 0 = check if alive
596
+ return true;
597
+ }
598
+ catch {
599
+ return false;
600
+ }
601
+ }
602
+ // Status subcommand
603
+ const statusCommand = {
604
+ name: 'status',
605
+ description: 'Show daemon and worker status',
606
+ options: [
607
+ { name: 'verbose', short: 'v', type: 'boolean', description: 'Show detailed worker statistics' },
608
+ { name: 'show-modes', type: 'boolean', description: 'Show worker execution modes (local/headless) and sandbox settings' },
609
+ ],
610
+ examples: [
611
+ { command: 'claude-flow daemon status', description: 'Show daemon status' },
612
+ { command: 'claude-flow daemon status -v', description: 'Show detailed status' },
613
+ { command: 'claude-flow daemon status --show-modes', description: 'Show worker execution modes' },
614
+ ],
615
+ action: async (ctx) => {
616
+ const verbose = ctx.flags.verbose;
617
+ const showModes = ctx.flags['show-modes'];
618
+ const projectRoot = process.cwd();
619
+ try {
620
+ const daemon = getDaemon(projectRoot);
621
+ const status = daemon.getStatus();
622
+ // Also check for background daemon
623
+ const bgPid = getBackgroundDaemonPid(projectRoot);
624
+ const bgRunning = bgPid ? isProcessRunning(bgPid) : false;
625
+ const isRunning = status.running || bgRunning;
626
+ const displayPid = bgPid || status.pid;
627
+ output.writeln();
628
+ // Daemon status box
629
+ const statusIcon = isRunning ? output.success('●') : output.error('○');
630
+ const statusText = isRunning ? output.success('RUNNING') : output.error('STOPPED');
631
+ const mode = bgRunning ? output.dim(' (background)') : status.running ? output.dim(' (foreground)') : '';
632
+ output.printBox([
633
+ `Status: ${statusIcon} ${statusText}${mode}`,
634
+ `PID: ${displayPid}`,
635
+ status.startedAt ? `Started: ${status.startedAt.toISOString()}` : '',
636
+ `Workers Enabled: ${status.config.workers.filter(w => w.enabled).length}`,
637
+ `Max Concurrent: ${status.config.maxConcurrent}`,
638
+ `Max CPU Load: ${status.config.resourceThresholds.maxCpuLoad}`,
639
+ `Min Free Memory: ${status.config.resourceThresholds.minFreeMemoryPercent}%`,
640
+ ].filter(Boolean).join('\n'), 'RuFlo Daemon');
641
+ output.writeln();
642
+ output.writeln(output.bold('Worker Status'));
643
+ const workerData = status.config.workers.map(w => {
644
+ const state = status.workers.get(w.type);
645
+ // Check for headless mode from worker config or state
646
+ const isHeadless = w.headless || state?.headless || false;
647
+ const sandboxMode = w.sandbox || state?.sandbox || null;
648
+ return {
649
+ type: w.enabled ? output.highlight(w.type) : output.dim(w.type),
650
+ enabled: w.enabled ? output.success('✓') : output.dim('○'),
651
+ status: state?.isRunning ? output.warning('running') :
652
+ w.enabled ? output.success('idle') : output.dim('disabled'),
653
+ runs: state?.runCount ?? 0,
654
+ success: state ? `${Math.round((state.successCount / Math.max(state.runCount, 1)) * 100)}%` : '-',
655
+ lastRun: state?.lastRun ? formatTimeAgo(state.lastRun) : output.dim('never'),
656
+ nextRun: state?.nextRun && w.enabled ? formatTimeUntil(state.nextRun) : output.dim('-'),
657
+ mode: isHeadless ? output.highlight('headless') : output.dim('local'),
658
+ sandbox: isHeadless ? (sandboxMode || 'strict') : output.dim('-'),
659
+ };
660
+ });
661
+ // Build columns based on --show-modes flag
662
+ const baseColumns = [
663
+ { key: 'type', header: 'Worker', width: 12 },
664
+ { key: 'enabled', header: 'On', width: 4 },
665
+ { key: 'status', header: 'Status', width: 10 },
666
+ { key: 'runs', header: 'Runs', width: 6 },
667
+ { key: 'success', header: 'Success', width: 8 },
668
+ { key: 'lastRun', header: 'Last Run', width: 12 },
669
+ { key: 'nextRun', header: 'Next Run', width: 12 },
670
+ ];
671
+ const modeColumns = showModes ? [
672
+ { key: 'mode', header: 'Mode', width: 10 },
673
+ { key: 'sandbox', header: 'Sandbox', width: 12 },
674
+ ] : [];
675
+ output.printTable({
676
+ columns: [...baseColumns, ...modeColumns],
677
+ data: workerData,
678
+ });
679
+ if (verbose) {
680
+ output.writeln();
681
+ output.writeln(output.bold('Worker Configuration'));
682
+ output.printTable({
683
+ columns: [
684
+ { key: 'type', header: 'Worker', width: 12 },
685
+ { key: 'interval', header: 'Interval', width: 10 },
686
+ { key: 'priority', header: 'Priority', width: 10 },
687
+ { key: 'avgDuration', header: 'Avg Duration', width: 12 },
688
+ { key: 'description', header: 'Description', width: 30 },
689
+ ],
690
+ data: status.config.workers.map(w => {
691
+ const state = status.workers.get(w.type);
692
+ return {
693
+ type: w.type,
694
+ interval: `${Math.round(w.intervalMs / 60000)}min`,
695
+ priority: w.priority,
696
+ avgDuration: state?.averageDurationMs ? `${Math.round(state.averageDurationMs)}ms` : '-',
697
+ description: w.description,
698
+ };
699
+ }),
700
+ });
701
+ }
702
+ return { success: true, data: status };
703
+ }
704
+ catch (error) {
705
+ // Daemon not initialized
706
+ output.writeln();
707
+ output.printBox([
708
+ `Status: ${output.error('○')} ${output.error('NOT INITIALIZED')}`,
709
+ '',
710
+ 'Run "claude-flow daemon start" to start the daemon',
711
+ ].join('\n'), 'RuFlo Daemon');
712
+ return { success: true };
713
+ }
714
+ },
715
+ };
716
+ // Trigger subcommand - manually run a worker
717
+ const triggerCommand = {
718
+ name: 'trigger',
719
+ description: 'Manually trigger a specific worker',
720
+ options: [
721
+ { name: 'worker', short: 'w', type: 'string', description: 'Worker type to trigger', required: true },
722
+ { name: 'headless', type: 'boolean', description: 'Run triggered worker in headless mode (E2B sandbox)' },
723
+ ],
724
+ examples: [
725
+ { command: 'claude-flow daemon trigger -w map', description: 'Trigger the map worker' },
726
+ { command: 'claude-flow daemon trigger -w audit', description: 'Trigger security audit' },
727
+ { command: 'claude-flow daemon trigger -w audit --headless', description: 'Trigger audit in headless sandbox' },
728
+ ],
729
+ action: async (ctx) => {
730
+ const workerType = ctx.flags.worker;
731
+ if (!workerType) {
732
+ output.printError('Worker type is required. Use --worker or -w flag.');
733
+ output.writeln();
734
+ output.writeln('Available workers: map, audit, optimize, consolidate, testgaps, predict, document, ultralearn, refactor, benchmark, deepdive, preload');
735
+ return { success: false, exitCode: 1 };
736
+ }
737
+ try {
738
+ const daemon = getDaemon(process.cwd());
739
+ const spinner = output.createSpinner({ text: `Running ${workerType} worker...`, spinner: 'dots' });
740
+ spinner.start();
741
+ const result = await daemon.triggerWorker(workerType);
742
+ if (result.success) {
743
+ spinner.succeed(`Worker ${workerType} completed in ${result.durationMs}ms`);
744
+ if (result.output) {
745
+ output.writeln();
746
+ output.writeln(output.bold('Output'));
747
+ output.printJson(result.output);
748
+ }
749
+ }
750
+ else {
751
+ spinner.fail(`Worker ${workerType} failed: ${result.error}`);
752
+ }
753
+ return { success: result.success, data: result };
754
+ }
755
+ catch (error) {
756
+ output.printError(`Failed to trigger worker: ${error instanceof Error ? error.message : String(error)}`);
757
+ return { success: false, exitCode: 1 };
758
+ }
759
+ },
760
+ };
761
+ // Enable/disable worker subcommand
762
+ const enableCommand = {
763
+ name: 'enable',
764
+ description: 'Enable or disable a specific worker',
765
+ options: [
766
+ { name: 'worker', short: 'w', type: 'string', description: 'Worker type', required: true },
767
+ { name: 'disable', short: 'd', type: 'boolean', description: 'Disable instead of enable' },
768
+ ],
769
+ examples: [
770
+ { command: 'claude-flow daemon enable -w predict', description: 'Enable predict worker' },
771
+ { command: 'claude-flow daemon enable -w document --disable', description: 'Disable document worker' },
772
+ ],
773
+ action: async (ctx) => {
774
+ const workerType = ctx.flags.worker;
775
+ const disable = ctx.flags.disable;
776
+ if (!workerType) {
777
+ output.printError('Worker type is required. Use --worker or -w flag.');
778
+ return { success: false, exitCode: 1 };
779
+ }
780
+ try {
781
+ const daemon = getDaemon(process.cwd());
782
+ daemon.setWorkerEnabled(workerType, !disable);
783
+ output.printSuccess(`Worker ${workerType} ${disable ? 'disabled' : 'enabled'}`);
784
+ return { success: true };
785
+ }
786
+ catch (error) {
787
+ output.printError(`Failed to ${disable ? 'disable' : 'enable'} worker: ${error instanceof Error ? error.message : String(error)}`);
788
+ return { success: false, exitCode: 1 };
789
+ }
790
+ },
791
+ };
792
+ // Helper functions for time formatting
793
+ function formatTimeAgo(date) {
794
+ const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
795
+ if (seconds < 60)
796
+ return `${seconds}s ago`;
797
+ if (seconds < 3600)
798
+ return `${Math.floor(seconds / 60)}m ago`;
799
+ if (seconds < 86400)
800
+ return `${Math.floor(seconds / 3600)}h ago`;
801
+ return `${Math.floor(seconds / 86400)}d ago`;
802
+ }
803
+ function formatTimeUntil(date) {
804
+ const seconds = Math.floor((date.getTime() - Date.now()) / 1000);
805
+ if (seconds < 0)
806
+ return 'now';
807
+ if (seconds < 60)
808
+ return `in ${seconds}s`;
809
+ if (seconds < 3600)
810
+ return `in ${Math.floor(seconds / 60)}m`;
811
+ if (seconds < 86400)
812
+ return `in ${Math.floor(seconds / 3600)}h`;
813
+ return `in ${Math.floor(seconds / 86400)}d`;
814
+ }
815
+ // #1565: Supervisor installer subcommand. Writes a native auto-restart
816
+ // unit (launchd plist on macOS, systemd-user .service on Linux) so the
817
+ // daemon survives crashes and reboots without requiring the operator
818
+ // to manually run `daemon start` after every failure.
819
+ const installSupervisorCommand = {
820
+ name: 'install-supervisor',
821
+ description: 'Install OS-level auto-restart supervisor (launchd on macOS, systemd-user on Linux)',
822
+ options: [
823
+ { name: 'force', short: 'f', type: 'boolean', description: 'Overwrite existing unit file', default: 'false' },
824
+ { name: 'load', type: 'boolean', description: 'Load/enable the unit immediately', default: 'true' },
825
+ { name: 'dry-run', type: 'boolean', description: 'Print the unit file content without writing', default: 'false' },
826
+ ],
827
+ examples: [
828
+ { command: 'claude-flow daemon install-supervisor', description: 'Install + load (auto-restart enabled)' },
829
+ { command: 'claude-flow daemon install-supervisor --no-load', description: 'Write unit file but do not enable yet' },
830
+ { command: 'claude-flow daemon install-supervisor --dry-run', description: 'Preview the unit file' },
831
+ ],
832
+ action: async (ctx) => {
833
+ const force = ctx.flags.force === true;
834
+ const load = ctx.flags.load !== false;
835
+ const dryRun = ctx.flags['dry-run'] === true || ctx.flags.dryRun === true;
836
+ const projectRoot = process.cwd();
837
+ const platform = process.platform;
838
+ if (platform === 'win32') {
839
+ output.printError('Windows scheduled-task installer is not yet implemented.');
840
+ output.printInfo('Use Task Scheduler manually, or follow this issue: https://github.com/ruvnet/ruflo/issues/1565');
841
+ return { success: false, exitCode: 1 };
842
+ }
843
+ if (platform !== 'darwin' && platform !== 'linux') {
844
+ output.printError(`Unsupported platform: ${platform}. Supported: darwin (launchd), linux (systemd-user).`);
845
+ return { success: false, exitCode: 1 };
846
+ }
847
+ // Resolve absolute paths the unit file will reference.
848
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? '';
849
+ if (!home) {
850
+ output.printError('HOME/USERPROFILE not set; cannot resolve user unit path.');
851
+ return { success: false, exitCode: 1 };
852
+ }
853
+ const nodeBin = process.execPath;
854
+ const __filename = fileURLToPath(import.meta.url);
855
+ const __dirname = dirname(__filename);
856
+ const cliJs = resolve(join(__dirname, '..', '..', '..', 'bin', 'cli.js'));
857
+ if (!fs.existsSync(cliJs)) {
858
+ output.printError(`CLI not found at: ${cliJs}`);
859
+ return { success: false, exitCode: 1 };
860
+ }
861
+ if (platform === 'darwin') {
862
+ const plistDir = join(home, 'Library', 'LaunchAgents');
863
+ const plistPath = join(plistDir, 'io.ruv.ruflo.daemon.plist');
864
+ const logDir = join(projectRoot, '.claude-flow', 'logs');
865
+ const plist = `<?xml version="1.0" encoding="UTF-8"?>
866
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
867
+ <plist version="1.0">
868
+ <dict>
869
+ <key>Label</key><string>io.ruv.ruflo.daemon</string>
870
+ <key>ProgramArguments</key>
871
+ <array>
872
+ <string>${nodeBin}</string>
873
+ <string>${cliJs}</string>
874
+ <string>daemon</string><string>start</string><string>--foreground</string><string>--quiet</string>
875
+ </array>
876
+ <key>WorkingDirectory</key><string>${projectRoot}</string>
877
+ <key>RunAtLoad</key><true/>
878
+ <key>KeepAlive</key>
879
+ <dict>
880
+ <key>SuccessfulExit</key><false/>
881
+ <key>Crashed</key><true/>
882
+ </dict>
883
+ <key>ThrottleInterval</key><integer>10</integer>
884
+ <key>StandardOutPath</key><string>${logDir}/supervisor.out.log</string>
885
+ <key>StandardErrorPath</key><string>${logDir}/supervisor.err.log</string>
886
+ <key>EnvironmentVariables</key>
887
+ <dict>
888
+ <key>CLAUDE_FLOW_DAEMON</key><string>1</string>
889
+ </dict>
890
+ </dict>
891
+ </plist>
892
+ `;
893
+ if (dryRun) {
894
+ output.writeln(plist);
895
+ return { success: true };
896
+ }
897
+ if (fs.existsSync(plistPath) && !force) {
898
+ output.printWarning(`Already installed: ${plistPath}`);
899
+ output.printInfo('Use --force to overwrite.');
900
+ return { success: false, exitCode: 1 };
901
+ }
902
+ if (!fs.existsSync(plistDir))
903
+ fs.mkdirSync(plistDir, { recursive: true });
904
+ if (!fs.existsSync(logDir))
905
+ fs.mkdirSync(logDir, { recursive: true });
906
+ fs.writeFileSync(plistPath, plist, 'utf-8');
907
+ output.printSuccess(`Wrote ${plistPath}`);
908
+ if (load) {
909
+ try {
910
+ const { execFileSync } = await import('child_process');
911
+ // unload first in case a previous version is loaded
912
+ try {
913
+ execFileSync('launchctl', ['unload', plistPath], { encoding: 'utf-8', timeout: 5000 });
914
+ }
915
+ catch { /* ok */ }
916
+ execFileSync('launchctl', ['load', '-w', plistPath], { encoding: 'utf-8', timeout: 5000 });
917
+ output.printSuccess('Supervisor loaded — daemon will auto-restart on crash and survive reboot.');
918
+ }
919
+ catch (err) {
920
+ output.printWarning(`launchctl load failed: ${err instanceof Error ? err.message : String(err)}`);
921
+ output.printInfo(`Run manually: launchctl load -w ${plistPath}`);
922
+ }
923
+ }
924
+ else {
925
+ output.printInfo(`Run when ready: launchctl load -w ${plistPath}`);
926
+ }
927
+ return { success: true };
928
+ }
929
+ // Linux: systemd-user
930
+ const unitDir = join(home, '.config', 'systemd', 'user');
931
+ const unitPath = join(unitDir, 'ruflo-daemon.service');
932
+ const unit = `[Unit]
933
+ Description=RuFlo background worker daemon
934
+ After=default.target
935
+
936
+ [Service]
937
+ Type=simple
938
+ WorkingDirectory=${projectRoot}
939
+ Environment=CLAUDE_FLOW_DAEMON=1
940
+ ExecStart=${nodeBin} ${cliJs} daemon start --foreground --quiet
941
+ Restart=on-failure
942
+ RestartSec=10
943
+ # Restart on Crashed (signal) too
944
+ StartLimitIntervalSec=300
945
+ StartLimitBurst=5
946
+
947
+ [Install]
948
+ WantedBy=default.target
949
+ `;
950
+ if (dryRun) {
951
+ output.writeln(unit);
952
+ return { success: true };
953
+ }
954
+ if (fs.existsSync(unitPath) && !force) {
955
+ output.printWarning(`Already installed: ${unitPath}`);
956
+ output.printInfo('Use --force to overwrite.');
957
+ return { success: false, exitCode: 1 };
958
+ }
959
+ if (!fs.existsSync(unitDir))
960
+ fs.mkdirSync(unitDir, { recursive: true });
961
+ fs.writeFileSync(unitPath, unit, 'utf-8');
962
+ output.printSuccess(`Wrote ${unitPath}`);
963
+ if (load) {
964
+ try {
965
+ const { execFileSync } = await import('child_process');
966
+ execFileSync('systemctl', ['--user', 'daemon-reload'], { encoding: 'utf-8', timeout: 5000 });
967
+ execFileSync('systemctl', ['--user', 'enable', '--now', 'ruflo-daemon.service'], { encoding: 'utf-8', timeout: 10000 });
968
+ output.printSuccess('Supervisor enabled — daemon will auto-restart on crash and survive reboot.');
969
+ output.printInfo('Note: requires `loginctl enable-linger $USER` for restart-after-logout on some distros.');
970
+ }
971
+ catch (err) {
972
+ output.printWarning(`systemctl --user enable failed: ${err instanceof Error ? err.message : String(err)}`);
973
+ output.printInfo(`Run manually: systemctl --user daemon-reload && systemctl --user enable --now ruflo-daemon.service`);
974
+ }
975
+ }
976
+ else {
977
+ output.printInfo(`Run when ready: systemctl --user daemon-reload && systemctl --user enable --now ruflo-daemon.service`);
978
+ }
979
+ return { success: true };
980
+ },
981
+ };
982
+ const uninstallSupervisorCommand = {
983
+ name: 'uninstall-supervisor',
984
+ description: 'Remove the auto-restart supervisor unit (launchd on macOS, systemd-user on Linux)',
985
+ options: [],
986
+ action: async () => {
987
+ const platform = process.platform;
988
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? '';
989
+ if (platform === 'darwin') {
990
+ const plistPath = join(home, 'Library', 'LaunchAgents', 'io.ruv.ruflo.daemon.plist');
991
+ try {
992
+ const { execFileSync } = await import('child_process');
993
+ try {
994
+ execFileSync('launchctl', ['unload', plistPath], { encoding: 'utf-8', timeout: 5000 });
995
+ }
996
+ catch { /* ok */ }
997
+ }
998
+ catch { /* ignore */ }
999
+ if (fs.existsSync(plistPath)) {
1000
+ fs.unlinkSync(plistPath);
1001
+ output.printSuccess(`Removed ${plistPath}`);
1002
+ }
1003
+ else {
1004
+ output.printInfo(`Not installed: ${plistPath}`);
1005
+ }
1006
+ return { success: true };
1007
+ }
1008
+ if (platform === 'linux') {
1009
+ const unitPath = join(home, '.config', 'systemd', 'user', 'ruflo-daemon.service');
1010
+ try {
1011
+ const { execFileSync } = await import('child_process');
1012
+ try {
1013
+ execFileSync('systemctl', ['--user', 'disable', '--now', 'ruflo-daemon.service'], { encoding: 'utf-8', timeout: 5000 });
1014
+ }
1015
+ catch { /* ok */ }
1016
+ }
1017
+ catch { /* ignore */ }
1018
+ if (fs.existsSync(unitPath)) {
1019
+ fs.unlinkSync(unitPath);
1020
+ output.printSuccess(`Removed ${unitPath}`);
1021
+ }
1022
+ else {
1023
+ output.printInfo(`Not installed: ${unitPath}`);
1024
+ }
1025
+ return { success: true };
1026
+ }
1027
+ output.printError(`Unsupported platform: ${platform}`);
1028
+ return { success: false, exitCode: 1 };
1029
+ },
1030
+ };
1031
+ // Main daemon command
1032
+ export const daemonCommand = {
1033
+ name: 'daemon',
1034
+ description: 'Manage background worker daemon (Node.js-based, auto-runs like shell helpers)',
1035
+ subcommands: [
1036
+ startCommand,
1037
+ stopCommand,
1038
+ statusCommand,
1039
+ triggerCommand,
1040
+ enableCommand,
1041
+ installSupervisorCommand,
1042
+ uninstallSupervisorCommand,
1043
+ ],
1044
+ options: [],
1045
+ examples: [
1046
+ { command: 'claude-flow daemon start', description: 'Start the daemon' },
1047
+ { command: 'claude-flow daemon start --headless', description: 'Start with headless workers (E2B sandbox)' },
1048
+ { command: 'claude-flow daemon status', description: 'Check daemon status' },
1049
+ { command: 'claude-flow daemon stop', description: 'Stop the daemon' },
1050
+ { command: 'claude-flow daemon trigger -w audit', description: 'Run security audit' },
1051
+ ],
1052
+ action: async () => {
1053
+ output.writeln();
1054
+ output.writeln(output.bold('RuFlo Daemon - Background Task Management'));
1055
+ output.writeln();
1056
+ output.writeln('Node.js-based background worker system that auto-runs like shell daemons.');
1057
+ output.writeln('Manages 12 specialized workers for continuous optimization and monitoring.');
1058
+ output.writeln();
1059
+ output.writeln(output.bold('Headless Mode'));
1060
+ output.writeln('Workers can run in headless mode using E2B sandboxes for isolated execution.');
1061
+ output.writeln('Use --headless flag with start/trigger commands. Sandbox modes: strict, permissive, disabled.');
1062
+ output.writeln();
1063
+ output.writeln(output.bold('Available Workers'));
1064
+ output.printList([
1065
+ `${output.highlight('map')} - Codebase mapping (5 min interval)`,
1066
+ `${output.highlight('audit')} - Security analysis (10 min interval)`,
1067
+ `${output.highlight('optimize')} - Performance optimization (15 min interval)`,
1068
+ `${output.highlight('consolidate')} - Memory consolidation (30 min interval)`,
1069
+ `${output.highlight('testgaps')} - Test coverage analysis (20 min interval)`,
1070
+ `${output.highlight('predict')} - Predictive preloading (2 min, disabled by default)`,
1071
+ `${output.highlight('document')} - Auto-documentation (60 min, disabled by default)`,
1072
+ `${output.highlight('ultralearn')} - Deep knowledge acquisition (manual trigger)`,
1073
+ `${output.highlight('refactor')} - Code refactoring suggestions (manual trigger)`,
1074
+ `${output.highlight('benchmark')} - Performance benchmarking (manual trigger)`,
1075
+ `${output.highlight('deepdive')} - Deep code analysis (manual trigger)`,
1076
+ `${output.highlight('preload')} - Resource preloading (manual trigger)`,
1077
+ ]);
1078
+ output.writeln();
1079
+ output.writeln(output.bold('Subcommands'));
1080
+ output.printList([
1081
+ `${output.highlight('start')} - Start the daemon`,
1082
+ `${output.highlight('stop')} - Stop the daemon`,
1083
+ `${output.highlight('status')} - Show daemon status`,
1084
+ `${output.highlight('trigger')} - Manually run a worker`,
1085
+ `${output.highlight('enable')} - Enable/disable a worker`,
1086
+ ]);
1087
+ output.writeln();
1088
+ output.writeln('Run "claude-flow daemon <subcommand> --help" for details');
1089
+ return { success: true };
1090
+ },
1091
+ };
1092
+ export default daemonCommand;
1093
+ //# sourceMappingURL=daemon.js.map