qa-skills 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +20 -149
  2. package/bin/cli.js +1 -40
  3. package/package.json +23 -26
  4. package/dist/agents/registry.d.ts +0 -5
  5. package/dist/agents/registry.d.ts.map +0 -1
  6. package/dist/agents/registry.js +0 -101
  7. package/dist/agents/registry.js.map +0 -1
  8. package/dist/agents/types.d.ts +0 -9
  9. package/dist/agents/types.d.ts.map +0 -1
  10. package/dist/agents/types.js +0 -2
  11. package/dist/agents/types.js.map +0 -1
  12. package/dist/dependencies.d.ts +0 -21
  13. package/dist/dependencies.d.ts.map +0 -1
  14. package/dist/dependencies.js +0 -125
  15. package/dist/dependencies.js.map +0 -1
  16. package/dist/installer.d.ts +0 -25
  17. package/dist/installer.d.ts.map +0 -1
  18. package/dist/installer.js +0 -437
  19. package/dist/installer.js.map +0 -1
  20. package/dist/scaffold.d.ts +0 -27
  21. package/dist/scaffold.d.ts.map +0 -1
  22. package/dist/scaffold.js +0 -182
  23. package/dist/scaffold.js.map +0 -1
  24. package/skills/qa-accessibility-test-writer/SKILL.md +0 -127
  25. package/skills/qa-accessibility-test-writer/references/axe-core-patterns.md +0 -349
  26. package/skills/qa-accessibility-test-writer/references/best-practices.md +0 -184
  27. package/skills/qa-accessibility-test-writer/references/wcag-tests.md +0 -331
  28. package/skills/qa-api-contract-curator/SKILL.md +0 -104
  29. package/skills/qa-api-contract-curator/references/breaking-changes.md +0 -363
  30. package/skills/qa-api-contract-curator/references/openapi-structure.md +0 -404
  31. package/skills/qa-browser-data-collector/SKILL.md +0 -132
  32. package/skills/qa-browser-data-collector/references/data-collection-checklist.md +0 -91
  33. package/skills/qa-browser-data-collector/references/playwright-mcp-patterns.md +0 -113
  34. package/skills/qa-bug-ticket-creator/SKILL.md +0 -148
  35. package/skills/qa-bug-ticket-creator/references/bug-report-format.md +0 -149
  36. package/skills/qa-bug-ticket-creator/references/severity-guide.md +0 -81
  37. package/skills/qa-bug-ticket-creator/templates/bug-ticket-template.md +0 -39
  38. package/skills/qa-changelog-analyzer/SKILL.md +0 -134
  39. package/skills/qa-changelog-analyzer/references/git-analysis-patterns.md +0 -138
  40. package/skills/qa-changelog-analyzer/references/impact-mapping.md +0 -120
  41. package/skills/qa-clickup-integration/SKILL.md +0 -166
  42. package/skills/qa-clickup-integration/references/api-patterns.md +0 -102
  43. package/skills/qa-clickup-integration/references/field-mapping.md +0 -71
  44. package/skills/qa-codeceptjs-writer/SKILL.md +0 -136
  45. package/skills/qa-codeceptjs-writer/references/best-practices.md +0 -207
  46. package/skills/qa-codeceptjs-writer/references/config.md +0 -255
  47. package/skills/qa-codeceptjs-writer/references/patterns.md +0 -285
  48. package/skills/qa-coverage-analyzer/SKILL.md +0 -166
  49. package/skills/qa-coverage-analyzer/references/best-practices.md +0 -142
  50. package/skills/qa-coverage-analyzer/references/coverage-dimensions.md +0 -155
  51. package/skills/qa-coverage-analyzer/references/tools.md +0 -204
  52. package/skills/qa-cypress-writer/SKILL.md +0 -134
  53. package/skills/qa-cypress-writer/references/assertions.md +0 -121
  54. package/skills/qa-cypress-writer/references/best-practices.md +0 -82
  55. package/skills/qa-cypress-writer/references/config.md +0 -121
  56. package/skills/qa-cypress-writer/references/patterns.md +0 -170
  57. package/skills/qa-data-factory/SKILL.md +0 -126
  58. package/skills/qa-data-factory/references/factory-patterns.md +0 -164
  59. package/skills/qa-data-factory/references/faker-guide.md +0 -131
  60. package/skills/qa-diagram-generator/SKILL.md +0 -125
  61. package/skills/qa-diagram-generator/references/c4-model.md +0 -53
  62. package/skills/qa-diagram-generator/references/charts.md +0 -58
  63. package/skills/qa-diagram-generator/references/class-diagram.md +0 -85
  64. package/skills/qa-diagram-generator/references/er-diagram.md +0 -69
  65. package/skills/qa-diagram-generator/references/flowchart.md +0 -92
  66. package/skills/qa-diagram-generator/references/from-screenshot.md +0 -45
  67. package/skills/qa-diagram-generator/references/gantt.md +0 -49
  68. package/skills/qa-diagram-generator/references/journey.md +0 -50
  69. package/skills/qa-diagram-generator/references/mindmap.md +0 -75
  70. package/skills/qa-diagram-generator/references/sequence.md +0 -69
  71. package/skills/qa-diagram-generator/references/state-diagram.md +0 -56
  72. package/skills/qa-discovery-interview/SKILL.md +0 -182
  73. package/skills/qa-discovery-interview/references/completeness-checklist.md +0 -53
  74. package/skills/qa-discovery-interview/references/conflict-patterns.md +0 -101
  75. package/skills/qa-discovery-interview/references/qa-categories.md +0 -147
  76. package/skills/qa-discovery-interview/templates/qa-brief-template.md +0 -168
  77. package/skills/qa-environment-checker/SKILL.md +0 -142
  78. package/skills/qa-environment-checker/references/dependency-matrix.md +0 -101
  79. package/skills/qa-environment-checker/references/health-checks.md +0 -209
  80. package/skills/qa-environment-checker/templates/env-readiness-template.md +0 -64
  81. package/skills/qa-flaky-detector/SKILL.md +0 -153
  82. package/skills/qa-flaky-detector/references/ci-analysis.md +0 -140
  83. package/skills/qa-flaky-detector/references/flaky-patterns.md +0 -247
  84. package/skills/qa-github-issues-enhanced/SKILL.md +0 -175
  85. package/skills/qa-github-issues-enhanced/references/issue-templates.md +0 -425
  86. package/skills/qa-github-issues-enhanced/references/label-taxonomy.md +0 -130
  87. package/skills/qa-github-issues-enhanced/references/workflow-patterns.md +0 -188
  88. package/skills/qa-httpx-writer/SKILL.md +0 -138
  89. package/skills/qa-httpx-writer/references/assertions.md +0 -195
  90. package/skills/qa-httpx-writer/references/best-practices.md +0 -140
  91. package/skills/qa-httpx-writer/references/config.md +0 -212
  92. package/skills/qa-httpx-writer/references/patterns.md +0 -262
  93. package/skills/qa-jest-writer/SKILL.md +0 -131
  94. package/skills/qa-jest-writer/references/assertions.md +0 -125
  95. package/skills/qa-jest-writer/references/best-practices.md +0 -136
  96. package/skills/qa-jest-writer/references/config.md +0 -134
  97. package/skills/qa-jest-writer/references/patterns.md +0 -172
  98. package/skills/qa-jira-integration/SKILL.md +0 -135
  99. package/skills/qa-jira-integration/references/api-patterns.md +0 -143
  100. package/skills/qa-jira-integration/references/field-mapping.md +0 -79
  101. package/skills/qa-jira-integration/references/xray-integration.md +0 -85
  102. package/skills/qa-jmeter-writer/SKILL.md +0 -171
  103. package/skills/qa-jmeter-writer/references/best-practices.md +0 -157
  104. package/skills/qa-jmeter-writer/references/config.md +0 -204
  105. package/skills/qa-jmeter-writer/references/patterns.md +0 -242
  106. package/skills/qa-junit5-writer/SKILL.md +0 -157
  107. package/skills/qa-junit5-writer/references/assertions.md +0 -118
  108. package/skills/qa-junit5-writer/references/config.md +0 -97
  109. package/skills/qa-junit5-writer/references/patterns.md +0 -162
  110. package/skills/qa-k6-writer/SKILL.md +0 -155
  111. package/skills/qa-k6-writer/references/best-practices.md +0 -236
  112. package/skills/qa-k6-writer/references/config.md +0 -219
  113. package/skills/qa-k6-writer/references/patterns.md +0 -304
  114. package/skills/qa-linear-integration/SKILL.md +0 -137
  115. package/skills/qa-linear-integration/references/api-patterns.md +0 -249
  116. package/skills/qa-linear-integration/references/field-mapping.md +0 -121
  117. package/skills/qa-locust-writer/SKILL.md +0 -151
  118. package/skills/qa-locust-writer/references/best-practices.md +0 -126
  119. package/skills/qa-locust-writer/references/config.md +0 -170
  120. package/skills/qa-locust-writer/references/patterns.md +0 -235
  121. package/skills/qa-manual-test-designer/SKILL.md +0 -145
  122. package/skills/qa-manual-test-designer/references/exploratory-charters.md +0 -138
  123. package/skills/qa-manual-test-designer/references/personas.md +0 -146
  124. package/skills/qa-manual-test-designer/templates/exploratory-charter-template.md +0 -47
  125. package/skills/qa-manual-test-designer/templates/test-case-template.md +0 -31
  126. package/skills/qa-mobile-test-writer/SKILL.md +0 -144
  127. package/skills/qa-mobile-test-writer/references/best-practices.md +0 -214
  128. package/skills/qa-mobile-test-writer/references/config.md +0 -309
  129. package/skills/qa-mobile-test-writer/references/patterns.md +0 -304
  130. package/skills/qa-nfr-analyst/SKILL.md +0 -177
  131. package/skills/qa-nfr-analyst/references/iso-25010-model.md +0 -159
  132. package/skills/qa-nfr-analyst/references/owasp-wstg-baseline.md +0 -202
  133. package/skills/qa-nfr-analyst/references/wcag-checklist.md +0 -184
  134. package/skills/qa-nfr-analyst/templates/owasp-checklist-template.md +0 -89
  135. package/skills/qa-nfr-analyst/templates/wcag-checklist-template.md +0 -48
  136. package/skills/qa-orchestrator/SKILL.md +0 -132
  137. package/skills/qa-orchestrator/references/handoff-chains.md +0 -105
  138. package/skills/qa-orchestrator/references/pipeline-modes.md +0 -115
  139. package/skills/qa-orchestrator/references/scheduler-rules.md +0 -84
  140. package/skills/qa-pact-writer/SKILL.md +0 -133
  141. package/skills/qa-pact-writer/references/best-practices.md +0 -100
  142. package/skills/qa-pact-writer/references/config.md +0 -135
  143. package/skills/qa-pact-writer/references/patterns.md +0 -161
  144. package/skills/qa-plan-creator/SKILL.md +0 -139
  145. package/skills/qa-plan-creator/references/introduction-plan.md +0 -43
  146. package/skills/qa-plan-creator/references/migration-plan.md +0 -44
  147. package/skills/qa-plan-creator/references/onboarding-plan.md +0 -46
  148. package/skills/qa-plan-creator/references/performance-plan.md +0 -44
  149. package/skills/qa-plan-creator/references/regression-plan.md +0 -45
  150. package/skills/qa-plan-creator/references/release-plan.md +0 -45
  151. package/skills/qa-plan-creator/references/sprint-plan.md +0 -44
  152. package/skills/qa-plan-creator/references/test-plan.md +0 -59
  153. package/skills/qa-plan-creator/references/uat-plan.md +0 -43
  154. package/skills/qa-plan-creator/templates/checklist-template.md +0 -36
  155. package/skills/qa-plan-creator/templates/regression-checklist-template.md +0 -49
  156. package/skills/qa-plan-creator/templates/release-checklist-template.md +0 -46
  157. package/skills/qa-plan-creator/templates/test-plan-template.md +0 -74
  158. package/skills/qa-playwright-py-writer/SKILL.md +0 -156
  159. package/skills/qa-playwright-py-writer/references/best-practices.md +0 -194
  160. package/skills/qa-playwright-py-writer/references/config.md +0 -195
  161. package/skills/qa-playwright-py-writer/references/patterns.md +0 -212
  162. package/skills/qa-playwright-ts-writer/SKILL.md +0 -151
  163. package/skills/qa-playwright-ts-writer/references/assertions.md +0 -109
  164. package/skills/qa-playwright-ts-writer/references/best-practices.md +0 -191
  165. package/skills/qa-playwright-ts-writer/references/config.md +0 -144
  166. package/skills/qa-playwright-ts-writer/references/patterns.md +0 -171
  167. package/skills/qa-pytest-writer/SKILL.md +0 -145
  168. package/skills/qa-pytest-writer/references/assertions.md +0 -149
  169. package/skills/qa-pytest-writer/references/best-practices.md +0 -97
  170. package/skills/qa-pytest-writer/references/config.md +0 -176
  171. package/skills/qa-pytest-writer/references/patterns.md +0 -251
  172. package/skills/qa-qase-integration/SKILL.md +0 -149
  173. package/skills/qa-qase-integration/references/api-reference.md +0 -354
  174. package/skills/qa-qase-integration/references/ci-integration.md +0 -196
  175. package/skills/qa-qase-integration/references/field-mapping.md +0 -157
  176. package/skills/qa-requirements-generator/SKILL.md +0 -152
  177. package/skills/qa-requirements-generator/references/iso-29148-structure.md +0 -153
  178. package/skills/qa-requirements-generator/references/requirement-patterns.md +0 -278
  179. package/skills/qa-rest-assured-writer/SKILL.md +0 -137
  180. package/skills/qa-rest-assured-writer/references/best-practices.md +0 -50
  181. package/skills/qa-rest-assured-writer/references/config.md +0 -124
  182. package/skills/qa-rest-assured-writer/references/patterns.md +0 -192
  183. package/skills/qa-risk-analyzer/SKILL.md +0 -158
  184. package/skills/qa-risk-analyzer/references/impact-analysis.md +0 -133
  185. package/skills/qa-risk-analyzer/references/risk-factors.md +0 -123
  186. package/skills/qa-robot-framework-writer/SKILL.md +0 -147
  187. package/skills/qa-robot-framework-writer/references/best-practices.md +0 -249
  188. package/skills/qa-robot-framework-writer/references/config.md +0 -204
  189. package/skills/qa-robot-framework-writer/references/libraries.md +0 -273
  190. package/skills/qa-robot-framework-writer/references/patterns.md +0 -216
  191. package/skills/qa-security-test-writer/SKILL.md +0 -123
  192. package/skills/qa-security-test-writer/references/best-practices.md +0 -155
  193. package/skills/qa-security-test-writer/references/owasp-top10.md +0 -331
  194. package/skills/qa-security-test-writer/references/zap-config.md +0 -258
  195. package/skills/qa-selenium-java-writer/SKILL.md +0 -143
  196. package/skills/qa-selenium-java-writer/references/best-practices.md +0 -59
  197. package/skills/qa-selenium-java-writer/references/config.md +0 -143
  198. package/skills/qa-selenium-java-writer/references/patterns.md +0 -170
  199. package/skills/qa-selenium-py-writer/SKILL.md +0 -150
  200. package/skills/qa-selenium-py-writer/references/best-practices.md +0 -175
  201. package/skills/qa-selenium-py-writer/references/config.md +0 -224
  202. package/skills/qa-selenium-py-writer/references/patterns.md +0 -255
  203. package/skills/qa-shortcut-integration/SKILL.md +0 -143
  204. package/skills/qa-shortcut-integration/references/api-patterns.md +0 -126
  205. package/skills/qa-shortcut-integration/references/field-mapping.md +0 -66
  206. package/skills/qa-spec-auditor/SKILL.md +0 -162
  207. package/skills/qa-spec-auditor/references/audit-checklist.md +0 -144
  208. package/skills/qa-spec-auditor/references/drift-patterns.md +0 -207
  209. package/skills/qa-spec-writer/SKILL.md +0 -143
  210. package/skills/qa-spec-writer/references/gherkin-guide.md +0 -253
  211. package/skills/qa-spec-writer/references/specification-patterns.md +0 -274
  212. package/skills/qa-spring-test-writer/SKILL.md +0 -170
  213. package/skills/qa-spring-test-writer/references/best-practices.md +0 -57
  214. package/skills/qa-spring-test-writer/references/config.md +0 -179
  215. package/skills/qa-spring-test-writer/references/patterns.md +0 -235
  216. package/skills/qa-supertest-writer/SKILL.md +0 -150
  217. package/skills/qa-supertest-writer/references/assertions.md +0 -192
  218. package/skills/qa-supertest-writer/references/best-practices.md +0 -102
  219. package/skills/qa-supertest-writer/references/config.md +0 -166
  220. package/skills/qa-supertest-writer/references/patterns.md +0 -242
  221. package/skills/qa-task-creator/SKILL.md +0 -142
  222. package/skills/qa-task-creator/references/linking-patterns.md +0 -127
  223. package/skills/qa-task-creator/references/task-types.md +0 -169
  224. package/skills/qa-task-creator/templates/task-template.md +0 -24
  225. package/skills/qa-test-doc-compiler/SKILL.md +0 -114
  226. package/skills/qa-test-doc-compiler/references/agile-tailoring.md +0 -220
  227. package/skills/qa-test-doc-compiler/references/iso-29119-3-documents.md +0 -302
  228. package/skills/qa-test-healer/SKILL.md +0 -101
  229. package/skills/qa-test-healer/references/diagnosis-patterns.md +0 -142
  230. package/skills/qa-test-healer/references/fix-strategies.md +0 -177
  231. package/skills/qa-test-reporter/SKILL.md +0 -130
  232. package/skills/qa-test-reporter/references/best-practices.md +0 -162
  233. package/skills/qa-test-reporter/references/iso-29119-reports.md +0 -236
  234. package/skills/qa-test-reporter/references/report-formats.md +0 -287
  235. package/skills/qa-test-reviewer/SKILL.md +0 -142
  236. package/skills/qa-test-reviewer/references/anti-patterns.md +0 -268
  237. package/skills/qa-test-reviewer/references/review-checklist.md +0 -93
  238. package/skills/qa-test-strategy/SKILL.md +0 -133
  239. package/skills/qa-test-strategy/references/entry-exit-criteria.md +0 -176
  240. package/skills/qa-test-strategy/references/risk-matrix.md +0 -102
  241. package/skills/qa-test-strategy/references/testing-types.md +0 -143
  242. package/skills/qa-testcase-from-docs/SKILL.md +0 -161
  243. package/skills/qa-testcase-from-docs/references/test-case-format.md +0 -196
  244. package/skills/qa-testcase-from-docs/references/test-design-techniques.md +0 -126
  245. package/skills/qa-testcase-from-docs/templates/test-case-template.md +0 -31
  246. package/skills/qa-testcase-from-ui/SKILL.md +0 -109
  247. package/skills/qa-testcase-from-ui/references/ui-element-patterns.md +0 -126
  248. package/skills/qa-testcase-from-ui/references/visual-analysis-guide.md +0 -146
  249. package/skills/qa-testcase-from-ui/templates/test-case-template.md +0 -31
  250. package/skills/qa-visual-regression-writer/SKILL.md +0 -175
  251. package/skills/qa-visual-regression-writer/references/best-practices.md +0 -154
  252. package/skills/qa-visual-regression-writer/references/config.md +0 -220
  253. package/skills/qa-visual-regression-writer/references/patterns.md +0 -213
  254. package/skills/qa-vitest-writer/SKILL.md +0 -141
  255. package/skills/qa-vitest-writer/references/assertions.md +0 -105
  256. package/skills/qa-vitest-writer/references/best-practices.md +0 -62
  257. package/skills/qa-vitest-writer/references/config.md +0 -127
  258. package/skills/qa-vitest-writer/references/patterns.md +0 -141
  259. package/skills/qa-webdriverio-writer/SKILL.md +0 -145
  260. package/skills/qa-webdriverio-writer/references/best-practices.md +0 -176
  261. package/skills/qa-webdriverio-writer/references/config.md +0 -240
  262. package/skills/qa-webdriverio-writer/references/patterns.md +0 -269
