@howlil/ez-agents 3.4.2 → 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 (365) hide show
  1. package/README.md +735 -462
  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 -0
  18. package/agents/ez-requirements-agent.md +377 -0
  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/install.js +3221 -3272
  30. package/bin/lib/analytics/analytics-collector.cjs +86 -0
  31. package/bin/lib/analytics/analytics-reporter.cjs +130 -0
  32. package/bin/lib/analytics/cohort-analyzer.cjs +138 -0
  33. package/bin/lib/analytics/funnel-analyzer.cjs +147 -0
  34. package/bin/lib/analytics/nps-tracker.cjs +147 -0
  35. package/bin/lib/archetype-detector.cjs +289 -0
  36. package/bin/lib/assistant-adapter.cjs +361 -0
  37. package/bin/lib/audit-exec.cjs +175 -0
  38. package/bin/lib/auth.cjs +176 -0
  39. package/bin/lib/backup-service.cjs +422 -0
  40. package/bin/lib/bdd-validator.cjs +622 -0
  41. package/bin/lib/business-flow-mapper.cjs +429 -0
  42. package/bin/lib/circuit-breaker.cjs +276 -0
  43. package/bin/lib/code-complexity-analyzer.cjs +360 -0
  44. package/bin/lib/codebase-analyzer.cjs +241 -0
  45. package/bin/lib/commands.cjs +691 -0
  46. package/bin/lib/config.cjs +236 -0
  47. package/bin/lib/constraint-extractor.cjs +526 -0
  48. package/bin/lib/content-scanner.cjs +238 -0
  49. package/bin/lib/context-cache.cjs +154 -0
  50. package/bin/lib/context-compressor.cjs +102 -0
  51. package/bin/lib/context-deduplicator.cjs +105 -0
  52. package/bin/lib/context-errors.cjs +78 -0
  53. package/bin/lib/context-manager.cjs +338 -0
  54. package/bin/lib/context-metadata-tracker.cjs +140 -0
  55. package/bin/lib/context-relevance-scorer.cjs +99 -0
  56. package/bin/lib/core.cjs +507 -0
  57. package/bin/lib/cost-alerts.cjs +174 -0
  58. package/bin/lib/cost-tracker.cjs +275 -0
  59. package/bin/lib/crash-recovery.cjs +220 -0
  60. package/bin/lib/dependency-graph.cjs +319 -0
  61. package/bin/lib/deploy/deploy-audit-log.cjs +76 -0
  62. package/bin/lib/deploy/deploy-detector.cjs +69 -0
  63. package/bin/lib/deploy/deploy-env-manager.cjs +109 -0
  64. package/bin/lib/deploy/deploy-health-check.cjs +88 -0
  65. package/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
  66. package/bin/lib/deploy/deploy-rollback.cjs +72 -0
  67. package/bin/lib/deploy/deploy-runner.cjs +97 -0
  68. package/bin/lib/deploy/deploy-status.cjs +74 -0
  69. package/bin/lib/discussion-synthesizer.cjs +439 -0
  70. package/bin/lib/error-cache.cjs +114 -0
  71. package/bin/lib/error-registry.cjs +177 -0
  72. package/bin/lib/file-access.cjs +207 -0
  73. package/bin/lib/file-lock.cjs +236 -0
  74. package/bin/lib/finops/budget-enforcer.cjs +126 -0
  75. package/bin/lib/finops/cost-reporter.cjs +132 -0
  76. package/bin/lib/finops/finops-analyzer.cjs +112 -0
  77. package/bin/lib/finops/spot-manager.cjs +118 -0
  78. package/bin/lib/framework-detector.cjs +396 -0
  79. package/bin/lib/frontmatter.cjs +313 -0
  80. package/bin/lib/fs-utils.cjs +153 -0
  81. package/bin/lib/gate-executor.cjs +272 -0
  82. package/bin/lib/gates/README.md +374 -0
  83. package/bin/lib/gates/gate-01-requirement.cjs +303 -0
  84. package/bin/lib/gates/gate-02-architecture.cjs +555 -0
  85. package/bin/lib/gates/gate-03-code.cjs +635 -0
  86. package/bin/lib/gates/gate-04-security.cjs +829 -0
  87. package/bin/lib/git-errors.cjs +83 -0
  88. package/bin/lib/git-utils.cjs +321 -0
  89. package/bin/lib/git-workflow-engine.cjs +1157 -0
  90. package/bin/lib/health-check.cjs +227 -0
  91. package/bin/lib/index.cjs +279 -0
  92. package/bin/lib/init.cjs +725 -0
  93. package/bin/lib/lock-logger.cjs +194 -0
  94. package/bin/lib/lock-state.cjs +263 -0
  95. package/bin/lib/lockfile-validator.cjs +227 -0
  96. package/bin/lib/log-rotation.cjs +71 -0
  97. package/bin/lib/logger.cjs +125 -0
  98. package/bin/lib/memory-compression.cjs +256 -0
  99. package/bin/lib/milestone.cjs +247 -0
  100. package/bin/lib/model-provider.cjs +241 -0
  101. package/bin/lib/package-manager-detector.cjs +203 -0
  102. package/bin/lib/package-manager-executor.cjs +385 -0
  103. package/bin/lib/package-manager-service.cjs +216 -0
  104. package/bin/lib/perf/api-monitor.cjs +88 -0
  105. package/bin/lib/perf/db-optimizer.cjs +78 -0
  106. package/bin/lib/perf/frontend-performance.cjs +56 -0
  107. package/bin/lib/perf/perf-analyzer.cjs +77 -0
  108. package/bin/lib/perf/perf-baseline.cjs +102 -0
  109. package/bin/lib/perf/perf-reporter.cjs +117 -0
  110. package/bin/lib/perf/regression-detector.cjs +92 -0
  111. package/bin/lib/phase.cjs +963 -0
  112. package/bin/lib/planning-write.cjs +123 -0
  113. package/bin/lib/project-reporter.cjs +565 -0
  114. package/bin/lib/quality-gate.cjs +332 -0
  115. package/bin/lib/quality-metrics.cjs +324 -0
  116. package/bin/lib/recovery-manager.cjs +98 -0
  117. package/bin/lib/release-validator.cjs +617 -0
  118. package/bin/lib/retry.cjs +119 -0
  119. package/bin/lib/roadmap.cjs +309 -0
  120. package/bin/lib/safe-exec.cjs +173 -0
  121. package/bin/lib/safe-path.cjs +130 -0
  122. package/bin/lib/security-errors.cjs +62 -0
  123. package/bin/lib/session-chain.cjs +304 -0
  124. package/bin/lib/session-errors.cjs +81 -0
  125. package/bin/lib/session-export.cjs +251 -0
  126. package/bin/lib/session-import.cjs +262 -0
  127. package/bin/lib/session-manager.cjs +280 -0
  128. package/bin/lib/skill-context.cjs +148 -0
  129. package/bin/lib/skill-matcher.cjs +236 -0
  130. package/bin/lib/skill-registry.cjs +360 -0
  131. package/bin/lib/skill-resolver.cjs +449 -0
  132. package/bin/lib/skill-triggers.cjs +90 -0
  133. package/bin/lib/skill-validator.cjs +270 -0
  134. package/bin/lib/skill-versioning.cjs +355 -0
  135. package/bin/lib/stack-detector.cjs +399 -0
  136. package/bin/lib/state.cjs +736 -0
  137. package/bin/lib/tech-debt-analyzer.cjs +309 -0
  138. package/bin/lib/temp-file.cjs +239 -0
  139. package/bin/lib/template.cjs +223 -0
  140. package/bin/lib/test-file-lock.cjs +112 -0
  141. package/bin/lib/test-graceful.cjs +93 -0
  142. package/bin/lib/test-logger.cjs +60 -0
  143. package/bin/lib/test-safe-exec.cjs +38 -0
  144. package/bin/lib/test-safe-path.cjs +33 -0
  145. package/bin/lib/test-temp-file.cjs +125 -0
  146. package/bin/lib/tier-manager.cjs +428 -0
  147. package/bin/lib/timeout-exec.cjs +63 -0
  148. package/bin/lib/tradeoff-analyzer.cjs +284 -0
  149. package/bin/lib/url-fetch.cjs +170 -0
  150. package/bin/lib/verify.cjs +863 -0
  151. package/bin/update.js +217 -214
  152. package/commands/deploy.cjs +53 -0
  153. package/commands/ez/add-tests.md +41 -41
  154. package/commands/ez/audit-milestone.md +36 -36
  155. package/commands/ez/complete-milestone.md +136 -136
  156. package/commands/ez/discuss-phase.md +90 -90
  157. package/commands/ez/execute-phase.md +52 -41
  158. package/commands/ez/help.md +22 -22
  159. package/commands/ez/map-codebase.md +71 -71
  160. package/commands/ez/new-milestone.md +44 -44
  161. package/commands/ez/new-project.md +51 -42
  162. package/commands/ez/plan-phase.md +53 -45
  163. package/commands/ez/progress.md +36 -24
  164. package/commands/ez/quick.md +45 -45
  165. package/commands/ez/resume-work.md +40 -40
  166. package/commands/ez/run-phase.md +580 -0
  167. package/commands/ez/settings.md +36 -36
  168. package/commands/ez/update.md +37 -37
  169. package/commands/ez/verify-work.md +402 -38
  170. package/commands/health-check.cjs +44 -0
  171. package/commands/rollback.cjs +47 -0
  172. package/ez-agents/bin/ez-tools.cjs +1692 -716
  173. package/ez-agents/bin/guards/autonomy-guard.cjs +346 -0
  174. package/ez-agents/bin/guards/context-budget-guard.cjs +247 -0
  175. package/ez-agents/bin/guards/hallucination-guard.cjs +271 -0
  176. package/ez-agents/bin/guards/hidden-state-guard.cjs +182 -0
  177. package/ez-agents/bin/guards/team-overhead-guard.cjs +266 -0
  178. package/ez-agents/bin/guards/tool-sprawl-guard.cjs +271 -0
  179. package/ez-agents/bin/lib/analytics/analytics-collector.cjs +86 -0
  180. package/ez-agents/bin/lib/analytics/analytics-reporter.cjs +130 -0
  181. package/ez-agents/bin/lib/analytics/cohort-analyzer.cjs +138 -0
  182. package/ez-agents/bin/lib/analytics/funnel-analyzer.cjs +147 -0
  183. package/ez-agents/bin/lib/analytics/nps-tracker.cjs +147 -0
  184. package/ez-agents/bin/lib/archetype-detector.cjs +289 -0
  185. package/ez-agents/bin/lib/audit-exec.cjs +166 -167
  186. package/ez-agents/bin/lib/auth.cjs +176 -176
  187. package/ez-agents/bin/lib/backup-service.cjs +422 -0
  188. package/ez-agents/bin/lib/bdd-validator.cjs +622 -0
  189. package/ez-agents/bin/lib/business-flow-mapper.cjs +429 -0
  190. package/ez-agents/bin/lib/code-complexity-analyzer.cjs +360 -0
  191. package/ez-agents/bin/lib/codebase-analyzer.cjs +241 -0
  192. package/ez-agents/bin/lib/commands.cjs +685 -685
  193. package/ez-agents/bin/lib/config.cjs +41 -1
  194. package/ez-agents/bin/lib/constraint-extractor.cjs +526 -0
  195. package/ez-agents/bin/lib/content-scanner.cjs +238 -0
  196. package/ez-agents/bin/lib/context-cache.cjs +154 -0
  197. package/ez-agents/bin/lib/context-errors.cjs +71 -0
  198. package/ez-agents/bin/lib/context-manager.cjs +220 -0
  199. package/ez-agents/bin/lib/core.cjs +507 -512
  200. package/ez-agents/bin/lib/cost-tracker.cjs +243 -0
  201. package/ez-agents/bin/lib/crash-recovery.cjs +172 -0
  202. package/ez-agents/bin/lib/dependency-graph.cjs +319 -0
  203. package/ez-agents/bin/lib/deploy/deploy-audit-log.cjs +76 -0
  204. package/ez-agents/bin/lib/deploy/deploy-detector.cjs +69 -0
  205. package/ez-agents/bin/lib/deploy/deploy-env-manager.cjs +109 -0
  206. package/ez-agents/bin/lib/deploy/deploy-health-check.cjs +88 -0
  207. package/ez-agents/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
  208. package/ez-agents/bin/lib/deploy/deploy-rollback.cjs +72 -0
  209. package/ez-agents/bin/lib/deploy/deploy-runner.cjs +97 -0
  210. package/ez-agents/bin/lib/deploy/deploy-status.cjs +74 -0
  211. package/ez-agents/bin/lib/discussion-synthesizer.cjs +458 -0
  212. package/ez-agents/bin/lib/file-access.cjs +207 -0
  213. package/ez-agents/bin/lib/finops/budget-enforcer.cjs +126 -0
  214. package/ez-agents/bin/lib/finops/cost-reporter.cjs +132 -0
  215. package/ez-agents/bin/lib/finops/finops-analyzer.cjs +112 -0
  216. package/ez-agents/bin/lib/finops/spot-manager.cjs +118 -0
  217. package/ez-agents/bin/lib/framework-detector.cjs +396 -0
  218. package/ez-agents/bin/lib/frontmatter.cjs +3 -1
  219. package/ez-agents/bin/lib/gates/README.md +374 -0
  220. package/ez-agents/bin/lib/gates/gate-01-requirement.cjs +303 -0
  221. package/ez-agents/bin/lib/gates/gate-02-architecture.cjs +555 -0
  222. package/ez-agents/bin/lib/gates/gate-03-code.cjs +635 -0
  223. package/ez-agents/bin/lib/gates/gate-04-security.cjs +829 -0
  224. package/ez-agents/bin/lib/git-errors.cjs +83 -0
  225. package/ez-agents/bin/lib/git-utils.cjs +118 -0
  226. package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -0
  227. package/ez-agents/bin/lib/health-check.cjs +162 -162
  228. package/ez-agents/bin/lib/index.cjs +40 -2
  229. package/ez-agents/bin/lib/init.cjs +0 -2
  230. package/ez-agents/bin/lib/lockfile-validator.cjs +227 -0
  231. package/ez-agents/bin/lib/log-rotation.cjs +71 -0
  232. package/ez-agents/bin/lib/logger.cjs +99 -154
  233. package/ez-agents/bin/lib/memory-compression.cjs +256 -0
  234. package/ez-agents/bin/lib/package-manager-detector.cjs +203 -0
  235. package/ez-agents/bin/lib/package-manager-executor.cjs +385 -0
  236. package/ez-agents/bin/lib/package-manager-service.cjs +216 -0
  237. package/ez-agents/bin/lib/perf/api-monitor.cjs +88 -0
  238. package/ez-agents/bin/lib/perf/db-optimizer.cjs +78 -0
  239. package/ez-agents/bin/lib/perf/frontend-performance.cjs +56 -0
  240. package/ez-agents/bin/lib/perf/perf-analyzer.cjs +77 -0
  241. package/ez-agents/bin/lib/perf/perf-baseline.cjs +102 -0
  242. package/ez-agents/bin/lib/perf/perf-reporter.cjs +117 -0
  243. package/ez-agents/bin/lib/perf/regression-detector.cjs +92 -0
  244. package/ez-agents/bin/lib/project-reporter.cjs +502 -0
  245. package/ez-agents/bin/lib/quality-gate.cjs +332 -0
  246. package/ez-agents/bin/lib/recovery-manager.cjs +98 -0
  247. package/ez-agents/bin/lib/release-validator.cjs +617 -0
  248. package/ez-agents/bin/lib/safe-exec.cjs +128 -214
  249. package/ez-agents/bin/lib/security-errors.cjs +62 -0
  250. package/ez-agents/bin/lib/session-chain.cjs +304 -0
  251. package/ez-agents/bin/lib/session-errors.cjs +81 -0
  252. package/ez-agents/bin/lib/session-export.cjs +251 -0
  253. package/ez-agents/bin/lib/session-import.cjs +262 -0
  254. package/ez-agents/bin/lib/session-manager.cjs +280 -0
  255. package/ez-agents/bin/lib/skill-context.cjs +148 -0
  256. package/ez-agents/bin/lib/skill-matcher.cjs +236 -0
  257. package/ez-agents/bin/lib/skill-registry.cjs +341 -0
  258. package/ez-agents/bin/lib/skill-resolver.cjs +449 -0
  259. package/ez-agents/bin/lib/skill-triggers.cjs +90 -0
  260. package/ez-agents/bin/lib/skill-validator.cjs +270 -0
  261. package/ez-agents/bin/lib/skill-versioning.cjs +355 -0
  262. package/ez-agents/bin/lib/stack-detector.cjs +399 -0
  263. package/ez-agents/bin/lib/tech-debt-analyzer.cjs +309 -0
  264. package/ez-agents/bin/lib/tier-manager.cjs +428 -0
  265. package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
  266. package/ez-agents/bin/lib/url-fetch.cjs +170 -0
  267. package/ez-agents/bin/lib/verify.cjs +863 -863
  268. package/ez-agents/references/decimal-phase-calculation.md +65 -65
  269. package/ez-agents/references/git-integration.md +248 -248
  270. package/ez-agents/references/git-planning-commit.md +38 -38
  271. package/ez-agents/references/metrics-schema.md +118 -0
  272. package/ez-agents/references/model-profile-resolution.md +34 -34
  273. package/ez-agents/references/model-profiles.md +93 -93
  274. package/ez-agents/references/phase-argument-parsing.md +61 -61
  275. package/ez-agents/references/planning-config.md +340 -200
  276. package/ez-agents/references/tier-strategy.md +103 -0
  277. package/ez-agents/references/ui-brand.md +160 -160
  278. package/ez-agents/references/verification-patterns.md +612 -612
  279. package/ez-agents/templates/DEBUG.md +164 -164
  280. package/ez-agents/templates/UAT.md +247 -247
  281. package/ez-agents/templates/agent-output-format.md +404 -0
  282. package/ez-agents/templates/bdd-feature.md +173 -0
  283. package/ez-agents/templates/codebase/architecture.md +255 -255
  284. package/ez-agents/templates/codebase/structure.md +285 -285
  285. package/ez-agents/templates/copilot-instructions.md +7 -7
  286. package/ez-agents/templates/debug-subagent-prompt.md +91 -91
  287. package/ez-agents/templates/discovery.md +146 -146
  288. package/ez-agents/templates/discussion.md +68 -0
  289. package/ez-agents/templates/handoff-protocol.md +294 -0
  290. package/ez-agents/templates/incident-runbook.md +205 -0
  291. package/ez-agents/templates/mode-workflow-templates.md +301 -0
  292. package/ez-agents/templates/phase-prompt.md +610 -610
  293. package/ez-agents/templates/planner-subagent-prompt.md +117 -117
  294. package/ez-agents/templates/project.md +184 -184
  295. package/ez-agents/templates/release-checklist.md +136 -0
  296. package/ez-agents/templates/research.md +552 -552
  297. package/ez-agents/templates/rollback-plan.md +201 -0
  298. package/ez-agents/templates/security-user-setup.md +244 -0
  299. package/ez-agents/templates/skill-validation-rules.md +476 -0
  300. package/ez-agents/templates/state.md +180 -176
  301. package/ez-agents/templates/summary-complex.md +59 -59
  302. package/ez-agents/tests/gates/gate-01-02.test.cjs +812 -0
  303. package/ez-agents/tests/gates/gate-03-04.test.cjs +762 -0
  304. package/ez-agents/tests/gates/gate-05-validator.test.cjs +145 -0
  305. package/ez-agents/tests/gates/gate-06-docs-validator.test.cjs +244 -0
  306. package/ez-agents/tests/gates/gate-07-release-validator.test.cjs +219 -0
  307. package/ez-agents/tests/guards/context-budget-guard.test.cjs +145 -0
  308. package/ez-agents/tests/guards/edge-case-guards.test.cjs +238 -0
  309. package/ez-agents/tests/guards/hallucination-guard.test.cjs +124 -0
  310. package/ez-agents/workflows/audit-milestone.md +1 -1
  311. package/ez-agents/workflows/autonomous.md +131 -30
  312. package/ez-agents/workflows/complete-milestone.md +1 -1
  313. package/ez-agents/workflows/discuss-phase.md +1 -1
  314. package/ez-agents/workflows/execute-phase.md +169 -3
  315. package/ez-agents/workflows/help.md +86 -133
  316. package/ez-agents/workflows/hotfix.md +291 -0
  317. package/ez-agents/workflows/new-milestone.md +340 -11
  318. package/ez-agents/workflows/new-project.md +294 -318
  319. package/ez-agents/workflows/plan-phase.md +22 -40
  320. package/ez-agents/workflows/progress.md +15 -25
  321. package/ez-agents/workflows/release.md +253 -0
  322. package/ez-agents/workflows/resume-session.md +215 -0
  323. package/ez-agents/workflows/run-phase.md +531 -0
  324. package/ez-agents/workflows/settings.md +2 -35
  325. package/hooks/dist/ez-check-update.js +81 -81
  326. package/hooks/dist/ez-context-monitor.js +148 -141
  327. package/hooks/dist/ez-statusline.js +115 -115
  328. package/package.json +78 -64
  329. package/scripts/fix-qwen-installation.js +144 -144
  330. package/agents/ez-integration-checker.md +0 -443
  331. package/agents/ez-nyquist-auditor.md +0 -176
  332. package/agents/ez-plan-checker.md +0 -706
  333. package/agents/ez-research-synthesizer.md +0 -247
  334. package/agents/ez-ui-auditor.md +0 -439
  335. package/agents/ez-ui-checker.md +0 -300
  336. package/agents/ez-ui-researcher.md +0 -353
  337. package/commands/ez/add-phase.md +0 -43
  338. package/commands/ez/add-todo.md +0 -47
  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/health.md +0 -22
  345. package/commands/ez/insert-phase.md +0 -32
  346. package/commands/ez/join-discord.md +0 -18
  347. package/commands/ez/list-phase-assumptions.md +0 -46
  348. package/commands/ez/pause-work.md +0 -38
  349. package/commands/ez/plan-milestone-gaps.md +0 -34
  350. package/commands/ez/reapply-patches.md +0 -124
  351. package/commands/ez/remove-phase.md +0 -31
  352. package/commands/ez/research-phase.md +0 -190
  353. package/commands/ez/set-profile.md +0 -34
  354. package/commands/ez/stats.md +0 -18
  355. package/commands/ez/ui-phase.md +0 -34
  356. package/commands/ez/ui-review.md +0 -32
  357. package/commands/ez/validate-phase.md +0 -35
  358. package/ez-agents/templates/UI-SPEC.md +0 -100
  359. package/ez-agents/templates/VALIDATION.md +0 -76
  360. package/ez-agents/templates/context.md +0 -352
  361. package/ez-agents/templates/verification-report.md +0 -322
  362. package/ez-agents/workflows/research-phase.md +0 -74
  363. package/ez-agents/workflows/ui-phase.md +0 -290
  364. package/ez-agents/workflows/ui-review.md +0 -157
  365. package/ez-agents/workflows/validate-phase.md +0 -167
