feat(swift-app): rebuild share/cxai-mac as native CxAI ADE 1.2.0
Some checks are pending
build-and-push / image (push) Waiting to run

- Package.swift: add CxARA (via CxLLM-SDK) and CxDrive (via new CxLLM-Drive
  package dep) so the native shell links every mac-app-shaped module
  exported by the CxLLM-SDK and CxLLM-Drive families.
- Sidebar: surface .repair (CxARA) and .drive (CxDrive) alongside the
  existing Web/Chat/Agent/MCP/Models/Code/AWS/Git/LangBridge/Telemetry
  tabs, with matching SF Symbols.
- scripts/build-mac-bundle.sh: end-to-end pipeline (release build, .app
  bundle with rebranded Info.plist studio.cxai.ade 1.2.0, ad-hoc codesign,
  tar.gz, hdiutil UDZO dmg, publish to share/cxai-mac, write
  build-info.json with sha256/sizes/modules/git sha).
- Makefile targets: swift-app 'make rebuild-mac', CxWebApp root
  'make rebuild-mac'.
- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Tauri 0- dge- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Tauri 0- share/AR- share/cxai-mac: replace Tauri 0- share/cxai-mac: replace Ter refere- share/cxai-mac: replace Tauri 0- origin main 2>&1 | tail -5
This commit is contained in:
cx-git-agent 2026-05-17 16:26:39 -05:00
parent 75153b7fe9
commit b55680ffbf
17 changed files with 179 additions and 92 deletions

7
Makefile Normal file
View File

@ -0,0 +1,7 @@
.PHONY: help rebuild-mac
help:
@echo "make rebuild-mac # build swift-app, repackage share/cxai-mac/ (VERSION=1.2.0)"
rebuild-mac:
$(MAKE) -C swift-app rebuild-mac $(if $(VERSION),VERSION=$(VERSION),)

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>CxAI ADE</string>
<key>CFBundleExecutable</key>
<string>cx-ai</string>
<key>CFBundleIdentifier</key>
<string>com.cxai.cxai</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>CxAI ADE</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.6.1</string>
<key>CFBundleVersion</key>
<string>0.6.1</string>
<key>CSResourcesFileMapped</key>
<true/>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<key>CFBundleIconFile</key>
<string>icon.icns</string>
<key>LSRequiresCarbon</key>
<true/>
<key>NSHighResolutionCapable</key>
<true/>
<key>NSMicrophoneUsageDescription</key>
<string>CxAI ADE uses your microphone for AI voice input.</string>
</dict>
</plist>

View File

