@keber/qa-framework 1.13.0 → 1.13.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 +35 -0
- package/README.md +1 -1
- package/package.json +2 -3
- package/qa-framework.config.json +1 -1
- package/scripts/upgrade.js +47 -5
- package/docs/visuals/diag-01-ejecutivo-1.png +0 -0
- package/docs/visuals/diag-02-tactico-1.png +0 -0
- package/docs/visuals/diag-03-tecnico-1.png +0 -0
- package/docs/visuals/info-01-ejecutivo-1.png +0 -0
- package/docs/visuals/info-02-tactico-1.png +0 -0
- package/docs/visuals/info-03-tecnico-1.png +0 -0
- package/docs/visuals/pres-01-ejecutivo-1.png +0 -0
- package/docs/visuals/pres-02-tactico-1.png +0 -0
- package/docs/visuals/pres-03-tecnico-1.png +0 -0
- package/docs/visuals/qa-01-problema-1.png +0 -0
- package/docs/visuals/qa-02-que-es-1.png +0 -0
- package/docs/visuals/qa-03-pipeline-1.png +0 -0
- package/docs/visuals/qa-04-6-archivos-1.png +0 -0
- package/docs/visuals/qa-05-humano-1.png +0 -0
- package/docs/visuals/qa-06-agente-1.png +0 -0
- package/docs/visuals/qa-07-skills-arch-1.png +0 -0
- package/docs/visuals/qa-08-traceability-1.png +0 -0
- package/docs/visuals/qa-en-01-problem-1.png +0 -0
- package/docs/visuals/qa-en-02-what-is-1.png +0 -0
- package/docs/visuals/qa-en-03-pipeline-1.png +0 -0
- package/docs/visuals/qa-en-04-6files-1.png +0 -0
- package/docs/visuals/qa-en-05-human-1.png +0 -0
- package/docs/visuals/qa-en-06-agent-1.png +0 -0
- package/docs/visuals/qa-en-07-skills-arch-1.png +0 -0
- package/docs/visuals/qa-en-08-traceability-1.png +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,41 @@ Versioning follows [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [1.13.2] - 2026-11-06
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **`upgrade` no longer moves user-owned content during the legacy layout migrations.**
|
|
15
|
+
Section 5c used to move every unknown folder under `07-automation/e2e/` into `tests/`
|
|
16
|
+
(including `lib/`, `node_modules/`, `.auth/` and `test-results/`). It now moves a folder
|
|
17
|
+
only when it contains `*.spec.*` files and is not a tooling folder (`node_modules`, `lib`,
|
|
18
|
+
`test-results`, `playwright-report`, `blob-report`) or a dot-folder. Section 6 used to move
|
|
19
|
+
every flat `.md` in `02-test-plans/` to `sprints/legacy/`; it now moves only pre-v1.7.0
|
|
20
|
+
plans: files named `*-test-plan.md` or carrying the old `**Plan ID**: TP-` header.
|
|
21
|
+
A path that cannot be read is reported as a warning and left alone: unproven means
|
|
22
|
+
untouched.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## [1.13.1] - 2026-11-06
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
|
|
30
|
+
- **`package.json`** - `docs/visuals/` no longer ships to npm. The `files` allow list
|
|
31
|
+
carried a blanket `docs/` entry, so the 25 presentation images added in `f1064e1`
|
|
32
|
+
started being published without anyone deciding to: the tarball went from 410 KB
|
|
33
|
+
unpacked in 1.11.3 to 51.8 MB in 1.12.0, and every `npm install` has paid for it
|
|
34
|
+
since. The entry is now `docs/**/*.md`, which keeps all eight documents - including
|
|
35
|
+
`docs/folder-structure-guide.md` and `docs/spec-driven-philosophy.md`, both named in
|
|
36
|
+
text that `scripts/` writes into consuming projects - and drops the images. The
|
|
37
|
+
images stay in the repository; they are reference material, not runtime content.
|
|
38
|
+
Unpacked size: 51.8 MB -> 630 KB. Exactly the 25 images leave the package and
|
|
39
|
+
nothing else moves.
|
|
40
|
+
- **`package.json`** - removed `agent-instructions/` from `files`. The directory does
|
|
41
|
+
not exist, so the entry had been matching nothing.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
10
45
|
## [1.13.0] - 2026-11-04
|
|
11
46
|
|
|
12
47
|
Dated by its release, not by its bump. `package.json` was moved to `1.13.0` on 2026-10-16,
|
package/README.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keber/qa-framework",
|
|
3
|
-
"version": "1.13.
|
|
3
|
+
"version": "1.13.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",
|
|
@@ -28,10 +28,9 @@
|
|
|
28
28
|
"version": "node scripts/sync-version.js && git add README.md .github/copilot-instructions.md qa-framework.config.json"
|
|
29
29
|
},
|
|
30
30
|
"files": [
|
|
31
|
-
"agent-instructions/",
|
|
32
31
|
"skills/",
|
|
33
32
|
"templates/",
|
|
34
|
-
"docs
|
|
33
|
+
"docs/**/*.md",
|
|
35
34
|
"examples/",
|
|
36
35
|
"integrations/",
|
|
37
36
|
"scripts/",
|
package/qa-framework.config.json
CHANGED
package/scripts/upgrade.js
CHANGED
|
@@ -19,13 +19,14 @@
|
|
|
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
|
+
* (only folders holding *.spec.* files; lib/, node_modules/, dot-folders stay)
|
|
22
23
|
* - Creates integration/ and load/ placeholders * - Patches playwright.config.ts: testDir '.' -> './tests', adds testIgnore
|
|
23
24
|
* - Creates tests/helpers/debug/ and tests/seeds/ if absent
|
|
24
25
|
*
|
|
25
26
|
* MIGRATES (v1.6.x -> v1.7.0, non-destructive):
|
|
26
27
|
* - qa/02-test-plans/automated/ -> qa/02-test-plans/sprints/legacy-automated/
|
|
27
28
|
* - qa/02-test-plans/manual/ -> qa/02-test-plans/sprints/legacy-manual/
|
|
28
|
-
* - qa/02-test-plans
|
|
29
|
+
* - qa/02-test-plans/*-test-plan.md (or "**Plan ID**: TP-" header) -> sprints/legacy/
|
|
29
30
|
* - Creates qa/02-test-plans/sprints/ if absent
|
|
30
31
|
* - Creates qa/03-test-cases/README.md optional marker if absent
|
|
31
32
|
*
|
|
@@ -316,12 +317,37 @@ if (fs.existsSync(oldFixturesDir) && !fs.existsSync(newFixturesDir)) {
|
|
|
316
317
|
}
|
|
317
318
|
|
|
318
319
|
// 5c. Spec stubs: e2e/{module}/*.spec.ts -> e2e/tests/{module}/
|
|
319
|
-
// Moves
|
|
320
|
+
// Moves a directory directly under e2e/ only when it is provably a legacy module
|
|
321
|
+
// folder: not a known scaffold/tooling dir, not a dot-folder, and it contains at
|
|
322
|
+
// least one spec file. Anything else (lib/, node_modules/, docs/...) is user-owned.
|
|
320
323
|
const testsDir = path.join(e2eDir, 'tests');
|
|
321
|
-
const knownE2eDirs = new Set([
|
|
324
|
+
const knownE2eDirs = new Set([
|
|
325
|
+
'tests', 'page-objects', 'fixtures', 'diagnosis', 'scripts', 'seeds', 'helpers',
|
|
326
|
+
'node_modules', 'lib', 'test-results', 'playwright-report', 'blob-report',
|
|
327
|
+
]);
|
|
328
|
+
const SPEC_FILE_RE = /\.spec\.[cm]?[jt]s$/;
|
|
329
|
+
|
|
330
|
+
function containsSpecFile(dir) {
|
|
331
|
+
let entries;
|
|
332
|
+
try {
|
|
333
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
334
|
+
} catch (err) {
|
|
335
|
+
// Unreadable means unproven: leave the folder where it is.
|
|
336
|
+
warnings.push(`Cannot inspect ${path.relative(cwd, dir)} (${err.code}) - not migrated.`);
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
for (const entry of entries) {
|
|
340
|
+
if (entry.isFile() && SPEC_FILE_RE.test(entry.name)) return true;
|
|
341
|
+
if (entry.isDirectory() && entry.name !== 'node_modules' && !entry.name.startsWith('.') &&
|
|
342
|
+
containsSpecFile(path.join(dir, entry.name))) return true;
|
|
343
|
+
}
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
|
|
322
347
|
if (fs.existsSync(e2eDir)) {
|
|
323
348
|
for (const entry of fs.readdirSync(e2eDir, { withFileTypes: true })) {
|
|
324
|
-
if (!entry.isDirectory() || knownE2eDirs.has(entry.name)) continue;
|
|
349
|
+
if (!entry.isDirectory() || knownE2eDirs.has(entry.name) || entry.name.startsWith('.')) continue;
|
|
350
|
+
if (!containsSpecFile(path.join(e2eDir, entry.name))) continue;
|
|
325
351
|
const oldModDir = path.join(e2eDir, entry.name);
|
|
326
352
|
const newModDir = path.join(testsDir, entry.name);
|
|
327
353
|
if (!fs.existsSync(newModDir)) {
|
|
@@ -442,12 +468,28 @@ if (fs.existsSync(testPlansDir)) {
|
|
|
442
468
|
}
|
|
443
469
|
}
|
|
444
470
|
|
|
445
|
-
// Move
|
|
471
|
+
// Move flat .md files in 02-test-plans/ only when they are provably pre-v1.7.0 plans:
|
|
472
|
+
// named {module}-test-plan.md / {module}-{track}-test-plan.md (qa-test-plan <= v1.6.x),
|
|
473
|
+
// or generated from the old templates/test-plan.md (header "**Plan ID**: TP-...").
|
|
474
|
+
// Any other flat .md (README.md, plan-sprint-1.md, notes) is user-owned and stays.
|
|
475
|
+
const LEGACY_PLAN_NAME_RE = /-test-plan\.md$/i;
|
|
476
|
+
const LEGACY_PLAN_HEADER_RE = /^\*\*Plan ID\*\*:\s*TP-/m;
|
|
477
|
+
const isLegacyPlan = (file) => {
|
|
478
|
+
if (LEGACY_PLAN_NAME_RE.test(path.basename(file))) return true;
|
|
479
|
+
try {
|
|
480
|
+
return LEGACY_PLAN_HEADER_RE.test(fs.readFileSync(file, 'utf8'));
|
|
481
|
+
} catch (err) {
|
|
482
|
+
warnings.push(`Cannot read 02-test-plans/${path.basename(file)} (${err.code}) - not migrated.`);
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
485
|
+
};
|
|
486
|
+
|
|
446
487
|
if (fs.existsSync(testPlansDir)) {
|
|
447
488
|
const legacyDir = path.join(sprintsDir, 'legacy');
|
|
448
489
|
for (const entry of fs.readdirSync(testPlansDir, { withFileTypes: true })) {
|
|
449
490
|
if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
|
|
450
491
|
const oldFile = path.join(testPlansDir, entry.name);
|
|
492
|
+
if (!isLegacyPlan(oldFile)) continue;
|
|
451
493
|
const newFile = path.join(legacyDir, entry.name);
|
|
452
494
|
if (!fs.existsSync(newFile)) {
|
|
453
495
|
if (!dryRun) {
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|