From 2f5466583351b459eb53affcfa42f24a3696abfb Mon Sep 17 00:00:00 2001 From: yushen Date: Wed, 25 Mar 2026 17:15:09 +0800 Subject: [PATCH 1/5] feat(release): add GoReleaser config and Homebrew tap support Enable `brew install multica-cli` via multica-ai/homebrew-tap. GoReleaser builds cross-platform binaries (macOS/Linux, amd64/arm64) and auto-updates the Homebrew formula on tagged releases. Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/release.yml | 33 +++++++++++++++++++++ .goreleaser.yml | 55 +++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 .goreleaser.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..7fe2b64a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,33 @@ +name: Release + +on: + push: + tags: + - "v*" + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: "1.24" + cache-dependency-path: server/go.sum + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + version: "~> v2" + args: release --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + HOMEBREW_TAP_GITHUB_TOKEN: ${{ secrets.HOMEBREW_TAP_GITHUB_TOKEN }} diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 00000000..14a23d6d --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,55 @@ +version: 2 + +project_name: multica-cli + +before: + hooks: + - cd server && go mod tidy + +builds: + - id: multica-cli + main: ./cmd/multica + dir: server + binary: multica-cli + ldflags: + - -s -w + - -X main.version={{.Version}} + - -X main.commit={{.ShortCommit}} + env: + - CGO_ENABLED=0 + goos: + - darwin + - linux + goarch: + - amd64 + - arm64 + +archives: + - id: default + formats: + - tar.gz + name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}" + +checksum: + name_template: "checksums.txt" + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + - "^chore:" + +homebrew_casks: + - name: multica-cli + binaries: + - multica-cli + repository: + owner: multica-ai + name: homebrew-tap + branch: main + token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}" + directory: Formula + homepage: "https://github.com/multica-ai/super-multica" + description: "Multica CLI — local agent runtime and management tool for the Multica platform" From 872d2d10bd84c185b6dc148496e53d98490c0b53 Mon Sep 17 00:00:00 2001 From: yushen Date: Wed, 25 Mar 2026 17:21:23 +0800 Subject: [PATCH 2/5] fix(release): match Go version to go.mod (1.26) Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7fe2b64a..423cbee8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.24" + go-version: "1.26" cache-dependency-path: server/go.sum - name: Run GoReleaser From 4c4f6c4a6006450cb08f0d49ad45f0f150eb8c60 Mon Sep 17 00:00:00 2001 From: yushen Date: Wed, 25 Mar 2026 17:26:34 +0800 Subject: [PATCH 3/5] fix(release): use brews instead of homebrew_casks for CLI formula homebrew_casks is for macOS .app bundles; brews is the correct GoReleaser v2 key for CLI binaries. Also read Go version from go.mod instead of hardcoding it. Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/release.yml | 2 +- .goreleaser.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 423cbee8..9ae1df51 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.26" + go-version-file: server/go.mod cache-dependency-path: server/go.sum - name: Run GoReleaser diff --git a/.goreleaser.yml b/.goreleaser.yml index 14a23d6d..fe2a9fbf 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -41,10 +41,8 @@ changelog: - "^test:" - "^chore:" -homebrew_casks: +brews: - name: multica-cli - binaries: - - multica-cli repository: owner: multica-ai name: homebrew-tap @@ -53,3 +51,5 @@ homebrew_casks: directory: Formula homepage: "https://github.com/multica-ai/super-multica" description: "Multica CLI — local agent runtime and management tool for the Multica platform" + install: | + bin.install "multica-cli" From 22f1005537bb32fefaa6877d57fdb65523c229c1 Mon Sep 17 00:00:00 2001 From: yushen Date: Wed, 25 Mar 2026 17:32:47 +0800 Subject: [PATCH 4/5] fix(release): add test step, fix checkout version, improve brew formula MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix actions/checkout@v6 → v4 (v6 doesn't exist) - Add Go test step before GoReleaser to prevent shipping broken binaries - Add license and test block to Homebrew formula Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/release.yml | 5 ++++- .goreleaser.yml | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9ae1df51..c973ab40 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -23,6 +23,9 @@ jobs: go-version-file: server/go.mod cache-dependency-path: server/go.sum + - name: Run tests + run: cd server && go test ./... + - name: Run GoReleaser uses: goreleaser/goreleaser-action@v6 with: diff --git a/.goreleaser.yml b/.goreleaser.yml index fe2a9fbf..d53a22bc 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -51,5 +51,8 @@ brews: directory: Formula homepage: "https://github.com/multica-ai/super-multica" description: "Multica CLI — local agent runtime and management tool for the Multica platform" + license: "MIT" install: | bin.install "multica-cli" + test: | + system "#{bin}/multica-cli", "version" From 3b3d2c48b9022557daa98fd956e0e001dd0b8e76 Mon Sep 17 00:00:00 2001 From: yushen Date: Wed, 25 Mar 2026 17:34:29 +0800 Subject: [PATCH 5/5] refactor(release): rename multica-cli to multica Rename the binary and all references from multica-cli to multica for a cleaner command-line experience. Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitignore | 1 - .goreleaser.yml | 12 ++++++------ Makefile | 2 +- server/cmd/multica/cmd_agent.go | 2 +- server/cmd/multica/cmd_version.go | 2 +- server/cmd/multica/main.go | 4 ++-- 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 15638010..59309248 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,6 @@ server/bin/ server/tmp/ server/migrate server/daemon -server/multica-cli server/multica # Test artifacts diff --git a/.goreleaser.yml b/.goreleaser.yml index d53a22bc..abb885ec 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,16 +1,16 @@ version: 2 -project_name: multica-cli +project_name: multica before: hooks: - cd server && go mod tidy builds: - - id: multica-cli + - id: multica main: ./cmd/multica dir: server - binary: multica-cli + binary: multica ldflags: - -s -w - -X main.version={{.Version}} @@ -42,7 +42,7 @@ changelog: - "^chore:" brews: - - name: multica-cli + - name: multica repository: owner: multica-ai name: homebrew-tap @@ -53,6 +53,6 @@ brews: description: "Multica CLI — local agent runtime and management tool for the Multica platform" license: "MIT" install: | - bin.install "multica-cli" + bin.install "multica" test: | - system "#{bin}/multica-cli", "version" + system "#{bin}/multica", "version" diff --git a/Makefile b/Makefile index 07d3213b..811c8637 100644 --- a/Makefile +++ b/Makefile @@ -125,7 +125,7 @@ COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) build: cd server && go build -o bin/server ./cmd/server - cd server && go build -ldflags "-X main.version=$(VERSION) -X main.commit=$(COMMIT)" -o bin/multica-cli ./cmd/multica + cd server && go build -ldflags "-X main.version=$(VERSION) -X main.commit=$(COMMIT)" -o bin/multica ./cmd/multica test: $(REQUIRE_ENV) diff --git a/server/cmd/multica/cmd_agent.go b/server/cmd/multica/cmd_agent.go index 670c8c11..64cf6b04 100644 --- a/server/cmd/multica/cmd_agent.go +++ b/server/cmd/multica/cmd_agent.go @@ -59,7 +59,7 @@ func newAPIClient(cmd *cobra.Command) (*cli.APIClient, error) { workspaceID := resolveWorkspaceID(cmd) if serverURL == "" { - return nil, fmt.Errorf("server URL not set: use --server-url flag, MULTICA_SERVER_URL env, or 'multica-cli config set server_url '") + return nil, fmt.Errorf("server URL not set: use --server-url flag, MULTICA_SERVER_URL env, or 'multica config set server_url '") } return cli.NewAPIClient(serverURL, workspaceID), nil diff --git a/server/cmd/multica/cmd_version.go b/server/cmd/multica/cmd_version.go index 99c7fb7a..da557872 100644 --- a/server/cmd/multica/cmd_version.go +++ b/server/cmd/multica/cmd_version.go @@ -10,6 +10,6 @@ var versionCmd = &cobra.Command{ Use: "version", Short: "Print version information", Run: func(_ *cobra.Command, _ []string) { - fmt.Printf("multica-cli %s (commit: %s)\n", version, commit) + fmt.Printf("multica %s (commit: %s)\n", version, commit) }, } diff --git a/server/cmd/multica/main.go b/server/cmd/multica/main.go index 1b06c9e8..98aef2b5 100644 --- a/server/cmd/multica/main.go +++ b/server/cmd/multica/main.go @@ -12,9 +12,9 @@ var ( ) var rootCmd = &cobra.Command{ - Use: "multica-cli", + Use: "multica", Short: "Multica CLI — local agent runtime and management tool", - Long: "multica-cli manages local agent runtimes and provides control commands for the Multica platform.", + Long: "multica manages local agent runtimes and provides control commands for the Multica platform.", SilenceUsage: true, SilenceErrors: true, }