@ -1,38 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>CxAI ADE</string>
<key>CFBundleExecutable</key>
<string>cx-ai</string>
<key>CFBundleIdentifier</key>
<string>com.cxai.cxai</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>CxAI ADE</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.6.1</string>
<key>CFBundleVersion</key>
<string>0.6.1</string>
<key>CSResourcesFileMapped</key>
<true/>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<key>CFBundleIconFile</key>
<string>icon.icns</string>
<key>LSRequiresCarbon</key>
<true/>
<key>NSHighResolutionCapable</key>
<true/>
<key>NSMicrophoneUsageDescription</key>
<string>CxAI ADE uses your microphone for AI voice input.</string>
</dict>
</plist>
<plist version="1.0"><dict>
<key>CFBundleIdentifier</key> <string>studio.cxai.ade</string>
<key>CFBundleName</key> <string>CxAI ADE</string>
<key>CFBundleDisplayName</key> <string>CxAI ADE</string>
<key>CFBundleExecutable</key> <string>CxWebAppMac</string>
<key>CFBundlePackageType</key> <string>APPL</string>
<key>CFBundleShortVersionString</key> <string>1.2.0</string>
<key>CFBundleVersion</key> <string>1.2.0</string>
<key>LSMinimumSystemVersion</key> <string>13.0</string>
<key>NSHighResolutionCapable</key> <true/>
<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsLocalNetworking</key><true/></dict>
<key>LSApplicationCategoryType</key> <string>public.app-category.developer-tools</string>
</dict></plist>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,17 +1,24 @@
{
"name": "CxAI ADE",
"version": "0.6.1",
"identifier": "com.cxai.cxai",
"version": "1.2.0",
"identifier": "studio.cxai.ade",
"channel": "stable",
"sha": "104717b92c07",
"built_at": "2026-05-16T18:26:57Z",
"description": "Tauri 2 desktop shell for CxAI Studio. Built from CxAI Base/cargo.",
"sha": "f5b6c3203f4c",
"built_at": "2026-05-17T21:23:28Z",
"description": "Native AppKit/SwiftUI shell for CxAI Studio. Built from CxWebApp/swift-app (CxLLM-SDK + CxLLM-Drive).",
"platform": "macOS 13+ aarch64",
"modules": [
"CxCode", "CxAWS", "CxGit", "CxAgent", "CxMCP",
"CxModels", "CxChat", "CxSPARenderer", "CxInstrument",
"CxLangBridge", "CxARA", "CxDrive"
],
"artifacts": {
"app_tar_gz": "CxAI-ADE-0.6.1-aarch64.app.tar.gz",
"app_tar_gz_sha256": "b991db236a83328464bc3c0f5b0560d44f888a401faa153db975f4652a2ee160",
"dmg": "CxAI-ADE-0.6.1-aarch64.dmg",
"dmg_size_bytes": 4539552,
"dmg_sha256": "1a1d2e7cc85a24179e89447790c1c47df194c34945fb672be8ff57902bdd966e"
"app_tar_gz": "CxAI-ADE-1.2.0-aarch64.app.tar.gz",
"app_tar_gz_sha256": "6ada3b2a1156666e7ae2d517a6579c241a37434b84daa71ad0e5e827cfb6c85d",
"app_tar_gz_size": 121127,
"dmg": "CxAI-ADE-1.2.0-aarch64.dmg",
"dmg_sha256": "5d7c9428148c505580d91aeeef731ed51146b1f162c54d1e4eb39ff9037a7131",
"dmg_size_bytes": 153833
},
"download_url": "/static/cxai-mac/CxAI-ADE-0.6.1-aarch64.dmg"
"download_url": "/static/cxai-mac/CxAI-ADE-1.2.0-aarch64.dmg"
}

View File

@ -1,12 +1,14 @@
.PHONY: help build run test app clean
.PHONY: help build run test app rebuild-mac clean
CONFIG ?= release
VERSION ?= 1.2.0
help:
@echo "make build # swift build -c $(CONFIG)"
@echo "make run # swift run -c $(CONFIG) CxWebAppMac"
@echo "make test # swift test"
@echo "make app # bundle into build/CxWebAppMac.app"
@echo "make rebuild-mac # build + .app + .tar.gz + .dmg + share/cxai-mac/build-info.json (VERSION=$(VERSION))"
@echo "make clean"
build:
@ -21,5 +23,8 @@ test:
app:
bash scripts/build-app.sh
rebuild-mac:
VERSION=$(VERSION) bash scripts/build-mac-bundle.sh
clean:
rm -rf .build build

View File

