Thanks for considering a contribution. Weft is small, opinionated, and dependency-free on purpose — keep changes focused.
git clone https://github.com/dioptx/weft.git
cd weft
make install # equivalent to: pip install -e ".[dev]"
make test # equivalent to: pytest -qmake help lists everything. The Python core is stdlib only. Do not add runtime dependencies without first opening an issue to discuss.
.claude-plugin/ plugin.json — Claude Code plugin manifest
core/ Python event store, state machine, projections, CLI, dashboard
hooks/ SessionStart / PreToolUse / PreCompact / Stop bash hooks + hooks.json
skills/ SKILL.md files for the /wf-* slash commands
templates/ Workflow definitions (JSON)
tests/ pytest suite
- Drop a new file under
templates/<name>.json. Mirror the shape oftemplates/generic.json—id,name,description, and astepsarray. - Each step needs an
id,description, and optionalallowed_tools/blocked_commands/on_fail. - Add a test under
tests/test_templates.pyexercising the new template at minimum for load + advancement. - List the template in the README features section if it's user-facing.
- Add
skills/<wf-name>/SKILL.mddescribing the slash command. - If the skill needs to read or write state, route through
core/cli.pyrather than reading.claude/weft/directly. - If the skill needs a guard, update
hooks/and add a behavioral test undertests/test_behavioral.py.
- All PRs must keep
pytest -qgreen on Python 3.10+. - Prefer behavioral tests (drive the CLI / hooks end-to-end) over unit tests of internal helpers.
- Don't mock the event store — use a temporary directory fixture (see
tests/conftest.py).
- One logical change per commit.
- Subject in the imperative mood: "fix rebuild for aborted workflows", not "fixed".
- Reference issues with
(#123)when relevant.
- Update
CHANGELOG.md(move items from[Unreleased]into a new version section). - Bump
versionin.claude-plugin/plugin.jsonandpyproject.toml. - Tag:
git tag -a vX.Y.Z -m "vX.Y.Z" && git push --tags.
Use the issue templates in .github/ISSUE_TEMPLATE/. Include weft version, Claude Code version, and the relevant entries from .claude/weft/events.jsonl when reporting bugs.