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.
- package/.qa-ai/adapters/aider/.aider/README.md +25 -0
- package/.qa-ai/adapters/aider/.aider.conf.yml +6 -0
- package/.qa-ai/adapters/claude/agents/qa-workflow-orchestrator.md +18 -0
- package/.qa-ai/adapters/claude/commands/qa-add-tests.md +42 -0
- package/.qa-ai/adapters/claude/commands/qa-automation-plan.md +43 -0
- package/.qa-ai/adapters/claude/commands/qa-clean.md +42 -0
- package/.qa-ai/adapters/claude/commands/qa-config.md +51 -0
- package/.qa-ai/adapters/claude/commands/qa-coverage.md +46 -0
- package/.qa-ai/adapters/claude/commands/qa-doctor.md +11 -0
- package/.qa-ai/adapters/claude/commands/qa-full-flow.md +59 -0
- package/.qa-ai/adapters/claude/commands/qa-gate.md +36 -0
- package/.qa-ai/adapters/claude/commands/qa-help.md +30 -0
- package/.qa-ai/adapters/claude/commands/qa-init.md +70 -0
- package/.qa-ai/adapters/claude/commands/qa-status.md +56 -0
- package/.qa-ai/adapters/claude/commands/qa-update-tests.md +47 -0
- package/.qa-ai/adapters/claude/commands/qa-validate-features.md +36 -0
- package/.qa-ai/adapters/cline/.cline/README.md +25 -0
- package/.qa-ai/adapters/cline/.clinerules +9 -0
- package/.qa-ai/adapters/codex/README.md +44 -0
- package/.qa-ai/adapters/codex/prompts/implement-project.md +15 -0
- package/.qa-ai/adapters/continue/README.md +26 -0
- package/.qa-ai/adapters/continue/checks/qa-feature-conventions.md +15 -0
- package/.qa-ai/adapters/gemini/GEMINI.md +40 -0
- package/.qa-ai/adapters/generic/AGENTS.md +100 -0
- package/.qa-ai/adapters/goose/recipes/qa-flowkit.yaml +20 -0
- package/.qa-ai/adapters/opencode/README.md +57 -0
- package/.qa-ai/adapters/opencode/agents/qa-workflow.md +18 -0
- package/.qa-ai/adapters/opencode/commands/qa-add-tests.md +42 -0
- package/.qa-ai/adapters/opencode/commands/qa-automation-plan.md +43 -0
- package/.qa-ai/adapters/opencode/commands/qa-clean.md +42 -0
- package/.qa-ai/adapters/opencode/commands/qa-config.md +51 -0
- package/.qa-ai/adapters/opencode/commands/qa-coverage.md +46 -0
- package/.qa-ai/adapters/opencode/commands/qa-doctor.md +13 -0
- package/.qa-ai/adapters/opencode/commands/qa-full-flow.md +59 -0
- package/.qa-ai/adapters/opencode/commands/qa-gate.md +36 -0
- package/.qa-ai/adapters/opencode/commands/qa-help.md +30 -0
- package/.qa-ai/adapters/opencode/commands/qa-init.md +70 -0
- package/.qa-ai/adapters/opencode/commands/qa-status.md +56 -0
- package/.qa-ai/adapters/opencode/commands/qa-update-tests.md +47 -0
- package/.qa-ai/adapters/opencode/commands/qa-validate-features.md +36 -0
- package/.qa-ai/agents/README.md +39 -0
- package/.qa-ai/agents/api-testing-agent.md +73 -0
- package/.qa-ai/agents/automation-feasibility-agent.md +128 -0
- package/.qa-ai/agents/gherkin-test-design-agent.md +110 -0
- package/.qa-ai/agents/jira-task-agent.md +92 -0
- package/.qa-ai/agents/pr-agent.md +101 -0
- package/.qa-ai/agents/qa-context-intake-agent.md +75 -0
- package/.qa-ai/agents/qa-workflow-orchestrator.md +113 -0
- package/.qa-ai/agents/release-gate-agent.md +50 -0
- package/.qa-ai/agents/requirements-intake-agent.md +79 -0
- package/.qa-ai/agents/requirements-normalization-agent.md +80 -0
- package/.qa-ai/agents/specialists/available/appium.md +59 -0
- package/.qa-ai/agents/specialists/available/cypress.md +68 -0
- package/.qa-ai/agents/specialists/available/generic-test-design.md +117 -0
- package/.qa-ai/agents/specialists/available/jira.md +108 -0
- package/.qa-ai/agents/specialists/available/karate.md +97 -0
- package/.qa-ai/agents/specialists/available/playwright-api.md +87 -0
- package/.qa-ai/agents/specialists/available/playwright-ui.md +87 -0
- package/.qa-ai/agents/specialists/available/postman.md +108 -0
- package/.qa-ai/agents/specialists/available/rest-assured.md +103 -0
- package/.qa-ai/agents/specialists/available/selenium.md +91 -0
- package/.qa-ai/agents/specialists/available/testrail.md +85 -0
- package/.qa-ai/agents/specialists/available/webdriverio.md +81 -0
- package/.qa-ai/agents/test-design-system-agent.md +33 -0
- package/.qa-ai/agents/testrail-coverage-agent.md +84 -0
- package/.qa-ai/agents/testrail-sync-agent.md +96 -0
- package/.qa-ai/agents/webdriverio-implementation-agent.md +84 -0
- package/.qa-ai/presets/manual-only.yaml +65 -0
- package/.qa-ai/presets/selenium-jest-browserstack.yaml +72 -0
- package/.qa-ai/presets/webdriverio-playwright-api.yaml +85 -0
- package/.qa-ai/rules/api-testing.rules.md +7 -0
- package/.qa-ai/rules/approval.rules.md +8 -0
- package/.qa-ai/rules/automation.rules.md +7 -0
- package/.qa-ai/rules/gherkin.rules.md +12 -0
- package/.qa-ai/rules/testrail.rules.md +10 -0
- package/.qa-ai/rules/webdriverio.rules.md +9 -0
- package/.qa-ai/scripts/bootstrap-agent-adapters.mjs +127 -0
- package/.qa-ai/scripts/clean.mjs +243 -0
- package/.qa-ai/scripts/config.mjs +202 -0
- package/.qa-ai/scripts/doctor.mjs +383 -0
- package/.qa-ai/scripts/init.mjs +447 -0
- package/.qa-ai/scripts/lib/markdown-table.mjs +76 -0
- package/.qa-ai/scripts/lib/project-config.mjs +184 -0
- package/.qa-ai/scripts/lib/qa-next-steps.mjs +578 -0
- package/.qa-ai/scripts/lib/release-gate.mjs +66 -0
- package/.qa-ai/scripts/lib/test-design.mjs +92 -0
- package/.qa-ai/scripts/lib/test-management-mapping.mjs +73 -0
- package/.qa-ai/scripts/lib/utils.mjs +331 -0
- package/.qa-ai/scripts/qa-help.mjs +44 -0
- package/.qa-ai/scripts/smoke-npm-pack.mjs +187 -0
- package/.qa-ai/scripts/smoke-test.mjs +465 -0
- package/.qa-ai/scripts/sync-agent-adapters.mjs +121 -0
- package/.qa-ai/scripts/test-validators.mjs +334 -0
- package/.qa-ai/scripts/validate-active-specialists.mjs +106 -0
- package/.qa-ai/scripts/validate-features.mjs +277 -0
- package/.qa-ai/scripts/validate-release-gate.mjs +105 -0
- package/.qa-ai/scripts/validate-sync-plan.mjs +186 -0
- package/.qa-ai/scripts/validate-target.mjs +104 -0
- package/.qa-ai/scripts/validate-test-design.mjs +117 -0
- package/.qa-ai/scripts/validate-traceability.mjs +183 -0
- package/.qa-ai/templates/automation-feasibility-report.template.md +21 -0
- package/.qa-ai/templates/automation-implementation-plan.template.md +23 -0
- package/.qa-ai/templates/feature.template +13 -0
- package/.qa-ai/templates/jira-automation-task.template.md +25 -0
- package/.qa-ai/templates/pr-template.md +60 -0
- package/.qa-ai/templates/release-gate.template.yaml +16 -0
- package/.qa-ai/templates/requirement-analysis.template.md +17 -0
- package/.qa-ai/templates/test-design-proposal.template.md +26 -0
- package/.qa-ai/templates/test-design-system.template.md +15 -0
- package/.qa-ai/templates/test-management-mapping.template.json +18 -0
- package/.qa-ai/templates/testrail-coverage-analysis.template.md +17 -0
- package/.qa-ai/templates/testrail-sync-plan.template.md +22 -0
- package/.qa-ai/templates/traceability-matrix.template.md +4 -0
- package/.qa-ai/workflows/automation-analysis.md +23 -0
- package/.qa-ai/workflows/cleanup.md +52 -0
- package/.qa-ai/workflows/context-intake.md +66 -0
- package/.qa-ai/workflows/full-flow.md +55 -0
- package/.qa-ai/workflows/implementation.md +24 -0
- package/.qa-ai/workflows/intake.md +3 -0
- package/.qa-ai/workflows/pr.md +3 -0
- package/.qa-ai/workflows/release-gate.md +22 -0
- package/.qa-ai/workflows/test-design-system.md +33 -0
- package/.qa-ai/workflows/test-design.md +23 -0
- package/.qa-ai/workflows/testrail-sync.md +23 -0
- package/CHANGELOG.md +108 -0
- package/CODE_OF_CONDUCT.md +11 -0
- package/CONTRIBUTING.md +39 -0
- package/LICENSE +21 -0
- package/README.es.md +602 -0
- package/README.md +633 -0
- package/ROADMAP.md +107 -0
- package/SECURITY.md +18 -0
- package/bin/qa-flowkit.mjs +214 -0
- package/docs/qa-ai/agent-compatibility.md +100 -0
- package/docs/qa-ai/architecture.md +130 -0
- package/docs/qa-ai/backlog.md +393 -0
- package/docs/qa-ai/cleanup.md +104 -0
- package/docs/qa-ai/customizing-agents.md +148 -0
- package/docs/qa-ai/getting-started.md +385 -0
- package/docs/qa-ai/implementation-guide-for-codex.md +210 -0
- package/docs/qa-ai/npm-migration-plan.md +50 -0
- package/docs/qa-ai/open-source-release-checklist.md +17 -0
- package/docs/qa-ai/qa-help.md +76 -0
- package/docs/qa-ai/release-gate.md +60 -0
- package/docs/qa-ai/terminal-transcripts.md +316 -0
- package/docs/qa-ai/test-design-dual-mode.md +75 -0
- package/docs/qa-ai/troubleshooting.md +740 -0
- package/docs/qa-ai/workflow.md +147 -0
- 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
|
+
}
|