steev/install.sh
Svrnty a403c733fd feat(steev): initial Steev profile distribution
JP's personal assistant — daily briefing, inbox triage, comms drafting in JP's voice,
delegate business tasks to CEO. Mirrors CMO/CEO profile distribution structure.

- manifest.yaml (profile: steev, kind: profile-distribution)
- AGENT.md — Steev identity, mission, bilingual (fr/en)
- CLAUDE.md — 4-principle working principles + Steev-specific invariants
- install.sh — idempotent installer, symlinks → ~/.hermes/steev
- skills/steev-agent/SKILL.md — orchestrator: briefing/triage/comms/delegate
- schema.sql — briefings, inbox_items, agent_runtime
- README.md — structure, install, invariants
- docs/STEEV-MASTER.md — source of truth + v1/v2 roadmap

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 19:40:06 -04:00

60 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# install.sh — wire Steev profile distribution into Hermes.
# Idempotent. Does NOT set secrets and does NOT enable cron.
#
# ./install.sh [--copy] [--dry-run]
#
# Default = SYMLINK mode: the repo is canonical, ~/.hermes/steev → this repo.
# --copy = copy files into ~/.hermes/steev instead.
set -euo pipefail
REPO="$(cd "$(dirname "$0")" && pwd)"
HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}"
MODE=symlink; DRY=0
while [ $# -gt 0 ]; do case "$1" in
--copy) MODE=copy ;; --dry-run) DRY=1 ;;
*) echo "unknown arg: $1"; exit 2 ;;
esac; shift; done
CFG="$HERMES_HOME/profiles/steev/config.yaml"
run() { if [ "$DRY" = 1 ]; then echo "DRY: $*"; else eval "$*"; fi; }
echo "== preflight =="
for c in python3 sqlite3; do command -v "$c" >/dev/null || { echo "MISSING: $c"; exit 1; }; done
echo "== link/copy repo → \$HERMES_HOME/steev ($MODE) =="
if [ "$MODE" = symlink ]; then
if [ -e "$HERMES_HOME/steev" ] && [ ! -L "$HERMES_HOME/steev" ]; then
echo "EXISTS (not a symlink): $HERMES_HOME/steev — remove it and re-run"; exit 1
fi
run "ln -sfn '$REPO' '$HERMES_HOME/steev'"
else
run "mkdir -p '$HERMES_HOME/steev'"
run "cp -r '$REPO'/skills '$REPO'/schema.sql '$HERMES_HOME/steev/'"
fi
echo "== register skills in steev profile config =="
SKILL_DIR="$REPO/skills"
if [ "$DRY" = 0 ]; then
python3 - "$CFG" "$SKILL_DIR" <<'PY'
import sys, os, yaml
cfg, sk = sys.argv[1], sys.argv[2]
d = yaml.safe_load(open(cfg).read()) if os.path.exists(cfg) else {}
d = d or {}
d.setdefault('skills', {}).setdefault('external_dirs', [])
if sk not in d['skills']['external_dirs']:
d['skills']['external_dirs'].append(sk)
open(cfg, 'w').write(yaml.dump(d, sort_keys=False, allow_unicode=True))
print(" +", sk)
else:
print(" already registered:", sk)
PY
else
echo "DRY: register $SKILL_DIR in $CFG"
fi
echo "== steev.db =="
run "sqlite3 '$HERMES_HOME/steev/steev.db' < '$REPO/schema.sql'"
echo "== done. verify: hermes -p steev skills list | grep steev-agent =="