Files
Manfred Riem 2972dec85c feat: Git extension stage 2 — GIT_BRANCH_NAME override, --force for existing dirs, auto-install tests (#1940) (#2117)
* feat: Git extension stage 2 — GIT_BRANCH_NAME override, --force for existing dirs, auto-install tests (#1940)

- Add GIT_BRANCH_NAME env var override to create-new-feature.sh/.ps1
  for exact branch naming (bypasses all prefix/suffix generation)
- Fix --force flag for 'specify init <dir>' into existing directories
- Add TestGitExtensionAutoInstall tests (auto-install, --no-git skip,
  commands registered)
- Add TestFeatureDirectoryResolution tests (env var, feature.json,
  priority, branch fallback)
- Document GIT_BRANCH_NAME in speckit.git.feature.md and specify.md

* fix: remove unused Tuple import (ruff F401)

* fix: address Copilot review feedback (#2117)

- Fix timestamp regex ordering: check YYYYMMDD-HHMMSS before generic
  numeric prefix in both bash and PowerShell
- Set BRANCH_SUFFIX in GIT_BRANCH_NAME override path so 244-byte
  truncation logic works correctly
- Add 244-byte length check for GIT_BRANCH_NAME in PowerShell
- Use existing_items for non-empty dir warning with --force
- Skip git extension install if already installed (idempotent --force)
- Wrap PowerShell feature.json parsing in try/catch for malformed JSON
- Fix PS comment: 'prefix lookup' -> 'exact mapping via Get-FeatureDir'
- Remove non-functional SPECIFY_SPEC_DIRECTORY from specify.md template

* fix: address second round of Copilot review feedback (#2117)

- Guard shutil.rmtree on init failure: skip cleanup when --force merged
  into a pre-existing directory (prevents data loss)
- Bash: error on GIT_BRANCH_NAME >244 bytes instead of broken truncation
- Fix malformed numbered list in specify.md (restore missing step 1)
- Add claude_skills.exists() assert before iterdir() in test

* fix: use UTF-8 byte count for 244-byte branch name limit (#2117)

- Bash: use LC_ALL=C wc -c for byte length instead of ${#VAR}
- PowerShell: use [System.Text.Encoding]::UTF8.GetByteCount() instead
  of .Length (UTF-16 code units)

* fix: address third round of review feedback (#2117)

- Update --dry-run help text in bash and PowerShell (branch name only)
- Fix specify.md JSON example: use concrete path, not literal variable
- Add TestForceExistingDirectory tests (merge + error without --force)
- Add PowerShell Get-FeaturePathsEnv tests (env var + feature.json)

* fix: normalize relative paths and fix Test-HasGit compat (#2117)

- Bash common.sh: normalize SPECIFY_FEATURE_DIRECTORY and feature.json
  relative paths to absolute under repo root
- PowerShell common.ps1: same normalization using IsPathRooted + Join-Path
- PowerShell create-new-feature.ps1: call Test-HasGit without -RepoRoot
  for compatibility with core common.ps1 (no param) and git-common.ps1
  (optional param with default)

* test: add GIT_BRANCH_NAME automated tests for bash and PowerShell (#2117)

- TestGitBranchNameOverrideBash: 5 tests (exact name, sequential prefix,
  timestamp prefix, overlong rejection, dry-run)
- TestGitBranchNameOverridePowerShell: 4 tests (exact name, sequential
  prefix, timestamp prefix, overlong rejection)
- Tests use extension scripts (not core) via new ext_git_repo and
  ext_ps_git_repo fixtures

* fix: restore git init during specify init + review fixes (#2117)

- Restore is_git_repo() and init_git_repo() functions removed in stage 2
- specify init now runs git init AND installs git extension (not just
  extension install alone)
- Add is_dir() guard for non-here path to prevent uncontrolled error
  when target exists but is a file
- Add python3 JSON fallback in common.sh for multi-line feature.json
  (grep pipeline fails on pretty-printed JSON without jq)

* fix: use init_git_repo error_msg in failure output (#2117)

* fix: ensure_executable_scripts also covers .specify/extensions/ (#2117)

Extension .sh scripts (e.g. create-new-feature.sh, initialize-repo.sh)
may lack execute bits after install. Scan both .specify/scripts/ and
.specify/extensions/ for permission fixing.

* fix: move chmod after extension install + sanitize error_msg (#2117)

- ensure_executable_scripts() now runs after git extension install so
  extension .sh files get execute bits in the same init run
- Sanitize init_git_repo error_msg to single line (replace newlines,
  truncate to 120 chars) to prevent garbled StepTracker output

* fix: use tracker.error for git init/extension failures (#2117)

Git init failure and extension install failure were reported as
tracker.complete (showing green) even on error. Now track a
git_has_error flag and call tracker.error when any step fails,
so the UI correctly reflects the failure state.

* fix: sanitize ext_err in git step tracker for consistent rendering (#2117)
2026-04-08 13:48:36 -05:00
..

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
  • 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:

# Branch numbering strategy: "sequential" or "timestamp"
branch_numbering: sequential

# 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"

Installation

# Install the bundled git extension (no network required)
specify extension add git

Disabling

# 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.sh — Bash implementation
  • scripts/bash/git-common.sh — Shared Git utilities (Bash)
  • scripts/powershell/create-new-feature.ps1 — PowerShell implementation
  • scripts/powershell/git-common.ps1 — Shared Git utilities (PowerShell)