diff --git a/.github/workflows/finalize-release.yml b/.github/workflows/finalize-release.yml index 92aba47..714d5be 100644 --- a/.github/workflows/finalize-release.yml +++ b/.github/workflows/finalize-release.yml @@ -74,7 +74,7 @@ jobs: syspolicy_check distribution "$APP" SERVICE_STATE="" for _ in {1..30}; do - SERVICE_STATE="$(brew services list | awk '$1 == "microbridge" { print $2; exit }')" + SERVICE_STATE="$(brew services list --json | jq -r 'map(select(.name=="microbridge")) | .[0].status // empty')" [[ "$SERVICE_STATE" == "started" || "$SERVICE_STATE" == "scheduled" ]] && break sleep 1 done @@ -95,7 +95,7 @@ jobs: wait "$APP_PID" || true brew services stop DevVig/microbridge/microbridge HOMEBREW_NO_INSTALL_CLEANUP=1 brew uninstall DevVig/microbridge/microbridge - if brew services list | grep -q '^microbridge[[:space:]]'; then + if brew services list --json | jq -e '.[] | select(.name=="microbridge")' >/dev/null; then echo "microbridge service is still registered after uninstall" >&2 exit 1 fi diff --git a/apps/microbridge-ui/package-lock.json b/apps/microbridge-ui/package-lock.json index 4d63e57..218f9eb 100644 --- a/apps/microbridge-ui/package-lock.json +++ b/apps/microbridge-ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "microbridge-ui", - "version": "0.3.6", + "version": "0.3.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "microbridge-ui", - "version": "0.3.6", + "version": "0.3.7", "dependencies": { "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "^2", diff --git a/apps/microbridge-ui/src-tauri/Cargo.toml b/apps/microbridge-ui/src-tauri/Cargo.toml index e8a5457..3b0031b 100644 --- a/apps/microbridge-ui/src-tauri/Cargo.toml +++ b/apps/microbridge-ui/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "microbridge-ui" -version = "0.3.6" +version = "0.3.7" description = "Microbridge menu bar app (primary UI)" authors = ["Microbridge contributors"] edition = "2021" diff --git a/crates/microbridged/src/state.rs b/crates/microbridged/src/state.rs index 3a56d82..eb22fd0 100644 --- a/crates/microbridged/src/state.rs +++ b/crates/microbridged/src/state.rs @@ -1090,6 +1090,30 @@ mod tests { assert!(!state.adapter_txs.contains_key(&24)); } + #[test] + fn route_action_open_focused_thread_uses_focus_uri() { + let mut state = state(); + let mut sess = session("cursor:one", AgentState::Working); + sess.focus_uri = Some("cursor://file/test".into()); + state.upsert_session(sess, 0); + + #[cfg(target_os = "macos")] + { + assert!(state + .route_action("cursor:one", Action::OpenFocusedThread) + .is_ok()); + } + + #[cfg(not(target_os = "macos"))] + { + let error = state + .route_action("cursor:one", Action::OpenFocusedThread) + .unwrap_err(); + assert!(error.contains("only supported on macOS")); + assert!(error.contains("cursor://file/test")); + } + } + #[test] fn route_action_rejects_unadvertised_capability() { let mut state = state(); diff --git a/docs/releases/v0.3.7.md b/docs/releases/v0.3.7.md new file mode 100644 index 0000000..a148e84 --- /dev/null +++ b/docs/releases/v0.3.7.md @@ -0,0 +1,30 @@ +# Microbridge 0.3.7 (2026-07-21) + +Integration expansion release with auto-discovery, embedded MCP, universal +focus deep-linking, and a community adapter SDK. + +## Highlights + +- **Auto-Discovery Engine:** Scans for installed agent runtimes (Cursor, + OpenCode, VS Code, Zed, Windsurf, Goose, Factory) on daemon startup. +- **Embedded MCP Server:** Local HTTP MCP JSON-RPC endpoint at + `http://127.0.0.1:9190/mcp` for Claude Desktop, Goose, Roo Code, and + Continue.dev. +- **Universal Focus Deep-Linking:** Agent key press launches focus URIs such as + `cursor://file/...` and `vscode://file/...` on macOS. +- **Community Adapter SDK:** Published `@microbridge/adapter-sdk` under + `adapters/sdk/`. +- **CI hardening:** Homebrew finalize and formula smokes read service state via + `brew services list --json` to avoid Intel pipefail flakes. + +## Upgrade notes + +- No migration. Install this DMG (or `brew upgrade` after the formula bump). +- Reconnect opt-in integrations under Settings → Integrations after upgrading + if adapters were disabled during the update. + +## Risk / notes + +- Focus deep-linking via `OpenFocusedThread` is macOS-only; other platforms + return a clear error when a focus URI is present. +- T3 Code server contract remains at `0.0.28` / `0.0.29` (see `0.3.6` notes). diff --git a/scripts/smoke-formula.sh b/scripts/smoke-formula.sh index 15433a4..8ee2f29 100755 --- a/scripts/smoke-formula.sh +++ b/scripts/smoke-formula.sh @@ -83,7 +83,7 @@ syspolicy_check distribution "$APP" SERVICE_STATE="" for _ in {1..30}; do - SERVICE_STATE="$(brew services list | awk '$1 == "microbridge" { print $2; exit }')" + SERVICE_STATE="$(brew services list --json | jq -r 'map(select(.name=="microbridge")) | .[0].status // empty')" [[ "$SERVICE_STATE" == "started" || "$SERVICE_STATE" == "scheduled" ]] && break sleep 1 done @@ -99,7 +99,7 @@ wait "$APP_PID" || true brew services stop "$TAP/microbridge" HOMEBREW_NO_INSTALL_CLEANUP=1 brew uninstall "$TAP/microbridge" test ! -e "$(brew --cellar)/microbridge/$VERSION" -if brew services list | grep -q '^microbridge[[:space:]]'; then +if brew services list --json | jq -e '.[] | select(.name=="microbridge")' >/dev/null; then echo "microbridge service is still registered after uninstall" >&2 exit 1 fi