@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,289 @@
1
+ /**
2
+ * Archetype Detector — Project type classification from codebase patterns
3
+ *
4
+ * Provides:
5
+ * - detect(structure, stack, flows): Pattern-based archetype detection
6
+ * - calculateConfidence(archetype, evidence): Confidence scoring
7
+ */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+
12
+ class ArchetypeDetector {
13
+ constructor(rootPath) {
14
+ this.rootPath = rootPath;
15
+
16
+ // Archetype patterns for detection
17
+ this.archetypePatterns = {
18
+ dashboard: {
19
+ patterns: ['Chart', 'Metric', 'Dashboard', 'Admin', 'Analytics', 'stats', 'metrics', 'analytics', 'graph', 'widget', 'kpi', 'report'],
20
+ routes: ['/dashboard', '/admin', '/analytics', '/reports', '/metrics'],
21
+ dependencies: ['recharts', 'chart.js', 'd3', 'plotly', 'highcharts', 'apexcharts']
22
+ },
23
+ POS: {
24
+ patterns: ['Product', 'Order', 'Payment', 'Cart', 'Checkout', 'Inventory', 'Store', 'Register', 'Terminal', 'Receipt', 'Cashier'],
25
+ routes: ['/pos', '/checkout', '/register', '/inventory', '/products'],
26
+ dependencies: ['stripe-terminal', 'square', '@stripe/stripe-js']
27
+ },
28
+ SaaS: {
29
+ patterns: ['Subscription', 'Tenant', 'Plan', 'Billing', 'User', 'Account', 'Recurring', 'Invoice', 'Pricing'],
30
+ routes: ['/subscription', '/billing', '/pricing', '/plans', '/account', '/settings'],
31
+ dependencies: ['stripe', '@stripe/stripe-js', 'paddle', 'lemonsqueezy']
32
+ },
33
+ ecommerce: {
34
+ patterns: ['Cart', 'Checkout', 'Product', 'Order', 'Shipping', 'Payment', 'Catalog', 'Wishlist', 'Review'],
35
+ routes: ['/products', '/cart', '/checkout', '/orders', '/wishlist', '/reviews'],
36
+ dependencies: ['@stripe/stripe-js', 'stripe', 'paypal', 'snipcart']
37
+ },
38
+ LMS: {
39
+ patterns: ['Course', 'Lesson', 'Student', 'Teacher', 'Quiz', 'Enrollment', 'Curriculum', 'Assignment', 'Grade'],
40
+ routes: ['/courses', '/lessons', '/students', '/teachers', '/quiz', '/assignments'],
41
+ dependencies: ['video.js', 'hls.js', 'plyr']
42
+ },
43
+ booking: {
44
+ patterns: ['Appointment', 'Booking', 'Availability', 'Calendar', 'Reservation', 'Schedule', 'Timeslot'],
45
+ routes: ['/booking', '/appointments', '/calendar', '/schedule', '/availability'],
46
+ dependencies: ['react-big-calendar', 'fullcalendar', 'react-calendar']
47
+ },
48
+ fintech: {
49
+ patterns: ['Transaction', 'Account', 'Payment', 'Balance', 'Compliance', 'KYC', 'AML', 'Ledger', 'Wallet', 'Transfer'],
50
+ routes: ['/accounts', '/transactions', '/transfer', '/wallet', '/ledger', '/compliance'],
51
+ dependencies: ['stripe', 'plaid', 'dwolla', 'unit']
52
+ },
53
+ internalTools: {
54
+ patterns: ['Admin', 'CRUD', 'Form', 'Table', 'Dashboard', 'Report', 'Config', 'Settings', 'Management'],
55
+ routes: ['/admin', '/management', '/config', '/settings', '/users', '/roles'],
56
+ dependencies: ['@tanstack/react-table', 'ag-grid', 'handsontable']
57
+ },
58
+ cms: {
59
+ patterns: ['Article', 'Page', 'Post', 'Media', 'Content', 'Block', 'Editor', 'Publish'],
60
+ routes: ['/articles', '/pages', '/posts', '/media', '/content'],
61
+ dependencies: ['@tiptap', 'slate', 'draft-js', 'quill', 'ckeditor']
62
+ },
63
+ social: {
64
+ patterns: ['Post', 'Comment', 'Feed', 'Follow', 'Like', 'Share', 'Profile', 'Notification', 'Message'],
65
+ routes: ['/feed', '/posts', '/profile', '/notifications', '/messages', '/followers'],
66
+ dependencies: ['socket.io', 'pusher', 'stream-chat']
67
+ }
68
+ };
69
+ }
70
+
71
+ /**
72
+ * Detect project archetype from structure, stack, and flows
73
+ * @param {object} structure - Structure from CodebaseAnalyzer
74
+ * @param {object} stack - Stack from StackDetector
75
+ * @param {object} flows - Flows from BusinessFlowMapper
76
+ * @returns {object} Archetype detection result with name, confidence, evidence
77
+ */
78
+ detect(structure = {}, stack = {}, flows = {}) {
79
+ const scores = {};
80
+ const evidence = {};
81
+
82
+ // Initialize scores for each archetype
83
+ for (const archetype of Object.keys(this.archetypePatterns)) {
84
+ scores[archetype] = 0;
85
+ evidence[archetype] = [];
86
+ }
87
+
88
+ // Score based on file names
89
+ const files = structure.files || [];
90
+ for (const file of files) {
91
+ const fileName = path.basename(file);
92
+ this._scoreByFileName(fileName, scores, evidence);
93
+ }
94
+
95
+ // Score based on directory names
96
+ const directories = structure.directories || [];
97
+ for (const dir of directories) {
98
+ const dirName = path.basename(dir.path);
99
+ this._scoreByDirectoryName(dirName, scores, evidence);
100
+ }
101
+
102
+ // Score based on routes
103
+ const routes = flows.routes || [];
104
+ for (const route of routes) {
105
+ this._scoreByRoute(route.path, scores, evidence);
106
+ }
107
+
108
+ // Score based on dependencies
109
+ const frameworks = stack.frameworks || [];
110
+ const infrastructure = stack.infrastructure || [];
111
+ const allDeps = [...frameworks, ...infrastructure];
112
+ this._scoreByDependencies(allDeps, scores, evidence);
113
+
114
+ // Find the highest scoring archetype
115
+ let bestArchetype = 'internalTools'; // Default
116
+ let bestScore = 0;
117
+
118
+ for (const [archetype, score] of Object.entries(scores)) {
119
+ if (score > bestScore) {
120
+ bestScore = score;
121
+ bestArchetype = archetype;
122
+ }
123
+ }
124
+
125
+ const confidence = this.calculateConfidence(bestArchetype, evidence[bestArchetype]);
126
+
127
+ return {
128
+ archetype: bestArchetype,
129
+ confidence: confidence.score,
130
+ confidenceLevel: confidence.level,
131
+ scores,
132
+ evidence: evidence[bestArchetype],
133
+ allEvidence: evidence
134
+ };
135
+ }
136
+
137
+ /**
138
+ * Calculate confidence score for an archetype
139
+ * @param {string} archetype - Archetype name
140
+ * @param {Array} evidence - Array of evidence items
141
+ * @returns {object} Confidence with score (0-100) and level (High/Medium/Low)
142
+ */
143
+ calculateConfidence(archetype, evidence = []) {
144
+ // Base score: evidence.length * 10
145
+ let score = evidence.length * 10;
146
+
147
+ // Bonus for file matches: +20 per file
148
+ const fileMatches = evidence.filter(e => e.type === 'file').length;
149
+ score += fileMatches * 20;
150
+
151
+ // Bonus for dependency matches: +15 per dependency
152
+ const depMatches = evidence.filter(e => e.type === 'dependency').length;
153
+ score += depMatches * 15;
154
+
155
+ // Bonus for route matches: +10 per route
156
+ const routeMatches = evidence.filter(e => e.type === 'route').length;
157
+ score += routeMatches * 10;
158
+
159
+ // Cap at 100
160
+ score = Math.min(score, 100);
161
+
162
+ // Determine level
163
+ let level;
164
+ if (score >= 80) {
165
+ level = 'High';
166
+ } else if (score >= 60) {
167
+ level = 'Medium';
168
+ } else {
169
+ level = 'Low';
170
+ }
171
+
172
+ return { score, level };
173
+ }
174
+
175
+ /**
176
+ * Score archetype by file name
177
+ * @private
178
+ */
179
+ _scoreByFileName(fileName, scores, evidence) {
180
+ const nameWithoutExt = fileName.replace(/\.[^.]+$/, '');
181
+
182
+ for (const [archetype, config] of Object.entries(this.archetypePatterns)) {
183
+ for (const pattern of config.patterns) {
184
+ if (nameWithoutExt.toLowerCase().includes(pattern.toLowerCase())) {
185
+ scores[archetype] += 1;
186
+ evidence[archetype].push({
187
+ type: 'file',
188
+ value: fileName,
189
+ pattern
190
+ });
191
+ break; // Don't double-count same file
192
+ }
193
+ }
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Score archetype by directory name
199
+ * @private
200
+ */
201
+ _scoreByDirectoryName(dirName, scores, evidence) {
202
+ for (const [archetype, config] of Object.entries(this.archetypePatterns)) {
203
+ for (const pattern of config.patterns) {
204
+ if (dirName.toLowerCase().includes(pattern.toLowerCase())) {
205
+ scores[archetype] += 2; // Directories are stronger signals
206
+ evidence[archetype].push({
207
+ type: 'directory',
208
+ value: dirName,
209
+ pattern
210
+ });
211
+ break;
212
+ }
213
+ }
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Score archetype by route
219
+ * @private
220
+ */
221
+ _scoreByRoute(routePath, scores, evidence) {
222
+ for (const [archetype, config] of Object.entries(this.archetypePatterns)) {
223
+ for (const routePattern of config.routes) {
224
+ if (routePath.toLowerCase().includes(routePattern.toLowerCase())) {
225
+ scores[archetype] += 2;
226
+ evidence[archetype].push({
227
+ type: 'route',
228
+ value: routePath,
229
+ pattern: routePattern
230
+ });
231
+ break;
232
+ }
233
+ }
234
+ }
235
+ }
236
+
237
+ /**
238
+ * Score archetype by dependencies
239
+ * @private
240
+ */
241
+ _scoreByDependencies(dependencies, scores, evidence) {
242
+ for (const [archetype, config] of Object.entries(this.archetypePatterns)) {
243
+ for (const depPattern of config.dependencies) {
244
+ for (const dep of dependencies) {
245
+ if (dep.toLowerCase().includes(depPattern.toLowerCase())) {
246
+ scores[archetype] += 3; // Dependencies are strong signals
247
+ evidence[archetype].push({
248
+ type: 'dependency',
249
+ value: dep,
250
+ pattern: depPattern
251
+ });
252
+ break;
253
+ }
254
+ }
255
+ }
256
+ }
257
+ }
258
+
259
+ /**
260
+ * Get all supported archetypes
261
+ * @returns {Array} Array of archetype names
262
+ */
263
+ getSupportedArchetypes() {
264
+ return Object.keys(this.archetypePatterns);
265
+ }
266
+
267
+ /**
268
+ * Get archetype description
269
+ * @param {string} archetype - Archetype name
270
+ * @returns {string} Description
271
+ */
272
+ getArchetypeDescription(archetype) {
273
+ const descriptions = {
274
+ dashboard: 'Analytics dashboard with charts, metrics, and data visualization',
275
+ POS: 'Point of Sale system for retail transactions and inventory management',
276
+ SaaS: 'Software as a Service with subscription billing and multi-tenant architecture',
277
+ ecommerce: 'E-commerce platform with product catalog, cart, and checkout',
278
+ LMS: 'Learning Management System for courses, lessons, and student tracking',
279
+ booking: 'Booking and appointment scheduling system',
280
+ fintech: 'Financial technology application for transactions and account management',
281
+ internalTools: 'Internal business tools and admin panels',
282
+ cms: 'Content Management System for articles, pages, and media',
283
+ social: 'Social platform with feeds, posts, and user interactions'
284
+ };
285
+ return descriptions[archetype] || 'Unknown project type';
286
+ }
287
+ }
288
+
289
+ module.exports = { ArchetypeDetector };
@@ -0,0 +1,361 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * EZ Assistant Adapters — Unified interface for AI coding assistants
5
+ *
6
+ * Adapters for: Claude Code, OpenCode, Gemini CLI, Codex
7
+ *
8
+ * Usage:
9
+ * const { createAdapter } = require('./assistant-adapter.cjs');
10
+ * const adapter = createAdapter('claude-code');
11
+ * await adapter.spawnAgent('planner', { prompt: '...' });
12
+ */
13
+
14
+ const Logger = require('./logger.cjs');
15
+ const logger = new Logger();
16
+ const CircuitBreaker = require('./circuit-breaker.cjs');
17
+ const ModelTierManager = require('./model-tier-manager.cjs');
18
+ const CostTracker = require('./cost-tracker.cjs');
19
+
20
+ /**
21
+ * Base adapter interface
22
+ */
23
+ class AssistantAdapter {
24
+ constructor(name) {
25
+ if (new.target === AssistantAdapter) {
26
+ throw new Error('AssistantAdapter is abstract - use a concrete subclass');
27
+ }
28
+ this.name = name;
29
+ }
30
+
31
+ /**
32
+ * Spawn a subagent
33
+ * @param {string} type - Agent type
34
+ * @param {Object} options - Agent options
35
+ * @returns {Promise<Object>} - Agent result
36
+ */
37
+ async spawnAgent(type, options) {
38
+ throw new Error('spawnAgent must be implemented');
39
+ }
40
+
41
+ /**
42
+ * Call a tool/function
43
+ * @param {string} tool - Tool name
44
+ * @param {Object} params - Tool parameters
45
+ * @returns {Promise<any>} - Tool result
46
+ */
47
+ async callTool(tool, params) {
48
+ throw new Error('callTool must be implemented');
49
+ }
50
+
51
+ /**
52
+ * Select model for task
53
+ * @param {string} taskType - Task type (planning, execution, verification)
54
+ * @returns {string} - Model name
55
+ */
56
+ selectModel(taskType) {
57
+ throw new Error('selectModel must be implemented');
58
+ }
59
+
60
+ /**
61
+ * Get adapter info
62
+ * @returns {Object} - Adapter information
63
+ */
64
+ getInfo() {
65
+ return {
66
+ name: this.name,
67
+ type: this.constructor.name
68
+ };
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Claude Code adapter
74
+ */
75
+ class ClaudeCodeAdapter extends AssistantAdapter {
76
+ constructor() {
77
+ super('claude-code');
78
+ }
79
+
80
+ async spawnAgent(type, options) {
81
+ logger.info('Claude Code: spawning agent', { type });
82
+ // Would use Claude Code's Task tool in production
83
+ return { type, status: 'completed', result: '[Claude Code agent result]' };
84
+ }
85
+
86
+ async callTool(tool, params) {
87
+ logger.info('Claude Code: calling tool', { tool });
88
+ // Would use Claude Code's tool system
89
+ return { tool, status: 'success' };
90
+ }
91
+
92
+ selectModel(taskType) {
93
+ const models = {
94
+ planning: 'claude-3-opus',
95
+ execution: 'claude-3-sonnet',
96
+ verification: 'claude-3-sonnet'
97
+ };
98
+ return models[taskType] || models.execution;
99
+ }
100
+ }
101
+
102
+ /**
103
+ * OpenCode adapter
104
+ */
105
+ class OpenCodeAdapter extends AssistantAdapter {
106
+ constructor() {
107
+ super('opencode');
108
+ }
109
+
110
+ async spawnAgent(type, options) {
111
+ logger.info('OpenCode: spawning agent', { type });
112
+ return { type, status: 'completed', result: '[OpenCode agent result]' };
113
+ }
114
+
115
+ async callTool(tool, params) {
116
+ logger.info('OpenCode: calling tool', { tool });
117
+ return { tool, status: 'success' };
118
+ }
119
+
120
+ selectModel(taskType) {
121
+ return 'gpt-4-turbo';
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Gemini CLI adapter
127
+ */
128
+ class GeminiAdapter extends AssistantAdapter {
129
+ constructor() {
130
+ super('gemini');
131
+ }
132
+
133
+ async spawnAgent(type, options) {
134
+ logger.info('Gemini: spawning agent', { type });
135
+ return { type, status: 'completed', result: '[Gemini agent result]' };
136
+ }
137
+
138
+ async callTool(tool, params) {
139
+ logger.info('Gemini: calling tool', { tool });
140
+ return { tool, status: 'success' };
141
+ }
142
+
143
+ selectModel(taskType) {
144
+ return 'gemini-pro';
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Codex adapter
150
+ */
151
+ class CodexAdapter extends AssistantAdapter {
152
+ constructor() {
153
+ super('codex');
154
+ }
155
+
156
+ async spawnAgent(type, options) {
157
+ logger.info('Codex: spawning agent', { type });
158
+ return { type, status: 'completed', result: '[Codex agent result]' };
159
+ }
160
+
161
+ async callTool(tool, params) {
162
+ logger.info('Codex: calling tool', { tool });
163
+ return { tool, status: 'success' };
164
+ }
165
+
166
+ selectModel(taskType) {
167
+ return 'codex-latest';
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Qwen Code adapter
173
+ */
174
+ class QwenAdapter extends AssistantAdapter {
175
+ constructor() {
176
+ super('qwen');
177
+ }
178
+
179
+ async spawnAgent(type, options) {
180
+ logger.info('Qwen Code: spawning agent', { type });
181
+ // Qwen Code uses its own agent system
182
+ return { type, status: 'completed', result: '[Qwen Code agent result]' };
183
+ }
184
+
185
+ async callTool(tool, params) {
186
+ logger.info('Qwen Code: calling tool', { tool });
187
+ return { tool, status: 'success' };
188
+ }
189
+
190
+ selectModel(taskType) {
191
+ const models = {
192
+ planning: 'qwen-max',
193
+ execution: 'qwen-plus',
194
+ verification: 'qwen-plus'
195
+ };
196
+ return models[taskType] || models.execution;
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Kimi Code adapter
202
+ */
203
+ class KimiAdapter extends AssistantAdapter {
204
+ constructor() {
205
+ super('kimi');
206
+ }
207
+
208
+ async spawnAgent(type, options) {
209
+ logger.info('Kimi Code: spawning agent', { type });
210
+ return { type, status: 'completed', result: '[Kimi Code agent result]' };
211
+ }
212
+
213
+ async callTool(tool, params) {
214
+ logger.info('Kimi Code: calling tool', { tool });
215
+ return { tool, status: 'success' };
216
+ }
217
+
218
+ selectModel(taskType) {
219
+ const models = {
220
+ planning: 'moonshot-v1-32k',
221
+ execution: 'moonshot-v1-8k',
222
+ verification: 'moonshot-v1-8k'
223
+ };
224
+ return models[taskType] || models.execution;
225
+ }
226
+ }
227
+
228
+ /**
229
+ * Circuit Breaker Adapter Wrapper — Wraps any adapter with circuit breaker protection
230
+ */
231
+ class CircuitBreakerAdapter extends AssistantAdapter {
232
+ /**
233
+ * Create circuit breaker wrapped adapter
234
+ * @param {AssistantAdapter} delegate - The actual adapter to wrap
235
+ * @param {CircuitBreaker} breaker - Circuit breaker instance
236
+ */
237
+ constructor(delegate, breaker) {
238
+ super(delegate.name);
239
+ this.delegate = delegate;
240
+ this.breaker = breaker;
241
+ }
242
+
243
+ /**
244
+ * Spawn agent with circuit breaker protection
245
+ * @param {string} type - Agent type
246
+ * @param {Object} options - Agent options
247
+ * @returns {Promise<Object>} - Agent result
248
+ */
249
+ async spawnAgent(type, options) {
250
+ return this.breaker.execute(() => this.delegate.spawnAgent(type, options));
251
+ }
252
+
253
+ /**
254
+ * Call tool with circuit breaker protection
255
+ * @param {string} tool - Tool name
256
+ * @param {Object} params - Tool parameters
257
+ * @returns {Promise<any>} - Tool result
258
+ */
259
+ async callTool(tool, params) {
260
+ return this.breaker.execute(() => this.delegate.callTool(tool, params));
261
+ }
262
+
263
+ /**
264
+ * Select model with budget-aware downgrade
265
+ * @param {string} taskType - Task type
266
+ * @returns {string} - Selected model
267
+ */
268
+ selectModel(taskType) {
269
+ const costTracker = new CostTracker();
270
+ const budgetStatus = costTracker.checkBudget();
271
+ const percentUsed = budgetStatus.percentUsed || 0;
272
+
273
+ const modelManager = new ModelTierManager('claude');
274
+ const model = modelManager.selectModel(taskType, percentUsed);
275
+
276
+ // Log downgrade if not using premium model
277
+ if (percentUsed >= 75) {
278
+ const originalModel = this.delegate.selectModel(taskType);
279
+ if (originalModel !== model) {
280
+ modelManager.logDowngrade(originalModel, model, `budget pressure: ${percentUsed.toFixed(1)}%`);
281
+ }
282
+ }
283
+
284
+ return model;
285
+ }
286
+
287
+ /**
288
+ * Get adapter info
289
+ * @returns {Object} - Adapter information
290
+ */
291
+ getInfo() {
292
+ return {
293
+ ...this.delegate.getInfo(),
294
+ circuitBreaker: {
295
+ enabled: true,
296
+ state: this.breaker.getState()
297
+ }
298
+ };
299
+ }
300
+ }
301
+
302
+ /**
303
+ * Factory function to create adapter
304
+ * @param {string} type - Adapter type
305
+ * @param {Object} [options] - Adapter options
306
+ * @param {boolean} [options.circuitBreaker=true] - Enable circuit breaker
307
+ * @param {string} [options.cwd] - Working directory
308
+ * @returns {AssistantAdapter} - Adapter instance
309
+ */
310
+ function createAdapter(type, options = {}) {
311
+ const adapters = {
312
+ 'claude-code': ClaudeCodeAdapter,
313
+ 'opencode': OpenCodeAdapter,
314
+ 'gemini': GeminiAdapter,
315
+ 'codex': CodexAdapter,
316
+ 'qwen': QwenAdapter,
317
+ 'kimi': KimiAdapter
318
+ };
319
+
320
+ const AdapterClass = adapters[type];
321
+ if (!AdapterClass) {
322
+ throw new Error(`Unknown adapter type: ${type}. Available: ${Object.keys(adapters).join(', ')}`);
323
+ }
324
+
325
+ const delegate = new AdapterClass();
326
+
327
+ // Wrap with circuit breaker if enabled
328
+ if (options.circuitBreaker !== false) {
329
+ const breaker = new CircuitBreaker({
330
+ failureThreshold: 5,
331
+ resetTimeout: 60000,
332
+ persistState: true,
333
+ cwd: options.cwd,
334
+ agentType: type
335
+ });
336
+ return new CircuitBreakerAdapter(delegate, breaker);
337
+ }
338
+
339
+ return delegate;
340
+ }
341
+
342
+ /**
343
+ * Get available adapters
344
+ * @returns {string[]} - List of adapter names
345
+ */
346
+ function getAvailableAdapters() {
347
+ return ['claude-code', 'opencode', 'gemini', 'codex', 'qwen', 'kimi'];
348
+ }
349
+
350
+ module.exports = {
351
+ AssistantAdapter,
352
+ ClaudeCodeAdapter,
353
+ OpenCodeAdapter,
354
+ GeminiAdapter,
355
+ CodexAdapter,
356
+ QwenAdapter,
357
+ KimiAdapter,
358
+ CircuitBreakerAdapter,
359
+ createAdapter,
360
+ getAvailableAdapters
361
+ };