qaa-agent 1.7.4 → 1.8.1
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/.mcp.json +4 -0
- package/CHANGELOG.md +40 -0
- package/README.md +26 -44
- package/agents/qa-pipeline-orchestrator.md +47 -0
- package/agents/qaa-analyzer.md +41 -0
- package/agents/qaa-bug-detective.md +95 -0
- package/agents/qaa-codebase-mapper.md +3 -0
- package/agents/qaa-e2e-runner.md +86 -0
- package/agents/qaa-executor.md +98 -0
- package/agents/qaa-planner.md +41 -0
- package/agents/qaa-testid-injector.md +68 -0
- package/agents/qaa-validator.md +47 -0
- package/bin/install.cjs +253 -212
- package/commands/qa-audit.md +7 -0
- package/commands/qa-create-test.md +30 -0
- package/commands/qa-fix.md +4 -0
- package/commands/qa-map.md +2 -0
- package/package.json +3 -2
package/bin/install.cjs
CHANGED
|
@@ -1,212 +1,253 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (fs.existsSync(
|
|
174
|
-
|
|
175
|
-
if (
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* QAA Agent Installer
|
|
5
|
+
*
|
|
6
|
+
* Installs QAA (QA Automation Agent) into the user's Claude Code environment.
|
|
7
|
+
*
|
|
8
|
+
* What it does:
|
|
9
|
+
* 1. Copies agents, commands, skills, templates, workflows, docs, bin, and config files
|
|
10
|
+
* to the chosen install directory (global ~/.claude/qaa or local ./.claude/qaa)
|
|
11
|
+
* 2. Registers Playwright MCP and Context7 MCP as global MCP servers
|
|
12
|
+
* 3. Merges required permissions into Claude Code settings.json
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* npx qaa-agent
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const path = require('path');
|
|
20
|
+
const readline = require('readline');
|
|
21
|
+
const { execSync } = require('child_process');
|
|
22
|
+
|
|
23
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
function log(msg) { console.log(` ${msg}`); }
|
|
26
|
+
function success(msg) { console.log(` ✓ ${msg}`); }
|
|
27
|
+
function warn(msg) { console.log(` ⚠ ${msg}`); }
|
|
28
|
+
function fail(msg) { console.error(` ✗ ${msg}`); }
|
|
29
|
+
|
|
30
|
+
function ask(question) {
|
|
31
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
32
|
+
return new Promise(resolve => {
|
|
33
|
+
rl.question(` ${question} `, answer => {
|
|
34
|
+
rl.close();
|
|
35
|
+
resolve(answer.trim());
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function copyDirRecursive(src, dest) {
|
|
41
|
+
if (!fs.existsSync(src)) return 0;
|
|
42
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
43
|
+
let count = 0;
|
|
44
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
const srcPath = path.join(src, entry.name);
|
|
47
|
+
const destPath = path.join(dest, entry.name);
|
|
48
|
+
if (entry.isDirectory()) {
|
|
49
|
+
count += copyDirRecursive(srcPath, destPath);
|
|
50
|
+
} else {
|
|
51
|
+
fs.copyFileSync(srcPath, destPath);
|
|
52
|
+
count++;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return count;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function deepMerge(target, source) {
|
|
59
|
+
for (const key of Object.keys(source)) {
|
|
60
|
+
if (
|
|
61
|
+
source[key] && typeof source[key] === 'object' && !Array.isArray(source[key]) &&
|
|
62
|
+
target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])
|
|
63
|
+
) {
|
|
64
|
+
deepMerge(target[key], source[key]);
|
|
65
|
+
} else if (Array.isArray(source[key]) && Array.isArray(target[key])) {
|
|
66
|
+
// Merge arrays without duplicates
|
|
67
|
+
const merged = [...new Set([...target[key], ...source[key]])];
|
|
68
|
+
target[key] = merged;
|
|
69
|
+
} else {
|
|
70
|
+
target[key] = source[key];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return target;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ── MCP Registration ─────────────────────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
function registerMcpServers(claudeJsonPath) {
|
|
79
|
+
const mcpServers = {
|
|
80
|
+
playwright: {
|
|
81
|
+
command: 'npx',
|
|
82
|
+
args: ['@playwright/mcp@latest']
|
|
83
|
+
},
|
|
84
|
+
context7: {
|
|
85
|
+
command: 'npx',
|
|
86
|
+
args: ['-y', '@upstash/context7-mcp@latest']
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
let config = {};
|
|
91
|
+
if (fs.existsSync(claudeJsonPath)) {
|
|
92
|
+
try {
|
|
93
|
+
config = JSON.parse(fs.readFileSync(claudeJsonPath, 'utf-8'));
|
|
94
|
+
} catch {
|
|
95
|
+
config = {};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!config.mcpServers) config.mcpServers = {};
|
|
100
|
+
|
|
101
|
+
let added = [];
|
|
102
|
+
for (const [name, serverConfig] of Object.entries(mcpServers)) {
|
|
103
|
+
if (!config.mcpServers[name]) {
|
|
104
|
+
config.mcpServers[name] = serverConfig;
|
|
105
|
+
added.push(name);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
fs.writeFileSync(claudeJsonPath, JSON.stringify(config, null, 2) + '\n');
|
|
110
|
+
return added;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ── Settings Merge ───────────────────────────────────────────────────────────
|
|
114
|
+
|
|
115
|
+
function mergeSettings(installDir, packageDir) {
|
|
116
|
+
const srcSettings = path.join(packageDir, 'settings.json');
|
|
117
|
+
if (!fs.existsSync(srcSettings)) return false;
|
|
118
|
+
|
|
119
|
+
const claudeDir = path.dirname(installDir);
|
|
120
|
+
const destSettings = path.join(claudeDir, 'settings.json');
|
|
121
|
+
|
|
122
|
+
const source = JSON.parse(fs.readFileSync(srcSettings, 'utf-8'));
|
|
123
|
+
|
|
124
|
+
let target = {};
|
|
125
|
+
if (fs.existsSync(destSettings)) {
|
|
126
|
+
try {
|
|
127
|
+
target = JSON.parse(fs.readFileSync(destSettings, 'utf-8'));
|
|
128
|
+
} catch {
|
|
129
|
+
target = {};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
deepMerge(target, source);
|
|
134
|
+
fs.writeFileSync(destSettings, JSON.stringify(target, null, 2) + '\n');
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ── Main ─────────────────────────────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
async function main() {
|
|
141
|
+
console.log('');
|
|
142
|
+
console.log(' ╔═══════════════════════════════════════╗');
|
|
143
|
+
console.log(' ║ QAA — QA Automation Agent Installer ║');
|
|
144
|
+
console.log(' ╚═══════════════════════════════════════╝');
|
|
145
|
+
console.log('');
|
|
146
|
+
|
|
147
|
+
// Determine package root (where the npm package files are)
|
|
148
|
+
const packageDir = path.resolve(__dirname, '..');
|
|
149
|
+
|
|
150
|
+
// Check that package files exist
|
|
151
|
+
const requiredDirs = ['agents', 'commands', 'skills'];
|
|
152
|
+
const missing = requiredDirs.filter(d => !fs.existsSync(path.join(packageDir, d)));
|
|
153
|
+
if (missing.length > 0) {
|
|
154
|
+
fail(`Package incomplete — missing: ${missing.join(', ')}`);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Ask install scope
|
|
159
|
+
console.log(' Install scope:');
|
|
160
|
+
console.log(' 1) Global — ~/.claude/qaa (available in all projects)');
|
|
161
|
+
console.log(' 2) Local — ./.claude/qaa (this project only)');
|
|
162
|
+
console.log('');
|
|
163
|
+
const scopeChoice = await ask('Choose [1/2] (default: 1):');
|
|
164
|
+
const isGlobal = scopeChoice !== '2';
|
|
165
|
+
|
|
166
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE;
|
|
167
|
+
const claudeDir = isGlobal
|
|
168
|
+
? path.join(homeDir, '.claude')
|
|
169
|
+
: path.join(process.cwd(), '.claude');
|
|
170
|
+
const installDir = path.join(claudeDir, 'qaa');
|
|
171
|
+
|
|
172
|
+
// Check for existing installation
|
|
173
|
+
if (fs.existsSync(installDir)) {
|
|
174
|
+
const overwrite = await ask('QAA already installed at this location. Overwrite? [y/N]:');
|
|
175
|
+
if (overwrite.toLowerCase() !== 'y') {
|
|
176
|
+
log('Installation cancelled.');
|
|
177
|
+
process.exit(0);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
console.log('');
|
|
182
|
+
log(`Installing to: ${installDir}`);
|
|
183
|
+
console.log('');
|
|
184
|
+
|
|
185
|
+
// ── Step 1: Copy files ──────────────────────────────────────────────────
|
|
186
|
+
|
|
187
|
+
const dirsToCopy = ['agents', 'commands', 'skills', 'templates', 'workflows', 'docs', 'bin'];
|
|
188
|
+
const filesToCopy = ['CLAUDE.md', 'CHANGELOG.md', '.mcp.json', 'package.json'];
|
|
189
|
+
|
|
190
|
+
let totalFiles = 0;
|
|
191
|
+
|
|
192
|
+
for (const dir of dirsToCopy) {
|
|
193
|
+
const src = path.join(packageDir, dir);
|
|
194
|
+
const dest = path.join(installDir, dir);
|
|
195
|
+
if (fs.existsSync(src)) {
|
|
196
|
+
const count = copyDirRecursive(src, dest);
|
|
197
|
+
success(`${dir}/ — ${count} files`);
|
|
198
|
+
totalFiles += count;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
for (const file of filesToCopy) {
|
|
203
|
+
const src = path.join(packageDir, file);
|
|
204
|
+
const dest = path.join(installDir, file);
|
|
205
|
+
if (fs.existsSync(src)) {
|
|
206
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
207
|
+
fs.copyFileSync(src, dest);
|
|
208
|
+
success(file);
|
|
209
|
+
totalFiles++;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
console.log('');
|
|
214
|
+
|
|
215
|
+
// ── Step 2: Register MCP servers ────────────────────────────────────────
|
|
216
|
+
|
|
217
|
+
const claudeJsonPath = path.join(homeDir, '.claude.json');
|
|
218
|
+
const addedMcps = registerMcpServers(claudeJsonPath);
|
|
219
|
+
|
|
220
|
+
if (addedMcps.length > 0) {
|
|
221
|
+
success(`MCP servers registered: ${addedMcps.join(', ')} → ${claudeJsonPath}`);
|
|
222
|
+
} else {
|
|
223
|
+
success('MCP servers already configured (playwright, context7)');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ── Step 3: Merge settings ──────────────────────────────────────────────
|
|
227
|
+
|
|
228
|
+
const settingsMerged = mergeSettings(installDir, packageDir);
|
|
229
|
+
if (settingsMerged) {
|
|
230
|
+
success('Permissions merged into settings.json');
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// ── Done ────────────────────────────────────────────────────────────────
|
|
234
|
+
|
|
235
|
+
console.log('');
|
|
236
|
+
console.log(' ╔═══════════════════════════════════════╗');
|
|
237
|
+
console.log(' ║ Installation complete! ║');
|
|
238
|
+
console.log(' ╚═══════════════════════════════════════╝');
|
|
239
|
+
console.log('');
|
|
240
|
+
log(`${totalFiles} files installed to ${installDir}`);
|
|
241
|
+
log('MCP servers: playwright, context7');
|
|
242
|
+
log('');
|
|
243
|
+
log('Restart Claude Code, then run any QAA command:');
|
|
244
|
+
log(' /qa-start --dev-repo ./your-project');
|
|
245
|
+
log(' /qa-create-test login');
|
|
246
|
+
log(' /qa-map');
|
|
247
|
+
console.log('');
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
main().catch(err => {
|
|
251
|
+
fail(err.message);
|
|
252
|
+
process.exit(1);
|
|
253
|
+
});
|
package/commands/qa-audit.md
CHANGED
|
@@ -42,6 +42,7 @@ else:
|
|
|
42
42
|
Scores across 6 dimensions: Locator Quality (20%), Assertion Specificity (20%), POM Compliance (15%), Test Coverage (20%), Naming Convention (15%), Test Data Management (10%).
|
|
43
43
|
|
|
44
44
|
1. Read `CLAUDE.md` — quality gates, locator tiers, assertion rules, POM rules, naming conventions.
|
|
45
|
+
1b. Read `~/.claude/qaa/MY_PREFERENCES.md` if it exists — user/company preferences override CLAUDE.md defaults.
|
|
45
46
|
2. Invoke validator agent in audit mode:
|
|
46
47
|
|
|
47
48
|
Task(
|
|
@@ -50,6 +51,8 @@ Task(
|
|
|
50
51
|
<execution_context>@agents/qaa-validator.md</execution_context>
|
|
51
52
|
<files_to_read>
|
|
52
53
|
- CLAUDE.md
|
|
54
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
55
|
+
- .qa-output/locators/LOCATOR_REGISTRY.md (if exists)
|
|
53
56
|
</files_to_read>
|
|
54
57
|
<parameters>
|
|
55
58
|
user_input: $ARGUMENTS
|
|
@@ -68,6 +71,7 @@ Task(
|
|
|
68
71
|
Analyze test distribution against the ideal testing pyramid from CLAUDE.md (Unit 60-70%, Integration 10-15%, API 20-25%, E2E 3-5%). Compares actual percentages to targets and produces an action plan.
|
|
69
72
|
|
|
70
73
|
1. Read `CLAUDE.md` — testing pyramid target percentages.
|
|
74
|
+
1b. Read `~/.claude/qaa/MY_PREFERENCES.md` if it exists — user/company preferences override CLAUDE.md defaults.
|
|
71
75
|
2. Invoke analyzer agent for pyramid analysis:
|
|
72
76
|
|
|
73
77
|
Task(
|
|
@@ -76,6 +80,7 @@ Task(
|
|
|
76
80
|
<execution_context>@agents/qaa-analyzer.md</execution_context>
|
|
77
81
|
<files_to_read>
|
|
78
82
|
- CLAUDE.md
|
|
83
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
79
84
|
</files_to_read>
|
|
80
85
|
<parameters>
|
|
81
86
|
user_input: $ARGUMENTS
|
|
@@ -98,6 +103,7 @@ Generate a summary report of current QA status. Adapts detail level to audience.
|
|
|
98
103
|
- `client` — coverage summary, confidence level, test pass rates, risk mitigation status
|
|
99
104
|
|
|
100
105
|
1. Read `CLAUDE.md` — testing pyramid targets, quality gates.
|
|
106
|
+
1b. Read `~/.claude/qaa/MY_PREFERENCES.md` if it exists — user/company preferences override CLAUDE.md defaults.
|
|
101
107
|
2. Invoke analyzer agent for status reporting:
|
|
102
108
|
|
|
103
109
|
Task(
|
|
@@ -106,6 +112,7 @@ Task(
|
|
|
106
112
|
<execution_context>@agents/qaa-analyzer.md</execution_context>
|
|
107
113
|
<files_to_read>
|
|
108
114
|
- CLAUDE.md
|
|
115
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
109
116
|
</files_to_read>
|
|
110
117
|
<parameters>
|
|
111
118
|
user_input: $ARGUMENTS
|
|
@@ -81,6 +81,7 @@ App URL: {url or "auto-detect"}
|
|
|
81
81
|
### FROM CODE MODE
|
|
82
82
|
|
|
83
83
|
1. Read `CLAUDE.md` — POM rules, locator tiers, assertion rules, naming conventions, quality gates.
|
|
84
|
+
1b. Read `~/.claude/qaa/MY_PREFERENCES.md` if it exists — user's personal QA preferences override CLAUDE.md defaults when there is a conflict.
|
|
84
85
|
2. Read existing analysis artifacts if available:
|
|
85
86
|
- `.qa-output/QA_ANALYSIS.md` — architecture context
|
|
86
87
|
- `.qa-output/TEST_INVENTORY.md` — pre-defined test cases for this feature
|
|
@@ -127,6 +128,7 @@ Task(
|
|
|
127
128
|
<execution_context>@agents/qaa-executor.md</execution_context>
|
|
128
129
|
<files_to_read>
|
|
129
130
|
- CLAUDE.md
|
|
131
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
130
132
|
- .qa-output/locators/LOCATOR_REGISTRY.md (if exists)
|
|
131
133
|
- .qa-output/locators/{feature}.locators.md (if exists)
|
|
132
134
|
- .qa-output/codebase/CODE_PATTERNS.md (if exists)
|
|
@@ -151,6 +153,8 @@ Task(
|
|
|
151
153
|
<execution_context>@agents/qaa-e2e-runner.md</execution_context>
|
|
152
154
|
<files_to_read>
|
|
153
155
|
- CLAUDE.md
|
|
156
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
157
|
+
- .qa-output/locators/LOCATOR_REGISTRY.md (if exists)
|
|
154
158
|
- {generated E2E test files from executor return}
|
|
155
159
|
- {generated POM files from executor return}
|
|
156
160
|
</files_to_read>
|
|
@@ -210,6 +214,7 @@ Task(
|
|
|
210
214
|
<execution_context>@agents/qaa-validator.md</execution_context>
|
|
211
215
|
<files_to_read>
|
|
212
216
|
- CLAUDE.md
|
|
217
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
213
218
|
</files_to_read>
|
|
214
219
|
<parameters>
|
|
215
220
|
user_input: $ARGUMENTS
|
|
@@ -228,6 +233,7 @@ Task(
|
|
|
228
233
|
<execution_context>@agents/qaa-executor.md</execution_context>
|
|
229
234
|
<files_to_read>
|
|
230
235
|
- CLAUDE.md
|
|
236
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
231
237
|
- .qa-output/QA_AUDIT_REPORT.md
|
|
232
238
|
- .qa-output/locators/LOCATOR_REGISTRY.md (if exists)
|
|
233
239
|
</files_to_read>
|
|
@@ -262,6 +268,7 @@ Task(
|
|
|
262
268
|
<execution_context>@agents/qaa-executor.md</execution_context>
|
|
263
269
|
<files_to_read>
|
|
264
270
|
- CLAUDE.md
|
|
271
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
265
272
|
- .qa-output/locators/LOCATOR_REGISTRY.md (if exists)
|
|
266
273
|
</files_to_read>
|
|
267
274
|
<parameters>
|
|
@@ -286,3 +293,26 @@ Task(
|
|
|
286
293
|
- Every POM extends BasePage
|
|
287
294
|
|
|
288
295
|
$ARGUMENTS
|
|
296
|
+
|
|
297
|
+
## MANDATORY verification — run ALL commands below, no exceptions, no skipping
|
|
298
|
+
|
|
299
|
+
Before returning control, copy-paste and run this ENTIRE block. Do NOT decide which commands "apply" — run all of them every time. The output confirms what happened; you do not get to assume the answer.
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
echo "=== CHECKLIST START ==="
|
|
303
|
+
echo "1. Locator Registry:"
|
|
304
|
+
ls .qa-output/locators/ 2>/dev/null || echo "NO_LOCATORS_FOUND"
|
|
305
|
+
echo "2. MY_PREFERENCES.md:"
|
|
306
|
+
cat ~/.claude/qaa/MY_PREFERENCES.md 2>/dev/null || echo "FILE_NOT_FOUND"
|
|
307
|
+
echo "3. Generated test files:"
|
|
308
|
+
find tests/ pages/ fixtures/ -type f 2>/dev/null | head -20 || echo "NO_TEST_FILES_FOUND"
|
|
309
|
+
echo "4. MCP evidence (if browser was used):"
|
|
310
|
+
ls .qa-output/mcp-evidence/ 2>/dev/null || echo "NO_MCP_EVIDENCE"
|
|
311
|
+
echo "=== CHECKLIST END ==="
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**Rules:**
|
|
315
|
+
- Run the block AS-IS. Do not modify it. Do not split it. Do not skip lines.
|
|
316
|
+
- If any output shows a problem (NO_LOCATORS when MCP was used, NO_TEST_FILES after generation), fix it before returning.
|
|
317
|
+
- If output shows expected "not found" results (e.g., NO_MCP_EVIDENCE when no browser was used), that is fine — the point is you RAN the command instead of assuming the answer.
|
|
318
|
+
- Do NOT mark this task as complete until the block has been executed and you have read every line of output.
|
package/commands/qa-fix.md
CHANGED
|
@@ -335,6 +335,8 @@ Task(
|
|
|
335
335
|
<execution_context>@agents/qaa-e2e-runner.md</execution_context>
|
|
336
336
|
<files_to_read>
|
|
337
337
|
- CLAUDE.md
|
|
338
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
339
|
+
- .qa-output/locators/LOCATOR_REGISTRY.md (if exists)
|
|
338
340
|
- {E2E test files from validated directory}
|
|
339
341
|
- {POM files from validated directory}
|
|
340
342
|
</files_to_read>
|
|
@@ -364,6 +366,8 @@ Task(
|
|
|
364
366
|
<execution_context>@agents/qaa-bug-detective.md</execution_context>
|
|
365
367
|
<files_to_read>
|
|
366
368
|
- CLAUDE.md
|
|
369
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
370
|
+
- .qa-output/locators/LOCATOR_REGISTRY.md (if exists)
|
|
367
371
|
</files_to_read>
|
|
368
372
|
<parameters>
|
|
369
373
|
user_input: $ARGUMENTS
|
package/commands/qa-map.md
CHANGED
|
@@ -99,6 +99,7 @@ Task(
|
|
|
99
99
|
<execution_context>@agents/qaa-scanner.md</execution_context>
|
|
100
100
|
<files_to_read>
|
|
101
101
|
- CLAUDE.md
|
|
102
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
102
103
|
</files_to_read>
|
|
103
104
|
<parameters>
|
|
104
105
|
user_input: $ARGUMENTS
|
|
@@ -114,6 +115,7 @@ Task(
|
|
|
114
115
|
<execution_context>@agents/qaa-analyzer.md</execution_context>
|
|
115
116
|
<files_to_read>
|
|
116
117
|
- CLAUDE.md
|
|
118
|
+
- ~/.claude/qaa/MY_PREFERENCES.md (if exists)
|
|
117
119
|
- .qa-output/SCAN_MANIFEST.md
|
|
118
120
|
- .qa-output/codebase/TESTABILITY.md (if exists)
|
|
119
121
|
- .qa-output/codebase/RISK_MAP.md (if exists)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "qaa-agent",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "QA Automation Agent for Claude Code — multi-agent pipeline that analyzes repos, generates tests, validates, and creates PRs",
|
|
5
5
|
"bin": {
|
|
6
6
|
"qaa-agent": "./bin/install.cjs"
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
"author": "Backhaus7997",
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@playwright/mcp": "latest"
|
|
25
|
+
"@playwright/mcp": "latest",
|
|
26
|
+
"@upstash/context7-mcp": "latest"
|
|
26
27
|
},
|
|
27
28
|
"files": [
|
|
28
29
|
"bin/",
|