@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.
Files changed (382) hide show
  1. package/README.md +735 -537
  2. package/agents/ez-architect-agent.md +267 -0
  3. package/agents/ez-backend-agent.md +303 -0
  4. package/agents/ez-chief-strategist.md +271 -0
  5. package/agents/ez-codebase-mapper.md +770 -770
  6. package/agents/ez-context-manager.md +319 -0
  7. package/agents/ez-debugger.md +1255 -1255
  8. package/agents/ez-design-expert.md +347 -0
  9. package/agents/ez-devops-agent.md +331 -0
  10. package/agents/ez-executor.md +487 -487
  11. package/agents/ez-frontend-agent.md +322 -0
  12. package/agents/ez-phase-researcher.md +553 -553
  13. package/agents/ez-planner.md +1307 -1307
  14. package/agents/ez-product-engineer.md +435 -0
  15. package/agents/ez-project-researcher.md +629 -629
  16. package/agents/ez-qa-agent.md +320 -0
  17. package/agents/ez-release-agent.md +333 -333
  18. package/agents/ez-requirements-agent.md +377 -377
  19. package/agents/ez-roadmapper.md +650 -650
  20. package/agents/ez-technical-writer.md +551 -0
  21. package/agents/ez-ux-expert.md +393 -0
  22. package/agents/ez-verifier.md +579 -579
  23. package/bin/guards/autonomy-guard.cjs +346 -0
  24. package/bin/guards/context-budget-guard.cjs +278 -0
  25. package/bin/guards/hallucination-guard.cjs +380 -0
  26. package/bin/guards/hidden-state-guard.cjs +182 -0
  27. package/bin/guards/team-overhead-guard.cjs +266 -0
  28. package/bin/guards/tool-sprawl-guard.cjs +271 -0
  29. package/bin/lib/analytics/analytics-collector.cjs +86 -0
  30. package/bin/lib/analytics/analytics-reporter.cjs +130 -0
  31. package/bin/lib/analytics/cohort-analyzer.cjs +138 -0
  32. package/bin/lib/analytics/funnel-analyzer.cjs +147 -0
  33. package/bin/lib/analytics/nps-tracker.cjs +147 -0
  34. package/bin/lib/archetype-detector.cjs +289 -0
  35. package/bin/lib/assistant-adapter.cjs +361 -0
  36. package/bin/lib/audit-exec.cjs +175 -0
  37. package/bin/lib/auth.cjs +176 -0
  38. package/bin/lib/backup-service.cjs +422 -0
  39. package/bin/lib/bdd-validator.cjs +622 -0
  40. package/bin/lib/business-flow-mapper.cjs +429 -0
  41. package/bin/lib/circuit-breaker.cjs +276 -0
  42. package/bin/lib/code-complexity-analyzer.cjs +360 -0
  43. package/bin/lib/codebase-analyzer.cjs +241 -0
  44. package/bin/lib/commands.cjs +691 -0
  45. package/bin/lib/config.cjs +236 -0
  46. package/bin/lib/constraint-extractor.cjs +526 -0
  47. package/bin/lib/content-scanner.cjs +238 -0
  48. package/bin/lib/context-cache.cjs +154 -0
  49. package/bin/lib/context-compressor.cjs +102 -0
  50. package/bin/lib/context-deduplicator.cjs +105 -0
  51. package/bin/lib/context-errors.cjs +78 -0
  52. package/bin/lib/context-manager.cjs +338 -0
  53. package/bin/lib/context-metadata-tracker.cjs +140 -0
  54. package/bin/lib/context-relevance-scorer.cjs +99 -0
  55. package/bin/lib/core.cjs +507 -0
  56. package/bin/lib/cost-alerts.cjs +174 -0
  57. package/bin/lib/cost-tracker.cjs +275 -0
  58. package/bin/lib/crash-recovery.cjs +220 -0
  59. package/bin/lib/dependency-graph.cjs +319 -0
  60. package/bin/lib/deploy/deploy-audit-log.cjs +76 -0
  61. package/bin/lib/deploy/deploy-detector.cjs +69 -0
  62. package/bin/lib/deploy/deploy-env-manager.cjs +109 -0
  63. package/bin/lib/deploy/deploy-health-check.cjs +88 -0
  64. package/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
  65. package/bin/lib/deploy/deploy-rollback.cjs +72 -0
  66. package/bin/lib/deploy/deploy-runner.cjs +97 -0
  67. package/bin/lib/deploy/deploy-status.cjs +74 -0
  68. package/bin/lib/discussion-synthesizer.cjs +439 -0
  69. package/bin/lib/error-cache.cjs +114 -0
  70. package/bin/lib/error-registry.cjs +177 -0
  71. package/bin/lib/file-access.cjs +207 -0
  72. package/bin/lib/file-lock.cjs +236 -0
  73. package/bin/lib/finops/budget-enforcer.cjs +126 -0
  74. package/bin/lib/finops/cost-reporter.cjs +132 -0
  75. package/bin/lib/finops/finops-analyzer.cjs +112 -0
  76. package/bin/lib/finops/spot-manager.cjs +118 -0
  77. package/bin/lib/framework-detector.cjs +396 -0
  78. package/bin/lib/frontmatter.cjs +313 -0
  79. package/bin/lib/fs-utils.cjs +153 -0
  80. package/bin/lib/gate-executor.cjs +272 -0
  81. package/bin/lib/gates/README.md +374 -0
  82. package/bin/lib/gates/gate-01-requirement.cjs +303 -0
  83. package/bin/lib/gates/gate-02-architecture.cjs +555 -0
  84. package/bin/lib/gates/gate-03-code.cjs +635 -0
  85. package/bin/lib/gates/gate-04-security.cjs +829 -0
  86. package/bin/lib/git-errors.cjs +83 -0
  87. package/bin/lib/git-utils.cjs +321 -0
  88. package/bin/lib/git-workflow-engine.cjs +1157 -0
  89. package/bin/lib/health-check.cjs +227 -0
  90. package/bin/lib/index.cjs +279 -0
  91. package/bin/lib/init.cjs +725 -0
  92. package/bin/lib/lock-logger.cjs +194 -0
  93. package/bin/lib/lock-state.cjs +263 -0
  94. package/bin/lib/lockfile-validator.cjs +227 -0
  95. package/bin/lib/log-rotation.cjs +71 -0
  96. package/bin/lib/logger.cjs +125 -0
  97. package/bin/lib/memory-compression.cjs +256 -0
  98. package/bin/lib/milestone.cjs +247 -0
  99. package/bin/lib/model-provider.cjs +241 -0
  100. package/bin/lib/package-manager-detector.cjs +203 -0
  101. package/bin/lib/package-manager-executor.cjs +385 -0
  102. package/bin/lib/package-manager-service.cjs +216 -0
  103. package/bin/lib/perf/api-monitor.cjs +88 -0
  104. package/bin/lib/perf/db-optimizer.cjs +78 -0
  105. package/bin/lib/perf/frontend-performance.cjs +56 -0
  106. package/bin/lib/perf/perf-analyzer.cjs +77 -0
  107. package/bin/lib/perf/perf-baseline.cjs +102 -0
  108. package/bin/lib/perf/perf-reporter.cjs +117 -0
  109. package/bin/lib/perf/regression-detector.cjs +92 -0
  110. package/bin/lib/phase.cjs +963 -0
  111. package/bin/lib/planning-write.cjs +123 -0
  112. package/bin/lib/project-reporter.cjs +565 -0
  113. package/bin/lib/quality-gate.cjs +332 -0
  114. package/bin/lib/quality-metrics.cjs +324 -0
  115. package/bin/lib/recovery-manager.cjs +98 -0
  116. package/bin/lib/release-validator.cjs +617 -0
  117. package/bin/lib/retry.cjs +119 -0
  118. package/bin/lib/roadmap.cjs +309 -0
  119. package/bin/lib/safe-exec.cjs +173 -0
  120. package/bin/lib/safe-path.cjs +130 -0
  121. package/bin/lib/security-errors.cjs +62 -0
  122. package/bin/lib/session-chain.cjs +304 -0
  123. package/bin/lib/session-errors.cjs +81 -0
  124. package/bin/lib/session-export.cjs +251 -0
  125. package/bin/lib/session-import.cjs +262 -0
  126. package/bin/lib/session-manager.cjs +280 -0
  127. package/bin/lib/skill-context.cjs +148 -0
  128. package/bin/lib/skill-matcher.cjs +236 -0
  129. package/bin/lib/skill-registry.cjs +360 -0
  130. package/bin/lib/skill-resolver.cjs +449 -0
  131. package/bin/lib/skill-triggers.cjs +90 -0
  132. package/bin/lib/skill-validator.cjs +270 -0
  133. package/bin/lib/skill-versioning.cjs +355 -0
  134. package/bin/lib/stack-detector.cjs +399 -0
  135. package/bin/lib/state.cjs +736 -0
  136. package/bin/lib/tech-debt-analyzer.cjs +309 -0
  137. package/bin/lib/temp-file.cjs +239 -0
  138. package/bin/lib/template.cjs +223 -0
  139. package/bin/lib/test-file-lock.cjs +112 -0
  140. package/bin/lib/test-graceful.cjs +93 -0
  141. package/bin/lib/test-logger.cjs +60 -0
  142. package/bin/lib/test-safe-exec.cjs +38 -0
  143. package/bin/lib/test-safe-path.cjs +33 -0
  144. package/bin/lib/test-temp-file.cjs +125 -0
  145. package/bin/lib/tier-manager.cjs +428 -0
  146. package/bin/lib/timeout-exec.cjs +63 -0
  147. package/bin/lib/tradeoff-analyzer.cjs +284 -0
  148. package/bin/lib/url-fetch.cjs +170 -0
  149. package/bin/lib/verify.cjs +863 -0
  150. package/bin/update.js +217 -214
  151. package/commands/deploy.cjs +53 -0
  152. package/commands/ez/add-tests.md +41 -41
  153. package/commands/ez/audit-milestone.md +36 -36
  154. package/commands/ez/complete-milestone.md +136 -136
  155. package/commands/ez/discuss-phase.md +90 -90
  156. package/commands/ez/execute-phase.md +52 -52
  157. package/commands/ez/help.md +22 -22
  158. package/commands/ez/map-codebase.md +71 -71
  159. package/commands/ez/new-milestone.md +44 -44
  160. package/commands/ez/new-project.md +51 -42
  161. package/commands/ez/plan-phase.md +53 -53
  162. package/commands/ez/progress.md +36 -36
  163. package/commands/ez/quick.md +45 -45
  164. package/commands/ez/resume-work.md +40 -40
  165. package/commands/ez/run-phase.md +580 -0
  166. package/commands/ez/settings.md +36 -36
  167. package/commands/ez/update.md +37 -37
  168. package/commands/ez/verify-work.md +402 -38
  169. package/commands/health-check.cjs +44 -0
  170. package/commands/rollback.cjs +47 -0
  171. package/ez-agents/bin/ez-tools.cjs +599 -2
  172. package/ez-agents/bin/guards/autonomy-guard.cjs +346 -0
  173. package/ez-agents/bin/guards/context-budget-guard.cjs +247 -0
  174. package/ez-agents/bin/guards/hallucination-guard.cjs +271 -0
  175. package/ez-agents/bin/guards/hidden-state-guard.cjs +182 -0
  176. package/ez-agents/bin/guards/team-overhead-guard.cjs +266 -0
  177. package/ez-agents/bin/guards/tool-sprawl-guard.cjs +271 -0
  178. package/ez-agents/bin/lib/analytics/analytics-collector.cjs +86 -0
  179. package/ez-agents/bin/lib/analytics/analytics-reporter.cjs +130 -0
  180. package/ez-agents/bin/lib/analytics/cohort-analyzer.cjs +138 -0
  181. package/ez-agents/bin/lib/analytics/funnel-analyzer.cjs +147 -0
  182. package/ez-agents/bin/lib/analytics/nps-tracker.cjs +147 -0
  183. package/ez-agents/bin/lib/archetype-detector.cjs +289 -0
  184. package/ez-agents/bin/lib/audit-exec.cjs +166 -167
  185. package/ez-agents/bin/lib/auth.cjs +176 -176
  186. package/ez-agents/bin/lib/backup-service.cjs +422 -0
  187. package/ez-agents/bin/lib/bdd-validator.cjs +622 -622
  188. package/ez-agents/bin/lib/business-flow-mapper.cjs +429 -0
  189. package/ez-agents/bin/lib/code-complexity-analyzer.cjs +360 -0
  190. package/ez-agents/bin/lib/codebase-analyzer.cjs +241 -0
  191. package/ez-agents/bin/lib/commands.cjs +685 -685
  192. package/ez-agents/bin/lib/config.cjs +41 -1
  193. package/ez-agents/bin/lib/constraint-extractor.cjs +526 -0
  194. package/ez-agents/bin/lib/content-scanner.cjs +238 -238
  195. package/ez-agents/bin/lib/context-cache.cjs +154 -154
  196. package/ez-agents/bin/lib/context-errors.cjs +71 -71
  197. package/ez-agents/bin/lib/context-manager.cjs +220 -220
  198. package/ez-agents/bin/lib/core.cjs +507 -512
  199. package/ez-agents/bin/lib/cost-tracker.cjs +243 -0
  200. package/ez-agents/bin/lib/crash-recovery.cjs +172 -0
  201. package/ez-agents/bin/lib/dependency-graph.cjs +319 -0
  202. package/ez-agents/bin/lib/deploy/deploy-audit-log.cjs +76 -0
  203. package/ez-agents/bin/lib/deploy/deploy-detector.cjs +69 -0
  204. package/ez-agents/bin/lib/deploy/deploy-env-manager.cjs +109 -0
  205. package/ez-agents/bin/lib/deploy/deploy-health-check.cjs +88 -0
  206. package/ez-agents/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
  207. package/ez-agents/bin/lib/deploy/deploy-rollback.cjs +72 -0
  208. package/ez-agents/bin/lib/deploy/deploy-runner.cjs +97 -0
  209. package/ez-agents/bin/lib/deploy/deploy-status.cjs +74 -0
  210. package/ez-agents/bin/lib/file-access.cjs +207 -207
  211. package/ez-agents/bin/lib/finops/budget-enforcer.cjs +126 -0
  212. package/ez-agents/bin/lib/finops/cost-reporter.cjs +132 -0
  213. package/ez-agents/bin/lib/finops/finops-analyzer.cjs +112 -0
  214. package/ez-agents/bin/lib/finops/spot-manager.cjs +118 -0
  215. package/ez-agents/bin/lib/framework-detector.cjs +396 -0
  216. package/ez-agents/bin/lib/frontmatter.cjs +3 -1
  217. package/ez-agents/bin/lib/gates/README.md +374 -0
  218. package/ez-agents/bin/lib/gates/gate-01-requirement.cjs +303 -0
  219. package/ez-agents/bin/lib/gates/gate-02-architecture.cjs +555 -0
  220. package/ez-agents/bin/lib/gates/gate-03-code.cjs +635 -0
  221. package/ez-agents/bin/lib/gates/gate-04-security.cjs +829 -0
  222. package/ez-agents/bin/lib/git-errors.cjs +83 -83
  223. package/ez-agents/bin/lib/git-utils.cjs +321 -321
  224. package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -1157
  225. package/ez-agents/bin/lib/health-check.cjs +162 -162
  226. package/ez-agents/bin/lib/index.cjs +2 -8
  227. package/ez-agents/bin/lib/init.cjs +0 -2
  228. package/ez-agents/bin/lib/lockfile-validator.cjs +227 -227
  229. package/ez-agents/bin/lib/log-rotation.cjs +71 -0
  230. package/ez-agents/bin/lib/logger.cjs +22 -47
  231. package/ez-agents/bin/lib/memory-compression.cjs +256 -256
  232. package/ez-agents/bin/lib/package-manager-detector.cjs +203 -203
  233. package/ez-agents/bin/lib/package-manager-executor.cjs +385 -385
  234. package/ez-agents/bin/lib/package-manager-service.cjs +216 -216
  235. package/ez-agents/bin/lib/perf/api-monitor.cjs +88 -0
  236. package/ez-agents/bin/lib/perf/db-optimizer.cjs +78 -0
  237. package/ez-agents/bin/lib/perf/frontend-performance.cjs +56 -0
  238. package/ez-agents/bin/lib/perf/perf-analyzer.cjs +77 -0
  239. package/ez-agents/bin/lib/perf/perf-baseline.cjs +102 -0
  240. package/ez-agents/bin/lib/perf/perf-reporter.cjs +117 -0
  241. package/ez-agents/bin/lib/perf/regression-detector.cjs +92 -0
  242. package/ez-agents/bin/lib/project-reporter.cjs +502 -0
  243. package/ez-agents/bin/lib/quality-gate.cjs +332 -0
  244. package/ez-agents/bin/lib/recovery-manager.cjs +98 -0
  245. package/ez-agents/bin/lib/release-validator.cjs +617 -614
  246. package/ez-agents/bin/lib/security-errors.cjs +62 -0
  247. package/ez-agents/bin/lib/session-chain.cjs +304 -304
  248. package/ez-agents/bin/lib/session-errors.cjs +81 -81
  249. package/ez-agents/bin/lib/session-export.cjs +251 -251
  250. package/ez-agents/bin/lib/session-import.cjs +262 -262
  251. package/ez-agents/bin/lib/session-manager.cjs +280 -280
  252. package/ez-agents/bin/lib/skill-context.cjs +148 -0
  253. package/ez-agents/bin/lib/skill-matcher.cjs +236 -0
  254. package/ez-agents/bin/lib/skill-registry.cjs +341 -0
  255. package/ez-agents/bin/lib/skill-resolver.cjs +449 -0
  256. package/ez-agents/bin/lib/skill-triggers.cjs +90 -0
  257. package/ez-agents/bin/lib/skill-validator.cjs +270 -0
  258. package/ez-agents/bin/lib/skill-versioning.cjs +355 -0
  259. package/ez-agents/bin/lib/stack-detector.cjs +399 -0
  260. package/ez-agents/bin/lib/tech-debt-analyzer.cjs +309 -0
  261. package/ez-agents/bin/lib/tier-manager.cjs +428 -428
  262. package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
  263. package/ez-agents/bin/lib/url-fetch.cjs +170 -170
  264. package/ez-agents/bin/lib/verify.cjs +863 -863
  265. package/ez-agents/references/decimal-phase-calculation.md +65 -65
  266. package/ez-agents/references/git-integration.md +248 -248
  267. package/ez-agents/references/git-planning-commit.md +38 -38
  268. package/ez-agents/references/metrics-schema.md +118 -118
  269. package/ez-agents/references/model-profile-resolution.md +34 -34
  270. package/ez-agents/references/model-profiles.md +93 -93
  271. package/ez-agents/references/phase-argument-parsing.md +61 -61
  272. package/ez-agents/references/planning-config.md +340 -340
  273. package/ez-agents/references/tier-strategy.md +103 -103
  274. package/ez-agents/references/ui-brand.md +160 -160
  275. package/ez-agents/references/verification-patterns.md +612 -612
  276. package/ez-agents/templates/DEBUG.md +164 -164
  277. package/ez-agents/templates/UAT.md +247 -247
  278. package/ez-agents/templates/agent-output-format.md +404 -0
  279. package/ez-agents/templates/bdd-feature.md +173 -173
  280. package/ez-agents/templates/codebase/architecture.md +255 -255
  281. package/ez-agents/templates/codebase/structure.md +285 -285
  282. package/ez-agents/templates/copilot-instructions.md +7 -7
  283. package/ez-agents/templates/debug-subagent-prompt.md +91 -91
  284. package/ez-agents/templates/discovery.md +146 -146
  285. package/ez-agents/templates/discussion.md +68 -68
  286. package/ez-agents/templates/handoff-protocol.md +294 -0
  287. package/ez-agents/templates/incident-runbook.md +205 -205
  288. package/ez-agents/templates/mode-workflow-templates.md +301 -0
  289. package/ez-agents/templates/phase-prompt.md +610 -610
  290. package/ez-agents/templates/planner-subagent-prompt.md +117 -117
  291. package/ez-agents/templates/project.md +184 -184
  292. package/ez-agents/templates/release-checklist.md +136 -133
  293. package/ez-agents/templates/research.md +552 -552
  294. package/ez-agents/templates/rollback-plan.md +201 -201
  295. package/ez-agents/templates/security-user-setup.md +244 -0
  296. package/ez-agents/templates/skill-validation-rules.md +476 -0
  297. package/ez-agents/templates/state.md +180 -176
  298. package/ez-agents/templates/summary-complex.md +59 -59
  299. package/ez-agents/tests/gates/gate-01-02.test.cjs +812 -0
  300. package/ez-agents/tests/gates/gate-03-04.test.cjs +762 -0
  301. package/ez-agents/tests/gates/gate-05-validator.test.cjs +145 -0
  302. package/ez-agents/tests/gates/gate-06-docs-validator.test.cjs +244 -0
  303. package/ez-agents/tests/gates/gate-07-release-validator.test.cjs +219 -0
  304. package/ez-agents/tests/guards/context-budget-guard.test.cjs +145 -0
  305. package/ez-agents/tests/guards/edge-case-guards.test.cjs +238 -0
  306. package/ez-agents/tests/guards/hallucination-guard.test.cjs +124 -0
  307. package/ez-agents/workflows/audit-milestone.md +1 -1
  308. package/ez-agents/workflows/autonomous.md +844 -844
  309. package/ez-agents/workflows/complete-milestone.md +1 -1
  310. package/ez-agents/workflows/discuss-phase.md +1 -1
  311. package/ez-agents/workflows/execute-phase.md +124 -3
  312. package/ez-agents/workflows/help.md +42 -181
  313. package/ez-agents/workflows/hotfix.md +291 -291
  314. package/ez-agents/workflows/new-milestone.md +713 -713
  315. package/ez-agents/workflows/new-project.md +1089 -1107
  316. package/ez-agents/workflows/plan-phase.md +0 -40
  317. package/ez-agents/workflows/release.md +253 -253
  318. package/ez-agents/workflows/resume-session.md +215 -215
  319. package/ez-agents/workflows/run-phase.md +531 -0
  320. package/ez-agents/workflows/settings.md +2 -35
  321. package/hooks/dist/ez-check-update.js +81 -81
  322. package/hooks/dist/ez-context-monitor.js +148 -141
  323. package/hooks/dist/ez-statusline.js +115 -115
  324. package/package.json +78 -71
  325. package/scripts/fix-qwen-installation.js +144 -144
  326. package/agents/ez-integration-checker.md +0 -443
  327. package/agents/ez-nyquist-auditor.md +0 -176
  328. package/agents/ez-observer-agent.md +0 -260
  329. package/agents/ez-plan-checker.md +0 -706
  330. package/agents/ez-research-synthesizer.md +0 -247
  331. package/agents/ez-scrum-master-agent.md +0 -242
  332. package/agents/ez-tech-lead-agent.md +0 -267
  333. package/agents/ez-ui-auditor.md +0 -439
  334. package/agents/ez-ui-checker.md +0 -300
  335. package/agents/ez-ui-researcher.md +0 -353
  336. package/commands/ez/add-phase.md +0 -43
  337. package/commands/ez/add-todo.md +0 -47
  338. package/commands/ez/arch-review.md +0 -102
  339. package/commands/ez/auth.md +0 -87
  340. package/commands/ez/autonomous.md +0 -41
  341. package/commands/ez/check-todos.md +0 -45
  342. package/commands/ez/cleanup.md +0 -18
  343. package/commands/ez/debug.md +0 -168
  344. package/commands/ez/export-session.md +0 -79
  345. package/commands/ez/gather-requirements.md +0 -117
  346. package/commands/ez/git-workflow.md +0 -72
  347. package/commands/ez/health.md +0 -22
  348. package/commands/ez/hotfix.md +0 -120
  349. package/commands/ez/import-session.md +0 -82
  350. package/commands/ez/insert-phase.md +0 -32
  351. package/commands/ez/join-discord.md +0 -18
  352. package/commands/ez/list-phase-assumptions.md +0 -46
  353. package/commands/ez/list-sessions.md +0 -96
  354. package/commands/ez/package-manager.md +0 -316
  355. package/commands/ez/pause-work.md +0 -38
  356. package/commands/ez/plan-milestone-gaps.md +0 -34
  357. package/commands/ez/preflight.md +0 -79
  358. package/commands/ez/reapply-patches.md +0 -124
  359. package/commands/ez/release.md +0 -153
  360. package/commands/ez/remove-phase.md +0 -31
  361. package/commands/ez/research-phase.md +0 -190
  362. package/commands/ez/resume.md +0 -107
  363. package/commands/ez/set-profile.md +0 -34
  364. package/commands/ez/standup.md +0 -85
  365. package/commands/ez/stats.md +0 -18
  366. package/commands/ez/ui-phase.md +0 -34
  367. package/commands/ez/ui-review.md +0 -32
  368. package/commands/ez/validate-phase.md +0 -35
  369. package/ez-agents/bin/lib/metrics-tracker.cjs +0 -406
  370. package/ez-agents/templates/UI-SPEC.md +0 -100
  371. package/ez-agents/templates/VALIDATION.md +0 -76
  372. package/ez-agents/templates/context.md +0 -352
  373. package/ez-agents/templates/verification-report.md +0 -322
  374. package/ez-agents/workflows/arch-review.md +0 -54
  375. package/ez-agents/workflows/export-session.md +0 -255
  376. package/ez-agents/workflows/gather-requirements.md +0 -206
  377. package/ez-agents/workflows/import-session.md +0 -303
  378. package/ez-agents/workflows/research-phase.md +0 -74
  379. package/ez-agents/workflows/standup.md +0 -64
  380. package/ez-agents/workflows/ui-phase.md +0 -290
  381. package/ez-agents/workflows/ui-review.md +0 -157
  382. 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) {