feat(packaging): macOS .pkg + Windows .msi installer scaffolding - #37
Merged
Conversation
…emoryBackend PR #35 shipped Remote{Memory,Recipe}Backend classes that targeted REST endpoints we never built — pure stubs. They were marked "v1 proposal" in their headers, which is the kind of speculative interface we don't want in production code. This PR removes the stubs and replaces them with a REAL ActivepiecesMemoryBackend that hits live endpoints in the user's Activepieces deployment: /v1/projects/:projectId/memory (project-scoped) /v1/projects/:projectId/chatbots/:chatbotId/memory (chatbot-scoped) /v1/projects/:projectId/chatbots/:chatbotId/memory/search (hybrid search) Auth: `Authorization: Bearer sk-<api-key>` against the existing Activepieces Service-principal flow. The same Claude Code / Cursor / Codex agent connecting to agentmark now writes to **real Activepieces memory** instead of a speculative service — and gets hybrid vector + BM25 semantic search for free since agentmark_memory_search routes to /memory/search. Mapping (agentmark K/V → Activepieces rich shape): - agentmark `key` → metadata.agentmark_key - agentmark `value` → content + metadata.raw_value (preserves type) - agentmark `scope` → Activepieces scope (same five-level enum) - agentmark `scope.id` → metadata.scope_id - agentmark `tags` → metadata.tags - source stamp = "agentmark" (filterable; backends only see records they wrote) Recipes: NO ActivepiecesRecipeBackend ships in this PR because Activepieces has no recipes endpoints yet. RecipeBackend interface + LocalFileRecipeBackend remain; when the recipes service ships, a real implementation lands then. Removed (the stubs): - src/plugins/memory/remote-backend.ts - src/plugins/recipes/remote-backend.ts - test/memory/remote-backend.test.ts - test/recipes/remote-backend.test.ts Added: - src/plugins/memory/activepieces-backend.ts (real impl) - test/memory/activepieces-backend.test.ts (20 tests) Tests: 491 pass / 10 skip. Build clean. All prior tests pass unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Ships the delivery vehicle for ThinkFleet Desktop. Each installer
bundles the agentmark MCP server + the platform bridge + a pinned Node
runtime so end users don't need to install Node themselves — just
double-click and `agentmark-mcp` is on their PATH.
Files:
packaging/
README.md operator instructions + signing-secret docs
scripts/
common.sh pinned Node version + shared helpers
build-macos.sh pnpm build → Swift bridge → pkgbuild → productbuild
build-windows.ps1 pnpm build → dotnet publish → WiX 4 → MSI
templates/
launcher.sh relocatable POSIX launcher
launcher.cmd relocatable Windows launcher
distribution.xml productbuild manifest
AgentMark.wxs WiX 4 MSI manifest
macos-pkg-scripts/
postinstall symlinks /usr/local/bin/agentmark-mcp
.github/workflows/release.yml tag-triggered release; builds both
platforms in parallel + uploads to
a draft GitHub Release
What ships in each installer:
macOS install to /opt/thinkfleet/agentmark/
├── node (pinned 22.11.0 LTS, host arch)
├── agentmark/ (dist + schema + package.json + prod deps)
├── bridges/agentmark-bridge-macos
└── bin/agentmark-mcp (launcher; symlinked into /usr/local/bin)
Windows install to C:\Program Files\ThinkFleet\AgentMark\
├── node.exe (pinned 22.11.0)
├── agentmark\ (dist + schema + package.json + prod deps)
├── bridges\agentmark-bridge-windows.exe + companion DLLs
└── agentmark-mcp.cmd (launcher; install dir added to PATH)
What's deliberately NOT bundled:
- Playwright Chromium (~150MB; only needed for the browser plugin).
The web plugin documents `playwright install chromium` as a
one-time post-install step for users who want it.
- Activepieces backend wiring. That's per-deployment config the
operator sets via env vars; not part of the installer.
Signing: optional, conditional on encrypted GitHub secrets:
macOS: APPLE_DEVELOPER_ID + APPLE_CERT_P12_BASE64 + notarisation creds
Windows: WINDOWS_CERT_PFX_BASE64 + WINDOWS_CERT_PFX_PASSWORD
Missing secrets = build skips signing, produces unsigned installers
suitable for internal testing. Production signing is a one-time cert
setup; the workflow + scripts are signing-ready out of the box.
Pinned versions (single source of truth in packaging/scripts/common.sh
and packaging/scripts/build-windows.ps1):
Node 22.11.0 LTS
.NET 8 (for the Windows UIA bridge)
Swift 5.9+ (for the macOS AXAPI bridge)
WiX 4 (dotnet tool, installed by the workflow if missing)
Release flow: tag a version (e.g. `v0.12.0`). GH Actions builds both
installers in matrix, uploads to a draft GitHub Release. Tester runs
the .pkg or .msi; `agentmark-mcp --help` works immediately afterward.
Linux AppImage scaffolding lands as a follow-up.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
What ships in each installer
macOS → `/opt/thinkfleet/agentmark/`
```
├── node (pinned 22.11.0 LTS, host arch)
├── agentmark/ (dist/ + schema/ + package.json + prod deps)
├── bridges/agentmark-bridge-macos
└── bin/agentmark-mcp (launcher; symlinked to /usr/local/bin)
```
Windows → `C:\Program Files\ThinkFleet\AgentMark\`
```
├── node.exe (pinned 22.11.0)
├── agentmark\ (dist\ + schema\ + package.json + prod deps)
├── bridges\agentmark-bridge-windows.exe + companion DLLs
└── agentmark-mcp.cmd (launcher; install dir added to PATH)
```
After install, `agentmark-mcp` is on PATH everywhere — same command on both platforms.
What's deliberately NOT bundled
Signing (one-time setup, optional today)
Both build scripts detect signing secrets and run code-signing only when they're present. Without secrets, you get unsigned installers (fine for internal testing; Gatekeeper / SmartScreen will warn end users).
Required secrets for production releases:
macOS:
Windows:
Release flow
Test plan
What's next (in memory, not this PR)
🤖 Generated with Claude Code