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:
108
install.sh
Executable file
108
install.sh
Executable 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 ""
|
||||
Reference in New Issue
Block a user