Thanks for your interest in contributing to vstack.
- Python 3.11-3.14
- Virtual environment enabled
python -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -e ".[dev]"Run make bootstrap once after cloning to install all development tools.
- Create a branch from
main. - Make focused, reviewable changes.
- Run the fast test suite locally before pushing:
make test-local- Alternatively, run the full quality gate (format-check + lint + typecheck + test):
make check- Open a pull request with clear context.
| Command | Purpose |
|---|---|
make test-local |
Run tests against the current interpreter with coverage |
make check |
Full quality gate: format-check, lint, typecheck, test |
make lint |
Lint with ruff |
make typecheck |
Type-check with mypy |
make format |
Auto-format Python and Markdown |
- Use
make verify-fastduring active development for deterministic checks:format-check,lint,typecheck, andtest-local. - Use
make verify-fullbefore opening or updating a PR to run the full local gate:checkplusvstack-validate. - CI
Verifyalso includes a generated artifact drift guard. It runsvstack installand fails if.github/generated outputs are out of sync with committed files.
Use this table to find the minimum set of checks to run after each type of change.
Run make check before opening a PR when your change touches multiple areas.
| Change type | Required checks |
|---|---|
src/vstack/_templates/agents/, skills/, instructions/, prompts/ |
python3 -m vstack install, make test-local, make markdown-format |
src/vstack/_templates/hooks/ |
python3 -m vstack install, make test-local |
docs/**/*.md |
make markdown-format |
src/**/*.py or tests/**/*.py |
make test-local (run make check before merge) |
| CLI behavior, manifest logic, or workflow contract | make check |
pyproject.toml, Makefile, or CI workflow files |
make check |
Test coverage is enforced at 100% (--cov-fail-under=100). Every behavioral
change must be accompanied by tests that keep all checks green.
- Pytest temporary files are standardized under
.pytest-tmp(configured via--basetempinpyproject.toml). - Do not rely on the legacy
.vstack/tmp/testlocation in scripts or local tooling.
This repository uses a Conventional Commits baseline for release automation.
type(optional-scope)!: short summary
type: what kind of change you made.scope(optional): where the change happened.!: marks a breaking change.
major: any commit with!in the header or aBREAKING CHANGE:footer.minor:feat,feature.patch:fix,bugfix,hotfix,opt,patch,perf,refactor,chore,revert.no bump:docs,test,tests(appear in changelog but do not trigger a version increment).
feat,feature: new behavior or capabilities.fix,bugfix: bug correction.hotfix: urgent production fix.opt: small, practical optimization.patch: small maintenance fix that should still trigger a patch release.perf: measurable performance improvement.refactor: structural cleanup without intended behavior change.chore: repository maintenance and non-feature housekeeping.revert: rollback of a previous commit.test,tests: test-only changes with no production behavior change.
- Domain and backend areas:
api,auth,permissions,serializer,viewset,orm,migrations,admin,settings. - Tooling and workflow areas:
deps,ci,docs,build,style,release,workflow. - Quality and test areas:
test,tests. - Project modules:
cli,agents,skills,instructions,prompts,frontmatter,artifacts.
feat(cli): add --global verify modefix(auth): handle missing token headerhotfix(ci): handle broken tag push raceopt(serializer): simplify optional-field validation pathpatch(docs): clarify release gatingperf(orm): reduce query count in list endpointrefactor(artifacts)!: drop legacy manifest key
- Commit subject lines are limited to 100 characters by CI.
Branch names are validated in CI using Conventional Branch format:
type/short-description
Allowed branch types:
feature,bugfix,hotfix,release,chore,feat,fixdocs,refactor,perf,test,ci,build,styleopt,patch,dependabot
A dedicated CI workflow validates commit messages on branch pushes and PRs using commit-check with policy from cchk.toml.
Scope names are guidance-level in this document and are not currently hard-enforced by CI.
- Keep PRs small when possible.
- Include tests for behavior changes.
- Update docs when behavior changes.
- Link related issues.
Please do not report security issues in public issues.
Use the process in SECURITY.md.
Keep these GitHub settings aligned with the CI/CD design in docs/design/cicd.md.
- Ruleset on
main(Settings → Rules → Rulesets):- require pull request before merging
- required approvals: at least 1
- require status checks:
Commit,Check,Verify, andSecurity - allowed merge methods: include Squash (required by
automerge.yml) - restrict force pushes
- Actions permissions (Settings → Actions → General):
- allow GitHub Actions to create pull requests
- allow GitHub Actions to approve pull requests
- Auto-merge (Settings → General):
- enabled at repository level (required for Dependabot auto-merge path)
- PyPI environment (Settings → Environments):
pypienvironment exists- OIDC trusted publishing configured
- any required reviewer policy matches release expectations