@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,83 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Git Workflow Error Classes
5
+ *
6
+ * Provides structured error handling for git operations
7
+ */
8
+
9
+ class GitWorkflowError extends Error {
10
+ constructor(message, options = {}) {
11
+ super(message);
12
+ this.name = 'GitWorkflowError';
13
+ this.code = options.code || 'GIT_WORKFLOW_ERROR';
14
+ this.details = options.details || {};
15
+ this.timestamp = new Date().toISOString();
16
+ Error.captureStackTrace(this, GitWorkflowError);
17
+ }
18
+
19
+ toJSON() {
20
+ return {
21
+ name: this.name,
22
+ code: this.code,
23
+ message: this.message,
24
+ details: this.details,
25
+ timestamp: this.timestamp
26
+ };
27
+ }
28
+ }
29
+
30
+ class BranchExistsError extends GitWorkflowError {
31
+ constructor(branchName, options = {}) {
32
+ super(`Branch '${branchName}' already exists`, {
33
+ code: 'BRANCH_EXISTS',
34
+ details: { branchName, ...options.details }
35
+ });
36
+ this.name = 'BranchExistsError';
37
+ this.branchName = branchName;
38
+ }
39
+ }
40
+
41
+ class BranchNotFoundError extends GitWorkflowError {
42
+ constructor(branchName, options = {}) {
43
+ super(`Branch '${branchName}' does not exist`, {
44
+ code: 'BRANCH_NOT_FOUND',
45
+ details: { branchName, ...options.details }
46
+ });
47
+ this.name = 'BranchNotFoundError';
48
+ this.branchName = branchName;
49
+ }
50
+ }
51
+
52
+ class MergeConflictError extends GitWorkflowError {
53
+ constructor(sourceBranch, targetBranch, conflictingFiles = [], options = {}) {
54
+ super(`Merge conflict between '${sourceBranch}' and '${targetBranch}'`, {
55
+ code: 'MERGE_CONFLICT',
56
+ details: { sourceBranch, targetBranch, conflictingFiles, ...options.details }
57
+ });
58
+ this.name = 'MergeConflictError';
59
+ this.sourceBranch = sourceBranch;
60
+ this.targetBranch = targetBranch;
61
+ this.conflictingFiles = conflictingFiles;
62
+ }
63
+ }
64
+
65
+ class ValidationFailedError extends GitWorkflowError {
66
+ constructor(validationType, failures = [], options = {}) {
67
+ super(`${validationType} validation failed`, {
68
+ code: 'VALIDATION_FAILED',
69
+ details: { validationType, failures, ...options.details }
70
+ });
71
+ this.name = 'ValidationFailedError';
72
+ this.validationType = validationType;
73
+ this.failures = failures;
74
+ }
75
+ }
76
+
77
+ module.exports = {
78
+ GitWorkflowError,
79
+ BranchExistsError,
80
+ BranchNotFoundError,
81
+ MergeConflictError,
82
+ ValidationFailedError
83
+ };
@@ -0,0 +1,321 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * EZ Git Utils — Safe git operations with atomic commits
5
+ *
6
+ * Provides:
7
+ * - Atomic commits with validation
8
+ * - Branch creation and management
9
+ * - Safe git operations using execFile
10
+ * - Error handling with recovery suggestions
11
+ *
12
+ * Usage:
13
+ * const GitUtils = require('./git-utils.cjs');
14
+ * const git = new GitUtils(process.cwd());
15
+ * await git.commitAtomic('feat: add feature', ['file1.js']);
16
+ */
17
+
18
+ const { execFile } = require('child_process');
19
+ const { promisify } = require('util');
20
+ const execFileAsync = promisify(execFile);
21
+ const Logger = require('./logger.cjs');
22
+ const logger = new Logger();
23
+ const { BranchExistsError, BranchNotFoundError } = require('./git-errors.cjs');
24
+ const { MergeConflictError } = require('./git-errors.cjs');
25
+
26
+ class GitUtils {
27
+ constructor(cwd) {
28
+ this.cwd = cwd || process.cwd();
29
+ }
30
+
31
+ /**
32
+ * Execute git command safely
33
+ */
34
+ async exec(args, options = {}) {
35
+ const { timeout = 30000 } = options;
36
+
37
+ try {
38
+ const { stdout, stderr } = await execFileAsync('git', args, {
39
+ cwd: this.cwd,
40
+ encoding: 'utf-8',
41
+ timeout,
42
+ maxBuffer: 10 * 1024 * 1024
43
+ });
44
+
45
+ logger.debug('Git command executed', { args, stdout_length: stdout?.length });
46
+
47
+ return { stdout: stdout?.trim(), stderr: stderr?.trim() };
48
+ } catch (err) {
49
+ logger.error('Git command failed', { args, error: err.message });
50
+ throw err;
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Check if directory is a git repo
56
+ */
57
+ async isGitRepo() {
58
+ try {
59
+ await this.exec(['rev-parse', '--git-dir']);
60
+ return true;
61
+ } catch {
62
+ return false;
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Get current branch name
68
+ */
69
+ async getCurrentBranch() {
70
+ const { stdout } = await this.exec(['rev-parse', '--abbrev-ref', 'HEAD']);
71
+ return stdout;
72
+ }
73
+
74
+ /**
75
+ * Get git status (porcelain format)
76
+ */
77
+ async getStatus() {
78
+ const { stdout } = await this.exec(['status', '--porcelain']);
79
+ return stdout.split('\n').filter(line => line.trim());
80
+ }
81
+
82
+ /**
83
+ * Check if there are uncommitted changes
84
+ */
85
+ async hasChanges() {
86
+ const status = await this.getStatus();
87
+ return status.length > 0;
88
+ }
89
+
90
+ /**
91
+ * Stage files for commit
92
+ */
93
+ async add(files) {
94
+ if (!Array.isArray(files)) files = [files];
95
+ await this.exec(['add', ...files]);
96
+ logger.info('Files staged', { files });
97
+ }
98
+
99
+ /**
100
+ * Add all changes
101
+ */
102
+ async addAll() {
103
+ await this.exec(['add', '-A']);
104
+ logger.info('All files staged');
105
+ }
106
+
107
+ /**
108
+ * Create atomic commit with validation
109
+ */
110
+ async commitAtomic(message, files = []) {
111
+ // Stage files if provided
112
+ if (files.length > 0) {
113
+ await this.add(files);
114
+ }
115
+
116
+ // Validate commit message format (conventional commits)
117
+ const conventionalPattern = /^(feat|fix|docs|chore|test|refactor|style|perf)(\([^)]+\))?:\s.+/;
118
+ if (!conventionalPattern.test(message)) {
119
+ logger.warn('Commit message may not follow conventional commits', { message });
120
+ }
121
+
122
+ // Create commit
123
+ await this.exec(['commit', '-m', message]);
124
+
125
+ // Get commit hash
126
+ const { stdout } = await this.exec(['rev-parse', '--short', 'HEAD']);
127
+
128
+ logger.info('Commit created', { hash: stdout, message });
129
+
130
+ return stdout;
131
+ }
132
+
133
+ /**
134
+ * Create new branch
135
+ */
136
+ async createBranch(name, from = 'HEAD') {
137
+ await this.exec(['checkout', '-b', name, from]);
138
+ logger.info('Branch created', { name, from });
139
+ return name;
140
+ }
141
+
142
+ /**
143
+ * Check if branch exists
144
+ */
145
+ async branchExists(branchName) {
146
+ try {
147
+ await this.exec(['rev-parse', '--verify', branchName]);
148
+ return true;
149
+ } catch (err) {
150
+ return false;
151
+ }
152
+ }
153
+
154
+ /**
155
+ * List branches matching pattern
156
+ */
157
+ async listBranches(pattern = '*') {
158
+ const { stdout } = await this.exec(['branch', '--list', pattern]);
159
+ return stdout.split('\n')
160
+ .map(b => b.trim().replace(/^\*\s*/, '').replace(/^\+\s*/, ''))
161
+ .filter(b => b);
162
+ }
163
+
164
+ /**
165
+ * Delete branch
166
+ */
167
+ async deleteBranch(branchName, force = false) {
168
+ const exists = await this.branchExists(branchName);
169
+ if (!exists) {
170
+ throw new BranchNotFoundError(branchName);
171
+ }
172
+ const args = force ? ['branch', '-D', branchName] : ['branch', '-d', branchName];
173
+ await this.exec(args);
174
+ logger.info('Branch deleted', { branch: branchName, force });
175
+ }
176
+
177
+ /**
178
+ * Get branch point (merge base with HEAD)
179
+ */
180
+ async getBranchPoint(branchName) {
181
+ const { stdout } = await this.exec(['merge-base', 'HEAD', branchName]);
182
+ return stdout;
183
+ }
184
+
185
+ /**
186
+ * Check if merge would have conflicts
187
+ */
188
+ async hasConflicts(sourceBranch, targetBranch) {
189
+ try {
190
+ await this.exec(['merge-tree', targetBranch, sourceBranch]);
191
+ return false;
192
+ } catch (err) {
193
+ if (err.stdout?.includes('conflict')) {
194
+ return true;
195
+ }
196
+ return false;
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Merge with strategy (merge, squash, rebase)
202
+ */
203
+ async mergeWithStrategy(source, target, strategy = 'merge') {
204
+ const currentBranch = await this.getCurrentBranch();
205
+
206
+ try {
207
+ await this.checkout(target);
208
+
209
+ if (strategy === 'squash') {
210
+ await this.exec(['merge', '--squash', source]);
211
+ await this.exec(['commit', '-m', `Merge '${source}' into '${target}'`]);
212
+ } else if (strategy === 'rebase') {
213
+ await this.exec(['rebase', source]);
214
+ } else {
215
+ await this.exec(['merge', source, '--no-edit']);
216
+ }
217
+
218
+ logger.info('Merge completed', { source, target, strategy });
219
+ return { success: true, strategy };
220
+ } catch (err) {
221
+ if (err.message?.includes('conflict')) {
222
+ throw new MergeConflictError(source, target);
223
+ }
224
+ throw err;
225
+ } finally {
226
+ if (currentBranch !== target) {
227
+ await this.checkout(currentBranch);
228
+ }
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Squash merge with custom commit message
234
+ */
235
+ async squashMerge(source, target, commitMessage) {
236
+ await this.checkout(target);
237
+ await this.exec(['merge', '--squash', source]);
238
+ await this.exec(['commit', '-m', commitMessage]);
239
+ logger.info('Squash merge completed', { source, target, message: commitMessage });
240
+ }
241
+
242
+ /**
243
+ * Abort merge
244
+ */
245
+ async abortMerge() {
246
+ await this.exec(['merge', '--abort']);
247
+ logger.info('Merge aborted');
248
+ }
249
+
250
+ /**
251
+ * Revert commit
252
+ */
253
+ async revertCommit(commitHash) {
254
+ await this.exec(['revert', commitHash, '--no-edit']);
255
+ logger.info('Commit reverted', { hash: commitHash });
256
+ }
257
+
258
+ /**
259
+ * Switch to branch
260
+ */
261
+ async checkout(branch) {
262
+ await this.exec(['checkout', branch]);
263
+ logger.info('Checked out branch', { branch });
264
+ }
265
+
266
+ /**
267
+ * Merge branch
268
+ */
269
+ async mergeBranch(branch, squash = false) {
270
+ const args = squash ? ['merge', '--squash', branch] : ['merge', branch];
271
+ await this.exec(args);
272
+ logger.info('Branch merged', { branch, squash });
273
+ }
274
+
275
+ /**
276
+ * Create tag
277
+ */
278
+ async tagRelease(version, message = '') {
279
+ const args = ['-a', version, '-m', message || `Release ${version}`];
280
+ await this.exec(['tag', ...args]);
281
+ logger.info('Tag created', { version });
282
+ }
283
+
284
+ /**
285
+ * Push to remote
286
+ */
287
+ async push(remote = 'origin', branch = null) {
288
+ const args = ['push', remote];
289
+ if (branch) args.push(branch);
290
+ await this.exec(args);
291
+ logger.info('Pushed to remote', { remote, branch });
292
+ }
293
+
294
+ /**
295
+ * Pull from remote
296
+ */
297
+ async pull(remote = 'origin', branch = null) {
298
+ const args = ['pull', remote];
299
+ if (branch) args.push(branch);
300
+ await this.exec(args);
301
+ logger.info('Pulled from remote', { remote, branch });
302
+ }
303
+
304
+ /**
305
+ * Get recent commits
306
+ */
307
+ async getCommits(count = 5) {
308
+ const { stdout } = await this.exec(['log', `-n${count}`, '--oneline']);
309
+ return stdout.split('\n');
310
+ }
311
+
312
+ /**
313
+ * Get diff between commits/branches
314
+ */
315
+ async getDiff(from, to = 'HEAD') {
316
+ const { stdout } = await this.exec(['diff', `${from}..${to}`, '--stat']);
317
+ return stdout;
318
+ }
319
+ }
320
+
321
+ module.exports = GitUtils;