#!/usr/bin/env bash # upgrade.sh — Upgrade existing Automaton projects to support .state files and status.py # Usage: ./upgrade.sh [project-path] set -euo pipefail # Verify python3 is available if ! command -v python3 &>/dev/null; then echo "ERROR: python3 is required but not found in PATH." echo "Install Python 3 and rerun this script." exit 1 fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" STATUS_SCRIPT="$SCRIPT_DIR/status.py" if [ -n "${1:-}" ]; then PROJECT_DIR="$(cd "$1" && pwd)" else PROJECT_DIR="$(pwd)" fi TASKS_DIR="$PROJECT_DIR/.automaton/tasks" FRAMEWORK_DIR="$HOME/.automaton" echo "=== Automaton Upgrade ===" echo "Project: $PROJECT_DIR" echo "" # Bootstrap .state files for tasks using status.py --upgrade if [ -f "$STATUS_SCRIPT" ]; then echo "Step 1: Bootstrapping .state files for existing tasks..." if ! python3 "$STATUS_SCRIPT" --upgrade --project "$PROJECT_DIR"; then echo "ERROR: status.py --upgrade failed. See errors above." echo "Fix the reported issues and rerun this script." exit 1 fi echo "" else echo "WARNING: status.py not found at $STATUS_SCRIPT. Skipping .state bootstrap." echo "Ensure the framework is installed at ~/.automaton/ and rerun." fi # Add version marker to config.md if not present CONFIG_FILE="$FRAMEWORK_DIR/config.md" if [ -f "$CONFIG_FILE" ]; then if ! grep -q "Framework Version" "$CONFIG_FILE"; then echo "" >> "$CONFIG_FILE" echo "## Framework Version" >> "$CONFIG_FILE" echo "- **Version**: 2.0" >> "$CONFIG_FILE" echo "- **State enforcement**: enabled (.state file + status.py)" >> "$CONFIG_FILE" echo "" >> "$CONFIG_FILE" echo "Added version marker to $CONFIG_FILE" else echo "Version marker already present in $CONFIG_FILE" fi else echo "WARNING: $CONFIG_FILE not found. Creating with version marker." cat > "$CONFIG_FILE" << 'EOF' # Framework Configuration ## Framework Version - **Version**: 2.0 - **State enforcement**: enabled (.state file + status.py) EOF fi echo "" echo "=== Upgrade Complete ===" echo "Run 'python ~/.automaton/scripts/status.py --list --project $PROJECT_DIR' to verify task states." echo "Run 'python ~/.automaton/scripts/status.py --audit --project $PROJECT_DIR' to check for violations." echo "" # Install pre-commit hook if project uses git if git -C "$PROJECT_DIR" rev-parse --git-dir &>/dev/null; then HOOK_DIR="$(git -C "$PROJECT_DIR" rev-parse --git-dir)/hooks" mkdir -p "$HOOK_DIR" for HOOK in pre-commit pre-push; do HOOK_TARGET="$HOOK_DIR/$HOOK" HOOK_SOURCE="$FRAMEWORK_DIR/scripts/git-hooks/$HOOK" if [ -f "$HOOK_TARGET" ]; then if [ -L "$HOOK_TARGET" ]; then EXISTING_TARGET="$(readlink "$HOOK_TARGET")" if [ "$EXISTING_TARGET" = "$HOOK_SOURCE" ]; then echo "$HOOK hook already linked to automaton." else echo "WARNING: $HOOK hook already exists (symlink to: $EXISTING_TARGET)" echo " To use automaton's hook, run: ln -sf $HOOK_SOURCE $HOOK_TARGET" fi else echo "WARNING: $HOOK hook already exists at $HOOK_TARGET" echo " To replace it with automaton's hook, run: ln -sf $HOOK_SOURCE $HOOK_TARGET" fi else ln -sf "$HOOK_SOURCE" "$HOOK_TARGET" echo "Installed $HOOK hook at $HOOK_TARGET" fi done else echo "NOTE: Not a git repository. Install the hook manually if needed:" echo " ln -sf $FRAMEWORK_DIR/scripts/git-hooks/pre-commit .git/hooks/pre-commit" fi