qa-engineer 0.9.1 → 0.10.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 (109) hide show
  1. package/COMPATIBILITY.md +50 -26
  2. package/README.md +40 -32
  3. package/package.json +12 -20
  4. package/packages/engine/bin/qa-engine.mjs +336 -0
  5. package/packages/engine/lib/analysis/branding.mjs +187 -0
  6. package/packages/engine/lib/analysis/context.mjs +294 -0
  7. package/packages/{installer/lib/core/schema-validate.mjs → engine/lib/analysis/contracts.mjs} +11 -4
  8. package/packages/engine/lib/analysis/diff-guard.mjs +425 -0
  9. package/packages/engine/lib/analysis/discovery.mjs +220 -0
  10. package/packages/engine/lib/analysis/evidence.mjs +116 -0
  11. package/packages/engine/lib/analysis/har.mjs +90 -0
  12. package/packages/engine/lib/analysis/junit.mjs +126 -0
  13. package/packages/engine/lib/analysis/redaction.mjs +127 -0
  14. package/packages/engine/lib/analysis/report-html.mjs +763 -0
  15. package/packages/engine/lib/analysis/taxonomy.mjs +109 -0
  16. package/packages/engine/lib/analysis/xml.mjs +153 -0
  17. package/packages/engine/lib/analysis/zip.mjs +107 -0
  18. package/packages/engine/lib/diagnostics/engine.mjs +165 -0
  19. package/packages/engine/lib/diagnostics/internal-contracts.mjs +50 -0
  20. package/packages/engine/lib/diagnostics/prioritization.mjs +99 -0
  21. package/packages/engine/lib/diagnostics/repair.mjs +73 -0
  22. package/packages/engine/lib/diagnostics/root-cause.mjs +92 -0
  23. package/packages/engine/lib/diagnostics/timeline.mjs +101 -0
  24. package/packages/engine/lib/frameworks/junit-frameworks.mjs +48 -0
  25. package/packages/engine/lib/frameworks/playwright.mjs +158 -0
  26. package/packages/engine/package.json +14 -0
  27. package/packages/installer/lib/agents/registry.mjs +46 -0
  28. package/packages/installer/lib/commands/doctor.mjs +7 -16
  29. package/packages/installer/lib/commands/install.mjs +59 -4
  30. package/packages/installer/lib/core/bundle.mjs +69 -92
  31. package/packages/installer/lib/core/config.mjs +1 -1
  32. package/packages/installer/lib/core/lockfile.mjs +1 -1
  33. package/packages/installer/lib/core/manifest.mjs +48 -54
  34. package/packages/installer/lib/core/validate-install.mjs +12 -19
  35. package/packages/installer/package.json +1 -1
  36. package/shared/tooling/qa-tool.mjs +125 -0
  37. package/skills/qa-api/SKILL.md +5 -5
  38. package/skills/qa-api/references/deterministic-tooling.md +34 -30
  39. package/skills/qa-api/references/evidence-and-reporting.md +29 -4
  40. package/skills/qa-api/scripts/qa-tool.mjs +126 -0
  41. package/skills/qa-audit/SKILL.md +5 -5
  42. package/skills/qa-audit/references/deterministic-tooling.md +34 -30
  43. package/skills/qa-audit/references/evidence-and-reporting.md +29 -4
  44. package/skills/qa-audit/scripts/qa-tool.mjs +126 -0
  45. package/skills/qa-debug/SKILL.md +6 -6
  46. package/skills/qa-debug/references/deterministic-tooling.md +34 -30
  47. package/skills/qa-debug/references/diagnostic-engine.md +3 -3
  48. package/skills/qa-debug/references/evidence-and-reporting.md +29 -4
  49. package/skills/qa-debug/scripts/qa-tool.mjs +126 -0
  50. package/skills/qa-explore/SKILL.md +22 -5
  51. package/skills/qa-explore/contracts/explore-result.schema.json +26 -2
  52. package/skills/qa-explore/references/deterministic-tooling.md +132 -0
  53. package/skills/qa-explore/references/evidence-and-reporting.md +29 -4
  54. package/skills/qa-explore/references/report-pipeline.md +89 -8
  55. package/skills/qa-explore/scripts/qa-tool.mjs +126 -0
  56. package/skills/qa-fix/SKILL.md +4 -4
  57. package/skills/qa-fix/references/deterministic-tooling.md +34 -30
  58. package/skills/qa-fix/references/diagnostic-engine.md +3 -3
  59. package/skills/qa-fix/references/evidence-and-reporting.md +29 -4
  60. package/skills/qa-fix/scripts/qa-tool.mjs +126 -0
  61. package/skills/qa-flaky/SKILL.md +4 -4
  62. package/skills/qa-flaky/references/deterministic-tooling.md +34 -30
  63. package/skills/qa-flaky/references/evidence-and-reporting.md +29 -4
  64. package/skills/qa-flaky/scripts/qa-tool.mjs +126 -0
  65. package/skills/qa-generate/references/evidence-and-reporting.md +29 -4
  66. package/skills/qa-init/SKILL.md +4 -4
  67. package/skills/qa-init/references/deterministic-tooling.md +34 -30
  68. package/skills/qa-init/references/evidence-and-reporting.md +29 -4
  69. package/skills/qa-init/scripts/qa-tool.mjs +126 -0
  70. package/skills/qa-report/SKILL.md +8 -7
  71. package/skills/qa-report/references/deterministic-tooling.md +34 -30
  72. package/skills/qa-report/references/diagnostic-engine.md +3 -3
  73. package/skills/qa-report/references/evidence-and-reporting.md +29 -4
  74. package/skills/qa-report/scripts/qa-tool.mjs +126 -0
  75. package/skills/qa-review/references/evidence-and-reporting.md +29 -4
  76. package/skills/qa-run/SKILL.md +6 -6
  77. package/skills/qa-run/references/deterministic-tooling.md +34 -30
  78. package/skills/qa-run/references/evidence-and-reporting.md +29 -4
  79. package/skills/qa-run/scripts/qa-tool.mjs +126 -0
  80. package/shared/analysis/lib/qa_analysis/__init__.py +0 -11
  81. package/shared/analysis/lib/qa_analysis/branding.py +0 -175
  82. package/shared/analysis/lib/qa_analysis/cli.py +0 -129
  83. package/shared/analysis/lib/qa_analysis/context.py +0 -233
  84. package/shared/analysis/lib/qa_analysis/contracts.py +0 -158
  85. package/shared/analysis/lib/qa_analysis/diff_guard.py +0 -327
  86. package/shared/analysis/lib/qa_analysis/discovery.py +0 -113
  87. package/shared/analysis/lib/qa_analysis/evidence.py +0 -128
  88. package/shared/analysis/lib/qa_analysis/har.py +0 -58
  89. package/shared/analysis/lib/qa_analysis/junit.py +0 -80
  90. package/shared/analysis/lib/qa_analysis/redaction.py +0 -99
  91. package/shared/analysis/lib/qa_analysis/taxonomy.py +0 -98
  92. package/shared/diagnostics/lib/qa_diagnostics/__init__.py +0 -13
  93. package/shared/diagnostics/lib/qa_diagnostics/cli.py +0 -124
  94. package/shared/diagnostics/lib/qa_diagnostics/engine.py +0 -143
  95. package/shared/diagnostics/lib/qa_diagnostics/internal_contracts.py +0 -75
  96. package/shared/diagnostics/lib/qa_diagnostics/prioritization.py +0 -101
  97. package/shared/diagnostics/lib/qa_diagnostics/repair.py +0 -72
  98. package/shared/diagnostics/lib/qa_diagnostics/root_cause.py +0 -89
  99. package/shared/diagnostics/lib/qa_diagnostics/timeline.py +0 -71
  100. package/shared/frameworks/cypress/lib/cypress_analysis.py +0 -27
  101. package/shared/frameworks/playwright/lib/playwright_analysis.py +0 -167
  102. package/shared/frameworks/selenium/lib/selenium_analysis.py +0 -28
  103. package/shared/frameworks/webdriverio/lib/webdriverio_analysis.py +0 -24
  104. package/shared/tooling/qa_tool.py +0 -127
  105. /package/{shared/analysis/lib/qa_analysis → packages/engine/lib/analysis}/branding.json +0 -0
  106. /package/{shared → packages/engine/lib}/analysis/schemas/context.schema.json +0 -0
  107. /package/{shared → packages/engine/lib}/diagnostics/schemas/internal/analysis-result.schema.json +0 -0
  108. /package/{shared → packages/engine/lib}/diagnostics/schemas/internal/diagnosis.schema.json +0 -0
  109. /package/{shared → packages/engine/lib}/diagnostics/schemas/internal/execution-result-min.schema.json +0 -0
