Skip to content
factory
Esc
↑↓navigate↵open⌘Jpreview
On this page

Development

Tests, validation, evals, and how to run this documentation site.

Tests

The scripts are tested with pytest: the verify script end to end on a fixture repository, the Stop and SessionStart hooks against a stub verify, factory-config.py, release.py, and sync-upstream.py. Shell is covered by test count rather than by line coverage, so a new branch in a shell script wants a new test.

uv run pytest

CI also runs the verify script itself on this repository, with the same factory.toml a user would have, and shellcheck over every shell script. Tool versions are pinned at the top of .github/workflows/ci.yml.

Two manifests

.claude-plugin/plugin.json is the Claude Code manifest. plugin.json at the root follows the agent-plugins.org schema so other agent hosts can read the same plugin. A test keeps their shared fields identical and the release job bumps both versions.

Validation

Every skill directory must satisfy the Agent Skills spec and Claude Code’s plugin validator:

claude plugin validate skills --strict

The lawbook rules in lawbook.yaml enforce the repository’s own conventions: every loop skill loads an upstream file, SKILL.md stays under 150 lines, only the portable frontmatter keys are used, and owned prose uses plain punctuation.

lawbook check . --no-llm

Evals

claude plugin eval . --threshold 0.8

The eval cases under evals/ check that spec fires on a feature request, that pr does not fire on its own, that the verify script runs on a fixture repository and exits 0, that plan writes a plan plan-check.py accepts and asks before publishing, and that review writes its handoff file with the finding the fixture plants. The scaffolded cases need --scaffold and Bash grants; see the comment at the top of each scaffold.sh.

The evals workflow runs the suite weekly and on demand when the repository has an ANTHROPIC_API_KEY secret, and uploads evals/results/ as an artifact. Without the secret it skips and says so.

This site

The documentation is a Blume site under docs/, with pages in docs/content/. It lives in a subdirectory on purpose: a package.json at the repository root would make the verify script treat the repository as a Node stack.

pnpm -C docs install
pnpm -C docs dev
pnpm -C docs validate
pnpm -C docs build

validate checks internal links and fails on warnings. build writes docs/dist/. A GitHub Actions workflow runs both on every pull request that touches docs/ and deploys to GitHub Pages on push to main.

Pages are plain Markdown so rumdl can lint them with the rest of the repository:

uvx rumdl check --fix docs/content

factory.toml points specs at docs/specs/, a sibling of content/ outside the site’s content root, so specs never become pages.

Releases

Merging to main cuts a release when the commits since the last tag carry a feat or fix; the README has the version rules. The release commit is pushed with the workflow’s GITHUB_TOKEN, which starts no other workflow, so it gets no CI run of its own and does not redeploy this site. Run the docs workflow by hand from the Actions tab after a release that touched docs/. A personal access token in the release job would close that gap; that is the owner’s call.

Last updated on

Was this page helpful?