claude-autopm 2.8.1 → 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 (450) hide show
  1. package/README.md +399 -529
  2. package/bin/autopm.js +2 -0
  3. package/bin/commands/plugin.js +395 -0
  4. package/bin/commands/team.js +184 -10
  5. package/install/install.js +223 -4
  6. package/lib/plugins/PluginManager.js +1328 -0
  7. package/lib/plugins/PluginManager.old.js +400 -0
  8. package/package.json +5 -1
  9. package/packages/plugin-ai/LICENSE +21 -0
  10. package/packages/plugin-ai/README.md +316 -0
  11. package/packages/plugin-ai/agents/anthropic-claude-expert.md +579 -0
  12. package/packages/plugin-ai/agents/azure-openai-expert.md +1411 -0
  13. package/packages/plugin-ai/agents/google-a2a-expert.md +1445 -0
  14. package/packages/plugin-ai/agents/huggingface-expert.md +2131 -0
  15. package/packages/plugin-ai/agents/langchain-expert.md +1427 -0
  16. package/packages/plugin-ai/commands/a2a-setup.md +886 -0
  17. package/packages/plugin-ai/commands/ai-model-deployment.md +481 -0
  18. package/packages/plugin-ai/commands/anthropic-optimize.md +793 -0
  19. package/packages/plugin-ai/commands/huggingface-deploy.md +789 -0
  20. package/packages/plugin-ai/commands/langchain-optimize.md +807 -0
  21. package/packages/plugin-ai/commands/llm-optimize.md +348 -0
  22. package/packages/plugin-ai/commands/openai-optimize.md +863 -0
  23. package/packages/plugin-ai/commands/rag-optimize.md +841 -0
  24. package/packages/plugin-ai/commands/rag-setup-scaffold.md +382 -0
  25. package/packages/plugin-ai/package.json +66 -0
  26. package/packages/plugin-ai/plugin.json +519 -0
  27. package/packages/plugin-ai/rules/ai-model-standards.md +449 -0
  28. package/packages/plugin-ai/rules/prompt-engineering-standards.md +509 -0
  29. package/packages/plugin-ai/scripts/examples/huggingface-inference-example.py +145 -0
  30. package/packages/plugin-ai/scripts/examples/langchain-rag-example.py +366 -0
  31. package/packages/plugin-ai/scripts/examples/mlflow-tracking-example.py +224 -0
  32. package/packages/plugin-ai/scripts/examples/openai-chat-example.py +425 -0
  33. package/packages/plugin-cloud/README.md +268 -0
  34. package/packages/plugin-cloud/agents/gemini-api-expert.md +880 -0
  35. package/packages/plugin-cloud/agents/openai-python-expert.md +1087 -0
  36. package/packages/plugin-cloud/commands/cloud-cost-optimize.md +243 -0
  37. package/packages/plugin-cloud/commands/cloud-validate.md +196 -0
  38. package/packages/plugin-cloud/hooks/pre-cloud-deploy.js +456 -0
  39. package/packages/plugin-cloud/package.json +64 -0
  40. package/packages/plugin-cloud/plugin.json +338 -0
  41. package/packages/plugin-cloud/rules/cloud-security-compliance.md +313 -0
  42. package/packages/plugin-cloud/scripts/examples/aws-validate.sh +30 -0
  43. package/packages/plugin-cloud/scripts/examples/azure-setup.sh +33 -0
  44. package/packages/plugin-cloud/scripts/examples/gcp-setup.sh +39 -0
  45. package/packages/plugin-cloud/scripts/examples/k8s-validate.sh +40 -0
  46. package/packages/plugin-cloud/scripts/examples/terraform-init.sh +26 -0
  47. package/packages/plugin-core/README.md +274 -0
  48. package/packages/plugin-core/commands/code-rabbit.md +128 -0
  49. package/packages/plugin-core/commands/prompt.md +9 -0
  50. package/packages/plugin-core/commands/re-init.md +9 -0
  51. package/packages/plugin-core/hooks/context7-reminder.md +29 -0
  52. package/packages/plugin-core/hooks/enforce-agents.js +125 -0
  53. package/packages/plugin-core/hooks/enforce-agents.sh +35 -0
  54. package/packages/plugin-core/hooks/pre-agent-context7.js +224 -0
  55. package/packages/plugin-core/hooks/pre-command-context7.js +229 -0
  56. package/packages/plugin-core/hooks/strict-enforce-agents.sh +39 -0
  57. package/packages/plugin-core/hooks/test-hook.sh +21 -0
  58. package/packages/plugin-core/hooks/unified-context7-enforcement.sh +38 -0
  59. package/packages/plugin-core/package.json +45 -0
  60. package/packages/plugin-core/plugin.json +387 -0
  61. package/packages/plugin-core/rules/agent-coordination.md +549 -0
  62. package/packages/plugin-core/rules/agent-mandatory.md +170 -0
  63. package/packages/plugin-core/rules/command-pipelines.md +208 -0
  64. package/packages/plugin-core/rules/context-optimization.md +176 -0
  65. package/packages/plugin-core/rules/context7-enforcement.md +327 -0
  66. package/packages/plugin-core/rules/datetime.md +122 -0
  67. package/packages/plugin-core/rules/definition-of-done.md +272 -0
  68. package/packages/plugin-core/rules/development-environments.md +19 -0
  69. package/packages/plugin-core/rules/development-workflow.md +198 -0
  70. package/packages/plugin-core/rules/framework-path-rules.md +180 -0
  71. package/packages/plugin-core/rules/frontmatter-operations.md +64 -0
  72. package/packages/plugin-core/rules/git-strategy.md +237 -0
  73. package/packages/plugin-core/rules/golden-rules.md +181 -0
  74. package/packages/plugin-core/rules/naming-conventions.md +111 -0
  75. package/packages/plugin-core/rules/no-pr-workflow.md +183 -0
  76. package/packages/plugin-core/rules/pipeline-mandatory.md +109 -0
  77. package/packages/plugin-core/rules/security-checklist.md +318 -0
  78. package/packages/plugin-core/rules/standard-patterns.md +197 -0
  79. package/packages/plugin-core/rules/strip-frontmatter.md +85 -0
  80. package/packages/plugin-core/rules/tdd.enforcement.md +103 -0
  81. package/packages/plugin-core/rules/use-ast-grep.md +113 -0
  82. package/packages/plugin-core/scripts/lib/datetime-utils.sh +254 -0
  83. package/packages/plugin-core/scripts/lib/frontmatter-utils.sh +294 -0
  84. package/packages/plugin-core/scripts/lib/github-utils.sh +221 -0
  85. package/packages/plugin-core/scripts/lib/logging-utils.sh +199 -0
  86. package/packages/plugin-core/scripts/lib/validation-utils.sh +339 -0
  87. package/packages/plugin-core/scripts/mcp/add.sh +7 -0
  88. package/packages/plugin-core/scripts/mcp/disable.sh +12 -0
  89. package/packages/plugin-core/scripts/mcp/enable.sh +12 -0
  90. package/packages/plugin-core/scripts/mcp/list.sh +7 -0
  91. package/packages/plugin-core/scripts/mcp/sync.sh +8 -0
  92. package/packages/plugin-data/README.md +315 -0
  93. package/packages/plugin-data/agents/airflow-orchestration-expert.md +158 -0
  94. package/packages/plugin-data/agents/kedro-pipeline-expert.md +304 -0
  95. package/packages/plugin-data/agents/langgraph-workflow-expert.md +530 -0
  96. package/packages/plugin-data/commands/airflow-dag-scaffold.md +413 -0
  97. package/packages/plugin-data/commands/kafka-pipeline-scaffold.md +503 -0
  98. package/packages/plugin-data/package.json +66 -0
  99. package/packages/plugin-data/plugin.json +294 -0
  100. package/packages/plugin-data/rules/data-quality-standards.md +373 -0
  101. package/packages/plugin-data/rules/etl-pipeline-standards.md +255 -0
  102. package/packages/plugin-data/scripts/examples/airflow-dag-example.py +245 -0
  103. package/packages/plugin-data/scripts/examples/dbt-transform-example.sql +238 -0
  104. package/packages/plugin-data/scripts/examples/kafka-streaming-example.py +257 -0
  105. package/packages/plugin-data/scripts/examples/pandas-etl-example.py +332 -0
  106. package/packages/plugin-databases/README.md +330 -0
  107. package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/bigquery-expert.md +24 -15
  108. package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/cosmosdb-expert.md +22 -15
  109. package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/mongodb-expert.md +24 -15
  110. package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/postgresql-expert.md +23 -15
  111. package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/redis-expert.md +29 -7
  112. package/packages/plugin-databases/commands/db-optimize.md +612 -0
  113. package/packages/plugin-databases/package.json +60 -0
  114. package/packages/plugin-databases/plugin.json +237 -0
  115. package/packages/plugin-databases/rules/database-management-strategy.md +146 -0
  116. package/packages/plugin-databases/rules/database-pipeline.md +316 -0
  117. package/packages/plugin-databases/scripts/examples/bigquery-cost-analyze.sh +160 -0
  118. package/packages/plugin-databases/scripts/examples/cosmosdb-ru-optimize.sh +163 -0
  119. package/packages/plugin-databases/scripts/examples/mongodb-shard-check.sh +120 -0
  120. package/packages/plugin-databases/scripts/examples/postgres-index-analyze.sh +95 -0
  121. package/packages/plugin-databases/scripts/examples/redis-cache-stats.sh +121 -0
  122. package/packages/plugin-devops/README.md +367 -0
  123. package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/github-operations-specialist.md +1 -1
  124. package/packages/plugin-devops/commands/ci-pipeline-create.md +581 -0
  125. package/packages/plugin-devops/commands/docker-optimize.md +493 -0
  126. package/packages/plugin-devops/hooks/pre-docker-build.js +472 -0
  127. package/packages/plugin-devops/package.json +61 -0
  128. package/packages/plugin-devops/plugin.json +302 -0
  129. package/packages/plugin-devops/rules/github-operations.md +92 -0
  130. package/packages/plugin-devops/scripts/examples/docker-build-multistage.sh +43 -0
  131. package/packages/plugin-devops/scripts/examples/docker-compose-validate.sh +74 -0
  132. package/packages/plugin-devops/scripts/examples/github-workflow-validate.sh +48 -0
  133. package/packages/plugin-devops/scripts/examples/prometheus-health-check.sh +58 -0
  134. package/packages/plugin-devops/scripts/examples/ssh-key-setup.sh +74 -0
  135. package/packages/plugin-frameworks/README.md +309 -0
  136. package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/e2e-test-engineer.md +219 -0
  137. package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/react-frontend-engineer.md +176 -0
  138. package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/tailwindcss-expert.md +251 -0
  139. package/packages/plugin-frameworks/commands/nextjs-optimize.md +692 -0
  140. package/packages/plugin-frameworks/commands/react-optimize.md +583 -0
  141. package/packages/plugin-frameworks/package.json +59 -0
  142. package/packages/plugin-frameworks/plugin.json +224 -0
  143. package/packages/plugin-frameworks/rules/performance-guidelines.md +403 -0
  144. package/packages/plugin-frameworks/scripts/examples/react-component-perf.sh +34 -0
  145. package/packages/plugin-frameworks/scripts/examples/tailwind-optimize.sh +44 -0
  146. package/packages/plugin-frameworks/scripts/examples/vue-composition-check.sh +41 -0
  147. package/packages/plugin-languages/README.md +333 -0
  148. package/packages/plugin-languages/commands/javascript-optimize.md +636 -0
  149. package/packages/plugin-languages/commands/nodejs-api-scaffold.md +341 -0
  150. package/packages/plugin-languages/commands/nodejs-optimize.md +689 -0
  151. package/packages/plugin-languages/commands/python-api-scaffold.md +261 -0
  152. package/packages/plugin-languages/commands/python-optimize.md +593 -0
  153. package/packages/plugin-languages/package.json +65 -0
  154. package/packages/plugin-languages/plugin.json +265 -0
  155. package/packages/plugin-languages/rules/code-quality-standards.md +496 -0
  156. package/packages/plugin-languages/rules/testing-standards.md +768 -0
  157. package/packages/plugin-languages/scripts/examples/bash-production-script.sh +520 -0
  158. package/packages/plugin-languages/scripts/examples/javascript-es6-patterns.js +291 -0
  159. package/packages/plugin-languages/scripts/examples/nodejs-async-iteration.js +360 -0
  160. package/packages/plugin-languages/scripts/examples/python-async-patterns.py +289 -0
  161. package/packages/plugin-languages/scripts/examples/typescript-patterns.ts +432 -0
  162. package/packages/plugin-ml/README.md +430 -0
  163. package/packages/plugin-ml/agents/automl-expert.md +326 -0
  164. package/packages/plugin-ml/agents/computer-vision-expert.md +550 -0
  165. package/packages/plugin-ml/agents/gradient-boosting-expert.md +455 -0
  166. package/packages/plugin-ml/agents/neural-network-architect.md +1228 -0
  167. package/packages/plugin-ml/agents/nlp-transformer-expert.md +584 -0
  168. package/packages/plugin-ml/agents/pytorch-expert.md +412 -0
  169. package/packages/plugin-ml/agents/reinforcement-learning-expert.md +2088 -0
  170. package/packages/plugin-ml/agents/scikit-learn-expert.md +228 -0
  171. package/packages/plugin-ml/agents/tensorflow-keras-expert.md +509 -0
  172. package/packages/plugin-ml/agents/time-series-expert.md +303 -0
  173. package/packages/plugin-ml/commands/ml-automl.md +572 -0
  174. package/packages/plugin-ml/commands/ml-train-optimize.md +657 -0
  175. package/packages/plugin-ml/package.json +52 -0
  176. package/packages/plugin-ml/plugin.json +338 -0
  177. package/packages/plugin-pm/README.md +368 -0
  178. package/packages/plugin-pm/claudeautopm-plugin-pm-2.0.0.tgz +0 -0
  179. package/packages/plugin-pm/commands/github/workflow-create.md +42 -0
  180. package/packages/plugin-pm/package.json +57 -0
  181. package/packages/plugin-pm/plugin.json +503 -0
  182. package/packages/plugin-testing/README.md +401 -0
  183. package/{autopm/.claude/agents/testing → packages/plugin-testing/agents}/frontend-testing-engineer.md +373 -0
  184. package/packages/plugin-testing/commands/jest-optimize.md +800 -0
  185. package/packages/plugin-testing/commands/playwright-optimize.md +887 -0
  186. package/packages/plugin-testing/commands/test-coverage.md +512 -0
  187. package/packages/plugin-testing/commands/test-performance.md +1041 -0
  188. package/packages/plugin-testing/commands/test-setup.md +414 -0
  189. package/packages/plugin-testing/package.json +40 -0
  190. package/packages/plugin-testing/plugin.json +197 -0
  191. package/packages/plugin-testing/rules/test-coverage-requirements.md +581 -0
  192. package/packages/plugin-testing/rules/testing-standards.md +529 -0
  193. package/packages/plugin-testing/scripts/examples/react-testing-example.test.jsx +460 -0
  194. package/packages/plugin-testing/scripts/examples/vitest-config-example.js +352 -0
  195. package/packages/plugin-testing/scripts/examples/vue-testing-example.test.js +586 -0
  196. package/scripts/publish-plugins.sh +166 -0
  197. package/autopm/.claude/agents/data/airflow-orchestration-expert.md +0 -52
  198. package/autopm/.claude/agents/data/kedro-pipeline-expert.md +0 -50
  199. package/autopm/.claude/agents/integration/message-queue-engineer.md +0 -794
  200. package/autopm/.claude/commands/ai/langgraph-workflow.md +0 -65
  201. package/autopm/.claude/commands/ai/openai-chat.md +0 -65
  202. package/autopm/.claude/commands/playwright/test-scaffold.md +0 -38
  203. package/autopm/.claude/commands/python/api-scaffold.md +0 -50
  204. package/autopm/.claude/commands/python/docs-query.md +0 -48
  205. package/autopm/.claude/commands/testing/prime.md +0 -314
  206. package/autopm/.claude/commands/testing/run.md +0 -125
  207. package/autopm/.claude/commands/ui/bootstrap-scaffold.md +0 -65
  208. package/autopm/.claude/rules/database-management-strategy.md +0 -17
  209. package/autopm/.claude/rules/database-pipeline.md +0 -94
  210. package/autopm/.claude/rules/ux-design-rules.md +0 -209
  211. package/autopm/.claude/rules/visual-testing.md +0 -223
  212. package/autopm/.claude/scripts/azure/README.md +0 -192
  213. package/autopm/.claude/scripts/azure/active-work.js +0 -524
  214. package/autopm/.claude/scripts/azure/active-work.sh +0 -20
  215. package/autopm/.claude/scripts/azure/blocked.js +0 -520
  216. package/autopm/.claude/scripts/azure/blocked.sh +0 -20
  217. package/autopm/.claude/scripts/azure/daily.js +0 -533
  218. package/autopm/.claude/scripts/azure/daily.sh +0 -20
  219. package/autopm/.claude/scripts/azure/dashboard.js +0 -970
  220. package/autopm/.claude/scripts/azure/dashboard.sh +0 -20
  221. package/autopm/.claude/scripts/azure/feature-list.js +0 -254
  222. package/autopm/.claude/scripts/azure/feature-list.sh +0 -20
  223. package/autopm/.claude/scripts/azure/feature-show.js +0 -7
  224. package/autopm/.claude/scripts/azure/feature-show.sh +0 -20
  225. package/autopm/.claude/scripts/azure/feature-status.js +0 -604
  226. package/autopm/.claude/scripts/azure/feature-status.sh +0 -20
  227. package/autopm/.claude/scripts/azure/help.js +0 -342
  228. package/autopm/.claude/scripts/azure/help.sh +0 -20
  229. package/autopm/.claude/scripts/azure/next-task.js +0 -508
  230. package/autopm/.claude/scripts/azure/next-task.sh +0 -20
  231. package/autopm/.claude/scripts/azure/search.js +0 -469
  232. package/autopm/.claude/scripts/azure/search.sh +0 -20
  233. package/autopm/.claude/scripts/azure/setup.js +0 -745
  234. package/autopm/.claude/scripts/azure/setup.sh +0 -20
  235. package/autopm/.claude/scripts/azure/sprint-report.js +0 -1012
  236. package/autopm/.claude/scripts/azure/sprint-report.sh +0 -20
  237. package/autopm/.claude/scripts/azure/sync.js +0 -563
  238. package/autopm/.claude/scripts/azure/sync.sh +0 -20
  239. package/autopm/.claude/scripts/azure/us-list.js +0 -210
  240. package/autopm/.claude/scripts/azure/us-list.sh +0 -20
  241. package/autopm/.claude/scripts/azure/us-status.js +0 -238
  242. package/autopm/.claude/scripts/azure/us-status.sh +0 -20
  243. package/autopm/.claude/scripts/azure/validate.js +0 -626
  244. package/autopm/.claude/scripts/azure/validate.sh +0 -20
  245. package/autopm/.claude/scripts/azure/wrapper-template.sh +0 -20
  246. package/autopm/.claude/scripts/github/dependency-tracker.js +0 -554
  247. package/autopm/.claude/scripts/github/dependency-validator.js +0 -545
  248. package/autopm/.claude/scripts/github/dependency-visualizer.js +0 -477
  249. package/bin/node/azure-feature-show.js +0 -7
  250. /package/{autopm/.claude/agents/cloud → packages/plugin-ai/agents}/gemini-api-expert.md +0 -0
  251. /package/{autopm/.claude/agents/data → packages/plugin-ai/agents}/langgraph-workflow-expert.md +0 -0
  252. /package/{autopm/.claude/agents/cloud → packages/plugin-ai/agents}/openai-python-expert.md +0 -0
  253. /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/README.md +0 -0
  254. /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/aws-cloud-architect.md +0 -0
  255. /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/azure-cloud-architect.md +0 -0
  256. /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/gcp-cloud-architect.md +0 -0
  257. /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/gcp-cloud-functions-engineer.md +0 -0
  258. /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/kubernetes-orchestrator.md +0 -0
  259. /package/{autopm/.claude/agents/cloud → packages/plugin-cloud/agents}/terraform-infrastructure-expert.md +0 -0
  260. /package/{autopm/.claude/commands/cloud → packages/plugin-cloud/commands}/infra-deploy.md +0 -0
  261. /package/{autopm/.claude/commands/kubernetes/deploy.md → packages/plugin-cloud/commands/k8s-deploy.md} +0 -0
  262. /package/{autopm/.claude/commands/infrastructure → packages/plugin-cloud/commands}/ssh-security.md +0 -0
  263. /package/{autopm/.claude/commands/infrastructure → packages/plugin-cloud/commands}/traefik-setup.md +0 -0
  264. /package/{autopm/.claude → packages/plugin-cloud}/rules/infrastructure-pipeline.md +0 -0
  265. /package/{autopm/.claude → packages/plugin-core}/agents/core/agent-manager.md +0 -0
  266. /package/{autopm/.claude → packages/plugin-core}/agents/core/code-analyzer.md +0 -0
  267. /package/{autopm/.claude → packages/plugin-core}/agents/core/file-analyzer.md +0 -0
  268. /package/{autopm/.claude → packages/plugin-core}/agents/core/test-runner.md +0 -0
  269. /package/{autopm/.claude → packages/plugin-core}/rules/ai-integration-patterns.md +0 -0
  270. /package/{autopm/.claude → packages/plugin-core}/rules/performance-guidelines.md +0 -0
  271. /package/{autopm/.claude/agents/databases → packages/plugin-databases/agents}/README.md +0 -0
  272. /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/README.md +0 -0
  273. /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/azure-devops-specialist.md +0 -0
  274. /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/docker-containerization-expert.md +0 -0
  275. /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/mcp-context-manager.md +0 -0
  276. /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/observability-engineer.md +0 -0
  277. /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/ssh-operations-expert.md +0 -0
  278. /package/{autopm/.claude/agents/devops → packages/plugin-devops/agents}/traefik-proxy-expert.md +0 -0
  279. /package/{autopm/.claude/commands/github → packages/plugin-devops/commands}/workflow-create.md +0 -0
  280. /package/{autopm/.claude → packages/plugin-devops}/rules/ci-cd-kubernetes-strategy.md +0 -0
  281. /package/{autopm/.claude → packages/plugin-devops}/rules/devops-troubleshooting-playbook.md +0 -0
  282. /package/{autopm/.claude → packages/plugin-devops}/rules/docker-first-development.md +0 -0
  283. /package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/README.md +0 -0
  284. /package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/nats-messaging-expert.md +0 -0
  285. /package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/react-ui-expert.md +0 -0
  286. /package/{autopm/.claude/agents/frameworks → packages/plugin-frameworks/agents}/ux-design-expert.md +0 -0
  287. /package/{autopm/.claude/commands/react → packages/plugin-frameworks/commands}/app-scaffold.md +0 -0
  288. /package/{autopm/.claude/commands/ui → packages/plugin-frameworks/commands}/tailwind-system.md +0 -0
  289. /package/{autopm/.claude → packages/plugin-frameworks}/rules/ui-development-standards.md +0 -0
  290. /package/{autopm/.claude → packages/plugin-frameworks}/rules/ui-framework-rules.md +0 -0
  291. /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/README.md +0 -0
  292. /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/bash-scripting-expert.md +0 -0
  293. /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/javascript-frontend-engineer.md +0 -0
  294. /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/nodejs-backend-engineer.md +0 -0
  295. /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/python-backend-engineer.md +0 -0
  296. /package/{autopm/.claude/agents/languages → packages/plugin-languages/agents}/python-backend-expert.md +0 -0
  297. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/COMMANDS.md +0 -0
  298. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/COMMAND_MAPPING.md +0 -0
  299. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/INTEGRATION_FIX.md +0 -0
  300. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/README.md +0 -0
  301. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/active-work.md +0 -0
  302. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/aliases.md +0 -0
  303. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/blocked-items.md +0 -0
  304. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/clean.md +0 -0
  305. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/docs-query.md +0 -0
  306. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-decompose.md +0 -0
  307. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-list.md +0 -0
  308. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-new.md +0 -0
  309. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-show.md +0 -0
  310. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/feature-start.md +0 -0
  311. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/fix-integration-example.md +0 -0
  312. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/help.md +0 -0
  313. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/import-us.md +0 -0
  314. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/init.md +0 -0
  315. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/next-task.md +0 -0
  316. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/search.md +0 -0
  317. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/sprint-status.md +0 -0
  318. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/standup.md +0 -0
  319. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/sync-all.md +0 -0
  320. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-analyze.md +0 -0
  321. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-close.md +0 -0
  322. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-edit.md +0 -0
  323. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-list.md +0 -0
  324. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-new.md +0 -0
  325. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-reopen.md +0 -0
  326. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-show.md +0 -0
  327. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-start.md +0 -0
  328. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-status.md +0 -0
  329. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/task-sync.md +0 -0
  330. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-edit.md +0 -0
  331. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-list.md +0 -0
  332. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-new.md +0 -0
  333. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-parse.md +0 -0
  334. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-show.md +0 -0
  335. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/us-status.md +0 -0
  336. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/validate.md +0 -0
  337. /package/{autopm/.claude → packages/plugin-pm}/commands/azure/work-item-sync.md +0 -0
  338. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/blocked.md +0 -0
  339. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/clean.md +0 -0
  340. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/context-create.md +0 -0
  341. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/context-prime.md +0 -0
  342. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/context-update.md +0 -0
  343. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/context.md +0 -0
  344. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-close.md +0 -0
  345. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-decompose.md +0 -0
  346. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-edit.md +0 -0
  347. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-list.md +0 -0
  348. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-merge.md +0 -0
  349. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-oneshot.md +0 -0
  350. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-refresh.md +0 -0
  351. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-show.md +0 -0
  352. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-split.md +0 -0
  353. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-start.md +0 -0
  354. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-status.md +0 -0
  355. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-sync-modular.md +0 -0
  356. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-sync-original.md +0 -0
  357. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/epic-sync.md +0 -0
  358. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/help.md +0 -0
  359. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/import.md +0 -0
  360. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/in-progress.md +0 -0
  361. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/init.md +0 -0
  362. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-analyze.md +0 -0
  363. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-close.md +0 -0
  364. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-edit.md +0 -0
  365. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-reopen.md +0 -0
  366. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-show.md +0 -0
  367. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-start.md +0 -0
  368. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-status.md +0 -0
  369. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/issue-sync.md +0 -0
  370. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/next.md +0 -0
  371. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-edit.md +0 -0
  372. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-list.md +0 -0
  373. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-new.md +0 -0
  374. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-parse.md +0 -0
  375. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/prd-status.md +0 -0
  376. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/search.md +0 -0
  377. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/standup.md +0 -0
  378. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/status.md +0 -0
  379. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/sync.md +0 -0
  380. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/test-reference-update.md +0 -0
  381. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/validate.md +0 -0
  382. /package/{autopm/.claude/commands/pm → packages/plugin-pm/commands}/what-next.md +0 -0
  383. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/analytics.js +0 -0
  384. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/blocked.js +0 -0
  385. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/blocked.sh +0 -0
  386. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/clean.js +0 -0
  387. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/context-create.js +0 -0
  388. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/context-prime.js +0 -0
  389. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/context-update.js +0 -0
  390. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/context.js +0 -0
  391. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-close.js +0 -0
  392. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-edit.js +0 -0
  393. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-list.js +0 -0
  394. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-list.sh +0 -0
  395. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-show.js +0 -0
  396. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-show.sh +0 -0
  397. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-split.js +0 -0
  398. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-start/epic-start.js +0 -0
  399. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-start/epic-start.sh +0 -0
  400. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-status.js +0 -0
  401. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-status.sh +0 -0
  402. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/README.md +0 -0
  403. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/create-epic-issue.sh +0 -0
  404. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/create-task-issues.sh +0 -0
  405. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/update-epic-file.sh +0 -0
  406. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync/update-references.sh +0 -0
  407. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/epic-sync.sh +0 -0
  408. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/help.js +0 -0
  409. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/help.sh +0 -0
  410. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/in-progress.js +0 -0
  411. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/in-progress.sh +0 -0
  412. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/init.js +0 -0
  413. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/init.sh +0 -0
  414. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-close.js +0 -0
  415. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-edit.js +0 -0
  416. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-show.js +0 -0
  417. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-start.js +0 -0
  418. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/format-comment.sh +0 -0
  419. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/gather-updates.sh +0 -0
  420. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/post-comment.sh +0 -0
  421. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/preflight-validation.sh +0 -0
  422. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/issue-sync/update-frontmatter.sh +0 -0
  423. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/lib/README.md +0 -0
  424. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/lib/epic-discovery.js +0 -0
  425. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/lib/logger.js +0 -0
  426. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/next.js +0 -0
  427. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/next.sh +0 -0
  428. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/optimize.js +0 -0
  429. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/pr-create.js +0 -0
  430. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/pr-list.js +0 -0
  431. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-list.js +0 -0
  432. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-list.sh +0 -0
  433. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-new.js +0 -0
  434. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-parse.js +0 -0
  435. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-status.js +0 -0
  436. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/prd-status.sh +0 -0
  437. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/release.js +0 -0
  438. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/search.js +0 -0
  439. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/search.sh +0 -0
  440. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/standup.js +0 -0
  441. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/standup.sh +0 -0
  442. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/status.js +0 -0
  443. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/status.sh +0 -0
  444. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/sync-batch.js +0 -0
  445. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/sync.js +0 -0
  446. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/template-list.js +0 -0
  447. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/template-new.js +0 -0
  448. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/validate.js +0 -0
  449. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/validate.sh +0 -0
  450. /package/{autopm/.claude → packages/plugin-pm}/scripts/pm/what-next.js +0 -0
