Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
19946bd
issue/fast-docker-config: add swe-fast service to docker-compose and …
Feb 18, 2026
f2070fb
issue/fast-schemas: implement swe_af/fast/schemas.py with all Pydanti…
Feb 18, 2026
d2753d9
Merge issue/e65cddc0-01-fast-schemas: Deliver Pydantic schemas and he…
Feb 18, 2026
c5026d5
Merge issue/e65cddc0-02-fast-docker-config: Add swe-fast Docker servi…
Feb 18, 2026
3377cd9
issue/fast-prompts: implement FAST_PLANNER_SYSTEM_PROMPT and fast_pla…
Feb 18, 2026
b032efb
issue/fast-init-router: implement fast_router with 5 execution-agent …
Feb 18, 2026
8ec43e2
Merge issue/e65cddc0-03-fast-init-router: Deliver fast_router AgentRo…
Feb 18, 2026
3cfd2e3
Merge issue/e65cddc0-04-fast-prompts: Deliver FAST_PLANNER_SYSTEM_PRO…
Feb 18, 2026
5b4dbb0
issue/fast-verifier: implement fast_verify single-pass verification r…
Feb 18, 2026
e05e272
issue/fast-planner: implement fast_plan_tasks() reasoner on fast_router
Feb 18, 2026
ab4114c
issue/fast-executor: implement fast_execute_tasks with per-task async…
Feb 18, 2026
c73839a
Merge issue/e65cddc0-06-fast-executor: Deliver sequential single-code…
Feb 18, 2026
fcbebee
Merge issue/e65cddc0-07-fast-verifier: Deliver one-pass verification …
Feb 18, 2026
34d7ba7
Merge issue/e65cddc0-05-fast-planner: Deliver single-pass flat task d…
Feb 18, 2026
382e024
issue/fast-app: implement swe_af/fast/app.py and __main__.py
Feb 18, 2026
2178605
Merge issue/e65cddc0-09-fast-app: Deliver top-level Agent object, bui…
Feb 18, 2026
cb2144b
chore: clean up repo after merge
Feb 18, 2026
eb5bf13
issue/fast-integration-final: add integration tests for all 20 PRD ac…
Feb 18, 2026
d75076c
Merge issue/e65cddc0-10-fast-integration-final: Add integration tests…
Feb 18, 2026
7ee1dcb
chore: clean up repo after merge
Feb 18, 2026
96b91be
chore: finalize repo for handoff
Feb 18, 2026
9202adc
fix: resolve 3 runtime bugs blocking swe-fast pipeline execution
AbirAbbas Feb 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,12 @@ Thumbs.db

# Claude Code
.claude/

# Python packaging / dist
dist/
build/
*.egg-info/
*.egg

# Pipeline output files
.claude_output_*.json
24 changes: 24 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,30 @@ services:
deploy:
replicas: 1 # Scale with: docker compose up --scale swe-agent=3

swe-fast:
build:
context: .
dockerfile: Dockerfile
command: ["python", "-m", "swe_af.fast"]
environment:
- AGENTFIELD_SERVER=http://control-plane:8080
- NODE_ID=swe-fast
- PORT=8004
- AGENT_CALLBACK_URL=http://swe-fast:8004
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- CLAUDE_CODE_OAUTH_TOKEN=${CLAUDE_CODE_OAUTH_TOKEN}
- GH_TOKEN=${GH_TOKEN}
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-}
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
- GOOGLE_API_KEY=${GOOGLE_API_KEY:-}
- OPENCODE_MODEL=${OPENCODE_MODEL:-}
ports:
- "8004:8004"
volumes:
- workspaces:/workspaces
depends_on:
- control-plane

volumes:
agentfield-data:
workspaces:
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ dev = ["pytest", "ruff"]

[project.scripts]
swe-af = "swe_af.app:main"
swe-fast = "swe_af.fast.app:main"

[tool.setuptools.packages.find]
include = ["swe_af*"]
150 changes: 150 additions & 0 deletions swe_af/fast/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
"""swe_af.fast — speed-optimised single-pass build node.

Exports
-------
fast_router : AgentRouter
Router tagged ``'swe-fast'`` with the five execution-phase thin wrappers
registered: run_git_init, run_coder, run_verifier, run_repo_finalize,
run_github_pr.

Intentionally does NOT import ``swe_af.reasoners.pipeline`` (nor trigger it
via ``swe_af.reasoners.__init__``) so that planning agents (run_architect,
run_tech_lead, run_sprint_planner, run_product_manager, run_issue_writer) are
never loaded into this process. The execution_agents module is imported lazily
inside each wrapper to honour this contract.
"""

