@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
@@ -1,115 +1,115 @@
1
- #!/usr/bin/env node
2
- // Claude Code Statusline - EZ Agents Edition
3
- // Shows: model | current task | directory | context usage
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const os = require('os');
8
-
9
- // Read JSON from stdin
10
- let input = '';
11
- // Timeout guard: if stdin doesn't close within 3s (e.g. pipe issues on
12
- // Windows/Git Bash), exit silently instead of hanging. See #775.
13
- const stdinTimeout = setTimeout(() => process.exit(0), 3000);
14
- process.stdin.setEncoding('utf8');
15
- process.stdin.on('data', chunk => input += chunk);
16
- process.stdin.on('end', () => {
17
- clearTimeout(stdinTimeout);
18
- try {
19
- const data = JSON.parse(input);
20
- const model = data.model?.display_name || 'Claude';
21
- const dir = data.workspace?.current_dir || process.cwd();
22
- const session = data.session_id || '';
23
- const remaining = data.context_window?.remaining_percentage;
24
-
25
- // Context window display (shows USED percentage scaled to usable context)
26
- // Claude Code reserves ~16.5% for autocompact buffer, so usable context
27
- // is 83.5% of the total window. We normalize to show 100% at that point.
28
- const AUTO_COMPACT_BUFFER_PCT = 16.5;
29
- let ctx = '';
30
- if (remaining != null) {
31
- // Normalize: subtract buffer from remaining, scale to usable range
32
- const usableRemaining = Math.max(0, ((remaining - AUTO_COMPACT_BUFFER_PCT) / (100 - AUTO_COMPACT_BUFFER_PCT)) * 100);
33
- const used = Math.max(0, Math.min(100, Math.round(100 - usableRemaining)));
34
-
35
- // Write context metrics to bridge file for the context-monitor PostToolUse hook.
36
- // The monitor reads this file to inject agent-facing warnings when context is low.
37
- if (session) {
38
- try {
39
- const bridgePath = path.join(os.tmpdir(), `claude-ctx-${session}.json`);
40
- const bridgeData = JSON.stringify({
41
- session_id: session,
42
- remaining_percentage: remaining,
43
- used_pct: used,
44
- timestamp: Math.floor(Date.now() / 1000)
45
- });
46
- fs.writeFileSync(bridgePath, bridgeData);
47
- } catch (e) {
48
- // Silent fail -- bridge is best-effort, don't break statusline
49
- }
50
- }
51
-
52
- // Build progress bar (10 segments)
53
- const filled = Math.floor(used / 10);
54
- const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
55
-
56
- // Color based on usable context thresholds
57
- if (used < 50) {
58
- ctx = ` \x1b[32m${bar} ${used}%\x1b[0m`;
59
- } else if (used < 65) {
60
- ctx = ` \x1b[33m${bar} ${used}%\x1b[0m`;
61
- } else if (used < 80) {
62
- ctx = ` \x1b[38;5;208m${bar} ${used}%\x1b[0m`;
63
- } else {
64
- ctx = ` \x1b[5;31m💀 ${bar} ${used}%\x1b[0m`;
65
- }
66
- }
67
-
68
- // Current task from todos
69
- let task = '';
70
- const homeDir = os.homedir();
71
- // Respect CLAUDE_CONFIG_DIR for custom config directory setups (#870)
72
- const claudeDir = process.env.CLAUDE_CONFIG_DIR || path.join(homeDir, '.claude');
73
- const todosDir = path.join(claudeDir, 'todos');
74
- if (session && fs.existsSync(todosDir)) {
75
- try {
76
- const files = fs.readdirSync(todosDir)
77
- .filter(f => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))
78
- .map(f => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))
79
- .sort((a, b) => b.mtime - a.mtime);
80
-
81
- if (files.length > 0) {
82
- try {
83
- const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));
84
- const inProgress = todos.find(t => t.status === 'in_progress');
85
- if (inProgress) task = inProgress.activeForm || '';
86
- } catch (e) {}
87
- }
88
- } catch (e) {
89
- // Silently fail on file system errors - don't break statusline
90
- }
91
- }
92
-
93
- // EZ Agents update available?
94
- let ezUpdate = '';
95
- const cacheFile = path.join(claudeDir, 'cache', 'ez-update-check.json');
96
- if (fs.existsSync(cacheFile)) {
97
- try {
98
- const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
99
- if (cache.update_available) {
100
- ezUpdate = '\x1b[33m⬆ /ez:update\x1b[0m │ ';
101
- }
102
- } catch (e) {}
103
- }
104
-
105
- // Output
106
- const dirname = path.basename(dir);
107
- if (task) {
108
- process.stdout.write(`${ezUpdate}\x1b[2m${model}\x1b[0m │ \x1b[1m${task}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
109
- } else {
110
- process.stdout.write(`${ezUpdate}\x1b[2m${model}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
111
- }
112
- } catch (e) {
113
- // Silent fail - don't break statusline on parse errors
114
- }
115
- });
1
+ #!/usr/bin/env node
2
+ // Claude Code Statusline - EZ Agents Edition
3
+ // Shows: model | current task | directory | context usage
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const os = require('os');
8
+
9
+ // Read JSON from stdin
10
+ let input = '';
11
+ // Timeout guard: if stdin doesn't close within 3s (e.g. pipe issues on
12
+ // Windows/Git Bash), exit silently instead of hanging. See #775.
13
+ const stdinTimeout = setTimeout(() => process.exit(0), 3000);
14
+ process.stdin.setEncoding('utf8');
15
+ process.stdin.on('data', chunk => input += chunk);
16
+ process.stdin.on('end', () => {
17
+ clearTimeout(stdinTimeout);
18
+ try {
19
+ const data = JSON.parse(input);
20
+ const model = data.model?.display_name || 'Claude';
21
+ const dir = data.workspace?.current_dir || process.cwd();
22
+ const session = data.session_id || '';
23
+ const remaining = data.context_window?.remaining_percentage;
24
+
25
+ // Context window display (shows USED percentage scaled to usable context)
26
+ // Claude Code reserves ~16.5% for autocompact buffer, so usable context
27
+ // is 83.5% of the total window. We normalize to show 100% at that point.
28
+ const AUTO_COMPACT_BUFFER_PCT = 16.5;
29
+ let ctx = '';
30
+ if (remaining != null) {
31
+ // Normalize: subtract buffer from remaining, scale to usable range
32
+ const usableRemaining = Math.max(0, ((remaining - AUTO_COMPACT_BUFFER_PCT) / (100 - AUTO_COMPACT_BUFFER_PCT)) * 100);
33
+ const used = Math.max(0, Math.min(100, Math.round(100 - usableRemaining)));
34
+
35
+ // Write context metrics to bridge file for the context-monitor PostToolUse hook.
36
+ // The monitor reads this file to inject agent-facing warnings when context is low.
37
+ if (session) {
38
+ try {
39
+ const bridgePath = path.join(os.tmpdir(), `claude-ctx-${session}.json`);
40
+ const bridgeData = JSON.stringify({
41
+ session_id: session,
42
+ remaining_percentage: remaining,
43
+ used_pct: used,
44
+ timestamp: Math.floor(Date.now() / 1000)
45
+ });
46
+ fs.writeFileSync(bridgePath, bridgeData);
47
+ } catch (e) {
48
+ // Silent fail -- bridge is best-effort, don't break statusline
49
+ }
50
+ }
51
+
52
+ // Build progress bar (10 segments)
53
+ const filled = Math.floor(used / 10);
54
+ const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
55
+
56
+ // Color based on usable context thresholds
57
+ if (used < 50) {
58
+ ctx = ` \x1b[32m${bar} ${used}%\x1b[0m`;
59
+ } else if (used < 65) {
60
+ ctx = ` \x1b[33m${bar} ${used}%\x1b[0m`;
61
+ } else if (used < 80) {
62
+ ctx = ` \x1b[38;5;208m${bar} ${used}%\x1b[0m`;
63
+ } else {
64
+ ctx = ` \x1b[5;31m💀 ${bar} ${used}%\x1b[0m`;
65
+ }
66
+ }
67
+
68
+ // Current task from todos
69
+ let task = '';
70
+ const homeDir = os.homedir();
71
+ // Respect CLAUDE_CONFIG_DIR for custom config directory setups (#870)
72
+ const claudeDir = process.env.CLAUDE_CONFIG_DIR || path.join(homeDir, '.claude');
73
+ const todosDir = path.join(claudeDir, 'todos');
74
+ if (session && fs.existsSync(todosDir)) {
75
+ try {
76
+ const files = fs.readdirSync(todosDir)
77
+ .filter(f => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))
78
+ .map(f => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))
79
+ .sort((a, b) => b.mtime - a.mtime);
80
+
81
+ if (files.length > 0) {
82
+ try {
83
+ const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));
84
+ const inProgress = todos.find(t => t.status === 'in_progress');
85
+ if (inProgress) task = inProgress.activeForm || '';
86
+ } catch (e) {}
87
+ }
88
+ } catch (e) {
89
+ // Silently fail on file system errors - don't break statusline
90
+ }
91
+ }
92
+
93
+ // EZ Agents update available?
94
+ let ezUpdate = '';
95
+ const cacheFile = path.join(claudeDir, 'cache', 'ez-update-check.json');
96
+ if (fs.existsSync(cacheFile)) {
97
+ try {
98
+ const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
99
+ if (cache.update_available) {
100
+ ezUpdate = '\x1b[33m⬆ /ez:update\x1b[0m │ ';
101
+ }
102
+ } catch (e) {}
103
+ }
104
+
105
+ // Output
106
+ const dirname = path.basename(dir);
107
+ if (task) {
108
+ process.stdout.write(`${ezUpdate}\x1b[2m${model}\x1b[0m │ \x1b[1m${task}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
109
+ } else {
110
+ process.stdout.write(`${ezUpdate}\x1b[2m${model}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
111
+ }
112
+ } catch (e) {
113
+ // Silent fail - don't break statusline on parse errors
114
+ }
115
+ });
package/package.json CHANGED
@@ -1,64 +1,78 @@
1
- {
2
- "name": "@howlil/ez-agents",
3
- "version": "3.4.2",
4
- "description": "EZ Agents — Meta-prompting with multi-model support (Qwen, Kimi, OpenAI)",
5
- "bin": {
6
- "ez-agents": "bin/install.js"
7
- },
8
- "files": [
9
- "bin",
10
- "commands",
11
- "ez-agents",
12
- "agents",
13
- "hooks/dist",
14
- "scripts"
15
- ],
16
- "keywords": [
17
- "claude",
18
- "claude-code",
19
- "ai",
20
- "meta-prompting",
21
- "context-engineering",
22
- "spec-driven-development",
23
- "gemini",
24
- "gemini-cli",
25
- "codex",
26
- "codex-cli",
27
- "ez-agents",
28
- "agent-orchestration"
29
- ],
30
- "author": "TÂCHES",
31
- "license": "MIT",
32
- "repository": {
33
- "type": "git",
34
- "url": "git+https://github.com/howlil/ez-agents.git"
35
- },
36
- "homepage": "https://github.com/howlil/ez-agents",
37
- "bugs": {
38
- "url": "https://github.com/howlil/ez-agents/issues"
39
- },
40
- "engines": {
41
- "node": ">=16.7.0"
42
- },
43
- "devDependencies": {
44
- "c8": "^11.0.0",
45
- "esbuild": "^0.24.2",
46
- "husky": "^9.1.7",
47
- "lint-staged": "^15.5.2",
48
- "proper-lockfile": "^4.1.2"
49
- },
50
- "scripts": {
51
- "build:hooks": "node scripts/build-hooks.js",
52
- "prepublishOnly": "npm run build:hooks",
53
- "test": "node scripts/run-tests.cjs",
54
- "test:coverage": "c8 --check-coverage --lines 70 --reporter text --include 'ez-agents/bin/lib/*.cjs' --exclude 'tests/**' --all node scripts/run-tests.cjs"
55
- },
56
- "lint-staged": {
57
- "*.cjs": [
58
- "node --test"
59
- ],
60
- "*.md": [
61
- "node scripts/run-tests.cjs"
62
- ]
63
- }
64
- }
1
+ {
2
+ "name": "@howlil/ez-agents",
3
+ "version": "4.0.0",
4
+ "description": "EZ Agents — Meta-prompting with multi-model support (Qwen, Kimi, OpenAI)",
5
+ "bin": {
6
+ "ez-agents": "bin/install.js"
7
+ },
8
+ "files": [
9
+ "bin",
10
+ "commands",
11
+ "ez-agents",
12
+ "agents",
13
+ "hooks/dist",
14
+ "scripts"
15
+ ],
16
+ "keywords": [
17
+ "claude",
18
+ "claude-code",
19
+ "ai",
20
+ "meta-prompting",
21
+ "context-engineering",
22
+ "spec-driven-development",
23
+ "gemini",
24
+ "gemini-cli",
25
+ "codex",
26
+ "codex-cli",
27
+ "ez-agents",
28
+ "agent-orchestration"
29
+ ],
30
+ "author": "TÂCHES",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/howlil/ez-agents.git"
35
+ },
36
+ "homepage": "https://github.com/howlil/ez-agents",
37
+ "bugs": {
38
+ "url": "https://github.com/howlil/ez-agents/issues"
39
+ },
40
+ "engines": {
41
+ "node": ">=16.7.0"
42
+ },
43
+ "devDependencies": {
44
+ "c8": "^11.0.0",
45
+ "eslint": "^8.57.0",
46
+ "husky": "^9.1.7",
47
+ "js-yaml": "^4.1.1",
48
+ "jsdoc": "^4.0.2",
49
+ "k6": "^0.0.0",
50
+ "lint-staged": "^15.5.2",
51
+ "markdownlint": "^0.40.0",
52
+ "vitest": "^4.1.0"
53
+ },
54
+ "scripts": {
55
+ "lint": "eslint . --ext .cjs,.js --max-warnings=0",
56
+ "lint:fix": "eslint . --ext .cjs,.js --fix",
57
+ "build:hooks": "node scripts/build-hooks.js",
58
+ "prepublishOnly": "npm run build:hooks",
59
+ "test": "node scripts/run-tests.cjs",
60
+ "test:coverage": "c8 --check-coverage --lines 70 --reporter text --include 'ez-agents/bin/lib/*.cjs' --exclude 'tests/**' --all node scripts/run-tests.cjs",
61
+ "test:a11y": "node tests/accessibility/run-a11y-tests.cjs",
62
+ "test:load": "k6 run tests/perf/load-test.js",
63
+ "security:scan": "npm audit --audit-level=moderate",
64
+ "docs:generate": "jsdoc -c jsdoc.json -r bin/ ez-agents/bin/lib/",
65
+ "prepare": "husky"
66
+ },
67
+ "lint-staged": {
68
+ "*.cjs": [
69
+ "node --test"
70
+ ],
71
+ "*.md": [
72
+ "node scripts/run-tests.cjs"
73
+ ]
74
+ },
75
+ "dependencies": {
76
+ "micromatch": "^4.0.5"
77
+ }
78
+ }
@@ -1,144 +1,144 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Fix Qwen Code Installation
5
- *
6
- * This script fixes the Qwen Code installation by copying ez-agents commands
7
- * to the correct ~/.qwen/commands/ez/ directory instead of ~/.qwen/skills/
8
- *
9
- * Usage: node fix-qwen-installation.js
10
- */
11
-
12
- const fs = require('fs');
13
- const path = require('path');
14
- const os = require('os');
15
-
16
- const cyan = '\x1b[36m';
17
- const green = '\x1b[32m';
18
- const yellow = '\x1b[33m';
19
- const red = '\x1b[31m';
20
- const reset = '\x1b[0m';
21
-
22
- console.log(`${cyan}Fixing Qwen Code Installation${reset}\n`);
23
-
24
- // Get Qwen config directory
25
- const qwenDir = process.env.QWEN_CONFIG_DIR
26
- ? path.resolve(process.env.QWEN_CONFIG_DIR)
27
- : path.join(os.homedir(), '.qwen');
28
-
29
- const skillsDir = path.join(qwenDir, 'skills');
30
- const commandsDir = path.join(qwenDir, 'commands');
31
- const ezCommandsDir = path.join(commandsDir, 'ez');
32
-
33
- // Find ez-agents installation
34
- let ezAgentsDir = null;
35
- const possibleLocations = [
36
- path.join(qwenDir, 'ez-agents'),
37
- path.join(qwenDir, '.ez-agents'),
38
- path.join(os.homedir(), '.ez-agents'),
39
- ];
40
-
41
- for (const loc of possibleLocations) {
42
- if (fs.existsSync(loc)) {
43
- ezAgentsDir = loc;
44
- break;
45
- }
46
- }
47
-
48
- if (!ezAgentsDir) {
49
- console.log(`${yellow}Warning:${reset} ez-agents installation not found in common locations`);
50
- console.log(`Looking for workflows in ${skillsDir}/ez-*/`);
51
-
52
- // Try to find workflows from installed skills
53
- if (!fs.existsSync(skillsDir)) {
54
- console.log(`${red}Error:${reset} Neither ez-agents nor skills directory found`);
55
- console.log(`Please run: ${cyan}ez-agents --qwen --global${reset}`);
56
- process.exit(1);
57
- }
58
- }
59
-
60
- console.log(`Qwen config directory: ${cyan}${qwenDir}${reset}`);
61
- console.log(`Current skills location: ${yellow}${skillsDir}${reset}`);
62
- console.log(`Target commands location: ${green}${ezCommandsDir}${reset}\n`);
63
-
64
- // Create commands/ez directory
65
- console.log(`${cyan}Step 1: Creating commands directory${reset}`);
66
- fs.mkdirSync(ezCommandsDir, { recursive: true });
67
- console.log(`${green}✓${reset} Created ${ezCommandsDir}\n`);
68
-
69
- // Copy workflow files from skills to commands
70
- console.log(`${cyan}Step 2: Copying ez-agents commands${reset}`);
71
-
72
- let sourceDir = null;
73
- if (ezAgentsDir && fs.existsSync(path.join(ezAgentsDir, 'workflows'))) {
74
- sourceDir = path.join(ezAgentsDir, 'workflows');
75
- } else if (fs.existsSync(skillsDir)) {
76
- // Check if skills are installed as ez-* directories
77
- const skillDirs = fs.readdirSync(skillsDir, { withFileTypes: true })
78
- .filter(d => d.isDirectory() && d.name.startsWith('ez-'))
79
- .map(d => d.name);
80
-
81
- if (skillDirs.length > 0) {
82
- console.log(`${yellow}Note:${reset} Found skills in skills/ directory: ${skillDirs.join(', ')}`);
83
- console.log(`${yellow}Note:${reset} Qwen Code uses commands/ directory instead\n`);
84
- }
85
- }
86
-
87
- if (sourceDir && fs.existsSync(sourceDir)) {
88
- const files = fs.readdirSync(sourceDir).filter(f => f.endsWith('.md'));
89
-
90
- for (const file of files) {
91
- const srcFile = path.join(sourceDir, file);
92
- const destFile = path.join(ezCommandsDir, file);
93
-
94
- try {
95
- let content = fs.readFileSync(srcFile, 'utf-8');
96
-
97
- // Update any references from skills/ to commands/
98
- content = content.replace(/~\/\.qwen\/skills\//g, '~/.qwen/commands/');
99
- content = content.replace(/\.qwen\/skills\//g, '.qwen/commands/');
100
-
101
- fs.writeFileSync(destFile, content, 'utf-8');
102
- console.log(`${green}✓${reset} Copied ${file}`);
103
- } catch (err) {
104
- console.log(`${red}✗${reset} Failed to copy ${file}: ${err.message}`);
105
- }
106
- }
107
-
108
- console.log(`\n${green}✓${reset} Copied ${files.length} commands\n`);
109
- } else {
110
- console.log(`${yellow}Note:${reset} No workflows found to copy`);
111
- console.log(`The commands will be available after running ${cyan}ez-agents --qwen --global${reset} again\n`);
112
- }
113
-
114
- // Verify installation
115
- console.log(`${cyan}Step 3: Verifying installation${reset}`);
116
- if (fs.existsSync(ezCommandsDir)) {
117
- const commandFiles = fs.readdirSync(ezCommandsDir).filter(f => f.endsWith('.md'));
118
- console.log(`${green}✓${reset} Found ${commandFiles.length} command files in ${ezCommandsDir}`);
119
-
120
- if (commandFiles.length > 0) {
121
- console.log(`\n${green}Success!${reset} EZ Agents commands are now available in Qwen Code\n`);
122
- console.log(`Available commands:`);
123
-
124
- // Show first 10 commands
125
- const sampleCommands = commandFiles.slice(0, 10).map(f => f.replace('.md', ''));
126
- sampleCommands.forEach(cmd => {
127
- console.log(` ${cyan}/ez:${cmd}${reset}`);
128
- });
129
-
130
- if (commandFiles.length > 10) {
131
- console.log(` ... and ${commandFiles.length - 10} more`);
132
- }
133
-
134
- console.log(`\n${green}Usage:${reset}`);
135
- console.log(` Open a project in Qwen Code and run:`);
136
- console.log(` ${cyan}/ez:help${reset} - Show all available commands`);
137
- console.log(` ${cyan}/ez:new-project${reset} - Initialize new project`);
138
- console.log(` ${cyan}/ez:quick${reset} - Quick start\n`);
139
- }
140
- } else {
141
- console.log(`${red}✗${reset} Commands directory not created`);
142
- }
143
-
144
- console.log(`${cyan}Note:${reset} You may need to restart Qwen Code for changes to take effect\n`);
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Fix Qwen Code Installation
5
+ *
6
+ * This script fixes the Qwen Code installation by copying ez-agents commands
7
+ * to the correct ~/.qwen/commands/ez/ directory instead of ~/.qwen/skills/
8
+ *
9
+ * Usage: node fix-qwen-installation.js
10
+ */
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const os = require('os');
15
+
16
+ const cyan = '\x1b[36m';
17
+ const green = '\x1b[32m';
18
+ const yellow = '\x1b[33m';
19
+ const red = '\x1b[31m';
20
+ const reset = '\x1b[0m';
21
+
22
+ console.log(`${cyan}Fixing Qwen Code Installation${reset}\n`);
23
+
24
+ // Get Qwen config directory
25
+ const qwenDir = process.env.QWEN_CONFIG_DIR
26
+ ? path.resolve(process.env.QWEN_CONFIG_DIR)
27
+ : path.join(os.homedir(), '.qwen');
28
+
29
+ const skillsDir = path.join(qwenDir, 'skills');
30
+ const commandsDir = path.join(qwenDir, 'commands');
31
+ const ezCommandsDir = path.join(commandsDir, 'ez');
32
+
33
+ // Find ez-agents installation
34
+ let ezAgentsDir = null;
35
+ const possibleLocations = [
36
+ path.join(qwenDir, 'ez-agents'),
37
+ path.join(qwenDir, '.ez-agents'),
38
+ path.join(os.homedir(), '.ez-agents'),
39
+ ];
40
+
41
+ for (const loc of possibleLocations) {
42
+ if (fs.existsSync(loc)) {
43
+ ezAgentsDir = loc;
44
+ break;
45
+ }
46
+ }
47
+
48
+ if (!ezAgentsDir) {
49
+ console.log(`${yellow}Warning:${reset} ez-agents installation not found in common locations`);
50
+ console.log(`Looking for workflows in ${skillsDir}/ez-*/`);
51
+
52
+ // Try to find workflows from installed skills
53
+ if (!fs.existsSync(skillsDir)) {
54
+ console.log(`${red}Error:${reset} Neither ez-agents nor skills directory found`);
55
+ console.log(`Please run: ${cyan}ez-agents --qwen --global${reset}`);
56
+ process.exit(1);
57
+ }
58
+ }
59
+
60
+ console.log(`Qwen config directory: ${cyan}${qwenDir}${reset}`);
61
+ console.log(`Current skills location: ${yellow}${skillsDir}${reset}`);
62
+ console.log(`Target commands location: ${green}${ezCommandsDir}${reset}\n`);
63
+
64
+ // Create commands/ez directory
65
+ console.log(`${cyan}Step 1: Creating commands directory${reset}`);
66
+ fs.mkdirSync(ezCommandsDir, { recursive: true });
67
+ console.log(`${green}✓${reset} Created ${ezCommandsDir}\n`);
68
+
69
+ // Copy workflow files from skills to commands
70
+ console.log(`${cyan}Step 2: Copying ez-agents commands${reset}`);
71
+
72
+ let sourceDir = null;
73
+ if (ezAgentsDir && fs.existsSync(path.join(ezAgentsDir, 'workflows'))) {
74
+ sourceDir = path.join(ezAgentsDir, 'workflows');
75
+ } else if (fs.existsSync(skillsDir)) {
76
+ // Check if skills are installed as ez-* directories
77
+ const skillDirs = fs.readdirSync(skillsDir, { withFileTypes: true })
78
+ .filter(d => d.isDirectory() && d.name.startsWith('ez-'))
79
+ .map(d => d.name);
80
+
81
+ if (skillDirs.length > 0) {
82
+ console.log(`${yellow}Note:${reset} Found skills in skills/ directory: ${skillDirs.join(', ')}`);
83
+ console.log(`${yellow}Note:${reset} Qwen Code uses commands/ directory instead\n`);
84
+ }
85
+ }
86
+
87
+ if (sourceDir && fs.existsSync(sourceDir)) {
88
+ const files = fs.readdirSync(sourceDir).filter(f => f.endsWith('.md'));
89
+
90
+ for (const file of files) {
91
+ const srcFile = path.join(sourceDir, file);
92
+ const destFile = path.join(ezCommandsDir, file);
93
+
94
+ try {
95
+ let content = fs.readFileSync(srcFile, 'utf-8');
96
+
97
+ // Update any references from skills/ to commands/
98
+ content = content.replace(/~\/\.qwen\/skills\//g, '~/.qwen/commands/');
99
+ content = content.replace(/\.qwen\/skills\//g, '.qwen/commands/');
100
+
101
+ fs.writeFileSync(destFile, content, 'utf-8');
102
+ console.log(`${green}✓${reset} Copied ${file}`);
103
+ } catch (err) {
104
+ console.log(`${red}✗${reset} Failed to copy ${file}: ${err.message}`);
105
+ }
106
+ }
107
+
108
+ console.log(`\n${green}✓${reset} Copied ${files.length} commands\n`);
109
+ } else {
110
+ console.log(`${yellow}Note:${reset} No workflows found to copy`);
111
+ console.log(`The commands will be available after running ${cyan}ez-agents --qwen --global${reset} again\n`);
112
+ }
113
+
114
+ // Verify installation
115
+ console.log(`${cyan}Step 3: Verifying installation${reset}`);
116
+ if (fs.existsSync(ezCommandsDir)) {
117
+ const commandFiles = fs.readdirSync(ezCommandsDir).filter(f => f.endsWith('.md'));
118
+ console.log(`${green}✓${reset} Found ${commandFiles.length} command files in ${ezCommandsDir}`);
119
+
120
+ if (commandFiles.length > 0) {
121
+ console.log(`\n${green}Success!${reset} EZ Agents commands are now available in Qwen Code\n`);
122
+ console.log(`Available commands:`);
123
+
124
+ // Show first 10 commands
125
+ const sampleCommands = commandFiles.slice(0, 10).map(f => f.replace('.md', ''));
126
+ sampleCommands.forEach(cmd => {
127
+ console.log(` ${cyan}/ez:${cmd}${reset}`);
128
+ });
129
+
130
+ if (commandFiles.length > 10) {
131
+ console.log(` ... and ${commandFiles.length - 10} more`);
132
+ }
133
+
134
+ console.log(`\n${green}Usage:${reset}`);
135
+ console.log(` Open a project in Qwen Code and run:`);
136
+ console.log(` ${cyan}/ez:help${reset} - Show all available commands`);
137
+ console.log(` ${cyan}/ez:new-project${reset} - Initialize new project`);
138
+ console.log(` ${cyan}/ez:quick${reset} - Quick start\n`);
139
+ }
140
+ } else {
141
+ console.log(`${red}✗${reset} Commands directory not created`);
142
+ }
143
+
144
+ console.log(`${cyan}Note:${reset} You may need to restart Qwen Code for changes to take effect\n`);