ClawedBack oc-update
Pull the latest ClawedBack updates from GitHub and apply them to the running installation, preserving local config, data, auth tokens, and user-installed skills. Use when the user says 'update', 'upgrade', 'pull latest', 'check for updates', or 'oc-update'.
git clone https://github.com/reedmayhew18/ClawedBack
T=$(mktemp -d) && git clone --depth=1 https://github.com/reedmayhew18/ClawedBack "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/oc-update" ~/.claude/skills/reedmayhew18-clawedback-oc-update && rm -rf "$T"
.claude/skills/oc-update/SKILL.mdoc-update
Apply upstream ClawedBack updates from GitHub to the running installation, without overwriting local customizations.
What Is Safe to Update vs. What to Preserve
Always update (upstream-owned):
— application codeserver/*.py
— web UI files.claude/skills/oc-poll/scripts/static/
— core ClawedBack skills (but see conflicts below).claude/skills/oc-*/
— agent definitions.claude/agents/
— project instructions (merge carefully)CLAUDE.md
,README.md
— docspost_install.md
Always preserve (user-owned):
— all runtime data, queue, files, sessionsdata/
— auth tokendata/.auth_token
— local config (mode, host_url, port, ssl, etc.)data/clawedback.json
— Python virtual environment.venv/
— only update if upstream changed it, and notify user.claude/skills/oc-poll/scripts/requirements.txt
User-installed skills (preserve unless explicitly updating):
- Any skill in
that does NOT exist in the upstream repo — never delete these.claude/skills/ - Skills that exist in both upstream and local — show a diff and let the user decide
Step 1: Check for updates
cd $PROJECT_ROOT git fetch origin main 2>&1
Then check what's changed:
git log HEAD..origin/main --oneline 2>/dev/null
If there are no new commits: tell the user and stop.
If there are new commits: show the list and ask if they want to proceed.
Step 2: Identify conflicts
Before applying anything, check for local modifications to upstream-managed files:
git status --short 2>/dev/null git diff --name-only HEAD origin/main 2>/dev/null
Categorize each changed file:
- Safe to update — upstream-owned, not locally modified
- Locally modified — exists in both local changes and upstream changes → needs review
- Local-only — not in upstream (user additions) → preserve always
Step 3: Stash local modifications to protected files
Before merging, identify and stash anything in
data/ and other preserved paths to avoid conflicts:
# data/ is gitignored so it won't be touched by git # But check for any locally modified tracked files that need care git diff --name-only 2>/dev/null
For each locally modified tracked file that is also changed upstream:
- Show the user a diff
- Ask: "Keep your version / Take upstream / Merge manually?"
Step 4: Apply the update
If no conflicts (or conflicts resolved):
cd $PROJECT_ROOT git pull origin main 2>&1
If git pull fails due to conflicts:
git stash 2>/dev/null git pull origin main 2>&1 git stash pop 2>/dev/null
Show the merge result.
Step 5: Post-update checks
After pulling:
Check if requirements changed:
git diff HEAD~1 HEAD -- .claude/skills/oc-poll/scripts/requirements.txt 2>/dev/null
If requirements changed, install the new deps:
- Mode A/B:
source $PROJECT_ROOT/.venv/bin/activate && pip install -r $PROJECT_ROOT/.claude/skills/oc-poll/scripts/requirements.txt - Mode C:
pip install --break-system-packages -r $PROJECT_ROOT/.claude/skills/oc-poll/scripts/requirements.txt
Read the mode from
data/clawedback.json:
python3 -c "import json; c=json.load(open('$PROJECT_ROOT/data/clawedback.json')); print(c.get('mode','c'))"
Check if server needs restart:
git diff HEAD~1 HEAD --name-only 2>/dev/null | grep "oc-poll/scripts/"
If any
server/ files changed, restart the server:
pkill -f "python3 main.py" 2>/dev/null || true sleep 2
Then restart using the saved config:
python3 -c " import json c = json.load(open('$PROJECT_ROOT/data/clawedback.json')) print(c.get('server_cmd','cd $PROJECT_ROOT/.claude/skills/oc-poll/scripts && python3 main.py')) "
Run the server command with nohup in the background.
Verify:
sleep 3 curl -sk http://localhost:${OC_PORT:-8080}/ -o /dev/null -w "%{http_code}"
Step 6: Preserve local skill additions
After the pull, check if git removed any user-installed skills (shouldn't happen, but verify):
ls $PROJECT_ROOT/.claude/skills/
If any user-added skills are missing, restore them from git stash or warn the user.
Step 7: Report
Update complete! Commits applied: N - abc1234 Add feature X - def5678 Fix bug Y Files updated: .claude/skills/oc-poll/scripts/main.py server/config.py .claude/skills/oc-poll/SKILL.md Preserved (unchanged): data/clawedback.json data/.auth_token Server: restarted (new server files detected) Requirements: unchanged Your local additions (untouched): .claude/skills/my-custom-skill/
If the server was restarted, remind: "You'll need to re-enter your auth token if your browser session expired."
Error Recovery
If
git pull fails and leaves the repo in a broken state:
git merge --abort 2>/dev/null || true git reset --hard HEAD
Then tell the user what happened and suggest:
git fetch origin main git reset --hard origin/main
Warning:
git reset --hard will discard local changes to tracked files. data/ is safe (gitignored). Always warn before running this.
Notes
- This skill only updates the ClawedBack codebase — it does NOT update Claude Code itself.
- If the user has made edits directly to core skill files (like
), those edits will conflict. The skill will show the diff and let them choose.oc-hub/SKILL.md - The skill preserves
so all config (port, host_url, mode, SSL) survives the update.data/clawedback.json