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
- 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
112 lines
3.2 KiB
Bash
Executable File
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/"
|