Files
spec-kit/CHANGELOG.md
Manfred Riem bf33980426 feat(cli): embed core pack in wheel for offline/air-gapped deployment (#1803)
* feat(cli): embed core pack in wheel + offline-first init (#1711, #1752)

Bundle templates, commands, and scripts inside the specify-cli wheel so
that `specify init` works without any network access by default.

Changes:
- pyproject.toml: add hatchling force-include for core_pack assets; bump
  version to 0.2.1
- __init__.py: add _locate_core_pack(), _generate_agent_commands() (Python
  port of generate_commands() shell function), and scaffold_from_core_pack();
  modify init() to scaffold from bundled assets by default; add --from-github
  flag to opt back in to the GitHub download path
- release.yml: build wheel during CI release job
- create-github-release.sh: attach .whl as a release asset
- docs/installation.md: add Enterprise/Air-Gapped Installation section
- README.md: add Option 3 enterprise install with accurate offline story

Closes #1711
Addresses #1752

* fix(tests): update kiro alias test for offline-first scaffold path

* feat(cli): invoke bundled release script at runtime for offline scaffold

- Embed release scripts (bash + PowerShell) in wheel via pyproject.toml
- Replace Python _generate_agent_commands() with subprocess invocation of
  the canonical create-release-packages.sh, guaranteeing byte-for-byte
  parity between 'specify init --offline' and GitHub release ZIPs
- Fix macOS bash 3.2 compat in release script: replace cp --parents,
  local -n (nameref), and mapfile with POSIX-safe alternatives
- Fix _TOML_AGENTS: remove qwen (uses markdown per release script)
- Rename --from-github to --offline (opt-in to bundled assets)
- Add _locate_release_script() for cross-platform script discovery
- Update tests: remove bash 4+/GNU coreutils requirements, handle
  Kimi directory-per-skill layout, 576 tests passing
- Update CHANGELOG and docs/installation.md

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix(offline): error out if --offline fails instead of falling back to network

- _locate_core_pack() docstring now accurately describes that it only
  finds wheel-bundled core_pack/; source-checkout fallback lives in callers
- init() --offline + no bundled assets now exits with a clear error
  (previously printed a warning and silently fell back to GitHub download)
- init() scaffold failure under --offline now exits with an error
  instead of retrying via download_and_extract_template

Addresses reviewer comment: https://github.com/github/spec-kit/pull/1803

* fix(offline): address PR review comments

- fix(shell): harden validate_subset against glob injection in case patterns
- fix(shell): make GENRELEASES_DIR overridable via env var for test isolation
- fix(cli): probe pwsh then powershell on Windows instead of hardcoding pwsh
- fix(cli): remove unreachable fallback branch when --offline fails
- fix(cli): improve --offline error message with common failure causes
- fix(release): move wheel build step after create-release-packages.sh
- fix(docs): add --offline to installation.md air-gapped example
- fix(tests): remove unused genreleases_dir param from _run_release_script
- fix(tests): rewrite parity test to run one agent at a time with isolated
  temp dirs, preventing cross-agent interference from rm -rf

* fix(offline): address second round of review comments

- fix(shell): replace case-pattern membership with explicit loop + == check
  for unambiguous glob-safety in validate_subset()
- fix(cli): require pwsh (PowerShell 7) only; drop powershell (PS5) fallback
  since the bundled script uses #requires -Version 7.0
- fix(cli): add bash and zip preflight checks in scaffold_from_core_pack()
  with clear error messages if either is missing
- fix(build): list individual template files in pyproject.toml force-include
  to avoid duplicating templates/commands/ in the wheel

* fix(offline): address third round of review comments

- Add 120s timeout to subprocess.run in scaffold_from_core_pack to prevent
  indefinite hangs during offline scaffolding
- Add test_pyproject_force_include_covers_all_templates to catch missing
  template files in wheel bundling
- Tighten kiro alias test to assert specific scaffold path (download vs offline)

* fix(offline): address Copilot review round 4

- fix(offline): use handle_vscode_settings() merge for --here --offline
  to prevent data loss on existing .vscode/settings.json
- fix(release): glob wheel filename in create-github-release.sh instead
  of hardcoding version, preventing upload failures on version mismatch
- docs(release): add comment noting pyproject.toml version is synced by
  release-trigger.yml before the tag is pushed

* fix(offline): address review round 5 + offline bundle ZIP

- fix(offline): pwsh-only, no powershell.exe fallback; clarify error message
- fix(offline): tighten _has_bundled to check scripts dir for source checkouts
- feat(release): build specify-bundle-v*.zip with all deps at release time
- feat(release): attach offline bundle ZIP to GitHub release assets
- docs: simplify air-gapped install to single ZIP download from releases
- docs: add Windows PowerShell 7+ (pwsh) requirement note

* fix(tests): session-scoped scaffold cache + timeout + dead code removal

- Add timeout=300 and returncode check to _run_release_script() to fail
  fast with clear output on script hangs or failures
- Remove unused import specify_cli, _SOURCE_TEMPLATES, bundled_project fixture
- Add session-scoped scaffolded_sh/scaffolded_ps fixtures that scaffold
  once per agent and reuse the output directory across all invariant tests
- Reduces test_core_pack_scaffold runtime from ~175s to ~51s (3.4x faster)
- Parity tests still scaffold independently for isolation

* fix(offline): remove wheel from release, update air-gapped docs to use pip download

* fix(tests): handle codex skills layout and iflow agent in scaffold tests

Codex now uses create_skills() with hyphenated separator (speckit-plan/SKILL.md)
instead of generate_commands(). Update _SKILL_AGENTS, _expected_ext, and
_list_command_files to handle both codex ('-') and kimi ('.') skill agents.
Also picks up iflow as a new testable agent automatically via AGENT_CONFIG.

* fix(offline): require wheel core_pack for --offline, remove source-checkout fallback

--offline now strictly requires _locate_core_pack() to find the wheel's
bundled core_pack/ directory. Source-checkout fallbacks are no longer
accepted at the init() level — if core_pack/ is missing, the CLI errors
out with a clear message pointing to the installation docs.

scaffold_from_core_pack() retains its internal source-checkout fallbacks
so parity tests can call it directly from a source checkout.

* fix(offline): remove stale [Unreleased] CHANGELOG section, scope httpx.Client to download path

- Remove entire [Unreleased] section — CHANGELOG is auto-generated at release
- Move httpx.Client into use_github branch with context manager so --offline
  path doesn't allocate an unused network client

* fix(offline): remove dead --from-github flag, fix typer.Exit handling, add page templates validation

- Remove unused --from-github CLI option and docstring example
- Add (typer.Exit, SystemExit) re-raise before broad except Exception
  to prevent duplicate error panel on offline scaffold failure
- Validate page templates directory exists in scaffold_from_core_pack()
  to fail fast on incomplete wheel installs
- Fix ruff lint: remove unused shutil import, remove f-prefix on
  strings without placeholders in test_core_pack_scaffold.py

* docs(offline): add v0.6.0 deprecation notice with rationale

- Help text: note bundled assets become default in v0.6.0
- Docstring: explain why GitHub download is being retired (no network
  dependency, no proxy/firewall issues, guaranteed version match)
- Runtime nudge: when bundled assets are available but user takes the
  GitHub download path, suggest --offline with rationale
- docs/installation.md: add deprecation notice with full rationale

* fix(offline): allow --offline in source checkouts, fix CHANGELOG truncation

- Simplify use_github logic: use_github = not offline (let
  scaffold_from_core_pack handle fallback to source-checkout paths)
- Remove hard-fail when core_pack/ is absent — scaffold_from_core_pack
  already falls back to repo-root templates/scripts/commands
- Fix truncated 'skill…' → 'skills' in CHANGELOG.md

* fix(offline): sandbox GENRELEASES_DIR and clean up on failure

- Pin GENRELEASES_DIR to temp dir in scaffold_from_core_pack() so a
  user-exported value cannot redirect output or cause rm -rf outside
  the sandbox
- Clean up partial project directory on --offline scaffold failure
  (same behavior as the GitHub-download failure path)

* fix(tests): use shutil.which for bash discovery, add ps parity tests

- _find_bash() now tries shutil.which('bash') first so non-standard
  install locations (Nix, custom CI images) are found
- Parametrize parity test over both 'sh' and 'ps' script types to
  ensure PowerShell variant stays byte-for-byte identical to release
  script output (353 scaffold tests, 810 total)

* fix(tests): parse pyproject.toml with tomllib, remove unused fixture

- Use tomllib to parse force-include keys from the actual TOML table
  instead of raw substring search (avoids false positives)
- Remove unused source_template_stems fixture from
  test_scaffold_command_dir_location

* fix: guard GENRELEASES_DIR against unsafe values, update docstring

- Add safety check in create-release-packages.sh: reject empty, '/',
  '.', '..' values for GENRELEASES_DIR before rm -rf
- Strip trailing slash to avoid path surprises
- Update scaffold_from_core_pack() docstring to accurately describe
  all failure modes (not just 'assets not found')

* fix: harden GENRELEASES_DIR guard, cache parity tests, safe iterdir

- Reject '..' path segments in GENRELEASES_DIR to prevent traversal
- Session-cache both scaffold and release-script results in parity
  tests — runtime drops from ~74s to ~45s (40% faster)
- Guard cmd_dir.iterdir() in assertion message against missing dirs

* fix(tests): exclude YAML frontmatter source metadata from path rewrite check

The codex and kimi SKILL.md files have 'source: templates/commands/...'
in their YAML frontmatter — this is provenance metadata, not a runtime
path that needs rewriting. Strip frontmatter before checking for bare
scripts/ and templates/ paths.

* fix(offline): surface scaffold failure detail in error output

When --offline scaffold fails, look up the tracker's 'scaffold' step
detail and print it alongside the generic error message so users see
the specific root cause (e.g. missing zip/pwsh, script stderr).

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-20 14:46:48 -05:00

14 KiB

Changelog

[0.3.2] - 2026-03-19

Changes

  • chore: bump version to 0.3.2
  • Add conduct extension to community catalog (#1908)
  • feat(extensions): add verify-tasks extension to community catalog (#1871)
  • feat(presets): add enable/disable toggle and update semantics (#1891)
  • feat: add iFlow CLI support (#1875)
  • feat(commands): wire before/after hook events into specify and plan templates (#1886)
  • docs(catalog): add speckit-utils to community catalog (#1896)
  • docs: Add Extensions & Presets section to README (#1898)
  • chore: update DocGuard extension to v0.9.11 (#1899)
  • Update cognitive-squad catalog entry — Triadic Model, full lifecycle (#1884)
  • feat: register spec-kit-iterate extension (#1887)
  • fix(scripts): add explicit positional binding to PowerShell create-new-feature params (#1885)
  • fix(scripts): encode residual JSON control chars as \uXXXX instead of stripping (#1872)
  • chore: update DocGuard extension to v0.9.10 (#1890)
  • Feature/spec kit add pi coding agent pullrequest (#1853)
  • feat: register spec-kit-learn extension (#1883)

[0.3.1] - 2026-03-17

Changed

  • chore: bump version to 0.3.1
  • docs: add greenfield Spring Boot pirate-speak preset demo to README (#1878)
  • fix(ai-skills): exclude non-speckit copilot agent markdown from skills (#1867)
  • feat: add Trae IDE support as a new agent (#1817)
  • feat(cli): polite deep merge for settings.json and support JSONC (#1874)
  • feat(extensions,presets): add priority-based resolution ordering (#1855)
  • fix(scripts): suppress stdout from git fetch in create-new-feature.sh (#1876)
  • fix(scripts): harden bash scripts — escape, compat, and error handling (#1869)
  • Add cognitive-squad to community extension catalog (#1870)
  • docs: add Go / React brownfield walkthrough to community walkthroughs (#1868)
  • chore: update DocGuard extension to v0.9.8 (#1859)
  • Feature: add specify status command (#1837)
  • fix(extensions): show extension ID in list output (#1843)
  • feat(extensions): add Archive and Reconcile extensions to community catalog (#1844)
  • feat: Add DocGuard CDD enforcement extension to community catalog (#1838)

[0.3.0] - 2026-03-13

Changed

  • chore: bump version to 0.3.0
  • feat(presets): Pluggable preset system with catalog, resolver, and skills propagation (#1787)
  • fix: match 'Last updated' timestamp with or without bold markers (#1836)
  • Add specify doctor command for project health diagnostics (#1828)
  • fix: harden bash scripts against shell injection and improve robustness (#1809)
  • fix: clean up command templates (specify, analyze) (#1810)
  • fix: migrate Qwen Code CLI from TOML to Markdown format (#1589) (#1730)
  • fix(cli): deprecate explicit command support for agy (#1798) (#1808)
  • Add /selftest.extension core extension to test other extensions (#1758)
  • feat(extensions): Quality of life improvements for RFC-aligned catalog integration (#1776)
  • Add Java brownfield walkthrough to community walkthroughs (#1820)

[0.2.1] - 2026-03-11

Changed

  • Added February 2026 newsletter (#1812)
  • feat: add Kimi Code CLI agent support (#1790)
  • docs: fix broken links in quickstart guide (#1759) (#1797)
  • docs: add catalog cli help documentation (#1793) (#1794)
  • fix: use quiet checkout to avoid exception on git checkout (#1792)
  • feat(extensions): support .extensionignore to exclude files during install (#1781)
  • feat: add Codex support for extension command registration (#1767)
  • chore: bump version to 0.2.0 (#1786)
  • fix: sync agent list comments with actual supported agents (#1785)
  • feat(extensions): support multiple active catalogs simultaneously (#1720)
  • Pavel/add tabnine cli support (#1503)
  • Add Understanding extension to community catalog (#1778)
  • Add ralph extension to community catalog (#1780)
  • Update README with project initialization instructions (#1772)
  • feat: add review extension to community catalog (#1775)
  • Add fleet extension to community catalog (#1771)
  • Integration of Mistral vibe support into speckit (#1725)
  • fix: Remove duplicate options in specify.md (#1765)
  • fix: use global branch numbering instead of per-short-name detection (#1757)
  • Add Community Walkthroughs section to README (#1766)
  • feat(extensions): add Jira Integration to community catalog (#1764)
  • Add Azure DevOps Integration extension to community catalog (#1734)
  • Fix docs: update Antigravity link and add initialization example (#1748)
  • fix: wire after_tasks and after_implement hook events into command templates (#1702)
  • make c ignores consistent with c++ (#1747)
  • chore: bump version to 0.1.13 (#1746)
  • feat: add kiro-cli and AGENT_CONFIG consistency coverage (#1690)
  • feat: add verify extension to community catalog (#1726)
  • Add Retrospective Extension to community catalog README table (#1741)
  • fix(scripts): add empty description validation and branch checkout error handling (#1559)
  • fix: correct Copilot extension command registration (#1724)
  • fix(implement): remove Makefile from C ignore patterns (#1558)
  • Add sync extension to community catalog (#1728)
  • fix(checklist): clarify file handling behavior for append vs create (#1556)
  • fix(clarify): correct conflicting question limit from 10 to 5 (#1557)
  • chore: bump version to 0.1.12 (#1737)
  • fix: use RELEASE_PAT so tag push triggers release workflow (#1736)
  • fix: release-trigger uses release branch + PR instead of direct push to main (#1733)
  • fix: Split release process to sync pyproject.toml version with git tags (#1732)

[0.2.0] - 2026-03-09

Changed

  • feat: add Kimi Code CLI agent support
  • fix: sync agent list comments with actual supported agents (#1785)
  • feat(extensions): support multiple active catalogs simultaneously (#1720)
  • Pavel/add tabnine cli support (#1503)
  • Add Understanding extension to community catalog (#1778)
  • Add ralph extension to community catalog (#1780)
  • Update README with project initialization instructions (#1772)
  • feat: add review extension to community catalog (#1775)
  • Add fleet extension to community catalog (#1771)
  • Integration of Mistral vibe support into speckit (#1725)
  • fix: Remove duplicate options in specify.md (#1765)
  • fix: use global branch numbering instead of per-short-name detection (#1757)
  • Add Community Walkthroughs section to README (#1766)
  • feat(extensions): add Jira Integration to community catalog (#1764)
  • Add Azure DevOps Integration extension to community catalog (#1734)
  • Fix docs: update Antigravity link and add initialization example (#1748)
  • fix: wire after_tasks and after_implement hook events into command templates (#1702)
  • make c ignores consistent with c++ (#1747)
  • chore: bump version to 0.1.13 (#1746)
  • feat: add kiro-cli and AGENT_CONFIG consistency coverage (#1690)
  • feat: add verify extension to community catalog (#1726)
  • Add Retrospective Extension to community catalog README table (#1741)
  • fix(scripts): add empty description validation and branch checkout error handling (#1559)
  • fix: correct Copilot extension command registration (#1724)
  • fix(implement): remove Makefile from C ignore patterns (#1558)
  • Add sync extension to community catalog (#1728)
  • fix(checklist): clarify file handling behavior for append vs create (#1556)
  • fix(clarify): correct conflicting question limit from 10 to 5 (#1557)
  • chore: bump version to 0.1.12 (#1737)
  • fix: use RELEASE_PAT so tag push triggers release workflow (#1736)
  • fix: release-trigger uses release branch + PR instead of direct push to main (#1733)
  • fix: Split release process to sync pyproject.toml version with git tags (#1732)

[0.1.14] - 2026-03-09

Added

  • feat: add Tabnine CLI agent support
  • Multi-Catalog Support (#1707): Extension catalog system now supports multiple active catalogs simultaneously via a catalog stack
    • New specify extension catalog list command lists all active catalogs with name, URL, priority, and install_allowed status
    • New specify extension catalog add and specify extension catalog remove commands for project-scoped catalog management
    • Default built-in stack includes catalog.json (default, installable) and catalog.community.json (community, discovery only) — community extensions are now surfaced in search results out of the box
    • specify extension search aggregates results across all active catalogs, annotating each result with source catalog
    • specify extension add enforces install_allowed policy — extensions from discovery-only catalogs cannot be installed directly
    • Project-level .specify/extension-catalogs.yml and user-level ~/.specify/extension-catalogs.yml config files supported, with project-level taking precedence
    • SPECKIT_CATALOG_URL environment variable still works for backward compatibility (replaces full stack with single catalog)
    • All catalog URLs require HTTPS (HTTP allowed for localhost development)
    • New CatalogEntry dataclass in extensions.py for catalog stack representation
    • Per-URL hash-based caching for non-default catalogs; legacy cache preserved for default catalog
    • Higher-priority catalogs win on merge conflicts (same extension id in multiple catalogs)
    • 13 new tests covering catalog stack resolution, merge conflicts, URL validation, and install_allowed enforcement
    • Updated RFC, Extension User Guide, and Extension API Reference documentation

[0.1.13] - 2026-03-03

Changed

  • feat: add kiro-cli and AGENT_CONFIG consistency coverage (#1690)
  • feat: add verify extension to community catalog (#1726)
  • Add Retrospective Extension to community catalog README table (#1741)
  • fix(scripts): add empty description validation and branch checkout error handling (#1559)
  • fix: correct Copilot extension command registration (#1724)
  • fix(implement): remove Makefile from C ignore patterns (#1558)
  • Add sync extension to community catalog (#1728)
  • fix(checklist): clarify file handling behavior for append vs create (#1556)
  • fix(clarify): correct conflicting question limit from 10 to 5 (#1557)
  • chore: bump version to 0.1.12 (#1737)
  • fix: use RELEASE_PAT so tag push triggers release workflow (#1736)
  • fix: release-trigger uses release branch + PR instead of direct push to main (#1733)
  • fix: Split release process to sync pyproject.toml version with git tags (#1732)

[0.1.13] - 2026-03-03

Fixed

  • Copilot Extension Commands Not Visible: Fixed extension commands not appearing in GitHub Copilot when installed via specify extension add --dev
    • Changed Copilot file extension from .md to .agent.md in CommandRegistrar.AGENT_CONFIGS so Copilot recognizes agent files
    • Added generation of companion .prompt.md files in .github/prompts/ during extension command registration, matching the release packaging behavior
    • Added cleanup of .prompt.md companion files when removing extensions via specify extension remove
  • Fixed a syntax regression in src/specify_cli/__init__.py in _build_ai_assistant_help() that broke ruff and pytest collection in CI.

[0.1.12] - 2026-03-02

Changed

  • fix: use RELEASE_PAT so tag push triggers release workflow (#1736)
  • fix: release-trigger uses release branch + PR instead of direct push to main (#1733)
  • fix: Split release process to sync pyproject.toml version with git tags (#1732)

[0.1.10] - 2026-03-02

Fixed

  • Version Sync Issue (#1721): Fixed version mismatch between pyproject.toml and git release tags
    • Split release process into two workflows: release-trigger.yml for version management and release.yml for artifact building
    • Version bump now happens BEFORE tag creation, ensuring tags point to commits with correct version
    • Supports both manual version specification and auto-increment (patch version)
    • Git tags now accurately reflect the version in pyproject.toml at that commit
    • Prevents confusion when installing from source

[0.1.9] - 2026-02-28

Changed

  • Updated dependency: bumped astral-sh/setup-uv from 6 to 7

[0.1.8] - 2026-02-28

Changed

  • Updated dependency: bumped actions/setup-python from 5 to 6

[0.1.7] - 2026-02-27

Changed

  • Updated outdated GitHub Actions versions
  • Documented dual-catalog system for extensions

Fixed

  • Fixed version command in documentation

Added

  • Added Cleanup Extension to README
  • Added retrospective extension to community catalog

[0.1.6] - 2026-02-23

Fixed

  • Parameter Ordering Issues (#1641): Fixed CLI parameter parsing issue where option flags were incorrectly consumed as values for preceding options
    • Added validation to detect when --ai or --ai-commands-dir incorrectly consume following flags like --here or --ai-skills
    • Now provides clear error messages: "Invalid value for --ai: '--here'"
    • Includes helpful hints suggesting proper usage and listing available agents
    • Commands like specify init --ai-skills --ai --here now fail with actionable feedback instead of confusing "Must specify project name" errors
    • Added comprehensive test suite (5 new tests) to prevent regressions

[0.1.5] - 2026-02-21

Fixed

  • AI Skills Installation Bug (#1658): Fixed --ai-skills flag not generating skill files for GitHub Copilot and other agents with non-standard command directory structures
    • Added commands_subdir field to AGENT_CONFIG to explicitly specify the subdirectory name for each agent
    • Affected agents now work correctly: copilot (.github/agents/), opencode (.opencode/command/), windsurf (.windsurf/workflows/), codex (.codex/prompts/), kilocode (.kilocode/workflows/), q (.amazonq/prompts/), and agy (.agent/workflows/)
    • The install_ai_skills() function now uses the correct path for all agents instead of assuming commands/ for everyone

[0.1.4] - 2026-02-20

Fixed

  • Qoder CLI detection: Renamed AGENT_CONFIG key from "qoder" to "qodercli" to match the actual executable name, fixing specify check and specify init --ai detection failures

[0.1.3] - 2026-02-20

Added

  • Generic Agent Support: Added --ai generic option for unsupported AI agents ("bring your own agent")
    • Requires --ai-commands-dir <path> to specify where the agent reads commands from
    • Generates Markdown commands with $ARGUMENTS format (compatible with most agents)
    • Example: specify init my-project --ai generic --ai-commands-dir .myagent/commands/
    • Enables users to start with Spec Kit immediately while their agent awaits formal support

[0.0.102] - 2026-02-20

  • fix: include 'src/**' path in release workflow triggers (#1646)

[0.0.101] - 2026-02-19

  • chore(deps): bump github/codeql-action from 3 to 4 (#1635)

[0.0.100] - 2026-02-19

  • Add pytest and Python linting (ruff) to CI (#1637)
  • feat: add pull request template for better contribution guidelines (#1634)