From 68eba52a40a0e424f152d583e41d6227a3e4909b Mon Sep 17 00:00:00 2001 From: Bruno Borges Date: Wed, 24 Sep 2025 22:41:50 -0700 Subject: [PATCH 1/3] feat: support 'specify init .' for current directory initialization Adds '.' as shorthand equivalent to --here flag while maintaining full backward compatibility. Updates documentation and bumps to v0.0.18. --- CHANGELOG.md | 6 ++++++ README.md | 17 +++++++++++++++-- docs/installation.md | 2 ++ src/specify_cli/__init__.py | 15 ++++++++++++--- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92cb0b8..d9485cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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/), 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 ### Added diff --git a/README.md b/README.md index 226da68..f62e6d7 100644 --- a/README.md +++ b/README.md @@ -150,13 +150,13 @@ The `specify` command supports the following options: | Argument/Option | Type | Description | |------------------------|----------|------------------------------------------------------------------------------| -| `` | Argument | Name for your new project directory (optional if using `--here`) | +| `` | 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` | | `--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 | | `--no-git` | Flag | Skip git repository initialization | | `--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) | | `--debug` | Flag | Enable detailed debug output for troubleshooting | | `--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 # Initialize in current directory +specify init . --ai copilot +# or use the --here flag specify init --here --ai copilot # Force merge into current (non-empty) directory without confirmation +specify init . --force --ai copilot +# or specify init --here --force --ai copilot # Skip git initialization @@ -292,8 +296,12 @@ specify init Or initialize in the current directory: ```bash +specify init . +# or use the --here flag specify init --here # Skip confirmation when the directory already has files +specify init . --force +# or specify init --here --force ``` @@ -311,9 +319,14 @@ specify init --ai opencode specify init --ai codex specify init --ai windsurf # 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 codex # Force merge into a non-empty current directory +specify init . --force --ai claude +# or specify init --here --force --ai claude ``` diff --git a/docs/installation.md b/docs/installation.md index 7cf9a6a..b30b094 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -21,6 +21,8 @@ uvx --from git+https://github.com/github/spec-kit.git specify init + uvx specify-cli.py init . uvx specify-cli.py init --here Or install globally: uv tool install --from specify-cli.py specify-cli specify init + specify init . specify init --here """ @@ -747,7 +749,7 @@ def ensure_executable_scripts(project_path: Path, tracker: StepTracker | None = @app.command() 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"), 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"), @@ -781,7 +783,9 @@ def init( specify init my-project --ai windsurf specify init my-project --ai auggie 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 specify init --here --force # Skip confirmation when current directory not empty @@ -789,13 +793,18 @@ def init( # Show banner first show_banner() + # Handle '.' as shorthand for current directory (equivalent to --here) + if project_name == ".": + here = True + project_name = None # Clear it so validation logic works correctly + # Validate arguments if here and project_name: console.print("[red]Error:[/red] Cannot specify both project name and --here flag") raise typer.Exit(1) 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) # Determine project directory From eb3c63fe0fe143a93c5c021b8b92268e6ed206a9 Mon Sep 17 00:00:00 2001 From: Bruno Borges Date: Wed, 24 Sep 2025 23:22:15 -0700 Subject: [PATCH 2/3] Update src/specify_cli/__init__.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/specify_cli/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index 36b7418..6ce0fdb 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -796,7 +796,7 @@ def init( # Handle '.' as shorthand for current directory (equivalent to --here) if project_name == ".": here = True - project_name = None # Clear it so validation logic works correctly + project_name = None # This transformation allows the existing validation logic to work unchanged, since it was designed to handle the case where here=True and project_name=None. # Validate arguments if here and project_name: From 8bbacd4adba5b110d87cbb4f1a545e084b063a9e Mon Sep 17 00:00:00 2001 From: Bruno Borges Date: Thu, 25 Sep 2025 11:16:05 -0700 Subject: [PATCH 3/3] Update src/specify_cli/__init__.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/specify_cli/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index 6ce0fdb..ef7ab15 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -796,7 +796,7 @@ def init( # Handle '.' as shorthand for current directory (equivalent to --here) if project_name == ".": here = True - project_name = None # This transformation allows the existing validation logic to work unchanged, since it was designed to handle the case where here=True and project_name=None. + project_name = None # Clear project_name to use existing validation logic # Validate arguments if here and project_name: