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>
Previously, resolve_file_ref only inlined @file references for files
not tracked by git, causing validation failures for committed workflow
prompt files like @prompts/simplify.md.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previously, `arc validate` passed .toml files directly to the DOT parser,
causing a cryptic "grammar error: Tag" parse failure. Now it resolves the
graph path from the TOML config, matching `arc run` behavior.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Rust SandboxConfig struct has a `local` field that was missing from
the OpenAPI spec, causing server_config_keys_match_openapi_spec to fail.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Disable the osxkeychain credential helper during programmatic pushes
so only inline URL credentials are used. This prevents potential
interference from stale stored credentials causing "Repository not
found" errors on private repos.
Also upgrade the log line to INFO with a redacted URL for better
diagnostics when pushes fail.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add extra parent() traversal in build.rs, include_str!, and test
fixture paths that navigate from crate directories to the repo root.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Updated: package.json workspaces, tsconfig path alias, CI workflow
paths, Dockerfile COPY, AGENTS.md, and doc references.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Updated: Cargo.toml workspace members, CI workflow paths, Dockerfile
COPY, AGENTS.md, skill mapping, and doc references.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update build context, dockerfile path, and volume mounts in
docker-compose.yaml to account for the new location.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add build/test/lint commands for Rust and TypeScript, crate descriptions,
key design patterns, and progressive-disclosure references to the logging
and events strategy docs in docs-internal/.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Local worktree sandbox runs never pushed the arc/run/{run_id} branch to
GitHub, causing PR creation to fail with a 422 "head invalid" error.
Remote sandbox runs already push during checkpoint, so this only fires
for GitCheckpointMode::Host.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows "Base: main (260a391e5b4c)" after the Worktree line in the run
header, helping users identify the starting point. Uses worktree base
SHA when available, falls back to remote base SHA for remote-only runs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract `embed_token_in_url` and `resolve_authenticated_url` helpers
into arc-github to eliminate duplicated credential resolution + URL
authentication logic across ExeSandbox, DaytonaSandbox, and engine.rs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move GitHub App authentication (types, JWT signing, token creation,
credential resolution) into a new leaf crate `arc-github`. ExeSandbox
now owns `github_app` directly and resolves clone credentials on-demand,
eliminating the GitCredentialSandbox decorator and its wrapping code in
cli/run.rs. GitCloneParams simplified to a single clean `url` field.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- WorktreeSandbox: add missing delegations for is_remote(),
ssh_access_command(), and origin_url() to avoid silently returning
defaults instead of delegating to inner sandbox
- GitCredentialSandbox: replace manual shell quoting with shlex::try_quote
per project shell_quote() convention
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add is_remote(), ssh_access_command(), and origin_url() to the Sandbox
trait so run.rs can use trait methods instead of matching on
SandboxProvider post-construction. This removes daytona_sandbox_ref and
exe_sandbox_ref, eliminating 11 provider-checking sites that reached
through Arc<dyn Sandbox> to make provider-specific decisions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract `load_sandbox()` helper to deduplicate cp_command's Download/Upload arms
- Use `shlex::try_quote` in handler/command.rs shell_quote (was using less safe manual quoting)
- Call `self.resolve_path()` in ExeSandbox::upload_file_from_local instead of inlining
- Create parent dirs in download_recursive for nested files
- Use async `entry.file_type().await` instead of blocking `is_dir()` in upload_recursive
- Add missing parent directory creation in DaytonaSandbox::upload_file_from_local
- Rename `_worktree_path` to `worktree_path` (variable is used, underscore was misleading)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allow customizing when git worktrees are created via a new `worktree_mode`
enum (always/clean/dirty/never) in `[sandbox.local]`. Previously, worktree
creation was hardcoded to only occur on clean repos.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- E2e tests for local, Docker, and Daytona sandbox backends
- Make cp::reconnect pub for integration test access
- Stop deleting worktrees after run completion so arc cp can
access local/Docker sandbox files (prune step to come later)
- Rustfmt cleanups
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>