@howlil/ez-agents 3.5.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/README.md +735 -537
  2. package/agents/ez-architect-agent.md +267 -0
  3. package/agents/ez-backend-agent.md +303 -0
  4. package/agents/ez-chief-strategist.md +271 -0
  5. package/agents/ez-codebase-mapper.md +770 -770
  6. package/agents/ez-context-manager.md +319 -0
  7. package/agents/ez-debugger.md +1255 -1255
  8. package/agents/ez-design-expert.md +347 -0
  9. package/agents/ez-devops-agent.md +331 -0
  10. package/agents/ez-executor.md +487 -487
  11. package/agents/ez-frontend-agent.md +322 -0
  12. package/agents/ez-phase-researcher.md +553 -553
  13. package/agents/ez-planner.md +1307 -1307
  14. package/agents/ez-product-engineer.md +435 -0
  15. package/agents/ez-project-researcher.md +629 -629
  16. package/agents/ez-qa-agent.md +320 -0
  17. package/agents/ez-release-agent.md +333 -333
  18. package/agents/ez-requirements-agent.md +377 -377
  19. package/agents/ez-roadmapper.md +650 -650
  20. package/agents/ez-technical-writer.md +551 -0
  21. package/agents/ez-ux-expert.md +393 -0
  22. package/agents/ez-verifier.md +579 -579
  23. package/bin/guards/autonomy-guard.cjs +346 -0
  24. package/bin/guards/context-budget-guard.cjs +278 -0
  25. package/bin/guards/hallucination-guard.cjs +380 -0
  26. package/bin/guards/hidden-state-guard.cjs +182 -0
  27. package/bin/guards/team-overhead-guard.cjs +266 -0
  28. package/bin/guards/tool-sprawl-guard.cjs +271 -0
  29. package/bin/lib/analytics/analytics-collector.cjs +86 -0
  30. package/bin/lib/analytics/analytics-reporter.cjs +130 -0
  31. package/bin/lib/analytics/cohort-analyzer.cjs +138 -0
  32. package/bin/lib/analytics/funnel-analyzer.cjs +147 -0
  33. package/bin/lib/analytics/nps-tracker.cjs +147 -0
  34. package/bin/lib/archetype-detector.cjs +289 -0
  35. package/bin/lib/assistant-adapter.cjs +361 -0
  36. package/bin/lib/audit-exec.cjs +175 -0
  37. package/bin/lib/auth.cjs +176 -0
  38. package/bin/lib/backup-service.cjs +422 -0
  39. package/bin/lib/bdd-validator.cjs +622 -0
  40. package/bin/lib/business-flow-mapper.cjs +429 -0
  41. package/bin/lib/circuit-breaker.cjs +276 -0
  42. package/bin/lib/code-complexity-analyzer.cjs +360 -0
  43. package/bin/lib/codebase-analyzer.cjs +241 -0
  44. package/bin/lib/commands.cjs +691 -0
  45. package/bin/lib/config.cjs +236 -0
  46. package/bin/lib/constraint-extractor.cjs +526 -0
  47. package/bin/lib/content-scanner.cjs +238 -0
  48. package/bin/lib/context-cache.cjs +154 -0
  49. package/bin/lib/context-compressor.cjs +102 -0
  50. package/bin/lib/context-deduplicator.cjs +105 -0
  51. package/bin/lib/context-errors.cjs +78 -0
  52. package/bin/lib/context-manager.cjs +338 -0
  53. package/bin/lib/context-metadata-tracker.cjs +140 -0
  54. package/bin/lib/context-relevance-scorer.cjs +99 -0
  55. package/bin/lib/core.cjs +507 -0
  56. package/bin/lib/cost-alerts.cjs +174 -0
  57. package/bin/lib/cost-tracker.cjs +275 -0
  58. package/bin/lib/crash-recovery.cjs +220 -0
  59. package/bin/lib/dependency-graph.cjs +319 -0
  60. package/bin/lib/deploy/deploy-audit-log.cjs +76 -0
  61. package/bin/lib/deploy/deploy-detector.cjs +69 -0
  62. package/bin/lib/deploy/deploy-env-manager.cjs +109 -0
  63. package/bin/lib/deploy/deploy-health-check.cjs +88 -0
  64. package/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
  65. package/bin/lib/deploy/deploy-rollback.cjs +72 -0
  66. package/bin/lib/deploy/deploy-runner.cjs +97 -0
  67. package/bin/lib/deploy/deploy-status.cjs +74 -0
  68. package/bin/lib/discussion-synthesizer.cjs +439 -0
  69. package/bin/lib/error-cache.cjs +114 -0
  70. package/bin/lib/error-registry.cjs +177 -0
  71. package/bin/lib/file-access.cjs +207 -0
  72. package/bin/lib/file-lock.cjs +236 -0
  73. package/bin/lib/finops/budget-enforcer.cjs +126 -0
  74. package/bin/lib/finops/cost-reporter.cjs +132 -0
  75. package/bin/lib/finops/finops-analyzer.cjs +112 -0
  76. package/bin/lib/finops/spot-manager.cjs +118 -0
  77. package/bin/lib/framework-detector.cjs +396 -0
  78. package/bin/lib/frontmatter.cjs +313 -0
  79. package/bin/lib/fs-utils.cjs +153 -0
  80. package/bin/lib/gate-executor.cjs +272 -0
  81. package/bin/lib/gates/README.md +374 -0
  82. package/bin/lib/gates/gate-01-requirement.cjs +303 -0
  83. package/bin/lib/gates/gate-02-architecture.cjs +555 -0
  84. package/bin/lib/gates/gate-03-code.cjs +635 -0
  85. package/bin/lib/gates/gate-04-security.cjs +829 -0
  86. package/bin/lib/git-errors.cjs +83 -0
  87. package/bin/lib/git-utils.cjs +321 -0
  88. package/bin/lib/git-workflow-engine.cjs +1157 -0
  89. package/bin/lib/health-check.cjs +227 -0
  90. package/bin/lib/index.cjs +279 -0
  91. package/bin/lib/init.cjs +725 -0
  92. package/bin/lib/lock-logger.cjs +194 -0
  93. package/bin/lib/lock-state.cjs +263 -0
  94. package/bin/lib/lockfile-validator.cjs +227 -0
  95. package/bin/lib/log-rotation.cjs +71 -0
  96. package/bin/lib/logger.cjs +125 -0
  97. package/bin/lib/memory-compression.cjs +256 -0
  98. package/bin/lib/milestone.cjs +247 -0
  99. package/bin/lib/model-provider.cjs +241 -0
  100. package/bin/lib/package-manager-detector.cjs +203 -0
  101. package/bin/lib/package-manager-executor.cjs +385 -0
  102. package/bin/lib/package-manager-service.cjs +216 -0
  103. package/bin/lib/perf/api-monitor.cjs +88 -0
  104. package/bin/lib/perf/db-optimizer.cjs +78 -0
  105. package/bin/lib/perf/frontend-performance.cjs +56 -0
  106. package/bin/lib/perf/perf-analyzer.cjs +77 -0
  107. package/bin/lib/perf/perf-baseline.cjs +102 -0
  108. package/bin/lib/perf/perf-reporter.cjs +117 -0
  109. package/bin/lib/perf/regression-detector.cjs +92 -0
  110. package/bin/lib/phase.cjs +963 -0
  111. package/bin/lib/planning-write.cjs +123 -0
  112. package/bin/lib/project-reporter.cjs +565 -0
  113. package/bin/lib/quality-gate.cjs +332 -0
  114. package/bin/lib/quality-metrics.cjs +324 -0
  115. package/bin/lib/recovery-manager.cjs +98 -0
  116. package/bin/lib/release-validator.cjs +617 -0
  117. package/bin/lib/retry.cjs +119 -0
  118. package/bin/lib/roadmap.cjs +309 -0
  119. package/bin/lib/safe-exec.cjs +173 -0
  120. package/bin/lib/safe-path.cjs +130 -0
  121. package/bin/lib/security-errors.cjs +62 -0
  122. package/bin/lib/session-chain.cjs +304 -0
  123. package/bin/lib/session-errors.cjs +81 -0
  124. package/bin/lib/session-export.cjs +251 -0
  125. package/bin/lib/session-import.cjs +262 -0
  126. package/bin/lib/session-manager.cjs +280 -0
  127. package/bin/lib/skill-context.cjs +148 -0
  128. package/bin/lib/skill-matcher.cjs +236 -0
  129. package/bin/lib/skill-registry.cjs +360 -0
  130. package/bin/lib/skill-resolver.cjs +449 -0
  131. package/bin/lib/skill-triggers.cjs +90 -0
  132. package/bin/lib/skill-validator.cjs +270 -0
  133. package/bin/lib/skill-versioning.cjs +355 -0
  134. package/bin/lib/stack-detector.cjs +399 -0
  135. package/bin/lib/state.cjs +736 -0
  136. package/bin/lib/tech-debt-analyzer.cjs +309 -0
  137. package/bin/lib/temp-file.cjs +239 -0
  138. package/bin/lib/template.cjs +223 -0
  139. package/bin/lib/test-file-lock.cjs +112 -0
  140. package/bin/lib/test-graceful.cjs +93 -0
  141. package/bin/lib/test-logger.cjs +60 -0
  142. package/bin/lib/test-safe-exec.cjs +38 -0
  143. package/bin/lib/test-safe-path.cjs +33 -0
  144. package/bin/lib/test-temp-file.cjs +125 -0
  145. package/bin/lib/tier-manager.cjs +428 -0
  146. package/bin/lib/timeout-exec.cjs +63 -0
  147. package/bin/lib/tradeoff-analyzer.cjs +284 -0
  148. package/bin/lib/url-fetch.cjs +170 -0
  149. package/bin/lib/verify.cjs +863 -0
  150. package/bin/update.js +217 -214
  151. package/commands/deploy.cjs +53 -0
  152. package/commands/ez/add-tests.md +41 -41
  153. package/commands/ez/audit-milestone.md +36 -36
  154. package/commands/ez/complete-milestone.md +136 -136
  155. package/commands/ez/discuss-phase.md +90 -90
  156. package/commands/ez/execute-phase.md +52 -52
  157. package/commands/ez/help.md +22 -22
  158. package/commands/ez/map-codebase.md +71 -71
  159. package/commands/ez/new-milestone.md +44 -44
  160. package/commands/ez/new-project.md +51 -42
  161. package/commands/ez/plan-phase.md +53 -53
  162. package/commands/ez/progress.md +36 -36
  163. package/commands/ez/quick.md +45 -45
  164. package/commands/ez/resume-work.md +40 -40
  165. package/commands/ez/run-phase.md +580 -0
  166. package/commands/ez/settings.md +36 -36
  167. package/commands/ez/update.md +37 -37
  168. package/commands/ez/verify-work.md +402 -38
  169. package/commands/health-check.cjs +44 -0
  170. package/commands/rollback.cjs +47 -0
  171. package/ez-agents/bin/ez-tools.cjs +599 -2
  172. package/ez-agents/bin/guards/autonomy-guard.cjs +346 -0
  173. package/ez-agents/bin/guards/context-budget-guard.cjs +247 -0
  174. package/ez-agents/bin/guards/hallucination-guard.cjs +271 -0
  175. package/ez-agents/bin/guards/hidden-state-guard.cjs +182 -0
  176. package/ez-agents/bin/guards/team-overhead-guard.cjs +266 -0
  177. package/ez-agents/bin/guards/tool-sprawl-guard.cjs +271 -0
  178. package/ez-agents/bin/lib/analytics/analytics-collector.cjs +86 -0
  179. package/ez-agents/bin/lib/analytics/analytics-reporter.cjs +130 -0
  180. package/ez-agents/bin/lib/analytics/cohort-analyzer.cjs +138 -0
  181. package/ez-agents/bin/lib/analytics/funnel-analyzer.cjs +147 -0
  182. package/ez-agents/bin/lib/analytics/nps-tracker.cjs +147 -0
  183. package/ez-agents/bin/lib/archetype-detector.cjs +289 -0
  184. package/ez-agents/bin/lib/audit-exec.cjs +166 -167
  185. package/ez-agents/bin/lib/auth.cjs +176 -176
  186. package/ez-agents/bin/lib/backup-service.cjs +422 -0
  187. package/ez-agents/bin/lib/bdd-validator.cjs +622 -622
  188. package/ez-agents/bin/lib/business-flow-mapper.cjs +429 -0
  189. package/ez-agents/bin/lib/code-complexity-analyzer.cjs +360 -0
  190. package/ez-agents/bin/lib/codebase-analyzer.cjs +241 -0
  191. package/ez-agents/bin/lib/commands.cjs +685 -685
  192. package/ez-agents/bin/lib/config.cjs +41 -1
  193. package/ez-agents/bin/lib/constraint-extractor.cjs +526 -0
  194. package/ez-agents/bin/lib/content-scanner.cjs +238 -238
  195. package/ez-agents/bin/lib/context-cache.cjs +154 -154
  196. package/ez-agents/bin/lib/context-errors.cjs +71 -71
  197. package/ez-agents/bin/lib/context-manager.cjs +220 -220
  198. package/ez-agents/bin/lib/core.cjs +507 -512
  199. package/ez-agents/bin/lib/cost-tracker.cjs +243 -0
  200. package/ez-agents/bin/lib/crash-recovery.cjs +172 -0
  201. package/ez-agents/bin/lib/dependency-graph.cjs +319 -0
  202. package/ez-agents/bin/lib/deploy/deploy-audit-log.cjs +76 -0
  203. package/ez-agents/bin/lib/deploy/deploy-detector.cjs +69 -0
  204. package/ez-agents/bin/lib/deploy/deploy-env-manager.cjs +109 -0
  205. package/ez-agents/bin/lib/deploy/deploy-health-check.cjs +88 -0
  206. package/ez-agents/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
  207. package/ez-agents/bin/lib/deploy/deploy-rollback.cjs +72 -0
  208. package/ez-agents/bin/lib/deploy/deploy-runner.cjs +97 -0
  209. package/ez-agents/bin/lib/deploy/deploy-status.cjs +74 -0
  210. package/ez-agents/bin/lib/file-access.cjs +207 -207
  211. package/ez-agents/bin/lib/finops/budget-enforcer.cjs +126 -0
  212. package/ez-agents/bin/lib/finops/cost-reporter.cjs +132 -0
  213. package/ez-agents/bin/lib/finops/finops-analyzer.cjs +112 -0
  214. package/ez-agents/bin/lib/finops/spot-manager.cjs +118 -0
  215. package/ez-agents/bin/lib/framework-detector.cjs +396 -0
  216. package/ez-agents/bin/lib/frontmatter.cjs +3 -1
  217. package/ez-agents/bin/lib/gates/README.md +374 -0
  218. package/ez-agents/bin/lib/gates/gate-01-requirement.cjs +303 -0
  219. package/ez-agents/bin/lib/gates/gate-02-architecture.cjs +555 -0
  220. package/ez-agents/bin/lib/gates/gate-03-code.cjs +635 -0
  221. package/ez-agents/bin/lib/gates/gate-04-security.cjs +829 -0
  222. package/ez-agents/bin/lib/git-errors.cjs +83 -83
  223. package/ez-agents/bin/lib/git-utils.cjs +321 -321
  224. package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -1157
  225. package/ez-agents/bin/lib/health-check.cjs +162 -162
  226. package/ez-agents/bin/lib/index.cjs +2 -8
  227. package/ez-agents/bin/lib/init.cjs +0 -2
  228. package/ez-agents/bin/lib/lockfile-validator.cjs +227 -227
  229. package/ez-agents/bin/lib/log-rotation.cjs +71 -0
  230. package/ez-agents/bin/lib/logger.cjs +22 -47
  231. package/ez-agents/bin/lib/memory-compression.cjs +256 -256
  232. package/ez-agents/bin/lib/package-manager-detector.cjs +203 -203
  233. package/ez-agents/bin/lib/package-manager-executor.cjs +385 -385
  234. package/ez-agents/bin/lib/package-manager-service.cjs +216 -216
  235. package/ez-agents/bin/lib/perf/api-monitor.cjs +88 -0
  236. package/ez-agents/bin/lib/perf/db-optimizer.cjs +78 -0
  237. package/ez-agents/bin/lib/perf/frontend-performance.cjs +56 -0
  238. package/ez-agents/bin/lib/perf/perf-analyzer.cjs +77 -0
  239. package/ez-agents/bin/lib/perf/perf-baseline.cjs +102 -0
  240. package/ez-agents/bin/lib/perf/perf-reporter.cjs +117 -0
  241. package/ez-agents/bin/lib/perf/regression-detector.cjs +92 -0
  242. package/ez-agents/bin/lib/project-reporter.cjs +502 -0
  243. package/ez-agents/bin/lib/quality-gate.cjs +332 -0
  244. package/ez-agents/bin/lib/recovery-manager.cjs +98 -0
  245. package/ez-agents/bin/lib/release-validator.cjs +617 -614
  246. package/ez-agents/bin/lib/security-errors.cjs +62 -0
  247. package/ez-agents/bin/lib/session-chain.cjs +304 -304
  248. package/ez-agents/bin/lib/session-errors.cjs +81 -81
  249. package/ez-agents/bin/lib/session-export.cjs +251 -251
  250. package/ez-agents/bin/lib/session-import.cjs +262 -262
  251. package/ez-agents/bin/lib/session-manager.cjs +280 -280
  252. package/ez-agents/bin/lib/skill-context.cjs +148 -0
  253. package/ez-agents/bin/lib/skill-matcher.cjs +236 -0
  254. package/ez-agents/bin/lib/skill-registry.cjs +341 -0
  255. package/ez-agents/bin/lib/skill-resolver.cjs +449 -0
  256. package/ez-agents/bin/lib/skill-triggers.cjs +90 -0
  257. package/ez-agents/bin/lib/skill-validator.cjs +270 -0
  258. package/ez-agents/bin/lib/skill-versioning.cjs +355 -0
  259. package/ez-agents/bin/lib/stack-detector.cjs +399 -0
  260. package/ez-agents/bin/lib/tech-debt-analyzer.cjs +309 -0
  261. package/ez-agents/bin/lib/tier-manager.cjs +428 -428
  262. package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
  263. package/ez-agents/bin/lib/url-fetch.cjs +170 -170
  264. package/ez-agents/bin/lib/verify.cjs +863 -863
  265. package/ez-agents/references/decimal-phase-calculation.md +65 -65
  266. package/ez-agents/references/git-integration.md +248 -248
  267. package/ez-agents/references/git-planning-commit.md +38 -38
  268. package/ez-agents/references/metrics-schema.md +118 -118
  269. package/ez-agents/references/model-profile-resolution.md +34 -34
  270. package/ez-agents/references/model-profiles.md +93 -93
  271. package/ez-agents/references/phase-argument-parsing.md +61 -61
  272. package/ez-agents/references/planning-config.md +340 -340
  273. package/ez-agents/references/tier-strategy.md +103 -103
  274. package/ez-agents/references/ui-brand.md +160 -160
  275. package/ez-agents/references/verification-patterns.md +612 -612
  276. package/ez-agents/templates/DEBUG.md +164 -164
  277. package/ez-agents/templates/UAT.md +247 -247
  278. package/ez-agents/templates/agent-output-format.md +404 -0
  279. package/ez-agents/templates/bdd-feature.md +173 -173
  280. package/ez-agents/templates/codebase/architecture.md +255 -255
  281. package/ez-agents/templates/codebase/structure.md +285 -285
  282. package/ez-agents/templates/copilot-instructions.md +7 -7
  283. package/ez-agents/templates/debug-subagent-prompt.md +91 -91
  284. package/ez-agents/templates/discovery.md +146 -146
  285. package/ez-agents/templates/discussion.md +68 -68
  286. package/ez-agents/templates/handoff-protocol.md +294 -0
  287. package/ez-agents/templates/incident-runbook.md +205 -205
  288. package/ez-agents/templates/mode-workflow-templates.md +301 -0
  289. package/ez-agents/templates/phase-prompt.md +610 -610
  290. package/ez-agents/templates/planner-subagent-prompt.md +117 -117
  291. package/ez-agents/templates/project.md +184 -184
  292. package/ez-agents/templates/release-checklist.md +136 -133
  293. package/ez-agents/templates/research.md +552 -552
  294. package/ez-agents/templates/rollback-plan.md +201 -201
  295. package/ez-agents/templates/security-user-setup.md +244 -0
  296. package/ez-agents/templates/skill-validation-rules.md +476 -0
  297. package/ez-agents/templates/state.md +180 -176
  298. package/ez-agents/templates/summary-complex.md +59 -59
  299. package/ez-agents/tests/gates/gate-01-02.test.cjs +812 -0
  300. package/ez-agents/tests/gates/gate-03-04.test.cjs +762 -0
  301. package/ez-agents/tests/gates/gate-05-validator.test.cjs +145 -0
  302. package/ez-agents/tests/gates/gate-06-docs-validator.test.cjs +244 -0
  303. package/ez-agents/tests/gates/gate-07-release-validator.test.cjs +219 -0
  304. package/ez-agents/tests/guards/context-budget-guard.test.cjs +145 -0
  305. package/ez-agents/tests/guards/edge-case-guards.test.cjs +238 -0
  306. package/ez-agents/tests/guards/hallucination-guard.test.cjs +124 -0
  307. package/ez-agents/workflows/audit-milestone.md +1 -1
  308. package/ez-agents/workflows/autonomous.md +844 -844
  309. package/ez-agents/workflows/complete-milestone.md +1 -1
  310. package/ez-agents/workflows/discuss-phase.md +1 -1
  311. package/ez-agents/workflows/execute-phase.md +124 -3
  312. package/ez-agents/workflows/help.md +42 -181
  313. package/ez-agents/workflows/hotfix.md +291 -291
  314. package/ez-agents/workflows/new-milestone.md +713 -713
  315. package/ez-agents/workflows/new-project.md +1089 -1107
  316. package/ez-agents/workflows/plan-phase.md +0 -40
  317. package/ez-agents/workflows/release.md +253 -253
  318. package/ez-agents/workflows/resume-session.md +215 -215
  319. package/ez-agents/workflows/run-phase.md +531 -0
  320. package/ez-agents/workflows/settings.md +2 -35
  321. package/hooks/dist/ez-check-update.js +81 -81
  322. package/hooks/dist/ez-context-monitor.js +148 -141
  323. package/hooks/dist/ez-statusline.js +115 -115
  324. package/package.json +78 -71
  325. package/scripts/fix-qwen-installation.js +144 -144
  326. package/agents/ez-integration-checker.md +0 -443
  327. package/agents/ez-nyquist-auditor.md +0 -176
  328. package/agents/ez-observer-agent.md +0 -260
  329. package/agents/ez-plan-checker.md +0 -706
  330. package/agents/ez-research-synthesizer.md +0 -247
  331. package/agents/ez-scrum-master-agent.md +0 -242
  332. package/agents/ez-tech-lead-agent.md +0 -267
  333. package/agents/ez-ui-auditor.md +0 -439
  334. package/agents/ez-ui-checker.md +0 -300
  335. package/agents/ez-ui-researcher.md +0 -353
  336. package/commands/ez/add-phase.md +0 -43
  337. package/commands/ez/add-todo.md +0 -47
  338. package/commands/ez/arch-review.md +0 -102
  339. package/commands/ez/auth.md +0 -87
  340. package/commands/ez/autonomous.md +0 -41
  341. package/commands/ez/check-todos.md +0 -45
  342. package/commands/ez/cleanup.md +0 -18
  343. package/commands/ez/debug.md +0 -168
  344. package/commands/ez/export-session.md +0 -79
  345. package/commands/ez/gather-requirements.md +0 -117
  346. package/commands/ez/git-workflow.md +0 -72
  347. package/commands/ez/health.md +0 -22
  348. package/commands/ez/hotfix.md +0 -120
  349. package/commands/ez/import-session.md +0 -82
  350. package/commands/ez/insert-phase.md +0 -32
  351. package/commands/ez/join-discord.md +0 -18
  352. package/commands/ez/list-phase-assumptions.md +0 -46
  353. package/commands/ez/list-sessions.md +0 -96
  354. package/commands/ez/package-manager.md +0 -316
  355. package/commands/ez/pause-work.md +0 -38
  356. package/commands/ez/plan-milestone-gaps.md +0 -34
  357. package/commands/ez/preflight.md +0 -79
  358. package/commands/ez/reapply-patches.md +0 -124
  359. package/commands/ez/release.md +0 -153
  360. package/commands/ez/remove-phase.md +0 -31
  361. package/commands/ez/research-phase.md +0 -190
  362. package/commands/ez/resume.md +0 -107
  363. package/commands/ez/set-profile.md +0 -34
  364. package/commands/ez/standup.md +0 -85
  365. package/commands/ez/stats.md +0 -18
  366. package/commands/ez/ui-phase.md +0 -34
  367. package/commands/ez/ui-review.md +0 -32
  368. package/commands/ez/validate-phase.md +0 -35
  369. package/ez-agents/bin/lib/metrics-tracker.cjs +0 -406
  370. package/ez-agents/templates/UI-SPEC.md +0 -100
  371. package/ez-agents/templates/VALIDATION.md +0 -76
  372. package/ez-agents/templates/context.md +0 -352
  373. package/ez-agents/templates/verification-report.md +0 -322
  374. package/ez-agents/workflows/arch-review.md +0 -54
  375. package/ez-agents/workflows/export-session.md +0 -255
  376. package/ez-agents/workflows/gather-requirements.md +0 -206
  377. package/ez-agents/workflows/import-session.md +0 -303
  378. package/ez-agents/workflows/research-phase.md +0 -74
  379. package/ez-agents/workflows/standup.md +0 -64
  380. package/ez-agents/workflows/ui-phase.md +0 -290
  381. package/ez-agents/workflows/ui-review.md +0 -157
  382. package/ez-agents/workflows/validate-phase.md +0 -167