@@ -1,224 +0,0 @@
1
- # Selenium Python Configuration
2
-
3
- Setup and configuration for Selenium WebDriver with Python.
4
-
5
- ## Dependencies
6
-
7
- ```bash
8
- pip install selenium
9
- pip install webdriver-manager # Optional: auto-manage driver binaries
10
- pip install pytest # For test runner
11
- ```
12
-
13
- ## WebDriver Manager (Recommended)
14
-
15
- Automatically downloads and manages ChromeDriver, GeckoDriver, etc.:
16
-
17
- ```python
18
- from selenium import webdriver
19
- from webdriver_manager.chrome import ChromeDriverManager
20
- from selenium.webdriver.chrome.service import Service
21
-
22
- service = Service(ChromeDriverManager().install())
23
- driver = webdriver.Chrome(service=service)
24
- ```
25
-
26
- ```python
27
- # Firefox
28
- from webdriver_manager.firefox import GeckoDriverManager
29
- service = Service(GeckoDriverManager().install())
30
- driver = webdriver.Firefox(service=service)
31
- ```
32
-
33
- ```python
34
- # Edge
35
- from webdriver_manager.microsoft import EdgeChromiumDriverManager
36
- service = Service(EdgeChromiumDriverManager().install())
37
- driver = webdriver.Edge(service=service)
38
- ```
39
-
40
- ## Browser Options
41
-
42
- ### Chrome
43
-
44
- ```python
45
- from selenium import webdriver
46
- from selenium.webdriver.chrome.options import Options
47
-
48
- options = Options()
49
- options.add_argument("--headless")
50
- options.add_argument("--no-sandbox")
51
- options.add_argument("--disable-dev-shm-usage")
52
- options.add_argument("--disable-gpu")
53
- options.add_argument("--window-size=1920,1080")
54
-
55
- driver = webdriver.Chrome(options=options)
56
- ```
57
-
58
- ### Firefox
59
-
60
- ```python
61
- from selenium import webdriver
62
- from selenium.webdriver.firefox.options import Options
63
-
64
- options = Options()
65
- options.add_argument("--headless")
66
-
67
- driver = webdriver.Firefox(options=options)
68
- ```
69
-
70
- ### Edge
71
-
72
- ```python
73
- from selenium import webdriver
74
- from selenium.webdriver.edge.options import Options
75
-
76
- options = Options()
77
- options.add_argument("--headless")
78
-
79
- driver = webdriver.Edge(options=options)
80
- ```
81
-
82
- ## Pytest Integration
83
-
84
- ### conftest.py (Driver Fixture)
85
-
86
- ```python
87
- # tests/conftest.py
88
- import pytest
89
- from selenium import webdriver
90
- from selenium.webdriver.chrome.options import Options
91
- from webdriver_manager.chrome import ChromeDriverManager
92
- from selenium.webdriver.chrome.service import Service
93
-
94
-
95
- @pytest.fixture(scope="function")
96
- def driver():
97
- options = Options()
98
- options.add_argument("--headless")
99
- options.add_argument("--no-sandbox")
100
- options.add_argument("--disable-dev-shm-usage")
101
- service = Service(ChromeDriverManager().install())
102
- driver = webdriver.Chrome(service=service, options=options)
103
- yield driver
104
- driver.quit()
105
-
106
-
107
- @pytest.fixture(scope="function")
108
- def driver_visible():
109
- """Non-headless for local debugging."""
110
- service = Service(ChromeDriverManager().install())
111
- driver = webdriver.Chrome(service=service)
112
- yield driver
113
- driver.quit()
114
- ```
115
-
116
- ### Test Module
117
-
118
- ```python
119
- # tests/test_login.py
120
- import pytest
121
- from selenium.webdriver.common.by import By
122
- from selenium.webdriver.support.ui import WebDriverWait
123
- from selenium.webdriver.support import expected_conditions as EC
124
-
125
-
126
- def test_login_success(driver):
127
- driver.get("https://example.com/login")
128
- driver.find_element(By.ID, "username").send_keys("user")
129
- driver.find_element(By.ID, "password").send_keys("pass")
130
- driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
131
-
132
- WebDriverWait(driver, 10).until(EC.url_contains("dashboard"))
133
- assert "dashboard" in driver.current_url
134
- ```
135
-
136
- ## Headless Configuration
137
-
138
- | Browser | Headless Flag |
139
- | ------- | ------------- |
140
- | Chrome | `--headless=new` or `--headless` |
141
- | Firefox | `--headless` |
142
- | Edge | `--headless` |
143
-
144
- ```python
145
- def get_headless_chrome():
146
- options = Options()
147
- options.add_argument("--headless=new")
148
- options.add_argument("--no-sandbox")
149
- options.add_argument("--disable-dev-shm-usage")
150
- options.add_argument("--disable-gpu")
151
- options.add_argument("--window-size=1920,1080")
152
- return webdriver.Chrome(options=options)
153
- ```
154
-
155
- ## Environment-Based Config
156
-
157
- ```python
158
- import os
159
-
160
- def create_driver():
161
- browser = os.getenv("SELENIUM_BROWSER", "chrome")
162
- headless = os.getenv("SELENIUM_HEADLESS", "true").lower() == "true"
163
-
164
- if browser == "chrome":
165
- options = Options()
166
- if headless:
167
- options.add_argument("--headless=new")
168
- return webdriver.Chrome(options=options)
169
- elif browser == "firefox":
170
- options = webdriver.FirefoxOptions()
171
- if headless:
172
- options.add_argument("--headless")
173
- return webdriver.Firefox(options=options)
174
- else:
175
- raise ValueError(f"Unsupported browser: {browser}")
176
- ```
177
-
178
- ## Base URL Fixture
179
-
180
- ```python
181
- # conftest.py
182
- @pytest.fixture(scope="session")
183
- def base_url():
184
- return os.getenv("BASE_URL", "https://example.com")
185
-
186
-
187
- @pytest.fixture
188
- def login_page(driver, base_url):
189
- from pages.login import LoginPage
190
- return LoginPage(driver, base_url)
191
- ```
192
-
193
- ## Timeouts
194
-
195
- ```python
196
- # Page load timeout
197
- driver.set_page_load_timeout(30)
198
-
199
- # Script timeout (async scripts)
200
- driver.set_script_timeout(10)
201
-
202
- # Implicit wait (use sparingly)
203
- driver.implicitly_wait(5)
204
- ```
205
-
206
- ## pyproject.toml / pytest.ini
207
-
208
- ```toml
209
- [tool.pytest.ini_options]
210
- testpaths = ["tests"]
211
- addopts = "-v --tb=short"
212
- markers = [
213
- "e2e: end-to-end Selenium tests",
214
- "slow: slow-running tests",
215
- ]
216
- ```
217
-
218
- ```bash
219
- # Run only E2E tests
220
- pytest -m e2e
221
-
222
- # Run with visible browser
223
- SELENIUM_HEADLESS=false pytest tests/
224
- ```
@@ -1,255 +0,0 @@
1
- # Selenium Python Patterns
2
-
3
- Common patterns for E2E testing with Selenium WebDriver in Python.
4
-
5
- ## Locators
6
-
7
- | Strategy | Example | When to Use |
8
- | -------- | ------- | ----------- |
9
- | By.ID | `driver.find_element(By.ID, "username")` | Unique ID attribute |
10
- | By.CSS_SELECTOR | `driver.find_element(By.CSS_SELECTOR, "button.submit")` | Complex selectors |
11
- | By.XPATH | `driver.find_element(By.XPATH, "//button[text()='Submit']")` | Text, hierarchy, axes |
12
- | By.NAME | `driver.find_element(By.NAME, "email")` | Form inputs by name |
13
- | By.CLASS_NAME | `driver.find_element(By.CLASS_NAME, "btn-primary")` | Single class |
14
- | By.LINK_TEXT | `driver.find_element(By.LINK_TEXT, "Sign in")` | Exact link text |
15
- | By.PARTIAL_LINK_TEXT | `driver.find_element(By.PARTIAL_LINK_TEXT, "Sign")` | Partial link text |
16
- | By.TAG_NAME | `driver.find_element(By.TAG_NAME, "input")` | Tag type |
17
-
18
- ```python
19
- from selenium.webdriver.common.by import By
20
-
21
- element = driver.find_element(By.ID, "submit-btn")
22
- elements = driver.find_elements(By.CSS_SELECTOR, ".list-item")
23
- ```
24
-
25
- ## Waits
26
-
27
- ### Explicit Wait (Preferred)
28
-
29
- ```python
30
- from selenium.webdriver.support.ui import WebDriverWait
31
- from selenium.webdriver.support import expected_conditions as EC
32
-
33
- # Wait for element to be visible
34
- element = WebDriverWait(driver, 10).until(
35
- EC.visibility_of_element_located((By.ID, "username"))
36
- )
37
-
38
- # Wait for element to be clickable
39
- button = WebDriverWait(driver, 10).until(
40
- EC.element_to_be_clickable((By.CSS_SELECTOR, "button.submit"))
41
- )
42
-
43
- # Wait for URL change
44
- WebDriverWait(driver, 10).until(EC.url_contains("dashboard"))
45
-
46
- # Wait for element to be present in DOM
47
- element = WebDriverWait(driver, 10).until(
48
- EC.presence_of_element_located((By.ID, "results"))
49
- )
50
- ```
51
-
52
- ### Common Expected Conditions
53
-
54
- | Condition | Use Case |
55
- | --------- | -------- |
56
- | `visibility_of_element_located` | Element visible and has dimensions |
57
- | `element_to_be_clickable` | Element visible and enabled |
58
- | `presence_of_element_located` | Element in DOM (may be hidden) |
59
- | `text_to_be_present_in_element` | Specific text in element |
60
- | `url_contains` | URL contains substring |
61
- | `title_is` | Page title exact match |
62
- | `alert_is_present` | Alert dialog present |
63
-
64
- ### Implicit Wait (Use Sparingly)
65
-
66
- ```python
67
- # Sets default wait for find_element; applies to all subsequent calls
68
- driver.implicitly_wait(10) # Seconds
69
- ```
70
-
71
- **Note:** Prefer explicit waits. Implicit waits can cause unexpected delays and mask timing issues.
72
-
73
- ## Page Object Model (POM)
74
-
75
- ```python
76
- from selenium.webdriver.common.by import By
77
- from selenium.webdriver.support.ui import WebDriverWait
78
- from selenium.webdriver.support import expected_conditions as EC
79
-
80
- class LoginPage:
81
- def __init__(self, driver, base_url):
82
- self.driver = driver
83
- self.base_url = base_url
84
-
85
- @property
86
- def username_input(self):
87
- return WebDriverWait(self.driver, 10).until(
88
- EC.visibility_of_element_located((By.ID, "username"))
89
- )
90
-
91
- @property
92
- def password_input(self):
93
- return self.driver.find_element(By.ID, "password")
94
-
95
- @property
96
- def submit_button(self):
97
- return self.driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
98
-
99
- def open(self):
100
- self.driver.get(f"{self.base_url}/login")
101
-
102
- def login(self, username: str, password: str):
103
- self.open()
104
- self.username_input.send_keys(username)
105
- self.password_input.send_keys(password)
106
- self.submit_button.click()
107
- ```
108
-
109
- ## ActionChains (Complex Interactions)
110
-
111
- ```python
112
- from selenium.webdriver.common.action_chains import ActionChains
113
-
114
- # Hover
115
- actions = ActionChains(driver)
116
- actions.move_to_element(menu_element).perform()
117
-
118
- # Click and hold, drag and drop
119
- actions = ActionChains(driver)
120
- actions.click_and_hold(source).move_to_element(target).release().perform()
121
-
122
- # Double click
123
- actions = ActionChains(driver)
124
- actions.double_click(element).perform()
125
-
126
- # Right click (context menu)
127
- actions = ActionChains(driver)
128
- actions.context_click(element).perform()
129
-
130
- # Send keys with modifier
131
- actions = ActionChains(driver)
132
- actions.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()
133
-
134
- # Chain multiple actions
135
- actions = ActionChains(driver)
136
- actions.move_to_element(menu).click(hidden_submenu).perform()
137
- ```
138
-
139
- ## Select (Dropdowns)
140
-
141
- ```python
142
- from selenium.webdriver.support.ui import Select
143
-
144
- select = Select(driver.find_element(By.ID, "country"))
145
-
146
- # By value
147
- select.select_by_value("us")
148
-
149
- # By visible text
150
- select.select_by_visible_text("United States")
151
-
152
- # By index (0-based)
153
- select.select_by_index(0)
154
-
155
- # Get options
156
- options = select.options
157
- first_selected = select.first_selected_option.text
158
-
159
- # Deselect (multi-select only)
160
- select.deselect_all()
161
- select.deselect_by_visible_text("Option A")
162
- ```
163
-
164
- ## File Upload
165
-
166
- ```python
167
- # Input type="file" - send path directly
168
- file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
169
- file_input.send_keys("/absolute/path/to/file.pdf")
170
-
171
- # Multiple files (if supported)
172
- file_input.send_keys("/path/file1.pdf\n/path/file2.pdf")
173
- ```
174
-
175
- ## Alerts
176
-
177
- ```python
178
- from selenium.webdriver.support.ui import WebDriverWait
179
- from selenium.webdriver.support import expected_conditions as EC
180
-
181
- # Wait for alert and accept
182
- WebDriverWait(driver, 10).until(EC.alert_is_present())
183
- alert = driver.switch_to.alert
184
- alert.accept() # OK
185
- # alert.dismiss() # Cancel
186
- # text = alert.text # Get message
187
- # alert.send_keys("input") # For prompt()
188
- ```
189
-
190
- ## Frames
191
-
192
- ```python
193
- # Switch to frame by index, name, or element
194
- driver.switch_to.frame(0) # First frame
195
- driver.switch_to.frame("frame-name")
196
- driver.switch_to.frame(frame_element)
197
-
198
- # Switch back to main content
199
- driver.switch_to.default_content()
200
-
201
- # Switch to parent frame (nested frames)
202
- driver.switch_to.parent_frame()
203
- ```
204
-
205
- ## Windows / Tabs
206
-
207
- ```python
208
- # Get current window handle
209
- current = driver.current_window_handle
210
-
211
- # Get all window handles
212
- handles = driver.window_handles
213
-
214
- # Switch to new tab/window
215
- driver.switch_to.window(handles[-1])
216
-
217
- # Close current and switch back
218
- driver.close()
219
- driver.switch_to.window(handles[0])
220
- ```
221
-
222
- ## Basic Interactions
223
-
224
- ```python
225
- # Navigation
226
- driver.get("https://example.com")
227
- driver.back()
228
- driver.forward()
229
- driver.refresh()
230
-
231
- # Element interactions
232
- element.click()
233
- element.send_keys("text")
234
- element.clear()
235
- element.submit() # Form submit
236
-
237
- # Get attributes and text
238
- text = element.text
239
- value = element.get_attribute("value")
240
- href = element.get_attribute("href")
241
- is_displayed = element.is_displayed()
242
- is_enabled = element.is_enabled()
243
- ```
244
-
245
- ## Keys
246
-
247
- ```python
248
- from selenium.webdriver.common.keys import Keys
249
-
250
- element.send_keys(Keys.ENTER)
251
- element.send_keys(Keys.TAB)
252
- element.send_keys(Keys.ESCAPE)
253
- element.send_keys(Keys.ARROW_DOWN)
254
- element.send_keys(Keys.CONTROL + "a") # Select all
255
- ```
@@ -1,143 +0,0 @@
1
- ---
2
- name: qa-shortcut-integration
3
- description: Shortcut (formerly Clubhouse) integration for creating stories, managing epics/iterations, and tracking QA workflows via REST API.
4
- dependencies:
5
- recommended:
6
- - qa-bug-ticket-creator
7
- - qa-task-creator
8
- ---
9
-
10
- # QA Shortcut Integration
11
-
12
- ## Purpose
13
-
14
- Integrate QA workflow with Shortcut for project management. Create and update stories from bug reports, test coverage gaps, and QA tasks. Sync QA metadata (severity, test type, labels) with Shortcut epics, iterations, and workflow states.
15
-
16
- ## Primary Target
17
-
18
- **Shortcut** (formerly Clubhouse) via REST API v3. Base URL: `https://api.app.shortcut.com/api/v3`.
19
-
20
- ## Features
21
-
22
- ### Create/Update Stories
23
-
24
- - **Create** stories in projects with full metadata
25
- - **Update** existing stories (status, labels, description, external links)
26
- - **Search** stories by query, epic, iteration, or label
27
-
28
- ### Epics and Iterations
29
-
30
- - **Epics** — Group stories by feature/release; link stories to epics
31
- - **Iterations** — Assign stories to sprints; query by iteration
32
- - **Workflow states** — Map QA status to Shortcut workflow states
33
-
34
- ### Labels and Story Types
35
-
36
- - **Story types** — Bug, feature, chore (map from QA task type)
37
- - **Labels** — Component, severity, test type, coverage area
38
- - **Custom fields** — Use Shortcut custom fields for QA metadata when configured
39
-
40
- ### Story Relationships
41
-
42
- - **Blocking / blocked by** — Link stories for dependencies
43
- - **External links** — Link to test cases, requirements, coverage reports
44
- - **Comments** — Add reproduction steps, evidence, verification notes
45
-
46
- ## Authentication
47
-
48
- | Variable | Description |
49
- | -------- | ----------- |
50
- | `SHORTCUT_API_TOKEN` | API token from Shortcut Settings → Account → API Tokens |
51
-
52
- Store in `.env`; never hardcode. Header: `Shortcut-Token: <token>`.
53
-
54
- ## Key API Endpoints
55
-
56
- | Method | Endpoint | Use |
57
- | ------ | -------- | --- |
58
- | POST | `/api/v3/stories` | Create story |
59
- | GET | `/api/v3/stories/{story_id}` | Get story |
60
- | PUT | `/api/v3/stories/{story_id}` | Update story |
61
- | GET | `/api/v3/search/stories` | Search stories (query, epic, iteration) |
62
- | GET | `/api/v3/epics` | List epics |
63
- | GET | `/api/v3/iterations` | List iterations |
64
- | GET | `/api/v3/workflows` | List workflow states |
65
-
66
- See `references/api-patterns.md` for request/response patterns.
67
-
68
- ## Integration with QA Skills
69
-
70
- | Skill | Integration |
71
- | ----- | ----------- |
72
- | **qa-bug-ticket-creator** | Create Shortcut story from bug report; map severity/priority to labels |
73
- | **qa-task-creator** | Create Shortcut story from QA task; link to epic/iteration |
74
- | **qa-coverage-analyzer** | Create stories for coverage gaps; label by component |
75
- | **qa-flaky-detector** | Create stories for flaky tests; story type = bug |
76
-
77
- When qa-bug-ticket-creator or qa-task-creator outputs a structured ticket, this skill translates it to Shortcut story format and creates/updates via API.
78
-
79
- ## Trigger Phrases
80
-
81
- - "Create Shortcut story from [bug report / test failure]"
82
- - "Add QA task to Shortcut"
83
- - "Create story in Shortcut for coverage gap"
84
- - "Update Shortcut story #123 with verification result"
85
- - "Search Shortcut for stories in epic [name]"
86
- - "Link story to test case / requirement"
87
- - "Bulk-create Shortcut stories from [coverage / spec / flaky] output"
88
-
89
- ## Workflow
90
-
91
- 1. **Input** — Bug report, QA task, coverage gap, or user request
92
- 2. **Map** — Translate to Shortcut story format per `references/field-mapping.md`
93
- 3. **Resolve** — Get project_id, epic_id, iteration_id from workspace (or user input)
94
- 4. **Create/Update** — POST or PUT via REST API
95
- 5. **Link** — Add external links to test cases, requirements, evidence
96
- 6. **Output** — Return story URL and ID
97
-
98
- ## Scope
99
-
100
- **Can do (autonomous):**
101
- - Create stories from bug reports and QA tasks
102
- - Update story status, labels, description
103
- - Search stories by query, epic, iteration
104
- - Map QA metadata to Shortcut labels and story types
105
- - Add external links to test cases and requirements
106
- - Work with qa-bug-ticket-creator and qa-task-creator outputs
107
-
108
- **Cannot do (requires confirmation):**
109
- - Create stories without project_id (user must provide or configure)
110
- - Assign to members without mapping
111
- - Create epics/iterations without workspace admin
112
-
113
- **Will not do (out of scope):**
114
- - Modify production or test code
115
- - Close or archive stories (stakeholder responsibility)
116
- - Integrate with Jira/Linear/GitHub (use respective skills)
117
-
118
- ## Quality Checklist
119
-
120
- - [ ] Story includes title, description, and appropriate story type
121
- - [ ] Labels map to QA metadata (severity, component, test type)
122
- - [ ] External links added for test cases/requirements when applicable
123
- - [ ] No hardcoded secrets; token from `SHORTCUT_API_TOKEN`
124
- - [ ] Field mapping follows `references/field-mapping.md`
125
- - [ ] API patterns from `references/api-patterns.md` used correctly
126
-
127
- ## Troubleshooting
128
-
129
- | Symptom | Likely Cause | Fix |
130
- | ------- | ------------ | --- |
131
- | 401 Unauthorized | Missing or invalid token | Check `SHORTCUT_API_TOKEN`; regenerate at Shortcut Settings |
132
- | 404 Not Found | Invalid story_id or project_id | Verify IDs; use search to resolve by name |
133
- | 422 Validation Error | Invalid field value | Check field-mapping; ensure enum values match Shortcut |
134
- | Rate limit (429) | >200 req/min | Throttle requests; batch where possible |
135
- | Epic/iteration not found | ID from wrong workspace | List epics/iterations; use correct IDs |
136
- | Labels not applied | Label doesn't exist | Create labels in Shortcut; use exact names |
137
-
138
- ## Reference Files
139
-
140
- | Topic | File |
141
- | ----- | ---- |
142
- | API patterns (stories, epics, iterations) | `references/api-patterns.md` |
143
- | QA field → Shortcut field mapping | `references/field-mapping.md` |