@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,266 @@
1
+ /**
2
+ * EDGE-06: Team Overhead Guard
3
+ *
4
+ * Detects organizational change suggestions.
5
+ * Prevents suggesting team restructuring without explicit need.
6
+ */
7
+
8
+ // Organizational change keywords
9
+ const ORG_CHANGE_KEYWORDS = [
10
+ // Team structure
11
+ 'team structure', 'reorganize team', 'restructure team', 'new team',
12
+ 'scrum team', 'squad', 'tribe', 'chapter', 'guild',
13
+
14
+ // Roles and positions
15
+ 'new role', 'create role', 'hire', 'recruiting', 'job description',
16
+ 'team lead', 'tech lead', 'engineering manager', 'product owner',
17
+ 'scrum master', 'architect role', 'dedicated person',
18
+
19
+ // Meetings and ceremonies
20
+ 'daily standup', 'sprint planning', 'retrospective', 'sprint review',
21
+ 'new meeting', 'weekly sync', 'bi-weekly', 'ceremony',
22
+
23
+ // Process changes
24
+ 'change process', 'new workflow', 'approval process', 'sign-off',
25
+ 'gate keeping', 'code review process', 'pr review requirement',
26
+
27
+ // Communication
28
+ 'communication channel', 'slack channel', 'teams channel',
29
+ 'reporting structure', 'escalation path', 'chain of command',
30
+
31
+ // Documentation overhead
32
+ 'documentation requirement', 'design doc', 'rfc process',
33
+ 'architecture review board', 'change advisory board'
34
+ ];
35
+
36
+ // Legitimate technical suggestions (not org changes)
37
+ const TECHNICAL_SUGGESTIONS = [
38
+ 'add test', 'write test', 'create component', 'implement feature',
39
+ 'refactor', 'optimize', 'fix bug', 'update dependency',
40
+ 'add logging', 'add monitoring', 'improve performance'
41
+ ];
42
+
43
+ /**
44
+ * Detect organizational changes in text
45
+ * @param {string} output - AI generated text
46
+ * @returns {object} { hasOrgChanges: boolean, suggestions: array, overhead: string }
47
+ */
48
+ function detectOrgChanges(output) {
49
+ const lowerOutput = output.toLowerCase();
50
+ const foundKeywords = [];
51
+ const suggestions = [];
52
+
53
+ // Check for org change keywords
54
+ for (const keyword of ORG_CHANGE_KEYWORDS) {
55
+ if (lowerOutput.includes(keyword)) {
56
+ foundKeywords.push(keyword);
57
+
58
+ // Extract the surrounding suggestion
59
+ const context = extractContext(output, keyword);
60
+ suggestions.push({
61
+ keyword,
62
+ context: context.trim()
63
+ });
64
+ }
65
+ }
66
+
67
+ // Check if these are actually org changes vs technical suggestions
68
+ const isTechnicalOnly = TECHNICAL_SUGGESTIONS.some(tech =>
69
+ lowerOutput.includes(tech) && foundKeywords.length === 0
70
+ );
71
+
72
+ return {
73
+ hasOrgChanges: foundKeywords.length > 0 && !isTechnicalOnly,
74
+ suggestions,
75
+ keywordCount: foundKeywords.length,
76
+ overhead: estimateOverhead(suggestions),
77
+ recommendation: foundKeywords.length > 0
78
+ ? 'Consider if organizational changes are necessary for this task'
79
+ : 'No organizational changes detected'
80
+ };
81
+ }
82
+
83
+ /**
84
+ * Flag team restructuring suggestions
85
+ * @param {string} suggestion - The suggestion text
86
+ * @returns {object} Flagged suggestion details
87
+ */
88
+ function flagTeamRestructure(suggestion) {
89
+ const result = detectOrgChanges(suggestion);
90
+
91
+ return {
92
+ flagged: result.hasOrgChanges,
93
+ ...result,
94
+ severity: result.keywordCount > 3
95
+ ? 'high'
96
+ : result.keywordCount > 1
97
+ ? 'medium'
98
+ : 'low',
99
+ action: result.hasOrgChanges
100
+ ? 'Requires explicit justification and user approval'
101
+ : 'No action needed'
102
+ };
103
+ }
104
+
105
+ /**
106
+ * Check overhead of organizational changes
107
+ * @param {array} suggestions - Array of organizational suggestions
108
+ * @returns {string} Estimated overhead description
109
+ */
110
+ function estimateOverhead(suggestions) {
111
+ if (suggestions.length === 0) {
112
+ return 'No organizational overhead';
113
+ }
114
+
115
+ const categories = new Set();
116
+
117
+ for (const suggestion of suggestions) {
118
+ if (['team structure', 'reorganize', 'restructure', 'squad', 'tribe'].some(k => suggestion.keyword.includes(k))) {
119
+ categories.add('team-restructure');
120
+ }
121
+ if (['role', 'hire', 'recruit', 'lead', 'manager'].some(k => suggestion.keyword.includes(k))) {
122
+ categories.add('hiring-roles');
123
+ }
124
+ if (['meeting', 'standup', 'ceremony', 'sync'].some(k => suggestion.keyword.includes(k))) {
125
+ categories.add('meeting-overhead');
126
+ }
127
+ if (['process', 'workflow', 'approval', 'sign-off'].some(k => suggestion.keyword.includes(k))) {
128
+ categories.add('process-overhead');
129
+ }
130
+ }
131
+
132
+ const overheadEstimates = {
133
+ 'team-restructure': 'High: Team restructuring has long-term impact',
134
+ 'hiring-roles': 'High: New roles require budget and time',
135
+ 'meeting-overhead': 'Medium: Recurring time commitment',
136
+ 'process-overhead': 'Medium: Ongoing process overhead'
137
+ };
138
+
139
+ const estimates = Array.from(categories).map(c => overheadEstimates[c]);
140
+
141
+ if (estimates.length === 0) {
142
+ return 'Low: Minor organizational impact';
143
+ }
144
+
145
+ return estimates.join('; ');
146
+ }
147
+
148
+ /**
149
+ * Check for team overhead in task context
150
+ * @param {string} taskContext - Task description
151
+ * @returns {object} Team overhead analysis
152
+ */
153
+ function checkOverhead(taskContext) {
154
+ const orgChanges = detectOrgChanges(taskContext);
155
+ const flagged = flagTeamRestructure(taskContext);
156
+
157
+ return {
158
+ hasOrgChanges: orgChanges.hasOrgChanges,
159
+ suggestions: orgChanges.suggestions,
160
+ overhead: orgChanges.overhead,
161
+ severity: flagged.severity,
162
+ actionable: flagged.flagged,
163
+ recommendation: flagged.flagged
164
+ ? 'Remove organizational suggestions or explicitly justify them'
165
+ : 'Task context is appropriate'
166
+ };
167
+ }
168
+
169
+ /**
170
+ * Extract context around a keyword
171
+ * @param {string} text - Full text
172
+ * @param {string} keyword - Keyword to find context for
173
+ * @returns {string} Context around keyword
174
+ */
175
+ function extractContext(text, keyword) {
176
+ const index = text.toLowerCase().indexOf(keyword);
177
+ if (index === -1) return '';
178
+
179
+ const start = Math.max(0, index - 50);
180
+ const end = Math.min(text.length, index + keyword.length + 100);
181
+
182
+ return text.substring(start, end)
183
+ .replace(/\s+/g, ' ')
184
+ .trim();
185
+ }
186
+
187
+ /**
188
+ * Full team overhead check
189
+ * @param {string} output - AI generated output
190
+ * @returns {object} Complete team overhead analysis
191
+ */
192
+ function checkTeamOverhead(output) {
193
+ const orgChanges = detectOrgChanges(output);
194
+
195
+ return {
196
+ ...orgChanges,
197
+ summary: orgChanges.hasOrgChanges
198
+ ? `⚠️ Found ${orgChanges.keywordCount} organizational change suggestion(s)`
199
+ : '✅ No organizational changes detected',
200
+ actionable: orgChanges.hasOrgChanges
201
+ };
202
+ }
203
+
204
+ /**
205
+ * CLI entry point
206
+ */
207
+ if (require.main === module) {
208
+ const args = process.argv.slice(2);
209
+ const command = args[0];
210
+
211
+ if (command === 'check') {
212
+ const text = args.slice(1).join(' ') || process.stdin.read();
213
+
214
+ if (!text.trim()) {
215
+ console.log('Usage: node team-overhead-guard.cjs check <text>');
216
+ console.log(' or: echo "text" | node team-overhead-guard.cjs check');
217
+ process.exit(1);
218
+ }
219
+
220
+ const result = checkTeamOverhead(text);
221
+
222
+ console.log('Team Overhead Analysis');
223
+ console.log('======================');
224
+ console.log(result.summary);
225
+
226
+ if (result.suggestions.length > 0) {
227
+ console.log('');
228
+ console.log('Organizational suggestions found:');
229
+ result.suggestions.forEach((s, i) => {
230
+ console.log(` ${i + 1}. "${s.context}"`);
231
+ console.log(` Keyword: ${s.keyword}`);
232
+ });
233
+
234
+ console.log('');
235
+ console.log(`Estimated overhead: ${result.overhead}`);
236
+ console.log('');
237
+ console.log('Recommendation:');
238
+ console.log(` ${result.recommendation}`);
239
+ }
240
+
241
+ process.exit(result.hasOrgChanges ? 1 : 0);
242
+
243
+ } else if (command === 'keywords') {
244
+ console.log('Organizational change keywords:');
245
+ ORG_CHANGE_KEYWORDS.forEach(k => console.log(` - ${k}`));
246
+ process.exit(0);
247
+
248
+ } else {
249
+ console.log('Usage: node team-overhead-guard.cjs <command> [args]');
250
+ console.log('Commands:');
251
+ console.log(' check [text] - Analyze for organizational changes');
252
+ console.log(' keywords - List organizational change keywords');
253
+ process.exit(1);
254
+ }
255
+ }
256
+
257
+ module.exports = {
258
+ detectOrgChanges,
259
+ flagTeamRestructure,
260
+ estimateOverhead,
261
+ checkOverhead,
262
+ checkTeamOverhead,
263
+ extractContext,
264
+ ORG_CHANGE_KEYWORDS,
265
+ TECHNICAL_SUGGESTIONS
266
+ };
@@ -0,0 +1,271 @@
1
+ /**
2
+ * EDGE-05: Tool Sprawl Guard
3
+ *
4
+ * Enforces 3-7 skills/tools per task limit.
5
+ * Prevents cognitive overload and maintains focus.
6
+ */
7
+
8
+ // Recommended skill/tool categories
9
+ const SKILL_CATEGORIES = {
10
+ core: ['runtime', 'framework', 'language'],
11
+ testing: ['test-runner', 'assertion', 'mocking', 'coverage'],
12
+ database: ['orm', 'query-builder', 'migration', 'driver'],
13
+ ui: ['component-library', 'styling', 'state-management', 'routing'],
14
+ devops: ['bundler', 'linter', 'formatter', 'ci-cd']
15
+ };
16
+
17
+ /**
18
+ * Get active tools/skills from task context
19
+ * @param {string} taskContext - Task description or context
20
+ * @returns {string[]} Array of active tools/skills
21
+ */
22
+ function getActiveTools(taskContext) {
23
+ const toolPatterns = [
24
+ /(?:using|with|via|through|use|via)\s+(?:the\s+)?(['"]?)([^'"\s,]+)\1(?:\s+(?:library|tool|package|framework|skill))?/gi,
25
+ /(?:tool|library|package|framework|skill)[:\s]+(['"]?)([^'"\s,]+)\1/gi,
26
+ /@([a-z0-9_-]+\/[a-z0-9_-]+)/gi, // npm scoped packages
27
+ /(?:npm|yarn|pnpm)\s+(?:install|add)\s+([^&|;\n]+)/gi
28
+ ];
29
+
30
+ const tools = new Set();
31
+
32
+ for (const pattern of toolPatterns) {
33
+ let match;
34
+ while ((match = pattern.exec(taskContext)) !== null) {
35
+ // Extract the tool name (group 2 for most patterns, group 1 for scoped)
36
+ const toolName = match[2] || match[1];
37
+ if (toolName) {
38
+ tools.add(toolName.toLowerCase().replace(/['"]/g, ''));
39
+ }
40
+ }
41
+ }
42
+
43
+ return Array.from(tools);
44
+ }
45
+
46
+ /**
47
+ * Check tool count against limits
48
+ * @param {string[]} activeTools - Array of active tools/skills
49
+ * @returns {object} { count: number, withinLimit: boolean, exceeded: number }
50
+ */
51
+ function checkToolCount(activeTools) {
52
+ const count = activeTools.length;
53
+ const minRecommended = 3;
54
+ const maxRecommended = 7;
55
+
56
+ let withinLimit = true;
57
+ let exceeded = 0;
58
+
59
+ if (count > maxRecommended) {
60
+ withinLimit = false;
61
+ exceeded = count - maxRecommended;
62
+ }
63
+
64
+ return {
65
+ count,
66
+ withinLimit,
67
+ exceeded,
68
+ minRecommended,
69
+ maxRecommended,
70
+ status: count < minRecommended
71
+ ? 'below-recommended'
72
+ : count > maxRecommended
73
+ ? 'exceeded'
74
+ : 'optimal'
75
+ };
76
+ }
77
+
78
+ /**
79
+ * Enforce skill limit on a task
80
+ * @param {string} taskContext - Task description
81
+ * @returns {object} Enforcement result with recommendations
82
+ */
83
+ function enforceSkillLimit(taskContext) {
84
+ const activeTools = getActiveTools(taskContext);
85
+ const toolCheck = checkToolCount(activeTools);
86
+
87
+ if (toolCheck.withinLimit) {
88
+ return {
89
+ enforced: true,
90
+ tools: activeTools,
91
+ ...toolCheck,
92
+ recommendation: 'Tool count is within recommended limits'
93
+ };
94
+ }
95
+
96
+ // Categorize tools
97
+ const categorized = categorizeTools(activeTools);
98
+
99
+ // Recommend which tools to keep
100
+ const recommended = recommendTools(categorized, taskContext);
101
+
102
+ return {
103
+ enforced: false,
104
+ tools: activeTools,
105
+ ...toolCheck,
106
+ categorized,
107
+ recommended,
108
+ recommendation: `Reduce from ${toolCheck.count} to ${toolCheck.maxRecommended} tools. Consider removing: ${activeTools.filter(t => !recommended.includes(t)).join(', ')}`
109
+ };
110
+ }
111
+
112
+ /**
113
+ * Categorize tools by function
114
+ * @param {string[]} tools - Array of tools
115
+ * @returns {object} Categorized tools
116
+ */
117
+ function categorizeTools(tools) {
118
+ const categories = {
119
+ core: [],
120
+ testing: [],
121
+ database: [],
122
+ ui: [],
123
+ devops: [],
124
+ other: []
125
+ };
126
+
127
+ // Simple categorization based on tool name patterns
128
+ const categoryPatterns = {
129
+ testing: ['jest', 'vitest', 'mocha', 'chai', 'sinon', 'playwright', 'cypress', 'test'],
130
+ database: ['prisma', 'mongoose', 'sequelize', 'typeorm', 'knex', 'mongo', 'postgres', 'mysql'],
131
+ ui: ['react', 'vue', 'angular', 'svelte', 'tailwind', 'bootstrap', 'material', 'chakra'],
132
+ devops: ['webpack', 'vite', 'rollup', 'eslint', 'prettier', 'husky', 'lint']
133
+ };
134
+
135
+ for (const tool of tools) {
136
+ let categorized = false;
137
+
138
+ for (const [category, patterns] of Object.entries(categoryPatterns)) {
139
+ if (patterns.some(p => tool.toLowerCase().includes(p))) {
140
+ categories[category].push(tool);
141
+ categorized = true;
142
+ break;
143
+ }
144
+ }
145
+
146
+ if (!categorized) {
147
+ categories.other.push(tool);
148
+ }
149
+ }
150
+
151
+ return categories;
152
+ }
153
+
154
+ /**
155
+ * Recommend which tools to keep based on task context
156
+ * @param {object} categorized - Categorized tools
157
+ * @param {string} taskContext - Task description
158
+ * @returns {string[]} Recommended tools to keep
159
+ */
160
+ function recommendTools(categorized, taskContext) {
161
+ const recommended = [];
162
+ const lowerContext = taskContext.toLowerCase();
163
+
164
+ // Always keep core tools
165
+ recommended.push(...categorized.core);
166
+
167
+ // Add category based on task context
168
+ if (lowerContext.includes('test') || lowerContext.includes('spec')) {
169
+ recommended.push(...categorized.testing.slice(0, 2));
170
+ }
171
+ if (lowerContext.includes('database') || lowerContext.includes('model') || lowerContext.includes('schema')) {
172
+ recommended.push(...categorized.database.slice(0, 2));
173
+ }
174
+ if (lowerContext.includes('ui') || lowerContext.includes('component') || lowerContext.includes('render')) {
175
+ recommended.push(...categorized.ui.slice(0, 2));
176
+ }
177
+ if (lowerContext.includes('build') || lowerContext.includes('bundle') || lowerContext.includes('deploy')) {
178
+ recommended.push(...categorized.devops.slice(0, 2));
179
+ }
180
+
181
+ // Add some other tools if space allows
182
+ const remaining = 7 - recommended.length;
183
+ if (remaining > 0) {
184
+ recommended.push(...categorized.other.slice(0, remaining));
185
+ }
186
+
187
+ // Deduplicate
188
+ return [...new Set(recommended)];
189
+ }
190
+
191
+ /**
192
+ * Full tool sprawl check
193
+ * @param {string} taskContext - Task description
194
+ * @returns {object} Complete tool sprawl analysis
195
+ */
196
+ function checkToolSprawl(taskContext) {
197
+ const activeTools = getActiveTools(taskContext);
198
+ const toolCheck = checkToolCount(activeTools);
199
+ const enforcement = enforceSkillLimit(taskContext);
200
+
201
+ return {
202
+ ...toolCheck,
203
+ tools: activeTools,
204
+ enforcement,
205
+ actionable: !toolCheck.withinLimit,
206
+ summary: toolCheck.withinLimit
207
+ ? `✅ Using ${toolCheck.count} tools (optimal: 3-7)`
208
+ : `⚠️ Using ${toolCheck.count} tools (${toolCheck.exceeded} over limit)`
209
+ };
210
+ }
211
+
212
+ /**
213
+ * CLI entry point
214
+ */
215
+ if (require.main === module) {
216
+ const args = process.argv.slice(2);
217
+ const command = args[0];
218
+
219
+ if (command === 'check') {
220
+ const context = args.slice(1).join(' ') || process.stdin.read();
221
+
222
+ if (!context.trim()) {
223
+ console.log('Usage: node tool-sprawl-guard.cjs check <task context>');
224
+ console.log(' or: echo "task context" | node tool-sprawl-guard.cjs check');
225
+ process.exit(1);
226
+ }
227
+
228
+ const result = checkToolSprawl(context);
229
+
230
+ console.log('Tool Sprawl Analysis');
231
+ console.log('====================');
232
+ console.log(`Tools found: ${result.count}`);
233
+ console.log(`Status: ${result.status}`);
234
+ console.log('');
235
+
236
+ if (result.tools.length > 0) {
237
+ console.log('Active tools:');
238
+ result.tools.forEach(t => console.log(` - ${t}`));
239
+ }
240
+
241
+ console.log('');
242
+ console.log(result.summary);
243
+
244
+ if (!result.withinLimit) {
245
+ console.log('');
246
+ console.log('Recommendation:');
247
+ console.log(` ${result.enforcement.recommendation}`);
248
+ console.log('');
249
+ console.log('Recommended tools to keep:');
250
+ result.enforcement.recommended.forEach(t => console.log(` - ${t}`));
251
+ }
252
+
253
+ process.exit(result.withinLimit ? 0 : 1);
254
+
255
+ } else {
256
+ console.log('Usage: node tool-sprawl-guard.cjs <command> [args]');
257
+ console.log('Commands:');
258
+ console.log(' check [context] - Analyze tool usage (reads from stdin if no args)');
259
+ process.exit(1);
260
+ }
261
+ }
262
+
263
+ module.exports = {
264
+ getActiveTools,
265
+ checkToolCount,
266
+ enforceSkillLimit,
267
+ categorizeTools,
268
+ recommendTools,
269
+ checkToolSprawl,
270
+ SKILL_CATEGORIES
271
+ };
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Analytics Collector — Feature usage event collection and local storage
3
+ * Stores events in .planning/analytics/events.json
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+
9
+ class AnalyticsCollector {
10
+ constructor(cwd) {
11
+ this.cwd = cwd || process.cwd();
12
+ this.eventsPath = path.join(this.cwd, '.planning', 'analytics', 'events.json');
13
+ this.ensureDir();
14
+ }
15
+
16
+ /**
17
+ * Track an analytics event
18
+ * @param {Object} event - Event data { type, userId, properties }
19
+ */
20
+ async trackEvent(event) {
21
+ const data = {
22
+ timestamp: new Date().toISOString(),
23
+ eventType: event.type,
24
+ userId: event.userId || 'anonymous',
25
+ properties: event.properties || {}
26
+ };
27
+
28
+ await this.appendToJsonFile(data);
29
+ }
30
+
31
+ /**
32
+ * Get events by type
33
+ * @param {string} type - Event type to filter
34
+ * @returns {Array} Filtered events
35
+ */
36
+ getEventsByType(type) {
37
+ if (!fs.existsSync(this.eventsPath)) return [];
38
+
39
+ const events = JSON.parse(fs.readFileSync(this.eventsPath, 'utf8'));
40
+ return events.filter(e => e.eventType === type);
41
+ }
42
+
43
+ /**
44
+ * Get all events
45
+ * @returns {Array} All events
46
+ */
47
+ getAllEvents() {
48
+ if (!fs.existsSync(this.eventsPath)) return [];
49
+ return JSON.parse(fs.readFileSync(this.eventsPath, 'utf8'));
50
+ }
51
+
52
+ /**
53
+ * Ensure analytics directory exists
54
+ */
55
+ ensureDir() {
56
+ const dir = path.dirname(this.eventsPath);
57
+ if (!fs.existsSync(dir)) {
58
+ fs.mkdirSync(dir, { recursive: true });
59
+ }
60
+ if (!fs.existsSync(this.eventsPath)) {
61
+ fs.writeFileSync(this.eventsPath, '[]', 'utf8');
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Append data to JSON file
67
+ * @param {Object} data - Data to append
68
+ */
69
+ async appendToJsonFile(data) {
70
+ const events = this.getAllEvents();
71
+ events.push(data);
72
+ fs.writeFileSync(this.eventsPath, JSON.stringify(events, null, 2), 'utf8');
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Track an analytics event
78
+ * @param {Object} event - Event data
79
+ * @param {string} cwd - Working directory
80
+ */
81
+ async function trackEvent(event, cwd) {
82
+ const collector = new AnalyticsCollector(cwd);
83
+ return collector.trackEvent(event);
84
+ }
85
+
86
+ module.exports = { AnalyticsCollector, trackEvent };