@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
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Gate 5 Validator Tests
3
+ * Tests for the testing coverage gate validator
4
+ */
5
+
6
+ import { describe, it, beforeEach, afterEach } from 'vitest';
7
+ import { strict as assert } from 'assert';
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import os from 'os';
11
+ import { fileURLToPath } from 'url';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+
16
+ // Import the validator
17
+ const { validateCoverage, getArchetypeThresholds } = await import(path.join(__dirname, '../../../.planning/gates/gate-05-testing/validator.cjs'));
18
+
19
+ describe('Gate 5 Validator', () => {
20
+ describe('getArchetypeThresholds', () => {
21
+ it('should return MVP thresholds', () => {
22
+ const thresholds = getArchetypeThresholds('mvp');
23
+ assert.strictEqual(thresholds.lines, 60);
24
+ assert.strictEqual(thresholds.branches, 40);
25
+ assert.strictEqual(thresholds.functions, 50);
26
+ });
27
+
28
+ it('should return Medium thresholds', () => {
29
+ const thresholds = getArchetypeThresholds('medium');
30
+ assert.strictEqual(thresholds.lines, 80);
31
+ assert.strictEqual(thresholds.branches, 60);
32
+ assert.strictEqual(thresholds.functions, 70);
33
+ });
34
+
35
+ it('should return Enterprise thresholds', () => {
36
+ const thresholds = getArchetypeThresholds('enterprise');
37
+ assert.strictEqual(thresholds.lines, 95);
38
+ assert.strictEqual(thresholds.branches, 80);
39
+ assert.strictEqual(thresholds.functions, 90);
40
+ });
41
+
42
+ it('should throw for unknown archetype', () => {
43
+ assert.throws(
44
+ () => getArchetypeThresholds('invalid'),
45
+ /Unknown archetype/
46
+ );
47
+ });
48
+ });
49
+
50
+ describe('validateCoverage', () => {
51
+ let tempDir;
52
+
53
+ beforeEach(() => {
54
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gate5-test-'));
55
+ });
56
+
57
+ afterEach(() => {
58
+ try {
59
+ fs.rmSync(tempDir, { recursive: true, force: true });
60
+ } catch (e) {
61
+ // Ignore cleanup errors
62
+ }
63
+ });
64
+
65
+ it('should return failure when coverage report missing', () => {
66
+ const result = validateCoverage(tempDir, 'mvp');
67
+ assert.strictEqual(result.pass, false);
68
+ assert.ok(result.failures.some(f => f.includes('Coverage execution failed')));
69
+ });
70
+
71
+ it('should return failure when coverage below threshold', () => {
72
+ // Create a mock coverage report with low coverage
73
+ const coverageDir = path.join(tempDir, 'coverage');
74
+ fs.mkdirSync(coverageDir);
75
+
76
+ const mockCoverage = {
77
+ totals: {
78
+ lines: { pct: 30 },
79
+ branches: { pct: 20 },
80
+ functions: { pct: 25 }
81
+ }
82
+ };
83
+
84
+ fs.writeFileSync(
85
+ path.join(coverageDir, 'coverage-summary.json'),
86
+ JSON.stringify(mockCoverage)
87
+ );
88
+
89
+ const result = validateCoverage(tempDir, 'mvp');
90
+ assert.strictEqual(result.pass, false);
91
+ assert.ok(result.failures.length > 0);
92
+ assert.ok(result.failures.some(f => f.includes('Lines coverage')));
93
+ });
94
+
95
+ it('should return success when coverage meets threshold', () => {
96
+ // Create a mock coverage report with good coverage
97
+ const coverageDir = path.join(tempDir, 'coverage');
98
+ fs.mkdirSync(coverageDir);
99
+
100
+ const mockCoverage = {
101
+ totals: {
102
+ lines: { pct: 70 },
103
+ branches: { pct: 50 },
104
+ functions: { pct: 60 }
105
+ }
106
+ };
107
+
108
+ fs.writeFileSync(
109
+ path.join(coverageDir, 'coverage-summary.json'),
110
+ JSON.stringify(mockCoverage)
111
+ );
112
+
113
+ const result = validateCoverage(tempDir, 'mvp');
114
+ assert.strictEqual(result.pass, true);
115
+ assert.strictEqual(result.failures.length, 0);
116
+ assert.strictEqual(result.report.lines, 70);
117
+ });
118
+
119
+ it('should use correct thresholds for medium archetype', () => {
120
+ const coverageDir = path.join(tempDir, 'coverage');
121
+ fs.mkdirSync(coverageDir);
122
+
123
+ const mockCoverage = {
124
+ totals: {
125
+ lines: { pct: 75 }, // Below medium (80%) but above mvp (60%)
126
+ branches: { pct: 55 },
127
+ functions: { pct: 65 }
128
+ }
129
+ };
130
+
131
+ fs.writeFileSync(
132
+ path.join(coverageDir, 'coverage-summary.json'),
133
+ JSON.stringify(mockCoverage)
134
+ );
135
+
136
+ // Should fail for medium
137
+ const mediumResult = validateCoverage(tempDir, 'medium');
138
+ assert.strictEqual(mediumResult.pass, false);
139
+
140
+ // Should pass for mvp
141
+ const mvpResult = validateCoverage(tempDir, 'mvp');
142
+ assert.strictEqual(mvpResult.pass, true);
143
+ });
144
+ });
145
+ });
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Gate 6 Documentation Validator Tests
3
+ */
4
+
5
+ import { describe, it, beforeEach, afterEach } from 'vitest';
6
+ import { strict as assert } from 'assert';
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import os from 'os';
10
+ import { fileURLToPath } from 'url';
11
+
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = path.dirname(__filename);
14
+
15
+ // Import the validator
16
+ const { validateDocs, getRequiredDocs, validateSections } = await import(path.join(__dirname, '../../../.planning/gates/gate-06-docs/validator.cjs'));
17
+
18
+ describe('Gate 6 Validator', () => {
19
+ describe('getRequiredDocs', () => {
20
+ it('should return MVP documentation requirements', () => {
21
+ const docs = getRequiredDocs('mvp');
22
+ assert.ok(Array.isArray(docs));
23
+ assert.ok(docs.some(d => d.path === 'README.md'));
24
+ });
25
+
26
+ it('should return Medium documentation requirements', () => {
27
+ const docs = getRequiredDocs('medium');
28
+ assert.ok(docs.length >= 3);
29
+ assert.ok(docs.some(d => d.path === 'README.md'));
30
+ assert.ok(docs.some(d => d.path === 'docs/api.md'));
31
+ assert.ok(docs.some(d => d.path === 'docs/deployment.md'));
32
+ });
33
+
34
+ it('should return Enterprise documentation requirements', () => {
35
+ const docs = getRequiredDocs('enterprise');
36
+ assert.ok(docs.length >= 5);
37
+ assert.ok(docs.some(d => d.path === 'docs/architecture.md'));
38
+ assert.ok(docs.some(d => d.path === 'docs/runbooks/'));
39
+ });
40
+
41
+ it('should throw for unknown tier', () => {
42
+ assert.throws(
43
+ () => getRequiredDocs('invalid'),
44
+ /Unknown tier/
45
+ );
46
+ });
47
+ });
48
+
49
+ describe('validateSections', () => {
50
+ let tempFile;
51
+
52
+ beforeEach(() => {
53
+ tempFile = path.join(os.tmpdir(), `test-${Date.now()}.md`);
54
+ });
55
+
56
+ afterEach(() => {
57
+ try {
58
+ fs.unlinkSync(tempFile);
59
+ } catch (e) {
60
+ // Ignore
61
+ }
62
+ });
63
+
64
+ it('should return failure when document does not exist', () => {
65
+ const result = validateSections('/nonexistent/file.md', ['Section 1']);
66
+ assert.strictEqual(result.pass, false);
67
+ assert.strictEqual(result.exists, false);
68
+ });
69
+
70
+ it('should return failure when document is too short', () => {
71
+ fs.writeFileSync(tempFile, 'too short');
72
+ const result = validateSections(tempFile, ['Section 1']);
73
+ assert.strictEqual(result.pass, false);
74
+ assert.ok(result.missingSections.some(m => m.includes('too short')));
75
+ });
76
+
77
+ it('should pass when all sections present', () => {
78
+ const content = `# Test Document
79
+
80
+ ## Section 1
81
+
82
+ Content here.
83
+
84
+ ## Section 2
85
+
86
+ More content.
87
+ `;
88
+ fs.writeFileSync(tempFile, content);
89
+ const result = validateSections(tempFile, ['Section 1', 'Section 2']);
90
+ assert.strictEqual(result.pass, true);
91
+ assert.strictEqual(result.missingSections.length, 0);
92
+ });
93
+
94
+ it('should fail when sections missing', () => {
95
+ const content = `# Test Document
96
+
97
+ ## Section 1
98
+
99
+ This is some content here that makes the file longer than 50 bytes minimum requirement.
100
+ `;
101
+ fs.writeFileSync(tempFile, content);
102
+ const result = validateSections(tempFile, ['Section 1', 'Section 2', 'Section 3']);
103
+ assert.strictEqual(result.pass, false);
104
+ assert.ok(result.missingSections.some(m => m.includes('Section 2')));
105
+ assert.ok(result.missingSections.some(m => m.includes('Section 3')));
106
+ });
107
+ });
108
+
109
+ describe('validateDocs', () => {
110
+ let tempDir;
111
+
112
+ beforeEach(() => {
113
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gate6-test-'));
114
+ });
115
+
116
+ afterEach(() => {
117
+ try {
118
+ fs.rmSync(tempDir, { recursive: true, force: true });
119
+ } catch (e) {
120
+ // Ignore cleanup errors
121
+ }
122
+ });
123
+
124
+ it('should fail when required documentation is missing', async () => {
125
+ const result = await validateDocs(tempDir, 'mvp');
126
+ assert.strictEqual(result.pass, false);
127
+ assert.ok(result.failures.some(f => f.includes('Missing')));
128
+ });
129
+
130
+ it('should pass when MVP documentation exists with required sections', async () => {
131
+ // Create README.md with required sections
132
+ const readmeContent = `# Project
133
+
134
+ Brief description of the project goes here to make the file longer.
135
+
136
+ ## Installation
137
+
138
+ Install instructions with detailed content to meet minimum file size requirements.
139
+
140
+ ## Usage
141
+
142
+ Usage instructions with detailed content to meet minimum file size requirements.
143
+
144
+ ## Configuration
145
+
146
+ Config instructions with detailed content to meet minimum file size requirements.
147
+ `;
148
+ fs.writeFileSync(path.join(tempDir, 'README.md'), readmeContent);
149
+
150
+ const result = await validateDocs(tempDir, 'mvp');
151
+ assert.strictEqual(result.pass, true);
152
+ });
153
+
154
+ it('should fail when sections are missing', async () => {
155
+ // Create README.md without all required sections
156
+ const readmeContent = `# Project
157
+
158
+ ## Installation
159
+
160
+ Install instructions.
161
+ `;
162
+ fs.writeFileSync(path.join(tempDir, 'README.md'), readmeContent);
163
+
164
+ const result = await validateDocs(tempDir, 'mvp');
165
+ assert.strictEqual(result.pass, false);
166
+ assert.ok(result.failures.some(f => f.includes('Missing section')));
167
+ });
168
+
169
+ it('should validate medium tier requirements', async () => {
170
+ // Create docs directory
171
+ const docsDir = path.join(tempDir, 'docs');
172
+ fs.mkdirSync(docsDir);
173
+
174
+ // Create README.md with sufficient content
175
+ fs.writeFileSync(path.join(tempDir, 'README.md'), `# Project
176
+
177
+ Brief project description with enough content to meet minimum file size requirements.
178
+
179
+ ## Installation
180
+
181
+ Installation instructions with detailed content to meet minimum file size requirements.
182
+
183
+ ## Usage
184
+
185
+ Usage instructions with detailed content to meet minimum file size requirements.
186
+
187
+ ## Configuration
188
+
189
+ Configuration instructions with detailed content to meet minimum file size requirements.
190
+
191
+ ## API Reference
192
+
193
+ API reference overview with detailed content to meet minimum file size requirements.
194
+ `);
195
+
196
+ // Create api.md with sufficient content
197
+ fs.writeFileSync(path.join(docsDir, 'api.md'), `# API Docs
198
+
199
+ API documentation overview with enough content to meet minimum file size requirements.
200
+
201
+ ## Endpoints
202
+
203
+ Endpoints section with detailed content to meet minimum file size requirements.
204
+
205
+ ## Request/Response
206
+
207
+ Request/Response section with detailed content to meet minimum file size requirements.
208
+
209
+ ## Authentication
210
+
211
+ Authentication section with detailed content to meet minimum file size requirements.
212
+
213
+ ## Error Codes
214
+
215
+ Error Codes section with detailed content to meet minimum file size requirements.
216
+ `);
217
+
218
+ // Create deployment.md with sufficient content
219
+ fs.writeFileSync(path.join(docsDir, 'deployment.md'), `# Deployment
220
+
221
+ Deployment guide overview with enough content to meet minimum file size requirements.
222
+
223
+ ## Prerequisites
224
+
225
+ Prerequisites section with detailed content to meet minimum file size requirements.
226
+
227
+ ## Environment Variables
228
+
229
+ Environment Variables section with detailed content to meet minimum file size requirements.
230
+
231
+ ## Deploy Steps
232
+
233
+ Deploy Steps section with detailed content to meet minimum file size requirements.
234
+
235
+ ## Rollback
236
+
237
+ Rollback section with detailed content to meet minimum file size requirements.
238
+ `);
239
+
240
+ const result = await validateDocs(tempDir, 'medium');
241
+ assert.strictEqual(result.pass, true);
242
+ });
243
+ });
244
+ });
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Gate 7 Release Readiness Validator Tests
3
+ */
4
+
5
+ import { describe, it, beforeEach, afterEach } from 'vitest';
6
+ import { strict as assert } from 'assert';
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import os from 'os';
10
+ import { fileURLToPath } from 'url';
11
+
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = path.dirname(__filename);
14
+
15
+ // Import the validator
16
+ const {
17
+ validateReleaseReadiness,
18
+ getReleaseRequirements,
19
+ validateRollbackPlan
20
+ } = await import(path.join(__dirname, '../../../.planning/gates/gate-07-release/validator.cjs'));
21
+
22
+ describe('Gate 7 Validator', () => {
23
+ describe('getReleaseRequirements', () => {
24
+ it('should return MVP requirements', () => {
25
+ const reqs = getReleaseRequirements('mvp');
26
+ assert.ok(reqs.requirements.includes('smoke_tests'));
27
+ assert.ok(reqs.requirements.includes('rollback_plan'));
28
+ });
29
+
30
+ it('should return Medium requirements', () => {
31
+ const reqs = getReleaseRequirements('medium');
32
+ assert.ok(reqs.requirements.includes('smoke_tests'));
33
+ assert.ok(reqs.requirements.includes('rollback_plan'));
34
+ assert.ok(reqs.requirements.includes('monitoring'));
35
+ });
36
+
37
+ it('should return Enterprise requirements', () => {
38
+ const reqs = getReleaseRequirements('enterprise');
39
+ assert.ok(reqs.requirements.includes('smoke_tests'));
40
+ assert.ok(reqs.requirements.includes('rollback_plan'));
41
+ assert.ok(reqs.requirements.includes('monitoring'));
42
+ assert.ok(reqs.requirements.includes('runbooks'));
43
+ });
44
+
45
+ it('should throw for unknown tier', () => {
46
+ assert.throws(
47
+ () => getReleaseRequirements('invalid'),
48
+ /Unknown tier/
49
+ );
50
+ });
51
+ });
52
+
53
+ describe('validateRollbackPlan', () => {
54
+ let tempFile;
55
+
56
+ beforeEach(() => {
57
+ tempFile = path.join(os.tmpdir(), `rollback-${Date.now()}.md`);
58
+ });
59
+
60
+ afterEach(() => {
61
+ try {
62
+ fs.unlinkSync(tempFile);
63
+ } catch (e) {
64
+ // Ignore
65
+ }
66
+ });
67
+
68
+ it('should return failure when rollback plan does not exist', () => {
69
+ const result = validateRollbackPlan('/nonexistent/rollback.md');
70
+ assert.strictEqual(result.pass, false);
71
+ assert.strictEqual(result.valid, false);
72
+ });
73
+
74
+ it('should fail when rollback plan has too few steps', () => {
75
+ const content = `# Rollback Plan
76
+
77
+ 1. Stop the app
78
+ 2. Start the app
79
+ `;
80
+ fs.writeFileSync(tempFile, content);
81
+ const result = validateRollbackPlan(tempFile);
82
+ assert.strictEqual(result.pass, false);
83
+ assert.ok(result.issues.some(i => i.includes('too simple')));
84
+ });
85
+
86
+ it('should pass when rollback plan is complete', () => {
87
+ const content = `# Rollback Plan
88
+
89
+ ## Backup Procedure
90
+ 1. Create database backup
91
+ 2. Backup current code
92
+
93
+ ## Revert Procedure
94
+ 1. Stop the application
95
+ 2. Restore previous version
96
+ 3. Restore database from backup
97
+ 4. Restart application
98
+
99
+ ## Verification
100
+ 1. Check health endpoint
101
+ 2. Verify core functionality
102
+ 3. Monitor error rates
103
+ `;
104
+ fs.writeFileSync(tempFile, content);
105
+ const result = validateRollbackPlan(tempFile);
106
+ assert.strictEqual(result.pass, true);
107
+ assert.ok(result.stepCount >= 3);
108
+ });
109
+
110
+ it('should fail when missing backup procedure', () => {
111
+ const content = `# Rollback Plan
112
+
113
+ 1. Revert code
114
+ 2. Restart app
115
+ `;
116
+ fs.writeFileSync(tempFile, content);
117
+ const result = validateRollbackPlan(tempFile);
118
+ assert.strictEqual(result.pass, false);
119
+ assert.ok(result.issues.some(i => i.includes('backup')));
120
+ });
121
+ });
122
+
123
+ describe('validateReleaseReadiness', () => {
124
+ let tempDir;
125
+
126
+ beforeEach(() => {
127
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gate7-test-'));
128
+ });
129
+
130
+ afterEach(() => {
131
+ try {
132
+ fs.rmSync(tempDir, { recursive: true, force: true });
133
+ } catch (e) {
134
+ // Ignore cleanup errors
135
+ }
136
+ });
137
+
138
+ it('should fail MVP when rollback plan missing', () => {
139
+ const result = validateReleaseReadiness(tempDir, 'mvp');
140
+ assert.strictEqual(result.pass, false);
141
+ assert.ok(result.failures.some(f => f.includes('Rollback')));
142
+ });
143
+
144
+ it('should pass MVP with valid rollback plan', () => {
145
+ // Create docs directory and rollback plan
146
+ const docsDir = path.join(tempDir, 'docs');
147
+ fs.mkdirSync(docsDir);
148
+
149
+ const rollbackContent = `# Rollback Plan
150
+
151
+ ## Backup
152
+ 1. Backup database
153
+ 2. Backup code
154
+
155
+ ## Revert
156
+ 1. Stop application
157
+ 2. Restore previous version
158
+ 3. Restore database
159
+ 4. Restart application
160
+
161
+ ## Verify
162
+ 1. Check health
163
+ 2. Test functionality
164
+ `;
165
+ fs.writeFileSync(path.join(docsDir, 'rollback.md'), rollbackContent);
166
+
167
+ const result = validateReleaseReadiness(tempDir, 'mvp');
168
+ assert.strictEqual(result.pass, true);
169
+ assert.strictEqual(result.rollback_valid, true);
170
+ });
171
+
172
+ it('should fail medium tier without monitoring', () => {
173
+ // Create valid rollback
174
+ const docsDir = path.join(tempDir, 'docs');
175
+ fs.mkdirSync(docsDir);
176
+ fs.writeFileSync(path.join(docsDir, 'rollback.md'), `# Rollback
177
+
178
+ ## Backup
179
+ 1. Backup DB
180
+
181
+ ## Revert
182
+ 1. Stop
183
+ 2. Restore
184
+ 3. Start
185
+
186
+ ## Verify
187
+ 1. Check
188
+ `);
189
+
190
+ const result = validateReleaseReadiness(tempDir, 'medium');
191
+ assert.strictEqual(result.pass, false);
192
+ assert.ok(result.failures.some(f => f.includes('Monitoring')));
193
+ });
194
+
195
+ it('should pass medium tier with monitoring configured', () => {
196
+ // Create docs and monitoring
197
+ const docsDir = path.join(tempDir, 'docs');
198
+ fs.mkdirSync(docsDir);
199
+ fs.mkdirSync(path.join(tempDir, '.planning', 'observability'), { recursive: true });
200
+
201
+ fs.writeFileSync(path.join(docsDir, 'rollback.md'), `# Rollback
202
+
203
+ ## Backup
204
+ 1. Backup DB
205
+
206
+ ## Revert
207
+ 1. Stop
208
+ 2. Restore previous version
209
+ 3. Start
210
+
211
+ ## Verify
212
+ 1. Check
213
+ `);
214
+
215
+ const result = validateReleaseReadiness(tempDir, 'medium');
216
+ assert.strictEqual(result.pass, true, `Expected pass but got failures: ${result.failures.join(', ')}`);
217
+ });
218
+ });
219
+ });