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