- Selecting a row in the Profiles tab shows its Claude Desktop and Claude Code dirs inline and selectable, instead of requiring a right-click "Reveal in Finder" to find out where a profile actually lives. - build.sh stamps Contents/Resources/COMMIT with the short HEAD SHA, left empty when HEAD sits exactly on a tag (how a real release is built), since the version number alone is unambiguous there. About appends it when present, so two dev builds off the same VERSION are distinguishable. The update checker still compares plain semver. - Profile dot colours are picked per NSApp.effectiveAppearance at render time: same hue either way, but full saturation with brightness split per background (1.0 dark, 0.55 light), so they read as bold hues rather than washing out on white or muddying against a dark menu. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
73 lines
3.2 KiB
Bash
Executable File
73 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Builds "shannoncoat.app" — a menu bar app (no Dock icon, no window) with a
|
|
# custom icon (icon/AppIcon.icns — see icon/generate-icon.swift) for
|
|
# Finder/Spotlight. It stays running in the menu bar: click the status item
|
|
# to switch profiles, or open Manage Profiles… (Cmd+,) to add/remove one.
|
|
# Launch at Login is a toggle inside the app itself.
|
|
#
|
|
# Builds into ./.build (gitignored) rather than installing straight into an
|
|
# Applications dir — copy/drag the .app from there yourself. It's a fully
|
|
# native, self-contained bundle — no bundled script, so copying it anywhere
|
|
# after the build is safe.
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
SOURCES_DIR="$SCRIPT_DIR/Sources"
|
|
VERSION_FILE="$SCRIPT_DIR/VERSION"
|
|
ICON_SRC="$SCRIPT_DIR/icon/AppIcon.icns"
|
|
OUT_DIR="${1:-$SCRIPT_DIR/.build}"
|
|
APP="$OUT_DIR/shannoncoat.app"
|
|
|
|
# Read from the repo's VERSION file so the .app and the script it bundles
|
|
# never report different numbers.
|
|
VERSION="$(cat "$VERSION_FILE" 2>/dev/null)"
|
|
[[ -n "$VERSION" ]] || { echo "error: couldn't read $VERSION_FILE" >&2; exit 1; }
|
|
|
|
mkdir -p "$OUT_DIR" "$APP/Contents/MacOS" "$APP/Contents/Resources"
|
|
|
|
[[ -f "$ICON_SRC" ]] || { echo "error: $ICON_SRC missing (see icon/generate-icon.swift)" >&2; exit 1; }
|
|
cp "$ICON_SRC" "$APP/Contents/Resources/AppIcon.icns"
|
|
|
|
cat >"$APP/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>CFBundleName</key><string>shannoncoat</string>
|
|
<key>CFBundleDisplayName</key><string>shannoncoat</string>
|
|
<key>CFBundleIdentifier</key><string>com.local.shannoncoat</string>
|
|
<key>CFBundleVersion</key><string>$VERSION</string>
|
|
<key>CFBundleShortVersionString</key><string>$VERSION</string>
|
|
<key>CFBundlePackageType</key><string>APPL</string>
|
|
<key>CFBundleExecutable</key><string>launcher</string>
|
|
<key>CFBundleIconFile</key><string>AppIcon</string>
|
|
<key>LSUIElement</key><true/>
|
|
<key>NSHighResolutionCapable</key><true/>
|
|
</dict>
|
|
</plist>
|
|
PLIST
|
|
|
|
command -v swiftc >/dev/null || { echo "error: swiftc not found (install Xcode Command Line Tools: xcode-select --install)" >&2; exit 1; }
|
|
|
|
# VERSION travels in Resources (not baked into the binary) so the About
|
|
# panel and the update checker read the same file this script stamped into
|
|
# Info.plist above.
|
|
cp "$VERSION_FILE" "$APP/Contents/Resources/VERSION"
|
|
|
|
# COMMIT is the short SHA the About panel appends to the version, so a dev
|
|
# build is distinguishable from another — left empty for a real release
|
|
# build (HEAD sitting exactly on a tag, which is how release.yml checks
|
|
# this out), since the version number alone is unambiguous there.
|
|
GIT_SHA=""
|
|
if git -C "$SCRIPT_DIR" rev-parse --git-dir >/dev/null 2>&1 \
|
|
&& ! git -C "$SCRIPT_DIR" describe --tags --exact-match >/dev/null 2>&1; then
|
|
GIT_SHA="$(git -C "$SCRIPT_DIR" rev-parse --short HEAD 2>/dev/null || true)"
|
|
fi
|
|
printf '%s' "$GIT_SHA" >"$APP/Contents/Resources/COMMIT"
|
|
|
|
swiftc -O "$SOURCES_DIR"/*.swift -o "$APP/Contents/MacOS/launcher"
|
|
|
|
touch "$APP"
|
|
echo "Built: $APP"
|
|
echo "Copy it to /Applications (or ~/Applications) to install."
|