Files
multica/CLI_INSTALL.md
LinYushen 6f63fae41a feat(desktop): support macOS cross-platform packaging (#1262)
* 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>
2026-04-20 23:33:41 -07:00

5.6 KiB

Multica CLI — Installation Guide for AI Agents

Audience: This document is designed for AI agents (Claude Code, Codex, etc.) to read and execute step-by-step. Each step includes the exact shell commands to run, expected outcomes, and error handling.

One-Line Instruction for Users

Give this instruction to your AI agent:

Fetch https://github.com/multica-ai/multica/blob/main/CLI_INSTALL.md and follow the instructions to install Multica CLI, log in, and start the daemon on this machine.

Step 1: Check if Multica CLI is already installed

Run:

multica version
  • If it prints a version string (e.g. multica v0.x.x): skip to Step 3.
  • If command not found: continue to Step 2.

Step 2: Install the Multica CLI

Windows users: Skip to Option C: Windows (PowerShell) below.

Option A: Homebrew (preferred — macOS/Linux)

Check if Homebrew is available:

which brew

If brew is found, install via Homebrew:

brew install multica-ai/tap/multica

Then verify:

multica version

If the version prints successfully, skip to Step 3.

To upgrade later, run:

brew upgrade multica-ai/tap/multica

Option B: Download from GitHub Releases (macOS/Linux, no Homebrew)

If Homebrew is not available, download the binary directly.

Detect OS and architecture, then download the correct archive:

OS=$(uname -s | tr '[:upper:]' '[:lower:]')   # "darwin" or "linux"
ARCH=$(uname -m)                                # "x86_64" or "arm64"

# Normalize architecture name
if [ "$ARCH" = "x86_64" ]; then
  ARCH="amd64"
fi

# Get the latest release tag from GitHub
LATEST=$(curl -sI https://github.com/multica-ai/multica/releases/latest | grep -i '^location:' | sed 's/.*tag\///' | tr -d '\r\n')

# Download and extract
VERSION="${LATEST#v}"
curl -sL "https://github.com/multica-ai/multica/releases/download/${LATEST}/multica-cli-${VERSION}-${OS}-${ARCH}.tar.gz" -o /tmp/multica.tar.gz
tar -xzf /tmp/multica.tar.gz -C /tmp multica
sudo mv /tmp/multica /usr/local/bin/multica
rm /tmp/multica.tar.gz

Verify:

multica version

If this fails:

  • Check that /usr/local/bin is in $PATH.
  • On Linux, you may need chmod +x /usr/local/bin/multica.
  • If sudo is not available, install to a user-writable directory: mv /tmp/multica ~/.local/bin/multica and ensure ~/.local/bin is in $PATH.

Option C: Windows (PowerShell)

Run in PowerShell (no admin required):

irm https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.ps1 | iex

This downloads the latest Windows binary from GitHub Releases, installs it to %USERPROFILE%\.multica\bin\, and adds it to your user PATH.

Verify:

multica version

If this fails:

  • Restart your terminal so the updated PATH takes effect.
  • If you use Scoop, the installer will use it automatically: scoop bucket add multica https://github.com/multica-ai/scoop-bucket.git && scoop install multica
  • If your execution policy blocks the script: Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned then re-run.

Step 3: Log in

Run:

multica login

Important: This command opens a browser window for OAuth authentication. Tell the user:

"A browser window will open for Multica login. Please complete the authentication in your browser, then come back here."

Wait for the command to complete. It will automatically discover and watch all workspaces the user belongs to.

Verify:

multica auth status

Expected output should show the authenticated user and server URL.

If login fails:

  • If no browser is available (headless environment), the user can generate a Personal Access Token at https://app.multica.ai/settings and run: multica login --token
  • If the server URL needs to be customized: multica config set server_url <url> before logging in.

Step 4: Start the daemon

First, check if the daemon is already running:

multica daemon status
  • If status is "running": skip to Step 5.
  • If status is "stopped": start it:
multica daemon start

Wait 3 seconds, then verify:

multica daemon status

Expected output should show running status with detected agents (e.g. claude, codex, opencode, openclaw, hermes, gemini, pi, cursor-agent).

If daemon fails to start:

  • Check logs: multica daemon logs
  • If a port conflict occurs, the daemon may already be running under a different profile.
  • If no agents are detected, ensure at least one AI CLI (claude, codex, opencode, openclaw, hermes, gemini, pi, or cursor-agent) is installed and on the $PATH.

Step 5: Verify everything is working

Run:

multica daemon status

Confirm:

  1. Status is running
  2. At least one agent is listed (e.g. claude, codex, opencode, openclaw, hermes, gemini, pi, or cursor-agent)
  3. At least one workspace is being watched

If the agents list is empty, tell the user:

"The Multica daemon is running but no AI agent CLIs were detected. Please install at least one supported CLI (claude, codex, opencode, openclaw, hermes, gemini, pi, or cursor-agent), then restart the daemon with multica daemon stop && multica daemon start."


Summary

When all steps are complete, inform the user:

"Multica CLI is installed and the daemon is running. Agents in your workspaces can now execute tasks on this machine. You can manage workspaces with multica workspace list and view daemon logs with multica daemon logs -f."