Read @FORK.md for full context on this fork.
af-mainis the fork branch. It accumulates commits from PRs and releases.- On feature branches, squash to one commit before merge.
- Before integrating an upstream release, squash all af-main commits since the fork baseline (see @FORK.md) into one commit, then merge the upstream tag. Resolve conflicts per @FORK.md.
- Use Conventional Commits on feature branches:
feat:,fix:,chore:, etc.
- Always work on a feature branch. Never commit directly to
af-mainwithout user confirmation. - Never push merge commits. If a pull or merge introduces a merge commit, rebase instead.
- Before force-pushing
af-main: confirm with the user first — this rewrites shared history.
- Install locally (dev):
uv tool install . --force --reinstall - Install from release:
uv tool install git+https://github.com/appfolio/spec-kit@af-stable --force - Test:
specify-af versionthenspecify-af init --here --ai claudein a scratch directory - Binary is
specify-af, package isspecify-af-cli af-stablebranch is the end-user install target — only updated when a release is tagged
Run tests before pushing. Also offer to run tests after completing a significant chunk of work, even if a push isn't imminent:
uv run --extra test python -m pytest tests/ --tb=no -qFor focused checks (see TESTING.md for details):
uv run --extra test python -m pytest tests/test_core_pack_scaffold.py -q # packaging/scaffolding
uv run --extra test python -m pytest tests/test_agent_config_consistency.py -q # agent config wiringtests/integrations/test_cli.py::TestForceExistingDirectory::test_without_force_errors_on_existing_dir— upstream test that fails when terminal width is narrow (Rich panel wraps"already exists"across lines). Safe to ignore.
src/specify_cli/af_init.py— extension auto-install and upgrade logicextensions/af/— bundled AF extension (lifecycle hooks)extensions/catalog.json— extension registry (includes AF entries)pyproject.toml— force-include for bundled extensions