mirror of
https://github.com/github/spec-kit.git
synced 2026-07-07 06:35:06 +08:00
* test: cover namespaced git branch templates
Assisted-by: Codex (model: GPT-5, autonomous)
* feat: support namespaced git branch templates
Assisted-by: Codex (model: GPT-5, autonomous)
* test: cover git branch template edge cases
Assisted-by: Codex (model: GPT-5, autonomous)
* fix: harden git branch template parsing
Assisted-by: Codex (model: GPT-5, autonomous)
* fix: address git branch template review feedback
Address Copilot review feedback for branch_prefix help text, namespaced GIT_BRANCH_NAME fallback behavior, final-segment validation docs, and Bash UTF-8 byte reporting.
Assisted-by: Codex (model: GPT-5, autonomous)
* fix: reject slug-scoped branch templates
Reject branch templates that place {slug} before {number}, because that makes namespace scanning depend on the generated feature slug and can reset numbering per feature name.
Assisted-by: Codex (model: GPT-5, autonomous)
* fix: ignore malformed timestamp refs when numbering
Align branch-number scanning with feature-branch validation so malformed timestamp-looking refs do not inflate sequential numbering. Also updates the stale git-common comment called out in review.
Assisted-by: Codex (model: GPT-5, autonomous)
115 lines
5.4 KiB
Markdown
115 lines
5.4 KiB
Markdown
# Git Branching Workflow Extension
|
|
|
|
Git repository initialization, feature branch creation, numbering (sequential/timestamp), validation, remote detection, and auto-commit for Spec Kit.
|
|
|
|
## Overview
|
|
|
|
This extension provides Git operations as an optional, self-contained module. It manages:
|
|
|
|
- **Repository initialization** with configurable commit messages
|
|
- **Feature branch creation** with sequential (`001-feature-name`) or timestamp (`20260319-143022-feature-name`) numbering and optional templates for branch namespaces
|
|
- **Branch validation** to ensure branches follow naming conventions
|
|
- **Git remote detection** for GitHub integration (e.g., issue creation)
|
|
- **Auto-commit** after core commands (configurable per-command with custom messages)
|
|
|
|
## Commands
|
|
|
|
| Command | Description |
|
|
|---------|-------------|
|
|
| `speckit.git.initialize` | Initialize a Git repository with a configurable commit message |
|
|
| `speckit.git.feature` | Create a feature branch with sequential or timestamp numbering |
|
|
| `speckit.git.validate` | Validate current branch follows feature branch naming conventions |
|
|
| `speckit.git.remote` | Detect Git remote URL for GitHub integration |
|
|
| `speckit.git.commit` | Auto-commit changes (configurable per-command enable/disable and messages) |
|
|
|
|
## Hooks
|
|
|
|
| Event | Command | Optional | Description |
|
|
|-------|---------|----------|-------------|
|
|
| `before_constitution` | `speckit.git.initialize` | No | Init git repo before constitution |
|
|
| `before_specify` | `speckit.git.feature` | No | Create feature branch before specification |
|
|
| `before_clarify` | `speckit.git.commit` | Yes | Commit outstanding changes before clarification |
|
|
| `before_plan` | `speckit.git.commit` | Yes | Commit outstanding changes before planning |
|
|
| `before_tasks` | `speckit.git.commit` | Yes | Commit outstanding changes before task generation |
|
|
| `before_implement` | `speckit.git.commit` | Yes | Commit outstanding changes before implementation |
|
|
| `before_checklist` | `speckit.git.commit` | Yes | Commit outstanding changes before checklist |
|
|
| `before_analyze` | `speckit.git.commit` | Yes | Commit outstanding changes before analysis |
|
|
| `before_taskstoissues` | `speckit.git.commit` | Yes | Commit outstanding changes before issue sync |
|
|
| `after_constitution` | `speckit.git.commit` | Yes | Auto-commit after constitution update |
|
|
| `after_specify` | `speckit.git.commit` | Yes | Auto-commit after specification |
|
|
| `after_clarify` | `speckit.git.commit` | Yes | Auto-commit after clarification |
|
|
| `after_plan` | `speckit.git.commit` | Yes | Auto-commit after planning |
|
|
| `after_tasks` | `speckit.git.commit` | Yes | Auto-commit after task generation |
|
|
| `after_implement` | `speckit.git.commit` | Yes | Auto-commit after implementation |
|
|
| `after_checklist` | `speckit.git.commit` | Yes | Auto-commit after checklist |
|
|
| `after_analyze` | `speckit.git.commit` | Yes | Auto-commit after analysis |
|
|
| `after_taskstoissues` | `speckit.git.commit` | Yes | Auto-commit after issue sync |
|
|
|
|
## Configuration
|
|
|
|
Configuration is stored in `.specify/extensions/git/git-config.yml`:
|
|
|
|
```yaml
|
|
# Branch numbering strategy: "sequential" or "timestamp"
|
|
branch_numbering: sequential
|
|
|
|
# Optional branch name template. Leave empty for the default "{number}-{slug}".
|
|
# Supported tokens: {author}, {app}, {number}, {slug}; {slug} must not appear
|
|
# before {number}, and the final path segment must start with {number}-.
|
|
# Example for monorepos: "{author}/{app}/{number}-{slug}"
|
|
branch_template: ""
|
|
|
|
# Optional shorthand namespace. Leave empty to use branch_template/default behavior.
|
|
# Example: "features/{app}" expands to "features/{app}/{number}-{slug}"
|
|
branch_prefix: ""
|
|
|
|
# Custom commit message for git init
|
|
init_commit_message: "[Spec Kit] Initial commit"
|
|
|
|
# Auto-commit per command (all disabled by default)
|
|
# Example: enable auto-commit after specify
|
|
auto_commit:
|
|
default: false
|
|
after_specify:
|
|
enabled: true
|
|
message: "[Spec Kit] Add specification"
|
|
```
|
|
|
|
`{author}` is derived from Git config and sanitized for branch names. `{app}` is derived from the Spec Kit init directory name. Custom templates must not put `{slug}` before `{number}`, and must put `{number}-` at the start of the final path segment so generated names remain valid feature branches. For a monorepo project at `apps/web/.specify/`, a template such as `{author}/{app}/{number}-{slug}` produces branches like `jdoe/web/008-guided-tour`.
|
|
|
|
For simple namespace-only customization, `branch_prefix` is also accepted as a shorthand and expands to `<branch_prefix>/{number}-{slug}`.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
# Install the bundled git extension (no network required)
|
|
specify extension add git
|
|
```
|
|
|
|
## Disabling
|
|
|
|
```bash
|
|
# Disable the git extension (spec creation continues without branching)
|
|
specify extension disable git
|
|
|
|
# Re-enable it
|
|
specify extension enable git
|
|
```
|
|
|
|
## Graceful Degradation
|
|
|
|
When Git is not installed or the directory is not a Git repository:
|
|
- Spec directories are still created under `specs/`
|
|
- Branch creation is skipped with a warning
|
|
- Branch validation is skipped with a warning
|
|
- Remote detection returns empty results
|
|
|
|
## Scripts
|
|
|
|
The extension bundles cross-platform scripts:
|
|
|
|
- `scripts/bash/create-new-feature-branch.sh` — Bash implementation (branch creation only)
|
|
- `scripts/bash/git-common.sh` — Shared Git utilities (Bash)
|
|
- `scripts/powershell/create-new-feature-branch.ps1` — PowerShell implementation (branch creation only)
|
|
- `scripts/powershell/git-common.ps1` — Shared Git utilities (PowerShell)
|