Files
timmy-config/deploy.sh
Step35 287aed33f7
Some checks failed
Architecture Lint / Linter Tests (pull_request) Successful in 26s
Smoke Test / smoke (pull_request) Failing after 30s
Validate Config / YAML Lint (pull_request) Failing after 21s
Validate Config / JSON Validate (pull_request) Successful in 21s
Validate Config / Python Syntax & Import Check (pull_request) Failing after 54s
Validate Config / Python Test Suite (pull_request) Has been skipped
Validate Config / Shell Script Lint (pull_request) Failing after 58s
Validate Config / Cron Syntax Check (pull_request) Successful in 15s
Validate Config / Deploy Script Dry Run (pull_request) Successful in 13s
Validate Config / Playbook Schema Validation (pull_request) Successful in 23s
PR Checklist / pr-checklist (pull_request) Failing after 4m28s
Architecture Lint / Lint Repository (pull_request) Failing after 28s
SIDECAR-5: Complete drift guard installation
- Add AGENTS.md with HARD RULE prohibiting direct commits to hermes-agent
- Deploy AGENTS.md via timmy-config overlay
- Add memory entry (memories/SIDECAR_BOUNDARY.md) documenting the guard
- Add hermes-agent pre-commit hook (hermes-sovereign/githooks/hermes-agent-pre-commit)
- Update deploy.sh to install pre-commit hook into ~/.hermes/hermes-agent/.git/hooks/
- Existing: agent_guardrails.py already contains extraction pattern for hermes-agent commits

All acceptance criteria satisfied:
1. Pre-commit hook installed (will be on deploy)
2. AGENTS.md contains the rule
3. Memory updated with sidecar boundary rule
4. Agent guardrail (skill equivalent) already updated in previous commit
5. Test verifies guard pattern present

Closes #341
2026-04-30 20:00:59 -04:00

112 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# deploy.sh — Apply timmy-config as sidecar overlay onto ~/.hermes/
# This is the canonical way to deploy Timmy's configuration.
# Hermes-agent is the engine. timmy-config is the driver's seat.
#
# Usage: ./deploy.sh
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
HERMES_HOME="$HOME/.hermes"
TIMMY_HOME="$HOME/.timmy"
log() { echo "[deploy] $*"; }
# === Sanity checks ===
if [ ! -f "$SCRIPT_DIR/SOUL.md" ]; then
echo "ERROR: Run from timmy-config root" >&2
exit 1
fi
# === Create directories ===
mkdir -p "$HERMES_HOME/bin"
mkdir -p "$HERMES_HOME/skins"
mkdir -p "$HERMES_HOME/playbooks"
mkdir -p "$HERMES_HOME/memories"
mkdir -p "$TIMMY_HOME"
# === Deploy SOUL ===
cp "$SCRIPT_DIR/SOUL.md" "$TIMMY_HOME/SOUL.md"
log "SOUL.md -> $TIMMY_HOME/"
# === Validate config before deploy ===
if command -v python3 &>/dev/null; then
log "Validating config files..."
if ! python3 "$SCRIPT_DIR/scripts/config_validator.py"; then
echo "ERROR: Config validation failed. Fix errors before deploying." >&2
exit 1
fi
log "Config validation passed."
else
log "WARNING: python3 not found, skipping config validation"
fi
# === Deploy config ===
cp "$SCRIPT_DIR/config.yaml" "$HERMES_HOME/config.yaml"
log "config.yaml -> $HERMES_HOME/"
# === Deploy channel directory ===
if [ -f "$SCRIPT_DIR/channel_directory.json" ]; then
cp "$SCRIPT_DIR/channel_directory.json" "$HERMES_HOME/channel_directory.json"
log "channel_directory.json -> $HERMES_HOME/"
fi
# === Deploy memories ===
for f in "$SCRIPT_DIR"/memories/*; do
[ -f "$f" ] && cp "$f" "$HERMES_HOME/memories/"
done
log "memories/ -> $HERMES_HOME/memories/"
# === Deploy AGENTS.md (sidecar boundary rule) ===
if [ -f "$SCRIPT_DIR/AGENTS.md" ]; then
cp "$SCRIPT_DIR/AGENTS.md" "$HERMES_HOME/AGENTS.md"
log "AGENTS.md -> $HERMES_HOME/ (SIDECAR-5 rule)"
fi
# === Deploy skins ===
for f in "$SCRIPT_DIR"/skins/*; do
[ -f "$f" ] && cp "$f" "$HERMES_HOME/skins/"
done
log "skins/ -> $HERMES_HOME/skins/"
# === Deploy playbooks ===
for f in "$SCRIPT_DIR"/playbooks/*; do
[ -f "$f" ] && cp "$f" "$HERMES_HOME/playbooks/"
done
log "playbooks/ -> $HERMES_HOME/playbooks/"
# === Deploy cron ===
if [ -d "$SCRIPT_DIR/cron" ]; then
mkdir -p "$HERMES_HOME/cron"
for f in "$SCRIPT_DIR"/cron/*; do
[ -f "$f" ] && cp "$f" "$HERMES_HOME/cron/"
done
log "cron/ -> $HERMES_HOME/cron/"
fi
# === Deploy bin (operational scripts) ===
for f in "$SCRIPT_DIR"/bin/*; do
[ -f "$f" ] && cp "$f" "$HERMES_HOME/bin/"
done
chmod +x "$HERMES_HOME/bin/"*.sh "$HERMES_HOME/bin/"*.py 2>/dev/null || true
log "bin/ -> $HERMES_HOME/bin/"
# === Install SIDECAR-5 pre-commit guard on hermes-agent repo ===
if [ -d "$HERMES_HOME/hermes-agent/.git" ]; then
HOOK_SRC="$SCRIPT_DIR/hermes-sovereign/githooks/hermes-agent-pre-commit"
if [ -f "$HOOK_SRC" ]; then
cp "$HOOK_SRC" "$HERMES_HOME/hermes-agent/.git/hooks/pre-commit"
chmod +x "$HERMES_HOME/hermes-agent/.git/hooks/pre-commit"
log "Installed hermes-agent pre-commit drift guard (SIDECAR-5)"
fi
fi
if [ "${1:-}" != "" ]; then
echo "ERROR: deploy.sh no longer accepts legacy loop flags." >&2
echo "Deploy the sidecar only. Do not relaunch deprecated bash loops." >&2
exit 1
fi
log "Deploy complete. timmy-config applied to $HERMES_HOME/"