package/COMPATIBILITY.md CHANGED
@@ -6,7 +6,15 @@ This document records which AI coding agents the pack targets, how each one disc
6
6
 
7
7
  ## Release compatibility
8
8
 
9
- No versions have been released yet. Beginning with the first tagged release, this section will carry a matrix of pack versions against tested agent versions and the Agent Skills specification revision each release was validated against.
9
+ | Pack version | Released | Discovery paths verified against agent docs | Live agent runs |
10
+ | --- | --- | --- | --- |
11
+ | 0.9.0, 0.9.1 | 2026-07-28 | Not systematically re-read for the release | Claude Code, Cursor (manual, by the maintainer) |
12
+ | 0.9.2 | 2026-07-28 | Yes — every host's own documentation, re-read on 2026-07-28 (sources in the matrix below) | **Do not use.** The tarball omitted the engine; every command failed on a missing module |
13
+ | 0.9.3 | 2026-07-28 | Yes, as 0.9.2 | Claude Code, Cursor (manual, by the maintainer) |
14
+
15
+ "Verified" in the third column means the discovery paths in the matrix below were read off each host's own documentation on that date and are asserted against the installer by `packages/installer/test/hosts.test.mjs`, which fails if the installer writes to a path that host does not document reading. It does **not** mean the pack was executed inside every host: that is the Tier 1 bar, and only Claude Code and Cursor have had a real run.
16
+
17
+ Documentation is re-read at each release. A test can pin the installer to a recorded claim; it cannot notice that a vendor moved a directory, so that check is a release step performed by a person.
10
18
 
