From 5058e427d7a1d04e80b7a121e7ce8abdfc815279 Mon Sep 17 00:00:00 2001 From: Rian Stockbower Date: Thu, 3 Sep 2026 13:56:28 -0400 Subject: [PATCH 1/2] feat: package gro and grw from one release stream One GoReleaser config builds both binaries (darwin CGO builds for the keychain, static linux/windows builds), with per-binary archives, nfpm packages, and skip_upload casks. packaging/identity.yml declares both binaries for the shared release automation: gro keeps its google-readonly package identifiers, grw ships under its short name with a winget bootstrap. Thin auto-release and release callers wire the shared workflows, version.txt starts the 1.2 stream, and CI runs identity-check. --- .github/workflows/auto-release.yml | 22 ++ .github/workflows/ci.yml | 6 + .github/workflows/release.yml | 29 +++ .goreleaser.yaml | 196 ++++++++++++++++++ .../google-readonly/google-readonly.nuspec | 24 +++ .../tools/chocolateyInstall.ps1 | 25 +++ packaging/chocolatey/grw/grw.nuspec | 24 +++ .../grw/tools/chocolateyInstall.ps1 | 25 +++ packaging/identity.yml | 44 ++++ ...ICollective.google-readonly.installer.yaml | 18 ++ ...llective.google-readonly.locale.en-US.yaml | 17 ++ .../OpenCLICollective.google-readonly.yaml | 7 + .../OpenCLICollective.grw.installer.yaml | 18 ++ .../OpenCLICollective.grw.locale.en-US.yaml | 17 ++ packaging/winget/OpenCLICollective.grw.yaml | 7 + version.txt | 1 + 16 files changed, 480 insertions(+) create mode 100644 .github/workflows/auto-release.yml create mode 100644 .github/workflows/release.yml create mode 100644 .goreleaser.yaml create mode 100644 packaging/chocolatey/google-readonly/google-readonly.nuspec create mode 100644 packaging/chocolatey/google-readonly/tools/chocolateyInstall.ps1 create mode 100644 packaging/chocolatey/grw/grw.nuspec create mode 100644 packaging/chocolatey/grw/tools/chocolateyInstall.ps1 create mode 100644 packaging/identity.yml create mode 100644 packaging/winget/OpenCLICollective.google-readonly.installer.yaml create mode 100644 packaging/winget/OpenCLICollective.google-readonly.locale.en-US.yaml create mode 100644 packaging/winget/OpenCLICollective.google-readonly.yaml create mode 100644 packaging/winget/OpenCLICollective.grw.installer.yaml create mode 100644 packaging/winget/OpenCLICollective.grw.locale.en-US.yaml create mode 100644 packaging/winget/OpenCLICollective.grw.yaml create mode 100644 version.txt diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml new file mode 100644 index 0000000..a2ba97e --- /dev/null +++ b/.github/workflows/auto-release.yml @@ -0,0 +1,22 @@ +name: Auto Release + +on: + push: + branches: [main] + workflow_dispatch: + inputs: + dry-run: + description: "Compute the tag but do not push it" + type: boolean + default: true + +permissions: + contents: read + +jobs: + auto-release: + uses: open-cli-collective/.github/.github/workflows/auto-release.yml@v1 + with: + dry-run: ${{ github.event_name == 'workflow_dispatch' && (inputs.dry-run == true || inputs.dry-run == 'true') }} + secrets: + tag-token: ${{ secrets.TAP_GITHUB_TOKEN }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b145b0d..6aefb5c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -110,6 +110,12 @@ jobs: go-version-file: go.mod - run: make test-cover-check + identity-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: open-cli-collective/.github/actions/identity-check@v1 + pr-title: if: github.event_name == 'pull_request' runs-on: ubuntu-latest diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..747e2ef --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,29 @@ +name: Release + +on: + push: + tags: ["v*"] + workflow_dispatch: + inputs: + dry-run: + description: "Build + render but skip publishing (only meaningful from a tag ref)" + type: boolean + default: true + +permissions: + contents: write + +jobs: + release: + uses: open-cli-collective/.github/.github/workflows/release.yml@v1 + with: + dry-run: ${{ github.event_name == 'workflow_dispatch' && (inputs.dry-run == true || inputs.dry-run == 'true') }} + secrets: + homebrew-tap-token: ${{ secrets.TAP_GITHUB_TOKEN }} + chocolatey-api-key: ${{ secrets.CHOCOLATEY_API_KEY }} + winget-token: ${{ secrets.WINGET_GITHUB_TOKEN }} + linux-dispatch-token: ${{ secrets.LINUX_PACKAGES_DISPATCH_TOKEN }} + macos-cert-p12: ${{ secrets.MACOS_CERT_P12 }} + macos-cert-password: ${{ secrets.MACOS_CERT_PASSWORD }} + macos-cert-cn: ${{ secrets.MACOS_CERT_CN }} + macos-cert-leaf-sha: ${{ secrets.MACOS_CERT_LEAF_SHA }} diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..4fda081 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,196 @@ +version: 2 + +project_name: google-cli + +before: + hooks: + - sh -c "go mod tidy && git diff --exit-code go.mod go.sum" + - go test ./... + +builds: + - id: gro-darwin + main: ./cmd/gro + binary: gro + flags: ["-tags=keyring_no1password,keyring_nopassage"] + env: [CGO_ENABLED=1] + goos: [darwin] + goarch: [amd64, arm64] + overrides: + - goos: darwin + goarch: amd64 + goamd64: v1 + env: + - CGO_ENABLED=1 + - "CC=xcrun clang -arch x86_64" + - goos: darwin + goarch: arm64 + goarm64: v8.0 + env: + - CGO_ENABLED=1 + - "CC=xcrun clang -arch arm64" + ldflags: + - -s -w + - -X github.com/open-cli-collective/google-cli/internal/version.Version={{.Version}} + - -X github.com/open-cli-collective/google-cli/internal/version.Commit={{.Commit}} + - -X github.com/open-cli-collective/google-cli/internal/version.Date={{.Date}} + hooks: + post: + - cmd: bash -c 'f="${CODESIGN_DARWIN_SCRIPT:-}"; if [ -z "$f" ]; then echo "skip codesign (CODESIGN_DARWIN_SCRIPT unset, local build)"; exit 0; fi; [ -x "$f" ] || { echo "CODESIGN_DARWIN_SCRIPT not executable ($f)" >&2; exit 1; }; exec "$f" "$0" "$1"' "{{ .Path }}" "{{ .Os }}" + - id: gro-unix-win + main: ./cmd/gro + binary: gro + flags: ["-tags=keyring_no1password,keyring_nopassage"] + env: [CGO_ENABLED=0] + goos: [linux, windows] + goarch: [amd64, arm64] + ldflags: + - -s -w + - -X github.com/open-cli-collective/google-cli/internal/version.Version={{.Version}} + - -X github.com/open-cli-collective/google-cli/internal/version.Commit={{.Commit}} + - -X github.com/open-cli-collective/google-cli/internal/version.Date={{.Date}} + - id: grw-darwin + main: ./cmd/grw + binary: grw + flags: ["-tags=keyring_no1password,keyring_nopassage"] + env: [CGO_ENABLED=1] + goos: [darwin] + goarch: [amd64, arm64] + overrides: + - goos: darwin + goarch: amd64 + goamd64: v1 + env: + - CGO_ENABLED=1 + - "CC=xcrun clang -arch x86_64" + - goos: darwin + goarch: arm64 + goarm64: v8.0 + env: + - CGO_ENABLED=1 + - "CC=xcrun clang -arch arm64" + ldflags: + - -s -w + - -X github.com/open-cli-collective/google-cli/internal/version.Version={{.Version}} + - -X github.com/open-cli-collective/google-cli/internal/version.Commit={{.Commit}} + - -X github.com/open-cli-collective/google-cli/internal/version.Date={{.Date}} + hooks: + post: + - cmd: bash -c 'f="${CODESIGN_DARWIN_SCRIPT:-}"; if [ -z "$f" ]; then echo "skip codesign (CODESIGN_DARWIN_SCRIPT unset, local build)"; exit 0; fi; [ -x "$f" ] || { echo "CODESIGN_DARWIN_SCRIPT not executable ($f)" >&2; exit 1; }; exec "$f" "$0" "$1"' "{{ .Path }}" "{{ .Os }}" + - id: grw-unix-win + main: ./cmd/grw + binary: grw + flags: ["-tags=keyring_no1password,keyring_nopassage"] + env: [CGO_ENABLED=0] + goos: [linux, windows] + goarch: [amd64, arm64] + ldflags: + - -s -w + - -X github.com/open-cli-collective/google-cli/internal/version.Version={{.Version}} + - -X github.com/open-cli-collective/google-cli/internal/version.Commit={{.Commit}} + - -X github.com/open-cli-collective/google-cli/internal/version.Date={{.Date}} + +archives: + - id: gro + ids: [gro-darwin, gro-unix-win] + formats: [tar.gz] + format_overrides: + - goos: windows + formats: [zip] + name_template: "gro_v{{ .Version }}_{{ .Os }}_{{ .Arch }}" + files: [LICENSE, README.md] + - id: grw + ids: [grw-darwin, grw-unix-win] + formats: [tar.gz] + format_overrides: + - goos: windows + formats: [zip] + name_template: "grw_v{{ .Version }}_{{ .Os }}_{{ .Arch }}" + files: [LICENSE, README.md] + +nfpms: + - id: google-readonly + ids: [gro-unix-win] + package_name: google-readonly + vendor: Open CLI Collective + homepage: https://github.com/open-cli-collective/google-cli + maintainer: Open CLI Collective + description: Read-only command-line interface for Google services + license: MIT + formats: [deb, rpm] + bindir: /usr/bin + contents: + - src: LICENSE + dst: /usr/share/licenses/google-readonly/LICENSE + - id: google-readwrite + ids: [grw-unix-win] + package_name: google-readwrite + vendor: Open CLI Collective + homepage: https://github.com/open-cli-collective/google-cli + maintainer: Open CLI Collective + description: Read-write command-line interface for Google services + license: MIT + formats: [deb, rpm] + bindir: /usr/bin + contents: + - src: LICENSE + dst: /usr/share/licenses/google-readwrite/LICENSE + +homebrew_casks: + - name: gro + ids: [gro] + skip_upload: true + repository: + owner: open-cli-collective + name: homebrew-tap + homepage: https://github.com/open-cli-collective/google-cli + description: "Read-only command-line interface for Google services" + binaries: [gro] + hooks: + post: + install: | + system_command "/usr/bin/xattr", args: ["-dr", "com.apple.quarantine", "#{staged_path}/gro"] + caveats: | + gro has been installed. Run 'gro init' to configure. + On macOS, your token is stored securely in the system Keychain. + - name: grw + ids: [grw] + skip_upload: true + repository: + owner: open-cli-collective + name: homebrew-tap + homepage: https://github.com/open-cli-collective/google-cli + description: "Read-write command-line interface for Google services" + binaries: [grw] + hooks: + post: + install: | + system_command "/usr/bin/xattr", args: ["-dr", "com.apple.quarantine", "#{staged_path}/grw"] + caveats: | + grw has been installed. Run 'grw init' to configure. + On macOS, your token is stored securely in the system Keychain. + +checksum: + name_template: checksums.txt + +changelog: + sort: asc + use: github + filters: + exclude: + - "^docs:" + - "^test:" + - "^ci:" + - "^chore:" + - "Merge pull request" + groups: + - title: Features + regexp: '^feat:' + order: 0 + - title: Bug Fixes + regexp: '^fix:' + order: 1 + - title: Other + order: 999 + +release: + replace_existing_artifacts: true diff --git a/packaging/chocolatey/google-readonly/google-readonly.nuspec b/packaging/chocolatey/google-readonly/google-readonly.nuspec new file mode 100644 index 0000000..4fb9a65 --- /dev/null +++ b/packaging/chocolatey/google-readonly/google-readonly.nuspec @@ -0,0 +1,24 @@ + + + + google-readonly + 0.0.0 + Google Readonly CLI + Open CLI Collective + rianjs + https://github.com/open-cli-collective/google-cli/blob/main/LICENSE + https://github.com/open-cli-collective/google-cli#readme + https://github.com/open-cli-collective/google-cli + https://github.com/open-cli-collective/google-cli/tree/main/packaging/chocolatey/google-readonly + https://github.com/open-cli-collective/google-cli/issues + Copyright (c) 2026 Open CLI Collective + false + A read-only Google CLI for Gmail, Calendar, Contacts, and Drive. + Read-only Google CLI for Gmail, Calendar, Contacts, and Drive + https://github.com/open-cli-collective/google-cli/releases + google gmail calendar contacts drive cli api readonly automation + + + + + diff --git a/packaging/chocolatey/google-readonly/tools/chocolateyInstall.ps1 b/packaging/chocolatey/google-readonly/tools/chocolateyInstall.ps1 new file mode 100644 index 0000000..4676023 --- /dev/null +++ b/packaging/chocolatey/google-readonly/tools/chocolateyInstall.ps1 @@ -0,0 +1,25 @@ +$ErrorActionPreference = 'Stop' + +$version = $env:ChocolateyPackageVersion +$toolsDir = Split-Path -Parent $MyInvocation.MyCommand.Definition + +$checksumAmd64 = 'CHECKSUM_AMD64_PLACEHOLDER' +$checksumArm64 = 'CHECKSUM_ARM64_PLACEHOLDER' + +if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { + $arch = 'arm64' + $checksum = $checksumArm64 +} elseif ([Environment]::Is64BitOperatingSystem) { + $arch = 'amd64' + $checksum = $checksumAmd64 +} else { + throw "32-bit Windows is not supported. gro requires 64-bit Windows." +} + +$url = "https://github.com/open-cli-collective/google-cli/releases/download/v${version}/gro_v${version}_windows_${arch}.zip" + +Install-ChocolateyZipPackage -PackageName $env:ChocolateyPackageName ` + -Url $url ` + -UnzipLocation $toolsDir ` + -Checksum $checksum ` + -ChecksumType 'sha256' diff --git a/packaging/chocolatey/grw/grw.nuspec b/packaging/chocolatey/grw/grw.nuspec new file mode 100644 index 0000000..d3ea04a --- /dev/null +++ b/packaging/chocolatey/grw/grw.nuspec @@ -0,0 +1,24 @@ + + + + grw + 0.0.0 + Google Read-Write CLI + Open CLI Collective + rianjs + https://github.com/open-cli-collective/google-cli/blob/main/LICENSE + https://github.com/open-cli-collective/google-cli#readme + https://github.com/open-cli-collective/google-cli + https://github.com/open-cli-collective/google-cli/tree/main/packaging/chocolatey/grw + https://github.com/open-cli-collective/google-cli/issues + Copyright (c) 2026 Open CLI Collective + false + A read-write Google CLI: everything gro does plus Gmail delete and restore, folders, and filters. + Read-write Google CLI with Gmail cleanup, folders, and filters + https://github.com/open-cli-collective/google-cli/releases + google gmail calendar contacts drive cli api readwrite automation + + + + + diff --git a/packaging/chocolatey/grw/tools/chocolateyInstall.ps1 b/packaging/chocolatey/grw/tools/chocolateyInstall.ps1 new file mode 100644 index 0000000..a67c863 --- /dev/null +++ b/packaging/chocolatey/grw/tools/chocolateyInstall.ps1 @@ -0,0 +1,25 @@ +$ErrorActionPreference = 'Stop' + +$version = $env:ChocolateyPackageVersion +$toolsDir = Split-Path -Parent $MyInvocation.MyCommand.Definition + +$checksumAmd64 = 'CHECKSUM_AMD64_PLACEHOLDER' +$checksumArm64 = 'CHECKSUM_ARM64_PLACEHOLDER' + +if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { + $arch = 'arm64' + $checksum = $checksumArm64 +} elseif ([Environment]::Is64BitOperatingSystem) { + $arch = 'amd64' + $checksum = $checksumAmd64 +} else { + throw "32-bit Windows is not supported. grw requires 64-bit Windows." +} + +$url = "https://github.com/open-cli-collective/google-cli/releases/download/v${version}/grw_v${version}_windows_${arch}.zip" + +Install-ChocolateyZipPackage -PackageName $env:ChocolateyPackageName ` + -Url $url ` + -UnzipLocation $toolsDir ` + -Checksum $checksum ` + -ChecksumType 'sha256' diff --git a/packaging/identity.yml b/packaging/identity.yml new file mode 100644 index 0000000..2bebf15 --- /dev/null +++ b/packaging/identity.yml @@ -0,0 +1,44 @@ +schema: open-cli-identity/v1 +repo: google-cli +goreleaser_config: .goreleaser.yaml +version_file: version.txt +tag: {prefix: v, version_scheme: major_minor_run_patch} +binaries: + - name: gro + archives: {name_template: "gro_v{{ .Version }}_{{ .Os }}_{{ .Arch }}"} + packages: + homebrew: {canonical_cask: gro, alias_casks: [google-readonly]} + winget: {id: OpenCLICollective.google-readonly} + chocolatey: {id: google-readonly} + linux: {package_name: google-readonly} + keychain_probe: + env_unset: [GOOGLE_READONLY_KEYRING_BACKEND] + seed_config: + path: google-readonly/config.yml + content: | + credential_ref: google-readonly/default + command: [config, show, -j] + output: json + assertions: + .backend: keychain + .backend_source: auto + .credential_ref: google-readonly/default + - name: grw + archives: {name_template: "grw_v{{ .Version }}_{{ .Os }}_{{ .Arch }}"} + packages: + homebrew: {canonical_cask: grw, alias_casks: [google-readwrite]} + winget: {id: OpenCLICollective.grw, bootstrap: true} + chocolatey: {id: grw} + linux: {package_name: google-readwrite} + keychain_probe: + env_unset: [GOOGLE_READWRITE_KEYRING_BACKEND] + seed_config: + path: google-readwrite/config.yml + content: | + credential_ref: google-readwrite/default + command: [config, show, -j] + output: json + assertions: + .backend: keychain + .backend_source: auto + .credential_ref: google-readwrite/default diff --git a/packaging/winget/OpenCLICollective.google-readonly.installer.yaml b/packaging/winget/OpenCLICollective.google-readonly.installer.yaml new file mode 100644 index 0000000..9137147 --- /dev/null +++ b/packaging/winget/OpenCLICollective.google-readonly.installer.yaml @@ -0,0 +1,18 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.10.0.schema.json + +PackageIdentifier: OpenCLICollective.google-readonly +PackageVersion: 0.0.0 +InstallerType: zip +NestedInstallerType: portable +NestedInstallerFiles: + - RelativeFilePath: gro.exe + PortableCommandAlias: gro +Installers: + - Architecture: x64 + InstallerUrl: https://github.com/open-cli-collective/google-cli/releases/download/v0.0.0/gro_v0.0.0_windows_amd64.zip + InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000 + - Architecture: arm64 + InstallerUrl: https://github.com/open-cli-collective/google-cli/releases/download/v0.0.0/gro_v0.0.0_windows_arm64.zip + InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000 +ManifestType: installer +ManifestVersion: 1.10.0 diff --git a/packaging/winget/OpenCLICollective.google-readonly.locale.en-US.yaml b/packaging/winget/OpenCLICollective.google-readonly.locale.en-US.yaml new file mode 100644 index 0000000..9ab1d4c --- /dev/null +++ b/packaging/winget/OpenCLICollective.google-readonly.locale.en-US.yaml @@ -0,0 +1,17 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.10.0.schema.json + +PackageIdentifier: OpenCLICollective.google-readonly +PackageVersion: 0.0.0 +PackageLocale: en-US +Publisher: Open CLI Collective +PublisherUrl: https://github.com/open-cli-collective +PackageName: Google Readonly CLI +PackageUrl: https://github.com/open-cli-collective/google-cli +License: MIT +LicenseUrl: https://github.com/open-cli-collective/google-cli/blob/main/LICENSE +ShortDescription: Read-only Google CLI for Gmail, Calendar, Contacts, and Drive +Description: A read-only Google CLI for Gmail, Calendar, Contacts, and Drive. +Tags: [google, gmail, calendar, contacts, drive, cli, api, readonly, automation] +ReleaseNotesUrl: https://github.com/open-cli-collective/google-cli/releases +ManifestType: defaultLocale +ManifestVersion: 1.10.0 diff --git a/packaging/winget/OpenCLICollective.google-readonly.yaml b/packaging/winget/OpenCLICollective.google-readonly.yaml new file mode 100644 index 0000000..b802a47 --- /dev/null +++ b/packaging/winget/OpenCLICollective.google-readonly.yaml @@ -0,0 +1,7 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.10.0.schema.json + +PackageIdentifier: OpenCLICollective.google-readonly +PackageVersion: 0.0.0 +DefaultLocale: en-US +ManifestType: version +ManifestVersion: 1.10.0 diff --git a/packaging/winget/OpenCLICollective.grw.installer.yaml b/packaging/winget/OpenCLICollective.grw.installer.yaml new file mode 100644 index 0000000..f9fee91 --- /dev/null +++ b/packaging/winget/OpenCLICollective.grw.installer.yaml @@ -0,0 +1,18 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.10.0.schema.json + +PackageIdentifier: OpenCLICollective.grw +PackageVersion: 0.0.0 +InstallerType: zip +NestedInstallerType: portable +NestedInstallerFiles: + - RelativeFilePath: grw.exe + PortableCommandAlias: grw +Installers: + - Architecture: x64 + InstallerUrl: https://github.com/open-cli-collective/google-cli/releases/download/v0.0.0/grw_v0.0.0_windows_amd64.zip + InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000 + - Architecture: arm64 + InstallerUrl: https://github.com/open-cli-collective/google-cli/releases/download/v0.0.0/grw_v0.0.0_windows_arm64.zip + InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000 +ManifestType: installer +ManifestVersion: 1.10.0 diff --git a/packaging/winget/OpenCLICollective.grw.locale.en-US.yaml b/packaging/winget/OpenCLICollective.grw.locale.en-US.yaml new file mode 100644 index 0000000..ec65bd2 --- /dev/null +++ b/packaging/winget/OpenCLICollective.grw.locale.en-US.yaml @@ -0,0 +1,17 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.10.0.schema.json + +PackageIdentifier: OpenCLICollective.grw +PackageVersion: 0.0.0 +PackageLocale: en-US +Publisher: Open CLI Collective +PublisherUrl: https://github.com/open-cli-collective +PackageName: Google Read-Write CLI +PackageUrl: https://github.com/open-cli-collective/google-cli +License: MIT +LicenseUrl: https://github.com/open-cli-collective/google-cli/blob/main/LICENSE +ShortDescription: Read-write Google CLI with Gmail cleanup, folders, and filters +Description: A read-write Google CLI that does everything gro does plus Gmail delete and restore, folders, and filters. +Tags: [google, gmail, calendar, contacts, drive, cli, api, readwrite, automation] +ReleaseNotesUrl: https://github.com/open-cli-collective/google-cli/releases +ManifestType: defaultLocale +ManifestVersion: 1.10.0 diff --git a/packaging/winget/OpenCLICollective.grw.yaml b/packaging/winget/OpenCLICollective.grw.yaml new file mode 100644 index 0000000..740e8fe --- /dev/null +++ b/packaging/winget/OpenCLICollective.grw.yaml @@ -0,0 +1,7 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.10.0.schema.json + +PackageIdentifier: OpenCLICollective.grw +PackageVersion: 0.0.0 +DefaultLocale: en-US +ManifestType: version +ManifestVersion: 1.10.0 diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..5625e59 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +1.2 From 71f7110ac3661b226263789621dc7cc5aac96783 Mon Sep 17 00:00:00 2001 From: Rian Stockbower Date: Thu, 3 Sep 2026 13:58:37 -0400 Subject: [PATCH 2/2] docs: explain packaging identity and the version stream --- docs/development.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/development.md b/docs/development.md index 5a3e340..9c7b290 100644 --- a/docs/development.md +++ b/docs/development.md @@ -67,4 +67,22 @@ There is one release stream for both binaries. `version.txt` contains the major/ Each tag publishes both binaries and their platform archives through the shared release automation. Homebrew, Chocolatey, WinGet, and Linux package publication fan out from that release. Follow the [release](https://github.com/open-cli-collective/cli-common/blob/main/docs/release.md) and [distribution](https://github.com/open-cli-collective/cli-common/blob/main/docs/distribution.md) standards rather than duplicating workflow policy here. +### Packaging identity + +`packaging/identity.yml` (schema `open-cli-identity/v1`, described in the cli-common +[distribution](https://github.com/open-cli-collective/cli-common/blob/main/docs/distribution.md) +standard) declares both binaries once so the shared automation can validate, build, sign, and +publish them without per-repo workflow logic. Naming follows one rule: `gro` keeps every identifier +it shipped under before the merge (`google-readonly` on Chocolatey, WinGet, Linux, and as a tap +alias) because package registries cannot rename an existing package without breaking upgrades; +`grw` is new, so it is canonical under its short name and only carries `google-readwrite` as a tap +alias. Each binary's `keychain_probe` runs the freshly built macOS binary against a seeded config +and asserts it selects the Keychain backend, which catches a static or mis-tagged build before it +is published. + +`version.txt` holds only `MAJOR.MINOR`; the `major_minor_run_patch` scheme appends the workflow +run number, so tags are `v1.2.N` and never collide or need a bump commit. The stream starts at +`1.2` because `gro` had already released `1.1.x`; continuing its line keeps upgrades monotonic for +existing installs. + Use a focused branch, run `make check`, and open a pull request. Keep the pull-request title in conventional-commit form because squash merge makes that title the commit on `main` and therefore the release signal.