@yasserkhanorg/impact-gate 2.1.6 → 2.1.7

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/README.md CHANGED
@@ -1,11 +1,19 @@
1
- # @yasserkhanorg/impact-gate
1
+ <p align="center">
2
+ <img src="./docs-site/public/impact-gate-readme-banner.png" alt="Impact Gate" width="720" />
3
+ </p>
2
4
 
3
- Diff-aware E2E impact analysis, release-ready test planning, and coverage gating for Playwright/Cypress teams. Optional AI features can suggest, generate, and heal tests once your project has a route-families.json manifest.
5
+ # Impact Gate
6
+
7
+ `@yasserkhanorg/impact-gate`
8
+
9
+ Diff-aware E2E impact analysis, release-ready test planning, coverage gating, and hallucination-resistant AI generation for Playwright/Cypress teams. Optional AI features can suggest, generate, and heal tests once your project has a route-families.json manifest.
4
10
 
5
11
  [![npm](https://img.shields.io/npm/v/%40yasserkhanorg%2Fimpact-gate)](https://www.npmjs.com/package/@yasserkhanorg/impact-gate)
6
12
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE)
7
13
  [![GitHub](https://img.shields.io/badge/github-repo-blue?logo=github)](https://github.com/yasserfaraazkhan/impact-gate)
8
14
 
15
+ [Docs](https://yasserfaraazkhan.github.io/impact-gate/)
16
+
9
17
  ## What It Does
10
18
 
11
19
  `impact-gate` is built first for one painful CI job: given a git diff, tell us which E2E surface changed, whether the current suite already covers it, and what still needs testing before we merge or ship.
@@ -25,6 +33,9 @@ Product priorities:
25
33
 
26
34
  The clearest path today is a Playwright or Cypress repository with a maintained `route-families.json` manifest. That is the path this package is optimized to make unusually clear and useful.
27
35
 
36
+ AI-specific note:
37
+ - Generated tests are grounded against the discovered local API surface and verified before they are trusted. The package is designed to reduce hallucinated page-object methods, fabricated helpers, and low-evidence test generation.
38
+
28
39
  Transition note:
29
40
  - The package and primary CLI are being renamed to `impact-gate`.
30
41
  - Legacy CLI aliases (`e2e-ai-agents`, `e2e-qa-agent`, `e2e-agents-mcp`) still work during migration.
@@ -45,7 +56,7 @@ Transition note:
45
56
  - The clearest, most stable workflow is still **Playwright/Cypress impact analysis and gating**.
46
57
  - AI generation and healing work best **after** the project has a good `route-families.json` manifest.
47
58
  - Advanced features are improving, but they are **not** the best entry point if you only want dependable CI coverage decisions.
48
- - The Mattermost profile is still the most opinionated path in the codebase. Generic flows are supported, but the package should be judged first on the core CI workflow above.
59
+ - The strict profile is the most opinionated path in the codebase. Most teams should start with the core CI workflow above and only opt into stricter heuristics once their mappings are mature.
49
60
 
50
61
  ## Free Tier
51
62
 
@@ -113,6 +124,18 @@ Notes:
113
124
  - `gate` expects a threshold in the range `0-100` and exits `1` when the threshold is missed.
114
125
  - Add the Optional AI Workflow only after your `route-families.json` manifest is useful enough to trust.
115
126
 
127
+ ## Dogfood Proof
128
+
129
+ The current repo includes a full dogfood run at [dogfood/2026-03-28/README.md](dogfood/2026-03-28/README.md).
130
+
131
+ - [Playwright example](examples/playwright-react/README.md): synthetic auth change -> `impact`, `plan`, and `gate` all behaved as expected
132
+ - [Cypress example](examples/cypress-nextjs/README.md): synthetic dashboard change -> parity proof for the same deterministic flow
133
+ - [Self dogfood](dogfood/2026-03-28/README.md#phase-2-impact-gate-on-itself): heuristic fallback grouped changes truthfully, but still read too optimistically for a package-style repo
134
+
135
+ Takeaway:
136
+ - the strongest product path is still an app-shaped Playwright/Cypress repo with a maintained manifest
137
+ - zero-config / heuristic fallback is useful for orientation, but it should not be treated as equally trustworthy for release decisions
138
+
116
139
  ## Setup and Calibration
117
140
 
118
141
  These commands help the core CI workflow become accurate and project-aware.
@@ -154,6 +177,20 @@ npx impact-gate finalize-generated-tests --path /path/to/project --create-pr
154
177
 
155
178
  `plan` and `suggest` are aliases. `analyze` is the convenience wrapper when you want the full path in one invocation.
156
179
 
180
+ ### How Hallucinations Are Tackled
181
+
182
+ The AI path is intentionally constrained instead of trusting raw LLM output.
183
+
184
+ - **Deterministic first**: impact analysis, coverage planning, and release-diff planning work without an LLM. The AI layer comes after the diff and coverage evidence are already established.
185
+ - **Local API surface grounding**: generation prompts are built from discovered page objects, helpers, method signatures, and inherited methods from your own repository.
186
+ - **Prompt-level constraints**: the generator is explicitly told to use only known methods and to fall back to raw Playwright selectors when a method is not available.
187
+ - **Prompt sanitization**: flow names, evidence, and user-action strings are sanitized before being injected into prompts.
188
+ - **Hallucination detection gate**: generated code is scanned for method calls that do not exist in the discovered API surface. Suspicious specs are blocked by default instead of being written into the main specs directory.
189
+ - **Needs-review quarantine**: blocked specs are written to `generated-needs-review/` so teams can inspect them manually rather than accidentally trusting them in CI.
190
+ - **Verification after generation**: written specs go through compile checks and smoke-run verification. Failing specs are moved out of the trusted path.
191
+
192
+ This is why the strongest product story is still: deterministic diff -> test plan -> optional AI assistance with guardrails.
193
+
157
194
  ## Advanced / Experimental
158
195
 
159
196
  These features are real, but they are not the clearest place to start if your goal is simple CI coverage decisions.
@@ -329,7 +366,7 @@ Create `impact-gate.config.json` in your project (auto-discovered):
329
366
  ```json
330
367
  {
331
368
  "path": ".",
332
- "profile": "mattermost",
369
+ "profile": "strict",
333
370
  "testsRoot": ".",
334
371
  "mode": "impact",
335
372
  "framework": "auto",
@@ -359,14 +396,14 @@ Profiles are not the same thing as frameworks. They control analysis strictness
359
396
  | Profile | Description |
360
397
  |---------|-------------|
361
398
  | `default` | Standard analysis behavior for most repositories |
362
- | `mattermost` | Mattermost-specific conventions and stricter handling of heuristic-only mappings |
399
+ | `strict` | Stricter handling of heuristic-only mappings and more opinionated analysis defaults |
363
400
 
364
401
  Framework detection is separate. The CLI can auto-detect Playwright, Cypress, pytest, supertest, and Selenium usage from the project structure and dependencies.
365
402
 
366
403
  ### Key options
367
404
 
368
405
  - **`testsRoot`** — path to tests when they live outside the app root
369
- - **`profile`** — `default` or `mattermost`
406
+ - **`profile`** — `default` or `strict`
370
407
  - **`impact.dependencyGraph`** — static reverse dependency graph for transitive impact
371
408
  - **`impact.traceability`** — file-to-test mapping from CI execution data
372
409
  - **`impact.aiFlow`** — LLM-powered flow mapping through the configured provider
@@ -492,22 +529,27 @@ All written under `<testsRoot>/.e2e-ai-agents/`.
492
529
 
493
530
  ## Advanced / Experimental: Autonomous QA Agent (`impact-gate-qa`)
494
531
 
495
- An autonomous QA engineer that opens a real browser, navigates to changed features, tries edge cases, and produces a findings report — all unsupervised. Built on top of `agent-browser` and the Anthropic tool-use API.
532
+ An autonomous QA engineer that can take a diff or a feature prompt, open a real browser, navigate changed features, hunt edge cases, generate follow-up specs, heal failures, and produce a findings report. Built on top of `agent-browser` and the Anthropic tool-use API.
533
+
534
+ If you want the full product story and the natural-language front door, start
535
+ with the [Autonomous Browser QA guide](https://yasserfaraazkhan.github.io/impact-gate/guides/browser-qa/)
536
+ and the [QA Skill Guide](https://yasserfaraazkhan.github.io/impact-gate/guides/qa-skill/)
537
+ for Codex and Claude examples using `/qa`.
496
538
 
497
539
  ### Quick Start
498
540
 
499
541
  ```bash
500
542
  # PR mode — test features changed since origin/main
501
- npx impact-gate-qa pr --since origin/main --base-url http://localhost:8065
543
+ npx impact-gate-qa pr --since origin/main --base-url http://localhost:3000
502
544
 
503
545
  # Hunt mode — deep-test a specific area
504
- npx impact-gate-qa hunt "channel settings" --base-url http://localhost:8065
546
+ npx impact-gate-qa hunt "settings panel" --base-url http://localhost:3000
505
547
 
506
548
  # Release mode — systematic exploration of all critical flows
507
- npx impact-gate-qa release --base-url http://localhost:8065 --time 30
549
+ npx impact-gate-qa release --base-url http://localhost:3000 --time 30
508
550
 
509
551
  # Fix mode — verify healed specs
510
- npx impact-gate-qa fix --base-url http://localhost:8065
552
+ npx impact-gate-qa fix --base-url http://localhost:3000
511
553
  ```
512
554
 
513
555
  ### Architecture
@@ -520,7 +562,7 @@ npx impact-gate-qa fix --base-url http://localhost:8065
520
562
 
521
563
  | Flag | Default | Description |
522
564
  |------|---------|-------------|
523
- | `--base-url` | `http://localhost:8065` | Application URL |
565
+ | `--base-url` | Required | Application URL |
524
566
  | `--time` | `15` | Time limit in minutes |
525
567
  | `--budget` | `2.00` | Max LLM spend in USD |
526
568
  | `--phase` | `all` | Run only `1`, `2`, or `3` |
@@ -532,7 +574,7 @@ Requires `agent-browser` CLI (`npm install -g agent-browser`) and `ANTHROPIC_API
532
574
 
533
575
  ## Production Usage
534
576
 
535
- The strongest production story today is a repo that maintains a good `route-families.json` manifest and uses the deterministic `impact -> plan -> gate` loop in CI. [Mattermost](https://github.com/mattermost/mattermost) is the most battle-tested public example for coverage gating, generation, and healing. See the [Mattermost Playwright integration](https://github.com/mattermost/mattermost/tree/master/e2e-tests/playwright) for a real-world setup.
577
+ The strongest production story today is a repo that maintains a good `route-families.json` manifest, feeds traceability data back into the plan, and uses the deterministic `impact -> plan -> gate` loop in CI. That evidence-first workflow is the path to trust before layering in optional generation, healing, or autonomous QA.
536
578
 
537
579
  ## License
538
580
 
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"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"}
@@ -335,6 +335,9 @@ function normalizeProfile(value) {
335
335
  if (value === 'default' || value === 'mattermost') {
336
336
  return value;
337
337
  }
338
+ if (value === 'strict') {
339
+ return 'mattermost';
340
+ }
338
341
  return undefined;
339
342
  }
340
343
  function normalizeFramework(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"parse_args.d.ts","sourceRoot":"","sources":["../../src/cli/parse_args.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAU,UAAU,EAAC,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,iBAAiB,UAK7B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAmBlF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAmBtE;AA6JD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyFpD"}
1
+ {"version":3,"file":"parse_args.d.ts","sourceRoot":"","sources":["../../src/cli/parse_args.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAU,UAAU,EAAC,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,iBAAiB,UAK7B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAmBlF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAmBtE;AA8JD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyFpD"}
@@ -82,6 +82,7 @@ const FLAGS = {
82
82
  '--verbose': { key: 'verbose', type: 'boolean', aliases: ['-v'] },
83
83
  '--json': { key: 'jsonOutput', type: 'boolean' },
84
84
  '--mattermost': { key: 'profile', type: 'boolean', transform: () => 'mattermost' },
85
+ '--strict': { key: 'profile', type: 'boolean', transform: () => 'mattermost' },
85
86
  // -- string flags --
86
87
  '--config': { key: 'configPath', type: 'string' },
87
88
  '--path': { key: 'path', type: 'string' },
@@ -131,7 +132,7 @@ const FLAGS = {
131
132
  '--pipeline-mcp-timeout-ms': { key: 'pipelineMcpTimeoutMs', type: 'number-raw' },
132
133
  '--pipeline-mcp-retries': { key: 'pipelineMcpRetries', type: 'number-raw' },
133
134
  // -- enum flags --
134
- '--profile': { key: 'profile', type: 'enum', enumValues: ['default', 'mattermost'] },
135
+ '--profile': { key: 'profile', type: 'enum', enumValues: ['default', 'strict', 'mattermost'], transform: (v) => v === 'strict' ? 'mattermost' : v },
135
136
  '--pipeline-browser': { key: 'pipelineBrowser', type: 'enum', enumValues: ['chrome', 'chromium', 'firefox', 'webkit'] },
136
137
  '--policy-enforcement-mode': { key: 'policyEnforcementMode', type: 'enum', enumValues: ['advisory', 'warn', 'block'] },
137
138
  // -- csv flags --
@@ -244,7 +245,7 @@ function parseArgs(argv) {
244
245
  case 'enum':
245
246
  if (next) {
246
247
  if (def.enumValues.includes(next)) {
247
- setField(parsed, def.key, next);
248
+ setField(parsed, def.key, def.transform ? def.transform(next) : next);
248
249
  }
249
250
  i += 1;
250
251
  }
package/dist/cli/usage.js CHANGED
@@ -37,8 +37,8 @@ function printUsage() {
37
37
  'Options:',
38
38
  ' --config <path> Path to impact-gate.config.json (auto-discovered if present)',
39
39
  ' --path <project-root> Path to the project root (scans both frontend and backend)',
40
- ' --profile <name> default | mattermost',
41
- ' --mattermost Shortcut for --profile mattermost',
40
+ ' --profile <name> default | strict',
41
+ ' --strict Shortcut for --profile strict',
42
42
  ' --tests-root <path> Path to tests root (optional)',
43
43
  ' --framework <name> auto | playwright | cypress | pytest | supertest | selenium',
44
44
  ' --patterns <globs> Comma-separated test patterns',
@@ -332,6 +332,9 @@ function normalizeProfile(value) {
332
332
  if (value === 'default' || value === 'mattermost') {
333
333
  return value;
334
334
  }
335
+ if (value === 'strict') {
336
+ return 'mattermost';
337
+ }
335
338
  return undefined;
336
339
  }
337
340
  function normalizeFramework(value) {
@@ -76,6 +76,7 @@ const FLAGS = {
76
76
  '--verbose': { key: 'verbose', type: 'boolean', aliases: ['-v'] },
77
77
  '--json': { key: 'jsonOutput', type: 'boolean' },
78
78
  '--mattermost': { key: 'profile', type: 'boolean', transform: () => 'mattermost' },
79
+ '--strict': { key: 'profile', type: 'boolean', transform: () => 'mattermost' },
79
80
  // -- string flags --
80
81
  '--config': { key: 'configPath', type: 'string' },
81
82
  '--path': { key: 'path', type: 'string' },
@@ -125,7 +126,7 @@ const FLAGS = {
125
126
  '--pipeline-mcp-timeout-ms': { key: 'pipelineMcpTimeoutMs', type: 'number-raw' },
126
127
  '--pipeline-mcp-retries': { key: 'pipelineMcpRetries', type: 'number-raw' },
127
128
  // -- enum flags --
128
- '--profile': { key: 'profile', type: 'enum', enumValues: ['default', 'mattermost'] },
129
+ '--profile': { key: 'profile', type: 'enum', enumValues: ['default', 'strict', 'mattermost'], transform: (v) => v === 'strict' ? 'mattermost' : v },
129
130
  '--pipeline-browser': { key: 'pipelineBrowser', type: 'enum', enumValues: ['chrome', 'chromium', 'firefox', 'webkit'] },
130
131
  '--policy-enforcement-mode': { key: 'policyEnforcementMode', type: 'enum', enumValues: ['advisory', 'warn', 'block'] },
131
132
  // -- csv flags --
@@ -238,7 +239,7 @@ export function parseArgs(argv) {
238
239
  case 'enum':
239
240
  if (next) {
240
241
  if (def.enumValues.includes(next)) {
241
- setField(parsed, def.key, next);
242
+ setField(parsed, def.key, def.transform ? def.transform(next) : next);
242
243
  }
243
244
  i += 1;
244
245
  }
@@ -34,8 +34,8 @@ export function printUsage() {
34
34
  'Options:',
35
35
  ' --config <path> Path to impact-gate.config.json (auto-discovered if present)',
36
36
  ' --path <project-root> Path to the project root (scans both frontend and backend)',
37
- ' --profile <name> default | mattermost',
38
- ' --mattermost Shortcut for --profile mattermost',
37
+ ' --profile <name> default | strict',
38
+ ' --strict Shortcut for --profile strict',
39
39
  ' --tests-root <path> Path to tests root (optional)',
40
40
  ' --framework <name> auto | playwright | cypress | pytest | supertest | selenium',
41
41
  ' --patterns <globs> Comma-separated test patterns',
@@ -35,10 +35,10 @@ Options:
35
35
  --help Show this help
36
36
 
37
37
  Examples:
38
- impact-gate-qa pr --since origin/main --base-url http://localhost:8065
39
- impact-gate-qa hunt "channel settings" --base-url http://localhost:8065
40
- impact-gate-qa release --base-url http://localhost:8065 --time 30
41
- impact-gate-qa fix --base-url http://localhost:8065
38
+ impact-gate-qa pr --since origin/main --base-url http://localhost:3000
39
+ impact-gate-qa hunt "settings panel" --base-url http://localhost:3000
40
+ impact-gate-qa release --base-url http://localhost:3000 --time 30
41
+ impact-gate-qa fix --base-url http://localhost:3000
42
42
  `);
43
43
  }
44
44
  function parseCliArgs(argv) {
@@ -37,10 +37,10 @@ Options:
37
37
  --help Show this help
38
38
 
39
39
  Examples:
40
- impact-gate-qa pr --since origin/main --base-url http://localhost:8065
41
- impact-gate-qa hunt "channel settings" --base-url http://localhost:8065
42
- impact-gate-qa release --base-url http://localhost:8065 --time 30
43
- impact-gate-qa fix --base-url http://localhost:8065
40
+ impact-gate-qa pr --since origin/main --base-url http://localhost:3000
41
+ impact-gate-qa hunt "settings panel" --base-url http://localhost:3000
42
+ impact-gate-qa release --base-url http://localhost:3000 --time 30
43
+ impact-gate-qa fix --base-url http://localhost:3000
44
44
  `);
45
45
  }
46
46
  function parseCliArgs(argv) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@yasserkhanorg/impact-gate",
3
- "version": "2.1.6",
4
- "description": "Diff-aware E2E impact analysis, release-ready test planning, and coverage gating for Playwright/Cypress teams. Optional AI features can suggest, generate, and heal tests once your project has a route-families.json manifest.",
3
+ "version": "2.1.7",
4
+ "description": "Diff-aware E2E impact analysis, release-ready test planning, coverage gating, and hallucination-resistant AI generation for Playwright/Cypress teams.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -62,7 +62,8 @@
62
62
  "glob": "^11.0.0",
63
63
  "marked": "^15.0.6",
64
64
  "minimatch": "^10.2.4",
65
- "openai": "^4.73.0"
65
+ "openai": "^4.73.0",
66
+ "typescript": "^5.6.0"
66
67
  },
67
68
  "peerDependencies": {
68
69
  "agent-browser": ">=0.18.0"
@@ -73,8 +74,7 @@
73
74
  }
74
75
  },
75
76
  "devDependencies": {
76
- "@types/node": "^22.0.0",
77
- "typescript": "^5.6.0"
77
+ "@types/node": "^22.0.0"
78
78
  },
79
79
  "repository": {
80
80
  "type": "git",
@@ -117,7 +117,7 @@
117
117
  "node": ">=20.0.0"
118
118
  },
119
119
  "author": "Yasser Khan",
120
- "homepage": "https://github.com/yasserfaraazkhan/impact-gate",
120
+ "homepage": "https://yasserfaraazkhan.github.io/impact-gate/",
121
121
  "bugs": {
122
122
  "url": "https://github.com/yasserfaraazkhan/impact-gate/issues"
123
123
  },
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: qa
3
3
  description: |
4
- Systematically QA test the Mattermost web application and fix bugs found.
4
+ Systematically QA test a running web application and fix bugs found.
5
5
  Runs autonomous browser exploration, computes health scores, fixes bugs with
6
6
  atomic commits, and produces structured reports with before/after evidence.
7
7
  Use when asked to "qa", "QA", "test this", "find bugs", "test and fix",
@@ -23,16 +23,23 @@ to systematically test the application, find bugs, fix them, and produce a repor
23
23
  ## Step 1: Determine parameters
24
24
 
25
25
  Parse the user's request for:
26
- - **URL**: The base URL to test (default: `http://localhost:8065`)
26
+ - **URL**: The base URL to test. Prefer the app URL the user provided or the
27
+ currently running local/staging app URL you can discover. If no app URL is
28
+ available, ask for it instead of assuming a hard-coded local port.
27
29
  - **Mode**: `pr` (feature branch, default), `hunt` (specific area), `release` (full regression), `fix` (verify healed tests)
28
30
  - **Fix tier**: `quick` (critical+high), `standard` (default, +medium), `exhaustive` (+low)
29
31
  - **Regression**: Whether to compare against a previous baseline
30
32
 
31
33
  Auto-detect mode:
32
- - On a feature branch with no URL → `pr` mode
34
+ - On a feature branch with an app URL → `pr` mode
33
35
  - User mentions a specific area (e.g., "test channel settings") → `hunt` mode
34
36
  - User says "release", "regression", "full test" → `release` mode
35
37
 
38
+ Accept any reachable application URL, for example:
39
+ - `http://localhost:3000`
40
+ - `http://127.0.0.1:5173`
41
+ - `https://staging.example.com`
42
+
36
43
  ## Step 2: Check prerequisites
37
44
 
38
45
  ```bash
@@ -64,16 +71,16 @@ npx impact-gate-qa <mode> \
64
71
  Examples:
65
72
  ```bash
66
73
  # Default: test current branch changes
67
- npx impact-gate-qa pr --base-url http://localhost:8065
74
+ npx impact-gate-qa pr --base-url <app-url>
68
75
 
69
76
  # Hunt mode for a specific area
70
- npx impact-gate-qa hunt "channel settings" --base-url http://localhost:8065
77
+ npx impact-gate-qa hunt "account settings" --base-url <app-url>
71
78
 
72
79
  # Release readiness with regression comparison
73
- npx impact-gate-qa release --base-url http://localhost:8065 --regression --time 30
80
+ npx impact-gate-qa release --base-url <app-url> --regression --time 30
74
81
 
75
82
  # Quick smoke test, no fixes
76
- npx impact-gate-qa pr --base-url http://localhost:8065 --fix-tier quick --no-fix
83
+ npx impact-gate-qa pr --base-url <app-url> --fix-tier quick --no-fix
77
84
  ```
78
85
 
79
86
  ## Step 4: Read and display the report