qa-flowkit 0.4.0-alpha.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 (149) hide show
  1. package/.qa-ai/adapters/aider/.aider/README.md +25 -0
  2. package/.qa-ai/adapters/aider/.aider.conf.yml +6 -0
  3. package/.qa-ai/adapters/claude/agents/qa-workflow-orchestrator.md +18 -0
  4. package/.qa-ai/adapters/claude/commands/qa-add-tests.md +42 -0
  5. package/.qa-ai/adapters/claude/commands/qa-automation-plan.md +43 -0
  6. package/.qa-ai/adapters/claude/commands/qa-clean.md +42 -0
  7. package/.qa-ai/adapters/claude/commands/qa-config.md +51 -0
  8. package/.qa-ai/adapters/claude/commands/qa-coverage.md +46 -0
  9. package/.qa-ai/adapters/claude/commands/qa-doctor.md +11 -0
  10. package/.qa-ai/adapters/claude/commands/qa-full-flow.md +59 -0
  11. package/.qa-ai/adapters/claude/commands/qa-gate.md +36 -0
  12. package/.qa-ai/adapters/claude/commands/qa-help.md +30 -0
  13. package/.qa-ai/adapters/claude/commands/qa-init.md +70 -0
  14. package/.qa-ai/adapters/claude/commands/qa-status.md +56 -0
  15. package/.qa-ai/adapters/claude/commands/qa-update-tests.md +47 -0
  16. package/.qa-ai/adapters/claude/commands/qa-validate-features.md +36 -0
  17. package/.qa-ai/adapters/cline/.cline/README.md +25 -0
  18. package/.qa-ai/adapters/cline/.clinerules +9 -0
  19. package/.qa-ai/adapters/codex/README.md +44 -0
  20. package/.qa-ai/adapters/codex/prompts/implement-project.md +15 -0
  21. package/.qa-ai/adapters/continue/README.md +26 -0
  22. package/.qa-ai/adapters/continue/checks/qa-feature-conventions.md +15 -0
  23. package/.qa-ai/adapters/gemini/GEMINI.md +40 -0
  24. package/.qa-ai/adapters/generic/AGENTS.md +100 -0
  25. package/.qa-ai/adapters/goose/recipes/qa-flowkit.yaml +20 -0
  26. package/.qa-ai/adapters/opencode/README.md +57 -0
  27. package/.qa-ai/adapters/opencode/agents/qa-workflow.md +18 -0
  28. package/.qa-ai/adapters/opencode/commands/qa-add-tests.md +42 -0
  29. package/.qa-ai/adapters/opencode/commands/qa-automation-plan.md +43 -0
  30. package/.qa-ai/adapters/opencode/commands/qa-clean.md +42 -0
  31. package/.qa-ai/adapters/opencode/commands/qa-config.md +51 -0
  32. package/.qa-ai/adapters/opencode/commands/qa-coverage.md +46 -0
  33. package/.qa-ai/adapters/opencode/commands/qa-doctor.md +13 -0
  34. package/.qa-ai/adapters/opencode/commands/qa-full-flow.md +59 -0
  35. package/.qa-ai/adapters/opencode/commands/qa-gate.md +36 -0
  36. package/.qa-ai/adapters/opencode/commands/qa-help.md +30 -0
  37. package/.qa-ai/adapters/opencode/commands/qa-init.md +70 -0
  38. package/.qa-ai/adapters/opencode/commands/qa-status.md +56 -0
  39. package/.qa-ai/adapters/opencode/commands/qa-update-tests.md +47 -0
  40. package/.qa-ai/adapters/opencode/commands/qa-validate-features.md +36 -0
  41. package/.qa-ai/agents/README.md +39 -0
  42. package/.qa-ai/agents/api-testing-agent.md +73 -0
  43. package/.qa-ai/agents/automation-feasibility-agent.md +128 -0
  44. package/.qa-ai/agents/gherkin-test-design-agent.md +110 -0
  45. package/.qa-ai/agents/jira-task-agent.md +92 -0
  46. package/.qa-ai/agents/pr-agent.md +101 -0
  47. package/.qa-ai/agents/qa-context-intake-agent.md +75 -0
  48. package/.qa-ai/agents/qa-workflow-orchestrator.md +113 -0
  49. package/.qa-ai/agents/release-gate-agent.md +50 -0
  50. package/.qa-ai/agents/requirements-intake-agent.md +79 -0
  51. package/.qa-ai/agents/requirements-normalization-agent.md +80 -0
  52. package/.qa-ai/agents/specialists/available/appium.md +59 -0
  53. package/.qa-ai/agents/specialists/available/cypress.md +68 -0
  54. package/.qa-ai/agents/specialists/available/generic-test-design.md +117 -0
  55. package/.qa-ai/agents/specialists/available/jira.md +108 -0
  56. package/.qa-ai/agents/specialists/available/karate.md +97 -0
  57. package/.qa-ai/agents/specialists/available/playwright-api.md +87 -0
  58. package/.qa-ai/agents/specialists/available/playwright-ui.md +87 -0
  59. package/.qa-ai/agents/specialists/available/postman.md +108 -0
  60. package/.qa-ai/agents/specialists/available/rest-assured.md +103 -0
  61. package/.qa-ai/agents/specialists/available/selenium.md +91 -0
  62. package/.qa-ai/agents/specialists/available/testrail.md +85 -0
  63. package/.qa-ai/agents/specialists/available/webdriverio.md +81 -0
  64. package/.qa-ai/agents/test-design-system-agent.md +33 -0
  65. package/.qa-ai/agents/testrail-coverage-agent.md +84 -0
  66. package/.qa-ai/agents/testrail-sync-agent.md +96 -0
  67. package/.qa-ai/agents/webdriverio-implementation-agent.md +84 -0
  68. package/.qa-ai/presets/manual-only.yaml +65 -0
  69. package/.qa-ai/presets/selenium-jest-browserstack.yaml +72 -0
  70. package/.qa-ai/presets/webdriverio-playwright-api.yaml +85 -0
  71. package/.qa-ai/rules/api-testing.rules.md +7 -0
  72. package/.qa-ai/rules/approval.rules.md +8 -0
  73. package/.qa-ai/rules/automation.rules.md +7 -0
  74. package/.qa-ai/rules/gherkin.rules.md +12 -0
  75. package/.qa-ai/rules/testrail.rules.md +10 -0
  76. package/.qa-ai/rules/webdriverio.rules.md +9 -0
  77. package/.qa-ai/scripts/bootstrap-agent-adapters.mjs +127 -0
  78. package/.qa-ai/scripts/clean.mjs +243 -0
  79. package/.qa-ai/scripts/config.mjs +202 -0
  80. package/.qa-ai/scripts/doctor.mjs +383 -0
  81. package/.qa-ai/scripts/init.mjs +447 -0
  82. package/.qa-ai/scripts/lib/markdown-table.mjs +76 -0
  83. package/.qa-ai/scripts/lib/project-config.mjs +184 -0
  84. package/.qa-ai/scripts/lib/qa-next-steps.mjs +578 -0
  85. package/.qa-ai/scripts/lib/release-gate.mjs +66 -0
  86. package/.qa-ai/scripts/lib/test-design.mjs +92 -0
  87. package/.qa-ai/scripts/lib/test-management-mapping.mjs +73 -0
  88. package/.qa-ai/scripts/lib/utils.mjs +331 -0
  89. package/.qa-ai/scripts/qa-help.mjs +44 -0
  90. package/.qa-ai/scripts/smoke-npm-pack.mjs +187 -0
  91. package/.qa-ai/scripts/smoke-test.mjs +465 -0
  92. package/.qa-ai/scripts/sync-agent-adapters.mjs +121 -0
  93. package/.qa-ai/scripts/test-validators.mjs +334 -0
  94. package/.qa-ai/scripts/validate-active-specialists.mjs +106 -0
  95. package/.qa-ai/scripts/validate-features.mjs +277 -0
  96. package/.qa-ai/scripts/validate-release-gate.mjs +105 -0
  97. package/.qa-ai/scripts/validate-sync-plan.mjs +186 -0
  98. package/.qa-ai/scripts/validate-target.mjs +104 -0
  99. package/.qa-ai/scripts/validate-test-design.mjs +117 -0
  100. package/.qa-ai/scripts/validate-traceability.mjs +183 -0
  101. package/.qa-ai/templates/automation-feasibility-report.template.md +21 -0
  102. package/.qa-ai/templates/automation-implementation-plan.template.md +23 -0
  103. package/.qa-ai/templates/feature.template +13 -0
  104. package/.qa-ai/templates/jira-automation-task.template.md +25 -0
  105. package/.qa-ai/templates/pr-template.md +60 -0
  106. package/.qa-ai/templates/release-gate.template.yaml +16 -0
  107. package/.qa-ai/templates/requirement-analysis.template.md +17 -0
  108. package/.qa-ai/templates/test-design-proposal.template.md +26 -0
  109. package/.qa-ai/templates/test-design-system.template.md +15 -0
  110. package/.qa-ai/templates/test-management-mapping.template.json +18 -0
  111. package/.qa-ai/templates/testrail-coverage-analysis.template.md +17 -0
  112. package/.qa-ai/templates/testrail-sync-plan.template.md +22 -0
  113. package/.qa-ai/templates/traceability-matrix.template.md +4 -0
  114. package/.qa-ai/workflows/automation-analysis.md +23 -0
  115. package/.qa-ai/workflows/cleanup.md +52 -0
  116. package/.qa-ai/workflows/context-intake.md +66 -0
  117. package/.qa-ai/workflows/full-flow.md +55 -0
  118. package/.qa-ai/workflows/implementation.md +24 -0
  119. package/.qa-ai/workflows/intake.md +3 -0
  120. package/.qa-ai/workflows/pr.md +3 -0
  121. package/.qa-ai/workflows/release-gate.md +22 -0
  122. package/.qa-ai/workflows/test-design-system.md +33 -0
  123. package/.qa-ai/workflows/test-design.md +23 -0
  124. package/.qa-ai/workflows/testrail-sync.md +23 -0
  125. package/CHANGELOG.md +108 -0
  126. package/CODE_OF_CONDUCT.md +11 -0
  127. package/CONTRIBUTING.md +39 -0
  128. package/LICENSE +21 -0
  129. package/README.es.md +602 -0
  130. package/README.md +633 -0
  131. package/ROADMAP.md +107 -0
  132. package/SECURITY.md +18 -0
  133. package/bin/qa-flowkit.mjs +214 -0
  134. package/docs/qa-ai/agent-compatibility.md +100 -0
  135. package/docs/qa-ai/architecture.md +130 -0
  136. package/docs/qa-ai/backlog.md +393 -0
  137. package/docs/qa-ai/cleanup.md +104 -0
  138. package/docs/qa-ai/customizing-agents.md +148 -0
  139. package/docs/qa-ai/getting-started.md +385 -0
  140. package/docs/qa-ai/implementation-guide-for-codex.md +210 -0
  141. package/docs/qa-ai/npm-migration-plan.md +50 -0
  142. package/docs/qa-ai/open-source-release-checklist.md +17 -0
  143. package/docs/qa-ai/qa-help.md +76 -0
  144. package/docs/qa-ai/release-gate.md +60 -0
  145. package/docs/qa-ai/terminal-transcripts.md +316 -0
  146. package/docs/qa-ai/test-design-dual-mode.md +75 -0
  147. package/docs/qa-ai/troubleshooting.md +740 -0
  148. package/docs/qa-ai/workflow.md +147 -0
  149. package/package.json +72 -0
