mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-09-19 00:03:30 +00:00
parent
b215ad8083
commit
ced487d505
5 changed files with 157 additions and 7 deletions
|
|
@ -1,14 +1,16 @@
|
|||
{
|
||||
"timestamp": "2026-03-19T15:22:11.134864Z",
|
||||
"current_node": "preflight_lint",
|
||||
"timestamp": "2026-03-19T15:27:52.217648Z",
|
||||
"current_node": "implement",
|
||||
"completed_nodes": [
|
||||
"start",
|
||||
"toolchain",
|
||||
"preflight_compile",
|
||||
"preflight_lint"
|
||||
"preflight_lint",
|
||||
"implement"
|
||||
],
|
||||
"node_retries": {
|
||||
"preflight_lint": 1,
|
||||
"implement": 1,
|
||||
"preflight_compile": 1,
|
||||
"start": 1,
|
||||
"toolchain": 1
|
||||
|
|
@ -20,8 +22,10 @@
|
|||
"internal.node_visit_count": 1,
|
||||
"failure_signature": "",
|
||||
"internal.retry_count.preflight_compile": 1,
|
||||
"current.preamble": "Goal: # Fix: DaytonaSandbox concurrent test failures from `set_current_dir` poisoning\n\n## Context\n\nTwo Daytona integration tests (`daytona_computer_use_browser_screenshot` and `daytona_playwright_mcp_sandbox_transport`) call `std::env::set_current_dir(tmp.path())` to make `detect_repo_info()` fail so the sandbox skips cloning. Since `set_current_dir` is **process-global**, any concurrent test calling `initialize()` sees the changed cwd, causing `detect_repo_info` to fail and the sandbox to get an empty directory with no git repo. This makes `git rev-parse HEAD` return exit code 128.\n\nThe fix follows the existing `ExeSandbox`/`SshSandbox` pattern: move clone params out of `initialize()` and into the constructor so callers control whether cloning happens.\n\n## Changes\n\n### 1. `lib/crates/fabro-daytona/src/lib.rs` — Core refactor\n\n- Add a `GitCloneParams` struct with `url: String` and `branch: Option<String>` fields\n- Change `DaytonaSandbox` field from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- Update `new()` signature: last param changes from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- Update `reconnect()` (line 84): `clone_params: None`\n- Refactor `initialize()`:\n - Remove `let cwd = std::env::current_dir()` (line 392)\n - Replace `match detect_repo_info(&cwd)` (line 448) with `if let Some(ref params) = self.clone_params`\n - `Some` arm: use `params.url` / `params.branch` directly (already HTTPS, no `ssh_url_to_https` needed inside initialize)\n - `None` arm: create empty working directory (existing `Err` arm logic, lines 607-618)\n - Remove `self.clone_branch.clone().or(detected_branch)` merge — caller provides the final branch\n\n### 2. `lib/crates/fabro-cli/src/commands/run.rs` — Production callers\n\n- **Line 1017** (main `run` path): Construct `GitCloneParams` from `origin_url` and `detected_base_branch` (already extracted at line 557):\n ```rust\n let clone_params = origin_url.as_ref().map(|url| fabro_daytona::GitCloneParams {\n url: fabro_github::ssh_url_to_https(url),\n branch: detected_base_branch.clone(),\n });\n ```\n Pass `clone_params` as the last arg to `DaytonaSandbox::new()`\n\n- **Line 2133** (doctor path): Currently passes `None` for `clone_branch`. Under the new API, `None` for `clone_params` means \"skip clone\" — same behavior, just update the type. No logic change needed.\n\n### 3. `lib/crates/fabro-workflows/tests/daytona_integration.rs` — Test fixes\n\n- **`create_env_with_github_app`** (line 30): Detect repo and build `GitCloneParams` before calling `new()`:\n ```rust\n let cwd = std::env::current_dir().unwrap();\n let clone_params = fabro_daytona::detect_repo_info(&cwd)\n .ok()\n .map(|(url, branch)| fabro_daytona::GitCloneParams {\n url: fabro_github::ssh_url_to_https(&url),\n branch,\n });\n DaytonaSandbox::new(DaytonaConfig::default(), github_app, None, clone_params)\n ```\n This preserves cloning for all tests that use `create_env()`/`create_env_with_github_app()`.\n\n- **`daytona_snapshot_sandbox`** (line 252) and **`run_daytona_cli_test`** (line 927): Currently pass `None` as `clone_branch`. Under new API, `None` for `clone_params` = skip clone. These tests don't need repo contents (snapshot checks `rg --version`, CLI tests install tools independently). No logic change needed.\n\n- **`daytona_computer_use_browser_screenshot`** (line 1855-1857): Remove `tempfile::tempdir()` and `set_current_dir()`. Already passes `None` as last arg → skip clone.\n\n- **`daytona_playwright_mcp_sandbox_transport`** (line 2015-2017): Same — remove `tempfile::tempdir()` and `set_current_dir()`.\n\n## Verification\n\n1. `cargo build --workspace` — confirms all callers updated (compiler catches type mismatch)\n2. `cargo test -p fabro-workflows --test daytona_integration -- --ignored --test-threads=4` — the previously-failing git tests should pass with concurrent execution\n3. Specifically verify the 5 previously-failing tests pass: `daytona_full_lifecycle`, `daytona_git_checkpoint_remote_emits_events`, `daytona_git_checkpoint_with_shadow_branch`, `daytona_git_push_run_branch_to_origin`, `daytona_parallel_git_branching_e2e`\n\n\n## Completed stages\n- **toolchain**: success\n - Script: `command -v cargo >/dev/null || { curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && sudo ln -sf $HOME/.cargo/bin/* /usr/local/bin/; }; cargo --version 2>&1`\n - Stdout:\n ```\n cargo 1.94.0 (85eff7c80 2026-01-15)\n ```\n - Stderr: (empty)\n- **preflight_compile**: success\n - Script: `cargo check -q --workspace 2>&1`\n - Stdout: (empty)\n - Stderr: (empty)\n",
|
||||
"response.implement": "The diff looks exactly right. Let me summarize all the changes made:\n\n## Summary of changes\n\n### 1. `lib/crates/fabro-daytona/src/lib.rs` — Core refactor\n- **Added `GitCloneParams` struct** with `url: String` and `branch: Option<String>` fields, publicly exported\n- **Changed `DaytonaSandbox` field** from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- **Updated `new()` signature**: last param changed from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- **Updated `reconnect()`**: `clone_params: None` (was `clone_branch: None`)\n- **Refactored `initialize()`**:\n - Removed `let cwd = std::env::current_dir()` — no longer reads the process-global cwd\n - Replaced `match detect_repo_info(&cwd)` with `if let Some(ref clone_params) = self.clone_params`\n - `Some` arm: uses `clone_params.url` / `clone_params.branch` directly (URL is already HTTPS from caller)\n - `else` arm: creates empty working directory (the old `Err` arm logic)\n- **Removed unused import** `use fabro_github::ssh_url_to_https`\n\n### 2. `lib/crates/fabro-cli/src/commands/run.rs` — Production callers\n- **Main `run` path**: Constructs `GitCloneParams` from `origin_url` (with `ssh_url_to_https`) and `detected_base_branch`, passes it to `DaytonaSandbox::new()`\n- **Doctor path**: Already passes `None` — type changed from `Option<String>` to `Option<GitCloneParams>` but `None` is valid for both\n\n### 3. `lib/crates/fabro-workflows/tests/daytona_integration.rs` — Test fixes\n- **`create_env_with_github_app`**: Detects repo info with `detect_repo_info(&cwd)` and builds `GitCloneParams` before calling `new()`, preserving clone behavior for all tests that use this helper\n- **`daytona_computer_use_browser_screenshot`**: Removed `tempfile::tempdir()` and `set_current_dir()` — passes `None` as last arg which now cleanly means \"skip clone\"\n- **`daytona_playwright_mcp_sandbox_transport`**: Same — removed `tempfile::tempdir()` and `set_current_dir()`",
|
||||
"current.preamble": "Goal: # Fix: DaytonaSandbox concurrent test failures from `set_current_dir` poisoning\n\n## Context\n\nTwo Daytona integration tests (`daytona_computer_use_browser_screenshot` and `daytona_playwright_mcp_sandbox_transport`) call `std::env::set_current_dir(tmp.path())` to make `detect_repo_info()` fail so the sandbox skips cloning. Since `set_current_dir` is **process-global**, any concurrent test calling `initialize()` sees the changed cwd, causing `detect_repo_info` to fail and the sandbox to get an empty directory with no git repo. This makes `git rev-parse HEAD` return exit code 128.\n\nThe fix follows the existing `ExeSandbox`/`SshSandbox` pattern: move clone params out of `initialize()` and into the constructor so callers control whether cloning happens.\n\n## Changes\n\n### 1. `lib/crates/fabro-daytona/src/lib.rs` — Core refactor\n\n- Add a `GitCloneParams` struct with `url: String` and `branch: Option<String>` fields\n- Change `DaytonaSandbox` field from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- Update `new()` signature: last param changes from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- Update `reconnect()` (line 84): `clone_params: None`\n- Refactor `initialize()`:\n - Remove `let cwd = std::env::current_dir()` (line 392)\n - Replace `match detect_repo_info(&cwd)` (line 448) with `if let Some(ref params) = self.clone_params`\n - `Some` arm: use `params.url` / `params.branch` directly (already HTTPS, no `ssh_url_to_https` needed inside initialize)\n - `None` arm: create empty working directory (existing `Err` arm logic, lines 607-618)\n - Remove `self.clone_branch.clone().or(detected_branch)` merge — caller provides the final branch\n\n### 2. `lib/crates/fabro-cli/src/commands/run.rs` — Production callers\n\n- **Line 1017** (main `run` path): Construct `GitCloneParams` from `origin_url` and `detected_base_branch` (already extracted at line 557):\n ```rust\n let clone_params = origin_url.as_ref().map(|url| fabro_daytona::GitCloneParams {\n url: fabro_github::ssh_url_to_https(url),\n branch: detected_base_branch.clone(),\n });\n ```\n Pass `clone_params` as the last arg to `DaytonaSandbox::new()`\n\n- **Line 2133** (doctor path): Currently passes `None` for `clone_branch`. Under the new API, `None` for `clone_params` means \"skip clone\" — same behavior, just update the type. No logic change needed.\n\n### 3. `lib/crates/fabro-workflows/tests/daytona_integration.rs` — Test fixes\n\n- **`create_env_with_github_app`** (line 30): Detect repo and build `GitCloneParams` before calling `new()`:\n ```rust\n let cwd = std::env::current_dir().unwrap();\n let clone_params = fabro_daytona::detect_repo_info(&cwd)\n .ok()\n .map(|(url, branch)| fabro_daytona::GitCloneParams {\n url: fabro_github::ssh_url_to_https(&url),\n branch,\n });\n DaytonaSandbox::new(DaytonaConfig::default(), github_app, None, clone_params)\n ```\n This preserves cloning for all tests that use `create_env()`/`create_env_with_github_app()`.\n\n- **`daytona_snapshot_sandbox`** (line 252) and **`run_daytona_cli_test`** (line 927): Currently pass `None` as `clone_branch`. Under new API, `None` for `clone_params` = skip clone. These tests don't need repo contents (snapshot checks `rg --version`, CLI tests install tools independently). No logic change needed.\n\n- **`daytona_computer_use_browser_screenshot`** (line 1855-1857): Remove `tempfile::tempdir()` and `set_current_dir()`. Already passes `None` as last arg → skip clone.\n\n- **`daytona_playwright_mcp_sandbox_transport`** (line 2015-2017): Same — remove `tempfile::tempdir()` and `set_current_dir()`.\n\n## Verification\n\n1. `cargo build --workspace` — confirms all callers updated (compiler catches type mismatch)\n2. `cargo test -p fabro-workflows --test daytona_integration -- --ignored --test-threads=4` — the previously-failing git tests should pass with concurrent execution\n3. Specifically verify the 5 previously-failing tests pass: `daytona_full_lifecycle`, `daytona_git_checkpoint_remote_emits_events`, `daytona_git_checkpoint_with_shadow_branch`, `daytona_git_push_run_branch_to_origin`, `daytona_parallel_git_branching_e2e`\n\n\n## Completed stages\n- **toolchain**: success\n - Script: `command -v cargo >/dev/null || { curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && sudo ln -sf $HOME/.cargo/bin/* /usr/local/bin/; }; cargo --version 2>&1`\n - Stdout:\n ```\n cargo 1.94.0 (85eff7c80 2026-01-15)\n ```\n - Stderr: (empty)\n- **preflight_compile**: success\n - Script: `cargo check -q --workspace 2>&1`\n - Stdout: (empty)\n - Stderr: (empty)\n- **preflight_lint**: success\n - Script: `cargo clippy -q --workspace -- -D warnings 2>&1`\n - Stdout: (empty)\n - Stderr: (empty)\n",
|
||||
"thread.preflight_compile.current_node": "preflight_lint",
|
||||
"last_response": "The diff looks exactly right. Let me summarize all the changes made:\n\n## Summary of changes\n\n### 1. `lib/crates/fabro-daytona/src/lib.rs` — Core refactor\n- **Added `GitCloneParams` struct** with `ur",
|
||||
"outcome": "success",
|
||||
"internal.retry_count.start": 1,
|
||||
"internal.run_id": "01KM3AY9Z9FWFBDH954H4W16SG",
|
||||
|
|
@ -30,10 +34,13 @@
|
|||
"graph.goal": "# Fix: DaytonaSandbox concurrent test failures from `set_current_dir` poisoning\n\n## Context\n\nTwo Daytona integration tests (`daytona_computer_use_browser_screenshot` and `daytona_playwright_mcp_sandbox_transport`) call `std::env::set_current_dir(tmp.path())` to make `detect_repo_info()` fail so the sandbox skips cloning. Since `set_current_dir` is **process-global**, any concurrent test calling `initialize()` sees the changed cwd, causing `detect_repo_info` to fail and the sandbox to get an empty directory with no git repo. This makes `git rev-parse HEAD` return exit code 128.\n\nThe fix follows the existing `ExeSandbox`/`SshSandbox` pattern: move clone params out of `initialize()` and into the constructor so callers control whether cloning happens.\n\n## Changes\n\n### 1. `lib/crates/fabro-daytona/src/lib.rs` — Core refactor\n\n- Add a `GitCloneParams` struct with `url: String` and `branch: Option<String>` fields\n- Change `DaytonaSandbox` field from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- Update `new()` signature: last param changes from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- Update `reconnect()` (line 84): `clone_params: None`\n- Refactor `initialize()`:\n - Remove `let cwd = std::env::current_dir()` (line 392)\n - Replace `match detect_repo_info(&cwd)` (line 448) with `if let Some(ref params) = self.clone_params`\n - `Some` arm: use `params.url` / `params.branch` directly (already HTTPS, no `ssh_url_to_https` needed inside initialize)\n - `None` arm: create empty working directory (existing `Err` arm logic, lines 607-618)\n - Remove `self.clone_branch.clone().or(detected_branch)` merge — caller provides the final branch\n\n### 2. `lib/crates/fabro-cli/src/commands/run.rs` — Production callers\n\n- **Line 1017** (main `run` path): Construct `GitCloneParams` from `origin_url` and `detected_base_branch` (already extracted at line 557):\n ```rust\n let clone_params = origin_url.as_ref().map(|url| fabro_daytona::GitCloneParams {\n url: fabro_github::ssh_url_to_https(url),\n branch: detected_base_branch.clone(),\n });\n ```\n Pass `clone_params` as the last arg to `DaytonaSandbox::new()`\n\n- **Line 2133** (doctor path): Currently passes `None` for `clone_branch`. Under the new API, `None` for `clone_params` means \"skip clone\" — same behavior, just update the type. No logic change needed.\n\n### 3. `lib/crates/fabro-workflows/tests/daytona_integration.rs` — Test fixes\n\n- **`create_env_with_github_app`** (line 30): Detect repo and build `GitCloneParams` before calling `new()`:\n ```rust\n let cwd = std::env::current_dir().unwrap();\n let clone_params = fabro_daytona::detect_repo_info(&cwd)\n .ok()\n .map(|(url, branch)| fabro_daytona::GitCloneParams {\n url: fabro_github::ssh_url_to_https(&url),\n branch,\n });\n DaytonaSandbox::new(DaytonaConfig::default(), github_app, None, clone_params)\n ```\n This preserves cloning for all tests that use `create_env()`/`create_env_with_github_app()`.\n\n- **`daytona_snapshot_sandbox`** (line 252) and **`run_daytona_cli_test`** (line 927): Currently pass `None` as `clone_branch`. Under new API, `None` for `clone_params` = skip clone. These tests don't need repo contents (snapshot checks `rg --version`, CLI tests install tools independently). No logic change needed.\n\n- **`daytona_computer_use_browser_screenshot`** (line 1855-1857): Remove `tempfile::tempdir()` and `set_current_dir()`. Already passes `None` as last arg → skip clone.\n\n- **`daytona_playwright_mcp_sandbox_transport`** (line 2015-2017): Same — remove `tempfile::tempdir()` and `set_current_dir()`.\n\n## Verification\n\n1. `cargo build --workspace` — confirms all callers updated (compiler catches type mismatch)\n2. `cargo test -p fabro-workflows --test daytona_integration -- --ignored --test-threads=4` — the previously-failing git tests should pass with concurrent execution\n3. Specifically verify the 5 previously-failing tests pass: `daytona_full_lifecycle`, `daytona_git_checkpoint_remote_emits_events`, `daytona_git_checkpoint_with_shadow_branch`, `daytona_git_push_run_branch_to_origin`, `daytona_parallel_git_branching_e2e`\n",
|
||||
"graph.rankdir": "LR",
|
||||
"internal.retry_count.preflight_lint": 1,
|
||||
"thread.preflight_lint.current_node": "implement",
|
||||
"internal.retry_count.implement": 1,
|
||||
"graph.model_stylesheet": "\n * { backend: api; model: claude-opus-4-6;}\n ",
|
||||
"internal.fidelity": "compact",
|
||||
"current_node": "preflight_lint",
|
||||
"internal.thread_id": "preflight_compile",
|
||||
"current_node": "implement",
|
||||
"internal.thread_id": "preflight_lint",
|
||||
"last_stage": "implement",
|
||||
"command.stderr": ""
|
||||
},
|
||||
"logs": [],
|
||||
|
|
@ -60,6 +67,30 @@
|
|||
"status": "success",
|
||||
"duration_ms": 0
|
||||
},
|
||||
"implement": {
|
||||
"status": "success",
|
||||
"context_updates": {
|
||||
"last_stage": "implement",
|
||||
"last_response": "The diff looks exactly right. Let me summarize all the changes made:\n\n## Summary of changes\n\n### 1. `lib/crates/fabro-daytona/src/lib.rs` — Core refactor\n- **Added `GitCloneParams` struct** with `ur",
|
||||
"response.implement": "The diff looks exactly right. Let me summarize all the changes made:\n\n## Summary of changes\n\n### 1. `lib/crates/fabro-daytona/src/lib.rs` — Core refactor\n- **Added `GitCloneParams` struct** with `url: String` and `branch: Option<String>` fields, publicly exported\n- **Changed `DaytonaSandbox` field** from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- **Updated `new()` signature**: last param changed from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`\n- **Updated `reconnect()`**: `clone_params: None` (was `clone_branch: None`)\n- **Refactored `initialize()`**:\n - Removed `let cwd = std::env::current_dir()` — no longer reads the process-global cwd\n - Replaced `match detect_repo_info(&cwd)` with `if let Some(ref clone_params) = self.clone_params`\n - `Some` arm: uses `clone_params.url` / `clone_params.branch` directly (URL is already HTTPS from caller)\n - `else` arm: creates empty working directory (the old `Err` arm logic)\n- **Removed unused import** `use fabro_github::ssh_url_to_https`\n\n### 2. `lib/crates/fabro-cli/src/commands/run.rs` — Production callers\n- **Main `run` path**: Constructs `GitCloneParams` from `origin_url` (with `ssh_url_to_https`) and `detected_base_branch`, passes it to `DaytonaSandbox::new()`\n- **Doctor path**: Already passes `None` — type changed from `Option<String>` to `Option<GitCloneParams>` but `None` is valid for both\n\n### 3. `lib/crates/fabro-workflows/tests/daytona_integration.rs` — Test fixes\n- **`create_env_with_github_app`**: Detects repo info with `detect_repo_info(&cwd)` and builds `GitCloneParams` before calling `new()`, preserving clone behavior for all tests that use this helper\n- **`daytona_computer_use_browser_screenshot`**: Removed `tempfile::tempdir()` and `set_current_dir()` — passes `None` as last arg which now cleanly means \"skip clone\"\n- **`daytona_playwright_mcp_sandbox_transport`**: Same — removed `tempfile::tempdir()` and `set_current_dir()`"
|
||||
},
|
||||
"notes": "Stage completed: implement",
|
||||
"usage": {
|
||||
"model": "claude-opus-4-6",
|
||||
"input_tokens": 66394,
|
||||
"output_tokens": 10682,
|
||||
"cache_read_tokens": 1370749,
|
||||
"cache_write_tokens": 70755,
|
||||
"reasoning_tokens": 81,
|
||||
"cost": 1.79706
|
||||
},
|
||||
"files_touched": [
|
||||
"/home/daytona/workspace/lib/crates/fabro-cli/src/commands/run.rs",
|
||||
"/home/daytona/workspace/lib/crates/fabro-daytona/src/lib.rs",
|
||||
"/home/daytona/workspace/lib/crates/fabro-workflows/tests/daytona_integration.rs"
|
||||
],
|
||||
"duration_ms": 337753
|
||||
},
|
||||
"toolchain": {
|
||||
"status": "success",
|
||||
"context_updates": {
|
||||
|
|
@ -70,8 +101,9 @@
|
|||
"duration_ms": 129
|
||||
}
|
||||
},
|
||||
"next_node_id": "implement",
|
||||
"next_node_id": "simplify_opus",
|
||||
"node_visits": {
|
||||
"implement": 1,
|
||||
"preflight_compile": 1,
|
||||
"start": 1,
|
||||
"preflight_lint": 1,
|
||||
|
|
|
|||
83
nodes/implement/prompt.md
Normal file
83
nodes/implement/prompt.md
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
Goal: # Fix: DaytonaSandbox concurrent test failures from `set_current_dir` poisoning
|
||||
|
||||
## Context
|
||||
|
||||
Two Daytona integration tests (`daytona_computer_use_browser_screenshot` and `daytona_playwright_mcp_sandbox_transport`) call `std::env::set_current_dir(tmp.path())` to make `detect_repo_info()` fail so the sandbox skips cloning. Since `set_current_dir` is **process-global**, any concurrent test calling `initialize()` sees the changed cwd, causing `detect_repo_info` to fail and the sandbox to get an empty directory with no git repo. This makes `git rev-parse HEAD` return exit code 128.
|
||||
|
||||
The fix follows the existing `ExeSandbox`/`SshSandbox` pattern: move clone params out of `initialize()` and into the constructor so callers control whether cloning happens.
|
||||
|
||||
## Changes
|
||||
|
||||
### 1. `lib/crates/fabro-daytona/src/lib.rs` — Core refactor
|
||||
|
||||
- Add a `GitCloneParams` struct with `url: String` and `branch: Option<String>` fields
|
||||
- Change `DaytonaSandbox` field from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`
|
||||
- Update `new()` signature: last param changes from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`
|
||||
- Update `reconnect()` (line 84): `clone_params: None`
|
||||
- Refactor `initialize()`:
|
||||
- Remove `let cwd = std::env::current_dir()` (line 392)
|
||||
- Replace `match detect_repo_info(&cwd)` (line 448) with `if let Some(ref params) = self.clone_params`
|
||||
- `Some` arm: use `params.url` / `params.branch` directly (already HTTPS, no `ssh_url_to_https` needed inside initialize)
|
||||
- `None` arm: create empty working directory (existing `Err` arm logic, lines 607-618)
|
||||
- Remove `self.clone_branch.clone().or(detected_branch)` merge — caller provides the final branch
|
||||
|
||||
### 2. `lib/crates/fabro-cli/src/commands/run.rs` — Production callers
|
||||
|
||||
- **Line 1017** (main `run` path): Construct `GitCloneParams` from `origin_url` and `detected_base_branch` (already extracted at line 557):
|
||||
```rust
|
||||
let clone_params = origin_url.as_ref().map(|url| fabro_daytona::GitCloneParams {
|
||||
url: fabro_github::ssh_url_to_https(url),
|
||||
branch: detected_base_branch.clone(),
|
||||
});
|
||||
```
|
||||
Pass `clone_params` as the last arg to `DaytonaSandbox::new()`
|
||||
|
||||
- **Line 2133** (doctor path): Currently passes `None` for `clone_branch`. Under the new API, `None` for `clone_params` means "skip clone" — same behavior, just update the type. No logic change needed.
|
||||
|
||||
### 3. `lib/crates/fabro-workflows/tests/daytona_integration.rs` — Test fixes
|
||||
|
||||
- **`create_env_with_github_app`** (line 30): Detect repo and build `GitCloneParams` before calling `new()`:
|
||||
```rust
|
||||
let cwd = std::env::current_dir().unwrap();
|
||||
let clone_params = fabro_daytona::detect_repo_info(&cwd)
|
||||
.ok()
|
||||
.map(|(url, branch)| fabro_daytona::GitCloneParams {
|
||||
url: fabro_github::ssh_url_to_https(&url),
|
||||
branch,
|
||||
});
|
||||
DaytonaSandbox::new(DaytonaConfig::default(), github_app, None, clone_params)
|
||||
```
|
||||
This preserves cloning for all tests that use `create_env()`/`create_env_with_github_app()`.
|
||||
|
||||
- **`daytona_snapshot_sandbox`** (line 252) and **`run_daytona_cli_test`** (line 927): Currently pass `None` as `clone_branch`. Under new API, `None` for `clone_params` = skip clone. These tests don't need repo contents (snapshot checks `rg --version`, CLI tests install tools independently). No logic change needed.
|
||||
|
||||
- **`daytona_computer_use_browser_screenshot`** (line 1855-1857): Remove `tempfile::tempdir()` and `set_current_dir()`. Already passes `None` as last arg → skip clone.
|
||||
|
||||
- **`daytona_playwright_mcp_sandbox_transport`** (line 2015-2017): Same — remove `tempfile::tempdir()` and `set_current_dir()`.
|
||||
|
||||
## Verification
|
||||
|
||||
1. `cargo build --workspace` — confirms all callers updated (compiler catches type mismatch)
|
||||
2. `cargo test -p fabro-workflows --test daytona_integration -- --ignored --test-threads=4` — the previously-failing git tests should pass with concurrent execution
|
||||
3. Specifically verify the 5 previously-failing tests pass: `daytona_full_lifecycle`, `daytona_git_checkpoint_remote_emits_events`, `daytona_git_checkpoint_with_shadow_branch`, `daytona_git_push_run_branch_to_origin`, `daytona_parallel_git_branching_e2e`
|
||||
|
||||
|
||||
## Completed stages
|
||||
- **toolchain**: success
|
||||
- Script: `command -v cargo >/dev/null || { curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && sudo ln -sf $HOME/.cargo/bin/* /usr/local/bin/; }; cargo --version 2>&1`
|
||||
- Stdout:
|
||||
```
|
||||
cargo 1.94.0 (85eff7c80 2026-01-15)
|
||||
```
|
||||
- Stderr: (empty)
|
||||
- **preflight_compile**: success
|
||||
- Script: `cargo check -q --workspace 2>&1`
|
||||
- Stdout: (empty)
|
||||
- Stderr: (empty)
|
||||
- **preflight_lint**: success
|
||||
- Script: `cargo clippy -q --workspace -- -D warnings 2>&1`
|
||||
- Stdout: (empty)
|
||||
- Stderr: (empty)
|
||||
|
||||
|
||||
Read the plan file referenced in the goal and implement every step. Make all the code changes described in the plan. Use red/green TDD.
|
||||
5
nodes/implement/provider_used.json
Normal file
5
nodes/implement/provider_used.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"mode": "agent",
|
||||
"provider": "anthropic",
|
||||
"model": "claude-opus-4-6"
|
||||
}
|
||||
24
nodes/implement/response.md
Normal file
24
nodes/implement/response.md
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
The diff looks exactly right. Let me summarize all the changes made:
|
||||
|
||||
## Summary of changes
|
||||
|
||||
### 1. `lib/crates/fabro-daytona/src/lib.rs` — Core refactor
|
||||
- **Added `GitCloneParams` struct** with `url: String` and `branch: Option<String>` fields, publicly exported
|
||||
- **Changed `DaytonaSandbox` field** from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`
|
||||
- **Updated `new()` signature**: last param changed from `clone_branch: Option<String>` to `clone_params: Option<GitCloneParams>`
|
||||
- **Updated `reconnect()`**: `clone_params: None` (was `clone_branch: None`)
|
||||
- **Refactored `initialize()`**:
|
||||
- Removed `let cwd = std::env::current_dir()` — no longer reads the process-global cwd
|
||||
- Replaced `match detect_repo_info(&cwd)` with `if let Some(ref clone_params) = self.clone_params`
|
||||
- `Some` arm: uses `clone_params.url` / `clone_params.branch` directly (URL is already HTTPS from caller)
|
||||
- `else` arm: creates empty working directory (the old `Err` arm logic)
|
||||
- **Removed unused import** `use fabro_github::ssh_url_to_https`
|
||||
|
||||
### 2. `lib/crates/fabro-cli/src/commands/run.rs` — Production callers
|
||||
- **Main `run` path**: Constructs `GitCloneParams` from `origin_url` (with `ssh_url_to_https`) and `detected_base_branch`, passes it to `DaytonaSandbox::new()`
|
||||
- **Doctor path**: Already passes `None` — type changed from `Option<String>` to `Option<GitCloneParams>` but `None` is valid for both
|
||||
|
||||
### 3. `lib/crates/fabro-workflows/tests/daytona_integration.rs` — Test fixes
|
||||
- **`create_env_with_github_app`**: Detects repo info with `detect_repo_info(&cwd)` and builds `GitCloneParams` before calling `new()`, preserving clone behavior for all tests that use this helper
|
||||
- **`daytona_computer_use_browser_screenshot`**: Removed `tempfile::tempdir()` and `set_current_dir()` — passes `None` as last arg which now cleanly means "skip clone"
|
||||
- **`daytona_playwright_mcp_sandbox_transport`**: Same — removed `tempfile::tempdir()` and `set_current_dir()`
|
||||
6
nodes/implement/status.json
Normal file
6
nodes/implement/status.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"status": "success",
|
||||
"notes": "Stage completed: implement",
|
||||
"failure_reason": null,
|
||||
"timestamp": "2026-03-19T15:27:52.216868+00:00"
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue