From b777922848b5bfb9fa5402793e93d8756c3cbe9e Mon Sep 17 00:00:00 2001 From: iamnbutler Date: Wed, 21 Oct 2026 17:54:07 -0400 Subject: [PATCH 1/2] chore: point Settings paths at Team and Ace Helper --- apps/host/src/client.ts | 2 +- apps/host/src/manage.ts | 2 +- apps/host/src/projects.ts | 2 +- docs/architecture.md | 2 +- docs/data.md | 2 +- docs/desktop.md | 14 +++++++------- docs/setup.md | 6 +++--- readme.md | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/host/src/client.ts b/apps/host/src/client.ts index 7af15ac4..6396ce12 100644 --- a/apps/host/src/client.ts +++ b/apps/host/src/client.ts @@ -63,7 +63,7 @@ export async function hostedAuth(): Promise> { const secret = await key("ACE_SECRET"); if (!secret) { throw new Error( - "The team's services need ACE_SECRET. Add it in Settings → This Mac → Team directory, or with ace key set ACE_SECRET", + "The team's services need ACE_SECRET. Add it in Settings → Team, or with ace key set ACE_SECRET", ); } return serviceAuth(secret); diff --git a/apps/host/src/manage.ts b/apps/host/src/manage.ts index 7e82667f..4a1b75ed 100644 --- a/apps/host/src/manage.ts +++ b/apps/host/src/manage.ts @@ -41,7 +41,7 @@ export async function defaultModel(): Promise { export async function project(dir: string): Promise { dir = resolve(dir === "~" ? homedir() : dir.startsWith("~/") ? homedir() + dir.slice(1) : dir); const result = await git(dir, ["rev-parse", "--show-toplevel"]); - if (result.status === null) throw new Error("Git is unavailable. Check This Mac in Settings."); + if (result.status === null) throw new Error("Git is unavailable. Check Settings → Ace Helper."); if (result.status !== 0) { throw new Error(`${dir} is not a Git repository. Initialize Git to start channels in it.`); } diff --git a/apps/host/src/projects.ts b/apps/host/src/projects.ts index d48b56d8..d64edf2d 100644 --- a/apps/host/src/projects.ts +++ b/apps/host/src/projects.ts @@ -199,7 +199,7 @@ export async function init(path: string): Promise { if (!paths().includes(path)) throw new Error("Open this folder in Ace first"); const run = async (args: string[]) => { const result = await git(path, args); - if (result.status === null) throw new Error("Git is unavailable. Check This Mac in Settings."); + if (result.status === null) throw new Error("Git is unavailable. Check Settings → Ace Helper."); if (result.status !== 0) throw new Error(result.stderr.trim() || `git ${args[0]} failed`); }; if ((await checkout(path)).commit) return project(path); diff --git a/docs/architecture.md b/docs/architecture.md index f937cc97..e0a188bf 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -420,7 +420,7 @@ Literal insertion uses one GUI-owned temporary plain-text paste, with the existi lane and clipboard transaction gate held through delivery and cleanup. The GUI preserves bounded prior clipboard contents privately and restores them only when no paste key was sent or the expected edit was observed in the same control. Uncertain consumption leaves the replacement or preserves newer contents; no -restore journal or automatic retry is created. Clipboard read policy is reported in This Mac. +restore journal or automatic retry is created. Clipboard read policy is reported in Settings → Computer use. The same clipboard gate retains a content-free reservation while a dispatched paste is unresolved. Later automated writes require observed consumption or termination of the exact receiver process generation. The reservation survives GUI restart; clipboard contents and comparison state do not. diff --git a/docs/data.md b/docs/data.md index 5802b0e2..b02b0ab1 100644 --- a/docs/data.md +++ b/docs/data.md @@ -19,7 +19,7 @@ it. pi-durable owns the database format, messages, runs, tool results, chats, an `ACE_HOME` overrides the host data directory. Canary and development preferences have the same `-canary` and `-dev` suffixes. A source CLI uses the stable profile unless given `ACE_HOME`; target the installed app's profile explicitly when backing it up. The command an app installs from -Settings → This Mac, `ace` for stable and `ace-canary` for Canary, already uses that app's profile. +Settings → Ace Helper, `ace` for stable and `ace-canary` for Canary, already uses that app's profile. Each channel directory holds `channel.json` and pi's `channel.sqlite`. Lanes are worktrees in the project at `.lane/trees//`, created by the lane CLI; a `lanes/` directory holds those diff --git a/docs/desktop.md b/docs/desktop.md index f5a407af..0708be35 100644 --- a/docs/desktop.md +++ b/docs/desktop.md @@ -33,7 +33,7 @@ channel sidebar. Project paths are scoped to their host until repository-based i store nonsecret preferences under `~/Library/Application Support/Ace` on macOS. - The app's command line tool is Ace Helper itself: started under any other name, it runs the CLI with its app's data directory, port, and Keychain service, and spawns workers as Ace Helper. - Settings → This Mac links `~/.local/bin/ace`, or `ace-` for other channels, to the + Settings → Ace Helper links `~/.local/bin/ace`, or `ace-` for other channels, to the bundle's helper. It needs no administrator rights, adds no second compiled runtime, and keeps `Contents/Helpers`, which is first on agents' `PATH`, limited to lane. Install replaces only a link to another Ace and refuses other files; a translocated app can't install a link. @@ -146,7 +146,7 @@ and Ace's grouped permission in macOS background-item settings. caching object snapshots in the shared local-storage hook. - Follow-up work is tracked in the [dogfooding](https://github.com/githubnext/ace/issues/5) and [desktop distribution](https://github.com/githubnext/ace/issues/7) meta issues. Providers beyond - Anthropic/OpenAI still use the CLI. This Mac joins, changes, and leaves the team directory and + Anthropic/OpenAI still use the CLI. Settings → Team joins, changes, and leaves the team directory and saves its secret; deploying the directory stays a CLI step. ## UI testing @@ -216,7 +216,7 @@ history should remain available. This helper-testing mode cannot coexist with source dev builds. They share the same app identity, and macOS can resolve a registered helper from another copy even though source apps never register it. For routine development, use `bun desktop dev` alongside installed Canary. Before -switching from installed Ace-dev to source development, stop Ace Helper in Settings → This Mac, +switching from installed Ace-dev to source development, stop Ace Helper in Settings → Ace Helper, quit Ace-dev, and remove its installed bundle. Keep its data directories. The installed `/Applications/Ace-dev.app` uses `dev.ace.desktop.dev`, port 4141, the `ace-dev` @@ -233,20 +233,20 @@ registered helper's signature, so an ad-hoc or differently signed replacement fa constraint violation. The build refuses ad-hoc signing. Apple recommends an [Apple-issued identity for both the app and helper](https://developer.apple.com/forums/thread/799910). -To replace it, stop Ace Helper in Settings → This Mac, which unregisters it, and quit Ace. Remove +To replace it, stop Ace Helper in Settings → Ace Helper, which unregisters it, and quit Ace. Remove the old bundle and move the new one from `dist/dev-macos-arm64` into `/Applications` as a complete directory; do not overwrite executables inside the installed bundle or leave copies with the `dev.ace.desktop.dev` identifier elsewhere, because launchd can resolve the helper from any registered copy. Refresh its registration with `/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Ace-dev.app`, -then open Ace and enable Ace Helper. In Settings → This Mac, try restarting the helper, then stopping +then open Ace and enable Ace Helper. In Settings → Ace Helper, try restarting the helper, then stopping and starting it. Keep the `ace-dev` data, preferences, and Keychain service. Changing the signing identity may require approving Keychain access again. This build is signed locally, not notarized. ## Test hosts `ace serve --loopback` runs a host that only listens on 127.0.0.1. It doesn't bind the tailnet, -find peers, or publish to the team directory; Settings says so under Tailscale. Give a disposable +find peers, or publish to the team directory; Settings → Team says so under Tailscale. Give a disposable host its own `ACE_HOME`, `ACE_CONFIG_HOME`, `ACE_KEYCHAIN_SERVICE`, and port. A busy port's error names the Ace on it and never asks to restart a listener that belongs to another app or checkout. @@ -277,7 +277,7 @@ The Chat tab keeps the channel's name; use `ace rename` to change that name inst The commands connect to an already running local host and never start one. Use its `ACE_HOME` profile and pass `--port ` when it differs from `ACE_PORT` or the default 4140. The command the -installed app links from Settings → This Mac, such as `ace-canary tabs`, already targets its app. For +installed app links from Settings → Ace Helper, such as `ace-canary tabs`, already targets its app. For a source CLI, the installed canary uses `ACE_HOME="$HOME/.local/state/ace-canary"` and `--port 4142`; the development app uses `ACE_HOME="$HOME/.local/state/ace-dev"` and `--port 4141`. Authentication checks the host's identity and protocol before connecting. Listing or renaming tabs over the tailnet is unavailable. diff --git a/docs/setup.md b/docs/setup.md index c6ed967f..1dc9a658 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -15,7 +15,7 @@ take priority and Settings identifies them. ## Command line tool -`Settings → This Mac` installs the command line tool. It links `ace` for stable, or `ace-canary` +`Settings → Ace Helper` installs the command line tool. It links `ace` for stable, or `ace-canary` for Canary, in `~/.local/bin` to the app's own Ace Helper, so it uses that app's channels and port and stays current with app updates. Settings says whether your shell finds it and, if not, what to add to your `PATH`. @@ -52,8 +52,8 @@ home screen to use it as an app. The team's directory lists every host's channels, so they stay visible while their host sleeps. Whoever sets up the team deploys the services once from a checkout; everyone else joins in -`Settings → This Mac → Team directory` with the directory's URL and the team's secret, shared -privately. `Troubleshooting → Refresh status` syncs at once. From a checkout, +`Settings → Team` (Join…) with the directory's URL and the team's secret, shared privately. +Refresh there syncs at once. From a checkout, `printf %s "$SECRET" | bun ace key set ACE_SECRET` then `bun ace directory ` does the same. The services are cells, so they run on Cloudflare Workers, or on [celld](#on-celld) on machines the diff --git a/readme.md b/readme.md index f5b3c269..65efe7f3 100644 --- a/readme.md +++ b/readme.md @@ -25,7 +25,7 @@ Read [the trust model](docs/architecture.md#the-team) before running or sharing ## Run Install Ace or Ace Canary from [releases](https://github.com/githubnext/ace/releases), add a key in -`Settings → Providers`, and join your team's directory in `Settings → This Mac`. Press Cmd+O to +`Settings → Providers`, and join your team's directory in `Settings → Team`. Press Cmd+O to open a folder as a project, then start a channel from its dashboard. From a checkout, with Bun 1.4 or later: From e6a9d293b0b46b1be9bb2c57a689a09b7a4e5d52 Mon Sep 17 00:00:00 2001 From: iamnbutler Date: Wed, 21 Oct 2026 17:54:16 -0400 Subject: [PATCH 2/2] fix(app): show the stable HTTPS port in the connect placeholder --- apps/app/src/connect.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/src/connect.tsx b/apps/app/src/connect.tsx index 0d4984d7..6251faa3 100644 --- a/apps/app/src/connect.tsx +++ b/apps/app/src/connect.tsx @@ -30,12 +30,12 @@ export function Connect({ previous }: { previous?: string }) {

{previous ? `Couldn't reach ${previous}. Check that Tailscale is on, then try again or enter another host.` - : "Enter the address your Ace host prints for HTTPS, such as mac.tailnet.ts.net:5141. This device must be on your tailnet."} + : "Enter the address your Ace host prints for HTTPS, such as mac.tailnet.ts.net:5140. This device must be on your tailnet."}