feat: agent loop harness with Claude Code plugin support

Generator-evaluator architecture with iterative context-reset for
long-running coding tasks. Ships as a Claude Code plugin — install
with /plugin and use /agent-loop:init, /agent-loop:plan, /agent-loop:run.
This commit is contained in:
2026-03-27 08:03:18 -04:00
commit 17e5eb707f
29 changed files with 2546 additions and 0 deletions

108
install.sh Executable file
View File

@@ -0,0 +1,108 @@
#!/bin/bash
# Install Agent Loop globally for Claude Code.
#
# What this does:
# 1. Copies the harness to ~/.claude/loop/ (prompts, templates, lib, loop.sh)
# 2. Installs skills as Claude Code commands at ~/.claude/commands/
#
# After install, use /loop-init in any project to get started.
#
# Usage:
# ./install.sh # Install
# ./install.sh --uninstall # Remove
set -euo pipefail
CLAUDE_DIR="$HOME/.claude"
HARNESS_DIR="$CLAUDE_DIR/loop"
COMMANDS_DIR="$CLAUDE_DIR/commands"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SKILLS=(loop-init loop-plan loop-run loop-triage)
# --- Colors (if terminal supports them) ---
if [ -t 1 ]; then
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
BOLD='\033[1m'
RESET='\033[0m'
else
GREEN='' YELLOW='' RED='' BOLD='' RESET=''
fi
info() { echo -e "${GREEN}[loop]${RESET} $*"; }
warn() { echo -e "${YELLOW}[loop]${RESET} $*"; }
error() { echo -e "${RED}[loop]${RESET} $*"; }
# --- Uninstall ---
if [[ "${1:-}" == "--uninstall" ]]; then
info "Uninstalling Agent Loop..."
if [ -d "$HARNESS_DIR" ]; then
rm -rf "$HARNESS_DIR"
info "Removed $HARNESS_DIR"
fi
for skill in "${SKILLS[@]}"; do
cmd="$COMMANDS_DIR/$skill.md"
if [ -f "$cmd" ]; then
rm -f "$cmd"
info "Removed $cmd"
fi
done
info "Done. Per-project .loop/ directories are untouched."
exit 0
fi
# --- Install ---
info "Installing Agent Loop..."
# Ensure ~/.claude/ exists
mkdir -p "$CLAUDE_DIR"
# Copy harness (prompts, templates, lib, loop.sh, config example)
if [ -d "$HARNESS_DIR" ]; then
warn "Updating existing install at $HARNESS_DIR"
rm -rf "$HARNESS_DIR"
fi
mkdir -p "$HARNESS_DIR"
cp -r "$SCRIPT_DIR/prompts" "$HARNESS_DIR/"
cp -r "$SCRIPT_DIR/templates" "$HARNESS_DIR/"
cp -r "$SCRIPT_DIR/lib" "$HARNESS_DIR/"
cp -r "$SCRIPT_DIR/skills" "$HARNESS_DIR/"
cp "$SCRIPT_DIR/loop.sh" "$HARNESS_DIR/"
cp "$SCRIPT_DIR/config.json.example" "$HARNESS_DIR/"
cp "$SCRIPT_DIR/init.sh.example" "$HARNESS_DIR/"
chmod +x "$HARNESS_DIR/loop.sh"
info "Harness installed to $HARNESS_DIR"
# Install Claude Code commands
mkdir -p "$COMMANDS_DIR"
for skill in "${SKILLS[@]}"; do
src="$HARNESS_DIR/skills/$skill/SKILL.md"
dest="$COMMANDS_DIR/$skill.md"
if [ -f "$src" ]; then
cp "$src" "$dest"
info "Installed /$skill command"
else
warn "Skill not found: $src (skipping)"
fi
done
echo ""
info "${BOLD}Installation complete.${RESET}"
echo ""
echo " Next steps (inside Claude Code, in any project):"
echo ""
echo " /loop-init # Set up the loop for your project"
echo " /loop-plan # Generate PRD and sprint contracts"
echo " /loop-run # Run the loop interactively"
echo ""
echo " Or run headless: .loop/loop.sh"
echo ""