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
@@ -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())