Repository navigation
Development
The repository is a Claude Code plugin: .claude-plugin/ (the plugin and marketplace manifests), skills/ (the three skills, pxw.py and the sw.py shim), tests/, evals/, and the evergreen files at the root. Rules for agents working in it are in AGENTS.md; CLAUDE.md imports it.
Three scripts, all offline, with their fixtures drawn in code. Run from the repository root; on the released 0.8.4 tag archive (Python 3.14.6, numpy 2.5.2, Pillow 12.3.0):
$ python tests/test_pxw.py
Ran 55 tests in <s>s
OK
$ echo $?
0
$ python tests/test_make.py
Ran 37 tests in <s>s
OK
$ echo $?
0
$ python tests/check_skills.py
ok
$ echo $?
0Four animation tests cover model_rotate: the test file skips them when tifffile is not installed (python -m pip install tifffile). The 0.8.4 run above skipped none. CI installs only numpy and Pillow, so CI skips those four tests.
check_skills.py checks the manifest version against VERSION in pxw.py, and each skill's front matter, description (at most 1,024 characters) and length (at most 200 lines). It follows relative links in every markdown file and checks LF line endings. It fails on any committed image except .github/images/banner.jpg, and on a home-folder path, a key, AI attribution or a name from the untracked .private-names.txt in any file.
.github/workflows/tests.yml runs the three scripts on every push to main and every pull request:
| Runner | Python |
|---|---|
| ubuntu-24.04 | 3.9 |
| ubuntu-latest | 3.14 |
| macos-latest | 3.9, 3.14 |
| windows-latest | 3.9, 3.14 |
Ubuntu with 3.9 runs on ubuntu-24.04 rather than ubuntu-latest. The run on the 0.8.2 release commit, 18e320c, passed.
The 0.8.4 fix merged in PR #17, merge commit f3b448ed, and is published as v0.8.4. The archive verification ran the three scripts shown above.
-
pxw.pystays Python 3.9+ with numpy and Pillow only, and runs on Windows, macOS and Linux with no network calls. It prints one JSON object per command (exceptreview) and exits 1 on a failed check, 2 on a usage error. - Every new effect, command or gate gets an offline test that fails when the behaviour breaks. An existing effect or make step keeps its output byte-identical unless the CHANGELOG says why it changed.
- artwright is the judge: call
aw.py pixelas a gate, never copy its checks. - Skills stay under 200 lines, with descriptions that name the sibling skills owning nearby requests.
- A release bumps
.claude-plugin/plugin.jsonandVERSIONinpxw.pytogether, with CHANGELOG notes. Tags and releases need the owner's go-ahead. - No images in the repository except the README banner, no project or machine names, no absolute paths, no AI attribution.
The plugin is maintained as an evergreen unit: RESEARCH.md (sources), CHANGELOG.md (every change with its reason), LEARNINGS.md, TESTS.md, evals/evals.json, MAINTENANCE.md and evergreen.json (the refresh schedule). The make eval cases ran in two A/B passes on 2026-10-24 (TESTS.md, T-20261024-2 and T-20261024-3): on synthetic fixtures the skill bought speed, not correctness, and the owner then closed the search for a case the baseline fails (T-20261024-4).
The program that printed every output on these pages is ai-docs/notes/2026-10-24-wiki-verify.py, with its saved output beside it. It draws its pictures in code, installs the plugin with claude plugin install into a throwaway configuration folder (or takes --plugin with an installed copy), and runs each page's command. For the next release, run it again and compare:
python ai-docs/notes/2026-10-24-wiki-verify.py --install --old <extracted older release> --aw <artwright aw.py> --port 8799 > new.out.txtHow the wiki was made and how to update it: ai-docs/notes/2026-10-24-github-wiki.md.
This wiki describes pixelwright 0.8.4 and was last updated on 2026-10-26. The plugin is MIT licensed. Report problems in the issues. On GitHub: release v0.8.4.
Using it
The releases
Contributing
Elsewhere