Merge pull request #570 from brunoborges/specify_init_period

feat: support 'specify init .' for current directory initialization
This commit is contained in:
Den Delimarsky
2025-09-25 12:50:17 -07:00
committed by GitHub
4 changed files with 35 additions and 5 deletions

View File

@@ -7,6 +7,12 @@ All notable changes to the Specify CLI will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [LATEST_VERSION] - RELEASE_DATE
### Added
- Support for using `.` as a shorthand for current directory in `specify init .` command, equivalent to `--here` flag but more intuitive for users
## [0.0.17] - 2025-09-22 ## [0.0.17] - 2025-09-22
### Added ### Added

View File

@@ -150,13 +150,13 @@ The `specify` command supports the following options:
| Argument/Option | Type | Description | | Argument/Option | Type | Description |
|------------------------|----------|------------------------------------------------------------------------------| |------------------------|----------|------------------------------------------------------------------------------|
| `<project-name>` | Argument | Name for your new project directory (optional if using `--here`) | | `<project-name>` | Argument | Name for your new project directory (optional if using `--here`, or use `.` for current directory) |
| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, or `roo` | | `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, or `roo` |
| `--script` | Option | Script variant to use: `sh` (bash/zsh) or `ps` (PowerShell) | | `--script` | Option | Script variant to use: `sh` (bash/zsh) or `ps` (PowerShell) |
| `--ignore-agent-tools` | Flag | Skip checks for AI agent tools like Claude Code | | `--ignore-agent-tools` | Flag | Skip checks for AI agent tools like Claude Code |
| `--no-git` | Flag | Skip git repository initialization | | `--no-git` | Flag | Skip git repository initialization |
| `--here` | Flag | Initialize project in the current directory instead of creating a new one | | `--here` | Flag | Initialize project in the current directory instead of creating a new one |
| `--force` | Flag | Force merge/overwrite when using `--here` in a non-empty directory (skip confirmation) | | `--force` | Flag | Force merge/overwrite when initializing in current directory (skip confirmation) |
| `--skip-tls` | Flag | Skip SSL/TLS verification (not recommended) | | `--skip-tls` | Flag | Skip SSL/TLS verification (not recommended) |
| `--debug` | Flag | Enable detailed debug output for troubleshooting | | `--debug` | Flag | Enable detailed debug output for troubleshooting |
| `--github-token` | Option | GitHub token for API requests (or set GH_TOKEN/GITHUB_TOKEN env variable) | | `--github-token` | Option | GitHub token for API requests (or set GH_TOKEN/GITHUB_TOKEN env variable) |
@@ -180,9 +180,13 @@ specify init my-project --ai windsurf
specify init my-project --ai copilot --script ps specify init my-project --ai copilot --script ps
# Initialize in current directory # Initialize in current directory
specify init . --ai copilot
# or use the --here flag
specify init --here --ai copilot specify init --here --ai copilot
# Force merge into current (non-empty) directory without confirmation # Force merge into current (non-empty) directory without confirmation
specify init . --force --ai copilot
# or
specify init --here --force --ai copilot specify init --here --force --ai copilot
# Skip git initialization # Skip git initialization
@@ -292,8 +296,12 @@ specify init <project_name>
Or initialize in the current directory: Or initialize in the current directory:
```bash ```bash
specify init .
# or use the --here flag
specify init --here specify init --here
# Skip confirmation when the directory already has files # Skip confirmation when the directory already has files
specify init . --force
# or
specify init --here --force specify init --here --force
``` ```
@@ -311,9 +319,14 @@ specify init <project_name> --ai opencode
specify init <project_name> --ai codex specify init <project_name> --ai codex
specify init <project_name> --ai windsurf specify init <project_name> --ai windsurf
# Or in current directory: # Or in current directory:
specify init . --ai claude
specify init . --ai codex
# or use --here flag
specify init --here --ai claude specify init --here --ai claude
specify init --here --ai codex specify init --here --ai codex
# Force merge into a non-empty current directory # Force merge into a non-empty current directory
specify init . --force --ai claude
# or
specify init --here --force --ai claude specify init --here --force --ai claude
``` ```

View File

@@ -21,6 +21,8 @@ uvx --from git+https://github.com/github/spec-kit.git specify init <PROJECT_NAME
Or initialize in the current directory: Or initialize in the current directory:
```bash ```bash
uvx --from git+https://github.com/github/spec-kit.git specify init .
# or use the --here flag
uvx --from git+https://github.com/github/spec-kit.git specify init --here uvx --from git+https://github.com/github/spec-kit.git specify init --here
``` ```

View File

@@ -14,11 +14,13 @@ Specify CLI - Setup tool for Specify projects
Usage: Usage:
uvx specify-cli.py init <project-name> uvx specify-cli.py init <project-name>
uvx specify-cli.py init .
uvx specify-cli.py init --here uvx specify-cli.py init --here
Or install globally: Or install globally:
uv tool install --from specify-cli.py specify-cli uv tool install --from specify-cli.py specify-cli
specify init <project-name> specify init <project-name>
specify init .
specify init --here specify init --here
""" """
@@ -747,7 +749,7 @@ def ensure_executable_scripts(project_path: Path, tracker: StepTracker | None =
@app.command() @app.command()
def init( def init(
project_name: str = typer.Argument(None, help="Name for your new project directory (optional if using --here)"), project_name: str = typer.Argument(None, help="Name for your new project directory (optional if using --here, or use '.' for current directory)"),
ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor, qwen, opencode, codex, windsurf, kilocode, or auggie"), ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor, qwen, opencode, codex, windsurf, kilocode, or auggie"),
script_type: str = typer.Option(None, "--script", help="Script type to use: sh or ps"), script_type: str = typer.Option(None, "--script", help="Script type to use: sh or ps"),
ignore_agent_tools: bool = typer.Option(False, "--ignore-agent-tools", help="Skip checks for AI agent tools like Claude Code"), ignore_agent_tools: bool = typer.Option(False, "--ignore-agent-tools", help="Skip checks for AI agent tools like Claude Code"),
@@ -781,7 +783,9 @@ def init(
specify init my-project --ai windsurf specify init my-project --ai windsurf
specify init my-project --ai auggie specify init my-project --ai auggie
specify init --ignore-agent-tools my-project specify init --ignore-agent-tools my-project
specify init --here --ai claude specify init . --ai claude # Initialize in current directory
specify init . # Initialize in current directory (interactive AI selection)
specify init --here --ai claude # Alternative syntax for current directory
specify init --here --ai codex specify init --here --ai codex
specify init --here specify init --here
specify init --here --force # Skip confirmation when current directory not empty specify init --here --force # Skip confirmation when current directory not empty
@@ -789,13 +793,18 @@ def init(
# Show banner first # Show banner first
show_banner() show_banner()
# Handle '.' as shorthand for current directory (equivalent to --here)
if project_name == ".":
here = True
project_name = None # Clear project_name to use existing validation logic
# Validate arguments # Validate arguments
if here and project_name: if here and project_name:
console.print("[red]Error:[/red] Cannot specify both project name and --here flag") console.print("[red]Error:[/red] Cannot specify both project name and --here flag")
raise typer.Exit(1) raise typer.Exit(1)
if not here and not project_name: if not here and not project_name:
console.print("[red]Error:[/red] Must specify either a project name or use --here flag") console.print("[red]Error:[/red] Must specify either a project name, use '.' for current directory, or use --here flag")
raise typer.Exit(1) raise typer.Exit(1)
# Determine project directory # Determine project directory