tamash-playwright 0.11.0-beta.7 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +1 -1
- package/CHANGELOG.md +18 -15
- package/README.md +9 -4
- package/RELEASE-TESTING.md +5 -5
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +22 -26
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/initSkill.d.ts +0 -2
- package/dist/cli/initSkill.d.ts.map +1 -1
- package/dist/cli/initSkill.js +40 -37
- package/dist/cli/initSkill.js.map +1 -1
- package/dist/cli/skill.d.ts +16 -17
- package/dist/cli/skill.d.ts.map +1 -1
- package/dist/cli/skill.js +67 -147
- package/dist/cli/skill.js.map +1 -1
- package/package.json +1 -1
- package/skills/tamash-playwright/SKILL.md +8 -36
- package/skills/tamash-playwright/references/onboarding.md +3 -3
- package/usage.md +13 -13
- package/skills/tamash-playwright/adapters/AGENTS.md +0 -11
- package/skills/tamash-playwright/adapters/copilot-instructions-tamash-playwright.md +0 -12
- package/skills/tamash-playwright/adapters/cursor-tamash-playwright.mdc +0 -14
package/.env.example
CHANGED
|
@@ -60,7 +60,7 @@ OLLAMA_API_KEY=
|
|
|
60
60
|
# In other CI systems: set GITHUB_TOKEN (or COPILOT_GITHUB_TOKEN) to a PAT with "Copilot Requests".
|
|
61
61
|
# COPILOT_SUBSCRIPTION_MODEL=mai-code-1-flash-picker
|
|
62
62
|
|
|
63
|
-
# --- Cursor subscription (LOCAL DEVELOPMENT ONLY --
|
|
63
|
+
# --- Cursor subscription (LOCAL DEVELOPMENT ONLY -- experimental, prefer kiro/codex) ---
|
|
64
64
|
# Requires: the `agent` CLI installed (curl https://cursor.com/install -fsS | bash) and signed in
|
|
65
65
|
# via `agent login` (or CURSOR_API_KEY). Runs `agent -p --trust --mode ask --output-format json` --
|
|
66
66
|
# `--mode ask` is Cursor's read-only Q&A mode, so a heal call can't edit files or run commands.
|
package/CHANGELOG.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
All notable changes to this project are documented here. Format loosely follows
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/); dates are when each version was published.
|
|
5
5
|
|
|
6
|
-
## [0.11.0] - 2026-08-
|
|
6
|
+
## [0.11.0] - 2026-08-31
|
|
7
7
|
|
|
8
8
|
### Fixed
|
|
9
9
|
|
|
@@ -100,8 +100,8 @@ All notable changes to this project are documented here. Format loosely follows
|
|
|
100
100
|
is an interactive assistant rather than a one-shot completion endpoint — given the heal prompt it
|
|
101
101
|
often answers conversationally instead of with the required JSON, so the heal is declined more
|
|
102
102
|
often than with `kiro`/`codex`. It's now invoked in the safest/best-effort form
|
|
103
|
-
(`agent -p --trust --mode ask --output-format json`, read-only) and
|
|
104
|
-
|
|
103
|
+
(`agent -p --trust --mode ask --output-format json`, read-only) and is marked **experimental**;
|
|
104
|
+
the docs point to `kiro`/`codex` as the steadier local-subscription options. Report issues.
|
|
105
105
|
Also: the full e2e healing suite (12 tests) was run end to end against `copilot-subscription` and
|
|
106
106
|
`ollama` — **12/12 each** — to confirm the parser rewrite and provider changes don't regress it.
|
|
107
107
|
|
|
@@ -112,18 +112,21 @@ All notable changes to this project are documented here. Format loosely follows
|
|
|
112
112
|
(`skills/tamash-playwright/`) was previously a copy-this-shell-one-liner-per-agent step buried in
|
|
113
113
|
`SKILL.md`, with nothing verifying it had been done — so a project could `npm install` the
|
|
114
114
|
package, never copy the skill, and its assistant would silently never load the workflow.
|
|
115
|
-
`init-skill`
|
|
116
|
-
`.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
`[
|
|
123
|
-
|
|
124
|
-
into a temp dir) and verified live end to end
|
|
125
|
-
|
|
126
|
-
|
|
115
|
+
`init-skill` copies the skill (`SKILL.md` + `references/`) into **both** standard locations —
|
|
116
|
+
`.claude/skills/tamash-playwright/` (Claude Code) and `.agents/skills/tamash-playwright/` (the
|
|
117
|
+
emerging cross-tool standard, read by Cursor, GitHub Copilot, Windsurf, Kiro, Zed, dotnet Aspire,
|
|
118
|
+
… — the same convention Playwright's own `playwright-cli install --skills` uses). Same content in
|
|
119
|
+
both; no per-agent format conversion. `--target claude` / `--target agents` installs one; `--user`
|
|
120
|
+
installs under your home directory; `--force` overwrites a hand-edited copy; `--dry-run` previews.
|
|
121
|
+
Each install carries a `tamash-playwright-skill-version:` marker; `doctor`'s **Skill** section
|
|
122
|
+
reads it and reports `[OK]` current / `[WARN]` behind-the-package-version / `[INFO]` not-installed
|
|
123
|
+
or unmanaged, with the same one-line fix. Covered by unit tests (`skill.test.js`, real installs
|
|
124
|
+
into a temp dir) and verified live end to end.
|
|
125
|
+
|
|
126
|
+
*(0.11.0-beta.7 shipped an earlier `init-skill` that instead auto-detected the agent and wrote a
|
|
127
|
+
Cursor-specific `.mdc` file / appended blocks to `.github/copilot-instructions.md` and
|
|
128
|
+
`AGENTS.md`. That approach is gone — `init-skill` and `doctor` now point out any such leftovers
|
|
129
|
+
from a beta.7 install so you can delete them by hand.)*
|
|
127
130
|
|
|
128
131
|
- **`doctor`'s AI Provider check now tells you *what kind* of failure it hit and what to do about
|
|
129
132
|
it, instead of one generic "no valid response".** Every provider gained an optional, diagnostics-
|
package/README.md
CHANGED
|
@@ -190,7 +190,7 @@ A no-op if `copilot-subscription` was never used, so it's safe to add unconditio
|
|
|
190
190
|
|
|
191
191
|
### Using a Cursor, Kiro, or Codex subscription — local development only
|
|
192
192
|
|
|
193
|
-
Three more subscription-based providers, all
|
|
193
|
+
Three more subscription-based providers, all **local-development-only, never recommended for CI**, extending the same "use what you're already paying for" idea. `kiro-subscription` and `codex-subscription` are verified healing real broken locators; `cursor-subscription` is experimental (see the note below).
|
|
194
194
|
|
|
195
195
|
**Cursor** — needs the `agent` CLI (`curl https://cursor.com/install -fsS | bash`) and `agent login` (or `CURSOR_API_KEY`):
|
|
196
196
|
|
|
@@ -257,7 +257,7 @@ It checks:
|
|
|
257
257
|
3. **Vision capability** — whether your configured model is expected to support the screenshot-based fallback (see below), based on its name.
|
|
258
258
|
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).
|
|
259
259
|
5. **Locators written directly in test files** — flags any locator defined inline in a test rather than inside a Page Object class, which is a Playwright best practice regardless of self-healing: it keeps tests readable and means a UI change only needs a fix in one place.
|
|
260
|
-
6. **Skill installation** — whether the orchestration skill this package ships (see [Using this with an AI coding assistant](#using-this-with-an-ai-coding-assistant)) has been copied into
|
|
260
|
+
6. **Skill installation** — whether the orchestration skill this package ships (see [Using this with an AI coding assistant](#using-this-with-an-ai-coding-assistant)) has been copied into `.claude/skills/` and/or `.agents/skills/`, and whether that copy is still current. Fix is one command: `npx tamash-playwright init-skill`.
|
|
261
261
|
|
|
262
262
|
If it finds issues, the fastest fix is to open the project in an AI coding assistant (Claude Code, Cursor, GitHub Copilot, etc.) and ask it to address what it flagged — add `.describe()` calls, or extract locators into Page Object classes. You can also add a standing rule to that assistant's instructions/skill file (e.g. `CLAUDE.md`, `.cursor/rules`, `.github/copilot-instructions.md`) so it follows both practices automatically on any new test code going forward.
|
|
263
263
|
|
|
@@ -569,13 +569,18 @@ The same detail is also printed to the console as it happens, one line per attem
|
|
|
569
569
|
|
|
570
570
|
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.
|
|
571
571
|
|
|
572
|
-
No agent auto-discovers a skill bundled inside `node_modules` — it's
|
|
572
|
+
No agent auto-discovers a skill bundled inside `node_modules` — it's one explicit step after install. Run:
|
|
573
573
|
|
|
574
574
|
```sh
|
|
575
575
|
npx tamash-playwright init-skill
|
|
576
576
|
```
|
|
577
577
|
|
|
578
|
-
|
|
578
|
+
That copies the skill (`SKILL.md` + `references/`) into **both** standard locations — the same convention Playwright's own `playwright-cli install --skills` uses:
|
|
579
|
+
|
|
580
|
+
- `.claude/skills/tamash-playwright/` — Claude Code
|
|
581
|
+
- `.agents/skills/tamash-playwright/` — the emerging cross-tool standard, read by Cursor, GitHub Copilot, Windsurf, Kiro, Zed, and others
|
|
582
|
+
|
|
583
|
+
Same content in both; no per-agent format conversion. `--target claude` / `--target agents` installs just one; `--user` installs under your home directory (covers every project); `--force` overwrites a hand-edited copy. Re-run after upgrading the package — `doctor` flags when the installed skill is behind. By-hand instructions are in [skills/tamash-playwright/SKILL.md](skills/tamash-playwright/SKILL.md).
|
|
579
584
|
|
|
580
585
|
## License
|
|
581
586
|
|
package/RELEASE-TESTING.md
CHANGED
|
@@ -17,7 +17,7 @@ currently covered · N/A not applicable to that column.
|
|
|
17
17
|
| Core action healing (click/fill/check/selectOption/etc.) | Any wrapped Playwright action retries against a healed locator on failure. | ✅ Extensive unit + e2e coverage (many repro specs) | ✅ Every CI run exercises this against the sample repos' own broken locators |
|
|
18
18
|
| Master on/off switch (`HEALER_ENABLED=false`) | A broken locator fails exactly like vanilla Playwright when healing is off; a working locator is unaffected either way. | ✅ Permanent e2e (`healing-disabled.e2e.spec.ts`) — **found with zero coverage anywhere in this repo, ever, until asked directly whether "with and without AI healing" had actually been tested** | ❌ Neither CI workflow runs with healing disabled (`apply-heals`'s own verification step does, but only to confirm an already-applied fix works standalone — not the same as testing a genuinely broken locator with healing off) |
|
|
19
19
|
| `.describe()` context | Human-readable label chained onto a locator, used as the AI's primary description. | ✅ Used throughout the test suite | ✅ Both sample repos' tests use it |
|
|
20
|
-
| Automatic variable-name description fallback | `extractVariableName` (raw identifier) + `decodeVariableName` (decoded phrase + type hint) when `.describe()` isn't called. | ✅ 10+10 unit tests, permanent e2e spec |
|
|
20
|
+
| Automatic variable-name description fallback | `extractVariableName` (raw identifier) + `decodeVariableName` (decoded phrase + type hint) when `.describe()` isn't called. | ✅ 10+10 unit tests, permanent e2e spec | 🔎 Exercised on every sample-repo CI heal (it's the description path when `.describe()` is absent), no dedicated assertion |
|
|
21
21
|
| Search-scoped snapshots | Sends a narrower excerpt of the accessibility tree when the description matches exactly one node, instead of the full page. | ✅ Live-verified (measured token reduction across several real cases) | 🔎 Silently exercised on every CI heal (it's the default first path), but no dedicated CI assertion checks it specifically |
|
|
22
22
|
| `near` strategy (nameless field via label) | Resolves an unlabeled field by climbing to a shared ancestor and finding the one plausible-role sibling. | ✅ e2e (`aic-form-healing`, `employee-id-healing`) | ✅ Indirectly — the sample repos' own Employee Id field is exactly this shape |
|
|
23
23
|
| `adjacent` strategy (same-row disambiguation) | Precise sibling match when `near`'s ancestor search would find more than one same-role candidate. | ✅ e2e (`adjacent-sibling-healing`) + unit | ❌ No sample test currently has this shape |
|
|
@@ -31,19 +31,19 @@ currently covered · N/A not applicable to that column.
|
|
|
31
31
|
| Heal caching (`heals.jsonl`) | A previously-confirmed selector is retried before a fresh AI call. | ✅ Unit (`healLog.test.js`) + e2e-observed | ✅ Uploaded as a CI artifact every run, consumed by `apply-heals` |
|
|
32
32
|
| `apply-heals` (permanent fix + PR automation) | Turns a runtime heal into a committed source change; opens a PR in CI. | ✅ Unit (46 tests, all 9 strategies) | ✅ Dedicated CI job, runs every push |
|
|
33
33
|
| `doctor` CLI | Pre-flight checks: provider connectivity, `actionTimeout`, vision capability, missing `.describe()`, inline locators, skill installation. | ✅ Run live against every provider including `tamash` this session | ❌ Not run as part of either CI workflow |
|
|
34
|
-
| `init-skill` CLI + `doctor` Skill check |
|
|
34
|
+
| `init-skill` CLI + `doctor` Skill check | Copies the skill into `.claude/skills/tamash-playwright/` and `.agents/skills/tamash-playwright/` (Playwright's `install --skills` convention — no per-agent conversion); `doctor` reports current / outdated / unmanaged / absent per location and flags pre-beta.8 leftovers. | ✅ Unit (`skill.test.js`, real installs into a temp dir: both targets, idempotency, version-bump re-copy, `--force` gating, `--user`, `--dry-run`, `skillState` transitions, legacy-artifact detection) + live: `init-skill` (both), `--target agents`, `--help`, and every `doctor` Skill state incl. leftover `.mdc` / appended-block detection | ❌ Not run in CI (neither workflow runs `doctor` or `init-skill`) |
|
|
35
35
|
| `doctor` categorised provider diagnosis | `diagnose()` per provider → `doctor` maps `not-installed`/`not-authenticated`/`timeout`/`bad-model`/`network`/`bad-response` to a specific fix. | ✅ Unit (`providerDiagnostics.test.js`, 13 cases on both classifiers) + live: `openai` bad key → `not-authenticated` (401 body shown), `openai` bad base URL → `network`, `copilot-subscription` bad model → `bad-model`, 1ms `actionTimeout` → `timeout` with raise-the-timeout guidance, and all three not-installed shapes (moved the dep out of resolution and restored it): `@github/copilot-sdk` CJS `MODULE_NOT_FOUND`, `@anthropic-ai/claude-agent-sdk` ESM `ERR_MODULE_NOT_FOUND`, missing `kiro-cli` `ENOENT` → each `not-installed` with its install command | ❌ Not run in CI (neither workflow runs `doctor`) |
|
|
36
36
|
| `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 |
|
|
37
37
|
| 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 |
|
|
38
38
|
| 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) |
|
|
39
|
-
| 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
|
|
39
|
+
| 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, 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) |
|
|
40
40
|
| Provider: `openai` | API-key provider. | ✅ Re-verified live this release (`doctor` connectivity, real key) | ❌ Not used in either CI workflow |
|
|
41
41
|
| Provider: `anthropic` | API-key provider. | ✅ Re-verified live this release (`doctor` connectivity, real key) | ❌ Not used in either CI workflow |
|
|
42
42
|
| 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 |
|
|
43
43
|
| Provider: `claude-subscription` | No API key — uses a Claude subscription. | ✅ Verified this session | ✅ The Playwright sample repo's CI uses this as its default provider |
|
|
44
44
|
| Provider: `copilot-subscription` | No API key — uses a GitHub Copilot subscription. | ✅ Verified this session | ✅ The Cucumber sample repo's CI uses this as its default provider |
|
|
45
45
|
| Provider: `kiro-subscription` / `codex-subscription` | Local-development-only subscription providers (Kiro, Codex) — `child_process` wrappers, no official SDK. | ✅ **Both verified end to end, authenticated (2026-08-31)** — real `kiro-cli` v2.20.1 and `codex-cli` 0.151; `doctor` `[OK] Connected`; `codex` passed a full `npx playwright test` heal-and-recover (broken locator → `HEALED [provider=codex-subscription]` → test green, cache cleared); `kiro` passed the same single-test heal. Verifying them found four bugs, all fixed (see CHANGELOG). Not yet exercised: full `npx playwright test` for `kiro`, and `suggestActionTactic` for both. | ❌ Local-only by design, never in CI |
|
|
46
|
-
| Provider: `cursor-subscription` | Local-only subscription provider (Cursor `agent` CLI),
|
|
46
|
+
| Provider: `cursor-subscription` | Local-only subscription provider (Cursor `agent` CLI), experimental. | ⚠️ **Partial (2026-08-31)** — `doctor` → `[OK] Connected`, and a real `suggestSelector` returns the correct `{strategy:"ref"}` on many calls. But in a real `npx playwright test` run the heal was declined (`stage=ai_declined`): Cursor's `agent` is an interactive assistant that frequently answers conversationally instead of with JSON, and does so more often than `kiro`/`codex`. Tried `--mode ask`, `--output-format json`, empty `--workspace` — the behaviour is the model's. Kept for user feedback with the safest invocation (`--trust --mode ask --output-format json`, read-only); docs mark it experimental and point to `kiro`/`codex`. | ❌ Not in CI |
|
|
47
47
|
| Provider: `tamash` (no AI) | Zero-dependency rule-based healing. | ✅ Verified against the full test suite in both sample repos (all files, cleared cache, run twice each for stability) | ✅ `test-tamash` added to and passing in both sample repos' CI |
|
|
48
48
|
| Non-`@playwright/test` runner support (`bindPageActions`/`bindContext`) | Manual binding for Cucumber, Jest, or a plain script. | ✅ Live-verified via the Cucumber sample repo, this session | ✅ The Cucumber sample repo's entire CI run *is* this |
|
|
49
49
|
| `waitFor()`/`dragTo`/`drop`/`expect()` exclusions | Deliberately never healed — state checks and two-sided actions can't be safely guessed at. | ✅ e2e (`wait-for-not-healed`) | ❌ No CI sample test currently exercises these specifically |
|
|
@@ -123,7 +123,7 @@ After the fixes, verified live:
|
|
|
123
123
|
returns correct answers on many calls, but a real `npx playwright test` heal was declined
|
|
124
124
|
(`stage=ai_declined`) — Cursor's `agent` frequently answers conversationally rather than with
|
|
125
125
|
JSON, more so than `kiro`/`codex`. Not tuned away by `--mode ask` / `--output-format json` /
|
|
126
|
-
empty `--workspace`.
|
|
126
|
+
empty `--workspace`. Kept as an experimental provider for user feedback; docs note `kiro`/`codex` are steadier.
|
|
127
127
|
|
|
128
128
|
**Suite-level validation of this release's changes** (the `diagnose()` + `doctor` rework, the
|
|
129
129
|
shared JSON-parser rewrite, `init-skill`, the CLI-provider fixes), run 2026-08-31 against a real
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAqaA,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BlE"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -315,56 +315,52 @@ function checkActionTimeoutSetup() {
|
|
|
315
315
|
return;
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
|
-
// Whether the orchestration skill this package ships has
|
|
319
|
-
//
|
|
320
|
-
//
|
|
321
|
-
//
|
|
318
|
+
// Whether the orchestration skill this package ships has been copied into the project — into
|
|
319
|
+
// .claude/skills/tamash-playwright/ and/or .agents/skills/tamash-playwright/ (the convention
|
|
320
|
+
// Playwright's own `playwright-cli install --skills` established) — and whether it's still current.
|
|
321
|
+
// No agent auto-discovers a skill inside node_modules, so without this step the skill silently does
|
|
322
|
+
// nothing. Fix is always the same one command: `npx tamash-playwright init-skill`.
|
|
322
323
|
function checkSkillSetup(cwd) {
|
|
323
324
|
(0, console_style_1.section)('Skill');
|
|
324
325
|
const version = (0, skill_1.getPackageVersion)();
|
|
325
|
-
const detected = new Set((0, skill_1.detectAgents)(cwd).map((a) => a.id));
|
|
326
326
|
const seen = [];
|
|
327
|
-
for (const
|
|
328
|
-
const state = (0, skill_1.skillState)(cwd,
|
|
329
|
-
const isDetected = detected.has(agent.id);
|
|
327
|
+
for (const target of skill_1.TARGETS) {
|
|
328
|
+
const state = (0, skill_1.skillState)(cwd, target, version);
|
|
330
329
|
if (state.status === 'absent') {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
console.log(` ${TAG_WARN} ${agent.label}: in use here, but the tamash-playwright skill isn't installed for it.`);
|
|
334
|
-
seen.push('WARN');
|
|
335
|
-
continue;
|
|
330
|
+
console.log(` ${TAG_INFO} ${target.label}: not installed.`);
|
|
331
|
+
seen.push('INFO');
|
|
336
332
|
}
|
|
337
|
-
if (state.status === 'current') {
|
|
338
|
-
console.log(` ${TAG_OK} ${
|
|
333
|
+
else if (state.status === 'current') {
|
|
334
|
+
console.log(` ${TAG_OK} ${target.label}: installed and current (v${state.version}).`);
|
|
339
335
|
seen.push('OK');
|
|
340
336
|
}
|
|
341
337
|
else if (state.status === 'outdated') {
|
|
342
|
-
console.log(` ${TAG_WARN} ${
|
|
338
|
+
console.log(` ${TAG_WARN} ${target.label}: v${state.installed} installed, package is v${state.version} — update it.`);
|
|
343
339
|
seen.push('WARN');
|
|
344
340
|
}
|
|
345
341
|
else {
|
|
346
|
-
console.log(` ${TAG_INFO} ${
|
|
342
|
+
console.log(` ${TAG_INFO} ${target.label}: present but with no version marker (a manual copy?).`);
|
|
347
343
|
seen.push('INFO');
|
|
348
344
|
}
|
|
349
345
|
}
|
|
346
|
+
const legacy = (0, skill_1.legacyInstallArtifacts)(cwd);
|
|
347
|
+
for (const p of legacy) {
|
|
348
|
+
console.log(` ${TAG_INFO} Leftover from an older init-skill (safe to delete): ${p}`);
|
|
349
|
+
}
|
|
350
|
+
const anyInstalled = seen.includes('OK') || seen.includes('WARN');
|
|
350
351
|
const rank = { OK: 0, OFF: 1, INFO: 1, WARN: 2, FAIL: 3 };
|
|
351
352
|
const worst = seen.reduce((acc, s) => (rank[s] > rank[acc] ? s : acc), 'OK');
|
|
352
|
-
if (
|
|
353
|
-
console.log(` ${TAG_INFO} No assistant config detected (.claude/, .kiro/, .cursor/, .github/, AGENTS.md) and no skill installed.`);
|
|
353
|
+
if (!anyInstalled) {
|
|
354
354
|
console.log(' If you use an AI coding assistant, install the workflow skill with:');
|
|
355
355
|
console.log((0, console_style_1.dim)(' npx tamash-playwright init-skill'));
|
|
356
|
-
record('Skill', 'INFO', '
|
|
356
|
+
record('Skill', 'INFO', 'Skill not installed (.claude/skills, .agents/skills)');
|
|
357
357
|
return;
|
|
358
358
|
}
|
|
359
359
|
if (worst === 'WARN') {
|
|
360
360
|
console.log('');
|
|
361
|
-
console.log('
|
|
361
|
+
console.log(' Refresh it with:');
|
|
362
362
|
console.log((0, console_style_1.dim)(' npx tamash-playwright init-skill'));
|
|
363
|
-
|
|
364
|
-
record('Skill', 'WARN', 'Skill missing or outdated for a detected assistant — run init-skill');
|
|
365
|
-
}
|
|
366
|
-
else if (worst === 'INFO') {
|
|
367
|
-
record('Skill', 'INFO', 'Skill present but unmanaged (no version marker)');
|
|
363
|
+
record('Skill', 'WARN', 'Installed skill is behind the package version — run init-skill');
|
|
368
364
|
}
|
|
369
365
|
else {
|
|
370
366
|
record('Skill', 'OK', 'Skill installed and current');
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -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/dist/cli/index.js
CHANGED
|
@@ -8,7 +8,7 @@ const USAGE = [
|
|
|
8
8
|
'Usage:',
|
|
9
9
|
' tamash-playwright doctor [--dir <path>]',
|
|
10
10
|
' tamash-playwright apply-heals [--dry-run] [--logs-dir <path>]',
|
|
11
|
-
' tamash-playwright init-skill [--
|
|
11
|
+
' tamash-playwright init-skill [--target claude|agents] [--user] [--force] [--dry-run] [--dir <path>]',
|
|
12
12
|
].join('\n');
|
|
13
13
|
async function main() {
|
|
14
14
|
const [, , command, ...rest] = process.argv;
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AACA,qCAAqC;AACrC,6CAA6C;AAC7C,2CAA2C;AAE3C,MAAM,KAAK,GAAG;IACZ,QAAQ;IACR,2CAA2C;IAC3C,iEAAiE;IACjE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AACA,qCAAqC;AACrC,6CAA6C;AAC7C,2CAA2C;AAE3C,MAAM,KAAK,GAAG;IACZ,QAAQ;IACR,2CAA2C;IAC3C,iEAAiE;IACjE,uGAAuG;CACxG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAE5C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,MAAM,IAAA,kBAAS,EAAC,IAAI,CAAC,CAAC;YACtB,MAAM;QACR,KAAK,aAAa;YAChB,MAAM,IAAA,0BAAa,EAAC,IAAI,CAAC,CAAC;YAC1B,MAAM;QACR,KAAK,YAAY;YACf,MAAM,IAAA,wBAAY,EAAC,IAAI,CAAC,CAAC;YACzB,MAAM;QACR,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM;QACR;YACE,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
package/dist/cli/initSkill.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initSkill.d.ts","sourceRoot":"","sources":["../../src/cli/initSkill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"initSkill.d.ts","sourceRoot":"","sources":["../../src/cli/initSkill.ts"],"names":[],"mappings":"AA4EA,wBAAsB,YAAY,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DrE"}
|
package/dist/cli/initSkill.js
CHANGED
|
@@ -7,20 +7,24 @@ exports.runInitSkill = runInitSkill;
|
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const console_style_1 = require("./console-style");
|
|
9
9
|
const skill_1 = require("./skill");
|
|
10
|
-
const VALID_IDS = skill_1.AGENTS.map((a) => a.id).join(' | ');
|
|
11
10
|
const HELP = `tamash-playwright init-skill — install the orchestration skill for your AI coding assistant
|
|
12
11
|
|
|
13
12
|
Usage: npx tamash-playwright init-skill [options]
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
--
|
|
21
|
-
--
|
|
14
|
+
Installs skills/tamash-playwright/ (SKILL.md + references/) into, by default, BOTH:
|
|
15
|
+
.claude/skills/tamash-playwright/ — Claude Code
|
|
16
|
+
.agents/skills/tamash-playwright/ — the cross-tool standard (Cursor, Copilot, Windsurf, Kiro, …)
|
|
17
|
+
Same content in both; no per-agent format conversion.
|
|
18
|
+
|
|
19
|
+
--target <claude|agents> Install only one of the two locations (default: both).
|
|
20
|
+
--user Install under your home directory (~/.claude, ~/.agents) instead of
|
|
21
|
+
the project — covers every project on the machine.
|
|
22
|
+
--force Overwrite a skill directory that has no version marker (hand-edited).
|
|
23
|
+
--dry-run Show what would be written without touching anything.
|
|
24
|
+
--dir <path> Treat <path> as the project root instead of the current directory.
|
|
25
|
+
--help Show this message.`;
|
|
22
26
|
function parseArgs(args) {
|
|
23
|
-
const
|
|
27
|
+
const targets = [];
|
|
24
28
|
let user = false;
|
|
25
29
|
let force = false;
|
|
26
30
|
let dryRun = false;
|
|
@@ -28,10 +32,10 @@ function parseArgs(args) {
|
|
|
28
32
|
let root = process.cwd();
|
|
29
33
|
for (let i = 0; i < args.length; i++) {
|
|
30
34
|
const arg = args[i];
|
|
31
|
-
if (arg === '--agent' || arg === '-
|
|
35
|
+
if (arg === '--target' || arg === '--agent' || arg === '-t') {
|
|
32
36
|
const value = args[++i];
|
|
33
37
|
if (value) {
|
|
34
|
-
|
|
38
|
+
targets.push(...value.split(',').map((s) => s.trim()).filter(Boolean));
|
|
35
39
|
}
|
|
36
40
|
}
|
|
37
41
|
else if (arg === '--user') {
|
|
@@ -53,37 +57,37 @@ function parseArgs(args) {
|
|
|
53
57
|
}
|
|
54
58
|
}
|
|
55
59
|
}
|
|
56
|
-
return {
|
|
60
|
+
return { targets, user, force, dryRun, root, help };
|
|
57
61
|
}
|
|
58
62
|
function reportLine(result, dryRun) {
|
|
59
|
-
const rel = path_1.default.relative(process.cwd(), result.
|
|
63
|
+
const rel = path_1.default.relative(process.cwd(), result.path) || result.path;
|
|
60
64
|
const tag = (label) => (dryRun ? `[would ${label}]` : `[${label}]`);
|
|
61
65
|
switch (result.action) {
|
|
62
66
|
case 'created':
|
|
63
|
-
console.log(` ${(0, console_style_1.green)(tag('create'))} ${result.
|
|
67
|
+
console.log(` ${(0, console_style_1.green)(tag('create'))} ${result.target.label} -> ${rel}`);
|
|
64
68
|
return;
|
|
65
69
|
case 'updated':
|
|
66
|
-
console.log(` ${(0, console_style_1.green)(tag('update'))} ${result.
|
|
70
|
+
console.log(` ${(0, console_style_1.green)(tag('update'))} ${result.target.label} -> ${rel}`);
|
|
67
71
|
return;
|
|
68
72
|
case 'skipped':
|
|
69
|
-
console.log(` ${(0, console_style_1.dim)('[skipped]')} ${result.
|
|
73
|
+
console.log(` ${(0, console_style_1.dim)('[skipped]')} ${result.target.label} -> ${rel}${result.detail ? ` (${result.detail})` : ''}`);
|
|
70
74
|
return;
|
|
71
75
|
case 'blocked':
|
|
72
|
-
console.log(` ${(0, console_style_1.red)('[blocked]')} ${result.
|
|
76
|
+
console.log(` ${(0, console_style_1.red)('[blocked]')} ${result.target.label} -> ${rel}${result.detail ? ` — ${result.detail}` : ''}`);
|
|
73
77
|
return;
|
|
74
78
|
}
|
|
75
79
|
}
|
|
76
80
|
async function runInitSkill(args = []) {
|
|
77
|
-
const {
|
|
81
|
+
const { targets: requestedIds, user, force, dryRun, root, help } = parseArgs(args);
|
|
78
82
|
if (help) {
|
|
79
83
|
console.log(HELP);
|
|
80
84
|
return;
|
|
81
85
|
}
|
|
82
86
|
console.log((0, console_style_1.bold)('tamash-playwright init-skill'));
|
|
83
87
|
console.log((0, console_style_1.dim)('─'.repeat(28)));
|
|
84
|
-
const
|
|
85
|
-
if (!
|
|
86
|
-
console.error(` ${(0, console_style_1.red)('[FAIL]')} Could not locate
|
|
88
|
+
const source = (0, skill_1.findSkillSource)();
|
|
89
|
+
if (!source) {
|
|
90
|
+
console.error(` ${(0, console_style_1.red)('[FAIL]')} Could not locate skills/tamash-playwright/ inside the installed package.`);
|
|
87
91
|
process.exitCode = 1;
|
|
88
92
|
return;
|
|
89
93
|
}
|
|
@@ -92,35 +96,34 @@ async function runInitSkill(args = []) {
|
|
|
92
96
|
if (requestedIds.length > 0) {
|
|
93
97
|
targets = [];
|
|
94
98
|
for (const id of requestedIds) {
|
|
95
|
-
const
|
|
96
|
-
if (!
|
|
97
|
-
console.error(` ${(0, console_style_1.red)('[FAIL]')} Unknown --
|
|
99
|
+
const t = (0, skill_1.getTarget)(id);
|
|
100
|
+
if (!t) {
|
|
101
|
+
console.error(` ${(0, console_style_1.red)('[FAIL]')} Unknown --target "${id}". Valid: claude | agents`);
|
|
98
102
|
process.exitCode = 1;
|
|
99
103
|
return;
|
|
100
104
|
}
|
|
101
|
-
if (!targets.includes(
|
|
102
|
-
targets.push(
|
|
105
|
+
if (!targets.includes(t)) {
|
|
106
|
+
targets.push(t);
|
|
103
107
|
}
|
|
104
108
|
}
|
|
105
109
|
}
|
|
106
110
|
else {
|
|
107
|
-
targets =
|
|
108
|
-
if (targets.length === 0) {
|
|
109
|
-
console.error(` ${(0, console_style_1.yellow)('[WARN]')} Could not detect which assistant this project uses (looked for`);
|
|
110
|
-
console.error(' .claude/, .kiro/, .cursor/, .github/copilot-instructions.md, AGENTS.md).');
|
|
111
|
-
console.error(` Re-run with --agent <${VALID_IDS}> (comma-separated or repeated).`);
|
|
112
|
-
process.exitCode = 1;
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
console.log(` ${(0, console_style_1.cyan)('[INFO]')} Detected: ${targets.map((t) => t.label).join(', ')}`);
|
|
116
|
-
console.log((0, console_style_1.dim)(' (pass --agent explicitly to override)'));
|
|
111
|
+
targets = skill_1.TARGETS;
|
|
117
112
|
}
|
|
118
113
|
if (dryRun) {
|
|
119
114
|
console.log((0, console_style_1.dim)(' (--dry-run: nothing will be written)'));
|
|
120
115
|
}
|
|
121
116
|
console.log('');
|
|
122
|
-
const results = targets.map((
|
|
117
|
+
const results = targets.map((t) => (0, skill_1.installSkill)(t, { cwd: root, source, version, user, force, dryRun }));
|
|
123
118
|
results.forEach((r) => reportLine(r, dryRun));
|
|
119
|
+
const legacy = (0, skill_1.legacyInstallArtifacts)(root);
|
|
120
|
+
if (legacy.length > 0) {
|
|
121
|
+
console.log('');
|
|
122
|
+
console.log(` ${(0, console_style_1.cyan)('[INFO]')} Leftover from an older init-skill — safe to delete by hand:`);
|
|
123
|
+
for (const p of legacy) {
|
|
124
|
+
console.log(` ${p}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
124
127
|
console.log('');
|
|
125
128
|
if (results.some((r) => r.action === 'blocked')) {
|
|
126
129
|
console.log(` ${(0, console_style_1.yellow)('One or more targets were blocked — see above.')}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initSkill.js","sourceRoot":"","sources":["../../src/cli/initSkill.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,mDAAsE;AACtE,mCAA4J;AAE5J,MAAM,
|
|
1
|
+
{"version":3,"file":"initSkill.js","sourceRoot":"","sources":["../../src/cli/initSkill.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/skill.d.ts
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type TargetId = 'claude' | 'agents';
|
|
2
2
|
export declare function versionMarker(version: string): string;
|
|
3
3
|
export declare function readVersionMarker(text: string): string | undefined;
|
|
4
|
-
export type
|
|
5
|
-
id:
|
|
4
|
+
export type TargetSpec = {
|
|
5
|
+
id: TargetId;
|
|
6
6
|
label: string;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
detect: string[];
|
|
7
|
+
/** Path relative to the project root. */
|
|
8
|
+
dir: string;
|
|
9
|
+
/** Same, at the user level — covers every project on the machine at once. */
|
|
10
|
+
userDir: string;
|
|
12
11
|
};
|
|
13
|
-
export declare const
|
|
14
|
-
export declare function
|
|
15
|
-
export declare function
|
|
12
|
+
export declare const TARGETS: TargetSpec[];
|
|
13
|
+
export declare function getTarget(id: string): TargetSpec | undefined;
|
|
14
|
+
export declare function findSkillSource(): string | undefined;
|
|
16
15
|
export declare function getPackageVersion(): string;
|
|
17
|
-
export declare function detectAgents(cwd: string): AgentSpec[];
|
|
18
16
|
export type SkillState = {
|
|
19
17
|
status: 'absent';
|
|
20
18
|
} | {
|
|
@@ -27,20 +25,21 @@ export type SkillState = {
|
|
|
27
25
|
} | {
|
|
28
26
|
status: 'unmanaged';
|
|
29
27
|
};
|
|
30
|
-
export declare function skillState(cwd: string,
|
|
28
|
+
export declare function skillState(cwd: string, target: TargetSpec, packageVersion: string): SkillState;
|
|
31
29
|
export type InstallResult = {
|
|
32
|
-
|
|
30
|
+
target: TargetSpec;
|
|
33
31
|
action: 'created' | 'updated' | 'skipped' | 'blocked';
|
|
34
|
-
|
|
32
|
+
path: string;
|
|
35
33
|
detail?: string;
|
|
36
34
|
};
|
|
37
35
|
export type InstallOptions = {
|
|
38
36
|
cwd: string;
|
|
39
|
-
|
|
37
|
+
source: string;
|
|
40
38
|
version: string;
|
|
41
39
|
user?: boolean;
|
|
42
40
|
force?: boolean;
|
|
43
41
|
dryRun?: boolean;
|
|
44
42
|
};
|
|
45
|
-
export declare function installSkill(
|
|
43
|
+
export declare function installSkill(target: TargetSpec, opts: InstallOptions): InstallResult;
|
|
44
|
+
export declare function legacyInstallArtifacts(cwd: string): string[];
|
|
46
45
|
//# sourceMappingURL=skill.d.ts.map
|
package/dist/cli/skill.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/cli/skill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/cli/skill.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAO3C,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AACD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGlE;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,UAAU,EAa/B,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE5D;AAID,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAMpD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAgB1C;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAG5B,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,GAAG,UAAU,CAgB9F;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,GAAG,aAAa,CAsCpF;AAID,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB5D"}
|
package/dist/cli/skill.js
CHANGED
|
@@ -3,21 +3,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.TARGETS = void 0;
|
|
7
7
|
exports.versionMarker = versionMarker;
|
|
8
8
|
exports.readVersionMarker = readVersionMarker;
|
|
9
|
-
exports.
|
|
10
|
-
exports.
|
|
9
|
+
exports.getTarget = getTarget;
|
|
10
|
+
exports.findSkillSource = findSkillSource;
|
|
11
11
|
exports.getPackageVersion = getPackageVersion;
|
|
12
|
-
exports.detectAgents = detectAgents;
|
|
13
12
|
exports.skillState = skillState;
|
|
14
13
|
exports.installSkill = installSkill;
|
|
14
|
+
exports.legacyInstallArtifacts = legacyInstallArtifacts;
|
|
15
15
|
const fs_1 = __importDefault(require("fs"));
|
|
16
16
|
const os_1 = __importDefault(require("os"));
|
|
17
17
|
const path_1 = __importDefault(require("path"));
|
|
18
|
-
// A single line written into
|
|
19
|
-
//
|
|
18
|
+
// A single line written into each install (as .tamash-playwright-skill) so `doctor` and a re-run
|
|
19
|
+
// of `init-skill` can tell which package version produced it.
|
|
20
20
|
const VERSION_MARKER_PREFIX = 'tamash-playwright-skill-version:';
|
|
21
|
+
const MARKER_FILENAME = '.tamash-playwright-skill';
|
|
21
22
|
function versionMarker(version) {
|
|
22
23
|
return `${VERSION_MARKER_PREFIX} ${version}`;
|
|
23
24
|
}
|
|
@@ -25,70 +26,31 @@ function readVersionMarker(text) {
|
|
|
25
26
|
const match = text.match(/tamash-playwright-skill-version:\s*(\S+)/);
|
|
26
27
|
return match ? match[1] : undefined;
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
-
// and replace exactly its own section without disturbing anything else in the file.
|
|
30
|
-
const BLOCK_BEGIN = '<!-- BEGIN tamash-playwright skill (managed by `npx tamash-playwright init-skill`) -->';
|
|
31
|
-
const BLOCK_END = '<!-- END tamash-playwright skill -->';
|
|
32
|
-
exports.AGENTS = [
|
|
29
|
+
exports.TARGETS = [
|
|
33
30
|
{
|
|
34
31
|
id: 'claude',
|
|
35
|
-
label: 'Claude Code',
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
userTarget: path_1.default.join(os_1.default.homedir(), '.claude', 'skills', 'tamash-playwright'),
|
|
39
|
-
source: 'tamash-playwright',
|
|
40
|
-
detect: ['.claude', 'CLAUDE.md'],
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
id: 'kiro',
|
|
44
|
-
label: 'Kiro',
|
|
45
|
-
kind: 'dir',
|
|
46
|
-
target: path_1.default.join('.kiro', 'skills', 'tamash-playwright'),
|
|
47
|
-
userTarget: path_1.default.join(os_1.default.homedir(), '.kiro', 'skills', 'tamash-playwright'),
|
|
48
|
-
source: 'tamash-playwright',
|
|
49
|
-
detect: ['.kiro'],
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
id: 'cursor',
|
|
53
|
-
label: 'Cursor',
|
|
54
|
-
kind: 'file',
|
|
55
|
-
target: path_1.default.join('.cursor', 'rules', 'tamash-playwright.mdc'),
|
|
56
|
-
source: path_1.default.join('tamash-playwright', 'adapters', 'cursor-tamash-playwright.mdc'),
|
|
57
|
-
detect: ['.cursor', '.cursorrules'],
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
id: 'copilot',
|
|
61
|
-
label: 'GitHub Copilot',
|
|
62
|
-
kind: 'append',
|
|
63
|
-
target: path_1.default.join('.github', 'copilot-instructions.md'),
|
|
64
|
-
source: path_1.default.join('tamash-playwright', 'adapters', 'copilot-instructions-tamash-playwright.md'),
|
|
65
|
-
detect: [path_1.default.join('.github', 'copilot-instructions.md'), '.github'],
|
|
32
|
+
label: 'Claude Code (.claude/skills/)',
|
|
33
|
+
dir: path_1.default.join('.claude', 'skills', 'tamash-playwright'),
|
|
34
|
+
userDir: path_1.default.join(os_1.default.homedir(), '.claude', 'skills', 'tamash-playwright'),
|
|
66
35
|
},
|
|
67
36
|
{
|
|
68
37
|
id: 'agents',
|
|
69
|
-
label: '
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
source: path_1.default.join('tamash-playwright', 'adapters', 'AGENTS.md'),
|
|
73
|
-
detect: ['AGENTS.md'],
|
|
38
|
+
label: 'cross-tool standard (.agents/skills/)',
|
|
39
|
+
dir: path_1.default.join('.agents', 'skills', 'tamash-playwright'),
|
|
40
|
+
userDir: path_1.default.join(os_1.default.homedir(), '.agents', 'skills', 'tamash-playwright'),
|
|
74
41
|
},
|
|
75
42
|
];
|
|
76
|
-
function
|
|
77
|
-
return exports.
|
|
43
|
+
function getTarget(id) {
|
|
44
|
+
return exports.TARGETS.find((t) => t.id === id);
|
|
78
45
|
}
|
|
79
|
-
// The shipped skills/ directory. From dist/cli/skill.js that's <pkg>/skills;
|
|
80
|
-
// occasional flattened layout by
|
|
81
|
-
function
|
|
46
|
+
// The shipped skills/tamash-playwright/ directory. From dist/cli/skill.js that's <pkg>/skills;
|
|
47
|
+
// kept resilient to the occasional flattened layout by checking one level further up too.
|
|
48
|
+
function findSkillSource() {
|
|
82
49
|
const candidates = [
|
|
83
|
-
path_1.default.resolve(__dirname, '..', '..', 'skills'),
|
|
84
|
-
path_1.default.resolve(__dirname, '..', '..', '..', 'skills'),
|
|
50
|
+
path_1.default.resolve(__dirname, '..', '..', 'skills', 'tamash-playwright'),
|
|
51
|
+
path_1.default.resolve(__dirname, '..', '..', '..', 'skills', 'tamash-playwright'),
|
|
85
52
|
];
|
|
86
|
-
|
|
87
|
-
if (fs_1.default.existsSync(path_1.default.join(dir, 'tamash-playwright', 'SKILL.md'))) {
|
|
88
|
-
return dir;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return undefined;
|
|
53
|
+
return candidates.find((dir) => fs_1.default.existsSync(path_1.default.join(dir, 'SKILL.md')));
|
|
92
54
|
}
|
|
93
55
|
function getPackageVersion() {
|
|
94
56
|
const candidates = [
|
|
@@ -108,125 +70,83 @@ function getPackageVersion() {
|
|
|
108
70
|
}
|
|
109
71
|
return 'unknown';
|
|
110
72
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
function skillState(cwd, agent, packageVersion) {
|
|
116
|
-
const target = path_1.default.join(cwd, agent.target);
|
|
117
|
-
if (!fs_1.default.existsSync(target)) {
|
|
73
|
+
// Non-destructive: reports what's on disk for one target. Used by `doctor`.
|
|
74
|
+
function skillState(cwd, target, packageVersion) {
|
|
75
|
+
const dir = path_1.default.join(cwd, target.dir);
|
|
76
|
+
if (!fs_1.default.existsSync(path_1.default.join(dir, 'SKILL.md'))) {
|
|
118
77
|
return { status: 'absent' };
|
|
119
78
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (agent.kind === 'dir') {
|
|
123
|
-
const markerFile = path_1.default.join(target, '.tamash-playwright-skill');
|
|
124
|
-
text = fs_1.default.existsSync(markerFile) ? fs_1.default.readFileSync(markerFile, 'utf-8') : '';
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
text = fs_1.default.readFileSync(target, 'utf-8');
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
catch {
|
|
79
|
+
const markerFile = path_1.default.join(dir, MARKER_FILENAME);
|
|
80
|
+
if (!fs_1.default.existsSync(markerFile)) {
|
|
131
81
|
return { status: 'unmanaged' };
|
|
132
82
|
}
|
|
133
|
-
const installed = readVersionMarker(
|
|
83
|
+
const installed = readVersionMarker(fs_1.default.readFileSync(markerFile, 'utf-8'));
|
|
134
84
|
if (!installed) {
|
|
135
|
-
// An 'append' target that exists but doesn't contain our block at all is effectively absent.
|
|
136
|
-
if (agent.kind === 'append' && !text.includes(BLOCK_BEGIN)) {
|
|
137
|
-
return { status: 'absent' };
|
|
138
|
-
}
|
|
139
85
|
return { status: 'unmanaged' };
|
|
140
86
|
}
|
|
141
87
|
return installed === packageVersion
|
|
142
88
|
? { status: 'current', version: installed }
|
|
143
89
|
: { status: 'outdated', version: packageVersion, installed };
|
|
144
90
|
}
|
|
145
|
-
function installSkill(
|
|
91
|
+
function installSkill(target, opts) {
|
|
146
92
|
const marker = versionMarker(opts.version);
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const targetPath = opts.user && agent.userTarget ? agent.userTarget : path_1.default.join(opts.cwd, agent.target);
|
|
151
|
-
const sourcePath = path_1.default.join(opts.skillsRoot, agent.source);
|
|
152
|
-
if (!fs_1.default.existsSync(sourcePath)) {
|
|
153
|
-
return { agent, action: 'blocked', target: targetPath, detail: `shipped source missing: ${sourcePath}` };
|
|
154
|
-
}
|
|
155
|
-
const dryRun = opts.dryRun === true;
|
|
156
|
-
if (agent.kind === 'dir') {
|
|
157
|
-
return installDir(agent, sourcePath, targetPath, marker, opts.force, dryRun);
|
|
158
|
-
}
|
|
159
|
-
if (agent.kind === 'file') {
|
|
160
|
-
return installFile(agent, sourcePath, targetPath, marker, dryRun);
|
|
161
|
-
}
|
|
162
|
-
return installAppend(agent, sourcePath, targetPath, marker, dryRun);
|
|
163
|
-
}
|
|
164
|
-
function installDir(agent, source, target, marker, force, dryRun) {
|
|
165
|
-
const existed = fs_1.default.existsSync(target);
|
|
93
|
+
const dest = opts.user ? target.userDir : path_1.default.join(opts.cwd, target.dir);
|
|
94
|
+
const markerFile = path_1.default.join(dest, MARKER_FILENAME);
|
|
95
|
+
const existed = fs_1.default.existsSync(path_1.default.join(dest, 'SKILL.md'));
|
|
166
96
|
if (existed) {
|
|
167
|
-
const markerFile = path_1.default.join(target, '.tamash-playwright-skill');
|
|
168
97
|
const managed = fs_1.default.existsSync(markerFile);
|
|
169
|
-
if (!managed && !force) {
|
|
98
|
+
if (!managed && !opts.force) {
|
|
170
99
|
return {
|
|
171
|
-
agent,
|
|
172
|
-
action: 'blocked',
|
|
173
100
|
target,
|
|
174
|
-
|
|
101
|
+
action: 'blocked',
|
|
102
|
+
path: dest,
|
|
103
|
+
detail: 'a skill directory exists here with no version marker (hand-customized?) — re-run with --force to overwrite',
|
|
175
104
|
};
|
|
176
105
|
}
|
|
177
|
-
if (managed && !force) {
|
|
106
|
+
if (managed && !opts.force) {
|
|
178
107
|
const installed = readVersionMarker(fs_1.default.readFileSync(markerFile, 'utf-8'));
|
|
179
108
|
if (installed && `${VERSION_MARKER_PREFIX} ${installed}` === marker) {
|
|
180
|
-
return {
|
|
109
|
+
return { target, action: 'skipped', path: dest, detail: 'already up to date' };
|
|
181
110
|
}
|
|
182
111
|
}
|
|
183
|
-
if (!dryRun) {
|
|
184
|
-
fs_1.default.rmSync(
|
|
112
|
+
if (!opts.dryRun) {
|
|
113
|
+
fs_1.default.rmSync(dest, { recursive: true, force: true });
|
|
185
114
|
}
|
|
186
115
|
}
|
|
187
|
-
if (!dryRun) {
|
|
188
|
-
fs_1.default.mkdirSync(path_1.default.dirname(
|
|
189
|
-
// adapters/
|
|
190
|
-
fs_1.default.cpSync(source,
|
|
116
|
+
if (!opts.dryRun) {
|
|
117
|
+
fs_1.default.mkdirSync(path_1.default.dirname(dest), { recursive: true });
|
|
118
|
+
// adapters/ is legacy (per-agent variants) — not part of the .claude/.agents skill layout.
|
|
119
|
+
fs_1.default.cpSync(opts.source, dest, {
|
|
191
120
|
recursive: true,
|
|
192
121
|
filter: (src) => path_1.default.basename(src) !== 'adapters',
|
|
193
122
|
});
|
|
194
|
-
fs_1.default.writeFileSync(
|
|
123
|
+
fs_1.default.writeFileSync(markerFile, `${marker}\n`);
|
|
195
124
|
}
|
|
196
|
-
return {
|
|
125
|
+
return { target, action: existed ? 'updated' : 'created', path: dest };
|
|
197
126
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
127
|
+
// Best-effort detection of the pre-0.11.0-beta.8 install shape, so `init-skill`/`doctor` can point
|
|
128
|
+
// users at the stragglers to delete by hand. Returns the leftover paths that exist.
|
|
129
|
+
function legacyInstallArtifacts(cwd) {
|
|
130
|
+
const found = [];
|
|
131
|
+
const mdc = path_1.default.join(cwd, '.cursor', 'rules', 'tamash-playwright.mdc');
|
|
132
|
+
if (fs_1.default.existsSync(mdc)) {
|
|
133
|
+
found.push(path_1.default.join('.cursor', 'rules', 'tamash-playwright.mdc'));
|
|
205
134
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
let next;
|
|
217
|
-
if (blockRe.test(current)) {
|
|
218
|
-
next = current.replace(blockRe, block);
|
|
135
|
+
const kiro = path_1.default.join(cwd, '.kiro', 'skills', 'tamash-playwright', 'SKILL.md');
|
|
136
|
+
if (fs_1.default.existsSync(kiro)) {
|
|
137
|
+
found.push(path_1.default.join('.kiro', 'skills', 'tamash-playwright'));
|
|
138
|
+
}
|
|
139
|
+
for (const rel of [path_1.default.join('.github', 'copilot-instructions.md'), 'AGENTS.md']) {
|
|
140
|
+
const file = path_1.default.join(cwd, rel);
|
|
141
|
+
try {
|
|
142
|
+
if (fs_1.default.existsSync(file) && fs_1.default.readFileSync(file, 'utf-8').includes('BEGIN tamash-playwright skill')) {
|
|
143
|
+
found.push(`${rel} (contains an appended "tamash-playwright skill" block)`);
|
|
144
|
+
}
|
|
219
145
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
next = trimmed ? `${trimmed}\n${block}\n` : `${block}\n`;
|
|
146
|
+
catch {
|
|
147
|
+
// unreadable — ignore
|
|
223
148
|
}
|
|
224
|
-
fs_1.default.mkdirSync(path_1.default.dirname(target), { recursive: true });
|
|
225
|
-
fs_1.default.writeFileSync(target, next);
|
|
226
149
|
}
|
|
227
|
-
return
|
|
228
|
-
}
|
|
229
|
-
function escapeRe(s) {
|
|
230
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
150
|
+
return found;
|
|
231
151
|
}
|
|
232
152
|
//# sourceMappingURL=skill.js.map
|
package/dist/cli/skill.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/cli/skill.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/cli/skill.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
|
|
3
|
+
"version": "0.11.0",
|
|
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",
|
|
@@ -29,50 +29,22 @@ Don't guess which one applies from what the user says or how the project looks
|
|
|
29
29
|
|
|
30
30
|
## Getting this skill into a project
|
|
31
31
|
|
|
32
|
-
No coding agent auto-discovers a skill bundled inside
|
|
33
|
-
|
|
34
|
-
**The easy way:**
|
|
32
|
+
No coding agent auto-discovers a skill bundled inside `node_modules` — it's one explicit step after `npm install tamash-playwright`:
|
|
35
33
|
|
|
36
34
|
```bash
|
|
37
35
|
npx tamash-playwright init-skill
|
|
38
36
|
```
|
|
39
37
|
|
|
40
|
-
|
|
38
|
+
That copies this directory (`SKILL.md` + `references/`) into **both** standard locations — the same convention Playwright's own `playwright-cli install --skills` uses:
|
|
41
39
|
|
|
42
|
-
|
|
40
|
+
- `.claude/skills/tamash-playwright/` — Claude Code
|
|
41
|
+
- `.agents/skills/tamash-playwright/` — the emerging cross-tool standard (Cursor, GitHub Copilot, Windsurf, Kiro, Zed, and others read here)
|
|
43
42
|
|
|
44
|
-
|
|
43
|
+
Same content in both; there's no per-agent format conversion. `--target claude` or `--target agents` installs just one; `--user` installs under your home directory to cover every project on the machine; `--force` overwrites a hand-edited copy. A version marker is written so `npx tamash-playwright doctor` can flag when the installed skill has fallen behind the package — re-run `init-skill` to refresh.
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
mkdir -p .claude/skills
|
|
48
|
-
cp -r node_modules/tamash-playwright/skills/tamash-playwright .claude/skills/tamash-playwright
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**Kiro** — identical `SKILL.md` format to Claude Code, just a different root directory:
|
|
45
|
+
By hand, if you prefer:
|
|
52
46
|
|
|
53
47
|
```bash
|
|
54
|
-
mkdir -p .
|
|
55
|
-
cp -r node_modules/tamash-playwright/skills/tamash-playwright .
|
|
48
|
+
mkdir -p .agents/skills
|
|
49
|
+
cp -r node_modules/tamash-playwright/skills/tamash-playwright .agents/skills/tamash-playwright
|
|
56
50
|
```
|
|
57
|
-
|
|
58
|
-
**Cursor** — its own rule format (`.mdc`, with frontmatter Cursor uses to decide when to attach it):
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
mkdir -p .cursor/rules
|
|
62
|
-
cp node_modules/tamash-playwright/skills/tamash-playwright/adapters/cursor-tamash-playwright.mdc .cursor/rules/
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
**GitHub Copilot** — append (or create) its single instructions file:
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
cat node_modules/tamash-playwright/skills/tamash-playwright/adapters/copilot-instructions-tamash-playwright.md >> .github/copilot-instructions.md
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**Antigravity, Gemini CLI, Windsurf, Zed, Aider, and other `AGENTS.md`-reading tools** — one file covers all of them:
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
cp node_modules/tamash-playwright/skills/tamash-playwright/adapters/AGENTS.md ./AGENTS.md
|
|
75
|
-
# or, if AGENTS.md already exists, append its content instead of overwriting
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
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.
|
|
@@ -18,9 +18,9 @@ Ask the user which they want — don't assume:
|
|
|
18
18
|
- **Free, fastest to start**: Ollama Cloud (`HEALER_PROVIDER=ollama`) — a free API key from `ollama.com/settings/keys`.
|
|
19
19
|
- **An API-key provider they already pay for**: `openai` / `anthropic` / `gemini`.
|
|
20
20
|
- **A subscription they already have, no API key**: `claude-subscription` or `copilot-subscription` — work both locally and in CI (TypeScript only).
|
|
21
|
-
- **A
|
|
22
|
-
- **Free, zero-AI, no network call**: `tamash`
|
|
23
|
-
- **Their own self-hosted Ollama server**: `ollama-local`
|
|
21
|
+
- **A Kiro or Codex subscription instead**: `kiro-subscription` / `codex-subscription` (TypeScript only) — **local development only, never CI** (no confirmed unattended-CI auth token). Both run their CLI in a read-only mode (Codex `codex exec`'s sandbox, Kiro grants no tool trust), so a heal call can't edit files or run commands, and both answer cleanly in a few seconds. There's also `cursor-subscription`, but Cursor's `agent` is an interactive assistant that often replies conversationally instead of with the JSON the healer needs (`stage=ai_declined`) — prefer `kiro`/`codex`.
|
|
22
|
+
- **Free, zero-AI, no network call**: `tamash` — 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.
|
|
23
|
+
- **Their own self-hosted Ollama server**: `ollama-local` — 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.
|
|
24
24
|
|
|
25
25
|
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.
|
|
26
26
|
|
package/usage.md
CHANGED
|
@@ -136,7 +136,7 @@ npx tamash-playwright doctor
|
|
|
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. |
|
|
138
138
|
| 5 | Inline locators | Flags locators written directly in test files rather than a Page Object class. |
|
|
139
|
-
| 6 | Skill installation | Whether the orchestration skill (below) is installed
|
|
139
|
+
| 6 | Skill installation | Whether the orchestration skill (below) is installed in `.claude/skills/` / `.agents/skills/`, and still current. Behind the package version → `[WARN]` with `npx tamash-playwright init-skill`. |
|
|
140
140
|
|
|
141
141
|
If it finds issues, the fastest fix is to open the project in an AI coding assistant and ask it to address what's flagged — add `.describe()` calls, or extract locators into Page Objects. A standing rule in that assistant's instructions file (`CLAUDE.md`, `.cursor/rules`, etc.) keeps it doing both automatically going forward.
|
|
142
142
|
|
|
@@ -567,9 +567,10 @@ The same detail prints to the console as it happens:
|
|
|
567
567
|
| `npx tamash-playwright apply-heals` | `--dry-run` | Preview fixes without writing anything (including `verify-heals.cjs` — see below). |
|
|
568
568
|
| | `--logs-dir <path>` | Merge every `heals.jsonl` found under `<path>` (any nesting) instead of the local log — for sharded CI. |
|
|
569
569
|
| | `--yes` / `-y` | Skip the confirmation prompt in a real terminal too (already skipped automatically in CI/non-interactive runs). |
|
|
570
|
-
| `npx tamash-playwright init-skill` |
|
|
571
|
-
| | `--
|
|
572
|
-
| | `--
|
|
570
|
+
| `npx tamash-playwright init-skill` | | Copy the skill into `.claude/skills/tamash-playwright/` and `.agents/skills/tamash-playwright/` (both, by default). |
|
|
571
|
+
| | `--target <id>` | Install only one — `claude` or `agents`. |
|
|
572
|
+
| | `--user` | Install under your home directory (`~/.claude/skills/…`, `~/.agents/skills/…`) instead of the project. |
|
|
573
|
+
| | `--force` | Overwrite an existing skill directory that has no version marker (a hand-edited copy). |
|
|
573
574
|
| | `--dry-run` | Show what would be written without touching anything. |
|
|
574
575
|
| | `--dir <path>` | Treat `<path>` as the project root instead of the current directory. |
|
|
575
576
|
|
|
@@ -585,17 +586,16 @@ No agent auto-discovers a skill sitting in `node_modules`, so it's one explicit
|
|
|
585
586
|
npx tamash-playwright init-skill
|
|
586
587
|
```
|
|
587
588
|
|
|
588
|
-
This
|
|
589
|
+
This copies the skill (`SKILL.md` + `references/`) into **both** standard locations — the same convention Playwright's own `playwright-cli install --skills` uses:
|
|
589
590
|
|
|
590
|
-
|
|
|
591
|
-
|
|
592
|
-
|
|
|
593
|
-
|
|
|
594
|
-
| Cursor | `.cursor/rules/tamash-playwright.mdc` | Cursor's own rule format (from `skills/tamash-playwright/adapters/cursor-tamash-playwright.mdc`) |
|
|
595
|
-
| GitHub Copilot | A managed block appended to `.github/copilot-instructions.md` | Plain markdown (from `skills/tamash-playwright/adapters/copilot-instructions-tamash-playwright.md`) |
|
|
596
|
-
| Antigravity, Gemini CLI, Windsurf, Zed, Aider, and other `AGENTS.md`-reading tools | A managed block appended to `AGENTS.md` at the project root | Plain markdown (from `skills/tamash-playwright/adapters/AGENTS.md`) |
|
|
591
|
+
| Location | Read by |
|
|
592
|
+
|---|---|
|
|
593
|
+
| `.claude/skills/tamash-playwright/` | Claude Code |
|
|
594
|
+
| `.agents/skills/tamash-playwright/` | the emerging cross-tool standard — Cursor, GitHub Copilot, Windsurf, Kiro, Zed, and others |
|
|
597
595
|
|
|
598
|
-
|
|
596
|
+
Same content in both; no per-agent format conversion. Each install carries a `tamash-playwright-skill-version:` marker so `doctor` flags when it's behind the installed package — re-run `init-skill` to refresh. `--target claude` / `--target agents` installs one; `--user` installs under your home directory; `--force` overwrites a hand-edited copy. By-hand instructions are in [skills/tamash-playwright/SKILL.md](skills/tamash-playwright/SKILL.md).
|
|
597
|
+
|
|
598
|
+
> **Upgrading from an earlier beta?** `init-skill` used to also write a `.cursor/rules/tamash-playwright.mdc` and append a block to `.github/copilot-instructions.md` / `AGENTS.md`. Those aren't produced any more — `init-skill` and `doctor` will point out any leftovers so you can delete them.
|
|
599
599
|
|
|
600
600
|
## License
|
|
601
601
|
|
|
@@ -1,11 +0,0 @@
|
|
|
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.
|
|
@@ -1,12 +0,0 @@
|
|
|
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.
|
|
@@ -1,14 +0,0 @@
|
|
|
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.
|