@@ -0,0 +1,768 @@
1
+ ---
2
+ name: testing-standards
3
+ priority: high
4
+ tags:
5
+ - testing
6
+ - tdd
7
+ - quality
8
+ - coverage
9
+ appliesTo:
10
+ - commands
11
+ - agents
12
+ enforcesOn:
13
+ - python-backend-engineer
14
+ - python-backend-expert
15
+ - nodejs-backend-engineer
16
+ - javascript-frontend-engineer
17
+ - bash-scripting-expert
18
+ ---
19
+
20
+ # Testing Standards Rule
21
+
22
+ **MANDATORY**: All code MUST follow Test-Driven Development (TDD) methodology with comprehensive test coverage.
23
+
24
+ ## Purpose
25
+
26
+ Ensure reliable, maintainable code through:
27
+ - Test-First Development (TDD)
28
+ - Comprehensive test coverage (>80%)
29
+ - Multiple test layers (unit, integration, E2E)
30
+ - Language-specific testing best practices
31
+ - Automated test execution
32
+
33
+ ## Test-Driven Development (TDD) Workflow
34
+
35
+ ### Red-Green-Refactor Cycle (MANDATORY)
36
+
37
+ **1. RED - Write Failing Test First**
38
+ ```
39
+ Write a test that fails ❌
40
+
41
+ Verify the test fails for the right reason
42
+
43
+ Commit the failing test
44
+ ```
45
+
46
+ **2. GREEN - Make it Pass**
47
+ ```
48
+ Write minimal code to pass the test ✅
49
+
50
+ Run tests and verify all pass
51
+
52
+ Commit the passing code
53
+ ```
54
+
55
+ **3. REFACTOR - Improve Code**
56
+ ```
57
+ Improve code quality 🔄
58
+
59
+ Ensure all tests still pass
60
+
61
+ Commit the refactoring
62
+ ```
63
+
64
+ ### TDD Principles
65
+
66
+ - **Test-First**: Always write test before implementation
67
+ - **One Test at a Time**: Focus on single functionality
68
+ - **Minimal Code**: Write only enough code to pass
69
+ - **Refactor Safely**: Improve with test safety net
70
+ - **Fast Feedback**: Run tests continuously
71
+
72
+ ## Language-Specific Testing Standards
73
+
74
+ ### Python Testing (pytest)
75
+
76
+ **Test Structure:**
77
+ ```python
78
+ # tests/test_user_service.py
79
+ import pytest
80
+ from app.services.user_service import UserService
81
+ from app.models.user import User
82
+
83
+ class TestUserService:
84
+ """Test suite for UserService."""
85
+
86
+ # TDD Step 1: RED - Write failing test first
87
+ @pytest.mark.asyncio
88
+ async def test_create_user_success(self, user_service, db_session):
89
+ """
90
+ GIVEN valid user data
91
+ WHEN creating a new user
92
+ THEN user is created and returned with ID
93
+ """
94
+ # Arrange
95
+ user_data = {
96
+ "email": "test@example.com",
97
+ "username": "testuser",
98
+ "password": "securepass123"
99
+ }
100
+
101
+ # Act
102
+ user = await user_service.create_user(user_data)
103
+
104
+ # Assert
105
+ assert user.id is not None
106
+ assert user.email == "test@example.com"
107
+ assert user.username == "testuser"
108
+ assert user.password != "securepass123" # Should be hashed
109
+
110
+ @pytest.mark.asyncio
111
+ async def test_create_user_duplicate_email(self, user_service, db_session):
112
+ """
113
+ GIVEN existing user with email
114
+ WHEN creating user with same email
115
+ THEN raises ValueError
116
+ """
117
+ # Arrange
118
+ existing_user = {"email": "test@example.com", "username": "user1"}
119
+ await user_service.create_user(existing_user)
120
+
121
+ # Act & Assert
122
+ with pytest.raises(ValueError, match="Email already exists"):
123
+ await user_service.create_user({
124
+ "email": "test@example.com",
125
+ "username": "user2"
126
+ })
127
+
128
+ # Fixtures for test setup
129
+ @pytest.fixture
130
+ async def user_service(db_session):
131
+ """Create UserService instance with test database."""
132
+ return UserService(db_session)
133
+
134
+ @pytest.fixture
135
+ async def db_session():
136
+ """Create test database session."""
137
+ # Setup
138
+ async with async_session_maker() as session:
139
+ yield session
140
+ # Teardown
141
+ await session.rollback()
142
+ ```
143
+
144
+ **pytest Configuration:**
145
+ ```toml
146
+ # pyproject.toml
147
+ [tool.pytest.ini_options]
148
+ testpaths = ["tests"]
149
+ python_files = "test_*.py"
150
+ python_classes = "Test*"
151
+ python_functions = "test_*"
152
+ addopts = [
153
+ "--cov=app",
154
+ "--cov-report=html",
155
+ "--cov-report=term-missing",
156
+ "--cov-fail-under=80",
157
+ "-v",
158
+ "--tb=short",
159
+ "--strict-markers",
160
+ "--asyncio-mode=auto"
161
+ ]
162
+ markers = [
163
+ "unit: Unit tests",
164
+ "integration: Integration tests",
165
+ "e2e: End-to-end tests",
166
+ "slow: Slow running tests"
167
+ ]
168
+ ```
169
+
170
+ **Coverage Requirements:**
171
+ - **Minimum**: 80% overall coverage
172
+ - **Critical paths**: 100% coverage
173
+ - **Branch coverage**: Enabled
174
+ - **Report**: HTML + Terminal
175
+
176
+ ### JavaScript/TypeScript Testing (Jest/Vitest)
177
+
178
+ **Test Structure:**
179
+ ```typescript
180
+ // tests/user.service.test.ts
181
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
182
+ import { UserService } from '@/services/user.service';
183
+ import { User } from '@/models/user.model';
184
+
185
+ describe('UserService', () => {
186
+ let userService: UserService;
187
+ let mockRepository: any;
188
+
189
+ beforeEach(() => {
190
+ // Setup fresh mocks for each test
191
+ mockRepository = {
192
+ findById: vi.fn(),
193
+ create: vi.fn(),
194
+ update: vi.fn(),
195
+ delete: vi.fn(),
196
+ };
197
+ userService = new UserService(mockRepository);
198
+ });
199
+
200
+ // TDD Step 1: RED - Write failing test
201
+ describe('createUser', () => {
202
+ it('should create user with hashed password', async () => {
203
+ // Arrange
204
+ const userData = {
205
+ email: 'test@example.com',
206
+ username: 'testuser',
207
+ password: 'securepass123',
208
+ };
209
+
210
+ const expectedUser = {
211
+ id: 1,
212
+ email: userData.email,
213
+ username: userData.username,
214
+ password: 'hashed_password',
215
+ };
216
+
217
+ mockRepository.create.mockResolvedValue(expectedUser);
218
+
219
+ // Act
220
+ const result = await userService.createUser(userData);
221
+
222
+ // Assert
223
+ expect(result.id).toBeDefined();
224
+ expect(result.email).toBe(userData.email);
225
+ expect(result.password).not.toBe(userData.password);
226
+ expect(mockRepository.create).toHaveBeenCalledTimes(1);
227
+ });
228
+
229
+ it('should throw error for duplicate email', async () => {
230
+ // Arrange
231
+ const userData = { email: 'test@example.com', username: 'user' };
232
+ mockRepository.create.mockRejectedValue(
233
+ new Error('Email already exists')
234
+ );
235
+
236
+ // Act & Assert
237
+ await expect(userService.createUser(userData)).rejects.toThrow(
238
+ 'Email already exists'
239
+ );
240
+ });
241
+ });
242
+
243
+ // Integration test example
244
+ describe('Integration: User workflow', () => {
245
+ it('should complete full user lifecycle', async () => {
246
+ // Create → Read → Update → Delete
247
+ const user = await userService.createUser({ /* data */ });
248
+ const found = await userService.findById(user.id);
249
+ const updated = await userService.update(user.id, { /* updates */ });
250
+ await userService.delete(user.id);
251
+
252
+ expect(found).toBeDefined();
253
+ expect(updated.email).toBe(/* expected */);
254
+ });
255
+ });
256
+ });
257
+ ```
258
+
259
+ **Jest/Vitest Configuration:**
260
+ ```typescript
261
+ // vitest.config.ts
262
+ import { defineConfig } from 'vitest/config';
263
+
264
+ export default defineConfig({
265
+ test: {
266
+ globals: true,
267
+ environment: 'node',
268
+ coverage: {
269
+ provider: 'v8',
270
+ reporter: ['text', 'html', 'lcov'],
271
+ exclude: [
272
+ 'node_modules/',
273
+ 'tests/',
274
+ '**/*.test.ts',
275
+ '**/*.spec.ts',
276
+ ],
277
+ statements: 80,
278
+ branches: 80,
279
+ functions: 80,
280
+ lines: 80,
281
+ },
282
+ include: ['tests/**/*.test.ts'],
283
+ setupFiles: ['./tests/setup.ts'],
284
+ },
285
+ });
286
+ ```
287
+
288
+ ### Node.js API Testing (Supertest)
289
+
290
+ **API Test Structure:**
291
+ ```typescript
292
+ // tests/api/users.test.ts
293
+ import request from 'supertest';
294
+ import { app } from '@/app';
295
+ import { setupTestDB, cleanupTestDB } from './helpers/db';
296
+
297
+ describe('User API', () => {
298
+ beforeAll(async () => {
299
+ await setupTestDB();
300
+ });
301
+
302
+ afterAll(async () => {
303
+ await cleanupTestDB();
304
+ });
305
+
306
+ describe('POST /api/users', () => {
307
+ it('should create new user', async () => {
308
+ const response = await request(app)
309
+ .post('/api/users')
310
+ .send({
311
+ email: 'test@example.com',
312
+ username: 'testuser',
313
+ password: 'password123',
314
+ })
315
+ .expect(201);
316
+
317
+ expect(response.body).toHaveProperty('id');
318
+ expect(response.body.email).toBe('test@example.com');
319
+ });
320
+
321
+ it('should return 400 for invalid email', async () => {
322
+ await request(app)
323
+ .post('/api/users')
324
+ .send({
325
+ email: 'invalid-email',
326
+ username: 'testuser',
327
+ })
328
+ .expect(400);
329
+ });
330
+
331
+ it('should return 409 for duplicate email', async () => {
332
+ // First request succeeds
333
+ await request(app)
334
+ .post('/api/users')
335
+ .send({ email: 'test@example.com', username: 'user1' })
336
+ .expect(201);
337
+
338
+ // Second request fails
339
+ await request(app)
340
+ .post('/api/users')
341
+ .send({ email: 'test@example.com', username: 'user2' })
342
+ .expect(409);
343
+ });
344
+ });
345
+
346
+ describe('GET /api/users/:id', () => {
347
+ it('should return user by id', async () => {
348
+ // Create user first
349
+ const createResponse = await request(app)
350
+ .post('/api/users')
351
+ .send({ email: 'get@example.com', username: 'getuser' });
352
+
353
+ const userId = createResponse.body.id;
354
+
355
+ // Get user
356
+ const response = await request(app)
357
+ .get(`/api/users/${userId}`)
358
+ .expect(200);
359
+
360
+ expect(response.body.id).toBe(userId);
361
+ expect(response.body.email).toBe('get@example.com');
362
+ });
363
+
364
+ it('should return 404 for non-existent user', async () => {
365
+ await request(app)
366
+ .get('/api/users/99999')
367
+ .expect(404);
368
+ });
369
+ });
370
+ });
371
+ ```
372
+
373
+ ### Bash Script Testing (bats)
374
+
375
+ **Test Structure:**
376
+ ```bash
377
+ #!/usr/bin/env bats
378
+ # tests/deploy.bats
379
+
380
+ setup() {
381
+ # Test setup
382
+ export TEST_DIR="$(mktemp -d)"
383
+ source ./scripts/deploy.sh
384
+
385
+ # Mock functions
386
+ git() {
387
+ echo "git $*" >> "$TEST_DIR/git.log"
388
+ return 0
389
+ }
390
+ export -f git
391
+ }
392
+
393
+ teardown() {
394
+ # Cleanup
395
+ rm -rf "$TEST_DIR"
396
+ }
397
+
398
+ @test "validate_environment accepts valid env" {
399
+ run validate_environment "production"
400
+ [ "$status" -eq 0 ]
401
+ }
402
+
403
+ @test "validate_environment rejects invalid env" {
404
+ run validate_environment "invalid"
405
+ [ "$status" -eq 1 ]
406
+ [[ "$output" =~ "Invalid environment" ]]
407
+ }
408
+
409
+ @test "check_dependencies finds all required commands" {
410
+ # Mock command availability
411
+ function command() {
412
+ case "$2" in
413
+ git|docker|curl) return 0 ;;
414
+ *) return 1 ;;
415
+ esac
416
+ }
417
+ export -f command
418
+
419
+ run check_dependencies
420
+ [ "$status" -eq 0 ]
421
+ }
422
+
423
+ @test "deploy creates backup before deployment" {
424
+ run deploy "staging"
425
+
426
+ [ "$status" -eq 0 ]
427
+ [ -f "$TEST_DIR/backup.tar.gz" ]
428
+ }
429
+
430
+ @test "rollback restores previous version on failure" {
431
+ # Simulate deployment failure
432
+ function deploy_new_version() {
433
+ return 1
434
+ }
435
+ export -f deploy_new_version
436
+
437
+ run main "production"
438
+
439
+ [ "$status" -eq 1 ]
440
+ [[ "$output" =~ "Rolling back" ]]
441
+ }
442
+ ```
443
+
444
+ **bats Configuration:**
445
+ ```bash
446
+ # tests/test_helper.bash
447
+ # Common test utilities
448
+
449
+ load '/usr/local/lib/bats-support/load.bash'
450
+ load '/usr/local/lib/bats-assert/load.bash'
451
+
452
+ # Setup test environment
453
+ setup_test_env() {
454
+ export TEST_DIR="$(mktemp -d)"
455
+ export LOG_FILE="$TEST_DIR/test.log"
456
+ }
457
+
458
+ # Cleanup test environment
459
+ cleanup_test_env() {
460
+ rm -rf "$TEST_DIR"
461
+ }
462
+
463
+ # Assert file exists
464
+ assert_file_exists() {
465
+ [ -f "$1" ] || fail "File does not exist: $1"
466
+ }
467
+
468
+ # Assert command succeeds
469
+ assert_success() {
470
+ run "$@"
471
+ assert_equal "$status" 0
472
+ }
473
+ ```
474
+
475
+ ## Test Categories
476
+
477
+ ### Unit Tests
478
+
479
+ **Characteristics:**
480
+ - Test single function/method
481
+ - No external dependencies
482
+ - Fast execution (<100ms per test)
483
+ - Mock all I/O operations
484
+ - High coverage (>90%)
485
+
486
+ **What to Test:**
487
+ - Business logic
488
+ - Data transformations
489
+ - Validation logic
490
+ - Error handling
491
+ - Edge cases
492
+
493
+ ### Integration Tests
494
+
495
+ **Characteristics:**
496
+ - Test component interactions
497
+ - Real database connections
498
+ - API calls to external services
499
+ - Moderate execution time (<5s per test)
500
+ - Medium coverage (>70%)
501
+
502
+ **What to Test:**
503
+ - Database operations
504
+ - API endpoints
505
+ - Service integrations
506
+ - Authentication flows
507
+ - Authorization logic
508
+
509
+ ### End-to-End (E2E) Tests
510
+
511
+ **Characteristics:**
512
+ - Test complete workflows
513
+ - Real infrastructure
514
+ - User-facing scenarios
515
+ - Slow execution (<30s per test)
516
+ - Lower coverage (~20 critical paths)
517
+
518
+ **What to Test:**
519
+ - User registration flow
520
+ - Login/logout workflow
521
+ - Critical business processes
522
+ - Payment workflows
523
+ - Data migration scenarios
524
+
525
+ ## Test Naming Conventions
526
+
527
+ ### Python (pytest)
528
+ ```python
529
+ def test_<function>_<scenario>_<expected_result>():
530
+ """
531
+ GIVEN <context>
532
+ WHEN <action>
533
+ THEN <expected_outcome>
534
+ """
535
+ ```
536
+
537
+ **Examples:**
538
+ - `test_create_user_with_valid_data_returns_user_with_id()`
539
+ - `test_update_user_with_invalid_email_raises_value_error()`
540
+ - `test_delete_user_that_does_not_exist_raises_not_found_error()`
541
+
542
+ ### JavaScript/TypeScript (Jest/Vitest)
543
+ ```typescript
544
+ describe('<Component/Function>', () => {
545
+ it('should <expected behavior> when <condition>', () => {
546
+ // Test
547
+ });
548
+ });
549
+ ```
550
+
551
+ **Examples:**
552
+ - `it('should return user when valid ID provided')`
553
+ - `it('should throw error when email already exists')`
554
+ - `it('should hash password before storing')`
555
+
556
+ ### Bash (bats)
557
+ ```bash
558
+ @test "<command> <scenario> <expected result>" {
559
+ # Test
560
+ }
561
+ ```
562
+
563
+ **Examples:**
564
+ - `@test "validate_input accepts valid email"`
565
+ - `@test "deploy fails with exit code 1 on error"`
566
+ - `@test "cleanup removes all temp files"`
567
+
568
+ ## Coverage Requirements
569
+
570
+ ### Minimum Thresholds
571
+
572
+ ```yaml
573
+ coverage:
574
+ statements: 80
575
+ branches: 80
576
+ functions: 80
577
+ lines: 80
578
+ ```
579
+
580
+ ### Critical Paths (100% Coverage Required)
581
+
582
+ - Authentication and authorization
583
+ - Payment processing
584
+ - Data validation
585
+ - Security-sensitive operations
586
+ - Data persistence
587
+ - Error handling
588
+
589
+ ### Excluded from Coverage
590
+
591
+ - Generated code
592
+ - Configuration files
593
+ - Test fixtures
594
+ - Third-party code
595
+ - Deprecated code
596
+
597
+ ## Test Execution
598
+
599
+ ### Local Development
600
+
601
+ ```bash
602
+ # Python
603
+ pytest # Run all tests
604
+ pytest -v # Verbose output
605
+ pytest -k "test_user" # Run specific tests
606
+ pytest --cov # With coverage
607
+ pytest -m unit # Run only unit tests
608
+
609
+ # JavaScript/TypeScript
610
+ npm test # Run all tests
611
+ npm run test:watch # Watch mode
612
+ npm run test:coverage # With coverage
613
+ npm run test:unit # Unit tests only
614
+
615
+ # Bash
616
+ bats tests/ # Run all tests
617
+ bats tests/deploy.bats # Specific file
618
+ ```
619
+
620
+ ### CI/CD Pipeline
621
+
622
+ ```yaml
623
+ # .github/workflows/test.yml
624
+ name: Tests
625
+
626
+ on: [push, pull_request]
627
+
628
+ jobs:
629
+ test:
630
+ runs-on: ubuntu-latest
631
+
632
+ steps:
633
+ - uses: actions/checkout@v3
634
+
635
+ - name: Run tests
636
+ run: |
637
+ npm install
638
+ npm run test:coverage
639
+
640
+ - name: Upload coverage
641
+ uses: codecov/codecov-action@v3
642
+ with:
643
+ file: ./coverage/lcov.info
644
+
645
+ - name: Check coverage threshold
646
+ run: |
647
+ if [ $(cat coverage/coverage-summary.json | jq '.total.statements.pct') -lt 80 ]; then
648
+ echo "Coverage below 80%"
649
+ exit 1
650
+ fi
651
+ ```
652
+
653
+ ## Continuous Testing
654
+
655
+ ### Watch Mode
656
+ - Run tests automatically on file changes
657
+ - Immediate feedback during development
658
+ - Faster red-green-refactor cycles
659
+
660
+ ### Pre-commit Hooks
661
+ ```bash
662
+ # .husky/pre-commit
663
+ #!/bin/sh
664
+ npm run test:staged # Run tests for staged files only
665
+ ```
666
+
667
+ ### Pre-push Hooks
668
+ ```bash
669
+ # .husky/pre-push
670
+ #!/bin/sh
671
+ npm run test:all # Run full test suite
672
+ npm run test:coverage # Verify coverage
673
+ ```
674
+
675
+ ## Test Data Management
676
+
677
+ ### Fixtures
678
+ - Use factories for test data creation
679
+ - Keep fixtures minimal and focused
680
+ - Use realistic but safe test data
681
+ - Reset state between tests
682
+
683
+ ### Mocking
684
+ - Mock external services
685
+ - Mock slow operations
686
+ - Mock non-deterministic behavior
687
+ - Keep mocks simple and maintainable
688
+
689
+ ### Test Databases
690
+ - Use separate test database
691
+ - Reset before each test suite
692
+ - Seed with minimal data
693
+ - Clean up after tests
694
+
695
+ ## Performance Targets
696
+
697
+ ### Test Execution Speed
698
+
699
+ ```
700
+ Unit tests: < 100ms per test
701
+ Integration tests: < 5s per test
702
+ E2E tests: < 30s per test
703
+ Full suite: < 5 minutes
704
+ ```
705
+
706
+ ### Optimization Strategies
707
+
708
+ - Parallelize test execution
709
+ - Use test database transactions
710
+ - Mock slow external services
711
+ - Cache test dependencies
712
+ - Run fast tests first
713
+
714
+ ## Enforcement
715
+
716
+ ### Blocked Actions
717
+
718
+ - **Cannot merge**: If tests fail
719
+ - **Cannot deploy**: If coverage below threshold
720
+ - **Cannot commit**: If test syntax invalid (pre-commit hook)
721
+
722
+ ### Quality Gates
723
+
724
+ ```yaml
725
+ gates:
726
+ - name: Tests
727
+ condition: all_pass
728
+ required: true
729
+
730
+ - name: Coverage
731
+ condition: ">= 80%"
732
+ required: true
733
+
734
+ - name: Performance
735
+ condition: "< 5 minutes"
736
+ required: true
737
+ ```
738
+
739
+ ## Monitoring
740
+
741
+ ### Metrics
742
+
743
+ - Test count (should grow with codebase)
744
+ - Test execution time (should stay under threshold)
745
+ - Test flakiness rate (should be <1%)
746
+ - Coverage percentage (should be >80%)
747
+
748
+ ### Reports
749
+
750
+ - Daily: Test execution summary
751
+ - Weekly: Coverage trends
752
+ - Monthly: Flaky test analysis
753
+ - Quarterly: Test suite health review
754
+
755
+ ## References
756
+
757
+ - Python: [pytest Documentation](https://docs.pytest.org/)
758
+ - JavaScript: [Jest](https://jestjs.io/), [Vitest](https://vitest.dev/)
759
+ - Node.js: [Supertest](https://github.com/visionmedia/supertest)
760
+ - Bash: [bats](https://github.com/bats-core/bats-core)
761
+ - TDD: [Test-Driven Development](https://martinfowler.com/bliki/TestDrivenDevelopment.html)
762
+
763
+ ---
764
+
765
+ **Enforcement Level**: MANDATORY
766
+ **Review Frequency**: Every commit
767
+ **Last Updated**: 2025-01-15
768
+ **TDD Required**: ✅ Red-Green-Refactor cycle mandatory for all code