From e8ee99f04607cd550f7ddd8863d7fec6772d8f84 Mon Sep 17 00:00:00 2001 From: jimmy Date: Sun, 13 Sep 2026 12:07:50 -0700 Subject: [PATCH] vault scripts: publish canonical Obsidian vault into the repo mirror --- scripts/vault-change-log.sh | 27 +++++++++------ scripts/vault-sync.sh | 67 +++++++++++++++++++++++++------------ 2 files changed, 62 insertions(+), 32 deletions(-) diff --git a/scripts/vault-change-log.sh b/scripts/vault-change-log.sh index 78b1d30..4dfed8c 100644 --- a/scripts/vault-change-log.sh +++ b/scripts/vault-change-log.sh @@ -1,14 +1,17 @@ #!/usr/bin/env bash -# Zero-token vault change log -# Dumps raw git log to a file for agents to read. +# Zero-token vault change log. +# Reads the vault's publish history (the mirror subtree in the AgentOS repo) and +# writes it into the vault itself so agents can read it. -VAULT_DIR="/c/Users/fight/AgentOS/memory-systems/agent-os" +VAULT_DIR="/c/Users/fight/Documents/Obsidian Vault" +REPO_DIR="/c/Users/fight/AgentOS" +MIRROR_PATH="memory-systems/agent-os" LOG_FILE="$VAULT_DIR/03_shared/vault-updates-log.md" -cd "$VAULT_DIR" || exit 1 +cd "$REPO_DIR" || exit 1 -# Refresh from remote first (best-effort: --rebase refuses on a dirty tree). -git pull --rebase > /dev/null 2>&1 +# Refresh from remote first (best-effort; --autostash so a dirty repo can't block it). +git pull --rebase --autostash > /dev/null 2>&1 { echo "# Vault Updates Log" @@ -19,21 +22,25 @@ git pull --rebase > /dev/null 2>&1 echo "" echo "## Last 24 Hours" echo "" - git log --since="24 hours ago" --oneline --no-merges 2>/dev/null || echo "No recent commits." + git log --since="24 hours ago" --oneline --no-merges -- "$MIRROR_PATH" 2>/dev/null \ + || echo "No recent commits." echo "" echo "---" echo "" echo "## Last 7 Days" echo "" - git log --since="7 days ago" --oneline --no-merges 2>/dev/null | head -20 + git log --since="7 days ago" --oneline --no-merges -- "$MIRROR_PATH" 2>/dev/null | head -20 echo "" echo "---" echo "" echo "## Files Changed (Last 24h)" echo "" # `HEAD@{24.hours.ago}` fails on a young reflog; derive the list from the log instead. - git log --since="24 hours ago" --name-only --pretty=format: -- . 2>/dev/null \ - | sed '/^[[:space:]]*$/d' | sort -u + # The mirror path prefix is stripped so the list reads as vault-relative paths. + git log --since="24 hours ago" --name-only --pretty=format: -- "$MIRROR_PATH" 2>/dev/null \ + | sed '/^[[:space:]]*$/d' \ + | sed "s|^$MIRROR_PATH/||" \ + | sort -u } > "$LOG_FILE" echo "Vault change log updated: $LOG_FILE" diff --git a/scripts/vault-sync.sh b/scripts/vault-sync.sh index 9bd9015..7e08ab2 100644 --- a/scripts/vault-sync.sh +++ b/scripts/vault-sync.sh @@ -1,43 +1,66 @@ #!/usr/bin/env bash -# Zero-token vault sync protocol -# Commit local changes, rebase onto the remote, push to the Gitea mirror. +# Zero-token vault publish. # -# SCOPE: only the agent-os vault tree is staged. The git repo root is the PARENT -# directory (AgentOS), so a bare `git add -A` sweeps unrelated agent work into -# "vault-sync" commits. Both the status check and the add are pathspec-scoped. +# SOURCE OF TRUTH : /c/Users/fight/Documents/Obsidian Vault +# MIRROR (git) : C:/Users/fight/AgentOS/memory-systems/agent-os +# REMOTE : Tony_tech/personal-agent-os # -# ORDER: commit BEFORE `git pull --rebase`. Rebase refuses to run on a dirty tree, -# so pulling first is a silent no-op exactly when a pull is needed, and the -# subsequent push gets rejected. +# The mirror is a generated byte copy of the vault, so the Obsidian vault is +# backed up to Gitea without a second *writable* copy that could drift. +# Never edit the mirror by hand — step 2 rebuilds it from the vault. # -# IDENTITY: passed per-commit with `git -c`, never repo-local config — the repo is -# shared by every agent profile, so a repo-local user.name attributes every agent's -# commits to one agent. Override with VAULT_AGENT=. -# NOTE: set VAULT_AGENT (or edit the default) in your own profile's copy. +# SCOPE: only the mirror subtree is staged. The AgentOS repo root holds unrelated +# agent work (agent-comms/, knowledge-base/, scripts/, ...) that must not be +# swept into vault commits — a bare `git add -A` would do exactly that. +# ORDER: commit BEFORE `git pull --rebase`; rebase refuses to run on a dirty tree, +# so pulling first is a silent no-op exactly when a pull is needed and the +# following push gets rejected. +# IDENTITY: passed per-commit with `git -c`, never repo-local config — the AgentOS +# repo is shared by every agent profile, so a repo-local user.name would +# attribute every agent's commits to one agent. Override with VAULT_AGENT=. -VAULT_DIR="/c/Users/fight/AgentOS/memory-systems/agent-os" +VAULT_DIR="/c/Users/fight/Documents/Obsidian Vault" +MIRROR_DIR="/c/Users/fight/AgentOS/memory-systems/agent-os" +REPO_DIR="/c/Users/fight/AgentOS" AGENT_NAME="${VAULT_AGENT:-jimmy}" GIT_ID=(-c "user.name=$AGENT_NAME" -c "user.email=$AGENT_NAME@hermes.local") -cd "$VAULT_DIR" || exit 1 +[ -d "$VAULT_DIR" ] || { echo "Vault not found: $VAULT_DIR"; exit 1; } echo "=== Vault Sync $(date '+%Y-%m-%d %H:%M') (agent: $AGENT_NAME) ===" -# 1. Stage + commit local changes (vault tree only). +# 1. Keep the vault's own local history moving (its original Gitea remote is gone, +# so this is local-only history; the mirror is what gets pushed). +cd "$VAULT_DIR" || exit 1 if [ -n "$(git status --porcelain .)" ]; then - echo "Local changes detected. Committing..." git add -A . || exit 1 - git "${GIT_ID[@]}" commit -m "vault-sync: $(date '+%Y-%m-%d %H:%M') ($AGENT_NAME)" 2>&1 | tail -3 -else - echo "No local changes." + git "${GIT_ID[@]}" commit -q -m "vault: $(date '+%Y-%m-%d %H:%M') ($AGENT_NAME)" \ + && echo "Vault history: committed local changes." fi -# 2. Rebase onto the remote. --autostash so unrelated dirty files elsewhere in the -# repo (AgentOS holds more than this vault) cannot block the pull. +# 2. Publish the vault into the git mirror. +echo "Mirroring vault -> AgentOS repo..." +find "$MIRROR_DIR" -mindepth 1 -maxdepth 1 -exec rm -rf {} + +tar -C "$VAULT_DIR" \ + --exclude=.git --exclude=.obsidian --exclude=.zvec-grep --exclude=.trash \ + -cf - . | tar -C "$MIRROR_DIR" -xf - + +# 3. Commit the mirror subtree. +cd "$REPO_DIR" || exit 1 +if [ -n "$(git status --porcelain -- memory-systems/agent-os)" ]; then + echo "Mirror changed. Committing..." + git add -A -- memory-systems/agent-os || exit 1 + git "${GIT_ID[@]}" commit -m "vault-sync: $(date '+%Y-%m-%d %H:%M') ($AGENT_NAME)" 2>&1 | tail -3 +else + echo "Mirror unchanged." +fi + +# 4. Rebase onto the remote. --autostash so unrelated dirty files elsewhere in the +# repo cannot block the pull. echo "Pulling latest..." git pull --rebase --autostash 2>&1 | tail -3 -# 3. Push to remote. +# 5. Push to remote. echo "Pushing to Gitea..." git push 2>&1 | tail -3