diff --git a/CHANGELOG.md b/CHANGELOG.md index ac16106..65eaab5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,13 +5,19 @@ 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). -## [0.0.10] - 2025-09-20 +## [0.0.11] - 2025-09-20 ### Added -- Codex CLI support across the Specify CLI, documentation, and bootstrap scripts, including automatic slash-command provisioning and prompt mirroring into `${CODEX_HOME:-~/.codex}/prompts`. +- Codex CLI support (thank you [@honjo-hiroaki-gtt](https://github.com/honjo-hiroaki-gtt) for the contribution in [#14](https://github.com/github/spec-kit/pull/14)) - Codex-aware context update tooling (Bash and PowerShell) so feature plans refresh `AGENTS.md` alongside existing assistants without manual edits. +## [0.0.10] - 2025-09-20 + +### Fixed + +- Addressed [#378](https://github.com/github/spec-kit/issues/378) where a GitHub token may be attached to the request when it was empty. + ## [0.0.9] - 2025-09-19 ### Changed @@ -23,7 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Windsurf IDE support as additional AI assistant option -- GitHub token support for API requests to handle corporate environments and rate limiting (contributed by @zryfish in #243) +- GitHub token support for API requests to handle corporate environments and rate limiting (contributed by [@zryfish](https://github.com/@zryfish) in [#243](https://github.com/github/spec-kit/pull/243)) ### Changed diff --git a/pyproject.toml b/pyproject.toml index f5853a7..bac1910 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "specify-cli" -version = "0.0.9" +version = "0.0.10" description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)." requires-python = ">=3.11" dependencies = [ diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index da903c6..e026104 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -53,17 +53,13 @@ ssl_context = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) client = httpx.Client(verify=ssl_context) def _github_token(cli_token: str | None = None) -> str | None: - return cli_token or os.getenv("GH_TOKEN") or os.getenv("GITHUB_TOKEN") + """Return sanitized GitHub token (cli arg takes precedence) or None.""" + return ((cli_token or os.getenv("GH_TOKEN") or os.getenv("GITHUB_TOKEN") or "").strip()) or None def _github_auth_headers(cli_token: str | None = None) -> dict: - """Headers for GitHub REST API requests. - - Uses Bearer auth if token present - """ - headers = {} + """Return Authorization header dict only when a non-empty token exists.""" token = _github_token(cli_token) - if token: - headers["Authorization"] = f"Bearer {token}" - return headers + return {"Authorization": f"Bearer {token}"} if token else {} # Constants AI_CHOICES = { @@ -598,7 +594,7 @@ def download_template_from_github(ai_assistant: str, download_dir: Path, *, scri api_url, timeout=30, follow_redirects=True, - headers=_github_auth_headers(github_token) or None, + headers=_github_auth_headers(github_token), ) status = response.status_code if status != 200: @@ -667,7 +663,7 @@ def download_template_from_github(ai_assistant: str, download_dir: Path, *, scri download_url, timeout=60, follow_redirects=True, - headers=_github_auth_headers(github_token) or None, + headers=_github_auth_headers(github_token), ) as response: if response.status_code != 200: body_sample = response.text[:400]