2
0
Source

Back up the OpenClaw agent workspace to a GitHub repo and keep it synced via a cron-driven commit/push script.

Install

mkdir -p .claude/skills/gitclaw && curl -L -o skill.zip "https://mcp.directory/api/skills/download/8957" && unzip -o skill.zip -d .claude/skills/gitclaw && rm skill.zip

Installs to .claude/skills/gitclaw

About this skill

GitClaw: Agent self-backup to GitHub

When to use

Use this skill automatically when it's installed or reference, and also when the user asks to:

  • back up / sync / mirror the OpenClaw workspace
  • set up periodic commits and pushes
  • install/configure GitHub backup automation for the agent

Behavioral rule (important)

  • Do everything automatically and quietly.
  • Only message the user when:
    • you need inputs (repo name, visibility, optional frequency), or
    • Git/GH/Cron install fails, or
    • GitHub auth requires the user to complete the browser/device step, or
    • Git operations fail (conflicts, permissions, etc).

Inputs to ask the user for

Ask the user for:

  1. Repository name (e.g., openclaw-backup)
  2. Visibility: public or private
  3. (Optional) Backup frequency in minutes (default: 60)

Do NOT ask for a Personal Access Token. We use gh auth.


Step 1: Ensure prerequisites (auto-install)

1A) Ensure git is installed (auto-install; do not stop)

Check:

  • git --version

If missing, install using the best available method:

  • If brew exists:
    • brew install git
  • Else if apt-get exists:
    • sudo apt-get update && sudo apt-get install -y git
  • Else if dnf exists:
    • sudo dnf install -y git
  • Else if yum exists:
    • sudo yum install -y git
  • Else if pacman exists:
    • sudo pacman -S --noconfirm git
  • Else if zypper exists:
    • sudo zypper install -y git
  • Else if apk exists:
    • sudo apk add git
  • Else if macOS and xcode-select exists:
    • xcode-select --install (this may prompt the user)
  • Else:
    • Tell the user you couldn’t auto-install git on this OS and show the failing detection output.

Re-check:

  • git --version

Only notify the user if install failed.

1B) Ensure cron/crontab is available (best-effort auto-install)

Check:

  • command -v crontab

If missing, attempt install:

  • If apt-get exists:
    • sudo apt-get update && sudo apt-get install -y cron
    • sudo systemctl enable --now cron || sudo service cron start || true
  • Else if dnf exists:
    • sudo dnf install -y cronie
    • sudo systemctl enable --now crond || true
  • Else if yum exists:
    • sudo yum install -y cronie
    • sudo systemctl enable --now crond || true
  • Else if pacman exists:
    • sudo pacman -S --noconfirm cronie
    • sudo systemctl enable --now cronie || true
  • Else if apk exists:
    • sudo apk add dcron
    • sudo rc-update add dcron default || true
    • sudo rc-service dcron start || true
  • Else:
    • If you can’t install, tell the user cron is required for scheduling.

Re-check:

  • command -v crontab

Step 2: Ensure GitHub CLI (gh) is installed (auto-install)

Check:

  • gh --version

If missing, install:

  • If brew exists:

    • brew install gh
  • Else if apt-get exists (official GitHub CLI packages; preferred):

    • Install using the official apt repo steps:
      • (type -p wget >/dev/null || (sudo apt-get update && sudo apt-get install -y wget))
      • sudo mkdir -p -m 755 /etc/apt/keyrings
      • out=$(mktemp) && wget -nv -O"$out" https://cli.github.com/packages/githubcli-archive-keyring.gpg
      • cat "$out" | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null
      • sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg
      • sudo mkdir -p -m 755 /etc/apt/sources.list.d
      • echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
      • sudo apt-get update && sudo apt-get install -y gh
  • Else if dnf exists:

    • sudo dnf install -y 'dnf-command(config-manager)' || sudo dnf install -y dnf5-plugins || true
    • sudo dnf config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo || sudo dnf config-manager addrepo --from-repofile=https://cli.github.com/packages/rpm/gh-cli.repo || true
    • sudo dnf install -y gh --repo gh-cli || sudo dnf install -y gh || true
  • Else if yum exists:

    • type -p yum-config-manager >/dev/null || sudo yum install -y yum-utils
    • sudo yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
    • sudo yum install -y gh
  • Else if zypper exists:

    • sudo zypper addrepo https://cli.github.com/packages/rpm/gh-cli.repo || true
    • sudo zypper ref
    • sudo zypper install -y gh
  • Else if pacman exists:

    • sudo pacman -S --noconfirm github-cli
  • Else if apk exists:

    • sudo apk add github-cli
  • Else:

    • Tell the user you can’t auto-install gh on this OS.

