Add automated markdown linting to ensure consistent formatting across all markdown files in the repository. Changes: - Add .markdownlint-cli2.jsonc configuration - Create .github/workflows/lint.yml for CI/CD integration - Fix all 908 existing markdown errors across 27 files - Enforce ATX-style headings and asterisk emphasis - Set consistent 2-space list indentation This prevents markdown errors after project initialization and maintains high documentation quality standards.
4.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.
Scripts now have both Bash (
.sh) and PowerShell (.ps1) variants. The CLI auto-selects based on OS unless you pass--script sh|ps.
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 --script sh
If you prefer invoking the script file style (uses shebang):
python src/specify_cli/__init__.py init demo-project --script ps
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 PowerShell: .venv\Scripts\Activate.ps1
# 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 --script sh
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 --script ps
4a. Absolute Path uvx (Run From Anywhere)
If you're in another directory, use an absolute path instead of .:
uvx --from /mnt/c/GitHub/spec-kit specify --help
uvx --from /mnt/c/GitHub/spec-kit specify init demo-anywhere --ai copilot --ignore-agent-tools --script sh
Set an environment variable for convenience:
export SPEC_KIT_SRC=/mnt/c/GitHub/spec-kit
uvx --from "$SPEC_KIT_SRC" specify init demo-env --ai copilot --ignore-agent-tools --script ps
(Optional) Define a shell function:
specify-dev() { uvx --from /mnt/c/GitHub/spec-kit specify "$@"; }
# Then
specify-dev --help
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 you will instead use the .ps1 scripts (no chmod needed).
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 --script sh # 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 --script ps
(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 (repo root) | uvx --from . specify ... |
| Local uvx run (abs path) | uvx --from /mnt/c/GitHub/spec-kit 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 or chmod +x scripts/*.sh |
| Git step skipped | You passed --no-git or Git not installed |
| Wrong script type downloaded | Pass --script sh or --script ps explicitly |
| 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