diff --git a/.woodpecker/detect-duplicates.py b/.woodpecker/detect-duplicates.py index 33ec6ac..3ee008f 100644 --- a/.woodpecker/detect-duplicates.py +++ b/.woodpecker/detect-duplicates.py @@ -267,42 +267,6 @@ def main() -> int: "2653705045fdf65072cccfd16eb04900": "Standard prompt template (GRAPH_SECTION, SCRATCH_CONTEXT, FORMULA_CONTENT)", "93726a3c799b72ed2898a55552031921": "Standard prompt template continuation (SCRATCH_CONTEXT, FORMULA_CONTENT, SCRATCH_INSTRUCTION)", "c11eaaacab69c9a2d3c38c75215eca84": "Standard prompt template end (FORMULA_CONTENT, SCRATCH_INSTRUCTION)", - # install_project_crons function in entrypoint.sh and entrypoint-llama.sh (intentional duplicate) - "007e1390498374c68ab5d66aa6d277b2": "install_project_crons function in entrypoints (window 007e1390)", - "04143957d4c63e8a16ac28bddaff589b": "install_project_crons function in entrypoints (window 04143957)", - "076a19221cde674b2fce20a17292fa78": "install_project_crons function in entrypoints (window 076a1922)", - "0d498287626e105f16b24948aed53584": "install_project_crons function in entrypoints (window 0d498287)", - "137b746928011acd758c7a9c690810b2": "install_project_crons function in entrypoints (window 137b7469)", - "287d33d98d21e3e07e0869e56ad94527": "install_project_crons function in entrypoints (window 287d33d9)", - "325a3d54a15e59d333ec2a20c062cc8c": "install_project_crons function in entrypoints (window 325a3d54)", - "34e1943d5738f540d67c5c6bd3e60b20": "install_project_crons function in entrypoints (window 34e1943d)", - "3dabd19698f9705b05376c38042ccce8": "install_project_crons function in entrypoints (window 3dabd196)", - "446b420f7f9821a2553bc4995d1fac25": "install_project_crons function in entrypoints (window 446b420f)", - "4826cf4896b792368c7b4d77573d0f8b": "install_project_crons function in entrypoints (window 4826cf48)", - "4e564d3bbda0ef33962af6042736dc1e": "install_project_crons function in entrypoints (window 4e564d3b)", - "5a3d92b22e5d5bca8cce17d581ac6803": "install_project_crons function in entrypoints (window 5a3d92b2)", - "63c20c5a31cf5e08f3a901ddf6db98af": "install_project_crons function in entrypoints (window 63c20c5a)", - "77547751325562fac397bbfd3a21c88e": "install_project_crons function in entrypoints (window 77547751)", - "80bdff63e54b4a260043d264b83d8eb0": "install_project_crons function in entrypoints (window 80bdff63)", - "84e55706393f731b293890dd6d830316": "install_project_crons function in entrypoints (window 84e55706)", - "85f8a9d029ee9efecca73fd30449ccf4": "install_project_crons function in entrypoints (window 85f8a9d0)", - "86e28dae676c905c5aa0035128e20e46": "install_project_crons function in entrypoints (window 86e28dae)", - "a222b73bcd6a57adb2315726e81ab6cf": "install_project_crons function in entrypoints (window a222b73b)", - "abd6c7efe66f533c48c883c2a6998886": "install_project_crons function in entrypoints (window abd6c7ef)", - "bcfeb67ce4939181330afea4949a95cf": "install_project_crons function in entrypoints (window bcfeb67c)", - "c1248c98f978c48e4a1e5009a1440917": "install_project_crons function in entrypoints (window c1248c98)", - "c40571185b3306345ecf9ac33ab352a6": "install_project_crons function in entrypoints (window c4057118)", - "c566639b237036a7a385982274d3d271": "install_project_crons function in entrypoints (window c566639b)", - "d9cd2f3d874c32366d577ea0d334cd1a": "install_project_crons function in entrypoints (window d9cd2f3d)", - "df4d3e905b12f2c68b206e45dddf9214": "install_project_crons function in entrypoints (window df4d3e90)", - "e8e65ccf867fc6cbe49695ecdce2518e": "install_project_crons function in entrypoints (window e8e65ccf)", - "eb8b298f06cda4359cc171206e0014bf": "install_project_crons function in entrypoints (window eb8b298f)", - "ecdf0daa2f2845359a6a4aa12d327246": "install_project_crons function in entrypoints (window ecdf0daa)", - "eeac93b2fba4de4589d36ca20845ec9f": "install_project_crons function in entrypoints (window eeac93b2)", - "f08a7139db9c96cd3526549c499c0332": "install_project_crons function in entrypoints (window f08a7139)", - "f0917809bdf28ff93fff0749e7e7fea0": "install_project_crons function in entrypoints (window f0917809)", - "f0e4101f9b90c2fa921e088057a96db7": "install_project_crons function in entrypoints (window f0e4101f)", - # Structural end-of-while-loop+case pattern: `return 1 ;; esac done }` # Appears in stack_lock_acquire (lib/stack-lock.sh) and lib/pr-lifecycle.sh "29d4f34b703f44699237713cc8d8065b": "Structural end-of-while-loop+case (return 1, esac, done, closing brace)", # Forgejo org-creation API call pattern shared between forge-setup.sh and ops-setup.sh diff --git a/docker/agents/entrypoint-llama.sh b/docker/agents/entrypoint-llama.sh deleted file mode 100755 index c600775..0000000 --- a/docker/agents/entrypoint-llama.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -LOG_DIR="/home/agent/data/logs/dev" -mkdir -p "$LOG_DIR" /home/agent/data -chown -R agent:agent /home/agent/data 2>/dev/null || true - -log() { - printf "[%s] llama-loop: %s\n" "$(date -u '+%Y-%m-%d %H:%M:%S UTC')" "$*" | tee -a "$LOG_DIR/llama-loop.log" -} - -# Apply token override for named agent identity -if [ -n "${FORGE_TOKEN_OVERRIDE:-}" ]; then - export FORGE_TOKEN="$FORGE_TOKEN_OVERRIDE" -fi - -log "Starting llama dev-agent loop" -log "Backend: ${ANTHROPIC_BASE_URL:-not set}" -log "Claude CLI: $(claude --version 2>&1 || echo not found)" -log "Agent identity: $(curl -sf -H "Authorization: token ${FORGE_TOKEN}" "${FORGE_URL:-http://forgejo:3000}/api/v1/user" 2>/dev/null | jq -r '.login // "unknown"')" - -# Clone repo if not present -if [ ! -d "${PROJECT_REPO_ROOT}/.git" ]; then - log "Cloning repo..." - mkdir -p "$(dirname "$PROJECT_REPO_ROOT")" - chown -R agent:agent /home/agent/repos 2>/dev/null || true - # Use password auth for git HTTP — Forgejo 11.x rejects API tokens for push (#361) - su -s /bin/bash agent -c "git clone http://dev-bot:${FORGE_PASS:-${FORGE_TOKEN}}@forgejo:3000/${FORGE_REPO:-disinto-admin/disinto}.git ${PROJECT_REPO_ROOT}" - log "Repo cloned" -fi - -# Reset base repo to origin/main to avoid divergence warnings -su -s /bin/bash agent -c " - cd \"${PROJECT_REPO_ROOT}\" - git fetch origin main - git checkout main 2>/dev/null || true - git reset --hard origin/main -" || true -log "Base repo reset to origin/main" - -log "Entering poll loop (interval: ${POLL_INTERVAL:-300}s)" - -while true; do - # Clear stale session IDs before each poll. - # Local llama does not support --resume (no server-side session storage). - # Stale .sid files cause agent_run to exit instantly on every retry. - rm -f /tmp/dev-session-*.sid 2>/dev/null || true - - su -s /bin/bash agent -c " - export FORGE_TOKEN='${FORGE_TOKEN}' - export FORGE_TOKEN_OVERRIDE='${FORGE_TOKEN_OVERRIDE:-}' - export ANTHROPIC_API_KEY='${ANTHROPIC_API_KEY:-}' - export ANTHROPIC_BASE_URL='${ANTHROPIC_BASE_URL:-}' - export CLAUDE_CONFIG_DIR='${CLAUDE_CONFIG_DIR:-}' - cd /home/agent/disinto && \ - bash dev/dev-poll.sh ${PROJECT_TOML:-projects/disinto.toml} - " >> "$LOG_DIR/llama-loop.log" 2>&1 || true - sleep "${POLL_INTERVAL:-300}" -done diff --git a/lib/hire-agent.sh b/lib/hire-agent.sh index 3ccc1c4..1ddd72a 100644 --- a/lib/hire-agent.sh +++ b/lib/hire-agent.sh @@ -421,7 +421,8 @@ services: WOODPECKER_DATA_DIR: /woodpecker-data ANTHROPIC_BASE_URL: ${local_model} ANTHROPIC_API_KEY: sk-no-key-required - FORGE_TOKEN_OVERRIDE: \$FORGE_TOKEN + FORGE_TOKEN: \$FORGE_TOKEN + AGENT_ROLES: dev CLAUDE_CONFIG_DIR: /home/agent/.claude POLL_INTERVAL: ${interval} env_file: @@ -429,7 +430,6 @@ services: depends_on: - forgejo - woodpecker - entrypoint: ["/home/agent/entrypoint-llama.sh"] volumes: agent-data-llama: