- install.sh: no longer exits early when ~/.automaton exists. Skips the clone but runs all setup (VRAM detection, guards, self-improvement loop, virtualenv). Both curl|bash and git-clone + ./install.sh now work correctly. - onboard-project.sh: new script that bootstraps automaton in a project — creates .automaton/ skeleton, detects models, writes config.md, inits git, installs hooks, adds .gitignore entries. - README.md: fix install flow docs (curl|bash + clone-then-run), add onboard-project.sh as Option A for project setup
184 lines
5.4 KiB
Bash
Executable File
184 lines
5.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# onboard-project.sh — Bootstrap automaton in a new or existing project.
|
|
#
|
|
# Usage:
|
|
# bash ~/.automaton/scripts/onboard-project.sh /path/to/project
|
|
#
|
|
# Creates .automaton/ skeleton, detects models, creates config, inits git,
|
|
# installs hooks, and verifies everything works.
|
|
|
|
set -euo pipefail
|
|
|
|
FRAMEWORK_DIR="$HOME/.automaton"
|
|
PROJECT_DIR="${1:-}"
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
info() { echo -e "${BLUE}INFO:${NC} $1"; }
|
|
ok() { echo -e "${GREEN}OK:${NC} $1"; }
|
|
warn() { echo -e "${YELLOW}WARN:${NC} $1"; }
|
|
error() { echo -e "${RED}ERROR:${NC} $1"; }
|
|
|
|
# --- Argument checks ---
|
|
if [ -z "$PROJECT_DIR" ]; then
|
|
error "Usage: bash ~/.automaton/scripts/onboard-project.sh /path/to/project"
|
|
exit 1
|
|
fi
|
|
|
|
PROJECT_DIR="$(cd "$PROJECT_DIR" 2>/dev/null && pwd)" || true
|
|
if [ -z "$PROJECT_DIR" ] || [ ! -d "$PROJECT_DIR" ]; then
|
|
echo ""
|
|
error "'$1' does not exist."
|
|
echo " Create it first: mkdir -p '$1'"
|
|
echo " Then re-run this script."
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d "$FRAMEWORK_DIR/scripts" ]; then
|
|
error "Framework not found at $FRAMEWORK_DIR."
|
|
echo " Install the framework first:"
|
|
echo " curl -fsSL https://raw.githubusercontent.com/<user>/automaton/main/scripts/install.sh | bash -s -- <git-url>"
|
|
echo " Or: git clone <git-url> ~/.automaton && bash ~/.automaton/scripts/install.sh"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "========================================"
|
|
echo " Automaton Project Onboarding"
|
|
echo " Project: $PROJECT_DIR"
|
|
echo "========================================"
|
|
echo ""
|
|
|
|
# --- Step 1: Create .automaton/ skeleton ---
|
|
AUTO_DIR="$PROJECT_DIR/.automaton"
|
|
if [ -d "$AUTO_DIR" ]; then
|
|
warn "$AUTO_DIR already exists — skipping skeleton creation"
|
|
else
|
|
info "Creating .automaton/ skeleton..."
|
|
mkdir -p "$AUTO_DIR/tasks" "$AUTO_DIR/loops" "$AUTO_DIR/design"
|
|
ok "Created $AUTO_DIR/"
|
|
fi
|
|
|
|
# --- Step 2: Models ---
|
|
MODELS_FILE="$AUTO_DIR/models.json"
|
|
if [ -f "$MODELS_FILE" ]; then
|
|
warn "$MODELS_FILE already exists — skipping model detection"
|
|
else
|
|
info "Probing local models..."
|
|
if python3 "$FRAMEWORK_DIR/scripts/detect_models.py" --write --project "$PROJECT_DIR" 2>/dev/null; then
|
|
ok "Detected models written to $MODELS_FILE"
|
|
else
|
|
info "Auto-detection failed. Creating minimal models.json..."
|
|
cat > "$MODELS_FILE" <<- 'EOF'
|
|
{
|
|
"models": [
|
|
{"name": "default-model", "provider": "local", "context": 32768}
|
|
],
|
|
"default": "default-model"
|
|
}
|
|
EOF
|
|
warn "Edit $MODELS_FILE to set your actual model(s)."
|
|
fi
|
|
fi
|
|
|
|
# --- Step 3: Config ---
|
|
CONFIG_FILE="$AUTO_DIR/config.md"
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
warn "$CONFIG_FILE already exists — skipping"
|
|
else
|
|
info "Creating config.md..."
|
|
PROJECT_NAME="$(basename "$PROJECT_DIR")"
|
|
if [ -f "$FRAMEWORK_DIR/scripts/vram_detect.py" ]; then
|
|
vram_output=$(cd "$FRAMEWORK_DIR" && python3 "$FRAMEWORK_DIR/scripts/vram_detect.py" 2>/dev/null || true)
|
|
json_part=$(echo "$vram_output" | sed -n '/=== JSON Output ===/,$p' | tail -n +2)
|
|
recommended=$(echo "$json_part" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("recommended_k","16"))' 2>/dev/null || echo "16")
|
|
else
|
|
recommended="16"
|
|
fi
|
|
cat > "$CONFIG_FILE" <<- EOF
|
|
# $PROJECT_NAME — Automaton Configuration
|
|
|
|
## VRAM Configuration
|
|
- **Auto-detect**: Yes
|
|
- **Target context**: ${recommended}k tokens
|
|
- **Headroom**: 25%
|
|
- **Max peak context per sub-task**: $((recommended * 3 / 4))k tokens
|
|
|
|
## Model Configuration
|
|
# Uses models.json for model divergence enforcement.
|
|
# Default model is read from models.json's "default" key.
|
|
EOF
|
|
ok "Created $CONFIG_FILE"
|
|
fi
|
|
|
|
# --- Step 4: Project name ---
|
|
NAME_FILE="$AUTO_DIR/project-name.md"
|
|
if [ -f "$NAME_FILE" ]; then
|
|
warn "$NAME_FILE already exists — skipping"
|
|
else
|
|
PROJECT_NAME="$(basename "$PROJECT_DIR")"
|
|
echo "$PROJECT_NAME" > "$NAME_FILE"
|
|
ok "Created $NAME_FILE ($PROJECT_NAME)"
|
|
fi
|
|
|
|
# --- Step 5: Git ---
|
|
GIT_DIR="$PROJECT_DIR/.git"
|
|
if [ -d "$GIT_DIR" ]; then
|
|
ok "Git repository already initialized"
|
|
else
|
|
info "Initializing git repository..."
|
|
cd "$PROJECT_DIR" && git init
|
|
ok "Git initialized"
|
|
fi
|
|
|
|
# --- Step 6: Git hooks ---
|
|
if [ -d "$GIT_DIR" ]; then
|
|
info "Installing git hooks..."
|
|
bash "$FRAMEWORK_DIR/scripts/install-hooks.sh" "$PROJECT_DIR"
|
|
fi
|
|
|
|
# --- Step 7: .gitignore ---
|
|
GITIGNORE="$PROJECT_DIR/.gitignore"
|
|
if [ -f "$GITIGNORE" ]; then
|
|
if ! grep -q ".automaton/tasks/" "$GITIGNORE" 2>/dev/null; then
|
|
echo "" >> "$GITIGNORE"
|
|
echo "# Automaton" >> "$GITIGNORE"
|
|
echo ".automaton/tasks/" >> "$GITIGNORE"
|
|
echo ".automaton/loops/*/worktree/" >> "$GITIGNORE"
|
|
warn "Added automaton entries to .gitignore"
|
|
fi
|
|
else
|
|
cat > "$GITIGNORE" <<- 'EOF'
|
|
# Automaton
|
|
.automaton/tasks/
|
|
.automaton/loops/*/worktree/
|
|
.automaton/loops/*/outputs/
|
|
EOF
|
|
ok "Created .gitignore with automaton entries"
|
|
fi
|
|
|
|
# --- Step 8: Verify ---
|
|
info "Verifying setup..."
|
|
cd "$FRAMEWORK_DIR"
|
|
python3 "$FRAMEWORK_DIR/scripts/status.py" --project "$PROJECT_DIR" --audit 2>&1 | head -5 || true
|
|
|
|
echo ""
|
|
echo "========================================"
|
|
echo -e "${GREEN} Onboarding complete!${NC}"
|
|
echo "========================================"
|
|
echo ""
|
|
echo " Project: $PROJECT_DIR"
|
|
echo " Config: $CONFIG_FILE"
|
|
echo " Models: $MODELS_FILE"
|
|
echo ""
|
|
echo " Next steps:"
|
|
echo " 1. cd $PROJECT_DIR"
|
|
echo " 2. Create a task:"
|
|
echo " python3 ~/.automaton/scripts/status.py --create-task my-first-task --project ."
|
|
echo " 3. Start working with your agent."
|
|
echo "" |