diff --git a/.github/workflows/homebrew-package-publish.yml b/.github/workflows/homebrew-package-publish.yml index 83bc9be..d78ea52 100644 --- a/.github/workflows/homebrew-package-publish.yml +++ b/.github/workflows/homebrew-package-publish.yml @@ -6,7 +6,7 @@ on: version: description: "Release version without the leading v" required: true - default: "0.1.2" + default: "0.1.3" push: tags: - "v*" diff --git a/.github/workflows/python-package-publish.yml b/.github/workflows/python-package-publish.yml index bb8cd37..4be916a 100644 --- a/.github/workflows/python-package-publish.yml +++ b/.github/workflows/python-package-publish.yml @@ -43,7 +43,9 @@ jobs: - name: Build devspec framework payload zip run: | zip -r "dist/devspec-framework-payload-${GITHUB_REF_NAME:-local}.zip" \ - AGENTS.md GEMINI.md README.md devspec .github .claude .cursor .gemini .agents packaging/devspec-profiles.json + AGENTS.md GEMINI.md README.md devspec \ + .github/prompts .github/agents .github/skills \ + .claude .cursor .gemini .agents packaging/devspec-profiles.json find dist -maxdepth 1 -type f ! -name devspec-python-package-checksums.txt -print0 \ | sort -z \ | xargs -0 sha256sum > dist/devspec-python-package-checksums.txt diff --git a/.github/workflows/winget-package-publish.yml b/.github/workflows/winget-package-publish.yml index c8b4cf4..f4e97dd 100644 --- a/.github/workflows/winget-package-publish.yml +++ b/.github/workflows/winget-package-publish.yml @@ -75,7 +75,7 @@ jobs: shell: pwsh run: | $ErrorActionPreference = "Stop" - $version = if ($env:GITHUB_REF_NAME -match "^v(.+)$") { $Matches[1] } else { "0.1.2" } + $version = if ($env:GITHUB_REF_NAME -match "^v(.+)$") { $Matches[1] } else { "0.1.3" } $hash = (Get-FileHash dist\winget\devspec.exe -Algorithm SHA256).Hash.ToLowerInvariant() "$hash devspec.exe" | Set-Content -Path dist\winget\devspec.exe.sha256 -Encoding ASCII diff --git a/docs/how-to/README.md b/docs/how-to/README.md index 75ab22c..8ac41bf 100644 --- a/docs/how-to/README.md +++ b/docs/how-to/README.md @@ -767,16 +767,16 @@ For WinGet releases, publish the Windows portable executable from GitHub Release ```text dist/winget/devspec.exe dist/winget/devspec.exe.sha256 -dist/winget/manifests/s/SpecLabs/Devspec/0.1.2/SpecLabs.Devspec.yaml -dist/winget/manifests/s/SpecLabs/Devspec/0.1.2/SpecLabs.Devspec.locale.en-US.yaml -dist/winget/manifests/s/SpecLabs/Devspec/0.1.2/SpecLabs.Devspec.installer.yaml +dist/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.yaml +dist/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.locale.en-US.yaml +dist/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.installer.yaml ``` The manifest path is case-sensitive and must match `PackageIdentifier: SpecLabs.Devspec`. Validate the generated manifest directory on Windows before submission: ```text -winget validate dist/winget/manifests/s/SpecLabs/Devspec/0.1.2 -winget install --manifest dist/winget/manifests/s/SpecLabs/Devspec/0.1.2 +winget validate dist/winget/manifests/s/SpecLabs/Devspec/0.1.3 +winget install --manifest dist/winget/manifests/s/SpecLabs/Devspec/0.1.3 ``` When adapter files are added, removed, or moved, update: diff --git a/packaging/homebrew/devspec.rb b/packaging/homebrew/devspec.rb index ddbb1c8..6101f23 100644 --- a/packaging/homebrew/devspec.rb +++ b/packaging/homebrew/devspec.rb @@ -3,8 +3,8 @@ class Devspec < Formula desc "Installer and synchronizer CLI for the devspec workflow framework" homepage "https://github.com/speclabs/devspec" - url "https://github.com/speclabs/devspec/archive/refs/tags/v0.1.2.tar.gz" - sha256 "REPLACE_WITH_V0_1_2_RELEASE_SHA256" + url "https://github.com/speclabs/devspec/archive/refs/tags/v0.1.3.tar.gz" + sha256 "REPLACE_WITH_V0_1_3_RELEASE_SHA256" license "Apache-2.0" depends_on "python@3.12" diff --git a/packaging/homebrew/tap/Formula/devspec.rb b/packaging/homebrew/tap/Formula/devspec.rb index ddbb1c8..6101f23 100644 --- a/packaging/homebrew/tap/Formula/devspec.rb +++ b/packaging/homebrew/tap/Formula/devspec.rb @@ -3,8 +3,8 @@ class Devspec < Formula desc "Installer and synchronizer CLI for the devspec workflow framework" homepage "https://github.com/speclabs/devspec" - url "https://github.com/speclabs/devspec/archive/refs/tags/v0.1.2.tar.gz" - sha256 "REPLACE_WITH_V0_1_2_RELEASE_SHA256" + url "https://github.com/speclabs/devspec/archive/refs/tags/v0.1.3.tar.gz" + sha256 "REPLACE_WITH_V0_1_3_RELEASE_SHA256" license "Apache-2.0" depends_on "python@3.12" diff --git a/packaging/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.installer.yaml b/packaging/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.installer.yaml new file mode 100644 index 0000000..2dcac32 --- /dev/null +++ b/packaging/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.installer.yaml @@ -0,0 +1,12 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.12.0.schema.json +PackageIdentifier: SpecLabs.Devspec +PackageVersion: 0.1.3 +InstallerType: portable +Commands: + - devspec +Installers: + - Architecture: x64 + InstallerUrl: https://github.com/speclabs/devspec/releases/download/v0.1.3/devspec.exe + InstallerSha256: REPLACE_WITH_RELEASE_SHA256 +ManifestType: installer +ManifestVersion: 1.12.0 diff --git a/packaging/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.locale.en-US.yaml b/packaging/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.locale.en-US.yaml new file mode 100644 index 0000000..076f031 --- /dev/null +++ b/packaging/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.locale.en-US.yaml @@ -0,0 +1,22 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.12.0.schema.json +PackageIdentifier: SpecLabs.Devspec +PackageVersion: 0.1.3 +PackageLocale: en-US +Publisher: SpecLabs +PublisherUrl: https://github.com/speclabs +PublisherSupportUrl: https://github.com/speclabs/devspec/issues +PackageName: devspec +PackageUrl: https://github.com/speclabs/devspec +License: Apache-2.0 +LicenseUrl: https://github.com/speclabs/devspec/blob/main/LICENSE +ShortDescription: Installer and synchronizer CLI for the devspec workflow framework. +Description: devspec installs and synchronizes spec-driven development framework files for supported coding agents and IDE adapters. +Moniker: devspec +Tags: + - ai + - cli + - developer-tools + - spec-driven-development + - workflow +ManifestType: defaultLocale +ManifestVersion: 1.12.0 diff --git a/packaging/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.yaml b/packaging/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.yaml new file mode 100644 index 0000000..9fe5a29 --- /dev/null +++ b/packaging/winget/manifests/s/SpecLabs/Devspec/0.1.3/SpecLabs.Devspec.yaml @@ -0,0 +1,6 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.12.0.schema.json +PackageIdentifier: SpecLabs.Devspec +PackageVersion: 0.1.3 +DefaultLocale: en-US +ManifestType: version +ManifestVersion: 1.12.0 diff --git a/pyproject.toml b/pyproject.toml index f22a94b..7d4c7ee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "devspec" -version = "0.1.2" +version = "0.1.3" description = "Installer and synchronizer CLI for the devspec workflow framework." readme = "README.md" requires-python = ">=3.10" diff --git a/src/devspec_installer/__init__.py b/src/devspec_installer/__init__.py index 9355ee8..89a852b 100644 --- a/src/devspec_installer/__init__.py +++ b/src/devspec_installer/__init__.py @@ -1,3 +1,3 @@ """Installer CLI for the devspec framework.""" -__version__ = "0.1.2" +__version__ = "0.1.3" diff --git a/tests/test_cli.py b/tests/test_cli.py index 5ed9964..b727961 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -72,13 +72,12 @@ def test_ownership_classification_preserves_project_artifacts() -> None: def test_svg_diagram_templates_are_standalone_xml() -> None: - templates = [ - Path("devspec/architecture/_template/architecture-diagram.svg"), - Path("devspec/architecture/_template/process-flow-diagram.svg"), - ] + templates = sorted(Path("devspec/architecture/_template").glob("*.svg")) + assert templates for template in templates: text = template.read_text(encoding="utf-8") + lowered = text.lower() root = ET.fromstring(text) assert root.tag.endswith("svg") @@ -88,8 +87,9 @@ def test_svg_diagram_templates_are_standalone_xml() -> None: assert "http://www.w3.org/2000/svg" in root.tag assert root.find("{http://www.w3.org/2000/svg}title") is not None assert root.find("{http://www.w3.org/2000/svg}desc") is not None - for forbidden in ("