#!/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 echo "WARNING: $HOOK hook already exists at $HOOK_TARGET" echo " To replace it with automaton's hook, run: bash $FRAMEWORK_DIR/scripts/install-hooks.sh" else cp "$HOOK_SOURCE" "$HOOK_TARGET" chmod +x "$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 " bash $FRAMEWORK_DIR/scripts/install-hooks.sh" fi