This is AppFolio's fork of github/spec-kit. It bundles AppFolio-specific extensions into the CLI for zero-config developer setup.
| Area | Change |
|---|---|
| Package name | specify-cli → specify-af-cli |
| Binary name | specify → specify-af |
| Catalog URL | Points at appfolio/spec-kit af-main branch |
| Init flow | Auto-installs bundled AF extensions after scaffold |
| New command | specify-af upgrade — syncs AF extensions to bundled versions |
| Version resolution | Uses packages_distributions() instead of hardcoded package name |
| Release workflow | release-please with af-v* tags on af-main |
| Install branch | af-stable — only updated on release, safe for end-user installs |
End users should install from the af-stable branch, which only updates when a release is tagged:
uv tool install git+https://github.com/appfolio/spec-kit@af-stable --forceTo upgrade to the latest release:
uv tool install git+https://github.com/appfolio/spec-kit@af-stable --force --reinstallWhen merging upstream releases, expect conflicts in these files:
pyproject.toml— keep AF name, console script, and force-include entriessrc/specify_cli/__init__.py— keep version fix (_get_distribution_name), init hook (install_af_extensions), upgrade command, panel titlesrc/specify_cli/extensions.py— keep AF catalog URLsrc/specify_cli/presets.py— keep AF package name in error messageextensions/catalog.json— keep AF entries and catalog URL.github/workflows/release.yml— keepaf-v*tag filter, AF install URL, extension ZIP step
The fork diverged from upstream at commit 43cb0fa (feat: add bundled lean preset with minimal workflow commands (#2161)).
When integrating an upstream release:
- Squash work commits into logical groups and drop release commits (their info lives in git tags and FORK.md changelog)
- Rebase onto the upstream tag
- Resolve conflicts (see Conflict-Prone Files above)
- Update the baseline commit below after completing the integration
Current baseline: 43cb0fa — feat: add bundled lean preset with minimal workflow commands (#2161)
git clone git@github.com:appfolio/spec-kit.git
cd spec-kit
git checkout af-main
uv tool install . --force
specify-af versiongit checkout -b feat/my-feature af-main
# Make changes (use Conventional Commits: feat:, fix:, chore:, etc.)
uv tool install . --force --reinstall
cd /path/to/test-project && specify-af init --here --ai claude
git push -u origin feat/my-feature
# Open PR targeting af-main- Create
extensions/af-<name>/withextension.yml,README.md,commands/ - Add
"af-<name>"toAF_EXTENSION_IDSinsrc/specify_cli/af_init.py - Add
"extensions/af-<name>" = "specify_cli/core_pack/extensions/af-<name>"toforce-includeinpyproject.toml - Add entry to
extensions/catalog.json
git fetch upstream --tags
git checkout af-main
git merge v<upstream-version>
# Resolve conflicts (see Conflict-Prone Files above)
# Test: uv tool install . --force --reinstall && specify-af init --hereIf integration work is needed:
git checkout -b feat/integrate-v<version>
# Fix, test, open PR to af-main- feat: add af-stable branch for end-user installs
- docs: add CLAUDE.md with fork strategy and testing
- docs: add FORK.md with maintenance guide and baseline
- test: add AF extension to inventory test expectations
- feat: add bundled AF extension with auto-install
- feat: fork infrastructure — specify-af-cli
- fix: skip docs deployment workflow on forks (#2171)
- chore: release 0.6.1, begin 0.6.2.dev0 development (#2162)
- docs: add CLAUDE.md with fork strategy and git rules
- feat: AppFolio spec-kit fork — specify-af-cli with bundled extensions
- feat: AppFolio spec-kit fork — specify-af-cli with bundled extensions