ghost-qa 1.3.1 → 2.0.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 (81) hide show
  1. package/README.md +88 -32
  2. package/SKILL.md +83 -80
  3. package/dist/bin/ghost-qa.d.ts +11 -3
  4. package/dist/bin/ghost-qa.d.ts.map +1 -1
  5. package/dist/bin/ghost-qa.js +498 -405
  6. package/dist/bin/ghost-qa.js.map +1 -1
  7. package/dist/src/engine/audit-runner.d.ts +6 -5
  8. package/dist/src/engine/audit-runner.d.ts.map +1 -1
  9. package/dist/src/engine/audit-runner.js +117 -60
  10. package/dist/src/engine/audit-runner.js.map +1 -1
  11. package/dist/src/engine/browser-session.d.ts +3 -3
  12. package/dist/src/engine/browser-session.d.ts.map +1 -1
  13. package/dist/src/engine/browser-session.js +18 -7
  14. package/dist/src/engine/browser-session.js.map +1 -1
  15. package/dist/src/engine/compare.d.ts +37 -0
  16. package/dist/src/engine/compare.d.ts.map +1 -0
  17. package/dist/src/engine/compare.js +63 -0
  18. package/dist/src/engine/compare.js.map +1 -0
  19. package/dist/src/engine/health-score.d.ts +14 -0
  20. package/dist/src/engine/health-score.d.ts.map +1 -0
  21. package/dist/src/engine/health-score.js +74 -0
  22. package/dist/src/engine/health-score.js.map +1 -0
  23. package/dist/src/engine/version.d.ts +14 -0
  24. package/dist/src/engine/version.d.ts.map +1 -0
  25. package/dist/src/engine/version.js +43 -0
  26. package/dist/src/engine/version.js.map +1 -0
  27. package/dist/src/index.d.ts +6 -0
  28. package/dist/src/index.d.ts.map +1 -1
  29. package/dist/src/index.js +6 -0
  30. package/dist/src/index.js.map +1 -1
  31. package/dist/src/mcp/server.d.ts +25 -5
  32. package/dist/src/mcp/server.d.ts.map +1 -1
  33. package/dist/src/mcp/server.js +45 -7
  34. package/dist/src/mcp/server.js.map +1 -1
  35. package/dist/src/reporter/agent-diagnostic.d.ts +6 -0
  36. package/dist/src/reporter/agent-diagnostic.d.ts.map +1 -1
  37. package/dist/src/reporter/agent-diagnostic.js +53 -3
  38. package/dist/src/reporter/agent-diagnostic.js.map +1 -1
  39. package/dist/src/reporter/html-report.d.ts.map +1 -1
  40. package/dist/src/reporter/html-report.js +79 -4
  41. package/dist/src/reporter/html-report.js.map +1 -1
  42. package/dist/src/reporter/terminal-summary.d.ts.map +1 -1
  43. package/dist/src/reporter/terminal-summary.js +6 -0
  44. package/dist/src/reporter/terminal-summary.js.map +1 -1
  45. package/dist/src/traps/a11y-trap.d.ts +23 -0
  46. package/dist/src/traps/a11y-trap.d.ts.map +1 -1
  47. package/dist/src/traps/a11y-trap.js +185 -0
  48. package/dist/src/traps/a11y-trap.js.map +1 -1
  49. package/dist/src/traps/console-trap.d.ts +3 -1
  50. package/dist/src/traps/console-trap.d.ts.map +1 -1
  51. package/dist/src/traps/console-trap.js +41 -0
  52. package/dist/src/traps/console-trap.js.map +1 -1
  53. package/dist/src/traps/layout-trap.d.ts +31 -0
  54. package/dist/src/traps/layout-trap.d.ts.map +1 -1
  55. package/dist/src/traps/layout-trap.js +173 -0
  56. package/dist/src/traps/layout-trap.js.map +1 -1
  57. package/dist/src/traps/links-trap.d.ts +34 -0
  58. package/dist/src/traps/links-trap.d.ts.map +1 -0
  59. package/dist/src/traps/links-trap.js +136 -0
  60. package/dist/src/traps/links-trap.js.map +1 -0
  61. package/dist/src/traps/network-trap.d.ts +4 -1
  62. package/dist/src/traps/network-trap.d.ts.map +1 -1
  63. package/dist/src/traps/network-trap.js +29 -2
  64. package/dist/src/traps/network-trap.js.map +1 -1
  65. package/dist/src/traps/perf-trap.d.ts +18 -0
  66. package/dist/src/traps/perf-trap.d.ts.map +1 -1
  67. package/dist/src/traps/perf-trap.js +148 -8
  68. package/dist/src/traps/perf-trap.js.map +1 -1
  69. package/dist/src/traps/seo-trap.d.ts +30 -0
  70. package/dist/src/traps/seo-trap.d.ts.map +1 -0
  71. package/dist/src/traps/seo-trap.js +98 -0
  72. package/dist/src/traps/seo-trap.js.map +1 -0
  73. package/dist/src/traps/theme-trap.d.ts +32 -0
  74. package/dist/src/traps/theme-trap.d.ts.map +1 -0
  75. package/dist/src/traps/theme-trap.js +109 -0
  76. package/dist/src/traps/theme-trap.js.map +1 -0
  77. package/dist/src/types.d.ts +55 -3
  78. package/dist/src/types.d.ts.map +1 -1
  79. package/dist/src/types.js +30 -2
  80. package/dist/src/types.js.map +1 -1
  81. package/package.json +99 -91
