diff --git a/CHANGELOG.md b/CHANGELOG.md index e942ffc75..0469d9bbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ Docs: https://docs.clawd.bot +## 2026.1.18-4 + +### Changes +- macOS: switch PeekabooBridge integration to the tagged Swift Package Manager release (no submodule). +- macOS: stop syncing Peekaboo as a git submodule in postinstall. +- Swabble: use the tagged Commander Swift package release. + ## 2026.1.18-3 ### Changes diff --git a/Swabble/Package.swift b/Swabble/Package.swift index 70448139e..9f5a00036 100644 --- a/Swabble/Package.swift +++ b/Swabble/Package.swift @@ -13,7 +13,7 @@ let package = Package( .executable(name: "swabble", targets: ["SwabbleCLI"]), ], dependencies: [ - .package(path: "../Peekaboo/Commander"), + .package(url: "https://github.com/steipete/Commander.git", exact: "0.2.1"), .package(url: "https://github.com/apple/swift-testing", from: "0.99.0"), ], targets: [ diff --git a/apps/macos/Package.resolved b/apps/macos/Package.resolved index 2bad2ca2f..7895d4f92 100644 --- a/apps/macos/Package.resolved +++ b/apps/macos/Package.resolved @@ -1,6 +1,24 @@ { - "originHash" : "7eec77e2b399c480e76fdfc7dc3162652f5c775530e9fc282953de38ef2de79b", + "originHash" : "7166d3b5a3be04eadfd1aca8fdfcf3caa9153bdde9a6596a410ec3f9036a94cc", "pins" : [ + { + "identity" : "axorcist", + "kind" : "remoteSourceControl", + "location" : "https://github.com/steipete/AXorcist.git", + "state" : { + "revision" : "c75d06f7f93e264a9786edc2b78c04973061cb2f", + "version" : "0.1.0" + } + }, + { + "identity" : "commander", + "kind" : "remoteSourceControl", + "location" : "https://github.com/steipete/Commander.git", + "state" : { + "revision" : "9e349575c8e3c6745e81fe19e5bb5efa01b078ce", + "version" : "0.2.1" + } + }, { "identity" : "elevenlabskit", "kind" : "remoteSourceControl", @@ -10,15 +28,6 @@ "version" : "0.1.0" } }, - { - "identity" : "eventsource", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mattt/eventsource.git", - "state" : { - "revision" : "ca2a9d90cbe49e09b92f4b6ebd922c03ebea51d0", - "version" : "1.3.0" - } - }, { "identity" : "menubarextraaccess", "kind" : "remoteSourceControl", @@ -28,6 +37,15 @@ "version" : "1.2.2" } }, + { + "identity" : "peekaboo", + "kind" : "remoteSourceControl", + "location" : "https://github.com/steipete/Peekaboo.git", + "state" : { + "revision" : "66914b5313388d8f5d2d4fde7b465f39b6fee07b", + "version" : "3.0.0-beta4" + } + }, { "identity" : "sparkle", "kind" : "remoteSourceControl", @@ -46,33 +64,6 @@ "version" : "1.2.1" } }, - { - "identity" : "swift-asn1", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-asn1.git", - "state" : { - "revision" : "810496cf121e525d660cd0ea89a758740476b85f", - "version" : "1.5.1" - } - }, - { - "identity" : "swift-async-algorithms", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-async-algorithms", - "state" : { - "revision" : "6c050d5ef8e1aa6342528460db614e9770d7f804", - "version" : "1.1.1" - } - }, - { - "identity" : "swift-collections", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-collections", - "state" : { - "branch" : "main", - "revision" : "8e5e4a8f3617283b556064574651fc0869943c9a" - } - }, { "identity" : "swift-concurrency-extras", "kind" : "remoteSourceControl", @@ -82,24 +73,6 @@ "version" : "1.3.2" } }, - { - "identity" : "swift-configuration", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-configuration", - "state" : { - "revision" : "3528deb75256d7dcbb0d71fa75077caae0a8c749", - "version" : "1.0.0" - } - }, - { - "identity" : "swift-crypto", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-crypto.git", - "state" : { - "revision" : "6f70fa9eab24c1fd982af18c281c4525d05e3095", - "version" : "4.2.0" - } - }, { "identity" : "swift-log", "kind" : "remoteSourceControl", @@ -118,24 +91,6 @@ "version" : "1.1.1" } }, - { - "identity" : "swift-sdk", - "kind" : "remoteSourceControl", - "location" : "https://github.com/modelcontextprotocol/swift-sdk.git", - "state" : { - "revision" : "c0407a0b52677cb395d824cac2879b963075ba8c", - "version" : "0.10.2" - } - }, - { - "identity" : "swift-service-lifecycle", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swift-server/swift-service-lifecycle", - "state" : { - "revision" : "1de37290c0ab3c5a96028e0f02911b672fd42348", - "version" : "2.9.1" - } - }, { "identity" : "swift-subprocess", "kind" : "remoteSourceControl", diff --git a/apps/macos/Package.swift b/apps/macos/Package.swift index 36928c71c..0836570a6 100644 --- a/apps/macos/Package.swift +++ b/apps/macos/Package.swift @@ -20,10 +20,9 @@ let package = Package( .package(url: "https://github.com/swiftlang/swift-subprocess.git", from: "0.1.0"), .package(url: "https://github.com/apple/swift-log.git", from: "1.8.0"), .package(url: "https://github.com/sparkle-project/Sparkle", from: "2.8.1"), + .package(url: "https://github.com/steipete/Peekaboo.git", exact: "3.0.0-beta4"), .package(path: "../shared/ClawdbotKit"), .package(path: "../../Swabble"), - .package(path: "../../Peekaboo/Core/PeekabooCore"), - .package(path: "../../Peekaboo/Core/PeekabooAutomationKit"), ], targets: [ .target( @@ -61,8 +60,8 @@ let package = Package( .product(name: "Subprocess", package: "swift-subprocess"), .product(name: "Logging", package: "swift-log"), .product(name: "Sparkle", package: "Sparkle"), - .product(name: "PeekabooBridge", package: "PeekabooCore"), - .product(name: "PeekabooAutomationKit", package: "PeekabooAutomationKit"), + .product(name: "PeekabooBridge", package: "Peekaboo"), + .product(name: "PeekabooAutomationKit", package: "Peekaboo"), ], exclude: [ "Resources/Info.plist", diff --git a/docs/platforms/mac/dev-setup.md b/docs/platforms/mac/dev-setup.md index 514a19f0b..fb63e9406 100644 --- a/docs/platforms/mac/dev-setup.md +++ b/docs/platforms/mac/dev-setup.md @@ -14,15 +14,7 @@ Before building the app, ensure you have the following installed: 1. **Xcode 26.2+**: Required for Swift development. 2. **Node.js 22+ & pnpm**: Required for the gateway, CLI, and packaging scripts. -## 1. Initialize Submodules - -Clawdbot depends on several submodules (like `Peekaboo`). You must initialize these recursively: - -```bash -git submodule update --init --recursive -``` - -## 2. Install Dependencies +## 1. Install Dependencies Install the project-wide dependencies: @@ -30,7 +22,7 @@ Install the project-wide dependencies: pnpm install ``` -## 3. Build and Package the App +## 2. Build and Package the App To build the macOS app and package it into `dist/Clawdbot.app`, run: @@ -42,7 +34,7 @@ If you don't have an Apple Developer ID certificate, the script will automatical > **Note**: Ad-hoc signed apps may trigger security prompts. If the app crashes immediately with "Abort trap 6", see the [Troubleshooting](#troubleshooting) section. -## 4. Install the CLI +## 3. Install the CLI The macOS app expects a global `clawdbot` CLI install to manage background tasks. diff --git a/docs/platforms/mac/peekaboo.md b/docs/platforms/mac/peekaboo.md index 17bc88b96..08718c652 100644 --- a/docs/platforms/mac/peekaboo.md +++ b/docs/platforms/mac/peekaboo.md @@ -2,7 +2,7 @@ summary: "PeekabooBridge integration for macOS UI automation" read_when: - Hosting PeekabooBridge in Clawdbot.app - - Integrating Peekaboo as a submodule + - Integrating Peekaboo via Swift Package Manager - Changing PeekabooBridge protocol/paths --- # Peekaboo Bridge (macOS UI automation) diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 0f3f902c7..4718ac9d9 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -43,47 +43,6 @@ function hasGit(repoRoot) { return result.status === 0; } -function isSubmoduleDirty(submodulePath, repoRoot) { - const result = spawnSync("git", ["-C", submodulePath, "status", "--porcelain"], { - cwd: repoRoot, - encoding: "utf-8", - }); - if (result.status !== 0) return false; - return result.stdout.trim().length > 0; -} - -function shouldSyncSubmodule(name, repoRoot) { - const result = spawnSync("git", ["submodule", "status", "--recursive", "--", name], { - cwd: repoRoot, - encoding: "utf-8", - }); - if (result.status !== 0) return false; - const line = result.stdout.trim().split("\n")[0]; - if (!line) return false; - const marker = line[0]; - return marker === "-" || marker === "+"; -} - -function syncPeekabooSubmodule(repoRoot) { - if (!hasGit(repoRoot)) return; - if (!fs.existsSync(path.join(repoRoot, ".gitmodules"))) return; - const peekabooPath = path.join(repoRoot, "Peekaboo"); - if (fs.existsSync(peekabooPath) && isSubmoduleDirty(peekabooPath, repoRoot)) { - console.warn("[postinstall] Peekaboo submodule dirty; skipping update"); - return; - } - if (!shouldSyncSubmodule("Peekaboo", repoRoot)) return; - const result = spawnSync( - "git", - ["submodule", "update", "--init", "--recursive", "--", "Peekaboo"], - { cwd: repoRoot, encoding: "utf-8" }, - ); - if (result.status !== 0) { - const stderr = result.stderr?.toString().trim(); - console.warn(`[postinstall] Peekaboo submodule update failed: ${stderr || "unknown error"}`); - } -} - function extractPackageName(key) { if (key.startsWith("@")) { const idx = key.indexOf("@", 1); @@ -293,7 +252,6 @@ function main() { process.chdir(repoRoot); ensureExecutable(path.join(repoRoot, "dist", "entry.js")); - syncPeekabooSubmodule(repoRoot); if (!shouldApplyPnpmPatchedDependenciesFallback()) { return;