Headless mode was half-built and untested. Agent-loop is a plugin that runs interactively via tmux — there's no CI use case yet. Removes --headless flag, timeout compatibility shim, output capture logic, and LOOP_AGENT_TMPFILE handling. Cuts 82 lines from loop.sh.
107 lines
2.7 KiB
Bash
Executable File
107 lines
2.7 KiB
Bash
Executable File
#!/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 /agent-loop:run 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=(setup stories run 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 " /agent-loop:run # Single command — setup, plan, and run"
|
|
echo ""
|
|
echo " Or run directly: .loop/loop.sh"
|
|
echo ""
|