@@ -0,0 +1,422 @@
1
+ /**
2
+ * BackupService — Repository backup automation for EZ Agents
3
+ *
4
+ * Creates snapshot backups of configured paths with manifest.json and SHA-256 checksums.
5
+ * Backups are stored in .planning/recovery/backups/<backup-id>/
6
+ *
7
+ * Usage:
8
+ * const BackupService = require('./backup-service.cjs');
9
+ * const backupService = new BackupService(cwd, options);
10
+ * const result = backupService.createBackup({ label: 'manual', scope: [...] });
11
+ */
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+ const crypto = require('crypto');
16
+ const { execSync } = require('child_process');
17
+ const { safePlanningWriteSync } = require('./planning-write.cjs');
18
+ const Logger = require('./logger.cjs');
19
+
20
+ const logger = new Logger();
21
+
22
+ /**
23
+ * Default backup scope for EZ Agents repository
24
+ */
25
+ const DEFAULT_BACKUP_SCOPE = [
26
+ '.planning',
27
+ '.github/workflows',
28
+ 'commands',
29
+ 'ez-agents/bin/lib',
30
+ 'package.json',
31
+ 'package-lock.json'
32
+ ];
33
+
34
+ /**
35
+ * Default retention settings
36
+ */
37
+ const DEFAULT_RETENTION = {
38
+ local_backups: 10,
39
+ drill_reports: 12
40
+ };
41
+
42
+ class BackupService {
43
+ /**
44
+ * Create a BackupService instance
45
+ * @param {string} cwd - Working directory (project root)
46
+ * @param {Object} options - Configuration options
47
+ * @param {string[]} options.scope - Override default backup scope
48
+ * @param {Object} options.retention - Retention settings
49
+ */
50
+ constructor(cwd, options = {}) {
51
+ this.cwd = cwd || process.cwd();
52
+ this.scope = options.scope || DEFAULT_BACKUP_SCOPE;
53
+ this.retention = {
54
+ ...DEFAULT_RETENTION,
55
+ ...(options.retention || {})
56
+ };
57
+ this.backupsDir = path.join(this.cwd, '.planning', 'recovery', 'backups');
58
+ }
59
+
60
+ /**
61
+ * Get current git commit SHA
62
+ * @returns {string|null} - Commit SHA or null if not in git repo
63
+ */
64
+ _getCommitSha() {
65
+ try {
66
+ const sha = execSync('git rev-parse HEAD', {
67
+ cwd: this.cwd,
68
+ encoding: 'utf-8',
69
+ stdio: ['pipe', 'pipe', 'pipe']
70
+ }).trim();
71
+ return sha;
72
+ } catch (err) {
73
+ logger.warn('Could not get git commit SHA', { error: err.message });
74
+ return null;
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Calculate SHA-256 hash of file content
80
+ * @param {string} content - File content
81
+ * @returns {string} - SHA-256 hash
82
+ */
83
+ _calculateSha256(content) {
84
+ return crypto.createHash('sha256').update(content).digest('hex');
85
+ }
86
+
87
+ /**
88
+ * Get file size in bytes
89
+ * @param {string} filePath - File path
90
+ * @returns {number} - File size
91
+ */
92
+ _getFileSize(filePath) {
93
+ return fs.statSync(filePath).size;
94
+ }
95
+
96
+ /**
97
+ * Generate unique backup ID
98
+ * @returns {string} - Backup ID
99
+ */
100
+ _generateBackupId() {
101
+ const timestamp = Date.now();
102
+ const random = crypto.randomBytes(4).toString('hex');
103
+ return `${timestamp}-${random}`;
104
+ }
105
+
106
+ /**
107
+ * Collect files from backup scope
108
+ * @param {string[]} scope - Paths to include
109
+ * @returns {Object[]} - Array of file info objects
110
+ */
111
+ _collectFiles(scope) {
112
+ const files = [];
113
+
114
+ for (const scopePath of scope) {
115
+ const fullPath = path.join(this.cwd, scopePath);
116
+
117
+ if (!fs.existsSync(fullPath)) {
118
+ logger.debug('Skipping missing path', { path: scopePath });
119
+ continue;
120
+ }
121
+
122
+ const stat = fs.statSync(fullPath);
123
+
124
+ if (stat.isFile()) {
125
+ // Single file
126
+ try {
127
+ const content = fs.readFileSync(fullPath, 'utf-8');
128
+ files.push({
129
+ originalPath: fullPath,
130
+ relativePath: scopePath,
131
+ content,
132
+ sha256: this._calculateSha256(content),
133
+ size_bytes: this._getFileSize(fullPath)
134
+ });
135
+ } catch (err) {
136
+ logger.warn('Failed to read file', { path: scopePath, error: err.message });
137
+ }
138
+ } else if (stat.isDirectory()) {
139
+ // Directory - walk recursively
140
+ const dirFiles = this._walkDirectory(fullPath, scopePath);
141
+ files.push(...dirFiles);
142
+ }
143
+ }
144
+
145
+ return files;
146
+ }
147
+
148
+ /**
149
+ * Walk directory recursively
150
+ * @param {string} dirPath - Directory path
151
+ * @param {string} basePath - Base path for relative calculation
152
+ * @returns {Object[]} - Array of file info objects
153
+ */
154
+ _walkDirectory(dirPath, basePath) {
155
+ const files = [];
156
+
157
+ try {
158
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
159
+
160
+ for (const entry of entries) {
161
+ // Skip node_modules and other common exclusions
162
+ if (entry.name === 'node_modules' || entry.name.startsWith('.')) {
163
+ // But allow .planning, .github
164
+ if (!['.planning', '.github'].includes(entry.name) && entry.isDirectory()) {
165
+ continue;
166
+ }
167
+ }
168
+
169
+ const fullPath = path.join(dirPath, entry.name);
170
+ const relativePath = path.join(basePath, path.relative(path.join(this.cwd, basePath), fullPath));
171
+
172
+ if (entry.isDirectory()) {
173
+ files.push(...this._walkDirectory(fullPath, basePath));
174
+ } else if (entry.isFile()) {
175
+ try {
176
+ const content = fs.readFileSync(fullPath, 'utf-8');
177
+ files.push({
178
+ originalPath: fullPath,
179
+ relativePath: relativePath.replace(/^[\\/]/, ''),
180
+ content,
181
+ sha256: this._calculateSha256(content),
182
+ size_bytes: this._getFileSize(fullPath)
183
+ });
184
+ } catch (err) {
185
+ logger.warn('Failed to read file during directory walk', {
186
+ path: fullPath,
187
+ error: err.message
188
+ });
189
+ }
190
+ }
191
+ }
192
+ } catch (err) {
193
+ logger.warn('Failed to walk directory', { path: dirPath, error: err.message });
194
+ }
195
+
196
+ return files;
197
+ }
198
+
199
+ /**
200
+ * Create a backup
201
+ * @param {Object} options - Backup options
202
+ * @param {string} options.label - Backup label (default: 'manual')
203
+ * @param {string[]} options.scope - Override default scope
204
+ * @param {boolean} options.verify - Verify backup after creation
205
+ * @returns {Object} - Backup result with backupDir and manifest
206
+ */
207
+ createBackup({ label = 'manual', scope, verify = false } = {}) {
208
+ const backupScope = scope || this.scope;
209
+ const backupId = this._generateBackupId();
210
+ const backupDir = path.join(this.backupsDir, `${Date.now()}-${label}`);
211
+ const commitSha = this._getCommitSha();
212
+
213
+ logger.info('Creating backup', { backupId, label, scope: backupScope });
214
+
215
+ // Ensure backups directory exists
216
+ fs.mkdirSync(this.backupsDir, { recursive: true });
217
+
218
+ // Collect files from scope
219
+ const files = this._collectFiles(backupScope);
220
+
221
+ if (files.length === 0) {
222
+ logger.warn('No files found in backup scope', { scope: backupScope });
223
+ }
224
+
225
+ // Create backup directory structure and copy files
226
+ for (const file of files) {
227
+ const backupPath = path.join(backupDir, file.relativePath);
228
+ const backupDirPath = path.dirname(backupPath);
229
+
230
+ fs.mkdirSync(backupDirPath, { recursive: true });
231
+ fs.writeFileSync(backupPath, file.content, 'utf-8');
232
+ }
233
+
234
+ // Create manifest
235
+ const manifest = {
236
+ backup_id: backupId,
237
+ created_at: new Date().toISOString(),
238
+ scope: backupScope,
239
+ commit_sha: commitSha,
240
+ files: files.map(f => ({
241
+ path: f.relativePath,
242
+ sha256: f.sha256,
243
+ size_bytes: f.size_bytes
244
+ }))
245
+ };
246
+
247
+ // Write manifest atomically
248
+ const manifestPath = path.join(backupDir, 'manifest.json');
249
+ safePlanningWriteSync(manifestPath, JSON.stringify(manifest, null, 2));
250
+
251
+ logger.info('Backup created', {
252
+ backupId,
253
+ backupDir,
254
+ fileCount: files.length
255
+ });
256
+
257
+ // Verify if requested
258
+ let verifyResult = null;
259
+ if (verify) {
260
+ verifyResult = this.verifyBackup(backupDir);
261
+ }
262
+
263
+ // Prune old backups
264
+ this.pruneBackups(this.retention.local_backups);
265
+
266
+ return {
267
+ backup_id: backupId,
268
+ backupDir,
269
+ manifest,
270
+ fileCount: files.length,
271
+ verify: verifyResult
272
+ };
273
+ }
274
+
275
+ /**
276
+ * Verify a backup by checking checksums
277
+ * @param {string} backupDir - Backup directory path
278
+ * @returns {Object} - Verification result
279
+ */
280
+ verifyBackup(backupDir) {
281
+ const manifestPath = path.join(backupDir, 'manifest.json');
282
+
283
+ if (!fs.existsSync(manifestPath)) {
284
+ const error = 'Manifest not found';
285
+ logger.error('Backup verification failed', { error });
286
+ return {
287
+ valid: false,
288
+ errors: [error]
289
+ };
290
+ }
291
+
292
+ let manifest;
293
+ try {
294
+ manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
295
+ } catch (err) {
296
+ const error = `Failed to parse manifest: ${err.message}`;
297
+ logger.error('Backup verification failed', { error });
298
+ return {
299
+ valid: false,
300
+ errors: [error]
301
+ };
302
+ }
303
+
304
+ const errors = [];
305
+ const warnings = [];
306
+
307
+ for (const file of manifest.files) {
308
+ const filePath = path.join(backupDir, file.path);
309
+
310
+ if (!fs.existsSync(filePath)) {
311
+ errors.push(`Missing file: ${file.path}`);
312
+ continue;
313
+ }
314
+
315
+ try {
316
+ const content = fs.readFileSync(filePath, 'utf-8');
317
+ const actualSha256 = this._calculateSha256(content);
318
+
319
+ if (actualSha256 !== file.sha256) {
320
+ errors.push(`Checksum mismatch for ${file.path}: expected ${file.sha256}, got ${actualSha256}`);
321
+ }
322
+ } catch (err) {
323
+ errors.push(`Failed to read ${file.path}: ${err.message}`);
324
+ }
325
+ }
326
+
327
+ const valid = errors.length === 0;
328
+
329
+ if (valid) {
330
+ logger.info('Backup verification passed', { backupDir });
331
+ } else {
332
+ logger.error('Backup verification failed', { errors });
333
+ }
334
+
335
+ return {
336
+ valid,
337
+ errors,
338
+ warnings,
339
+ manifest
340
+ };
341
+ }
342
+
343
+ /**
344
+ * Prune old backups to respect retention policy
345
+ * @param {number} maxBackups - Maximum number of backups to keep
346
+ * @returns {Object} - Prune result
347
+ */
348
+ pruneBackups(maxBackups) {
349
+ if (!fs.existsSync(this.backupsDir)) {
350
+ return { pruned: [] };
351
+ }
352
+
353
+ const backups = fs.readdirSync(this.backupsDir)
354
+ .filter(name => {
355
+ const fullPath = path.join(this.backupsDir, name);
356
+ return fs.statSync(fullPath).isDirectory();
357
+ })
358
+ .map(name => ({
359
+ name,
360
+ path: path.join(this.backupsDir, name),
361
+ mtime: fs.statSync(path.join(this.backupsDir, name)).mtimeMs
362
+ }))
363
+ .sort((a, b) => a.mtime - b.mtime); // Oldest first
364
+
365
+ const toPrune = backups.length - maxBackups;
366
+ const pruned = [];
367
+
368
+ if (toPrune > 0) {
369
+ for (let i = 0; i < toPrune; i++) {
370
+ const backup = backups[i];
371
+ try {
372
+ fs.rmSync(backup.path, { recursive: true, force: true });
373
+ pruned.push(backup.name);
374
+ logger.info('Pruned old backup', { name: backup.name });
375
+ } catch (err) {
376
+ logger.error('Failed to prune backup', { name: backup.name, error: err.message });
377
+ }
378
+ }
379
+ }
380
+
381
+ return { pruned };
382
+ }
383
+
384
+ /**
385
+ * List all backups
386
+ * @returns {Object[]} - Array of backup info objects
387
+ */
388
+ listBackups() {
389
+ if (!fs.existsSync(this.backupsDir)) {
390
+ return [];
391
+ }
392
+
393
+ return fs.readdirSync(this.backupsDir)
394
+ .filter(name => {
395
+ const fullPath = path.join(this.backupsDir, name);
396
+ return fs.statSync(fullPath).isDirectory();
397
+ })
398
+ .map(name => {
399
+ const backupPath = path.join(this.backupsDir, name);
400
+ const manifestPath = path.join(backupPath, 'manifest.json');
401
+ let manifest = null;
402
+
403
+ if (fs.existsSync(manifestPath)) {
404
+ try {
405
+ manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
406
+ } catch (err) {
407
+ // Ignore manifest parse errors
408
+ }
409
+ }
410
+
411
+ return {
412
+ name,
413
+ path: backupPath,
414
+ manifest,
415
+ createdAt: manifest?.created_at || fs.statSync(backupPath).mtime.toISOString()
416
+ };
417
+ })
418
+ .sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); // Newest first
419
+ }
420
+ }
421
+
422
+ module.exports = BackupService;