claude-flow-novice 2.3.4 → 2.3.6
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/dist/src/booster/performance-benchmark.js +1 -1
- package/dist/src/booster/wasm-demo.js +1 -1
- package/dist/src/cli/command-registry.js +2 -2
- package/dist/src/cli/help-formatter.js +137 -109
- package/dist/src/cli/simple-cli.js +2528 -2121
- package/dist/src/cli/simple-commands/sparc/refinement.js +3 -3
- package/dist/src/cli/validation-helper.js +98 -49
- package/dist/src/commands/suggest-templates.js +4 -4
- package/dist/src/core/version.js +23 -15
- package/dist/src/memory/swarm-memory.js +603 -470
- package/dist/src/slash-commands/fullstack.js +2 -2
- package/dist/src/slash-commands/parse-epic.js +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +41 -31
- package/dist/scripts/.claude-flow/metrics/agent-metrics.json +0 -1
- package/dist/scripts/.claude-flow/metrics/performance.json +0 -9
- package/dist/scripts/.claude-flow/metrics/task-metrics.json +0 -10
- package/dist/scripts/CLEANUP_OPTIMIZATION_REPORT.json +0 -312
- package/dist/scripts/CLEANUP_PERFORMANCE_OPTIMIZATION.md +0 -387
- package/dist/scripts/CLEANUP_QUICK_START.md +0 -268
- package/dist/scripts/CLEANUP_TEST_RESULTS.md +0 -205
- package/dist/scripts/README.md +0 -339
- package/dist/scripts/ace-query.sh +0 -384
- package/dist/scripts/agent-token-analysis.js +0 -430
- package/dist/scripts/auto-setup.js +0 -332
- package/dist/scripts/build/README.md +0 -167
- package/dist/scripts/build/build-config.js +0 -27
- package/dist/scripts/build/build-prompt-copier.sh +0 -30
- package/dist/scripts/build/performance-monitor.js +0 -869
- package/dist/scripts/build/prepare-publish.js +0 -150
- package/dist/scripts/build/typescript-fixer.js +0 -621
- package/dist/scripts/build/unified-builder.sh +0 -428
- package/dist/scripts/build/update-bin-version.js +0 -32
- package/dist/scripts/build/validate-agents.js +0 -238
- package/dist/scripts/build-index.js +0 -43
- package/dist/scripts/build-orchestrator.js +0 -320
- package/dist/scripts/check-routing-stats.cjs +0 -122
- package/dist/scripts/ci-validation.js +0 -375
- package/dist/scripts/cleanup-blocking-coordination.sh +0 -420
- package/dist/scripts/cleanup-idle-sessions.sh +0 -118
- package/dist/scripts/collect-build-metrics.js +0 -65
- package/dist/scripts/demo/README.md +0 -79
- package/dist/scripts/demo/autoscaling-demo-simplified.js +0 -963
- package/dist/scripts/demo/comprehensive-dashboard-test.js +0 -693
- package/dist/scripts/demo/confidence-log.js +0 -87
- package/dist/scripts/demo/confidence-report.js +0 -82
- package/dist/scripts/demo/demo-multi-swarm-coordination.js +0 -325
- package/dist/scripts/demo/demo-production-deployment.js +0 -399
- package/dist/scripts/demo/demo-visualization-system.js +0 -149
- package/dist/scripts/demo/performance-analysis.cjs +0 -71
- package/dist/scripts/demo/performance-analysis.js +0 -71
- package/dist/scripts/demo/test-autoscaling-demo.js +0 -314
- package/dist/scripts/dependency-optimizer.js +0 -349
- package/dist/scripts/dependency-security-assessment.js +0 -331
- package/dist/scripts/deploy-sdk.sh +0 -176
- package/dist/scripts/deployment-readiness-report.json +0 -179
- package/dist/scripts/dev/README.md +0 -264
- package/dist/scripts/dev/claude-flow-wrapper.sh +0 -35
- package/dist/scripts/dev/claude-monitor.py +0 -419
- package/dist/scripts/dev/claude-sparc.sh +0 -562
- package/dist/scripts/dev/claude-wrapper.sh +0 -17
- package/dist/scripts/dev/demo-phase3-compliance.js +0 -172
- package/dist/scripts/dev/demo-task-system.ts +0 -224
- package/dist/scripts/dev/deployment-validator.js +0 -315
- package/dist/scripts/dev/spawn-claude-terminal.sh +0 -32
- package/dist/scripts/dev/start-portal.sh +0 -506
- package/dist/scripts/dev/start-web-ui.js +0 -15
- package/dist/scripts/dev/stop-portal.sh +0 -311
- package/dist/scripts/dev/validate-examples.ts +0 -288
- package/dist/scripts/dev/validate-phase2.cjs +0 -451
- package/dist/scripts/dev/validate-phase2.js +0 -785
- package/dist/scripts/dev/validate-phase3.cjs +0 -208
- package/dist/scripts/dev/validate-security-remediation.js +0 -1
- package/dist/scripts/ecosystem.config.cjs +0 -90
- package/dist/scripts/enhanced-memory-spiral-killer.sh +0 -221
- package/dist/scripts/fix-js-extensions.js +0 -167
- package/dist/scripts/generate-basic-types.js +0 -73
- package/dist/scripts/generate-changelog.js +0 -318
- package/dist/scripts/git-hooks/pre-commit.sh +0 -143
- package/dist/scripts/health-checks.js +0 -634
- package/dist/scripts/hook-wrapper.sh +0 -54
- package/dist/scripts/install/README.md +0 -375
- package/dist/scripts/install/REDIS_SETUP_VALIDATION.json +0 -245
- package/dist/scripts/install/check-prerequisites.js +0 -303
- package/dist/scripts/install/config-wizard.js +0 -606
- package/dist/scripts/install/dependency-checker.js +0 -385
- package/dist/scripts/install/health-check.js +0 -765
- package/dist/scripts/install/install.js +0 -256
- package/dist/scripts/install/installation-benchmark.js +0 -461
- package/dist/scripts/install/quick-install.js +0 -720
- package/dist/scripts/install/quick-start-wizard.js +0 -295
- package/dist/scripts/install/redis-cli.js +0 -289
- package/dist/scripts/install/redis-install-guides.md +0 -407
- package/dist/scripts/install/redis-setup.js +0 -559
- package/dist/scripts/install/redis-test.js +0 -278
- package/dist/scripts/install/service-manager.js +0 -672
- package/dist/scripts/install/setup.js +0 -832
- package/dist/scripts/install/uninstall.js +0 -526
- package/dist/scripts/install/update.js +0 -461
- package/dist/scripts/install-pre-commit-hook.sh +0 -127
- package/dist/scripts/legacy/README.md +0 -272
- package/dist/scripts/legacy/batch-fix-ts.sh +0 -54
- package/dist/scripts/legacy/build-migration.sh +0 -105
- package/dist/scripts/legacy/build-monitor.js +0 -209
- package/dist/scripts/legacy/build-with-filter.sh +0 -84
- package/dist/scripts/legacy/build-workaround.sh +0 -71
- package/dist/scripts/legacy/fix-ts-advanced.js +0 -358
- package/dist/scripts/legacy/fix-ts-final.sh +0 -50
- package/dist/scripts/legacy/fix-ts-targeted.sh +0 -49
- package/dist/scripts/legacy/fix-typescript-errors.js +0 -305
- package/dist/scripts/legacy/force-build.sh +0 -63
- package/dist/scripts/legacy/optimize-performance.js +0 -400
- package/dist/scripts/legacy/performance-monitor.js +0 -263
- package/dist/scripts/legacy/performance-monitoring.js +0 -532
- package/dist/scripts/legacy/performance-test-runner.js +0 -645
- package/dist/scripts/legacy/quick-fix-ts.js +0 -281
- package/dist/scripts/legacy/safe-build.sh +0 -63
- package/dist/scripts/memory-monitor-coordinator.js +0 -451
- package/dist/scripts/migrate-to-sdk.sh +0 -520
- package/dist/scripts/migration/QUICK-START.md +0 -189
- package/dist/scripts/migration/QUICK-START.md.backup-1760135091363 +0 -189
- package/dist/scripts/migration/README.md +0 -464
- package/dist/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md +0 -500
- package/dist/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md.backup-1760135091348 +0 -500
- package/dist/scripts/migration/UPDATE-PATHS-README.md +0 -464
- package/dist/scripts/migration/UPDATE-PATHS-README.md.backup-1760135091337 +0 -464
- package/dist/scripts/migration/example-patterns.json +0 -19
- package/dist/scripts/migration/install-arm64.js +0 -78
- package/dist/scripts/migration/install.js +0 -83
- package/dist/scripts/migration/migrate-hooks.js +0 -173
- package/dist/scripts/migration/migration-examples.ts +0 -318
- package/dist/scripts/migration/reorganize-workspace.js +0 -504
- package/dist/scripts/migration/test-update-paths.js +0 -359
- package/dist/scripts/migration/update-paths.js +0 -664
- package/dist/scripts/migration/validate-migration.js +0 -647
- package/dist/scripts/monitor-loop.sh +0 -65
- package/dist/scripts/monitor-memory.sh +0 -47
- package/dist/scripts/monitor-migration.js +0 -339
- package/dist/scripts/monitor.py +0 -43
- package/dist/scripts/monitoring/README.md +0 -178
- package/dist/scripts/monitoring/alert-monitor.sh +0 -220
- package/dist/scripts/monitoring/analyze-resources.sh +0 -199
- package/dist/scripts/monitoring/dashboards/rate-limiting-dashboard.json +0 -211
- package/dist/scripts/monitoring/dynamic-monitor.sh +0 -85
- package/dist/scripts/monitoring/launch-stability-test.sh +0 -184
- package/dist/scripts/monitoring/monitor-test.sh +0 -93
- package/dist/scripts/monitoring/pre-test-validation.sh +0 -208
- package/dist/scripts/monitoring/quick-test-alerting.sh +0 -118
- package/dist/scripts/monitoring/quick-test-rate-limiting.sh +0 -206
- package/dist/scripts/monitoring/rate-limiting-monitor.sh +0 -380
- package/dist/scripts/monitoring/resource-monitor.sh +0 -126
- package/dist/scripts/monitoring/stability-monitor.js +0 -429
- package/dist/scripts/monitoring/test-monitor-quick.sh +0 -54
- package/dist/scripts/monitoring/view-alerts.sh +0 -307
- package/dist/scripts/npm-metrics-collector.js +0 -482
- package/dist/scripts/npm-package-validation.cjs +0 -299
- package/dist/scripts/optimization/build-optimizer.js +0 -438
- package/dist/scripts/optimization/config-validator.js +0 -761
- package/dist/scripts/optimization/test-optimization.js +0 -432
- package/dist/scripts/optimization/unified-activation.js +0 -839
- package/dist/scripts/optimize-package-swarm.js +0 -54
- package/dist/scripts/performance/ACTIVATION_COMMANDS.md +0 -292
- package/dist/scripts/performance/sqlite-enhanced-activation.sh +0 -583
- package/dist/scripts/performance/test-enhanced-backend.sh +0 -504
- package/dist/scripts/performance-monitor.js +0 -644
- package/dist/scripts/performance-test-runner.js +0 -698
- package/dist/scripts/post-deployment-monitoring.js +0 -350
- package/dist/scripts/post-edit-pipeline.js +0 -2091
- package/dist/scripts/post-install-claude-md.js +0 -78
- package/dist/scripts/postinstall.js +0 -84
- package/dist/scripts/pre-publish-validation.cjs +0 -212
- package/dist/scripts/pre-publish-validation.js +0 -429
- package/dist/scripts/redis-lua/cleanup-blocking-coordination.lua +0 -198
- package/dist/scripts/release-announcement.js +0 -425
- package/dist/scripts/release-notification.js +0 -248
- package/dist/scripts/release-rollback.js +0 -376
- package/dist/scripts/release-validation.js +0 -460
- package/dist/scripts/rollback-sdk.sh +0 -66
- package/dist/scripts/run-production-validation.ts +0 -590
- package/dist/scripts/run-stability-validation.sh +0 -687
- package/dist/scripts/security/README.md +0 -339
- package/dist/scripts/security/deployment-validation.cjs +0 -279
- package/dist/scripts/security/envelope-encryption-confidence-report.cjs +0 -422
- package/dist/scripts/security/install-git-hooks.sh +0 -132
- package/dist/scripts/security/install-git-secrets.sh +0 -295
- package/dist/scripts/security/rotate-api-keys.js +0 -469
- package/dist/scripts/security/ruv-swarm-safe.js +0 -74
- package/dist/scripts/security/security-audit.cjs +0 -538
- package/dist/scripts/security/setup-redis-auth.sh +0 -397
- package/dist/scripts/security/validate-envelope-encryption.cjs +0 -340
- package/dist/scripts/security-scan.js +0 -492
- package/dist/scripts/src/web/frontend/.claude-flow/metrics/agent-metrics.json +0 -1
- package/dist/scripts/src/web/frontend/.claude-flow/metrics/performance.json +0 -9
- package/dist/scripts/src/web/frontend/.claude-flow/metrics/task-metrics.json +0 -10
- package/dist/scripts/switch-api.sh +0 -159
- package/dist/scripts/sync-agents.js +0 -290
- package/dist/scripts/test/50-agent-test.js +0 -625
- package/dist/scripts/test/NEW_STABILITY_TEST_GUIDE.md +0 -407
- package/dist/scripts/test/README.md +0 -236
- package/dist/scripts/test/STABILITY_TEST_EXAMPLE.md +0 -347
- package/dist/scripts/test/STABILITY_TEST_README.md +0 -480
- package/dist/scripts/test/agent-worker.js +0 -309
- package/dist/scripts/test/ai-coordination-test.js +0 -650
- package/dist/scripts/test/ai-mesh-coordination-test.js +0 -416
- package/dist/scripts/test/check-links.ts +0 -274
- package/dist/scripts/test/check-performance-regression.ts +0 -168
- package/dist/scripts/test/cli-agent-coordination-test.js +0 -313
- package/dist/scripts/test/coordinator-multilingual-test.js +0 -396
- package/dist/scripts/test/coordinator-transparency-demo.js +0 -585
- package/dist/scripts/test/coverage-report.ts +0 -692
- package/dist/scripts/test/generate-swarm-tests.js +0 -633
- package/dist/scripts/test/integration-test-validation.cjs +0 -253
- package/dist/scripts/test/load-test-swarm.js +0 -576
- package/dist/scripts/test/mesh-coordination-zero-overlap-test.js +0 -740
- package/dist/scripts/test/multilingual-hello-world-test.js +0 -390
- package/dist/scripts/test/quick-multilingual-demo.js +0 -464
- package/dist/scripts/test/real-agent-test.js +0 -312
- package/dist/scripts/test/run-phase3-compliance-tests.js +0 -427
- package/dist/scripts/test/run-stability-test-examples.sh +0 -292
- package/dist/scripts/test/stability-results/stability-metrics.jsonl +0 -83
- package/dist/scripts/test/stability-results/stability-test-report.json +0 -128
- package/dist/scripts/test/stability-results/stability-test.log +0 -1827
- package/dist/scripts/test/stability-test-50-agents.js +0 -734
- package/dist/scripts/test/test-batch-tasks.ts +0 -29
- package/dist/scripts/test/test-byzantine-resolution.js +0 -246
- package/dist/scripts/test/test-claude-spawn-options.sh +0 -63
- package/dist/scripts/test/test-cli-wizard.js +0 -331
- package/dist/scripts/test/test-comprehensive.js +0 -401
- package/dist/scripts/test/test-coordination-features.ts +0 -238
- package/dist/scripts/test/test-fallback-systems.js +0 -276
- package/dist/scripts/test/test-init-command.ts +0 -302
- package/dist/scripts/test/test-mcp.ts +0 -251
- package/dist/scripts/test/test-runner.ts +0 -568
- package/dist/scripts/test/test-swarm-integration.sh +0 -92
- package/dist/scripts/test/test-swarm.ts +0 -142
- package/dist/scripts/test/validation-summary.ts +0 -408
- package/dist/scripts/test-cleanup-performance.sh +0 -416
- package/dist/scripts/test-dashboard-auth.cjs +0 -203
- package/dist/scripts/test-docker-deployment.sh +0 -207
- package/dist/scripts/test-npm-package.cjs +0 -167
- package/dist/scripts/test-provider-routing.cjs +0 -226
- package/dist/scripts/test-routing-telemetry.cjs +0 -147
- package/dist/scripts/test-runner.cjs +0 -154
- package/dist/scripts/test-zai-10k.cjs +0 -81
- package/dist/scripts/test-zai-api.cjs +0 -191
- package/dist/scripts/test-zai-diagnostic.cjs +0 -151
- package/dist/scripts/test-zai-final.cjs +0 -128
- package/dist/scripts/test-zai-with-env.cjs +0 -85
- package/dist/scripts/toggle-cost-savings.cjs +0 -302
- package/dist/scripts/unified-memory-monitor.js +0 -526
- package/dist/scripts/utils/README.md +0 -261
- package/dist/scripts/utils/clean-build-artifacts.sh +0 -94
- package/dist/scripts/utils/cleanup-root.sh +0 -69
- package/dist/scripts/utils/fix-cliffy-imports.js +0 -307
- package/dist/scripts/utils/fix-duplicate-imports.js +0 -114
- package/dist/scripts/utils/fix-error-handling.cjs +0 -70
- package/dist/scripts/utils/fix-import-paths.js +0 -104
- package/dist/scripts/utils/fix-imports.js +0 -116
- package/dist/scripts/utils/fix-shebang.js +0 -78
- package/dist/scripts/utils/fix-test-modules.js +0 -27
- package/dist/scripts/utils/fix-timezone-issue-246.js +0 -200
- package/dist/scripts/utils/fix-ts-comprehensive.py +0 -182
- package/dist/scripts/utils/fix-ts-targeted-batch.js +0 -250
- package/dist/scripts/utils/remove-benchmark-conflicts.sh +0 -140
- package/dist/scripts/utils/simple-test-fixer.js +0 -190
- package/dist/scripts/utils/validate-metrics-structure.cjs +0 -144
- package/dist/scripts/validate-agent-hooks.js +0 -506
- package/dist/scripts/validate-changelog.js +0 -241
- package/dist/scripts/validate-coordination-cli.js +0 -69
- package/dist/scripts/validate-coordination-toggle-integration.cjs +0 -501
- package/dist/scripts/validate-docker-infrastructure.sh +0 -502
- package/dist/scripts/validate-entry-points.js +0 -300
- package/dist/scripts/validate-memory-monitoring.sh +0 -225
- package/dist/scripts/validate-stage3-performance.ts +0 -377
- package/dist/scripts/validate-template-bundling.js +0 -180
- package/dist/scripts/validation/README.md +0 -33
- package/dist/scripts/validation/acl-security-validation.cjs +0 -214
- package/dist/scripts/validation/acl-security-validation.js +0 -402
- package/dist/scripts/validation/byzantine-verification.js +0 -407
- package/dist/scripts/validation/final-phase-2-consensus.cjs +0 -219
- package/dist/scripts/validation/final-security-validation.js +0 -791
- package/dist/scripts/validation/final-wasm-validation.cjs +0 -840
- package/dist/scripts/validation/integration-test-analysis.js +0 -105
- package/dist/scripts/validation/phase-0-comprehensive-validation.js +0 -474
- package/dist/scripts/validation/phase-0-consensus-report.js +0 -139
- package/dist/scripts/validation/phase-0-final-report.js +0 -112
- package/dist/scripts/validation/phase-0-redis-consensus-report.js +0 -129
- package/dist/scripts/validation/phase-0-validation-improved.js +0 -490
- package/dist/scripts/validation/phase-0-validation-test.js +0 -65
- package/dist/scripts/validation/phase-1-consensus-report.cjs +0 -342
- package/dist/scripts/validation/phase-1-consensus-validation.cjs +0 -551
- package/dist/scripts/validation/phase-1-consensus-validation.js +0 -551
- package/dist/scripts/validation/phase-2-consensus-report.cjs +0 -186
- package/dist/scripts/validation/phase-2-validation.cjs +0 -171
- package/dist/scripts/validation/phase-2-validation.js +0 -171
- package/dist/scripts/validation/phase-4-consensus-report.js +0 -181
- package/dist/scripts/validation/phase-4-final-validation.js +0 -351
- package/dist/scripts/validation/phase-5-consensus-report.cjs +0 -113
- package/dist/scripts/validation/phase-5-consensus-report.js +0 -113
- package/dist/scripts/validation/security-analysis.js +0 -49
- package/dist/scripts/validation/security-validation.js +0 -492
- package/dist/scripts/validation/simple-security-validation.js +0 -464
- package/dist/scripts/verify-installation.js +0 -112
- package/dist/scripts/verify-mcp-server.js +0 -86
- package/dist/scripts/verify-sdk-phase1.cjs +0 -293
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/accessibility/browser/accessibilityService.js +0 -88
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/accessibility/common/accessibility.js +0 -9
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/action/common/action.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/action/common/actionCommonCategories.js +0 -13
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actionWidget/browser/actionList.js +0 -276
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actionWidget/browser/actionWidget.js +0 -248
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actionWidget/common/actionWidget.js +0 -5
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actions/common/actions.js +0 -409
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/audioCues/browser/audioCueService.js +0 -176
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/clipboard/browser/clipboardService.js +0 -141
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/clipboard/common/clipboardService.js +0 -6
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/commands/common/commands.js +0 -80
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configuration.js +0 -86
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configurationModels.js +0 -554
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configurationRegistry.js +0 -317
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configurations.js +0 -41
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextkey/browser/contextKeyService.js +0 -432
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextkey/common/contextkey.js +0 -1547
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextkey/common/contextkeys.js +0 -18
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextMenuHandler.js +0 -124
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextMenuService.js +0 -101
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextView.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextViewService.js +0 -72
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/dialogs/common/dialogs.js +0 -2
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/dnd/browser/dnd.js +0 -36
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/editor/common/editor.js +0 -17
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/environment/common/environment.js +0 -2
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/extensions/common/extensions.js +0 -47
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/files/common/files.js +0 -9
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +0 -105
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/instantiation/common/descriptors.js +0 -11
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/instantiation/common/extensions.js +0 -15
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/keybinding/common/abstractKeybindingService.js +0 -277
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/keybinding/common/baseResolvedKeybinding.js +0 -53
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +0 -354
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/theme/browser/defaultStyles.js +0 -162
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/theme/common/colorRegistry.js +0 -482
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/abap/abap.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/apex/apex.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/azcli/azcli.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/bat/bat.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/bicep/bicep.js +0 -11
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Pre-Publish Validation Script
|
|
5
|
-
*
|
|
6
|
-
* Validates that the package is ready for NPM publication
|
|
7
|
-
* Enhanced with package size, coverage, and comprehensive checks
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import fs from 'fs';
|
|
11
|
-
import path from 'path';
|
|
12
|
-
import { fileURLToPath } from 'url';
|
|
13
|
-
import { execSync } from 'child_process';
|
|
14
|
-
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
-
const __dirname = path.dirname(__filename);
|
|
17
|
-
const projectRoot = path.resolve(__dirname, '..');
|
|
18
|
-
|
|
19
|
-
console.log('🔍 Running pre-publish validation...\n');
|
|
20
|
-
|
|
21
|
-
const MAX_PACKAGE_SIZE = 100 * 1024 * 1024; // 100MB
|
|
22
|
-
const MIN_COVERAGE_TARGET = 95; // 95% coverage target
|
|
23
|
-
|
|
24
|
-
const validations = [
|
|
25
|
-
{
|
|
26
|
-
name: 'Build output exists',
|
|
27
|
-
critical: true,
|
|
28
|
-
validate: () => {
|
|
29
|
-
const indexPath = path.join(projectRoot, '.claude-flow-novice/dist/src/index.js');
|
|
30
|
-
if (!fs.existsSync(indexPath)) {
|
|
31
|
-
throw new Error('Build output not found. Run "npm run build" first.');
|
|
32
|
-
}
|
|
33
|
-
return { passed: true, details: `Found: ${indexPath}` };
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
name: 'Type declarations exist',
|
|
38
|
-
critical: true,
|
|
39
|
-
validate: () => {
|
|
40
|
-
const typesPath = path.join(projectRoot, '.claude-flow-novice/dist/index.d.ts');
|
|
41
|
-
if (!fs.existsSync(typesPath)) {
|
|
42
|
-
throw new Error('Type declarations not found. Run "npm run build" first.');
|
|
43
|
-
}
|
|
44
|
-
return { passed: true, details: `Found: ${typesPath}` };
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
name: 'Package.json is valid',
|
|
49
|
-
critical: true,
|
|
50
|
-
validate: () => {
|
|
51
|
-
const packageJson = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf8'));
|
|
52
|
-
|
|
53
|
-
if (!packageJson.name || !packageJson.version || !packageJson.main) {
|
|
54
|
-
throw new Error('package.json is missing required fields (name, version, main)');
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (!packageJson.types) {
|
|
58
|
-
throw new Error('package.json is missing "types" field');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return {
|
|
62
|
-
passed: true,
|
|
63
|
-
details: `${packageJson.name}@${packageJson.version}`
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
name: 'Entry points are valid',
|
|
69
|
-
critical: true,
|
|
70
|
-
validate: () => {
|
|
71
|
-
const packageJson = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf8'));
|
|
72
|
-
const mainPath = path.join(projectRoot, packageJson.main);
|
|
73
|
-
const typesPath = path.join(projectRoot, packageJson.types);
|
|
74
|
-
|
|
75
|
-
if (!fs.existsSync(mainPath)) {
|
|
76
|
-
throw new Error(`Main entry point not found: ${mainPath}`);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (!fs.existsSync(typesPath)) {
|
|
80
|
-
throw new Error(`Types entry point not found: ${typesPath}`);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Validate exports
|
|
84
|
-
let exportCount = 0;
|
|
85
|
-
if (packageJson.exports) {
|
|
86
|
-
exportCount = Object.keys(packageJson.exports).length;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return {
|
|
90
|
-
passed: true,
|
|
91
|
-
details: `Main entry valid, ${exportCount} exports defined`
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
name: 'Binary files exist',
|
|
97
|
-
critical: true,
|
|
98
|
-
validate: () => {
|
|
99
|
-
const packageJson = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf8'));
|
|
100
|
-
const binaries = [];
|
|
101
|
-
|
|
102
|
-
if (packageJson.bin) {
|
|
103
|
-
for (const [name, filePath] of Object.entries(packageJson.bin)) {
|
|
104
|
-
const fullPath = path.join(projectRoot, filePath);
|
|
105
|
-
if (!fs.existsSync(fullPath)) {
|
|
106
|
-
throw new Error(`Binary file not found: ${name} -> ${fullPath}`);
|
|
107
|
-
}
|
|
108
|
-
binaries.push(name);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
passed: true,
|
|
114
|
-
details: `${binaries.length} binaries validated: ${binaries.join(', ')}`
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
name: 'Package size validation',
|
|
120
|
-
critical: true,
|
|
121
|
-
validate: () => {
|
|
122
|
-
try {
|
|
123
|
-
// Create package tarball temporarily
|
|
124
|
-
execSync('npm pack', { cwd: projectRoot, stdio: 'pipe' });
|
|
125
|
-
|
|
126
|
-
// Find the tarball
|
|
127
|
-
const files = fs.readdirSync(projectRoot);
|
|
128
|
-
const tarball = files.find(f => f.startsWith('claude-flow-novice-') && f.endsWith('.tgz'));
|
|
129
|
-
|
|
130
|
-
if (!tarball) {
|
|
131
|
-
throw new Error('Package tarball not found');
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const tarballPath = path.join(projectRoot, tarball);
|
|
135
|
-
const stats = fs.statSync(tarballPath);
|
|
136
|
-
const sizeMB = (stats.size / 1024 / 1024).toFixed(2);
|
|
137
|
-
|
|
138
|
-
// Clean up tarball
|
|
139
|
-
fs.unlinkSync(tarballPath);
|
|
140
|
-
|
|
141
|
-
if (stats.size > MAX_PACKAGE_SIZE) {
|
|
142
|
-
throw new Error(`Package size ${sizeMB}MB exceeds 100MB limit`);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return {
|
|
146
|
-
passed: true,
|
|
147
|
-
details: `Package size: ${sizeMB}MB (within 100MB limit)`
|
|
148
|
-
};
|
|
149
|
-
} catch (error) {
|
|
150
|
-
throw new Error(`Package size check failed: ${error.message}`);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
name: 'Test coverage validation',
|
|
156
|
-
critical: false,
|
|
157
|
-
validate: () => {
|
|
158
|
-
const coveragePath = path.join(projectRoot, 'coverage/coverage-summary.json');
|
|
159
|
-
|
|
160
|
-
if (!fs.existsSync(coveragePath)) {
|
|
161
|
-
return {
|
|
162
|
-
passed: false,
|
|
163
|
-
details: 'Coverage report not found. Run tests with coverage first.'
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const coverage = JSON.parse(fs.readFileSync(coveragePath, 'utf8'));
|
|
168
|
-
const total = coverage.total;
|
|
169
|
-
|
|
170
|
-
const avgCoverage = Math.round(
|
|
171
|
-
(total.lines.pct + total.statements.pct + total.functions.pct + total.branches.pct) / 4
|
|
172
|
-
);
|
|
173
|
-
|
|
174
|
-
if (avgCoverage < MIN_COVERAGE_TARGET) {
|
|
175
|
-
return {
|
|
176
|
-
passed: false,
|
|
177
|
-
details: `Coverage ${avgCoverage}% below ${MIN_COVERAGE_TARGET}% target (Lines: ${total.lines.pct}%, Statements: ${total.statements.pct}%, Functions: ${total.functions.pct}%, Branches: ${total.branches.pct}%)`
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return {
|
|
182
|
-
passed: true,
|
|
183
|
-
details: `Coverage: ${avgCoverage}% (Lines: ${total.lines.pct}%, Statements: ${total.statements.pct}%, Functions: ${total.functions.pct}%, Branches: ${total.branches.pct}%)`
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
name: 'No source files in distribution',
|
|
189
|
-
critical: true,
|
|
190
|
-
validate: () => {
|
|
191
|
-
const npmignorePath = path.join(projectRoot, '.npmignore');
|
|
192
|
-
|
|
193
|
-
if (!fs.existsSync(npmignorePath)) {
|
|
194
|
-
throw new Error('.npmignore file not found');
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const npmignore = fs.readFileSync(npmignorePath, 'utf8');
|
|
198
|
-
const excludedPatterns = ['src/', 'tests/', 'test/', '*.test.js', '*.test.ts'];
|
|
199
|
-
const missing = excludedPatterns.filter(pattern => !npmignore.includes(pattern));
|
|
200
|
-
|
|
201
|
-
if (missing.length > 0) {
|
|
202
|
-
throw new Error(`Missing exclusions in .npmignore: ${missing.join(', ')}`);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
return {
|
|
206
|
-
passed: true,
|
|
207
|
-
details: 'Source files properly excluded from package'
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
},
|
|
211
|
-
{
|
|
212
|
-
name: 'Security audit passed',
|
|
213
|
-
critical: true,
|
|
214
|
-
validate: () => {
|
|
215
|
-
try {
|
|
216
|
-
const result = execSync('npm audit --audit-level moderate', {
|
|
217
|
-
encoding: 'utf8',
|
|
218
|
-
stdio: 'pipe',
|
|
219
|
-
cwd: projectRoot
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
if (result.includes('vulnerabilities')) {
|
|
223
|
-
const lines = result.split('\n');
|
|
224
|
-
const vulnLine = lines.find(line => line.includes('vulnerabilities'));
|
|
225
|
-
if (vulnLine && !vulnLine.includes('0 vulnerabilities')) {
|
|
226
|
-
throw new Error(`Security issues found: ${vulnLine.trim()}`);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
return { passed: true, details: 'No security vulnerabilities detected' };
|
|
231
|
-
} catch (error) {
|
|
232
|
-
// npm audit returns non-zero exit code when vulnerabilities found
|
|
233
|
-
if (error.stdout && error.stdout.includes('vulnerabilities')) {
|
|
234
|
-
const lines = error.stdout.split('\n');
|
|
235
|
-
const vulnLine = lines.find(line => line.includes('vulnerabilities'));
|
|
236
|
-
if (vulnLine && !vulnLine.includes('0 vulnerabilities')) {
|
|
237
|
-
throw new Error(`Security issues: ${vulnLine.trim()}`);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
throw new Error(`Security audit failed: ${error.message}`);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
},
|
|
244
|
-
{
|
|
245
|
-
name: 'Dependencies are up to date',
|
|
246
|
-
critical: false,
|
|
247
|
-
validate: () => {
|
|
248
|
-
try {
|
|
249
|
-
const result = execSync('npm outdated --json', {
|
|
250
|
-
encoding: 'utf8',
|
|
251
|
-
stdio: 'pipe',
|
|
252
|
-
cwd: projectRoot
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
const outdated = result ? JSON.parse(result) : {};
|
|
256
|
-
const outdatedCount = Object.keys(outdated).length;
|
|
257
|
-
|
|
258
|
-
if (outdatedCount > 0) {
|
|
259
|
-
const majorUpdates = Object.entries(outdated)
|
|
260
|
-
.filter(([, info]) => {
|
|
261
|
-
const current = info.current.split('.')[0];
|
|
262
|
-
const wanted = info.wanted.split('.')[0];
|
|
263
|
-
return current !== wanted;
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
if (majorUpdates.length > 0) {
|
|
267
|
-
const packages = majorUpdates.map(([name]) => name).join(', ');
|
|
268
|
-
return {
|
|
269
|
-
passed: false,
|
|
270
|
-
details: `${majorUpdates.length} major updates available: ${packages}`
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
return {
|
|
276
|
-
passed: true,
|
|
277
|
-
details: outdatedCount === 0 ? 'All dependencies up to date' : `${outdatedCount} minor updates available`
|
|
278
|
-
};
|
|
279
|
-
} catch (error) {
|
|
280
|
-
// npm outdated returns non-zero when there are outdated packages
|
|
281
|
-
return { passed: true, details: 'Dependency check completed' };
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
name: 'Build artifacts integrity',
|
|
287
|
-
critical: true,
|
|
288
|
-
validate: () => {
|
|
289
|
-
const distDir = path.join(projectRoot, '.claude-flow-novice/dist');
|
|
290
|
-
|
|
291
|
-
if (!fs.existsSync(distDir)) {
|
|
292
|
-
throw new Error('Build directory not found');
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
// Check for essential files
|
|
296
|
-
const essentialFiles = [
|
|
297
|
-
'src/index.js',
|
|
298
|
-
'src/cli/index.js',
|
|
299
|
-
'src/cli/main.js'
|
|
300
|
-
];
|
|
301
|
-
|
|
302
|
-
const missing = essentialFiles.filter(file =>
|
|
303
|
-
!fs.existsSync(path.join(distDir, file))
|
|
304
|
-
);
|
|
305
|
-
|
|
306
|
-
if (missing.length > 0) {
|
|
307
|
-
throw new Error(`Missing build artifacts: ${missing.join(', ')}`);
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
// Count total files
|
|
311
|
-
const countFiles = (dir) => {
|
|
312
|
-
let count = 0;
|
|
313
|
-
const items = fs.readdirSync(dir);
|
|
314
|
-
items.forEach(item => {
|
|
315
|
-
const fullPath = path.join(dir, item);
|
|
316
|
-
if (fs.statSync(fullPath).isDirectory()) {
|
|
317
|
-
count += countFiles(fullPath);
|
|
318
|
-
} else {
|
|
319
|
-
count++;
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
return count;
|
|
323
|
-
};
|
|
324
|
-
|
|
325
|
-
const fileCount = countFiles(distDir);
|
|
326
|
-
|
|
327
|
-
return {
|
|
328
|
-
passed: true,
|
|
329
|
-
details: `${fileCount} files in build output`
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
];
|
|
334
|
-
|
|
335
|
-
// Run validations
|
|
336
|
-
let criticalPassed = true;
|
|
337
|
-
let allPassed = true;
|
|
338
|
-
const results = [];
|
|
339
|
-
|
|
340
|
-
console.log('═'.repeat(60));
|
|
341
|
-
console.log('Critical Validations:');
|
|
342
|
-
console.log('═'.repeat(60));
|
|
343
|
-
|
|
344
|
-
validations.filter(v => v.critical).forEach(({ name, validate }) => {
|
|
345
|
-
try {
|
|
346
|
-
const result = validate();
|
|
347
|
-
console.log(`✅ ${name}`);
|
|
348
|
-
if (result.details) {
|
|
349
|
-
console.log(` ${result.details}`);
|
|
350
|
-
}
|
|
351
|
-
results.push({ name, passed: true, critical: true, details: result.details });
|
|
352
|
-
} catch (error) {
|
|
353
|
-
console.log(`❌ ${name}`);
|
|
354
|
-
console.log(` ${error.message}`);
|
|
355
|
-
criticalPassed = false;
|
|
356
|
-
allPassed = false;
|
|
357
|
-
results.push({ name, passed: false, critical: true, error: error.message });
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
console.log('\n' + '═'.repeat(60));
|
|
362
|
-
console.log('Optional Validations:');
|
|
363
|
-
console.log('═'.repeat(60));
|
|
364
|
-
|
|
365
|
-
validations.filter(v => !v.critical).forEach(({ name, validate }) => {
|
|
366
|
-
try {
|
|
367
|
-
const result = validate();
|
|
368
|
-
console.log(`${result.passed ? '✅' : '⚠️'} ${name}`);
|
|
369
|
-
if (result.details) {
|
|
370
|
-
console.log(` ${result.details}`);
|
|
371
|
-
}
|
|
372
|
-
results.push({ name, passed: result.passed, critical: false, details: result.details });
|
|
373
|
-
if (!result.passed) {
|
|
374
|
-
allPassed = false;
|
|
375
|
-
}
|
|
376
|
-
} catch (error) {
|
|
377
|
-
console.log(`⚠️ ${name}`);
|
|
378
|
-
console.log(` ${error.message}`);
|
|
379
|
-
results.push({ name, passed: false, critical: false, error: error.message });
|
|
380
|
-
allPassed = false;
|
|
381
|
-
}
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
// Generate summary report
|
|
385
|
-
console.log('\n' + '═'.repeat(60));
|
|
386
|
-
console.log('Validation Summary:');
|
|
387
|
-
console.log('═'.repeat(60));
|
|
388
|
-
|
|
389
|
-
const criticalCount = results.filter(r => r.critical).length;
|
|
390
|
-
const criticalPassedCount = results.filter(r => r.critical && r.passed).length;
|
|
391
|
-
const optionalCount = results.filter(r => !r.critical).length;
|
|
392
|
-
const optionalPassedCount = results.filter(r => !r.critical && r.passed).length;
|
|
393
|
-
|
|
394
|
-
console.log(`Critical: ${criticalPassedCount}/${criticalCount} passed`);
|
|
395
|
-
console.log(`Optional: ${optionalPassedCount}/${optionalCount} passed`);
|
|
396
|
-
console.log(`Total: ${criticalPassedCount + optionalPassedCount}/${results.length} passed`);
|
|
397
|
-
|
|
398
|
-
// Save detailed report
|
|
399
|
-
const reportPath = path.join(projectRoot, '.claude-flow-novice/pre-publish-validation-report.json');
|
|
400
|
-
fs.mkdirSync(path.dirname(reportPath), { recursive: true });
|
|
401
|
-
fs.writeFileSync(reportPath, JSON.stringify({
|
|
402
|
-
timestamp: new Date().toISOString(),
|
|
403
|
-
summary: {
|
|
404
|
-
total: results.length,
|
|
405
|
-
passed: criticalPassedCount + optionalPassedCount,
|
|
406
|
-
failed: results.length - (criticalPassedCount + optionalPassedCount),
|
|
407
|
-
criticalPassed: criticalPassedCount,
|
|
408
|
-
criticalTotal: criticalCount,
|
|
409
|
-
optionalPassed: optionalPassedCount,
|
|
410
|
-
optionalTotal: optionalCount
|
|
411
|
-
},
|
|
412
|
-
results
|
|
413
|
-
}, null, 2));
|
|
414
|
-
|
|
415
|
-
console.log(`\n📊 Detailed report saved: ${reportPath}`);
|
|
416
|
-
|
|
417
|
-
// Exit with appropriate code
|
|
418
|
-
if (!criticalPassed) {
|
|
419
|
-
console.log('\n❌ Critical validations failed. Package is NOT ready for publication.');
|
|
420
|
-
console.log(' Please fix critical issues before publishing.\n');
|
|
421
|
-
process.exit(1);
|
|
422
|
-
} else if (!allPassed) {
|
|
423
|
-
console.log('\n⚠️ All critical validations passed, but some optional checks failed.');
|
|
424
|
-
console.log(' Package can be published, but consider addressing warnings.\n');
|
|
425
|
-
process.exit(0);
|
|
426
|
-
} else {
|
|
427
|
-
console.log('\n🎉 All validations passed! Package is ready for publication.\n');
|
|
428
|
-
process.exit(0);
|
|
429
|
-
}
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
--[[
|
|
2
|
-
cleanup-blocking-coordination.lua
|
|
3
|
-
|
|
4
|
-
High-performance Redis Lua script for cleaning up stale blocking coordinator state.
|
|
5
|
-
Target: <5s for 10,000 coordinators (2,000 coordinators/sec)
|
|
6
|
-
|
|
7
|
-
Strategy:
|
|
8
|
-
1. Single SCAN with high COUNT to minimize round trips
|
|
9
|
-
2. Batch MGET to retrieve all heartbeat states in one operation
|
|
10
|
-
3. Filter stale coordinators (startTime < current - 600s)
|
|
11
|
-
4. Batch collection of all related keys (ACKs, signals, idempotency, activity)
|
|
12
|
-
5. Batch DEL of all stale keys in one atomic operation
|
|
13
|
-
|
|
14
|
-
Safety:
|
|
15
|
-
- Uses SCAN (non-blocking) for key discovery
|
|
16
|
-
- TTL-based staleness check (10 minutes = 600 seconds)
|
|
17
|
-
- Preserves active coordinators
|
|
18
|
-
- Atomic execution prevents race conditions
|
|
19
|
-
|
|
20
|
-
Performance optimizations:
|
|
21
|
-
- Minimize network round trips (single SCAN, single MGET, single DEL)
|
|
22
|
-
- Lua execution is atomic and server-side
|
|
23
|
-
- No inter-command latency
|
|
24
|
-
- Batch processing reduces overhead
|
|
25
|
-
|
|
26
|
-
KEYS: None (discovers keys dynamically)
|
|
27
|
-
ARGV[1]: Stale threshold in seconds (default: 600)
|
|
28
|
-
ARGV[2]: Dry run flag (0 = production, 1 = dry run)
|
|
29
|
-
|
|
30
|
-
Returns: JSON string with cleanup metrics
|
|
31
|
-
{
|
|
32
|
-
"totalCoordinatorsChecked": 0,
|
|
33
|
-
"staleCoordinatorsFound": 0,
|
|
34
|
-
"keysDeleted": 0,
|
|
35
|
-
"executionTimeMs": 0,
|
|
36
|
-
"staleCoordinatorIds": []
|
|
37
|
-
}
|
|
38
|
-
]]
|
|
39
|
-
|
|
40
|
-
local STALE_THRESHOLD_SECONDS = tonumber(ARGV[1]) or 600
|
|
41
|
-
local DRY_RUN = tonumber(ARGV[2]) or 0
|
|
42
|
-
local start_time = redis.call('TIME')
|
|
43
|
-
local start_time_ms = tonumber(start_time[1]) * 1000 + math.floor(tonumber(start_time[2]) / 1000)
|
|
44
|
-
|
|
45
|
-
-- Metrics tracking
|
|
46
|
-
local metrics = {
|
|
47
|
-
totalCoordinatorsChecked = 0,
|
|
48
|
-
staleCoordinatorsFound = 0,
|
|
49
|
-
keysDeleted = 0,
|
|
50
|
-
executionTimeMs = 0,
|
|
51
|
-
staleCoordinatorIds = {}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
-- Helper: Get current timestamp in seconds
|
|
55
|
-
local function current_timestamp_seconds()
|
|
56
|
-
local time = redis.call('TIME')
|
|
57
|
-
return tonumber(time[1])
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
-- Helper: Extract coordinator ID from heartbeat key
|
|
61
|
-
local function extract_coordinator_id(heartbeat_key)
|
|
62
|
-
-- Format: blocking:heartbeat:{coordinatorId}
|
|
63
|
-
return string.match(heartbeat_key, "^blocking:heartbeat:(.+)$")
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
-- Helper: Parse JSON timestamp from heartbeat value
|
|
67
|
-
local function parse_heartbeat_timestamp(heartbeat_value)
|
|
68
|
-
-- Format: {"coordinatorId":"...","timestamp":1234567890123,...}
|
|
69
|
-
local timestamp_ms = string.match(heartbeat_value, '"timestamp":(%d+)')
|
|
70
|
-
if timestamp_ms then
|
|
71
|
-
return tonumber(timestamp_ms)
|
|
72
|
-
end
|
|
73
|
-
return nil
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
-- Helper: Check if coordinator is stale
|
|
77
|
-
local function is_stale(heartbeat_value, current_time_seconds)
|
|
78
|
-
local timestamp_ms = parse_heartbeat_timestamp(heartbeat_value)
|
|
79
|
-
if not timestamp_ms then
|
|
80
|
-
return false -- Invalid heartbeat, skip
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
local timestamp_seconds = math.floor(timestamp_ms / 1000)
|
|
84
|
-
local age_seconds = current_time_seconds - timestamp_seconds
|
|
85
|
-
|
|
86
|
-
return age_seconds > STALE_THRESHOLD_SECONDS
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
-- Helper: Collect all related keys for a coordinator
|
|
90
|
-
local function collect_coordinator_keys(coordinator_id)
|
|
91
|
-
local keys = {}
|
|
92
|
-
|
|
93
|
-
-- 1. Heartbeat key
|
|
94
|
-
table.insert(keys, "blocking:heartbeat:" .. coordinator_id)
|
|
95
|
-
|
|
96
|
-
-- 2. Signal ACK keys (blocking:ack:coordinatorId:*)
|
|
97
|
-
local ack_cursor = "0"
|
|
98
|
-
repeat
|
|
99
|
-
local ack_result = redis.call('SCAN', ack_cursor, 'MATCH', 'blocking:ack:' .. coordinator_id .. ':*', 'COUNT', 1000)
|
|
100
|
-
ack_cursor = ack_result[1]
|
|
101
|
-
for _, key in ipairs(ack_result[2]) do
|
|
102
|
-
table.insert(keys, key)
|
|
103
|
-
end
|
|
104
|
-
until ack_cursor == "0"
|
|
105
|
-
|
|
106
|
-
-- 3. Signal key
|
|
107
|
-
table.insert(keys, "blocking:signal:" .. coordinator_id)
|
|
108
|
-
|
|
109
|
-
-- 4. Idempotency keys (blocking:idempotency:*coordinatorId*)
|
|
110
|
-
local idemp_cursor = "0"
|
|
111
|
-
repeat
|
|
112
|
-
local idemp_result = redis.call('SCAN', idemp_cursor, 'MATCH', 'blocking:idempotency:*' .. coordinator_id .. '*', 'COUNT', 1000)
|
|
113
|
-
idemp_cursor = idemp_result[1]
|
|
114
|
-
for _, key in ipairs(idemp_result[2]) do
|
|
115
|
-
table.insert(keys, key)
|
|
116
|
-
end
|
|
117
|
-
until idemp_cursor == "0"
|
|
118
|
-
|
|
119
|
-
-- 5. Activity tracking key
|
|
120
|
-
table.insert(keys, "coordinator:activity:" .. coordinator_id)
|
|
121
|
-
|
|
122
|
-
return keys
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
-- Step 1: Scan for all heartbeat keys with high COUNT
|
|
126
|
-
local heartbeat_keys = {}
|
|
127
|
-
local cursor = "0"
|
|
128
|
-
repeat
|
|
129
|
-
-- Use COUNT 10000 to minimize SCAN iterations
|
|
130
|
-
local result = redis.call('SCAN', cursor, 'MATCH', 'blocking:heartbeat:*', 'COUNT', 10000)
|
|
131
|
-
cursor = result[1]
|
|
132
|
-
for _, key in ipairs(result[2]) do
|
|
133
|
-
table.insert(heartbeat_keys, key)
|
|
134
|
-
end
|
|
135
|
-
until cursor == "0"
|
|
136
|
-
|
|
137
|
-
-- Early exit if no coordinators found
|
|
138
|
-
if #heartbeat_keys == 0 then
|
|
139
|
-
metrics.executionTimeMs = 0
|
|
140
|
-
return cjson.encode(metrics)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
metrics.totalCoordinatorsChecked = #heartbeat_keys
|
|
144
|
-
|
|
145
|
-
-- Step 2: Batch MGET all heartbeat values
|
|
146
|
-
local heartbeat_values = redis.call('MGET', unpack(heartbeat_keys))
|
|
147
|
-
|
|
148
|
-
-- Step 3: Filter stale coordinators and collect all keys to delete
|
|
149
|
-
local current_time_seconds = current_timestamp_seconds()
|
|
150
|
-
local keys_to_delete = {}
|
|
151
|
-
local stale_coordinator_ids = {}
|
|
152
|
-
|
|
153
|
-
for i, heartbeat_key in ipairs(heartbeat_keys) do
|
|
154
|
-
local heartbeat_value = heartbeat_values[i]
|
|
155
|
-
|
|
156
|
-
if heartbeat_value and is_stale(heartbeat_value, current_time_seconds) then
|
|
157
|
-
local coordinator_id = extract_coordinator_id(heartbeat_key)
|
|
158
|
-
if coordinator_id then
|
|
159
|
-
table.insert(stale_coordinator_ids, coordinator_id)
|
|
160
|
-
|
|
161
|
-
-- Collect all related keys for this stale coordinator
|
|
162
|
-
local coordinator_keys = collect_coordinator_keys(coordinator_id)
|
|
163
|
-
for _, key in ipairs(coordinator_keys) do
|
|
164
|
-
table.insert(keys_to_delete, key)
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
metrics.staleCoordinatorsFound = #stale_coordinator_ids
|
|
171
|
-
metrics.staleCoordinatorIds = stale_coordinator_ids
|
|
172
|
-
|
|
173
|
-
-- Step 4: Batch DEL all stale keys
|
|
174
|
-
if #keys_to_delete > 0 and DRY_RUN == 0 then
|
|
175
|
-
-- Redis DEL command accepts up to ~1M keys, but we'll batch in chunks of 10000 for safety
|
|
176
|
-
local batch_size = 10000
|
|
177
|
-
local deleted_count = 0
|
|
178
|
-
|
|
179
|
-
for i = 1, #keys_to_delete, batch_size do
|
|
180
|
-
local batch_end = math.min(i + batch_size - 1, #keys_to_delete)
|
|
181
|
-
local batch = {}
|
|
182
|
-
for j = i, batch_end do
|
|
183
|
-
table.insert(batch, keys_to_delete[j])
|
|
184
|
-
end
|
|
185
|
-
deleted_count = deleted_count + redis.call('DEL', unpack(batch))
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
metrics.keysDeleted = deleted_count
|
|
189
|
-
elseif DRY_RUN == 1 then
|
|
190
|
-
metrics.keysDeleted = #keys_to_delete -- Report what would be deleted
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
-- Calculate execution time
|
|
194
|
-
local end_time = redis.call('TIME')
|
|
195
|
-
local end_time_ms = tonumber(end_time[1]) * 1000 + math.floor(tonumber(end_time[2]) / 1000)
|
|
196
|
-
metrics.executionTimeMs = end_time_ms - start_time_ms
|
|
197
|
-
|
|
198
|
-
return cjson.encode(metrics)
|