Re-check:

  • gh --version

Only notify the user if install failed.


Step 3: Ensure the user is authenticated in gh (agent runs the flow)

Check:

  • gh auth status --hostname github.com

If NOT authenticated:

  1. Run:

    • gh auth login --hostname github.com --git-protocol https
  2. The terminal flow will show a one-time code and ask the user to authorize.

  3. After login:

    • gh auth setup-git
  4. Verify again:

    • gh auth status --hostname github.com

If auth fails, stop and report the exact terminal output.


Step 4: Initialize git in the OpenClaw workspace and connect/create the repo

Workspace dir (where you store SOUL.md, AGENTS.md, etc.):

  • Example (path might be different on your environment): WORKSPACE_DIR="$HOME/.openclaw/workspace"
  1. Ensure the workspace exists:

    • mkdir -p "$WORKSPACE_DIR"
    • cd "$WORKSPACE_DIR"
  2. Initialize repo if needed:

    • If .git does not exist: git init
    • git branch -M main
  3. Configure a deterministic commit identity (local-only):

  4. Determine the authenticated GitHub username (owner):

    • OWNER="$(gh api user --jq .login)"
    • (Do not print unless debugging is needed)
  5. Repo name and visibility:

    • REPO="<repo name from user>"
    • Visibility:
      • public => --public
      • private => --private
  6. Ensure there is at least one commit (required for first push/cron):

    • Create a tiny marker file if needed:
      • test -f .gitclaw.keep || printf "gitclaw initialized: %s\n" "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" > .gitclaw.keep
    • git add -A
    • git commit -m "gitclaw: initial backup" || true
  7. Create or reuse the target repo:

    • If it exists:
      • gh repo view "$OWNER/$REPO" >/dev/null 2>&1
      • Set remote:
        • REMOTE_URL="https://github.com/$OWNER/$REPO.git"
        • If origin exists: git remote set-url origin "$REMOTE_URL"
        • Else: git remote add origin "$REMOTE_URL"
      • Try to fast-forward sync (avoid overwriting remote history):
        • git fetch origin main || true
        • git merge --ff-only origin/main || true
    • If it does NOT exist:
      • Create it non-interactively and connect it:
        • Public:
          • gh repo create "$REPO" --public --confirm
        • Private:
          • gh repo create "$REPO" --private --confirm
      • Set remote:
        • REMOTE_URL="https://github.com/$OWNER/$REPO.git"
        • git remote add origin "$REMOTE_URL" || git remote set-url origin "$REMOTE_URL"
  8. Initial push:

    • git push -u origin main

If push fails due to conflicts or non-fast-forward:

  • Do NOT force-push automatically.
  • Report the exact error and stop (user decision required).

Step 5: Install deterministic backup script (NO AI / NO heartbeat)

Create a folder outside the workspace:

  • mkdir -p "$HOME/.openclaw/gitclaw"

Create this script EXACTLY:

Path:

  • $HOME/.openclaw/gitclaw/auto_backup.sh

Contents:

#!/usr/bin/env bash
set -euo pipefail

# GitClaw deterministic backup (no AI)
export PATH="/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:$PATH"

WORKSPACE_DIR="${HOME}/.openclaw/workspace"
STATE_DIR="${HOME}/.openclaw/gitclaw"
LOG_FILE="${STATE_DIR}/backup.log"
LOCK_DIR="${STATE_DIR}/lock"

mkdir -p "${STATE_DIR}"

timestamp() { date -u '+%Y-%m-%dT%H:%M:%SZ'; }

# Simple lock to prevent overlapping runs
if ! mkdir "${LOCK_DIR}" 2>/dev/null; then
  echo "$(timestamp) Skip: already running." >> "${LOG_FILE}"
  exit 0
fi
trap 'rmdir "${LOCK_DIR}" >/dev/null 2>&1 || true' EXIT

if ! command -v git >/dev/null 2>&1; then
  echo "$(timestamp) ERROR: git not found on PATH. Install git first." >> "${LOG_FILE}"
  exit 2
fi

