A macOS desktop app that drives Claude Code (and other coding-agent CLIs) for Atlassian-grounded engineering work. Pick a workspace, link a Jira issue or Confluence page to a task, and a session runs an investigate → plan → human-approval → implement → code-review pipeline against a fresh git worktree.
Built on React + shadcn/ui, an Express + SQLite API, and a Neutralino window. Single-user, local-first — no shared backend, no SaaS dependency for state.
Requires macOS 11+, Node 24+, and a Claude Code (or Gemini / Codex) CLI on your PATH. The Node 24 floor is driven by better-sqlite3's native bindings — older Node majors hit an ABI mismatch at first DB open.
# clone, then:
export NODE_AUTH_TOKEN=ghp_… # see "GitHub Packages auth" below
npm install
npm run db:migrate
npm run devnpm run dev starts the API, the Vite web app, and a Neutralino window together. The first launch opens an onboarding flow:
- Workspace — pick a parent directory containing your cloned repos. Agent*Dock auto-discovers first-level git repos. Worktrees go under
<workspace>/worktrees/. - Atlassian credentials (optional) — Jira site URL, email, API token. Skip this and you can add it later in Settings; tasks will still run, just without Atlassian context.
If someone has shipped you a dist/agent-dock.dmg from a release build:
- Double-click the DMG, drag
agent-dockto Applications. - Launch from Launchpad. The first-run dialog says "agent-dock is an app downloaded from the Internet…" — click Open.
- Complete the onboarding flow (workspace + optional Atlassian creds).
The app is signed with a Developer ID Application certificate and notarized by Apple, so Gatekeeper doesn't block it. No xattr workaround needed.
On the receiving Mac you'll also need:
- Node 24+ on PATH. The launcher auto-discovers Homebrew, nvm, volta, fnm, and asdf installs; missing Node shows a critical alert with the install URL. Node 24 is a hard requirement:
better-sqlite3(the API's SQLite driver) ships native bindings that fail to load on older Node majors, so the app will refuse to open its database on Node 20 / 22. - Whichever coding-agent CLIs the workflow invokes (
claude,gemini,codex) plusghandgit, on PATH from a directory the launcher already prepends: the Node bin dir,/opt/homebrew/bin,/usr/local/bin,~/.volta/bin,~/.local/bin, or~/.cargo/bin.
Agent*Dock depends on @tone4hook/headless-coding-agent-sdk, hosted on GitHub Packages. End users installing the DMG do not need this — the package is bundled into the .app.
To install from source you need a GitHub classic Personal Access Token (not a fine-grained token — fine-grained tokens cannot read GitHub Packages npm registries on user-owned packages):
-
https://github.com/settings/tokens/new → check
read:packagesonly. -
Export the token (add to
~/.zshrcto persist):export NODE_AUTH_TOKEN=ghp_your_token_here -
Run
npm install. The committed.npmrchandles the rest.
If you see 401 Unauthorized from npm.pkg.github.com, your token is fine-grained — regenerate as a classic token.
| Script | Purpose |
|---|---|
npm run dev |
API + web + Neutralino, hot-reload. |
npm run build |
Compile workspaces, web bundle, Neutralino resources. |
npm run typecheck |
TypeScript verification across all packages. |
npm run db:migrate |
Apply migrations to ~/.agent-dock/agent-dock.sqlite (or $AGENT_DOCK_DATA_DIR). |
npm run package:mac |
Build an ad-hoc-signed dist/agent-dock.app for local smoke. |
npm run package:dmg |
Wrap the .app into dist/agent-dock.dmg. |
npm run package:mac:signed |
Same as package:mac but Developer ID-signed with hardened runtime (requires APPLE_DEVELOPER_ID). |
npm run package:dmg:signed |
Same as package:dmg but Developer ID-signed. |
npm run notarize |
Submit dist/agent-dock.app to Apple's notary service, staple the ticket, then rebuild the DMG with the stapled .app and notarize+staple the DMG too. |
npm run release:mac |
Full pipeline: package:mac:signed then notarize. |
-
Apple Developer Program membership ($99/yr).
-
Developer ID Application certificate in your login keychain — Keychain Access → Certificate Assistant → Request a Certificate; upload the CSR at developer.apple.com → Certificates → Software → Developer ID Application; install the resulting
.cerplus Apple's Developer ID G2 intermediate. Confirm withsecurity find-identity -v -p codesigning. -
App-specific password at appleid.apple.com → Sign-In and Security → App-Specific Passwords (label it
agent-dock-notarize). -
Store notarytool credentials once:
xcrun notarytool store-credentials agent-dock \ --apple-id <your-apple-id-email> \ --team-id <YOUR-TEAM-ID> \ --password <app-specific-password>
export APPLE_DEVELOPER_ID="Developer ID Application: Your Name (TEAMID12)"
npm run release:macApple's notary verdict typically lands in 1–5 minutes. The result is dist/agent-dock.dmg ready to drag-install on any Mac with no Gatekeeper friction.
apps/api— Express server, SSE event bus, SQLite repos. Composition root atapps/api/src/buildContainer.ts.apps/web— React + shadcn/ui frontend. Boots fromapps/web/src/main.tsx.packages/shared— Zod schemas + types shared across API and web.packages/db— better-sqlite3 wrappers + migrations.packages/agents—ProviderAdapterper CLI (claude,gemini,codex).packages/orchestrator—RunCoordinator(single-run lifecycle, no HTTP).packages/workflows— feature-flow pipeline definition.packages/worktrees— git worktree lifecycle per Session.packages/atlassian— Jira + Confluence clients, ADF parsing, Keychain-backed creds.packages/artifacts— on-disk artifact store mirroring theartifactstable.scripts/build-mac.mjs,scripts/make-dmg.mjs,scripts/sign-mac.mjs,scripts/notarize-mac.mjs— packaging.scripts/launcher.swift— Mach-OCFBundleExecutable(compiled at package time; locates Node, spawns the API, then exec's Neutralino).
See CONTEXT.md for the domain vocabulary used across the codebase.
MIT — see LICENSE.