tamash-playwright 0.11.0-beta.4 → 0.11.0-beta.6

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.

Potentially problematic release.


This version of tamash-playwright might be problematic. Click here for more details.

package/CHANGELOG.md CHANGED
@@ -7,6 +7,28 @@ All notable changes to this project are documented here. Format loosely follows
7
7
 
8
8
  ### Fixed
9
9
 
10
+ - **`skills/tamash-playwright/references/heal.md` never told the agent the Playwright HTML report exists at the point it matters.** It only pointed at `npx playwright show-report` at the very end (the REPORT step), after the loop was already finished — not right after RUN, where the report's per-attempt annotation and JSON attachment (provider, vision/action-recovery involvement, suggested selector, token cost, failure stage) would actually help decide what to do next. Found by directly auditing the skill against every documented user workflow step, not by running it. Fixed: RUN now explicitly says what the report contains and when it's worth opening.
11
+
12
+ - **`doctor`'s connectivity check gave false confidence for `claude-subscription`/`copilot-subscription`.**
13
+ It tested against a fixed, generous 15s timeout, completely decoupled from the project's real
14
+ configured `actionTimeout` — so a project using the README's own example value (`actionTimeout:
15
+ 8000`) could get `[OK] Connected successfully` from `doctor`, then have its very first real heal
16
+ in a fresh test run fail with a misleading "not authenticated?" warning, because these two
17
+ providers spawn the vendor's own CLI as a subprocess and the first call in a process pays a
18
+ one-time cold-start cost (spawning + authenticating) on top of the actual model call — a cost
19
+ `doctor`'s own generous timeout never had to absorb. Found via a real, unbriefed agent walkthrough
20
+ of a from-scratch setup (see the skill entry below): it hit this exact failure, correctly
21
+ diagnosed the root cause from a source-code comment nothing user-facing ever surfaced, and worked
22
+ around it by raising `actionTimeout` to 20000ms. Fixed at the actual source: `doctor` now tests
23
+ connectivity within the project's real `actionTimeout` when one's configured (falling back to the
24
+ old generous default only when none is set yet), and a `[FAIL]` for either of these two providers
25
+ now explicitly suggests it may be the cold-start cost rather than a real auth problem. Verified
26
+ against the real `copilot-subscription` provider — confirmed the check now genuinely uses the
27
+ configured timeout (not just that it compiles); could not force a deterministic before/after
28
+ repro of the timeout itself in this environment, since the underlying race is timing/environment-
29
+ dependent (a warm local CLI session can mask it, exactly as the original cold-start comment
30
+ already described).
31
+
10
32
  - **The published package was silently carrying stale, orphaned compiled output.** `npm run build`
11
33
  (plain `tsc`, no `--build`/incremental mode) never deletes `dist/` output for a source file that
12
34
  was later removed — found in the `0.11.0-beta.1` publish itself: `dist/healer/providers/
@@ -37,6 +59,20 @@ All notable changes to this project are documented here. Format loosely follows
37
59
 
38
60
  ### Added
39
61
 
