Skip to content

feat(harness): agent_loop foundation — non-interactive CLI driver (#30 PR1)#31

Open
k-buchi4696 wants to merge 1 commit into
mainfrom
feature/30-agent-loop-foundation
Open

feat(harness): agent_loop foundation — non-interactive CLI driver (#30 PR1)#31
k-buchi4696 wants to merge 1 commit into
mainfrom
feature/30-agent-loop-foundation

Conversation

@k-buchi4696

Copy link
Copy Markdown
Collaborator

Summary

issue #30 を 4 PR で実装する内、PR1 (foundation) に相当。

autoforge が agent CLI (Claude Code / Codex CLI) を非対話 subprocess で叩いて結果を構造化して受け取るための最小モジュールを新設する。ライブラリ層のみで、CLI フラグ統合や goals 実行フローは含まない(PR2 以降)。

変更内容

新規 `autoforge/harness/agent_loop.py` (~140 行)

  • `Backend` (str enum): `"claude"` / `"codex"`
  • `AgentResult` (frozen dataclass): `backend`, `success`, `exit_code`, `stdout`, `stderr`, `duration_seconds`
  • `_argv_claude(prompt)` → `["claude", "-p", prompt]`
  • `_argv_codex(prompt)` → `["codex", "exec", prompt]`
  • `build_argv(backend, prompt)` — public dispatcher
  • `run_agent(backend, prompt, *, cwd=None, timeout=600)` — `subprocess.run` の wrapper。`TimeoutExpired` / `FileNotFoundError` を `AgentResult` に正規化し呼び出し側で try/except 不要

新規 `tests/harness/test_agent_loop.py` (~115 行)

  • argv snapshot 4 件: `_argv_claude` / `_argv_codex` / `build_argv` の 2 dispatch
  • `run_agent` mock subprocess 5 件:
    • 成功 (exit 0 → success=True, stdout 伝搬)
    • 非ゼロ終了 (success=False, stderr 伝搬)
    • タイムアウト (exit_code=-1, stderr に "Timeout after Ns")
    • CLI 不在 (exit_code=-2, stderr に "not found on PATH")
    • `cwd` 引数の subprocess.run への透過

Test Plan

  • `pytest tests/harness/test_agent_loop.py -v` — 9 passed
  • `pytest tests/` — 557 passed (既存 548 + 新規 9, 回帰なし)
  • レビュアー: 実機で `claude -p "echo hi"` / `codex exec "echo hi"` の non-interactive 形態が手元で動くこと(PR2 でも検証する想定)

スコープ外(後続 PR)

  • PR2: `autoforge loop --mode goals --backend {auto,claude,codex}` の CLI フラグと PATH 自動検出
  • PR3: `autoforge.yml` の `goals` を順次 agent に渡す dispatch ロジック
  • PR4: README / `docs/integration-guide.md` / 新規 `docs/non-interactive-mode.md` 等のドキュメント整備

Refs

🤖 Generated with Claude Code

…PR1)

issue #30 の foundation レイヤを実装。autoforge が agent CLI (Claude Code / Codex CLI) を
非対話 subprocess で叩いて結果を構造化して受け取るための最小モジュールを新設する。
本 PR ではライブラリ層のみで CLI 統合は行わない(PR2 以降)。

新規 autoforge/harness/agent_loop.py:
- `Backend` (str enum): "claude" / "codex"
- `AgentResult` (frozen dataclass): backend, success, exit_code, stdout, stderr,
  duration_seconds
- `_argv_claude(prompt)` → ["claude", "-p", prompt]
- `_argv_codex(prompt)` → ["codex", "exec", prompt]
- `build_argv(backend, prompt)` — public dispatcher
- `run_agent(backend, prompt, *, cwd=None, timeout=600)` — subprocess.run の
  wrapper。TimeoutExpired / FileNotFoundError を AgentResult に正規化(呼び出し
  側で try/except 不要)

新規 tests/harness/test_agent_loop.py:
- argv snapshot 4 件 (`_argv_claude` / `_argv_codex` / `build_argv` の 2 dispatch)
- `run_agent` mock subprocess 5 件:
  - 成功 (exit 0 → success=True, stdout 伝搬)
  - 非ゼロ終了 (success=False)
  - タイムアウト (exit_code=-1, stderr に "Timeout after Ns")
  - CLI 不在 (exit_code=-2, stderr に "not found on PATH")
  - cwd 引数の subprocess.run への透過

スコープ外(後続 PR):
- PATH 自動検出 → PR2
- \`autoforge loop --mode goals --backend ...\` → PR2
- goals dispatch from autoforge.yml → PR3
- ドキュメント → PR4

557 tests pass (既存 548 + 新規 9).

Refs #30

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant