@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,117 @@
1
+ /**
2
+ * Perf Reporter — Performance report generation
3
+ * Generates structured reports (temp directory)
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+
9
+ class PerfReporter {
10
+ constructor(cwd) {
11
+ this.cwd = cwd || process.cwd();
12
+ }
13
+
14
+ /**
15
+ * Generate structured performance report
16
+ * @param {Object} results - Analysis results from PerfAnalyzer
17
+ * @returns {Object} Structured report
18
+ */
19
+ generateReport(results) {
20
+ return {
21
+ timestamp: results.timestamp || new Date().toISOString(),
22
+ summary: {
23
+ dbIssues: results.db?.suggestions?.length || 0,
24
+ frontendScore: results.frontend?.performance || 0,
25
+ apiLatency: results.api ? this.calculateAvgLatency(results.api) : 0
26
+ },
27
+ details: {
28
+ db: results.db || null,
29
+ frontend: results.frontend || null,
30
+ api: results.api || null
31
+ },
32
+ errors: results.errors || [],
33
+ recommendations: this.generateRecommendations(results)
34
+ };
35
+ }
36
+
37
+ /**
38
+ * Save report to temp directory
39
+ * @param {Object} report - Report to save
40
+ * @param {string} filename - Optional filename
41
+ * @returns {string} Path to saved report
42
+ */
43
+ saveReport(report, filename) {
44
+ const logsDir = path.join(process.env.TEMP || process.env.TMPDIR || '/tmp', 'ez-agents-perf');
45
+ if (!fs.existsSync(logsDir)) {
46
+ fs.mkdirSync(logsDir, { recursive: true });
47
+ }
48
+
49
+ const reportFilename = filename || `perf-${Date.now()}.json`;
50
+ const reportPath = path.join(logsDir, reportFilename);
51
+
52
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf8');
53
+ return reportPath;
54
+ }
55
+
56
+ /**
57
+ * Calculate average latency from API results
58
+ * @param {Array} apiResults - API latency results
59
+ * @returns {number} Average latency
60
+ */
61
+ calculateAvgLatency(apiResults) {
62
+ if (!apiResults || apiResults.length === 0) return 0;
63
+ const valid = apiResults.filter(r => r.latency > 0);
64
+ if (valid.length === 0) return 0;
65
+ return Math.round(valid.reduce((sum, r) => sum + r.latency, 0) / valid.length);
66
+ }
67
+
68
+ /**
69
+ * Generate recommendations from analysis results
70
+ * @param {Object} results - Analysis results
71
+ * @returns {Array} Recommendations
72
+ */
73
+ generateRecommendations(results) {
74
+ const recommendations = [];
75
+
76
+ if (results.db?.suggestions?.length > 0) {
77
+ recommendations.push({
78
+ category: 'database',
79
+ priority: 'high',
80
+ suggestion: `Address ${results.db.suggestions.length} query optimization opportunities`
81
+ });
82
+ }
83
+
84
+ if (results.frontend?.performance < 50) {
85
+ recommendations.push({
86
+ category: 'frontend',
87
+ priority: 'critical',
88
+ suggestion: 'Frontend performance score is low - optimize bundle size and Core Web Vitals'
89
+ });
90
+ }
91
+
92
+ return recommendations;
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Generate structured performance report
98
+ * @param {Object} results - Analysis results from PerfAnalyzer
99
+ * @returns {Object} Structured report
100
+ */
101
+ function generateReport(results) {
102
+ const reporter = new PerfReporter();
103
+ return reporter.generateReport(results);
104
+ }
105
+
106
+ /**
107
+ * Save report to temp directory
108
+ * @param {Object} report - Report to save
109
+ * @param {string} filename - Optional filename
110
+ * @returns {string} Path to saved report
111
+ */
112
+ function saveReport(report, filename) {
113
+ const reporter = new PerfReporter();
114
+ return reporter.saveReport(report, filename);
115
+ }
116
+
117
+ module.exports = { PerfReporter, generateReport, saveReport };
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Regression Detector — Baseline comparison and regression flagging
3
+ * Flags >10% degradation with severity levels
4
+ */
5
+
6
+ class RegressionDetector {
7
+ /**
8
+ * Detect regressions by comparing current metrics against baseline
9
+ * @param {Object} current - Current metrics
10
+ * @param {Object} baseline - Baseline metrics
11
+ * @param {number} threshold - Regression threshold percentage (default: 10)
12
+ * @returns {Array} Array of regression findings
13
+ */
14
+ detectRegressions(current, baseline, threshold = 10) {
15
+ const regressions = [];
16
+
17
+ for (const [metric, currentValue] of Object.entries(current)) {
18
+ const baselineValue = baseline[metric];
19
+ if (baselineValue === undefined || baselineValue === 0) continue;
20
+
21
+ const change = ((currentValue - baselineValue) / baselineValue) * 100;
22
+
23
+ if (change > threshold) {
24
+ regressions.push({
25
+ metric,
26
+ current: currentValue,
27
+ baseline: baselineValue,
28
+ changePercent: Math.round(change * 100) / 100,
29
+ severity: change > 50 ? 'critical' : change > 20 ? 'high' : 'medium'
30
+ });
31
+ }
32
+ }
33
+
34
+ return regressions;
35
+ }
36
+
37
+ /**
38
+ * Save baseline metrics
39
+ * @param {Object} metrics - Metrics to save
40
+ * @param {string} name - Baseline name
41
+ * @param {string} cwd - Working directory
42
+ */
43
+ saveBaseline(metrics, name = 'default', cwd) {
44
+ const fs = require('fs');
45
+ const path = require('path');
46
+ const baselinePath = path.join(cwd || process.cwd(), '.planning', 'perf-baselines', `${name}.json`);
47
+
48
+ // Ensure directory exists
49
+ const dir = path.dirname(baselinePath);
50
+ if (!fs.existsSync(dir)) {
51
+ fs.mkdirSync(dir, { recursive: true });
52
+ }
53
+
54
+ fs.writeFileSync(baselinePath, JSON.stringify({
55
+ ...metrics,
56
+ metadata: {
57
+ name,
58
+ createdAt: new Date().toISOString()
59
+ }
60
+ }, null, 2));
61
+ }
62
+
63
+ /**
64
+ * Load baseline metrics
65
+ * @param {string} name - Baseline name
66
+ * @param {string} cwd - Working directory
67
+ * @returns {Object|null} Baseline metrics or null
68
+ */
69
+ loadBaseline(name = 'default', cwd) {
70
+ const fs = require('fs');
71
+ const path = require('path');
72
+ const baselinePath = path.join(cwd || process.cwd(), '.planning', 'perf-baselines', `${name}.json`);
73
+
74
+ if (!fs.existsSync(baselinePath)) return null;
75
+
76
+ return JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Detect regressions by comparing current metrics against baseline
82
+ * @param {Object} current - Current metrics
83
+ * @param {Object} baseline - Baseline metrics
84
+ * @param {number} threshold - Regression threshold percentage (default: 10)
85
+ * @returns {Array} Array of regression findings
86
+ */
87
+ function detectRegressions(current, baseline, threshold = 10) {
88
+ const detector = new RegressionDetector();
89
+ return detector.detectRegressions(current, baseline, threshold);
90
+ }
91
+
92
+ module.exports = { RegressionDetector, detectRegressions };
@@ -0,0 +1,502 @@
1
+ /**
2
+ * Project Reporter — Aggregates codebase mapping, stack detection, and tech debt analysis
3
+ *
4
+ * Provides:
5
+ * - generate(structure, stack, techDebt): Aggregates all analysis into unified report
6
+ * - buildArchitectureOverview(structure, stack): Creates architecture summary section
7
+ * - buildPainPoints(techDebt): Creates prioritized issues section
8
+ * - buildRecommendations(techDebt, stack): Creates actionable recommendations section
9
+ */
10
+
11
+ const path = require('path');
12
+
13
+ class ProjectReporter {
14
+ constructor(rootPath) {
15
+ this.rootPath = rootPath;
16
+ }
17
+
18
+ /**
19
+ * Generate comprehensive project report
20
+ * @param {object} structure - Structure from CodebaseAnalyzer
21
+ * @param {object} stack - Stack from StackDetector
22
+ * @param {object} techDebt - Tech debt from TechDebtAnalyzer
23
+ * @returns {string} Markdown report
24
+ */
25
+ generate(structure, stack, techDebt) {
26
+ const sections = [
27
+ this.buildHeader(),
28
+ this.buildFileStructureSummary(structure),
29
+ this.buildTechStackSummary(stack),
30
+ this.buildArchitectureOverview(structure, stack),
31
+ this.buildPainPoints(techDebt),
32
+ this.buildRecommendations(techDebt, stack)
33
+ ];
34
+
35
+ return sections.filter(s => s).join('\n\n');
36
+ }
37
+
38
+ /**
39
+ * Build report header
40
+ * @private
41
+ */
42
+ buildHeader() {
43
+ const date = new Date().toISOString().split('T')[0];
44
+ return `# Project Analysis Report
45
+
46
+ **Generated:** ${date}
47
+ **Analysis Depth:** Standard
48
+
49
+ ---
50
+
51
+ ## Executive Summary
52
+
53
+ This report provides a comprehensive analysis of the codebase including file structure, technology stack, architecture patterns, pain points, and actionable recommendations.
54
+ `;
55
+ }
56
+
57
+ /**
58
+ * Build architecture overview section
59
+ * @param {object} structure - Structure from CodebaseAnalyzer
60
+ * @param {object} stack - Stack from StackDetector
61
+ * @returns {string} Markdown section
62
+ */
63
+ buildArchitectureOverview(structure, stack) {
64
+ const pattern = this._detectPattern(structure, stack);
65
+ const layers = this._describeLayers(structure);
66
+ const dataFlow = this._describeDataFlow(structure);
67
+ const entryPoints = structure.entryPoints || [];
68
+ const errorHandling = this._detectErrorHandling(structure);
69
+
70
+ return `## Architecture Overview
71
+
72
+ ### Pattern
73
+
74
+ **Detected Pattern:** ${pattern}
75
+
76
+ ### Layers
77
+
78
+ ${layers}
79
+
80
+ ### Data Flow
81
+
82
+ ${dataFlow}
83
+
84
+ ### Entry Points
85
+
86
+ ${entryPoints.length > 0 ? entryPoints.map(ep => `- \`${ep}\``).join('\n') : '- No explicit entry points detected'}
87
+
88
+ ### Error Handling
89
+
90
+ ${errorHandling}
91
+ `;
92
+ }
93
+
94
+ /**
95
+ * Build pain points section
96
+ * @param {object} techDebt - Tech debt analysis
97
+ * @returns {string} Markdown section
98
+ */
99
+ buildPainPoints(techDebt) {
100
+ const findings = techDebt.findings || [];
101
+
102
+ // Group by severity
103
+ const bySeverity = {
104
+ Critical: [],
105
+ High: [],
106
+ Medium: [],
107
+ Low: []
108
+ };
109
+
110
+ for (const finding of findings) {
111
+ const severity = finding.severity || 'Medium';
112
+ if (bySeverity[severity]) {
113
+ bySeverity[severity].push(finding);
114
+ }
115
+ }
116
+
117
+ let section = `## Pain Points
118
+
119
+ **Total Issues:** ${findings.length}
120
+
121
+ `;
122
+
123
+ // Critical Issues
124
+ if (bySeverity.Critical.length > 0) {
125
+ section += `### **Critical** Issues (${bySeverity.Critical.length})\n\n`;
126
+ for (const issue of bySeverity.Critical.slice(0, 5)) {
127
+ section += `- **${issue.file || 'Unknown'}** (line ${issue.line || '?'})\n`;
128
+ section += ` - ${issue.description || issue.content || issue.message}\n`;
129
+ section += ` - **Impact:** Requires immediate attention\n\n`;
130
+ }
131
+ }
132
+
133
+ // High Priority
134
+ if (bySeverity.High.length > 0) {
135
+ section += `### **High** Priority (${bySeverity.High.length})\n\n`;
136
+ for (const issue of bySeverity.High.slice(0, 5)) {
137
+ section += `- **${issue.file || 'Unknown'}**\n`;
138
+ section += ` - ${issue.description || issue.content || issue.message}\n\n`;
139
+ }
140
+ }
141
+
142
+ // Medium Priority
143
+ if (bySeverity.Medium.length > 0) {
144
+ section += `### **Medium** Priority (${bySeverity.Medium.length})\n\n`;
145
+ section += `- ${bySeverity.Medium.length} medium priority issues identified\n`;
146
+ section += `- Review and address in upcoming sprints\n\n`;
147
+ }
148
+
149
+ // Low Priority
150
+ if (bySeverity.Low.length > 0) {
151
+ section += `### **Low** Priority (${bySeverity.Low.length})\n\n`;
152
+ section += `- ${bySeverity.Low.length} low priority issues identified\n`;
153
+ section += `- Address as time permits\n\n`;
154
+ }
155
+
156
+ if (findings.length === 0) {
157
+ section += '*No significant pain points identified.*\n\n';
158
+ }
159
+
160
+ return section;
161
+ }
162
+
163
+ /**
164
+ * Build recommendations section
165
+ * @param {object} techDebt - Tech debt analysis
166
+ * @param {object} stack - Stack from StackDetector
167
+ * @returns {string} Markdown section
168
+ */
169
+ buildRecommendations(techDebt, stack) {
170
+ const recommendations = [];
171
+ const findings = techDebt.findings || [];
172
+
173
+ // Generate recommendations based on findings
174
+ const criticalFindings = findings.filter(f => f.severity === 'Critical');
175
+ const highFindings = findings.filter(f => f.severity === 'High');
176
+ const largeFiles = findings.filter(f => f.type === 'large_file');
177
+ const complexityIssues = findings.filter(f => f.type === 'complexity');
178
+
179
+ // Critical issues → Immediate action
180
+ if (criticalFindings.length > 0) {
181
+ recommendations.push({
182
+ title: 'Address Critical Issues Immediately',
183
+ issue: `${criticalFindings.length} critical issues require immediate attention`,
184
+ files: [...new Set(criticalFindings.map(f => f.file).filter(Boolean))],
185
+ approach: 'Review and fix critical issues including deprecated code, security vulnerabilities, and breaking bugs',
186
+ effort: 'High'
187
+ });
188
+ }
189
+
190
+ // Large files → Refactoring
191
+ if (largeFiles.length > 0) {
192
+ recommendations.push({
193
+ title: 'Refactor Large Files',
194
+ issue: `${largeFiles.length} files exceed recommended size thresholds`,
195
+ files: largeFiles.slice(0, 5).map(f => f.file),
196
+ approach: 'Split large files into smaller, focused modules. Target files with >500 lines.',
197
+ effort: 'Medium'
198
+ });
199
+ }
200
+
201
+ // Complexity issues → Simplification
202
+ if (complexityIssues.length > 0) {
203
+ recommendations.push({
204
+ title: 'Reduce Code Complexity',
205
+ issue: `${complexityIssues.length} functions/files have high complexity`,
206
+ files: [...new Set(complexityIssues.map(f => f.file).filter(Boolean))],
207
+ approach: 'Extract helper functions, reduce nesting, and simplify conditional logic',
208
+ effort: 'Medium'
209
+ });
210
+ }
211
+
212
+ // High priority findings
213
+ if (highFindings.length > 5) {
214
+ recommendations.push({
215
+ title: 'Address High Priority Tech Debt',
216
+ issue: `${highFindings.length} high priority issues identified`,
217
+ files: [...new Set(highFindings.map(f => f.file).filter(Boolean))],
218
+ approach: 'Create tickets for high priority issues and address in next sprint',
219
+ effort: 'Medium'
220
+ });
221
+ }
222
+
223
+ // Stack-specific recommendations
224
+ if (stack.frameworks?.includes('Next.js')) {
225
+ recommendations.push({
226
+ title: 'Optimize Next.js Configuration',
227
+ issue: 'Ensure optimal Next.js setup for production',
228
+ files: ['next.config.js', 'package.json'],
229
+ approach: 'Review Next.js configuration for performance optimizations, image optimization, and caching',
230
+ effort: 'Low'
231
+ });
232
+ }
233
+
234
+ let section = `## Recommendations
235
+
236
+ `;
237
+
238
+ if (recommendations.length === 0) {
239
+ section += '*No specific recommendations at this time. Continue following best practices.*\n\n';
240
+ } else {
241
+ for (const rec of recommendations) {
242
+ section += `### ${rec.title}\n\n`;
243
+ section += `- **Issue:** ${rec.issue}\n`;
244
+ section += `- **Files:** ${rec.files.length > 0 ? rec.files.map(f => `\`${f}\``).join(', ') : 'N/A'}\n`;
245
+ section += `- **Fix approach:** ${rec.approach}\n`;
246
+ section += `- **Effort:** ${rec.effort}\n\n`;
247
+ }
248
+ }
249
+
250
+ return section;
251
+ }
252
+
253
+ /**
254
+ * Build file structure summary section
255
+ * @param {object} structure - Structure from CodebaseAnalyzer
256
+ * @returns {string} Markdown section
257
+ */
258
+ buildFileStructureSummary(structure) {
259
+ const directories = structure.directories || [];
260
+ const entryPoints = structure.entryPoints || [];
261
+ const configFiles = structure.configFiles || [];
262
+ const modules = structure.modules || [];
263
+
264
+ let section = `## File Structure
265
+
266
+ ### Directory Layout
267
+
268
+ \`\`\`
269
+ ${this._buildDirectoryTree(structure)}
270
+ \`\`\`
271
+
272
+ ### Directory Purposes
273
+
274
+ `;
275
+
276
+ // Group directories by depth
277
+ const topDirs = directories.filter(d => d.depth === 1).slice(0, 10);
278
+ for (const dir of topDirs) {
279
+ const name = path.basename(dir.path);
280
+ const purpose = this._describeDirectoryPurpose(name);
281
+ section += `- **${name}** — ${purpose}\n`;
282
+ }
283
+
284
+ section += `\n### Key Files\n\n`;
285
+
286
+ if (entryPoints.length > 0) {
287
+ section += '**Entry Points:**\n\n';
288
+ for (const ep of entryPoints.slice(0, 5)) {
289
+ section += `- \`${ep}\`\n`;
290
+ }
291
+ section += '\n';
292
+ }
293
+
294
+ if (configFiles.length > 0) {
295
+ section += '**Configuration Files:**\n\n';
296
+ for (const cf of configFiles.slice(0, 10)) {
297
+ const name = path.basename(cf);
298
+ section += `- \`${name}\`\n`;
299
+ }
300
+ section += '\n';
301
+ }
302
+
303
+ if (modules.length > 0) {
304
+ section += '**Module Boundaries:**\n\n';
305
+ for (const mod of modules.slice(0, 10)) {
306
+ section += `- **${mod.name}** (${mod.fileCount} files) — \`${mod.path}\`\n`;
307
+ }
308
+ }
309
+
310
+ return section;
311
+ }
312
+
313
+ /**
314
+ * Build technology stack summary section
315
+ * @param {object} stack - Stack from StackDetector
316
+ * @returns {string} Markdown section
317
+ */
318
+ buildTechStackSummary(stack) {
319
+ const language = stack.language || 'Unknown';
320
+ const runtime = stack.runtime || 'Unknown';
321
+ const packageManager = stack.packageManager || 'Unknown';
322
+ const frameworks = stack.frameworks || [];
323
+ const databases = stack.databases || [];
324
+ const infrastructure = stack.infrastructure || [];
325
+
326
+ return `## Technology Stack
327
+
328
+ ### Languages
329
+
330
+ - **Primary:** ${language}
331
+ - **Runtime:** ${runtime}
332
+
333
+ ### Package Manager
334
+
335
+ - **Manager:** ${packageManager}
336
+
337
+ ### Frameworks
338
+
339
+ ${frameworks.length > 0 ? frameworks.map(f => `- ${f}`).join('\n') : '- No major frameworks detected'}
340
+
341
+ ### Databases
342
+
343
+ ${databases.length > 0 ? databases.map(d => `- ${d}`).join('\n') : '- No databases detected'}
344
+
345
+ ### Infrastructure
346
+
347
+ ${infrastructure.length > 0 ? infrastructure.map(i => `- ${i}`).join('\n') : '- No infrastructure tools detected'}
348
+ `;
349
+ }
350
+
351
+ /**
352
+ * Detect architectural pattern from structure
353
+ * @private
354
+ */
355
+ _detectPattern(structure, stack) {
356
+ const directories = structure.directories || [];
357
+ const dirNames = directories.map(d => path.basename(d.path).toLowerCase());
358
+
359
+ if (dirNames.includes('components') && dirNames.includes('pages')) {
360
+ return stack.frameworks?.includes('Next.js') ? 'Next.js Pages/App Router' : 'React Component-based';
361
+ }
362
+ if (dirNames.includes('controllers') && dirNames.includes('models') && dirNames.includes('routes')) {
363
+ return 'MVC (Model-View-Controller)';
364
+ }
365
+ if (dirNames.includes('services') && dirNames.includes('handlers')) {
366
+ return 'Service-Oriented';
367
+ }
368
+ if (dirNames.includes('features') || dirNames.includes('modules')) {
369
+ return 'Feature-based / Domain-driven';
370
+ }
371
+ return 'Standard Layered Architecture';
372
+ }
373
+
374
+ /**
375
+ * Describe layers in the architecture
376
+ * @private
377
+ */
378
+ _describeLayers(structure) {
379
+ const directories = structure.directories || [];
380
+ const layers = [];
381
+
382
+ const layerPatterns = {
383
+ 'Presentation': ['components', 'pages', 'views', 'ui'],
384
+ 'Business Logic': ['services', 'domain', 'usecases'],
385
+ 'Data Access': ['models', 'repositories', 'dal'],
386
+ 'Routing': ['routes', 'controllers', 'handlers'],
387
+ 'Utilities': ['utils', 'helpers', 'lib']
388
+ };
389
+
390
+ for (const [layer, patterns] of Object.entries(layerPatterns)) {
391
+ const matching = directories.filter(d =>
392
+ patterns.some(p => path.basename(d.path).toLowerCase().includes(p))
393
+ );
394
+ if (matching.length > 0) {
395
+ layers.push(`- **${layer}:** ${matching.map(m => path.basename(m.path)).join(', ')}`);
396
+ }
397
+ }
398
+
399
+ return layers.length > 0 ? layers.join('\n') : '- Standard layer structure detected';
400
+ }
401
+
402
+ /**
403
+ * Describe data flow
404
+ * @private
405
+ */
406
+ _describeDataFlow(structure) {
407
+ const modules = structure.modules || [];
408
+
409
+ if (modules.length > 0) {
410
+ const hasServices = modules.some(m => m.name === 'services');
411
+ const hasModels = modules.some(m => m.name === 'models');
412
+ const hasControllers = modules.some(m => m.name === 'controllers');
413
+
414
+ if (hasControllers && hasServices && hasModels) {
415
+ return 'Controllers → Services → Models → Database';
416
+ }
417
+ if (hasServices && hasModels) {
418
+ return 'Components → Services → Models';
419
+ }
420
+ }
421
+
422
+ return 'Standard request-response flow';
423
+ }
424
+
425
+ /**
426
+ * Detect error handling patterns
427
+ * @private
428
+ */
429
+ _detectErrorHandling(structure) {
430
+ const files = structure.files || [];
431
+ const errorFiles = files.filter(f =>
432
+ f.toLowerCase().includes('error') ||
433
+ f.toLowerCase().includes('exception')
434
+ );
435
+
436
+ if (errorFiles.length > 0) {
437
+ return `Dedicated error handling modules found (${errorFiles.length} files)`;
438
+ }
439
+
440
+ return 'Standard try-catch error handling expected';
441
+ }
442
+
443
+ /**
444
+ * Build ASCII directory tree
445
+ * @private
446
+ */
447
+ _buildDirectoryTree(structure) {
448
+ const directories = structure.directories || [];
449
+ const lines = [];
450
+
451
+ const rootName = path.basename(structure.root) || 'project';
452
+ lines.push(rootName + '/');
453
+
454
+ const topDirs = directories.filter(d => d.depth === 1).slice(0, 15);
455
+ for (let i = 0; i < topDirs.length; i++) {
456
+ const dir = topDirs[i];
457
+ const isLast = i === topDirs.length - 1;
458
+ const prefix = isLast ? '└── ' : '├── ';
459
+ const name = path.basename(dir.path);
460
+ lines.push(prefix + name + '/');
461
+ }
462
+
463
+ if (directories.filter(d => d.depth === 1).length > 15) {
464
+ lines.push('└── ...');
465
+ }
466
+
467
+ return lines.join('\n');
468
+ }
469
+
470
+ /**
471
+ * Describe directory purpose
472
+ * @private
473
+ */
474
+ _describeDirectoryPurpose(name) {
475
+ const purposes = {
476
+ src: 'Main source code directory',
477
+ components: 'Reusable UI components',
478
+ pages: 'Page components and routes',
479
+ services: 'Business logic and external API calls',
480
+ models: 'Data models and database schemas',
481
+ controllers: 'Request handlers and route logic',
482
+ routes: 'Route definitions',
483
+ utils: 'Utility functions and helpers',
484
+ helpers: 'Helper functions',
485
+ lib: 'Library code and shared utilities',
486
+ hooks: 'Custom React hooks',
487
+ stores: 'State management stores',
488
+ api: 'API client and endpoints',
489
+ types: 'TypeScript type definitions',
490
+ styles: 'CSS and styling files',
491
+ assets: 'Static assets (images, fonts)',
492
+ tests: 'Test files',
493
+ __tests__: 'Test files',
494
+ config: 'Configuration files',
495
+ docs: 'Documentation'
496
+ };
497
+
498
+ return purposes[name.toLowerCase()] || 'Application code';
499
+ }
500
+ }
501
+
502
+ module.exports = { ProjectReporter };