62
+ - **A skill for running this package's local workflow inside an AI coding assistant.** Ships at
63
+ `skills/tamash-playwright/` — a `SKILL.md` entry point that branches on `npx tamash-playwright
64
+ doctor`'s actual output (never assumed), plus two reference docs: `onboarding.md` (bringing a
65
+ project up to standard — provider setup, `actionTimeout`, `.describe()` labels, Page Object
66
+ extraction) and `heal.md` (a gated review/apply/verify/land loop over `apply-heals` and
67
+ `verify-heals.cjs` — most runs proceed start to finish unattended, pausing only for a genuinely
68
+ ambiguous fix or anything after a failed verification, and never landing/committing/opening a PR
69
+ without asking first, no matter how clean the run was). Pure orchestration over commands that
70
+ already exist — no new healing capability. Ships with adapters for Claude Code, Kiro (identical
71
+ `SKILL.md` format, confirmed against Kiro's own docs), Cursor (`.mdc` rule), GitHub Copilot
72
+ (`copilot-instructions.md` section), and an `AGENTS.md` covering the broader cross-tool standard
73
+ (Antigravity, Gemini CLI, Windsurf, Zed, Aider, and others) — none of which are auto-discovered
74
+ from `node_modules` by any of these tools, confirmed rather than assumed, so every adapter's
75
+ install step is one explicit copy command, documented in `SKILL.md` itself.
40
76
  - **A new `tamash` heal provider — rule-based healing, no AI at all.** `HEALER_PROVIDER=tamash`
41
77
  needs no API key, no subscription, and makes no network call: it resolves a broken locator by
42
78
  text-matching the same description an AI provider would receive (`.describe()`, or a decoded
package/README.md CHANGED
@@ -184,6 +184,8 @@ AfterAll(async () => {
184
184
 
185
185
  A no-op if `copilot-subscription` was never used, so it's safe to add unconditionally.
186
186
 
187
+ **Gotcha, confirmed live**: `claude-subscription` and `copilot-subscription` both work by spawning the vendor's own CLI as a subprocess — the *first* call in a fresh process has to pay a one-time cold-start cost (spawning it, authenticating) on top of the actual model call, and on a slower machine or network that alone can exhaust a tight `actionTimeout` before the model ever responds — with the failure surfacing as a generic "not authenticated?" warning that points at the wrong root cause. `doctor` tests connectivity within your *real* configured `actionTimeout` specifically to catch this — if it reports `[FAIL]` for one of these two providers, try raising `actionTimeout` a little (or just re-run `doctor` once more; a warm process often succeeds) before assuming your login/token is actually broken.
188
+
187
189
  **One thing worth knowing**: only Claude and Copilot support this "subscription, no API key, works in CI too" combination — a ChatGPT or Google AI subscription can back local runs the same way (via those vendors' own CLIs), but neither vendor currently offers a way to use that subscription unattended in CI, so CI there still needs a plain API key (the existing `openai`/`gemini` providers above).
188
190
 
189
191
  ### Rule-based healing, no AI required
@@ -221,7 +223,7 @@ npx tamash-playwright doctor
221
223
 
222
224
  It checks:
223
225
 
224
- 1. **AI connectivity** — confirms `HEALER_ENABLED`/`HEALER_PROVIDER` are set correctly and actually calls your configured provider to make sure the API key and model work.
226
+ 1. **AI connectivity** — confirms `HEALER_ENABLED`/`HEALER_PROVIDER` are set correctly and actually calls your configured provider, within your real configured `actionTimeout` when one's set (not a decoupled generous default), to make sure it actually works within the budget healing will really have. See the `claude-subscription`/`copilot-subscription` gotcha above if this fails for one of those two.
225
227
  2. **`actionTimeout` configuration** — checks your `playwright.config.ts` for an `actionTimeout` set well below your test `timeout` (see above); flags it if missing or too close to the test timeout, since that silently starves self-healing of any time to run.
226
228
  3. **Vision capability** — whether your configured model is expected to support the screenshot-based fallback (see below), based on its name.
227
229
  4. **Missing `.describe()` labels** — scans your test files (`tests/` by default, or pass `--dir <path>`) for locators that don't have a `.describe('...')` label, and flags the ones most worth fixing (raw CSS/XPath selectors first).
@@ -533,6 +535,12 @@ The same detail is also printed to the console as it happens, one line per attem
533
535
  [self-healer] src/pages/loginpage.ts:11 — locator.fill "Username Textbox" -> HEALED [provider=ollama:gpt-oss:120b, vision=no, actionRecovery=no, suggested="getByRole(\"textbox\", { name: \"Username\" })", 620 tokens (489 input + 131 output)] — locator.fill: Timeout 8000ms exceeded.
534
536
  ```
535
537
 
538
+ ## Using this with an AI coding assistant
539
+
540
+ This package ships a ready-made skill for running its local workflow inside an AI coding assistant — reviewing, applying, verifying, and landing whatever healed at runtime, and onboarding a project to its standards (provider setup, `actionTimeout`, `.describe()` labels) if it hasn't adopted them yet. It's pure orchestration over the exact CLI commands already documented above (`doctor`, `apply-heals`, `verify-heals.cjs`) — no new capability, just packaged so an agent can run the whole loop with judgment instead of you typing each command by hand.
541
+
542
+ No agent auto-discovers a skill bundled inside `node_modules` — it's always one explicit copy step after install. Supported today: **Claude Code**, **Kiro**, **Cursor**, **GitHub Copilot**, and any `AGENTS.md`-reading tool (Antigravity, Gemini CLI, Windsurf, Zed, Aider, and others). See [skills/tamash-playwright/SKILL.md](skills/tamash-playwright/SKILL.md) for the exact copy command for whichever you use.
543
+
536
544
  ## License
537
545
 
538
546
  Free to use, including commercially. The source code may not be copied, modified, redistributed, or resold without prior written permission. See the LICENSE file included in this package for the full terms.
@@ -34,6 +34,7 @@ currently covered · N/A not applicable to that column.
34
34
  | `getDurable()` | Resolves any locator (e.g. `aria-ref=...`) to a durable, reusable equivalent. | ✅ e2e (`get-durable-*-repro`, 4 specs incl. concurrency) | ❌ No CI sample test calls it directly |
35
35
  | Provider: `ollama` | API-key provider, Ollama Cloud. | ✅ Verified this session (live calls, real token counts) | ✅ Both CI workflows now run a `test-ollama` job, confirmed green |
36
36
  | Provider: `ollama-local` | Self-hosted Ollama server; `OLLAMA_LOCAL_API_KEY` optional, unlike `ollama`'s required key. | ✅ Verified against a genuine local Ollama installation this session (real `ollama serve`, `qwen2.5:0.5b` pulled and warmed) — confirmed the default `OLLAMA_LOCAL_BASE_URL`, real request/response round-trip (including correct token-usage extraction), and that the real server both works with no `Authorization` header and tolerates one being sent unnecessarily; also confirmed end-to-end via the real `doctor` CLI, not just a direct provider call. (A synthetic fake-HTTP-server test preceded this and is superseded by it.) | ❌ Not used in either CI workflow (no self-hosted Ollama instance available in CI) |
37
+ | Multi-agent skill (`skills/tamash-playwright/`) | Local review/apply/verify/land workflow for AI coding assistants, plus adapters for Claude Code, Kiro, Cursor, Copilot, and `AGENTS.md`-reading tools. | ✅ Exercised end-to-end by real, unbriefed agents in isolated environments (no prior tamash-playwright knowledge given) — three separate walkthroughs: (1) a project with real `doctor` `[WARN]`s → correctly routed to `onboarding.md`, fixed 6 missing `.describe()`s, and correctly stopped at the Page Object gate rather than "fixing" files it verified were intentionally non-POM demos; (2) a `doctor`-clean project with a real broken locator → correctly routed to `heal.md`, ran the full RUN→REVIEW→APPLY→VERIFY loop unattended, and correctly stopped at LAND rather than committing anything; (3) a from-scratch project with zero `tamash-playwright` presence → correctly installed and configured it from the published package's own docs (the skill doesn't exist in any published version yet, confirmed), proved real healing by deliberately breaking a locator and watching it recover live, and in doing so found a real bug now fixed (see CHANGELOG: `doctor`'s connectivity check was decoupled from the real `actionTimeout`). Six genuine documentation bugs found and fixed across all three runs, not just "read for plausibility." | ❌ Not used in either CI workflow (nothing to run in CI — this is consumed by an agent, not by the test suite) |
37
38
  | Provider: `openai` | API-key provider. | ✅ Re-verified live this release (`doctor` connectivity, real key) | ❌ Not used in either CI workflow |
38
39
  | Provider: `anthropic` | API-key provider. | ✅ Re-verified live this release (`doctor` connectivity, real key) | ❌ Not used in either CI workflow |
39
40
  | Provider: `gemini` | API-key provider. | ⚠️ Key authenticates and the model responds correctly (verified with a raw request, real `200 OK`), but `gemini-3.6-flash` took 50+ seconds to answer a trivial prompt — far beyond `doctor`'s 15s timeout and this repo's real `actionTimeout: 8000`ms, so it fails both `doctor` and real healing as currently configured, despite the key itself being valid | ❌ Not used in either CI workflow |
@@ -60,6 +61,38 @@ The table above is the current, living state. This section keeps a short history
60
61
  release to release, and anything worth remembering that testing itself turned up — including real
61
62
  mistakes, not just successes.
62
63
 
64
+ ### [0.11.0-beta.5] — multi-agent skill, tested for real — 2026-08-29
65
+
66
+ **Added this release**: `skills/tamash-playwright/` (`SKILL.md` + `onboarding.md`/`heal.md`), and
67
+ `ollama-local`. Tested the skill by handing it to real, unbriefed subagents in isolated
68
+ environments rather than just re-reading it for plausibility — three separate runs, six real bugs
69
+ found and fixed as a direct result:
70
+
71
+ 1. `SKILL.md`'s dispatch gate didn't define what to do when `doctor` shows no `[WARN]`/`[FAIL]`
72
+ but still has `[INFO]` rows (Vision Fallback, Page Objects count) — a very reachable state its
73
+ binary rule never covered. Fixed: `[INFO]` rows are now explicitly non-blocking.
74
+ 2. `onboarding.md` never addressed the Vision Fallback `[INFO]` row at all. Fixed: an explicit note
75
+ that `[INFO]` rows aren't part of the checklist.
76
+ 3. The Page Object section only said "look for an existing convention," not "check whether the
77
+ flagged file is *deliberately* excluded from it" — an agent almost "fixed" a file explicitly
78
+ commented as an intentional non-POM demo, catching it only by reading the comment carefully.
79
+ Fixed: an explicit instruction to check for that signal before assuming oversight.
80
+ 4. `heal.md`'s APPLY step described the interactive confirmation prompt but never told an agent how
81
+ to answer it non-interactively — it guessed `echo y | ...`, which isn't a real supported
82
+ mechanism. Fixed: explicitly documented `--yes`.
83
+ 5. `SKILL.md`'s heal.md branch condition ("if the suite has run recently...") read as circular,
84
+ since `heal.md`'s own first step is running the suite. Fixed: clarified it applies either way.
85
+ 6. The real standout: a from-scratch setup walkthrough found that `doctor`'s connectivity check
86
+ used a fixed 15s timeout completely decoupled from the project's real `actionTimeout` — so
87
+ `doctor` said `[OK]` while the very first real heal for `copilot-subscription` (which spawns a
88
+ CLI subprocess, paying a one-time cold-start cost) timed out at the README's own recommended
89
+ `actionTimeout: 8000`, with a misleading "not authenticated?" error. Fixed at the source (see
90
+ CHANGELOG) — this was found by testing the skill, not by testing the skill's own subject matter,
91
+ which is exactly why real end-to-end testing beats reviewing documentation for plausibility.
92
+
93
+ All three test environments (two git worktrees of the real Playwright sample repo, one from-scratch
94
+ project) were isolated and discarded afterward — no changes reached the real sample repos.
95
+
63
96
  ### [0.11.0-beta.1 → beta.2] — 2026-08-28
64
97
 
65
98
  **Added this release**: the `tamash` provider, the automatic variable-name description enrichment,
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AA0MA,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlE"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAsOA,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlE"}
@@ -74,12 +74,31 @@ async function checkProviderConnectivity() {
74
74
  console.log(` Vision-capable model: ${(0, console_style_1.dim)('no')} — ${provider.name} does not look vision-capable by name, so the screenshot-based fallback will never be attempted.`);
75
75
  record('Vision Fallback', 'INFO', `${provider.name} does not look vision-capable by name`);
76
76
  }
77
- console.log(` Testing connectivity to ${(0, console_style_1.bold)(provider.name)}...`);
77
+ // Testing against a generous, fixed timeout regardless of the project's own actionTimeout used
78
+ // to give a false "OK" for CLI-subprocess-backed providers (claude-subscription,
79
+ // copilot-subscription): their first call in a fresh process pays a one-time cold-start cost
80
+ // (spawning + authenticating the underlying CLI) that a real healed action has to absorb inside
81
+ // the user's actual actionTimeout, not this check's own budget -- confirmed live: doctor reported
82
+ // "[OK] Connected" at the default 15s here while the exact same provider then timed out on the
83
+ // very first real heal in a fresh `playwright test` run configured with an 8s actionTimeout, with
84
+ // a misleading "not authenticated?" warning pointing at the wrong root cause entirely. Testing
85
+ // against the project's real configured actionTimeout when one is set closes that gap: a `[FAIL]`
86
+ // here now means "healing will genuinely struggle with your real timeout budget," not just
87
+ // "generously found unreachable." Falls back to the old fixed value only when no actionTimeout is
88
+ // configured yet at all (the Action Timeout check below already flags that separately).
89
+ const actionTimeoutCheck = (0, scanActionTimeout_1.checkActionTimeout)();
90
+ const configuredActionTimeout = actionTimeoutCheck.status === 'ok' || actionTimeoutCheck.status === 'too_close'
91
+ ? actionTimeoutCheck.actionTimeout
92
+ : undefined;
93
+ const connectivityTimeoutMs = configuredActionTimeout ?? CONNECTIVITY_TIMEOUT_MS;
94
+ console.log(configuredActionTimeout !== undefined
95
+ ? ` Testing connectivity to ${(0, console_style_1.bold)(provider.name)} (within your configured actionTimeout of ${configuredActionTimeout}ms)...`
96
+ : ` Testing connectivity to ${(0, console_style_1.bold)(provider.name)} (no actionTimeout configured yet — using a generous ${CONNECTIVITY_TIMEOUT_MS}ms default; see Action Timeout below)...`);
78
97
  const result = await provider.suggestSelector({
79
98
  action: 'click',
80
99
  description: 'tamash-playwright doctor connectivity check',
81
100
  ariaSnapshot: CONNECTIVITY_SNAPSHOT,
82
- timeoutMs: CONNECTIVITY_TIMEOUT_MS,
101
+ timeoutMs: connectivityTimeoutMs,
83
102
  });
84
103
  if (result) {
85
104
  console.log(` ${TAG_OK} Connected to ${provider.name} successfully.`);
@@ -88,6 +107,12 @@ async function checkProviderConnectivity() {
88
107
  else {
89
108
  console.log(` ${TAG_FAIL} Could not get a valid response from ${provider.name}.`);
90
109
  console.log(' Check the warning above (if any), your API key, model name, and network connection.');
110
+ if (configuredActionTimeout !== undefined && (providerName === 'claude-subscription' || providerName === 'copilot-subscription')) {
111
+ console.log(` This ran within your real ${configuredActionTimeout}ms actionTimeout, not a generous default —`);
112
+ console.log(' if the warning above mentions a timeout, this may just be the underlying CLI\'s one-time');
113
+ console.log(' cold-start cost (spawning + authenticating the subprocess) rather than a real auth problem.');
114
+ console.log(' Try raising actionTimeout, or re-run doctor once more (a warm process often succeeds).');
115
+ }
91
116
  record('AI Provider', 'FAIL', `No valid response from ${provider.name}`);
92
117
  }
93
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tamash-playwright",
3
- "version": "0.11.0-beta.4",
3
+ "version": "0.11.0-beta.6",
4
4
  "description": "Plug and Play Self-healing for Playwright and automatically recovers broken selectors using an AI model (Ollama, OpenAI, Anthropic, Gemini, or a Claude/GitHub Copilot subscription).",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -9,6 +9,7 @@
9
9
  },
10
10
  "files": [
11
11
  "dist",
12
+ "skills",
12
13
  "README.md",
13
14
  "usage.md",
14
15
  "CHANGELOG.md",
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: tamash-playwright
3
+ description: Set up and run tamash-playwright's self-healing Playwright workflow locally — onboard a project to its standards, then review, apply, verify, and land runtime heals as permanent fixes.
4
+ allowed-tools: Bash(npx tamash-playwright:*) Bash(npx playwright:*) Bash(node:*) Bash(npm:*) Bash(git:*) Bash(gh:*) Read Edit Write Grep Glob
5
+ ---
6
+
7
+ # tamash-playwright — local self-healing workflow
8
+
9
+ `tamash-playwright` is a self-healing add-on for Playwright: when a locator breaks, it asks an AI model (or a free rule-based matcher) to find the element and heal the test at runtime, right when the failure happens. This skill is the **local counterpart to its CI automation** (run → `apply-heals` → verify → PR → report) — the same loop, but with a real agent reasoning about each fix instead of a static PR diff nobody reads closely.
10
+
11
+ ## Start here: run `doctor`
12
+
13
+ Everything below branches on one command — run it before assuming which path applies:
14
+
15
+ ```bash
16
+ npx tamash-playwright doctor
17
+ ```
18
+
19
+ - **Any `[FAIL]` or `[WARN]`** (no provider configured, missing `actionTimeout`, undescribed locators, inline locators) → this project hasn't adopted tamash-playwright's standards yet. Follow **[references/onboarding.md](references/onboarding.md)** first.
20
+ - **No `[FAIL]`/`[WARN]` remaining** → the project's ready, regardless of what else is showing. An `[INFO]` row (Vision Fallback capability, a Page Objects locator count) is never a blocker — those are observational, not a standard to meet; see onboarding.md's own note on this if one is present. Follow **[references/heal.md](references/heal.md)** — its own first step is running the suite, so this applies whether or not it's already been run; you don't need pre-existing heals to justify starting it.
21
+
22
+ Don't guess which one applies from what the user says or how the project looks — `doctor`'s actual output is the source of truth every time.
23
+
24
+ ## What this skill does NOT do
25
+
26
+ - It never invents a healing strategy of its own. Every action here is one of tamash-playwright's own existing CLI commands (`doctor`, `apply-heals`, the generated `verify-heals.cjs`) — this skill is orchestration and judgment layered on commands that already exist, not a new capability bolted onto the package.
27
+ - It never commits or opens a PR without asking first, no matter how clean a run was — see the LAND step in [heal.md](references/heal.md).
28
+ - It never touches anything `apply-heals` itself already excludes (`dragTo`/`drop` heals, action-recovery-only heals, `waitFor()`/assertion exclusions) — if `apply-heals` didn't offer to change it, this skill doesn't either.
29
+
30
+ ## Getting this skill into a project
31
+
32
+ No coding agent auto-discovers a skill bundled inside an npm package's `node_modules` — this is always a real, explicit one-time step after `npm install tamash-playwright`, never automatic. Which step depends on which agent(s) the project actually uses:
33
+
34
+ **Claude Code** — same rich format, copy as-is:
35
+
36
+ ```bash
37
+ mkdir -p .claude/skills
38
+ cp -r node_modules/tamash-playwright/skills/tamash-playwright .claude/skills/tamash-playwright
39
+ ```
40
+
41
+ **Kiro** — identical `SKILL.md` format to Claude Code, just a different root directory:
42
+
43
+ ```bash
44
+ mkdir -p .kiro/skills
45
+ cp -r node_modules/tamash-playwright/skills/tamash-playwright .kiro/skills/tamash-playwright
46
+ ```
47
+
48
+ **Cursor** — its own rule format (`.mdc`, with frontmatter Cursor uses to decide when to attach it):
49
+
50
+ ```bash
51
+ mkdir -p .cursor/rules
52
+ cp node_modules/tamash-playwright/skills/tamash-playwright/adapters/cursor-tamash-playwright.mdc .cursor/rules/
53
+ ```
54
+
55
+ **GitHub Copilot** — append (or create) its single instructions file:
56
+
57
+ ```bash
58
+ cat node_modules/tamash-playwright/skills/tamash-playwright/adapters/copilot-instructions-tamash-playwright.md >> .github/copilot-instructions.md
59
+ ```
60
+
61
+ **Antigravity, Gemini CLI, Windsurf, Zed, Aider, and other `AGENTS.md`-reading tools** — one file covers all of them:
62
+
63
+ ```bash
64
+ cp node_modules/tamash-playwright/skills/tamash-playwright/adapters/AGENTS.md ./AGENTS.md
65
+ # or, if AGENTS.md already exists, append its content instead of overwriting
66
+ ```
67
+
68
+ Any of the copy targets above (`.claude/skills/`, `.kiro/skills/`) can also be done once at the user level (`~/.claude/skills/tamash-playwright`, `~/.kiro/skills/tamash-playwright`) to cover every project on the machine instead of one at a time.
@@ -0,0 +1,11 @@
1
+ # tamash-playwright
2
+
3
+ This project uses `tamash-playwright` for self-healing Playwright tests. If you're working on test files, `playwright.config.ts`, or anything under `.tamash-playwright/`, follow this before making changes:
4
+
5
+ 1. Run `npx tamash-playwright doctor` first — always, don't assume the project's state.
6
+ 2. **Any `[FAIL]`/`[WARN]`** (no AI provider configured, missing `actionTimeout`, locators without `.describe()`, inline locators) → the project hasn't adopted tamash-playwright's standards yet. Follow `node_modules/tamash-playwright/skills/tamash-playwright/references/onboarding.md`.
7
+ 3. **All `[OK]`**, and the test suite has run recently with healing enabled → review, apply, verify, and land whatever healed by following `node_modules/tamash-playwright/skills/tamash-playwright/references/heal.md`.
8
+
9
+ Both reference docs are self-contained: what to run, how to interpret the output, and exactly when to pause and ask before continuing (never commit or open a pull request without asking first, no matter how clean a run was).
10
+
11
+ This file is generic on purpose — it's read by whichever coding agent is active in this workspace (Cursor, Copilot, Antigravity, Gemini CLI, Windsurf, or another AGENTS.md-compatible tool). Claude Code and Kiro have their own richer, conditionally-loaded copy of the same instructions under `.claude/skills/tamash-playwright/` / `.kiro/skills/tamash-playwright/` — if you're one of those two, prefer that copy over this file.
@@ -0,0 +1,12 @@
1
+ <!--
2
+ Append this section to the project's .github/copilot-instructions.md
3
+ (or drop it in as the whole file if one doesn't exist yet).
4
+ -->
5
+
6
+ ## tamash-playwright — self-healing Playwright workflow
7
+
8
+ This project uses `tamash-playwright`. Before changing test files, `playwright.config.ts`, or anything under `.tamash-playwright/`:
9
+
10
+ 1. Run `npx tamash-playwright doctor` first — always, don't assume the project's current state.
11
+ 2. Any `[FAIL]`/`[WARN]` → follow `node_modules/tamash-playwright/skills/tamash-playwright/references/onboarding.md` to bring the project up to standard (AI provider setup, `actionTimeout`, `.describe()` labels, Page Object extraction — each with how to confirm the fix worked).
12
+ 3. All `[OK]`, and the suite has run recently with healing on → follow `node_modules/tamash-playwright/skills/tamash-playwright/references/heal.md` to review, apply, verify, and land whatever healed. It's a gated loop: most runs go start to finish with no interruption, but it always pauses before landing anything — never commit or open a pull request on its own.
@@ -0,0 +1,14 @@
1
+ ---
2
+ description: Set up and run tamash-playwright's self-healing workflow locally — onboard the project to its standards, then review/apply/verify/land runtime heals. Apply when working on Playwright test files, playwright.config.ts, or anything under .tamash-playwright/.
3
+ globs: ["**/*.spec.ts", "**/*.test.ts", "playwright.config.ts", ".tamash-playwright/**"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # tamash-playwright — local self-healing workflow
8
+
9
+ Run `npx tamash-playwright doctor` first — always, don't assume the project's state from context alone.
10
+
11
+ - **Any `[FAIL]`/`[WARN]`** → the project hasn't adopted tamash-playwright's standards yet. Follow `node_modules/tamash-playwright/skills/tamash-playwright/references/onboarding.md` (no AI provider configured, missing `actionTimeout`, locators missing `.describe()`, inline locators that should be in a Page Object — each one's fix and how to confirm it worked is in that file).
12
+ - **All `[OK]`**, and the suite has run recently with healing enabled → follow `node_modules/tamash-playwright/skills/tamash-playwright/references/heal.md` — a gated loop (run → review → apply → verify → land) that only pauses for you at two points: a genuinely ambiguous fix, or anything after a failed verification. Everything else proceeds on its own.
13
+
14
+ Never commit or open a pull request without asking first, no matter how clean a run was — that gate never auto-continues.
@@ -0,0 +1,115 @@
1
+ # Reviewing, applying, verifying, and landing local heals
2
+
3
+ The local counterpart to tamash-playwright's CI automation (test → `apply-heals` → verify → PR → report) — same steps, same "never land an unproven fix" discipline, but run by an agent with real judgment in the loop instead of unattended.
4
+
5
+ Prerequisite: `doctor` reports all `[OK]` — see [onboarding.md](onboarding.md) if not.
6
+
7
+ ## The loop
8
+
9
+ Every gate below defaults to **continue** except two — genuine ambiguity in REVIEW, and anything past VERIFY. That's what makes this an actual loop rather than a manual walkthrough: a clean run with unambiguous heals and a passing verify goes start to finish with no interruptions, and the agent only surfaces itself when something genuinely warrants a human's judgment.
10
+
11
+ ### 1. RUN
12
+
13
+ ```bash
14
+ npx playwright test # or the project's own test command; a named subset is fine
15
+ ```
16
+
17
+ Runs with healing already enabled — nothing extra to configure once onboarding is done. Every attempt, healed or not, is appended to `.tamash-playwright/heals.jsonl`, and the console prints one line per attempt:
18
+
19
+ ```
20
+ [self-healer] src/pages/loginpage.ts:11 — locator.fill "Username Textbox" -> HEALED [provider=ollama:gpt-oss:120b, vision=no, actionRecovery=no, suggested="getByRole(\"textbox\", { name: \"Username\" })", 620 tokens (489 input + 131 output)] — locator.fill: Timeout 8000ms exceeded.
21
+ ```
22
+
23
+ The console line already has everything needed for the REVIEW step below, but the same detail also lands in Playwright's own HTML report (`npx playwright show-report`) for every attempt, healed or not — worth opening if a console line alone doesn't answer a question: an annotation summarizing the outcome (plus a separate `self-heal-needs-review` annotation on the kind of fix REVIEW should look closer at), and a JSON attachment with the full detail — provider, whether vision/action-recovery was involved, the suggested selector, token cost, and, for anything that didn't heal, which stage it stopped at (`ai_declined`, `replay_failed`, etc.).
24
+
25
+ **GATE — did anything heal?**
26
+
27
+ - No `HEALED` lines at all, or `.tamash-playwright/heals.jsonl` doesn't exist / is empty → **stop here.** Report "suite passed, nothing needed healing." The loop ends clean — there's nothing to review, apply, or land.
28
+ - At least one `HEALED` line → continue to REVIEW.
29
+
30
+ Also note — but don't act on yet — any line where the action failed and was **not** healed (`ai_declined`, `replay_failed`, etc.). That's a real, still-broken locator `apply-heals` can't touch at all. Carry it into the final report as something a human needs to look at directly.
31
+
32
+ ### 2. REVIEW
33
+
34
+ ```bash
35
+ npx tamash-playwright apply-heals --dry-run
36
+ ```
37
+
38
+ Produces a table like:
39
+
40
+ ```
41
+ Fixes (2, 1 needing review)
42
+ ┌───────────────────────────────┬──────────────────────────┬───────────────────────────────────────────┬────────┐
43
+ │ Location │ Before │ After │ Review │
44
+ ├───────────────────────────────┼──────────────────────────┼───────────────────────────────────────────┼────────┤
45
+ │ src/pages/loginpage.ts:11 │ .locator('input[name="…' │ .getByRole("textbox", { name: "Username" })│ — │
46
+ │ tests/employee-id.spec.ts:31 │ .getByPlaceholder('Empl…'│ .locator('div').filter({ hasText: 'Empl…'})│ yes │
47
+ └───────────────────────────────┴──────────────────────────┴───────────────────────────────────────────┴────────┘
48
+ ⚠ tests/employee-id.spec.ts:31 — No stable identity of its own — durable selector anchors on nearby text instead.
49
+ ```
50
+
51
+ **GATE — is each fix trustworthy?**
52
+
53
+ - **Review column is `—`** (came from the element's own real identity: id, test id, accessible role+name, label, or placeholder) → high confidence. Continue.
54
+ - **Review column is `yes`** (came from a nearby label or a positional fallback — the warning line under the table explains why) → actually look closer before deciding. Open the target file, and the real page/component if it helps. Form a genuine opinion, don't just relay the flag.
55
+ - Confident it's correct → continue, but say so explicitly in the final report (don't silently treat it the same as an unflagged fix).
56
+ - Still genuinely unsure → **PAUSE.** Ask the user, naming the specific fix, its location, and exactly why it's uncertain. Don't guess past this point.
57
+
58
+ ### 3. APPLY
59
+
60
+ ```bash
61
+ npx tamash-playwright apply-heals --yes
62
+ ```
63
+
64
+ **Always pass `--yes` (or `-y`) when you're the one running this, not a human at a keyboard.** The confirmation prompt (`Apply N fix(es) to your source files (M needing review)? [y/N]:`) only exists for a real interactive terminal; in a genuinely non-interactive invocation it's skipped automatically anyway, but `--yes` is the documented, supported way to answer it deliberately rather than relying on stdin behavior you haven't verified. Never pipe an answer into stdin (`echo y | ...`) — it isn't a supported way to answer this prompt, even if it happens to appear to work in a given environment.
65
+
66
+ **GATE — did it match expectations?**
67
+
68
+ - Output reports the same count of fixes as the dry-run showed, `0 skipped` → continue.
69
+ - Anything unexpected (fewer applied, files skipped, an error) → **stop**, surface exactly what didn't match before doing anything else.
70
+
71
+ ### 4. VERIFY
72
+
73
+ ```bash
74
+ node .tamash-playwright/verify-heals.cjs
75
+ ```
76
+
77
+ Sets `HEALER_ENABLED=false` and re-runs **only the tests actually affected**, proving the rewritten selectors work standalone — not just "worked while healing was still there to catch a mistake."
78
+
79
+ **GATE — hard gate, never soft:**
80
+
81
+ - Exit code 0, all green → continue to LAND.
82
+ - Any failure → **STOP. Do not land.** Report exactly which test/assertion failed and why. A failed verify here means either the applied fix is actually wrong, or something unrelated broke — either way, a human needs to see this before anything is committed. Mirrors the CI workflow's own rule: a bad verification is always surfaced, never silently landed, and never silently discarded either.
83
+
84
+ ### 5. LAND
85
+
86
+ **This gate never auto-continues, regardless of how clean steps 1–4 were.** Present:
87
+
88
+ - What's ready to land — the exact diff, or point at `.tamash-playwright/apply-heals-report.md`.
89
+ - Proof it works — the verify-heals result from step 4.
90
+
91
+ Then ask the user to choose:
92
+
93
+ - Commit directly on the current branch.
94
+ - Create a new branch and `gh pr create` — compose the PR body the same way the CI workflow does (the before/after report plus the verification result, clearly labeled pass/fail).
95
+ - Leave everything staged/unstaged for the user to handle themselves.
96
+
97
+ Never pick for them, and never commit or push without an explicit answer — same standing rule as any other push/publish action.
98
+
99
+ ### 6. CLOSE THE LOOP
100
+
101
+ Once landed, re-run the full suite once more (healing still on):
102
+
103
+ ```bash
104
+ npx playwright test
105
+ ```
106
+
107
+ A clean pass with **zero new `HEALED` lines** confirms the fix is genuinely durable, not just "verify-heals happened to pass once" — and leaves the project in a clean state for the next time this loop runs.
108
+
109
+ ### 7. REPORT
110
+
111
+ One summary at the end, regardless of where the loop stopped:
112
+
113
+ - What ran, what healed, what got applied / verified / landed.
114
+ - Anything still needing a human: declined heals from step 1, or a fix paused on in step 2.
115
+ - Where to look for more detail: `.tamash-playwright/apply-heals-report.md` (or `.json` for the structured version), or `npx playwright show-report` for the full HTML report.
@@ -0,0 +1,91 @@
1
+ # Onboarding a project to tamash-playwright's standards
2
+
3
+ Use this when `doctor` reports any `[WARN]`/`[FAIL]`. Work through its findings in the order below — each one is independent, so if only some apply, skip the rest. After every fix, the section tells you exactly how to confirm it actually worked — don't move on without checking.
4
+
5
+ **`[INFO]` rows are not part of this checklist.** `doctor` also reports a couple of purely observational rows — whether the configured model looks vision-capable by name, and how many locators sit inline across how many files. Neither is a standard to meet or something to fix; they're context, not findings. Once every `[WARN]`/`[FAIL]` below is resolved, the project is done here regardless of what those `[INFO]` rows still say.
6
+
7
+ ## 1. No AI provider configured
8
+
9
+ `doctor` reports this as:
10
+
11
+ ```
12
+ [WARN] HEALER_PROVIDER is not set. No AI provider is configured, so self-healing will never
13
+ recover a failed action — it will just fail normally.
14
+ ```
15
+
16
+ Ask the user which they want — don't assume:
17
+
18
+ - **Free, fastest to start**: Ollama Cloud (`HEALER_PROVIDER=ollama`) — a free API key from `ollama.com/settings/keys`.
19
+ - **An API-key provider they already pay for**: `openai` / `anthropic` / `gemini`.
20
+ - **A subscription they already have, no API key**: `claude-subscription` or `copilot-subscription` (TypeScript only).
21
+ - **Free, zero-AI, no network call**: `tamash` (currently `@beta` — `npm install tamash-playwright@beta`) — text-matches `.describe()` against the page's own accessibility tree, never guesses; a narrower success rate than an AI provider but no cost and no key at all.
22
+ - **Their own self-hosted Ollama server**: `ollama-local` (also `@beta`) — same shape as `ollama` but points at their own server instead of Ollama Cloud; `OLLAMA_LOCAL_API_KEY` is optional, only needed if their deployment sits behind an auth gateway.
23
+
24
+ Write (or update) `.env` from `.env.example` with their choice. **Never handle the real API key value yourself** — write the variable name with an empty value and have the user paste the real key into the file directly. Never echo a key back in chat, a commit message, a log line, or a report.
25
+
26
+ **Confirm it worked**: re-run `npx tamash-playwright doctor`. The AI Provider section must show:
27
+
28
+ ```
29
+ [OK] Connected to <provider>:<model> successfully.
30
+ ```
31
+
32
+ A `[FAIL]` here means the key or model is wrong — read the actual error line, it names the real failure (bad key, unreachable host, model not found). Don't move on until this is `[OK]`.
33
+
34
+ ## 2. Missing or too-close `actionTimeout`
35
+
36
+ `doctor` reports:
37
+
38
+ ```
39
+ [WARN] playwright.config.ts does not set actionTimeout (or it's too close to `timeout`)
40
+ ```
41
+
42
+ By default Playwright lets a broken locator retry silently for the *entire* test timeout before throwing — healing never gets a turn, since it only kicks in once an action actually fails. Open `playwright.config.ts` and set `actionTimeout` explicitly, comfortably below the overall `timeout`:
43
+
44
+ ```ts
45
+ export default defineConfig({
46
+ timeout: 60000, // overall test timeout
47
+ use: {
48
+ actionTimeout: 8000, // must be comfortably less than the timeout above
49
+ },
50
+ });
51
+ ```
52
+
53
+ This is mechanical and safe — apply it directly, no need to ask first.
54
+
55
+ **Confirm it worked**: re-run `doctor` — the Action Timeout section must show `[OK]`.
56
+
57
+ ## 3. Locators without `.describe()`
58
+
59
+ `doctor` lists these ranked by priority (raw CSS/XPath selectors first) in a table, e.g.:
60
+
61
+ ```
62
+ [WARN] Found 12 locator(s) without .describe():
63
+ Priority | Location | Snippet
64
+ 1 | tests/login.spec.ts:14 | page.locator('input[name="user"]')
65
+ ...
66
+ ```
67
+
68
+ For each flagged locator:
69
+
70
+ 1. Open the file at the given location.
71
+ 2. **Read the actual context** — the surrounding page/component, not just the variable name — to write a genuinely accurate, human-readable description. This is the one place this skill should do better than the package's own automatic fallback (`decodeVariableName`, which only has the raw identifier to work from): you can look at what the element actually *is*.
72
+ 3. Chain `.describe('...')` onto the locator. Purely additive, never changes runtime behavior — safe to apply across every flagged locator in one pass without asking per-locator. Summarize what you changed when done.
73
+
74
+ **Confirm it worked**: re-run `doctor` — the count under "Found N locator(s) without `.describe()`" should drop to reflect what you fixed (0 if you did all of them).
75
+
76
+ ## 4. Locators written directly in test files (should be in a Page Object)
77
+
78
+ `doctor` flags these as a best-practice recommendation, not something broken — inline locators still heal fine, this is about long-term maintainability, not correctness. **Unlike the `.describe()` fix above, do not mechanically extract every one without asking first.** This is a real structural refactor, and every project already has (or lacks) its own Page Object conventions.
79
+
80
+ Before touching anything:
81
+
82
+ 1. Look for an existing Page Object pattern in the project (a `pages/` directory, a base page class, an established naming convention). Follow whatever already exists — don't invent a new structure if one is already there.
83
+ 2. **Before assuming a flagged file is an oversight, check whether it's deliberately excluded.** Open it and look for a signal that it's intentional — a comment like `// Non-POM example`, a file name like `*-inline.spec.ts` or `*-demo.spec.ts`, or a project README/AGENTS.md section describing it as a teaching/contrast example next to a POM equivalent. A project can have a complete Page Object layer already *and* still correctly leave a few files inline on purpose. Finding one real Page Object convention elsewhere in the repo is not, by itself, evidence that every flagged file is a bug — verify each one before folding it into scope.
84
+ 3. If no existing convention is found at all (not even a deliberately-excluded demo file — genuinely nothing), propose one and confirm it with the user before creating it.
85
+ 4. Ask the user for scope: every flagged locator that's actually in scope after step 2, or a small sample first to confirm the approach before doing the rest.
86
+
87
+ **Confirm it worked**: re-run `doctor` after the agreed scope is done — the "Locators written directly in test files" count should reflect exactly what was moved, no more, no less.
88
+
89
+ ## Done
90
+
91
+ Once `doctor` reports no remaining `[WARN]`/`[FAIL]` (any `[INFO]` rows are fine — see the note at the top of this file), the project meets tamash-playwright's standards. If a test suite has already been run with healing enabled since then, continue to [heal.md](heal.md) to review what healed. Otherwise, onboarding is complete — no further action needed here.
package/usage.md CHANGED
@@ -131,7 +131,7 @@ npx tamash-playwright doctor
131
131
 
132
132
  | # | Check | What it does |
133
133
  |---|-------|---------------|
134
- | 1 | AI connectivity | Confirms `HEALER_ENABLED`/`HEALER_PROVIDER` are set, and actually calls the provider to verify the key and model work. |
134
+ | 1 | AI connectivity | Confirms `HEALER_ENABLED`/`HEALER_PROVIDER` are set, and actually calls the provider — within your real configured `actionTimeout` when one's set, not a decoupled generous default — to verify it actually works within the budget healing will really have. For `claude-subscription`/`copilot-subscription` specifically, a `[FAIL]` here can be a one-time CLI cold-start cost rather than a real auth problem — try raising `actionTimeout` a little, or just re-run `doctor` once more. |
135
135
  | 2 | `actionTimeout` | Reads `playwright.config.ts`; flags a missing or too-close-to-`timeout` value. |
136
136
  | 3 | Vision capability | Checks by name whether your configured model is expected to support the screenshot fallback. |
137
137
  | 4 | Missing `.describe()` | Scans `tests/` (or `--dir <path>`) for locators without a label, raw CSS/XPath first. |
@@ -569,6 +569,22 @@ The same detail prints to the console as it happens:
569
569
 
570
570
  Every real (non-`--dry-run`) run also writes `.tamash-playwright/verify-heals.cjs` — run `node .tamash-playwright/verify-heals.cjs` to re-verify exactly the affected tests with healing disabled. See [Proving a fix actually works](#proving-a-fix-actually-works-verify-healscjs).
571
571
 
572
+ ## Using this with an AI coding assistant
573
+
574
+ The package ships a skill (`skills/tamash-playwright/`) that runs the local version of the workflow above end-to-end inside an AI coding assistant: `doctor` first, then either onboarding a project that hasn't adopted these standards yet (provider setup, `actionTimeout`, `.describe()` labels, Page Object extraction) or reviewing/applying/verifying/landing whatever healed at runtime — pure orchestration over the exact commands already documented on this page, no new capability added.
575
+
576
+ Supported today, each with its own install step (no agent auto-discovers a skill sitting in `node_modules` — always one explicit copy after `npm install tamash-playwright`):
577
+
578
+ | Agent | Where it goes | Format |
579
+ |---|---|---|
580
+ | Claude Code | `.claude/skills/tamash-playwright/` | `SKILL.md` + linked `references/` |
581
+ | Kiro | `.kiro/skills/tamash-playwright/` | Identical `SKILL.md` format — same files, different root |
582
+ | Cursor | `.cursor/rules/tamash-playwright.mdc` | Cursor's own rule format (`skills/tamash-playwright/adapters/cursor-tamash-playwright.mdc`) |
583
+ | GitHub Copilot | Appended to `.github/copilot-instructions.md` | Plain markdown section (`skills/tamash-playwright/adapters/copilot-instructions-tamash-playwright.md`) |
584
+ | Antigravity, Gemini CLI, Windsurf, Zed, Aider, and other `AGENTS.md`-reading tools | `AGENTS.md` at the project root | Plain markdown (`skills/tamash-playwright/adapters/AGENTS.md`) |
585
+
586
+ Exact copy commands for each are in [skills/tamash-playwright/SKILL.md](skills/tamash-playwright/SKILL.md).
587
+
572
588
  ## License
573
589
 
574
590
  Free to use, including commercially. The source code may not be copied, modified, redistributed, or resold without prior written permission. See the [LICENSE](LICENSE) file included in this package for the full terms.