claude-flow-novice 1.6.1 → 1.6.3
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/cfn-loop/product-owner.md +54 -4
- package/.claude/commands/cfn-claude-sync.md +303 -0
- package/.claude/commands/cfn-loop-epic.md +290 -0
- package/.claude/commands/cfn-loop-single.md +168 -0
- package/.claude/commands/cfn-loop-sprints.md +384 -0
- package/.claude/commands/cfn-loop.md +180 -0
- package/.claude/commands/metrics-summary.md +58 -0
- package/.claude/commands/parse-epic.md +357 -0
- package/.claude/settings.json +5 -4
- package/.claude/settings.local.json +9 -2
- package/.claude-flow-novice/.claude/agents/cfn-loop/product-owner.md +792 -0
- package/.claude-flow-novice/dist/mcp/server.js +21 -2
- package/.claude-flow-novice/dist/src/api/auth-service.js +84 -38
- package/.claude-flow-novice/dist/src/api/auth-service.js.map +1 -1
- package/.claude-flow-novice/dist/src/api/claude-client.js +138 -3
- package/.claude-flow-novice/dist/src/api/claude-client.js.map +1 -1
- package/.claude-flow-novice/dist/src/cfn-loop/phase-orchestrator-example.js +1 -1
- package/.claude-flow-novice/dist/src/cfn-loop/scope-control.js +247 -0
- package/.claude-flow-novice/dist/src/cfn-loop/scope-control.js.map +1 -0
- package/.claude-flow-novice/dist/src/cli/commands/swarm.js +32 -15
- package/.claude-flow-novice/dist/src/cli/commands/swarm.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/transparency.js +455 -0
- package/.claude-flow-novice/dist/src/cli/commands/transparency.js.map +1 -0
- package/.claude-flow-novice/dist/src/cli/simple-commands/init/templates/CLAUDE.md +129 -13
- package/.claude-flow-novice/dist/src/components/visualizations/index.js +9 -0
- package/.claude-flow-novice/dist/src/components/visualizations/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/adapters/v1-coordinator-adapter.js +462 -0
- package/.claude-flow-novice/dist/src/coordination/adapters/v1-coordinator-adapter.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/config-translator.js +248 -0
- package/.claude-flow-novice/dist/src/coordination/config-translator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/coordination-toggle.js +287 -0
- package/.claude-flow-novice/dist/src/coordination/coordination-toggle.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/distributed-consensus.js +68 -9
- package/.claude-flow-novice/dist/src/coordination/distributed-consensus.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/feature-flags.js +166 -0
- package/.claude-flow-novice/dist/src/coordination/feature-flags.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/queen-agent.js +18 -4
- package/.claude-flow-novice/dist/src/coordination/queen-agent.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/role-assignment.js +6 -110
- package/.claude-flow-novice/dist/src/coordination/role-assignment.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/cache/artifact-cache-optimizer.js +632 -0
- package/.claude-flow-novice/dist/src/coordination/v2/cache/artifact-cache-optimizer.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/cache/index.js +11 -0
- package/.claude-flow-novice/dist/src/coordination/v2/cache/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/checkpoints/checkpoint-compressor.js +318 -0
- package/.claude-flow-novice/dist/src/coordination/v2/checkpoints/checkpoint-compressor.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.example.js +364 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.example.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.js +492 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/hierarchical-coordinator.js +786 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/hierarchical-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/index.js +16 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/parent-child-manager.js +342 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/parent-child-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/swarm-coordinator-v2.js +601 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/swarm-coordinator-v2.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/help-request-metrics.js +211 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/help-request-metrics.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/index.js +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/core/message-broker.js +365 -6
- package/.claude-flow-novice/dist/src/coordination/v2/core/message-broker.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/core/resource-manager-safe.js +478 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/resource-manager-safe.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine-config.js +5 -2
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine-config.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine.js +189 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/deadlock-detector.js +424 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/deadlock-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/index.js +9 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/resource-manager.js +669 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/resource-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/artifact-storage.js +451 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/artifact-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/cycle-detector.js +271 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/cycle-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-graph.js +335 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-graph.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-manager.js +439 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-request.js +92 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-request.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/index.js +21 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/topological-sort.js +223 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/topological-sort.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-coordinator.js +436 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-matcher.js +278 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-matcher.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request-handler.js +317 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request-handler.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request.js +273 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/index.js +15 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/waiting-agent-pool.js +512 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/waiting-agent-pool.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/index.js +6 -0
- package/.claude-flow-novice/dist/src/coordination/v2/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/integration/help-deadlock-integration.js +557 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/help-deadlock-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.example.js +212 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.example.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.js +552 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/dependency-storage.js +367 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/dependency-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/index.js +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channel.js +371 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/dependency-channel.js +355 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/dependency-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/help-channel.js +424 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/help-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/index.js +16 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/state-channel.js +295 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/state-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/task-channel.js +411 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/task-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-bus.js +387 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-bus.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-persistence.js +589 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-persistence.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-router.js +444 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-router.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/checkpoint-manager.js +29 -8
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/checkpoint-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/help-coordinator.js +470 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/help-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/hierarchical-background-integration.js +450 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/hierarchical-background-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/index.js +5 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/multi-level-control.js +545 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/multi-level-control.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-controller.js +44 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-controller.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-message-integration.js +415 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-message-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/session-pool-optimizer.js +615 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/session-pool-optimizer.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/security/payload-validator.js +259 -0
- package/.claude-flow-novice/dist/src/coordination/v2/security/payload-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/index.js +17 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-integration.js +357 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-system.js +679 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-system.js.map +1 -0
- package/.claude-flow-novice/dist/src/core/agent-manager.js +30 -0
- package/.claude-flow-novice/dist/src/core/agent-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/mcp/server.js +21 -2
- package/.claude-flow-novice/dist/src/mcp/server.js.map +1 -1
- package/.claude-flow-novice/dist/src/monitoring/apm/apm-integration.js +719 -0
- package/.claude-flow-novice/dist/src/monitoring/apm/apm-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/monitoring/apm/datadog-collector.js +363 -0
- package/.claude-flow-novice/dist/src/monitoring/apm/datadog-collector.js.map +1 -0
- package/.claude-flow-novice/dist/src/monitoring/apm/index.js +97 -0
- package/.claude-flow-novice/dist/src/monitoring/apm/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/monitoring/apm/newrelic-collector.js +384 -0
- package/.claude-flow-novice/dist/src/monitoring/apm/newrelic-collector.js.map +1 -0
- package/.claude-flow-novice/dist/src/monitoring/apm/performance-optimizer.js +612 -0
- package/.claude-flow-novice/dist/src/monitoring/apm/performance-optimizer.js.map +1 -0
- package/.claude-flow-novice/dist/src/monitoring/metrics-collector.js +282 -0
- package/.claude-flow-novice/dist/src/monitoring/metrics-collector.js.map +1 -0
- package/.claude-flow-novice/dist/src/observability/metrics-counter.js +268 -0
- package/.claude-flow-novice/dist/src/observability/metrics-counter.js.map +1 -0
- package/.claude-flow-novice/dist/src/observability/metrics-storage.js +265 -0
- package/.claude-flow-novice/dist/src/observability/metrics-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/observability/telemetry.js +26 -0
- package/.claude-flow-novice/dist/src/observability/telemetry.js.map +1 -1
- package/.claude-flow-novice/dist/src/providers/tiered-router.js +64 -10
- package/.claude-flow-novice/dist/src/providers/tiered-router.js.map +1 -1
- package/.claude-flow-novice/dist/src/providers/zai-provider.js +196 -97
- package/.claude-flow-novice/dist/src/providers/zai-provider.js.map +1 -1
- package/.claude-flow-novice/dist/src/slash-commands/cfn-claude-sync.js +533 -0
- package/.claude-flow-novice/dist/src/slash-commands/index.js +5 -0
- package/.claude-flow-novice/dist/src/slash-commands/metrics-summary-class.js +74 -0
- package/.claude-flow-novice/dist/src/slash-commands/metrics-summary.js +335 -0
- package/.claude-flow-novice/dist/src/slash-commands/register-all-commands.js +12 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression-demo.js +96 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression-demo.js.map +1 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression.js +406 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression.js.map +1 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-manager.js +35 -5
- package/.claude-flow-novice/dist/src/verification/checkpoint-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/web/api/apm-routes.js +355 -0
- package/.claude-flow-novice/dist/src/web/api/apm-routes.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/config/api-config.js +186 -0
- package/.claude-flow-novice/dist/src/web/api/config/api-config.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/auth.js +205 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/auth.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/cache.js +262 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/cache.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/error-handler.js +250 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/error-handler.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/request-logger.js +217 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/request-logger.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/validation.js +325 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/validation.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/events.js +465 -0
- package/.claude-flow-novice/dist/src/web/api/routes/events.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/hierarchy.js +302 -0
- package/.claude-flow-novice/dist/src/web/api/routes/hierarchy.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/index.js +14 -0
- package/.claude-flow-novice/dist/src/web/api/routes/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/metrics.js +561 -0
- package/.claude-flow-novice/dist/src/web/api/routes/metrics.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/status.js +450 -0
- package/.claude-flow-novice/dist/src/web/api/routes/status.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/server.js +451 -0
- package/.claude-flow-novice/dist/src/web/api/server.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/dashboard/hooks/useWebSocket.js +385 -0
- package/.claude-flow-novice/dist/src/web/dashboard/hooks/useWebSocket.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/dashboard/index.js +87 -0
- package/.claude-flow-novice/dist/src/web/dashboard/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/dashboard/types.js +6 -0
- package/.claude-flow-novice/dist/src/web/dashboard/types.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/frontend/src/utils/security.js +425 -0
- package/.claude-flow-novice/dist/src/web/frontend/src/utils/security.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/security/security-middleware.js +379 -0
- package/.claude-flow-novice/dist/src/web/security/security-middleware.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/websocket/apm-websocket-handler.js +441 -0
- package/.claude-flow-novice/dist/src/web/websocket/apm-websocket-handler.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/websocket/websocket-manager.js +255 -1
- package/.claude-flow-novice/dist/src/web/websocket/websocket-manager.js.map +1 -1
- package/.claude-flow-novice/metrics.db +0 -0
- package/.claude-flow-novice/metrics.db-shm +0 -0
- package/.claude-flow-novice/metrics.db-wal +0 -0
- package/AGENT_PERFORMANCE_GUIDELINES.md +88 -0
- package/CLAUDE.md +60 -3
- package/MEMORY_LEAK_ROOT_CAUSE.md +149 -0
- package/README.md +27 -0
- package/config/hooks/post-edit-pipeline.js +36 -2
- package/examples/metrics-counter-demo.ts +106 -0
- package/examples/persistent-metrics-demo.ts +83 -0
- package/examples/phase-5-multi-level-control.ts +282 -0
- package/examples/session-pool-optimizer-example.ts +311 -0
- package/package.json +18 -4
- package/scripts/check-routing-stats.cjs +122 -0
- package/scripts/monitor-loop.sh +65 -0
- package/scripts/monitor-memory.sh +47 -0
- package/scripts/monitor.py +43 -0
- package/scripts/pre-publish-validation.cjs +212 -0
- package/scripts/test-provider-routing.cjs +228 -0
- package/scripts/test-routing-telemetry.cjs +147 -0
- package/scripts/test-zai-10k.cjs +81 -0
- package/scripts/test-zai-api.cjs +191 -0
- package/scripts/test-zai-diagnostic.cjs +151 -0
- package/scripts/test-zai-final.cjs +128 -0
- package/scripts/test-zai-with-env.cjs +85 -0
- package/scripts/validate-coordination-cli.js +69 -0
- package/scripts/validate-coordination-toggle-integration.cjs +501 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +29 -0
- package/src/observability/metrics-counter.ts +347 -0
- package/src/observability/metrics-storage.ts +356 -0
- package/src/observability/telemetry.ts +658 -0
- package/src/slash-commands/cfn-claude-sync.js +533 -0
- package/src/slash-commands/index.js +5 -0
- package/src/slash-commands/metrics-summary-class.js +74 -0
- package/src/slash-commands/metrics-summary.js +335 -0
- package/src/slash-commands/register-all-commands.js +12 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Memory Leak Root Cause - CONFIRMED
|
|
2
|
+
|
|
3
|
+
## 🔴 Critical Finding
|
|
4
|
+
|
|
5
|
+
**Memory leak caused by `find /mnt/c` commands on WSL Windows paths**
|
|
6
|
+
|
|
7
|
+
## Monitoring Results (10-minute observation)
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Timeline:
|
|
11
|
+
[1/20] [19:06:56] MEM: 15.6GB | Find: 0 ← Baseline
|
|
12
|
+
[3/20] [19:07:56] MEM: 15.8GB | Find: 2 ← Find commands start 🔴
|
|
13
|
+
[8/20] [19:10:26] MEM: 26.1GB | Find: 0 ← +10.5GB spike!
|
|
14
|
+
[9/20] [19:10:56] MEM: 28.5GB | Find: 3 ← Peak find activity
|
|
15
|
+
[10/20] [19:11:26] MEM: 32.0GB | Find: 3 ← Critical heap pressure
|
|
16
|
+
[11-19] MEM: 36.5GB | Find: 0 ← Stabilized (heap fragmentation)
|
|
17
|
+
[20/20] [19:16:27] MEM: 14.1GB | Find: 0 ← Swarm complete, dropped 22GB
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## The Smoking Gun
|
|
21
|
+
|
|
22
|
+
**4-minute period (19:07 → 19:11):**
|
|
23
|
+
- 2-3 `find /mnt/c` commands running concurrently
|
|
24
|
+
- Memory jumped from 15.6GB → 32.0GB (+16.4GB)
|
|
25
|
+
- **Memory growth rate: 4GB/minute while finds active**
|
|
26
|
+
|
|
27
|
+
## Why `find /mnt/c` is a Memory Bomb
|
|
28
|
+
|
|
29
|
+
1. **WSL filesystem translation**: Linux syscalls → Windows API = extremely slow
|
|
30
|
+
2. **Output buffering**: Each find buffers 50-200MB of file paths in memory
|
|
31
|
+
3. **Concurrent execution**: 3 agents × 200MB buffered output = 600MB+
|
|
32
|
+
4. **Heap fragmentation**: Node.js heap can't release memory fast enough
|
|
33
|
+
5. **Result**: 20GB+ memory spike in 4 minutes → crash
|
|
34
|
+
|
|
35
|
+
## Performance Comparison
|
|
36
|
+
|
|
37
|
+
| Tool | Time | Memory | Command |
|
|
38
|
+
|------|------|--------|---------|
|
|
39
|
+
| `find /mnt/c/...` | 2-10s | 50-200MB per command | ❌ FORBIDDEN |
|
|
40
|
+
| `Glob("**/*")` | <100ms | <1MB | ✅ USE THIS |
|
|
41
|
+
| `git ls-files` | <50ms | <1MB | ✅ Alternative |
|
|
42
|
+
|
|
43
|
+
## Fix Applied
|
|
44
|
+
|
|
45
|
+
### 1. Pre-Command Hook (BLOCKS find commands)
|
|
46
|
+
|
|
47
|
+
**claude-flow-novice/.claude/settings.json:**
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"hooks": {
|
|
51
|
+
"PreToolUse": [{
|
|
52
|
+
"matcher": "Bash",
|
|
53
|
+
"hooks": [{
|
|
54
|
+
"type": "command",
|
|
55
|
+
"command": "bash -c 'CMD=$(cat | jq -r \".tool_input.command // empty\"); if echo \"$CMD\" | grep -q \"find /mnt/c\"; then echo \"🔴 BLOCKED: find on /mnt/c paths forbidden (causes memory leak - use Glob tool instead)\" >&2; exit 1; fi; ...'"
|
|
56
|
+
}]
|
|
57
|
+
}]
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**ourstories-v2/.claude/settings.json:**
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"hooks": {
|
|
66
|
+
"PreToolUse": [{
|
|
67
|
+
"matcher": "Bash",
|
|
68
|
+
"hooks": [{
|
|
69
|
+
"type": "command",
|
|
70
|
+
"command": "bash -c 'CMD=$(cat | jq -r \".tool_input.command // empty\"); if echo \"$CMD\" | grep -q \"find /mnt/c\"; then echo \"🔴 BLOCKED: find on /mnt/c paths forbidden (causes memory leak - use Glob tool instead)\" >&2; exit 1; fi'"
|
|
71
|
+
}]
|
|
72
|
+
}]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 2. CLAUDE.md Updated
|
|
78
|
+
|
|
79
|
+
Added section: **🚨 CRITICAL: Memory Leak Prevention (WSL/Windows)**
|
|
80
|
+
|
|
81
|
+
- Prohibits `find /mnt/c` commands
|
|
82
|
+
- Mandates Glob tool instead
|
|
83
|
+
- Documents performance comparison
|
|
84
|
+
|
|
85
|
+
### 3. Agent Performance Guidelines
|
|
86
|
+
|
|
87
|
+
Created: `AGENT_PERFORMANCE_GUIDELINES.md`
|
|
88
|
+
|
|
89
|
+
- Best practices for WSL environments
|
|
90
|
+
- Tool alternatives (Glob, fd, git ls-files)
|
|
91
|
+
- Memory optimization patterns
|
|
92
|
+
|
|
93
|
+
## Secondary Issue: Orphaned Processes
|
|
94
|
+
|
|
95
|
+
**Also discovered:**
|
|
96
|
+
- 39 orphaned node processes from previous swarms
|
|
97
|
+
- 5-6 zombie processes stuck in <defunct> state
|
|
98
|
+
- Total: ~3GB additional memory overhead
|
|
99
|
+
|
|
100
|
+
**Cleanup needed:**
|
|
101
|
+
```bash
|
|
102
|
+
# Kill zombies
|
|
103
|
+
kill -9 <zombie_pids>
|
|
104
|
+
|
|
105
|
+
# Kill old processes (>1 hour)
|
|
106
|
+
ps -eo pid,etime,cmd | grep node | awk '$2 ~ /-/ {print $1}' | xargs kill -9
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Testing Hook Protection
|
|
110
|
+
|
|
111
|
+
**After restart, if agent tries:**
|
|
112
|
+
```bash
|
|
113
|
+
find /mnt/c/Users/masha/Documents/claude-flow-novice -name "*.test.*"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Hook will block with:**
|
|
117
|
+
```
|
|
118
|
+
🔴 BLOCKED: find on /mnt/c paths forbidden (causes memory leak - use Glob tool instead)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Agent must use instead:**
|
|
122
|
+
```javascript
|
|
123
|
+
Glob("**/*.test.*") // Fast, <100ms, minimal memory
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Summary
|
|
127
|
+
|
|
128
|
+
✅ **Root cause identified**: `find /mnt/c` commands on WSL
|
|
129
|
+
✅ **Fix applied**: PreToolUse hook blocks dangerous commands
|
|
130
|
+
✅ **Documentation updated**: CLAUDE.md + guidelines
|
|
131
|
+
✅ **Prevention active**: Both repos protected
|
|
132
|
+
|
|
133
|
+
**Expected result:** No more 20GB+ memory spikes from find commands.
|
|
134
|
+
|
|
135
|
+
## Monitoring Script
|
|
136
|
+
|
|
137
|
+
Created: `scripts/monitor.py`
|
|
138
|
+
|
|
139
|
+
Run anytime to check for memory leaks:
|
|
140
|
+
```bash
|
|
141
|
+
python3 scripts/monitor.py
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Monitors for:
|
|
145
|
+
- Total memory usage
|
|
146
|
+
- Node/Claude process counts
|
|
147
|
+
- Zombie processes
|
|
148
|
+
- Find commands (memory bombs)
|
|
149
|
+
- Hook recursion
|
package/README.md
CHANGED
|
@@ -121,6 +121,33 @@ const result = await orchestrator.executePhase({
|
|
|
121
121
|
- 🚀 [Sprint Orchestration](docs/SPRINT_ORCHESTRATION.md) - Two-tier phase/sprint system guide
|
|
122
122
|
- 🎯 [Scope Control](docs/CFN_LOOP_SCOPE_CONTROL.md) - Product Owner GOAP-based scope enforcement (NEW)
|
|
123
123
|
- 🎯 [MCP Endpoints](planning/COMPREHENSIVE_MCP_ENDPOINTS_REFERENCE.md) - Complete reference including CFN Loop commands
|
|
124
|
+
- 🔄 [CFN Claude Sync](docs/slash-commands/cfn-claude-sync-usage.md) - DRY principle: sync CLAUDE.md to slash commands (NEW)
|
|
125
|
+
|
|
126
|
+
### CFN Claude Sync - Configuration Management (NEW in v1.6.1)
|
|
127
|
+
|
|
128
|
+
**Single Source of Truth**: Maintain CFN Loop configuration in one place (CLAUDE.md) and automatically sync to all slash command files.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# After editing CLAUDE.md CFN Loop rules:
|
|
132
|
+
/cfn-claude-sync --dry-run # Preview changes
|
|
133
|
+
/cfn-claude-sync # Apply to 8 files (4 markdown + 4 JS)
|
|
134
|
+
npm test # Validate
|
|
135
|
+
git commit -m "chore: sync CFN Loop from CLAUDE.md"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**What Gets Synchronized**:
|
|
139
|
+
- ✅ Consensus threshold (≥90%)
|
|
140
|
+
- ✅ Confidence gate (≥75%)
|
|
141
|
+
- ✅ Loop 2/3 max iterations (10/10)
|
|
142
|
+
- ✅ Complexity tiers (Simple: 2-3, Medium: 4-6, Complex: 8-12, Enterprise: 15-20)
|
|
143
|
+
- ✅ GOAP decision types (PROCEED/DEFER/ESCALATE)
|
|
144
|
+
- ✅ Autonomous execution rules
|
|
145
|
+
|
|
146
|
+
**Files Updated**:
|
|
147
|
+
- `.claude/commands/cfn-loop*.md` (4 markdown templates)
|
|
148
|
+
- `src/slash-commands/cfn-loop*.js` (4 JavaScript generators)
|
|
149
|
+
|
|
150
|
+
**Why This Matters**: Edit once in CLAUDE.md instead of manually updating 9 files. Eliminates duplication and ensures consistency.
|
|
124
151
|
|
|
125
152
|
## 🚀 Quick Start
|
|
126
153
|
|
|
@@ -635,8 +635,14 @@ class SingleFileTestEngine {
|
|
|
635
635
|
|
|
636
636
|
async runCargoTestSingleFile(file) {
|
|
637
637
|
try {
|
|
638
|
-
|
|
639
|
-
|
|
638
|
+
// Extract module name from file path for targeted testing
|
|
639
|
+
const moduleName = this.extractRustModuleName(file);
|
|
640
|
+
const testFilter = moduleName ? `--test ${moduleName}` : '';
|
|
641
|
+
|
|
642
|
+
// Run only tests for this specific file/module, not full compilation
|
|
643
|
+
const result = await execAsync(`cargo test ${testFilter} --message-format=json --no-fail-fast -- --nocapture`, {
|
|
644
|
+
cwd: this.findCargoRoot(file),
|
|
645
|
+
timeout: 30000 // 30 second timeout for single file
|
|
640
646
|
});
|
|
641
647
|
|
|
642
648
|
const lines = result.stdout.trim().split('\n');
|
|
@@ -697,6 +703,34 @@ class SingleFileTestEngine {
|
|
|
697
703
|
};
|
|
698
704
|
}
|
|
699
705
|
|
|
706
|
+
// Rust-specific helpers
|
|
707
|
+
extractRustModuleName(file) {
|
|
708
|
+
// Extract module name from file path
|
|
709
|
+
// e.g., src/services/email.rs → services::email
|
|
710
|
+
const cargoRoot = this.findCargoRoot(file);
|
|
711
|
+
const relative = path.relative(cargoRoot, file);
|
|
712
|
+
const modulePath = relative
|
|
713
|
+
.replace(/^src\//, '')
|
|
714
|
+
.replace(/\.rs$/, '')
|
|
715
|
+
.replace(/\//g, '::')
|
|
716
|
+
.replace(/\\/, '::'); // Windows paths
|
|
717
|
+
return modulePath;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
findCargoRoot(file) {
|
|
721
|
+
// Walk up directory tree to find Cargo.toml
|
|
722
|
+
let dir = path.dirname(file);
|
|
723
|
+
for (let i = 0; i < 10; i++) { // Limit depth to prevent infinite loop
|
|
724
|
+
if (fsSync.existsSync(path.join(dir, 'Cargo.toml'))) {
|
|
725
|
+
return dir;
|
|
726
|
+
}
|
|
727
|
+
const parent = path.dirname(dir);
|
|
728
|
+
if (parent === dir) break; // Reached root
|
|
729
|
+
dir = parent;
|
|
730
|
+
}
|
|
731
|
+
return path.dirname(file); // Fallback to file directory
|
|
732
|
+
}
|
|
733
|
+
|
|
700
734
|
// Coverage analysis
|
|
701
735
|
async getJestCoverage(file) {
|
|
702
736
|
try {
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Counter Demo
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates how to use the simple metrics counter API
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
incrementMetric,
|
|
9
|
+
recordGauge,
|
|
10
|
+
recordTiming,
|
|
11
|
+
measureExecution,
|
|
12
|
+
trackProviderRouting,
|
|
13
|
+
trackAgentSpawn,
|
|
14
|
+
trackAPICall,
|
|
15
|
+
trackError,
|
|
16
|
+
getMetricValue,
|
|
17
|
+
getMetricBreakdown,
|
|
18
|
+
} from '../src/observability/metrics-counter.js';
|
|
19
|
+
|
|
20
|
+
async function demo() {
|
|
21
|
+
console.log('📊 Metrics Counter Demo\n');
|
|
22
|
+
|
|
23
|
+
// ===== EXAMPLE 1: Simple Counter =====
|
|
24
|
+
console.log('1️⃣ Simple Counters:');
|
|
25
|
+
incrementMetric('user.login');
|
|
26
|
+
incrementMetric('user.login');
|
|
27
|
+
incrementMetric('user.login');
|
|
28
|
+
console.log(' ✅ Tracked 3 user logins');
|
|
29
|
+
|
|
30
|
+
// ===== EXAMPLE 2: Counter with Tags =====
|
|
31
|
+
console.log('\n2️⃣ Counters with Tags:');
|
|
32
|
+
incrementMetric('api.requests', 1, { endpoint: '/users', method: 'GET' });
|
|
33
|
+
incrementMetric('api.requests', 1, { endpoint: '/users', method: 'POST' });
|
|
34
|
+
incrementMetric('api.requests', 1, { endpoint: '/posts', method: 'GET' });
|
|
35
|
+
console.log(' ✅ Tracked API requests with endpoint/method tags');
|
|
36
|
+
|
|
37
|
+
// ===== EXAMPLE 3: Gauge Values =====
|
|
38
|
+
console.log('\n3️⃣ Gauge Values:');
|
|
39
|
+
recordGauge('queue.size', 42);
|
|
40
|
+
recordGauge('active.connections', 15, { region: 'us-east-1' });
|
|
41
|
+
recordGauge('cpu.usage', 67.5, { unit: 'percent' });
|
|
42
|
+
console.log(' ✅ Recorded queue size, connections, CPU usage');
|
|
43
|
+
|
|
44
|
+
// ===== EXAMPLE 4: Timing Metrics =====
|
|
45
|
+
console.log('\n4️⃣ Timing Metrics:');
|
|
46
|
+
recordTiming('database.query', 45, { query: 'SELECT' });
|
|
47
|
+
recordTiming('database.query', 120, { query: 'INSERT' });
|
|
48
|
+
console.log(' ✅ Recorded database query timings');
|
|
49
|
+
|
|
50
|
+
// ===== EXAMPLE 5: Automatic Timing with measureExecution =====
|
|
51
|
+
console.log('\n5️⃣ Automatic Execution Timing:');
|
|
52
|
+
const result = await measureExecution('task.process', async () => {
|
|
53
|
+
await new Promise(resolve => setTimeout(resolve, 100)); // Simulate work
|
|
54
|
+
return { processed: 100 };
|
|
55
|
+
}, { taskType: 'data-import' });
|
|
56
|
+
console.log(` ✅ Measured execution: ${result.processed} items processed`);
|
|
57
|
+
|
|
58
|
+
// ===== EXAMPLE 6: Provider Routing Tracking =====
|
|
59
|
+
console.log('\n6️⃣ Provider Routing:');
|
|
60
|
+
trackProviderRouting('custom', 'Tier 2: Z.ai', 'coder', 'fallback');
|
|
61
|
+
trackProviderRouting('custom', 'Tier 2: Z.ai', 'researcher', 'fallback');
|
|
62
|
+
trackProviderRouting('anthropic', 'Tier 1: Subscription', 'coordinator', 'tier-config');
|
|
63
|
+
console.log(' ✅ Tracked 3 provider routing decisions');
|
|
64
|
+
|
|
65
|
+
// ===== EXAMPLE 7: Agent Lifecycle Tracking =====
|
|
66
|
+
console.log('\n7️⃣ Agent Lifecycle:');
|
|
67
|
+
trackAgentSpawn('coder', 'swarm-123', 'mesh');
|
|
68
|
+
trackAgentSpawn('tester', 'swarm-123', 'mesh');
|
|
69
|
+
console.log(' ✅ Tracked 2 agent spawns');
|
|
70
|
+
|
|
71
|
+
// ===== EXAMPLE 8: API Call Tracking =====
|
|
72
|
+
console.log('\n8️⃣ API Call Tracking:');
|
|
73
|
+
trackAPICall('/api/users', 'GET', 200, 45);
|
|
74
|
+
trackAPICall('/api/users', 'POST', 201, 120);
|
|
75
|
+
trackAPICall('/api/posts', 'GET', 200, 30);
|
|
76
|
+
console.log(' ✅ Tracked 3 API calls with status codes');
|
|
77
|
+
|
|
78
|
+
// ===== EXAMPLE 9: Error Tracking =====
|
|
79
|
+
console.log('\n9️⃣ Error Tracking:');
|
|
80
|
+
trackError('ValidationError', 'user-service', 'low');
|
|
81
|
+
trackError('DatabaseConnectionError', 'database', 'critical');
|
|
82
|
+
console.log(' ✅ Tracked 2 errors with severity levels');
|
|
83
|
+
|
|
84
|
+
// ===== EXAMPLE 10: Query Metrics =====
|
|
85
|
+
console.log('\n🔟 Query Metrics:');
|
|
86
|
+
const loginCount = getMetricValue('user.login');
|
|
87
|
+
console.log(` Login count: ${loginCount}`);
|
|
88
|
+
|
|
89
|
+
const apiBreakdown = getMetricBreakdown('api.requests', 'endpoint');
|
|
90
|
+
console.log(' API requests by endpoint:');
|
|
91
|
+
Object.entries(apiBreakdown).forEach(([endpoint, count]) => {
|
|
92
|
+
console.log(` ${endpoint}: ${count} requests`);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const providerBreakdown = getMetricBreakdown('provider.request', 'provider');
|
|
96
|
+
console.log(' Provider routing breakdown:');
|
|
97
|
+
Object.entries(providerBreakdown).forEach(([provider, count]) => {
|
|
98
|
+
const name = provider === 'custom' ? 'Z.ai' : provider;
|
|
99
|
+
console.log(` ${name}: ${count} requests`);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
console.log('\n✅ Demo complete! All metrics tracked successfully.\n');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Run demo
|
|
106
|
+
demo().catch(console.error);
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent Metrics Demo
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates:
|
|
5
|
+
* 1. Metrics persist across restarts (stored in SQLite)
|
|
6
|
+
* 2. Query historical metrics
|
|
7
|
+
* 3. Aggregate metrics from multiple runs
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { incrementMetric, trackProviderRouting } from '../src/observability/metrics-counter.js';
|
|
11
|
+
import { getGlobalMetricsStorage } from '../src/observability/metrics-storage.js';
|
|
12
|
+
|
|
13
|
+
async function demo() {
|
|
14
|
+
console.log('📊 Persistent Metrics Demo\n');
|
|
15
|
+
console.log('=' .repeat(60));
|
|
16
|
+
|
|
17
|
+
const storage = getGlobalMetricsStorage();
|
|
18
|
+
|
|
19
|
+
// Show database stats FIRST (to see if we have previous data)
|
|
20
|
+
const stats = storage.getStats();
|
|
21
|
+
console.log('\n📈 Database Stats (BEFORE adding new metrics):');
|
|
22
|
+
console.log(` Total metrics stored: ${stats.totalMetrics}`);
|
|
23
|
+
console.log(` Unique metric names: ${stats.uniqueNames}`);
|
|
24
|
+
console.log(` Oldest metric: ${stats.oldestMetric || 'N/A'}`);
|
|
25
|
+
console.log(` Newest metric: ${stats.newestMetric || 'N/A'}`);
|
|
26
|
+
console.log(` Database size: ${stats.dbSizeMB} MB`);
|
|
27
|
+
|
|
28
|
+
if (stats.totalMetrics > 0) {
|
|
29
|
+
console.log('\n✅ Found previous metrics! They persisted across restarts.');
|
|
30
|
+
} else {
|
|
31
|
+
console.log('\n🆕 No previous metrics found. This is a fresh database.');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Add new metrics in THIS run
|
|
35
|
+
console.log('\n➕ Adding new metrics in THIS run...');
|
|
36
|
+
|
|
37
|
+
incrementMetric('demo.run.count');
|
|
38
|
+
incrementMetric('user.actions', 1, { action: 'click', page: 'home' });
|
|
39
|
+
incrementMetric('user.actions', 1, { action: 'submit', page: 'form' });
|
|
40
|
+
|
|
41
|
+
trackProviderRouting('custom', 'Tier 2: Z.ai', 'coder', 'fallback');
|
|
42
|
+
trackProviderRouting('anthropic', 'Tier 1: Subscription', 'coordinator', 'tier-config');
|
|
43
|
+
|
|
44
|
+
console.log(' ✅ Added 5 metrics');
|
|
45
|
+
|
|
46
|
+
// Query metrics from ALL time (including previous runs)
|
|
47
|
+
console.log('\n🔍 Querying ALL historical metrics...');
|
|
48
|
+
|
|
49
|
+
const totalRuns = storage.getCounterTotal('demo.run.count');
|
|
50
|
+
console.log(`\n Total demo runs (across ALL sessions): ${totalRuns}`);
|
|
51
|
+
|
|
52
|
+
const userActions = storage.getSummary('user.actions');
|
|
53
|
+
if (userActions) {
|
|
54
|
+
console.log(`\n User actions summary:`);
|
|
55
|
+
console.log(` Total actions: ${userActions.count}`);
|
|
56
|
+
console.log(` By action type:`);
|
|
57
|
+
Object.entries(userActions.tags.action || {}).forEach(([action, count]) => {
|
|
58
|
+
console.log(` ${action}: ${count}`);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const providerBreakdown = storage.getBreakdown('provider.request', 'provider');
|
|
63
|
+
console.log(`\n Provider routing breakdown (ALL time):`);
|
|
64
|
+
Object.entries(providerBreakdown).forEach(([provider, count]) => {
|
|
65
|
+
const name = provider === 'custom' ? 'Z.ai' : provider;
|
|
66
|
+
console.log(` ${name}: ${count} requests`);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Show final stats
|
|
70
|
+
const finalStats = storage.getStats();
|
|
71
|
+
console.log('\n📊 Database Stats (AFTER adding new metrics):');
|
|
72
|
+
console.log(` Total metrics stored: ${finalStats.totalMetrics}`);
|
|
73
|
+
console.log(` Database size: ${finalStats.dbSizeMB} MB`);
|
|
74
|
+
|
|
75
|
+
console.log('\n' + '='.repeat(60));
|
|
76
|
+
console.log('✅ Demo complete!\n');
|
|
77
|
+
console.log('💡 TIP: Run this script multiple times to see metrics accumulate:');
|
|
78
|
+
console.log(' npx tsx examples/persistent-metrics-demo.ts\n');
|
|
79
|
+
console.log('📂 Database location: .claude-flow/metrics.db\n');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Run demo
|
|
83
|
+
demo().catch(console.error);
|