11
19
  ## The standard this pack targets
12
20
 
@@ -14,23 +22,26 @@ Skills are authored against the open [Agent Skills specification](https://agents
14
22
 
15
23
  ## Target agent matrix
16
24
 
17
- Verified against official documentation as of July 2026. Entries marked *unverified* rely on secondary sources and will be confirmed before the relevant integration ships.
25
+ Each row's discovery paths were read off that host's own documentation on **2026-07-28** and are recorded in the installer's agent registry, where a test asserts the installer writes to one of them. The **bold** path is the one `qa install` targets.
26
+
27
+ | Agent | Paths this host reads (project) | Pack installs to | How you reach a skill | Source | Planned tier |
28
+ | --- | --- | --- | --- | --- | --- |
29
+ | Claude Code | `.claude/skills/` | **`.claude/skills/`** | `/qa-explore`, or describe the task | [docs](https://code.claude.com/docs/en/skills) | Tier 1 |
30
+ | OpenAI Codex CLI | `.agents/skills/` — at the working directory, its parent, and the repo root. There is **no** `.codex/skills/` | **`.agents/skills/`** | `$qa-explore`, or `/skills` to browse | [docs](https://developers.openai.com/codex/skills) | Tier 1 |
31
+ | OpenCode | `.agents/skills/`, `.opencode/skills/`, `.claude/skills/` | **`.agents/skills/`** | `/qa-explore` (generated command), or the agent's own `skill` tool | [docs](https://opencode.ai/docs/skills/) | Tier 1 |
32
+ | Cursor | `.agents/skills/`, `.cursor/skills/`, plus Claude and Codex directories | **`.agents/skills/`** | `/` in Agent chat, then pick the skill | [docs](https://cursor.com/docs/skills) | Tier 2 |
33
+ | Antigravity | `.agents/skills/` (default), `.agent/skills/` (legacy) | **`.agents/skills/`** | describe the task — skills auto-activate | [docs](https://antigravity.google/docs/skills) | Tier 2 |
34
+ | GitHub Copilot | `.agents/skills/`, `.github/skills/` | **`.agents/skills/`** | `/qa-explore` in Copilot Chat (generated prompt file) | [docs](https://docs.github.com/en/copilot) | Tier 2 |
35
+ | Gemini CLI | `.agents/skills/`, `.gemini/skills/` | **`.agents/skills/`** | `/qa-explore` (generated command) | [docs](https://google-gemini.github.io/gemini-cli/) | Tier 2 |
36
+ | Kimi (Agent Skills copy) / other spec-compliant hosts | `.agents/skills/` | **`.agents/skills/`** | product's own surface | [spec](https://agentskills.io/specification) | Tier 2 |
18
37
 
19
- | Agent | Native `SKILL.md` support | Skill discovery path the pack targets | Invocation surface | Planned tier |
20
- | --- | --- | --- | --- | --- |
21
- | Claude Code | Yes (format originator) | `.claude/skills/` (project), plugins | `/skill-name`, auto-activation | Tier 1 |
22
- | OpenAI Codex CLI | Yes | `.agents/skills/` | `$skill-name` mention, `/skills` menu, auto-activation | Tier 1 |
23
- | OpenCode | Yes | `.agents/skills/`, `.opencode/skills/` | native `skill` tool (auto); slash via generated commands | Tier 1 |
24
- | Cursor | Yes (2.4+) | `.agents/skills/`, `.cursor/skills/` | `/skill-name`, auto-activation | Tier 2 |
25
- | GitHub Copilot | Yes (VS Code, JetBrains, CLI, cloud) | `.agents/skills/`, `.github/skills/` | `/skill-name` in VS Code; auto-activation elsewhere | Tier 2 |
26
- | Gemini CLI | Yes | `.agents/skills/`, `.gemini/skills/` | auto-activation; slash via generated commands | Tier 2 |
27
- | Antigravity | Yes | `.agents/skills/` | auto-activation; slash via workflows (*path unverified*) | Tier 2 |
28
- | Kimi / other Agent Skills hosts | Yes (copy) | `.agents/skills/` (or product-specific path) | auto-activation / product slash | Tier 2 |
38
+ Three facts follow from that table and shape the design:
29
39
 
30
- Two facts shape the integration design:
40
+ 1. **One path serves seven of the eight hosts.** Everything except Claude Code reads `.agents/skills/`, so `qa install` writes the same canonical skill set there — copies, never conversions. Claude Code gets `.claude/skills/` as well, and a project where only Claude Code is detected still receives the shared path, so opening the same repository in Cursor or Codex tomorrow needs no reinstall.
41
+ 2. **Auto-activation is the only channel every host shares.** Codex takes `$qa-explore`, Cursor matches on `/`, OpenCode's agent calls a `skill` tool. `qa install` prints the convention for the host it detected, because a user who types the wrong one has no way to tell a wrong keystroke from a failed install.
42
+ 3. **Slash ergonomics on Gemini CLI, OpenCode, and Copilot need a thin generated wrapper.** Those wrappers are rendered from skill frontmatter alone (ADR-0002), capped at 15 lines, and carry no knowledge. Antigravity's workflow directory (`.agents/workflows/`) is *not* documented by Google, so those wrappers are generated only on explicit `--agent antigravity`; skills themselves work there without them.
31
43
 
32
- 1. Six of the seven primary agents read `.agents/skills/` directly; Claude Code additionally requires `.claude/skills/`. A single canonical skill set therefore covers every target with copies, not conversions. Additional hosts (Kimi and peers) use the same copy path see [docs/installation/other-agents.md](docs/installation/other-agents.md).
33
- 2. Description-driven auto-activation is the only invocation channel available on all primary agents. Slash-command ergonomics on Gemini CLI, OpenCode, and Antigravity require thin generated wrappers from the installer (`qa install`).
44
+ **Antigravity detection is deliberately conservative.** Its skills live at `.agents/skills/`, which is also the path this installer creates for every host so detecting Antigravity from `.agents/` would mean detecting it because the pack had run once before. An earlier release did exactly that and reported a host that was never there. Skills work in Antigravity either way; only the optional workflow wrappers need `--agent antigravity`.
34
45
 
35
46
  ## Support tiers
36
47
 
@@ -45,8 +56,14 @@ The tier column in the matrix above is the **planned** tier — the level each a
45
56
 
46
57
  | Requirement | Status | Used for |
47
58
  | --- | --- | --- |
48
- | Python 3.8+ | Required for analysis | The deterministic analysis toolkit (`shared/analysis/lib/`) and framework analyzers standard library only, no packages |
49
- | Node.js 18+ | Required for the installer CLI | `npx qa-engineer` / `qa install` / `qa doctor` / `qa self-test` (interactive onboarding uses `--yes` / `--ci` in non-TTY and CI) |
59
+ | Node.js 18.17+ | The only requirement | Everything: `npx qa-engineer` and the CLI, and the deterministic engine the skills run (`packages/engine/`) |
60
+
61
+ **One runtime, no dependencies.** Until 0.9.2 the engine was Python, which meant a
62
+ second runtime users had to install for tooling they had installed with Node — and
63
+ when it was missing, skills fell back to model guesswork and said nothing.
64
+ [ADR-0012](docs/architecture/ADR-0012-node-engine.md) records why that changed and
65
+ how the migration was verified. The engine still takes no third-party dependencies:
66
+ the XML and ZIP readers it needs are written out rather than depended on.
50
67
 
51
68
  ## Operating systems
52
69
 
@@ -56,15 +73,22 @@ The tier column in the matrix above is the **planned** tier — the level each a
56
73
  | macOS | Expected to work; not covered by CI |
57
74
  | Windows | Expected to work; **not yet verified end to end** |
58
75
 
59
- The installer uses Node's platform-independent path handling, and the skills
60
- invoke their bundled engine through a launcher (`scripts/qa_tool.py`) that needs
61
- no shell features — the command shape is identical in bash, zsh, PowerShell, and
62
- cmd.exe. The one difference on Windows is the interpreter name: use `python` where
63
- `python3` is not on PATH.
64
-
65
- Until a Windows run is confirmed, that row says "expected", not "supported".
66
-
67
- The analysis toolkit is standard-library-only Python, so it runs on any Python 3.8+ interpreter with nothing to install. Requirements are declared per skill via the specification's `compatibility` frontmatter field, and the pack degrades gracefully: skills describe a manual fallback whenever a runtime or optional integration (such as an MCP server) is unavailable.
76
+ The installer uses Node's platform-independent path handling, and the skills invoke
77
+ the engine through a committed launcher (`scripts/qa-tool.mjs`) that needs no shell
78
+ features — the command shape is identical in bash, zsh, PowerShell, and cmd.exe,
79
+ with no platform difference at all.
80
+
81
+ The Windows row said "expected" for a specific reason that no longer applies: the
82
+ engine was Python, and `python3` is not on PATH on Windows by default, so every
83
+ deterministic call there failed and each skill quietly fell back to guesswork. The
84
+ engine is now the same Node that ran the install. The row still says "expected"
85
+ rather than "supported" because nobody has run the pack end to end on Windows —
86
+ that is an unverified claim, not a known gap.
87
+
88
+ Requirements are declared per skill via the specification's `compatibility`
89
+ frontmatter field, and the pack degrades gracefully: skills describe a manual
90
+ fallback whenever a runtime or optional integration (such as an MCP server) is
91
+ unavailable.
68
92
 
69
93
  ## Reporting compatibility problems
70
94
 
package/README.md CHANGED
@@ -2,14 +2,13 @@
2
2
 
3
3
  > Teach your AI coding assistant to work like a senior QA engineer — and stop it from telling you tests pass when they don't.
4
4
 
5
- [![Version](https://img.shields.io/badge/version-0.9.0-blue.svg)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-0.10.0-blue.svg)](CHANGELOG.md)
6
6
  [![Status](https://img.shields.io/badge/status-public%20preview-orange.svg)](docs/release/v0.9-release-checklist.md)
7
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
8
- [![Node](https://img.shields.io/badge/node-%E2%89%A518.18-339933.svg)](#step-1--check-your-prerequisites)
9
- [![Python](https://img.shields.io/badge/python-%E2%89%A53.8-3776AB.svg)](#step-1--check-your-prerequisites)
8
+ [![Node](https://img.shields.io/badge/node-%E2%89%A518.18-339933.svg)](#step-1--check-your-prerequisite)
10
9
  [![Agent Skills](https://img.shields.io/badge/Agent%20Skills-spec--native-6E56CF.svg)](https://agentskills.io)
11
10
  [![CI](https://github.com/abisheik88/qa-engineer/actions/workflows/ci.yml/badge.svg)](https://github.com/abisheik88/qa-engineer/actions/workflows/ci.yml)
12
- [![Tests](https://img.shields.io/badge/tests-235%20passing-success.svg)](#how-this-is-verified)
11
+ [![Tests](https://img.shields.io/badge/tests-165%20passing-success.svg)](#how-this-is-verified)
13
12
 
14
13
  **This page is everything you need.** Install, first run, every command, and what to do when something breaks — no other document required.
15
14
 
@@ -19,7 +18,7 @@
19
18
 
20
19
  1. [What this is, in plain language](#what-this-is-in-plain-language)
21
20
  2. [Is this for me?](#is-this-for-me)
22
- 3. [Step 1 — Check your prerequisites](#step-1--check-your-prerequisites)
21
+ 3. [Step 1 — Check your prerequisites](#step-1--check-your-prerequisite)
23
22
  4. [Step 2 — Install it](#step-2--install-it)
24
23
  5. [Step 3 — Confirm it worked](#step-3--confirm-it-worked)
25
24
  6. [Step 4 — Your first real task](#step-4--your-first-real-task)
@@ -67,21 +66,26 @@ You do not need to learn a new language, framework, or config file. You install
67
66
 
68
67
  **Works best with Playwright** today. Selenium, Cypress, and WebdriverIO are detected and their results are understood, but running and generating tests live is currently Playwright-only. See [framework support](#framework-support).
69
68
 
70
- ## Step 1 — Check your prerequisites
69
+ ## Step 1 — Check your prerequisite
71
70
 
72
- You need two things. Run these two commands to check — copy and paste them exactly:
71
+ You need one thing. Run this to check — copy and paste it exactly:
73
72
 
74
73
  ```bash
75
74
  node --version
76
- python3 --version
77
75
  ```
78
76
 
79
- You want **Node 18.18 or newer** and **Python 3.8 or newer**. If both print a version number that is high enough, skip ahead to [Step 2](#step-2--install-it).
77
+ You want **Node 18.18 or newer**. If it prints a high enough version, skip ahead to
78
+ [Step 2](#step-2--install-it).
79
+
80
+ That is the whole list. There is nothing to `pip install`, no second language, and no
81
+ dependencies: the tools that read your test results are dependency-free JavaScript
82
+ that runs on the same Node you just checked.
80
83
 
81
84
  <details>
82
85
  <summary><b>"command not found" — how to install Node.js</b></summary>
83
86
 
84
- Node.js gives you the `npx` command used to install this pack.
87
+ Node.js gives you the `npx` command used to install this pack, and it runs the
88
+ analysis tools afterwards.
85
89
 
86
90
  - **macOS** — `brew install node` (needs [Homebrew](https://brew.sh)), or download from [nodejs.org](https://nodejs.org).
87
91
  - **Windows** — download the LTS installer from [nodejs.org](https://nodejs.org) and run it.
@@ -91,19 +95,6 @@ Then re-run `node --version`. Take the **LTS** version if offered a choice.
91
95
 
92
96
  </details>
93
97
 
94
- <details>
95
- <summary><b>"command not found" — how to install Python</b></summary>
96
-
97
- Python runs the analysis tools that read your test results. It uses only Python's built-in library — there is nothing extra to install, no `pip install` step.
98
-
99
- - **macOS** — `brew install python3`, or download from [python.org](https://python.org).
100
- - **Windows** — install from [python.org](https://python.org) and **tick "Add Python to PATH"** during setup. Then use `python --version` if `python3` is not found.
101
- - **Linux** — `sudo apt install python3` (Debian/Ubuntu).
102
-
103
- **Can you skip Python?** Yes, but you shouldn't. Without it the skills fall back to the AI reading files by eye, and they will mark their results *degraded* to tell you so. The whole point of this project is that the numbers come from tools, not guesses.
104
-
105
- </details>
106
-
107
98
  You also need **an AI coding assistant** open on your project — Claude Code, Cursor, GitHub Copilot, Codex CLI, OpenCode, Gemini CLI, Antigravity, or Kimi.
108
99
 
109
100
  ## Step 2 — Install it
@@ -165,7 +156,7 @@ Real output from a healthy install:
165
156
  ✓ [PASS] skills: 13 skill(s) installed
166
157
  ✓ [PASS] contracts: 12 contract schema(s) present
167
158
  ✓ [PASS] engine: deterministic engine bundled under .agents/skills/qa-init/scripts/lib
168
- ✓ [PASS] python-imports: Python imports OK (python3 Python 3.12.3)
159
+ ✓ [PASS] engine-runs: bundled engine runs cleanly
169
160
  ✓ [PASS] node: Node v24.18.0
170
161
  ✓ self-test PASSED
171
162
  ```
@@ -256,9 +247,27 @@ qa-artifacts/
256
247
 
257
248
  Most teams **do** commit `.agents/skills/` and `qa-lock.json`, so everyone on the team gets the same skills.
258
249
 
259
- ## All twelve commands
250
+ ## How you type a command in your assistant
251
+
252
+ Type these in your AI assistant's **chat**, not the terminal. The keystroke differs
253
+ by assistant, and typing the wrong one looks exactly like a failed install — so
254
+ `qa install` prints the right one for whatever it detected. For reference:
260
255
 
261
- Type these in your AI assistant's chat, not the terminal.
256
+ | Assistant | How to reach a skill |
257
+ | --- | --- |
258
+ | Claude Code | `/qa-explore`, or just describe the task |
259
+ | Cursor | type `/` in Agent chat, then pick the skill from the list |
260
+ | OpenAI Codex CLI | `$qa-explore` — or `/skills` to browse them |
261
+ | OpenCode | `/qa-explore`, or describe the task and the agent loads the skill itself |
262
+ | Antigravity | describe the task; skills activate on their own |
263
+ | GitHub Copilot / Gemini CLI | `/qa-explore` |
264
+
265
+ Every one of them also activates a skill on its own when your request matches — you
266
+ never *have* to remember a command. "Find bugs on my login page at localhost:3000"
267
+ reaches `/qa-explore` in all of them. Full details and the source for each path:
268
+ [COMPATIBILITY.md](COMPATIBILITY.md).
269
+
270
+ ## All twelve commands
262
271
 
263
272
  | Command | What it does | Changes your files? |
264
273
  | --- | --- | --- |
@@ -329,10 +338,9 @@ npx qa-engineer install --yes --force --project .
329
338
 
330
339
  ### A skill says the engine is missing, or results are "degraded"
331
340
 
332
- The Python tools aren't reachable. Fix in this order:
341
+ The deterministic engine isn't reachable. Fix in this order:
333
342
 
334
343
  ```bash
335
- python3 --version # is Python installed at all?
336
344
  npx qa-engineer repair --project . # reinstall the bundled tools
337
345
  npx qa-engineer doctor --project . # should now say "bundled engine runs cleanly"
338
346
  ```
@@ -391,7 +399,7 @@ The core idea in one line: **tools produce the facts, the AI explains them.**
391
399
  │ raw output, exit code
392
400
 
393
401
  ┌───────────────────────────────────┐
394
- │ Bundled Python tools │ count the results, classify the failure,
402
+ │ Bundled Node engine │ count the results, classify the failure,
395
403
  │ (installed inside the skill) │ redact secrets — no guessing
396
404
  └───────────────────────────────────┘
397
405
  │ facts
@@ -441,11 +449,11 @@ Everything below is reproducible from a clone with the command beside it.
441
449
 
442
450
  | Evidence | Command |
443
451
  | --- | --- |
444
- | 152 analysis, framework, and branding tests | `python3 shared/analysis/lib/run_tests.py` |
445
- | 28 diagnostic engine tests · 5 seam tests | `PYTHONPATH=shared/analysis/lib:shared/diagnostics/lib python3 -m unittest discover -s shared/diagnostics/lib/tests` |
452
+ | 82 engine tests: analysis, diagnostics, frameworks, seams | `node --test packages/engine/test/*.test.mjs` |
453
+ | The recorded corpus, proven against a second implementation | `node --test packages/engine/test/corpus.test.mjs` |
446
454
  | 50 installer tests — including security and repeated-use stress | `npm test` |
447
455
  | 21 evaluation cases, including deliberately dishonest outputs the scorer must reject | `npm run validate:evals` |
448
- | 4 real AI-produced results, scored | `python3 tests/evals/run_live.py --captures claude-opus-5` |
456
+ | 4 real AI-produced results, scored | `node tests/evals/run-live.mjs --captures claude-opus-5` |
449
457
  | 17 repository checks — including "documentation matches implementation" | `npm run validate:skills` … |
450
458
 
451
459
  ## Going deeper
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qa-engineer",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "A vendor-neutral Agent Skills pack that teaches AI coding agents to work like senior QA automation engineers.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -29,42 +29,34 @@
29
29
  "packages/installer/schemas",
30
30
  "packages/installer/package.json",
31
31
  "packages/installer/README.md",
32
+ "packages/engine/lib",
33
+ "packages/engine/bin",
34
+ "packages/engine/package.json",
32
35
  "skills",
33
- "shared/analysis/lib/qa_analysis",
34
- "shared/analysis/schemas",
35
- "shared/diagnostics/lib/qa_diagnostics",
36
- "shared/diagnostics/schemas",
37
- "shared/tooling/qa_tool.py",
38
36
  "shared/frameworks/registry.json",
39
37
  "shared/frameworks/registry.schema.json",
40
38
  "shared/frameworks/registry.mjs",
41
- "shared/frameworks/playwright/lib/playwright_analysis.py",
42
- "shared/frameworks/selenium/lib/selenium_analysis.py",
43
- "shared/frameworks/cypress/lib/cypress_analysis.py",
44
- "shared/frameworks/webdriverio/lib/webdriverio_analysis.py",
45
39
  "COMPATIBILITY.md",
46
- "!**/__pycache__",
47
- "!**/*.pyc",
48
- "!**/tests"
40
+ "!**/tests",
41
+ "shared/tooling/qa-tool.mjs",
42
+ "!packages/engine/test"
49
43
  ],
50
44
  "scripts": {
45
+ "eval:live": "node tests/evals/run-live.mjs --baseline tests/evals/baselines/reference.json",
46
+ "prepublishOnly": "npm run validate:release && npm run validate:doc-claims && npm run validate:docs-commands && npm test && npm run validate:evals",
51
47
  "qa": "node packages/installer/bin/qa.mjs",
52
- "eval:live": "python3 tests/evals/run_live.py --baseline tests/evals/baselines/reference.json",
53
- "prepublishOnly": "npm run validate:release && npm run validate:doc-claims && npm run validate:docs-commands && npm test && npm run validate:python && npm run validate:evals",
54
48
  "release:checksums": "node scripts/release/release-notes.mjs --checksums",
55
49
  "release:notes": "node scripts/release/release-notes.mjs",
56
- "test": "node --test packages/installer/test/*.test.mjs",
50
+ "test": "node --test packages/installer/test/*.test.mjs packages/engine/test/*.test.mjs",
57
51
  "validate:architecture": "node scripts/check-architecture-fitness.mjs",
58
52
  "validate:branding": "node scripts/check-branding.mjs",
59
- "validate:bundle": "python3 scripts/bundle_python.py --check",
60
- "validate:context": "cd shared/analysis/lib && python3 -m qa_analysis.cli context --path tests/fixtures/valid-context.md",
61
53
  "validate:doc-claims": "node scripts/check-doc-claims.mjs",
62
54
  "validate:docs-commands": "node scripts/check-docs-commands.mjs",
63
- "validate:evals": "python3 tests/evals/run_evals.py",
55
+ "validate:engine": "node --test packages/engine/test/*.test.mjs",
56
+ "validate:evals": "node tests/evals/run-evals.mjs",
64
57
  "validate:keywords": "node scripts/check-keywords.mjs",
65
58
  "validate:knowledge": "node scripts/check-knowledge.mjs",
66
59
  "validate:matrix": "node scripts/check-capability-matrix.mjs",
67
- "validate:python": "python3 shared/analysis/lib/run_tests.py",
68
60
  "validate:registry": "node scripts/check-framework-registry.mjs",
69
61
  "validate:release": "node scripts/release/validate-release.mjs",
70
62
  "validate:release-notes": "node scripts/release/release-notes.mjs --check",