@keber/qa-framework 1.6.1 → 1.6.2
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/CHANGELOG.md +31 -5
- package/README.md +13 -13
- package/docs/folder-structure-guide.md +53 -0
- package/package.json +1 -1
- package/scripts/init.js +2 -0
- package/scripts/upgrade.js +41 -2
- package/templates/automation-scaffold/playwright.config.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -33,6 +33,33 @@ has been removed or parameterized. See `docs/comparison-matrix.md` and `docs/gen
|
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
36
|
+
## [1.6.2] - 2026-05-05
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
|
|
40
|
+
- **`tests/helpers/debug/`** — diagnostic scripts directory created by `init` and `upgrade` inside
|
|
41
|
+
`07-automation/e2e/tests/`. Scripts here are excluded from test runs via `testIgnore`.
|
|
42
|
+
- **`tests/seeds/`** — data seeding specs directory created by `init` and `upgrade` inside
|
|
43
|
+
`07-automation/e2e/tests/`. Excluded from test runs via `testIgnore`.
|
|
44
|
+
- **`testIgnore`** in `playwright.config.ts` template — excludes `**/helpers/debug/**` and
|
|
45
|
+
`**/seeds/**` from Playwright test discovery.
|
|
46
|
+
- **`upgrade` step 5e** — patches existing `playwright.config.ts` in `e2e/`: replaces
|
|
47
|
+
`testDir: '.'` with `'./tests'`, injects `testIgnore` if missing, creates `helpers/debug/`
|
|
48
|
+
and `seeds/` if absent.
|
|
49
|
+
- **Dual-Track Pipeline** section in `docs/folder-structure-guide.md` and `qa/QA-STRUCTURE-GUIDE.md`
|
|
50
|
+
— documents the automation track and manual track as parallel paths sharing `01-specifications/`
|
|
51
|
+
as source of truth. Includes entry point table (3 scenarios) and track selection guidance.
|
|
52
|
+
Clarifies that `03-test-cases/` is the manual track artifact and `04-test-data/` is optional.
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- `qa/QA-STRUCTURE-GUIDE.md` — removed stale reference to deleted `docs/generalization-decisions.md`
|
|
57
|
+
from the `06-defects/` section.
|
|
58
|
+
- `README.md` — pipeline table updated with Track column; `03-test-cases/` and `04-test-data/`
|
|
59
|
+
annotated as manual-track / optional in the directory tree.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
36
63
|
## [1.6.0] - 2026-04-29
|
|
37
64
|
|
|
38
65
|
### Changed (breaking - automated by `upgrade`)
|
|
@@ -69,11 +96,10 @@ has been removed or parameterized. See `docs/comparison-matrix.md` and `docs/gen
|
|
|
69
96
|
- `07-automation/load/` — placeholder for load and performance tests; created on `init` and `upgrade`.
|
|
70
97
|
- **`scripts/upgrade.js` migration section 5** — detects old v1.5.x structure and relocates all
|
|
71
98
|
affected files non-destructively (moves only when destination does not exist; warns on conflict).
|
|
72
|
-
- **Stage
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
upstream artifact update rules.
|
|
99
|
+
- **Stage 5b - Test Stabilization** (`skills/qa-test-stabilization/`) — skill for exhaustively
|
|
100
|
+
reviewing and stabilizing generated Playwright tests before ADO integration. Covers baseline
|
|
101
|
+
collection, failure classification (9 categories), false-positive validation, confidence scoring
|
|
102
|
+
(>=90% exit threshold), `STABILIZATION-REPORT.md` schema, and upstream artifact update rules.
|
|
77
103
|
|
|
78
104
|
### Planned
|
|
79
105
|
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# qa-framework
|
|
2
2
|
|
|
3
3
|
> Reusable, installable, agent-oriented QA framework for spec-driven automated testing.
|
|
4
|
-
> Current version: **v1.6.
|
|
4
|
+
> Current version: **v1.6.2**
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -170,8 +170,8 @@ qa/
|
|
|
170
170
|
├── 01-specifications/ <- Functional specs (used by generate command)
|
|
171
171
|
├── {module}/{submodule}/ <- 6-file spec sets created per module/submodule in config
|
|
172
172
|
├── 02-test-plans/ <- Test plans (automated + manual)
|
|
173
|
-
├── 03-test-cases/ <-
|
|
174
|
-
├── 04-test-data/ <-
|
|
173
|
+
├── 03-test-cases/ <- TC-*.md step-by-step docs (manual track; optional if fully automated)
|
|
174
|
+
├── 04-test-data/ <- Shared test data factories/seeders (optional — per-module data lives in 01-specs)
|
|
175
175
|
├── 05-test-execution/ <- Execution reports and results
|
|
176
176
|
├── 06-defects/open|resolved/ <- Defect tracking
|
|
177
177
|
├── 07-automation/ <- Playwright automation code and config
|
|
@@ -220,16 +220,16 @@ them via `read_file` without touching `node_modules`.
|
|
|
220
220
|
|
|
221
221
|
Skills map to the pipeline stages enforced by `.github/copilot-instructions.md`:
|
|
222
222
|
|
|
223
|
-
| Stage | Skill | Task | Prerequisite |
|
|
224
|
-
|
|
225
|
-
| 1 | `qa-module-analysis` | Analyze module, produce 6-file spec set | None |
|
|
226
|
-
| 2 | `qa-spec-generation` | Generate/update 6-file spec set | `00-inventory.md` exists |
|
|
227
|
-
| 3 | `qa-test-plan` | Generate test plan | `05-test-scenarios.md` exists |
|
|
228
|
-
| 4 | `qa-test-cases` | Generate TC-{ID}.md files | Test plan exists |
|
|
229
|
-
| 5 | `qa-automation` | Implement Playwright tests | Specs approved, no PENDING-CODE |
|
|
230
|
-
| 5b | `qa-test-stabilization` | Stabilize failing tests | Failing tests exist |
|
|
231
|
-
| 6 | `qa-maintenance` | Update artifacts after app changes | Delivered change |
|
|
232
|
-
| - | `qa-ado-integration` | Sync with Azure DevOps Test Plans | ADO enabled in config |
|
|
223
|
+
| Stage | Skill | Task | Track | Prerequisite |
|
|
224
|
+
|---|---|---|---|---|
|
|
225
|
+
| 1 | `qa-module-analysis` | Analyze module, produce 6-file spec set | Both | None |
|
|
226
|
+
| 2 | `qa-spec-generation` | Generate/update 6-file spec set | Both | `00-inventory.md` exists |
|
|
227
|
+
| 3 | `qa-test-plan` | Generate test plan | Both | `05-test-scenarios.md` exists |
|
|
228
|
+
| 4 | `qa-test-cases` | Generate TC-{ID}.md files | Manual | Test plan exists |
|
|
229
|
+
| 5 | `qa-automation` | Implement Playwright tests | Automation | Specs approved, no PENDING-CODE |
|
|
230
|
+
| 5b | `qa-test-stabilization` | Stabilize failing tests | Automation | Failing tests exist |
|
|
231
|
+
| 6 | `qa-maintenance` | Update artifacts after app changes | Both | Delivered change |
|
|
232
|
+
| - | `qa-ado-integration` | Sync with Azure DevOps Test Plans | Both | ADO enabled in config |
|
|
233
233
|
|
|
234
234
|
See [docs/skills-architecture.md](docs/skills-architecture.md) for the full design rationale.
|
|
235
235
|
|
|
@@ -31,6 +31,59 @@ Agent skills live in `.github/skills/` (not inside `qa/`). See the `.github/skil
|
|
|
31
31
|
|
|
32
32
|
---
|
|
33
33
|
|
|
34
|
+
## Dual-Track Pipeline
|
|
35
|
+
|
|
36
|
+
All pipeline paths share the same input: `01-specifications/`. From there, work splits into
|
|
37
|
+
two tracks that can run in parallel or independently depending on team maturity.
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
01-specifications/ (source of truth — what the app does and what must be tested)
|
|
41
|
+
│
|
|
42
|
+
├─── Automation track ──────────────────────────────────────────────────
|
|
43
|
+
│ │
|
|
44
|
+
│ ▼
|
|
45
|
+
│ 02-test-plans/automated/ ← scope + priority decisions
|
|
46
|
+
│ │
|
|
47
|
+
│ ▼
|
|
48
|
+
│ 07-automation/e2e/tests/ ← Playwright .spec.ts files
|
|
49
|
+
│ │
|
|
50
|
+
│ ▼
|
|
51
|
+
│ 05-test-execution/automated/ ← execution reports
|
|
52
|
+
│ │
|
|
53
|
+
│ ▼
|
|
54
|
+
│ 08-azure-integration/ ← ADO sync via playwright-azure-reporter
|
|
55
|
+
│
|
|
56
|
+
└─── Manual track ──────────────────────────────────────────────────────
|
|
57
|
+
│
|
|
58
|
+
▼
|
|
59
|
+
02-test-plans/manual/ ← scope + manual test approach
|
|
60
|
+
│
|
|
61
|
+
▼
|
|
62
|
+
03-test-cases/manual/ ← TC-*.md with steps (for human testers)
|
|
63
|
+
│
|
|
64
|
+
▼
|
|
65
|
+
05-test-execution/manual/ ← manual run evidence
|
|
66
|
+
│
|
|
67
|
+
▼
|
|
68
|
+
08-azure-integration/ ← ADO sync via ado-integration skill
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Entry points:**
|
|
72
|
+
|
|
73
|
+
| Scenario | Entry point | Tracks active |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| New system, no prior QA | Module analysis → spec generation | Automation (primary), Manual (as needed) |
|
|
76
|
+
| Sprint with ADO stories | Stories → spec generation → test plan | Both, driven by sprint scope |
|
|
77
|
+
| Maintenance/continuous improvement | Changed module → maintenance skill | Automation (update existing tests) |
|
|
78
|
+
|
|
79
|
+
**Track selection guidance:**
|
|
80
|
+
- Use **automation track** when the goal is regression coverage and CI integration.
|
|
81
|
+
- Use **manual track** when: (a) team has manual testers who need step-by-step documents; (b) auditability or traceability to external standards is required; (c) features are not yet automatable.
|
|
82
|
+
- Both tracks use the same TC-IDs from `01-specifications/*/05-test-scenarios.md` — traceability is preserved regardless of which track executes a given TC.
|
|
83
|
+
- `04-test-data/` is optional in both tracks. Use it when test data factories or seeders are shared across multiple modules. Per-submodule data belongs in `01-specifications/*/04-test-data.md`.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
34
87
|
## .github/skills/
|
|
35
88
|
|
|
36
89
|
**Purpose**: 3-layer QA pipeline skills installed by the framework. Loaded by the agent on demand — only the relevant skill for the current task is loaded, not all skills at once.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keber/qa-framework",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.2",
|
|
4
4
|
"description": "Reusable spec-driven QA framework for IDE-agent-assisted automated testing. Installable as an npm package. Provides structure, templates, agent instructions, and optional integrations for Playwright and Azure DevOps.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"qa",
|
package/scripts/init.js
CHANGED
package/scripts/upgrade.js
CHANGED
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
* - qa/07-automation/.env.example -> qa/07-automation/e2e/
|
|
20
20
|
* - qa/07-automation/fixtures/ -> qa/07-automation/e2e/fixtures/
|
|
21
21
|
* - qa/07-automation/e2e/{module}/ -> qa/07-automation/e2e/tests/{module}/
|
|
22
|
-
* - Creates integration/ and load/ placeholders
|
|
23
|
-
*
|
|
22
|
+
* - Creates integration/ and load/ placeholders * - Patches playwright.config.ts: testDir '.' -> './tests', adds testIgnore
|
|
23
|
+
* - Creates tests/helpers/debug/ and tests/seeds/ if absent *
|
|
24
24
|
* NEVER touches (project-owned):
|
|
25
25
|
* - qa/01-specifications/ <- Your specs
|
|
26
26
|
* - qa/02-test-plans/ <- Your test plans
|
|
@@ -187,6 +187,45 @@ if (!fs.existsSync(loadReadme)) {
|
|
|
187
187
|
console.log(` [created] ${path.relative(cwd, loadReadme)}`);
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
+
// 5e. Patch playwright.config.ts in e2e/:
|
|
191
|
+
const playwrightConfigPath = path.join(e2eDir, 'playwright.config.ts');
|
|
192
|
+
if (fs.existsSync(playwrightConfigPath)) {
|
|
193
|
+
let cfg = fs.readFileSync(playwrightConfigPath, 'utf8');
|
|
194
|
+
let cfgChanged = false;
|
|
195
|
+
|
|
196
|
+
// Fix testDir: '.' -> './tests'
|
|
197
|
+
if (/testDir\s*:\s*['"]\.['"]/.test(cfg)) {
|
|
198
|
+
cfg = cfg.replace(/testDir\s*:\s*['"]\.['"]/g, "testDir: './tests'");
|
|
199
|
+
cfgChanged = true;
|
|
200
|
+
console.log(` [patched] e2e/playwright.config.ts — testDir: '.' -> './tests'`);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Inject testIgnore after testDir line if not present
|
|
204
|
+
if (!cfg.includes('testIgnore')) {
|
|
205
|
+
cfg = cfg.replace(
|
|
206
|
+
/(testDir\s*:.*\n)/,
|
|
207
|
+
"$1 testIgnore: ['**/helpers/debug/**', '**/seeds/**'],\n"
|
|
208
|
+
);
|
|
209
|
+
cfgChanged = true;
|
|
210
|
+
console.log(` [patched] e2e/playwright.config.ts — added testIgnore`);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (cfgChanged) {
|
|
214
|
+
if (!dryRun) fs.writeFileSync(playwrightConfigPath, cfg, 'utf8');
|
|
215
|
+
updated.push(playwrightConfigPath);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Create tests/helpers/debug and tests/seeds if missing
|
|
220
|
+
for (const subdir of ['tests/helpers/debug', 'tests/seeds']) {
|
|
221
|
+
const subdirPath = path.join(e2eDir, subdir);
|
|
222
|
+
if (!fs.existsSync(subdirPath)) {
|
|
223
|
+
if (!dryRun) fs.mkdirSync(subdirPath, { recursive: true });
|
|
224
|
+
updated.push(subdirPath);
|
|
225
|
+
console.log(` [created] ${path.relative(cwd, subdirPath)}/`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
190
229
|
// ---------------------------------------------------------------------------
|
|
191
230
|
// Summary
|
|
192
231
|
// ---------------------------------------------------------------------------
|
|
@@ -39,6 +39,8 @@ for (const key of required) {
|
|
|
39
39
|
export default defineConfig({
|
|
40
40
|
// ------ Test discovery ------
|
|
41
41
|
testDir: './tests',
|
|
42
|
+
// Exclude non-suite directories from test runs
|
|
43
|
+
testIgnore: ['**/helpers/debug/**', '**/seeds/**'],
|
|
42
44
|
// Use any subdir pattern your project standardizes on, e.g.:
|
|
43
45
|
// testMatch: ['**/*.spec.ts'],
|
|
44
46
|
|