@@ -5,10 +5,22 @@
5
5
  * rendered for a human (terminal), serialised for CI (JSON), or fed back to a
6
6
  * coding agent (Markdown diagnostic) without any translation layer.
7
7
  */
8
- export type ViewportName = 'desktop' | 'mobile';
9
- export type IssueCategory = 'console' | 'network' | 'layout' | 'accessibility' | 'performance' | 'interaction' | 'navigation';
8
+ export type ViewportName = 'desktop' | 'tablet' | 'mobile';
9
+ export type ColorScheme = 'light' | 'dark';
10
+ export type IssueCategory = 'console' | 'network' | 'layout' | 'accessibility' | 'performance' | 'interaction' | 'navigation' | 'links' | 'seo' | 'theme';
11
+ /** The eight specialised traps of the v2 Deep Browser Inspection Engine. */
12
+ export type TrapName = 'console' | 'network' | 'layout' | 'accessibility' | 'performance' | 'links' | 'seo' | 'theme';
13
+ export declare const TRAP_LABELS: Record<TrapName, string>;
14
+ /** Which trap owns a category (interaction/navigation fold into Links/UX). */
15
+ export declare const CATEGORY_TO_TRAP: Record<IssueCategory, TrapName>;
10
16
  export type IssueSeverity = 'critical' | 'major' | 'minor';
