Install
openclaw skills install @netanel-abergel/heleni-maintenanceUnified workspace maintenance skill. Covers: (1) backing up the workspace to GitHub git repo, and (2) updating OpenClaw and skills. Use when: asked to backup, push to git, update openclaw, update skills, or run maintenance.
openclaw skills install @netanel-abergel/heleni-maintenanceAny model. Both sections are scripted operations.
Back up the entire workspace to GitHub on a regular schedule or on demand.
Priority order:
git -C /opt/ocana/openclaw/workspace remote get-url origin
echo $GITHUB_TOKEN
echo $GH_TOKEN
cat ~/.credentials/github-token.txt 2>/dev/null
cat ~/.credentials/github-pat.txt 2>/dev/null
If no token found → report BLOCKED to owner.
cd /opt/ocana/openclaw/workspace
# Stage all changes
git add -A
# Commit with timestamp
TIMESTAMP=$(date -u +"%Y-%m-%d %H:%M UTC")
git commit -m "Auto-backup: $TIMESTAMP" 2>/dev/null || echo "Nothing to commit"
# Push
git push origin main
If triggered manually (not by cron):
✅ Workspace backed up to GitHub — [timestamp]
[X] files changed
If triggered by cron → silent (no message to owner).
openclaw cron add \
--name "workspace-backup" \
--every 6h \
--session isolated \
--message "Run the maintenance skill, Section 1 (Workspace Backup). cd /opt/ocana/openclaw/workspace && git add -A && git commit -m 'Auto-backup: $(date -u +\"%Y-%m-%d %H:%M UTC\")' && git push origin main. Silent — do not message owner unless push fails." \
--timeout-seconds 60
| Issue | Fix |
|---|---|
git push auth error | Token expired — update in remote URL or credentials file |
nothing to commit | Normal — workspace unchanged since last backup |
rejected (non-fast-forward) | Run git pull --rebase origin main first, then push |
| No token found | Ask owner for a GitHub PAT with repo scope |
Keep OpenClaw and installed skills up to date.
# Update the OpenClaw platform
openclaw update
# Check the new version
openclaw --version
# Update all installed skills to latest
clawhub update
# Or update a specific skill
# clawhub update <skill-name>
After updates, report to owner:
🔄 Maintenance complete (Sunday update):
OpenClaw: v1.2.3 → v1.2.4
- [changelog item if available]
Skills updated:
- skill-master: v1.1 → v1.2
- whatsapp: v2.0 → v2.1
- [others]
No action needed. Everything is up to date.
If nothing changed:
✅ No updates available — everything is current.
# Check gateway is still running
openclaw gateway status
# Check agent is responding (send a test message or check logs)
openclaw logs --last 10
If gateway is down after update → run openclaw gateway restart.
openclaw cron add \
--name "weekly-update" \
--cron "0 3 * * 0" \
--session isolated \
--message "Run maintenance skill Section 2 (OpenClaw Updates): run 'openclaw update' and 'clawhub update', then report what changed to owner via WhatsApp." \
--to "OWNER_PHONE" \
--channel whatsapp \
--timeout-seconds 300
| Issue | Fix |
|---|---|
openclaw update fails | Check internet connectivity; retry in 30 min |
clawhub update not found | Install: npm install -g clawhub |
| Gateway down after update | Run openclaw gateway restart |
| Skills missing after update | Re-install: clawhub install <skill-name> |
Prevent sessions.json from bloating (observed growing to 67MB+ with 600+ stale cron run entries).
sessions.json exceeds 10MBls -lh /opt/ocana/openclaw/agents/main/sessions/sessions.json
If under 10MB → skip cleanup.
cd /opt/ocana/openclaw/agents/main/sessions
# Backup first
cp sessions.json sessions.json.bak.$(date +%Y%m%d-%H%M%S)
# Remove all :run: entries (completed cron run histories)
python3 -c "
import json
with open('sessions.json') as f:
d = json.load(f)
before = len(d)
cleaned = {k:v for k,v in d.items() if ':run:' not in k}
after = len(cleaned)
with open('sessions.json', 'w') as f:
json.dump(cleaned, f)
print(f'Removed {before-after} entries. {after} remaining.')
"
openclaw gateway restart
🧹 Session cleanup: [X]MB → [Y]MB, removed [N] stale cron run entries.