Files
spec-kit/docs/local-development.md
2025-09-11 22:07:43 -07:00

3.7 KiB

Local Development Guide

This guide shows how to iterate on the specify CLI locally without publishing a release or committing to main first.

1. Clone and Switch Branches

git clone https://github.com/github/spec-kit.git
cd spec-kit
# Work on a feature branch
git checkout -b your-feature-branch

2. Run the CLI Directly (Fastest Feedback)

You can execute the CLI via the module entrypoint without installing anything:

# From repo root
python -m src.specify_cli --help
python -m src.specify_cli init demo-project --ai claude --ignore-agent-tools

If you prefer invoking the script file style (uses shebang):

python src/specify_cli/__init__.py init demo-project

3. Use Editable Install (Isolated Environment)

Create an isolated environment using uv so dependencies resolve exactly like end users get them:

# Create & activate virtual env (uv auto-manages .venv)
uv venv
source .venv/bin/activate  # or on Windows: .venv\\Scripts\\activate

# Install project in editable mode
uv pip install -e .

# Now 'specify' entrypoint is available
specify --help

Re-running after code edits requires no reinstall because of editable mode.

4. Invoke with uvx Directly From Git (Current Branch)

uvx can run from a local path (or a Git ref) to simulate user flows:

uvx --from . specify init demo-uvx --ai copilot --ignore-agent-tools

You can also point uvx at a specific branch without merging:

# Push your working branch first
git push origin your-feature-branch
uvx --from git+https://github.com/github/spec-kit.git@your-feature-branch specify init demo-branch-test

5. Testing Script Permission Logic

After running an init, check that shell scripts are executable on POSIX systems:

ls -l scripts | grep .sh
# Expect owner execute bit (e.g. -rwxr-xr-x)

On Windows this step is a no-op.

6. Run Lint / Basic Checks (Add Your Own)

Currently no enforced lint config is bundled, but you can quickly sanity check importability:

python -c "import specify_cli; print('Import OK')"

7. Build a Wheel Locally (Optional)

Validate packaging before publishing:

uv build
ls dist/

Install the built artifact into a fresh throwaway environment if needed.

8. Using a Temporary Workspace

When testing init --here in a dirty directory, create a temp workspace:

mkdir /tmp/spec-test && cd /tmp/spec-test
python -m src.specify_cli init --here --ai claude --ignore-agent-tools  # if repo copied here

Or copy only the modified CLI portion if you want a lighter sandbox.

9. Debug Network / TLS Skips

If you need to bypass TLS validation while experimenting:

specify check --skip-tls
specify init demo --skip-tls --ai gemini --ignore-agent-tools

(Use only for local experimentation.)

10. Rapid Edit Loop Summary

Action Command
Run CLI directly python -m src.specify_cli --help
Editable install uv pip install -e . then specify ...
Local uvx run uvx --from . specify ...
Git branch uvx uvx --from git+URL@branch specify ...
Build wheel uv build

11. Cleaning Up

Remove build artifacts / virtual env quickly:

rm -rf .venv dist build *.egg-info

12. Common Issues

Symptom Fix
ModuleNotFoundError: typer Run uv pip install -e .
Scripts not executable (Linux) Re-run init (logic adds bits) or chmod +x scripts/*.sh
Git step skipped You passed --no-git or Git not installed
TLS errors on corporate network Try --skip-tls (not for production)

13. Next Steps

  • Update docs and run through Quick Start using your modified CLI
  • Open a PR when satisfied
  • (Optional) Tag a release once changes land in main