claude-autopm 2.8.2 → 2.8.3

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 (390) hide show
  1. package/README.md +399 -637
  2. package/package.json +2 -1
  3. package/packages/plugin-ai/LICENSE +21 -0
  4. package/packages/plugin-ai/README.md +316 -0
  5. package/packages/plugin-ai/agents/anthropic-claude-expert.md +579 -0
  6. package/packages/plugin-ai/agents/azure-openai-expert.md +1411 -0
  7. package/packages/plugin-ai/agents/gemini-api-expert.md +880 -0
  8. package/packages/plugin-ai/agents/google-a2a-expert.md +1445 -0
  9. package/packages/plugin-ai/agents/huggingface-expert.md +2131 -0
  10. package/packages/plugin-ai/agents/langchain-expert.md +1427 -0
  11. package/packages/plugin-ai/agents/langgraph-workflow-expert.md +520 -0
  12. package/packages/plugin-ai/agents/openai-python-expert.md +1087 -0
  13. package/packages/plugin-ai/commands/a2a-setup.md +886 -0
  14. package/packages/plugin-ai/commands/ai-model-deployment.md +481 -0
  15. package/packages/plugin-ai/commands/anthropic-optimize.md +793 -0
  16. package/packages/plugin-ai/commands/huggingface-deploy.md +789 -0
  17. package/packages/plugin-ai/commands/langchain-optimize.md +807 -0
  18. package/packages/plugin-ai/commands/llm-optimize.md +348 -0
  19. package/packages/plugin-ai/commands/openai-optimize.md +863 -0
  20. package/packages/plugin-ai/commands/rag-optimize.md +841 -0
  21. package/packages/plugin-ai/commands/rag-setup-scaffold.md +382 -0
  22. package/packages/plugin-ai/package.json +66 -0
  23. package/packages/plugin-ai/plugin.json +519 -0
  24. package/packages/plugin-ai/rules/ai-model-standards.md +449 -0
  25. package/packages/plugin-ai/rules/prompt-engineering-standards.md +509 -0
  26. package/packages/plugin-ai/scripts/examples/huggingface-inference-example.py +145 -0
  27. package/packages/plugin-ai/scripts/examples/langchain-rag-example.py +366 -0
  28. package/packages/plugin-ai/scripts/examples/mlflow-tracking-example.py +224 -0
  29. package/packages/plugin-ai/scripts/examples/openai-chat-example.py +425 -0
  30. package/packages/plugin-cloud/README.md +268 -0
  31. package/packages/plugin-cloud/agents/README.md +55 -0
  32. package/packages/plugin-cloud/agents/aws-cloud-architect.md +521 -0
  33. package/packages/plugin-cloud/agents/azure-cloud-architect.md +436 -0
  34. package/packages/plugin-cloud/agents/gcp-cloud-architect.md +385 -0
  35. package/packages/plugin-cloud/agents/gcp-cloud-functions-engineer.md +306 -0
  36. package/packages/plugin-cloud/agents/gemini-api-expert.md +880 -0
  37. package/packages/plugin-cloud/agents/kubernetes-orchestrator.md +566 -0
  38. package/packages/plugin-cloud/agents/openai-python-expert.md +1087 -0
  39. package/packages/plugin-cloud/agents/terraform-infrastructure-expert.md +454 -0
  40. package/packages/plugin-cloud/commands/cloud-cost-optimize.md +243 -0
  41. package/packages/plugin-cloud/commands/cloud-validate.md +196 -0
  42. package/packages/plugin-cloud/commands/infra-deploy.md +38 -0
  43. package/packages/plugin-cloud/commands/k8s-deploy.md +37 -0
  44. package/packages/plugin-cloud/commands/ssh-security.md +65 -0
  45. package/packages/plugin-cloud/commands/traefik-setup.md +65 -0
  46. package/packages/plugin-cloud/hooks/pre-cloud-deploy.js +456 -0
  47. package/packages/plugin-cloud/package.json +64 -0
  48. package/packages/plugin-cloud/plugin.json +338 -0
  49. package/packages/plugin-cloud/rules/cloud-security-compliance.md +313 -0
  50. package/packages/plugin-cloud/rules/infrastructure-pipeline.md +128 -0
  51. package/packages/plugin-cloud/scripts/examples/aws-validate.sh +30 -0
  52. package/packages/plugin-cloud/scripts/examples/azure-setup.sh +33 -0
  53. package/packages/plugin-cloud/scripts/examples/gcp-setup.sh +39 -0
  54. package/packages/plugin-cloud/scripts/examples/k8s-validate.sh +40 -0
  55. package/packages/plugin-cloud/scripts/examples/terraform-init.sh +26 -0
  56. package/packages/plugin-core/README.md +274 -0
  57. package/packages/plugin-core/agents/core/agent-manager.md +296 -0
  58. package/packages/plugin-core/agents/core/code-analyzer.md +131 -0
  59. package/packages/plugin-core/agents/core/file-analyzer.md +162 -0
  60. package/packages/plugin-core/agents/core/test-runner.md +200 -0
  61. package/packages/plugin-core/commands/code-rabbit.md +128 -0
  62. package/packages/plugin-core/commands/prompt.md +9 -0
  63. package/packages/plugin-core/commands/re-init.md +9 -0
  64. package/packages/plugin-core/hooks/context7-reminder.md +29 -0
  65. package/packages/plugin-core/hooks/enforce-agents.js +125 -0
  66. package/packages/plugin-core/hooks/enforce-agents.sh +35 -0
  67. package/packages/plugin-core/hooks/pre-agent-context7.js +224 -0
  68. package/packages/plugin-core/hooks/pre-command-context7.js +229 -0
  69. package/packages/plugin-core/hooks/strict-enforce-agents.sh +39 -0
  70. package/packages/plugin-core/hooks/test-hook.sh +21 -0
  71. package/packages/plugin-core/hooks/unified-context7-enforcement.sh +38 -0
  72. package/packages/plugin-core/package.json +45 -0
  73. package/packages/plugin-core/plugin.json +387 -0
  74. package/packages/plugin-core/rules/agent-coordination.md +549 -0
  75. package/packages/plugin-core/rules/agent-mandatory.md +170 -0
  76. package/packages/plugin-core/rules/ai-integration-patterns.md +219 -0
  77. package/packages/plugin-core/rules/command-pipelines.md +208 -0
  78. package/packages/plugin-core/rules/context-optimization.md +176 -0
  79. package/packages/plugin-core/rules/context7-enforcement.md +327 -0
  80. package/packages/plugin-core/rules/datetime.md +122 -0
  81. package/packages/plugin-core/rules/definition-of-done.md +272 -0
  82. package/packages/plugin-core/rules/development-environments.md +19 -0
  83. package/packages/plugin-core/rules/development-workflow.md +198 -0
  84. package/packages/plugin-core/rules/framework-path-rules.md +180 -0
  85. package/packages/plugin-core/rules/frontmatter-operations.md +64 -0
  86. package/packages/plugin-core/rules/git-strategy.md +237 -0
  87. package/packages/plugin-core/rules/golden-rules.md +181 -0
  88. package/packages/plugin-core/rules/naming-conventions.md +111 -0
  89. package/packages/plugin-core/rules/no-pr-workflow.md +183 -0
  90. package/packages/plugin-core/rules/performance-guidelines.md +403 -0
  91. package/packages/plugin-core/rules/pipeline-mandatory.md +109 -0
  92. package/packages/plugin-core/rules/security-checklist.md +318 -0
  93. package/packages/plugin-core/rules/standard-patterns.md +197 -0
  94. package/packages/plugin-core/rules/strip-frontmatter.md +85 -0
  95. package/packages/plugin-core/rules/tdd.enforcement.md +103 -0
  96. package/packages/plugin-core/rules/use-ast-grep.md +113 -0
  97. package/packages/plugin-core/scripts/lib/datetime-utils.sh +254 -0
  98. package/packages/plugin-core/scripts/lib/frontmatter-utils.sh +294 -0
  99. package/packages/plugin-core/scripts/lib/github-utils.sh +221 -0
  100. package/packages/plugin-core/scripts/lib/logging-utils.sh +199 -0
  101. package/packages/plugin-core/scripts/lib/validation-utils.sh +339 -0
  102. package/packages/plugin-core/scripts/mcp/add.sh +7 -0
  103. package/packages/plugin-core/scripts/mcp/disable.sh +12 -0
  104. package/packages/plugin-core/scripts/mcp/enable.sh +12 -0
  105. package/packages/plugin-core/scripts/mcp/list.sh +7 -0
  106. package/packages/plugin-core/scripts/mcp/sync.sh +8 -0
  107. package/packages/plugin-data/README.md +315 -0
  108. package/packages/plugin-data/agents/airflow-orchestration-expert.md +158 -0
  109. package/packages/plugin-data/agents/kedro-pipeline-expert.md +304 -0
  110. package/packages/plugin-data/agents/langgraph-workflow-expert.md +530 -0
  111. package/packages/plugin-data/commands/airflow-dag-scaffold.md +413 -0
  112. package/packages/plugin-data/commands/kafka-pipeline-scaffold.md +503 -0
  113. package/packages/plugin-data/package.json +66 -0
  114. package/packages/plugin-data/plugin.json +294 -0
  115. package/packages/plugin-data/rules/data-quality-standards.md +373 -0
  116. package/packages/plugin-data/rules/etl-pipeline-standards.md +255 -0
  117. package/packages/plugin-data/scripts/examples/airflow-dag-example.py +245 -0
  118. package/packages/plugin-data/scripts/examples/dbt-transform-example.sql +238 -0
  119. package/packages/plugin-data/scripts/examples/kafka-streaming-example.py +257 -0
  120. package/packages/plugin-data/scripts/examples/pandas-etl-example.py +332 -0
  121. package/packages/plugin-databases/README.md +330 -0
  122. package/packages/plugin-databases/agents/README.md +50 -0
  123. package/packages/plugin-databases/agents/bigquery-expert.md +401 -0
  124. package/packages/plugin-databases/agents/cosmosdb-expert.md +375 -0
  125. package/packages/plugin-databases/agents/mongodb-expert.md +407 -0
  126. package/packages/plugin-databases/agents/postgresql-expert.md +329 -0
  127. package/packages/plugin-databases/agents/redis-expert.md +74 -0
  128. package/packages/plugin-databases/commands/db-optimize.md +612 -0
  129. package/packages/plugin-databases/package.json +60 -0
  130. package/packages/plugin-databases/plugin.json +237 -0
  131. package/packages/plugin-databases/rules/database-management-strategy.md +146 -0
  132. package/packages/plugin-databases/rules/database-pipeline.md +316 -0
  133. package/packages/plugin-databases/scripts/examples/bigquery-cost-analyze.sh +160 -0
  134. package/packages/plugin-databases/scripts/examples/cosmosdb-ru-optimize.sh +163 -0
  135. package/packages/plugin-databases/scripts/examples/mongodb-shard-check.sh +120 -0
  136. package/packages/plugin-databases/scripts/examples/postgres-index-analyze.sh +95 -0
  137. package/packages/plugin-databases/scripts/examples/redis-cache-stats.sh +121 -0
  138. package/packages/plugin-devops/README.md +367 -0
  139. package/packages/plugin-devops/agents/README.md +52 -0
  140. package/packages/plugin-devops/agents/azure-devops-specialist.md +308 -0
  141. package/packages/plugin-devops/agents/docker-containerization-expert.md +298 -0
  142. package/packages/plugin-devops/agents/github-operations-specialist.md +335 -0
  143. package/packages/plugin-devops/agents/mcp-context-manager.md +319 -0
  144. package/packages/plugin-devops/agents/observability-engineer.md +574 -0
  145. package/packages/plugin-devops/agents/ssh-operations-expert.md +1093 -0
  146. package/packages/plugin-devops/agents/traefik-proxy-expert.md +444 -0
  147. package/packages/plugin-devops/commands/ci-pipeline-create.md +581 -0
  148. package/packages/plugin-devops/commands/docker-optimize.md +493 -0
  149. package/packages/plugin-devops/commands/workflow-create.md +42 -0
  150. package/packages/plugin-devops/hooks/pre-docker-build.js +472 -0
  151. package/packages/plugin-devops/package.json +61 -0
  152. package/packages/plugin-devops/plugin.json +302 -0
  153. package/packages/plugin-devops/rules/ci-cd-kubernetes-strategy.md +25 -0
  154. package/packages/plugin-devops/rules/devops-troubleshooting-playbook.md +450 -0
  155. package/packages/plugin-devops/rules/docker-first-development.md +404 -0
  156. package/packages/plugin-devops/rules/github-operations.md +92 -0
  157. package/packages/plugin-devops/scripts/examples/docker-build-multistage.sh +43 -0
  158. package/packages/plugin-devops/scripts/examples/docker-compose-validate.sh +74 -0
  159. package/packages/plugin-devops/scripts/examples/github-workflow-validate.sh +48 -0
  160. package/packages/plugin-devops/scripts/examples/prometheus-health-check.sh +58 -0
  161. package/packages/plugin-devops/scripts/examples/ssh-key-setup.sh +74 -0
  162. package/packages/plugin-frameworks/README.md +309 -0
  163. package/packages/plugin-frameworks/agents/README.md +64 -0
  164. package/packages/plugin-frameworks/agents/e2e-test-engineer.md +579 -0
  165. package/packages/plugin-frameworks/agents/nats-messaging-expert.md +254 -0
  166. package/packages/plugin-frameworks/agents/react-frontend-engineer.md +393 -0
  167. package/packages/plugin-frameworks/agents/react-ui-expert.md +226 -0
  168. package/packages/plugin-frameworks/agents/tailwindcss-expert.md +1021 -0
  169. package/packages/plugin-frameworks/agents/ux-design-expert.md +244 -0
  170. package/packages/plugin-frameworks/commands/app-scaffold.md +50 -0
  171. package/packages/plugin-frameworks/commands/nextjs-optimize.md +692 -0
  172. package/packages/plugin-frameworks/commands/react-optimize.md +583 -0
  173. package/packages/plugin-frameworks/commands/tailwind-system.md +64 -0
  174. package/packages/plugin-frameworks/package.json +59 -0
  175. package/packages/plugin-frameworks/plugin.json +224 -0
  176. package/packages/plugin-frameworks/rules/performance-guidelines.md +403 -0
  177. package/packages/plugin-frameworks/rules/ui-development-standards.md +281 -0
  178. package/packages/plugin-frameworks/rules/ui-framework-rules.md +151 -0
  179. package/packages/plugin-frameworks/scripts/examples/react-component-perf.sh +34 -0
  180. package/packages/plugin-frameworks/scripts/examples/tailwind-optimize.sh +44 -0
  181. package/packages/plugin-frameworks/scripts/examples/vue-composition-check.sh +41 -0
  182. package/packages/plugin-languages/README.md +333 -0
  183. package/packages/plugin-languages/agents/README.md +50 -0
  184. package/packages/plugin-languages/agents/bash-scripting-expert.md +541 -0
  185. package/packages/plugin-languages/agents/javascript-frontend-engineer.md +197 -0
  186. package/packages/plugin-languages/agents/nodejs-backend-engineer.md +226 -0
  187. package/packages/plugin-languages/agents/python-backend-engineer.md +214 -0
  188. package/packages/plugin-languages/agents/python-backend-expert.md +289 -0
  189. package/packages/plugin-languages/commands/javascript-optimize.md +636 -0
  190. package/packages/plugin-languages/commands/nodejs-api-scaffold.md +341 -0
  191. package/packages/plugin-languages/commands/nodejs-optimize.md +689 -0
  192. package/packages/plugin-languages/commands/python-api-scaffold.md +261 -0
  193. package/packages/plugin-languages/commands/python-optimize.md +593 -0
  194. package/packages/plugin-languages/package.json +65 -0
  195. package/packages/plugin-languages/plugin.json +265 -0
  196. package/packages/plugin-languages/rules/code-quality-standards.md +496 -0
  197. package/packages/plugin-languages/rules/testing-standards.md +768 -0
  198. package/packages/plugin-languages/scripts/examples/bash-production-script.sh +520 -0
  199. package/packages/plugin-languages/scripts/examples/javascript-es6-patterns.js +291 -0
  200. package/packages/plugin-languages/scripts/examples/nodejs-async-iteration.js +360 -0
  201. package/packages/plugin-languages/scripts/examples/python-async-patterns.py +289 -0
  202. package/packages/plugin-languages/scripts/examples/typescript-patterns.ts +432 -0
  203. package/packages/plugin-ml/README.md +430 -0
  204. package/packages/plugin-ml/agents/automl-expert.md +326 -0
  205. package/packages/plugin-ml/agents/computer-vision-expert.md +550 -0
  206. package/packages/plugin-ml/agents/gradient-boosting-expert.md +455 -0
  207. package/packages/plugin-ml/agents/neural-network-architect.md +1228 -0
  208. package/packages/plugin-ml/agents/nlp-transformer-expert.md +584 -0
  209. package/packages/plugin-ml/agents/pytorch-expert.md +412 -0
  210. package/packages/plugin-ml/agents/reinforcement-learning-expert.md +2088 -0
  211. package/packages/plugin-ml/agents/scikit-learn-expert.md +228 -0
  212. package/packages/plugin-ml/agents/tensorflow-keras-expert.md +509 -0
  213. package/packages/plugin-ml/agents/time-series-expert.md +303 -0
  214. package/packages/plugin-ml/commands/ml-automl.md +572 -0
  215. package/packages/plugin-ml/commands/ml-train-optimize.md +657 -0
  216. package/packages/plugin-ml/package.json +52 -0
  217. package/packages/plugin-ml/plugin.json +338 -0
  218. package/packages/plugin-pm/README.md +368 -0
  219. package/packages/plugin-pm/claudeautopm-plugin-pm-2.0.0.tgz +0 -0
  220. package/packages/plugin-pm/commands/azure/COMMANDS.md +107 -0
  221. package/packages/plugin-pm/commands/azure/COMMAND_MAPPING.md +252 -0
  222. package/packages/plugin-pm/commands/azure/INTEGRATION_FIX.md +103 -0
  223. package/packages/plugin-pm/commands/azure/README.md +246 -0
  224. package/packages/plugin-pm/commands/azure/active-work.md +198 -0
  225. package/packages/plugin-pm/commands/azure/aliases.md +143 -0
  226. package/packages/plugin-pm/commands/azure/blocked-items.md +287 -0
  227. package/packages/plugin-pm/commands/azure/clean.md +93 -0
  228. package/packages/plugin-pm/commands/azure/docs-query.md +48 -0
  229. package/packages/plugin-pm/commands/azure/feature-decompose.md +380 -0
  230. package/packages/plugin-pm/commands/azure/feature-list.md +61 -0
  231. package/packages/plugin-pm/commands/azure/feature-new.md +115 -0
  232. package/packages/plugin-pm/commands/azure/feature-show.md +205 -0
  233. package/packages/plugin-pm/commands/azure/feature-start.md +130 -0
  234. package/packages/plugin-pm/commands/azure/fix-integration-example.md +93 -0
  235. package/packages/plugin-pm/commands/azure/help.md +150 -0
  236. package/packages/plugin-pm/commands/azure/import-us.md +269 -0
  237. package/packages/plugin-pm/commands/azure/init.md +211 -0
  238. package/packages/plugin-pm/commands/azure/next-task.md +262 -0
  239. package/packages/plugin-pm/commands/azure/search.md +160 -0
  240. package/packages/plugin-pm/commands/azure/sprint-status.md +235 -0
  241. package/packages/plugin-pm/commands/azure/standup.md +260 -0
  242. package/packages/plugin-pm/commands/azure/sync-all.md +99 -0
  243. package/packages/plugin-pm/commands/azure/task-analyze.md +186 -0
  244. package/packages/plugin-pm/commands/azure/task-close.md +329 -0
  245. package/packages/plugin-pm/commands/azure/task-edit.md +145 -0
  246. package/packages/plugin-pm/commands/azure/task-list.md +263 -0
  247. package/packages/plugin-pm/commands/azure/task-new.md +84 -0
  248. package/packages/plugin-pm/commands/azure/task-reopen.md +79 -0
  249. package/packages/plugin-pm/commands/azure/task-show.md +126 -0
  250. package/packages/plugin-pm/commands/azure/task-start.md +301 -0
  251. package/packages/plugin-pm/commands/azure/task-status.md +65 -0
  252. package/packages/plugin-pm/commands/azure/task-sync.md +67 -0
  253. package/packages/plugin-pm/commands/azure/us-edit.md +164 -0
  254. package/packages/plugin-pm/commands/azure/us-list.md +202 -0
  255. package/packages/plugin-pm/commands/azure/us-new.md +265 -0
  256. package/packages/plugin-pm/commands/azure/us-parse.md +253 -0
  257. package/packages/plugin-pm/commands/azure/us-show.md +188 -0
  258. package/packages/plugin-pm/commands/azure/us-status.md +320 -0
  259. package/packages/plugin-pm/commands/azure/validate.md +86 -0
  260. package/packages/plugin-pm/commands/azure/work-item-sync.md +47 -0
  261. package/packages/plugin-pm/commands/blocked.md +28 -0
  262. package/packages/plugin-pm/commands/clean.md +119 -0
  263. package/packages/plugin-pm/commands/context-create.md +136 -0
  264. package/packages/plugin-pm/commands/context-prime.md +170 -0
  265. package/packages/plugin-pm/commands/context-update.md +292 -0
  266. package/packages/plugin-pm/commands/context.md +28 -0
  267. package/packages/plugin-pm/commands/epic-close.md +86 -0
  268. package/packages/plugin-pm/commands/epic-decompose.md +370 -0
  269. package/packages/plugin-pm/commands/epic-edit.md +83 -0
  270. package/packages/plugin-pm/commands/epic-list.md +30 -0
  271. package/packages/plugin-pm/commands/epic-merge.md +222 -0
  272. package/packages/plugin-pm/commands/epic-oneshot.md +119 -0
  273. package/packages/plugin-pm/commands/epic-refresh.md +119 -0
  274. package/packages/plugin-pm/commands/epic-show.md +28 -0
  275. package/packages/plugin-pm/commands/epic-split.md +120 -0
  276. package/packages/plugin-pm/commands/epic-start.md +195 -0
  277. package/packages/plugin-pm/commands/epic-status.md +28 -0
  278. package/packages/plugin-pm/commands/epic-sync-modular.md +338 -0
  279. package/packages/plugin-pm/commands/epic-sync-original.md +473 -0
  280. package/packages/plugin-pm/commands/epic-sync.md +486 -0
  281. package/packages/plugin-pm/commands/github/workflow-create.md +42 -0
  282. package/packages/plugin-pm/commands/help.md +28 -0
  283. package/packages/plugin-pm/commands/import.md +115 -0
  284. package/packages/plugin-pm/commands/in-progress.md +28 -0
  285. package/packages/plugin-pm/commands/init.md +28 -0
  286. package/packages/plugin-pm/commands/issue-analyze.md +202 -0
  287. package/packages/plugin-pm/commands/issue-close.md +119 -0
  288. package/packages/plugin-pm/commands/issue-edit.md +93 -0
  289. package/packages/plugin-pm/commands/issue-reopen.md +87 -0
  290. package/packages/plugin-pm/commands/issue-show.md +41 -0
  291. package/packages/plugin-pm/commands/issue-start.md +234 -0
  292. package/packages/plugin-pm/commands/issue-status.md +95 -0
  293. package/packages/plugin-pm/commands/issue-sync.md +411 -0
  294. package/packages/plugin-pm/commands/next.md +28 -0
  295. package/packages/plugin-pm/commands/prd-edit.md +82 -0
  296. package/packages/plugin-pm/commands/prd-list.md +28 -0
  297. package/packages/plugin-pm/commands/prd-new.md +55 -0
  298. package/packages/plugin-pm/commands/prd-parse.md +42 -0
  299. package/packages/plugin-pm/commands/prd-status.md +28 -0
  300. package/packages/plugin-pm/commands/search.md +28 -0
  301. package/packages/plugin-pm/commands/standup.md +28 -0
  302. package/packages/plugin-pm/commands/status.md +28 -0
  303. package/packages/plugin-pm/commands/sync.md +99 -0
  304. package/packages/plugin-pm/commands/test-reference-update.md +151 -0
  305. package/packages/plugin-pm/commands/validate.md +28 -0
  306. package/packages/plugin-pm/commands/what-next.md +28 -0
  307. package/packages/plugin-pm/package.json +57 -0
  308. package/packages/plugin-pm/plugin.json +503 -0
  309. package/packages/plugin-pm/scripts/pm/analytics.js +425 -0
  310. package/packages/plugin-pm/scripts/pm/blocked.js +164 -0
  311. package/packages/plugin-pm/scripts/pm/blocked.sh +78 -0
  312. package/packages/plugin-pm/scripts/pm/clean.js +464 -0
  313. package/packages/plugin-pm/scripts/pm/context-create.js +216 -0
  314. package/packages/plugin-pm/scripts/pm/context-prime.js +335 -0
  315. package/packages/plugin-pm/scripts/pm/context-update.js +344 -0
  316. package/packages/plugin-pm/scripts/pm/context.js +338 -0
  317. package/packages/plugin-pm/scripts/pm/epic-close.js +347 -0
  318. package/packages/plugin-pm/scripts/pm/epic-edit.js +382 -0
  319. package/packages/plugin-pm/scripts/pm/epic-list.js +273 -0
  320. package/packages/plugin-pm/scripts/pm/epic-list.sh +109 -0
  321. package/packages/plugin-pm/scripts/pm/epic-show.js +291 -0
  322. package/packages/plugin-pm/scripts/pm/epic-show.sh +105 -0
  323. package/packages/plugin-pm/scripts/pm/epic-split.js +522 -0
  324. package/packages/plugin-pm/scripts/pm/epic-start/epic-start.js +183 -0
  325. package/packages/plugin-pm/scripts/pm/epic-start/epic-start.sh +94 -0
  326. package/packages/plugin-pm/scripts/pm/epic-status.js +291 -0
  327. package/packages/plugin-pm/scripts/pm/epic-status.sh +104 -0
  328. package/packages/plugin-pm/scripts/pm/epic-sync/README.md +208 -0
  329. package/packages/plugin-pm/scripts/pm/epic-sync/create-epic-issue.sh +77 -0
  330. package/packages/plugin-pm/scripts/pm/epic-sync/create-task-issues.sh +86 -0
  331. package/packages/plugin-pm/scripts/pm/epic-sync/update-epic-file.sh +79 -0
  332. package/packages/plugin-pm/scripts/pm/epic-sync/update-references.sh +89 -0
  333. package/packages/plugin-pm/scripts/pm/epic-sync.sh +137 -0
  334. package/packages/plugin-pm/scripts/pm/help.js +92 -0
  335. package/packages/plugin-pm/scripts/pm/help.sh +90 -0
  336. package/packages/plugin-pm/scripts/pm/in-progress.js +178 -0
  337. package/packages/plugin-pm/scripts/pm/in-progress.sh +93 -0
  338. package/packages/plugin-pm/scripts/pm/init.js +321 -0
  339. package/packages/plugin-pm/scripts/pm/init.sh +178 -0
  340. package/packages/plugin-pm/scripts/pm/issue-close.js +232 -0
  341. package/packages/plugin-pm/scripts/pm/issue-edit.js +310 -0
  342. package/packages/plugin-pm/scripts/pm/issue-show.js +272 -0
  343. package/packages/plugin-pm/scripts/pm/issue-start.js +181 -0
  344. package/packages/plugin-pm/scripts/pm/issue-sync/format-comment.sh +468 -0
  345. package/packages/plugin-pm/scripts/pm/issue-sync/gather-updates.sh +460 -0
  346. package/packages/plugin-pm/scripts/pm/issue-sync/post-comment.sh +330 -0
  347. package/packages/plugin-pm/scripts/pm/issue-sync/preflight-validation.sh +348 -0
  348. package/packages/plugin-pm/scripts/pm/issue-sync/update-frontmatter.sh +387 -0
  349. package/packages/plugin-pm/scripts/pm/lib/README.md +85 -0
  350. package/packages/plugin-pm/scripts/pm/lib/epic-discovery.js +119 -0
  351. package/packages/plugin-pm/scripts/pm/lib/logger.js +78 -0
  352. package/packages/plugin-pm/scripts/pm/next.js +189 -0
  353. package/packages/plugin-pm/scripts/pm/next.sh +72 -0
  354. package/packages/plugin-pm/scripts/pm/optimize.js +407 -0
  355. package/packages/plugin-pm/scripts/pm/pr-create.js +337 -0
  356. package/packages/plugin-pm/scripts/pm/pr-list.js +257 -0
  357. package/packages/plugin-pm/scripts/pm/prd-list.js +242 -0
  358. package/packages/plugin-pm/scripts/pm/prd-list.sh +103 -0
  359. package/packages/plugin-pm/scripts/pm/prd-new.js +684 -0
  360. package/packages/plugin-pm/scripts/pm/prd-parse.js +547 -0
  361. package/packages/plugin-pm/scripts/pm/prd-status.js +152 -0
  362. package/packages/plugin-pm/scripts/pm/prd-status.sh +63 -0
  363. package/packages/plugin-pm/scripts/pm/release.js +460 -0
  364. package/packages/plugin-pm/scripts/pm/search.js +192 -0
  365. package/packages/plugin-pm/scripts/pm/search.sh +89 -0
  366. package/packages/plugin-pm/scripts/pm/standup.js +362 -0
  367. package/packages/plugin-pm/scripts/pm/standup.sh +95 -0
  368. package/packages/plugin-pm/scripts/pm/status.js +148 -0
  369. package/packages/plugin-pm/scripts/pm/status.sh +59 -0
  370. package/packages/plugin-pm/scripts/pm/sync-batch.js +337 -0
  371. package/packages/plugin-pm/scripts/pm/sync.js +343 -0
  372. package/packages/plugin-pm/scripts/pm/template-list.js +141 -0
  373. package/packages/plugin-pm/scripts/pm/template-new.js +366 -0
  374. package/packages/plugin-pm/scripts/pm/validate.js +274 -0
  375. package/packages/plugin-pm/scripts/pm/validate.sh +106 -0
  376. package/packages/plugin-pm/scripts/pm/what-next.js +660 -0
  377. package/packages/plugin-testing/README.md +401 -0
  378. package/packages/plugin-testing/agents/frontend-testing-engineer.md +768 -0
  379. package/packages/plugin-testing/commands/jest-optimize.md +800 -0
  380. package/packages/plugin-testing/commands/playwright-optimize.md +887 -0
  381. package/packages/plugin-testing/commands/test-coverage.md +512 -0
  382. package/packages/plugin-testing/commands/test-performance.md +1041 -0
  383. package/packages/plugin-testing/commands/test-setup.md +414 -0
  384. package/packages/plugin-testing/package.json +40 -0
  385. package/packages/plugin-testing/plugin.json +197 -0
  386. package/packages/plugin-testing/rules/test-coverage-requirements.md +581 -0
  387. package/packages/plugin-testing/rules/testing-standards.md +529 -0
  388. package/packages/plugin-testing/scripts/examples/react-testing-example.test.jsx +460 -0
  389. package/packages/plugin-testing/scripts/examples/vitest-config-example.js +352 -0
  390. package/packages/plugin-testing/scripts/examples/vue-testing-example.test.js +586 -0
