Rewrite gardener-run.sh as direct cron runner (matching supervisor/planner/ predictor pattern): lock guard, memory check, worktree, tmux session with Claude sonnet + formulas/run-gardener.toml, phase monitoring, cleanup. - Delete gardener-poll.sh and gardener-agent.sh (superseded) - Extract consume_escalation_reply() to lib/formula-session.sh (shared by gardener and supervisor, eliminates duplicate blocks) - Update AGENTS.md, gardener/AGENTS.md, lib/AGENTS.md, CI smoke test, and cross-references Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4.9 KiB
4.9 KiB
Shared Helpers (lib/)
All agents source lib/env.sh as their first action. Additional helpers are
sourced as needed.
| File | What it provides | Sourced by |
|---|---|---|
lib/env.sh |
Loads .env, sets FACTORY_ROOT, exports project config (CODEBERG_REPO, PROJECT_NAME, etc.), defines log(), codeberg_api(), codeberg_api_all() (accepts optional second TOKEN parameter, defaults to $CODEBERG_TOKEN), woodpecker_api(), wpdb(), matrix_send(), matrix_send_ctx(). Auto-loads project TOML if PROJECT_TOML is set. |
Every agent |
lib/ci-helpers.sh |
ci_passed() — returns 0 if CI state is "success" (or no CI configured). is_infra_step() — returns 0 if a single CI step failure matches infra heuristics (clone/git exit 128, any exit 137, log timeout patterns). classify_pipeline_failure() — returns "infra <reason>" if any failed Woodpecker step matches infra heuristics via is_infra_step(), else "code". |
dev-poll, review-poll, review-pr, supervisor-poll |
lib/ci-debug.sh |
CLI tool for Woodpecker CI: list, status, logs, failures subcommands. Not sourced — run directly. |
Humans / dev-agent (tool access) |
lib/load-project.sh |
Parses a projects/*.toml file into env vars (PROJECT_NAME, CODEBERG_REPO, WOODPECKER_REPO_ID, monitoring toggles, Matrix config, etc.). |
env.sh (when PROJECT_TOML is set), supervisor-poll (per-project iteration) |
lib/parse-deps.sh |
Extracts dependency issue numbers from an issue body (stdin → stdout, one number per line). Matches ## Dependencies / ## Depends on / ## Blocked by sections and inline depends on #N patterns. Not sourced — executed via bash lib/parse-deps.sh. |
dev-poll, supervisor-poll |
lib/matrix_listener.sh |
Long-poll Matrix sync daemon. Dispatches thread replies to the correct agent via well-known files (/tmp/{agent}-escalation-reply). Handles supervisor, gardener, dev, review, vault, and action reply routing. Run as systemd service. |
Standalone daemon |
lib/formula-session.sh |
acquire_cron_lock(), check_memory(), load_formula(), build_context_block(), consume_escalation_reply(), start_formula_session(), formula_phase_callback(), build_prompt_footer(), run_formula_and_monitor() — shared helpers for formula-driven cron agents (lock, memory guard, formula loading, prompt assembly, tmux session, monitor loop, crash recovery). |
planner-run.sh, predictor-run.sh, gardener-run.sh, supervisor-run.sh |
lib/secret-scan.sh |
scan_for_secrets() — detects potential secrets (API keys, bearer tokens, private keys, URLs with embedded credentials) in text; returns 1 if secrets found. redact_secrets() — replaces detected secret patterns with [REDACTED]. |
file-action-issue.sh, phase-handler.sh |
lib/file-action-issue.sh |
file_action_issue() — dedup check, secret scan, label lookup, and issue creation for formula-driven cron wrappers. Sets FILED_ISSUE_NUM on success. Returns 4 if secrets detected in body. |
(available for future use) |
lib/agent-session.sh |
Shared tmux + Claude session helpers: create_agent_session(), inject_formula(), agent_wait_for_claude_ready(), agent_inject_into_session(), agent_kill_session(), monitor_phase_loop(), read_phase(), write_compact_context(). create_agent_session(session, workdir, [phase_file]) optionally installs a PostToolUse hook (matcher Bash|Write) that detects phase file writes in real-time — when Claude writes to the phase file, the hook writes a marker so monitor_phase_loop reacts on the next poll instead of waiting for mtime changes. Also installs a StopFailure hook (matcher rate_limit|server_error|authentication_failed|billing_error) that writes PHASE:failed with an api_error reason to the phase file and touches the phase-changed marker, so the orchestrator discovers API errors within one poll cycle instead of waiting for idle timeout. Also installs a SessionStart hook (matcher compact) that re-injects phase protocol instructions after context compaction — callers write the context file via write_compact_context(phase_file, content), and the hook (on-compact-reinject.sh) outputs the file content to stdout so Claude retains critical instructions. When MATRIX_THREAD_ID is exported, also installs a Stop hook (on-stop-matrix.sh) that streams each Claude response to the Matrix thread. monitor_phase_loop sets _MONITOR_LOOP_EXIT to one of: done, idle_timeout, idle_prompt (Claude returned to > for 3 consecutive polls without writing any phase — callback invoked with PHASE:failed, session already dead), crashed, or a PHASE:* string. Callers must handle idle_prompt in both their callback and their post-loop exit handler — see docs/PHASE-PROTOCOL.md idle_prompt for the full contract. |
dev-agent.sh, action-agent.sh |