@claude-flow/cli 3.10.46 → 3.12.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/gaia-critic.js +24 -24
- package/dist/src/commands/completions.js +409 -409
- package/dist/src/commands/daemon.js +44 -44
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +175 -1
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/eject.d.ts +33 -0
- package/dist/src/commands/eject.d.ts.map +1 -0
- package/dist/src/commands/eject.js +195 -0
- package/dist/src/commands/eject.js.map +1 -0
- package/dist/src/commands/embeddings.js +26 -26
- package/dist/src/commands/hive-mind.js +97 -97
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +11 -10
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +4 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +3 -0
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/metaharness.d.ts +39 -0
- package/dist/src/commands/metaharness.d.ts.map +1 -0
- package/dist/src/commands/metaharness.js +194 -0
- package/dist/src/commands/metaharness.js.map +1 -0
- 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/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/init/claudemd-generator.js +231 -231
- package/dist/src/init/executor.js +453 -453
- package/dist/src/init/helpers-generator.js +727 -727
- package/dist/src/init/statusline-generator.js +717 -717
- package/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +4 -0
- package/dist/src/mcp-client.js.map +1 -1
- 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/mcp-tools/index.d.ts +1 -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/metaharness-tools.d.ts +31 -0
- package/dist/src/mcp-tools/metaharness-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/metaharness-tools.js +372 -0
- package/dist/src/mcp-tools/metaharness-tools.js.map +1 -0
- 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/plugins/store/discovery.d.ts.map +1 -1
- package/dist/src/plugins/store/discovery.js +3 -0
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/types.d.ts +6 -1
- package/dist/src/plugins/store/types.d.ts.map +1 -1
- 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 +455 -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-parallel-recorder.d.ts +127 -0
- package/dist/src/ruvector/router-parallel-recorder.d.ts.map +1 -0
- package/dist/src/ruvector/router-parallel-recorder.js +183 -0
- package/dist/src/ruvector/router-parallel-recorder.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/headless-worker-executor.js +84 -84
- package/dist/src/transfer/deploy-seraphine.js +23 -23
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +138 -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
|
@@ -1,352 +1,352 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* RuFlo Statusline Generator
|
|
4
|
-
* Displays real-time V3 implementation progress and system status.
|
|
5
|
-
* Version is read from the installed @claude-flow/cli package.json at
|
|
6
|
-
* runtime — #1892 fix: previously hardcoded to V3.5 which drifted from
|
|
7
|
-
* the actual installed alpha series.
|
|
8
|
-
*
|
|
9
|
-
* Usage: node statusline.js [--json] [--compact]
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
const fs = require('fs');
|
|
13
|
-
const path = require('path');
|
|
14
|
-
const { execSync, execFileSync } = require('child_process');
|
|
15
|
-
|
|
16
|
-
// #1892 — derive RuFlo banner version from the installed cli package.json
|
|
17
|
-
// so the statusline never drifts from `ruflo doctor`. Falls back to a
|
|
18
|
-
// generic "RuFlo" label only if every resolution path fails.
|
|
19
|
-
function resolveBannerVersion() {
|
|
20
|
-
const candidates = [
|
|
21
|
-
// Local-checkout / monorepo case
|
|
22
|
-
path.join(__dirname, '..', '..', 'package.json'),
|
|
23
|
-
// npm-installed-as-dep case
|
|
24
|
-
path.join(__dirname, '..', '..', '..', '@claude-flow', 'cli', 'package.json'),
|
|
25
|
-
// npm-installed-globally case
|
|
26
|
-
path.join(__dirname, '..', '..', '..', 'cli', 'package.json'),
|
|
27
|
-
];
|
|
28
|
-
for (const p of candidates) {
|
|
29
|
-
try {
|
|
30
|
-
const pkg = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
31
|
-
if (pkg.name && pkg.name.includes('claude-flow') && typeof pkg.version === 'string') {
|
|
32
|
-
// Render as "V<major>.<minor>" so the banner stays compact —
|
|
33
|
-
// patch+pre-release detail still shows under `doctor`.
|
|
34
|
-
const m = pkg.version.match(/^(\d+)\.(\d+)/);
|
|
35
|
-
if (m) return `V${m[1]}.${m[2]}`;
|
|
36
|
-
return `V${pkg.version}`;
|
|
37
|
-
}
|
|
38
|
-
} catch {/* try next */}
|
|
39
|
-
}
|
|
40
|
-
return ''; // empty → header just says "RuFlo"
|
|
41
|
-
}
|
|
42
|
-
const BANNER_VERSION = resolveBannerVersion();
|
|
43
|
-
|
|
44
|
-
// Configuration
|
|
45
|
-
const CONFIG = {
|
|
46
|
-
enabled: true,
|
|
47
|
-
showProgress: true,
|
|
48
|
-
showSecurity: true,
|
|
49
|
-
showSwarm: true,
|
|
50
|
-
showHooks: true,
|
|
51
|
-
showPerformance: true,
|
|
52
|
-
refreshInterval: 30000,
|
|
53
|
-
maxAgents: 15,
|
|
54
|
-
topology: 'hierarchical-mesh',
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
// ANSI colors
|
|
58
|
-
const c = {
|
|
59
|
-
reset: '\x1b[0m',
|
|
60
|
-
bold: '\x1b[1m',
|
|
61
|
-
dim: '\x1b[2m',
|
|
62
|
-
red: '\x1b[0;31m',
|
|
63
|
-
green: '\x1b[0;32m',
|
|
64
|
-
yellow: '\x1b[0;33m',
|
|
65
|
-
blue: '\x1b[0;34m',
|
|
66
|
-
purple: '\x1b[0;35m',
|
|
67
|
-
cyan: '\x1b[0;36m',
|
|
68
|
-
brightRed: '\x1b[1;31m',
|
|
69
|
-
brightGreen: '\x1b[1;32m',
|
|
70
|
-
brightYellow: '\x1b[1;33m',
|
|
71
|
-
brightBlue: '\x1b[1;34m',
|
|
72
|
-
brightPurple: '\x1b[1;35m',
|
|
73
|
-
brightCyan: '\x1b[1;36m',
|
|
74
|
-
brightWhite: '\x1b[1;37m',
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
// Get user info
|
|
78
|
-
function getUserInfo() {
|
|
79
|
-
let name = 'user';
|
|
80
|
-
let gitBranch = '';
|
|
81
|
-
let modelName = 'Opus 4.6 (1M context)';
|
|
82
|
-
|
|
83
|
-
// audit_1776853149979: previously used execSync with a shell string for git
|
|
84
|
-
// commands. Switched to execFileSync('git', argv) so there is no shell
|
|
85
|
-
// interpretation — eliminates the *class* of injection regardless of whether
|
|
86
|
-
// user input ever reaches these args (defense in depth). Errors are caught
|
|
87
|
-
// and the defaults above remain.
|
|
88
|
-
try {
|
|
89
|
-
name = execFileSync('git', ['config', 'user.name'], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim() || 'user';
|
|
90
|
-
} catch { /* not in a repo / no name set — keep default */ }
|
|
91
|
-
try {
|
|
92
|
-
gitBranch = execFileSync('git', ['branch', '--show-current'], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
93
|
-
} catch { /* not in a repo — keep empty */ }
|
|
94
|
-
|
|
95
|
-
return { name, gitBranch, modelName };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Get learning stats from memory database
|
|
99
|
-
function getLearningStats() {
|
|
100
|
-
const memoryPaths = [
|
|
101
|
-
path.join(process.cwd(), '.swarm', 'memory.db'),
|
|
102
|
-
path.join(process.cwd(), '.claude', 'memory.db'),
|
|
103
|
-
path.join(process.cwd(), 'data', 'memory.db'),
|
|
104
|
-
];
|
|
105
|
-
|
|
106
|
-
let patterns = 0;
|
|
107
|
-
let sessions = 0;
|
|
108
|
-
let trajectories = 0;
|
|
109
|
-
|
|
110
|
-
// Try to read from sqlite database
|
|
111
|
-
for (const dbPath of memoryPaths) {
|
|
112
|
-
if (fs.existsSync(dbPath)) {
|
|
113
|
-
try {
|
|
114
|
-
// Count entries in memory file (rough estimate from file size)
|
|
115
|
-
const stats = fs.statSync(dbPath);
|
|
116
|
-
const sizeKB = stats.size / 1024;
|
|
117
|
-
// Estimate: ~2KB per pattern on average
|
|
118
|
-
patterns = Math.floor(sizeKB / 2);
|
|
119
|
-
sessions = Math.max(1, Math.floor(patterns / 10));
|
|
120
|
-
trajectories = Math.floor(patterns / 5);
|
|
121
|
-
break;
|
|
122
|
-
} catch (e) {
|
|
123
|
-
// Ignore
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Also check for session files
|
|
129
|
-
const sessionsPath = path.join(process.cwd(), '.claude', 'sessions');
|
|
130
|
-
if (fs.existsSync(sessionsPath)) {
|
|
131
|
-
try {
|
|
132
|
-
const sessionFiles = fs.readdirSync(sessionsPath).filter(f => f.endsWith('.json'));
|
|
133
|
-
sessions = Math.max(sessions, sessionFiles.length);
|
|
134
|
-
} catch (e) {
|
|
135
|
-
// Ignore
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return { patterns, sessions, trajectories };
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Get V3 progress from learning state (grows as system learns)
|
|
143
|
-
function getV3Progress() {
|
|
144
|
-
const learning = getLearningStats();
|
|
145
|
-
|
|
146
|
-
// DDD progress based on actual learned patterns
|
|
147
|
-
// New install: 0 patterns = 0/5 domains, 0% DDD
|
|
148
|
-
// As patterns grow: 10+ patterns = 1 domain, 50+ = 2, 100+ = 3, 200+ = 4, 500+ = 5
|
|
149
|
-
let domainsCompleted = 0;
|
|
150
|
-
if (learning.patterns >= 500) domainsCompleted = 5;
|
|
151
|
-
else if (learning.patterns >= 200) domainsCompleted = 4;
|
|
152
|
-
else if (learning.patterns >= 100) domainsCompleted = 3;
|
|
153
|
-
else if (learning.patterns >= 50) domainsCompleted = 2;
|
|
154
|
-
else if (learning.patterns >= 10) domainsCompleted = 1;
|
|
155
|
-
|
|
156
|
-
const totalDomains = 5;
|
|
157
|
-
const dddProgress = Math.min(100, Math.floor((domainsCompleted / totalDomains) * 100));
|
|
158
|
-
|
|
159
|
-
return {
|
|
160
|
-
domainsCompleted,
|
|
161
|
-
totalDomains,
|
|
162
|
-
dddProgress,
|
|
163
|
-
patternsLearned: learning.patterns,
|
|
164
|
-
sessionsCompleted: learning.sessions
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Get security status based on actual scans
|
|
169
|
-
function getSecurityStatus() {
|
|
170
|
-
// Check for security scan results in memory
|
|
171
|
-
const scanResultsPath = path.join(process.cwd(), '.claude', 'security-scans');
|
|
172
|
-
let cvesFixed = 0;
|
|
173
|
-
const totalCves = 3;
|
|
174
|
-
|
|
175
|
-
if (fs.existsSync(scanResultsPath)) {
|
|
176
|
-
try {
|
|
177
|
-
const scans = fs.readdirSync(scanResultsPath).filter(f => f.endsWith('.json'));
|
|
178
|
-
// Each successful scan file = 1 CVE addressed
|
|
179
|
-
cvesFixed = Math.min(totalCves, scans.length);
|
|
180
|
-
} catch (e) {
|
|
181
|
-
// Ignore
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Also check .swarm/security for audit results
|
|
186
|
-
const auditPath = path.join(process.cwd(), '.swarm', 'security');
|
|
187
|
-
if (fs.existsSync(auditPath)) {
|
|
188
|
-
try {
|
|
189
|
-
const audits = fs.readdirSync(auditPath).filter(f => f.includes('audit'));
|
|
190
|
-
cvesFixed = Math.min(totalCves, Math.max(cvesFixed, audits.length));
|
|
191
|
-
} catch (e) {
|
|
192
|
-
// Ignore
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const status = cvesFixed >= totalCves ? 'CLEAN' : cvesFixed > 0 ? 'IN_PROGRESS' : 'PENDING';
|
|
197
|
-
|
|
198
|
-
return {
|
|
199
|
-
status,
|
|
200
|
-
cvesFixed,
|
|
201
|
-
totalCves,
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Get swarm status
|
|
206
|
-
function getSwarmStatus() {
|
|
207
|
-
let activeAgents = 0;
|
|
208
|
-
let coordinationActive = false;
|
|
209
|
-
|
|
210
|
-
try {
|
|
211
|
-
const ps = execSync('ps aux 2>/dev/null | grep -c agentic-flow || echo "0"', { encoding: 'utf-8' });
|
|
212
|
-
activeAgents = Math.max(0, parseInt(ps.trim()) - 1);
|
|
213
|
-
coordinationActive = activeAgents > 0;
|
|
214
|
-
} catch (e) {
|
|
215
|
-
// Ignore errors
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
return {
|
|
219
|
-
activeAgents,
|
|
220
|
-
maxAgents: CONFIG.maxAgents,
|
|
221
|
-
coordinationActive,
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// Get system metrics (dynamic based on actual state)
|
|
226
|
-
function getSystemMetrics() {
|
|
227
|
-
let memoryMB = 0;
|
|
228
|
-
let subAgents = 0;
|
|
229
|
-
|
|
230
|
-
try {
|
|
231
|
-
const mem = execSync('ps aux | grep -E "(node|agentic|claude)" | grep -v grep | awk \'{sum += \$6} END {print int(sum/1024)}\'', { encoding: 'utf-8' });
|
|
232
|
-
memoryMB = parseInt(mem.trim()) || 0;
|
|
233
|
-
} catch (e) {
|
|
234
|
-
// Fallback
|
|
235
|
-
memoryMB = Math.floor(process.memoryUsage().heapUsed / 1024 / 1024);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// Get learning stats for intelligence %
|
|
239
|
-
const learning = getLearningStats();
|
|
240
|
-
|
|
241
|
-
// Intelligence % based on learned patterns (0 patterns = 0%, 1000+ = 100%)
|
|
242
|
-
const intelligencePct = Math.min(100, Math.floor((learning.patterns / 10) * 1));
|
|
243
|
-
|
|
244
|
-
// Context % based on session history (0 sessions = 0%, grows with usage)
|
|
245
|
-
const contextPct = Math.min(100, Math.floor(learning.sessions * 5));
|
|
246
|
-
|
|
247
|
-
// Count active sub-agents from process list
|
|
248
|
-
try {
|
|
249
|
-
const agents = execSync('ps aux 2>/dev/null | grep -c "claude-flow.*agent" || echo "0"', { encoding: 'utf-8' });
|
|
250
|
-
subAgents = Math.max(0, parseInt(agents.trim()) - 1);
|
|
251
|
-
} catch (e) {
|
|
252
|
-
// Ignore
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return {
|
|
256
|
-
memoryMB,
|
|
257
|
-
contextPct,
|
|
258
|
-
intelligencePct,
|
|
259
|
-
subAgents,
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Generate progress bar
|
|
264
|
-
function progressBar(current, total) {
|
|
265
|
-
const width = 5;
|
|
266
|
-
const filled = Math.round((current / total) * width);
|
|
267
|
-
const empty = width - filled;
|
|
268
|
-
return '[' + '\u25CF'.repeat(filled) + '\u25CB'.repeat(empty) + ']';
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Generate full statusline
|
|
272
|
-
function generateStatusline() {
|
|
273
|
-
const user = getUserInfo();
|
|
274
|
-
const progress = getV3Progress();
|
|
275
|
-
const security = getSecurityStatus();
|
|
276
|
-
const swarm = getSwarmStatus();
|
|
277
|
-
const system = getSystemMetrics();
|
|
278
|
-
const lines = [];
|
|
279
|
-
|
|
280
|
-
// Header Line — #1892: BANNER_VERSION resolved at module load from package.json
|
|
281
|
-
let header = `${c.bold}${c.brightPurple}▊ RuFlo${BANNER_VERSION ? ' ' + BANNER_VERSION : ''} ${c.reset}`;
|
|
282
|
-
header += `${swarm.coordinationActive ? c.brightCyan : c.dim}● ${c.brightCyan}${user.name}${c.reset}`;
|
|
283
|
-
if (user.gitBranch) {
|
|
284
|
-
header += ` ${c.dim}│${c.reset} ${c.brightBlue}⎇ ${user.gitBranch}${c.reset}`;
|
|
285
|
-
}
|
|
286
|
-
header += ` ${c.dim}│${c.reset} ${c.purple}${user.modelName}${c.reset}`;
|
|
287
|
-
lines.push(header);
|
|
288
|
-
|
|
289
|
-
// Separator
|
|
290
|
-
lines.push(`${c.dim}─────────────────────────────────────────────────────${c.reset}`);
|
|
291
|
-
|
|
292
|
-
// Line 1: DDD Domain Progress
|
|
293
|
-
const domainsColor = progress.domainsCompleted >= 3 ? c.brightGreen : progress.domainsCompleted > 0 ? c.yellow : c.red;
|
|
294
|
-
lines.push(
|
|
295
|
-
`${c.brightCyan}🏗️ DDD Domains${c.reset} ${progressBar(progress.domainsCompleted, progress.totalDomains)} ` +
|
|
296
|
-
`${domainsColor}${progress.domainsCompleted}${c.reset}/${c.brightWhite}${progress.totalDomains}${c.reset} ` +
|
|
297
|
-
`${c.brightYellow}⚡ 1.0x${c.reset} ${c.dim}→${c.reset} ${c.brightYellow}2.49x-7.47x${c.reset}`
|
|
298
|
-
);
|
|
299
|
-
|
|
300
|
-
// Line 2: Swarm + CVE + Memory + Context + Intelligence
|
|
301
|
-
const swarmIndicator = swarm.coordinationActive ? `${c.brightGreen}◉${c.reset}` : `${c.dim}○${c.reset}`;
|
|
302
|
-
const agentsColor = swarm.activeAgents > 0 ? c.brightGreen : c.red;
|
|
303
|
-
let securityIcon = security.status === 'CLEAN' ? '🟢' : security.status === 'IN_PROGRESS' ? '🟡' : '🔴';
|
|
304
|
-
let securityColor = security.status === 'CLEAN' ? c.brightGreen : security.status === 'IN_PROGRESS' ? c.brightYellow : c.brightRed;
|
|
305
|
-
|
|
306
|
-
lines.push(
|
|
307
|
-
`${c.brightYellow}🤖 Swarm${c.reset} ${swarmIndicator} [${agentsColor}${String(swarm.activeAgents).padStart(2)}${c.reset}/${c.brightWhite}${swarm.maxAgents}${c.reset}] ` +
|
|
308
|
-
`${c.brightPurple}👥 ${system.subAgents}${c.reset} ` +
|
|
309
|
-
`${securityIcon} ${securityColor}CVE ${security.cvesFixed}${c.reset}/${c.brightWhite}${security.totalCves}${c.reset} ` +
|
|
310
|
-
`${c.brightCyan}💾 ${system.memoryMB}MB${c.reset} ` +
|
|
311
|
-
`${c.brightGreen}📂 ${String(system.contextPct).padStart(3)}%${c.reset} ` +
|
|
312
|
-
`${c.dim}🧠 ${String(system.intelligencePct).padStart(3)}%${c.reset}`
|
|
313
|
-
);
|
|
314
|
-
|
|
315
|
-
// Line 3: Architecture status
|
|
316
|
-
const dddColor = progress.dddProgress >= 50 ? c.brightGreen : progress.dddProgress > 0 ? c.yellow : c.red;
|
|
317
|
-
lines.push(
|
|
318
|
-
`${c.brightPurple}🔧 Architecture${c.reset} ` +
|
|
319
|
-
`${c.cyan}DDD${c.reset} ${dddColor}●${String(progress.dddProgress).padStart(3)}%${c.reset} ${c.dim}│${c.reset} ` +
|
|
320
|
-
`${c.cyan}Security${c.reset} ${securityColor}●${security.status}${c.reset} ${c.dim}│${c.reset} ` +
|
|
321
|
-
`${c.cyan}Memory${c.reset} ${c.brightGreen}●AgentDB${c.reset} ${c.dim}│${c.reset} ` +
|
|
322
|
-
`${c.cyan}Integration${c.reset} ${swarm.coordinationActive ? c.brightCyan : c.dim}●${c.reset}`
|
|
323
|
-
);
|
|
324
|
-
|
|
325
|
-
return lines.join('\n');
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
// Generate JSON data
|
|
329
|
-
function generateJSON() {
|
|
330
|
-
return {
|
|
331
|
-
user: getUserInfo(),
|
|
332
|
-
v3Progress: getV3Progress(),
|
|
333
|
-
security: getSecurityStatus(),
|
|
334
|
-
swarm: getSwarmStatus(),
|
|
335
|
-
system: getSystemMetrics(),
|
|
336
|
-
performance: {
|
|
337
|
-
flashAttentionTarget: '2.49x-7.47x',
|
|
338
|
-
searchImprovement: '150x-12,500x',
|
|
339
|
-
memoryReduction: '50-75%',
|
|
340
|
-
},
|
|
341
|
-
lastUpdated: new Date().toISOString(),
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
// Main
|
|
346
|
-
if (process.argv.includes('--json')) {
|
|
347
|
-
console.log(JSON.stringify(generateJSON(), null, 2));
|
|
348
|
-
} else if (process.argv.includes('--compact')) {
|
|
349
|
-
console.log(JSON.stringify(generateJSON()));
|
|
350
|
-
} else {
|
|
351
|
-
console.log(generateStatusline());
|
|
352
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* RuFlo Statusline Generator
|
|
4
|
+
* Displays real-time V3 implementation progress and system status.
|
|
5
|
+
* Version is read from the installed @claude-flow/cli package.json at
|
|
6
|
+
* runtime — #1892 fix: previously hardcoded to V3.5 which drifted from
|
|
7
|
+
* the actual installed alpha series.
|
|
8
|
+
*
|
|
9
|
+
* Usage: node statusline.js [--json] [--compact]
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const { execSync, execFileSync } = require('child_process');
|
|
15
|
+
|
|
16
|
+
// #1892 — derive RuFlo banner version from the installed cli package.json
|
|
17
|
+
// so the statusline never drifts from `ruflo doctor`. Falls back to a
|
|
18
|
+
// generic "RuFlo" label only if every resolution path fails.
|
|
19
|
+
function resolveBannerVersion() {
|
|
20
|
+
const candidates = [
|
|
21
|
+
// Local-checkout / monorepo case
|
|
22
|
+
path.join(__dirname, '..', '..', 'package.json'),
|
|
23
|
+
// npm-installed-as-dep case
|
|
24
|
+
path.join(__dirname, '..', '..', '..', '@claude-flow', 'cli', 'package.json'),
|
|
25
|
+
// npm-installed-globally case
|
|
26
|
+
path.join(__dirname, '..', '..', '..', 'cli', 'package.json'),
|
|
27
|
+
];
|
|
28
|
+
for (const p of candidates) {
|
|
29
|
+
try {
|
|
30
|
+
const pkg = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
31
|
+
if (pkg.name && pkg.name.includes('claude-flow') && typeof pkg.version === 'string') {
|
|
32
|
+
// Render as "V<major>.<minor>" so the banner stays compact —
|
|
33
|
+
// patch+pre-release detail still shows under `doctor`.
|
|
34
|
+
const m = pkg.version.match(/^(\d+)\.(\d+)/);
|
|
35
|
+
if (m) return `V${m[1]}.${m[2]}`;
|
|
36
|
+
return `V${pkg.version}`;
|
|
37
|
+
}
|
|
38
|
+
} catch {/* try next */}
|
|
39
|
+
}
|
|
40
|
+
return ''; // empty → header just says "RuFlo"
|
|
41
|
+
}
|
|
42
|
+
const BANNER_VERSION = resolveBannerVersion();
|
|
43
|
+
|
|
44
|
+
// Configuration
|
|
45
|
+
const CONFIG = {
|
|
46
|
+
enabled: true,
|
|
47
|
+
showProgress: true,
|
|
48
|
+
showSecurity: true,
|
|
49
|
+
showSwarm: true,
|
|
50
|
+
showHooks: true,
|
|
51
|
+
showPerformance: true,
|
|
52
|
+
refreshInterval: 30000,
|
|
53
|
+
maxAgents: 15,
|
|
54
|
+
topology: 'hierarchical-mesh',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// ANSI colors
|
|
58
|
+
const c = {
|
|
59
|
+
reset: '\x1b[0m',
|
|
60
|
+
bold: '\x1b[1m',
|
|
61
|
+
dim: '\x1b[2m',
|
|
62
|
+
red: '\x1b[0;31m',
|
|
63
|
+
green: '\x1b[0;32m',
|
|
64
|
+
yellow: '\x1b[0;33m',
|
|
65
|
+
blue: '\x1b[0;34m',
|
|
66
|
+
purple: '\x1b[0;35m',
|
|
67
|
+
cyan: '\x1b[0;36m',
|
|
68
|
+
brightRed: '\x1b[1;31m',
|
|
69
|
+
brightGreen: '\x1b[1;32m',
|
|
70
|
+
brightYellow: '\x1b[1;33m',
|
|
71
|
+
brightBlue: '\x1b[1;34m',
|
|
72
|
+
brightPurple: '\x1b[1;35m',
|
|
73
|
+
brightCyan: '\x1b[1;36m',
|
|
74
|
+
brightWhite: '\x1b[1;37m',
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Get user info
|
|
78
|
+
function getUserInfo() {
|
|
79
|
+
let name = 'user';
|
|
80
|
+
let gitBranch = '';
|
|
81
|
+
let modelName = 'Opus 4.6 (1M context)';
|
|
82
|
+
|
|
83
|
+
// audit_1776853149979: previously used execSync with a shell string for git
|
|
84
|
+
// commands. Switched to execFileSync('git', argv) so there is no shell
|
|
85
|
+
// interpretation — eliminates the *class* of injection regardless of whether
|
|
86
|
+
// user input ever reaches these args (defense in depth). Errors are caught
|
|
87
|
+
// and the defaults above remain.
|
|
88
|
+
try {
|
|
89
|
+
name = execFileSync('git', ['config', 'user.name'], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim() || 'user';
|
|
90
|
+
} catch { /* not in a repo / no name set — keep default */ }
|
|
91
|
+
try {
|
|
92
|
+
gitBranch = execFileSync('git', ['branch', '--show-current'], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
93
|
+
} catch { /* not in a repo — keep empty */ }
|
|
94
|
+
|
|
95
|
+
return { name, gitBranch, modelName };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Get learning stats from memory database
|
|
99
|
+
function getLearningStats() {
|
|
100
|
+
const memoryPaths = [
|
|
101
|
+
path.join(process.cwd(), '.swarm', 'memory.db'),
|
|
102
|
+
path.join(process.cwd(), '.claude', 'memory.db'),
|
|
103
|
+
path.join(process.cwd(), 'data', 'memory.db'),
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
let patterns = 0;
|
|
107
|
+
let sessions = 0;
|
|
108
|
+
let trajectories = 0;
|
|
109
|
+
|
|
110
|
+
// Try to read from sqlite database
|
|
111
|
+
for (const dbPath of memoryPaths) {
|
|
112
|
+
if (fs.existsSync(dbPath)) {
|
|
113
|
+
try {
|
|
114
|
+
// Count entries in memory file (rough estimate from file size)
|
|
115
|
+
const stats = fs.statSync(dbPath);
|
|
116
|
+
const sizeKB = stats.size / 1024;
|
|
117
|
+
// Estimate: ~2KB per pattern on average
|
|
118
|
+
patterns = Math.floor(sizeKB / 2);
|
|
119
|
+
sessions = Math.max(1, Math.floor(patterns / 10));
|
|
120
|
+
trajectories = Math.floor(patterns / 5);
|
|
121
|
+
break;
|
|
122
|
+
} catch (e) {
|
|
123
|
+
// Ignore
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Also check for session files
|
|
129
|
+
const sessionsPath = path.join(process.cwd(), '.claude', 'sessions');
|
|
130
|
+
if (fs.existsSync(sessionsPath)) {
|
|
131
|
+
try {
|
|
132
|
+
const sessionFiles = fs.readdirSync(sessionsPath).filter(f => f.endsWith('.json'));
|
|
133
|
+
sessions = Math.max(sessions, sessionFiles.length);
|
|
134
|
+
} catch (e) {
|
|
135
|
+
// Ignore
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return { patterns, sessions, trajectories };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Get V3 progress from learning state (grows as system learns)
|
|
143
|
+
function getV3Progress() {
|
|
144
|
+
const learning = getLearningStats();
|
|
145
|
+
|
|
146
|
+
// DDD progress based on actual learned patterns
|
|
147
|
+
// New install: 0 patterns = 0/5 domains, 0% DDD
|
|
148
|
+
// As patterns grow: 10+ patterns = 1 domain, 50+ = 2, 100+ = 3, 200+ = 4, 500+ = 5
|
|
149
|
+
let domainsCompleted = 0;
|
|
150
|
+
if (learning.patterns >= 500) domainsCompleted = 5;
|
|
151
|
+
else if (learning.patterns >= 200) domainsCompleted = 4;
|
|
152
|
+
else if (learning.patterns >= 100) domainsCompleted = 3;
|
|
153
|
+
else if (learning.patterns >= 50) domainsCompleted = 2;
|
|
154
|
+
else if (learning.patterns >= 10) domainsCompleted = 1;
|
|
155
|
+
|
|
156
|
+
const totalDomains = 5;
|
|
157
|
+
const dddProgress = Math.min(100, Math.floor((domainsCompleted / totalDomains) * 100));
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
domainsCompleted,
|
|
161
|
+
totalDomains,
|
|
162
|
+
dddProgress,
|
|
163
|
+
patternsLearned: learning.patterns,
|
|
164
|
+
sessionsCompleted: learning.sessions
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Get security status based on actual scans
|
|
169
|
+
function getSecurityStatus() {
|
|
170
|
+
// Check for security scan results in memory
|
|
171
|
+
const scanResultsPath = path.join(process.cwd(), '.claude', 'security-scans');
|
|
172
|
+
let cvesFixed = 0;
|
|
173
|
+
const totalCves = 3;
|
|
174
|
+
|
|
175
|
+
if (fs.existsSync(scanResultsPath)) {
|
|
176
|
+
try {
|
|
177
|
+
const scans = fs.readdirSync(scanResultsPath).filter(f => f.endsWith('.json'));
|
|
178
|
+
// Each successful scan file = 1 CVE addressed
|
|
179
|
+
cvesFixed = Math.min(totalCves, scans.length);
|
|
180
|
+
} catch (e) {
|
|
181
|
+
// Ignore
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Also check .swarm/security for audit results
|
|
186
|
+
const auditPath = path.join(process.cwd(), '.swarm', 'security');
|
|
187
|
+
if (fs.existsSync(auditPath)) {
|
|
188
|
+
try {
|
|
189
|
+
const audits = fs.readdirSync(auditPath).filter(f => f.includes('audit'));
|
|
190
|
+
cvesFixed = Math.min(totalCves, Math.max(cvesFixed, audits.length));
|
|
191
|
+
} catch (e) {
|
|
192
|
+
// Ignore
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const status = cvesFixed >= totalCves ? 'CLEAN' : cvesFixed > 0 ? 'IN_PROGRESS' : 'PENDING';
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
status,
|
|
200
|
+
cvesFixed,
|
|
201
|
+
totalCves,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Get swarm status
|
|
206
|
+
function getSwarmStatus() {
|
|
207
|
+
let activeAgents = 0;
|
|
208
|
+
let coordinationActive = false;
|
|
209
|
+
|
|
210
|
+
try {
|
|
211
|
+
const ps = execSync('ps aux 2>/dev/null | grep -c agentic-flow || echo "0"', { encoding: 'utf-8' });
|
|
212
|
+
activeAgents = Math.max(0, parseInt(ps.trim()) - 1);
|
|
213
|
+
coordinationActive = activeAgents > 0;
|
|
214
|
+
} catch (e) {
|
|
215
|
+
// Ignore errors
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return {
|
|
219
|
+
activeAgents,
|
|
220
|
+
maxAgents: CONFIG.maxAgents,
|
|
221
|
+
coordinationActive,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Get system metrics (dynamic based on actual state)
|
|
226
|
+
function getSystemMetrics() {
|
|
227
|
+
let memoryMB = 0;
|
|
228
|
+
let subAgents = 0;
|
|
229
|
+
|
|
230
|
+
try {
|
|
231
|
+
const mem = execSync('ps aux | grep -E "(node|agentic|claude)" | grep -v grep | awk \'{sum += \$6} END {print int(sum/1024)}\'', { encoding: 'utf-8' });
|
|
232
|
+
memoryMB = parseInt(mem.trim()) || 0;
|
|
233
|
+
} catch (e) {
|
|
234
|
+
// Fallback
|
|
235
|
+
memoryMB = Math.floor(process.memoryUsage().heapUsed / 1024 / 1024);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Get learning stats for intelligence %
|
|
239
|
+
const learning = getLearningStats();
|
|
240
|
+
|
|
241
|
+
// Intelligence % based on learned patterns (0 patterns = 0%, 1000+ = 100%)
|
|
242
|
+
const intelligencePct = Math.min(100, Math.floor((learning.patterns / 10) * 1));
|
|
243
|
+
|
|
244
|
+
// Context % based on session history (0 sessions = 0%, grows with usage)
|
|
245
|
+
const contextPct = Math.min(100, Math.floor(learning.sessions * 5));
|
|
246
|
+
|
|
247
|
+
// Count active sub-agents from process list
|
|
248
|
+
try {
|
|
249
|
+
const agents = execSync('ps aux 2>/dev/null | grep -c "claude-flow.*agent" || echo "0"', { encoding: 'utf-8' });
|
|
250
|
+
subAgents = Math.max(0, parseInt(agents.trim()) - 1);
|
|
251
|
+
} catch (e) {
|
|
252
|
+
// Ignore
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return {
|
|
256
|
+
memoryMB,
|
|
257
|
+
contextPct,
|
|
258
|
+
intelligencePct,
|
|
259
|
+
subAgents,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Generate progress bar
|
|
264
|
+
function progressBar(current, total) {
|
|
265
|
+
const width = 5;
|
|
266
|
+
const filled = Math.round((current / total) * width);
|
|
267
|
+
const empty = width - filled;
|
|
268
|
+
return '[' + '\u25CF'.repeat(filled) + '\u25CB'.repeat(empty) + ']';
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Generate full statusline
|
|
272
|
+
function generateStatusline() {
|
|
273
|
+
const user = getUserInfo();
|
|
274
|
+
const progress = getV3Progress();
|
|
275
|
+
const security = getSecurityStatus();
|
|
276
|
+
const swarm = getSwarmStatus();
|
|
277
|
+
const system = getSystemMetrics();
|
|
278
|
+
const lines = [];
|
|
279
|
+
|
|
280
|
+
// Header Line — #1892: BANNER_VERSION resolved at module load from package.json
|
|
281
|
+
let header = `${c.bold}${c.brightPurple}▊ RuFlo${BANNER_VERSION ? ' ' + BANNER_VERSION : ''} ${c.reset}`;
|
|
282
|
+
header += `${swarm.coordinationActive ? c.brightCyan : c.dim}● ${c.brightCyan}${user.name}${c.reset}`;
|
|
283
|
+
if (user.gitBranch) {
|
|
284
|
+
header += ` ${c.dim}│${c.reset} ${c.brightBlue}⎇ ${user.gitBranch}${c.reset}`;
|
|
285
|
+
}
|
|
286
|
+
header += ` ${c.dim}│${c.reset} ${c.purple}${user.modelName}${c.reset}`;
|
|
287
|
+
lines.push(header);
|
|
288
|
+
|
|
289
|
+
// Separator
|
|
290
|
+
lines.push(`${c.dim}─────────────────────────────────────────────────────${c.reset}`);
|
|
291
|
+
|
|
292
|
+
// Line 1: DDD Domain Progress
|
|
293
|
+
const domainsColor = progress.domainsCompleted >= 3 ? c.brightGreen : progress.domainsCompleted > 0 ? c.yellow : c.red;
|
|
294
|
+
lines.push(
|
|
295
|
+
`${c.brightCyan}🏗️ DDD Domains${c.reset} ${progressBar(progress.domainsCompleted, progress.totalDomains)} ` +
|
|
296
|
+
`${domainsColor}${progress.domainsCompleted}${c.reset}/${c.brightWhite}${progress.totalDomains}${c.reset} ` +
|
|
297
|
+
`${c.brightYellow}⚡ 1.0x${c.reset} ${c.dim}→${c.reset} ${c.brightYellow}2.49x-7.47x${c.reset}`
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
// Line 2: Swarm + CVE + Memory + Context + Intelligence
|
|
301
|
+
const swarmIndicator = swarm.coordinationActive ? `${c.brightGreen}◉${c.reset}` : `${c.dim}○${c.reset}`;
|
|
302
|
+
const agentsColor = swarm.activeAgents > 0 ? c.brightGreen : c.red;
|
|
303
|
+
let securityIcon = security.status === 'CLEAN' ? '🟢' : security.status === 'IN_PROGRESS' ? '🟡' : '🔴';
|
|
304
|
+
let securityColor = security.status === 'CLEAN' ? c.brightGreen : security.status === 'IN_PROGRESS' ? c.brightYellow : c.brightRed;
|
|
305
|
+
|
|
306
|
+
lines.push(
|
|
307
|
+
`${c.brightYellow}🤖 Swarm${c.reset} ${swarmIndicator} [${agentsColor}${String(swarm.activeAgents).padStart(2)}${c.reset}/${c.brightWhite}${swarm.maxAgents}${c.reset}] ` +
|
|
308
|
+
`${c.brightPurple}👥 ${system.subAgents}${c.reset} ` +
|
|
309
|
+
`${securityIcon} ${securityColor}CVE ${security.cvesFixed}${c.reset}/${c.brightWhite}${security.totalCves}${c.reset} ` +
|
|
310
|
+
`${c.brightCyan}💾 ${system.memoryMB}MB${c.reset} ` +
|
|
311
|
+
`${c.brightGreen}📂 ${String(system.contextPct).padStart(3)}%${c.reset} ` +
|
|
312
|
+
`${c.dim}🧠 ${String(system.intelligencePct).padStart(3)}%${c.reset}`
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
// Line 3: Architecture status
|
|
316
|
+
const dddColor = progress.dddProgress >= 50 ? c.brightGreen : progress.dddProgress > 0 ? c.yellow : c.red;
|
|
317
|
+
lines.push(
|
|
318
|
+
`${c.brightPurple}🔧 Architecture${c.reset} ` +
|
|
319
|
+
`${c.cyan}DDD${c.reset} ${dddColor}●${String(progress.dddProgress).padStart(3)}%${c.reset} ${c.dim}│${c.reset} ` +
|
|
320
|
+
`${c.cyan}Security${c.reset} ${securityColor}●${security.status}${c.reset} ${c.dim}│${c.reset} ` +
|
|
321
|
+
`${c.cyan}Memory${c.reset} ${c.brightGreen}●AgentDB${c.reset} ${c.dim}│${c.reset} ` +
|
|
322
|
+
`${c.cyan}Integration${c.reset} ${swarm.coordinationActive ? c.brightCyan : c.dim}●${c.reset}`
|
|
323
|
+
);
|
|
324
|
+
|
|
325
|
+
return lines.join('\n');
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Generate JSON data
|
|
329
|
+
function generateJSON() {
|
|
330
|
+
return {
|
|
331
|
+
user: getUserInfo(),
|
|
332
|
+
v3Progress: getV3Progress(),
|
|
333
|
+
security: getSecurityStatus(),
|
|
334
|
+
swarm: getSwarmStatus(),
|
|
335
|
+
system: getSystemMetrics(),
|
|
336
|
+
performance: {
|
|
337
|
+
flashAttentionTarget: '2.49x-7.47x',
|
|
338
|
+
searchImprovement: '150x-12,500x',
|
|
339
|
+
memoryReduction: '50-75%',
|
|
340
|
+
},
|
|
341
|
+
lastUpdated: new Date().toISOString(),
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Main
|
|
346
|
+
if (process.argv.includes('--json')) {
|
|
347
|
+
console.log(JSON.stringify(generateJSON(), null, 2));
|
|
348
|
+
} else if (process.argv.includes('--compact')) {
|
|
349
|
+
console.log(JSON.stringify(generateJSON()));
|
|
350
|
+
} else {
|
|
351
|
+
console.log(generateStatusline());
|
|
352
|
+
}
|