mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-16 13:03:31 +08:00
This folds together the desktop-side fixes needed before broader rollout. Session resume no longer deadlocks waiting on init, Mermaid and inline image output render inside chat, task and sub-agent state stay visible during execution, local build/release paths are safer, and Feishu/Telegram now expose lightweight mobile commands (/help, /status, /clear) without adding a new adapter-specific protocol. Constraint: Desktop releases must publish updater artifacts from non-draft GitHub releases Constraint: IM commands need short, phone-friendly responses and low operational complexity Rejected: Add a dedicated IM command API surface | re-used existing slash commands and session/task REST endpoints to keep adapters thin Rejected: Wait for task_update push events in WebUI | added low-risk polling because the current frontend ignores that event path Confidence: medium Scope-risk: broad Reversibility: clean Directive: Keep IM command replies terse and mobile-first, and merge local fallback slash commands when server-provided lists are partial Tested: cd desktop && bun x vitest run src/components/chat/MermaidRenderer.test.tsx src/components/markdown/MarkdownRenderer.test.tsx Tested: cd desktop && bun x vitest run src/components/chat/composerUtils.test.ts src/pages/ActiveSession.test.tsx src/stores/chatStore.test.ts Tested: cd desktop && bun run lint Tested: bun test src/server/__tests__/conversations.test.ts --test-name-pattern "SDK init arrives only after the first user turn" --timeout 60000 Tested: cd adapters && bun test common/ feishu/ telegram/ Tested: cd adapters && bunx tsc --noEmit Not-tested: Full GitHub Actions release run on all three desktop platforms Not-tested: Local DMG packaging end-to-end on Apple Silicon Not-tested: Real Feishu/Telegram device sessions against a live adapter process
100 lines
2.4 KiB
Bash
Executable File
100 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
DESKTOP_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
REPO_ROOT="$(cd "${DESKTOP_DIR}/.." && pwd)"
|
|
|
|
TARGET_TRIPLE="aarch64-apple-darwin"
|
|
OUTPUT_DIR="${DESKTOP_DIR}/src-tauri/target/release/bundle/dmg"
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Build Claude Code Haha desktop for macOS Apple Silicon and output a DMG.
|
|
|
|
Usage:
|
|
./desktop/scripts/build-macos-arm64.sh [extra tauri build args...]
|
|
|
|
Environment:
|
|
SKIP_INSTALL=1 Skip `bun install` in the repo root and desktop app.
|
|
SIGN_BUILD=1 Remove the default `--no-sign` flag and allow signed builds.
|
|
OPEN_OUTPUT=1 Open the DMG output directory in Finder after a successful build.
|
|
|
|
Examples:
|
|
./desktop/scripts/build-macos-arm64.sh
|
|
SKIP_INSTALL=1 ./desktop/scripts/build-macos-arm64.sh
|
|
SIGN_BUILD=1 ./desktop/scripts/build-macos-arm64.sh --skip-stapling
|
|
EOF
|
|
}
|
|
|
|
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
|
usage
|
|
exit 0
|
|
fi
|
|
|
|
if [[ "$(uname -s)" != "Darwin" ]]; then
|
|
echo "[build-macos-arm64] This script must run on macOS." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$(uname -m)" != "arm64" ]]; then
|
|
echo "[build-macos-arm64] This script is intended for Apple Silicon hosts (arm64)." >&2
|
|
exit 1
|
|
fi
|
|
|
|
for command in bun cargo rustc; do
|
|
if ! command -v "${command}" >/dev/null 2>&1; then
|
|
echo "[build-macos-arm64] Missing required command: ${command}" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
if [[ "${SKIP_INSTALL:-0}" != "1" ]]; then
|
|
echo "[build-macos-arm64] Installing root dependencies..."
|
|
(cd "${REPO_ROOT}" && bun install)
|
|
|
|
echo "[build-macos-arm64] Installing desktop dependencies..."
|
|
(cd "${DESKTOP_DIR}" && bun install)
|
|
fi
|
|
|
|
TAURI_ARGS=(
|
|
bunx
|
|
tauri
|
|
build
|
|
--target
|
|
"${TARGET_TRIPLE}"
|
|
--bundles
|
|
dmg
|
|
--ci
|
|
)
|
|
|
|
if [[ "${SIGN_BUILD:-0}" != "1" ]]; then
|
|
TAURI_ARGS+=(--no-sign)
|
|
fi
|
|
|
|
if [[ "$#" -gt 0 ]]; then
|
|
TAURI_ARGS+=("$@")
|
|
fi
|
|
|
|
echo "[build-macos-arm64] Building DMG for ${TARGET_TRIPLE}..."
|
|
(
|
|
cd "${DESKTOP_DIR}"
|
|
export TAURI_ENV_TARGET_TRIPLE="${TARGET_TRIPLE}"
|
|
"${TAURI_ARGS[@]}"
|
|
)
|
|
|
|
LATEST_DMG="$(find "${OUTPUT_DIR}" -maxdepth 1 -type f -name '*.dmg' | sort | tail -n 1 || true)"
|
|
|
|
echo
|
|
echo "[build-macos-arm64] Build finished."
|
|
if [[ -n "${LATEST_DMG}" ]]; then
|
|
echo "[build-macos-arm64] DMG: ${LATEST_DMG}"
|
|
else
|
|
echo "[build-macos-arm64] No DMG found in ${OUTPUT_DIR}" >&2
|
|
fi
|
|
|
|
if [[ "${OPEN_OUTPUT:-0}" == "1" ]]; then
|
|
open "${OUTPUT_DIR}"
|
|
fi
|