@@ -0,0 +1,586 @@
1
+ /**
2
+ * Vue Test Utils + Vitest Example
3
+ *
4
+ * Context7-verified patterns from:
5
+ * - /vitest-dev/vitest
6
+ * - Vue Test Utils documentation
7
+ *
8
+ * Demonstrates best practices for testing Vue 3 components
9
+ * with Vitest and Vue Test Utils
10
+ */
11
+
12
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
13
+ import { mount, flushPromises } from '@vue/test-utils';
14
+ import { createTestingPinia } from '@pinia/testing';
15
+ import { nextTick } from 'vue';
16
+
17
+ // ===================================
18
+ // EXAMPLE COMPONENTS TO TEST
19
+ // ===================================
20
+
21
+ const Button = {
22
+ name: 'Button',
23
+ props: {
24
+ disabled: Boolean,
25
+ loading: Boolean
26
+ },
27
+ emits: ['click'],
28
+ template: `
29
+ <button
30
+ :disabled="disabled || loading"
31
+ @click="$emit('click', $event)"
32
+ >
33
+ <span v-if="loading">Loading...</span>
34
+ <slot v-else />
35
+ </button>
36
+ `
37
+ };
38
+
39
+ const LoginForm = {
40
+ name: 'LoginForm',
41
+ data() {
42
+ return {
43
+ email: '',
44
+ password: '',
45
+ error: '',
46
+ loading: false
47
+ };
48
+ },
49
+ emits: ['submit'],
50
+ methods: {
51
+ async handleSubmit() {
52
+ this.error = '';
53
+
54
+ if (!this.email || !this.password) {
55
+ this.error = 'Email and password are required';
56
+ return;
57
+ }
58
+
59
+ this.loading = true;
60
+ try {
61
+ await this.$emit('submit', { email: this.email, password: this.password });
62
+ } catch (err) {
63
+ this.error = err.message;
64
+ } finally {
65
+ this.loading = false;
66
+ }
67
+ }
68
+ },
69
+ template: `
70
+ <form @submit.prevent="handleSubmit">
71
+ <div>
72
+ <label for="email">Email</label>
73
+ <input
74
+ id="email"
75
+ v-model="email"
76
+ type="email"
77
+ />
78
+ </div>
79
+
80
+ <div>
81
+ <label for="password">Password</label>
82
+ <input
83
+ id="password"
84
+ v-model="password"
85
+ type="password"
86
+ />
87
+ </div>
88
+
89
+ <div v-if="error" class="error">{{ error }}</div>
90
+
91
+ <button type="submit" :disabled="loading">
92
+ {{ loading ? 'Logging in...' : 'Log in' }}
93
+ </button>
94
+ </form>
95
+ `
96
+ };
97
+
98
+ const UserList = {
99
+ name: 'UserList',
100
+ props: {
101
+ users: {
102
+ type: Array,
103
+ required: true
104
+ }
105
+ },
106
+ emits: ['user-click'],
107
+ template: `
108
+ <div>
109
+ <p v-if="users.length === 0">No users found</p>
110
+ <ul v-else>
111
+ <li v-for="user in users" :key="user.id">
112
+ <button @click="$emit('user-click', user)">
113
+ {{ user.name }}
114
+ </button>
115
+ </li>
116
+ </ul>
117
+ </div>
118
+ `
119
+ };
120
+
121
+ const Counter = {
122
+ name: 'Counter',
123
+ data() {
124
+ return {
125
+ count: 0
126
+ };
127
+ },
128
+ computed: {
129
+ doubleCount() {
130
+ return this.count * 2;
131
+ }
132
+ },
133
+ methods: {
134
+ increment() {
135
+ this.count++;
136
+ },
137
+ decrement() {
138
+ this.count--;
139
+ },
140
+ reset() {
141
+ this.count = 0;
142
+ }
143
+ },
144
+ template: `
145
+ <div>
146
+ <p class="count">Count: {{ count }}</p>
147
+ <p class="double">Double: {{ doubleCount }}</p>
148
+ <button @click="increment" class="increment">+</button>
149
+ <button @click="decrement" class="decrement">-</button>
150
+ <button @click="reset" class="reset">Reset</button>
151
+ </div>
152
+ `
153
+ };
154
+
155
+ // ===================================
156
+ // TEST SUITE 1: BASIC BUTTON
157
+ // ===================================
158
+
159
+ describe('Button Component', () => {
160
+ // ✅ CORRECT: Test component rendering
161
+ it('should render with slot content', () => {
162
+ const wrapper = mount(Button, {
163
+ slots: {
164
+ default: 'Click me'
165
+ }
166
+ });
167
+
168
+ expect(wrapper.text()).toContain('Click me');
169
+ expect(wrapper.find('button').exists()).toBe(true);
170
+ });
171
+
172
+ // ✅ CORRECT: Test event emission
173
+ it('should emit click event when clicked', async () => {
174
+ const wrapper = mount(Button, {
175
+ slots: { default: 'Click me' }
176
+ });
177
+
178
+ await wrapper.find('button').trigger('click');
179
+
180
+ expect(wrapper.emitted()).toHaveProperty('click');
181
+ expect(wrapper.emitted('click')).toHaveLength(1);
182
+ });
183
+
184
+ // ✅ CORRECT: Test prop-based disabled state
185
+ it('should be disabled when disabled prop is true', () => {
186
+ const wrapper = mount(Button, {
187
+ props: { disabled: true },
188
+ slots: { default: 'Submit' }
189
+ });
190
+
191
+ expect(wrapper.find('button').element.disabled).toBe(true);
192
+ });
193
+
194
+ // ✅ CORRECT: Test loading state
195
+ it('should show loading state and be disabled', () => {
196
+ const wrapper = mount(Button, {
197
+ props: { loading: true },
198
+ slots: { default: 'Submit' }
199
+ });
200
+
201
+ expect(wrapper.text()).toContain('Loading...');
202
+ expect(wrapper.find('button').element.disabled).toBe(true);
203
+ });
204
+ });
205
+
206
+ // ===================================
207
+ // TEST SUITE 2: LOGIN FORM
208
+ // ===================================
209
+
210
+ describe('LoginForm Component', () => {
211
+ // ✅ CORRECT: Test v-model binding
212
+ it('should bind input values to data', async () => {
213
+ const wrapper = mount(LoginForm);
214
+
215
+ const emailInput = wrapper.find('#email');
216
+ const passwordInput = wrapper.find('#password');
217
+
218
+ await emailInput.setValue('test@example.com');
219
+ await passwordInput.setValue('password123');
220
+
221
+ expect(wrapper.vm.email).toBe('test@example.com');
222
+ expect(wrapper.vm.password).toBe('password123');
223
+ });
224
+
225
+ // ✅ CORRECT: Test form submission
226
+ it('should emit submit event with credentials', async () => {
227
+ const wrapper = mount(LoginForm);
228
+
229
+ await wrapper.find('#email').setValue('test@example.com');
230
+ await wrapper.find('#password').setValue('password123');
231
+ await wrapper.find('form').trigger('submit');
232
+
233
+ expect(wrapper.emitted('submit')).toBeTruthy();
234
+ expect(wrapper.emitted('submit')[0][0]).toEqual({
235
+ email: 'test@example.com',
236
+ password: 'password123'
237
+ });
238
+ });
239
+
240
+ // ✅ CORRECT: Test validation
241
+ it('should show error when fields are empty', async () => {
242
+ const wrapper = mount(LoginForm);
243
+
244
+ await wrapper.find('form').trigger('submit');
245
+
246
+ // Wait for next tick for data updates
247
+ await nextTick();
248
+
249
+ expect(wrapper.find('.error').text()).toBe('Email and password are required');
250
+ expect(wrapper.emitted('submit')).toBeFalsy();
251
+ });
252
+
253
+ // ✅ CORRECT: Test loading state during submission
254
+ it('should show loading state while submitting', async () => {
255
+ const wrapper = mount(LoginForm);
256
+
257
+ await wrapper.find('#email').setValue('test@example.com');
258
+ await wrapper.find('#password').setValue('password');
259
+
260
+ // Manually set loading to simulate async operation
261
+ await wrapper.setData({ loading: true });
262
+
263
+ expect(wrapper.find('button').text()).toBe('Logging in...');
264
+ expect(wrapper.find('button').element.disabled).toBe(true);
265
+ });
266
+ });
267
+
268
+ // ===================================
269
+ // TEST SUITE 3: USER LIST
270
+ // ===================================
271
+
272
+ describe('UserList Component', () => {
273
+ const mockUsers = [
274
+ { id: 1, name: 'John Doe' },
275
+ { id: 2, name: 'Jane Smith' },
276
+ { id: 3, name: 'Bob Johnson' }
277
+ ];
278
+
279
+ // ✅ CORRECT: Test rendering with props
280
+ it('should render all users from props', () => {
281
+ const wrapper = mount(UserList, {
282
+ props: {
283
+ users: mockUsers
284
+ }
285
+ });
286
+
287
+ const items = wrapper.findAll('li');
288
+ expect(items).toHaveLength(3);
289
+
290
+ expect(wrapper.text()).toContain('John Doe');
291
+ expect(wrapper.text()).toContain('Jane Smith');
292
+ expect(wrapper.text()).toContain('Bob Johnson');
293
+ });
294
+
295
+ // ✅ CORRECT: Test empty state
296
+ it('should show "No users" message when list is empty', () => {
297
+ const wrapper = mount(UserList, {
298
+ props: {
299
+ users: []
300
+ }
301
+ });
302
+
303
+ expect(wrapper.text()).toContain('No users found');
304
+ expect(wrapper.findAll('li')).toHaveLength(0);
305
+ });
306
+
307
+ // ✅ CORRECT: Test event emission with data
308
+ it('should emit user-click event with user data', async () => {
309
+ const wrapper = mount(UserList, {
310
+ props: {
311
+ users: mockUsers
312
+ }
313
+ });
314
+
315
+ // Click on second user button
316
+ const buttons = wrapper.findAll('button');
317
+ await buttons[1].trigger('click');
318
+
319
+ expect(wrapper.emitted('user-click')).toBeTruthy();
320
+ expect(wrapper.emitted('user-click')[0][0]).toEqual({
321
+ id: 2,
322
+ name: 'Jane Smith'
323
+ });
324
+ });
325
+
326
+ // ✅ CORRECT: Test conditional rendering
327
+ it('should not render list when users array is empty', () => {
328
+ const wrapper = mount(UserList, {
329
+ props: { users: [] }
330
+ });
331
+
332
+ expect(wrapper.find('ul').exists()).toBe(false);
333
+ expect(wrapper.find('p').exists()).toBe(true);
334
+ });
335
+ });
336
+
337
+ // ===================================
338
+ // TEST SUITE 4: COUNTER (STATE & COMPUTED)
339
+ // ===================================
340
+
341
+ describe('Counter Component', () => {
342
+ // ✅ CORRECT: Test initial state
343
+ it('should have initial count of 0', () => {
344
+ const wrapper = mount(Counter);
345
+
346
+ expect(wrapper.vm.count).toBe(0);
347
+ expect(wrapper.find('.count').text()).toBe('Count: 0');
348
+ });
349
+
350
+ // ✅ CORRECT: Test computed properties
351
+ it('should calculate double count correctly', () => {
352
+ const wrapper = mount(Counter);
353
+
354
+ expect(wrapper.vm.doubleCount).toBe(0);
355
+ expect(wrapper.find('.double').text()).toBe('Double: 0');
356
+ });
357
+
358
+ // ✅ CORRECT: Test increment method
359
+ it('should increment count when + button clicked', async () => {
360
+ const wrapper = mount(Counter);
361
+
362
+ await wrapper.find('.increment').trigger('click');
363
+
364
+ expect(wrapper.vm.count).toBe(1);
365
+ expect(wrapper.find('.count').text()).toBe('Count: 1');
366
+ expect(wrapper.find('.double').text()).toBe('Double: 2');
367
+ });
368
+
369
+ // ✅ CORRECT: Test decrement method
370
+ it('should decrement count when - button clicked', async () => {
371
+ const wrapper = mount(Counter);
372
+
373
+ // Set initial count
374
+ await wrapper.setData({ count: 5 });
375
+
376
+ await wrapper.find('.decrement').trigger('click');
377
+
378
+ expect(wrapper.vm.count).toBe(4);
379
+ });
380
+
381
+ // ✅ CORRECT: Test reset method
382
+ it('should reset count to 0', async () => {
383
+ const wrapper = mount(Counter);
384
+
385
+ await wrapper.setData({ count: 10 });
386
+ await wrapper.find('.reset').trigger('click');
387
+
388
+ expect(wrapper.vm.count).toBe(0);
389
+ });
390
+ });
391
+
392
+ // ===================================
393
+ // TEST SUITE 5: ASYNC OPERATIONS
394
+ // ===================================
395
+
396
+ const AsyncUserList = {
397
+ name: 'AsyncUserList',
398
+ data() {
399
+ return {
400
+ users: [],
401
+ loading: true,
402
+ error: null
403
+ };
404
+ },
405
+ async mounted() {
406
+ try {
407
+ const response = await fetch('/api/users');
408
+ this.users = await response.json();
409
+ } catch (err) {
410
+ this.error = err.message;
411
+ } finally {
412
+ this.loading = false;
413
+ }
414
+ },
415
+ template: `
416
+ <div>
417
+ <div v-if="loading">Loading...</div>
418
+ <div v-else-if="error" class="error">Error: {{ error }}</div>
419
+ <UserList v-else :users="users" />
420
+ </div>
421
+ `,
422
+ components: { UserList }
423
+ };
424
+
425
+ describe('AsyncUserList Component', () => {
426
+ // Mock fetch
427
+ beforeEach(() => {
428
+ global.fetch = vi.fn();
429
+ });
430
+
431
+ afterEach(() => {
432
+ vi.restoreAllMocks();
433
+ });
434
+
435
+ // ✅ CORRECT: Test loading state
436
+ it('should show loading state initially', () => {
437
+ const wrapper = mount(AsyncUserList);
438
+
439
+ expect(wrapper.text()).toContain('Loading...');
440
+ });
441
+
442
+ // ✅ CORRECT: Test successful data fetch
443
+ it('should display users after successful fetch', async () => {
444
+ const mockUsers = [
445
+ { id: 1, name: 'John Doe' },
446
+ { id: 2, name: 'Jane Smith' }
447
+ ];
448
+
449
+ global.fetch.mockResolvedValue({
450
+ json: () => Promise.resolve(mockUsers)
451
+ });
452
+
453
+ const wrapper = mount(AsyncUserList);
454
+
455
+ // Wait for all promises to resolve
456
+ await flushPromises();
457
+
458
+ expect(wrapper.text()).not.toContain('Loading...');
459
+ expect(wrapper.text()).toContain('John Doe');
460
+ expect(wrapper.text()).toContain('Jane Smith');
461
+ });
462
+
463
+ // ✅ CORRECT: Test error handling
464
+ it('should display error message on fetch failure', async () => {
465
+ global.fetch.mockRejectedValue(new Error('Network error'));
466
+
467
+ const wrapper = mount(AsyncUserList);
468
+
469
+ await flushPromises();
470
+
471
+ expect(wrapper.find('.error').text()).toContain('Error: Network error');
472
+ });
473
+ });
474
+
475
+ // ===================================
476
+ // TEST SUITE 6: PINIA STORE INTEGRATION
477
+ // ===================================
478
+
479
+ const ComponentWithStore = {
480
+ name: 'ComponentWithStore',
481
+ setup() {
482
+ const store = useUserStore();
483
+ return { store };
484
+ },
485
+ template: `
486
+ <div>
487
+ <p>User: {{ store.currentUser?.name }}</p>
488
+ <button @click="store.setUser({ id: 1, name: 'Test User' })">
489
+ Set User
490
+ </button>
491
+ </div>
492
+ `
493
+ };
494
+
495
+ describe('Component with Pinia Store', () => {
496
+ // ✅ CORRECT: Test with Pinia testing utilities
497
+ it('should interact with Pinia store', async () => {
498
+ const wrapper = mount(ComponentWithStore, {
499
+ global: {
500
+ plugins: [
501
+ createTestingPinia({
502
+ createSpy: vi.fn,
503
+ initialState: {
504
+ user: {
505
+ currentUser: null
506
+ }
507
+ }
508
+ })
509
+ ]
510
+ }
511
+ });
512
+
513
+ // Initially no user
514
+ expect(wrapper.text()).toContain('User:');
515
+
516
+ // Click button to set user
517
+ await wrapper.find('button').trigger('click');
518
+
519
+ // Check if store action was called
520
+ const store = useUserStore();
521
+ expect(store.setUser).toHaveBeenCalledWith({
522
+ id: 1,
523
+ name: 'Test User'
524
+ });
525
+ });
526
+ });
527
+
528
+ // ===================================
529
+ // BEST PRACTICES DEMONSTRATED
530
+ // ===================================
531
+
532
+ /**
533
+ * ✅ MOUNTING OPTIONS (Context7-verified):
534
+ * - props: Pass props to component
535
+ * - slots: Provide slot content
536
+ * - data: Override component data
537
+ * - global: Global plugins, directives, mixins
538
+ *
539
+ * ✅ ASYNC UTILITIES:
540
+ * - flushPromises() (wait for all promises)
541
+ * - nextTick() (wait for DOM updates)
542
+ * - await wrapper.vm.$nextTick()
543
+ *
544
+ * ✅ WRAPPER METHODS:
545
+ * - find(selector) - Find first element
546
+ * - findAll(selector) - Find all elements
547
+ * - trigger(event) - Trigger event
548
+ * - setValue(value) - Set input value
549
+ * - setData(data) - Update component data
550
+ *
551
+ * ✅ ASSERTIONS:
552
+ * - wrapper.text() - Get text content
553
+ * - wrapper.html() - Get HTML
554
+ * - wrapper.vm - Access Vue instance
555
+ * - wrapper.emitted() - Check emitted events
556
+ * - wrapper.exists() - Check if exists
557
+ *
558
+ * ✅ TEST INDEPENDENCE:
559
+ * - beforeEach for setup
560
+ * - afterEach for cleanup
561
+ * - No shared mutable state
562
+ */
563
+
564
+ /**
565
+ * ❌ ANTI-PATTERNS TO AVOID:
566
+ *
567
+ * ❌ Don't use shallow rendering unnecessarily:
568
+ * shallow(Component) // Prefer mount()
569
+ *
570
+ * ❌ Don't test Vue internals:
571
+ * wrapper.vm.$options
572
+ * wrapper.vm._data
573
+ *
574
+ * ❌ Don't forget to await:
575
+ * wrapper.find('button').trigger('click')
576
+ * expect(...) // Should await trigger()
577
+ *
578
+ * ❌ Don't forget flushPromises:
579
+ * await fetch('/api')
580
+ * expect(wrapper.text()) // Need flushPromises()
581
+ *
582
+ * ❌ Don't depend on test order:
583
+ * let wrapper = null;
584
+ * test('1', () => { wrapper = mount(...); });
585
+ * test('2', () => { wrapper.find(...); });
586
+ */