@@ -0,0 +1,184 @@
1
+ import path from 'node:path';
2
+ import { getConfigValue } from './utils.mjs';
3
+
4
+ export function slug(value) {
5
+ return String(value || '')
6
+ .trim()
7
+ .toLowerCase()
8
+ .replace(/[^a-z0-9]+/g, '-')
9
+ .replace(/^-+|-+$/g, '') || 'custom';
10
+ }
11
+
12
+ export function isConfiguredFramework(value) {
13
+ const normalized = String(value || '').trim().toLowerCase();
14
+ return Boolean(normalized) && !['none', 'undecided', 'manual', 'n/a', 'na'].includes(normalized);
15
+ }
16
+
17
+ export function addCommonDirs(dirs, config) {
18
+ const featureRoot = getConfigValue(config, 'gherkin.featurePath', 'features');
19
+ const featureTypes = ['functional', 'integration', 'e2e', 'api', 'accessibility', 'manual'];
20
+
21
+ dirs.add('qa-ai-output');
22
+ dirs.add(featureRoot);
23
+ for (const type of featureTypes) dirs.add(path.join(featureRoot, type));
24
+
25
+ const matrixPath = getConfigValue(config, 'traceability.matrixPath', 'qa-ai-output/traceability-matrix.md');
26
+ if (matrixPath) dirs.add(path.dirname(matrixPath));
27
+
28
+ const mappingFile = getConfigValue(config, 'testrail.mappingFile', 'qa-ai-output/test-management-mapping.json');
29
+ if (mappingFile) dirs.add(path.dirname(mappingFile));
30
+
31
+ const knowledgeSummaryPath = getConfigValue(config, 'knowledge.summaryPath', 'qa-ai-output/qa-knowledge-summary.md');
32
+ const knowledgeDecisionsPath = getConfigValue(config, 'knowledge.decisionsPath', 'qa-ai-output/qa-init-decisions.md');
33
+ if (knowledgeSummaryPath) dirs.add(path.dirname(knowledgeSummaryPath));
34
+ if (knowledgeDecisionsPath) dirs.add(path.dirname(knowledgeDecisionsPath));
35
+ }
36
+
37
+ export function addUiDirs(dirs, config) {
38
+ const framework = String(getConfigValue(config, 'automation.ui.framework', 'none')).toLowerCase();
39
+ const specsPath = getConfigValue(config, 'automation.ui.specsPath', '');
40
+ const pageObjectsPath = getConfigValue(config, 'automation.ui.pageObjectsPath', '');
41
+
42
+ if (isConfiguredFramework(framework)) {
43
+ const base = specsPath ? path.dirname(specsPath) : path.join('tests', slug(framework));
44
+ dirs.add(specsPath || path.join(base, 'specs'));
45
+ if (pageObjectsPath || framework !== 'api') dirs.add(pageObjectsPath || path.join(base, 'pageobjects'));
46
+ dirs.add(path.join(base, 'helpers'));
47
+ dirs.add(path.join(base, 'fixtures'));
48
+ }
49
+ }
50
+
51
+ export function addApiDirs(dirs, config) {
52
+ const framework = String(getConfigValue(config, 'automation.api.framework', 'none')).toLowerCase();
53
+ const specsPath = getConfigValue(config, 'automation.api.specsPath', '');
54
+ if (!isConfiguredFramework(framework)) return;
55
+
56
+ const base = specsPath ? path.dirname(specsPath) : path.join('tests', slug(framework));
57
+ dirs.add(specsPath || path.join(base, 'specs'));
58
+ dirs.add(path.join(base, 'clients'));
59
+ dirs.add(path.join(base, 'fixtures'));
60
+ dirs.add(path.join(base, 'schemas'));
61
+ dirs.add(path.join(base, 'helpers'));
62
+ }
63
+
64
+ export function configuredDirs(config) {
65
+ const dirs = new Set();
66
+ addCommonDirs(dirs, config);
67
+ addUiDirs(dirs, config);
68
+ addApiDirs(dirs, config);
69
+ return dirs;
70
+ }
71
+
72
+ export const specialistCatalog = {
73
+ 'playwright-ui': {
74
+ title: 'Playwright UI Specialist',
75
+ categories: ['ui'],
76
+ aliases: ['playwright', 'playwright-ui']
77
+ },
78
+ cypress: {
79
+ title: 'Cypress Specialist',
80
+ categories: ['ui'],
81
+ aliases: ['cypress']
82
+ },
83
+ webdriverio: {
84
+ title: 'WebdriverIO Specialist',
85
+ categories: ['ui'],
86
+ aliases: ['webdriverio', 'wdio']
87
+ },
88
+ selenium: {
89
+ title: 'Selenium Specialist',
90
+ categories: ['ui'],
91
+ aliases: ['selenium', 'selenium-jest-browserstack']
92
+ },
93
+ 'playwright-api': {
94
+ title: 'Playwright API Specialist',
95
+ categories: ['api'],
96
+ aliases: ['playwright-api', 'playwright']
97
+ },
98
+ postman: {
99
+ title: 'Postman/Newman Specialist',
100
+ categories: ['api'],
101
+ aliases: ['postman', 'newman']
102
+ },
103
+ 'rest-assured': {
104
+ title: 'REST Assured Specialist',
105
+ categories: ['api'],
106
+ aliases: ['rest-assured', 'restassured']
107
+ },
108
+ karate: {
109
+ title: 'Karate API Specialist',
110
+ categories: ['api'],
111
+ aliases: ['karate']
112
+ },
113
+ appium: {
114
+ title: 'Appium Specialist',
115
+ categories: ['mobile'],
116
+ aliases: ['appium']
117
+ },
118
+ 'generic-test-design': {
119
+ title: 'Generic Test Design Specialist',
120
+ categories: ['test-design'],
121
+ aliases: ['generic-test-design', 'test-design', 'non-gherkin']
122
+ },
123
+ testrail: {
124
+ title: 'TestRail Specialist',
125
+ categories: ['test-management'],
126
+ aliases: ['testrail']
127
+ },
128
+ jira: {
129
+ title: 'Jira Specialist',
130
+ categories: ['issue-tracker'],
131
+ aliases: ['jira']
132
+ }
133
+ };
134
+
135
+ export function activeSpecialists(config) {
136
+ const mode = String(getConfigValue(config, 'agents.specialistMode', 'auto')).toLowerCase();
137
+ if (mode === 'off' || mode === 'none') return [];
138
+
139
+ const wanted = [
140
+ ['ui', getConfigValue(config, 'automation.ui.framework', '')],
141
+ ['api', getConfigValue(config, 'automation.api.framework', '')],
142
+ ['test-management', getConfigValue(config, 'tools.testManagement', '')],
143
+ ['issue-tracker', getConfigValue(config, 'tools.issueTracker', '')]
144
+ ];
145
+
146
+ const active = new Map();
147
+ for (const [category, value] of wanted) {
148
+ const normalized = slug(value);
149
+ if (!isConfiguredFramework(normalized)) continue;
150
+ const entry = Object.entries(specialistCatalog).find(([, details]) => (
151
+ details.categories.includes(category) && details.aliases.map(slug).includes(normalized)
152
+ ));
153
+ if (entry) active.set(entry[0], entry[1]);
154
+ }
155
+
156
+ if (mode === 'required' && active.size < wanted.filter(([, value]) => isConfiguredFramework(slug(value))).length) {
157
+ console.warn('Warning: specialistMode is required, but some configured tools do not have specialists yet.');
158
+ }
159
+
160
+ active.set('generic-test-design', specialistCatalog['generic-test-design']);
161
+ return [...active.entries()].sort(([a], [b]) => a.localeCompare(b));
162
+ }
163
+
164
+ export function activeSpecialistsContent(config, sourceCommand = 'node .qa-ai/scripts/init.mjs') {
165
+ const specialists = activeSpecialists(config);
166
+ const lines = [
167
+ '# Active QA AI Specialists',
168
+ '',
169
+ `Generated by \`${sourceCommand}\` from \`qa-ai.config.yaml\`.`,
170
+ 'The orchestrator should load only these specialist instructions in addition to the generic agents.',
171
+ ''
172
+ ];
173
+
174
+ if (specialists.length === 0) {
175
+ lines.push('No specialist agents are active. Use the generic agents.');
176
+ } else {
177
+ for (const [id, details] of specialists) {
178
+ lines.push(`- \`${id}\`: ${details.title} (` + details.categories.join(', ') + `)`);
179
+ lines.push(` - Source: \`.qa-ai/agents/specialists/available/${id}.md\``);
180
+ }
181
+ }
182
+ lines.push('');
183
+ return `${lines.join('\n')}\n`;
184
+ }