@@ -0,0 +1,555 @@
1
+ /**
2
+ * Gate 2: Architecture Review
3
+ *
4
+ * Validates architecture against skill recommendations and checks for overengineering.
5
+ *
6
+ * Checks:
7
+ * 1. Structure matches skill recommendations (when skill registry is available)
8
+ * 2. Abstraction layer count is appropriate (< 3 for most projects)
9
+ * 3. No premature optimization patterns (microservices, repository pattern without need)
10
+ * 4. No unnecessary CQRS for simple CRUD operations
11
+ *
12
+ * @module gates/gate-02-architecture
13
+ */
14
+
15
+ const { z } = require('zod');
16
+ const path = require('path');
17
+ const fs = require('fs');
18
+
19
+ /**
20
+ * Zod schema for a file in the proposed architecture
21
+ * @type {z.ZodSchema}
22
+ */
23
+ const fileSchema = z.object({
24
+ /** File path relative to project root */
25
+ path: z.string(),
26
+ /** File type/category (e.g., 'controller', 'service', 'repository', 'model') */
27
+ type: z.string().optional(),
28
+ /** Abstraction layer depth (0 = root, 1 = first layer, etc.) */
29
+ layer: z.number().int().min(0).optional(),
30
+ /** Dependencies (other files this file depends on) */
31
+ dependencies: z.array(z.string()).optional(),
32
+ });
33
+
34
+ /**
35
+ * Zod schema for architecture component
36
+ * @type {z.ZodSchema}
37
+ */
38
+ const componentSchema = z.object({
39
+ /** Component name */
40
+ name: z.string(),
41
+ /** Component type (e.g., 'controller', 'service', 'repository', 'use-case') */
42
+ type: z.string(),
43
+ /** Layer depth */
44
+ layer: z.number().int().min(0),
45
+ /** Files in this component */
46
+ files: z.array(z.string()).optional(),
47
+ });
48
+
49
+ /**
50
+ * Zod schema for skill recommendation
51
+ * @type {z.ZodSchema}
52
+ */
53
+ const skillRecommendationSchema = z.object({
54
+ /** Skill name */
55
+ skillName: z.string(),
56
+ /** Recommended project structure */
57
+ recommendedStructure: z.array(z.string()).optional(),
58
+ /** Best practices */
59
+ bestPractices: z.array(z.string()).optional(),
60
+ /** Anti-patterns to avoid */
61
+ antiPatterns: z.array(z.string()).optional(),
62
+ /** Maximum recommended abstraction layers */
63
+ maxAbstractionLayers: z.number().int().min(1).optional(),
64
+ });
65
+
66
+ /**
67
+ * Zod schema for the gate context
68
+ * @type {z.ZodSchema}
69
+ */
70
+ const gateContextSchema = z.object({
71
+ /** Proposed project structure (array of files) */
72
+ files: z.array(fileSchema).optional(),
73
+ /** Architecture components */
74
+ components: z.array(componentSchema).optional(),
75
+ /** Project tier/archetype (mvp, medium, enterprise) */
76
+ projectTier: z.enum(['mvp', 'medium', 'enterprise']).optional(),
77
+ /** Skill recommendations (from Skill Registry) */
78
+ skillRecommendations: z.array(skillRecommendationSchema).optional(),
79
+ /** Explicit architecture description */
80
+ architecture: z.object({
81
+ /** Number of abstraction layers */
82
+ abstractionLayers: z.number().int().min(0).optional(),
83
+ /** Patterns used */
84
+ patterns: z.array(z.string()).optional(),
85
+ /** Justification for complex patterns */
86
+ justifications: z.record(z.string()).optional(),
87
+ }).optional(),
88
+ /** Simple flags for common patterns */
89
+ hasRepositoryPattern: z.boolean().optional(),
90
+ hasCQRS: z.boolean().optional(),
91
+ hasEventBus: z.boolean().optional(),
92
+ hasMicroservices: z.boolean().optional(),
93
+ /** Event count (for detecting overengineering) */
94
+ eventCount: z.number().int().min(0).optional(),
95
+ /** CRUD operation count */
96
+ crudOperationCount: z.number().int().min(0).optional(),
97
+ });
98
+
99
+ /**
100
+ * Default abstraction layer thresholds by project tier
101
+ */
102
+ const ABSTRACTION_THRESHOLDS = {
103
+ mvp: 2, // MVP: max 2 layers (e.g., controller → service)
104
+ medium: 3, // Medium: max 3 layers (e.g., controller → service → repository)
105
+ enterprise: 4, // Enterprise: max 4 layers (e.g., controller → service → repository → domain)
106
+ };
107
+
108
+ /**
109
+ * Count abstraction layers from file structure
110
+ *
111
+ * Analyzes file paths and types to determine the depth of abstraction layers.
112
+ * Common layers: controller → service → repository → model/domain
113
+ *
114
+ * @param {Array} files - Array of file objects with path and type
115
+ * @returns {number} Maximum abstraction layer depth
116
+ */
117
+ function countAbstractionLayers(files) {
118
+ if (!files || files.length === 0) {
119
+ return 0;
120
+ }
121
+
122
+ // If files have explicit layer property, use the maximum
123
+ const maxLayer = Math.max(...files.map(f => f.layer ?? 0));
124
+ if (maxLayer > 0) {
125
+ return maxLayer;
126
+ }
127
+
128
+ // Otherwise, infer from file paths and types
129
+ const layerTypes = new Set();
130
+
131
+ for (const file of files) {
132
+ const filePath = file.path || '';
133
+ const fileType = file.type || '';
134
+
135
+ // Check type field first
136
+ if (fileType) {
137
+ layerTypes.add(fileType.toLowerCase());
138
+ }
139
+
140
+ // Infer from path
141
+ const pathLower = filePath.toLowerCase();
142
+ if (pathLower.includes('/controller') || pathLower.includes('/controllers')) {
143
+ layerTypes.add('controller');
144
+ }
145
+ if (pathLower.includes('/service') || pathLower.includes('/services')) {
146
+ layerTypes.add('service');
147
+ }
148
+ if (pathLower.includes('/repository') || pathLower.includes('/repositories') ||
149
+ pathLower.includes('/dao') || pathLower.includes('/data-access')) {
150
+ layerTypes.add('repository');
151
+ }
152
+ if (pathLower.includes('/use-case') || pathLower.includes('/usecase') ||
153
+ pathLower.includes('/usecase') || pathLower.includes('/commands') ||
154
+ pathLower.includes('/queries') || pathLower.includes('/handlers')) {
155
+ layerTypes.add('use-case');
156
+ }
157
+ if (pathLower.includes('/model') || pathLower.includes('/models') ||
158
+ pathLower.includes('/domain') || pathLower.includes('/entity')) {
159
+ layerTypes.add('model');
160
+ }
161
+ if (pathLower.includes('/middleware')) {
162
+ layerTypes.add('middleware');
163
+ }
164
+ }
165
+
166
+ // Define typical layer ordering
167
+ const layerOrder = ['middleware', 'controller', 'use-case', 'service', 'repository', 'model'];
168
+
169
+ // Count distinct layers present
170
+ let layerCount = 0;
171
+ for (const layer of layerOrder) {
172
+ if (layerTypes.has(layer)) {
173
+ layerCount++;
174
+ }
175
+ }
176
+
177
+ return layerCount;
178
+ }
179
+
180
+ /**
181
+ * Detect premature repository pattern
182
+ *
183
+ * Repository pattern is overengineering when:
184
+ * - Project is MVP tier with simple CRUD
185
+ * - No complex data access logic
186
+ * - Single data source (no need to swap databases)
187
+ *
188
+ * @param {Object} context - Gate context
189
+ * @returns {{ detected: boolean, reason: string }}
190
+ */
191
+ function detectPrematureRepository(context) {
192
+ const result = { detected: false, reason: '' };
193
+
194
+ // If explicitly flagged
195
+ if (context.hasRepositoryPattern) {
196
+ const tier = context.projectTier || 'mvp';
197
+ const crudCount = context.crudOperationCount ?? 0;
198
+
199
+ // Check if there's justification first - if provided, allow it
200
+ if (context.architecture?.justifications?.repository) {
201
+ // Justification provided, allow it
202
+ return result;
203
+ }
204
+
205
+ // MVP with simple CRUD (< 10 operations) - likely overengineering
206
+ if (tier === 'mvp' && crudCount < 10) {
207
+ result.detected = true;
208
+ result.reason = 'Repository pattern detected in MVP project with simple CRUD operations. ' +
209
+ 'Consider using direct data access for MVP tier. Add justification if pattern is necessary.';
210
+ return result;
211
+ }
212
+ }
213
+
214
+ return result;
215
+ }
216
+
217
+ /**
218
+ * Detect unnecessary CQRS
219
+ *
220
+ * CQRS is overengineering when:
221
+ * - Simple CRUD application
222
+ * - No complex read/write separation needs
223
+ * - Low event count
224
+ *
225
+ * @param {Object} context - Gate context
226
+ * @returns {{ detected: boolean, reason: string }}
227
+ */
228
+ function detectUnnecessaryCQRS(context) {
229
+ const result = { detected: false, reason: '' };
230
+
231
+ // If explicitly flagged
232
+ if (context.hasCQRS) {
233
+ const crudCount = context.crudOperationCount ?? 0;
234
+ const eventCount = context.eventCount ?? 0;
235
+ const tier = context.projectTier || 'mvp';
236
+
237
+ // Check justification first - if provided, allow it
238
+ if (context.architecture?.justifications?.cqrs) {
239
+ return result;
240
+ }
241
+
242
+ // Simple CRUD with CQRS - likely overengineering
243
+ if (crudCount < 15 && eventCount < 5) {
244
+ result.detected = true;
245
+ result.reason = `CQRS pattern detected for simple CRUD application (${crudCount} operations, ${eventCount} events). ` +
246
+ 'CQRS adds complexity; consider using for projects with complex read/write separation needs or high event volume.';
247
+ return result;
248
+ }
249
+
250
+ // MVP with CQRS but low complexity
251
+ if (tier === 'mvp' && (crudCount < 20 || eventCount < 10)) {
252
+ result.detected = true;
253
+ result.reason = 'CQRS in MVP project without clear justification. ' +
254
+ 'Add explicit justification explaining read/write separation needs.';
255
+ }
256
+ }
257
+
258
+ return result;
259
+ }
260
+
261
+ /**
262
+ * Detect premature event bus / event-driven architecture
263
+ *
264
+ * Event bus is overengineering when:
265
+ * - Very few events (< 3)
266
+ * - Simple application flow
267
+ * - No async processing needs
268
+ *
269
+ * @param {Object} context - Gate context
270
+ * @returns {{ detected: boolean, reason: string }}
271
+ */
272
+ function detectPrematureEventBus(context) {
273
+ const result = { detected: false, reason: '' };
274
+
275
+ if (context.hasEventBus) {
276
+ const eventCount = context.eventCount ?? 0;
277
+
278
+ if (eventCount < 3) {
279
+ result.detected = true;
280
+ result.reason = `Event bus with only ${eventCount} events. ` +
281
+ 'For 1-2 events, consider direct function calls or simple pub/sub. ' +
282
+ 'Event bus adds complexity that may not be justified.';
283
+ return result;
284
+ }
285
+ }
286
+
287
+ return result;
288
+ }
289
+
290
+ /**
291
+ * Detect premature microservices
292
+ *
293
+ * Microservices are overengineering when:
294
+ * - MVP tier project
295
+ * - Small team (< 5 developers implied by MVP)
296
+ * - No explicit scalability requirements
297
+ *
298
+ * @param {Object} context - Gate context
299
+ * @returns {{ detected: boolean, reason: string }}
300
+ */
301
+ function detectPrematureMicroservices(context) {
302
+ const result = { detected: false, reason: '' };
303
+
304
+ if (context.hasMicroservices) {
305
+ const tier = context.projectTier || 'mvp';
306
+
307
+ // Check justification first - if provided, allow it
308
+ if (context.architecture?.justifications?.microservices) {
309
+ return result;
310
+ }
311
+
312
+ if (tier === 'mvp') {
313
+ result.detected = true;
314
+ result.reason = 'Microservices architecture in MVP project. ' +
315
+ 'Consider monolith-first approach for MVP. Microservices add operational complexity ' +
316
+ 'that should be justified by team size, scalability needs, or domain complexity.';
317
+ return result;
318
+ }
319
+
320
+ // Other tiers without justification
321
+ result.detected = true;
322
+ result.reason = 'Microservices without explicit justification. ' +
323
+ 'Add justification explaining domain boundaries, team structure, or scalability requirements.';
324
+ }
325
+
326
+ return result;
327
+ }
328
+
329
+ /**
330
+ * Check structure against skill recommendations
331
+ *
332
+ * @param {Array} skillRecommendations - Array of skill recommendations
333
+ * @param {Object} architecture - Proposed architecture
334
+ * @returns {{ deviations: Array<{skill: string, deviation: string, suggestion: string}>, matched: string[] }}
335
+ */
336
+ function checkSkillAlignment(skillRecommendations, architecture) {
337
+ const deviations = [];
338
+ const matched = [];
339
+
340
+ if (!skillRecommendations || skillRecommendations.length === 0) {
341
+ return { deviations, matched };
342
+ }
343
+
344
+ for (const skill of skillRecommendations) {
345
+ const skillName = skill.skillName;
346
+
347
+ // Check recommended structure
348
+ if (skill.recommendedStructure && architecture?.patterns) {
349
+ const recommendedPatterns = skill.recommendedStructure.map(s => s.toLowerCase());
350
+ const actualPatterns = architecture.patterns.map(p => p.toLowerCase());
351
+
352
+ for (const recommended of recommendedPatterns) {
353
+ if (actualPatterns.some(p => p.includes(recommended))) {
354
+ matched.push(`${skillName}: ${recommended}`);
355
+ }
356
+ }
357
+ }
358
+
359
+ // Check anti-patterns
360
+ if (skill.antiPatterns && architecture?.patterns) {
361
+ const antiPatterns = skill.antiPatterns.map(ap => ap.toLowerCase());
362
+ const actualPatterns = architecture.patterns.map(p => p.toLowerCase());
363
+
364
+ for (const antiPattern of antiPatterns) {
365
+ if (actualPatterns.some(p => p.includes(antiPattern))) {
366
+ deviations.push({
367
+ skill: skillName,
368
+ deviation: `Uses anti-pattern '${antiPattern}' flagged by skill`,
369
+ suggestion: skill.bestPractices?.[0] || 'Review skill recommendations',
370
+ });
371
+ }
372
+ }
373
+ }
374
+
375
+ // Check abstraction layers
376
+ if (skill.maxAbstractionLayers && architecture?.abstractionLayers) {
377
+ if (architecture.abstractionLayers > skill.maxAbstractionLayers) {
378
+ deviations.push({
379
+ skill: skillName,
380
+ deviation: `Abstraction layers (${architecture.abstractionLayers}) exceeds skill recommendation (${skill.maxAbstractionLayers})`,
381
+ suggestion: `Consider reducing to ${skill.maxAbstractionLayers} layers or fewer`,
382
+ });
383
+ }
384
+ }
385
+ }
386
+
387
+ return { deviations, matched };
388
+ }
389
+
390
+ /**
391
+ * Gate 2 Executor: Architecture Review
392
+ *
393
+ * @param {Object} context - Gate context (validated against gateContextSchema)
394
+ * @returns {Promise<{ passed: boolean, errors: Array<{path: string, message: string}>, warnings: string[] }>}
395
+ */
396
+ async function executeGate2(context) {
397
+ const errors = [];
398
+ const warnings = [];
399
+
400
+ // Determine project tier
401
+ const tier = context.projectTier || 'mvp';
402
+ const maxLayers = ABSTRACTION_THRESHOLDS[tier];
403
+
404
+ // Count abstraction layers
405
+ let abstractionLayers = context.architecture?.abstractionLayers;
406
+ if (abstractionLayers === undefined && context.files) {
407
+ abstractionLayers = countAbstractionLayers(context.files);
408
+ }
409
+
410
+ if (abstractionLayers !== undefined) {
411
+ if (abstractionLayers > maxLayers) {
412
+ errors.push({
413
+ path: 'architecture.abstractionLayers',
414
+ message: `Too many abstraction layers (${abstractionLayers}) for ${tier} project. ` +
415
+ `Maximum recommended: ${maxLayers}. Consider flattening architecture.`,
416
+ });
417
+ } else if (abstractionLayers > 3) {
418
+ warnings.push(
419
+ `Architecture has ${abstractionLayers} abstraction layers. ` +
420
+ 'Consider simplifying if possible. Layers > 3 often indicate overengineering.'
421
+ );
422
+ }
423
+ }
424
+
425
+ // Check for overengineering patterns
426
+
427
+ // 1. Premature repository pattern
428
+ const repoCheck = detectPrematureRepository(context);
429
+ if (repoCheck.detected) {
430
+ errors.push({
431
+ path: 'architecture.patterns',
432
+ message: repoCheck.reason,
433
+ });
434
+ }
435
+
436
+ // 2. Unnecessary CQRS
437
+ const cqrsCheck = detectUnnecessaryCQRS(context);
438
+ if (cqrsCheck.detected) {
439
+ errors.push({
440
+ path: 'architecture.patterns',
441
+ message: cqrsCheck.reason,
442
+ });
443
+ }
444
+
445
+ // 3. Premature event bus
446
+ const eventBusCheck = detectPrematureEventBus(context);
447
+ if (eventBusCheck.detected) {
448
+ warnings.push(eventBusCheck.reason);
449
+ }
450
+
451
+ // 4. Premature microservices
452
+ const microservicesCheck = detectPrematureMicroservices(context);
453
+ if (microservicesCheck.detected) {
454
+ errors.push({
455
+ path: 'architecture.patterns',
456
+ message: microservicesCheck.reason,
457
+ });
458
+ }
459
+
460
+ // Check skill alignment
461
+ if (context.skillRecommendations && context.skillRecommendations.length > 0) {
462
+ const { deviations, matched } = checkSkillAlignment(
463
+ context.skillRecommendations,
464
+ context.architecture
465
+ );
466
+
467
+ for (const deviation of deviations) {
468
+ warnings.push(
469
+ `Skill '${deviation.skill}': ${deviation.deviation}. ` +
470
+ `Suggestion: ${deviation.suggestion}`
471
+ );
472
+ }
473
+
474
+ // Log matched recommendations (info only)
475
+ if (matched.length > 0) {
476
+ // Could add to a separate 'info' field if needed
477
+ }
478
+ }
479
+
480
+ // Check for unjustified deviations from skill recommendations
481
+ if (context.architecture?.justifications) {
482
+ // Justifications provided - acknowledge but don't block
483
+ const justificationKeys = Object.keys(context.architecture.justifications);
484
+ if (justificationKeys.length > 0) {
485
+ // This is informational - justifications allow deviation from recommendations
486
+ }
487
+ }
488
+
489
+ return {
490
+ passed: errors.length === 0,
491
+ errors,
492
+ warnings,
493
+ };
494
+ }
495
+
496
+ /**
497
+ * Create and register Gate 2 with a QualityGate instance
498
+ *
499
+ * @param {QualityGate} gateCoordinator - QualityGate coordinator instance
500
+ * @returns {void}
501
+ */
502
+ function registerGate2(gateCoordinator) {
503
+ gateCoordinator.registerGate('gate-02-architecture', gateContextSchema, executeGate2);
504
+ }
505
+
506
+ /**
507
+ * Load skill recommendations from Skill Registry
508
+ *
509
+ * @param {string} [skillRegistryPath] - Optional path to skill registry module
510
+ * @returns {Promise<Array>} Array of skill recommendations
511
+ */
512
+ async function loadSkillRecommendations(skillRegistryPath) {
513
+ try {
514
+ // Try to load skill registry if path provided
515
+ if (skillRegistryPath && fs.existsSync(skillRegistryPath)) {
516
+ const { SkillRegistry } = require(skillRegistryPath);
517
+ const registry = new SkillRegistry();
518
+ await registry.load();
519
+
520
+ // Get all skills and extract recommendations
521
+ const skills = registry.getAll();
522
+ return skills
523
+ .filter(s => s.recommended_structure || s.best_practices || s.anti_patterns)
524
+ .map(s => ({
525
+ skillName: s.name,
526
+ recommendedStructure: s.recommended_structure,
527
+ bestPractices: s.best_practices,
528
+ antiPatterns: s.anti_patterns,
529
+ maxAbstractionLayers: s.max_abstraction_layers,
530
+ }));
531
+ }
532
+ } catch (err) {
533
+ // Skill registry not available - return empty array
534
+ // Gate will still work with explicit context.skillRecommendations
535
+ }
536
+
537
+ return [];
538
+ }
539
+
540
+ module.exports = {
541
+ executeGate2,
542
+ registerGate2,
543
+ fileSchema,
544
+ componentSchema,
545
+ skillRecommendationSchema,
546
+ gateContextSchema,
547
+ countAbstractionLayers,
548
+ detectPrematureRepository,
549
+ detectUnnecessaryCQRS,
550
+ detectPrematureEventBus,
551
+ detectPrematureMicroservices,
552
+ checkSkillAlignment,
553
+ loadSkillRecommendations,
554
+ ABSTRACTION_THRESHOLDS,
555
+ };