Arc API, Arc Web, GitHub App, and cryptographic key checks are only
relevant when the server feature is enabled. Without this gate, `arc
doctor` showed misleading connectivity errors for services that cannot
even be started.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Return worktree_path from the match expression instead of mutating
a pre-initialized variable.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When the sandbox does not support preview URLs (e.g., local sandbox),
fall back to http://localhost:{port} instead of erroring. This makes
the sandbox MCP transport work transparently on both local and remote
(Daytona) sandboxes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- docs/agents/mcp.mdx: Remove pre-release warning. Add sandbox transport
docs alongside stdio and HTTP. Restructure configuration section to
cover both cli.toml and run config TOML. Replace filesystem example
with Playwright browser automation example.
- docs/execution/run-configuration.mdx: Add [mcp_servers] section with
field reference for all three transport types. Add to full example.
- docs/reference/cli-configuration.mdx: Add sandbox transport subsection.
Cross-reference workflow-level MCP config.
- docs/integrations/daytona.mdx: Add MCP sandbox transport to feature table.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wire MCP server configs from workflow TOML into agent sessions so
MCP tools are available to agent stages during workflow runs.
Changes:
- run_config.rs: add mcp_servers HashMap to WorkflowRunConfig
- backend.rs: AgentApiBackend.with_mcp_servers() passes configs to SessionConfig
- run.rs: extract mcp_servers from RunConfig and pass to backend
- demo/mod.rs: add default mcp_servers field to struct literals
New workflow: arc/workflows/playwright-demo/
- Runs on Daytona with daytona-medium snapshot
- Configures Playwright MCP as a sandbox transport (port 3100)
- Agent browses Hacker News, takes screenshots at each step
- asset_globs captures screenshots/** into logs directory
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds McpTransport::Sandbox variant that starts an MCP server inside the
sandbox, waits for it to listen, gets a Daytona preview URL, and rewrites
to HTTP transport for the MCP client connection.
Key changes:
- Sandbox trait: add get_preview_url(port) for authenticated port access
- DaytonaSandbox: implement get_preview_url via Daytona SDK preview links
- McpTransport::Sandbox: new variant with command, port, env fields
- Session: resolve_sandbox_mcp_servers() starts servers and rewrites to HTTP
- Integration test: end-to-end Playwright MCP in Daytona - navigates to
example.com and verifies "Example Domain" in accessibility snapshot
Config example:
[mcp_servers.playwright]
type = "sandbox"
command = ["npx", "@playwright/mcp@latest", "--port", "3100", "--headless"]
port = 3100
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Expose the Daytona SDK's ComputerUseService through DaytonaSandbox so
callers can start the virtual desktop, take screenshots, and interact
with mouse/keyboard programmatically.
The new integration test validates the full flow: start the desktop
environment, launch Chromium on DISPLAY=:0, and capture a screenshot
of example.com via the Computer Use API.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove API server and web frontend instructions from quick start, replacing
them with a note about standalone vs. server mode. Add under-development
warning to API overview. Add server deployment stub page to Guides.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Warn users that exe.dev and devcontainer features are under active
development and may require special build flags.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Exe sandbox variant, its config field, and all arc_exe usage in
arc-workflows are now behind #[cfg(feature = "exedev")]. Default CLI
builds skip arc-exe and openssh entirely. arc-api enables exedev since
its demo module constructs full SandboxConfig structs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cargo build / cargo build --release now only compiles arc-cli and its
transitive deps, skipping arc-api, arc-slack, arc-db, arc-types, sqlx,
axum, etc. Use --workspace to build everything.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CLI-only builds no longer pull in arc-api and its heavy server
dependencies (axum, tower, hyper, sqlx, arc-db, arc-types) unless
the server feature is explicitly enabled.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Centralizes config types (ServerConfig, CliConfig, expand_tilde) into a
new arc-config crate. Makes arc-api an optional dependency of arc-cli
behind a default-on "server" feature flag, so CLI-only builds skip heavy
server deps (axum, tower, hyper, sqlx, arc-db, arc-types).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Drop session before awaiting event_writer_handle to close the
broadcast channel, preventing a deadlock where the spawned task
waits for senders to drop while session is still alive.
Move subscribe() before initialize() so the SessionStarted event
is captured in retro_session.jsonl.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use 4-backtick fences for plan section to prevent LLM-generated
triple backticks from breaking the markdown. Fix singular/plural
grammar for stage, node, and edge counts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reject negative durations in parse_duration (i64 -> u64) to prevent
future cutoff that would delete everything
- Remove orphans flag from has_explicit_filters since --orphans is
additive, not restrictive, and shouldn't disable the 24h staleness guard
- Use parsed label_filters instead of raw args.filter.label so malformed
labels that get silently dropped don't incorrectly disable staleness
- Replace derived Serialize with custom impl delegating to Display for
RunStatus, fixing JSON serialization (was producing null/tagged objects
instead of flat strings)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show colored "error:" prefix with cause chain for all CLI errors. When a
workflow name isn't found in a project with arc.toml, list available
workflows and suggest the closest match using Levenshtein distance.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users can now set `[arc] retro = false` in arc.toml instead of passing
`--no-retro` on every `arc run` invocation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rename directory and adopt workflow.{toml,dot} convention so
`arc run implement` resolves via project config.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
`arc run my-workflow` now resolves to `{arc_root}/workflows/my-workflow/workflow.toml`
when an arc.toml project config exists. Args with file extensions are passed through
unchanged, and missing workflows fall back to the literal arg.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Before worktree creation, compare local and remote ref SHAs to avoid
unnecessary pushes. When already in sync, log at INFO and print nothing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The same timeout(spawn_blocking(git_push)) pattern with a 4-arm match on
Ok(Ok(Ok(()))) appeared in 3 places. Extract a helper that flattens the
triple Result into a single BlockingPushError enum, and extract shared
push error-handling into run_git_push.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When `arc run` creates a worktree, unpushed local commits would appear
in the PR diff even though they didn't originate from the workflow run.
This pushes the user's current branch before worktree setup so the
remote base matches the local HEAD.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Return a PullRequestRecord struct from maybe_open_pull_request instead
of a bare URL, persist it as JSON in the run/logs directory, and strip
markdown heading prefixes (# / ##) from generated PR titles.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
arc --version now shows "arc 0.1.0 (abc1234 2026-03-09)" and
arc run displays a Version line in the run header.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows creating a pull request after the fact for any completed workflow
run, using the persisted manifest, conclusion, and diff from the run's
log directory.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use the first line of the goal as the PR title (not the full goal),
truncated to 120 chars. Truncate the PR body to 65,536 chars.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CLAUDE.md is often symlinked to AGENTS.md, causing identical content
to be loaded twice and wasting ~50% of the 32KB budget. Track seen
content in a HashSet and skip duplicates before the budget check.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
INFO summary (files + total_bytes) on every call, WARN for
empty files, truncation, and budget exhaustion, DEBUG per-file
detail. Removes redundant debug! calls at call sites.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>