diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml
new file mode 100644
index 0000000000..535974e9b3
--- /dev/null
+++ b/.github/workflows/publish-pypi.yml
@@ -0,0 +1,79 @@
+name: Publish to PyPI
+
+on:
+ workflow_dispatch:
+ inputs:
+ tag:
+ description: 'Release tag to publish (e.g., v0.10.1)'
+ required: true
+ type: string
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ actions: write
+ steps:
+ - name: Verify tag format
+ run: |
+ TAG="${{ inputs.tag }}"
+ if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+ echo "Error: '$TAG' is not a valid release tag (expected vX.Y.Z)"
+ exit 1
+ fi
+
+ - name: Checkout release tag
+ uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
+ with:
+ ref: refs/tags/${{ inputs.tag }}
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
+
+ - name: Set up Python
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
+ with:
+ python-version: "3.13"
+
+ - name: Verify tag matches package version
+ run: |
+ TAG_VERSION="${{ inputs.tag }}"
+ TAG_VERSION="${TAG_VERSION#v}"
+ PROJECT_VERSION="$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')"
+ if [[ "$TAG_VERSION" != "$PROJECT_VERSION" ]]; then
+ echo "Error: Tag version ($TAG_VERSION) does not match pyproject.toml version ($PROJECT_VERSION)"
+ exit 1
+ fi
+
+ - name: Build package
+ run: uv build
+
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
+ with:
+ name: dist
+ path: dist/
+
+ publish:
+ needs: build
+ runs-on: ubuntu-latest
+ environment: pypi
+ permissions:
+ id-token: write
+ actions: read
+ steps:
+ - name: Download build artifacts
+ uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
+ with:
+ name: dist
+ path: dist/
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
+
+ - name: Publish to PyPI
+ run: uv publish
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b35bc30ec2..6932d95e6b 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -65,11 +65,21 @@ jobs:
cat > release_notes.md << NOTES_EOF
## Install
+ From [PyPI](https://pypi.org/project/specify-cli/):
+
\`\`\`bash
- uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@${VERSION}
+ uv tool install 'specify-cli==${VERSION_NO_V}'
specify init my-project
\`\`\`
+ Or install from source:
+
+ \`\`\`bash
+ uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@${VERSION}
+ \`\`\`
+
+ > **Note:** The PyPI package is published after this GitHub release. If the version is not yet available on PyPI, use the source install above.
+
NOTES_EOF
echo "## What's Changed" >> release_notes.md
diff --git a/README.md b/README.md
index 0a0b4119b2..44ec94bf84 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-

+
🌱 Spec Kit
Build high-quality software faster.
@@ -44,13 +44,19 @@ Spec-Driven Development **flips the script** on traditional software development
### 1. Install Specify CLI
-Requires **[uv](https://docs.astral.sh/uv/)** ([install uv](./docs/install/uv.md)). Replace `vX.Y.Z` with the latest tag from [Releases](https://github.com/github/spec-kit/releases):
+Requires **[uv](https://docs.astral.sh/uv/)** ([install uv](https://github.com/github/spec-kit/blob/main/docs/install/uv.md)):
+
+```bash
+uv tool install specify-cli@latest
+```
+
+Or install from source using a specific [release](https://github.com/github/spec-kit/releases) tag (useful if the PyPI version is not yet available for a new release):
```bash
uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z
```
-See the [Installation Guide](./docs/installation.md) for alternative methods, verification, upgrade, and troubleshooting.
+See the [Installation Guide](https://github.com/github/spec-kit/blob/main/docs/installation.md) for alternative methods, verification, upgrade, and troubleshooting.
### 2. Initialize a project
@@ -59,7 +65,7 @@ specify init my-project --integration copilot
cd my-project
```
-To check for updates or upgrade the installed CLI, use the self-management commands. See the [Upgrade Guide](./docs/upgrade.md) for detailed scenarios and customization options.
+To check for updates or upgrade the installed CLI, use the self-management commands. See the [Upgrade Guide](https://github.com/github/spec-kit/blob/main/docs/upgrade.md) for detailed scenarios and customization options.
```bash
# Check whether a newer release is available (read-only — does not modify anything)
@@ -119,13 +125,13 @@ Use **`/speckit.implement`** to execute all tasks and build your feature accordi
/speckit.implement
```
-For detailed step-by-step instructions, see our [comprehensive guide](./spec-driven.md).
+For detailed step-by-step instructions, see our [comprehensive guide](https://github.com/github/spec-kit/blob/main/spec-driven.md).
## 📽️ Video Overview
Want to see Spec Kit in action? Watch our [video overview](https://www.youtube.com/watch?v=a9eR1xsfvHg&pp=0gcJCckJAYcqIYzv)!
-[](https://www.youtube.com/watch?v=a9eR1xsfvHg&pp=0gcJCckJAYcqIYzv)
+[](https://www.youtube.com/watch?v=a9eR1xsfvHg&pp=0gcJCckJAYcqIYzv)
## 🌍 Community
@@ -292,7 +298,7 @@ If you encounter issues with an agent, please open an issue so we can refine the
## 📖 Learn More
-- **[Complete Spec-Driven Development Methodology](./spec-driven.md)** - Deep dive into the full process
+- **[Complete Spec-Driven Development Methodology](https://github.com/github/spec-kit/blob/main/spec-driven.md)** - Deep dive into the full process
- **[Detailed Walkthrough](#-detailed-process)** - Step-by-step implementation guide
---
@@ -320,7 +326,7 @@ specify init . --force
specify init --here --force
```
-
+
In an interactive terminal, you will be prompted to select the coding agent integration you are using. In non-interactive sessions, such as CI or piped runs, `specify init` defaults to GitHub Copilot unless you pass `--integration`. You can also proactively specify the integration directly in the terminal:
@@ -354,7 +360,7 @@ specify init --integration copilot --ignore-agent-tools
Go to the project folder and run your coding agent. In our example, we're using `claude`.
-
+
You will know that things are configured correctly if you see the `/speckit.constitution`, `/speckit.specify`, `/speckit.plan`, `/speckit.tasks`, and `/speckit.implement` commands available.
diff --git a/docs/installation.md b/docs/installation.md
index 3ee2f67b0e..92cf1f0f4d 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -10,16 +10,22 @@
## Installation
-> [!IMPORTANT]
-> The only official, maintained packages for Spec Kit come from the [github/spec-kit](https://github.com/github/spec-kit) GitHub repository. Any packages with the same name available on PyPI (e.g. `specify-cli` on pypi.org) are **not** affiliated with this project and are not maintained by the Spec Kit maintainers. For normal installs, use the GitHub-based commands shown below. For offline or air-gapped environments, locally built wheels created from this repository are also valid.
+> [!NOTE]
+> The official `specify-cli` package is published to [PyPI](https://pypi.org/project/specify-cli/) by the [github/spec-kit](https://github.com/github/spec-kit) maintainers. PyPI publishing is performed after each GitHub release and may lag briefly. Source installs from the GitHub repository are always available immediately.
### Persistent Installation (Recommended)
-Install once and use everywhere. Replace `vX.Y.Z` with a tag from [Releases](https://github.com/github/spec-kit/releases):
+Install once and use everywhere:
> [!NOTE]
> The command below requires **[uv](https://docs.astral.sh/uv/)**. If you see `command not found: uv`, [install uv first](./install/uv.md).
+```bash
+uv tool install specify-cli@latest
+```
+
+Or install from source using a specific [release](https://github.com/github/spec-kit/releases) tag:
+
```bash
uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z
```
diff --git a/pyproject.toml b/pyproject.toml
index f8bdc23f91..463d8d8562 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -2,6 +2,7 @@
name = "specify-cli"
version = "0.10.2.dev0"
description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
+readme = "README.md"
requires-python = ">=3.11"
dependencies = [
"typer>=0.24.0",