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.
- package/COMPATIBILITY.md +50 -26
- package/README.md +40 -32
- package/package.json +12 -20
- package/packages/engine/bin/qa-engine.mjs +336 -0
- package/packages/engine/lib/analysis/branding.mjs +187 -0
- package/packages/engine/lib/analysis/context.mjs +294 -0
- package/packages/{installer/lib/core/schema-validate.mjs → engine/lib/analysis/contracts.mjs} +11 -4
- package/packages/engine/lib/analysis/diff-guard.mjs +425 -0
- package/packages/engine/lib/analysis/discovery.mjs +220 -0
- package/packages/engine/lib/analysis/evidence.mjs +116 -0
- package/packages/engine/lib/analysis/har.mjs +90 -0
- package/packages/engine/lib/analysis/junit.mjs +126 -0
- package/packages/engine/lib/analysis/redaction.mjs +127 -0
- package/packages/engine/lib/analysis/report-html.mjs +763 -0
- package/packages/engine/lib/analysis/taxonomy.mjs +109 -0
- package/packages/engine/lib/analysis/xml.mjs +153 -0
- package/packages/engine/lib/analysis/zip.mjs +107 -0
- package/packages/engine/lib/diagnostics/engine.mjs +165 -0
- package/packages/engine/lib/diagnostics/internal-contracts.mjs +50 -0
- package/packages/engine/lib/diagnostics/prioritization.mjs +99 -0
- package/packages/engine/lib/diagnostics/repair.mjs +73 -0
- package/packages/engine/lib/diagnostics/root-cause.mjs +92 -0
- package/packages/engine/lib/diagnostics/timeline.mjs +101 -0
- package/packages/engine/lib/frameworks/junit-frameworks.mjs +48 -0
- package/packages/engine/lib/frameworks/playwright.mjs +158 -0
- package/packages/engine/package.json +14 -0
- package/packages/installer/lib/agents/registry.mjs +46 -0
- package/packages/installer/lib/commands/doctor.mjs +7 -16
- package/packages/installer/lib/commands/install.mjs +59 -4
- package/packages/installer/lib/core/bundle.mjs +69 -92
- package/packages/installer/lib/core/config.mjs +1 -1
- package/packages/installer/lib/core/lockfile.mjs +1 -1
- package/packages/installer/lib/core/manifest.mjs +48 -54
- package/packages/installer/lib/core/validate-install.mjs +12 -19
- package/packages/installer/package.json +1 -1
- package/shared/tooling/qa-tool.mjs +125 -0
- package/skills/qa-api/SKILL.md +5 -5
- package/skills/qa-api/references/deterministic-tooling.md +34 -30
- package/skills/qa-api/references/evidence-and-reporting.md +29 -4
- package/skills/qa-api/scripts/qa-tool.mjs +126 -0
- package/skills/qa-audit/SKILL.md +5 -5
- package/skills/qa-audit/references/deterministic-tooling.md +34 -30
- package/skills/qa-audit/references/evidence-and-reporting.md +29 -4
- package/skills/qa-audit/scripts/qa-tool.mjs +126 -0
- package/skills/qa-debug/SKILL.md +6 -6
- package/skills/qa-debug/references/deterministic-tooling.md +34 -30
- package/skills/qa-debug/references/diagnostic-engine.md +3 -3
- package/skills/qa-debug/references/evidence-and-reporting.md +29 -4
- package/skills/qa-debug/scripts/qa-tool.mjs +126 -0
- package/skills/qa-explore/SKILL.md +22 -5
- package/skills/qa-explore/contracts/explore-result.schema.json +26 -2
- package/skills/qa-explore/references/deterministic-tooling.md +132 -0
- package/skills/qa-explore/references/evidence-and-reporting.md +29 -4
- package/skills/qa-explore/references/report-pipeline.md +89 -8
- package/skills/qa-explore/scripts/qa-tool.mjs +126 -0
- package/skills/qa-fix/SKILL.md +4 -4
- package/skills/qa-fix/references/deterministic-tooling.md +34 -30
- package/skills/qa-fix/references/diagnostic-engine.md +3 -3
- package/skills/qa-fix/references/evidence-and-reporting.md +29 -4
- package/skills/qa-fix/scripts/qa-tool.mjs +126 -0
- package/skills/qa-flaky/SKILL.md +4 -4
- package/skills/qa-flaky/references/deterministic-tooling.md +34 -30
- package/skills/qa-flaky/references/evidence-and-reporting.md +29 -4
- package/skills/qa-flaky/scripts/qa-tool.mjs +126 -0
- package/skills/qa-generate/references/evidence-and-reporting.md +29 -4
- package/skills/qa-init/SKILL.md +4 -4
- package/skills/qa-init/references/deterministic-tooling.md +34 -30
- package/skills/qa-init/references/evidence-and-reporting.md +29 -4
- package/skills/qa-init/scripts/qa-tool.mjs +126 -0
- package/skills/qa-report/SKILL.md +8 -7
- package/skills/qa-report/references/deterministic-tooling.md +34 -30
- package/skills/qa-report/references/diagnostic-engine.md +3 -3
- package/skills/qa-report/references/evidence-and-reporting.md +29 -4
- package/skills/qa-report/scripts/qa-tool.mjs +126 -0
- package/skills/qa-review/references/evidence-and-reporting.md +29 -4
- package/skills/qa-run/SKILL.md +6 -6
- package/skills/qa-run/references/deterministic-tooling.md +34 -30
- package/skills/qa-run/references/evidence-and-reporting.md +29 -4
- package/skills/qa-run/scripts/qa-tool.mjs +126 -0
- package/shared/analysis/lib/qa_analysis/__init__.py +0 -11
- package/shared/analysis/lib/qa_analysis/branding.py +0 -175
- package/shared/analysis/lib/qa_analysis/cli.py +0 -129
- package/shared/analysis/lib/qa_analysis/context.py +0 -233
- package/shared/analysis/lib/qa_analysis/contracts.py +0 -158
- package/shared/analysis/lib/qa_analysis/diff_guard.py +0 -327
- package/shared/analysis/lib/qa_analysis/discovery.py +0 -113
- package/shared/analysis/lib/qa_analysis/evidence.py +0 -128
- package/shared/analysis/lib/qa_analysis/har.py +0 -58
- package/shared/analysis/lib/qa_analysis/junit.py +0 -80
- package/shared/analysis/lib/qa_analysis/redaction.py +0 -99
- package/shared/analysis/lib/qa_analysis/taxonomy.py +0 -98
- package/shared/diagnostics/lib/qa_diagnostics/__init__.py +0 -13
- package/shared/diagnostics/lib/qa_diagnostics/cli.py +0 -124
- package/shared/diagnostics/lib/qa_diagnostics/engine.py +0 -143
- package/shared/diagnostics/lib/qa_diagnostics/internal_contracts.py +0 -75
- package/shared/diagnostics/lib/qa_diagnostics/prioritization.py +0 -101
- package/shared/diagnostics/lib/qa_diagnostics/repair.py +0 -72
- package/shared/diagnostics/lib/qa_diagnostics/root_cause.py +0 -89
- package/shared/diagnostics/lib/qa_diagnostics/timeline.py +0 -71
- package/shared/frameworks/cypress/lib/cypress_analysis.py +0 -27
- package/shared/frameworks/playwright/lib/playwright_analysis.py +0 -167
- package/shared/frameworks/selenium/lib/selenium_analysis.py +0 -28
- package/shared/frameworks/webdriverio/lib/webdriverio_analysis.py +0 -24
- package/shared/tooling/qa_tool.py +0 -127
- /package/{shared/analysis/lib/qa_analysis → packages/engine/lib/analysis}/branding.json +0 -0
- /package/{shared → packages/engine/lib}/analysis/schemas/context.schema.json +0 -0
- /package/{shared → packages/engine/lib}/diagnostics/schemas/internal/analysis-result.schema.json +0 -0
- /package/{shared → packages/engine/lib}/diagnostics/schemas/internal/diagnosis.schema.json +0 -0
- /package/{shared → packages/engine/lib}/diagnostics/schemas/internal/execution-result-min.schema.json +0 -0
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""The single entry point for a skill's bundled deterministic tooling.
|
|
3
|
-
|
|
4
|
-
Every skill that carries an engine also carries a copy of this file at
|
|
5
|
-
`<skill>/scripts/qa_tool.py`, beside the `lib/` directory it dispatches into.
|
|
6
|
-
|
|
7
|
-
## Why this exists
|
|
8
|
-
|
|
9
|
-
The invocation used to be a shell recipe:
|
|
10
|
-
|
|
11
|
-
QA_LIB="$(ls -d .agents/skills/qa-run/scripts/lib ... | head -1)"
|
|
12
|
-
PYTHONPATH="$QA_LIB" python3 -m qa_analysis.cli junit report.xml
|
|
13
|
-
|
|
14
|
-
Three parts of that are POSIX-only — command substitution, `ls -d | head -1`, and
|
|
15
|
-
the `VAR=value command` prefix — so on Windows PowerShell every deterministic call
|
|
16
|
-
failed. Failing calls do not stop a skill; they push it onto its documented manual
|
|
17
|
-
fallback. The result was that Windows users silently got the *guessing* behaviour
|
|
18
|
-
this project exists to replace, while believing they had the tooling.
|
|
19
|
-
|
|
20
|
-
So the shell does no work at all now. This launcher finds its own `lib/`
|
|
21
|
-
directory from `__file__` and puts it on `sys.path` itself:
|
|
22
|
-
|
|
23
|
-
python3 .agents/skills/qa-run/scripts/qa_tool.py analysis junit report.xml
|
|
24
|
-
|
|
25
|
-
That line is identical in bash, zsh, PowerShell, and cmd.exe. On Windows, use
|
|
26
|
-
`python` if `python3` is not on PATH — that is the only remaining difference.
|
|
27
|
-
|
|
28
|
-
## Usage
|
|
29
|
-
|
|
30
|
-
qa_tool.py analysis <subcommand> [args] -> qa_analysis.cli
|
|
31
|
-
qa_tool.py diagnostics <subcommand> [args] -> qa_diagnostics.cli
|
|
32
|
-
qa_tool.py playwright <subcommand> [args] -> playwright_analysis
|
|
33
|
-
qa_tool.py --list what this skill bundles
|
|
34
|
-
|
|
35
|
-
Exit codes pass through from the underlying tool unchanged: 0 success, 1 an
|
|
36
|
-
invalid contract, 2 unreadable input or a payload that failed its contract.
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
import os
|
|
40
|
-
import pathlib
|
|
41
|
-
import sys
|
|
42
|
-
|
|
43
|
-
_HERE = pathlib.Path(__file__).resolve().parent
|
|
44
|
-
_LIB = _HERE / "lib"
|
|
45
|
-
|
|
46
|
-
# Tool name -> (module path, callable). Resolved lazily so a skill that bundles
|
|
47
|
-
# only part of the toolkit still runs the parts it has.
|
|
48
|
-
_TOOLS = {
|
|
49
|
-
"analysis": ("qa_analysis.cli", "main"),
|
|
50
|
-
"diagnostics": ("qa_diagnostics.cli", "main"),
|
|
51
|
-
"playwright": ("playwright_analysis", "main"),
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
_USAGE = """usage: qa_tool.py <tool> <subcommand> [args]
|
|
55
|
-
|
|
56
|
-
analysis parse artifacts, classify errors, validate contracts, diff-guard
|
|
57
|
-
diagnostics root cause, timeline, priority, repair plans
|
|
58
|
-
playwright normalize a Playwright report or summarize a trace
|
|
59
|
-
|
|
60
|
-
--list show which tools this skill bundles
|
|
61
|
-
|
|
62
|
-
examples:
|
|
63
|
-
python3 qa_tool.py analysis junit test-results/results.xml
|
|
64
|
-
python3 qa_tool.py analysis diff-guard change.diff
|
|
65
|
-
python3 qa_tool.py diagnostics report --execution-result qa-artifacts/run.json
|
|
66
|
-
python3 qa_tool.py playwright report test-results/results.json
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _available():
|
|
71
|
-
"""Tools whose module is importable from this skill's bundled lib/."""
|
|
72
|
-
found = []
|
|
73
|
-
for name, (module, _) in _TOOLS.items():
|
|
74
|
-
top = module.split(".")[0]
|
|
75
|
-
if (_LIB / top).is_dir() or (_LIB / f"{top}.py").is_file():
|
|
76
|
-
found.append(name)
|
|
77
|
-
return found
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def main(argv=None):
|
|
81
|
-
argv = list(sys.argv[1:] if argv is None else argv)
|
|
82
|
-
|
|
83
|
-
if not _LIB.is_dir():
|
|
84
|
-
sys.stderr.write(
|
|
85
|
-
f"qa_tool: no bundled library at {_LIB}\n"
|
|
86
|
-
"The skill's deterministic engine is missing. Run: qa repair --project .\n"
|
|
87
|
-
)
|
|
88
|
-
return 2
|
|
89
|
-
|
|
90
|
-
# The bundled lib is authoritative: prepend so a same-named package installed
|
|
91
|
-
# elsewhere on the machine cannot shadow the version that shipped with this skill.
|
|
92
|
-
sys.path.insert(0, str(_LIB))
|
|
93
|
-
|
|
94
|
-
if not argv or argv[0] in ("-h", "--help", "help"):
|
|
95
|
-
sys.stdout.write(_USAGE)
|
|
96
|
-
return 0
|
|
97
|
-
|
|
98
|
-
if argv[0] == "--list":
|
|
99
|
-
available = _available()
|
|
100
|
-
sys.stdout.write(
|
|
101
|
-
"bundled tools: " + (", ".join(available) if available else "none") + "\n"
|
|
102
|
-
)
|
|
103
|
-
return 0 if available else 2
|
|
104
|
-
|
|
105
|
-
tool = argv[0]
|
|
106
|
-
if tool not in _TOOLS:
|
|
107
|
-
sys.stderr.write(f"qa_tool: unknown tool {tool!r}\n\n{_USAGE}")
|
|
108
|
-
return 2
|
|
109
|
-
|
|
110
|
-
module_name, entry = _TOOLS[tool]
|
|
111
|
-
try:
|
|
112
|
-
module = __import__(module_name, fromlist=[entry])
|
|
113
|
-
except ImportError as exc:
|
|
114
|
-
available = _available()
|
|
115
|
-
sys.stderr.write(
|
|
116
|
-
f"qa_tool: {tool} is not bundled in this skill ({exc}).\n"
|
|
117
|
-
f"This skill bundles: {', '.join(available) if available else 'nothing'}\n"
|
|
118
|
-
)
|
|
119
|
-
return 2
|
|
120
|
-
|
|
121
|
-
return getattr(module, entry)(argv[1:])
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if __name__ == "__main__":
|
|
125
|
-
# os.environ is untouched: the launcher never mutates the caller's environment.
|
|
126
|
-
del os
|
|
127
|
-
sys.exit(main())
|
|
File without changes
|
|
File without changes
|
/package/{shared → packages/engine/lib}/diagnostics/schemas/internal/analysis-result.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|