mirror of
https://github.com/multica-ai/multica.git
synced 2026-07-23 10:08:38 +02:00
* feat(desktop): support macOS cross-platform packaging * fix(desktop): use releaseType instead of publishingType in electron-builder publish config publishingType is not a valid electron-builder key; the correct GitHub provider option is releaseType. The previous value was silently ignored, causing uploads to be skipped and breaking auto-update. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(release): standardize artifact naming across desktop and CLI Unified scheme: `multica-<kind>-<version>-<platform>-<arch>.<ext>` so a filename alone reveals kind, version, platform, and CPU arch. Desktop (apps/desktop/electron-builder.yml): mac → multica-desktop-<v>-mac-<arch>.{dmg,zip} linux → multica-desktop-<v>-linux-<arch>.{deb,AppImage} (fixes `\${name}` expanding the scoped `@multica/desktop` into a broken `@multica/desktop-*` filename path) windows → multica-desktop-<v>-windows-<arch>.exe CLI (.goreleaser.yml): multica_<os>_<arch>.tar.gz → multica-cli-<v>-<os>-<arch>.tar.gz (adds `-cli` marker + version; switches `_` to `-` for consistency) Matrix update in apps/desktop/scripts/package.mjs `--all-platforms`: - drop mac x64 (Intel not a target yet) - add linux arm64 Final: mac arm64, win x64/arm64, linux x64/arm64. Downstream updates so install paths match the new CLI names: - scripts/install.sh - scripts/install.ps1 (URL + checksum regex) - CLI_INSTALL.md Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(release): use multica_{os}_{arch} CLI archive naming Standardize on the GoReleaser default 'multica_{os}_{arch}.{tar.gz|zip}' asset names. Install scripts and the desktop CLI bootstrap now resolve assets via checksums.txt so they work without hardcoding versions. The Go self-update path queries the GitHub release API and accepts either the new or legacy 'multica-cli-<version>-...' names so existing releases keep updating cleanly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(release): ship both legacy and versioned CLI archive names GoReleaser now produces both 'multica_{os}_{arch}.{ext}' (legacy) and 'multica-cli-{version}-{os}-{arch}.{ext}' (versioned) archives in every release. The legacy name keeps already-released CLIs self-updating; the versioned name is what new clients should use going forward. Self-update / install paths flipped to prefer the versioned name and fall back to legacy: - server/internal/cli/update.go (multica update) - apps/desktop/src/main/cli-release-asset.ts (desktop CLI bootstrap) - scripts/install.sh, scripts/install.ps1 (fresh install) Homebrew formula is pinned to the versioned archive via 'ids: [versioned]'. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(desktop): also build Linux .rpm packages Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(release): build Linux/Windows Desktop installers in CI; detect Windows ARM64 in install.ps1 Address review feedback on PR #1262: - .github/workflows/release.yml: add a 'desktop' job that runs after the CLI 'release' job and packages the Desktop installers for Linux (AppImage/deb/rpm) and Windows (NSIS) on x64 and arm64, then publishes them to the same GitHub Release via electron-builder. macOS Desktop continues to ship through the manual release-desktop skill so it can be signed and notarized with Apple Developer credentials. - scripts/install.ps1: detect Windows ARM64 hosts via RuntimeInformation::OSArchitecture so the new windows-arm64 CLI archive is downloaded on ARM64 machines instead of always falling back to amd64. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(release): split Windows arm64 auto-update channel to avoid latest.yml collision electron-builder's update metadata file is hardcoded to `latest.yml` for Windows regardless of arch (only Linux gets an arch-suffixed name; see app-builder-lib's getArchPrefixForUpdateFile). With two separate electron-builder invocations for Windows x64 and arm64, both publish `latest.yml` to the same GitHub Release and the second upload silently overwrites the first — leaving one of the two architectures with auto- update metadata pointing at the other arch's installer. Route Windows arm64 to its own `latest-arm64` channel: * scripts/package.mjs appends `-c.publish.channel=latest-arm64` only for the Windows arm64 invocation, so x64 keeps producing `latest.yml` and arm64 produces `latest-arm64.yml` alongside it. * updater.ts pins `autoUpdater.channel = 'latest-arm64'` on Windows arm64 clients so they fetch the matching metadata file. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Devv <devv@Devvs-Mac-mini.local> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
97 lines
2.6 KiB
Go
97 lines
2.6 KiB
Go
package cli
|
|
|
|
import "testing"
|
|
|
|
func TestReleaseAssetCandidates(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
targetVersion string
|
|
goos string
|
|
goarch string
|
|
wantAssets []string
|
|
}{
|
|
{
|
|
name: "darwin prefers versioned then legacy candidate",
|
|
targetVersion: "v1.2.3",
|
|
goos: "darwin",
|
|
goarch: "arm64",
|
|
wantAssets: []string{
|
|
"multica-cli-1.2.3-darwin-arm64.tar.gz",
|
|
"multica_darwin_arm64.tar.gz",
|
|
},
|
|
},
|
|
{
|
|
name: "linux normalizes missing v in versioned candidate",
|
|
targetVersion: "1.2.3",
|
|
goos: "linux",
|
|
goarch: "amd64",
|
|
wantAssets: []string{
|
|
"multica-cli-1.2.3-linux-amd64.tar.gz",
|
|
"multica_linux_amd64.tar.gz",
|
|
},
|
|
},
|
|
{
|
|
name: "windows uses zip assets",
|
|
targetVersion: "1.2.3",
|
|
goos: "windows",
|
|
goarch: "amd64",
|
|
wantAssets: []string{
|
|
"multica-cli-1.2.3-windows-amd64.zip",
|
|
"multica_windows_amd64.zip",
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := releaseAssetCandidates(tt.targetVersion, tt.goos, tt.goarch)
|
|
if len(got) != len(tt.wantAssets) {
|
|
t.Fatalf("candidate count mismatch: got %d, want %d", len(got), len(tt.wantAssets))
|
|
}
|
|
for i := range got {
|
|
if got[i] != tt.wantAssets[i] {
|
|
t.Fatalf("candidate[%d] mismatch: got %q, want %q", i, got[i], tt.wantAssets[i])
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFindReleaseAsset(t *testing.T) {
|
|
t.Run("prefers versioned asset when both names exist", func(t *testing.T) {
|
|
assets := []GitHubReleaseAsset{
|
|
{Name: "multica_darwin_amd64.tar.gz", BrowserDownloadURL: "old"},
|
|
{Name: "multica-cli-1.2.3-darwin-amd64.tar.gz", BrowserDownloadURL: "new"},
|
|
}
|
|
|
|
got, err := findReleaseAsset(assets, "v1.2.3", "darwin", "amd64")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if got.Name != "multica-cli-1.2.3-darwin-amd64.tar.gz" {
|
|
t.Fatalf("asset mismatch: got %q", got.Name)
|
|
}
|
|
})
|
|
|
|
t.Run("falls back to legacy asset when versioned is absent", func(t *testing.T) {
|
|
assets := []GitHubReleaseAsset{
|
|
{Name: "multica_linux_amd64.tar.gz", BrowserDownloadURL: "old"},
|
|
}
|
|
|
|
got, err := findReleaseAsset(assets, "1.2.3", "linux", "amd64")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if got.Name != "multica_linux_amd64.tar.gz" {
|
|
t.Fatalf("asset mismatch: got %q", got.Name)
|
|
}
|
|
})
|
|
|
|
t.Run("returns error when no candidate matches", func(t *testing.T) {
|
|
_, err := findReleaseAsset([]GitHubReleaseAsset{{Name: "checksums.txt"}}, "1.2.3", "linux", "amd64")
|
|
if err == nil {
|
|
t.Fatal("expected error, got nil")
|
|
}
|
|
})
|
|
}
|