# Update Ghostclaw

> Safely update GhostClaw to the latest version. Backs up, pulls, migrates, rebuilds, restarts, and verifies.

- Skill: `b1rdmania/update-ghostclaw` (Agent Skill)
- Install (CLI): `npx skillmds@latest add b1rdmania/update-ghostclaw`
- Raw SKILL.md: https://api.skillmd.com/api/skills/b1rdmania/update-ghostclaw/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: b1rdmania (https://skillmd.com/u/b1rdmania)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/b1rdmania/update-ghostclaw

---


# Update GhostClaw

Pulls the latest GhostClaw release, runs migrations, rebuilds, and restarts the service. Creates a backup tag before changing anything so the user can roll back.

## Steps

### 1. Preflight

**Memory warning:** Before proceeding, tell the user:

> "⚠️ Heads up: updating will reset your active session. If you want to preserve recent conversation context, back up your memory files first:
> - `groups/main/memory/` — identity, state, and log
> - `groups/main/CLAUDE.md` — personalised soul
>
> The update won't delete these files, but a fresh session after restart won't have the previous conversation in context."

Check that the working tree is clean:

```bash
git status --porcelain
```

If there's any output, stop and tell the user: "You have uncommitted changes. Commit or stash them first, then run `/update-ghostclaw` again."

Get the current version:

```bash
node -e "console.log(require('./package.json').version)"
```

Save this as `OLD_VERSION`.

Check for updates:

```bash
git fetch origin
git log HEAD..origin/main --oneline
```

If no new commits, tell the user: "GhostClaw is already up to date (v`OLD_VERSION`)." and stop.

Otherwise, show the user the list of incoming commits and how many there are. Ask: "These updates are available. Apply them?"

### 2. Backup

Create a backup tag so the user can roll back:

```bash
git tag "backup/pre-update-$(git rev-parse --short HEAD)-$(date +%s)"
```

Tell the user the tag name. Remind them they can roll back with:
```
git reset --hard <tag-name> && npm run build && launchctl kickstart -k gui/$(id -u)/com.ghostclaw
```

### 3. Pull

```bash
git merge origin/main
```

If there are merge conflicts, stop. Tell the user which files conflict and that they need to resolve manually. Do NOT force-resolve conflicts — this code runs bare metal with full system access.

### 4. Install dependencies and run migrations

```bash
npm install
```

This also runs the `postinstall` script which bootstraps `agent-runner`.

Get the new version:

```bash
node -e "console.log(require('./package.json').version)"
```

Save this as `NEW_VERSION`.

If `NEW_VERSION` differs from `OLD_VERSION`, run migrations:

```bash
npx tsx scripts/run-migrations.ts OLD_VERSION NEW_VERSION .
```

Report the migration results (how many ran, any failures).

If migrations fail, warn the user but continue — they may need to fix something manually.

### 4b. Check for template updates

If the upstream changed `groups/main/CLAUDE.md.template` or `groups/global/CLAUDE.md.template`, inform the user:

```bash
git diff HEAD~$(git log HEAD..origin/main --oneline | wc -l)..HEAD --name-only | grep 'CLAUDE.md.template'
```

If any templates changed, tell the user: "The CLAUDE.md template was updated upstream. Your personalised `groups/main/CLAUDE.md` is untouched — review the template changes if you want to incorporate any new sections."

### 5. Build and validate

```bash
npm run build
```

If the build fails, stop. Tell the user to check the error and fix it before restarting.

Run tests (non-blocking):

```bash
npm test
```

If tests fail, warn the user but don't block. They may have local customisations that diverge from upstream tests.

### 6. Hard reset sessions

Clear all stored sessions so agents start fresh after restart (stale sessions from the previous version can cause auth or execution errors):

```bash
node -e "
const Database = require('better-sqlite3');
const db = new Database('store/messages.db');
const result = db.prepare('DELETE FROM sessions').run();
console.log('Cleared ' + result.changes + ' session(s)');
"
```

Report how many sessions were cleared.

### 7. Restart service

Detect the platform and restart:

**macOS (launchd):**
```bash
launchctl kickstart -k gui/$(id -u)/com.ghostclaw
```

**Linux (systemd):**
```bash
systemctl --user restart ghostclaw
```

**Fallback (nohup/other):**
Tell the user to restart manually.

To detect: check if `launchctl list 2>/dev/null | grep com.ghostclaw` finds something (macOS), otherwise check if `systemctl --user is-active ghostclaw 2>/dev/null` works (Linux).

### 8. Verify

Wait 3 seconds, then check the service is running:

**macOS:**
```bash
launchctl list | grep com.ghostclaw
```

**Linux:**
```bash
systemctl --user is-active ghostclaw
```

Report to the user:
- Old version → new version
- Number of commits applied
- Migration results (if any)
- Service status
- Backup tag for rollback

If the service isn't running, tell the user to check `logs/ghostclaw.error.log`.

## Rolling back

If something goes wrong after an update:

```bash
git reset --hard <backup-tag>
npm install
npm run build
# Then restart the service (launchctl/systemctl)
```

The backup tag is printed during step 2 and again in the final summary.

