Repository navigation
Development
How the repository is laid out, how it is checked, and how a release is made. The rules for anyone (person or agent) changing it are in AGENTS.md.
| Path | Holds |
|---|---|
skills/artwright/ |
the hub skill, scripts/aw.py with scripts/aw_measure.py (the light, colour and composition measures it imports, 0.2.0) and scripts/aw_geom.py (the render, sprite and series gates, 0.4.0), and the knowledge files in references/ (movements, theory, traditions, evidence, craft, ceramics, market, law, the CLI list, and sprite-json.md, the render folder contract for geomgate) |
skills/artwright-judge/ |
the judge skill; references/ holds the rubric, the verdict contract, vocabulary, the "AI look" and model profiles |
skills/artwright-pixel/ |
the pixel skill; references/ holds pixel-art rules and sprites and tiles |
skills/artwright-curate/ |
the curator skill; references/store.md gives the store layout and record formats |
tests/ |
test_aw.py (offline tests for aw.py) and check_skills.py (structure and safety checks) |
scripts/ |
budget.py (size budget) and eval-wsl.sh (runs the eval cases under WSL2, Linux or macOS) |
evals/ |
evals.json and the eval cases; fixtures/make_fixtures.py draws the test images |
.claude-plugin/ |
plugin.json (the manifest, version 0.7.2) and marketplace.json
|
ai-docs/ |
session notes, decisions, research and the handoff for the next session |
| root | the shared evergreen record: evergreen.json, RESEARCH, CHANGELOG, LEARNINGS, TESTS, MAINTENANCE |
From the repository root:
python tests/check_skills.py
python tests/test_aw.py
python scripts/budget.pyOn the 0.7.2 source before release (Windows, Python 3.14.6, Pillow 12.3.0), tests ran 87 cases with one
museum-network skip and zero failures. Skill checks passed; aw.py remains 86 KB (yellow).
The earlier v0.7.1 run at 5d0a14e printed, in part:
Ran 86 tests in 14.702s
OK (skipped=1)
check_skills: 0 problem(s)
install size 393 KB green
aw.py 86 KB yellow
aw_measure.py 39 KB green
aw_geom.py 36 KB green
knowledge files 192 KB green
vocabulary.md 38153 bytes green
descriptions (every session) ~596 tokens green
The same 86 tests passed on Linux (WSL2, Python 3.14.4, Pillow 13.0.0), one skipped.
The skipped test checks the museum fixtures: Cleveland Museum of Art open-access images fetched by accession number
and compared against pinned SHA-256 values. It runs with AW_NET=1 python tests/test_aw.py, and was not run for
this wiki.
check_skills.py checks the skills' structure, links, knowledge verified flags, LF line endings, and that no key
or machine path is committed. budget.py keeps the install size, aw.py, aw_measure.py and aw_geom.py (each
yellow from 60 KB, red over 100 KB),
the knowledge files, vocabulary.md (red above 40 KB) and the always-loaded descriptions within budget.
From AGENTS.md: standard-library Python 3.9 or later with Pillow optional, exactly one JSON object per command,
failing soft with ok: false and error, on Windows, macOS and Linux. Never numpy, scipy, OpenCV, scikit-image or
imagehash. Every new command or option gets an offline test with its fixture drawn in code, and aw.py,
aw_measure.py and aw_geom.py each stay under 100 KB: when one nears the line, split or cut, never squeeze comments. No images are committed except the README banner.
.github/workflows/tests.yml runs on pushes to main and on pull requests: Linux, macOS and Windows, with Python
3.9 and 3.14 (the Linux 3.9 job on ubuntu-24.04). Each job runs check_skills.py, test_aw.py without Pillow,
test_aw.py again with Pillow on 3.14, and budget.py.
The skills are tested with claude plugin eval: trigger prompts and decoys (does the right skill fire, and does it
stay quiet on a neighbour's request), action cases proven by evidence outside the transcript, and outcome and guard
cases graded by a judge. scripts/eval-wsl.sh runs them, because native Windows has no sandbox for cases that grant
Bash. Results go to evals/results/ and evals/cases/results/, both ignored by git. The runs so far are in
TESTS.md.
Six so far: 0.3.0 (2026-10-23),
0.4.0 and
0.4.2 (2026-10-24),
0.7.0 and
0.7.1 and
0.7.2 (2026-10-26).
.github/workflows/release.yml runs when a v* tag is pushed: it fails unless the tag matches the version in
.claude-plugin/plugin.json, runs check_skills.py and budget.py, zips skills/ with the README, LICENSE and
SECURITY.md as artwright-<version>.zip, and publishes a GitHub release with generated notes. Tags are made by the
maintainer. The CHANGELOG's Releases list says which versions were tagged; its earlier mistakes about 0.7.1
and 0.4.0 were corrected in PR #24. 0.1.0, 0.1.1, 0.2.0, 0.4.1, 0.5.0 and
0.6.0 were never tagged. When a packaged file changes, the manifest version and the CHANGELOG's release notes move
with it, and a breaking change to the verdict contract bumps the minor version.
Each output on these pages was printed by a script that draws its test images in code, copies aw.py,
aw_measure.py and aw_geom.py from the v0.7.2 tag archive into a scratch folder, and runs every
page's command and Python block there; the output was pasted, not typed. It ran on 2026-10-26: Linux
(WSL2) with Python 3.14.4 and Pillow 13.0.0 (the pages show this run), Linux with Pillow hidden, and Windows with
Python 3.14.6 with and without Pillow, using ffmpeg 9.0.1 for fallback decoding. For Versions and upgrading
the earlier script ran against the v0.4.2 tag,
and the first wiki's script against 0.1.0 (997f5b9). The script and its saved outputs are kept in the
maintainer's private notes, since they print the masked home folder; the repository's
ai-docs/notes/2026-10-22-github-wiki.md says how to rerun them. Home folders are shown as /home/you and times
as <time>.
This wiki describes artwright 0.7.2 (the v0.7.2 tag, commit a185c05) and was last updated on 2026-10-26. The plugin is MIT licensed. Report problems in the issues. It installs from the repository, m4bwav/artwright, or from the 0.7.2 release.
Using it
- Getting started
- Skills
- Commands
- Light, colour and composition
- How images are judged
- Verdict contract
- Errors and edge cases
- Recipes
- FAQ
The releases
Contributing
Elsewhere