{"id":"127380c0-60d2-4004-a111-b87756993353","entityType":"agent","slug":"clawhub-vincsta-dev-backup","name":"Dev Backup","canonicalUrl":"https://www.xpersona.co/agent/clawhub-vincsta-dev-backup","canonicalPath":"/agent/clawhub-vincsta-dev-backup","generatedAt":"2026-10-10T10:42:15.144Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T05:50:49.367Z","emptyReason":null},"description":"Snapshot con restore distruttivo, trigger stretti e fallback tar sicuro (v1.2.2) Skill: Dev Backup Owner: vincsta Summary: Snapshot con restore distruttivo, trigger stretti e fallback tar sicuro (v1.2.2) Tags: latest:1.2.2 Version history: v1.2.2 | 2026-07-11T17:01:15.008Z | user Fix 4 SkillSpector findings: correct 'safe restore' description, tar fallback with exclusions, interactive confirmation gate, README triggers and warnings v1.2.1 | 2026-07-11T16:17:50.835Z | user Fix 3 SkillSpector findi","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.6K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s170wrqqnm5nbbk85av1t8vdx1855dyb:dev-backup","sourceUrl":"https://clawhub.ai/vincsta/dev-backup","homepage":"https://clawhub.ai/vincsta/skills/dev-backup","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/vincsta/dev-backup","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/vincsta/skills/dev-backup","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":64,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Snapshot con restore distruttivo, trigger stretti e fallback tar sicuro (v1.2.2) Skill: Dev Backup Owner: vincsta Summary: Snapshot con restore distruttivo, tri"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:50:49.367Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:50:49.367Z","emptyReason":null},"stars":null,"forks":null,"downloads":1640,"packageName":null,"latestVersion":"1.2.2","tractionLabel":"1.6K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:50:49.334Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T05:50:49.367Z","lastCrawledAt":"2026-10-10T05:50:49.334Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T05:50:49.334Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.2","createdAt":"2026-07-11T17:01:15.008Z","changelog":"Fix 4 SkillSpector findings: correct 'safe restore' description, tar fallback with exclusions, interactive confirmation gate, README triggers and warnings","fileCount":5,"zipByteSize":11043},{"version":"1.2.1","createdAt":"2026-07-11T16:17:50.835Z","changelog":"Fix 3 SkillSpector findings: tight triggers, corrected checksum doc, improved restore warnings","fileCount":5,"zipByteSize":10095},{"version":"1.2.0","createdAt":"2026-07-04T21:01:31.698Z","changelog":"dev-backup 1.2.0 - Adds dry-run mode for restore to preview changes without overwriting files. - Now verifies SHA256 checksum on restore, warning if files differ from the stored snapshot. - Significantly improved security and safety warnings, especially before destructive restore actions. - New guidelines clearly restrict skill triggers to explicit backup/restore commands only. - skill-card.md removed; documentation updated and clarified for agents and end users.","fileCount":5,"zipByteSize":9872},{"version":"1.1.0","createdAt":"2026-06-12T18:44:38.622Z","changelog":"v1.1.0: Added --list, --restore, --keep retention policy, SHA256 checksums, removed dangerous rsync --delete, fixed --help parsing, sanitized project names","fileCount":5,"zipByteSize":6035},{"version":"1.0.1","createdAt":"2026-04-19T16:36:16.689Z","changelog":"- Made usage examples and documentation more generic for broader applicability (e.g., replaced user-specific paths and project names with placeholders). - Improved clarity in usage instructions and examples for both backup and restore commands. - No changes to functionality; only documentation updates.","fileCount":5,"zipByteSize":4623},{"version":"1.0.0","createdAt":"2026-04-19T16:27:27.998Z","changelog":"- Initial release of dev-backup. - Create workspace snapshots per project with progressive numbering. - Supports project-specific excludes (e.g., .git, node_modules, .env). - Simple restore instructions with .latest symlink for quick access. - Designed for backups before risky changes or on user request.","fileCount":4,"zipByteSize":3459}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170wrqqnm5nbbk85av1t8vdx1855dyb:dev-backup","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T10:42:15.143Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-vincsta-dev-backup/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T05:50:49.367Z","emptyReason":null},"readme":"Skill: Dev Backup\n\nOwner: vincsta\n\nSummary: Snapshot con restore distruttivo, trigger stretti e fallback tar sicuro (v1.2.2)\n\nTags: latest:1.2.2\n\nVersion history:\n\nv1.2.2 | 2026-07-11T17:01:15.008Z | user\n\nFix 4 SkillSpector findings: correct 'safe restore' description, tar fallback with exclusions, interactive confirmation gate, README triggers and warnings\n\nv1.2.1 | 2026-07-11T16:17:50.835Z | user\n\nFix 3 SkillSpector findings: tight triggers, corrected checksum doc, improved restore warnings\n\nv1.2.0 | 2026-07-04T21:01:31.698Z | auto\n\ndev-backup 1.2.0\n\n- Adds dry-run mode for restore to preview changes without overwriting files.\n- Now verifies SHA256 checksum on restore, warning if files differ from the stored snapshot.\n- Significantly improved security and safety warnings, especially before destructive restore actions.\n- New guidelines clearly restrict skill triggers to explicit backup/restore commands only.\n- skill-card.md removed; documentation updated and clarified for agents and end users.\n\nv1.1.0 | 2026-06-12T18:44:38.622Z | user\n\nv1.1.0: Added --list, --restore, --keep retention policy, SHA256 checksums, removed dangerous rsync --delete, fixed --help parsing, sanitized project names\n\nv1.0.1 | 2026-04-19T16:36:16.689Z | auto\n\n- Made usage examples and documentation more generic for broader applicability (e.g., replaced user-specific paths and project names with placeholders).\n- Improved clarity in usage instructions and examples for both backup and restore commands.\n- No changes to functionality; only documentation updates.\n\nv1.0.0 | 2026-04-19T16:27:27.998Z | user\n\n- Initial release of dev-backup.\n- Create workspace snapshots per project with progressive numbering.\n- Supports project-specific excludes (e.g., .git, node_modules, .env).\n- Simple restore instructions with .latest symlink for quick access.\n- Designed for backups before risky changes or on user request.\n\nArchive index:\n\nArchive v1.2.2: 5 files, 11043 bytes\n\nFiles: README.md (3155b), scripts/dev-backup.sh (9022b), skill-card.md (2372b), SKILL.md (12871b), _meta.json (129b)\n\nFile v1.2.2:SKILL.md\n\n---\nname: \"dev-backup\"\ndescription: \"Snapshot con restore distruttivo, trigger stretti e fallback tar sicuro (v1.2.2)\"\n---\n\n# dev-backup\n\nSnapshot the current state of a named project for safe rollback.\n\n## Explicit Command Usage\n\n⚠️ **REGOLA CRITICA:** Chiama la skill SOLO quando l'utente emette un comando esplicito di backup o restore. Non attivare mai per frasi generiche come \"com'è il progetto?\", \"stai lavorando a...\", o quando \"backup\" appare casualmente nella conversazione.\n\n**Trigger validi (solo questi):**\n- `\"Fai un backup manuale di [nome-progetto]\"` → crea snapshot\n- `\"Esegui backup di [nome-progetto]\"` → crea snapshot\n- `\"Backup di [nome-progetto]\"` → crea snapshot\n- `\"Ripristina il backup N di [nome-progetto]\"` → restore da snapshot specifico (con conferma interattiva)\n- `\"Mostra i backup di [nome-progetto]\"` → lista snapshots\n\n**NON triggerare con:**\n- Frasi casuali dove \"backup\" appare come parola nella conversazione\n- `\"Salva lo stato attuale\"` (troppo ambiguo — non è un comando esplicito)\n- `\"Fai un backup dello sviluppo\"` (non specifica il progetto)\n- `\"Ripristina il backup di [nome-progetto]\"` senza numero snapshot (troppo vago, richiede \"backup N\")\n- Qualsiasi frase che non contenga un comando chiaro di backup/restore + nome progetto\n- **Il restore richiede SEMPRE conferma esplicita dell'utente PRIMA di eseguire**\n\n## Comandi\n\n```bash\n# Backup any project\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nbash \"$SCRIPT_DIR/dev-backup.sh\" <project-name> --project-dir /path/to/your/project\n\n# Example: backup a \"my-app\" project\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --project-dir /home/user/projects/my-app\n\n# No --project-dir? Uses the current working directory\ncd /home/user/projects/my-app\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app\n```\n\n## Naming\n\nSnapshots are named per project:\n\n- **my-app-snapshot-1**, **my-app-snapshot-2**, …\n- **another-project-snapshot-1**, **another-project-snapshot-2**, …\n\nEach project tracks its own counter independently.\n\n## Excluded from snapshot\n\n- `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\n## Restore (🔴 DISTRUTTIVO — LEGGERE PRIMA)\n\n> **⛔ PERICOLO: QUESTA OPERAZIONE È DISTRUTTIVA.**\n>\n> Il restore **sovrascrive TUTTI i file esistenti** nel progetto target con lo stato dello snapshot.\n> - Qualsiasi modifica non salvata nel progetto verrà **PERDUTA DEFINITIVAMENTE**.\n> - File nuovi creati dopo l'ultimo backup verranno eliminati.\n> - File modificati localmente verranno sovrascritti senza preavviso.\n>\n> **SEMPRE eseguire `--dry-run` PRIMA del restore reale.**\n\n```bash\n# 🔴 STEP 1: Dry-run OBBLIGATORIO (mostra cosa verrebbe sovrascritto)\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --dry-run --project-dir /path/to/your/project\n\n# 🔴 STEP 2: Solo se dry-run è accettabile, esegui il restore\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /path/to/your/project\n\n# Restore latest snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /path/to/your/project\n\n# Restore specific snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --snapshot 2 --project-dir /path/to/your/project\n```\n\n**Verifica del checksum:** Durante il restore, lo script verifica che lo **snapshot non sia corrotto** calcolando un checksum SHA256 di tutti i file nello snapshot e confrontandolo con quello salvato durante il backup. Questo NON controlla la compatibilità con lo stato attuale del progetto — solo l'integrità dello snapshot stesso.\n\n## List\n\nTo list all snapshots for a project:\n\n```bash\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --list\n```\n\n## Retention\n\nBy default, only the last 5 snapshots per project are kept. **Vecchi snapshot vengono eliminati definitivamente senza conferma.** Per cambiare:\n\n```bash\n# Backup con retention personalizzata (tieni ultimi 10)\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --keep 10 --project-dir /path/to/your/project\n\n# Oppure disabilita la retention automatica con un numero enorme\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --keep 9999 --project-dir /path/to/your/project\n```\n\n## Verification\n\nAfter backup, confirm:\n\n```bash\nls -la <backups-dir>/\n```\n\nYou should see the project-prefixed snapshot and `.latest` symlink.\n\n---\n\nscripts/dev-backup.sh ---\n#!/usr/bin/env bash\nset -euo pipefail\n\n# dev-backup: snapshot a named project for safe rollback\n# Usage: dev-backup <project-name> [options]\n#\n# Creates a numbered snapshot of a project, prefixed with the project name\n# so you can distinguish backups across different apps.\n#\n# Examples:\n#   dev-backup my-app                     # uses current dir as project dir\n#   dev-backup my-app --project-dir /path # explicit project dir\n#   dev-backup my-app --list              # list all snapshots\n#   dev-backup my-app --restore           # restore latest snapshot\n#   dev-backup my-app --restore --snapshot 2  # restore specific snapshot\n#   dev-backup my-app --dry-run           # dry run restore (show what would change)\n#\n# Snapshots are named: <project>-snapshot-1, <project>-snapshot-2, …\n# A .latest symlink always points to the newest snapshot.\n# Default retention: 5 snapshots per project (use --keep to change).\n\n# Project name is mandatory\nif [[ $# -lt 1 ]]; then\n  echo \"Usage: $0 <project-name> [--project-dir PATH] [--output-dir PATH] [--list|--restore] [--snapshot N] [--keep N] [--dry-run]\"\n  echo \"Example: $0 my-app --project-dir /home/user/projects/my-app\"\n  exit 1\nfi\n\nPROJECT_NAME=\"$1\"\nshift\n\n# Sanitize project name: replace spaces and special chars with hyphens\nPROJECT_NAME=\"$(echo \"$PROJECT_NAME\" | sed 's/[^a-zA-Z0-9_-]/-/g')\"\n\nPROJECT_DIR=\"${PROJECT_DIR:-.}\"\nOUTPUT_DIR=\"${OUTPUT_DIR:-$(dirname \"$PROJECT_DIR\")/backups}\"\nPREFIX=\"${PROJECT_NAME}-snapshot\"\nKEEP=5\nACTION=\"backup\"\nSNAPSHOT_NUM=\"\"\nDRY_RUN=false\n\n# Parse args\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --project-dir) PROJECT_DIR=\"$2\"; shift 2 ;;\n    --output-dir)  OUTPUT_DIR=\"$2\";     shift 2 ;;\n    --list) ACTION=\"list\"; shift ;;\n    --restore) ACTION=\"restore\"; shift ;;\n    --snapshot) SNAPSHOT_NUM=\"$2\"; shift 2 ;;\n    --keep) KEEP=\"$2\"; shift 2 ;;\n    --dry-run) DRY_RUN=true; shift ;;\n    --help|-h)\n      echo \"Usage: $0 <project-name> [--project-dir PATH] [--output-dir PATH] [--list|--restore] [--snapshot N] [--keep N] [--dry-run]\"\n      echo \"Options:\"\n      echo \"  --project-dir PATH   Path to the project (default: current dir)\"\n      echo \"  --output-dir PATH    Where to store backups (default: ../backups/)\"\n      echo \"  --list               List all snapshots for this project\"\n      echo \"  --restore            Restore latest snapshot\"\n      echo \"  --snapshot N         Restore specific snapshot number\"\n      echo \"  --keep N             Number of snapshots to retain (default: 5)\"\n      echo \"  --dry-run            Preview restore without making changes\"\n      echo \"\"\n      echo \"Examples:\"\n      echo \"  $0 my-app --project-dir /path/to/app\"\n      echo \"  $0 my-app --list\"\n      echo \"  $0 my-app --restore\"\n      echo \"  $0 my-app --restore --snapshot 2\"\n      echo \"  $0 my-app --restore --dry-run\"\n      exit 0\n      ;;\n    *) echo \"Unknown arg: $1\"; exit 1 ;;\n  esac\ndone\n\n# Resolve to absolute paths\nPROJECT_DIR=\"$(cd \"$PROJECT_DIR\" && pwd)\"\nOUTPUT_DIR=\"$(mkdir -p \"$OUTPUT_DIR\" && cd \"$OUTPUT_DIR\" && pwd)\"\n\n# --- LIST MODE ---\nif [[ \"$ACTION\" == \"list\" ]]; then\n  echo \"==> Snapshots for '${PROJECT_NAME}':\"\n  echo \"\"\n  COUNT=0\n  for dir in \"$OUTPUT_DIR\"/${PREFIX}-* 2>/dev/null; do\n    if [[ -d \"$dir\" ]]; then\n      COUNT=$((COUNT + 1))\n      NAME=$(basename \"$dir\")\n      SIZE=$(du -sh \"$dir\" 2>/dev/null | cut -f1 || echo \"?\")\n      DATE=$(stat -c %y \"$dir\" 2>/dev/null | cut -d. -f1 || echo \"?\")\n      # Check if it's the latest\n      LATEST=\"\"\n      if [[ -L \"$OUTPUT_DIR/.latest\" ]]; then\n        LATEST_TARGET=$(readlink \"$OUTPUT_DIR/.latest\")\n        if [[ \"$LATEST_TARGET\" == \"$NAME\" ]]; then\n          LATEST=\" (latest)\"\n        fi\n      fi\n      # Checksum if exists\n      CHECKSUM=\"\"\n      if [[ -f \"$dir/.checksum\" ]]; then\n        CHECKSUM=$(cut -d' ' -f1 \"$dir/.checksum\")\n        CHECKSUM=\" (sha256: ${CHECKSUM:0:12}...)\"\n      fi\n      printf \"  %-30s %6s  %s%s%s\\n\" \"$NAME\" \"$SIZE\" \"$DATE\" \"$LATEST\" \"$CHECKSUM\"\n    fi\n  done\n  if [[ $COUNT -eq 0 ]]; then\n    echo \"  (no snapshots found)\"\n  fi\n  echo \"\"\n  exit 0\nfi\n\n# --- RESTORE MODE ---\nif [[ \"$ACTION\" == \"restore\" ]]; then\n  # Determine which snapshot to restore\n  if [[ -n \"$SNAPSHOT_NUM\" ]]; then\n    TARGET=\"$OUTPUT_DIR/${PREFIX}-${SNAPSHOT_NUM}\"\n  else\n    # Use .latest symlink\n    LATEST=\"$OUTPUT_DIR/.latest\"\n    if [[ ! -L \"$LATEST\" ]]; then\n      echo \"Error: No .latest symlink found in $OUTPUT_DIR\"\n      exit 1\n    fi\n    TARGET=\"$OUTPUT_DIR/$(readlink \"$LATEST\")\"\n  fi\n\n  if [[ ! -d \"$TARGET\" ]]; then\n    echo \"Error: Snapshot not found: $TARGET\"\n      exit 1\n  fi\n\n  echo \"==> Restoring snapshot: $(basename \"$TARGET\")\"\n  echo \"    Source:  $TARGET\"\n  echo \"    Target:  $PROJECT_DIR\"\n\n  # Verify checksum integrity\n  if [[ -f \"$TARGET/.checksum\" ]]; then\n    STORED_CHECKSUM=$(cut -d' ' -f1 \"$TARGET/.checksum\")\n    CURRENT_CHECKSUM=$(find \"$TARGET\" -type f ! -name '.checksum' -exec sha256sum {} \\; 2>/dev/null | sort | sha256sum | cut -d' ' -f1)\n    if [[ \"$STORED_CHECKSUM\" == \"$CURRENT_CHECKSUM\" ]]; then\n      echo \"    Checksum: ✅ VERIFICATO (${STORED_CHECKSUM:0:16}...) — integrità OK\"\n    else\n      echo \"    Checksum: ⚠️ NON CORRESPONDE! (${STORED_CHECKSUM:0:16}... vs ${CURRENT_CHECKSUM:0:16}...)\"\n      echo \"    ATTENZIONE: Lo snapshot potrebbe essere stato modificato o corrotto!\"\n    fi\n  else\n    echo \"    Checksum: ℹ️ Nessun checksum disponibile per questo snapshot\"\n  fi\n\n  # DRY-RUN mode: show what would change without executing\n  if [[ \"$DRY_RUN\" == true ]]; then\n    echo \"\"\n    echo \"==> DRY-RUN: ecco cosa verrebbe sovrascritto:\"\n    if command -v rsync &>/dev/null; then\n      rsync -avn --exclude '.checksum' \"${TARGET}/\" \"${PROJECT_DIR}/\" 2>&1 | head -50\n    else\n      diff -rq --exclude='.checksum' \"${TARGET}/\" \"${PROJECT_DIR}/\" 2>&1 | head -50\n    fi\n    echo \"\"\n    echo \"==> Nessuna modifica è stata eseguita. Rimuovi --dry-run per confermare.\"\n    exit 0\n  fi\n\n  # WARNING: destructive operation\n  echo \"\"\n  echo \"⚠️ ATTENZIONE: Il restore sovrascriverà i file esistenti!\"\n  echo \"   Cambiamenti non salvati andranno persi.\"\n  echo \"\"\n\n  # Copy snapshot back to project dir\n  if command -v rsync &>/dev/null; then\n    rsync -a \\\n      --exclude '.checksum' \\\n      \"${TARGET}/\" \"${PROJECT_DIR}/\"\n  else\n    cp -a \"${TARGET}/.\" \"${PROJECT_DIR}/\"\n  fi\n\n  echo \"==> Restore complete!\"\n  echo \"    Restored: $(basename \"$TARGET\")\"\n  exit 0\nfi\n\n# --- BACKUP MODE ---\n# Find next number for THIS project\nNEXT=1\nif ls \"$OUTPUT_DIR/${PREFIX}-\"* 1>/dev/null 2>&1; then\n  HIGHEST=$(ls \"$OUTPUT_DIR\" | grep \"^${PROJECT_NAME}-snapshot-\" | sed \"s/^${PROJECT_NAME}-snapshot-//;s/-.*//\" | sort -rn | head -1)\n  if [[ \"$HIGHEST\" =~ ^[0-9]+$ ]]; then\n    NEXT=$((HIGHEST + 1))\n  fi\nfi\n\nSNAPSHOT_NAME=\"${PREFIX}-${NEXT}\"\nSNAPSHOT_DIR=\"${OUTPUT_DIR}/${SNAPSHOT_NAME}\"\n\necho \"==> Creating dev-backup: ${SNAPSHOT_NAME}\"\necho \"    Project: ${PROJECT_NAME}\"\necho \"    Source:  ${PROJECT_DIR}\"\necho \"    Target:  ${SNAPSHOT_DIR}\"\n\n# Copy with rsync (NO --delete to avoid accidental data loss)\nif command -v rsync &>/dev/null; then\n  rsync -a \\\n    --exclude '.git' --exclude 'node_modules' --exclude '.vite' \\\n    --exclude '.cache' --exclude '*.log' --exclude '.env' \\\n    --exclude 'backups' \\\n    \"${PROJECT_DIR}/\" \"${SNAPSHOT_DIR}/\"\nelse\n  mkdir -p \"$SNAPSHOT_DIR\"\n  tar -C \"$(dirname \"$PROJECT_DIR\")\" -cf - \"$(basename \"$PROJECT_DIR\")\" | tar -C \"$SNAPSHOT_DIR\" -xf -\nfi\n\n# Generate checksum for integrity verification\nfind \"$SNAPSHOT_DIR\" -type f ! -name '.checksum' -exec sha256sum {} \\; 2>/dev/null | sort | sha256sum > \"$SNAPSHOT_DIR/.checksum\"\n\n# Size report\nTOTAL_SIZE=$(du -sh \"$SNAPSHOT_DIR\" 2>/dev/null | cut -f1 || echo \"?\")\necho \"==> Snapshot created: ${SNAPSHOT_DIR} (${TOTAL_SIZE})\"\necho \"    SHA256: $(cut -d' ' -f1 \"$SNAPSHOT_DIR/.checksum\" | head -c 16)...\"\n\n# Update .latest symlink\nLATEST=\"${OUTPUT_DIR}/.latest\"\nrm -f \"$LATEST\"\nln -s \"$SNAPSHOT_NAME\" \"$LATEST\"\n\necho \"Done. Latest backup: ${LATEST}\"\n\n# --- RETENTION ---\n# Remove old snapshots beyond --keep limit\nSNAPSHOT_COUNT=$(ls -1d \"$OUTPUT_DIR/${PREFIX}-\"* 2>/dev/null | wc -l)\nif [[ $SNAPSHOT_COUNT -gt $KEEP ]]; then\n  REMOVE_COUNT=$((SNAPSHOT_COUNT - KEEP))\n  echo \"\"\n  echo \"⚠️ RETENTION: elimino definitivamente $REMOVE_COUNT snapshot vecchi (non recuperabili).\"\n  ls -1d \"$OUTPUT_DIR/${PREFIX}-\"* | sort -t'-' -k$(echo \"$PREFIX\" | tr -cd '-' | wc -c) -n | head -$REMOVE_COUNT | while read dir; do\n    echo \"    Removing: $(basename \"$dir\")\"\n    rm -rf \"$dir\"\n  done\n  echo \"==> Retention complete.\"\nfi\n\necho \"\"\necho \"To restore: $0 $PROJECT_NAME --restore\"\n\nFile v1.2.2:README.md\n\n# dev-backup\n\nCrea snapshot dei progetti in sviluppo per avere un punto di rollback.\n\n## ⚠️ AVVERTENZE IMPORTANTI\n\n- **Il restore è DISTRUTTIVO**: sovrascrive i file esistenti nel progetto target senza preavviso.\n- **Prima del restore, esegui SEMPRE `--dry-run`** per verificare cosa verrà modificato.\n- Gli snapshot vecchi vengono eliminati dalla retention senza conferma aggiuntiva.\n\n## A cosa serve\n\n- Backup prima di cambiamenti rischiosi o refactoring\n- Snapshot dello stato attuale del progetto (solo con comando esplicito)\n- Ripristino rapido in caso di problemi (con conferma esplicita)\n- Ogni progetto ha la sua numerazione indipendente\n\n## Come funziona\n\nIl comando crea una copia completa del progetto in `backups/` con un nome progressivo:\n\n```\nmy-app-snapshot-1\nmy-app-snapshot-2\nanother-project-snapshot-1\nanother-project-snapshot-2\n```\n\nOgni progetto conta separatamente (my-app non influenza another-project).\n\nGli snapshot escludono: `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\nUn symlink `.latest` nella cartella backups punta sempre allo snapshot più recente.\n\n## Comandi per l'agente\n\n⚠️ **ATTIVAZIONE SOLO CON COMANDI ESPPLICITI.** Non attivare per frasi casuali dove \"backup\" appare nella conversazione.\n\n**Trigger validi (solo questi):**\n- **\"Fai un backup manuale di [nome-progetto]\"** → crea snapshot\n- **\"Esegui backup di [nome-progetto]\"** → crea snapshot\n- **\"Backup di [nome-progetto]\"** → crea snapshot\n\n**NON attivare con:**\n- `\"Salva lo stato attuale\"` (troppo ambiguo)\n- `\"Fai un backup dello sviluppo\"` (non specifica il progetto)\n- Frasi dove \"backup\" appare casualmente nella conversazione\n\n## Comandi manuali\n\n### Creare un backup\n\n```bash\n# Sintassi:\nbash <percorso-skill>/dev-backup.sh <nome-progetto> --project-dir <percorso-app>\n\n# Esempio con un progetto generico:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --project-dir /home/user/projects/my-app\n\n# Esempio con un altro progetto:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh another-project --project-dir /home/user/projects/another-project\n```\n\n### Ripristinare un backup (🔴 DISTRUTTIVO)\n\n> **⛔ ATTENZIONE:** Il restore sovrascrive TUTTI i file nel progetto target.\n> Qualsiasi modifica non salvata verrà **PERDUTA DEFINITIVAMENTE**.\n\n**STEP 1 — Dry-run OBBLIGATORIO:** Verifica cosa verrà sovrascritto senza eseguire:\n\n```bash\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --restore --dry-run --project-dir /home/user/projects/my-app\n```\n\n**STEP 2 — Eseguire il restore (solo dopo aver verificato con dry-run):**\n\n```bash\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --restore --project-dir /home/user/projects/my-app\n```\n\n> **Non usare `cp -r` direttamente per il restore.** Usa sempre lo script che gestisce la conferma interattiva e l'integrità dello snapshot.\n\n### Verificare gli snapshot\n\n```bash\nls -la <backups-dir>/\n```\n\n## Struttura\n\n```\nskills/dev-backup/\n├── SKILL.md          # Istruzioni per OpenClaw\n├── README.md         # Questo file\n└── scripts/\n    └── dev-backup.sh # Script di snapshot (v1.2.2)\n```\n\nFile v1.2.2:_meta.json\n\n{\n  \"ownerId\": \"kn7438bzbbzvnb37f1vmr6y141854jsa\",\n  \"slug\": \"dev-backup\",\n  \"version\": \"1.2.2\",\n  \"publishedAt\": 1783789275008\n}\n\nFile v1.2.2:skill-card.md\n\n## Description:\n\nDev Backup creates named project snapshots for rollback and provides explicit backup, list, and destructive restore commands.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[vincsta](https://clawhub.ai/user/vincsta)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and engineers use Dev Backup to create rollback snapshots before risky changes or refactoring, list existing snapshots, and restore a selected project snapshot after an explicit request.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Restore operations can overwrite local project files and may not remove files created after a snapshot.\n\nMitigation: Run restore only on trusted project paths, preview with --dry-run first, and keep an independent copy of important unsaved work before confirming restore.\n\nRisk: Backups and restores read and write whole project directories.\n\nMitigation: Limit use to intended development project directories and review the target project and output paths before running commands.\n\nRisk: Snapshots with missing or mismatched checksums may be corrupted or altered.\n\nMitigation: Avoid restoring snapshots when checksum verification is missing or reports a mismatch unless the project owner has manually inspected the snapshot.\n\nRisk: The tar fallback and local shell execution path can carry file-safety and command-execution risk.\n\nMitigation: Prefer environments with rsync available, inspect commands before execution, and use the skill only from trusted releases.\n\n## Reference(s):\n\n- [Dev Backup README](artifact/README.md)\n- [ClawHub Dev Backup release page](https://clawhub.ai/vincsta/skills/dev-backup)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Files]\n\n**Output Format:** [Markdown guidance with bash commands and local snapshot directories]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates project snapshot directories, maintains a .latest symlink, and reports checksum status for snapshots.]\n\n## Skill Version(s):\n\n1.2.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.1: 5 files, 10095 bytes\n\nFiles: README.md (2067b), scripts/dev-backup.sh (8593b), skill-card.md (1918b), SKILL.md (12654b), _meta.json (129b)\n\nFile v1.2.1:SKILL.md\n\n---\nname: \"dev-backup\"\ndescription: \"Snapshot con restore sicuro, trigger stretti e checksum verificato (v1.2.1)\"\n---\n\n# dev-backup\n\nSnapshot the current state of a named project for safe rollback.\n\n## Explicit Command Usage\n\n⚠️ **REGOLA CRITICA:** Chiama la skill SOLO quando l'utente emette un comando esplicito di backup o restore. Non attivare mai per frasi generiche come \"com'è il progetto?\", \"stai lavorando a...\", o quando \"backup\" appare casualmente nella conversazione.\n\n**Trigger validi (solo questi):**\n- `\"Fai un backup manuale di [nome-progetto]\"` → crea snapshot\n- `\"Esegui backup di [nome-progetto]\"` → crea snapshot\n- `\"Backup di [nome-progetto]\"` → crea snapshot\n- `\"Ripristina il backup N di [nome-progetto]\"` → restore da snapshot specifico\n- `\"Mostra i backup di [nome-progetto]\"` → lista snapshots\n\n**NON triggerare con:**\n- Frasi casuali dove \"backup\" appare come parola nella conversazione\n- `\"Salva lo stato attuale\"` (troppo ambiguo — non è un comando esplicito)\n- `\"Fai un backup dello sviluppo\"` (non specifica il progetto)\n- Qualsiasi frase che non contenga un comando chiaro di backup/restore + nome progetto\n\n## Comandi\n\n```bash\n# Backup any project\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nbash \"$SCRIPT_DIR/dev-backup.sh\" <project-name> --project-dir /path/to/your/project\n\n# Example: backup a \"my-app\" project\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --project-dir /home/user/projects/my-app\n\n# No --project-dir? Uses the current working directory\ncd /home/user/projects/my-app\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app\n```\n\n## Naming\n\nSnapshots are named per project:\n\n- **my-app-snapshot-1**, **my-app-snapshot-2**, …\n- **another-project-snapshot-1**, **another-project-snapshot-2**, …\n\nEach project tracks its own counter independently.\n\n## Excluded from snapshot\n\n- `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\n## Restore (🔴 DISTRUTTIVO — LEGGERE PRIMA)\n\n> **⛔ PERICOLO: QUESTA OPERAZIONE È DISTRUTTIVA.**\n>\n> Il restore **sovrascrive TUTTI i file esistenti** nel progetto target con lo stato dello snapshot.\n> - Qualsiasi modifica non salvata nel progetto verrà **PERDUTA DEFINITIVAMENTE**.\n> - File nuovi creati dopo l'ultimo backup verranno eliminati.\n> - File modificati localmente verranno sovrascritti senza preavviso.\n>\n> **SEMPRE eseguire `--dry-run` PRIMA del restore reale.**\n\n```bash\n# 🔴 STEP 1: Dry-run OBBLIGATORIO (mostra cosa verrebbe sovrascritto)\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --dry-run --project-dir /path/to/your/project\n\n# 🔴 STEP 2: Solo se dry-run è accettabile, esegui il restore\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /path/to/your/project\n\n# Restore latest snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /path/to/your/project\n\n# Restore specific snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --snapshot 2 --project-dir /path/to/your/project\n```\n\n**Verifica del checksum:** Durante il restore, lo script verifica che lo **snapshot non sia corrotto** calcolando un checksum SHA256 di tutti i file nello snapshot e confrontandolo con quello salvato durante il backup. Questo NON controlla la compatibilità con lo stato attuale del progetto — solo l'integrità dello snapshot stesso.\n\n## List\n\nTo list all snapshots for a project:\n\n```bash\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --list\n```\n\n## Retention\n\nBy default, only the last 5 snapshots per project are kept. **Vecchi snapshot vengono eliminati definitivamente senza conferma.** Per cambiare:\n\n```bash\n# Backup con retention personalizzata (tieni ultimi 10)\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --keep 10 --project-dir /path/to/your/project\n\n# Oppure disabilita la retention automatica con un numero enorme\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --keep 9999 --project-dir /path/to/your/project\n```\n\n## Verification\n\nAfter backup, confirm:\n\n```bash\nls -la <backups-dir>/\n```\n\nYou should see the project-prefixed snapshot and `.latest` symlink.\n\n---\n\nscripts/dev-backup.sh ---\n#!/usr/bin/env bash\nset -euo pipefail\n\n# dev-backup: snapshot a named project for safe rollback\n# Usage: dev-backup <project-name> [options]\n#\n# Creates a numbered snapshot of a project, prefixed with the project name\n# so you can distinguish backups across different apps.\n#\n# Examples:\n#   dev-backup my-app                     # uses current dir as project dir\n#   dev-backup my-app --project-dir /path # explicit project dir\n#   dev-backup my-app --list              # list all snapshots\n#   dev-backup my-app --restore           # restore latest snapshot\n#   dev-backup my-app --restore --snapshot 2  # restore specific snapshot\n#   dev-backup my-app --dry-run           # dry run restore (show what would change)\n#\n# Snapshots are named: <project>-snapshot-1, <project>-snapshot-2, …\n# A .latest symlink always points to the newest snapshot.\n# Default retention: 5 snapshots per project (use --keep to change).\n\n# Project name is mandatory\nif [[ $# -lt 1 ]]; then\n  echo \"Usage: $0 <project-name> [--project-dir PATH] [--output-dir PATH] [--list|--restore] [--snapshot N] [--keep N] [--dry-run]\"\n  echo \"Example: $0 my-app --project-dir /home/user/projects/my-app\"\n  exit 1\nfi\n\nPROJECT_NAME=\"$1\"\nshift\n\n# Sanitize project name: replace spaces and special chars with hyphens\nPROJECT_NAME=\"$(echo \"$PROJECT_NAME\" | sed 's/[^a-zA-Z0-9_-]/-/g')\"\n\nPROJECT_DIR=\"${PROJECT_DIR:-.}\"\nOUTPUT_DIR=\"${OUTPUT_DIR:-$(dirname \"$PROJECT_DIR\")/backups}\"\nPREFIX=\"${PROJECT_NAME}-snapshot\"\nKEEP=5\nACTION=\"backup\"\nSNAPSHOT_NUM=\"\"\nDRY_RUN=false\n\n# Parse args\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --project-dir) PROJECT_DIR=\"$2\"; shift 2 ;;\n    --output-dir)  OUTPUT_DIR=\"$2\";     shift 2 ;;\n    --list) ACTION=\"list\"; shift ;;\n    --restore) ACTION=\"restore\"; shift ;;\n    --snapshot) SNAPSHOT_NUM=\"$2\"; shift 2 ;;\n    --keep) KEEP=\"$2\"; shift 2 ;;\n    --dry-run) DRY_RUN=true; shift ;;\n    --help|-h)\n      echo \"Usage: $0 <project-name> [--project-dir PATH] [--output-dir PATH] [--list|--restore] [--snapshot N] [--keep N] [--dry-run]\"\n      echo \"Options:\"\n      echo \"  --project-dir PATH   Path to the project (default: current dir)\"\n      echo \"  --output-dir PATH    Where to store backups (default: ../backups/)\"\n      echo \"  --list               List all snapshots for this project\"\n      echo \"  --restore            Restore latest snapshot\"\n      echo \"  --snapshot N         Restore specific snapshot number\"\n      echo \"  --keep N             Number of snapshots to retain (default: 5)\"\n      echo \"  --dry-run            Preview restore without making changes\"\n      echo \"\"\n      echo \"Examples:\"\n      echo \"  $0 my-app --project-dir /path/to/app\"\n      echo \"  $0 my-app --list\"\n      echo \"  $0 my-app --restore\"\n      echo \"  $0 my-app --restore --snapshot 2\"\n      echo \"  $0 my-app --restore --dry-run\"\n      exit 0\n      ;;\n    *) echo \"Unknown arg: $1\"; exit 1 ;;\n  esac\ndone\n\n# Resolve to absolute paths\nPROJECT_DIR=\"$(cd \"$PROJECT_DIR\" && pwd)\"\nOUTPUT_DIR=\"$(mkdir -p \"$OUTPUT_DIR\" && cd \"$OUTPUT_DIR\" && pwd)\"\n\n# --- LIST MODE ---\nif [[ \"$ACTION\" == \"list\" ]]; then\n  echo \"==> Snapshots for '${PROJECT_NAME}':\"\n  echo \"\"\n  COUNT=0\n  for dir in \"$OUTPUT_DIR\"/${PREFIX}-* 2>/dev/null; do\n    if [[ -d \"$dir\" ]]; then\n      COUNT=$((COUNT + 1))\n      NAME=$(basename \"$dir\")\n      SIZE=$(du -sh \"$dir\" 2>/dev/null | cut -f1 || echo \"?\")\n      DATE=$(stat -c %y \"$dir\" 2>/dev/null | cut -d. -f1 || echo \"?\")\n      # Check if it's the latest\n      LATEST=\"\"\n      if [[ -L \"$OUTPUT_DIR/.latest\" ]]; then\n        LATEST_TARGET=$(readlink \"$OUTPUT_DIR/.latest\")\n        if [[ \"$LATEST_TARGET\" == \"$NAME\" ]]; then\n          LATEST=\" (latest)\"\n        fi\n      fi\n      # Checksum if exists\n      CHECKSUM=\"\"\n      if [[ -f \"$dir/.checksum\" ]]; then\n        CHECKSUM=$(cut -d' ' -f1 \"$dir/.checksum\")\n        CHECKSUM=\" (sha256: ${CHECKSUM:0:12}...)\"\n      fi\n      printf \"  %-30s %6s  %s%s%s\\n\" \"$NAME\" \"$SIZE\" \"$DATE\" \"$LATEST\" \"$CHECKSUM\"\n    fi\n  done\n  if [[ $COUNT -eq 0 ]]; then\n    echo \"  (no snapshots found)\"\n  fi\n  echo \"\"\n  exit 0\nfi\n\n# --- RESTORE MODE ---\nif [[ \"$ACTION\" == \"restore\" ]]; then\n  # Determine which snapshot to restore\n  if [[ -n \"$SNAPSHOT_NUM\" ]]; then\n    TARGET=\"$OUTPUT_DIR/${PREFIX}-${SNAPSHOT_NUM}\"\n  else\n    # Use .latest symlink\n    LATEST=\"$OUTPUT_DIR/.latest\"\n    if [[ ! -L \"$LATEST\" ]]; then\n      echo \"Error: No .latest symlink found in $OUTPUT_DIR\"\n      exit 1\n    fi\n    TARGET=\"$OUTPUT_DIR/$(readlink \"$LATEST\")\"\n  fi\n\n  if [[ ! -d \"$TARGET\" ]]; then\n    echo \"Error: Snapshot not found: $TARGET\"\n      exit 1\n  fi\n\n  echo \"==> Restoring snapshot: $(basename \"$TARGET\")\"\n  echo \"    Source:  $TARGET\"\n  echo \"    Target:  $PROJECT_DIR\"\n\n  # Verify checksum integrity\n  if [[ -f \"$TARGET/.checksum\" ]]; then\n    STORED_CHECKSUM=$(cut -d' ' -f1 \"$TARGET/.checksum\")\n    CURRENT_CHECKSUM=$(find \"$TARGET\" -type f ! -name '.checksum' -exec sha256sum {} \\; 2>/dev/null | sort | sha256sum | cut -d' ' -f1)\n    if [[ \"$STORED_CHECKSUM\" == \"$CURRENT_CHECKSUM\" ]]; then\n      echo \"    Checksum: ✅ VERIFICATO (${STORED_CHECKSUM:0:16}...) — integrità OK\"\n    else\n      echo \"    Checksum: ⚠️ NON CORRESPONDE! (${STORED_CHECKSUM:0:16}... vs ${CURRENT_CHECKSUM:0:16}...)\"\n      echo \"    ATTENZIONE: Lo snapshot potrebbe essere stato modificato o corrotto!\"\n    fi\n  else\n    echo \"    Checksum: ℹ️ Nessun checksum disponibile per questo snapshot\"\n  fi\n\n  # DRY-RUN mode: show what would change without executing\n  if [[ \"$DRY_RUN\" == true ]]; then\n    echo \"\"\n    echo \"==> DRY-RUN: ecco cosa verrebbe sovrascritto:\"\n    if command -v rsync &>/dev/null; then\n      rsync -avn --exclude '.checksum' \"${TARGET}/\" \"${PROJECT_DIR}/\" 2>&1 | head -50\n    else\n      diff -rq --exclude='.checksum' \"${TARGET}/\" \"${PROJECT_DIR}/\" 2>&1 | head -50\n    fi\n    echo \"\"\n    echo \"==> Nessuna modifica è stata eseguita. Rimuovi --dry-run per confermare.\"\n    exit 0\n  fi\n\n  # WARNING: destructive operation\n  echo \"\"\n  echo \"⚠️ ATTENZIONE: Il restore sovrascriverà i file esistenti!\"\n  echo \"   Cambiamenti non salvati andranno persi.\"\n  echo \"\"\n\n  # Copy snapshot back to project dir\n  if command -v rsync &>/dev/null; then\n    rsync -a \\\n      --exclude '.checksum' \\\n      \"${TARGET}/\" \"${PROJECT_DIR}/\"\n  else\n    cp -a \"${TARGET}/.\" \"${PROJECT_DIR}/\"\n  fi\n\n  echo \"==> Restore complete!\"\n  echo \"    Restored: $(basename \"$TARGET\")\"\n  exit 0\nfi\n\n# --- BACKUP MODE ---\n# Find next number for THIS project\nNEXT=1\nif ls \"$OUTPUT_DIR/${PREFIX}-\"* 1>/dev/null 2>&1; then\n  HIGHEST=$(ls \"$OUTPUT_DIR\" | grep \"^${PROJECT_NAME}-snapshot-\" | sed \"s/^${PROJECT_NAME}-snapshot-//;s/-.*//\" | sort -rn | head -1)\n  if [[ \"$HIGHEST\" =~ ^[0-9]+$ ]]; then\n    NEXT=$((HIGHEST + 1))\n  fi\nfi\n\nSNAPSHOT_NAME=\"${PREFIX}-${NEXT}\"\nSNAPSHOT_DIR=\"${OUTPUT_DIR}/${SNAPSHOT_NAME}\"\n\necho \"==> Creating dev-backup: ${SNAPSHOT_NAME}\"\necho \"    Project: ${PROJECT_NAME}\"\necho \"    Source:  ${PROJECT_DIR}\"\necho \"    Target:  ${SNAPSHOT_DIR}\"\n\n# Copy with rsync (NO --delete to avoid accidental data loss)\nif command -v rsync &>/dev/null; then\n  rsync -a \\\n    --exclude '.git' --exclude 'node_modules' --exclude '.vite' \\\n    --exclude '.cache' --exclude '*.log' --exclude '.env' \\\n    --exclude 'backups' \\\n    \"${PROJECT_DIR}/\" \"${SNAPSHOT_DIR}/\"\nelse\n  mkdir -p \"$SNAPSHOT_DIR\"\n  tar -C \"$(dirname \"$PROJECT_DIR\")\" -cf - \"$(basename \"$PROJECT_DIR\")\" | tar -C \"$SNAPSHOT_DIR\" -xf -\nfi\n\n# Generate checksum for integrity verification\nfind \"$SNAPSHOT_DIR\" -type f ! -name '.checksum' -exec sha256sum {} \\; 2>/dev/null | sort | sha256sum > \"$SNAPSHOT_DIR/.checksum\"\n\n# Size report\nTOTAL_SIZE=$(du -sh \"$SNAPSHOT_DIR\" 2>/dev/null | cut -f1 || echo \"?\")\necho \"==> Snapshot created: ${SNAPSHOT_DIR} (${TOTAL_SIZE})\"\necho \"    SHA256: $(cut -d' ' -f1 \"$SNAPSHOT_DIR/.checksum\" | head -c 16)...\"\n\n# Update .latest symlink\nLATEST=\"${OUTPUT_DIR}/.latest\"\nrm -f \"$LATEST\"\nln -s \"$SNAPSHOT_NAME\" \"$LATEST\"\n\necho \"Done. Latest backup: ${LATEST}\"\n\n# --- RETENTION ---\n# Remove old snapshots beyond --keep limit\nSNAPSHOT_COUNT=$(ls -1d \"$OUTPUT_DIR/${PREFIX}-\"* 2>/dev/null | wc -l)\nif [[ $SNAPSHOT_COUNT -gt $KEEP ]]; then\n  REMOVE_COUNT=$((SNAPSHOT_COUNT - KEEP))\n  echo \"\"\n  echo \"⚠️ RETENTION: elimino definitivamente $REMOVE_COUNT snapshot vecchi (non recuperabili).\"\n  ls -1d \"$OUTPUT_DIR/${PREFIX}-\"* | sort -t'-' -k$(echo \"$PREFIX\" | tr -cd '-' | wc -c) -n | head -$REMOVE_COUNT | while read dir; do\n    echo \"    Removing: $(basename \"$dir\")\"\n    rm -rf \"$dir\"\n  done\n  echo \"==> Retention complete.\"\nfi\n\necho \"\"\necho \"To restore: $0 $PROJECT_NAME --restore\"\n\nFile v1.2.1:README.md\n\n# dev-backup\n\nCrea snapshot dei progetti in sviluppo per avere un punto di rollback sicuro.\n\n## A cosa serve\n\n- Backup prima di cambiamenti rischiosi o refactoring\n- Snapshot \"salva lo stato attuale\" del progetto\n- Ripristino rapido in caso di problemi\n- Ogni progetto ha la sua numerazione indipendente\n\n## Come funziona\n\nIl comando crea una copia completa del progetto in `backups/` con un nome progressivo:\n\n```\nmy-app-snapshot-1\nmy-app-snapshot-2\nanother-project-snapshot-1\nanother-project-snapshot-2\n```\n\nOgni progetto conta separatamente (my-app non influenza another-project).\n\nGli snapshot escludono: `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\nUn symlink `.latest` nella cartella backups punta sempre allo snapshot più recente.\n\n## Comandi per l'agente\n\nChiedi all'agente con frasi naturali:\n\n- **\"Fai un backup di [nome-progetto]\"** → l'agente esegue lo snapshot\n- **\"Salva lo stato attuale di [nome-progetto]\"** → stesso risultato\n- **\"Fai un backup dello sviluppo\"** → l'agente identifica il progetto attivo\n- **\"Ripristina il backup di [nome-progetto]\"** → l'agente copia lo snapshot\n\n## Comandi manuali\n\n### Creare un backup\n\n```bash\n# Sintassi:\nbash <percorso-skill>/dev-backup.sh <nome-progetto> --project-dir <percorso-app>\n\n# Esempio con un progetto generico:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --project-dir /home/user/projects/my-app\n\n# Esempio con un altro progetto:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh another-project --project-dir /home/user/projects/another-project\n```\n\n### Ripristinare un backup\n\n```bash\n# Dallo snapshot specifico:\ncp -r <backups-dir>/<nome-progetto>-snapshot-2/ <percorso-app>/\n\n# O dallo snapshot più recente (.latest):\ncp -r <backups-dir>/.latest/ <percorso-app>/\n```\n\n### Verificare gli snapshot\n\n```bash\nls -la <backups-dir>/\n```\n\n## Struttura\n\n```\nskills/dev-backup/\n├── SKILL.md          # Istruzioni per OpenClaw\n├── README.md         # Questo file\n└── scripts/\n    └── dev-backup.sh # Script di snapshot\n```\n\nFile v1.2.1:_meta.json\n\n{\n  \"ownerId\": \"kn7438bzbbzvnb37f1vmr6y141854jsa\",\n  \"slug\": \"dev-backup\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1783786670835\n}\n\nFile v1.2.1:skill-card.md\n\n## Description: <br>\nCreates named project snapshots for safe rollback, with listing, restore, retention, and checksum verification. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[vincsta](https://clawhub.ai/user/vincsta) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers use this skill to snapshot a named project before risky changes or refactoring, list available snapshots, and restore a project when rollback is needed. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Restore can overwrite or remove files in the target project. <br>\nMitigation: Use explicit project paths and run --dry-run before any real restore. <br>\nRisk: Retention can permanently delete older snapshots. <br>\nMitigation: Set --keep deliberately and confirm the snapshot list before relying on automatic retention. <br>\nRisk: Backups may include sensitive project files not covered by the exclusion list. <br>\nMitigation: Audit snapshot contents and output paths before sharing or retaining backups. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Page](https://clawhub.ai/vincsta/skills/dev-backup) <br>\n- [README](artifact/README.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Shell commands, Guidance, Text] <br>\n**Output Format:** [Markdown with inline bash commands and status text] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May create, list, restore, or delete local snapshot files depending on the selected command.] <br>\n\n## Skill Version(s): <br>\n1.2.1 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.2.0: 5 files, 9872 bytes\n\nFiles: README.md (2067b), scripts/dev-backup.sh (8593b), skill-card.md (2222b), SKILL.md (11812b), _meta.json (129b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: \"dev-backup\"\ndescription: \"Snapshot con restore verificato checksum, dry-run e warning sicurezza migliorati\"\n---\n\n# dev-backup\n\nSnapshot the current state of a named project for safe rollback.\n\n## Usage (Agent Triggers)\n\nChiama la skill SOLO con comandi espliciti di backup/restore — mai come risposta a frasi ordinarie:\n\n**Trigger validi:**\n- `\"Fai un backup manuale di [nome-progetto]\"` → crea snapshot\n- `\"Esegui backup di [nome-progetto]\"` → crea snapshot\n- `\"Ripristina il backup N di [nome-progetto]\"` → restore da snapshot specifico\n- `\"Mostra i backup di [nome-progetto]\"` → lista snapshots\n\n**NON triggerare con:**\n- Frasi come \"come va lo sviluppo?\", \"com'è il progetto?\", \"stai lavorando a...\"\n- Contesti casuali dove \"backup\" appare come parola nella conversazione\n- Qualsiasi frase che non sia un comando esplicito di backup/restore\n\n## Explicit Command Usage\n\n```bash\n# Backup any project\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nbash \"$SCRIPT_DIR/dev-backup.sh\" <project-name> --project-dir /path/to/your/project\n\n# Example: backup a \"my-app\" project\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --project-dir /home/user/projects/my-app\n\n# No --project-dir? Uses the current working directory\ncd /home/user/projects/my-app\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app\n```\n\n## Naming\n\nSnapshots are named per project:\n\n- **my-app-snapshot-1**, **my-app-snapshot-2**, …\n- **another-project-snapshot-1**, **another-project-snapshot-2**, …\n\nEach project tracks its own counter independently.\n\n## Excluded from snapshot\n\n- `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\n## Restore (⚠️ DISTRUTTIVO)\n\n> **ATTENZIONE:** Il restore sovrascrive i file esistenti nel progetto target. I cambiamenti non salvati andranno persi. Usa sempre `--dry-run` per verificare prima.\n\n```bash\n# Dry-run: mostra cosa verrebbe sovrascritto (NON esegue)\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --dry-run --project-dir /path/to/your/project\n\n# Restore latest snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /path/to/your/project\n\n# Restore specific snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --snapshot 2 --project-dir /path/to/your/project\n```\n\n**Verifica del checksum:** Il restore verifica automaticamente l'integrità dello snapshot confrontando il checksum SHA256 salvato con lo stato attuale dei file. Se i file sono stati modificati, viene stampato un avviso.\n\n## List\n\nTo list all snapshots for a project:\n\n```bash\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --list\n```\n\n## Retention\n\nBy default, only the last 5 snapshots per project are kept. **Vecchi snapshot vengono eliminati definitivamente senza conferma.** Per cambiare:\n\n```bash\n# Backup con retention personalizzata (tieni ultimi 10)\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --keep 10 --project-dir /path/to/your/project\n\n# Oppure disabilita la retention automatica con un numero enorme\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --keep 9999 --project-dir /path/to/your/project\n```\n\n## Verification\n\nAfter backup, confirm:\n\n```bash\nls -la <backups-dir>/\n```\n\nYou should see the project-prefixed snapshot and `.latest` symlink.\n\n---\n\nscripts/dev-backup.sh ---\n#!/usr/bin/env bash\nset -euo pipefail\n\n# dev-backup: snapshot a named project for safe rollback\n# Usage: dev-backup <project-name> [options]\n#\n# Creates a numbered snapshot of a project, prefixed with the project name\n# so you can distinguish backups across different apps.\n#\n# Examples:\n#   dev-backup my-app                     # uses current dir as project dir\n#   dev-backup my-app --project-dir /path # explicit project dir\n#   dev-backup my-app --list              # list all snapshots\n#   dev-backup my-app --restore           # restore latest snapshot\n#   dev-backup my-app --restore --snapshot 2  # restore specific snapshot\n#   dev-backup my-app --dry-run           # dry run restore (show what would change)\n#\n# Snapshots are named: <project>-snapshot-1, <project>-snapshot-2, …\n# A .latest symlink always points to the newest snapshot.\n# Default retention: 5 snapshots per project (use --keep to change).\n\n# Project name is mandatory\nif [[ $# -lt 1 ]]; then\n  echo \"Usage: $0 <project-name> [--project-dir PATH] [--output-dir PATH] [--list|--restore] [--snapshot N] [--keep N] [--dry-run]\"\n  echo \"Example: $0 my-app --project-dir /home/user/projects/my-app\"\n  exit 1\nfi\n\nPROJECT_NAME=\"$1\"\nshift\n\n# Sanitize project name: replace spaces and special chars with hyphens\nPROJECT_NAME=\"$(echo \"$PROJECT_NAME\" | sed 's/[^a-zA-Z0-9_-]/-/g')\"\n\nPROJECT_DIR=\"${PROJECT_DIR:-.}\"\nOUTPUT_DIR=\"${OUTPUT_DIR:-$(dirname \"$PROJECT_DIR\")/backups}\"\nPREFIX=\"${PROJECT_NAME}-snapshot\"\nKEEP=5\nACTION=\"backup\"\nSNAPSHOT_NUM=\"\"\nDRY_RUN=false\n\n# Parse args\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --project-dir) PROJECT_DIR=\"$2\"; shift 2 ;;\n    --output-dir)  OUTPUT_DIR=\"$2\";     shift 2 ;;\n    --list) ACTION=\"list\"; shift ;;\n    --restore) ACTION=\"restore\"; shift ;;\n    --snapshot) SNAPSHOT_NUM=\"$2\"; shift 2 ;;\n    --keep) KEEP=\"$2\"; shift 2 ;;\n    --dry-run) DRY_RUN=true; shift ;;\n    --help|-h)\n      echo \"Usage: $0 <project-name> [--project-dir PATH] [--output-dir PATH] [--list|--restore] [--snapshot N] [--keep N] [--dry-run]\"\n      echo \"Options:\"\n      echo \"  --project-dir PATH   Path to the project (default: current dir)\"\n      echo \"  --output-dir PATH    Where to store backups (default: ../backups/)\"\n      echo \"  --list               List all snapshots for this project\"\n      echo \"  --restore            Restore latest snapshot\"\n      echo \"  --snapshot N         Restore specific snapshot number\"\n      echo \"  --keep N             Number of snapshots to retain (default: 5)\"\n      echo \"  --dry-run            Preview restore without making changes\"\n      echo \"\"\n      echo \"Examples:\"\n      echo \"  $0 my-app --project-dir /path/to/app\"\n      echo \"  $0 my-app --list\"\n      echo \"  $0 my-app --restore\"\n      echo \"  $0 my-app --restore --snapshot 2\"\n      echo \"  $0 my-app --restore --dry-run\"\n      exit 0\n      ;;\n    *) echo \"Unknown arg: $1\"; exit 1 ;;\n  esac\ndone\n\n# Resolve to absolute paths\nPROJECT_DIR=\"$(cd \"$PROJECT_DIR\" && pwd)\"\nOUTPUT_DIR=\"$(mkdir -p \"$OUTPUT_DIR\" && cd \"$OUTPUT_DIR\" && pwd)\"\n\n# --- LIST MODE ---\nif [[ \"$ACTION\" == \"list\" ]]; then\n  echo \"==> Snapshots for '${PROJECT_NAME}':\"\n  echo \"\"\n  COUNT=0\n  for dir in \"$OUTPUT_DIR\"/${PREFIX}-* 2>/dev/null; do\n    if [[ -d \"$dir\" ]]; then\n      COUNT=$((COUNT + 1))\n      NAME=$(basename \"$dir\")\n      SIZE=$(du -sh \"$dir\" 2>/dev/null | cut -f1 || echo \"?\")\n      DATE=$(stat -c %y \"$dir\" 2>/dev/null | cut -d. -f1 || echo \"?\")\n      # Check if it's the latest\n      LATEST=\"\"\n      if [[ -L \"$OUTPUT_DIR/.latest\" ]]; then\n        LATEST_TARGET=$(readlink \"$OUTPUT_DIR/.latest\")\n        if [[ \"$LATEST_TARGET\" == \"$NAME\" ]]; then\n          LATEST=\" (latest)\"\n        fi\n      fi\n      # Checksum if exists\n      CHECKSUM=\"\"\n      if [[ -f \"$dir/.checksum\" ]]; then\n        CHECKSUM=$(cut -d' ' -f1 \"$dir/.checksum\")\n        CHECKSUM=\" (sha256: ${CHECKSUM:0:12}...)\"\n      fi\n      printf \"  %-30s %6s  %s%s%s\\n\" \"$NAME\" \"$SIZE\" \"$DATE\" \"$LATEST\" \"$CHECKSUM\"\n    fi\n  done\n  if [[ $COUNT -eq 0 ]]; then\n    echo \"  (no snapshots found)\"\n  fi\n  echo \"\"\n  exit 0\nfi\n\n# --- RESTORE MODE ---\nif [[ \"$ACTION\" == \"restore\" ]]; then\n  # Determine which snapshot to restore\n  if [[ -n \"$SNAPSHOT_NUM\" ]]; then\n    TARGET=\"$OUTPUT_DIR/${PREFIX}-${SNAPSHOT_NUM}\"\n  else\n    # Use .latest symlink\n    LATEST=\"$OUTPUT_DIR/.latest\"\n    if [[ ! -L \"$LATEST\" ]]; then\n      echo \"Error: No .latest symlink found in $OUTPUT_DIR\"\n      exit 1\n    fi\n    TARGET=\"$OUTPUT_DIR/$(readlink \"$LATEST\")\"\n  fi\n\n  if [[ ! -d \"$TARGET\" ]]; then\n    echo \"Error: Snapshot not found: $TARGET\"\n      exit 1\n  fi\n\n  echo \"==> Restoring snapshot: $(basename \"$TARGET\")\"\n  echo \"    Source:  $TARGET\"\n  echo \"    Target:  $PROJECT_DIR\"\n\n  # Verify checksum integrity\n  if [[ -f \"$TARGET/.checksum\" ]]; then\n    STORED_CHECKSUM=$(cut -d' ' -f1 \"$TARGET/.checksum\")\n    CURRENT_CHECKSUM=$(find \"$TARGET\" -type f ! -name '.checksum' -exec sha256sum {} \\; 2>/dev/null | sort | sha256sum | cut -d' ' -f1)\n    if [[ \"$STORED_CHECKSUM\" == \"$CURRENT_CHECKSUM\" ]]; then\n      echo \"    Checksum: ✅ VERIFICATO (${STORED_CHECKSUM:0:16}...) — integrità OK\"\n    else\n      echo \"    Checksum: ⚠️ NON CORRESPONDE! (${STORED_CHECKSUM:0:16}... vs ${CURRENT_CHECKSUM:0:16}...)\"\n      echo \"    ATTENZIONE: Lo snapshot potrebbe essere stato modificato o corrotto!\"\n    fi\n  else\n    echo \"    Checksum: ℹ️ Nessun checksum disponibile per questo snapshot\"\n  fi\n\n  # DRY-RUN mode: show what would change without executing\n  if [[ \"$DRY_RUN\" == true ]]; then\n    echo \"\"\n    echo \"==> DRY-RUN: ecco cosa verrebbe sovrascritto:\"\n    if command -v rsync &>/dev/null; then\n      rsync -avn --exclude '.checksum' \"${TARGET}/\" \"${PROJECT_DIR}/\" 2>&1 | head -50\n    else\n      diff -rq --exclude='.checksum' \"${TARGET}/\" \"${PROJECT_DIR}/\" 2>&1 | head -50\n    fi\n    echo \"\"\n    echo \"==> Nessuna modifica è stata eseguita. Rimuovi --dry-run per confermare.\"\n    exit 0\n  fi\n\n  # WARNING: destructive operation\n  echo \"\"\n  echo \"⚠️ ATTENZIONE: Il restore sovrascriverà i file esistenti!\"\n  echo \"   Cambiamenti non salvati andranno persi.\"\n  echo \"\"\n\n  # Copy snapshot back to project dir\n  if command -v rsync &>/dev/null; then\n    rsync -a \\\n      --exclude '.checksum' \\\n      \"${TARGET}/\" \"${PROJECT_DIR}/\"\n  else\n    cp -a \"${TARGET}/.\" \"${PROJECT_DIR}/\"\n  fi\n\n  echo \"==> Restore complete!\"\n  echo \"    Restored: $(basename \"$TARGET\")\"\n  exit 0\nfi\n\n# --- BACKUP MODE ---\n# Find next number for THIS project\nNEXT=1\nif ls \"$OUTPUT_DIR/${PREFIX}-\"* 1>/dev/null 2>&1; then\n  HIGHEST=$(ls \"$OUTPUT_DIR\" | grep \"^${PROJECT_NAME}-snapshot-\" | sed \"s/^${PROJECT_NAME}-snapshot-//;s/-.*//\" | sort -rn | head -1)\n  if [[ \"$HIGHEST\" =~ ^[0-9]+$ ]]; then\n    NEXT=$((HIGHEST + 1))\n  fi\nfi\n\nSNAPSHOT_NAME=\"${PREFIX}-${NEXT}\"\nSNAPSHOT_DIR=\"${OUTPUT_DIR}/${SNAPSHOT_NAME}\"\n\necho \"==> Creating dev-backup: ${SNAPSHOT_NAME}\"\necho \"    Project: ${PROJECT_NAME}\"\necho \"    Source:  ${PROJECT_DIR}\"\necho \"    Target:  ${SNAPSHOT_DIR}\"\n\n# Copy with rsync (NO --delete to avoid accidental data loss)\nif command -v rsync &>/dev/null; then\n  rsync -a \\\n    --exclude '.git' --exclude 'node_modules' --exclude '.vite' \\\n    --exclude '.cache' --exclude '*.log' --exclude '.env' \\\n    --exclude 'backups' \\\n    \"${PROJECT_DIR}/\" \"${SNAPSHOT_DIR}/\"\nelse\n  mkdir -p \"$SNAPSHOT_DIR\"\n  tar -C \"$(dirname \"$PROJECT_DIR\")\" -cf - \"$(basename \"$PROJECT_DIR\")\" | tar -C \"$SNAPSHOT_DIR\" -xf -\nfi\n\n# Generate checksum for integrity verification\nfind \"$SNAPSHOT_DIR\" -type f ! -name '.checksum' -exec sha256sum {} \\; 2>/dev/null | sort | sha256sum > \"$SNAPSHOT_DIR/.checksum\"\n\n# Size report\nTOTAL_SIZE=$(du -sh \"$SNAPSHOT_DIR\" 2>/dev/null | cut -f1 || echo \"?\")\necho \"==> Snapshot created: ${SNAPSHOT_DIR} (${TOTAL_SIZE})\"\necho \"    SHA256: $(cut -d' ' -f1 \"$SNAPSHOT_DIR/.checksum\" | head -c 16)...\"\n\n# Update .latest symlink\nLATEST=\"${OUTPUT_DIR}/.latest\"\nrm -f \"$LATEST\"\nln -s \"$SNAPSHOT_NAME\" \"$LATEST\"\n\necho \"Done. Latest backup: ${LATEST}\"\n\n# --- RETENTION ---\n# Remove old snapshots beyond --keep limit\nSNAPSHOT_COUNT=$(ls -1d \"$OUTPUT_DIR/${PREFIX}-\"* 2>/dev/null | wc -l)\nif [[ $SNAPSHOT_COUNT -gt $KEEP ]]; then\n  REMOVE_COUNT=$((SNAPSHOT_COUNT - KEEP))\n  echo \"\"\n  echo \"⚠️ RETENTION: elimino definitivamente $REMOVE_COUNT snapshot vecchi (non recuperabili).\"\n  ls -1d \"$OUTPUT_DIR/${PREFIX}-\"* | sort -t'-' -k$(echo \"$PREFIX\" | tr -cd '-' | wc -c) -n | head -$REMOVE_COUNT | while read dir; do\n    echo \"    Removing: $(basename \"$dir\")\"\n    rm -rf \"$dir\"\n  done\n  echo \"==> Retention complete.\"\nfi\n\necho \"\"\necho \"To restore: $0 $PROJECT_NAME --restore\"\n\nFile v1.2.0:README.md\n\n# dev-backup\n\nCrea snapshot dei progetti in sviluppo per avere un punto di rollback sicuro.\n\n## A cosa serve\n\n- Backup prima di cambiamenti rischiosi o refactoring\n- Snapshot \"salva lo stato attuale\" del progetto\n- Ripristino rapido in caso di problemi\n- Ogni progetto ha la sua numerazione indipendente\n\n## Come funziona\n\nIl comando crea una copia completa del progetto in `backups/` con un nome progressivo:\n\n```\nmy-app-snapshot-1\nmy-app-snapshot-2\nanother-project-snapshot-1\nanother-project-snapshot-2\n```\n\nOgni progetto conta separatamente (my-app non influenza another-project).\n\nGli snapshot escludono: `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\nUn symlink `.latest` nella cartella backups punta sempre allo snapshot più recente.\n\n## Comandi per l'agente\n\nChiedi all'agente con frasi naturali:\n\n- **\"Fai un backup di [nome-progetto]\"** → l'agente esegue lo snapshot\n- **\"Salva lo stato attuale di [nome-progetto]\"** → stesso risultato\n- **\"Fai un backup dello sviluppo\"** → l'agente identifica il progetto attivo\n- **\"Ripristina il backup di [nome-progetto]\"** → l'agente copia lo snapshot\n\n## Comandi manuali\n\n### Creare un backup\n\n```bash\n# Sintassi:\nbash <percorso-skill>/dev-backup.sh <nome-progetto> --project-dir <percorso-app>\n\n# Esempio con un progetto generico:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --project-dir /home/user/projects/my-app\n\n# Esempio con un altro progetto:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh another-project --project-dir /home/user/projects/another-project\n```\n\n### Ripristinare un backup\n\n```bash\n# Dallo snapshot specifico:\ncp -r <backups-dir>/<nome-progetto>-snapshot-2/ <percorso-app>/\n\n# O dallo snapshot più recente (.latest):\ncp -r <backups-dir>/.latest/ <percorso-app>/\n```\n\n### Verificare gli snapshot\n\n```bash\nls -la <backups-dir>/\n```\n\n## Struttura\n\n```\nskills/dev-backup/\n├── SKILL.md          # Istruzioni per OpenClaw\n├── README.md         # Questo file\n└── scripts/\n    └── dev-backup.sh # Script di snapshot\n```\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn7438bzbbzvnb37f1vmr6y141854jsa\",\n  \"slug\": \"dev-backup\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1783198891698\n}\n\nFile v1.2.0:skill-card.md\n\n## Description: <br>\nCreates local project snapshots for rollback, with dry-run restore previews, SHA256 checksum checks, and improved safety warnings. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[vincsta](https://clawhub.ai/user/vincsta) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and engineers use Dev Backup to create named snapshots of local project directories before risky changes and to list or restore those snapshots when rollback is needed. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Restore operations can overwrite files in the target project directory. <br>\nMitigation: Use explicit project and backup paths, run --list and --dry-run before restore, and confirm the target directory before executing a restore. <br>\nRisk: If rsync is unavailable, the fallback backup path may include files that the documentation says are excluded, including .env files. <br>\nMitigation: Prefer environments with rsync installed, inspect backup contents after creation, and treat backup directories as sensitive. <br>\nRisk: Retention removes older snapshots permanently when the configured keep limit is exceeded. <br>\nMitigation: Set --keep to a value appropriate for the project and verify retained snapshots before relying on automatic cleanup. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/vincsta/skills/dev-backup) <br>\n- [README](artifact/README.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, Shell commands, Files, Guidance] <br>\n**Output Format:** [Markdown guidance with bash commands and command-line output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May create, list, restore, and delete local snapshot directories through the bundled shell script.] <br>\n\n## Skill Version(s): <br>\n1.2.0 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.1.0: 5 files, 6035 bytes\n\nFiles: README.md (2067b), scripts/dev-backup.sh (7886b), skill-card.md (2279b), SKILL.md (1838b), _meta.json (129b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: \"dev-backup\"\ndescription: \"Snapshot progetti con retention, restore, list, checksum, e sicurezza migliorata\"\n---\n\n# dev-backup\n\nSnapshot the current state of a named project for safe rollback.\n\n## Usage\n\nEach project gets its own snapshot numbering. The project name is always the first argument.\n\n```bash\n# Backup any project\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nbash \"$SCRIPT_DIR/dev-backup.sh\" <project-name> --project-dir /path/to/your/project\n\n# Example: backup a \"my-app\" project\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --project-dir /home/user/projects/my-app\n\n# No --project-dir? Uses the current working directory\ncd /home/user/projects/my-app\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app\n```\n\n## Naming\n\nSnapshots are named per project:\n\n- **my-app-snapshot-1**, **my-app-snapshot-2**, …\n- **another-project-snapshot-1**, **another-project-snapshot-2**, …\n\nEach project tracks its own counter independently.\n\n## Excluded from snapshot\n\n- `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\n## Restore\n\nTo restore a snapshot:\n\n```bash\n# Restore latest snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /path/to/your/project\n\n# Restore specific snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --snapshot 2 --project-dir /path/to/your/project\n```\n\nOr use the `.latest` symlink:\n\n```bash\ncp -r <backups-dir>/.latest/ <your-project-dir>/\n```\n\n## List\n\nTo list all snapshots for a project:\n\n```bash\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --list\n```\n\n## Retention\n\nBy default, only the last 5 snapshots per project are kept. Customize with:\n\n```bash\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --keep 10\n```\n\n## Verification\n\nAfter backup, confirm:\n\n```bash\nls -la <backups-dir>/\n```\n\nYou should see the project-prefixed snapshot and `.latest` symlink.\n\nFile v1.1.0:README.md\n\n# dev-backup\n\nCrea snapshot dei progetti in sviluppo per avere un punto di rollback sicuro.\n\n## A cosa serve\n\n- Backup prima di cambiamenti rischiosi o refactoring\n- Snapshot \"salva lo stato attuale\" del progetto\n- Ripristino rapido in caso di problemi\n- Ogni progetto ha la sua numerazione indipendente\n\n## Come funziona\n\nIl comando crea una copia completa del progetto in `backups/` con un nome progressivo:\n\n```\nmy-app-snapshot-1\nmy-app-snapshot-2\nanother-project-snapshot-1\nanother-project-snapshot-2\n```\n\nOgni progetto conta separatamente (my-app non influenza another-project).\n\nGli snapshot escludono: `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\nUn symlink `.latest` nella cartella backups punta sempre allo snapshot più recente.\n\n## Comandi per l'agente\n\nChiedi all'agente con frasi naturali:\n\n- **\"Fai un backup di [nome-progetto]\"** → l'agente esegue lo snapshot\n- **\"Salva lo stato attuale di [nome-progetto]\"** → stesso risultato\n- **\"Fai un backup dello sviluppo\"** → l'agente identifica il progetto attivo\n- **\"Ripristina il backup di [nome-progetto]\"** → l'agente copia lo snapshot\n\n## Comandi manuali\n\n### Creare un backup\n\n```bash\n# Sintassi:\nbash <percorso-skill>/dev-backup.sh <nome-progetto> --project-dir <percorso-app>\n\n# Esempio con un progetto generico:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --project-dir /home/user/projects/my-app\n\n# Esempio con un altro progetto:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh another-project --project-dir /home/user/projects/another-project\n```\n\n### Ripristinare un backup\n\n```bash\n# Dallo snapshot specifico:\ncp -r <backups-dir>/<nome-progetto>-snapshot-2/ <percorso-app>/\n\n# O dallo snapshot più recente (.latest):\ncp -r <backups-dir>/.latest/ <percorso-app>/\n```\n\n### Verificare gli snapshot\n\n```bash\nls -la <backups-dir>/\n```\n\n## Struttura\n\n```\nskills/dev-backup/\n├── SKILL.md          # Istruzioni per OpenClaw\n├── README.md         # Questo file\n└── scripts/\n    └── dev-backup.sh # Script di snapshot\n```\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7438bzbbzvnb37f1vmr6y141854jsa\",\n  \"slug\": \"dev-backup\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1781289878622\n}\n\nFile v1.1.0:skill-card.md\n\n## Description: <br>\nCreates local project snapshots with retention, restore, list, checksums, and safer backup behavior. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[vincsta](https://clawhub.ai/user/vincsta) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use this skill to create, list, and restore local snapshots of development projects before risky changes or refactoring. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Restore can overwrite files in the target project. <br>\nMitigation: Inspect the selected snapshot first and restore only when overwriting the target project is acceptable. <br>\nRisk: Retention can delete older snapshots. <br>\nMitigation: Set an explicit --keep value and use --list before backup operations when older snapshots must be preserved. <br>\nRisk: The fallback copy path may include files that documentation says are excluded, including .env. <br>\nMitigation: Prefer systems with rsync available, set explicit project and output directories, and review snapshot contents before sharing or restoring. <br>\nRisk: Checksum output is informational and should not be treated as restore-time verification. <br>\nMitigation: Verify important restored files independently before relying on the restored project state. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/vincsta/dev-backup) <br>\n- [README.md](artifact/README.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Shell commands, Files, Configuration, Guidance] <br>\n**Output Format:** [Markdown guidance with bash commands and local filesystem snapshot output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Creates numbered project snapshots, maintains a .latest symlink, supports retention with --keep, and records SHA256 checksum summaries.] <br>\n\n## Skill Version(s): <br>\n1.1.0 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.1: 5 files, 4623 bytes\n\nFiles: README.md (2067b), scripts/dev-backup.sh (2790b), skill-card.md (2203b), SKILL.md (1646b), _meta.json (129b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: dev-backup\ndescription: Create snapshots of a workspace project during development. Use when: (1) user asks to backup the current app, (2) before risky changes/refactoring, (3) \"salva lo stato attuale\" or \"fai un backup dello sviluppo\", (4) any point where the project could be corrupted or lost. Automatically adds progressive numbering per project.\n---\n\n# dev-backup\n\nSnapshot the current state of a named project for safe rollback.\n\n## Usage\n\nEach project gets its own snapshot numbering. The project name is always the first argument.\n\n```bash\n# Backup any project\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nbash \"$SCRIPT_DIR/dev-backup.sh\" <project-name> --project-dir /path/to/your/project\n\n# Example: backup a \"my-app\" project\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --project-dir /home/user/projects/my-app\n\n# No --project-dir? Uses the current working directory\ncd /home/user/projects/my-app\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app\n```\n\n## Naming\n\nSnapshots are named per project:\n\n- **my-app-snapshot-1**, **my-app-snapshot-2**, …\n- **another-project-snapshot-1**, **another-project-snapshot-2**, …\n\nEach project tracks its own counter independently.\n\n## Excluded from snapshot\n\n- `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\n## Restore\n\nTo restore a snapshot:\n\n```bash\ncp -r <backups-dir>/<project-name>-snapshot-3/ <your-project-dir>/\n```\n\nOr use the `.latest` symlink:\n\n```bash\ncp -r <backups-dir>/.latest/ <your-project-dir>/\n```\n\n## Verification\n\nAfter backup, confirm:\n\n```bash\nls -la <backups-dir>/\n```\n\nYou should see the project-prefixed snapshot and `.latest` symlink.\n\nFile v1.0.1:README.md\n\n# dev-backup\n\nCrea snapshot dei progetti in sviluppo per avere un punto di rollback sicuro.\n\n## A cosa serve\n\n- Backup prima di cambiamenti rischiosi o refactoring\n- Snapshot \"salva lo stato attuale\" del progetto\n- Ripristino rapido in caso di problemi\n- Ogni progetto ha la sua numerazione indipendente\n\n## Come funziona\n\nIl comando crea una copia completa del progetto in `backups/` con un nome progressivo:\n\n```\nmy-app-snapshot-1\nmy-app-snapshot-2\nanother-project-snapshot-1\nanother-project-snapshot-2\n```\n\nOgni progetto conta separatamente (my-app non influenza another-project).\n\nGli snapshot escludono: `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\nUn symlink `.latest` nella cartella backups punta sempre allo snapshot più recente.\n\n## Comandi per l'agente\n\nChiedi all'agente con frasi naturali:\n\n- **\"Fai un backup di [nome-progetto]\"** → l'agente esegue lo snapshot\n- **\"Salva lo stato attuale di [nome-progetto]\"** → stesso risultato\n- **\"Fai un backup dello sviluppo\"** → l'agente identifica il progetto attivo\n- **\"Ripristina il backup di [nome-progetto]\"** → l'agente copia lo snapshot\n\n## Comandi manuali\n\n### Creare un backup\n\n```bash\n# Sintassi:\nbash <percorso-skill>/dev-backup.sh <nome-progetto> --project-dir <percorso-app>\n\n# Esempio con un progetto generico:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --project-dir /home/user/projects/my-app\n\n# Esempio con un altro progetto:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh another-project --project-dir /home/user/projects/another-project\n```\n\n### Ripristinare un backup\n\n```bash\n# Dallo snapshot specifico:\ncp -r <backups-dir>/<nome-progetto>-snapshot-2/ <percorso-app>/\n\n# O dallo snapshot più recente (.latest):\ncp -r <backups-dir>/.latest/ <percorso-app>/\n```\n\n### Verificare gli snapshot\n\n```bash\nls -la <backups-dir>/\n```\n\n## Struttura\n\n```\nskills/dev-backup/\n├── SKILL.md          # Istruzioni per OpenClaw\n├── README.md         # Questo file\n└── scripts/\n    └── dev-backup.sh # Script di snapshot\n```\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7438bzbbzvnb37f1vmr6y141854jsa\",\n  \"slug\": \"dev-backup\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1776616576689\n}\n\nFile v1.0.1:skill-card.md\n\n## Description: <br>\nCreate versioned snapshots of a workspace project during development to enable safe rollback before risky changes or upon user request. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[vincsta](https://clawhub.ai/user/vincsta) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use this skill to create numbered local snapshots of active project directories before risky edits and to restore from a selected snapshot when needed. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Backups may contain local project files that are sensitive or unnecessary for long-term retention. <br>\nMitigation: Confirm the project path and backup output directory before running the skill, and review snapshot contents before sharing or retaining them. <br>\nRisk: Restoring a snapshot directly over active work can overwrite newer changes. <br>\nMitigation: Restore into a separate review directory or create a fresh backup before copying files back into the active project. <br>\nRisk: The fallback copy path may not apply the same exclusions as rsync. <br>\nMitigation: Ensure rsync is available when relying on exclusions such as .env, .git, node_modules, and logs. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/vincsta/dev-backup) <br>\n- [Publisher profile](https://clawhub.ai/user/vincsta) <br>\n- [README.md](artifact/README.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, guidance] <br>\n**Output Format:** [Markdown instructions with bash command examples] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [The skill guides local filesystem snapshot creation and restore review using project and output directory paths.] <br>\n\n## Skill Version(s): <br>\n1.0.1 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.0: 4 files, 3459 bytes\n\nFiles: README.md (2395b), scripts/dev-backup.sh (2820b), SKILL.md (1880b), _meta.json (129b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: dev-backup\ndescription: Create snapshots of a workspace project during development. Use when: (1) user asks to backup the current app, (2) before risky changes/refactoring, (3) \"salva lo stato attuale\" or \"fai un backup dello sviluppo\", (4) any point where the project could be corrupted or lost. Automatically adds progressive numbering per project.\n---\n\n# dev-backup\n\nSnapshot the current state of a named project for safe rollback.\n\n## Usage\n\nEach project gets its own snapshot numbering. The project name is always the first argument.\n\n```bash\n# Backup the construction app\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nbash \"$SCRIPT_DIR/dev-backup.sh\" construction-app --project-dir /home/vincenzo/.openclaw/workspace/construction-app\n\n# Backup the accounting app\nbash \"$SCRIPT_DIR/dev-backup.sh\" accounting-app --project-dir /home/vincenzo/.openclaw/workspace/accounting-app\n\n# No --project-dir? Uses the current working directory\ncd /home/vincenzo/.openclaw/workspace/construction-app\nbash \"$SCRIPT_DIR/dev-backup.sh\" construction-app\n```\n\n## Naming\n\nSnapshots are named per project:\n\n- **construction-app-snapshot-1**, **construction-app-snapshot-2**, …\n- **accounting-app-snapshot-1**, **accounting-app-snapshot-2**, …\n\nEach project tracks its own counter independently.\n\n## Excluded from snapshot\n\n- `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\n## Restore\n\nTo restore a snapshot:\n\n```bash\ncp -r /home/vincenzo/.openclaw/workspace/backups/construction-app-snapshot-3/ /home/vincenzo/.openclaw/workspace/construction-app/\n```\n\nOr use the `.latest` symlink:\n\n```bash\ncp -r /home/vincenzo/.openclaw/workspace/backups/.latest/ <your-app-dir>/\n```\n\n## Verification\n\nAfter backup, confirm:\n\n```bash\nls -la /home/vincenzo/.openclaw/workspace/backups/\n```\n\nYou should see the project-prefixed snapshot and `.latest` symlink.\n\nFile v1.0.0:README.md\n\n# dev-backup\n\nCrea snapshot dei progetti in sviluppo per avere un punto di rollback sicuro.\n\n## A cosa serve\n\n- Backup prima di cambiamenti rischiosi o refactoring\n- Snapshot \"salva lo stato attuale\" del progetto\n- Ripristino rapido in caso di problemi\n- Ogni progetto ha la sua numerazione indipendente\n\n## Come funziona\n\nIl comando crea una copia completa del progetto in `backups/` con un nome progressivo:\n\n```\nconstruction-app-snapshot-1\nconstruction-app-snapshot-2\naccounting-app-snapshot-1\naccounting-app-snapshot-1\n```\n\nOgni progetto conta separatamente (construction-app non influenza accounting-app).\n\nGli snapshot escludono: `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\nUn symlink `.latest` nella cartella backups punta sempre allo snapshot più recente.\n\n## Comandi per l'agente\n\nChiedi all'agente con frasi naturali:\n\n- **\"Fai un backup della construction-app\"** → l'agente esegue lo snapshot\n- **\"Salva lo stato attuale di construction-app\"** → stesso risultato\n- **\"Fai un backup dello sviluppo\"** → l'agente identifica il progetto attivo\n- **\"Ripristina il backup di construction-app\"** → l'agente copia lo snapshot\n\n## Comandi manuali\n\n### Creare un backup\n\n```bash\n# Sintassi:\nbash /home/vincenzo/.openclaw/workspace/skills/dev-backup/scripts/dev-backup.sh <nome-progetto> --project-dir <percorso-app>\n\n# Esempio - Construction App:\nbash /home/vincenzo/.openclaw/workspace/skills/dev-backup/scripts/dev-backup.sh construction-app --project-dir /home/vincenzo/.openclaw/workspace/construction-app\n\n# Esempio - Accounting App:\nbash /home/vincenzo/.openclaw/workspace/skills/dev-backup/scripts/dev-backup.sh accounting-app --project-dir /home/vincenzo/.openclaw/workspace/accounting-app\n```\n\n### Ripristinare un backup\n\n```bash\n# Dallo snapshot specifico:\ncp -r /home/vincenzo/.openclaw/workspace/backups/construction-app-snapshot-2/ /home/vincenzo/.openclaw/workspace/construction-app/\n\n# O dallo snapshot più recente (.latest):\ncp -r /home/vincenzo/.openclaw/workspace/backups/.latest/ /home/vincenzo/.openclaw/workspace/construction-app/\n```\n\n### Verificare gli snapshot\n\n```bash\nls -la /home/vincenzo/.openclaw/workspace/backups/\n```\n\n## Struttura\n\n```\nskills/dev-backup/\n├── SKILL.md          # Istruzioni per OpenClaw\n├── README.md         # Questo file\n└── scripts/\n    └── dev-backup.sh # Script di snapshot\n```\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7438bzbbzvnb37f1vmr6y141854jsa\",\n  \"slug\": \"dev-backup\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776616047998\n}","readmeExcerpt":"Skill: Dev Backup Owner: vincsta Summary: Snapshot con restore distruttivo, trigger stretti e fallback tar sicuro (v1.2.2) Tags: latest:1.2.2 Version history: v1.2.2 | 2026-07-11T17:01:15.008Z | user Fix 4 SkillSpector findings: correct 'safe restore' description, tar fallback with exclusions, interactive confirmation gate, README triggers and warnings v1.2.1 | 2026-07-11T16:17:50.835Z | user Fix 3 SkillSpector findi","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# Backup any project\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nbash \"$SCRIPT_DIR/dev-backup.sh\" <project-name> --project-dir /path/to/your/project\n\n# Example: backup a \"my-app\" project\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --project-dir /home/user/projects/my-app\n\n# No --project-dir? Uses the current working directory\ncd /home/user/projects/my-app\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app"},{"language":"bash","snippet":"# 🔴 STEP 1: Dry-run OBBLIGATORIO (mostra cosa verrebbe sovrascritto)\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --dry-run --project-dir /path/to/your/project\n\n# 🔴 STEP 2: Solo se dry-run è accettabile, esegui il restore\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /path/to/your/project\n\n# Restore latest snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /path/to/your/project\n\n# Restore specific snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --snapshot 2 --project-dir /path/to/your/project"},{"language":"bash","snippet":"bash \"$SCRIPT_DIR/dev-backup.sh\" my-app --list"},{"language":"bash","snippet":"# Backup con retention personalizzata (tieni ultimi 10)\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --keep 10 --project-dir /path/to/your/project\n\n# Oppure disabilita la retention automatica con un numero enorme\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --keep 9999 --project-dir /path/to/your/project"},{"language":"bash","snippet":"ls -la <backups-dir>/"},{"language":"text","snippet":"my-app-snapshot-1\nmy-app-snapshot-2\nanother-project-snapshot-1\nanother-project-snapshot-2"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: \"dev-backup\"\ndescription: \"Snapshot con restore distruttivo, trigger stretti e fallback tar sicuro (v1.2.2)\"\n---\n\n# dev-backup\n\nSnapshot the current state of a named project for safe rollback.\n\n## Explicit Command Usage\n\n⚠️ **REGOLA CRITICA:** Chiama la skill SOLO quando l'utente emette un comando esplicito di backup o restore. Non attivare mai per frasi generiche come \"com'è il progetto?\", \"stai lavorando a...\", o quando \"backup\" appare casualmente nella conversazione.\n\n**Trigger validi (solo questi):**\n- `\"Fai un backup manuale di [nome-progetto]\"` → crea snapshot\n- `\"Esegui backup di [nome-progetto]\"` → crea snapshot\n- `\"Backup di [nome-progetto]\"` → crea snapshot\n- `\"Ripristina il backup N di [nome-progetto]\"` → restore da snapshot specifico (con conferma interattiva)\n- `\"Mostra i backup di [nome-progetto]\"` → lista snapshots\n\n**NON triggerare con:**\n- Frasi casuali dove \"backup\" appare come parola nella conversazione\n- `\"Salva lo stato attuale\"` (troppo ambiguo — non è un comando esplicito)\n- `\"Fai un backup dello sviluppo\"` (non specifica il progetto)\n- `\"Ripristina il backup di [nome-progetto]\"` senza numero snapshot (troppo vago, richiede \"backup N\")\n- Qualsiasi frase che non contenga un comando chiaro di backup/restore + nome progetto\n- **Il restore richiede SEMPRE conferma esplicita dell'utente PRIMA di eseguire**\n\n## Comandi\n\n```bash\n# Backup any project\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nbash \"$SCRIPT_DIR/dev-backup.sh\" <project-name> --project-dir /path/to/your/project\n\n# Example: backup a \"my-app\" project\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --project-dir /home/user/projects/my-app\n\n# No --project-dir? Uses the current working directory\ncd /home/user/projects/my-app\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app\n```\n\n## Naming\n\nSnapshots are named per project:\n\n- **my-app-snapshot-1**, **my-app-snapshot-2**, …\n- **another-project-snapshot-1**, **another-project-snapshot-2**, …\n\nEach project tracks its own counter independently.\n\n## Excluded from snapshot\n\n- `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\n## Restore (🔴 DISTRUTTIVO — LEGGERE PRIMA)\n\n> **⛔ PERICOLO: QUESTA OPERAZIONE È DISTRUTTIVA.**\n>\n> Il restore **sovrascrive TUTTI i file esistenti** nel progetto target con lo stato dello snapshot.\n> - Qualsiasi modifica non salvata nel progetto verrà **PERDUTA DEFINITIVAMENTE**.\n> - File nuovi creati dopo l'ultimo backup verranno eliminati.\n> - File modificati localmente verranno sovrascritti senza preavviso.\n>\n> **SEMPRE eseguire `--dry-run` PRIMA del restore reale.**\n\n```bash\n# 🔴 STEP 1: Dry-run OBBLIGATORIO (mostra cosa verrebbe sovrascritto)\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --dry-run --project-dir /path/to/your/project\n\n# 🔴 STEP 2: Solo se dry-run è accettabile, esegui il restore\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /path/to/your/project\n\n# Restore latest snapshot\nbash \"$SCRIPT_DIR/dev-backup.sh\" my-app --restore --project-dir /"},{"path":"README.md","content":"# dev-backup\n\nCrea snapshot dei progetti in sviluppo per avere un punto di rollback.\n\n## ⚠️ AVVERTENZE IMPORTANTI\n\n- **Il restore è DISTRUTTIVO**: sovrascrive i file esistenti nel progetto target senza preavviso.\n- **Prima del restore, esegui SEMPRE `--dry-run`** per verificare cosa verrà modificato.\n- Gli snapshot vecchi vengono eliminati dalla retention senza conferma aggiuntiva.\n\n## A cosa serve\n\n- Backup prima di cambiamenti rischiosi o refactoring\n- Snapshot dello stato attuale del progetto (solo con comando esplicito)\n- Ripristino rapido in caso di problemi (con conferma esplicita)\n- Ogni progetto ha la sua numerazione indipendente\n\n## Come funziona\n\nIl comando crea una copia completa del progetto in `backups/` con un nome progressivo:\n\n```\nmy-app-snapshot-1\nmy-app-snapshot-2\nanother-project-snapshot-1\nanother-project-snapshot-2\n```\n\nOgni progetto conta separatamente (my-app non influenza another-project).\n\nGli snapshot escludono: `.git`, `node_modules`, `.vite`, `.cache`, `*.log`, `.env`, `backups/`\n\nUn symlink `.latest` nella cartella backups punta sempre allo snapshot più recente.\n\n## Comandi per l'agente\n\n⚠️ **ATTIVAZIONE SOLO CON COMANDI ESPPLICITI.** Non attivare per frasi casuali dove \"backup\" appare nella conversazione.\n\n**Trigger validi (solo questi):**\n- **\"Fai un backup manuale di [nome-progetto]\"** → crea snapshot\n- **\"Esegui backup di [nome-progetto]\"** → crea snapshot\n- **\"Backup di [nome-progetto]\"** → crea snapshot\n\n**NON attivare con:**\n- `\"Salva lo stato attuale\"` (troppo ambiguo)\n- `\"Fai un backup dello sviluppo\"` (non specifica il progetto)\n- Frasi dove \"backup\" appare casualmente nella conversazione\n\n## Comandi manuali\n\n### Creare un backup\n\n```bash\n# Sintassi:\nbash <percorso-skill>/dev-backup.sh <nome-progetto> --project-dir <percorso-app>\n\n# Esempio con un progetto generico:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --project-dir /home/user/projects/my-app\n\n# Esempio con un altro progetto:\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh another-project --project-dir /home/user/projects/another-project\n```\n\n### Ripristinare un backup (🔴 DISTRUTTIVO)\n\n> **⛔ ATTENZIONE:** Il restore sovrascrive TUTTI i file nel progetto target.\n> Qualsiasi modifica non salvata verrà **PERDUTA DEFINITIVAMENTE**.\n\n**STEP 1 — Dry-run OBBLIGATORIO:** Verifica cosa verrà sovrascritto senza eseguire:\n\n```bash\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --restore --dry-run --project-dir /home/user/projects/my-app\n```\n\n**STEP 2 — Eseguire il restore (solo dopo aver verificato con dry-run):**\n\n```bash\nbash /path/to/skills/dev-backup/scripts/dev-backup.sh my-app --restore --project-dir /home/user/projects/my-app\n```\n\n> **Non usare `cp -r` direttamente per il restore.** Usa sempre lo script che gestisce la conferma interattiva e l'integrità dello snapshot.\n\n### Verificare gli snapshot\n\n```bash\nls -la <backups-dir>/\n```\n\n## Struttura\n\n```\nskills/dev-backup/\n├── SKILL.md          # Istruzioni per OpenClaw\n├─"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7438bzbbzvnb37f1vmr6y141854jsa\",\n  \"slug\": \"dev-backup\",\n  \"version\": \"1.2.2\",\n  \"publishedAt\": 1783789275008\n}"},{"path":"skill-card.md","content":"## Description:\n\nDev Backup creates named project snapshots for rollback and provides explicit backup, list, and destructive restore commands.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[vincsta](https://clawhub.ai/user/vincsta)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and engineers use Dev Backup to create rollback snapshots before risky changes or refactoring, list existing snapshots, and restore a selected project snapshot after an explicit request.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Restore operations can overwrite local project files and may not remove files created after a snapshot.\n\nMitigation: Run restore only on trusted project paths, preview with --dry-run first, and keep an independent copy of important unsaved work before confirming restore.\n\nRisk: Backups and restores read and write whole project directories.\n\nMitigation: Limit use to intended development project directories and review the target project and output paths before running commands.\n\nRisk: Snapshots with missing or mismatched checksums may be corrupted or altered.\n\nMitigation: Avoid restoring snapshots when checksum verification is missing or reports a mismatch unless the project owner has manually inspected the snapshot.\n\nRisk: The tar fallback and local shell execution path can carry file-safety and command-execution risk.\n\nMitigation: Prefer environments with rsync available, inspect commands before execution, and use the skill only from trusted releases.\n\n## Reference(s):\n\n- [Dev Backup README](artifact/README.md)\n- [ClawHub Dev Backup release page](https://clawhub.ai/vincsta/skills/dev-backup)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Files]\n\n**Output Format:** [Markdown guidance with bash commands and local snapshot directories]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates project snapshot directories, maintains a .latest symlink, and reports checksum status for snapshots.]\n\n## Skill Version(s):\n\n1.2.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Snapshot con restore distruttivo, trigger stretti e fallback tar sicuro (v1.2.2) Skill: Dev Backup Owner: vincsta Summary: Snapshot con restore distruttivo, trigger stretti e fallback tar sicuro (v1.2.2) Tags: latest:1.2.2 Version history: v1.2.2 | 2026-07-11T17:01:15.008Z | user Fix 4 SkillSpector findings: correct 'safe restore' description, tar fallback with exclusions, interactive confirmation gate, README triggers and warnings v1.2.1 | 2026-07-11T16:17:50.835Z | user Fix 3 SkillSpector findi","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1275,"uniquenessScore":51,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T05:50:49.367Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T05:50:49.367Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T10:42:15.144Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}