From 5e64f6c54b1f921908ddb2485d491dc7de968246 Mon Sep 17 00:00:00 2001 From: James Olds <12104969+oldsj@users.noreply.github.com> Date: Thu, 15 Jan 2026 13:18:21 -0500 Subject: [PATCH] Fix job_runner cwd and dev environment setup - Fix job_runner to pass cloned repo directory as cwd to Claude Agent SDK (was hardcoded to /workspace, now uses /workspace/) - Add before:dev event to create-secrets hook in devspace.yaml - Add db-username and db-password to create-secrets.sh for dev Co-Authored-By: Claude Opus 4.5 --- claude-agent/job_runner.py | 18 ++++++++++++++---- devspace.yaml | 11 +++++++++++ scripts/kind/create-secrets.sh | 2 ++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/claude-agent/job_runner.py b/claude-agent/job_runner.py index 780a530..91b7232 100644 --- a/claude-agent/job_runner.py +++ b/claude-agent/job_runner.py @@ -380,8 +380,14 @@ def build_fix_prompt() -> str: return "\n".join(parts) -async def execute_task() -> dict: - """Execute the task using Claude Agent SDK.""" +async def execute_task(working_dir: str | None = None) -> dict: + """Execute the task using Claude Agent SDK. + + Args: + working_dir: Directory where Claude should work. If provided (repo was cloned), + Claude works in the repo. Otherwise uses WORKSPACE. + + """ prompt = build_prompt() print(f"[job_runner] Mode: {MODE}") print(f"[job_runner] Model: {CLAUDE_MODEL}") @@ -392,10 +398,14 @@ async def execute_task() -> dict: perm_mode = "plan" if MODE == "plan" else "bypassPermissions" print(f"[job_runner] Permission mode: {perm_mode}") + # Use the cloned repo directory if available, otherwise use WORKSPACE + cwd = working_dir or WORKSPACE + print(f"[job_runner] Claude working directory: {cwd}") + options = ClaudeAgentOptions( model=CLAUDE_MODEL, permission_mode=perm_mode, - cwd=WORKSPACE, + cwd=cwd, ) collected_text: list[str] = [] @@ -706,7 +716,7 @@ async def main(): print(f"[job_runner] Working in repo: {repo_dir}") try: - result = await execute_task() + result = await execute_task(working_dir=repo_dir) await send_result( status="completed", result=result, diff --git a/devspace.yaml b/devspace.yaml index 4c792ae..1216656 100644 --- a/devspace.yaml +++ b/devspace.yaml @@ -175,6 +175,16 @@ dev: - '*.pyc' - .venv/ disableDownload: true + onUpload: + exec: + - name: rebuild-agent-image + command: |- + echo "[agent] Rebuilding image for Jobs..." + docker build -t mainloop-agent-controller:dev claude-agent/ && \ + kind load docker-image mainloop-agent-controller:dev --name mainloop-test && \ + echo "[agent] Done - new Jobs will use updated code" + local: true + onChange: ['*.py'] command: - /entrypoint.sh logs: {} @@ -194,6 +204,7 @@ hooks: - name: create-secrets events: - before:deploy + - before:dev command: ./scripts/kind/create-secrets.sh - name: load-images diff --git a/scripts/kind/create-secrets.sh b/scripts/kind/create-secrets.sh index 27aaea6..95784e4 100755 --- a/scripts/kind/create-secrets.sh +++ b/scripts/kind/create-secrets.sh @@ -38,6 +38,8 @@ kubectl --context="${KIND_CONTEXT}" create secret generic mainloop-secrets \ --namespace mainloop \ --from-literal=claude-secret-token="${CLAUDE_CODE_OAUTH_TOKEN-}" \ --from-literal=github-token="${GITHUB_TOKEN-}" \ + --from-literal=db-username=mainloop \ + --from-literal=db-password=mainloop \ --dry-run=client -o yaml | kubectl --context="${KIND_CONTEXT}" apply -f - # Create ghcr-secret (optional - for pulling from GHCR if needed)