Skip to main content

Configuration Management

SpecifyX uses TOML-based configuration files to manage project settings, branch naming patterns, and template preferences. This guide covers all configuration options and how to customize them for your workflow.

Configuration Structure​

SpecifyX uses a two-level configuration system:

  1. Global Configuration - User preferences stored in ~/.specify/config.toml
  2. Project Configuration - Project-specific settings in .specify/config.toml

Project configuration always overrides global configuration when both are present.

Configuration File Format​

SpecifyX configuration files use TOML format.

Global Configuration​

Create global configuration to set default preferences across all your SpecifyX projects.

Creating Global Configuration​

# Create global config directory
mkdir -p ~/.specify

# Create global configuration file
cat > ~/.specify/config.toml << 'EOF'
[project]
name = "global-defaults"

[project.branch_naming]
description = "My preferred branch naming pattern"
patterns = [
"feature/{feature-name}",
"hotfix/{bug-id}",
"main"
]
validation_rules = [
"max_length_50",
"lowercase_only",
"no_spaces",
"alphanumeric_dash_slash_only"
]
default_pattern = "feature/{feature-name}"

[project.template_settings]
ai_assistant = "claude"
template_cache_enabled = true

[project.template_settings.template_variables]
author_name = "Your Name"
author_email = "your.email@example.com"
default_license = "MIT"
EOF

Global Configuration Options​

Template Settings​

  • ai_assistant - Default AI assistant (claude, gemini, copilot)
  • config_directory - Default config directory name (.specify)
  • template_cache_enabled - Enable template caching (true/false)
  • custom_templates_dir - Path to custom templates directory
  • template_variables - Default template variables for all projects

Branch Naming​

  • patterns - Default branch naming patterns
  • validation_rules - Default validation rules
  • default_pattern - Default pattern to use
  • description - Description of the naming convention

Project Configuration​

Project configuration is stored in .specify/config.toml and overrides global settings.

Automatic Configuration​

When you run specifyx init, a project configuration is automatically created:

# Initialize with specific AI assistant
specifyx init my-project --ai claude

# Initialize in current directory
specifyx init --here --ai gemini

Manual Configuration​

You can manually edit .specify/config.toml in your project:

[project]
name = "my-special-project"
created_at = "2025-09-11T10:30:00"

[project.branch_naming]
description = "Project-specific branch naming"
patterns = [
"001-{feature-name}",
"hotfix-{bug-id}",
"main"
]
validation_rules = [
"max_length_60",
"lowercase_only",
"no_spaces",
"alphanumeric_dash_only"
]
default_pattern = "001-{feature-name}"

[project.template_settings]
ai_assistant = "copilot"
config_directory = ".specify"

[project.template_settings.template_variables]
project_type = "web-app"
framework = "react"
api_type = "rest"

Branch Naming Configuration​

SpecifyX provides powerful branch naming configuration with validation.

Predefined Patterns​

SpecifyX includes several predefined branch naming patterns:

Traditional Spec (traditional-spec)​

patterns = [
"{spec-id}-{feature-name}",
"hotfix/{bug-id}",
"main",
"development"
]

Branch Type (branch-type)​

patterns = [
"feature/{feature-name}",
"hotfix/{bug-id}",
"bugfix/{bug-id}",
"main",
"development"
]

Numbered Type (numbered-type)​

patterns = [
"feature/{spec-id}-{feature-name}",
"hotfix/{bug-id}",
"release/{version}",
"main",
"development"
]

Team Based (team-based)​

patterns = [
"{team}/{feature-name}",
"hotfix/{bug-id}",
"release/{version}",
"main",
"development"
]

No Branch (no-branch)​

patterns = [
"current" # Special pattern - stays on current branch
]
description = "Single-branch workflow - develop all features on current branch"

This pattern is ideal for teams that prefer to work on a single main branch without feature branching, simplifying the workflow for smaller teams or rapid prototyping.

No-Branch Workflow Usage:

# Initialize with no-branch pattern
specifyx init my-project --branch-pattern "no-branch"

# Create features without branching (creates meaningful directory names)
specifyx run create-feature "User authentication system" --no-branch
# Creates: specs/001-user-authentication-system/

# Work with specific specs using --spec-id
specifyx run setup-plan setup --spec-id 001
specifyx run generate-tasks --spec-id 001

When multiple specs exist on the main branch, commands will show helpful error messages with available options:

Multiple specs available on main branch. Specify which one to use:
specifyx run setup-plan --spec-id 001
specifyx run setup-plan --spec-id 002

Available specs:
001 - user-authentication-system
002 - payment-integration

Custom Patterns​

Create your own branch naming patterns using variables:

[project.branch_naming]
description = "Custom project patterns"
patterns = [
"task/{spec-id}-{feature-name}",
"epic/{epic-name}",
"spike/{research-topic}",
"fix/{bug-id}",
"chore/{task-name}",
"main",
"develop"
]

Pattern Variables​

Use these variables in your patterns:

  • {spec-id} - Specification ID (3-digit number), if input as number directly will be validated for availability; if input as xxx will be replaced with the next available spec id
  • {number} - Any length number
  • {number-3} - 3-digit number
  • {date} - Current date (YYYY-MM-DD)
  • {datetime} - Current datetime (YYYY-MM-DD-HHMMSS)

Anything other than the above (such as {feature-name}, {bug-id}, {version}, {team}, {epic-name}, {task-name}) is considered a generic string variable and will be passed to AI as description of the variable.

Validation Rules​

Control branch name format with validation rules:

Length Rules​

  • max_length_50 - Maximum 50 characters
  • max_length_X - Maximum X characters

Format Rules​

  • lowercase_only - Only lowercase letters allowed
  • no_spaces - No spaces allowed
  • alphanumeric_dash_only - Only letters, numbers, and dashes
  • alphanumeric_dash_slash_only - Letters, numbers, dashes, and slashes
  • no_leading_trailing_dashes - No dashes at start or end
  • no_double_dashes - No consecutive dashes
  • no_dots - No dots allowed
  • valid_git_branch - Follow Git branch naming rules

Example Configurations​

Minimal Configuration​

[project.branch_naming]
patterns = ["feature/{feature-name}", "main"]
validation_rules = ["lowercase_only", "no_spaces"]

Enterprise Configuration​

[project.branch_naming]
description = "Enterprise branch naming with strict validation"
patterns = [
"feature/{team}-{spec-id}-{feature-name}",
"hotfix/{team}-{bug-id}",
"release/{version}",
"main",
"development"
]
validation_rules = [
"max_length_80",
"lowercase_only",
"no_spaces",
"alphanumeric_dash_slash_only",
"no_leading_trailing_dashes",
"no_double_dashes",
"valid_git_branch"
]
default_pattern = "feature/{team}-{spec-id}-{feature-name}"

Template Configuration​

Configure how SpecifyX processes templates and generates project files.

Template Settings​

AI Assistant Integration​

[project.template_settings]
ai_assistant = "claude" # or "gemini", "copilot"

This controls which AI-specific templates and commands are generated.

Custom Templates Directory​

[project.template_settings]
custom_templates_dir = "/path/to/my/templates"

Point to a directory containing custom Jinja2 templates.

Template Caching​

[project.template_settings]
template_cache_enabled = true

Enable or disable template caching for better performance.

Template Variables​

Define variables that will be available in all templates:

[project.template_settings.template_variables]
company_name = "Acme Corporation"
author_name = "John Doe"
author_email = "john@acme.com"
default_license = "MIT"
project_type = "web-application"
framework = "react"
api_style = "rest"
database = "postgresql"
deployment_platform = "aws"
monitoring_tool = "datadog"

These variables can be used in any template:

# {{template_variables.project_type | title}} Project

**Company**: {{template_variables.company_name}}
**Framework**: {{template_variables.framework}}
**License**: {{template_variables.default_license}}

Configuration Examples​

Team Development Workflow​

[project]
name = "team-project"

[project.branch_naming]
description = "Team-based workflow with validation"
patterns = [
"feature/{team}-{feature-name}",
"bugfix/{team}-{bug-id}",
"hotfix/{bug-id}",
"release/{version}",
"main",
"develop"
]
validation_rules = [
"max_length_60",
"lowercase_only",
"no_spaces",
"alphanumeric_dash_slash_only"
]
default_pattern = "feature/{team}-{feature-name}"

[project.template_settings]
ai_assistant = "claude"

[project.template_settings.template_variables]
team_name = "backend-team"
project_type = "microservice"
tech_stack = "node-express-postgres"

Solo Developer Workflow​

[project]
name = "personal-project"

[project.branch_naming]
description = "Simple feature-based branches"
patterns = [
"feature/{feature-name}",
"fix/{bug-description}",
"main"
]
validation_rules = [
"max_length_50",
"lowercase_only",
"no_spaces",
"alphanumeric_dash_only"
]
default_pattern = "feature/{feature-name}"

[project.template_settings]
ai_assistant = "copilot"
template_cache_enabled = true

[project.template_settings.template_variables]
author_name = "Jane Developer"
default_license = "MIT"

Single Branch Workflow (No Branching)​

For teams that prefer to work directly on the main branch:

[project]
name = "simple-project"

[project.branch_naming]
description = "Single-branch development - no feature branches"
patterns = [
"current" # Stay on current branch for all development
]
validation_rules = [] # No validation needed
default_pattern = "current"

[project.template_settings]
ai_assistant = "claude"

[project.template_settings.template_variables]
workflow_type = "single-branch"
team_size = "small"

This configuration is ideal for:

  • Small teams or solo developers
  • Rapid prototyping projects
  • Simple applications with minimal complexity
  • Teams that prefer trunk-based development

Open Source Project​

[project]
name = "open-source-lib"

[project.branch_naming]
description = "Open source contribution workflow"
patterns = [
"feature/{spec-id}-{feature-name}",
"bugfix/{issue-number}",
"docs/{topic}",
"refactor/{component}",
"main",
"develop"
]
validation_rules = [
"max_length_80",
"lowercase_only",
"no_spaces",
"alphanumeric_dash_slash_only",
"valid_git_branch"
]
default_pattern = "feature/{spec-id}-{feature-name}"

[project.template_settings]
ai_assistant = "claude"

[project.template_settings.template_variables]
project_name = "awesome-lib"
license_type = "Apache-2.0"
maintainer_org = "my-org"

Next Steps​