11
- export type IssueType = 'page-error' | 'unhandled-rejection' | 'hydration-mismatch' | 'console-error' | 'console-warning' | 'http-error' | 'request-failed' | 'cors-error' | 'broken-asset' | 'horizontal-overflow' | 'zero-size-interactive' | 'broken-image' | 'missing-viewport-meta' | 'interaction-failed' | 'navigation-failed' | 'missing-accessible-name' | 'img-missing-alt' | 'input-missing-label' | 'missing-document-title' | 'missing-html-lang' | 'slow-page-load' | 'oversized-resource' | 'excessive-payload' | 'render-blocking-resources' | 'layout-thrashing' | 'excessive-dom-size';
17
+ export type IssueType = 'page-error' | 'unhandled-rejection' | 'hydration-mismatch' | 'console-error' | 'console-warning' | 'duplicate-key-warning' | 'csp-violation' | 'http-error' | 'request-failed' | 'request-timeout' | 'cors-error' | 'cors-preflight-failed' | 'broken-asset' | 'broken-image' | 'broken-svg' | 'horizontal-overflow' | 'zero-size-interactive' | 'element-collision' | 'small-touch-target' | 'clipped-text' | 'offscreen-interactive' | 'interaction-failed' | 'navigation-failed' | 'missing-accessible-name' | 'img-missing-alt' | 'input-missing-label' | 'missing-document-title' | 'missing-html-lang' | 'contrast-insufficient' | 'heading-hierarchy' | 'focus-not-visible' | 'slow-page-load' | 'slow-ttfb' | 'slow-fcp' | 'slow-lcp' | 'high-cls' | 'oversized-resource' | 'unoptimized-resource' | 'excessive-payload' | 'render-blocking-resources' | 'layout-thrashing' | 'excessive-dom-size' | 'deep-dom' | 'missing-viewport-meta' | 'dead-link' | 'placeholder-link' | 'form-button-missing-type' | 'stuck-disabled' | 'title-too-short' | 'title-too-long' | 'missing-meta-description' | 'missing-canonical' | 'missing-opengraph' | 'duplicate-id' | 'theme-contrast';
18
+ export interface BoundingBox {
19
+ x: number;
20
+ y: number;
21
+ width: number;
22
+ height: number;
23
+ }
12
24
  export interface QAIssue {
13
25
  /** Stable, de-duplication-friendly identifier (hash of the fingerprint). */
14
26
  id: string;
@@ -20,6 +32,12 @@ export interface QAIssue {
20
32
  /** Path of the route the issue was observed on, e.g. `/pricing`. */
21
33
  route: string;
22
34
  viewport: ViewportName;
35
+ /** Exact DOM selector (`#id`, `[data-testid=…]`, or CSS path) when known. */
36
+ selector?: string;
37
+ /** Live bounding box of the offending element, when geometry is relevant. */
38
+ boundingBox?: BoundingBox;
39
+ /** Which emulated colour scheme the finding belongs to, when relevant. */
40
+ colorScheme?: ColorScheme;
23
41
  /** Optional machine-readable context (status code, selector, geometry…). */
24
42
  details?: Record<string, string | number | boolean>;
25
43
  stack?: string;
@@ -45,6 +63,13 @@ export interface RouteRecord {
45
63
  viewports: ViewportName[];
46
64
  issueCount: number;
47
65
  }
66
+ export interface ScreenshotRecord {
67
+ route: string;
68
+ viewport: ViewportName;
69
+ colorScheme: ColorScheme;
70
+ /** Data URI (`data:image/jpeg;base64,…`) so reports stay self-contained. */
71
+ dataUri: string;
72
+ }
48
73
  export interface GhostQAOptions {
49
74
  maxDepth: number;
50
75
  maxRoutes: number;
@@ -56,8 +81,28 @@ export interface GhostQAOptions {
56
81
  interactions: boolean;
57
82
  /** Fail (exit 1) when an issue at or above this severity is found. */
58
83
  failOn: IssueSeverity;
84
+ /** Colour schemes to emulate (Theme Trap runs under each). */
85
+ colorSchemes?: ColorScheme[];
86
+ /** Capture a JPEG screenshot per route/viewport for the HTML dashboard. */
87
+ screenshots?: boolean;
59
88
  }
60
89
  export declare const DEFAULT_OPTIONS: GhostQAOptions;
90
+ export interface TrapScore {
91
+ trap: TrapName;
92
+ label: string;
93
+ /** 0–100, deterministic from that trap's findings. */
94
+ score: number;
95
+ grade: string;
96
+ issues: number;
97
+ bySeverity: Record<IssueSeverity, number>;
98
+ }
99
+ export interface HealthScore {
100
+ /** Overall QA Health Score, 0–100 (mean of the eight trap scores). */
101
+ score: number;
102
+ /** Letter grade A+ … F. */
103
+ grade: string;
104
+ byTrap: TrapScore[];
105
+ }
61
106
  export interface GhostQAReport {
62
107
  tool: 'ghost-qa';
63
108
  version: string;
@@ -70,6 +115,10 @@ export interface GhostQAReport {
70
115
  routes: RouteRecord[];
71
116
  interactions: InteractionAction[];
72
117
  issues: QAIssue[];
118
+ /** QA Health Score (0–100, grade A+…F) with per-trap sub-scores. */
119
+ health?: HealthScore;
120
+ /** Screenshots captured when `options.screenshots` was enabled. */
121
+ screenshots?: ScreenshotRecord[];
73
122
  summary: {
74
123
  routesCrawled: number;
75
124
  interactionsTested: number;
@@ -78,6 +127,9 @@ export interface GhostQAReport {
78
127
  totalIssues: number;
79
128
  bySeverity: Record<IssueSeverity, number>;
80
129
  byCategory: Record<IssueCategory, number>;
130
+ /** Present on v2 reports: mirrors `health.score` / `health.grade`. */
131
+ healthScore?: number;
132
+ grade?: string;
81
133
  };
82
134
  }
83
135
  export declare const SEVERITY_ORDER: Record<IssueSeverity, number>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/dist/src/types.js CHANGED
@@ -5,6 +5,29 @@
5
5
  * rendered for a human (terminal), serialised for CI (JSON), or fed back to a
6
6
  * coding agent (Markdown diagnostic) without any translation layer.
7
7
  */
8
+ export const TRAP_LABELS = {
9
+ console: 'Console & Framework Runtime',
10
+ network: 'Network & Asset Integrity',
11
+ layout: 'Layout, Responsive Geometry & Collision',
12
+ accessibility: 'Accessibility (WCAG 2.1 AA) & Keyboard Focus',
13
+ performance: 'Performance & Core Web Vitals',
14
+ links: 'Safe Interactive & Link Integrity',
15
+ seo: 'SEO, Metadata & Social Graph',
16
+ theme: 'Dark / Light Theme Emulation',
17
+ };
18
+ /** Which trap owns a category (interaction/navigation fold into Links/UX). */
19
+ export const CATEGORY_TO_TRAP = {
20
+ console: 'console',
21
+ network: 'network',
22
+ layout: 'layout',
23
+ accessibility: 'accessibility',
24
+ performance: 'performance',
25
+ interaction: 'links',
26
+ navigation: 'links',
27
+ links: 'links',
28
+ seo: 'seo',
29
+ theme: 'theme',
30
+ };
8
31
  export const DEFAULT_OPTIONS = {
9
32
  maxDepth: 2,
10
33
  maxRoutes: 25,
@@ -12,9 +35,11 @@ export const DEFAULT_OPTIONS = {
12
35
  timeoutMs: 15_000,
13
36
  settleMs: 600,
14
37
  headless: true,
15
- viewports: ['desktop', 'mobile'],
38
+ viewports: ['desktop', 'tablet', 'mobile'],
16
39
  interactions: true,
17
40
  failOn: 'major',
41
+ colorSchemes: ['light', 'dark'],
42
+ screenshots: false,
18
43
  };
19
44
  export const SEVERITY_ORDER = {
20
45
  critical: 3,
@@ -35,7 +60,7 @@ export function fingerprint(input) {
35
60
  }
36
61
  export function makeIssue(input) {
37
62
  const detailString = input.details ? JSON.stringify(input.details) : '';
38
- const id = fingerprint([input.category, input.type, input.route, input.viewport, input.message, detailString].join('|'));
63
+ const id = fingerprint([input.category, input.type, input.route, input.viewport, input.colorScheme ?? '', input.message, detailString].join('|'));
39
64
  return {
40
65
  ...input,
41
66
  id,
@@ -61,6 +86,9 @@ export function summarise(routes, interactions, issues, failOn) {
61
86
  performance: 0,
62
87
  interaction: 0,
63
88
  navigation: 0,
89
+ links: 0,
90
+ seo: 0,
91
+ theme: 0,
64
92
  };
65
93
  for (const issue of issues) {
66
94
  bySeverity[issue.severity] += 1;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,91 +1,99 @@
1
- {
2
- "name": "ghost-qa",
3
- "version": "1.3.1",
4
- "description": "Autonomous headless browser QA & self-healing verification loop for coding agents. Crawls localhost, traps console/network/layout failures, and feeds structured diagnostics back to the agent.",
5
- "type": "module",
6
- "bin": {
7
- "ghost-qa": "dist/bin/ghost-qa.js"
8
- },
9
- "main": "./dist/src/index.js",
10
- "types": "./dist/src/index.d.ts",
11
- "exports": {
12
- ".": {
13
- "types": "./dist/src/index.d.ts",
14
- "import": "./dist/src/index.js"
15
- }
16
- },
17
- "files": [
18
- "dist",
19
- "scripts/prepare-build.mjs",
20
- "SKILL.md",
21
- "README.md",
22
- "LICENSE"
23
- ],
24
- "scripts": {
25
- "prepare": "node scripts/prepare-build.mjs",
26
- "build": "tsc -p tsconfig.json",
27
- "dev": "tsc -p tsconfig.json --watch",
28
- "test": "vitest run",
29
- "test:watch": "vitest",
30
- "typecheck": "tsc -p tsconfig.json --noEmit",
31
- "qa": "npm run build && npm test",
32
- "prepublishOnly": "npm run qa"
33
- },
34
- "keywords": [
35
- "mcp",
36
- "mcp-server",
37
- "model-context-protocol",
38
- "claude-code",
39
- "claude-skills",
40
- "agent-skills",
41
- "ai-agents",
42
- "coding-agents",
43
- "playwright",
44
- "headless-browser",
45
- "qa-automation",
46
- "e2e-testing",
47
- "self-healing",
48
- "codex",
49
- "cursor",
50
- "cursorrules",
51
- "windsurf",
52
- "accessibility-testing",
53
- "a11y",
54
- "web-vitals",
55
- "performance-testing",
56
- "browser-testing",
57
- "test-automation",
58
- "automated-testing",
59
- "typescript",
60
- "cli",
61
- "devtools",
62
- "hydration",
63
- "ci-cd",
64
- "browser-verification",
65
- "agent-tools",
66
- "llm-agents",
67
- "frontend-qa",
68
- "mobile-testing"
69
- ],
70
- "author": "VibeFoundry",
71
- "license": "MIT",
72
- "repository": {
73
- "type": "git",
74
- "url": "git+https://github.com/avivgerz-hue/ghost-qa.git"
75
- },
76
- "homepage": "https://github.com/avivgerz-hue/ghost-qa#readme",
77
- "bugs": {
78
- "url": "https://github.com/avivgerz-hue/ghost-qa/issues"
79
- },
80
- "engines": {
81
- "node": ">=20"
82
- },
83
- "dependencies": {
84
- "playwright": "^1.49.1"
85
- },
86
- "devDependencies": {
87
- "@types/node": "^22.10.2",
88
- "typescript": "^5.7.2",
89
- "vitest": "^2.1.8"
90
- }
91
- }
1
+ {
2
+ "name": "ghost-qa",
3
+ "version": "2.0.0",
4
+ "description": "Autonomous headless browser QA & self-healing verification loop for coding agents. 8-trap deep inspection (console, network, layout, WCAG a11y + keyboard focus, Core Web Vitals, links, SEO, theme parity) across desktop/tablet/mobile in light + dark, QA Health Score (A+ to F), interactive HTML dashboard, and regression diffing (ghost_qa_compare).",
5
+ "type": "module",
6
+ "bin": {
7
+ "ghost-qa": "dist/bin/ghost-qa.js"
8
+ },
9
+ "main": "./dist/src/index.js",
10
+ "types": "./dist/src/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/src/index.d.ts",
14
+ "import": "./dist/src/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "scripts/prepare-build.mjs",
20
+ "SKILL.md",
21
+ "README.md",
22
+ "LICENSE"
23
+ ],
24
+ "scripts": {
25
+ "prepare": "node scripts/prepare-build.mjs",
26
+ "build": "tsc -p tsconfig.json",
27
+ "dev": "tsc -p tsconfig.json --watch",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest",
30
+ "typecheck": "tsc -p tsconfig.json --noEmit",
31
+ "qa": "npm run build && npm test",
32
+ "prepublishOnly": "npm run qa"
33
+ },
34
+ "keywords": [
35
+ "mcp",
36
+ "mcp-server",
37
+ "model-context-protocol",
38
+ "claude-code",
39
+ "claude-skills",
40
+ "agent-skills",
41
+ "ai-agents",
42
+ "coding-agents",
43
+ "playwright",
44
+ "headless-browser",
45
+ "qa-automation",
46
+ "e2e-testing",
47
+ "self-healing",
48
+ "codex",
49
+ "cursor",
50
+ "cursorrules",
51
+ "windsurf",
52
+ "accessibility-testing",
53
+ "a11y",
54
+ "web-vitals",
55
+ "performance-testing",
56
+ "browser-testing",
57
+ "test-automation",
58
+ "automated-testing",
59
+ "typescript",
60
+ "cli",
61
+ "devtools",
62
+ "hydration",
63
+ "ci-cd",
64
+ "browser-verification",
65
+ "agent-tools",
66
+ "llm-agents",
67
+ "frontend-qa",
68
+ "mobile-testing",
69
+ "tablet-testing",
70
+ "dark-mode-testing",
71
+ "core-web-vitals",
72
+ "regression-testing",
73
+ "lighthouse-alternative",
74
+ "seo-audit",
75
+ "link-checker",
76
+ "health-score"
77
+ ],
78
+ "author": "VibeFoundry",
79
+ "license": "MIT",
80
+ "repository": {
81
+ "type": "git",
82
+ "url": "git+https://github.com/avivgerz-hue/ghost-qa.git"
83
+ },
84
+ "homepage": "https://github.com/avivgerz-hue/ghost-qa#readme",
85
+ "bugs": {
86
+ "url": "https://github.com/avivgerz-hue/ghost-qa/issues"
87
+ },
88
+ "engines": {
89
+ "node": ">=20"
90
+ },
91
+ "dependencies": {
92
+ "playwright": "^1.49.1"
93
+ },
94
+ "devDependencies": {
95
+ "@types/node": "^22.10.2",
96
+ "typescript": "^5.7.2",
97
+ "vitest": "^2.1.8"
98
+ }
99
+ }