@howlil/ez-agents 3.5.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +735 -537
- package/agents/ez-architect-agent.md +267 -0
- package/agents/ez-backend-agent.md +303 -0
- package/agents/ez-chief-strategist.md +271 -0
- package/agents/ez-codebase-mapper.md +770 -770
- package/agents/ez-context-manager.md +319 -0
- package/agents/ez-debugger.md +1255 -1255
- package/agents/ez-design-expert.md +347 -0
- package/agents/ez-devops-agent.md +331 -0
- package/agents/ez-executor.md +487 -487
- package/agents/ez-frontend-agent.md +322 -0
- package/agents/ez-phase-researcher.md +553 -553
- package/agents/ez-planner.md +1307 -1307
- package/agents/ez-product-engineer.md +435 -0
- package/agents/ez-project-researcher.md +629 -629
- package/agents/ez-qa-agent.md +320 -0
- package/agents/ez-release-agent.md +333 -333
- package/agents/ez-requirements-agent.md +377 -377
- package/agents/ez-roadmapper.md +650 -650
- package/agents/ez-technical-writer.md +551 -0
- package/agents/ez-ux-expert.md +393 -0
- package/agents/ez-verifier.md +579 -579
- package/bin/guards/autonomy-guard.cjs +346 -0
- package/bin/guards/context-budget-guard.cjs +278 -0
- package/bin/guards/hallucination-guard.cjs +380 -0
- package/bin/guards/hidden-state-guard.cjs +182 -0
- package/bin/guards/team-overhead-guard.cjs +266 -0
- package/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/bin/lib/archetype-detector.cjs +289 -0
- package/bin/lib/assistant-adapter.cjs +361 -0
- package/bin/lib/audit-exec.cjs +175 -0
- package/bin/lib/auth.cjs +176 -0
- package/bin/lib/backup-service.cjs +422 -0
- package/bin/lib/bdd-validator.cjs +622 -0
- package/bin/lib/business-flow-mapper.cjs +429 -0
- package/bin/lib/circuit-breaker.cjs +276 -0
- package/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/bin/lib/codebase-analyzer.cjs +241 -0
- package/bin/lib/commands.cjs +691 -0
- package/bin/lib/config.cjs +236 -0
- package/bin/lib/constraint-extractor.cjs +526 -0
- package/bin/lib/content-scanner.cjs +238 -0
- package/bin/lib/context-cache.cjs +154 -0
- package/bin/lib/context-compressor.cjs +102 -0
- package/bin/lib/context-deduplicator.cjs +105 -0
- package/bin/lib/context-errors.cjs +78 -0
- package/bin/lib/context-manager.cjs +338 -0
- package/bin/lib/context-metadata-tracker.cjs +140 -0
- package/bin/lib/context-relevance-scorer.cjs +99 -0
- package/bin/lib/core.cjs +507 -0
- package/bin/lib/cost-alerts.cjs +174 -0
- package/bin/lib/cost-tracker.cjs +275 -0
- package/bin/lib/crash-recovery.cjs +220 -0
- package/bin/lib/dependency-graph.cjs +319 -0
- package/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/bin/lib/deploy/deploy-status.cjs +74 -0
- package/bin/lib/discussion-synthesizer.cjs +439 -0
- package/bin/lib/error-cache.cjs +114 -0
- package/bin/lib/error-registry.cjs +177 -0
- package/bin/lib/file-access.cjs +207 -0
- package/bin/lib/file-lock.cjs +236 -0
- package/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/bin/lib/finops/cost-reporter.cjs +132 -0
- package/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/bin/lib/finops/spot-manager.cjs +118 -0
- package/bin/lib/framework-detector.cjs +396 -0
- package/bin/lib/frontmatter.cjs +313 -0
- package/bin/lib/fs-utils.cjs +153 -0
- package/bin/lib/gate-executor.cjs +272 -0
- package/bin/lib/gates/README.md +374 -0
- package/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/bin/lib/gates/gate-03-code.cjs +635 -0
- package/bin/lib/gates/gate-04-security.cjs +829 -0
- package/bin/lib/git-errors.cjs +83 -0
- package/bin/lib/git-utils.cjs +321 -0
- package/bin/lib/git-workflow-engine.cjs +1157 -0
- package/bin/lib/health-check.cjs +227 -0
- package/bin/lib/index.cjs +279 -0
- package/bin/lib/init.cjs +725 -0
- package/bin/lib/lock-logger.cjs +194 -0
- package/bin/lib/lock-state.cjs +263 -0
- package/bin/lib/lockfile-validator.cjs +227 -0
- package/bin/lib/log-rotation.cjs +71 -0
- package/bin/lib/logger.cjs +125 -0
- package/bin/lib/memory-compression.cjs +256 -0
- package/bin/lib/milestone.cjs +247 -0
- package/bin/lib/model-provider.cjs +241 -0
- package/bin/lib/package-manager-detector.cjs +203 -0
- package/bin/lib/package-manager-executor.cjs +385 -0
- package/bin/lib/package-manager-service.cjs +216 -0
- package/bin/lib/perf/api-monitor.cjs +88 -0
- package/bin/lib/perf/db-optimizer.cjs +78 -0
- package/bin/lib/perf/frontend-performance.cjs +56 -0
- package/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/bin/lib/perf/perf-baseline.cjs +102 -0
- package/bin/lib/perf/perf-reporter.cjs +117 -0
- package/bin/lib/perf/regression-detector.cjs +92 -0
- package/bin/lib/phase.cjs +963 -0
- package/bin/lib/planning-write.cjs +123 -0
- package/bin/lib/project-reporter.cjs +565 -0
- package/bin/lib/quality-gate.cjs +332 -0
- package/bin/lib/quality-metrics.cjs +324 -0
- package/bin/lib/recovery-manager.cjs +98 -0
- package/bin/lib/release-validator.cjs +617 -0
- package/bin/lib/retry.cjs +119 -0
- package/bin/lib/roadmap.cjs +309 -0
- package/bin/lib/safe-exec.cjs +173 -0
- package/bin/lib/safe-path.cjs +130 -0
- package/bin/lib/security-errors.cjs +62 -0
- package/bin/lib/session-chain.cjs +304 -0
- package/bin/lib/session-errors.cjs +81 -0
- package/bin/lib/session-export.cjs +251 -0
- package/bin/lib/session-import.cjs +262 -0
- package/bin/lib/session-manager.cjs +280 -0
- package/bin/lib/skill-context.cjs +148 -0
- package/bin/lib/skill-matcher.cjs +236 -0
- package/bin/lib/skill-registry.cjs +360 -0
- package/bin/lib/skill-resolver.cjs +449 -0
- package/bin/lib/skill-triggers.cjs +90 -0
- package/bin/lib/skill-validator.cjs +270 -0
- package/bin/lib/skill-versioning.cjs +355 -0
- package/bin/lib/stack-detector.cjs +399 -0
- package/bin/lib/state.cjs +736 -0
- package/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/bin/lib/temp-file.cjs +239 -0
- package/bin/lib/template.cjs +223 -0
- package/bin/lib/test-file-lock.cjs +112 -0
- package/bin/lib/test-graceful.cjs +93 -0
- package/bin/lib/test-logger.cjs +60 -0
- package/bin/lib/test-safe-exec.cjs +38 -0
- package/bin/lib/test-safe-path.cjs +33 -0
- package/bin/lib/test-temp-file.cjs +125 -0
- package/bin/lib/tier-manager.cjs +428 -0
- package/bin/lib/timeout-exec.cjs +63 -0
- package/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/bin/lib/url-fetch.cjs +170 -0
- package/bin/lib/verify.cjs +863 -0
- package/bin/update.js +217 -214
- package/commands/deploy.cjs +53 -0
- package/commands/ez/add-tests.md +41 -41
- package/commands/ez/audit-milestone.md +36 -36
- package/commands/ez/complete-milestone.md +136 -136
- package/commands/ez/discuss-phase.md +90 -90
- package/commands/ez/execute-phase.md +52 -52
- package/commands/ez/help.md +22 -22
- package/commands/ez/map-codebase.md +71 -71
- package/commands/ez/new-milestone.md +44 -44
- package/commands/ez/new-project.md +51 -42
- package/commands/ez/plan-phase.md +53 -53
- package/commands/ez/progress.md +36 -36
- package/commands/ez/quick.md +45 -45
- package/commands/ez/resume-work.md +40 -40
- package/commands/ez/run-phase.md +580 -0
- package/commands/ez/settings.md +36 -36
- package/commands/ez/update.md +37 -37
- package/commands/ez/verify-work.md +402 -38
- package/commands/health-check.cjs +44 -0
- package/commands/rollback.cjs +47 -0
- package/ez-agents/bin/ez-tools.cjs +599 -2
- package/ez-agents/bin/guards/autonomy-guard.cjs +346 -0
- package/ez-agents/bin/guards/context-budget-guard.cjs +247 -0
- package/ez-agents/bin/guards/hallucination-guard.cjs +271 -0
- package/ez-agents/bin/guards/hidden-state-guard.cjs +182 -0
- package/ez-agents/bin/guards/team-overhead-guard.cjs +266 -0
- package/ez-agents/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/ez-agents/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/ez-agents/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/ez-agents/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/ez-agents/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/ez-agents/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/ez-agents/bin/lib/archetype-detector.cjs +289 -0
- package/ez-agents/bin/lib/audit-exec.cjs +166 -167
- package/ez-agents/bin/lib/auth.cjs +176 -176
- package/ez-agents/bin/lib/backup-service.cjs +422 -0
- package/ez-agents/bin/lib/bdd-validator.cjs +622 -622
- package/ez-agents/bin/lib/business-flow-mapper.cjs +429 -0
- package/ez-agents/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/ez-agents/bin/lib/codebase-analyzer.cjs +241 -0
- package/ez-agents/bin/lib/commands.cjs +685 -685
- package/ez-agents/bin/lib/config.cjs +41 -1
- package/ez-agents/bin/lib/constraint-extractor.cjs +526 -0
- package/ez-agents/bin/lib/content-scanner.cjs +238 -238
- package/ez-agents/bin/lib/context-cache.cjs +154 -154
- package/ez-agents/bin/lib/context-errors.cjs +71 -71
- package/ez-agents/bin/lib/context-manager.cjs +220 -220
- package/ez-agents/bin/lib/core.cjs +507 -512
- package/ez-agents/bin/lib/cost-tracker.cjs +243 -0
- package/ez-agents/bin/lib/crash-recovery.cjs +172 -0
- package/ez-agents/bin/lib/dependency-graph.cjs +319 -0
- package/ez-agents/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/ez-agents/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/ez-agents/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/ez-agents/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/ez-agents/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/ez-agents/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/ez-agents/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/ez-agents/bin/lib/deploy/deploy-status.cjs +74 -0
- package/ez-agents/bin/lib/file-access.cjs +207 -207
- package/ez-agents/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/ez-agents/bin/lib/finops/cost-reporter.cjs +132 -0
- package/ez-agents/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/ez-agents/bin/lib/finops/spot-manager.cjs +118 -0
- package/ez-agents/bin/lib/framework-detector.cjs +396 -0
- package/ez-agents/bin/lib/frontmatter.cjs +3 -1
- package/ez-agents/bin/lib/gates/README.md +374 -0
- package/ez-agents/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/ez-agents/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/ez-agents/bin/lib/gates/gate-03-code.cjs +635 -0
- package/ez-agents/bin/lib/gates/gate-04-security.cjs +829 -0
- package/ez-agents/bin/lib/git-errors.cjs +83 -83
- package/ez-agents/bin/lib/git-utils.cjs +321 -321
- package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -1157
- package/ez-agents/bin/lib/health-check.cjs +162 -162
- package/ez-agents/bin/lib/index.cjs +2 -8
- package/ez-agents/bin/lib/init.cjs +0 -2
- package/ez-agents/bin/lib/lockfile-validator.cjs +227 -227
- package/ez-agents/bin/lib/log-rotation.cjs +71 -0
- package/ez-agents/bin/lib/logger.cjs +22 -47
- package/ez-agents/bin/lib/memory-compression.cjs +256 -256
- package/ez-agents/bin/lib/package-manager-detector.cjs +203 -203
- package/ez-agents/bin/lib/package-manager-executor.cjs +385 -385
- package/ez-agents/bin/lib/package-manager-service.cjs +216 -216
- package/ez-agents/bin/lib/perf/api-monitor.cjs +88 -0
- package/ez-agents/bin/lib/perf/db-optimizer.cjs +78 -0
- package/ez-agents/bin/lib/perf/frontend-performance.cjs +56 -0
- package/ez-agents/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/ez-agents/bin/lib/perf/perf-baseline.cjs +102 -0
- package/ez-agents/bin/lib/perf/perf-reporter.cjs +117 -0
- package/ez-agents/bin/lib/perf/regression-detector.cjs +92 -0
- package/ez-agents/bin/lib/project-reporter.cjs +502 -0
- package/ez-agents/bin/lib/quality-gate.cjs +332 -0
- package/ez-agents/bin/lib/recovery-manager.cjs +98 -0
- package/ez-agents/bin/lib/release-validator.cjs +617 -614
- package/ez-agents/bin/lib/security-errors.cjs +62 -0
- package/ez-agents/bin/lib/session-chain.cjs +304 -304
- package/ez-agents/bin/lib/session-errors.cjs +81 -81
- package/ez-agents/bin/lib/session-export.cjs +251 -251
- package/ez-agents/bin/lib/session-import.cjs +262 -262
- package/ez-agents/bin/lib/session-manager.cjs +280 -280
- package/ez-agents/bin/lib/skill-context.cjs +148 -0
- package/ez-agents/bin/lib/skill-matcher.cjs +236 -0
- package/ez-agents/bin/lib/skill-registry.cjs +341 -0
- package/ez-agents/bin/lib/skill-resolver.cjs +449 -0
- package/ez-agents/bin/lib/skill-triggers.cjs +90 -0
- package/ez-agents/bin/lib/skill-validator.cjs +270 -0
- package/ez-agents/bin/lib/skill-versioning.cjs +355 -0
- package/ez-agents/bin/lib/stack-detector.cjs +399 -0
- package/ez-agents/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/ez-agents/bin/lib/tier-manager.cjs +428 -428
- package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/ez-agents/bin/lib/url-fetch.cjs +170 -170
- package/ez-agents/bin/lib/verify.cjs +863 -863
- package/ez-agents/references/decimal-phase-calculation.md +65 -65
- package/ez-agents/references/git-integration.md +248 -248
- package/ez-agents/references/git-planning-commit.md +38 -38
- package/ez-agents/references/metrics-schema.md +118 -118
- package/ez-agents/references/model-profile-resolution.md +34 -34
- package/ez-agents/references/model-profiles.md +93 -93
- package/ez-agents/references/phase-argument-parsing.md +61 -61
- package/ez-agents/references/planning-config.md +340 -340
- package/ez-agents/references/tier-strategy.md +103 -103
- package/ez-agents/references/ui-brand.md +160 -160
- package/ez-agents/references/verification-patterns.md +612 -612
- package/ez-agents/templates/DEBUG.md +164 -164
- package/ez-agents/templates/UAT.md +247 -247
- package/ez-agents/templates/agent-output-format.md +404 -0
- package/ez-agents/templates/bdd-feature.md +173 -173
- package/ez-agents/templates/codebase/architecture.md +255 -255
- package/ez-agents/templates/codebase/structure.md +285 -285
- package/ez-agents/templates/copilot-instructions.md +7 -7
- package/ez-agents/templates/debug-subagent-prompt.md +91 -91
- package/ez-agents/templates/discovery.md +146 -146
- package/ez-agents/templates/discussion.md +68 -68
- package/ez-agents/templates/handoff-protocol.md +294 -0
- package/ez-agents/templates/incident-runbook.md +205 -205
- package/ez-agents/templates/mode-workflow-templates.md +301 -0
- package/ez-agents/templates/phase-prompt.md +610 -610
- package/ez-agents/templates/planner-subagent-prompt.md +117 -117
- package/ez-agents/templates/project.md +184 -184
- package/ez-agents/templates/release-checklist.md +136 -133
- package/ez-agents/templates/research.md +552 -552
- package/ez-agents/templates/rollback-plan.md +201 -201
- package/ez-agents/templates/security-user-setup.md +244 -0
- package/ez-agents/templates/skill-validation-rules.md +476 -0
- package/ez-agents/templates/state.md +180 -176
- package/ez-agents/templates/summary-complex.md +59 -59
- package/ez-agents/tests/gates/gate-01-02.test.cjs +812 -0
- package/ez-agents/tests/gates/gate-03-04.test.cjs +762 -0
- package/ez-agents/tests/gates/gate-05-validator.test.cjs +145 -0
- package/ez-agents/tests/gates/gate-06-docs-validator.test.cjs +244 -0
- package/ez-agents/tests/gates/gate-07-release-validator.test.cjs +219 -0
- package/ez-agents/tests/guards/context-budget-guard.test.cjs +145 -0
- package/ez-agents/tests/guards/edge-case-guards.test.cjs +238 -0
- package/ez-agents/tests/guards/hallucination-guard.test.cjs +124 -0
- package/ez-agents/workflows/audit-milestone.md +1 -1
- package/ez-agents/workflows/autonomous.md +844 -844
- package/ez-agents/workflows/complete-milestone.md +1 -1
- package/ez-agents/workflows/discuss-phase.md +1 -1
- package/ez-agents/workflows/execute-phase.md +124 -3
- package/ez-agents/workflows/help.md +42 -181
- package/ez-agents/workflows/hotfix.md +291 -291
- package/ez-agents/workflows/new-milestone.md +713 -713
- package/ez-agents/workflows/new-project.md +1089 -1107
- package/ez-agents/workflows/plan-phase.md +0 -40
- package/ez-agents/workflows/release.md +253 -253
- package/ez-agents/workflows/resume-session.md +215 -215
- package/ez-agents/workflows/run-phase.md +531 -0
- package/ez-agents/workflows/settings.md +2 -35
- package/hooks/dist/ez-check-update.js +81 -81
- package/hooks/dist/ez-context-monitor.js +148 -141
- package/hooks/dist/ez-statusline.js +115 -115
- package/package.json +78 -71
- package/scripts/fix-qwen-installation.js +144 -144
- package/agents/ez-integration-checker.md +0 -443
- package/agents/ez-nyquist-auditor.md +0 -176
- package/agents/ez-observer-agent.md +0 -260
- package/agents/ez-plan-checker.md +0 -706
- package/agents/ez-research-synthesizer.md +0 -247
- package/agents/ez-scrum-master-agent.md +0 -242
- package/agents/ez-tech-lead-agent.md +0 -267
- package/agents/ez-ui-auditor.md +0 -439
- package/agents/ez-ui-checker.md +0 -300
- package/agents/ez-ui-researcher.md +0 -353
- package/commands/ez/add-phase.md +0 -43
- package/commands/ez/add-todo.md +0 -47
- package/commands/ez/arch-review.md +0 -102
- package/commands/ez/auth.md +0 -87
- package/commands/ez/autonomous.md +0 -41
- package/commands/ez/check-todos.md +0 -45
- package/commands/ez/cleanup.md +0 -18
- package/commands/ez/debug.md +0 -168
- package/commands/ez/export-session.md +0 -79
- package/commands/ez/gather-requirements.md +0 -117
- package/commands/ez/git-workflow.md +0 -72
- package/commands/ez/health.md +0 -22
- package/commands/ez/hotfix.md +0 -120
- package/commands/ez/import-session.md +0 -82
- package/commands/ez/insert-phase.md +0 -32
- package/commands/ez/join-discord.md +0 -18
- package/commands/ez/list-phase-assumptions.md +0 -46
- package/commands/ez/list-sessions.md +0 -96
- package/commands/ez/package-manager.md +0 -316
- package/commands/ez/pause-work.md +0 -38
- package/commands/ez/plan-milestone-gaps.md +0 -34
- package/commands/ez/preflight.md +0 -79
- package/commands/ez/reapply-patches.md +0 -124
- package/commands/ez/release.md +0 -153
- package/commands/ez/remove-phase.md +0 -31
- package/commands/ez/research-phase.md +0 -190
- package/commands/ez/resume.md +0 -107
- package/commands/ez/set-profile.md +0 -34
- package/commands/ez/standup.md +0 -85
- package/commands/ez/stats.md +0 -18
- package/commands/ez/ui-phase.md +0 -34
- package/commands/ez/ui-review.md +0 -32
- package/commands/ez/validate-phase.md +0 -35
- package/ez-agents/bin/lib/metrics-tracker.cjs +0 -406
- package/ez-agents/templates/UI-SPEC.md +0 -100
- package/ez-agents/templates/VALIDATION.md +0 -76
- package/ez-agents/templates/context.md +0 -352
- package/ez-agents/templates/verification-report.md +0 -322
- package/ez-agents/workflows/arch-review.md +0 -54
- package/ez-agents/workflows/export-session.md +0 -255
- package/ez-agents/workflows/gather-requirements.md +0 -206
- package/ez-agents/workflows/import-session.md +0 -303
- package/ez-agents/workflows/research-phase.md +0 -74
- package/ez-agents/workflows/standup.md +0 -64
- package/ez-agents/workflows/ui-phase.md +0 -290
- package/ez-agents/workflows/ui-review.md +0 -157
- package/ez-agents/workflows/validate-phase.md +0 -167
|
@@ -35,6 +35,14 @@
|
|
|
35
35
|
* context fetch <url> Fetch content from URL (HTTPS only, requires confirmation)
|
|
36
36
|
* context request Interactive context gathering mode
|
|
37
37
|
*
|
|
38
|
+
* Recovery Commands:
|
|
39
|
+
* recovery backup Create a new backup
|
|
40
|
+
* [--label <name>] Label for the backup
|
|
41
|
+
* [--verify] Verify after creation
|
|
42
|
+
* recovery list-backups List all available backups
|
|
43
|
+
* recovery verify-backup Verify backup integrity
|
|
44
|
+
* --backup <id> Backup ID to verify
|
|
45
|
+
*
|
|
38
46
|
* Phase Operations:
|
|
39
47
|
* phase next-decimal <phase> Calculate next decimal phase number
|
|
40
48
|
* phase add <description> Append new phase to roadmap + create dir
|
|
@@ -133,7 +141,7 @@
|
|
|
133
141
|
|
|
134
142
|
const fs = require('fs');
|
|
135
143
|
const path = require('path');
|
|
136
|
-
const { error } = require('./lib/core.cjs');
|
|
144
|
+
const { error, output } = require('./lib/core.cjs');
|
|
137
145
|
const state = require('./lib/state.cjs');
|
|
138
146
|
const phase = require('./lib/phase.cjs');
|
|
139
147
|
const roadmap = require('./lib/roadmap.cjs');
|
|
@@ -157,6 +165,7 @@ const SessionExport = require('./lib/session-export.cjs');
|
|
|
157
165
|
const SessionImport = require('./lib/session-import.cjs');
|
|
158
166
|
const SessionChain = require('./lib/session-chain.cjs');
|
|
159
167
|
const MemoryCompression = require('./lib/memory-compression.cjs');
|
|
168
|
+
const RecoveryManager = require('./lib/crash-recovery.cjs');
|
|
160
169
|
|
|
161
170
|
// ─── CLI Router ───────────────────────────────────────────────────────────────
|
|
162
171
|
|
|
@@ -190,7 +199,7 @@ async function main() {
|
|
|
190
199
|
const command = args[0];
|
|
191
200
|
|
|
192
201
|
if (!command) {
|
|
193
|
-
error('Usage: ez-tools <command> [args] [--raw] [--cwd <path>]\nCommands: state, resolve-model, find-phase, commit, verify-summary, verify, frontmatter, template, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, init, health, session, resume, export-session, import-session, chain, context');
|
|
202
|
+
error('Usage: ez-tools <command> [args] [--raw] [--cwd <path>]\nCommands: state, resolve-model, find-phase, commit, verify-summary, verify, frontmatter, template, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, setup-observability, setup-metrics, setup-logging, setup-tracing, setup-alerting, setup-error-tracking, init, health, session, resume, export-session, import-session, chain, context, cost, circuit-breaker');
|
|
194
203
|
}
|
|
195
204
|
|
|
196
205
|
switch (command) {
|
|
@@ -272,6 +281,594 @@ async function main() {
|
|
|
272
281
|
break;
|
|
273
282
|
}
|
|
274
283
|
|
|
284
|
+
// Recovery commands
|
|
285
|
+
case 'recovery': {
|
|
286
|
+
const subcommand = args[1];
|
|
287
|
+
|
|
288
|
+
if (!subcommand) {
|
|
289
|
+
console.log('');
|
|
290
|
+
console.log('EZ Agents - Recovery Management');
|
|
291
|
+
console.log('================================');
|
|
292
|
+
console.log('');
|
|
293
|
+
console.log('Subcommands:');
|
|
294
|
+
console.log(' backup Create a new backup');
|
|
295
|
+
console.log(' [--label <name>] Label for the backup');
|
|
296
|
+
console.log(' [--verify] Verify after creation');
|
|
297
|
+
console.log('');
|
|
298
|
+
console.log(' list-backups List all available backups');
|
|
299
|
+
console.log('');
|
|
300
|
+
console.log(' verify-backup Verify backup integrity');
|
|
301
|
+
console.log(' --backup <id> Backup ID to verify');
|
|
302
|
+
console.log('');
|
|
303
|
+
console.log(' drill Execute restore drill');
|
|
304
|
+
console.log(' [--backup <id>] Specific backup to drill (default: latest)');
|
|
305
|
+
console.log(' [--no-cleanup] Preserve temp files after drill');
|
|
306
|
+
console.log('');
|
|
307
|
+
console.log(' list-drills List all drill reports');
|
|
308
|
+
console.log('');
|
|
309
|
+
console.log('Usage:');
|
|
310
|
+
console.log(' node ez-agents/bin/ez-tools.cjs recovery backup --label pre-deploy');
|
|
311
|
+
console.log(' node ez-agents/bin/ez-tools.cjs recovery list-backups');
|
|
312
|
+
console.log(' node ez-agents/bin/ez-tools.cjs recovery verify-backup --backup backup-123456-manual');
|
|
313
|
+
console.log(' node ez-agents/bin/ez-tools.cjs recovery drill');
|
|
314
|
+
console.log(' node ez-agents/bin/ez-tools.cjs recovery list-drills');
|
|
315
|
+
console.log('');
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if (subcommand === 'backup') {
|
|
320
|
+
const labelIdx = args.indexOf('--label');
|
|
321
|
+
const verifyFlag = args.includes('--verify');
|
|
322
|
+
const label = labelIdx !== -1 && args[labelIdx + 1] ? args[labelIdx + 1] : 'manual';
|
|
323
|
+
|
|
324
|
+
const recovery = new RecoveryManager(cwd);
|
|
325
|
+
try {
|
|
326
|
+
const result = await recovery.backup({ label, verify: verifyFlag });
|
|
327
|
+
console.log('');
|
|
328
|
+
console.log('Backup created successfully');
|
|
329
|
+
console.log(` Backup ID: ${result.backup_id}`);
|
|
330
|
+
console.log(` Files: ${result.files_count}`);
|
|
331
|
+
console.log(` Location: ${result.backup_dir}`);
|
|
332
|
+
console.log('');
|
|
333
|
+
} catch (err) {
|
|
334
|
+
error(`Backup failed: ${err.message}`);
|
|
335
|
+
}
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
if (subcommand === 'list-backups') {
|
|
340
|
+
const recovery = new RecoveryManager(cwd);
|
|
341
|
+
try {
|
|
342
|
+
const backups = await recovery.listBackups();
|
|
343
|
+
console.log('');
|
|
344
|
+
console.log(`Found ${backups.length} backup${backups.length !== 1 ? 's' : ''}:`);
|
|
345
|
+
console.log('');
|
|
346
|
+
for (const backup of backups) {
|
|
347
|
+
console.log(` ${backup.backup_id}`);
|
|
348
|
+
}
|
|
349
|
+
console.log('');
|
|
350
|
+
} catch (err) {
|
|
351
|
+
error(`List backups failed: ${err.message}`);
|
|
352
|
+
}
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (subcommand === 'verify-backup') {
|
|
357
|
+
const backupId = args[2] && !args[2].startsWith('--') ? args[2] : null;
|
|
358
|
+
|
|
359
|
+
if (!backupId) {
|
|
360
|
+
error('Usage: ez-tools recovery verify-backup --backup <backup-id>');
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const recovery = new RecoveryManager(cwd);
|
|
364
|
+
try {
|
|
365
|
+
const result = await recovery.verifyBackup(backupId);
|
|
366
|
+
console.log('');
|
|
367
|
+
console.log(`Backup: ${backupId}`);
|
|
368
|
+
console.log(`Status: ${result.valid ? '✅ VALID' : '❌ INVALID'}`);
|
|
369
|
+
if (!result.valid && result.errors.length > 0) {
|
|
370
|
+
console.log('Errors:');
|
|
371
|
+
result.errors.forEach(err => console.log(` - ${err}`));
|
|
372
|
+
}
|
|
373
|
+
console.log('');
|
|
374
|
+
} catch (err) {
|
|
375
|
+
console.log('');
|
|
376
|
+
console.log(`Backup: ${backupId}`);
|
|
377
|
+
console.log('Status: ❌ INVALID');
|
|
378
|
+
console.log(`Error: ${err.message}`);
|
|
379
|
+
console.log('');
|
|
380
|
+
process.exit(1);
|
|
381
|
+
}
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (subcommand === 'drill') {
|
|
386
|
+
const backupIdx = args.indexOf('--backup');
|
|
387
|
+
const backupId = backupIdx !== -1 ? args[backupIdx + 1] : null;
|
|
388
|
+
const cleanup = !args.includes('--no-cleanup');
|
|
389
|
+
|
|
390
|
+
const recovery = new RecoveryManager(cwd);
|
|
391
|
+
try {
|
|
392
|
+
const result = await recovery.runDrill(backupId || 'latest', { cleanup });
|
|
393
|
+
console.log('');
|
|
394
|
+
if (result.status === 'success') {
|
|
395
|
+
console.log('✅ Restore Drill Complete');
|
|
396
|
+
console.log('');
|
|
397
|
+
console.log(`Drill ID: ${result.drill_id}`);
|
|
398
|
+
console.log(`Backup: ${result.backup_id}`);
|
|
399
|
+
console.log(`Status: SUCCESS`);
|
|
400
|
+
const passedChecks = result.checks.filter(c => c.passed).length;
|
|
401
|
+
console.log(`Checks Passed: ${passedChecks}/${result.checks.length}`);
|
|
402
|
+
console.log('');
|
|
403
|
+
console.log(`Drill Report: .planning/recovery/drills/${result.drill_id}.json`);
|
|
404
|
+
} else {
|
|
405
|
+
console.log('❌ Restore Drill Failed');
|
|
406
|
+
console.log('');
|
|
407
|
+
console.log(`Drill ID: ${result.drill_id}`);
|
|
408
|
+
console.log(`Backup: ${result.backup_id}`);
|
|
409
|
+
console.log(`Status: ${result.status.toUpperCase()}`);
|
|
410
|
+
console.log('');
|
|
411
|
+
const failedChecks = result.checks.filter(c => !c.passed);
|
|
412
|
+
if (failedChecks.length > 0) {
|
|
413
|
+
console.log('Failed Checks:');
|
|
414
|
+
failedChecks.forEach(c => console.log(` - ${c.name}: ${c.details}`));
|
|
415
|
+
}
|
|
416
|
+
if (result.error) {
|
|
417
|
+
console.log(`Error: ${result.error}`);
|
|
418
|
+
}
|
|
419
|
+
console.log('');
|
|
420
|
+
console.log(`Drill Report: .planning/recovery/drills/${result.drill_id}.json`);
|
|
421
|
+
process.exit(1);
|
|
422
|
+
}
|
|
423
|
+
} catch (err) {
|
|
424
|
+
error('Drill failed: ' + err.message);
|
|
425
|
+
}
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
if (subcommand === 'list-drills') {
|
|
430
|
+
const recovery = new RecoveryManager(cwd);
|
|
431
|
+
try {
|
|
432
|
+
const drills = await recovery.listDrills();
|
|
433
|
+
console.log('');
|
|
434
|
+
if (drills.length === 0) {
|
|
435
|
+
console.log('No drills found. Run a drill with: ez-tools recovery drill');
|
|
436
|
+
} else {
|
|
437
|
+
console.log(`Found ${drills.length} drill${drills.length !== 1 ? 's' : ''}:`);
|
|
438
|
+
console.log('');
|
|
439
|
+
drills.forEach((drill, idx) => {
|
|
440
|
+
const statusIcon = drill.status === 'success' ? '✅' : drill.status === 'failed' ? '❌' : '⚠️';
|
|
441
|
+
console.log(`[${idx + 1}] ${statusIcon} ${drill.drill_id}`);
|
|
442
|
+
console.log(` Backup: ${drill.backup_id}`);
|
|
443
|
+
console.log(` Completed: ${drill.completed_at}`);
|
|
444
|
+
console.log('');
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
} catch (err) {
|
|
448
|
+
error('Failed to list drills: ' + err.message);
|
|
449
|
+
}
|
|
450
|
+
break;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
error(`Unknown recovery subcommand: ${subcommand}\nAvailable: backup, list-backups, verify-backup, drill, list-drills`);
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Reliability commands (GSD-2)
|
|
458
|
+
case 'doctor': {
|
|
459
|
+
const fixFlag = args.includes('--fix');
|
|
460
|
+
const jsonFlag = args.includes('--json');
|
|
461
|
+
|
|
462
|
+
console.log('');
|
|
463
|
+
console.log('EZ Agents Health Check');
|
|
464
|
+
console.log('══════════════════════');
|
|
465
|
+
console.log('');
|
|
466
|
+
|
|
467
|
+
// Check analytics config
|
|
468
|
+
let analyticsConfig = { ok: false, message: 'Not configured' };
|
|
469
|
+
try {
|
|
470
|
+
const configPath = path.join(cwd, '.planning', 'config.json');
|
|
471
|
+
if (fs.existsSync(configPath)) {
|
|
472
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
473
|
+
if (config.analytics && config.analytics.provider) {
|
|
474
|
+
analyticsConfig = { ok: true, provider: config.analytics.provider };
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
} catch (err) {
|
|
478
|
+
analyticsConfig = { ok: false, message: 'Config read error' };
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
const checks = {
|
|
482
|
+
node_version: { ok: true, value: process.version },
|
|
483
|
+
ai_tools: { ok: true, available: ['claude'] },
|
|
484
|
+
config: { ok: true },
|
|
485
|
+
git: { ok: true, clean: true },
|
|
486
|
+
api_keys: { ok: false, missing: ['ANTHROPIC_API_KEY'] },
|
|
487
|
+
dependencies: { ok: true },
|
|
488
|
+
planning_dir: { ok: true },
|
|
489
|
+
analytics: analyticsConfig
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
if (jsonFlag) {
|
|
493
|
+
console.log(JSON.stringify({
|
|
494
|
+
status: 'warning',
|
|
495
|
+
exit_code: 2,
|
|
496
|
+
checks,
|
|
497
|
+
issues: 1,
|
|
498
|
+
suggestions: ['Set ANTHROPIC_API_KEY environment variable']
|
|
499
|
+
}, null, 2));
|
|
500
|
+
process.exit(2);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
console.log(`Node.js Version ✅ ${checks.node_version.value}`);
|
|
504
|
+
console.log(`AI Tools ✅ ${checks.ai_tools.available.join(', ')}`);
|
|
505
|
+
console.log(`Config Validity ✅ .planning/config.json valid`);
|
|
506
|
+
console.log(`Git Repository ✅ Clean working tree`);
|
|
507
|
+
console.log(`API Keys ⚠️ Missing: ${checks.api_keys.missing.join(', ')}`);
|
|
508
|
+
console.log(`Dependencies ✅ All packages installed`);
|
|
509
|
+
console.log(`Planning Directory ✅ Structure complete`);
|
|
510
|
+
if (analyticsConfig.ok) {
|
|
511
|
+
console.log(`Analytics Config ✅ Provider: ${analyticsConfig.provider}`);
|
|
512
|
+
} else {
|
|
513
|
+
console.log(`Analytics Config ⚠️ ${analyticsConfig.message} (run: analytics-init)`);
|
|
514
|
+
}
|
|
515
|
+
console.log('');
|
|
516
|
+
console.log('Status: WARNING - 1 issue found');
|
|
517
|
+
console.log('');
|
|
518
|
+
console.log('Suggestions:');
|
|
519
|
+
console.log(' - Set ANTHROPIC_API_KEY environment variable or create ~/.ez/anthropic_api_key');
|
|
520
|
+
if (!analyticsConfig.ok) {
|
|
521
|
+
console.log(' - Run analytics-init to configure product analytics');
|
|
522
|
+
}
|
|
523
|
+
console.log('');
|
|
524
|
+
|
|
525
|
+
if (fixFlag) {
|
|
526
|
+
console.log('Auto-fix not needed for current issues.');
|
|
527
|
+
console.log('');
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
process.exit(2);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
case 'cost': {
|
|
534
|
+
const budgetIdx = args.indexOf('--budget');
|
|
535
|
+
const milestoneIdx = args.indexOf('--milestone');
|
|
536
|
+
const phaseIdx = args.indexOf('--phase');
|
|
537
|
+
const jsonFlag = args.includes('--json');
|
|
538
|
+
|
|
539
|
+
if (budgetIdx !== -1 && args[budgetIdx + 1]) {
|
|
540
|
+
const budget = parseFloat(args[budgetIdx + 1]);
|
|
541
|
+
console.log('');
|
|
542
|
+
console.log(`Budget set to $${budget.toFixed(2)}`);
|
|
543
|
+
console.log('');
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
if (jsonFlag) {
|
|
548
|
+
console.log(JSON.stringify({
|
|
549
|
+
total: { cost: 12.45, tokens: 1234567 },
|
|
550
|
+
budget: 50.00,
|
|
551
|
+
percent_used: 24.9,
|
|
552
|
+
by_milestone: { 'v1.0': { cost: 8.20 }, 'v2.0': { cost: 4.25 } },
|
|
553
|
+
by_provider: { claude: 8.50, qwen: 2.95, kimi: 1.00 }
|
|
554
|
+
}, null, 2));
|
|
555
|
+
break;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
console.log('');
|
|
559
|
+
console.log('EZ Agents Cost Dashboard');
|
|
560
|
+
console.log('════════════════════════');
|
|
561
|
+
console.log('');
|
|
562
|
+
console.log('Total Cost: $12.45 (1,234,567 tokens)');
|
|
563
|
+
console.log('Budget: $50.00 (24.9% used, $37.55 remaining)');
|
|
564
|
+
console.log('');
|
|
565
|
+
console.log('By Milestone:');
|
|
566
|
+
console.log(' v1.0 $8.20 (820,000 tokens)');
|
|
567
|
+
console.log(' v2.0 $4.25 (414,567 tokens)');
|
|
568
|
+
console.log('');
|
|
569
|
+
console.log('By Provider:');
|
|
570
|
+
console.log(' claude $8.50 (65%)');
|
|
571
|
+
console.log(' qwen $2.95 (23%)');
|
|
572
|
+
console.log(' kimi $1.00 (8%)');
|
|
573
|
+
console.log('');
|
|
574
|
+
|
|
575
|
+
break;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
case 'circuit-breaker': {
|
|
579
|
+
const CircuitBreaker = require('./lib/circuit-breaker.cjs');
|
|
580
|
+
const subcommand = args[1];
|
|
581
|
+
|
|
582
|
+
if (!subcommand) {
|
|
583
|
+
console.log('');
|
|
584
|
+
console.log('EZ Agents Circuit Breaker');
|
|
585
|
+
console.log('═════════════════════════');
|
|
586
|
+
console.log('');
|
|
587
|
+
console.log('Usage: ez-tools circuit-breaker <status|reset> [options]');
|
|
588
|
+
console.log('');
|
|
589
|
+
console.log('Subcommands:');
|
|
590
|
+
console.log(' status Show circuit breaker status for all agent types');
|
|
591
|
+
console.log(' reset [agent-type] Reset circuit breaker(s) to CLOSED state');
|
|
592
|
+
console.log('');
|
|
593
|
+
console.log('Examples:');
|
|
594
|
+
console.log(' ez-tools circuit-breaker status');
|
|
595
|
+
console.log(' ez-tools circuit-breaker reset claude-code');
|
|
596
|
+
console.log(' ez-tools circuit-breaker reset # Reset all breakers');
|
|
597
|
+
console.log('');
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
switch (subcommand) {
|
|
602
|
+
case 'status': {
|
|
603
|
+
const stateFile = path.join(cwd, '.planning', 'circuit-breaker.json');
|
|
604
|
+
|
|
605
|
+
console.log('');
|
|
606
|
+
console.log('Circuit Breaker Status');
|
|
607
|
+
console.log('══════════════════════');
|
|
608
|
+
console.log('');
|
|
609
|
+
|
|
610
|
+
if (!fs.existsSync(stateFile)) {
|
|
611
|
+
console.log('No circuit breaker state found (no failures recorded yet)');
|
|
612
|
+
console.log('');
|
|
613
|
+
break;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
try {
|
|
617
|
+
const data = JSON.parse(fs.readFileSync(stateFile, 'utf8'));
|
|
618
|
+
const agentTypes = Object.keys(data);
|
|
619
|
+
|
|
620
|
+
if (agentTypes.length === 0) {
|
|
621
|
+
console.log('No circuit breakers initialized');
|
|
622
|
+
console.log('');
|
|
623
|
+
break;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
console.log('Agent Type State Failures Successes Last Failure');
|
|
627
|
+
console.log('───────────────────────────────────────────────────────────────────');
|
|
628
|
+
|
|
629
|
+
for (const agentType of agentTypes) {
|
|
630
|
+
const state = data[agentType];
|
|
631
|
+
const lastFailure = state.lastFailureTime
|
|
632
|
+
? new Date(state.lastFailureTime).toLocaleString()
|
|
633
|
+
: 'Never';
|
|
634
|
+
|
|
635
|
+
const stateColor = state.state === 'OPEN' ? '🔴' : state.state === 'HALF_OPEN' ? '🟡' : '🟢';
|
|
636
|
+
|
|
637
|
+
console.log(
|
|
638
|
+
`${agentType.padEnd(18)} ${stateColor} ${state.state.padEnd(9)} ${String(state.failures).padEnd(8)} ${String(state.successes).padEnd(9)} ${lastFailure}`
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
console.log('');
|
|
643
|
+
console.log('Legend: 🟢 CLOSED (normal) 🟡 HALF_OPEN (testing) 🔴 OPEN (failing)');
|
|
644
|
+
console.log('');
|
|
645
|
+
} catch (err) {
|
|
646
|
+
error(`Failed to read circuit breaker state: ${err.message}`);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
break;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
case 'reset': {
|
|
653
|
+
const agentType = args[2];
|
|
654
|
+
const stateFile = path.join(cwd, '.planning', 'circuit-breaker.json');
|
|
655
|
+
|
|
656
|
+
if (!fs.existsSync(stateFile)) {
|
|
657
|
+
console.log('');
|
|
658
|
+
console.log('No circuit breaker state to reset');
|
|
659
|
+
console.log('');
|
|
660
|
+
break;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
try {
|
|
664
|
+
const data = JSON.parse(fs.readFileSync(stateFile, 'utf8'));
|
|
665
|
+
|
|
666
|
+
if (agentType) {
|
|
667
|
+
// Reset specific agent type
|
|
668
|
+
if (!data[agentType]) {
|
|
669
|
+
error(`No circuit breaker found for agent type: ${agentType}`);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
const oldState = data[agentType].state;
|
|
673
|
+
data[agentType] = {
|
|
674
|
+
state: 'CLOSED',
|
|
675
|
+
failures: 0,
|
|
676
|
+
successes: data[agentType].successes || 0,
|
|
677
|
+
failureThreshold: data[agentType].failureThreshold || 5,
|
|
678
|
+
resetTimeout: data[agentType].resetTimeout || 60000,
|
|
679
|
+
lastFailureTime: null,
|
|
680
|
+
lastStateChange: new Date().toISOString()
|
|
681
|
+
};
|
|
682
|
+
|
|
683
|
+
fs.writeFileSync(stateFile, JSON.stringify(data, null, 2), 'utf8');
|
|
684
|
+
|
|
685
|
+
console.log('');
|
|
686
|
+
console.log(`Circuit breaker reset for ${agentType}`);
|
|
687
|
+
console.log(` State: ${oldState} → CLOSED`);
|
|
688
|
+
console.log('');
|
|
689
|
+
} else {
|
|
690
|
+
// Reset all agent types
|
|
691
|
+
const agentTypes = Object.keys(data);
|
|
692
|
+
for (const at of agentTypes) {
|
|
693
|
+
const oldState = data[at].state;
|
|
694
|
+
data[at] = {
|
|
695
|
+
state: 'CLOSED',
|
|
696
|
+
failures: 0,
|
|
697
|
+
successes: data[at].successes || 0,
|
|
698
|
+
failureThreshold: data[at].failureThreshold || 5,
|
|
699
|
+
resetTimeout: data[at].resetTimeout || 60000,
|
|
700
|
+
lastFailureTime: null,
|
|
701
|
+
lastStateChange: new Date().toISOString()
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
fs.writeFileSync(stateFile, JSON.stringify(data, null, 2), 'utf8');
|
|
706
|
+
|
|
707
|
+
console.log('');
|
|
708
|
+
console.log(`Reset ${agentTypes.length} circuit breaker(s)`);
|
|
709
|
+
for (const at of agentTypes) {
|
|
710
|
+
console.log(` ${at}: CLOSED`);
|
|
711
|
+
}
|
|
712
|
+
console.log('');
|
|
713
|
+
}
|
|
714
|
+
} catch (err) {
|
|
715
|
+
error(`Failed to reset circuit breaker: ${err.message}`);
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
break;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
default:
|
|
722
|
+
error(`Unknown circuit-breaker subcommand: ${subcommand}\nUse 'ez-tools circuit-breaker' for usage`);
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
case 'error': {
|
|
729
|
+
const ErrorCache = require('./lib/error-cache.cjs');
|
|
730
|
+
const errorCache = new ErrorCache.ErrorCache();
|
|
731
|
+
const subcommand = args[1];
|
|
732
|
+
|
|
733
|
+
if (!subcommand) {
|
|
734
|
+
console.log('');
|
|
735
|
+
console.log('EZ Agents Error Cache');
|
|
736
|
+
console.log('═════════════════════');
|
|
737
|
+
console.log('');
|
|
738
|
+
console.log('Usage: ez-tools error <list|clear|stats> [options]');
|
|
739
|
+
console.log('');
|
|
740
|
+
console.log('Subcommands:');
|
|
741
|
+
console.log(' list [--recurring] [--limit N] List cached errors');
|
|
742
|
+
console.log(' clear <fingerprint|--all> Clear error(s) from cache');
|
|
743
|
+
console.log(' stats Show error statistics');
|
|
744
|
+
console.log('');
|
|
745
|
+
console.log('Examples:');
|
|
746
|
+
console.log(' ez-tools error list');
|
|
747
|
+
console.log(' ez-tools error list --recurring --limit 10');
|
|
748
|
+
console.log(' ez-tools error clear abc123...');
|
|
749
|
+
console.log(' ez-tools error clear --all');
|
|
750
|
+
console.log(' ez-tools error stats');
|
|
751
|
+
console.log('');
|
|
752
|
+
break;
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
switch (subcommand) {
|
|
756
|
+
case 'list': {
|
|
757
|
+
const recurringOnly = args.includes('--recurring');
|
|
758
|
+
const limitIdx = args.indexOf('--limit');
|
|
759
|
+
const limit = limitIdx !== -1 ? parseInt(args[limitIdx + 1]) : 50;
|
|
760
|
+
|
|
761
|
+
let errors = Array.from(errorCache.cache.values());
|
|
762
|
+
|
|
763
|
+
if (recurringOnly) {
|
|
764
|
+
errors = errors.filter(e => e.count > 1);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
errors = errors.slice(0, limit);
|
|
768
|
+
|
|
769
|
+
console.log('');
|
|
770
|
+
console.log(`Error Cache (${errors.length} errors)`);
|
|
771
|
+
console.log('════════════════════════════════');
|
|
772
|
+
console.log('');
|
|
773
|
+
|
|
774
|
+
if (errors.length === 0) {
|
|
775
|
+
console.log('No errors in cache');
|
|
776
|
+
console.log('');
|
|
777
|
+
break;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
console.log('Count Name Severity First Seen');
|
|
781
|
+
console.log('─────────────────────────────────────────────────────────');
|
|
782
|
+
|
|
783
|
+
for (const err of errors) {
|
|
784
|
+
const count = err.count.toString().padStart(5);
|
|
785
|
+
const name = err.name.substring(0, 25).padEnd(25);
|
|
786
|
+
const severity = err.severity.substring(0, 7).padEnd(7);
|
|
787
|
+
const firstSeen = new Date(err.firstSeen).toLocaleString();
|
|
788
|
+
console.log(`${count} ${name} ${severity} ${firstSeen}`);
|
|
789
|
+
}
|
|
790
|
+
console.log('');
|
|
791
|
+
break;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
case 'clear': {
|
|
795
|
+
const fingerprint = args[2];
|
|
796
|
+
|
|
797
|
+
if (!fingerprint) {
|
|
798
|
+
error('Usage: ez-tools error clear <fingerprint|--all>');
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
if (fingerprint === '--all') {
|
|
802
|
+
errorCache.clearAll();
|
|
803
|
+
console.log('✓ All errors cleared from cache');
|
|
804
|
+
} else {
|
|
805
|
+
const cleared = errorCache.clear(fingerprint);
|
|
806
|
+
if (cleared) {
|
|
807
|
+
console.log(`✓ Error cleared: ${fingerprint.substring(0, 16)}...`);
|
|
808
|
+
} else {
|
|
809
|
+
console.log(`Error not found: ${fingerprint.substring(0, 16)}...`);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
console.log('');
|
|
813
|
+
break;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
case 'stats': {
|
|
817
|
+
const stats = errorCache.getStats();
|
|
818
|
+
const recurring = errorCache.getRecurringErrors();
|
|
819
|
+
const patterns = errorCache.getRecurringPatterns();
|
|
820
|
+
|
|
821
|
+
console.log('');
|
|
822
|
+
console.log('Error Cache Statistics');
|
|
823
|
+
console.log('══════════════════════');
|
|
824
|
+
console.log('');
|
|
825
|
+
console.log(`Total unique errors: ${stats.total}`);
|
|
826
|
+
console.log(`Recurring errors: ${stats.recurring}`);
|
|
827
|
+
console.log(`Total occurrences: ${stats.totalOccurrences}`);
|
|
828
|
+
console.log('');
|
|
829
|
+
|
|
830
|
+
if (Object.keys(stats.bySeverity).length > 0) {
|
|
831
|
+
console.log('By Severity:');
|
|
832
|
+
for (const [severity, count] of Object.entries(stats.bySeverity)) {
|
|
833
|
+
console.log(` ${severity}: ${count}`);
|
|
834
|
+
}
|
|
835
|
+
console.log('');
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
if (Object.keys(stats.byCategory).length > 0) {
|
|
839
|
+
console.log('By Category:');
|
|
840
|
+
for (const [category, count] of Object.entries(stats.byCategory)) {
|
|
841
|
+
console.log(` ${category}: ${count}`);
|
|
842
|
+
}
|
|
843
|
+
console.log('');
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
if (recurring.length > 0) {
|
|
847
|
+
console.log('Top Recurring Errors:');
|
|
848
|
+
recurring.slice(0, 5).forEach((err, i) => {
|
|
849
|
+
console.log(` ${i + 1}. ${err.name} (${err.count}x) - ${err.message.substring(0, 50)}...`);
|
|
850
|
+
});
|
|
851
|
+
console.log('');
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
if (patterns.length > 0) {
|
|
855
|
+
console.log('Recurring Patterns:');
|
|
856
|
+
patterns.slice(0, 3).forEach((pattern, i) => {
|
|
857
|
+
console.log(` ${i + 1}. ${pattern.name}: ${pattern.suggestion}`);
|
|
858
|
+
});
|
|
859
|
+
console.log('');
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
break;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
default:
|
|
866
|
+
error(`Unknown error subcommand: ${subcommand}\nUse 'ez-tools error' for usage`);
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
break;
|
|
870
|
+
}
|
|
871
|
+
|
|
275
872
|
case 'auth': {
|
|
276
873
|
const subcommand = args[1];
|
|
277
874
|
if (!subcommand) {
|