From 9968e537987c21cf52f3dbbc4c739e8fd224265b Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 13:16:10 +0800 Subject: [PATCH 01/17] feat(screenshot): make ScreenCaptureKit opt-in via --with-frame flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Default screenshot now uses Electron renderer canvas only — no Screen Recording permission required. Add --with-frame flag to explicitly use ScreenCaptureKit for full window frame capture. Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-cli/src/client.rs | 9 +++- crates/cli-box-cli/src/main.rs | 29 +++++++----- crates/cli-box-core/src/daemon/mod.rs | 64 +++++++++++++++++++++++++-- crates/cli-box-core/src/server/mod.rs | 7 +++ entitlements.plist | 2 - 5 files changed, 93 insertions(+), 18 deletions(-) diff --git a/crates/cli-box-cli/src/client.rs b/crates/cli-box-cli/src/client.rs index cf3002b..24f40ba 100644 --- a/crates/cli-box-cli/src/client.rs +++ b/crates/cli-box-cli/src/client.rs @@ -114,11 +114,16 @@ pub async fn daemon_list_sandboxes() -> Result> { /// Take a screenshot of a sandbox via the daemon HTTP API. /// Returns PNG data along with fallback info from response headers. -pub async fn daemon_screenshot(sandbox_id: &str) -> Result { +pub async fn daemon_screenshot(sandbox_id: &str, with_frame: bool) -> Result { let base = daemon_base_url()?; let client = reqwest_client(); + let url = if with_frame { + format!("{base}/box/{sandbox_id}/screenshot?with_frame=true") + } else { + format!("{base}/box/{sandbox_id}/screenshot") + }; let resp = client - .get(format!("{base}/box/{sandbox_id}/screenshot")) + .get(url) .send() .await .with_context(|| "screenshot request to daemon failed")?; diff --git a/crates/cli-box-cli/src/main.rs b/crates/cli-box-cli/src/main.rs index a443086..541be2d 100644 --- a/crates/cli-box-cli/src/main.rs +++ b/crates/cli-box-cli/src/main.rs @@ -109,6 +109,10 @@ enum Commands { /// Window ID to capture (overrides auto-detection) #[arg(long)] window_id: Option, + + /// Use ScreenCaptureKit to capture the full window frame (requires Screen Recording permission) + #[arg(long)] + with_frame: bool, }, /// List all visible windows on the system @@ -248,8 +252,9 @@ async fn main() -> anyhow::Result<()> { output, id, window_id: _window_id, + with_frame, } => { - cmd_screenshot_daemon(&output, id.as_deref()).await?; + cmd_screenshot_daemon(&output, id.as_deref(), with_frame).await?; } Commands::Windows => { cmd_windows()?; @@ -638,21 +643,21 @@ async fn cmd_click_daemon(x: f64, y: f64, id: &str, button: &str) -> anyhow::Res } /// Take a screenshot via the daemon API. -async fn cmd_screenshot_daemon(output: &std::path::Path, id: Option<&str>) -> anyhow::Result<()> { +async fn cmd_screenshot_daemon( + output: &std::path::Path, + id: Option<&str>, + with_frame: bool, +) -> anyhow::Result<()> { let sandbox_id = id.ok_or_else(|| { anyhow::anyhow!( "--id is required for screenshots. Use: cli-box screenshot --id " ) })?; - let result = client::daemon_screenshot(sandbox_id).await?; + let result = client::daemon_screenshot(sandbox_id, with_frame).await?; if result.source.as_deref() == Some("screencapturekit") { - eprintln!( - "Warning: screenshot used ScreenCaptureKit fallback (captured entire window).\n Reason: {}", - result.fallback_reason.as_deref().unwrap_or("unknown") - ); - eprintln!(" For terminal-only screenshots, ensure the Electron app is connected."); + eprintln!("Screenshot captured with ScreenCaptureKit (full window frame)."); } std::fs::write(output, &result.png_data) @@ -1193,11 +1198,12 @@ fn mcp_tools() -> serde_json::Value { }, { "name": "screenshot_sandbox", - "description": "Take a screenshot of a sandbox (returns base64 PNG)", + "description": "Take a screenshot of a sandbox (returns base64 PNG). Default: renderer capture (no permission needed). Use with_frame=true for full window capture (requires Screen Recording permission).", "inputSchema": { "type": "object", "properties": { - "sandbox_id": { "type": "string" } + "sandbox_id": { "type": "string" }, + "with_frame": { "type": "boolean", "description": "Use ScreenCaptureKit for full window frame capture (requires Screen Recording permission)", "default": false } }, "required": ["sandbox_id"] } @@ -1318,7 +1324,8 @@ async fn handle_mcp_tool(name: &str, args: &serde_json::Value) -> serde_json::Va } "screenshot_sandbox" => { let id = args["sandbox_id"].as_str().unwrap_or(""); - let result = client::daemon_screenshot(id).await?; + let with_frame = args["with_frame"].as_bool().unwrap_or(false); + let result = client::daemon_screenshot(id, with_frame).await?; let b64 = base64_encode(&result.png_data); let mut response = serde_json::json!({ "sandbox_id": id, "image_base64": b64 }); if let Some(ref source) = result.source { diff --git a/crates/cli-box-core/src/daemon/mod.rs b/crates/cli-box-core/src/daemon/mod.rs index c8b7865..8728a81 100644 --- a/crates/cli-box-core/src/daemon/mod.rs +++ b/crates/cli-box-core/src/daemon/mod.rs @@ -428,9 +428,16 @@ async fn close_sandbox_handler( Ok(Json(serde_json::json!({"closed": id}))) } +#[derive(Deserialize)] +struct ScreenshotQuery { + #[serde(default)] + with_frame: bool, +} + async fn screenshot_handler( State(state): State>>, Path(id): Path, + axum::extract::Query(q): axum::extract::Query, ) -> Result { // Verify sandbox exists { @@ -440,7 +447,12 @@ async fn screenshot_handler( } } - // Attempt 1: Ask the Electron renderer to capture via WebSocket + if q.with_frame { + // --with-frame: use ScreenCaptureKit directly, skip renderer + return screenshot_with_frame(state, &id).await; + } + + // Default: renderer only, no SCK fallback match request_renderer_screenshot(state.clone(), &id).await { Ok(png_data) => { tracing::info!( @@ -452,11 +464,14 @@ async fn screenshot_handler( } Err(reason) => { tracing::warn!( - "[screenshot] renderer capture failed for sandbox {}: {}; falling back to ScreenCaptureKit", + "[screenshot] renderer capture failed for sandbox {}: {}", id, reason ); - return screenshot_fallback(state, &id).await; + Err(AppError::Screenshot(format!( + "Screenshot failed: {}. Use --with-frame to capture via ScreenCaptureKit (requires Screen Recording permission).", + reason + ))) } } } @@ -483,6 +498,7 @@ fn screenshot_response(png_data: Vec, source: &str, fallback_reason: Option< /// Capture a screenshot via ScreenCaptureKit as a fallback, returning headers /// that indicate the fallback source and reason. +#[allow(dead_code)] async fn screenshot_fallback( state: Arc>, id: &str, @@ -545,6 +561,48 @@ async fn screenshot_fallback( )) } +/// Capture a screenshot using ScreenCaptureKit (requires Screen Recording permission). +async fn screenshot_with_frame( + state: Arc>, + id: &str, +) -> Result { + let window_id = { + let s = state.lock().await; + s.sandboxes.get(id).and_then(|sb| sb.window_id) + }; + + let wid = match window_id { + Some(wid) => wid, + None => { + let new_wid = + tokio::task::spawn_blocking(|| ScreenCapture::find_window_by_title("CLI Box")) + .await + .map_err(|e| { + AppError::Screenshot(format!("window discovery task failed: {e}")) + })??; + let mut s = state.lock().await; + if let Some(sb) = s.sandboxes.get_mut(id) { + sb.window_id = Some(new_wid); + } + let registry = InstanceRegistry::default(); + let _ = registry.update_window_id(id, new_wid); + new_wid + } + }; + + let result = tokio::task::spawn_blocking(move || ScreenCapture::capture_window(wid)) + .await + .map_err(|e| AppError::Screenshot(format!("screenshot task failed: {e}")))?; + + match result { + Ok(png_data) => Ok(screenshot_response(png_data, "screencapturekit", None)), + Err(e) => Err(AppError::Screenshot(format!( + "{}. If permission was denied, grant Screen Recording in System Settings → Privacy & Security → Screen Recording.", + e + ))), + } +} + // ── Screenshot WebSocket ──────────────────────────────────────── /// Request a screenshot from the Electron renderer via WebSocket. diff --git a/crates/cli-box-core/src/server/mod.rs b/crates/cli-box-core/src/server/mod.rs index b110972..071ca9e 100644 --- a/crates/cli-box-core/src/server/mod.rs +++ b/crates/cli-box-core/src/server/mod.rs @@ -136,6 +136,8 @@ struct RegionQuery { struct ScreenshotQuery { #[serde(default)] window_id: Option, + #[serde(default)] + with_frame: bool, } #[derive(Deserialize)] @@ -406,6 +408,11 @@ async fn screenshot_handler( let window_id = q.window_id.or(state.lock().await.window_id); match window_id { Some(id) => { + if !q.with_frame { + return Err(AppError::Screenshot( + "Default screenshot is not supported in legacy mode. Use ?with_frame=true (requires Screen Recording permission).".to_string() + )); + } let png_data = ScreenCapture::capture_window(id)?; Ok((StatusCode::OK, [("content-type", "image/png")], png_data).into_response()) } diff --git a/entitlements.plist b/entitlements.plist index 0f05cde..6883e4a 100644 --- a/entitlements.plist +++ b/entitlements.plist @@ -6,7 +6,5 @@ com.apple.security.cs.disable-library-validation - com.apple.developer.screen-capture - From 8960829c157ab0e83865bc791a157bfdbc12a543 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 13:29:05 +0800 Subject: [PATCH 02/17] fix: address code review feedback - Remove dead screenshot_fallback function - Add stale window ID handling to screenshot_with_frame - Add tests for with_frame=true query param path - Add test for default screenshot rejection without with_frame Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-core/src/daemon/mod.rs | 115 ++++++++++++-------------- crates/cli-box-core/src/server/mod.rs | 34 ++++++-- 2 files changed, 79 insertions(+), 70 deletions(-) diff --git a/crates/cli-box-core/src/daemon/mod.rs b/crates/cli-box-core/src/daemon/mod.rs index 8728a81..f161f4a 100644 --- a/crates/cli-box-core/src/daemon/mod.rs +++ b/crates/cli-box-core/src/daemon/mod.rs @@ -496,35 +496,24 @@ fn screenshot_response(png_data: Vec, source: &str, fallback_reason: Option< (StatusCode::OK, headers, png_data).into_response() } -/// Capture a screenshot via ScreenCaptureKit as a fallback, returning headers -/// that indicate the fallback source and reason. -#[allow(dead_code)] -async fn screenshot_fallback( +/// Capture a screenshot using ScreenCaptureKit (requires Screen Recording permission). +/// Handles stale window IDs by re-discovering the window by title. +async fn screenshot_with_frame( state: Arc>, id: &str, ) -> Result { - tracing::info!( - "[screenshot] using ScreenCaptureKit fallback for sandbox {} (captures entire window)", - id - ); - let window_id = { let s = state.lock().await; s.sandboxes.get(id).and_then(|sb| sb.window_id) }; + // Try stored window_id first, handle stale IDs if let Some(wid) = window_id { let result = tokio::task::spawn_blocking(move || ScreenCapture::capture_window(wid)) .await .map_err(|e| AppError::Screenshot(format!("screenshot task failed: {e}")))?; match result { - Ok(png_data) => { - return Ok(screenshot_response( - png_data, - "screencapturekit", - Some("renderer_unavailable"), - )); - } + Ok(png_data) => return Ok(screenshot_response(png_data, "screencapturekit", None)), Err(AppError::WindowNotFound(_)) => { tracing::warn!( "Stored window_id={} for sandbox {} is stale, re-discovering", @@ -532,11 +521,17 @@ async fn screenshot_fallback( id ); } + Err(AppError::Screenshot(msg)) if msg.contains("permission") || msg.contains("denied") => { + return Err(AppError::Screenshot(format!( + "{}. Grant Screen Recording in System Settings → Privacy & Security → Screen Recording.", + msg + ))); + } Err(e) => return Err(e), } } - // Re-discover the Electron window by title + // Re-discover window by title let new_wid = tokio::task::spawn_blocking(|| ScreenCapture::find_window_by_title("CLI Box")) .await .map_err(|e| AppError::Screenshot(format!("window discovery task failed: {e}")))??; @@ -554,53 +549,7 @@ async fn screenshot_fallback( let png_data = tokio::task::spawn_blocking(move || ScreenCapture::capture_window(new_wid)) .await .map_err(|e| AppError::Screenshot(format!("screenshot task failed: {e}")))??; - Ok(screenshot_response( - png_data, - "screencapturekit", - Some("renderer_unavailable"), - )) -} - -/// Capture a screenshot using ScreenCaptureKit (requires Screen Recording permission). -async fn screenshot_with_frame( - state: Arc>, - id: &str, -) -> Result { - let window_id = { - let s = state.lock().await; - s.sandboxes.get(id).and_then(|sb| sb.window_id) - }; - - let wid = match window_id { - Some(wid) => wid, - None => { - let new_wid = - tokio::task::spawn_blocking(|| ScreenCapture::find_window_by_title("CLI Box")) - .await - .map_err(|e| { - AppError::Screenshot(format!("window discovery task failed: {e}")) - })??; - let mut s = state.lock().await; - if let Some(sb) = s.sandboxes.get_mut(id) { - sb.window_id = Some(new_wid); - } - let registry = InstanceRegistry::default(); - let _ = registry.update_window_id(id, new_wid); - new_wid - } - }; - - let result = tokio::task::spawn_blocking(move || ScreenCapture::capture_window(wid)) - .await - .map_err(|e| AppError::Screenshot(format!("screenshot task failed: {e}")))?; - - match result { - Ok(png_data) => Ok(screenshot_response(png_data, "screencapturekit", None)), - Err(e) => Err(AppError::Screenshot(format!( - "{}. If permission was denied, grant Screen Recording in System Settings → Privacy & Security → Screen Recording.", - e - ))), - } + Ok(screenshot_response(png_data, "screencapturekit", None)) } // ── Screenshot WebSocket ──────────────────────────────────────── @@ -1499,6 +1448,44 @@ mod tests { assert_eq!(resp.status(), StatusCode::NOT_FOUND); } + #[tokio::test] + async fn screenshot_with_frame_attempts_sck() { + let app = test_daemon_router_with_sandbox(); + let resp = app + .oneshot( + Request::builder() + .uri("/box/test-sb/screenshot?with_frame=true") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + // with_frame=true routes to SCK path which will fail (no real window), + // but it should NOT be a 404 — it proves the query param is parsed + let status = resp.status(); + assert!( + !status.is_client_error(), + "with_frame=true should not be a client error, got {status}" + ); + } + + #[tokio::test] + async fn screenshot_without_frame_fails_when_renderer_unavailable() { + let app = test_daemon_router_with_sandbox(); + let resp = app + .oneshot( + Request::builder() + .uri("/box/test-sb/screenshot") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + // Default path (no with_frame) tries renderer only, should fail with 500 + // since no renderer WebSocket is connected in tests + assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR); + } + #[tokio::test] async fn click_valid_request() { let app = test_daemon_router_with_sandbox(); diff --git a/crates/cli-box-core/src/server/mod.rs b/crates/cli-box-core/src/server/mod.rs index 071ca9e..90ab2f1 100644 --- a/crates/cli-box-core/src/server/mod.rs +++ b/crates/cli-box-core/src/server/mod.rs @@ -1350,7 +1350,7 @@ mod tests { } #[tokio::test] - async fn standalone_rejects_screenshot() { + async fn standalone_rejects_screenshot_without_with_frame() { let app = test_router(); let resp = app .oneshot( @@ -1361,12 +1361,34 @@ mod tests { ) .await .unwrap(); - // When window_id is Some(42) in test state, screenshot tries to capture - // which fails on non-macOS or without permissions, returning 404 or 500 + // Without ?with_frame=true, legacy server returns 500 with guidance message + assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR); + let body = axum::body::to_bytes(resp.into_body(), 1024).await.unwrap(); + let json: serde_json::Value = serde_json::from_slice(&body).unwrap(); + assert!(json["error"] + .as_str() + .unwrap() + .contains("with_frame")); + } + + #[tokio::test] + async fn screenshot_with_frame_attempts_capture() { + let app = test_router(); + let resp = app + .oneshot( + Request::builder() + .uri("/screenshot?with_frame=true") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + // with_frame=true attempts SCK capture, may succeed (200), fail with + // permission error (500), or window-not-found (404) in test env let status = resp.status(); assert!( matches!(status.as_u16(), 200 | 404 | 500), - "unexpected status: {status}" + "with_frame=true should attempt capture, got {status}" ); } @@ -1402,12 +1424,12 @@ mod tests { #[tokio::test] async fn screenshot_with_query_window_id() { - // Test that window_id from query parameter is used + // Test that window_id from query parameter is used when with_frame=true let app = test_router(); let resp = app .oneshot( Request::builder() - .uri("/screenshot?window_id=999") + .uri("/screenshot?window_id=999&with_frame=true") .body(Body::empty()) .unwrap(), ) From 29a8b00ce7257db3a45a29439bc81d2d458d1f78 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 13:44:46 +0800 Subject: [PATCH 03/17] docs: add E2E test design for screenshot --with-frame Co-Authored-By: Claude Opus 4.7 --- .../2026-06-05-screenshot-e2e-tests-design.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 docs/superpowers/specs/2026-06-05-screenshot-e2e-tests-design.md diff --git a/docs/superpowers/specs/2026-06-05-screenshot-e2e-tests-design.md b/docs/superpowers/specs/2026-06-05-screenshot-e2e-tests-design.md new file mode 100644 index 0000000..a23b389 --- /dev/null +++ b/docs/superpowers/specs/2026-06-05-screenshot-e2e-tests-design.md @@ -0,0 +1,37 @@ +# Screenshot --with-frame E2E Tests Design + +## Goal + +Add E2E test coverage for the `--with-frame` screenshot feature, covering both daemon routing logic (CI-runnable) and full CLI flow (local macOS only). + +## Approach + +Two test layers: + +1. **Rust integration tests** — `oneshot` HTTP tests against daemon router, verifying `with_frame` query param routing. CI-runnable, no macOS dependencies. +2. **Shell E2E tests** — Build CLI binary, start daemon, run `cli-box screenshot` commands, verify output and exit codes. Local macOS only (skip CI). + +## Rust Integration Tests + +File: `crates/cli-box-core/tests/daemon_integration.rs` + +| Test | Request | Assertion | +|------|---------|-----------| +| `screenshot_with_frame_nonexistent` | `GET /box/no-such-id/screenshot?with_frame=true` | 404 | +| `screenshot_default_nonexistent` | `GET /box/no-such-id/screenshot` | 404 | +| `screenshot_with_frame_query_parsed` | `GET /box/test-sb/screenshot?with_frame=true` | Not 400 (param parsed correctly) | + +## Shell E2E Tests + +File: `tests/e2e-screenshot-with-frame.sh` + +Flow: +1. Build CLI binary (reuse `ensure_platform_binaries` pattern) +2. Start daemon: `cli-box start zsh` +3. Wait for sandbox ready +4. Test: `cli-box screenshot --id ` — verify exit code, file output +5. Test: `cli-box screenshot --id --with-frame` — verify exit code, error message guidance +6. Test: `cli-box screenshot --id --with-frame -o /tmp/test.png` — verify file +7. Cleanup: `cli-box close ` + +CI skip: `uname == Darwin && CI` → skip (same pattern as `e2e-skill-install.sh`) From 629c6ce90f10231c14a7cd4a8758d104cc79c63f Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 13:46:16 +0800 Subject: [PATCH 04/17] test: add E2E tests for screenshot --with-frame - Rust IT: verify with_frame query param routing (CI-runnable) - Shell E2E: full CLI flow test (local macOS only, skips CI) Co-Authored-By: Claude Opus 4.7 --- .../cli-box-core/tests/daemon_integration.rs | 15 ++ tests/e2e-screenshot-with-frame.sh | 233 ++++++++++++++++++ 2 files changed, 248 insertions(+) create mode 100755 tests/e2e-screenshot-with-frame.sh diff --git a/crates/cli-box-core/tests/daemon_integration.rs b/crates/cli-box-core/tests/daemon_integration.rs index ef13cb9..1383e14 100644 --- a/crates/cli-box-core/tests/daemon_integration.rs +++ b/crates/cli-box-core/tests/daemon_integration.rs @@ -111,6 +111,21 @@ async fn screenshot_nonexistent_returns_404() { assert_eq!(resp.status(), StatusCode::NOT_FOUND); } +#[tokio::test] +async fn screenshot_with_frame_nonexistent_returns_404() { + let resp = router() + .oneshot( + Request::builder() + .uri("/box/no-such-id/screenshot?with_frame=true") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(resp.status(), StatusCode::NOT_FOUND); +} + #[tokio::test] async fn unknown_route_returns_404() { let resp = router() diff --git a/tests/e2e-screenshot-with-frame.sh b/tests/e2e-screenshot-with-frame.sh new file mode 100755 index 0000000..feca9d5 --- /dev/null +++ b/tests/e2e-screenshot-with-frame.sh @@ -0,0 +1,233 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================ +# E2E Screenshot --with-frame Test +# ============================================================ +# Verifies that cli-box screenshot works with and without +# the --with-frame flag. Tests the full CLI → daemon flow. +# +# Usage: bash tests/e2e-screenshot-with-frame.sh +# ============================================================ + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +NC='\033[0m' + +info() { echo -e "${GREEN}➜${NC} $*"; } +warn() { echo -e "${YELLOW}⚠${NC} $*"; } +err() { echo -e "${RED}✗${NC} $*"; } +ok() { echo -e "${GREEN}✓${NC} $*"; } + +FAILED=0 + +# ==================== Skip on Linux CI ==================== +if [ "$(uname)" = "Linux" ] && [ -n "${CI:-}" ]; then + warn "Skipping E2E screenshot tests on Linux CI (macOS required)" + exit 0 +fi + +# ==================== Skip on CI (requires macOS permissions) ==================== +if [ -n "${CI:-}" ]; then + warn "Skipping E2E screenshot tests on CI (Screen Recording permission required)" + exit 0 +fi + +# ==================== Setup: ensure platform package has binaries ==================== +ensure_platform_binaries() { + local PKG_BIN="$REPO_ROOT/packages/cli-box-darwin-arm64/bin" + if [ -f "$PKG_BIN/cli-box" ] && [ -f "$PKG_BIN/cli-box-daemon" ]; then + return + fi + + info "Building binaries..." + if ! cargo build -p cli-box-cli -p cli-box-daemon 2>&1; then + err "cargo build failed" + exit 1 + fi + + mkdir -p "$PKG_BIN" + if [ -f "$REPO_ROOT/target/release/cli-box" ]; then + ln -sf "$REPO_ROOT/target/release/cli-box" "$PKG_BIN/cli-box" + ln -sf "$REPO_ROOT/target/release/cli-box-daemon" "$PKG_BIN/cli-box-daemon" + elif [ -f "$REPO_ROOT/target/debug/cli-box" ]; then + ln -sf "$REPO_ROOT/target/debug/cli-box" "$PKG_BIN/cli-box" + ln -sf "$REPO_ROOT/target/debug/cli-box-daemon" "$PKG_BIN/cli-box-daemon" + else + err "No built binaries found" + exit 1 + fi + + ok "Binaries ready" +} + +# ==================== Find CLI binary ==================== +find_cli() { + if [ -f "$REPO_ROOT/target/release/cli-box" ]; then + echo "$REPO_ROOT/target/release/cli-box" + elif [ -f "$REPO_ROOT/target/debug/cli-box" ]; then + echo "$REPO_ROOT/target/debug/cli-box" + else + err "cli-box binary not found" + exit 1 + fi +} + +# ==================== Test 1: Default screenshot (no --with-frame) ==================== +test_default_screenshot() { + info "Test 1: Default screenshot (renderer path)" + + local CLI="$1" + local SANDBOX_ID="$2" + + local OUT_FILE + OUT_FILE=$(mktemp /tmp/cli-box-screenshot-XXXXXX.png) + + # Default screenshot uses renderer path, should work without Screen Recording permission + if "$CLI" screenshot --id "$SANDBOX_ID" -o "$OUT_FILE" 2>&1; then + if [ -f "$OUT_FILE" ] && [ -s "$OUT_FILE" ]; then + ok " Default screenshot saved ($(wc -c < "$OUT_FILE") bytes)" + else + err " Screenshot file is empty or missing" + FAILED=1 + fi + else + # May fail if renderer is not connected — that's acceptable + warn " Default screenshot failed (renderer may not be connected)" + fi + + rm -f "$OUT_FILE" +} + +# ==================== Test 2: --with-frame screenshot ==================== +test_with_frame_screenshot() { + info "Test 2: --with-frame screenshot (ScreenCaptureKit path)" + + local CLI="$1" + local SANDBOX_ID="$2" + + local OUT_FILE + OUT_FILE=$(mktemp /tmp/cli-box-screenshot-XXXXXX.png) + + local OUTPUT + OUTPUT=$("$CLI" screenshot --id "$SANDBOX_ID" --with-frame -o "$OUT_FILE" 2>&1) && local EXIT_CODE=0 || local EXIT_CODE=$? + + if [ $EXIT_CODE -eq 0 ]; then + # Succeeded — Screen Recording permission granted + if [ -f "$OUT_FILE" ] && [ -s "$OUT_FILE" ]; then + ok " --with-frame screenshot saved ($(wc -c < "$OUT_FILE") bytes)" + # Verify the output mentions ScreenCaptureKit + if echo "$OUTPUT" | grep -qi "screencapturekit\|ScreenCaptureKit"; then + ok " Output confirms ScreenCaptureKit was used" + else + warn " Output does not mention ScreenCaptureKit (may be using renderer)" + fi + else + err " Screenshot file is empty or missing" + FAILED=1 + fi + else + # Failed — likely no Screen Recording permission + if echo "$OUTPUT" | grep -qi "screen recording\|permission\|with_frame"; then + ok " --with-frame correctly reports permission error" + else + err " --with-frame failed with unexpected error: $OUTPUT" + FAILED=1 + fi + fi + + rm -f "$OUT_FILE" +} + +# ==================== Test 3: --with-frame error message guidance ==================== +test_with_frame_error_guidance() { + info "Test 3: --with-frame error message guidance" + + local CLI="$1" + local SANDBOX_ID="$2" + + # Try --with-frame and check that error messages are helpful + local OUTPUT + OUTPUT=$("$CLI" screenshot --id "$SANDBOX_ID" --with-frame 2>&1) && local EXIT_CODE=0 || local EXIT_CODE=$? + + if [ $EXIT_CODE -ne 0 ]; then + # Check error message contains helpful guidance + if echo "$OUTPUT" | grep -qi "screen recording\|permission\|system settings"; then + ok " Error message provides permission guidance" + else + warn " Error message could be more helpful: $OUTPUT" + fi + else + ok " --with-frame succeeded (permission already granted)" + fi +} + +# ==================== Main ==================== +echo "" +echo "==============================================" +echo " E2E Screenshot --with-frame Tests" +echo "==============================================" +echo "" + +ensure_platform_binaries + +CLI=$(find_cli) +info "Using CLI: $CLI" + +# Verify CLI works +if ! "$CLI" --help >/dev/null 2>&1; then + err "cli-box --help failed" + exit 1 +fi +ok "CLI is functional" + +# Kill any existing daemon to start fresh +"$CLI" close-all 2>/dev/null || true +sleep 1 + +# Start a sandbox +info "Starting sandbox..." +START_OUTPUT=$("$CLI" start zsh 2>&1) || true +SANDBOX_ID=$(echo "$START_OUTPUT" | grep -oE '[a-f0-9]{6}' | head -1 || true) + +if [ -z "$SANDBOX_ID" ]; then + err "Failed to start sandbox" + err "Output: $START_OUTPUT" + exit 1 +fi + +ok "Sandbox started: $SANDBOX_ID" + +# Wait for sandbox to be ready +sleep 3 + +# Cleanup on exit +cleanup() { + info "Cleaning up sandbox $SANDBOX_ID..." + "$CLI" close "$SANDBOX_ID" 2>/dev/null || true +} +trap cleanup EXIT + +echo "" + +# Run tests +test_default_screenshot "$CLI" "$SANDBOX_ID" +echo "" +test_with_frame_screenshot "$CLI" "$SANDBOX_ID" +echo "" +test_with_frame_error_guidance "$CLI" "$SANDBOX_ID" + +# ==================== Summary ==================== +echo "" +echo "==============================================" +if [ "$FAILED" -eq 0 ]; then + echo -e "${GREEN}All E2E screenshot tests passed!${NC}" + exit 0 +else + echo -e "${RED}Some E2E screenshot tests failed.${NC}" + exit 1 +fi From 6ce217870bc9a26a4badb2bafaaf43e14ffdb707 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 19:14:12 +0800 Subject: [PATCH 05/17] fix: cargo fmt and test.sh remnant check false positive Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-core/src/daemon/mod.rs | 4 +++- crates/cli-box-core/src/server/mod.rs | 5 +---- test.sh | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/cli-box-core/src/daemon/mod.rs b/crates/cli-box-core/src/daemon/mod.rs index f161f4a..88b94e7 100644 --- a/crates/cli-box-core/src/daemon/mod.rs +++ b/crates/cli-box-core/src/daemon/mod.rs @@ -521,7 +521,9 @@ async fn screenshot_with_frame( id ); } - Err(AppError::Screenshot(msg)) if msg.contains("permission") || msg.contains("denied") => { + Err(AppError::Screenshot(msg)) + if msg.contains("permission") || msg.contains("denied") => + { return Err(AppError::Screenshot(format!( "{}. Grant Screen Recording in System Settings → Privacy & Security → Screen Recording.", msg diff --git a/crates/cli-box-core/src/server/mod.rs b/crates/cli-box-core/src/server/mod.rs index 90ab2f1..2b9fda2 100644 --- a/crates/cli-box-core/src/server/mod.rs +++ b/crates/cli-box-core/src/server/mod.rs @@ -1365,10 +1365,7 @@ mod tests { assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR); let body = axum::body::to_bytes(resp.into_body(), 1024).await.unwrap(); let json: serde_json::Value = serde_json::from_slice(&body).unwrap(); - assert!(json["error"] - .as_str() - .unwrap() - .contains("with_frame")); + assert!(json["error"].as_str().unwrap().contains("with_frame")); } #[tokio::test] diff --git a/test.sh b/test.sh index 1eff5cc..beed860 100755 --- a/test.sh +++ b/test.sh @@ -113,7 +113,7 @@ info "Checking for 'sandbox' remnants in user-facing strings..." # Check specific files that were renamed for leftover "sandbox" references # in user-visible strings (help text, error messages, log prefixes) SANDBOX_REMNANTS=$(grep -rn '"sandbox' crates/cli-box-cli/src/ crates/cli-box-core/src/daemon/mod.rs electron-app/src/renderer/ --include='*.rs' --include='*.ts' --include='*.tsx' 2>/dev/null \ - | grep -v '//\|/\*\|\*\|#\|test\|Test\|TEST\|sandbox_state\|sandbox_config\|SandboxConfig\|SandboxState\|ManagedSandbox\|SandboxInstance\|sandbox_id\|sandbox/\|/sandbox\|sandbox-daemon\|sandbox-cli\|sandbox-core\|sandbox-electron\|SANDBOX_\|sandbox_daemon\|sandbox_cli\|sandbox_core\|Sandbox\|\.sandbox\|sandbox\.json\|instances/\|pty_store\|SandboxRegion\|SandboxInfo\|SandboxKind\|SandboxStatus' || true) + | grep -v '//\|/\*\|\*\|#\|test\|Test\|TEST\|sandbox_state\|sandbox_config\|SandboxConfig\|SandboxState\|ManagedSandbox\|SandboxInstance\|sandbox_id\|sandbox/\|/sandbox\|sandbox-daemon\|sandbox-cli\|sandbox-core\|sandbox-electron\|SANDBOX_\|sandbox_daemon\|sandbox_cli\|sandbox_core\|Sandbox\|\.sandbox\|sandbox\.json\|instances/\|pty_store\|SandboxRegion\|SandboxInfo\|SandboxKind\|SandboxStatus\|\["sandboxes"\]' || true) if [ -n "$SANDBOX_REMNANTS" ]; then echo "$SANDBOX_REMNANTS" warn "Found potential 'sandbox' remnants in user-facing strings (review above)" From cc49b3d85f035095d52ba35fc137fff6c42bbb3f Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 19:24:43 +0800 Subject: [PATCH 06/17] docs: add implementation plan and update release test - Add screenshot --with-frame implementation plan - Update release README build timestamp - Add --with-frame test scenario to release_test.md Co-Authored-By: Claude Opus 4.7 --- .../plans/2026-06-05-screenshot-with-frame.md | 479 ++++++++++++++++++ release/README.md | 2 +- tests/release_test.md | 1 + 3 files changed, 481 insertions(+), 1 deletion(-) create mode 100644 docs/superpowers/plans/2026-06-05-screenshot-with-frame.md diff --git a/docs/superpowers/plans/2026-06-05-screenshot-with-frame.md b/docs/superpowers/plans/2026-06-05-screenshot-with-frame.md new file mode 100644 index 0000000..a3710e0 --- /dev/null +++ b/docs/superpowers/plans/2026-06-05-screenshot-with-frame.md @@ -0,0 +1,479 @@ +# Screenshot --with-frame Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Make ScreenCaptureKit opt-in — default screenshots never trigger Screen Recording permission; `--with-frame` flag explicitly enables SCK capture. + +**Architecture:** The daemon's `screenshot_handler` gains a `with_frame` query param. Default path uses renderer WebSocket only (no SCK fallback). `--with-frame` skips renderer and uses SCK directly, with permission error guidance on failure. The entitlements plist removes the screen-capture declaration. + +**Tech Stack:** Rust (axum HTTP handlers, clap CLI args), serde query params + +--- + +### Task 1: Add `--with-frame` flag to CLI screenshot command + +**Files:** +- Modify: `crates/cli-box-cli/src/main.rs:100-112` (Screenshot enum variant) +- Modify: `crates/cli-box-cli/src/main.rs:247-253` (match arm) +- Modify: `crates/cli-box-cli/src/main.rs:641-665` (cmd_screenshot_daemon) + +- [ ] **Step 1: Add `--with-frame` flag to Screenshot command** + +In `crates/cli-box-cli/src/main.rs`, add the flag to the `Screenshot` variant (after line 111): + +```rust + /// Take a screenshot of a sandbox window + Screenshot { + /// Output file path + #[arg(short, long, default_value = "screenshot.png")] + output: PathBuf, + + /// Sandbox instance ID + #[arg(long)] + id: Option, + + /// Window ID to capture (overrides auto-detection) + #[arg(long)] + window_id: Option, + + /// Use ScreenCaptureKit to capture the full window frame (requires Screen Recording permission) + #[arg(long)] + with_frame: bool, + }, +``` + +- [ ] **Step 2: Pass `with_frame` through the match arm** + +Update the match arm (around line 247) to destructure and pass `with_frame`: + +```rust + Commands::Screenshot { + output, + id, + window_id: _window_id, + with_frame, + } => { + cmd_screenshot_daemon(&output, id.as_deref(), with_frame).await?; + } +``` + +- [ ] **Step 3: Update `cmd_screenshot_daemon` to accept and use `with_frame`** + +Change the function signature and logic (line 641): + +```rust +async fn cmd_screenshot_daemon( + output: &std::path::Path, + id: Option<&str>, + with_frame: bool, +) -> anyhow::Result<()> { + let sandbox_id = id.ok_or_else(|| { + anyhow::anyhow!( + "--id is required for screenshots. Use: cli-box screenshot --id " + ) + })?; + + let result = client::daemon_screenshot(sandbox_id, with_frame).await?; + + if result.source.as_deref() == Some("screencapturekit") { + eprintln!( + "Screenshot captured with ScreenCaptureKit (full window frame)." + ); + } + + std::fs::write(output, &result.png_data) + .with_context(|| format!("Failed to write screenshot to {:?}", output))?; + println!( + "Screenshot saved to {:?} ({} bytes)", + output, + result.png_data.len() + ); + Ok(()) +} +``` + +- [ ] **Step 4: Verify it compiles** + +Run: `cargo check -p cli-box-cli` +Expected: compiles without errors (will have warnings about unused `with_frame` in client until Task 2) + +- [ ] **Step 5: Commit** + +```bash +git add crates/cli-box-cli/src/main.rs +git commit -m "feat(cli): add --with-frame flag to screenshot command" +``` + +--- + +### Task 2: Update client to pass `with_frame` query param + +**Files:** +- Modify: `crates/cli-box-cli/src/client.rs:117-146` (daemon_screenshot) + +- [ ] **Step 1: Add `with_frame` parameter to `daemon_screenshot`** + +In `crates/cli-box-cli/src/client.rs`, change the function signature and URL (line 117): + +```rust +pub async fn daemon_screenshot(sandbox_id: &str, with_frame: bool) -> Result { + let base = daemon_base_url()?; + let client = reqwest_client(); + let url = if with_frame { + format!("{base}/box/{sandbox_id}/screenshot?with_frame=true") + } else { + format!("{base}/box/{sandbox_id}/screenshot") + }; + let resp = client + .get(url) + .send() + .await + .with_context(|| "screenshot request to daemon failed")?; + let status = resp.status(); + if !status.is_success() { + let text = resp.text().await.unwrap_or_default(); + anyhow::bail!("screenshot failed (HTTP {status}): {text}"); + } + let source = resp + .headers() + .get("x-screenshot-source") + .and_then(|v| v.to_str().ok()) + .map(String::from); + let fallback_reason = resp + .headers() + .get("x-screenshot-fallback-reason") + .and_then(|v| v.to_str().ok()) + .map(String::from); + let png_data = resp.bytes().await?.to_vec(); + Ok(ScreenshotResult { + png_data, + source, + fallback_reason, + }) +} +``` + +- [ ] **Step 2: Update MCP handler call site** + +In `crates/cli-box-cli/src/main.rs`, update the MCP `screenshot_sandbox` handler (around line 1319) to pass `with_frame`: + +```rust + "screenshot_sandbox" => { + let id = args["sandbox_id"].as_str().unwrap_or(""); + let with_frame = args["with_frame"].as_bool().unwrap_or(false); + let result = client::daemon_screenshot(id, with_frame).await?; + let b64 = base64_encode(&result.png_data); + let mut response = serde_json::json!({ "sandbox_id": id, "image_base64": b64 }); + if let Some(ref source) = result.source { + response["screenshot_source"] = serde_json::json!(source); + } + if let Some(ref reason) = result.fallback_reason { + response["fallback_reason"] = serde_json::json!(reason); + } + Ok(response) + } +``` + +- [ ] **Step 3: Verify it compiles** + +Run: `cargo check -p cli-box-cli` +Expected: compiles without errors + +- [ ] **Step 4: Commit** + +```bash +git add crates/cli-box-cli/src/client.rs crates/cli-box-cli/src/main.rs +git commit -m "feat(client): pass with_frame query param to daemon screenshot API" +``` + +--- + +### Task 3: Update daemon screenshot handler to respect `with_frame` + +**Files:** +- Modify: `crates/cli-box-core/src/daemon/mod.rs:431-462` (screenshot_handler) +- Modify: `crates/cli-box-core/src/daemon/mod.rs:486-546` (screenshot_fallback) + +- [ ] **Step 1: Add query param struct and update handler signature** + +In `crates/cli-box-core/src/daemon/mod.rs`, add the query struct before `screenshot_handler` (around line 430): + +```rust +#[derive(Deserialize)] +struct ScreenshotQuery { + #[serde(default)] + with_frame: bool, +} +``` + +Update the handler signature to accept the query param: + +```rust +async fn screenshot_handler( + State(state): State>>, + Path(id): Path, + axum::extract::Query(q): axum::extract::Query, +) -> Result { + // Verify sandbox exists + { + let s = state.lock().await; + if !s.sandboxes.contains_key(&id) { + return Err(AppError::Instance(format!("Sandbox '{id}' not found"))); + } + } + + if q.with_frame { + // --with-frame: use ScreenCaptureKit directly, skip renderer + return screenshot_with_frame(state, &id).await; + } + + // Default: renderer only, no SCK fallback + match request_renderer_screenshot(state.clone(), &id).await { + Ok(png_data) => { + tracing::info!( + "[screenshot] sandbox {} captured via renderer ({} bytes)", + id, + png_data.len() + ); + Ok(screenshot_response(png_data, "renderer", None)) + } + Err(reason) => { + tracing::warn!( + "[screenshot] renderer capture failed for sandbox {}: {}", + id, + reason + ); + Err(AppError::Screenshot(format!( + "Screenshot failed: {}. Use --with-frame to capture via ScreenCaptureKit (requires Screen Recording permission).", + reason + ))) + } + } +} +``` + +- [ ] **Step 2: Add `screenshot_with_frame` function** + +Add a new function after `screenshot_fallback` (around line 546): + +```rust +/// Capture a screenshot using ScreenCaptureKit (requires Screen Recording permission). +async fn screenshot_with_frame( + state: Arc>, + id: &str, +) -> Result { + let window_id = { + let s = state.lock().await; + s.sandboxes.get(id).and_then(|sb| sb.window_id) + }; + + let wid = match window_id { + Some(wid) => wid, + None => { + // Re-discover window + let new_wid = + tokio::task::spawn_blocking(|| ScreenCapture::find_window_by_title("CLI Box")) + .await + .map_err(|e| { + AppError::Screenshot(format!("window discovery task failed: {e}")) + })??; + let mut s = state.lock().await; + if let Some(sb) = s.sandboxes.get_mut(id) { + sb.window_id = Some(new_wid); + } + let registry = InstanceRegistry::default(); + let _ = registry.update_window_id(id, new_wid); + new_wid + } + }; + + let result = tokio::task::spawn_blocking(move || ScreenCapture::capture_window(wid)) + .await + .map_err(|e| AppError::Screenshot(format!("screenshot task failed: {e}")))?; + + match result { + Ok(png_data) => Ok(screenshot_response(png_data, "screencapturekit", None)), + Err(e) => Err(AppError::Screenshot(format!( + "{}. If permission was denied, grant Screen Recording in System Settings → Privacy & Security → Screen Recording.", + e + ))), + } +} +``` + +- [ ] **Step 3: Keep `screenshot_fallback` as-is** + +The existing `screenshot_fallback` function stays unchanged — it's still used by other internal code paths if needed. + +- [ ] **Step 4: Verify it compiles** + +Run: `cargo check -p cli-box-core` +Expected: compiles without errors + +- [ ] **Step 5: Commit** + +```bash +git add crates/cli-box-core/src/daemon/mod.rs +git commit -m "feat(daemon): add with_frame query param to screenshot handler" +``` + +--- + +### Task 4: Update MCP tool schema for `screenshot_sandbox` + +**Files:** +- Modify: `crates/cli-box-cli/src/main.rs:1194-1203` (MCP tool schema) + +- [ ] **Step 1: Add `with_frame` to tool schema** + +In the `mcp_tools()` function, update the `screenshot_sandbox` tool definition: + +```rust + { + "name": "screenshot_sandbox", + "description": "Take a screenshot of a sandbox (returns base64 PNG). Default: renderer capture (no permission needed). Use with_frame=true for full window capture (requires Screen Recording permission).", + "inputSchema": { + "type": "object", + "properties": { + "sandbox_id": { "type": "string" }, + "with_frame": { "type": "boolean", "description": "Use ScreenCaptureKit for full window frame capture (requires Screen Recording permission)", "default": false } + }, + "required": ["sandbox_id"] + } + }, +``` + +- [ ] **Step 2: Verify it compiles** + +Run: `cargo check -p cli-box-cli` +Expected: compiles without errors + +- [ ] **Step 3: Commit** + +```bash +git add crates/cli-box-cli/src/main.rs +git commit -m "feat(mcp): add with_frame parameter to screenshot_sandbox tool" +``` + +--- + +### Task 5: Remove screen-capture entitlement + +**Files:** +- Modify: `entitlements.plist` + +- [ ] **Step 1: Remove screen-capture entitlement** + +Remove lines 9-10 from `entitlements.plist`: + +```xml + + + + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-library-validation + + + +``` + +- [ ] **Step 2: Commit** + +```bash +git add entitlements.plist +git commit -m "fix(entitlements): remove screen-capture entitlement" +``` + +--- + +### Task 6: Update legacy server screenshot handler + +**Files:** +- Modify: `crates/cli-box-core/src/server/mod.rs:402-414` (screenshot_handler) + +- [ ] **Step 1: Add `with_frame` query param to legacy server** + +In `crates/cli-box-core/src/server/mod.rs`, the existing `ScreenshotQuery` already exists (used for `window_id`). Add `with_frame` to it and update the handler: + +First, find the existing `ScreenshotQuery` struct (search for it in the file) and add the field: + +```rust +#[derive(Deserialize)] +struct ScreenshotQuery { + window_id: Option, + #[serde(default)] + with_frame: bool, +} +``` + +Update the handler to respect `with_frame`: + +```rust +async fn screenshot_handler( + State(state): State>>, + Query(q): Query, +) -> Result { + let window_id = q.window_id.or(state.lock().await.window_id); + match window_id { + Some(id) => { + if !q.with_frame { + return Err(AppError::Screenshot( + "Default screenshot is not supported in legacy mode. Use ?with_frame=true (requires Screen Recording permission).".to_string() + )); + } + let png_data = ScreenCapture::capture_window(id)?; + Ok((StatusCode::OK, [("content-type", "image/png")], png_data).into_response()) + } + None => Err(AppError::BadRequest(SANDBOX_WINDOW_REQUIRED.to_string())), + } +} +``` + +- [ ] **Step 2: Verify it compiles** + +Run: `cargo check -p cli-box-core` +Expected: compiles without errors + +- [ ] **Step 3: Commit** + +```bash +git add crates/cli-box-core/src/server/mod.rs +git commit -m "feat(server): add with_frame query param to legacy screenshot handler" +``` + +--- + +### Task 7: Verify full build and tests + +**Files:** None (verification only) + +- [ ] **Step 1: Run full cargo check** + +Run: `cargo check --all-targets` +Expected: compiles without errors + +- [ ] **Step 2: Run clippy** + +Run: `cargo clippy --all-targets` +Expected: no errors (warnings acceptable) + +- [ ] **Step 3: Run existing tests** + +Run: `cargo test --all` +Expected: all tests pass + +- [ ] **Step 4: Run frontend checks** + +Run: `pnpm typecheck && pnpm format:check && pnpm test:unit` +Expected: all pass + +- [ ] **Step 5: Commit any fixes** + +If any fixes were needed, commit them: + +```bash +git add -A +git commit -m "fix: address review feedback from build verification" +``` diff --git a/release/README.md b/release/README.md index ce31c83..b89e2b6 100644 --- a/release/README.md +++ b/release/README.md @@ -137,4 +137,4 @@ A: 等待几秒让 CLI 工具启动,终端会自动连接 PTY 输出。 --- -**版本**: v${VERSION} | **构建时间**: 2026-06-04 13:50 +**版本**: v${VERSION} | **构建时间**: 2026-06-05 19:15 diff --git a/tests/release_test.md b/tests/release_test.md index 44c2bf3..36a3798 100644 --- a/tests/release_test.md +++ b/tests/release_test.md @@ -3,6 +3,7 @@ 2. /superpowers:systematic-debugging 使用 @release.sh 打包编译release,然后你进行一个简单场景的测试,场景一:在沙箱启动claude以后,回车确认,然后输入你是谁?然后出发回车发送。场景二:在沙箱启动zsh,然后输入echo "hello world",然后回车发送。每一步操作后都截图保存到release_test/${{时间戳,yyyy-mm-dd-hh-mm-ss}}文件夹下,然后检查截图结果,查看是否符合预期,注意读取图片前先判断图片是否存在问题 3. /superpowers:systematic-debugging 使用 @release.sh 打包编译release,然后先打开opencode,再打开zsh,分别CLI命令行截图两个窗口,获取到的是各自的界面 4. 当前打开的claude,在回车确认后,判断界面上,不会有选项`Yes, I trust this folder`残留 +5. 用`start opencode`命令,打开opencode,使用screenshot --with-frame进行截图,查看是否有边框 5. 新增测试点 - pnpm dev 后 Electron 窗口正常打开 - 终端日志显示 "Daemon started on port XXXX" From d827d29855077858036439eb5fc42fe04707e658 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 21:26:05 +0800 Subject: [PATCH 07/17] docs: update hero image with --with-frame screenshot Co-Authored-By: Claude Opus 4.7 --- .github/assets/hero.png | Bin 104825 -> 205120 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.github/assets/hero.png b/.github/assets/hero.png index 21849f9fba572101e095ec97f4615bcccfc589ab..8921c3c5e31e1a331d9395bc3d4d0519793949fa 100644 GIT binary patch literal 205120 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 z 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
    3YX|FRDxZDJp|)pt!wnVoyRer~hu@At@8 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 literal 104825 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�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 ScS`V2kFG!OGVhu@$Nj&* Date: Fri, 5 Jun 2026 21:46:35 +0800 Subject: [PATCH 08/17] fix: screenshot -o supports relative paths and --with-frame switches tabs Bug 1: `screenshot -o subdir/shot.png` failed with ENOENT when parent directory didn't exist. Fix: call create_dir_all on parent before writing. Bug 2: `screenshot --with-frame` captured whatever tab was visible in the Electron window instead of the target sandbox's tab. Fix: add switch_tab_request/switch_tab_response messages to the screenshot WebSocket protocol. The daemon now sends a switch_tab_request before SCK capture, and the renderer switches the active tab before responding. Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-cli/src/main.rs | 24 ++++ crates/cli-box-core/src/daemon/mod.rs | 105 ++++++++++++++++++ .../cli-box-core/tests/daemon_integration.rs | 56 +++++++++- electron-app/src/renderer/main.tsx | 12 +- 4 files changed, 195 insertions(+), 2 deletions(-) diff --git a/crates/cli-box-cli/src/main.rs b/crates/cli-box-cli/src/main.rs index 541be2d..30ae112 100644 --- a/crates/cli-box-cli/src/main.rs +++ b/crates/cli-box-cli/src/main.rs @@ -660,6 +660,12 @@ async fn cmd_screenshot_daemon( eprintln!("Screenshot captured with ScreenCaptureKit (full window frame)."); } + if let Some(parent) = output.parent() { + if !parent.as_os_str().is_empty() { + std::fs::create_dir_all(parent) + .with_context(|| format!("Failed to create directory {:?}", parent))?; + } + } std::fs::write(output, &result.png_data) .with_context(|| format!("Failed to write screenshot to {:?}", output))?; println!( @@ -1717,4 +1723,22 @@ mod tests { let _ = std::fs::remove_file(&path); } } + + #[test] + fn screenshot_output_creates_parent_directories() { + let tmp = std::env::temp_dir().join(format!("cli_box_test_{}", std::process::id())); + let nested = tmp.join("a").join("b").join("c").join("shot.png"); + + // Simulate the logic from cmd_screenshot_daemon + let output = nested.as_path(); + if let Some(parent) = output.parent() { + if !parent.as_os_str().is_empty() { + std::fs::create_dir_all(parent).unwrap(); + } + } + std::fs::write(output, b"\x89PNG").unwrap(); + + assert!(nested.exists(), "File should exist at nested path"); + let _ = std::fs::remove_dir_all(&tmp); + } } diff --git a/crates/cli-box-core/src/daemon/mod.rs b/crates/cli-box-core/src/daemon/mod.rs index 88b94e7..57a8ce8 100644 --- a/crates/cli-box-core/src/daemon/mod.rs +++ b/crates/cli-box-core/src/daemon/mod.rs @@ -502,6 +502,11 @@ async fn screenshot_with_frame( state: Arc>, id: &str, ) -> Result { + // Switch to the target tab before capturing so SCK sees the correct content. + if let Err(e) = request_switch_tab(state.clone(), id).await { + tracing::warn!("Failed to switch tab for sandbox {}: {}", id, e); + } + let window_id = { let s = state.lock().await; s.sandboxes.get(id).and_then(|sb| sb.window_id) @@ -613,6 +618,62 @@ async fn request_renderer_screenshot( } } +/// Request the renderer to switch to a specific tab via WebSocket. +/// Waits for the renderer to acknowledge the tab switch. +async fn request_switch_tab( + state: Arc>, + sandbox_id: &str, +) -> Result<(), String> { + let (request_id, response_rx, mut ws_tx) = { + let mut s = state.lock().await; + let ws_tx = s + .screenshot_ws_tx + .take() + .ok_or("WebSocket not connected (renderer may be closed or not yet connected)")?; + + s.screenshot_request_counter += 1; + let request_id = s.screenshot_request_counter; + + let (response_tx, response_rx) = oneshot::channel(); + s.pending_screenshots.insert(request_id, response_tx); + + (request_id, response_rx, ws_tx) + }; + + let msg = serde_json::json!({ + "type": "switch_tab_request", + "request_id": request_id, + "sandbox_id": sandbox_id, + }); + + if ws_tx + .send(Message::Text(msg.to_string().into())) + .await + .is_err() + { + let mut s = state.lock().await; + s.pending_screenshots.remove(&request_id); + s.screenshot_ws_tx = Some(ws_tx); + return Err("Failed to send switch_tab request over WebSocket".to_string()); + } + + { + let mut s = state.lock().await; + s.screenshot_ws_tx = Some(ws_tx); + } + + match tokio::time::timeout(std::time::Duration::from_secs(2), response_rx).await { + Ok(Ok(Ok(_))) => Ok(()), + Ok(Ok(Err(e))) => Err(format!("Renderer returned error on switch_tab: {e}")), + Ok(Err(_)) => Err("Response channel dropped during switch_tab".to_string()), + Err(_) => { + let mut s = state.lock().await; + s.pending_screenshots.remove(&request_id); + Err("Renderer did not respond to switch_tab within 2s timeout".to_string()) + } + } +} + /// WebSocket endpoint for renderer-based screenshot capture. async fn screenshot_ws_handler( State(state): State>>, @@ -671,6 +732,14 @@ async fn handle_screenshot_ws(state: Arc>, socket: WebSocket) } } } + Some("switch_tab_response") => { + if let Some(req_id) = request_id { + let mut s = state.lock().await; + if let Some(tx) = s.pending_screenshots.remove(&req_id) { + let _ = tx.send(Ok(vec![])); + } + } + } _ => { tracing::warn!( "[screenshot_ws] unknown message type: {:?}", @@ -1745,4 +1814,40 @@ mod tests { "renderer_unavailable" ); } + + #[tokio::test] + async fn request_switch_tab_returns_error_when_ws_not_connected() { + let state = test_daemon_state_with_sandbox(); + let result = request_switch_tab(state, "test-sb").await; + assert!(result.is_err()); + let err = result.unwrap_err(); + assert!( + err.contains("WebSocket not connected"), + "Expected 'WebSocket not connected', got: {err}" + ); + } + + #[tokio::test] + async fn screenshot_with_frame_logs_warning_on_switch_tab_failure() { + // screenshot_with_frame calls request_switch_tab first, which will fail + // (no WebSocket), then proceeds to SCK capture. The function should not + // return an error just because the tab switch failed — it logs a warning. + let app = test_daemon_router_with_sandbox(); + let resp = app + .oneshot( + Request::builder() + .uri("/box/test-sb/screenshot?with_frame=true") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + // The SCK capture will also fail (no real window), but the important thing + // is that the switch_tab failure didn't cause a client error. + let status = resp.status(); + assert!( + !status.is_client_error(), + "switch_tab failure should not cause client error, got {status}" + ); + } } diff --git a/crates/cli-box-core/tests/daemon_integration.rs b/crates/cli-box-core/tests/daemon_integration.rs index 1383e14..ba91079 100644 --- a/crates/cli-box-core/tests/daemon_integration.rs +++ b/crates/cli-box-core/tests/daemon_integration.rs @@ -5,7 +5,8 @@ use axum::body::Body; use axum::http::{self, Request, StatusCode}; -use cli_box_core::daemon::{build_daemon_router, DaemonState}; +use cli_box_core::daemon::{build_daemon_router, DaemonState, ManagedSandbox}; +use cli_box_core::instance::{InstanceKind, InstanceStatus}; use std::collections::HashMap; use std::sync::Arc; use tokio::sync::Mutex; @@ -26,6 +27,36 @@ fn router() -> axum::Router { build_daemon_router(empty_state()) } +fn state_with_sandbox() -> Arc> { + let mut sandboxes = HashMap::new(); + sandboxes.insert( + "test-sb".to_string(), + ManagedSandbox { + id: "test-sb".to_string(), + kind: InstanceKind::Cli { + command: "zsh".to_string(), + args: vec![], + }, + status: InstanceStatus::Running, + port: 0, + pty_pid: None, + window_id: None, + }, + ); + Arc::new(Mutex::new(DaemonState { + port: 0, + sandboxes, + started_at: std::time::Instant::now(), + screenshot_ws_tx: None, + pending_screenshots: HashMap::new(), + screenshot_request_counter: 0, + })) +} + +fn router_with_sandbox() -> axum::Router { + build_daemon_router(state_with_sandbox()) +} + #[tokio::test] async fn health_endpoint_returns_ok() { let resp = router() @@ -140,3 +171,26 @@ async fn unknown_route_returns_404() { assert_eq!(resp.status(), StatusCode::NOT_FOUND); } + +#[tokio::test] +async fn screenshot_with_frame_attempts_tab_switch() { + // with_frame=true should attempt a tab switch before SCK capture. + // Without a WebSocket connection, the switch fails gracefully and + // the handler continues to the SCK path (which also fails — no real window). + // The key assertion: it does NOT return a client error. + let resp = router_with_sandbox() + .oneshot( + Request::builder() + .uri("/box/test-sb/screenshot?with_frame=true") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + let status = resp.status(); + assert!( + !status.is_client_error(), + "with_frame=true should not be a client error, got {status}" + ); +} diff --git a/electron-app/src/renderer/main.tsx b/electron-app/src/renderer/main.tsx index cfe8302..2abc487 100644 --- a/electron-app/src/renderer/main.tsx +++ b/electron-app/src/renderer/main.tsx @@ -136,7 +136,17 @@ function App() { ws.onmessage = async (event) => { try { const msg = JSON.parse(event.data); - if (msg.type === "capture_request") { + if (msg.type === "switch_tab_request") { + const { sandbox_id, request_id } = msg; + setActiveTabId(sandbox_id); + // Small delay for tab to render + await new Promise((r) => setTimeout(r, 100)); + ws?.send(JSON.stringify({ + type: "switch_tab_response", + request_id, + sandbox_id, + })); + } else if (msg.type === "capture_request") { const { sandbox_id, request_id } = msg; const tabRef = terminalRefs.current.get(sandbox_id); if (tabRef?.current) { From 42576c9fd2eaa3e38e232273b3f3a654a033dcb1 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 22:10:51 +0800 Subject: [PATCH 09/17] fix: --with-frame calls switchTab IPC and fix test assertions - Renderer switch_tab_request handler now calls window.sandbox.switchTab() via IPC to reposition WebContentsView, not just setActiveTabId - Fix screenshot_with_frame test assertions to accept 404 (WindowNotFound) as valid SCK failure mode alongside 500 (previously failed with screencapturekit feature enabled) Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-core/src/daemon/mod.rs | 24 ++++++++++--------- .../cli-box-core/tests/daemon_integration.rs | 9 ++++--- electron-app/src/renderer/main.tsx | 10 ++++++-- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/crates/cli-box-core/src/daemon/mod.rs b/crates/cli-box-core/src/daemon/mod.rs index 57a8ce8..df936dc 100644 --- a/crates/cli-box-core/src/daemon/mod.rs +++ b/crates/cli-box-core/src/daemon/mod.rs @@ -1531,12 +1531,14 @@ mod tests { ) .await .unwrap(); - // with_frame=true routes to SCK path which will fail (no real window), - // but it should NOT be a 404 — it proves the query param is parsed + // with_frame=true routes to SCK path. Without a real window, it fails + // with either 404 (WindowNotFound with SCK) or 500 (Screenshot error). + // Either way, it must NOT be 400 (Bad Request) — proves query param is parsed. let status = resp.status(); - assert!( - !status.is_client_error(), - "with_frame=true should not be a client error, got {status}" + assert_ne!( + status, + StatusCode::BAD_REQUEST, + "with_frame=true should be parsed, not rejected as bad request" ); } @@ -1831,7 +1833,7 @@ mod tests { async fn screenshot_with_frame_logs_warning_on_switch_tab_failure() { // screenshot_with_frame calls request_switch_tab first, which will fail // (no WebSocket), then proceeds to SCK capture. The function should not - // return an error just because the tab switch failed — it logs a warning. + // return 400 (Bad Request) — the tab switch failure should be a warning. let app = test_daemon_router_with_sandbox(); let resp = app .oneshot( @@ -1842,12 +1844,12 @@ mod tests { ) .await .unwrap(); - // The SCK capture will also fail (no real window), but the important thing - // is that the switch_tab failure didn't cause a client error. + // SCK capture also fails (no real window) → 404 or 500, but NOT 400. let status = resp.status(); - assert!( - !status.is_client_error(), - "switch_tab failure should not cause client error, got {status}" + assert_ne!( + status, + StatusCode::BAD_REQUEST, + "switch_tab failure should not cause bad request, got {status}" ); } } diff --git a/crates/cli-box-core/tests/daemon_integration.rs b/crates/cli-box-core/tests/daemon_integration.rs index ba91079..d95bac8 100644 --- a/crates/cli-box-core/tests/daemon_integration.rs +++ b/crates/cli-box-core/tests/daemon_integration.rs @@ -189,8 +189,11 @@ async fn screenshot_with_frame_attempts_tab_switch() { .unwrap(); let status = resp.status(); - assert!( - !status.is_client_error(), - "with_frame=true should not be a client error, got {status}" + // SCK path fails with 404 (WindowNotFound) or 500 (Screenshot error), + // but must NOT be 400 (Bad Request) — proves query param is parsed. + assert_ne!( + status, + StatusCode::BAD_REQUEST, + "with_frame=true should be parsed, not rejected as bad request" ); } diff --git a/electron-app/src/renderer/main.tsx b/electron-app/src/renderer/main.tsx index 2abc487..fb29634 100644 --- a/electron-app/src/renderer/main.tsx +++ b/electron-app/src/renderer/main.tsx @@ -138,9 +138,15 @@ function App() { const msg = JSON.parse(event.data); if (msg.type === "switch_tab_request") { const { sandbox_id, request_id } = msg; - setActiveTabId(sandbox_id); + // Switch tab via IPC so main process repositions WebContentsView + try { + await window.sandbox.switchTab(sandbox_id); + } catch { + // fallback: update React state only + setActiveTabId(sandbox_id); + } // Small delay for tab to render - await new Promise((r) => setTimeout(r, 100)); + await new Promise((r) => setTimeout(r, 200)); ws?.send(JSON.stringify({ type: "switch_tab_response", request_id, From 7d9f35f3772570b0562496d1df73a57a030d3c95 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 22:30:08 +0800 Subject: [PATCH 10/17] docs: add implementation plan for start readiness wait --- .../plans/2026-06-05-start-readiness-wait.md | 263 ++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 docs/superpowers/plans/2026-06-05-start-readiness-wait.md diff --git a/docs/superpowers/plans/2026-06-05-start-readiness-wait.md b/docs/superpowers/plans/2026-06-05-start-readiness-wait.md new file mode 100644 index 0000000..b28e65e --- /dev/null +++ b/docs/superpowers/plans/2026-06-05-start-readiness-wait.md @@ -0,0 +1,263 @@ +# cli-box start Readiness Wait Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** When `cli-box start` spawns a new Electron app, wait for the renderer WebSocket to connect before returning, showing animated dots ("正在启动...") to the user. + +**Architecture:** Add a `/readyz` endpoint to the daemon that reports whether the renderer WebSocket is connected (`screenshot_ws_tx.is_some()`). Add a `daemon_readiness()` client function. Modify `cmd_start_daemon` to poll this endpoint with animated output when Electron was newly spawned, with a 60-second timeout. + +**Tech Stack:** Rust (axum HTTP handler, reqwest client, tokio async), CLI terminal output + +--- + +### Task 1: Add `/readyz` endpoint to daemon + +**Files:** +- Modify: `crates/cli-box-core/src/daemon/mod.rs` — add `DaemonReadinessResponse` struct + `readyz_handler` + route +- Test: `crates/cli-box-core/tests/daemon_integration.rs` — add readyz integration test + +- [ ] **Step 1: Add `DaemonReadinessResponse` struct** + +In `crates/cli-box-core/src/daemon/mod.rs`, after the existing `HealthResponse` struct (around line 196), add: + +```rust +#[derive(Debug, Serialize)] +pub struct DaemonReadinessResponse { + /// "ready" if renderer WebSocket is connected, "not_ready" otherwise. + pub status: String, + /// Whether the Electron renderer's screenshot WebSocket is connected. + pub renderer_connected: bool, +} +``` + +- [ ] **Step 2: Add `readyz_handler`** + +After the `health_handler` function (around line 282), add: + +```rust +async fn readyz_handler(State(state): State>>) -> Json { + let s = state.lock().await; + let renderer_connected = s.screenshot_ws_tx.is_some(); + Json(DaemonReadinessResponse { + status: if renderer_connected { "ready" } else { "not_ready" }.to_string(), + renderer_connected, + }) +} +``` + +- [ ] **Step 3: Register `/readyz` route** + +In `build_daemon_router` (around line 243), add the route after the `/health` line: + +```rust + .route("/readyz", get(readyz_handler)) +``` + +- [ ] **Step 4: Add integration test for `/readyz`** + +In `crates/cli-box-core/tests/daemon_integration.rs`, add: + +```rust +#[tokio::test] +async fn readyz_returns_not_ready_without_renderer() { + let resp = router() + .oneshot( + Request::builder() + .uri("/readyz") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(resp.status(), StatusCode::OK); + let body = axum::body::to_bytes(resp.into_body(), 1024).await.unwrap(); + let json: serde_json::Value = serde_json::from_slice(&body).unwrap(); + assert_eq!(json["status"], "not_ready"); + assert_eq!(json["renderer_connected"], false); +} +``` + +- [ ] **Step 5: Run tests** + +Run: `cargo test -p cli-box-core --test daemon_integration -- readyz` +Expected: PASS + +- [ ] **Step 6: Commit** + +```bash +git add crates/cli-box-core/src/daemon/mod.rs crates/cli-box-core/tests/daemon_integration.rs +git commit -m "feat(daemon): add /readyz endpoint for renderer WebSocket status" +``` + +--- + +### Task 2: Add `daemon_readiness()` client function + +**Files:** +- Modify: `crates/cli-box-cli/src/client.rs` — add `DaemonReadinessResponse` struct + `daemon_readiness()` function + +- [ ] **Step 1: Add `DaemonReadinessResponse` and `daemon_readiness()`** + +In `crates/cli-box-cli/src/client.rs`, after the existing `DaemonHealthResponse` struct (around line 49), add: + +```rust +#[derive(Debug, Deserialize)] +pub struct DaemonReadinessResponse { + pub status: String, + pub renderer_connected: bool, +} + +/// Check daemon readiness (renderer WebSocket connection status). +pub async fn daemon_readiness() -> Result { + let base = daemon_base_url()?; + let client = reqwest_client(); + let resp = client + .get(format!("{base}/readyz")) + .send() + .await + .with_context(|| "Failed to connect to daemon readyz endpoint")?; + let readiness: DaemonReadinessResponse = resp.json().await?; + Ok(readiness) +} +``` + +- [ ] **Step 2: Run tests** + +Run: `cargo test -p cli-box-cli` +Expected: PASS (existing tests still pass, new function compiles) + +- [ ] **Step 3: Commit** + +```bash +git add crates/cli-box-cli/src/client.rs +git commit -m "feat(client): add daemon_readiness() for renderer WebSocket status" +``` + +--- + +### Task 3: Modify `cmd_start_daemon` to poll with animated dots + +**Files:** +- Modify: `crates/cli-box-cli/src/main.rs:425-498` — `cmd_start_daemon` function + +- [ ] **Step 1: Add readiness polling after Electron spawn** + +In `cmd_start_daemon`, after the Electron spawn block (after line 495, before `Ok(())`), add the readiness wait logic. The full modified function ending should be: + +```rust + // Spawn Electron only if not already running. + // If already running, the renderer polls /box/list and will pick up the new sandbox. + let electron_newly_spawned = if find_running_electron() { + tracing::info!("[start] Electron already running, skipping spawn"); + false + } else if let Some(electron_bin) = find_electron_binary() { + tracing::info!("[start] spawning Electron: {}", electron_bin.display()); + let _child = Command::new(&electron_bin) + .spawn() + .context("Failed to launch Electron app")?; + tracing::info!("[start] Electron launched"); + true + } else { + tracing::warn!("[start] Electron app not found, running in headless daemon mode"); + false + }; + + // Wait for renderer WebSocket to connect if Electron was newly spawned. + if electron_newly_spawned { + print!("正在启动"); + use std::io::Write; + let _ = std::io::stdout().flush(); + + let timeout = std::time::Duration::from_secs(60); + let start = std::time::Instant::now(); + let poll_interval = std::time::Duration::from_secs(1); + let mut dot_count: u8 = 0; + + loop { + if start.elapsed() > timeout { + println!(); + tracing::warn!( + "[start] Renderer WebSocket did not connect within {}s, continuing anyway", + timeout.as_secs() + ); + break; + } + + match client::daemon_readiness().await { + Ok(resp) if resp.renderer_connected => { + println!(" 完成"); + break; + } + _ => {} + } + + dot_count = (dot_count % 3) + 1; + print!("\r正在启动{}", ".".repeat(dot_count as usize)); + print!("{}", " ".repeat(3 - dot_count as usize)); // clear leftover dots + let _ = std::io::stdout().flush(); + + tokio::time::sleep(poll_interval).await; + } + } + + Ok(()) +``` + +- [ ] **Step 2: Build and verify compilation** + +Run: `cargo build -p cli-box-cli` +Expected: Compiles without errors + +- [ ] **Step 3: Commit** + +```bash +git add crates/cli-box-cli/src/main.rs +git commit -m "feat(cli): poll daemon /readyz with animated dots when Electron is newly spawned" +``` + +--- + +### Task 4: Manual smoke test + +- [ ] **Step 1: Run `sh test.sh` to verify all existing tests pass** + +Run: `sh test.sh` +Expected: All tests pass + +- [ ] **Step 2: Run `sh release.sh` to build release binary** + +Run: `sh release.sh` +Expected: Release binary built successfully + +- [ ] **Step 3: Test the animated dots manually** + +```bash +# Kill any existing daemon and electron +release/cli-box daemon stop 2>/dev/null; pkill -f "CLI Box" 2>/dev/null + +# Run start — should show "正在启动... 完成" +release/cli-box start zsh +``` + +Expected: Terminal shows "正在启动" with dots cycling (. .. ... . .. ...) then " 完成" when renderer connects. + +- [ ] **Step 4: Test with Electron already running** + +```bash +# With Electron already open, start another sandbox +release/cli-box start claude +``` + +Expected: No animated dots (Electron already running, renderer already connected). + +- [ ] **Step 5: Verify screenshots work immediately after start** + +```bash +# Start fresh, take screenshot right after +release/cli-box start zsh +sleep 2 +release/cli-box screenshot --id $(release/cli-box list --json | jq -r '.[0].id') -o /tmp/test-after-start.png +``` + +Expected: Screenshot succeeds (renderer WebSocket was connected before command returned). From a679635b5481a08beb6906a7829438cb42f8d8b5 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 22:31:54 +0800 Subject: [PATCH 11/17] feat(daemon): add /readyz endpoint for renderer WebSocket status Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-core/src/daemon/mod.rs | 18 ++++++++++++++++++ .../cli-box-core/tests/daemon_integration.rs | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/crates/cli-box-core/src/daemon/mod.rs b/crates/cli-box-core/src/daemon/mod.rs index df936dc..7a97999 100644 --- a/crates/cli-box-core/src/daemon/mod.rs +++ b/crates/cli-box-core/src/daemon/mod.rs @@ -123,6 +123,14 @@ struct HealthResponse { sandboxes: usize, } +#[derive(Debug, Serialize)] +pub struct DaemonReadinessResponse { + /// "ready" if renderer WebSocket is connected, "not_ready" otherwise. + pub status: String, + /// Whether the Electron renderer's screenshot WebSocket is connected. + pub renderer_connected: bool, +} + #[derive(Deserialize)] pub struct UiFindRequest { pub role: String, @@ -241,6 +249,7 @@ pub fn build_daemon_router(state: Arc>) -> Router { Router::new() .route("/health", get(health_handler)) + .route("/readyz", get(readyz_handler)) .route("/box/list", get(list_sandboxes_handler)) .route("/box/create", post(create_sandbox_handler)) .route("/box/{id}/close", post(close_sandbox_handler)) @@ -281,6 +290,15 @@ async fn health_handler(State(state): State>>) -> Json>>) -> Json { + let s = state.lock().await; + let renderer_connected = s.screenshot_ws_tx.is_some(); + Json(DaemonReadinessResponse { + status: if renderer_connected { "ready" } else { "not_ready" }.to_string(), + renderer_connected, + }) +} + async fn list_sandboxes_handler( State(state): State>>, ) -> Json> { diff --git a/crates/cli-box-core/tests/daemon_integration.rs b/crates/cli-box-core/tests/daemon_integration.rs index d95bac8..f1f77e3 100644 --- a/crates/cli-box-core/tests/daemon_integration.rs +++ b/crates/cli-box-core/tests/daemon_integration.rs @@ -197,3 +197,22 @@ async fn screenshot_with_frame_attempts_tab_switch() { "with_frame=true should be parsed, not rejected as bad request" ); } + +#[tokio::test] +async fn readyz_returns_not_ready_without_renderer() { + let resp = router() + .oneshot( + Request::builder() + .uri("/readyz") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(resp.status(), StatusCode::OK); + let body = axum::body::to_bytes(resp.into_body(), 1024).await.unwrap(); + let json: serde_json::Value = serde_json::from_slice(&body).unwrap(); + assert_eq!(json["status"], "not_ready"); + assert_eq!(json["renderer_connected"], false); +} From 48fdf3302811f3fa784efe452dfc4f413bb3c3c7 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 22:34:35 +0800 Subject: [PATCH 12/17] feat(client): add daemon_readiness() for renderer WebSocket status Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-cli/src/client.rs | 37 ++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/crates/cli-box-cli/src/client.rs b/crates/cli-box-cli/src/client.rs index 24f40ba..32d7156 100644 --- a/crates/cli-box-cli/src/client.rs +++ b/crates/cli-box-cli/src/client.rs @@ -48,6 +48,25 @@ pub struct DaemonHealthResponse { pub sandboxes: usize, } +#[derive(Debug, Deserialize)] +pub struct DaemonReadinessResponse { + pub status: String, + pub renderer_connected: bool, +} + +/// Check daemon readiness (renderer WebSocket connection status). +pub async fn daemon_readiness() -> Result { + let base = daemon_base_url()?; + let client = reqwest_client(); + let resp = client + .get(format!("{base}/readyz")) + .send() + .await + .with_context(|| "Failed to connect to daemon readyz endpoint")?; + let readiness: DaemonReadinessResponse = resp.json().await?; + Ok(readiness) +} + #[derive(Debug, Deserialize, Serialize)] pub struct DaemonSandbox { pub id: String, @@ -1041,6 +1060,24 @@ mod tests { assert_eq!(resp.status, "ready"); assert!(resp.pending_cli); } + + // ── DaemonReadinessResponse deserialization ───────────── + + #[test] + fn test_deserialize_daemon_readiness_connected() { + let json = r#"{"status":"ready","renderer_connected":true}"#; + let resp: DaemonReadinessResponse = serde_json::from_str(json).unwrap(); + assert_eq!(resp.status, "ready"); + assert!(resp.renderer_connected); + } + + #[test] + fn test_deserialize_daemon_readiness_not_connected() { + let json = r#"{"status":"not_ready","renderer_connected":false}"#; + let resp: DaemonReadinessResponse = serde_json::from_str(json).unwrap(); + assert_eq!(resp.status, "not_ready"); + assert!(!resp.renderer_connected); + } } #[cfg(test)] From 5af14f94056ef14555ac9c97b9e10fb9af1ff393 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 22:37:36 +0800 Subject: [PATCH 13/17] feat(cli): poll daemon /readyz with animated dots when Electron is newly spawned Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-cli/src/main.rs | 43 +++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/crates/cli-box-cli/src/main.rs b/crates/cli-box-cli/src/main.rs index 30ae112..254f030 100644 --- a/crates/cli-box-cli/src/main.rs +++ b/crates/cli-box-cli/src/main.rs @@ -482,16 +482,57 @@ async fn cmd_start_daemon(command: &str, args: &[String]) -> anyhow::Result<()> // Spawn Electron only if not already running. // If already running, the renderer polls /box/list and will pick up the new sandbox. - if find_running_electron() { + let electron_newly_spawned = if find_running_electron() { tracing::info!("[start] Electron already running, skipping spawn"); + false } else if let Some(electron_bin) = find_electron_binary() { tracing::info!("[start] spawning Electron: {}", electron_bin.display()); let _child = Command::new(&electron_bin) .spawn() .context("Failed to launch Electron app")?; tracing::info!("[start] Electron launched"); + true } else { tracing::warn!("[start] Electron app not found, running in headless daemon mode"); + false + }; + + // Wait for renderer WebSocket to connect if Electron was newly spawned. + if electron_newly_spawned { + print!("正在启动"); + use std::io::Write; + let _ = std::io::stdout().flush(); + + let timeout = std::time::Duration::from_secs(60); + let start = std::time::Instant::now(); + let poll_interval = std::time::Duration::from_secs(1); + let mut dot_count: u8 = 0; + + loop { + if start.elapsed() > timeout { + println!(); + tracing::warn!( + "[start] Renderer WebSocket did not connect within {}s, continuing anyway", + timeout.as_secs() + ); + break; + } + + match client::daemon_readiness().await { + Ok(resp) if resp.renderer_connected => { + println!(" 完成"); + break; + } + _ => {} + } + + dot_count = (dot_count % 3) + 1; + print!("\r正在启动{}", ".".repeat(dot_count as usize)); + print!("{}", " ".repeat(3 - dot_count as usize)); // clear leftover dots + let _ = std::io::stdout().flush(); + + tokio::time::sleep(poll_interval).await; + } } Ok(()) From 0784e27c4791f186afbc6907304f46d1e97225a7 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 22:42:17 +0800 Subject: [PATCH 14/17] fix(cli): add timeout and trace logging to readiness polling - Add 3s per-request timeout to daemon_readiness() to prevent stalling - Log readyz check errors at trace level for debugging Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-cli/src/client.rs | 1 + crates/cli-box-cli/src/main.rs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/crates/cli-box-cli/src/client.rs b/crates/cli-box-cli/src/client.rs index 32d7156..a1d9308 100644 --- a/crates/cli-box-cli/src/client.rs +++ b/crates/cli-box-cli/src/client.rs @@ -60,6 +60,7 @@ pub async fn daemon_readiness() -> Result { let client = reqwest_client(); let resp = client .get(format!("{base}/readyz")) + .timeout(std::time::Duration::from_secs(3)) .send() .await .with_context(|| "Failed to connect to daemon readyz endpoint")?; diff --git a/crates/cli-box-cli/src/main.rs b/crates/cli-box-cli/src/main.rs index 254f030..7baf87d 100644 --- a/crates/cli-box-cli/src/main.rs +++ b/crates/cli-box-cli/src/main.rs @@ -523,6 +523,9 @@ async fn cmd_start_daemon(command: &str, args: &[String]) -> anyhow::Result<()> println!(" 完成"); break; } + Err(e) => { + tracing::trace!("[start] readyz check failed (will retry): {e}"); + } _ => {} } From fab0f87559bdddc06b37032520c58a79168db6ee Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 22:49:39 +0800 Subject: [PATCH 15/17] fix: cargo fmt and clippy warnings Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-cli/src/client.rs | 1 + crates/cli-box-core/src/daemon/mod.rs | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/crates/cli-box-cli/src/client.rs b/crates/cli-box-cli/src/client.rs index a1d9308..07dcafe 100644 --- a/crates/cli-box-cli/src/client.rs +++ b/crates/cli-box-cli/src/client.rs @@ -49,6 +49,7 @@ pub struct DaemonHealthResponse { } #[derive(Debug, Deserialize)] +#[allow(dead_code)] pub struct DaemonReadinessResponse { pub status: String, pub renderer_connected: bool, diff --git a/crates/cli-box-core/src/daemon/mod.rs b/crates/cli-box-core/src/daemon/mod.rs index 7a97999..501d2a4 100644 --- a/crates/cli-box-core/src/daemon/mod.rs +++ b/crates/cli-box-core/src/daemon/mod.rs @@ -290,11 +290,18 @@ async fn health_handler(State(state): State>>) -> Json>>) -> Json { +async fn readyz_handler( + State(state): State>>, +) -> Json { let s = state.lock().await; let renderer_connected = s.screenshot_ws_tx.is_some(); Json(DaemonReadinessResponse { - status: if renderer_connected { "ready" } else { "not_ready" }.to_string(), + status: if renderer_connected { + "ready" + } else { + "not_ready" + } + .to_string(), renderer_connected, }) } From 5a41035e54399589b7d403aff9f32f313f7cc7d4 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Fri, 5 Jun 2026 23:01:03 +0800 Subject: [PATCH 16/17] =?UTF-8?q?fix:=20review=20feedback=20=E2=80=94=20do?= =?UTF-8?q?cument=20/readyz=20semantics,=20clean=20dot=20animation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add doc comment explaining daemon /readyz always returns 200 (polling endpoint) - Use fixed-width padding for animated dots instead of trailing spaces Co-Authored-By: Claude Opus 4.7 --- crates/cli-box-cli/src/main.rs | 3 +-- crates/cli-box-core/src/daemon/mod.rs | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/cli-box-cli/src/main.rs b/crates/cli-box-cli/src/main.rs index 7baf87d..f0bd7a4 100644 --- a/crates/cli-box-cli/src/main.rs +++ b/crates/cli-box-cli/src/main.rs @@ -530,8 +530,7 @@ async fn cmd_start_daemon(command: &str, args: &[String]) -> anyhow::Result<()> } dot_count = (dot_count % 3) + 1; - print!("\r正在启动{}", ".".repeat(dot_count as usize)); - print!("{}", " ".repeat(3 - dot_count as usize)); // clear leftover dots + print!("\r正在启动{:<3}", ".".repeat(dot_count as usize)); let _ = std::io::stdout().flush(); tokio::time::sleep(poll_interval).await; diff --git a/crates/cli-box-core/src/daemon/mod.rs b/crates/cli-box-core/src/daemon/mod.rs index 501d2a4..6e73f81 100644 --- a/crates/cli-box-core/src/daemon/mod.rs +++ b/crates/cli-box-core/src/daemon/mod.rs @@ -290,6 +290,9 @@ async fn health_handler(State(state): State>>) -> Json>>, ) -> Json { From 712427ea2cea06e5a8dbefd98fe5514fe6ebc272 Mon Sep 17 00:00:00 2001 From: ZN-Ice Date: Sat, 6 Jun 2026 11:42:46 +0800 Subject: [PATCH 17/17] docs: rewrite CLAUDE.md as development workflow guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Complete 7-phase development workflow (branch → brainstorm → test design → plan → execute → review → test → CI) - Superpowers skill mapping per phase - Testing layers: UT / IT / E2E / Release test - Key constraints: no auto-merge, CLI-first testing, screenshot verification Co-Authored-By: Claude Opus 4.7 --- CLAUDE.md | 529 ++++++++++++++++++++++-------------------------------- 1 file changed, 214 insertions(+), 315 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 2e3ff11..ace2a51 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,365 +1,264 @@ -# cli-box — macOS 桌面自动化沙箱 +# cli-box — 开发工作流指南 -> **核心理念**:一个可复用的 macOS 桌面自动化沙箱,支持多实例管理——通过 CLI 命令启动独立沙箱窗口,在其中运行任意 CLI 或 macOS 应用,并通过模拟鼠标/键盘操作与截图反馈进行自动化控制。 +> **使用方式**:用户发送需求后,Claude 读取本文档,按照预设工作流自动执行完整开发周期。 > -> 对目标应用**零侵入**,所有操作在 OS 层面完成(CGEvent + AXUIElement + ScreenCaptureKit)。 -> -> **Daemon + Electron 架构**:一个长驻 Rust daemon 管理所有沙箱实例(PTY 进程 + macOS 应用),通过单一 HTTP API 对外服务。Electron 应用作为 GUI 前端,提供 tab 管理、xterm.js 终端和截图预览。CLI 直接与 daemon 通信。 +> **核心原则**:Superpowers 驱动 · 测试先行 · 代码检视 · 不自动合入主分支 + +--- + +## 一、项目概览 -## 一、架构总览 +**cli-box** 是一个 macOS 桌面自动化沙箱,支持多实例管理。通过 CLI 命令启动独立沙箱窗口,在其中运行任意 CLI 或 macOS 应用,并通过模拟鼠标/键盘操作与截图反馈进行自动化控制。 + +**架构**:Rust daemon(PTY + 自动化引擎)+ Electron GUI(xterm.js + React)+ CLI 工具 ``` -┌──────────────────────────────────────────────────────────────┐ -│ Agent / 用户 (CLI / MCP / HTTP) │ -│ cli-box start / list / screenshot / click / type / key │ -└───────────────────────────────┬───────────────────────────────┘ - │ HTTP (localhost:15801) - ▼ -┌──────────────────────────────────────────────────────────────┐ -│ cli-box-daemon (Rust, 单实例) │ -│ PTY Manager + App Manager + Automation Engine │ -│ Instance Registry (~/.cli-box/instances/) │ -└───────────────────────────────┬───────────────────────────────┘ - │ WebSocket (PTY 流) - ▼ -┌──────────────────────────────────────────────────────────────┐ -│ Electron App (单实例, Chromium) │ -│ Tab 管理 + xterm.js + 控制面板 + 截图预览 │ -└──────────────────────────────────────────────────────────────┘ +Agent / 用户 (CLI / MCP / HTTP) + │ HTTP (localhost:15801) + ▼ +cli-box-daemon (Rust, 单实例) + │ WebSocket (PTY 流 + 截图) + ▼ +Electron App (单实例, Chromium) ``` -**设计原则**: -1. **零侵入**:目标应用不需要任何适配,所有操作在 OS 层面完成 -2. **单 daemon 多沙箱**:一个 daemon 进程管理所有沙箱实例,通过 CLI 管理生命周期 -3. **窗口级截图**:ScreenCaptureKit 按窗口 ID 截图,不需要窗口在前台 -4. **双协议**:MCP (Agent CLI 原生) + HTTP (通用调用) -5. **文件系统注册中心**:沙箱实例通过 `~/.cli-box/instances/.json` 注册和发现 +**技术栈**:Rust (tokio + axum) · Electron (React + xterm.js) · macOS API (CGEvent + AXUIElement + ScreenCaptureKit) -**PTY Reader Thread**: Each PTY session spawns a dedicated background thread that continuously reads output into a shared buffer. The HTTP `/pty/output/:pid` endpoint drains from this buffer non-blocking. This replaces the earlier take/read/put-back pattern that blocked on idle TUI apps (opencode, vim, etc.). +--- -## 二、技术栈 +## 二、开发工作流(完整周期) -| 项目属性 | 规范值 | -|---------|--------| -| 核心库 | Rust (Edition 2021, >=1.88), `cli-box-core` library crate | -| CLI | Rust, `cli-box-cli` binary crate | -| 桌面框架 | Electron (Chromium) | -| 桌面前端 | React 18 + TS + Vite + xterm.js | -| 异步运行时 | tokio | -| macOS API | CoreGraphics (CGEvent), ApplicationServices (AXUIElement), ScreenCaptureKit | -| 包管理 | Cargo Workspace + pnpm | -| 测试 | cargo test (Rust) + vitest (TS) | -| 目标平台 | macOS (Apple Silicon 优先) | -| License | Apache 2.0 | +当用户发送新需求时,按以下阶段顺序执行: -## 三、目录结构 +### 阶段 0:分支准备 -``` -cli-box/ -├── Cargo.toml # Workspace 根 -├── crates/ -│ ├── cli-box-core/ # 🔑 自动化核心 (library) -│ │ └── src/ -│ │ ├── lib.rs, error.rs -│ │ ├── automation/ # CGEvent 输入模拟 + AXUIElement UI 检查 -│ │ │ ├── cg_event.rs -│ │ │ └── ax_ui.rs -│ │ ├── capture/ # ScreenCaptureKit 截图引擎 -│ │ │ └── mod.rs -│ │ ├── process/ # PTY + NSWorkspace 进程管理 -│ │ │ └── mod.rs -│ │ ├── sandbox/ # 沙箱窗口管理 (含多实例支持) -│ │ │ └── mod.rs -│ │ ├── instance/ # NEW: 沙箱实例注册中心 -│ │ │ └── mod.rs -│ │ └── server/ # NEW: HTTP API 服务器 (library) -│ │ └── mod.rs -│ └── cli-box-cli/ # 🖥️ CLI (binary) -│ └── src/ -│ ├── main.rs # start/list/close + 所有子命令 -│ ├── client.rs # NEW: HTTP 客户端 (与沙箱实例通信) -│ └── mcp_server.rs # MCP stdio 服务器 -├── electron-app/ # 🌐 沙箱窗口前端 (xterm.js + React) -│ └── src/ -│ ├── main.tsx, api.ts -│ └── components/ # Terminal, ControlPanel, StatusBar, RecordControls -├── src-tauri/ # 🖥️ macOS 宿主应用 (Tauri) -│ └── src/main.rs # 多实例支持:CLI 参数解析 + 内嵌 HTTP API -├── docs/ -│ ├── design/ # 设计文档 -│ └── task/ # 任务管理 (README.md + phase-*.md + task_records.json) -├── tests/ -│ └── fixtures/ # 集成测试场景 (YAML/JSON) -└── config.example.json +```bash +git checkout main && git pull +git checkout -b feat/- ``` -## 四、核心接口 +- 从 main 新切特性分支 +- 分支命名:`feat/`、`fix/`、`test/`、`docs/` 前缀 -### CLI 命令 (cli-box-cli) +### 阶段 1:需求分析与方案设计 -```bash -# 多实例管理 -cli-box start # 启动沙箱,打开 zsh 终端(默认) -cli-box start claude # 启动沙箱,直接运行 Claude Code -cli-box start --shell # 等同于 cli-box start(快捷方式) -cli-box start /path/to/App.app # 启动沙箱,运行 macOS 应用 -cli-box list # 列出所有活跃沙箱及其状态 -cli-box close # 关闭指定沙箱 -cli-box inspect # 查看沙箱详情 - -# 沙箱作用域操作 (通过 --id 指定目标沙箱) -cli-box screenshot --id # 截取沙箱截图 -cli-box screenshot --id -o result.png # 截图并指定输出路径 -cli-box click --id 100 200 # 在沙箱内模拟点击 -cli-box type --id "hello world" # 在沙箱内模拟输入 -cli-box key --id Return --modifiers cmd # 在沙箱内模拟按键 - -# 进程管理 (沙箱内) -cli-box windows --id # 列出沙箱内窗口 -cli-box processes --id # 列出沙箱内进程 - -# 独立模式 (无多实例,向后兼容) -cli-box serve --port 5801 # 启动独立 HTTP + MCP 服务器 -cli-box mcp-serve # MCP stdio 模式 -``` +**使用技能**:`superpowers:brainstorming` -### 实例注册中心 (文件系统) +1. **探索项目上下文** — 读取相关代码、文档、最近提交 +2. **需求澄清** — 一次一个问题,与用户对齐目标和约束 +3. **方案探讨** — 提出 2-3 个方案,分析 trade-offs,给出推荐 +4. **设计呈现** — 分段呈现架构、组件、数据流、错误处理、测试策略 +5. **设计文档** — 写入 `docs/superpowers/specs/YYYY-MM-DD--design.md` +6. **自检** — 检查占位符、内部一致性、范围、歧义 +7. **用户确认** — 等用户 review spec 后再进入下一阶段 -``` -~/.cli-box/instances/ -├── abc123.json # {id, port, pid, kind, title, status, created_at, window_id} -├── def456.json -└── ... -``` +### 阶段 2:测试设计 -### MCP Tools (Agent 调用) - -```yaml -# 沙箱实例管理 (NEW) -list_sandboxes: # 列出所有活跃沙箱 -start_sandbox: # 启动新沙箱 (--cli/--app) -close_sandbox: # 关闭指定沙箱 - -# 窗口管理 -list_windows: # 列出沙箱内所有窗口 -find_window: # 按 app 名/标题查找 -focus_window: # 聚焦指定窗口 - -# 进程管理 -spawn_app: # 启动 .app (如 Hi Boss.app) -spawn_cli: # 启动 CLI 进程 (如 hiboss) -kill_process: # 终止进程 -list_processes: # 列出沙箱内进程 - -# 输入模拟 -click: # 鼠标点击 (x, y, button) -double_click: # 双击 -type_text: # 输入文本 -press_key: # 按键 (Return, Tab, etc.) -scroll: # 滚动 -drag: # 拖拽 - -# 截图 (核心) -screenshot: # 截取沙箱窗口 (base64 PNG) -screenshot_window: # 截取沙箱内指定子窗口 -screenshot_region: # 截取沙箱内指定区域 - -# UI 检查 (高级) -inspect_ui: # 读取 AX 树 -find_element: # 按 role/title 查找 UI 元素 -``` +在写实现计划之前,先设计测试策略: -### HTTP API (每实例独立端口 `:5801`/`:15802`/etc.) +| 测试层级 | 工具 | 覆盖范围 | +|---------|------|---------| +| **UT (单元测试)** | `cargo test` (Rust) · `vitest` (TS) | 单个函数/模块,mock 外部依赖 | +| **IT (集成测试)** | `cargo test --test daemon_integration` | Daemon HTTP API 端点,tower::ServiceExt::oneshot | +| **E2E (端到端)** | `test.sh` · `tests/e2e-*.sh` | 完整用户场景,CLI 命令驱动 | -``` -GET /health 健康检查 -GET /sandbox/info 沙箱信息 (id, mode, running process) -POST /shutdown 关闭沙箱 -GET /windows 列出窗口 -GET /processes 列出进程 -POST /app/spawn 启动 .app -POST /cli/spawn 启动 CLI -POST /input/click 鼠标点击 -POST /input/type 键盘输入 -POST /input/key 按键 -POST /input/scroll 滚动 -POST /input/drag 拖拽 -GET /screenshot 截取沙箱窗口 (PNG) -GET /screenshot/:window_id 截取指定窗口 -GET /screenshot/region 截取指定区域 -GET /ui/inspect/:window_id 读取 UI 树 -POST /ui/find 查找 UI 元素 -POST /record/start 开始录制 -POST /record/stop 停止录制 -POST /playback/actions 回放操作 -POST /scenario/run 运行测试场景 -POST /diff 截图差异对比 -WS /pty/ws/{pid} PTY WebSocket (文本=输入, JSON=resize) -``` +测试设计原则: +- **TDD**:先写失败测试 → 实现 → 通过 → 重构 +- **场景覆盖**:正常路径 + 边界条件 + 错误处理 +- **回归看护**:发现 bug 时,先补充能复现问题的测试,再修复 -### Rust API (cli-box-core) - -```rust -// 实例管理 -use cli_box_core::instance::{InstanceRegistry, SandboxInstance, generate_instance_id}; -let registry = InstanceRegistry::default(); -let instance = SandboxInstance::new(id, port, kind); -registry.register(&instance)?; -let all_instances = registry.list()?; -registry.unregister("abc123")?; - -// 输入模拟 -use cli_box_core::automation::cg_event::InputSimulator; -InputSimulator::click(100.0, 200.0, MouseButton::Left)?; -InputSimulator::type_text("Hello")?; -InputSimulator::press_key("Return", &["cmd"])?; - -// 截图 -use cli_box_core::capture::ScreenCapture; -let png_bytes = ScreenCapture::capture_window(window_id)?; - -// UI 检查 -use cli_box_core::automation::ax_ui::UiInspector; -let tree = UiInspector::inspect_window(window_id)?; - -// 进程管理 -use cli_box_core::process::ProcessManager; -ProcessManager::spawn_app("/path/to/App.app")?; -ProcessManager::spawn_cli("claude", &["--help".into()])?; - -// 沙箱管理 (多实例) -use cli_box_core::sandbox::{Sandbox, SandboxConfig}; -let config = SandboxConfig { - id: Some("abc123".into()), - port: Some(15801), - mode: Some("cli".into()), - command: Some("claude".into()), - ..SandboxConfig::default() -}; -let mut sandbox = Sandbox::new(config); -sandbox.init(window_id)?; -let screenshot = sandbox.screenshot()?; -``` +### 阶段 3:实现计划 -## 五、macOS 权限要求 +**使用技能**:`superpowers:writing-plans` -| 权限 | 用途 | 授予方式 | -|------|------|---------| -| **Accessibility** | CGEvent 输入模拟、AXUIElement 读取 | 系统设置 → 隐私与安全 → 辅助功能 | -| **Screen Recording** | ScreenCaptureKit 截图 | 系统设置 → 隐私与安全 → 屏幕录制 | +- 写入 `docs/superpowers/plans/YYYY-MM-DD-.md` +- 每个 Task 包含:Files(精确路径)、Steps(完整代码)、Verification(命令 + 预期输出)、Commit +- 遵循 DRY · YAGNI · TDD · 频繁提交 -**注意**:这两个权限必须用户手动授予,无法通过代码自动获取。建议不经过 App Store,直接分发 .dmg。 +### 阶段 4:计划执行 -## 六、Git 规范 +**使用技能**:`superpowers:subagent-driven-development` -``` -格式:(): +每个 Task: +1. 派发实现子代理(提供完整上下文,不共享会话历史) +2. 实现 → 测试 → 提交 +3. **Spec 合规检视** — 实现是否匹配 spec +4. **代码质量检视** — Rust 惯用法、一致性、测试质量 +5. 修复检视问题 → 重新检视 → 通过后进入下一 Task -scope: sandbox | automation | capture | process | server | cli | ui +### 阶段 5:代码检视 -示例: -feat(sandbox): 实现沙箱窗口管理 -feat(automation): CGEvent 鼠标点击模拟 -feat(capture): ScreenCaptureKit 窗口截图 -fix(server): 修复 HTTP API 端口冲突 -``` +**使用技能**:`superpowers:requesting-code-review` -## 七、核心工作流程 +完成所有 Task 后,派发最终代码检视: +- Base SHA → HEAD SHA 完整 diff +- 关注:架构一致性、测试覆盖、安全问题、命名规范 +- Critical 立即修复,Important 合入前修复,Minor 记录 -### 7.1 任务执行流程 +### 阶段 6:测试执行与回归 +#### 6.1 本地质量门禁 + +```bash +sh test.sh ``` -[1]创建任务记录(待执行) → [2]创建特性分支 → [3]编写设计文档(写到docs/design) - → [4]编写测试(RED) → [5]编码实现(GREEN) → [6]重构优化(REFACTOR) - → [7]本地检查(fmt+clippy+check+typecheck) → [8]验证测试覆盖率 - → [9]更新任务状态(已完成,必须在push前) → [10]git commit → [11]git push - → [12]创建 PR → [13]等待 CI 门禁通过 -``` -### 7.2 沙箱使用流程 +执行内容: +- `cargo test -p cli-box-core -p cli-box-cli` — Rust 测试 +- `cargo clippy --all-targets -- -D warnings` — 静态分析 +- `cargo fmt --all -- --check` — 格式检查 +- `pnpm typecheck` — TypeScript 类型检查 +- `pnpm vitest run` — 前端单元测试 +- Playwright E2E 测试 +- E2E skill 安装测试 +- "sandbox" 残留检查 + +**如果失败**:使用 `superpowers:systematic-debugging` 分析根因,修复后回归。 + +#### 6.2 Release 构建 ```bash -# 1. 启动沙箱(默认打开 zsh 终端) -cli-box start -# → 自动打开沙箱窗口,xterm.js 中运行 zsh -# → 可在终端中输入 claude、opencode 等命令 - -# 2. 启动沙箱(直接运行指定命令) -cli-box start claude -# → 自动打开沙箱窗口,直接运行 claude - -# 3. 启动沙箱(运行 macOS 应用) -cli-box start /Applications/cc-switch.app -# → 打开沙箱窗口,启动 cc-switch,关联其窗口 - -# 4. 查看所有沙箱 -cli-box list -# → ID TITLE KIND STATUS PORT CREATED -# → abc123 "claude" CLI Running 15801 2026-05-16 10:30 -# → def456 "cc-switch" APP Running 15802 2026-05-16 10:31 - -# 5. 操作指定沙箱 -cli-box screenshot --id abc123 -o sandbox.png # 截图 -cli-box click --id abc123 100 200 # 点击 -cli-box type --id abc123 --pty "帮我写一个函数" # PTY 输入 -cli-box key --id abc123 --pty Return # PTY 按键 - -# 6. 关闭沙箱 -cli-box close abc123 -# → 关闭沙箱窗口,清理注册信息,终止关联进程 +sh release.sh ``` -### 7.3 命令序列 +产出:`release/cli-box` + `release/cli-box-daemon` + `release/CLI Box.app` + +#### 6.3 Release 测试 + +按照 `tests/release_test.md` 执行手动场景测试: +- 只使用 CLI 命令测试,不直接调用 REST API +- 每步操作都截图保存到 `release_test/YYYY-MM-DD-HH-MM-SS/` +- 检查截图是否符合预期 +- 生成 markdown 测试报告 + +**如果测试出问题**: +1. 分析错误根因 +2. 判断能否通过 UT/IT/E2E 复现 +3. 如果可以,补充测试用例覆盖问题场景 +4. 修复问题后回归全部测试 + +### 阶段 7:提交与 CI ```bash -# 本地检查 -cargo fmt --all -- --check && cargo clippy --all-targets \ - && cargo check --all-targets && cargo test --all \ - && pnpm typecheck && pnpm format:check && pnpm test:unit - -# 构建 Tauri 应用 -cd electron-app && pnpm install && pnpm build && cd .. -cargo build --release -p cli-box-cli - -# 使用 CLI 启动沙箱(默认 zsh) -cargo run -p cli-box-cli -- start - -# 通过 HTTP 直接调用 (已知端口) -curl http://127.0.0.1:5801/screenshot -o screenshot.png -curl -X POST http://127.0.0.1:5801/input/click \ - -H "Content-Type: application/json" \ - -d '{"x": 100, "y": 200, "button": "left"}' - -# Agent 通过 MCP 调用 (Claude Code 配置) -# .claude/settings.json 中添加 MCP server 配置 +git push -u origin +gh pr create --title "" --body "<body>" ``` -## 八、安全约束 +- **提交远端**,等待 CI 执行结果 +- **不合入主分支** — PR 保持 open 状态 +- 分析 CI 结果,如有失败则修复后重新推送 -- ✅ 沙箱窗口是独立 NSWindow,截图范围可控 -- ✅ ScreenCaptureKit 按窗口 ID 截图,不截全屏 -- ✅ 目标应用不需要任何适配 -- ✅ Accessibility 和 Screen Recording 权限需用户手动授权 -- ✅ 每实例 HTTP API 仅监听 `127.0.0.1`,不暴露外部网络 -- ✅ 实例注册中心仅存储在本地文件系统 `~/.cli-box/instances/` -- ✅ 沙箱关闭时自动清理注册信息并终止关联进程 +--- + +## 三、Git 规范 -## 目录速查 +### Commit 格式 + +``` +<type>(<scope>): <description> + +[optional body] +[optional footer] +``` + +| type | 用途 | +|------|------| +| `feat` | 新功能 | +| `fix` | Bug 修复 | +| `test` | 测试相关 | +| `docs` | 文档更新 | +| `refactor` | 重构(不改变行为) | +| `chore` | 构建/工具链变更 | + +### Scope + +`sandbox` · `automation` · `capture` · `process` · `server` · `cli` · `ui` · `daemon` · `client` · `electron` + +### 提交策略 + +- 小粒度提交,每个提交可独立编译通过 +- 实现和测试在同一个或相邻提交中 +- `cargo fmt` 和 `clippy` 问题在提交前修复 + +--- + +## 四、目录速查 | 内容 | 路径 | |------|------| -| 核心库 | `/crates/cli-box-core/src/` | -| 实例管理 | `/crates/cli-box-core/src/instance/` | -| HTTP 服务器 | `/crates/cli-box-core/src/server/` | -| CLI 入口 | `/crates/cli-box-cli/src/main.rs` | -| HTTP 客户端 | `/crates/cli-box-cli/src/client.rs` | -| Tauri 宿主 | `/src-tauri/src/main.rs` | -| 沙箱前端 | `/electron-app/src/` | -| 前端 API 层 | `/electron-app/src/api.ts` | -| 设计文档 | `/docs/design/` | -| 任务管理 | `/docs/task/` | -| 本文件 | `/CLAUDE.md` | +| 核心库 | `crates/cli-box-core/src/` | +| Daemon | `crates/cli-box-core/src/daemon/mod.rs` | +| 实例管理 | `crates/cli-box-core/src/instance/` | +| HTTP 服务器 | `crates/cli-box-core/src/server/` | +| CLI 入口 | `crates/cli-box-cli/src/main.rs` | +| HTTP 客户端 | `crates/cli-box-cli/src/client.rs` | +| Electron 前端 | `electron-app/src/` | +| 前端 API 层 | `electron-app/src/api.ts` | +| 设计文档 | `docs/superpowers/specs/` | +| 实现计划 | `docs/superpowers/plans/` | +| Release 测试脚本 | `test.sh` · `release.sh` | +| Release 测试场景 | `tests/release_test.md` | +| Release 测试报告 | `release_test/YYYY-MM-DD-HH-MM-SS/` | +| 本文件 | `CLAUDE.md` | + +--- + +## 五、测试层级说明 + +### UT (单元测试) + +- **Rust**:`#[cfg(test)] mod tests` 在每个文件内,`cargo test` 运行 +- **TypeScript**:`*.test.ts` 文件,`vitest` 运行 +- 测试单个函数/模块,mock 外部依赖(HTTP、文件系统、macOS API) + +### IT (集成测试) + +- **位置**:`crates/cli-box-core/tests/daemon_integration.rs` +- **方式**:`tower::ServiceExt::oneshot` 测试 daemon 路由,不绑定真实 TCP 端口 +- **覆盖**:每个 HTTP 端点的正常/错误路径 + +### E2E (端到端测试) + +- **脚本**:`test.sh` 编排所有测试,`tests/e2e-*.sh` 执行具体场景 +- **场景**:CLI 命令 → daemon 响应 → 验证结果 +- **覆盖**:sandbox 生命周期、截图、输入模拟、skill 安装 + +### Release 测试 + +- **触发**:`sh release.sh` 构建后手动执行 +- **场景**:按照 `tests/release_test.md` 中的完整用户流程 +- **产出**:截图 + markdown 测试报告 + +--- + +## 六、Superpowers 技能使用 + +| 阶段 | 技能 | 触发时机 | +|------|------|---------| +| 需求分析 | `superpowers:brainstorming` | 新需求开始时 | +| 计划编写 | `superpowers:writing-plans` | 设计确认后 | +| 计划执行 | `superpowers:subagent-driven-development` | 实现阶段 | +| 代码检视 | `superpowers:requesting-code-review` | 每个 Task 完成后 + 最终检视 | +| Bug 调试 | `superpowers:systematic-debugging` | 测试失败或异常行为时 | +| 分支收尾 | `superpowers:finishing-a-development-branch` | 所有任务完成时 | + +**调试原则**(systematic-debugging): +- **NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST** +- Phase 1: 根因调查 → Phase 2: 模式分析 → Phase 3: 假设验证 → Phase 4: 修复实现 +- 3 次修复失败 → 质疑架构,与用户讨论 + +--- + +## 七、关键约束 + +- **语言**:用户使用中文交流,代码和注释使用英文 +- **不自动合入**:PR 创建后保持 open,不执行 merge +- **测试驱动**:先写测试,再写实现 +- **CLI 优先**:Release 测试只使用 CLI 命令,不直接调用 REST API +- **截图验证**:Release 测试每步操作都截图,检查图片是否符合预期 +- **Superpowers 驱动**:使用 Superpowers 技能完成各阶段工作,不跳过 +- **零侵入**:目标应用不需要任何适配,所有操作在 OS 层面完成 --- -**版本**:v0.2.0 | **创建**:2026-05-13 | **更新**:2026-05-16 | **维护者**:cli-box 项目 +**版本**:v0.2.0 | **创建**:2026-05-13 | **更新**:2026-06-06 | **维护者**:cli-box 项目