kynjal-cli 3.1.3 → 4.0.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/core/coder.md +1 -1
- package/.claude/agents/core/planner.md +2 -2
- package/.claude/agents/core/researcher.md +1 -1
- package/.claude/agents/core/reviewer.md +1 -1
- package/.claude/agents/core/tester.md +1 -1
- package/.claude/agents/data/data-ml-model.md +4 -4
- package/.claude/agents/development/dev-backend-api.md +4 -4
- package/.claude/agents/documentation/docs-api-openapi.md +4 -4
- package/.claude/agents/github/code-review-swarm.md +2 -2
- package/.claude/agents/github/issue-tracker.md +2 -2
- package/.claude/agents/github/pr-manager.md +2 -2
- package/.claude/agents/github/release-manager.md +2 -2
- package/.claude/agents/github/workflow-automation.md +2 -2
- package/.claude/agents/sparc/architecture.md +3 -3
- package/.claude/agents/sparc/pseudocode.md +2 -2
- package/.claude/agents/sparc/refinement.md +3 -3
- package/.claude/agents/sparc/specification.md +2 -2
- package/.claude/agents/swarm/adaptive-coordinator.md +1 -1
- package/.claude/agents/swarm/hierarchical-coordinator.md +1 -1
- package/.claude/agents/swarm/mesh-coordinator.md +1 -1
- package/.claude/agents/templates/base-template-generator.md +25 -4
- package/.claude/agents/templates/sparc-coordinator.md +3 -3
- package/.claude/helpers/auto-commit.sh +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +27 -9
- package/.claude/helpers/hook-handler.cjs +58 -18
- package/.claude/helpers/statusline.cjs +14 -33
- package/.claude/helpers/statusline.js +3 -3
- package/.claude/settings.json +9 -9
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +2 -2
- package/.claude/skills/swarm-orchestration/SKILL.md +1 -1
- package/README.md +383 -170
- package/bin/cli.js +6 -6
- package/bin/mcp-server.js +1 -1
- package/bin/preinstall.cjs +2 -0
- package/dist/src/appliance/gguf-engine.js +664 -0
- package/dist/src/appliance/gguf-engine.js.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +492 -0
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +383 -0
- package/dist/src/appliance/rvfa-builder.js.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +533 -0
- package/dist/src/appliance/rvfa-distribution.js.map +1 -0
- package/dist/src/appliance/rvfa-format.js +465 -0
- package/dist/src/appliance/rvfa-format.js.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +373 -0
- package/dist/src/appliance/rvfa-runner.js.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +469 -0
- package/dist/src/appliance/rvfa-signing.js.map +1 -0
- package/dist/src/benchmarks/pretrain/index.js +542 -331
- package/dist/src/benchmarks/pretrain/index.js.map +1 -1
- package/dist/src/commands/agent.d.ts.map +1 -1
- package/dist/src/commands/agent.js +725 -502
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.js +1548 -1218
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
- package/dist/src/commands/appliance-advanced.js +324 -0
- package/dist/src/commands/appliance-advanced.js.map +1 -0
- package/dist/src/commands/appliance.d.ts +8 -0
- package/dist/src/commands/appliance.d.ts.map +1 -0
- package/dist/src/commands/appliance.js +581 -0
- package/dist/src/commands/appliance.js.map +1 -0
- package/dist/src/commands/benchmark.js +523 -372
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +364 -274
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/cleanup.d.ts +13 -0
- package/dist/src/commands/cleanup.d.ts.map +1 -0
- package/dist/src/commands/cleanup.js +262 -0
- package/dist/src/commands/cleanup.js.map +1 -0
- package/dist/src/commands/completions.js +118 -477
- package/dist/src/commands/completions.js.map +1 -1
- package/dist/src/commands/config.js +303 -237
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.d.ts.map +1 -1
- package/dist/src/commands/daemon.js +597 -425
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.js +275 -194
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +690 -460
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1543 -1293
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/guidance.js +596 -449
- package/dist/src/commands/guidance.js.map +1 -1
- package/dist/src/commands/hive-mind.js +938 -854
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +3677 -2570
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.js +322 -122
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +943 -787
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/issues.js +558 -383
- package/dist/src/commands/issues.js.map +1 -1
- package/dist/src/commands/mcp.d.ts.map +1 -1
- package/dist/src/commands/mcp.js +605 -475
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +1031 -814
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/migrate.js +347 -282
- package/dist/src/commands/migrate.js.map +1 -1
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +1563 -1283
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +643 -497
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +841 -668
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/process.js +447 -392
- package/dist/src/commands/process.js.map +1 -1
- package/dist/src/commands/progress.js +256 -162
- package/dist/src/commands/progress.js.map +1 -1
- package/dist/src/commands/providers.js +220 -150
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/route.js +665 -520
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/ruvector/backup.js +651 -505
- package/dist/src/commands/ruvector/backup.js.map +1 -1
- package/dist/src/commands/ruvector/benchmark.js +401 -349
- package/dist/src/commands/ruvector/benchmark.js.map +1 -1
- package/dist/src/commands/ruvector/import.js +267 -225
- package/dist/src/commands/ruvector/import.js.map +1 -1
- package/dist/src/commands/ruvector/index.js +75 -37
- package/dist/src/commands/ruvector/index.js.map +1 -1
- package/dist/src/commands/ruvector/init.js +359 -336
- package/dist/src/commands/ruvector/init.js.map +1 -1
- package/dist/src/commands/ruvector/migrate.js +322 -335
- package/dist/src/commands/ruvector/migrate.js.map +1 -1
- package/dist/src/commands/ruvector/optimize.js +431 -375
- package/dist/src/commands/ruvector/optimize.js.map +1 -1
- package/dist/src/commands/ruvector/setup.js +117 -703
- package/dist/src/commands/ruvector/setup.js.map +1 -1
- package/dist/src/commands/ruvector/status.js +419 -364
- package/dist/src/commands/ruvector/status.js.map +1 -1
- package/dist/src/commands/security.d.ts.map +1 -1
- package/dist/src/commands/security.js +610 -456
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.d.ts +1 -1
- package/dist/src/commands/session.js +627 -505
- package/dist/src/commands/session.js.map +1 -1
- package/dist/src/commands/start.d.ts +1 -1
- package/dist/src/commands/start.js +368 -271
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.d.ts +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +492 -379
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +488 -408
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.d.ts +1 -1
- package/dist/src/commands/task.js +539 -424
- package/dist/src/commands/task.js.map +1 -1
- package/dist/src/commands/transfer-store.js +412 -322
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/commands/update.js +291 -196
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/workflow.js +486 -386
- package/dist/src/commands/workflow.js.map +1 -1
- package/dist/src/config-adapter.js +40 -39
- package/dist/src/config-adapter.js.map +1 -1
- package/dist/src/index.js +416 -312
- package/dist/src/index.js.map +1 -1
- package/dist/src/infrastructure/in-memory-repositories.js +507 -246
- package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
- package/dist/src/init/claudemd-generator.js +78 -368
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.js +1019 -1345
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.js +60 -635
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/index.d.ts +1 -1
- package/dist/src/init/index.d.ts.map +1 -1
- package/dist/src/init/index.js +1 -1
- package/dist/src/init/index.js.map +1 -1
- package/dist/src/init/mcp-generator.d.ts +0 -1
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js +62 -42
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +167 -100
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts +16 -8
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +20 -1300
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +15 -5
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +66 -76
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.js +130 -76
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.js +758 -445
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +492 -391
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.d.ts +30 -0
- package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/agentdb-tools.js +758 -0
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -0
- package/dist/src/mcp-tools/analyze-tools.js +236 -172
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/auto-install.js +142 -80
- package/dist/src/mcp-tools/auto-install.js.map +1 -1
- package/dist/src/mcp-tools/browser-tools.js +375 -252
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/claims-tools.js +565 -473
- package/dist/src/mcp-tools/claims-tools.js.map +1 -1
- package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +284 -190
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +600 -349
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +367 -289
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +693 -582
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +312 -261
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +718 -423
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +2726 -1978
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +2 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +2 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +514 -329
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +428 -326
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +480 -420
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/progress-tools.js +278 -204
- package/dist/src/mcp-tools/progress-tools.js.map +1 -1
- package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
- package/dist/src/mcp-tools/ruvllm-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/ruvllm-tools.js +399 -0
- package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
- package/dist/src/mcp-tools/security-tools.js +429 -297
- package/dist/src/mcp-tools/security-tools.js.map +1 -1
- package/dist/src/mcp-tools/session-tools.js +234 -185
- package/dist/src/mcp-tools/session-tools.js.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts +2 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +303 -64
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +352 -200
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +357 -189
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +196 -148
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.js +333 -186
- package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +377 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +471 -335
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.js +345 -173
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.js +841 -359
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.js +1964 -0
- package/dist/src/memory/memory-bridge.js.map +1 -0
- package/dist/src/memory/memory-initializer.js +1895 -1602
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/sona-optimizer.js +329 -199
- package/dist/src/memory/sona-optimizer.js.map +1 -1
- package/dist/src/output.d.ts +2 -2
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +273 -242
- package/dist/src/output.js.map +1 -1
- package/dist/src/parser.js +217 -124
- package/dist/src/parser.js.map +1 -1
- package/dist/src/plugins/manager.js +531 -278
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.js +362 -275
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/index.js +105 -48
- package/dist/src/plugins/store/index.js.map +1 -1
- package/dist/src/plugins/store/search.js +107 -69
- package/dist/src/plugins/store/search.js.map +1 -1
- package/dist/src/plugins/tests/demo-plugin-store.js +160 -113
- package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
- package/dist/src/plugins/tests/standalone-test.js +223 -172
- package/dist/src/plugins/tests/standalone-test.js.map +1 -1
- package/dist/src/plugins/tests/test-plugin-store.js +228 -190
- package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
- package/dist/src/production/circuit-breaker.js +126 -62
- package/dist/src/production/circuit-breaker.js.map +1 -1
- package/dist/src/production/error-handler.js +156 -86
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/production/monitoring.js +220 -139
- package/dist/src/production/monitoring.js.map +1 -1
- package/dist/src/production/rate-limiter.js +93 -74
- package/dist/src/production/rate-limiter.js.map +1 -1
- package/dist/src/production/retry.js +167 -75
- package/dist/src/production/retry.js.map +1 -1
- package/dist/src/prompt.js +560 -436
- package/dist/src/prompt.js.map +1 -1
- package/dist/src/runtime/headless.js +289 -200
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.js +511 -0
- package/dist/src/ruvector/agent-wasm.js.map +1 -0
- package/dist/src/ruvector/ast-analyzer.js +232 -145
- package/dist/src/ruvector/ast-analyzer.js.map +1 -1
- package/dist/src/ruvector/coverage-router.js +419 -287
- package/dist/src/ruvector/coverage-router.js.map +1 -1
- package/dist/src/ruvector/coverage-tools.js +101 -56
- package/dist/src/ruvector/coverage-tools.js.map +1 -1
- package/dist/src/ruvector/diff-classifier.js +451 -324
- package/dist/src/ruvector/diff-classifier.js.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.js +337 -251
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/flash-attention.js +254 -223
- package/dist/src/ruvector/flash-attention.js.map +1 -1
- package/dist/src/ruvector/graph-analyzer.js +680 -486
- package/dist/src/ruvector/graph-analyzer.js.map +1 -1
- package/dist/src/ruvector/index.js +113 -27
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/lora-adapter.js +248 -155
- package/dist/src/ruvector/lora-adapter.js.map +1 -1
- package/dist/src/ruvector/model-router.js +248 -175
- package/dist/src/ruvector/model-router.js.map +1 -1
- package/dist/src/ruvector/moe-router.js +286 -228
- package/dist/src/ruvector/moe-router.js.map +1 -1
- package/dist/src/ruvector/q-learning-router.js +338 -257
- package/dist/src/ruvector/q-learning-router.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.js +527 -0
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
- package/dist/src/ruvector/semantic-router.js +67 -60
- package/dist/src/ruvector/semantic-router.js.map +1 -1
- package/dist/src/ruvector/vector-db.js +205 -119
- package/dist/src/ruvector/vector-db.js.map +1 -1
- package/dist/src/services/agentic-flow-bridge.js +168 -0
- package/dist/src/services/agentic-flow-bridge.js.map +1 -0
- package/dist/src/services/claim-service.js +940 -615
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.js +669 -399
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/headless-worker-executor.js +467 -441
- package/dist/src/services/headless-worker-executor.js.map +1 -1
- package/dist/src/services/index.d.ts +5 -5
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +4 -4
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/registry-api.js +201 -93
- package/dist/src/services/registry-api.js.map +1 -1
- package/dist/src/services/ruvector-training.js +414 -144
- package/dist/src/services/ruvector-training.js.map +1 -1
- package/dist/src/services/worker-daemon.js +928 -531
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.js +550 -331
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/src/suggest.js +55 -45
- package/dist/src/suggest.js.map +1 -1
- package/dist/src/transfer/anonymization/index.js +37 -29
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/transfer/deploy-seraphine.d.ts +1 -1
- package/dist/src/transfer/deploy-seraphine.js +156 -129
- package/dist/src/transfer/deploy-seraphine.js.map +1 -1
- package/dist/src/transfer/export.js +142 -84
- package/dist/src/transfer/export.js.map +1 -1
- package/dist/src/transfer/index.d.ts +1 -1
- package/dist/src/transfer/index.d.ts.map +1 -1
- package/dist/src/transfer/index.js +2 -0
- package/dist/src/transfer/index.js.map +1 -1
- package/dist/src/transfer/ipfs/client.js +337 -179
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.js +434 -290
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/models/seraphine.js +58 -58
- package/dist/src/transfer/models/seraphine.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.js +37 -33
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.js +248 -139
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.js +353 -243
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/download.js +365 -243
- package/dist/src/transfer/store/download.js.map +1 -1
- package/dist/src/transfer/store/index.js +130 -63
- package/dist/src/transfer/store/index.js.map +1 -1
- package/dist/src/transfer/store/publish.js +258 -184
- package/dist/src/transfer/store/publish.js.map +1 -1
- package/dist/src/transfer/store/registry.js +73 -51
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/search.js +96 -64
- package/dist/src/transfer/store/search.js.map +1 -1
- package/dist/src/transfer/store/tests/standalone-test.js +231 -174
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
- package/dist/src/transfer/test-seraphine.js +130 -95
- package/dist/src/transfer/test-seraphine.js.map +1 -1
- package/dist/src/transfer/tests/test-store.js +239 -194
- package/dist/src/transfer/tests/test-store.js.map +1 -1
- package/dist/src/types.js +56 -27
- package/dist/src/types.js.map +1 -1
- package/dist/src/update/checker.js +183 -106
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.js +198 -135
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.js +85 -38
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/update/rate-limiter.js +31 -19
- package/dist/src/update/rate-limiter.js.map +1 -1
- package/dist/src/update/validator.js +64 -38
- package/dist/src/update/validator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -10
- package/.claude/agents/custom/accessibility-auditor.yaml +0 -56
- package/.claude/agents/custom/design-architect.yaml +0 -48
- package/.claude/agents/custom/ui-developer.yaml +0 -46
- package/.claude/agents/custom/ux-researcher.yaml +0 -60
- package/dist/src/benchmarks/pretrain/index.d.ts +0 -58
- package/dist/src/benchmarks/pretrain/index.d.ts.map +0 -1
- package/dist/src/commands/index.d.ts +0 -108
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/config-adapter.d.ts +0 -15
- package/dist/src/config-adapter.d.ts.map +0 -1
- package/dist/src/index.d.ts +0 -76
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/infrastructure/in-memory-repositories.d.ts +0 -68
- package/dist/src/infrastructure/in-memory-repositories.d.ts.map +0 -1
- package/dist/src/init/claudemd-generator.d.ts +0 -25
- package/dist/src/init/claudemd-generator.d.ts.map +0 -1
- package/dist/src/init/executor.d.ts +0 -41
- package/dist/src/init/executor.d.ts.map +0 -1
- package/dist/src/init/helpers-generator.d.ts +0 -60
- package/dist/src/init/helpers-generator.d.ts.map +0 -1
- package/dist/src/mcp-client.d.ts +0 -92
- package/dist/src/mcp-client.d.ts.map +0 -1
- package/dist/src/mcp-server.d.ts +0 -161
- package/dist/src/mcp-server.d.ts.map +0 -1
- package/dist/src/mcp-tools/auto-install.d.ts +0 -83
- package/dist/src/mcp-tools/auto-install.d.ts.map +0 -1
- package/dist/src/mcp-tools/types.d.ts +0 -31
- package/dist/src/mcp-tools/types.d.ts.map +0 -1
- package/dist/src/memory/ewc-consolidation.d.ts +0 -271
- package/dist/src/memory/ewc-consolidation.d.ts.map +0 -1
- package/dist/src/memory/intelligence.d.ts +0 -285
- package/dist/src/memory/intelligence.d.ts.map +0 -1
- package/dist/src/memory/memory-initializer.d.ts +0 -396
- package/dist/src/memory/memory-initializer.d.ts.map +0 -1
- package/dist/src/memory/sona-optimizer.d.ts +0 -227
- package/dist/src/memory/sona-optimizer.d.ts.map +0 -1
- package/dist/src/parser.d.ts +0 -41
- package/dist/src/parser.d.ts.map +0 -1
- package/dist/src/plugins/manager.d.ts +0 -133
- package/dist/src/plugins/manager.d.ts.map +0 -1
- package/dist/src/plugins/store/discovery.d.ts +0 -88
- package/dist/src/plugins/store/discovery.d.ts.map +0 -1
- package/dist/src/plugins/store/index.d.ts +0 -76
- package/dist/src/plugins/store/index.d.ts.map +0 -1
- package/dist/src/plugins/store/search.d.ts +0 -46
- package/dist/src/plugins/store/search.d.ts.map +0 -1
- package/dist/src/plugins/store/types.d.ts +0 -274
- package/dist/src/plugins/store/types.d.ts.map +0 -1
- package/dist/src/production/circuit-breaker.d.ts +0 -101
- package/dist/src/production/circuit-breaker.d.ts.map +0 -1
- package/dist/src/production/error-handler.d.ts +0 -92
- package/dist/src/production/error-handler.d.ts.map +0 -1
- package/dist/src/production/monitoring.d.ts +0 -161
- package/dist/src/production/monitoring.d.ts.map +0 -1
- package/dist/src/production/rate-limiter.d.ts +0 -80
- package/dist/src/production/rate-limiter.d.ts.map +0 -1
- package/dist/src/production/retry.d.ts +0 -48
- package/dist/src/production/retry.d.ts.map +0 -1
- package/dist/src/prompt.d.ts +0 -44
- package/dist/src/prompt.d.ts.map +0 -1
- package/dist/src/runtime/headless.d.ts +0 -60
- package/dist/src/runtime/headless.d.ts.map +0 -1
- package/dist/src/ruvector/ast-analyzer.d.ts +0 -67
- package/dist/src/ruvector/ast-analyzer.d.ts.map +0 -1
- package/dist/src/ruvector/coverage-router.d.ts +0 -160
- package/dist/src/ruvector/coverage-router.d.ts.map +0 -1
- package/dist/src/ruvector/diff-classifier.d.ts +0 -175
- package/dist/src/ruvector/diff-classifier.d.ts.map +0 -1
- package/dist/src/ruvector/enhanced-model-router.d.ts +0 -146
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +0 -1
- 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/graph-analyzer.d.ts +0 -187
- package/dist/src/ruvector/graph-analyzer.d.ts.map +0 -1
- package/dist/src/ruvector/index.d.ts +0 -34
- package/dist/src/ruvector/index.d.ts.map +0 -1
- package/dist/src/ruvector/lora-adapter.d.ts +0 -218
- package/dist/src/ruvector/lora-adapter.d.ts.map +0 -1
- package/dist/src/ruvector/model-router.d.ts +0 -220
- package/dist/src/ruvector/model-router.d.ts.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/q-learning-router.d.ts +0 -211
- package/dist/src/ruvector/q-learning-router.d.ts.map +0 -1
- package/dist/src/ruvector/semantic-router.d.ts +0 -77
- package/dist/src/ruvector/semantic-router.d.ts.map +0 -1
- package/dist/src/ruvector/vector-db.d.ts +0 -69
- package/dist/src/ruvector/vector-db.d.ts.map +0 -1
- package/dist/src/services/claim-service.d.ts +0 -204
- package/dist/src/services/claim-service.d.ts.map +0 -1
- package/dist/src/services/container-worker-pool.d.ts +0 -197
- package/dist/src/services/container-worker-pool.d.ts.map +0 -1
- package/dist/src/services/headless-worker-executor.d.ts +0 -304
- package/dist/src/services/headless-worker-executor.d.ts.map +0 -1
- package/dist/src/services/registry-api.d.ts +0 -58
- package/dist/src/services/registry-api.d.ts.map +0 -1
- package/dist/src/services/ruvector-training.d.ts +0 -213
- package/dist/src/services/ruvector-training.d.ts.map +0 -1
- package/dist/src/services/worker-daemon.d.ts +0 -203
- package/dist/src/services/worker-daemon.d.ts.map +0 -1
- package/dist/src/services/worker-queue.d.ts +0 -194
- package/dist/src/services/worker-queue.d.ts.map +0 -1
- package/dist/src/suggest.d.ts +0 -53
- package/dist/src/suggest.d.ts.map +0 -1
- package/dist/src/transfer/export.d.ts +0 -25
- package/dist/src/transfer/export.d.ts.map +0 -1
- package/dist/src/transfer/ipfs/client.d.ts +0 -109
- package/dist/src/transfer/ipfs/client.d.ts.map +0 -1
- package/dist/src/transfer/ipfs/upload.d.ts +0 -95
- package/dist/src/transfer/ipfs/upload.d.ts.map +0 -1
- package/dist/src/transfer/models/seraphine.d.ts +0 -72
- package/dist/src/transfer/models/seraphine.d.ts.map +0 -1
- package/dist/src/transfer/serialization/cfp.d.ts +0 -49
- package/dist/src/transfer/serialization/cfp.d.ts.map +0 -1
- package/dist/src/transfer/storage/gcs.d.ts +0 -82
- package/dist/src/transfer/storage/gcs.d.ts.map +0 -1
- package/dist/src/transfer/store/discovery.d.ts +0 -84
- package/dist/src/transfer/store/discovery.d.ts.map +0 -1
- package/dist/src/transfer/store/download.d.ts +0 -70
- package/dist/src/transfer/store/download.d.ts.map +0 -1
- package/dist/src/transfer/store/index.d.ts +0 -84
- package/dist/src/transfer/store/index.d.ts.map +0 -1
- package/dist/src/transfer/store/publish.d.ts +0 -76
- package/dist/src/transfer/store/publish.d.ts.map +0 -1
- package/dist/src/transfer/store/search.d.ts +0 -54
- package/dist/src/transfer/store/search.d.ts.map +0 -1
- package/dist/src/transfer/types.d.ts +0 -245
- package/dist/src/transfer/types.d.ts.map +0 -1
- package/dist/src/types.d.ts +0 -198
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/update/checker.d.ts +0 -34
- package/dist/src/update/checker.d.ts.map +0 -1
- package/dist/src/update/executor.d.ts +0 -32
- package/dist/src/update/executor.d.ts.map +0 -1
- package/dist/src/update/index.d.ts +0 -33
- package/dist/src/update/index.d.ts.map +0 -1
- package/dist/src/update/rate-limiter.d.ts +0 -20
- package/dist/src/update/rate-limiter.d.ts.map +0 -1
- package/dist/src/update/validator.d.ts +0 -17
- package/dist/src/update/validator.d.ts.map +0 -1
|
@@ -2,6 +2,62 @@
|
|
|
2
2
|
* V3 CLI Daemon Command
|
|
3
3
|
* Manages background worker daemon (Node.js-based, similar to shell helpers)
|
|
4
4
|
*/
|
|
5
|
+
var __assign = (this && this.__assign) || function () {
|
|
6
|
+
__assign = Object.assign || function(t) {
|
|
7
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
8
|
+
s = arguments[i];
|
|
9
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
10
|
+
t[p] = s[p];
|
|
11
|
+
}
|
|
12
|
+
return t;
|
|
13
|
+
};
|
|
14
|
+
return __assign.apply(this, arguments);
|
|
15
|
+
};
|
|
16
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
17
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
18
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
19
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
20
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
21
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
22
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
26
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
27
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
28
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
29
|
+
function step(op) {
|
|
30
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
31
|
+
while (_) try {
|
|
32
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
33
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
34
|
+
switch (op[0]) {
|
|
35
|
+
case 0: case 1: t = op; break;
|
|
36
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
37
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
38
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
39
|
+
default:
|
|
40
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
41
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
42
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
43
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
44
|
+
if (t[2]) _.ops.pop();
|
|
45
|
+
_.trys.pop(); continue;
|
|
46
|
+
}
|
|
47
|
+
op = body.call(thisArg, _);
|
|
48
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
49
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
53
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
54
|
+
if (ar || !(i in from)) {
|
|
55
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
56
|
+
ar[i] = from[i];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
60
|
+
};
|
|
5
61
|
import { output } from '../output.js';
|
|
6
62
|
import { getDaemon, startDaemon, stopDaemon } from '../services/worker-daemon.js';
|
|
7
63
|
import { spawn } from 'child_process';
|
|
@@ -9,16 +65,18 @@ import { fileURLToPath } from 'url';
|
|
|
9
65
|
import { dirname, join, resolve } from 'path';
|
|
10
66
|
import * as fs from 'fs';
|
|
11
67
|
// Start daemon subcommand
|
|
12
|
-
|
|
68
|
+
var startCommand = {
|
|
13
69
|
name: 'start',
|
|
14
70
|
description: 'Start the worker daemon with all enabled background workers',
|
|
15
71
|
options: [
|
|
16
72
|
{ name: 'workers', short: 'w', type: 'string', description: 'Comma-separated list of workers to enable (default: map,audit,optimize,consolidate,testgaps)' },
|
|
17
73
|
{ name: 'quiet', short: 'Q', type: 'boolean', description: 'Suppress output' },
|
|
18
|
-
{ name: 'background', short: 'b', type: 'boolean', description: 'Run daemon in background (detached process)', default: true },
|
|
74
|
+
{ name: 'background', short: 'b', type: 'boolean', description: 'Run daemon in background (detached process)', "default": true },
|
|
19
75
|
{ name: 'foreground', short: 'f', type: 'boolean', description: 'Run daemon in foreground (blocks terminal)' },
|
|
20
76
|
{ name: 'headless', type: 'boolean', description: 'Enable headless worker execution (E2B sandbox)' },
|
|
21
77
|
{ name: 'sandbox', type: 'string', description: 'Default sandbox mode for headless workers', choices: ['strict', 'permissive', 'disabled'] },
|
|
78
|
+
{ name: 'max-cpu-load', type: 'string', description: 'Override maxCpuLoad resource threshold (e.g. 4.0)' },
|
|
79
|
+
{ name: 'min-free-memory', type: 'string', description: 'Override minFreeMemoryPercent resource threshold (e.g. 15)' },
|
|
22
80
|
],
|
|
23
81
|
examples: [
|
|
24
82
|
{ command: 'claude-flow daemon start', description: 'Start daemon in background (default)' },
|
|
@@ -26,189 +84,255 @@ const startCommand = {
|
|
|
26
84
|
{ command: 'claude-flow daemon start -w map,audit,optimize', description: 'Start with specific workers' },
|
|
27
85
|
{ command: 'claude-flow daemon start --headless --sandbox strict', description: 'Start with headless workers in strict sandbox' },
|
|
28
86
|
],
|
|
29
|
-
action:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
87
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
88
|
+
var quiet, foreground, projectRoot, isDaemonProcess, config, rawMaxCpu, rawMinMem, NUMERIC_RE, sanitize, thresholds, val, val, bgPid, stateDir, pidFile_1, cleanup_1, spinner, daemon, status, error_1;
|
|
89
|
+
var _a;
|
|
90
|
+
return __generator(this, function (_b) {
|
|
91
|
+
switch (_b.label) {
|
|
92
|
+
case 0:
|
|
93
|
+
quiet = ctx.flags.quiet;
|
|
94
|
+
foreground = ctx.flags.foreground;
|
|
95
|
+
projectRoot = process.cwd();
|
|
96
|
+
isDaemonProcess = process.env.CLAUDE_FLOW_DAEMON === '1';
|
|
97
|
+
config = {};
|
|
98
|
+
rawMaxCpu = ctx.flags['max-cpu-load'];
|
|
99
|
+
rawMinMem = ctx.flags['min-free-memory'];
|
|
100
|
+
NUMERIC_RE = /^\d+(\.\d+)?$/;
|
|
101
|
+
sanitize = function (s) { return s.replace(/[\x00-\x1f\x7f-\x9f]/g, ''); };
|
|
102
|
+
if (rawMaxCpu || rawMinMem) {
|
|
103
|
+
thresholds = {};
|
|
104
|
+
if (rawMaxCpu) {
|
|
105
|
+
val = parseFloat(rawMaxCpu);
|
|
106
|
+
if (NUMERIC_RE.test(rawMaxCpu) && isFinite(val) && val > 0 && val <= 1000) {
|
|
107
|
+
thresholds.maxCpuLoad = val;
|
|
108
|
+
}
|
|
109
|
+
else if (!quiet) {
|
|
110
|
+
output.printWarning("Ignoring invalid --max-cpu-load value: " + sanitize(rawMaxCpu));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (rawMinMem) {
|
|
114
|
+
val = parseFloat(rawMinMem);
|
|
115
|
+
if (NUMERIC_RE.test(rawMinMem) && isFinite(val) && val >= 0 && val <= 100) {
|
|
116
|
+
thresholds.minFreeMemoryPercent = val;
|
|
117
|
+
}
|
|
118
|
+
else if (!quiet) {
|
|
119
|
+
output.printWarning("Ignoring invalid --min-free-memory value: " + sanitize(rawMinMem));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (thresholds.maxCpuLoad !== undefined || thresholds.minFreeMemoryPercent !== undefined) {
|
|
123
|
+
config.resourceThresholds = thresholds;
|
|
124
|
+
}
|
|
63
125
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
{
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
output.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
126
|
+
// Check if background daemon already running (skip if we ARE the daemon process)
|
|
127
|
+
if (!isDaemonProcess) {
|
|
128
|
+
bgPid = getBackgroundDaemonPid(projectRoot);
|
|
129
|
+
if (bgPid && isProcessRunning(bgPid)) {
|
|
130
|
+
if (!quiet) {
|
|
131
|
+
output.printWarning("Daemon already running in background (PID: " + bgPid + ")");
|
|
132
|
+
}
|
|
133
|
+
return [2 /*return*/, { success: true }];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Background mode (default): fork a detached process
|
|
137
|
+
if (!foreground) {
|
|
138
|
+
return [2 /*return*/, startBackgroundDaemon(projectRoot, quiet, rawMaxCpu, rawMinMem)];
|
|
139
|
+
}
|
|
140
|
+
_b.label = 1;
|
|
141
|
+
case 1:
|
|
142
|
+
_b.trys.push([1, 8, , 9]);
|
|
143
|
+
stateDir = join(projectRoot, '.claude-flow');
|
|
144
|
+
pidFile_1 = join(stateDir, 'daemon.pid');
|
|
145
|
+
// Ensure state directory exists
|
|
146
|
+
if (!fs.existsSync(stateDir)) {
|
|
147
|
+
fs.mkdirSync(stateDir, { recursive: true });
|
|
148
|
+
}
|
|
149
|
+
// Write PID file for foreground mode
|
|
150
|
+
fs.writeFileSync(pidFile_1, String(process.pid));
|
|
151
|
+
cleanup_1 = function () {
|
|
152
|
+
try {
|
|
153
|
+
if (fs.existsSync(pidFile_1)) {
|
|
154
|
+
fs.unlinkSync(pidFile_1);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch ( /* ignore */_a) { /* ignore */ }
|
|
158
|
+
};
|
|
159
|
+
process.on('exit', cleanup_1);
|
|
160
|
+
process.on('SIGINT', function () { cleanup_1(); process.exit(0); });
|
|
161
|
+
process.on('SIGTERM', function () { cleanup_1(); process.exit(0); });
|
|
162
|
+
// Ignore SIGHUP on macOS/Linux — prevents daemon death when terminal closes (#1283)
|
|
163
|
+
if (process.platform !== 'win32') {
|
|
164
|
+
process.on('SIGHUP', function () { });
|
|
165
|
+
}
|
|
166
|
+
if (!!quiet) return [3 /*break*/, 4];
|
|
167
|
+
spinner = output.createSpinner({ text: 'Starting worker daemon...', spinner: 'dots' });
|
|
168
|
+
spinner.start();
|
|
169
|
+
return [4 /*yield*/, startDaemon(projectRoot, config)];
|
|
170
|
+
case 2:
|
|
171
|
+
daemon = _b.sent();
|
|
172
|
+
status = daemon.getStatus();
|
|
173
|
+
spinner.succeed('Worker daemon started (foreground mode)');
|
|
174
|
+
output.writeln();
|
|
175
|
+
output.printBox([
|
|
176
|
+
"PID: " + status.pid,
|
|
177
|
+
"Started: " + ((_a = status.startedAt) === null || _a === void 0 ? void 0 : _a.toISOString()),
|
|
178
|
+
"Workers: " + status.config.workers.filter(function (w) { return w.enabled; }).length + " enabled",
|
|
179
|
+
"Max Concurrent: " + status.config.maxConcurrent,
|
|
180
|
+
"Max CPU Load: " + status.config.resourceThresholds.maxCpuLoad,
|
|
181
|
+
"Min Free Memory: " + status.config.resourceThresholds.minFreeMemoryPercent + "%",
|
|
182
|
+
].join('\n'), 'Daemon Status');
|
|
183
|
+
output.writeln();
|
|
184
|
+
output.writeln(output.bold('Scheduled Workers'));
|
|
185
|
+
output.printTable({
|
|
186
|
+
columns: [
|
|
187
|
+
{ key: 'type', header: 'Worker', width: 15 },
|
|
188
|
+
{ key: 'interval', header: 'Interval', width: 12 },
|
|
189
|
+
{ key: 'priority', header: 'Priority', width: 10 },
|
|
190
|
+
{ key: 'description', header: 'Description', width: 30 },
|
|
191
|
+
],
|
|
192
|
+
data: status.config.workers
|
|
193
|
+
.filter(function (w) { return w.enabled; })
|
|
194
|
+
.map(function (w) { return ({
|
|
195
|
+
type: output.highlight(w.type),
|
|
196
|
+
interval: Math.round(w.intervalMs / 60000) + "min",
|
|
197
|
+
priority: w.priority === 'critical' ? output.error(w.priority) :
|
|
198
|
+
w.priority === 'high' ? output.warning(w.priority) :
|
|
199
|
+
output.dim(w.priority),
|
|
200
|
+
description: w.description
|
|
201
|
+
}); })
|
|
202
|
+
});
|
|
203
|
+
output.writeln();
|
|
204
|
+
output.writeln(output.dim('Press Ctrl+C to stop daemon'));
|
|
205
|
+
// Listen for worker events
|
|
206
|
+
daemon.on('worker:start', function (_a) {
|
|
207
|
+
var type = _a.type;
|
|
208
|
+
output.writeln(output.dim("[daemon] Worker starting: " + type));
|
|
209
|
+
});
|
|
210
|
+
daemon.on('worker:complete', function (_a) {
|
|
211
|
+
var type = _a.type, durationMs = _a.durationMs;
|
|
212
|
+
output.writeln(output.success("[daemon] Worker completed: " + type + " (" + durationMs + "ms)"));
|
|
213
|
+
});
|
|
214
|
+
daemon.on('worker:error', function (_a) {
|
|
215
|
+
var type = _a.type, error = _a.error;
|
|
216
|
+
output.writeln(output.error("[daemon] Worker failed: " + type + " - " + error));
|
|
217
|
+
});
|
|
218
|
+
// Keep process alive
|
|
219
|
+
return [4 /*yield*/, new Promise(function () { })];
|
|
220
|
+
case 3:
|
|
221
|
+
// Keep process alive
|
|
222
|
+
_b.sent(); // Never resolves - daemon runs until killed
|
|
223
|
+
return [3 /*break*/, 7];
|
|
224
|
+
case 4: return [4 /*yield*/, startDaemon(projectRoot, config)];
|
|
225
|
+
case 5:
|
|
226
|
+
_b.sent();
|
|
227
|
+
return [4 /*yield*/, new Promise(function () { })];
|
|
228
|
+
case 6:
|
|
229
|
+
_b.sent(); // Keep alive
|
|
230
|
+
_b.label = 7;
|
|
231
|
+
case 7: return [2 /*return*/, { success: true }];
|
|
232
|
+
case 8:
|
|
233
|
+
error_1 = _b.sent();
|
|
234
|
+
output.printError("Failed to start daemon: " + (error_1 instanceof Error ? error_1.message : String(error_1)));
|
|
235
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
236
|
+
case 9: return [2 /*return*/];
|
|
121
237
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
catch (error) {
|
|
125
|
-
output.printError(`Failed to start daemon: ${error instanceof Error ? error.message : String(error)}`);
|
|
126
|
-
return { success: false, exitCode: 1 };
|
|
127
|
-
}
|
|
128
|
-
},
|
|
238
|
+
});
|
|
239
|
+
}); }
|
|
129
240
|
};
|
|
130
241
|
/**
|
|
131
242
|
* Validate path for security - prevents path traversal and injection
|
|
132
243
|
*/
|
|
133
244
|
function validatePath(path, label) {
|
|
134
245
|
// Must be absolute after resolution
|
|
135
|
-
|
|
246
|
+
var resolved = resolve(path);
|
|
136
247
|
// Check for null bytes (injection attack)
|
|
137
248
|
if (path.includes('\0')) {
|
|
138
|
-
throw new Error(
|
|
249
|
+
throw new Error(label + " contains null bytes");
|
|
139
250
|
}
|
|
140
251
|
// Check for shell metacharacters in path components
|
|
141
252
|
if (/[;&|`$<>]/.test(path)) {
|
|
142
|
-
throw new Error(
|
|
253
|
+
throw new Error(label + " contains shell metacharacters");
|
|
143
254
|
}
|
|
144
255
|
// Prevent path traversal outside expected directories
|
|
145
256
|
if (!resolved.includes('.claude-flow') && !resolved.includes('bin')) {
|
|
146
257
|
// Allow only paths within project structure
|
|
147
|
-
|
|
258
|
+
var cwd = process.cwd();
|
|
148
259
|
if (!resolved.startsWith(cwd)) {
|
|
149
|
-
throw new Error(
|
|
260
|
+
throw new Error(label + " escapes project directory");
|
|
150
261
|
}
|
|
151
262
|
}
|
|
152
263
|
}
|
|
153
264
|
/**
|
|
154
265
|
* Start daemon as a detached background process
|
|
155
266
|
*/
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
267
|
+
function startBackgroundDaemon(projectRoot, quiet, maxCpuLoad, minFreeMemory) {
|
|
268
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
269
|
+
var resolvedRoot, stateDir, pidFile, logFile, __filename, __dirname, cliPath, isWin, spawnOpts, spawnArgs, SPAWN_NUMERIC_RE, child, pid;
|
|
270
|
+
return __generator(this, function (_a) {
|
|
271
|
+
switch (_a.label) {
|
|
272
|
+
case 0:
|
|
273
|
+
resolvedRoot = resolve(projectRoot);
|
|
274
|
+
validatePath(resolvedRoot, 'Project root');
|
|
275
|
+
stateDir = join(resolvedRoot, '.claude-flow');
|
|
276
|
+
pidFile = join(stateDir, 'daemon.pid');
|
|
277
|
+
logFile = join(stateDir, 'daemon.log');
|
|
278
|
+
// Validate all paths
|
|
279
|
+
validatePath(stateDir, 'State directory');
|
|
280
|
+
validatePath(pidFile, 'PID file');
|
|
281
|
+
validatePath(logFile, 'Log file');
|
|
282
|
+
// Ensure state directory exists
|
|
283
|
+
if (!fs.existsSync(stateDir)) {
|
|
284
|
+
fs.mkdirSync(stateDir, { recursive: true });
|
|
285
|
+
}
|
|
286
|
+
__filename = fileURLToPath(import.meta.url);
|
|
287
|
+
__dirname = dirname(__filename);
|
|
288
|
+
cliPath = resolve(join(__dirname, '..', '..', '..', 'bin', 'cli.js'));
|
|
289
|
+
validatePath(cliPath, 'CLI path');
|
|
290
|
+
// Verify CLI path exists
|
|
291
|
+
if (!fs.existsSync(cliPath)) {
|
|
292
|
+
output.printError("CLI not found at: " + cliPath);
|
|
293
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
294
|
+
}
|
|
295
|
+
isWin = process.platform === 'win32';
|
|
296
|
+
spawnOpts = __assign({ cwd: resolvedRoot, detached: !isWin, stdio: ['ignore', fs.openSync(logFile, 'a'), fs.openSync(logFile, 'a')], env: __assign(__assign(__assign({}, process.env), { CLAUDE_FLOW_DAEMON: '1' }), (process.platform === 'darwin' ? { NOHUP: '1' } : {})) }, (isWin ? { shell: true, windowsHide: true } : {}));
|
|
297
|
+
spawnArgs = [
|
|
298
|
+
cliPath,
|
|
299
|
+
'daemon', 'start', '--foreground', '--quiet',
|
|
300
|
+
];
|
|
301
|
+
SPAWN_NUMERIC_RE = /^\d+(\.\d+)?$/;
|
|
302
|
+
if (maxCpuLoad && SPAWN_NUMERIC_RE.test(maxCpuLoad)) {
|
|
303
|
+
spawnArgs.push('--max-cpu-load', maxCpuLoad);
|
|
304
|
+
}
|
|
305
|
+
if (minFreeMemory && SPAWN_NUMERIC_RE.test(minFreeMemory)) {
|
|
306
|
+
spawnArgs.push('--min-free-memory', minFreeMemory);
|
|
307
|
+
}
|
|
308
|
+
child = spawn(process.execPath, spawnArgs, spawnOpts);
|
|
309
|
+
pid = child.pid;
|
|
310
|
+
if (!pid || pid <= 0) {
|
|
311
|
+
output.printError('Failed to get daemon PID');
|
|
312
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
313
|
+
}
|
|
314
|
+
// Unref BEFORE writing PID file — prevents race where parent exits
|
|
315
|
+
// but child hasn't fully detached yet (fixes macOS daemon death #1283)
|
|
316
|
+
child.unref();
|
|
317
|
+
// Small delay to let the child process fully detach on macOS
|
|
318
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 100); })];
|
|
319
|
+
case 1:
|
|
320
|
+
// Small delay to let the child process fully detach on macOS
|
|
321
|
+
_a.sent();
|
|
322
|
+
// Save PID only after child is detached
|
|
323
|
+
fs.writeFileSync(pidFile, String(pid));
|
|
324
|
+
if (!quiet) {
|
|
325
|
+
output.printSuccess("Daemon started in background (PID: " + pid + ")");
|
|
326
|
+
output.printInfo("Logs: " + logFile);
|
|
327
|
+
output.printInfo("Stop with: claude-flow daemon stop");
|
|
328
|
+
}
|
|
329
|
+
return [2 /*return*/, { success: true }];
|
|
330
|
+
}
|
|
331
|
+
});
|
|
192
332
|
});
|
|
193
|
-
// Get PID from spawned process directly (no shell echo needed)
|
|
194
|
-
const pid = child.pid;
|
|
195
|
-
if (!pid || pid <= 0) {
|
|
196
|
-
output.printError('Failed to get daemon PID');
|
|
197
|
-
return { success: false, exitCode: 1 };
|
|
198
|
-
}
|
|
199
|
-
// Save PID
|
|
200
|
-
fs.writeFileSync(pidFile, String(pid));
|
|
201
|
-
if (!quiet) {
|
|
202
|
-
output.printSuccess(`Daemon started in background (PID: ${pid})`);
|
|
203
|
-
output.printInfo(`Logs: ${logFile}`);
|
|
204
|
-
output.printInfo(`Stop with: claude-flow daemon stop`);
|
|
205
|
-
}
|
|
206
|
-
// Unref so parent can exit immediately
|
|
207
|
-
child.unref();
|
|
208
|
-
return { success: true };
|
|
209
333
|
}
|
|
210
334
|
// Stop daemon subcommand
|
|
211
|
-
|
|
335
|
+
var stopCommand = {
|
|
212
336
|
name: 'stop',
|
|
213
337
|
description: 'Stop the worker daemon and all background workers',
|
|
214
338
|
options: [
|
|
@@ -217,93 +341,121 @@ const stopCommand = {
|
|
|
217
341
|
examples: [
|
|
218
342
|
{ command: 'claude-flow daemon stop', description: 'Stop the daemon' },
|
|
219
343
|
],
|
|
220
|
-
action:
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
344
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
345
|
+
var quiet, projectRoot, spinner, killed, error_2;
|
|
346
|
+
return __generator(this, function (_a) {
|
|
347
|
+
switch (_a.label) {
|
|
348
|
+
case 0:
|
|
349
|
+
quiet = ctx.flags.quiet;
|
|
350
|
+
projectRoot = process.cwd();
|
|
351
|
+
_a.label = 1;
|
|
352
|
+
case 1:
|
|
353
|
+
_a.trys.push([1, 8, , 9]);
|
|
354
|
+
if (!!quiet) return [3 /*break*/, 4];
|
|
355
|
+
spinner = output.createSpinner({ text: 'Stopping worker daemon...', spinner: 'dots' });
|
|
356
|
+
spinner.start();
|
|
357
|
+
// Try to stop in-process daemon first
|
|
358
|
+
return [4 /*yield*/, stopDaemon()];
|
|
359
|
+
case 2:
|
|
360
|
+
// Try to stop in-process daemon first
|
|
361
|
+
_a.sent();
|
|
362
|
+
return [4 /*yield*/, killBackgroundDaemon(projectRoot)];
|
|
363
|
+
case 3:
|
|
364
|
+
killed = _a.sent();
|
|
365
|
+
spinner.succeed(killed ? 'Worker daemon stopped' : 'Worker daemon was not running');
|
|
366
|
+
return [3 /*break*/, 7];
|
|
367
|
+
case 4: return [4 /*yield*/, stopDaemon()];
|
|
368
|
+
case 5:
|
|
369
|
+
_a.sent();
|
|
370
|
+
return [4 /*yield*/, killBackgroundDaemon(projectRoot)];
|
|
371
|
+
case 6:
|
|
372
|
+
_a.sent();
|
|
373
|
+
_a.label = 7;
|
|
374
|
+
case 7: return [2 /*return*/, { success: true }];
|
|
375
|
+
case 8:
|
|
376
|
+
error_2 = _a.sent();
|
|
377
|
+
output.printError("Failed to stop daemon: " + (error_2 instanceof Error ? error_2.message : String(error_2)));
|
|
378
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
379
|
+
case 9: return [2 /*return*/];
|
|
236
380
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
catch (error) {
|
|
240
|
-
output.printError(`Failed to stop daemon: ${error instanceof Error ? error.message : String(error)}`);
|
|
241
|
-
return { success: false, exitCode: 1 };
|
|
242
|
-
}
|
|
243
|
-
},
|
|
381
|
+
});
|
|
382
|
+
}); }
|
|
244
383
|
};
|
|
245
384
|
/**
|
|
246
385
|
* Kill background daemon process using PID file
|
|
247
386
|
*/
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
return
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
387
|
+
function killBackgroundDaemon(projectRoot) {
|
|
388
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
389
|
+
var pidFile, pid, error_3;
|
|
390
|
+
return __generator(this, function (_a) {
|
|
391
|
+
switch (_a.label) {
|
|
392
|
+
case 0:
|
|
393
|
+
pidFile = join(projectRoot, '.claude-flow', 'daemon.pid');
|
|
394
|
+
if (!fs.existsSync(pidFile)) {
|
|
395
|
+
return [2 /*return*/, false];
|
|
396
|
+
}
|
|
397
|
+
_a.label = 1;
|
|
398
|
+
case 1:
|
|
399
|
+
_a.trys.push([1, 3, , 4]);
|
|
400
|
+
pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
|
|
401
|
+
if (isNaN(pid)) {
|
|
402
|
+
fs.unlinkSync(pidFile);
|
|
403
|
+
return [2 /*return*/, false];
|
|
404
|
+
}
|
|
405
|
+
// Check if process is running
|
|
406
|
+
try {
|
|
407
|
+
process.kill(pid, 0); // Signal 0 = check if alive
|
|
408
|
+
}
|
|
409
|
+
catch (_b) {
|
|
410
|
+
// Process not running, clean up stale PID file
|
|
411
|
+
fs.unlinkSync(pidFile);
|
|
412
|
+
return [2 /*return*/, false];
|
|
413
|
+
}
|
|
414
|
+
// Kill the process
|
|
415
|
+
process.kill(pid, 'SIGTERM');
|
|
416
|
+
// Wait a moment then force kill if needed
|
|
417
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1000); })];
|
|
418
|
+
case 2:
|
|
419
|
+
// Wait a moment then force kill if needed
|
|
420
|
+
_a.sent();
|
|
421
|
+
try {
|
|
422
|
+
process.kill(pid, 0);
|
|
423
|
+
// Still alive, force kill
|
|
424
|
+
process.kill(pid, 'SIGKILL');
|
|
425
|
+
}
|
|
426
|
+
catch (_c) {
|
|
427
|
+
// Process terminated
|
|
428
|
+
}
|
|
429
|
+
// Clean up PID file
|
|
430
|
+
if (fs.existsSync(pidFile)) {
|
|
431
|
+
fs.unlinkSync(pidFile);
|
|
432
|
+
}
|
|
433
|
+
return [2 /*return*/, true];
|
|
434
|
+
case 3:
|
|
435
|
+
error_3 = _a.sent();
|
|
436
|
+
// Clean up PID file on any error
|
|
437
|
+
if (fs.existsSync(pidFile)) {
|
|
438
|
+
fs.unlinkSync(pidFile);
|
|
439
|
+
}
|
|
440
|
+
return [2 /*return*/, false];
|
|
441
|
+
case 4: return [2 /*return*/];
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
});
|
|
293
445
|
}
|
|
294
446
|
/**
|
|
295
447
|
* Get PID of background daemon from PID file
|
|
296
448
|
*/
|
|
297
449
|
function getBackgroundDaemonPid(projectRoot) {
|
|
298
|
-
|
|
450
|
+
var pidFile = join(projectRoot, '.claude-flow', 'daemon.pid');
|
|
299
451
|
if (!fs.existsSync(pidFile)) {
|
|
300
452
|
return null;
|
|
301
453
|
}
|
|
302
454
|
try {
|
|
303
|
-
|
|
455
|
+
var pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
|
|
304
456
|
return isNaN(pid) ? null : pid;
|
|
305
457
|
}
|
|
306
|
-
catch {
|
|
458
|
+
catch (_a) {
|
|
307
459
|
return null;
|
|
308
460
|
}
|
|
309
461
|
}
|
|
@@ -315,12 +467,12 @@ function isProcessRunning(pid) {
|
|
|
315
467
|
process.kill(pid, 0); // Signal 0 = check if alive
|
|
316
468
|
return true;
|
|
317
469
|
}
|
|
318
|
-
catch {
|
|
470
|
+
catch (_a) {
|
|
319
471
|
return false;
|
|
320
472
|
}
|
|
321
473
|
}
|
|
322
474
|
// Status subcommand
|
|
323
|
-
|
|
475
|
+
var statusCommand = {
|
|
324
476
|
name: 'status',
|
|
325
477
|
description: 'Show daemon and worker status',
|
|
326
478
|
options: [
|
|
@@ -332,107 +484,111 @@ const statusCommand = {
|
|
|
332
484
|
{ command: 'claude-flow daemon status -v', description: 'Show detailed status' },
|
|
333
485
|
{ command: 'claude-flow daemon status --show-modes', description: 'Show worker execution modes' },
|
|
334
486
|
],
|
|
335
|
-
action:
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
// Daemon status box
|
|
349
|
-
const statusIcon = isRunning ? output.success('●') : output.error('○');
|
|
350
|
-
const statusText = isRunning ? output.success('RUNNING') : output.error('STOPPED');
|
|
351
|
-
const mode = bgRunning ? output.dim(' (background)') : status.running ? output.dim(' (foreground)') : '';
|
|
352
|
-
output.printBox([
|
|
353
|
-
`Status: ${statusIcon} ${statusText}${mode}`,
|
|
354
|
-
`PID: ${displayPid}`,
|
|
355
|
-
status.startedAt ? `Started: ${status.startedAt.toISOString()}` : '',
|
|
356
|
-
`Workers Enabled: ${status.config.workers.filter(w => w.enabled).length}`,
|
|
357
|
-
`Max Concurrent: ${status.config.maxConcurrent}`,
|
|
358
|
-
].filter(Boolean).join('\n'), 'Worker Daemon');
|
|
359
|
-
output.writeln();
|
|
360
|
-
output.writeln(output.bold('Worker Status'));
|
|
361
|
-
const workerData = status.config.workers.map(w => {
|
|
362
|
-
const state = status.workers.get(w.type);
|
|
363
|
-
// Check for headless mode from worker config or state
|
|
364
|
-
const isHeadless = w.headless || state?.headless || false;
|
|
365
|
-
const sandboxMode = w.sandbox || state?.sandbox || null;
|
|
366
|
-
return {
|
|
367
|
-
type: w.enabled ? output.highlight(w.type) : output.dim(w.type),
|
|
368
|
-
enabled: w.enabled ? output.success('✓') : output.dim('○'),
|
|
369
|
-
status: state?.isRunning ? output.warning('running') :
|
|
370
|
-
w.enabled ? output.success('idle') : output.dim('disabled'),
|
|
371
|
-
runs: state?.runCount ?? 0,
|
|
372
|
-
success: state ? `${Math.round((state.successCount / Math.max(state.runCount, 1)) * 100)}%` : '-',
|
|
373
|
-
lastRun: state?.lastRun ? formatTimeAgo(state.lastRun) : output.dim('never'),
|
|
374
|
-
nextRun: state?.nextRun && w.enabled ? formatTimeUntil(state.nextRun) : output.dim('-'),
|
|
375
|
-
mode: isHeadless ? output.highlight('headless') : output.dim('local'),
|
|
376
|
-
sandbox: isHeadless ? (sandboxMode || 'strict') : output.dim('-'),
|
|
377
|
-
};
|
|
378
|
-
});
|
|
379
|
-
// Build columns based on --show-modes flag
|
|
380
|
-
const baseColumns = [
|
|
381
|
-
{ key: 'type', header: 'Worker', width: 12 },
|
|
382
|
-
{ key: 'enabled', header: 'On', width: 4 },
|
|
383
|
-
{ key: 'status', header: 'Status', width: 10 },
|
|
384
|
-
{ key: 'runs', header: 'Runs', width: 6 },
|
|
385
|
-
{ key: 'success', header: 'Success', width: 8 },
|
|
386
|
-
{ key: 'lastRun', header: 'Last Run', width: 12 },
|
|
387
|
-
{ key: 'nextRun', header: 'Next Run', width: 12 },
|
|
388
|
-
];
|
|
389
|
-
const modeColumns = showModes ? [
|
|
390
|
-
{ key: 'mode', header: 'Mode', width: 10 },
|
|
391
|
-
{ key: 'sandbox', header: 'Sandbox', width: 12 },
|
|
392
|
-
] : [];
|
|
393
|
-
output.printTable({
|
|
394
|
-
columns: [...baseColumns, ...modeColumns],
|
|
395
|
-
data: workerData,
|
|
396
|
-
});
|
|
397
|
-
if (verbose) {
|
|
487
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
488
|
+
var verbose, showModes, projectRoot, daemon, status_1, bgPid, bgRunning, isRunning, displayPid, statusIcon, statusText, mode, workerData, baseColumns, modeColumns;
|
|
489
|
+
return __generator(this, function (_a) {
|
|
490
|
+
verbose = ctx.flags.verbose;
|
|
491
|
+
showModes = ctx.flags['show-modes'];
|
|
492
|
+
projectRoot = process.cwd();
|
|
493
|
+
try {
|
|
494
|
+
daemon = getDaemon(projectRoot);
|
|
495
|
+
status_1 = daemon.getStatus();
|
|
496
|
+
bgPid = getBackgroundDaemonPid(projectRoot);
|
|
497
|
+
bgRunning = bgPid ? isProcessRunning(bgPid) : false;
|
|
498
|
+
isRunning = status_1.running || bgRunning;
|
|
499
|
+
displayPid = bgPid || status_1.pid;
|
|
398
500
|
output.writeln();
|
|
399
|
-
output.
|
|
501
|
+
statusIcon = isRunning ? output.success('●') : output.error('○');
|
|
502
|
+
statusText = isRunning ? output.success('RUNNING') : output.error('STOPPED');
|
|
503
|
+
mode = bgRunning ? output.dim(' (background)') : status_1.running ? output.dim(' (foreground)') : '';
|
|
504
|
+
output.printBox([
|
|
505
|
+
"Status: " + statusIcon + " " + statusText + mode,
|
|
506
|
+
"PID: " + displayPid,
|
|
507
|
+
status_1.startedAt ? "Started: " + status_1.startedAt.toISOString() : '',
|
|
508
|
+
"Workers Enabled: " + status_1.config.workers.filter(function (w) { return w.enabled; }).length,
|
|
509
|
+
"Max Concurrent: " + status_1.config.maxConcurrent,
|
|
510
|
+
"Max CPU Load: " + status_1.config.resourceThresholds.maxCpuLoad,
|
|
511
|
+
"Min Free Memory: " + status_1.config.resourceThresholds.minFreeMemoryPercent + "%",
|
|
512
|
+
].filter(Boolean).join('\n'), 'RuFlo Daemon');
|
|
513
|
+
output.writeln();
|
|
514
|
+
output.writeln(output.bold('Worker Status'));
|
|
515
|
+
workerData = status_1.config.workers.map(function (w) {
|
|
516
|
+
var _a, _b, _c;
|
|
517
|
+
var state = status_1.workers.get(w.type);
|
|
518
|
+
// Check for headless mode from worker config or state
|
|
519
|
+
var isHeadless = w.headless || ((_a = state) === null || _a === void 0 ? void 0 : _a.headless) || false;
|
|
520
|
+
var sandboxMode = w.sandbox || ((_b = state) === null || _b === void 0 ? void 0 : _b.sandbox) || null;
|
|
521
|
+
return {
|
|
522
|
+
type: w.enabled ? output.highlight(w.type) : output.dim(w.type),
|
|
523
|
+
enabled: w.enabled ? output.success('✓') : output.dim('○'),
|
|
524
|
+
status: (state === null || state === void 0 ? void 0 : state.isRunning) ? output.warning('running') :
|
|
525
|
+
w.enabled ? output.success('idle') : output.dim('disabled'),
|
|
526
|
+
runs: (_c = state === null || state === void 0 ? void 0 : state.runCount) !== null && _c !== void 0 ? _c : 0,
|
|
527
|
+
success: state ? Math.round((state.successCount / Math.max(state.runCount, 1)) * 100) + "%" : '-',
|
|
528
|
+
lastRun: (state === null || state === void 0 ? void 0 : state.lastRun) ? formatTimeAgo(state.lastRun) : output.dim('never'),
|
|
529
|
+
nextRun: (state === null || state === void 0 ? void 0 : state.nextRun) && w.enabled ? formatTimeUntil(state.nextRun) : output.dim('-'),
|
|
530
|
+
mode: isHeadless ? output.highlight('headless') : output.dim('local'),
|
|
531
|
+
sandbox: isHeadless ? (sandboxMode || 'strict') : output.dim('-')
|
|
532
|
+
};
|
|
533
|
+
});
|
|
534
|
+
baseColumns = [
|
|
535
|
+
{ key: 'type', header: 'Worker', width: 12 },
|
|
536
|
+
{ key: 'enabled', header: 'On', width: 4 },
|
|
537
|
+
{ key: 'status', header: 'Status', width: 10 },
|
|
538
|
+
{ key: 'runs', header: 'Runs', width: 6 },
|
|
539
|
+
{ key: 'success', header: 'Success', width: 8 },
|
|
540
|
+
{ key: 'lastRun', header: 'Last Run', width: 12 },
|
|
541
|
+
{ key: 'nextRun', header: 'Next Run', width: 12 },
|
|
542
|
+
];
|
|
543
|
+
modeColumns = showModes ? [
|
|
544
|
+
{ key: 'mode', header: 'Mode', width: 10 },
|
|
545
|
+
{ key: 'sandbox', header: 'Sandbox', width: 12 },
|
|
546
|
+
] : [];
|
|
400
547
|
output.printTable({
|
|
401
|
-
columns: [
|
|
402
|
-
|
|
403
|
-
{ key: 'interval', header: 'Interval', width: 10 },
|
|
404
|
-
{ key: 'priority', header: 'Priority', width: 10 },
|
|
405
|
-
{ key: 'avgDuration', header: 'Avg Duration', width: 12 },
|
|
406
|
-
{ key: 'description', header: 'Description', width: 30 },
|
|
407
|
-
],
|
|
408
|
-
data: status.config.workers.map(w => {
|
|
409
|
-
const state = status.workers.get(w.type);
|
|
410
|
-
return {
|
|
411
|
-
type: w.type,
|
|
412
|
-
interval: `${Math.round(w.intervalMs / 60000)}min`,
|
|
413
|
-
priority: w.priority,
|
|
414
|
-
avgDuration: state?.averageDurationMs ? `${Math.round(state.averageDurationMs)}ms` : '-',
|
|
415
|
-
description: w.description,
|
|
416
|
-
};
|
|
417
|
-
}),
|
|
548
|
+
columns: __spreadArray(__spreadArray([], baseColumns, true), modeColumns, true),
|
|
549
|
+
data: workerData
|
|
418
550
|
});
|
|
551
|
+
if (verbose) {
|
|
552
|
+
output.writeln();
|
|
553
|
+
output.writeln(output.bold('Worker Configuration'));
|
|
554
|
+
output.printTable({
|
|
555
|
+
columns: [
|
|
556
|
+
{ key: 'type', header: 'Worker', width: 12 },
|
|
557
|
+
{ key: 'interval', header: 'Interval', width: 10 },
|
|
558
|
+
{ key: 'priority', header: 'Priority', width: 10 },
|
|
559
|
+
{ key: 'avgDuration', header: 'Avg Duration', width: 12 },
|
|
560
|
+
{ key: 'description', header: 'Description', width: 30 },
|
|
561
|
+
],
|
|
562
|
+
data: status_1.config.workers.map(function (w) {
|
|
563
|
+
var state = status_1.workers.get(w.type);
|
|
564
|
+
return {
|
|
565
|
+
type: w.type,
|
|
566
|
+
interval: Math.round(w.intervalMs / 60000) + "min",
|
|
567
|
+
priority: w.priority,
|
|
568
|
+
avgDuration: (state === null || state === void 0 ? void 0 : state.averageDurationMs) ? Math.round(state.averageDurationMs) + "ms" : '-',
|
|
569
|
+
description: w.description
|
|
570
|
+
};
|
|
571
|
+
})
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
return [2 /*return*/, { success: true, data: status_1 }];
|
|
419
575
|
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
'',
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
return
|
|
431
|
-
}
|
|
432
|
-
}
|
|
576
|
+
catch (error) {
|
|
577
|
+
// Daemon not initialized
|
|
578
|
+
output.writeln();
|
|
579
|
+
output.printBox([
|
|
580
|
+
"Status: " + output.error('○') + " " + output.error('NOT INITIALIZED'),
|
|
581
|
+
'',
|
|
582
|
+
'Run "claude-flow daemon start" to start the daemon',
|
|
583
|
+
].join('\n'), 'RuFlo Daemon');
|
|
584
|
+
return [2 /*return*/, { success: true }];
|
|
585
|
+
}
|
|
586
|
+
return [2 /*return*/];
|
|
587
|
+
});
|
|
588
|
+
}); }
|
|
433
589
|
};
|
|
434
590
|
// Trigger subcommand - manually run a worker
|
|
435
|
-
|
|
591
|
+
var triggerCommand = {
|
|
436
592
|
name: 'trigger',
|
|
437
593
|
description: 'Manually trigger a specific worker',
|
|
438
594
|
options: [
|
|
@@ -444,40 +600,50 @@ const triggerCommand = {
|
|
|
444
600
|
{ command: 'claude-flow daemon trigger -w audit', description: 'Trigger security audit' },
|
|
445
601
|
{ command: 'claude-flow daemon trigger -w audit --headless', description: 'Trigger audit in headless sandbox' },
|
|
446
602
|
],
|
|
447
|
-
action:
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
output.
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
603
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
604
|
+
var workerType, daemon, spinner, result, error_4;
|
|
605
|
+
return __generator(this, function (_a) {
|
|
606
|
+
switch (_a.label) {
|
|
607
|
+
case 0:
|
|
608
|
+
workerType = ctx.flags.worker;
|
|
609
|
+
if (!workerType) {
|
|
610
|
+
output.printError('Worker type is required. Use --worker or -w flag.');
|
|
611
|
+
output.writeln();
|
|
612
|
+
output.writeln('Available workers: map, audit, optimize, consolidate, testgaps, predict, document, ultralearn, refactor, benchmark, deepdive, preload');
|
|
613
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
614
|
+
}
|
|
615
|
+
_a.label = 1;
|
|
616
|
+
case 1:
|
|
617
|
+
_a.trys.push([1, 3, , 4]);
|
|
618
|
+
daemon = getDaemon(process.cwd());
|
|
619
|
+
spinner = output.createSpinner({ text: "Running " + workerType + " worker...", spinner: 'dots' });
|
|
620
|
+
spinner.start();
|
|
621
|
+
return [4 /*yield*/, daemon.triggerWorker(workerType)];
|
|
622
|
+
case 2:
|
|
623
|
+
result = _a.sent();
|
|
624
|
+
if (result.success) {
|
|
625
|
+
spinner.succeed("Worker " + workerType + " completed in " + result.durationMs + "ms");
|
|
626
|
+
if (result.output) {
|
|
627
|
+
output.writeln();
|
|
628
|
+
output.writeln(output.bold('Output'));
|
|
629
|
+
output.printJson(result.output);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
else {
|
|
633
|
+
spinner.fail("Worker " + workerType + " failed: " + result.error);
|
|
634
|
+
}
|
|
635
|
+
return [2 /*return*/, { success: result.success, data: result }];
|
|
636
|
+
case 3:
|
|
637
|
+
error_4 = _a.sent();
|
|
638
|
+
output.printError("Failed to trigger worker: " + (error_4 instanceof Error ? error_4.message : String(error_4)));
|
|
639
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
640
|
+
case 4: return [2 /*return*/];
|
|
470
641
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
catch (error) {
|
|
474
|
-
output.printError(`Failed to trigger worker: ${error instanceof Error ? error.message : String(error)}`);
|
|
475
|
-
return { success: false, exitCode: 1 };
|
|
476
|
-
}
|
|
477
|
-
},
|
|
642
|
+
});
|
|
643
|
+
}); }
|
|
478
644
|
};
|
|
479
645
|
// Enable/disable worker subcommand
|
|
480
|
-
|
|
646
|
+
var enableCommand = {
|
|
481
647
|
name: 'enable',
|
|
482
648
|
description: 'Enable or disable a specific worker',
|
|
483
649
|
options: [
|
|
@@ -488,50 +654,54 @@ const enableCommand = {
|
|
|
488
654
|
{ command: 'claude-flow daemon enable -w predict', description: 'Enable predict worker' },
|
|
489
655
|
{ command: 'claude-flow daemon enable -w document --disable', description: 'Disable document worker' },
|
|
490
656
|
],
|
|
491
|
-
action:
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
657
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
658
|
+
var workerType, disable, daemon;
|
|
659
|
+
return __generator(this, function (_a) {
|
|
660
|
+
workerType = ctx.flags.worker;
|
|
661
|
+
disable = ctx.flags.disable;
|
|
662
|
+
if (!workerType) {
|
|
663
|
+
output.printError('Worker type is required. Use --worker or -w flag.');
|
|
664
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
665
|
+
}
|
|
666
|
+
try {
|
|
667
|
+
daemon = getDaemon(process.cwd());
|
|
668
|
+
daemon.setWorkerEnabled(workerType, !disable);
|
|
669
|
+
output.printSuccess("Worker " + workerType + " " + (disable ? 'disabled' : 'enabled'));
|
|
670
|
+
return [2 /*return*/, { success: true }];
|
|
671
|
+
}
|
|
672
|
+
catch (error) {
|
|
673
|
+
output.printError("Failed to " + (disable ? 'disable' : 'enable') + " worker: " + (error instanceof Error ? error.message : String(error)));
|
|
674
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
675
|
+
}
|
|
676
|
+
return [2 /*return*/];
|
|
677
|
+
});
|
|
678
|
+
}); }
|
|
509
679
|
};
|
|
510
680
|
// Helper functions for time formatting
|
|
511
681
|
function formatTimeAgo(date) {
|
|
512
|
-
|
|
682
|
+
var seconds = Math.floor((Date.now() - date.getTime()) / 1000);
|
|
513
683
|
if (seconds < 60)
|
|
514
|
-
return
|
|
684
|
+
return seconds + "s ago";
|
|
515
685
|
if (seconds < 3600)
|
|
516
|
-
return
|
|
686
|
+
return Math.floor(seconds / 60) + "m ago";
|
|
517
687
|
if (seconds < 86400)
|
|
518
|
-
return
|
|
519
|
-
return
|
|
688
|
+
return Math.floor(seconds / 3600) + "h ago";
|
|
689
|
+
return Math.floor(seconds / 86400) + "d ago";
|
|
520
690
|
}
|
|
521
691
|
function formatTimeUntil(date) {
|
|
522
|
-
|
|
692
|
+
var seconds = Math.floor((date.getTime() - Date.now()) / 1000);
|
|
523
693
|
if (seconds < 0)
|
|
524
694
|
return 'now';
|
|
525
695
|
if (seconds < 60)
|
|
526
|
-
return
|
|
696
|
+
return "in " + seconds + "s";
|
|
527
697
|
if (seconds < 3600)
|
|
528
|
-
return
|
|
698
|
+
return "in " + Math.floor(seconds / 60) + "m";
|
|
529
699
|
if (seconds < 86400)
|
|
530
|
-
return
|
|
531
|
-
return
|
|
700
|
+
return "in " + Math.floor(seconds / 3600) + "h";
|
|
701
|
+
return "in " + Math.floor(seconds / 86400) + "d";
|
|
532
702
|
}
|
|
533
703
|
// Main daemon command
|
|
534
|
-
export
|
|
704
|
+
export var daemonCommand = {
|
|
535
705
|
name: 'daemon',
|
|
536
706
|
description: 'Manage background worker daemon (Node.js-based, auto-runs like shell helpers)',
|
|
537
707
|
subcommands: [
|
|
@@ -549,45 +719,47 @@ export const daemonCommand = {
|
|
|
549
719
|
{ command: 'claude-flow daemon stop', description: 'Stop the daemon' },
|
|
550
720
|
{ command: 'claude-flow daemon trigger -w audit', description: 'Run security audit' },
|
|
551
721
|
],
|
|
552
|
-
action:
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
722
|
+
action: function () { return __awaiter(void 0, void 0, Promise, function () {
|
|
723
|
+
return __generator(this, function (_a) {
|
|
724
|
+
output.writeln();
|
|
725
|
+
output.writeln(output.bold('RuFlo Daemon - Background Task Management'));
|
|
726
|
+
output.writeln();
|
|
727
|
+
output.writeln('Node.js-based background worker system that auto-runs like shell daemons.');
|
|
728
|
+
output.writeln('Manages 12 specialized workers for continuous optimization and monitoring.');
|
|
729
|
+
output.writeln();
|
|
730
|
+
output.writeln(output.bold('Headless Mode'));
|
|
731
|
+
output.writeln('Workers can run in headless mode using E2B sandboxes for isolated execution.');
|
|
732
|
+
output.writeln('Use --headless flag with start/trigger commands. Sandbox modes: strict, permissive, disabled.');
|
|
733
|
+
output.writeln();
|
|
734
|
+
output.writeln(output.bold('Available Workers'));
|
|
735
|
+
output.printList([
|
|
736
|
+
output.highlight('map') + " - Codebase mapping (5 min interval)",
|
|
737
|
+
output.highlight('audit') + " - Security analysis (10 min interval)",
|
|
738
|
+
output.highlight('optimize') + " - Performance optimization (15 min interval)",
|
|
739
|
+
output.highlight('consolidate') + " - Memory consolidation (30 min interval)",
|
|
740
|
+
output.highlight('testgaps') + " - Test coverage analysis (20 min interval)",
|
|
741
|
+
output.highlight('predict') + " - Predictive preloading (2 min, disabled by default)",
|
|
742
|
+
output.highlight('document') + " - Auto-documentation (60 min, disabled by default)",
|
|
743
|
+
output.highlight('ultralearn') + " - Deep knowledge acquisition (manual trigger)",
|
|
744
|
+
output.highlight('refactor') + " - Code refactoring suggestions (manual trigger)",
|
|
745
|
+
output.highlight('benchmark') + " - Performance benchmarking (manual trigger)",
|
|
746
|
+
output.highlight('deepdive') + " - Deep code analysis (manual trigger)",
|
|
747
|
+
output.highlight('preload') + " - Resource preloading (manual trigger)",
|
|
748
|
+
]);
|
|
749
|
+
output.writeln();
|
|
750
|
+
output.writeln(output.bold('Subcommands'));
|
|
751
|
+
output.printList([
|
|
752
|
+
output.highlight('start') + " - Start the daemon",
|
|
753
|
+
output.highlight('stop') + " - Stop the daemon",
|
|
754
|
+
output.highlight('status') + " - Show daemon status",
|
|
755
|
+
output.highlight('trigger') + " - Manually run a worker",
|
|
756
|
+
output.highlight('enable') + " - Enable/disable a worker",
|
|
757
|
+
]);
|
|
758
|
+
output.writeln();
|
|
759
|
+
output.writeln('Run "claude-flow daemon <subcommand> --help" for details');
|
|
760
|
+
return [2 /*return*/, { success: true }];
|
|
761
|
+
});
|
|
762
|
+
}); }
|
|
591
763
|
};
|
|
592
764
|
export default daemonCommand;
|
|
593
765
|
//# sourceMappingURL=daemon.js.map
|