from __future__ import annotations

from agentfield import AgentRouter

fast_router = AgentRouter(tags=["swe-fast"])


# ---------------------------------------------------------------------------
# Thin wrappers — each uses a lazy import to avoid loading
# swe_af.reasoners.__init__ (which would pull in pipeline.py).
# ---------------------------------------------------------------------------


@fast_router.reasoner()
async def run_git_init(
repo_path: str,
goal: str,
artifacts_dir: str = "",
model: str = "sonnet",
permission_mode: str = "",
ai_provider: str = "claude",
previous_error: str | None = None,
build_id: str = "",
) -> dict:
"""Thin wrapper around execution_agents.run_git_init."""
import swe_af.reasoners.execution_agents as _ea # noqa: PLC0415
return await _ea.run_git_init(
repo_path=repo_path, goal=goal, artifacts_dir=artifacts_dir,
model=model, permission_mode=permission_mode, ai_provider=ai_provider,
previous_error=previous_error, build_id=build_id,
)


@fast_router.reasoner()
async def run_coder(
issue: dict,
worktree_path: str,
feedback: str = "",
iteration: int = 1,
iteration_id: str = "",
project_context: dict | None = None,
memory_context: dict | None = None,
model: str = "sonnet",
permission_mode: str = "",
ai_provider: str = "claude",
) -> dict:
"""Thin wrapper around execution_agents.run_coder."""
import swe_af.reasoners.execution_agents as _ea # noqa: PLC0415
return await _ea.run_coder(
issue=issue, worktree_path=worktree_path, feedback=feedback,
iteration=iteration, iteration_id=iteration_id,
project_context=project_context, memory_context=memory_context,
model=model, permission_mode=permission_mode, ai_provider=ai_provider,
)


@fast_router.reasoner()
async def run_verifier(
prd: dict,
repo_path: str,
artifacts_dir: str,
completed_issues: list[dict] | None = None,
failed_issues: list[dict] | None = None,
skipped_issues: list[str] | None = None,
model: str = "sonnet",
permission_mode: str = "",
ai_provider: str = "claude",
) -> dict:
"""Thin wrapper around execution_agents.run_verifier."""
import swe_af.reasoners.execution_agents as _ea # noqa: PLC0415
return await _ea.run_verifier(
prd=prd, repo_path=repo_path, artifacts_dir=artifacts_dir,
completed_issues=completed_issues or [], failed_issues=failed_issues or [],
skipped_issues=skipped_issues or [],
model=model, permission_mode=permission_mode, ai_provider=ai_provider,
)


@fast_router.reasoner()
async def run_repo_finalize(
repo_path: str,
artifacts_dir: str = "",
model: str = "sonnet",
permission_mode: str = "",
ai_provider: str = "claude",
) -> dict:
"""Thin wrapper around execution_agents.run_repo_finalize."""
import swe_af.reasoners.execution_agents as _ea # noqa: PLC0415
return await _ea.run_repo_finalize(
repo_path=repo_path, artifacts_dir=artifacts_dir,
model=model, permission_mode=permission_mode, ai_provider=ai_provider,
)


@fast_router.reasoner()
async def run_github_pr(
repo_path: str,
integration_branch: str,
base_branch: str,
goal: str,
build_summary: str = "",
completed_issues: list[dict] | None = None,
accumulated_debt: list[dict] | None = None,
artifacts_dir: str = "",
model: str = "sonnet",
permission_mode: str = "",
ai_provider: str = "claude",
) -> dict:
"""Thin wrapper around execution_agents.run_github_pr."""
import swe_af.reasoners.execution_agents as _ea # noqa: PLC0415
return await _ea.run_github_pr(
repo_path=repo_path, integration_branch=integration_branch,
base_branch=base_branch, goal=goal, build_summary=build_summary,
completed_issues=completed_issues, accumulated_debt=accumulated_debt,
artifacts_dir=artifacts_dir, model=model,
permission_mode=permission_mode, ai_provider=ai_provider,
)


from . import executor # noqa: E402, F401 — registers fast_execute_tasks
from . import planner # noqa: E402, F401 — registers fast_plan_tasks
from . import verifier # noqa: E402, F401 — registers fast_verify

__all__ = [
"fast_router",
"run_git_init",
"run_coder",
"run_verifier",
"run_repo_finalize",
"run_github_pr",
"executor",
"planner",
"verifier",
]
4 changes: 4 additions & 0 deletions swe_af/fast/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
"""Allow: python -m swe_af.fast"""
from swe_af.fast.app import main

main()
Loading
Loading