moflo 4.0.4 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/MIGRATION_SUMMARY.md +221 -221
- package/.claude/agents/analysis/analyze-code-quality.md +178 -178
- package/.claude/agents/analysis/code-analyzer.md +209 -209
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +178 -178
- package/.claude/agents/architecture/system-design/arch-system-design.md +154 -154
- package/.claude/agents/base-template-generator.md +42 -42
- package/.claude/agents/consensus/byzantine-coordinator.md +62 -62
- package/.claude/agents/consensus/crdt-synchronizer.md +996 -996
- package/.claude/agents/consensus/gossip-coordinator.md +62 -62
- package/.claude/agents/consensus/performance-benchmarker.md +850 -850
- package/.claude/agents/consensus/quorum-manager.md +822 -822
- package/.claude/agents/consensus/raft-manager.md +62 -62
- package/.claude/agents/consensus/security-manager.md +621 -621
- package/.claude/agents/core/coder.md +265 -265
- package/.claude/agents/core/planner.md +167 -167
- package/.claude/agents/core/researcher.md +189 -189
- package/.claude/agents/core/reviewer.md +325 -325
- package/.claude/agents/core/tester.md +318 -318
- package/.claude/agents/custom/test-long-runner.md +44 -44
- package/.claude/agents/data/ml/data-ml-model.md +192 -192
- package/.claude/agents/development/backend/dev-backend-api.md +141 -141
- package/.claude/agents/development/dev-backend-api.md +344 -344
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +163 -163
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +173 -173
- package/.claude/agents/dual-mode/codex-coordinator.md +224 -224
- package/.claude/agents/dual-mode/codex-worker.md +211 -211
- package/.claude/agents/dual-mode/dual-orchestrator.md +291 -291
- package/.claude/agents/flow-nexus/app-store.md +87 -87
- package/.claude/agents/flow-nexus/authentication.md +68 -68
- package/.claude/agents/flow-nexus/challenges.md +80 -80
- package/.claude/agents/flow-nexus/neural-network.md +87 -87
- package/.claude/agents/flow-nexus/payments.md +82 -82
- package/.claude/agents/flow-nexus/sandbox.md +75 -75
- package/.claude/agents/flow-nexus/swarm.md +75 -75
- package/.claude/agents/flow-nexus/user-tools.md +95 -95
- package/.claude/agents/flow-nexus/workflow.md +83 -83
- package/.claude/agents/github/code-review-swarm.md +537 -537
- package/.claude/agents/github/github-modes.md +172 -172
- package/.claude/agents/github/issue-tracker.md +318 -318
- package/.claude/agents/github/multi-repo-swarm.md +552 -552
- package/.claude/agents/github/pr-manager.md +190 -190
- package/.claude/agents/github/project-board-sync.md +508 -508
- package/.claude/agents/github/release-manager.md +366 -366
- package/.claude/agents/github/release-swarm.md +582 -582
- package/.claude/agents/github/repo-architect.md +397 -397
- package/.claude/agents/github/swarm-issue.md +572 -572
- package/.claude/agents/github/swarm-pr.md +427 -427
- package/.claude/agents/github/sync-coordinator.md +451 -451
- package/.claude/agents/github/workflow-automation.md +634 -634
- package/.claude/agents/goal/agent.md +815 -815
- package/.claude/agents/goal/code-goal-planner.md +445 -445
- package/.claude/agents/goal/goal-planner.md +167 -167
- package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +129 -129
- package/.claude/agents/hive-mind/queen-coordinator.md +202 -202
- package/.claude/agents/hive-mind/scout-explorer.md +241 -241
- package/.claude/agents/hive-mind/swarm-memory-manager.md +192 -192
- package/.claude/agents/hive-mind/worker-specialist.md +216 -216
- package/.claude/agents/neural/safla-neural.md +73 -73
- package/.claude/agents/optimization/benchmark-suite.md +664 -664
- package/.claude/agents/optimization/load-balancer.md +430 -430
- package/.claude/agents/optimization/performance-monitor.md +671 -671
- package/.claude/agents/optimization/resource-allocator.md +673 -673
- package/.claude/agents/optimization/topology-optimizer.md +807 -807
- package/.claude/agents/payments/agentic-payments.md +126 -126
- package/.claude/agents/reasoning/agent.md +815 -815
- package/.claude/agents/reasoning/goal-planner.md +72 -72
- package/.claude/agents/sona/sona-learning-optimizer.md +74 -74
- package/.claude/agents/sparc/architecture.md +471 -471
- package/.claude/agents/sparc/pseudocode.md +317 -317
- package/.claude/agents/sparc/refinement.md +524 -524
- package/.claude/agents/sparc/specification.md +275 -275
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +224 -224
- package/.claude/agents/sublinear/consensus-coordinator.md +337 -337
- package/.claude/agents/sublinear/matrix-optimizer.md +184 -184
- package/.claude/agents/sublinear/pagerank-analyzer.md +298 -298
- package/.claude/agents/sublinear/performance-optimizer.md +367 -367
- package/.claude/agents/sublinear/trading-predictor.md +245 -245
- package/.claude/agents/swarm/adaptive-coordinator.md +395 -395
- package/.claude/agents/swarm/hierarchical-coordinator.md +326 -326
- package/.claude/agents/swarm/mesh-coordinator.md +391 -391
- package/.claude/agents/templates/automation-smart-agent.md +204 -204
- package/.claude/agents/templates/coordinator-swarm-init.md +104 -104
- package/.claude/agents/templates/github-pr-manager.md +176 -176
- package/.claude/agents/templates/implementer-sparc-coder.md +258 -258
- package/.claude/agents/templates/memory-coordinator.md +186 -186
- package/.claude/agents/templates/migration-plan.md +745 -745
- package/.claude/agents/templates/orchestrator-task.md +138 -138
- package/.claude/agents/templates/performance-analyzer.md +198 -198
- package/.claude/agents/templates/sparc-coordinator.md +182 -182
- package/.claude/agents/testing/production-validator.md +394 -394
- package/.claude/agents/testing/tdd-london-swarm.md +243 -243
- package/.claude/agents/testing/unit/tdd-london-swarm.md +243 -243
- package/.claude/agents/testing/validation/production-validator.md +394 -394
- package/.claude/agents/v3/v3-integration-architect.md +345 -345
- package/.claude/agents/v3/v3-memory-specialist.md +317 -317
- package/.claude/agents/v3/v3-performance-engineer.md +396 -396
- package/.claude/agents/v3/v3-queen-coordinator.md +97 -97
- package/.claude/agents/v3/v3-security-architect.md +173 -173
- package/.claude/commands/agents/README.md +10 -10
- package/.claude/commands/agents/agent-capabilities.md +21 -21
- package/.claude/commands/agents/agent-coordination.md +28 -28
- package/.claude/commands/agents/agent-spawning.md +28 -28
- package/.claude/commands/agents/agent-types.md +26 -26
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +53 -53
- package/.claude/commands/analysis/README.md +9 -9
- package/.claude/commands/analysis/bottleneck-detect.md +162 -162
- package/.claude/commands/analysis/performance-bottlenecks.md +58 -58
- package/.claude/commands/analysis/performance-report.md +25 -25
- package/.claude/commands/analysis/token-efficiency.md +44 -44
- package/.claude/commands/analysis/token-usage.md +25 -25
- package/.claude/commands/automation/README.md +9 -9
- package/.claude/commands/automation/auto-agent.md +122 -122
- package/.claude/commands/automation/self-healing.md +105 -105
- package/.claude/commands/automation/session-memory.md +89 -89
- package/.claude/commands/automation/smart-agents.md +72 -72
- package/.claude/commands/automation/smart-spawn.md +25 -25
- package/.claude/commands/automation/workflow-select.md +25 -25
- package/.claude/commands/claude-flow-help.md +103 -103
- package/.claude/commands/claude-flow-memory.md +107 -107
- package/.claude/commands/claude-flow-swarm.md +205 -205
- package/.claude/commands/coordination/README.md +9 -9
- package/.claude/commands/coordination/agent-spawn.md +25 -25
- package/.claude/commands/coordination/init.md +44 -44
- package/.claude/commands/coordination/orchestrate.md +43 -43
- package/.claude/commands/coordination/spawn.md +45 -45
- package/.claude/commands/coordination/swarm-init.md +85 -85
- package/.claude/commands/coordination/task-orchestrate.md +25 -25
- package/.claude/commands/flow-nexus/app-store.md +123 -123
- package/.claude/commands/flow-nexus/challenges.md +119 -119
- package/.claude/commands/flow-nexus/login-registration.md +64 -64
- package/.claude/commands/flow-nexus/neural-network.md +133 -133
- package/.claude/commands/flow-nexus/payments.md +115 -115
- package/.claude/commands/flow-nexus/sandbox.md +82 -82
- package/.claude/commands/flow-nexus/swarm.md +86 -86
- package/.claude/commands/flow-nexus/user-tools.md +151 -151
- package/.claude/commands/flow-nexus/workflow.md +114 -114
- package/.claude/commands/github/README.md +11 -11
- package/.claude/commands/github/code-review-swarm.md +513 -513
- package/.claude/commands/github/code-review.md +25 -25
- package/.claude/commands/github/github-modes.md +146 -146
- package/.claude/commands/github/github-swarm.md +121 -121
- package/.claude/commands/github/issue-tracker.md +291 -291
- package/.claude/commands/github/issue-triage.md +25 -25
- package/.claude/commands/github/multi-repo-swarm.md +518 -518
- package/.claude/commands/github/pr-enhance.md +26 -26
- package/.claude/commands/github/pr-manager.md +169 -169
- package/.claude/commands/github/project-board-sync.md +470 -470
- package/.claude/commands/github/release-manager.md +337 -337
- package/.claude/commands/github/release-swarm.md +543 -543
- package/.claude/commands/github/repo-analyze.md +25 -25
- package/.claude/commands/github/repo-architect.md +366 -366
- package/.claude/commands/github/swarm-issue.md +481 -481
- package/.claude/commands/github/swarm-pr.md +284 -284
- package/.claude/commands/github/sync-coordinator.md +300 -300
- package/.claude/commands/github/workflow-automation.md +441 -441
- package/.claude/commands/hive-mind/README.md +17 -17
- package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-init.md +18 -18
- package/.claude/commands/hive-mind/hive-mind-memory.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-resume.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -21
- package/.claude/commands/hive-mind/hive-mind-status.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-stop.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -8
- package/.claude/commands/hive-mind/hive-mind.md +27 -27
- package/.claude/commands/hooks/README.md +11 -11
- package/.claude/commands/hooks/overview.md +57 -57
- package/.claude/commands/hooks/post-edit.md +117 -117
- package/.claude/commands/hooks/post-task.md +112 -112
- package/.claude/commands/hooks/pre-edit.md +113 -113
- package/.claude/commands/hooks/pre-task.md +111 -111
- package/.claude/commands/hooks/session-end.md +118 -118
- package/.claude/commands/hooks/setup.md +102 -102
- package/.claude/commands/memory/README.md +9 -9
- package/.claude/commands/memory/memory-persist.md +25 -25
- package/.claude/commands/memory/memory-search.md +25 -25
- package/.claude/commands/memory/memory-usage.md +25 -25
- package/.claude/commands/memory/neural.md +47 -47
- package/.claude/commands/monitoring/README.md +9 -9
- package/.claude/commands/monitoring/agent-metrics.md +25 -25
- package/.claude/commands/monitoring/agents.md +44 -44
- package/.claude/commands/monitoring/real-time-view.md +25 -25
- package/.claude/commands/monitoring/status.md +46 -46
- package/.claude/commands/monitoring/swarm-monitor.md +25 -25
- package/.claude/commands/optimization/README.md +9 -9
- package/.claude/commands/optimization/auto-topology.md +61 -61
- package/.claude/commands/optimization/cache-manage.md +25 -25
- package/.claude/commands/optimization/parallel-execute.md +25 -25
- package/.claude/commands/optimization/parallel-execution.md +49 -49
- package/.claude/commands/optimization/topology-optimize.md +25 -25
- package/.claude/commands/pair/README.md +260 -260
- package/.claude/commands/pair/commands.md +545 -545
- package/.claude/commands/pair/config.md +509 -509
- package/.claude/commands/pair/examples.md +511 -511
- package/.claude/commands/pair/modes.md +347 -347
- package/.claude/commands/pair/session.md +406 -406
- package/.claude/commands/pair/start.md +208 -208
- package/.claude/commands/sparc/analyzer.md +51 -51
- package/.claude/commands/sparc/architect.md +53 -53
- package/.claude/commands/sparc/ask.md +97 -97
- package/.claude/commands/sparc/batch-executor.md +54 -54
- package/.claude/commands/sparc/code.md +89 -89
- package/.claude/commands/sparc/coder.md +54 -54
- package/.claude/commands/sparc/debug.md +83 -83
- package/.claude/commands/sparc/debugger.md +54 -54
- package/.claude/commands/sparc/designer.md +53 -53
- package/.claude/commands/sparc/devops.md +109 -109
- package/.claude/commands/sparc/docs-writer.md +80 -80
- package/.claude/commands/sparc/documenter.md +54 -54
- package/.claude/commands/sparc/innovator.md +54 -54
- package/.claude/commands/sparc/integration.md +83 -83
- package/.claude/commands/sparc/mcp.md +117 -117
- package/.claude/commands/sparc/memory-manager.md +54 -54
- package/.claude/commands/sparc/optimizer.md +54 -54
- package/.claude/commands/sparc/orchestrator.md +131 -131
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -83
- package/.claude/commands/sparc/refinement-optimization-mode.md +83 -83
- package/.claude/commands/sparc/researcher.md +54 -54
- package/.claude/commands/sparc/reviewer.md +54 -54
- package/.claude/commands/sparc/security-review.md +80 -80
- package/.claude/commands/sparc/sparc-modes.md +174 -174
- package/.claude/commands/sparc/sparc.md +111 -111
- package/.claude/commands/sparc/spec-pseudocode.md +80 -80
- package/.claude/commands/sparc/supabase-admin.md +348 -348
- package/.claude/commands/sparc/swarm-coordinator.md +54 -54
- package/.claude/commands/sparc/tdd.md +54 -54
- package/.claude/commands/sparc/tester.md +54 -54
- package/.claude/commands/sparc/tutorial.md +79 -79
- package/.claude/commands/sparc/workflow-manager.md +54 -54
- package/.claude/commands/sparc.md +166 -166
- package/.claude/commands/stream-chain/pipeline.md +120 -120
- package/.claude/commands/stream-chain/run.md +69 -69
- package/.claude/commands/swarm/README.md +15 -15
- package/.claude/commands/swarm/analysis.md +95 -95
- package/.claude/commands/swarm/development.md +96 -96
- package/.claude/commands/swarm/examples.md +168 -168
- package/.claude/commands/swarm/maintenance.md +102 -102
- package/.claude/commands/swarm/optimization.md +117 -117
- package/.claude/commands/swarm/research.md +136 -136
- package/.claude/commands/swarm/swarm-analysis.md +8 -8
- package/.claude/commands/swarm/swarm-background.md +8 -8
- package/.claude/commands/swarm/swarm-init.md +19 -19
- package/.claude/commands/swarm/swarm-modes.md +8 -8
- package/.claude/commands/swarm/swarm-monitor.md +8 -8
- package/.claude/commands/swarm/swarm-spawn.md +19 -19
- package/.claude/commands/swarm/swarm-status.md +8 -8
- package/.claude/commands/swarm/swarm-strategies.md +8 -8
- package/.claude/commands/swarm/swarm.md +27 -27
- package/.claude/commands/swarm/testing.md +131 -131
- package/.claude/commands/training/README.md +9 -9
- package/.claude/commands/training/model-update.md +25 -25
- package/.claude/commands/training/neural-patterns.md +73 -73
- package/.claude/commands/training/neural-train.md +25 -25
- package/.claude/commands/training/pattern-learn.md +25 -25
- package/.claude/commands/training/specialization.md +62 -62
- package/.claude/commands/truth/start.md +142 -142
- package/.claude/commands/verify/check.md +49 -49
- package/.claude/commands/verify/start.md +127 -127
- package/.claude/commands/workflows/README.md +9 -9
- package/.claude/commands/workflows/development.md +77 -77
- package/.claude/commands/workflows/research.md +62 -62
- package/.claude/commands/workflows/workflow-create.md +25 -25
- package/.claude/commands/workflows/workflow-execute.md +25 -25
- package/.claude/commands/workflows/workflow-export.md +25 -25
- package/.claude/config/v3-dependency-optimization.json +265 -265
- package/.claude/config/v3-performance-targets.json +250 -250
- package/.claude/helpers/README.md +96 -96
- package/.claude/helpers/aggressive-microcompact.mjs +36 -36
- package/.claude/helpers/auto-memory-hook.mjs +363 -363
- package/.claude/helpers/context-persistence-hook.mjs +1979 -1979
- package/.claude/helpers/github-safe.js +106 -106
- package/.claude/helpers/learning-service.mjs +1144 -1144
- package/.claude/helpers/metrics-db.mjs +488 -488
- package/.claude/helpers/patch-aggressive-prune.mjs +184 -184
- package/.claude/mcp.json +12 -12
- package/.claude/settings.json +2 -2
- package/.claude/skills/agentdb-advanced/SKILL.md +550 -550
- package/.claude/skills/agentdb-learning/SKILL.md +545 -545
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -339
- package/.claude/skills/agentdb-optimization/SKILL.md +509 -509
- package/.claude/skills/agentdb-vector-search/SKILL.md +339 -339
- package/.claude/skills/agentic-jujutsu/SKILL.md +645 -645
- package/.claude/skills/dual-mode/README.md +71 -71
- package/.claude/skills/dual-mode/dual-collect.md +103 -103
- package/.claude/skills/dual-mode/dual-coordinate.md +85 -85
- package/.claude/skills/dual-mode/dual-spawn.md +81 -81
- package/.claude/skills/flow-nexus-neural/SKILL.md +738 -738
- package/.claude/skills/flow-nexus-platform/SKILL.md +1157 -1157
- package/.claude/skills/flow-nexus-swarm/SKILL.md +610 -610
- package/.claude/skills/github-code-review/SKILL.md +1 -1
- package/.claude/skills/github-multi-repo/SKILL.md +2 -2
- package/.claude/skills/github-project-management/SKILL.md +1 -1
- package/.claude/skills/github-release-management/SKILL.md +2 -2
- package/.claude/skills/github-workflow-automation/SKILL.md +1 -1
- package/.claude/skills/hive-mind-advanced/SKILL.md +4 -4
- package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
- package/.claude/skills/pair-programming/SKILL.md +1202 -1202
- package/.claude/skills/performance-analysis/SKILL.md +563 -563
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -446
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -201
- package/.claude/skills/skill-builder/SKILL.md +910 -910
- package/.claude/skills/sparc-methodology/SKILL.md +2 -2
- package/.claude/skills/stream-chain/SKILL.md +563 -563
- package/.claude/skills/swarm-advanced/SKILL.md +4 -4
- package/.claude/skills/swarm-orchestration/SKILL.md +179 -179
- package/.claude/skills/v3-cli-modernization/SKILL.md +871 -871
- package/.claude/skills/v3-core-implementation/SKILL.md +796 -796
- package/.claude/skills/v3-ddd-architecture/SKILL.md +441 -441
- package/.claude/skills/v3-integration-deep/SKILL.md +240 -240
- package/.claude/skills/v3-mcp-optimization/SKILL.md +776 -776
- package/.claude/skills/v3-memory-unification/SKILL.md +173 -173
- package/.claude/skills/v3-performance-optimization/SKILL.md +389 -389
- package/.claude/skills/v3-security-overhaul/SKILL.md +81 -81
- package/.claude/skills/v3-swarm-coordination/SKILL.md +339 -339
- package/.claude/skills/verification-quality/SKILL.md +649 -649
- package/.claude/skills/worker-benchmarks/skill.md +135 -135
- package/.claude/skills/worker-integration/skill.md +154 -154
- package/.claude/statusline.mjs +109 -109
- package/.claude-plugin/README.md +6 -6
- package/.claude-plugin/docs/INSTALLATION.md +4 -4
- package/.claude-plugin/docs/PLUGIN_SUMMARY.md +5 -5
- package/.claude-plugin/docs/QUICKSTART.md +1 -1
- package/.claude-plugin/docs/STRUCTURE.md +128 -128
- package/.claude-plugin/hooks/hooks.json +74 -74
- package/.claude-plugin/marketplace.json +5 -5
- package/.claude-plugin/plugin.json +4 -4
- package/README.md +148 -148
- package/bin/cli.js +12 -12
- package/bin/npx-repair.js +7 -7
- package/bin/npx-safe-launch.js +9 -9
- package/package.json +115 -114
- package/v3/@claude-flow/cli/README.md +5 -5
- package/v3/@claude-flow/cli/bin/cli.js +156 -156
- package/v3/@claude-flow/cli/bin/mcp-server.js +189 -189
- package/v3/@claude-flow/cli/dist/src/commands/analyze.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/analyze.js +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/claims.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/claims.js +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/completions.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/completions.js +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/config.js +36 -2
- package/v3/@claude-flow/cli/dist/src/commands/daemon.js +54 -7
- package/v3/@claude-flow/cli/dist/src/commands/deployment.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/deployment.js +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/doctor.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/doctor.js +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/embeddings.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/embeddings.js +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/hive-mind.js +90 -90
- package/v3/@claude-flow/cli/dist/src/commands/hooks.js +30 -112
- package/v3/@claude-flow/cli/dist/src/commands/init.js +6 -1
- package/v3/@claude-flow/cli/dist/src/commands/memory.js +30 -30
- package/v3/@claude-flow/cli/dist/src/commands/neural.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/neural.js +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/orc.js +1 -0
- package/v3/@claude-flow/cli/dist/src/commands/performance.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/performance.js +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/plugins.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/plugins.js +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/providers.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/providers.js +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/route.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/route.js +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/backup.js +23 -23
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/benchmark.js +29 -29
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/import.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/import.js +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/index.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/index.js +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/init.js +113 -113
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/migrate.js +97 -97
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/optimize.js +51 -51
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/setup.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/setup.js +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/status.js +36 -36
- package/v3/@claude-flow/cli/dist/src/commands/security.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/commands/security.js +2 -2
- package/v3/@claude-flow/cli/dist/src/config/moflo-config.d.ts +13 -1
- package/v3/@claude-flow/cli/dist/src/config/moflo-config.js +93 -41
- package/v3/@claude-flow/cli/dist/src/index.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/index.js +2 -2
- package/v3/@claude-flow/cli/dist/src/init/claudemd-generator.js +2 -2
- package/v3/@claude-flow/cli/dist/src/init/executor.js +3 -3
- package/v3/@claude-flow/cli/dist/src/init/helpers-generator.js +640 -640
- package/v3/@claude-flow/cli/dist/src/init/moflo-init.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/init/moflo-init.js +101 -20
- package/v3/@claude-flow/cli/dist/src/init/settings-generator.js +2 -2
- package/v3/@claude-flow/cli/dist/src/init/statusline-generator.js +783 -783
- package/v3/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.js +30 -13
- package/v3/@claude-flow/cli/dist/src/mcp-tools/security-tools.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/mcp-tools/security-tools.js +1 -1
- package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.js +61 -61
- package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.js +2212 -2263
- package/v3/@claude-flow/cli/dist/src/runtime/headless.js +28 -28
- package/v3/@claude-flow/cli/dist/src/ruvector/flash-attention.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/ruvector/flash-attention.js +1 -1
- package/v3/@claude-flow/cli/dist/src/ruvector/vector-db.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/ruvector/vector-db.js +1 -1
- package/v3/@claude-flow/cli/dist/src/services/agent-router.d.ts +14 -0
- package/v3/@claude-flow/cli/dist/src/services/agent-router.js +86 -7
- package/v3/@claude-flow/cli/dist/src/services/headless-worker-executor.js +84 -84
- package/v3/@claude-flow/cli/dist/src/services/index.d.ts +1 -3
- package/v3/@claude-flow/cli/dist/src/services/index.js +1 -2
- package/v3/@claude-flow/cli/dist/src/services/learning-service.js +54 -54
- package/v3/@claude-flow/cli/dist/src/services/ruvector-training.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/services/ruvector-training.js +1 -1
- package/v3/@claude-flow/cli/dist/src/services/worker-daemon.d.ts +24 -3
- package/v3/@claude-flow/cli/dist/src/services/worker-daemon.js +123 -12
- package/v3/@claude-flow/cli/dist/src/services/workflow-gate.d.ts +1 -0
- package/v3/@claude-flow/cli/dist/src/services/workflow-gate.js +20 -5
- package/v3/@claude-flow/cli/dist/src/suggest.d.ts +1 -1
- package/v3/@claude-flow/cli/dist/src/suggest.js +1 -1
- package/v3/@claude-flow/cli/dist/src/transfer/deploy-seraphine.js +23 -23
- package/v3/@claude-flow/cli/package.json +6 -6
- package/v3/@claude-flow/guidance/README.md +6 -6
- package/v3/@claude-flow/guidance/package.json +1 -1
- package/v3/@claude-flow/memory/README.md +1 -1
- package/v3/@claude-flow/shared/README.md +1 -1
- package/v3/@claude-flow/shared/package.json +42 -42
- package/v3/README.md +3 -3
|
@@ -323,10 +323,10 @@ export class LearningService {
|
|
|
323
323
|
const { results } = this.shortTermIndex.search(embedding, 1);
|
|
324
324
|
if (results.length > 0 && results[0].similarity > CONFIG.patterns.dedupThreshold) {
|
|
325
325
|
const existingId = results[0].patternId;
|
|
326
|
-
dbRun(this.db, `
|
|
327
|
-
UPDATE learned_patterns
|
|
328
|
-
SET uses = uses + 1, last_used_at = datetime('now'), quality = MAX(quality, ?)
|
|
329
|
-
WHERE id = ?
|
|
326
|
+
dbRun(this.db, `
|
|
327
|
+
UPDATE learned_patterns
|
|
328
|
+
SET uses = uses + 1, last_used_at = datetime('now'), quality = MAX(quality, ?)
|
|
329
|
+
WHERE id = ?
|
|
330
330
|
`, [quality, existingId]);
|
|
331
331
|
this.dirty = true;
|
|
332
332
|
this.checkPromotion(existingId);
|
|
@@ -336,19 +336,19 @@ export class LearningService {
|
|
|
336
336
|
const { results: ltResults } = this.longTermIndex.search(embedding, 1);
|
|
337
337
|
if (ltResults.length > 0 && ltResults[0].similarity > CONFIG.patterns.dedupThreshold) {
|
|
338
338
|
const existingId = ltResults[0].patternId;
|
|
339
|
-
dbRun(this.db, `
|
|
340
|
-
UPDATE learned_patterns
|
|
341
|
-
SET uses = uses + 1, last_used_at = datetime('now'), quality = MAX(quality, ?)
|
|
342
|
-
WHERE id = ?
|
|
339
|
+
dbRun(this.db, `
|
|
340
|
+
UPDATE learned_patterns
|
|
341
|
+
SET uses = uses + 1, last_used_at = datetime('now'), quality = MAX(quality, ?)
|
|
342
|
+
WHERE id = ?
|
|
343
343
|
`, [quality, existingId]);
|
|
344
344
|
this.dirty = true;
|
|
345
345
|
return { id: existingId, action: 'updated', similarity: ltResults[0].similarity };
|
|
346
346
|
}
|
|
347
347
|
const id = `pat_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
|
|
348
348
|
const embeddingJson = JSON.stringify(Array.from(embedding));
|
|
349
|
-
dbRun(this.db, `
|
|
350
|
-
INSERT INTO learned_patterns (id, pattern, domain, quality, uses, tier, embedding, created_at)
|
|
351
|
-
VALUES (?, ?, ?, ?, 1, 'short-term', ?, datetime('now'))
|
|
349
|
+
dbRun(this.db, `
|
|
350
|
+
INSERT INTO learned_patterns (id, pattern, domain, quality, uses, tier, embedding, created_at)
|
|
351
|
+
VALUES (?, ?, ?, ?, 1, 'short-term', ?, datetime('now'))
|
|
352
352
|
`, [id, pattern, domain, quality, embeddingJson]);
|
|
353
353
|
this.dirty = true;
|
|
354
354
|
this.shortTermIndex.add(id, embedding);
|
|
@@ -396,11 +396,11 @@ export class LearningService {
|
|
|
396
396
|
*/
|
|
397
397
|
async promotePatterns() {
|
|
398
398
|
this.requireDb();
|
|
399
|
-
const candidates = dbAll(this.db, `
|
|
400
|
-
SELECT id FROM learned_patterns
|
|
401
|
-
WHERE tier = 'short-term'
|
|
402
|
-
AND uses >= ?
|
|
403
|
-
AND quality >= ?
|
|
399
|
+
const candidates = dbAll(this.db, `
|
|
400
|
+
SELECT id FROM learned_patterns
|
|
401
|
+
WHERE tier = 'short-term'
|
|
402
|
+
AND uses >= ?
|
|
403
|
+
AND quality >= ?
|
|
404
404
|
`, [CONFIG.patterns.promotionThreshold, CONFIG.patterns.qualityThreshold]);
|
|
405
405
|
let promoted = 0;
|
|
406
406
|
for (const { id } of candidates) {
|
|
@@ -422,19 +422,19 @@ export class LearningService {
|
|
|
422
422
|
const promoted = await this.promotePatterns();
|
|
423
423
|
// 2. Prune old short-term patterns (older than 30 days, low usage)
|
|
424
424
|
const pruneDate = new Date(Date.now() - CONFIG.consolidation.pruneAge).toISOString();
|
|
425
|
-
const pruned = dbRun(this.db, `
|
|
426
|
-
DELETE FROM learned_patterns
|
|
427
|
-
WHERE tier = 'short-term'
|
|
428
|
-
AND created_at < ?
|
|
429
|
-
AND uses < ?
|
|
425
|
+
const pruned = dbRun(this.db, `
|
|
426
|
+
DELETE FROM learned_patterns
|
|
427
|
+
WHERE tier = 'short-term'
|
|
428
|
+
AND created_at < ?
|
|
429
|
+
AND uses < ?
|
|
430
430
|
`, [pruneDate, CONFIG.consolidation.minUsageForKeep]);
|
|
431
431
|
// 3. Prune old long-term patterns
|
|
432
|
-
const ltPruned = dbRun(this.db, `
|
|
433
|
-
DELETE FROM learned_patterns
|
|
434
|
-
WHERE tier = 'long-term'
|
|
435
|
-
AND last_used_at IS NOT NULL
|
|
436
|
-
AND last_used_at < ?
|
|
437
|
-
AND uses < ?
|
|
432
|
+
const ltPruned = dbRun(this.db, `
|
|
433
|
+
DELETE FROM learned_patterns
|
|
434
|
+
WHERE tier = 'long-term'
|
|
435
|
+
AND last_used_at IS NOT NULL
|
|
436
|
+
AND last_used_at < ?
|
|
437
|
+
AND uses < ?
|
|
438
438
|
`, [pruneDate, CONFIG.consolidation.minUsageForKeep]);
|
|
439
439
|
// 4. Enforce max limits
|
|
440
440
|
this.enforceMaxShortTerm();
|
|
@@ -517,19 +517,19 @@ export class LearningService {
|
|
|
517
517
|
}
|
|
518
518
|
}
|
|
519
519
|
ensureSchema() {
|
|
520
|
-
this.db.run(`
|
|
521
|
-
CREATE TABLE IF NOT EXISTS learned_patterns (
|
|
522
|
-
id TEXT PRIMARY KEY,
|
|
523
|
-
pattern TEXT NOT NULL,
|
|
524
|
-
domain TEXT DEFAULT 'general',
|
|
525
|
-
quality REAL DEFAULT 0.5,
|
|
526
|
-
uses INTEGER DEFAULT 0,
|
|
527
|
-
tier TEXT DEFAULT 'short-term',
|
|
528
|
-
embedding TEXT,
|
|
529
|
-
created_at TEXT DEFAULT (datetime('now')),
|
|
530
|
-
last_used_at TEXT,
|
|
531
|
-
promoted_at TEXT
|
|
532
|
-
)
|
|
520
|
+
this.db.run(`
|
|
521
|
+
CREATE TABLE IF NOT EXISTS learned_patterns (
|
|
522
|
+
id TEXT PRIMARY KEY,
|
|
523
|
+
pattern TEXT NOT NULL,
|
|
524
|
+
domain TEXT DEFAULT 'general',
|
|
525
|
+
quality REAL DEFAULT 0.5,
|
|
526
|
+
uses INTEGER DEFAULT 0,
|
|
527
|
+
tier TEXT DEFAULT 'short-term',
|
|
528
|
+
embedding TEXT,
|
|
529
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
530
|
+
last_used_at TEXT,
|
|
531
|
+
promoted_at TEXT
|
|
532
|
+
)
|
|
533
533
|
`);
|
|
534
534
|
this.db.run(`CREATE INDEX IF NOT EXISTS idx_lp_domain ON learned_patterns(domain)`);
|
|
535
535
|
this.db.run(`CREATE INDEX IF NOT EXISTS idx_lp_tier ON learned_patterns(tier)`);
|
|
@@ -564,8 +564,8 @@ export class LearningService {
|
|
|
564
564
|
const uses = row.uses;
|
|
565
565
|
const quality = row.quality;
|
|
566
566
|
if (uses >= CONFIG.patterns.promotionThreshold && quality >= CONFIG.patterns.qualityThreshold) {
|
|
567
|
-
dbRun(this.db, `
|
|
568
|
-
UPDATE learned_patterns SET tier = 'long-term', promoted_at = datetime('now') WHERE id = ?
|
|
567
|
+
dbRun(this.db, `
|
|
568
|
+
UPDATE learned_patterns SET tier = 'long-term', promoted_at = datetime('now') WHERE id = ?
|
|
569
569
|
`, [patternId]);
|
|
570
570
|
this.dirty = true;
|
|
571
571
|
// Move between indexes
|
|
@@ -590,11 +590,11 @@ export class LearningService {
|
|
|
590
590
|
if (count <= CONFIG.patterns.maxShortTerm)
|
|
591
591
|
return;
|
|
592
592
|
const toRemove = count - CONFIG.patterns.maxShortTerm;
|
|
593
|
-
const ids = dbAll(this.db, `
|
|
594
|
-
SELECT id FROM learned_patterns
|
|
595
|
-
WHERE tier = 'short-term'
|
|
596
|
-
ORDER BY quality ASC, uses ASC
|
|
597
|
-
LIMIT ?
|
|
593
|
+
const ids = dbAll(this.db, `
|
|
594
|
+
SELECT id FROM learned_patterns
|
|
595
|
+
WHERE tier = 'short-term'
|
|
596
|
+
ORDER BY quality ASC, uses ASC
|
|
597
|
+
LIMIT ?
|
|
598
598
|
`, [toRemove]);
|
|
599
599
|
for (const { id } of ids) {
|
|
600
600
|
dbRun(this.db, 'DELETE FROM learned_patterns WHERE id = ?', [id]);
|
|
@@ -611,11 +611,11 @@ export class LearningService {
|
|
|
611
611
|
if (count <= CONFIG.patterns.maxLongTerm)
|
|
612
612
|
return;
|
|
613
613
|
const toRemove = count - CONFIG.patterns.maxLongTerm;
|
|
614
|
-
const ids = dbAll(this.db, `
|
|
615
|
-
SELECT id FROM learned_patterns
|
|
616
|
-
WHERE tier = 'long-term'
|
|
617
|
-
ORDER BY quality ASC, uses ASC
|
|
618
|
-
LIMIT ?
|
|
614
|
+
const ids = dbAll(this.db, `
|
|
615
|
+
SELECT id FROM learned_patterns
|
|
616
|
+
WHERE tier = 'long-term'
|
|
617
|
+
ORDER BY quality ASC, uses ASC
|
|
618
|
+
LIMIT ?
|
|
619
619
|
`, [toRemove]);
|
|
620
620
|
for (const { id } of ids) {
|
|
621
621
|
dbRun(this.db, 'DELETE FROM learned_patterns WHERE id = ?', [id]);
|
|
@@ -623,8 +623,8 @@ export class LearningService {
|
|
|
623
623
|
this.dirty = true;
|
|
624
624
|
}
|
|
625
625
|
deduplicateLongTerm() {
|
|
626
|
-
const patterns = dbAll(this.db, `
|
|
627
|
-
SELECT id, embedding, quality FROM learned_patterns WHERE tier = 'long-term'
|
|
626
|
+
const patterns = dbAll(this.db, `
|
|
627
|
+
SELECT id, embedding, quality FROM learned_patterns WHERE tier = 'long-term'
|
|
628
628
|
`);
|
|
629
629
|
const toDelete = new Set();
|
|
630
630
|
for (let i = 0; i < patterns.length; i++) {
|
|
@@ -44,7 +44,7 @@ interface DaemonStatus {
|
|
|
44
44
|
workers: Map<WorkerType, WorkerState>;
|
|
45
45
|
config: DaemonConfig;
|
|
46
46
|
}
|
|
47
|
-
interface DaemonConfig {
|
|
47
|
+
export interface DaemonConfig {
|
|
48
48
|
autoStart: boolean;
|
|
49
49
|
logDir: string;
|
|
50
50
|
stateFile: string;
|
|
@@ -70,6 +70,7 @@ export declare class WorkerDaemon extends EventEmitter {
|
|
|
70
70
|
private pendingWorkers;
|
|
71
71
|
private headlessExecutor;
|
|
72
72
|
private headlessAvailable;
|
|
73
|
+
private originalConfig?;
|
|
73
74
|
constructor(projectRoot: string, config?: Partial<DaemonConfig>);
|
|
74
75
|
/**
|
|
75
76
|
* Initialize headless executor if Claude Code is available
|
|
@@ -83,6 +84,20 @@ export declare class WorkerDaemon extends EventEmitter {
|
|
|
83
84
|
* Get headless executor instance
|
|
84
85
|
*/
|
|
85
86
|
getHeadlessExecutor(): HeadlessWorkerExecutor | null;
|
|
87
|
+
/**
|
|
88
|
+
* Detect effective CPU count for the current environment.
|
|
89
|
+
*
|
|
90
|
+
* Inside Docker / K8s containers, os.cpus().length reports the HOST cpu
|
|
91
|
+
* count, not the container limit (Node.js #28762 — wontfix). We read
|
|
92
|
+
* cgroup v2 / v1 quota files first so the maxCpuLoad threshold stays
|
|
93
|
+
* meaningful under resource-limited containers.
|
|
94
|
+
*/
|
|
95
|
+
static getEffectiveCpuCount(): number;
|
|
96
|
+
/**
|
|
97
|
+
* Read daemon-specific config from .claude-flow/config.json
|
|
98
|
+
* Supports dot-notation keys like 'daemon.resourceThresholds.maxCpuLoad'
|
|
99
|
+
*/
|
|
100
|
+
private readDaemonConfigFromFile;
|
|
86
101
|
/**
|
|
87
102
|
* Setup graceful shutdown handlers
|
|
88
103
|
*/
|
|
@@ -93,6 +108,12 @@ export declare class WorkerDaemon extends EventEmitter {
|
|
|
93
108
|
private canRunWorker;
|
|
94
109
|
/**
|
|
95
110
|
* Process pending workers queue
|
|
111
|
+
*
|
|
112
|
+
* When executeWorkerWithConcurrencyControl defers a worker (returns null),
|
|
113
|
+
* we break immediately to avoid a busy-wait loop — the deferred worker is
|
|
114
|
+
* already back on the pendingWorkers queue by that point. If no workers are
|
|
115
|
+
* currently running when we break, we schedule a backoff retry so the queue
|
|
116
|
+
* does not get permanently stuck.
|
|
96
117
|
*/
|
|
97
118
|
private processPendingWorkers;
|
|
98
119
|
private initializeWorkerStates;
|
|
@@ -190,11 +211,11 @@ export declare class WorkerDaemon extends EventEmitter {
|
|
|
190
211
|
/**
|
|
191
212
|
* Get or create daemon instance
|
|
192
213
|
*/
|
|
193
|
-
export declare function getDaemon(projectRoot?: string): WorkerDaemon;
|
|
214
|
+
export declare function getDaemon(projectRoot?: string, config?: Partial<DaemonConfig>): WorkerDaemon;
|
|
194
215
|
/**
|
|
195
216
|
* Start daemon (for use in session-start hook)
|
|
196
217
|
*/
|
|
197
|
-
export declare function startDaemon(projectRoot: string): Promise<WorkerDaemon>;
|
|
218
|
+
export declare function startDaemon(projectRoot: string, config?: Partial<DaemonConfig>): Promise<WorkerDaemon>;
|
|
198
219
|
/**
|
|
199
220
|
* Stop daemon
|
|
200
221
|
*/
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { EventEmitter } from 'events';
|
|
13
13
|
import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
|
|
14
|
+
import { cpus } from 'os';
|
|
14
15
|
import { join } from 'path';
|
|
15
16
|
import { HeadlessWorkerExecutor, isHeadlessWorker, } from './headless-worker-executor.js';
|
|
16
17
|
// Default worker configurations with improved intervals (P0 fix: map 5min -> 15min)
|
|
@@ -40,19 +41,35 @@ export class WorkerDaemon extends EventEmitter {
|
|
|
40
41
|
// Headless execution support
|
|
41
42
|
headlessExecutor = null;
|
|
42
43
|
headlessAvailable = false;
|
|
44
|
+
// Preserve the original constructor config so we can detect explicit overrides
|
|
45
|
+
// during state restoration (R1: constructor config takes priority over stale state)
|
|
46
|
+
originalConfig;
|
|
43
47
|
constructor(projectRoot, config) {
|
|
44
48
|
super();
|
|
45
49
|
this.projectRoot = projectRoot;
|
|
50
|
+
this.originalConfig = config;
|
|
46
51
|
const claudeFlowDir = join(projectRoot, '.claude-flow');
|
|
52
|
+
// Read daemon config from .claude-flow/config.json (Layer B)
|
|
53
|
+
const fileConfig = this.readDaemonConfigFromFile(claudeFlowDir);
|
|
54
|
+
// CPU-proportional smart default instead of hardcoded 2.0
|
|
55
|
+
const cpuCount = WorkerDaemon.getEffectiveCpuCount();
|
|
56
|
+
const smartMaxCpuLoad = Math.max(cpuCount * 0.8, 2.0); // Floor of 2.0 for single-CPU machines
|
|
57
|
+
// Platform-aware default: macOS os.freemem() excludes reclaimable file cache,
|
|
58
|
+
// so reported "free" is much lower than actually available memory.
|
|
59
|
+
// Linux reports available memory (including reclaimable cache) more accurately.
|
|
60
|
+
const defaultMinFreeMemory = process.platform === 'darwin' ? 5 : 10;
|
|
61
|
+
// Priority: constructor arg > config.json > smart default
|
|
62
|
+
// For resourceThresholds, merge field-by-field so partial overrides
|
|
63
|
+
// (e.g. only --max-cpu-load) still pick up defaults for other fields.
|
|
47
64
|
this.config = {
|
|
48
|
-
autoStart: config?.autoStart ??
|
|
65
|
+
autoStart: config?.autoStart ?? fileConfig.autoStart ?? false,
|
|
49
66
|
logDir: config?.logDir ?? join(claudeFlowDir, 'logs'),
|
|
50
67
|
stateFile: config?.stateFile ?? join(claudeFlowDir, 'daemon-state.json'),
|
|
51
|
-
maxConcurrent: config?.maxConcurrent ?? 2,
|
|
52
|
-
workerTimeoutMs: config?.workerTimeoutMs ?? DEFAULT_WORKER_TIMEOUT_MS,
|
|
53
|
-
resourceThresholds:
|
|
54
|
-
maxCpuLoad:
|
|
55
|
-
minFreeMemoryPercent:
|
|
68
|
+
maxConcurrent: config?.maxConcurrent ?? fileConfig.maxConcurrent ?? 2,
|
|
69
|
+
workerTimeoutMs: config?.workerTimeoutMs ?? fileConfig.workerTimeoutMs ?? DEFAULT_WORKER_TIMEOUT_MS,
|
|
70
|
+
resourceThresholds: {
|
|
71
|
+
maxCpuLoad: config?.resourceThresholds?.maxCpuLoad ?? fileConfig.maxCpuLoad ?? smartMaxCpuLoad,
|
|
72
|
+
minFreeMemoryPercent: config?.resourceThresholds?.minFreeMemoryPercent ?? fileConfig.minFreeMemoryPercent ?? defaultMinFreeMemory,
|
|
56
73
|
},
|
|
57
74
|
workers: config?.workers ?? DEFAULT_WORKERS,
|
|
58
75
|
};
|
|
@@ -118,6 +135,66 @@ export class WorkerDaemon extends EventEmitter {
|
|
|
118
135
|
getHeadlessExecutor() {
|
|
119
136
|
return this.headlessExecutor;
|
|
120
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Detect effective CPU count for the current environment.
|
|
140
|
+
*
|
|
141
|
+
* Inside Docker / K8s containers, os.cpus().length reports the HOST cpu
|
|
142
|
+
* count, not the container limit (Node.js #28762 — wontfix). We read
|
|
143
|
+
* cgroup v2 / v1 quota files first so the maxCpuLoad threshold stays
|
|
144
|
+
* meaningful under resource-limited containers.
|
|
145
|
+
*/
|
|
146
|
+
static getEffectiveCpuCount() {
|
|
147
|
+
// 1. Try cgroup v2: /sys/fs/cgroup/cpu.max
|
|
148
|
+
try {
|
|
149
|
+
const cpuMax = readFileSync('/sys/fs/cgroup/cpu.max', 'utf8').trim();
|
|
150
|
+
const [quotaStr, periodStr] = cpuMax.split(' ');
|
|
151
|
+
if (quotaStr !== 'max') {
|
|
152
|
+
const quota = parseInt(quotaStr, 10);
|
|
153
|
+
const period = parseInt(periodStr, 10);
|
|
154
|
+
if (quota > 0 && period > 0)
|
|
155
|
+
return Math.ceil(quota / period);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch { /* not in cgroup v2 */ }
|
|
159
|
+
// 2. Try cgroup v1: /sys/fs/cgroup/cpu/cpu.cfs_quota_us
|
|
160
|
+
try {
|
|
161
|
+
const quota = parseInt(readFileSync('/sys/fs/cgroup/cpu/cpu.cfs_quota_us', 'utf8').trim(), 10);
|
|
162
|
+
const period = parseInt(readFileSync('/sys/fs/cgroup/cpu/cpu.cfs_period_us', 'utf8').trim(), 10);
|
|
163
|
+
if (quota > 0 && period > 0)
|
|
164
|
+
return Math.ceil(quota / period);
|
|
165
|
+
}
|
|
166
|
+
catch { /* not in cgroup v1 */ }
|
|
167
|
+
// 3. Fallback to os.cpus().length
|
|
168
|
+
return cpus().length || 1;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Read daemon-specific config from .claude-flow/config.json
|
|
172
|
+
* Supports dot-notation keys like 'daemon.resourceThresholds.maxCpuLoad'
|
|
173
|
+
*/
|
|
174
|
+
readDaemonConfigFromFile(claudeFlowDir) {
|
|
175
|
+
const configPath = join(claudeFlowDir, 'config.json');
|
|
176
|
+
if (!existsSync(configPath))
|
|
177
|
+
return {};
|
|
178
|
+
try {
|
|
179
|
+
const raw = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
180
|
+
// Support both flat keys at root and nested under scopes.project
|
|
181
|
+
const cfg = raw?.scopes?.project ?? raw;
|
|
182
|
+
const rawCpuLoad = cfg['daemon.resourceThresholds.maxCpuLoad'] ?? raw['daemon.resourceThresholds.maxCpuLoad'];
|
|
183
|
+
const rawMinMem = cfg['daemon.resourceThresholds.minFreeMemoryPercent'] ?? raw['daemon.resourceThresholds.minFreeMemoryPercent'];
|
|
184
|
+
const rawMaxConcurrent = cfg['daemon.maxConcurrent'] ?? raw['daemon.maxConcurrent'];
|
|
185
|
+
const rawTimeout = cfg['daemon.workerTimeoutMs'] ?? raw['daemon.workerTimeoutMs'];
|
|
186
|
+
return {
|
|
187
|
+
autoStart: typeof raw['daemon.autoStart'] === 'boolean' ? raw['daemon.autoStart'] : undefined,
|
|
188
|
+
maxConcurrent: (typeof rawMaxConcurrent === 'number' && rawMaxConcurrent > 0) ? rawMaxConcurrent : undefined,
|
|
189
|
+
workerTimeoutMs: (typeof rawTimeout === 'number' && rawTimeout > 0) ? rawTimeout : undefined,
|
|
190
|
+
maxCpuLoad: (typeof rawCpuLoad === 'number' && rawCpuLoad > 0 && rawCpuLoad < 1000) ? rawCpuLoad : undefined,
|
|
191
|
+
minFreeMemoryPercent: (typeof rawMinMem === 'number' && rawMinMem >= 0 && rawMinMem <= 100) ? rawMinMem : undefined,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return {};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
121
198
|
/**
|
|
122
199
|
* Setup graceful shutdown handlers
|
|
123
200
|
*/
|
|
@@ -150,13 +227,30 @@ export class WorkerDaemon extends EventEmitter {
|
|
|
150
227
|
}
|
|
151
228
|
/**
|
|
152
229
|
* Process pending workers queue
|
|
230
|
+
*
|
|
231
|
+
* When executeWorkerWithConcurrencyControl defers a worker (returns null),
|
|
232
|
+
* we break immediately to avoid a busy-wait loop — the deferred worker is
|
|
233
|
+
* already back on the pendingWorkers queue by that point. If no workers are
|
|
234
|
+
* currently running when we break, we schedule a backoff retry so the queue
|
|
235
|
+
* does not get permanently stuck.
|
|
153
236
|
*/
|
|
154
237
|
async processPendingWorkers() {
|
|
155
238
|
while (this.pendingWorkers.length > 0 && this.runningWorkers.size < this.config.maxConcurrent) {
|
|
156
239
|
const workerType = this.pendingWorkers.shift();
|
|
157
240
|
const workerConfig = this.config.workers.find(w => w.type === workerType);
|
|
158
241
|
if (workerConfig) {
|
|
159
|
-
await this.executeWorkerWithConcurrencyControl(workerConfig);
|
|
242
|
+
const result = await this.executeWorkerWithConcurrencyControl(workerConfig);
|
|
243
|
+
if (result === null) {
|
|
244
|
+
// Worker was deferred (resource pressure or concurrency limit).
|
|
245
|
+
// Break to avoid tight-looping — the next executeWorker() completion
|
|
246
|
+
// will call processPendingWorkers() again via the finally block.
|
|
247
|
+
if (this.runningWorkers.size === 0) {
|
|
248
|
+
// No workers running means nobody will trigger the finally-block
|
|
249
|
+
// callback, so schedule a backoff retry to avoid a stuck queue.
|
|
250
|
+
setTimeout(() => this.processPendingWorkers(), 30_000).unref();
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
160
254
|
}
|
|
161
255
|
}
|
|
162
256
|
}
|
|
@@ -175,6 +269,23 @@ export class WorkerDaemon extends EventEmitter {
|
|
|
175
269
|
}
|
|
176
270
|
}
|
|
177
271
|
}
|
|
272
|
+
// Restore resourceThresholds, maxConcurrent, workerTimeoutMs from saved state
|
|
273
|
+
// Only restore if valid numeric values within sane ranges
|
|
274
|
+
if (saved.config?.resourceThresholds && !this.originalConfig?.resourceThresholds) {
|
|
275
|
+
const rt = saved.config.resourceThresholds;
|
|
276
|
+
if (typeof rt.maxCpuLoad === 'number' && rt.maxCpuLoad > 0 && rt.maxCpuLoad < 1000) {
|
|
277
|
+
this.config.resourceThresholds.maxCpuLoad = rt.maxCpuLoad;
|
|
278
|
+
}
|
|
279
|
+
if (typeof rt.minFreeMemoryPercent === 'number' && rt.minFreeMemoryPercent >= 0 && rt.minFreeMemoryPercent <= 100) {
|
|
280
|
+
this.config.resourceThresholds.minFreeMemoryPercent = rt.minFreeMemoryPercent;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
if (typeof saved.config?.maxConcurrent === 'number' && saved.config.maxConcurrent > 0) {
|
|
284
|
+
this.config.maxConcurrent = saved.config.maxConcurrent;
|
|
285
|
+
}
|
|
286
|
+
if (typeof saved.config?.workerTimeoutMs === 'number' && saved.config.workerTimeoutMs > 0) {
|
|
287
|
+
this.config.workerTimeoutMs = saved.config.workerTimeoutMs;
|
|
288
|
+
}
|
|
178
289
|
// Restore worker runtime states (runCount, successCount, etc.)
|
|
179
290
|
if (saved.workers) {
|
|
180
291
|
for (const [type, state] of Object.entries(saved.workers)) {
|
|
@@ -228,7 +339,7 @@ export class WorkerDaemon extends EventEmitter {
|
|
|
228
339
|
}
|
|
229
340
|
// Save state
|
|
230
341
|
this.saveState();
|
|
231
|
-
this.log('info', `Daemon started
|
|
342
|
+
this.log('info', `Daemon started (PID: ${process.pid}, CPUs: ${cpus().length}, workers: ${this.config.workers.filter(w => w.enabled).length}, maxCpuLoad: ${this.config.resourceThresholds.maxCpuLoad}, minFreeMemoryPercent: ${this.config.resourceThresholds.minFreeMemoryPercent}%)`);
|
|
232
343
|
}
|
|
233
344
|
/**
|
|
234
345
|
* Stop the daemon and all workers
|
|
@@ -727,9 +838,9 @@ let daemonInstance = null;
|
|
|
727
838
|
/**
|
|
728
839
|
* Get or create daemon instance
|
|
729
840
|
*/
|
|
730
|
-
export function getDaemon(projectRoot) {
|
|
841
|
+
export function getDaemon(projectRoot, config) {
|
|
731
842
|
if (!daemonInstance && projectRoot) {
|
|
732
|
-
daemonInstance = new WorkerDaemon(projectRoot);
|
|
843
|
+
daemonInstance = new WorkerDaemon(projectRoot, config);
|
|
733
844
|
}
|
|
734
845
|
if (!daemonInstance) {
|
|
735
846
|
throw new Error('Daemon not initialized. Provide projectRoot on first call.');
|
|
@@ -739,8 +850,8 @@ export function getDaemon(projectRoot) {
|
|
|
739
850
|
/**
|
|
740
851
|
* Start daemon (for use in session-start hook)
|
|
741
852
|
*/
|
|
742
|
-
export async function startDaemon(projectRoot) {
|
|
743
|
-
const daemon = getDaemon(projectRoot);
|
|
853
|
+
export async function startDaemon(projectRoot, config) {
|
|
854
|
+
const daemon = getDaemon(projectRoot, config);
|
|
744
855
|
await daemon.start();
|
|
745
856
|
return daemon;
|
|
746
857
|
}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import * as fs from 'fs';
|
|
19
19
|
import * as path from 'path';
|
|
20
|
+
import { loadMofloConfig } from '../config/moflo-config.js';
|
|
20
21
|
// ============================================================================
|
|
21
22
|
// Constants
|
|
22
23
|
// ============================================================================
|
|
@@ -47,8 +48,11 @@ const EXEMPT_PATTERNS = [
|
|
|
47
48
|
// ============================================================================
|
|
48
49
|
export class WorkflowGateService {
|
|
49
50
|
stateFilePath;
|
|
51
|
+
config;
|
|
50
52
|
constructor(projectRoot = process.cwd()) {
|
|
51
53
|
this.stateFilePath = path.resolve(projectRoot, '.claude/workflow-state.json');
|
|
54
|
+
const mofloConfig = loadMofloConfig(projectRoot);
|
|
55
|
+
this.config = mofloConfig.gates;
|
|
52
56
|
}
|
|
53
57
|
// --------------------------------------------------------------------------
|
|
54
58
|
// State management
|
|
@@ -95,14 +99,17 @@ export class WorkflowGateService {
|
|
|
95
99
|
* Requires both TaskCreate and memory search.
|
|
96
100
|
*/
|
|
97
101
|
checkBeforeAgent() {
|
|
102
|
+
if (!this.config.task_create_first && !this.config.memory_first) {
|
|
103
|
+
return { allowed: true };
|
|
104
|
+
}
|
|
98
105
|
const state = this.readState();
|
|
99
|
-
if (!state.tasksCreated) {
|
|
106
|
+
if (this.config.task_create_first && !state.tasksCreated) {
|
|
100
107
|
return {
|
|
101
108
|
allowed: false,
|
|
102
109
|
message: 'BLOCKED: Call TaskCreate before spawning agents.',
|
|
103
110
|
};
|
|
104
111
|
}
|
|
105
|
-
if (!state.memorySearched) {
|
|
112
|
+
if (this.config.memory_first && !state.memorySearched) {
|
|
106
113
|
return {
|
|
107
114
|
allowed: false,
|
|
108
115
|
message: 'BLOCKED: Search memory (mcp__claude-flow__memory_search) before spawning agents.',
|
|
@@ -115,6 +122,9 @@ export class WorkflowGateService {
|
|
|
115
122
|
* Requires memory search (with exemptions for system paths).
|
|
116
123
|
*/
|
|
117
124
|
checkBeforeScan(pattern, searchPath) {
|
|
125
|
+
if (!this.config.memory_first) {
|
|
126
|
+
return { allowed: true };
|
|
127
|
+
}
|
|
118
128
|
const state = this.readState();
|
|
119
129
|
if (state.memorySearched) {
|
|
120
130
|
return { allowed: true };
|
|
@@ -140,6 +150,9 @@ export class WorkflowGateService {
|
|
|
140
150
|
* Only gates reads targeting .claude/guidance/ files.
|
|
141
151
|
*/
|
|
142
152
|
checkBeforeRead(filePath) {
|
|
153
|
+
if (!this.config.memory_first) {
|
|
154
|
+
return { allowed: true };
|
|
155
|
+
}
|
|
143
156
|
const state = this.readState();
|
|
144
157
|
if (state.memorySearched) {
|
|
145
158
|
return { allowed: true };
|
|
@@ -198,9 +211,11 @@ export class WorkflowGateService {
|
|
|
198
211
|
if (!state.tasksCreated) {
|
|
199
212
|
result.reminder = 'REMINDER: Use TaskCreate before spawning agents. Task tool is blocked until then.';
|
|
200
213
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
214
|
+
if (this.config.context_tracking) {
|
|
215
|
+
const bracket = this.getContextBracket(state.interactionCount);
|
|
216
|
+
if (bracket !== 'FRESH') {
|
|
217
|
+
result.bracket = BRACKET_MESSAGES[bracket];
|
|
218
|
+
}
|
|
204
219
|
}
|
|
205
220
|
return result;
|
|
206
221
|
}
|
|
@@ -71,29 +71,29 @@ function parseArgs() {
|
|
|
71
71
|
* Print help message
|
|
72
72
|
*/
|
|
73
73
|
function printHelp() {
|
|
74
|
-
console.log(`
|
|
75
|
-
Seraphine Genesis Deployer
|
|
76
|
-
==========================
|
|
77
|
-
|
|
78
|
-
Deploy the foundational Claude Flow pattern model.
|
|
79
|
-
|
|
80
|
-
Usage:
|
|
81
|
-
npx ts-node deploy-seraphine.ts [options]
|
|
82
|
-
|
|
83
|
-
Options:
|
|
84
|
-
--output, -o <path> Output file path
|
|
85
|
-
--to-ipfs, --ipfs Upload to IPFS
|
|
86
|
-
--anonymize, -a <level> Anonymization level (minimal|standard|strict|paranoid)
|
|
87
|
-
--gateway, -g <url> IPFS gateway URL
|
|
88
|
-
--no-pin Don't pin to pinning service
|
|
89
|
-
--no-validate Skip validation
|
|
90
|
-
--verbose, -v Verbose output
|
|
91
|
-
--help, -h Show this help
|
|
92
|
-
|
|
93
|
-
Examples:
|
|
94
|
-
npx ts-node deploy-seraphine.ts --output ./seraphine-genesis.cfp.json
|
|
95
|
-
npx ts-node deploy-seraphine.ts --to-ipfs --anonymize strict
|
|
96
|
-
npx ts-node deploy-seraphine.ts --to-ipfs --gateway https://dweb.link
|
|
74
|
+
console.log(`
|
|
75
|
+
Seraphine Genesis Deployer
|
|
76
|
+
==========================
|
|
77
|
+
|
|
78
|
+
Deploy the foundational Claude Flow pattern model.
|
|
79
|
+
|
|
80
|
+
Usage:
|
|
81
|
+
npx ts-node deploy-seraphine.ts [options]
|
|
82
|
+
|
|
83
|
+
Options:
|
|
84
|
+
--output, -o <path> Output file path
|
|
85
|
+
--to-ipfs, --ipfs Upload to IPFS
|
|
86
|
+
--anonymize, -a <level> Anonymization level (minimal|standard|strict|paranoid)
|
|
87
|
+
--gateway, -g <url> IPFS gateway URL
|
|
88
|
+
--no-pin Don't pin to pinning service
|
|
89
|
+
--no-validate Skip validation
|
|
90
|
+
--verbose, -v Verbose output
|
|
91
|
+
--help, -h Show this help
|
|
92
|
+
|
|
93
|
+
Examples:
|
|
94
|
+
npx ts-node deploy-seraphine.ts --output ./seraphine-genesis.cfp.json
|
|
95
|
+
npx ts-node deploy-seraphine.ts --to-ipfs --anonymize strict
|
|
96
|
+
npx ts-node deploy-seraphine.ts --to-ipfs --gateway https://dweb.link
|
|
97
97
|
`);
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
"claude-flow": "./bin/cli.js",
|
|
12
12
|
"claude-flow-mcp": "./bin/mcp-server.js"
|
|
13
13
|
},
|
|
14
|
-
"homepage": "https://github.com/
|
|
14
|
+
"homepage": "https://github.com/eric-cielo/moflo#readme",
|
|
15
15
|
"bugs": {
|
|
16
|
-
"url": "https://github.com/
|
|
16
|
+
"url": "https://github.com/eric-cielo/moflo/issues"
|
|
17
17
|
},
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
20
|
-
"url": "https://github.com/
|
|
20
|
+
"url": "https://github.com/eric-cielo/moflo.git",
|
|
21
21
|
"directory": "v3/@claude-flow/cli"
|
|
22
22
|
},
|
|
23
23
|
"keywords": [
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
"enterprise"
|
|
42
42
|
],
|
|
43
43
|
"author": {
|
|
44
|
-
"name": "
|
|
45
|
-
"email": "
|
|
46
|
-
"url": "https://
|
|
44
|
+
"name": "Eric Cielo",
|
|
45
|
+
"email": "eric@motailz.com",
|
|
46
|
+
"url": "https://github.com/eric-cielo"
|
|
47
47
|
},
|
|
48
48
|
"license": "MIT",
|
|
49
49
|
"exports": {
|