@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,385 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Package Manager Executor — Execute package manager commands
5
+ *
6
+ * Provides unified interface for npm, yarn, and pnpm operations:
7
+ * - install: Install dependencies from lockfile
8
+ * - add: Add new package(s) to project
9
+ * - remove: Remove package(s) from project
10
+ *
11
+ * Cross-platform execution using execFile (not exec) for security
12
+ * and consistent behavior across Windows, macOS, and Linux.
13
+ *
14
+ * Usage:
15
+ * const PackageManagerExecutor = require('./package-manager-executor.cjs');
16
+ * const executor = new PackageManagerExecutor('npm', cwd);
17
+ * await executor.install({ production: false, frozenLockfile: true });
18
+ */
19
+
20
+ const { execFile } = require('child_process');
21
+ const { promisify } = require('util');
22
+ const path = require('path');
23
+ const Logger = require('./logger.cjs');
24
+
25
+ const execFileAsync = promisify(execFile);
26
+
27
+ /**
28
+ * Custom error class for package manager operations
29
+ */
30
+ class PackageManagerError extends Error {
31
+ constructor({ manager, cmd, args, error, stderr, stdout }) {
32
+ const message = `[${manager}] ${cmd} ${args.join(' ')} failed: ${error}${stderr ? `\n${stderr}` : ''}`;
33
+ super(message);
34
+ this.name = 'PackageManagerError';
35
+ this.manager = manager;
36
+ this.cmd = cmd;
37
+ this.args = args;
38
+ this.stderr = stderr;
39
+ this.stdout = stdout;
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Package Manager Executor class
45
+ * Executes package manager commands with cross-platform compatibility
46
+ */
47
+ class PackageManagerExecutor {
48
+ /**
49
+ * Create a PackageManagerExecutor instance
50
+ * @param {string} manager - Package manager name ('npm', 'yarn', or 'pnpm')
51
+ * @param {string} cwd - Working directory (default: process.cwd())
52
+ */
53
+ constructor(manager, cwd = process.cwd()) {
54
+ if (!['npm', 'yarn', 'pnpm'].includes(manager)) {
55
+ throw new Error(`Unknown package manager: ${manager}. Must be 'npm', 'yarn', or 'pnpm'`);
56
+ }
57
+
58
+ this.manager = manager;
59
+ this.cwd = cwd;
60
+ this.logger = new Logger();
61
+ this.timeout = 300000; // 5 minutes
62
+ this.maxBuffer = 10 * 1024 * 1024; // 10MB buffer
63
+ }
64
+
65
+ /**
66
+ * Execute install command
67
+ * @param {Object} options - Install options
68
+ * @param {boolean} [options.production] - Production install (exclude devDependencies)
69
+ * @param {boolean} [options.frozenLockfile] - Use frozen lockfile (CI/CD safe)
70
+ * @param {boolean} [options.preferOffline] - Prefer offline cache
71
+ * @returns {Promise<string>} Command output
72
+ */
73
+ async install(options = {}) {
74
+ const { production, frozenLockfile, preferOffline } = options;
75
+
76
+ const args = this._buildInstallArgs({ production, frozenLockfile, preferOffline });
77
+
78
+ this.logger.info('Package manager install', {
79
+ manager: this.manager,
80
+ args: args.join(' '),
81
+ cwd: this.cwd
82
+ });
83
+
84
+ return await this._execute(this.manager, args);
85
+ }
86
+
87
+ /**
88
+ * Add package(s) to project
89
+ * @param {string[]} packages - Package names to add
90
+ * @param {Object} options - Add options
91
+ * @param {boolean} [options.dev] - Add as devDependency
92
+ * @param {boolean} [options.peer] - Add as peerDependency
93
+ * @param {boolean} [options.optional] - Add as optionalDependency
94
+ * @param {boolean} [options.global] - Install globally
95
+ * @returns {Promise<string>} Command output
96
+ */
97
+ async add(packages, options = {}) {
98
+ const { dev, peer, optional, global } = options;
99
+
100
+ const args = this._buildAddArgs(packages, { dev, peer, optional, global });
101
+
102
+ this.logger.info('Package manager add', {
103
+ manager: this.manager,
104
+ packages,
105
+ args: args.join(' '),
106
+ cwd: this.cwd
107
+ });
108
+
109
+ return await this._execute(this.manager, args);
110
+ }
111
+
112
+ /**
113
+ * Remove package(s) from project
114
+ * @param {string[]} packages - Package names to remove
115
+ * @param {Object} options - Remove options
116
+ * @param {boolean} [options.global] - Remove from global install
117
+ * @returns {Promise<string>} Command output
118
+ */
119
+ async remove(packages, options = {}) {
120
+ const { global } = options;
121
+
122
+ const args = this._buildRemoveArgs(packages, { global });
123
+
124
+ this.logger.info('Package manager remove', {
125
+ manager: this.manager,
126
+ packages,
127
+ args: args.join(' '),
128
+ cwd: this.cwd
129
+ });
130
+
131
+ return await this._execute(this.manager, args);
132
+ }
133
+
134
+ /**
135
+ * Build install arguments for specific package manager
136
+ * @private
137
+ * @param {Object} options - Install options
138
+ * @returns {string[]} Command arguments
139
+ */
140
+ _buildInstallArgs(options = {}) {
141
+ const { production, frozenLockfile, preferOffline } = options;
142
+
143
+ switch (this.manager) {
144
+ case 'npm':
145
+ return this._buildNpmInstallArgs({ production, frozenLockfile, preferOffline });
146
+ case 'yarn':
147
+ return this._buildYarnInstallArgs({ production, frozenLockfile, preferOffline });
148
+ case 'pnpm':
149
+ return this._buildPnpmInstallArgs({ production, frozenLockfile, preferOffline });
150
+ default:
151
+ throw new Error(`Unknown package manager: ${this.manager}`);
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Build npm install arguments
157
+ * @private
158
+ */
159
+ _buildNpmInstallArgs(options = {}) {
160
+ const { production, frozenLockfile, preferOffline } = options;
161
+ const args = ['install'];
162
+
163
+ if (production) args.push('--production');
164
+ if (frozenLockfile) args.push('--frozen-lockfile');
165
+ if (preferOffline) args.push('--prefer-offline');
166
+
167
+ return args.filter(Boolean);
168
+ }
169
+
170
+ /**
171
+ * Build yarn install arguments
172
+ * @private
173
+ */
174
+ _buildYarnInstallArgs(options = {}) {
175
+ const { production, frozenLockfile, preferOffline } = options;
176
+ const args = ['install'];
177
+
178
+ if (production) args.push('--production');
179
+ if (frozenLockfile) args.push('--frozen-lockfile');
180
+ if (preferOffline) args.push('--prefer-offline');
181
+
182
+ return args.filter(Boolean);
183
+ }
184
+
185
+ /**
186
+ * Build pnpm install arguments
187
+ * @private
188
+ */
189
+ _buildPnpmInstallArgs(options = {}) {
190
+ const { production, frozenLockfile, preferOffline } = options;
191
+ const args = ['install'];
192
+
193
+ if (production) args.push('--prod');
194
+ if (frozenLockfile) args.push('--frozen-lockfile');
195
+ if (preferOffline) args.push('--prefer-offline');
196
+
197
+ return args.filter(Boolean);
198
+ }
199
+
200
+ /**
201
+ * Build add arguments for specific package manager
202
+ * @private
203
+ * @param {string[]} packages - Package names
204
+ * @param {Object} options - Add options
205
+ * @returns {string[]} Command arguments
206
+ */
207
+ _buildAddArgs(packages, options = {}) {
208
+ switch (this.manager) {
209
+ case 'npm':
210
+ return this._buildNpmAddArgs(packages, options);
211
+ case 'yarn':
212
+ return this._buildYarnAddArgs(packages, options);
213
+ case 'pnpm':
214
+ return this._buildPnpmAddArgs(packages, options);
215
+ default:
216
+ throw new Error(`Unknown package manager: ${this.manager}`);
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Build npm add arguments
222
+ * @private
223
+ */
224
+ _buildNpmAddArgs(packages, options = {}) {
225
+ const { dev, peer, optional, global } = options;
226
+ const args = ['install'];
227
+
228
+ if (global) args.push('-g');
229
+ if (dev) args.push('--save-dev');
230
+ if (peer) args.push('--save-peer');
231
+ if (optional) args.push('--save-optional');
232
+
233
+ return [...args, ...packages];
234
+ }
235
+
236
+ /**
237
+ * Build yarn add arguments
238
+ * @private
239
+ */
240
+ _buildYarnAddArgs(packages, options = {}) {
241
+ const { dev, peer, optional, global } = options;
242
+ const args = ['add'];
243
+
244
+ if (global) args.push('global');
245
+ if (dev) args.push('--dev');
246
+ if (peer) args.push('--peer');
247
+ if (optional) args.push('--optional');
248
+
249
+ return [...args, ...packages];
250
+ }
251
+
252
+ /**
253
+ * Build pnpm add arguments
254
+ * @private
255
+ */
256
+ _buildPnpmAddArgs(packages, options = {}) {
257
+ const { dev, peer, optional, global } = options;
258
+ const args = ['add'];
259
+
260
+ if (global) args.push('-g');
261
+ if (dev) args.push('--save-dev');
262
+ if (peer) args.push('--save-peer');
263
+ if (optional) args.push('--save-optional');
264
+
265
+ return [...args, ...packages];
266
+ }
267
+
268
+ /**
269
+ * Build remove arguments for specific package manager
270
+ * @private
271
+ * @param {string[]} packages - Package names
272
+ * @param {Object} options - Remove options
273
+ * @returns {string[]} Command arguments
274
+ */
275
+ _buildRemoveArgs(packages, options = {}) {
276
+ switch (this.manager) {
277
+ case 'npm':
278
+ return this._buildNpmRemoveArgs(packages, options);
279
+ case 'yarn':
280
+ return this._buildYarnRemoveArgs(packages, options);
281
+ case 'pnpm':
282
+ return this._buildPnpmRemoveArgs(packages, options);
283
+ default:
284
+ throw new Error(`Unknown package manager: ${this.manager}`);
285
+ }
286
+ }
287
+
288
+ /**
289
+ * Build npm remove arguments
290
+ * @private
291
+ */
292
+ _buildNpmRemoveArgs(packages, options = {}) {
293
+ const { global } = options;
294
+ const args = ['uninstall'];
295
+
296
+ if (global) args.push('-g');
297
+
298
+ return [...args, ...packages];
299
+ }
300
+
301
+ /**
302
+ * Build yarn remove arguments
303
+ * @private
304
+ */
305
+ _buildYarnRemoveArgs(packages, options = {}) {
306
+ const { global } = options;
307
+ const args = ['remove'];
308
+
309
+ if (global) args.push('global');
310
+
311
+ return [...args, ...packages];
312
+ }
313
+
314
+ /**
315
+ * Build pnpm remove arguments
316
+ * @private
317
+ */
318
+ _buildPnpmRemoveArgs(packages, options = {}) {
319
+ const { global } = options;
320
+ const args = ['remove'];
321
+
322
+ if (global) args.push('-g');
323
+
324
+ return [...args, ...packages];
325
+ }
326
+
327
+ /**
328
+ * Execute command with cross-platform compatibility
329
+ * @private
330
+ * @param {string} cmd - Command to execute
331
+ * @param {string[]} args - Command arguments
332
+ * @returns {Promise<string>} Command output
333
+ */
334
+ async _execute(cmd, args) {
335
+ const startTime = Date.now();
336
+
337
+ this.logger.debug('Package manager command start', {
338
+ manager: this.manager,
339
+ cmd,
340
+ args: args.join(' '),
341
+ cwd: this.cwd
342
+ });
343
+
344
+ try {
345
+ const result = await execFileAsync(cmd, args, {
346
+ cwd: this.cwd,
347
+ shell: false, // Use execFile for security (no shell injection)
348
+ maxBuffer: this.maxBuffer,
349
+ timeout: this.timeout
350
+ });
351
+
352
+ const duration = Date.now() - startTime;
353
+ this.logger.debug('Package manager command completed', {
354
+ manager: this.manager,
355
+ duration,
356
+ stdout_length: result.stdout?.length || 0
357
+ });
358
+
359
+ return result.stdout.trim();
360
+ } catch (err) {
361
+ const duration = Date.now() - startTime;
362
+ this.logger.error('Package manager command failed', {
363
+ manager: this.manager,
364
+ cmd,
365
+ args: args.join(' '),
366
+ duration,
367
+ error: err.message,
368
+ stderr: err.stderr?.trim(),
369
+ stdout: err.stdout?.trim()
370
+ });
371
+
372
+ throw new PackageManagerError({
373
+ manager: this.manager,
374
+ cmd,
375
+ args,
376
+ error: err.message,
377
+ stderr: err.stderr?.trim(),
378
+ stdout: err.stdout?.trim()
379
+ });
380
+ }
381
+ }
382
+ }
383
+
384
+ module.exports = PackageManagerExecutor;
385
+ module.exports.PackageManagerError = PackageManagerError;
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Package Manager Service — Unified package manager operations
5
+ *
6
+ * High-level service that integrates detection, execution, and validation:
7
+ * - Automatic package manager detection with priority-based strategy
8
+ * - Lockfile validation before operations
9
+ * - Unified interface for install, add, remove operations
10
+ * - Configuration-driven defaults from .planning/config.json
11
+ *
12
+ * Usage:
13
+ * const PackageManagerService = require('./package-manager-service.cjs');
14
+ * const service = new PackageManagerService(cwd);
15
+ * await service.initialize();
16
+ * await service.install({ frozenLockfile: true });
17
+ * await service.add(['lodash'], { dev: true });
18
+ */
19
+
20
+ const fs = require('fs');
21
+ const path = require('path');
22
+ const Logger = require('./logger.cjs');
23
+ const PackageManagerDetector = require('./package-manager-detector.cjs');
24
+ const PackageManagerExecutor = require('./package-manager-executor.cjs');
25
+ const LockfileValidator = require('./lockfile-validator.cjs');
26
+
27
+ /**
28
+ * Package Manager Service class
29
+ * Provides unified interface for package manager operations
30
+ */
31
+ class PackageManagerService {
32
+ /**
33
+ * Create a PackageManagerService instance
34
+ * @param {string} cwd - Working directory (default: process.cwd())
35
+ */
36
+ constructor(cwd = process.cwd()) {
37
+ this.cwd = cwd;
38
+ this.logger = new Logger();
39
+ this.detector = new PackageManagerDetector(cwd);
40
+ this.validator = new LockfileValidator(cwd);
41
+ this.executor = null;
42
+ this.currentManager = null;
43
+ this.detectionSource = null;
44
+ this.initialized = false;
45
+ this.config = this._loadConfig();
46
+ }
47
+
48
+ /**
49
+ * Initialize the package manager service
50
+ * @param {Object} options - Initialization options
51
+ * @param {string} [options.forceManager] - Force specific package manager
52
+ * @returns {Promise<void>}
53
+ */
54
+ async initialize(options = {}) {
55
+ const { forceManager } = options;
56
+
57
+ this.logger.info('Initializing package manager service', {
58
+ cwd: this.cwd,
59
+ forceManager
60
+ });
61
+
62
+ // Detect package manager
63
+ let detection;
64
+ if (forceManager) {
65
+ detection = {
66
+ manager: forceManager,
67
+ source: 'override',
68
+ confidence: 'high'
69
+ };
70
+ this.logger.info('Using forced package manager', { manager: forceManager });
71
+ } else {
72
+ detection = this.detector.detect();
73
+ this.logger.info('Package manager detected', {
74
+ manager: detection.manager,
75
+ source: detection.source,
76
+ confidence: detection.confidence
77
+ });
78
+ }
79
+
80
+ // Validate detection
81
+ if (!detection.manager) {
82
+ throw new Error('No package manager detected or available');
83
+ }
84
+
85
+ // Create executor
86
+ this.executor = new PackageManagerExecutor(detection.manager, this.cwd);
87
+ this.currentManager = detection.manager;
88
+ this.detectionSource = detection.source;
89
+
90
+ // Validate lockfile if present
91
+ const lockfileValidation = this.validator.validate(detection.manager);
92
+ if (!lockfileValidation.valid) {
93
+ this.logger.warn('Lockfile validation failed', {
94
+ manager: detection.manager,
95
+ reason: lockfileValidation.reason,
96
+ message: lockfileValidation.message
97
+ });
98
+ } else {
99
+ this.logger.debug('Lockfile validated', {
100
+ manager: detection.manager,
101
+ lockfileVersion: lockfileValidation.lockfileVersion,
102
+ packageCount: lockfileValidation.packageCount || lockfileValidation.entryCount
103
+ });
104
+ }
105
+
106
+ this.initialized = true;
107
+ }
108
+
109
+ /**
110
+ * Ensure service is initialized
111
+ * @private
112
+ * @returns {Promise<void>}
113
+ */
114
+ async _ensureInitialized() {
115
+ if (!this.initialized) {
116
+ await this.initialize();
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Install dependencies
122
+ * @param {Object} options - Install options
123
+ * @param {boolean} [options.production] - Production install (exclude devDependencies)
124
+ * @param {boolean} [options.frozenLockfile] - Use frozen lockfile (CI/CD safe)
125
+ * @param {boolean} [options.preferOffline] - Prefer offline cache
126
+ * @returns {Promise<string>} Command output
127
+ */
128
+ async install(options = {}) {
129
+ await this._ensureInitialized();
130
+
131
+ this.logger.info('Installing dependencies', {
132
+ manager: this.currentManager,
133
+ options
134
+ });
135
+
136
+ return await this.executor.install(options);
137
+ }
138
+
139
+ /**
140
+ * Add package(s) to project
141
+ * @param {string|string[]} packages - Package name(s) to add
142
+ * @param {Object} options - Add options
143
+ * @param {boolean} [options.dev] - Add as devDependency
144
+ * @param {boolean} [options.peer] - Add as peerDependency
145
+ * @param {boolean} [options.optional] - Add as optionalDependency
146
+ * @param {boolean} [options.global] - Install globally
147
+ * @returns {Promise<string>} Command output
148
+ */
149
+ async add(packages, options = {}) {
150
+ await this._ensureInitialized();
151
+
152
+ const packageArray = Array.isArray(packages) ? packages : [packages];
153
+
154
+ this.logger.info('Adding packages', {
155
+ manager: this.currentManager,
156
+ packages: packageArray,
157
+ options
158
+ });
159
+
160
+ return await this.executor.add(packageArray, options);
161
+ }
162
+
163
+ /**
164
+ * Remove package(s) from project
165
+ * @param {string|string[]} packages - Package name(s) to remove
166
+ * @param {Object} options - Remove options
167
+ * @param {boolean} [options.global] - Remove from global install
168
+ * @returns {Promise<string>} Command output
169
+ */
170
+ async remove(packages, options = {}) {
171
+ await this._ensureInitialized();
172
+
173
+ const packageArray = Array.isArray(packages) ? packages : [packages];
174
+
175
+ this.logger.info('Removing packages', {
176
+ manager: this.currentManager,
177
+ packages: packageArray,
178
+ options
179
+ });
180
+
181
+ return await this.executor.remove(packageArray, options);
182
+ }
183
+
184
+ /**
185
+ * Get current package manager information
186
+ * @returns {Object} Package manager info
187
+ */
188
+ getInfo() {
189
+ return {
190
+ manager: this.currentManager,
191
+ source: this.detectionSource,
192
+ cwd: this.cwd,
193
+ lockfile: this.detector.getLockfilePath(this.currentManager)
194
+ };
195
+ }
196
+
197
+ /**
198
+ * Load configuration from .planning/config.json
199
+ * @private
200
+ * @returns {Object} Configuration object
201
+ */
202
+ _loadConfig() {
203
+ const configPath = path.join(this.cwd, '.planning', 'config.json');
204
+ try {
205
+ if (fs.existsSync(configPath)) {
206
+ const content = fs.readFileSync(configPath, 'utf-8');
207
+ return JSON.parse(content);
208
+ }
209
+ } catch (err) {
210
+ this.logger.warn('Failed to load config', { path: configPath, error: err.message });
211
+ }
212
+ return {};
213
+ }
214
+ }
215
+
216
+ module.exports = PackageManagerService;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * API Monitor — Endpoint latency tracking with baseline storage
3
+ * Tracks p50, p95, p99 percentiles
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+
9
+ class ApiMonitor {
10
+ constructor(cwd) {
11
+ this.cwd = cwd || process.cwd();
12
+ this.latenciesPath = path.join(this.cwd, '.planning', 'perf', 'api-latencies.json');
13
+ }
14
+
15
+ /**
16
+ * Track endpoint latency
17
+ * @param {string} baseUrl - Base URL of API
18
+ * @param {Array} endpoints - Array of endpoint paths to track
19
+ * @returns {Array} Latency results
20
+ */
21
+ async trackEndpoint(baseUrl, endpoints) {
22
+ const results = [];
23
+
24
+ for (const endpoint of endpoints) {
25
+ const start = Date.now();
26
+ try {
27
+ // Placeholder - would make actual HTTP request in real implementation
28
+ const latency = Date.now() - start;
29
+ results.push({
30
+ endpoint: endpoint.path || endpoint,
31
+ method: endpoint.method || 'GET',
32
+ latency,
33
+ status: 200,
34
+ timestamp: new Date().toISOString()
35
+ });
36
+ } catch (e) {
37
+ results.push({
38
+ endpoint: endpoint.path || endpoint,
39
+ method: endpoint.method || 'GET',
40
+ latency: -1,
41
+ error: e.message,
42
+ timestamp: new Date().toISOString()
43
+ });
44
+ }
45
+ }
46
+
47
+ return results;
48
+ }
49
+
50
+ /**
51
+ * Calculate percentiles from latency array
52
+ * @param {Array} latencies - Array of latency values
53
+ * @returns {Object} Percentile values
54
+ */
55
+ calculatePercentiles(latencies) {
56
+ const sorted = latencies.filter(l => l > 0).sort((a, b) => a - b);
57
+ if (sorted.length === 0) return { p50: 0, p95: 0, p99: 0 };
58
+
59
+ return {
60
+ p50: sorted[Math.floor(sorted.length * 0.50)],
61
+ p95: sorted[Math.floor(sorted.length * 0.95)],
62
+ p99: sorted[Math.floor(sorted.length * 0.99)]
63
+ };
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Track endpoint latency
69
+ * @param {string} baseUrl - Base URL of API
70
+ * @param {Array} endpoints - Array of endpoint paths to track
71
+ * @returns {Array} Latency results
72
+ */
73
+ async function trackEndpoint(baseUrl, endpoints) {
74
+ const monitor = new ApiMonitor();
75
+ return monitor.trackEndpoint(baseUrl, endpoints);
76
+ }
77
+
78
+ /**
79
+ * Calculate percentiles from latency array
80
+ * @param {Array} latencies - Array of latency values
81
+ * @returns {Object} Percentile values
82
+ */
83
+ function calculatePercentiles(latencies) {
84
+ const monitor = new ApiMonitor();
85
+ return monitor.calculatePercentiles(latencies);
86
+ }
87
+
88
+ module.exports = { ApiMonitor, trackEndpoint, calculatePercentiles };