@ -17,6 +17,7 @@ let package = Package(
],
dependencies: [
.package(url: "https://cxai-studio.com/git/CxAI-Project/CxLLM-SDK.git", branch: "main"),
.package(url: "https://cxai-studio.com/git/CxAI-Project/CxLLM-Drive.git", branch: "main"),
],
targets: [
.executableTarget(
@ -32,6 +33,8 @@ let package = Package(
.product(name: "CxSPARenderer", package: "CxLLM-SDK"),
.product(name: "CxInstrument", package: "CxLLM-SDK"),
.product(name: "CxLangBridge", package: "CxLLM-SDK"),
.product(name: "CxARA", package: "CxLLM-SDK"),
.product(name: "CxDrive", package: "CxLLM-Drive"),
],
path: "Sources/CxWebAppMac",
linkerSettings: [

View File

@ -12,6 +12,8 @@ import CxModels
import CxChat
import CxInstrument
import CxLangBridge
import CxARA
import CxDrive
enum SidebarItem: String, Identifiable, CaseIterable, Hashable {
case web = "Web"
@ -21,8 +23,10 @@ enum SidebarItem: String, Identifiable, CaseIterable, Hashable {
case models = "Models"
case code = "Code"
case aws = "AWS"
case drive = "Drive"
case git = "Git"
case bridge = "LangBridge"
case repair = "Repair"
case telemetry = "Telemetry"
var id: String { rawValue }
@ -36,8 +40,10 @@ enum SidebarItem: String, Identifiable, CaseIterable, Hashable {
case .models: return "cube.transparent"
case .code: return "chevron.left.forwardslash.chevron.right"
case .aws: return "cloud"
case .drive: return "externaldrive"
case .git: return "arrow.triangle.branch"
case .bridge: return "link"
case .repair: return "wrench.and.screwdriver"
case .telemetry: return "waveform.path.ecg"
}
}
@ -58,8 +64,10 @@ struct CxLLMSectionView: View {
case .models: moduleCard(name: "CxModels", version: "seed")
case .code: moduleCard(name: "CxCode", version: "seed")
case .aws: moduleCard(name: "CxAWS", version: "seed")
case .drive: moduleCard(name: "CxDrive", version: "seed")
case .git: moduleCard(name: "CxGit", version: "seed")
case .bridge: moduleCard(name: "CxLangBridge", version: "seed")
case .repair: moduleCard(name: "CxARA", version: "seed")
case .telemetry: moduleCard(name: "CxInstrument", version: "seed")
case .web: EmptyView()
}

View File

@ -0,0 +1,117 @@
#!/usr/bin/env bash
# Build, bundle, and publish CxAI ADE (CxWebAppMac) into ../share/cxai-mac/.
#
# Produces:
# share/cxai-mac/CxAI ADE.app
# share/cxai-mac/CxAI-ADE-<VERSION>-aarch64.app.tar.gz
# share/cxai-mac/CxAI-ADE-<VERSION>-aarch64.dmg
# share/cxai-mac/build-info.json
set -euo pipefail
cd "$(dirname "$0")/.."
SWIFT_APP_ROOT="$PWD"
REPO_ROOT="$(cd ../.. && pwd)"
SHARE_DIR="$REPO_ROOT/CxWebApp/share/cxai-mac"
VERSION="${VERSION:-1.2.0}"
ARCH="${ARCH:-aarch64}"
PRODUCT_NAME="CxAI ADE"
BUNDLE_ID="${BUNDLE_ID:-studio.cxai.ade}"
CHANNEL="${CHANNEL:-stable}"
STAGE="$SWIFT_APP_ROOT/build/stage"
APP_PATH="$STAGE/${PRODUCT_NAME}.app"
TGZ_NAME="CxAI-ADE-${VERSION}-${ARCH}.app.tar.gz"
DMG_NAME="CxAI-ADE-${VERSION}-${ARCH}.dmg"
echo "[1/6] swift build -c release"
swift build -c release
BIN="$(swift build -c release --show-bin-path)/CxWebAppMac"
[[ -x "$BIN" ]] || { echo "FATAL: $BIN not found" >&2; exit 1; }
echo "[2/6] assemble bundle $APP_PATH"
rm -rf "$STAGE"
mkdir -p "$APP_PATH/Contents/MacOS" "$APP_PATH/Contents/Resources"
cp "$BIN" "$APP_PATH/Contents/MacOS/CxWebAppMac"
cat > "$APP_PATH/Contents/Info.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>CFBundleIdentifier</key> <string>${BUNDLE_ID}</string>
<key>CFBundleName</key> <string>${PRODUCT_NAME}</string>
<key>CFBundleDisplayName</key> <string>${PRODUCT_NAME}</string>
<key>CFBundleExecutable</key> <string>CxWebAppMac</string>
<key>CFBundlePackageType</key> <string>APPL</string>
<key>CFBundleShortVersionString</key> <string>${VERSION}</string>
<key>CFBundleVersion</key> <string>${VERSION}</string>
<key>LSMinimumSystemVersion</key> <string>13.0</string>
<key>NSHighResolutionCapable</key> <true/>
<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsLocalNetworking</key><true/></dict>
<key>LSApplicationCategoryType</key> <string>public.app-category.developer-tools</string>
</dict></plist>
PLIST
echo "[3/6] codesign (ad-hoc)"
codesign --force --deep --sign - "$APP_PATH" >/dev/null 2>&1 || true
echo "[4/6] tar.gz"
( cd "$STAGE" && tar -czf "$TGZ_NAME" "${PRODUCT_NAME}.app" )
echo "[5/6] dmg"
DMG_TMP="$STAGE/$DMG_NAME"
rm -f "$DMG_TMP"
hdiutil create -volname "${PRODUCT_NAME} ${VERSION}" \
-srcfolder "$APP_PATH" -ov -format UDZO -quiet \
"$DMG_TMP"
echo "[6/6] publish -> $SHARE_DIR"
mkdir -p "$SHARE_DIR"
# Wipe any prior CxAI-ADE-* / CxAI ADE*.app set; keep folder, replace contents.
find "$SHARE_DIR" -maxdepth 1 \( -name "CxAI-ADE-*" -o -name "CxAI ADE*.app" -o -name "build-info.json" \) -exec rm -rf {} +
# Re-stage fresh artifacts.
ditto "$APP_PATH" "$SHARE_DIR/${PRODUCT_NAME}.app"
cp "$STAGE/$TGZ_NAME" "$SHARE_DIR/$TGZ_NAME"
cp "$DMG_TMP" "$SHARE_DIR/$DMG_NAME"
# Compute hashes & sizes.
sha_tgz=$(shasum -a 256 "$SHARE_DIR/$TGZ_NAME" | awk '{print $1}')
sha_dmg=$(shasum -a 256 "$SHARE_DIR/$DMG_NAME" | awk '{print $1}')
size_dmg=$(stat -f%z "$SHARE_DIR/$DMG_NAME")
size_tgz=$(stat -f%z "$SHARE_DIR/$TGZ_NAME")
built_at=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Best-effort git sha (outer iCloud repo).
git_sha=$( ( cd "$REPO_ROOT" && git rev-parse --short=12 HEAD 2>/dev/null ) || echo "unknown" )
cat > "$SHARE_DIR/build-info.json" <<JSON
{
"name": "${PRODUCT_NAME}",
"version": "${VERSION}",
"identifier": "${BUNDLE_ID}",
"channel": "${CHANNEL}",
"sha": "${git_sha}",
"built_at": "${built_at}",
"description": "Native AppKit/SwiftUI shell for CxAI Studio. Built from CxWebApp/swift-app (CxLLM-SDK + CxLLM-Drive).",
"platform": "macOS 13+ ${ARCH}",
"modules": [
"CxCode", "CxAWS", "CxGit", "CxAgent", "CxMCP",
"CxModels", "CxChat", "CxSPARenderer", "CxInstrument",
"CxLangBridge", "CxARA", "CxDrive"
],
"artifacts": {
"app_tar_gz": "${TGZ_NAME}",
"app_tar_gz_sha256": "${sha_tgz}",
"app_tar_gz_size": ${size_tgz},
"dmg": "${DMG_NAME}",
"dmg_sha256": "${sha_dmg}",
"dmg_size_bytes": ${size_dmg}
},
"download_url": "/static/cxai-mac/${DMG_NAME}"
}
JSON
echo
echo "Published to $SHARE_DIR"
ls -la "$SHARE_DIR"