if [ ! -d "${WORKSPACE_DIR}/.git" ]; then
  echo "$(timestamp) ERROR: ${WORKSPACE_DIR} is not a git repo. Run GitClaw setup first." >> "${LOG_FILE}"
  exit 3
fi

cd "${WORKSPACE_DIR}"

# Stage everything
git add -A

# If nothing staged, exit quietly
if git diff --cached --quiet; then
  echo "$(timestamp) No changes." >> "${LOG_FILE}"
  exit 0
fi

# Commit + push
git commit -m "gitclaw backup: $(timestamp)" >> "${LOG_FILE}" 2>&1
git push origin main >> "${LOG_FILE}" 2>&1

echo "$(timestamp) Backup OK." >> "${LOG_FILE}"

Write the script to:

  • $HOME/.openclaw/gitclaw/auto_backup.sh

Then:

  • chmod +x "$HOME/.openclaw/gitclaw/auto_backup.sh"

Step 6: Configure crontab (idempotent)

Default schedule: hourly (0 * * * *). If user provided a different frequency, convert it to a cron expression.

  1. Define:
  • CRON_CMD="$HOME/.openclaw/gitclaw/auto_backup.sh"
  • CRON_LINE="0 * * * * $CRON_CMD"
  1. Install without duplicates:
  • crontab -l 2>/dev/null | grep -F "$CRON_CMD" >/dev/null
  • If not found, append:
    • (crontab -l 2>/dev/null; echo "$CRON_LINE") | crontab -
  1. Confirm:
  • crontab -l | grep -F "$CRON_CMD"

Step 7: Final validation

  1. Run once:
  • $HOME/.openclaw/gitclaw/auto_backup.sh
  1. Show the log:
  • tail -n 50 "$HOME/.openclaw/gitclaw/backup.log" || true
  1. Tell the user:
  • Repo: https://github.com/$OWNER/$REPO
  • Schedule: hourly (or the chosen cadence)
  • Script path

Content truncated.

You might also like

flutter-development

aj-geddes

Build beautiful cross-platform mobile apps with Flutter and Dart. Covers widgets, state management with Provider/BLoC, navigation, API integration, and material design.

1,4071,302

drawio-diagrams-enhanced

jgtolentino

Create professional draw.io (diagrams.net) diagrams in XML format (.drawio files) with integrated PMP/PMBOK methodologies, extensive visual asset libraries, and industry-standard professional templates. Use this skill when users ask to create flowcharts, swimlane diagrams, cross-functional flowcharts, org charts, network diagrams, UML diagrams, BPMN, project management diagrams (WBS, Gantt, PERT, RACI), risk matrices, stakeholder maps, or any other visual diagram in draw.io format. This skill includes access to custom shape libraries for icons, clipart, and professional symbols.

1,2201,024

ui-ux-pro-max

nextlevelbuilder

"UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 8 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient."

9001,013

godot

bfollington

This skill should be used when working on Godot Engine projects. It provides specialized knowledge of Godot's file formats (.gd, .tscn, .tres), architecture patterns (component-based, signal-driven, resource-based), common pitfalls, validation tools, code templates, and CLI workflows. The `godot` command is available for running the game, validating scripts, importing resources, and exporting builds. Use this skill for tasks involving Godot game development, debugging scene/resource files, implementing game systems, or creating new Godot components.

958658

nano-banana-pro

garg-aayush

Generate and edit images using Google's Nano Banana Pro (Gemini 3 Pro Image) API. Use when the user asks to generate, create, edit, modify, change, alter, or update images. Also use when user references an existing image file and asks to modify it in any way (e.g., "modify this image", "change the background", "replace X with Y"). Supports both text-to-image generation and image-to-image editing with configurable resolution (1K default, 2K, or 4K for high resolution). DO NOT read the image file first - use this skill directly with the --input-image parameter.

970608

pdf-to-markdown

aliceisjustplaying

Convert entire PDF documents to clean, structured Markdown for full context loading. Use this skill when the user wants to extract ALL text from a PDF into context (not grep/search), when discussing or analyzing PDF content in full, when the user mentions "load the whole PDF", "bring the PDF into context", "read the entire PDF", or when partial extraction/grepping would miss important context. This is the preferred method for PDF text extraction over page-by-page or grep approaches.

1,033496

Stay ahead of the MCP ecosystem

Get weekly updates on new skills and servers.