Use green checkmarks, dim file paths, bold header, and cyan+bold
command to match qlty CLI conventions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
System deps (openssl, node, dot) are only needed in server mode.
Remove them from standalone arc doctor output.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Start with a single-choice prompt for the first LLM (Anthropic, OpenAI,
or Gemini), then optionally offer a multi-select for additional providers.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The redirect_uri path must be /auth/callback (not /callback) to match
what OpenAI's auth server expects for this client ID. Also use localhost
instead of 127.0.0.1 to match the Codex CLI convention.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Standalone library implementing OpenAI's OAuth PKCE flow (browser + device)
for authenticating with ChatGPT subscriptions instead of API keys.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Swap LLM providers and GitHub App steps so LLM setup comes first
- List specific providers with connectivity issues in arc doctor warnings
- Style the GitHub App callback page with a centered card and checkmark
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a temporary local HTTP server in `arc install` that handles the
GitHub App manifest registration flow, enabling standalone users to
register a GitHub App without running the arc-web server.
Also gates server-only install steps (pre-flight checks, server.toml,
secrets/certs, start servers) behind #[cfg(feature = "server")] and
removes the `gh` CLI from system dependency checks. Reloads .env before
running arc doctor so it picks up freshly written credentials.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Live service probes now run by default instead of requiring --live.
Added --dry-run flag to skip probes when needed. Install command now
runs doctor with live probes to validate setup.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extend conclusion.json with per-stage operational data (cost, duration,
retries) so the Arc Details section of PR descriptions no longer depends
on retro.json. The retro section remains optional and only appears when
the retro agent runs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Project-level arc.toml can now set [pull_request] with enabled/draft
fields, slotting between cli.toml defaults and workflow.toml overrides.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add app_id(), slug(), and git_author() methods to CliConfig to
replace repeated .git.as_ref().and_then(...) chains across 5 call
sites in main.rs and doctor.rs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move GitHub App credentials (app_id, slug) and run defaults (llm,
sandbox, pull_request) into cli.toml so standalone commands (run, pr
create, llm) no longer require server.toml. The server.toml loading is
now limited to `arc serve` and server-mode doctor checks.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The one-time environment setup command (LLMs, certs, GitHub) is now
`arc install`, freeing up naming space for a future `arc init` command
for per-project initialization.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Surfaces existing final.patch and per-node diff.patch files via CLI.
Supports live diffs from in-progress runs by reconnecting to the sandbox.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When no explicit provider is set on a request, resolve_provider now
consults the model catalog (e.g. gpt-5.4 → openai) before falling back
to the client's default provider. This fixes PR description generation
sending cross-provider model IDs to the wrong provider.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Standalone subcommand that creates SSH credentials for a run's Daytona
sandbox and connects directly (or prints the command with --print).
Also parameterizes create_ssh_access TTL instead of hardcoding 60 min.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
In verbose mode, completed tool call bars accumulated in indicatif's
MultiProgress without limit. After ~80+ bars exceeded the terminal
height, indicatif's cursor repositioning broke and all rendering stopped.
Now in verbose mode, completed tool calls are printed as permanent output
via multi.println() and their bars are removed from MultiProgress. Only
running tool calls remain as live bars with spinner + elapsed time. This
keeps MultiProgress small regardless of how many tool calls execute.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Provides CLI access to preview URLs for ports exposed by Daytona sandboxes.
Supports standard (URL + token + curl), signed (self-contained URL), and
--open (browser launch) modes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Per-run data now lives in ~/.arc/runs/ while daily CLI log files
stay in ~/.arc/logs/. Renames: logs_root → run_dir (RunConfig field,
Handler trait param, all handlers), logs_dir → run_dir (CLI arg,
local variables), default_logs_base → default_runs_base (path fn).
Adds DB migration 002 to rename workflow_runs.logs_dir → run_dir.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a switchable tracing layer that writes to ~/.arc/logs/{run-dir}/cli.log,
so all diagnostic info for a run is co-located with its other artifacts instead
of buried in the shared daily log file.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Display collected assets in an "=== Assets ===" section after the run
result, so users can see which files were captured without digging
through the logs directory.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The GitHub App check was gated behind #[cfg(feature = "server")] so it
never ran in CLI-only builds. It also only checked whether env vars were
set, not whether the key could actually sign JWTs.
- Move GithubAppStatus and check_github_app out of the server feature gate
- Try sign_app_jwt to validate the private key, catching corrupt keys
- Show app_id and slug in doctor output
- Keep server-only fields (client_id, client_secret, webhook_secret)
behind #[cfg(feature = "server")]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
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>
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>
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>
`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>