{"id":"b4db3bfe-f628-478d-8766-68629609dd7c","entityType":"agent","slug":"clawhub-cloudcode-hans-delete-recovery","name":"delete-recovery","canonicalUrl":"https://www.xpersona.co/agent/clawhub-cloudcode-hans-delete-recovery","canonicalPath":"/agent/clawhub-cloudcode-hans-delete-recovery","generatedAt":"2026-10-10T10:42:25.310Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:14:04.519Z","emptyReason":null},"description":"Automatically backs up files before deletion to timestamped folders, allows restoring deleted files, lists backups, and cleans expired backups and logs.","descriptionLabel":"Source description","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 s176p0fdnm9khs6p3rx9vvyds583j95x:delete-recovery","sourceUrl":"https://clawhub.ai/cloudcode-hans/delete-recovery","homepage":"https://clawhub.ai/cloudcode-hans/skills/delete-recovery","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/cloudcode-hans/delete-recovery","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/cloudcode-hans/skills/delete-recovery","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":49,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"delete-recovery technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:14:04.519Z","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-10T08:14:04.519Z","emptyReason":null},"stars":null,"forks":null,"downloads":1565,"packageName":null,"latestVersion":"0.11.1","tractionLabel":"1.6K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:14:04.519Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T08:14:04.519Z","lastCrawledAt":"2026-10-10T08:14:04.519Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T08:14:04.519Z","lastVerifiedAt":null,"highlights":[{"version":"0.11.1","createdAt":"2026-05-28T08:50:19.341Z","changelog":"No code changes in this release. - No files were modified for version 0.11.1. - Behavior and features remain the same as v0.11.0.","fileCount":6,"zipByteSize":37551},{"version":"0.11.0","createdAt":"2026-05-28T07:52:21.214Z","changelog":"delete-recovery v0.11.0 - Security audit fixes: clarified and enforced that `--force` bypasses only SHA256 existence checks (never correctness/path checks). - Default `allowed_roots` now strictly confines restores to the workspace root; unrestricted restores require explicit opt-out. - `full_restore_check()` now properly validates `dest_path` for path traversal and workspace confinement. - `confirm-first-run` for workspace_cleaner now requires token confirmation after a dry-run, preventing unauthorized cleanup enablement. - Only precise trigger phrases (e.g., `workspace_cleaner`) will initiate deletion or cleanup actions; broad housekeeping triggers have been removed. - No functional code changes; documentation updated to reflect all above points.","fileCount":6,"zipByteSize":37266},{"version":"0.10.0","createdAt":"2026-05-28T07:12:13.159Z","changelog":"delete-recovery v0.10.0 - No code or documentation changes in this version. - Behavior, features, and security guarantees remain exactly as in prior release (v0.8.1). - No impact for users or integrators.","fileCount":6,"zipByteSize":36447},{"version":"0.8.5","createdAt":"2026-05-28T06:18:15.077Z","changelog":"delete-recovery v0.8.5 - Added Python bytecode cache files for scripts (under scripts/__pycache__) - Removed skill-card.md documentation file - No major feature or logic changes; incremental internal update","fileCount":6,"zipByteSize":36029},{"version":"0.8.4","createdAt":"2026-05-22T05:15:59.819Z","changelog":"**v0.8.4 is a metadata-only release; no code changes.** - No file changes; functionality remains identical to the previous version. - Skill description and changelog remain unchanged from v0.8.1.","fileCount":6,"zipByteSize":42608},{"version":"0.8.3","createdAt":"2026-04-02T09:35:28.808Z","changelog":"Version 0.8.3 of delete-recovery - No code or documentation changes detected in this release. - Maintains all features, security constraints, and commands as described in v0.8.0. - No impact on user triggers, agent permissions, or behavior.","fileCount":5,"zipByteSize":38524},{"version":"0.8.1","createdAt":"2026-04-02T09:23:23.853Z","changelog":"No changes since v0.8.0. - Version 0.8.1 was released with no file or documentation changes. - Behavior and features remain identical to v0.8.0.","fileCount":5,"zipByteSize":38521},{"version":"0.8.0","createdAt":"2026-04-02T09:07:33.254Z","changelog":"v0.8.0 introduces workspace_cleaner: scheduled cleanup with auto-backup before deletion. - New script: workspace_cleaner.py for scheduled workspace file cleanup. - Automatically backs up files via delete_recovery before deleting temporary or expired files. - Supports manual and scheduled cleanup, whitelist configuration, and dry-run preview. - Workspace_cleaner data/config is stored outside the skill directory and survives skill uninstall. - Core delete_recovery features (backup, restore, manifest search, verification) are unchanged.","fileCount":5,"zipByteSize":38152}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s176p0fdnm9khs6p3rx9vvyds583j95x:delete-recovery","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s176p0fdnm9khs6p3rx9vvyds583j95x:delete-recovery` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/cloudcode-hans/delete-recovery before using production credentials."],"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-cloudcode-hans-delete-recovery/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cloudcode-hans-delete-recovery/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cloudcode-hans-delete-recovery/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cloudcode-hans-delete-recovery/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cloudcode-hans-delete-recovery/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cloudcode-hans-delete-recovery/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:25.306Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cloudcode-hans-delete-recovery/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cloudcode-hans-delete-recovery/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cloudcode-hans-delete-recovery/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cloudcode-hans-delete-recovery/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":"medium","updatedAt":"2026-10-10T08:14:04.519Z","emptyReason":null},"readme":"Skill: delete-recovery\n\nOwner: cloudcode-hans\n\nSummary: Automatically backs up files before deletion to timestamped folders, allows restoring deleted files, lists backups, and cleans expired backups and logs.\n\nTags: latest:0.11.1\n\nVersion history:\n\nv0.11.1 | 2026-05-28T08:50:19.341Z | user\n\nNo code changes in this release.\n\n- No files were modified for version 0.11.1.\n- Behavior and features remain the same as v0.11.0.\n\nv0.11.0 | 2026-05-28T07:52:21.214Z | user\n\ndelete-recovery v0.11.0\n\n- Security audit fixes: clarified and enforced that `--force` bypasses only SHA256 existence checks (never correctness/path checks).\n- Default `allowed_roots` now strictly confines restores to the workspace root; unrestricted restores require explicit opt-out.\n- `full_restore_check()` now properly validates `dest_path` for path traversal and workspace confinement.\n- `confirm-first-run` for workspace_cleaner now requires token confirmation after a dry-run, preventing unauthorized cleanup enablement.\n- Only precise trigger phrases (e.g., `workspace_cleaner`) will initiate deletion or cleanup actions; broad housekeeping triggers have been removed.\n- No functional code changes; documentation updated to reflect all above points.\n\nv0.10.0 | 2026-05-28T07:12:13.159Z | user\n\ndelete-recovery v0.10.0\n\n- No code or documentation changes in this version.\n- Behavior, features, and security guarantees remain exactly as in prior release (v0.8.1).\n- No impact for users or integrators.\n\nv0.8.5 | 2026-05-28T06:18:15.077Z | user\n\ndelete-recovery v0.8.5\n\n- Added Python bytecode cache files for scripts (under scripts/__pycache__)\n- Removed skill-card.md documentation file\n- No major feature or logic changes; incremental internal update\n\nv0.8.4 | 2026-05-22T05:15:59.819Z | user\n\n**v0.8.4 is a metadata-only release; no code changes.**\n\n- No file changes; functionality remains identical to the previous version.\n- Skill description and changelog remain unchanged from v0.8.1.\n\nv0.8.3 | 2026-04-02T09:35:28.808Z | user\n\nVersion 0.8.3 of delete-recovery\n\n- No code or documentation changes detected in this release.\n- Maintains all features, security constraints, and commands as described in v0.8.0.\n- No impact on user triggers, agent permissions, or behavior.\n\nv0.8.1 | 2026-04-02T09:23:23.853Z | user\n\nNo changes since v0.8.0.\n\n- Version 0.8.1 was released with no file or documentation changes.\n- Behavior and features remain identical to v0.8.0.\n\nv0.8.0 | 2026-04-02T09:07:33.254Z | user\n\nv0.8.0 introduces workspace_cleaner: scheduled cleanup with auto-backup before deletion.\n\n- New script: workspace_cleaner.py for scheduled workspace file cleanup.\n- Automatically backs up files via delete_recovery before deleting temporary or expired files.\n- Supports manual and scheduled cleanup, whitelist configuration, and dry-run preview.\n- Workspace_cleaner data/config is stored outside the skill directory and survives skill uninstall.\n- Core delete_recovery features (backup, restore, manifest search, verification) are unchanged.\n\nv0.7.1 | 2026-04-01T07:19:43.639Z | user\n\nVersion 0.7.1 of delete-recovery\n\n- No code or documentation changes detected in this version.\n- All features and behaviors remain unchanged from v0.7.0.\n\nv0.7.0 | 2026-04-01T07:13:29.100Z | user\n\ndelete-recovery v0.7.0\n\n- Restores are now confined to the workspace root by default; `allowed_roots` is set to workspace (stricter path confinement).\n- Manifest `path` fields are HMAC-SHA256 encrypted; original file paths are no longer readable in manifest.jsonl.\n- Security documentation updated to reflect new defaults and hardening.\n- No functional change to backup, restore, or search commands aside from new path security features.\n- Internal: Migration to new manifest encryption does not affect backup/restore usability for end users.\n\nv0.6.5 | 2026-04-01T06:37:37.767Z | user\n\nNo code or documentation changes in this version; version bump only.\n\nv0.6.4 | 2026-04-01T06:34:32.205Z | user\n\nNo changes detected in this version.\n\n- Version number updated to 0.6.4.\n- No file or documentation changes present in this release.\n\nv0.6.3 | 2026-03-30T10:48:06.981Z | user\n\nNo changes since v0.6.2.\n\n- No file changes detected in this version.\n\nv0.6.2 | 2026-03-30T10:44:38.675Z | user\n\nNo changes in code or logic for v0.6.2.\n\n- No file changes detected in this release.\n- Behavior and functionality are unchanged from the previous version.\n- Safe to upgrade with zero impact on workflows.\n\nv0.6.1 | 2026-03-30T10:39:05.175Z | user\n\n- Removed temporary test file `delete_backup/temp_existing/example.txt`.\n- Removed backup operation log file `log.txt`.\n- No functional changes; cleanup of sample and log files only.\n\nv0.6.0 | 2026-03-30T10:04:44.880Z | user\n\nv0.6.0 improves speed and efficiency with new time-based cleanup and incremental manifest operations.\n\n- Backup cleanup (7 days) and log cleanup (30 days) are now triggered by a timer (default: every 24 hours), not on every command.\n- Manifest index now uses incremental updates; compression and cleanup only occur as needed on restore or delete operations.\n- List, search, and log commands will auto-compress an oversized manifest file.\n- Overall command response speed is improved by 60–75%.\n- No change to user-facing features or security constraints.\n\nv0.5.3 | 2026-03-28T09:32:24.043Z | user\n\n## v0.5.3\n\n- No file changes detected in this release.\n- Behavior and features remain the same as previous version (v0.5.0).\n\nv0.5.2 | 2026-03-28T02:14:06.092Z | user\n\ndelete-recovery v0.5.2\n\n- No code or documentation changes detected from previous version.\n- Behavior, usage, and features remain unchanged.\n\nv0.5.1 | 2026-03-28T01:33:07.363Z | user\n\ndelete-recovery v0.5.1\n\n- Added fast search for deleted files via a new manifest.jsonl index; enables retrieval by filename, brief description (≤6 chars), or path keyword.\n- New search command allows quick lookup of backup location and restore command for deleted files.\n- Manifest index entries are removed automatically once restore is successful.\n- All backup, restore, listing, cleanup, and integrity verification functions remain, with strict security constraints.\n\nv0.5.0 | 2026-03-28T01:25:05.491Z | user\n\ndelete-recovery v0.5.0 introduces fast search for deleted backups\n\n- Added manifest.jsonl index for every backup, enabling rapid search of deleted files by filename, function description (≤6 chars), or path keyword.\n- New `search` command lets users instantly locate deleted files and get restore commands from backup index.\n- Backup and restore logic now automatically updates manifest: entries are added on backup, and removed after successfully restore.\n- Existing security and integrity checks for backup and restore remain fully enforced.\n\nv0.4.0 | 2026-03-27T03:30:15.010Z | user\n\ndelete-recovery v0.4.0\n\n- Updated all scripts, paths, and documentation references from v0.3.0 to v0.4.0.\n- No functional changes detected; command usage, triggers, and security constraints remain the same.\n- Documentation and sample command paths now reference the new version directory.\n- Ensures continued integrity, safety, and behavior as per strict agent constraints.\n\nv0.3.3 | 2026-03-27T02:01:42.848Z | user\n\n# delete-recovery v0.3.0\n\n### 中文\n\n文件删除安全网——备份、恢复、SHA256完整性校验、路径交叉验证、全自动清理。\n\n### English\n\nA safety net for file deletion — backup, recovery, SHA256 integrity verification, path cross-validation, and fully automatic cleanup.\n\n---\n\n### 中文\n\n一款轻量的 OpenClaw skill，在删除文件前自动将其备份到带时间戳的文件夹。**v0.3.0 新增 SHA256 强制校验 + PATH 交叉验证**，修复了 v0.2.0 中 SHA256 可被绕过的安全漏洞，防止恶意文件注入攻击。误删后一键恢复，过期备份和日志全自动清理，无需人工干预。\n\n### English\n\nA lightweight OpenClaw skill that automatically backs up files to timestamped folders before deletion. **v0.3.0 adds mandatory SHA256 integrity checks and PATH cross-validation**, fixing a security bypass vulnerability in v0.2.0 and preventing malicious file injection attacks. Recover accidentally deleted files with one click, and expired backups and logs are automatically cleaned up without manual intervention.\n\n---\n\n## 功能特性 / Features\n\n### 中文\n\n- **删除前自动备份** — 删除任何文件前，自动备份到带时间戳的文件夹\n- **SHA256 强制校验（v0.3.0 修复）** — 备份时计算哈希，恢复时验证；SHA256 记录缺失或为空时 restore 默认阻止（无法再通过删除文件绕过）\n- **PATH 交叉验证（v0.3.0 新增）** — `.sha256` 文件中绑定原始路径，恢复时双向交叉验证，彻底防止 `.path` 文件被篡改定向到任意位置\n- **路径遍历防护** — 检测 `../` 逃逸序列，拒绝恢复目标超出合法范围\n- **一键恢复** — 将误删文件恢复到原始位置\n- **多文件安全处理** — 同一备份文件夹含多文件时，须全部恢复完毕才删除备份\n- **自动清理** — 备份7天后自动删除，日志30天后自动删除，完全自动化\n- **冲突保护恢复** — 恢复时若目标位置已有文件，自动移到 `temp_existing/` 暂存\n- **完整操作日志** — 每次备份、恢复、清理、安全拦截操作均有记录（含 SECURITY 级别）\n- **`--force` 恢复旧备份（v0.3.0 新增）** — 对 v0.3.0 之前创建的旧备份（无 SHA256 记录），可用 `--force` 强制恢复（路径验证仍生效）\n\n### English\n\n- **Automatic backup before deletion** — Automatically backs up any file to a timestamped folder before deletion\n- **Mandatory SHA256 integrity check (v0.3.0 fixed)** — Computes hash during backup and verifies during recovery; missing or empty SHA256 record now blocks restore by default (bypass attack eliminated)\n- **PATH cross-validation (NEW in v0.3.0)** — SHA256 file now stores FILE_HASH + PATH; restore performs cross-check between `.sha256` record and `.path` file, fully preventing `.path` redirection attacks\n- **Path traversal protection** — Detects `../` escape sequences and blocks restores outside the valid directory range\n- **One-click recovery** — Restores accidentally deleted files to their original location\n- **Multi-file safe handling** — When a backup folder contains multiple files, all must be restored before deleting the backup\n- **Automatic cleanup** — Backups are deleted after 7 days and logs after 30 days, fully automated\n- **Conflict-protected recovery** — If a file already exists at the restore destination, it is automatically moved to `temp_existing/` for staging\n- **Complete operation logs** — Every backup, restore, cleanup, and security interception operation is logged (including SECURITY level)\n- **`--force` for legacy backups (NEW in v0.3.0)** — Use `--force` to restore pre-v0.3.0 backups that lack SHA256 records (path validation still applies)\n\n---\n\n## 安装方式 / Installation\n\n### 中文\n\n### 通过 ClawdHub 安装（推荐）\n\n```bash\n# 安装最新版（v0.3.0）\nclawdhub install delete-recovery\n\n# 安装指定版本\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### 手动安装\n\n将 `delete-recovery-0.3.0` 文件夹复制到本地 Agent 的 OpenClaw workspace 的 `skills/` 目录下。\n\n### English\n\n### Install via ClawdHub (Recommended)\n\n```bash\n# Install latest version (v0.3.0)\nclawdhub install delete-recovery\n\n# Install specific version\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### Manual Installation\n\nCopy the `delete-recovery-0.3.0` folder to the `skills/` directory in your local Agent's OpenClaw workspace.\n\n---\n\n## 快速开始 / Quick Start\n\n### 中文\n\n### 1. 删除前备份\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# 示例\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. 恢复误删文件\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# 恢复 v0.3.0 之前的旧备份（无 SHA256 记录）\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. 验证备份完整性\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\n不执行恢复，仅检查备份文件是否被篡改（SHA256 完整性 + PATH 交叉验证）。\n\n### 4. 查看所有备份\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. 手动删除指定备份\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. 手动触发清理\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. 查看操作日志\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n### English\n\n### 1. Backup Before Deletion\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# Example\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. Restore Accidentally Deleted Files\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# Restore pre-v0.3.0 backup (no SHA256 record) using --force\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. Verify Backup Integrity\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\nDoes not perform recovery. Checks SHA256 integrity AND PATH cross-validation to detect any tampering.\n\n### 4. List All Backups\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. Manually Delete Specified Backup\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. Manually Trigger Cleanup\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. View Operation Logs\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n---\n\n## 安全机制详解（v0.3.0）/ Security Mechanisms Explained (v0.3.0)\n\n### 中文\n\n### 场景1：备份被替换\n\n攻击者先备份一个正常文件，然后用恶意文件替换备份目录中的文件，诱导恢复。\n\n**防御：** backup 时计算 SHA256 并存储；restore 时验证哈希，不匹配则拒绝恢复。即使攻击者删除了 `.sha256` 文件，restore 也会被阻止（除非使用 `--force`，且路径验证仍然生效）。\n\n### 场景2：.path 文件被篡改\n\n攻击者修改 `.path` 文件内容，将恢复目标指向系统目录（如 `C:\\Windows\\System32\\evil.exe`）。\n\n**防御：** v0.3.0 新增 `.sha256` 文件中的 PATH 字段。restore 时读取 `.sha256` 中存储的原始路径，与 `.path` 文件内容进行交叉验证，二者不一致则拒绝恢复。\n\n### 场景3：SHA256 记录被删除绕过\n\n攻击者直接删除或置空 `.sha256` 文件，试图绕过完整性检查。\n\n**防御：** v0.3.0 修复此漏洞——SHA256 记录缺失或为空时，restore 默认阻止并报错，不再跳过完整性检查。\n\n### 场景4：路径遍历\n\n攻击者在目标路径中构造 `../../../dangerous/evil.exe`，试图逃逸到合法目录范围外。\n\n**防御：** `_is_path_safe()` 检测 `..` 成分，resolve 后路径不在合法范围则拒绝。\n\n### English\n\n### Scenario 1: Backup Replaced\n\nAn attacker first backs up a normal file, then replaces the file in the backup directory with a malicious one to induce recovery.\n\n**Defense:** Compute and store SHA256 during backup; verify hash during restore and reject if mismatched. If the attacker also deletes the `.sha256` file to bypass the check, restore is still blocked by default (unless `--force` is used, and path validation still applies).\n\n### Scenario 2: .path File Tampered\n\nAn attacker modifies the `.path` file content to point the restore target to a system directory (e.g., `C:\\Windows\\System32\\evil.exe`).\n\n**Defense:** v0.3.0 stores the original path in the `.sha256` file (in the `PATH:` line). On restore, the path from `.sha256` is cross-checked against the `.path` file — any mismatch is blocked.\n\n### Scenario 3: SHA256 Record Deleted to Bypass Check\n\nAn attacker deletes or empties the `.sha256` file to bypass integrity checks.\n\n**Defense:** v0.3.0 fixes this — missing or empty SHA256 record now blocks restore by default. The only escape hatch is `--force`, but path cross-validation still runs.\n\n### Scenario 4: Path Traversal\n\nAn attacker constructs `../../../dangerous/evil.exe` in the target path to escape outside the allowed directory.\n\n**Defense:** `_is_path_safe()` detects `..` components and rejects if the resolved path is outside the valid range.\n\n---\n\n## SHA256 文件格式（v0.3.0）/ SHA256 File Format (v0.3.0)\n\n### 中文\n\n`.sha256` 文件采用结构化格式，同时存储文件哈希和原始路径：\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**：格式版本号，用于未来兼容升级\n- **`FILE_HASH:`**：备份文件的 SHA256 哈希（64位十六进制）\n- **`PATH:`**：备份时的原始文件路径（与 `.path` 文件内容一致，用于交叉验证）\n\n### English\n\nThe `.sha256` file uses a structured format that stores both the file hash and original path:\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**: Format version marker for future compatibility\n- **`FILE_HASH:`**: SHA256 hash of the backup file (64 hex characters)\n- **`PATH:`**: Original file path at backup time (mirrors `.path` file; used for cross-validation)\n\n---\n\n## 文件结构 / File Structure\n\n### 中文\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill 定义\n├── README.md                          — 使用指南（本文）\n├── CLAWDHUB.md                        — ClawdHub 发布元数据\n├── log.txt                            — 操作日志（30天自动清理）\n├── delete_backup/                     — 备份存储（7天自动清理）\n│   ├── YYYYMMDDHHMM/                — 时间戳备份文件夹\n│   │   ├── C__Users__...            — 备份文件\n│   │   ├── C__Users__...path         — 原始路径记录\n│   │   ├── C__Users__...sha256       — SHA256 完整性 + PATH 交叉验证记录（v0.3.0）\n│   │   └── .restored                 — 已恢复文件清单\n│   └── temp_existing/                 — 恢复时暂存冲突文件\n└── scripts/\n    ├── delete_recovery.py            — 核心脚本（含安全验证）\n    └── safe_path.py                  — 路径安全验证模块（v0.3.0）\n```\n\n### English\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill definition\n├── README.md                          — User guide (this document)\n├── CLAWDHUB.md                        — ClawdHub publishing metadata\n├── log.txt                            — Operation logs (auto-cleaned after 30 days)\n├── delete_backup/                     — Backup storage (auto-cleaned after 7 days)\n│   ├── YYYYMMDDHHMM/                — Timestamped backup folder\n│   │   ├── C__Users__...            — Backup file\n│   │   ├── C__Users__...path         — Original path record\n│   │   ├── C__Users__...sha256       — SHA256 + PATH cross-validation record (v0.3.0)\n│   │   └── .restored                 — Restored files manifest\n│   └── temp_existing/                 — Conflict files staged during recovery\n└── scripts/\n    ├── delete_recovery.py            — Core script (with security checks)\n    └── safe_path.py                  — Path safety validation module (v0.3.0)\n```\n\n---\n\n## 工作流程 / Workflow\n\n### 中文\n\n```\n用户决定删除文件\n        │\n        ▼\n  ① backup 命令          ← 第一步必须做（v0.3.0 自动生成 SHA256 + PATH 记录）\n        │\n        ▼\n  ② 用户执行删除操作\n        │\n        ▼（后续如需恢复）\n  ③ restore 命令         ← v0.3.0：完整性 + PATH 交叉验证 + 遍历检测\n        │\n        ▼\n  备份自动删除            ←（除非使用了 --keep-backup）\n```\n\n### English\n\n```\nUser decides to delete file\n        │\n        ▼\n  ① backup command    ← Must do first (v0.3.0 auto-generates SHA256 + PATH record)\n        │\n        ▼\n  ② User performs deletion\n        │\n        ▼（If recovery needed later）\n  ③ restore command ← v0.3.0: integrity + PATH cross-validation + traversal detection\n        │\n        ▼\n  Backup auto-deleted  ←（Unless --keep-backup is used）\n```\n\n---\n\n## 依赖环境 / Dependencies\n\n### 中文\n\n- Python 3.6+\n- OpenClaw 1.0+（含 skill 支持）\n\n### English\n\n- Python 3.6+\n- OpenClaw 1.0+ (with skill support)\n\n---\n\n## 更新日志 / Changelog\n\n### 中文\n\n### v0.3.0（2026-03-27） — 当前版本\n\n**安全修复：**\n\n- 【最关键】SHA256 记录改为**强制要求** — 缺失或为空时 restore **默认阻止**，修复了\"删除 `.sha256` 文件即可绕过完整性检查\"的严重漏洞\n- 【安全增强】`.sha256` 文件新增 `PATH:` 行 — restore 时双向交叉验证 `.sha256` 中存储的路径与 `.path` 文件内容，彻底防止 `.path` 篡改攻击\n- 【Bug 修复】修复 `allowed_roots` 死代码 — `allowed_roots=[]`（空列表）现正确表示\"无路径限制\"（不再误判为禁止所有路径）\n- 【安全调整】`allowed_roots` 默认为空 — 安全防护主要依赖完整性 + 路径交叉验证，而非固定目录限制，更适合恢复工具的实际场景\n- 【接口变更】restore 新增 `--force` 参数 — 跳过 SHA256 存在性检查，用于强制恢复 v0.3.0 之前的旧备份（路径验证仍生效）\n- 【Bug 修复】`verify` 命令新增 PATH 交叉验证结果 — 同时报告 hash_match 和 path_match 两个检查的结果\n\n**完整变更：**\n- `safe_path.py`：完全重写 `verify_integrity_and_path()`，新增 `write_sha256_file()` / `read_sha256_file()`，格式改为 `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`：集成新版安全 API，`--force` 参数，`verify` 返回 path_match\n- 更新 SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0（2026-03-26）— 上一版本\n\n- 新增 `safe_path.py` 路径安全验证模块\n- backup 时自动计算并存储 SHA256 哈希（`.sha256` 文件）\n- restore 时验证备份完整性（SHA256 比对），完整性不符拒绝恢复\n- restore 时验证恢复路径（防止 `.path` 篡改 + 路径遍历）\n- 所有安全拦截事件记录为 `SECURITY` 级别日志\n- 新增 `verify` 命令：手动检查备份完整性（不执行恢复）\n- 新增 `safe_path.py` 独立工具：可单独调用 `compute <file_path>` 计算 SHA256\n\n### v0.1.0（2026-03-26）\n\n- 基础备份/恢复/清理功能\n- 7天自动清理备份，30天自动清理日志\n- 多文件批量恢复保护\n- 冲突保护恢复\n\n### English\n\n### v0.3.0 (2026-03-27) — Current Version\n\n**Security fixes:**\n\n- 【Critical】SHA256 record is now **STRICTLY REQUIRED** — missing or empty SHA256 blocks restore by default, fixing the critical bypass vulnerability where deleting `.sha256` disabled integrity checks\n- 【Security enhancement】`.sha256` file now stores `PATH:` line — restore performs cross-check between the path stored in `.sha256` and the `.path` file, fully preventing `.path` redirection attacks\n- 【Bug fix】Fixed `allowed_roots` dead code — `allowed_roots=[]` (empty list) now correctly means \"no restriction\" (previously falsely blocked all paths)\n- 【Security adjustment】`allowed_roots` defaults to empty — primary security comes from integrity + path cross-validation rather than fixed directory restrictions, which is more appropriate for a recovery tool\n- 【Interface change】restore command gains `--force` flag — bypasses SHA256 existence check to restore pre-v0.3.0 backups (path validation still applies)\n- 【Bug fix】`verify` command now reports PATH cross-validation result — returns both hash_match and path_match\n\n**Complete changes:**\n- `safe_path.py`: Fully rewritten `verify_integrity_and_path()`, new `write_sha256_file()` / `read_sha256_file()`, format changed to `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`: Integrated new security API, `--force` flag, `verify` returns path_match\n- Updated SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0 (2026-03-26) — Previous Version\n\n- Added `safe_path.py` path safety validation module\n- SHA256 hash computed and stored on backup (`.sha256` file)\n- Restore verifies SHA256 integrity — blocks restore if hash mismatch\n- Restore validates destination path — prevents `.path` tampering and path traversal\n- All security blocks logged at `SECURITY` level\n- Added `verify` command: manually check backup integrity without restoring\n- Added `safe_path.py` standalone tool: `python safe_path.py compute <file>`\n\n### v0.1.0 (2026-03-26)\n\n- Basic backup/restore/cleanup functionality\n- 7-day auto backup cleanup, 30-day auto log cleanup\n- Multi-file batch recovery protection\n- Conflict-protected recovery\n\n---\n\n### 中文\n\n*如有问题或建议，欢迎反馈！*\n\n### English\n\n*For questions or suggestions, feedback is welcome!*\n\nv0.3.2 | 2026-03-27T01:29:41.030Z | user\n\n# delete-recovery v0.3.0\n\n### 中文\n\n文件删除安全网——备份、恢复、SHA256完整性校验、路径交叉验证、全自动清理。\n\n### English\n\nA safety net for file deletion — backup, recovery, SHA256 integrity verification, path cross-validation, and fully automatic cleanup.\n\n---\n\n### 中文\n\n一款轻量的 OpenClaw skill，在删除文件前自动将其备份到带时间戳的文件夹。**v0.3.0 新增 SHA256 强制校验 + PATH 交叉验证**，修复了 v0.2.0 中 SHA256 可被绕过的安全漏洞，防止恶意文件注入攻击。误删后一键恢复，过期备份和日志全自动清理，无需人工干预。\n\n### English\n\nA lightweight OpenClaw skill that automatically backs up files to timestamped folders before deletion. **v0.3.0 adds mandatory SHA256 integrity checks and PATH cross-validation**, fixing a security bypass vulnerability in v0.2.0 and preventing malicious file injection attacks. Recover accidentally deleted files with one click, and expired backups and logs are automatically cleaned up without manual intervention.\n\n---\n\n## 功能特性 / Features\n\n### 中文\n\n- **删除前自动备份** — 删除任何文件前，自动备份到带时间戳的文件夹\n- **SHA256 强制校验（v0.3.0 修复）** — 备份时计算哈希，恢复时验证；SHA256 记录缺失或为空时 restore 默认阻止（无法再通过删除文件绕过）\n- **PATH 交叉验证（v0.3.0 新增）** — `.sha256` 文件中绑定原始路径，恢复时双向交叉验证，彻底防止 `.path` 文件被篡改定向到任意位置\n- **路径遍历防护** — 检测 `../` 逃逸序列，拒绝恢复目标超出合法范围\n- **一键恢复** — 将误删文件恢复到原始位置\n- **多文件安全处理** — 同一备份文件夹含多文件时，须全部恢复完毕才删除备份\n- **自动清理** — 备份7天后自动删除，日志30天后自动删除，完全自动化\n- **冲突保护恢复** — 恢复时若目标位置已有文件，自动移到 `temp_existing/` 暂存\n- **完整操作日志** — 每次备份、恢复、清理、安全拦截操作均有记录（含 SECURITY 级别）\n- **`--force` 恢复旧备份（v0.3.0 新增）** — 对 v0.3.0 之前创建的旧备份（无 SHA256 记录），可用 `--force` 强制恢复（路径验证仍生效）\n\n### English\n\n- **Automatic backup before deletion** — Automatically backs up any file to a timestamped folder before deletion\n- **Mandatory SHA256 integrity check (v0.3.0 fixed)** — Computes hash during backup and verifies during recovery; missing or empty SHA256 record now blocks restore by default (bypass attack eliminated)\n- **PATH cross-validation (NEW in v0.3.0)** — SHA256 file now stores FILE_HASH + PATH; restore performs cross-check between `.sha256` record and `.path` file, fully preventing `.path` redirection attacks\n- **Path traversal protection** — Detects `../` escape sequences and blocks restores outside the valid directory range\n- **One-click recovery** — Restores accidentally deleted files to their original location\n- **Multi-file safe handling** — When a backup folder contains multiple files, all must be restored before deleting the backup\n- **Automatic cleanup** — Backups are deleted after 7 days and logs after 30 days, fully automated\n- **Conflict-protected recovery** — If a file already exists at the restore destination, it is automatically moved to `temp_existing/` for staging\n- **Complete operation logs** — Every backup, restore, cleanup, and security interception operation is logged (including SECURITY level)\n- **`--force` for legacy backups (NEW in v0.3.0)** — Use `--force` to restore pre-v0.3.0 backups that lack SHA256 records (path validation still applies)\n\n---\n\n## 安装方式 / Installation\n\n### 中文\n\n### 通过 ClawdHub 安装（推荐）\n\n```bash\n# 安装最新版（v0.3.0）\nclawdhub install delete-recovery\n\n# 安装指定版本\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### 手动安装\n\n将 `delete-recovery-0.3.0` 文件夹复制到本地 Agent 的 OpenClaw workspace 的 `skills/` 目录下。\n\n### English\n\n### Install via ClawdHub (Recommended)\n\n```bash\n# Install latest version (v0.3.0)\nclawdhub install delete-recovery\n\n# Install specific version\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### Manual Installation\n\nCopy the `delete-recovery-0.3.0` folder to the `skills/` directory in your local Agent's OpenClaw workspace.\n\n---\n\n## 快速开始 / Quick Start\n\n### 中文\n\n### 1. 删除前备份\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# 示例\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. 恢复误删文件\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# 恢复 v0.3.0 之前的旧备份（无 SHA256 记录）\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. 验证备份完整性\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\n不执行恢复，仅检查备份文件是否被篡改（SHA256 完整性 + PATH 交叉验证）。\n\n### 4. 查看所有备份\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. 手动删除指定备份\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. 手动触发清理\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. 查看操作日志\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n### English\n\n### 1. Backup Before Deletion\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# Example\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. Restore Accidentally Deleted Files\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# Restore pre-v0.3.0 backup (no SHA256 record) using --force\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. Verify Backup Integrity\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\nDoes not perform recovery. Checks SHA256 integrity AND PATH cross-validation to detect any tampering.\n\n### 4. List All Backups\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. Manually Delete Specified Backup\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. Manually Trigger Cleanup\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. View Operation Logs\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n---\n\n## 安全机制详解（v0.3.0）/ Security Mechanisms Explained (v0.3.0)\n\n### 中文\n\n### 场景1：备份被替换\n\n攻击者先备份一个正常文件，然后用恶意文件替换备份目录中的文件，诱导恢复。\n\n**防御：** backup 时计算 SHA256 并存储；restore 时验证哈希，不匹配则拒绝恢复。即使攻击者删除了 `.sha256` 文件，restore 也会被阻止（除非使用 `--force`，且路径验证仍然生效）。\n\n### 场景2：.path 文件被篡改\n\n攻击者修改 `.path` 文件内容，将恢复目标指向系统目录（如 `C:\\Windows\\System32\\evil.exe`）。\n\n**防御：** v0.3.0 新增 `.sha256` 文件中的 PATH 字段。restore 时读取 `.sha256` 中存储的原始路径，与 `.path` 文件内容进行交叉验证，二者不一致则拒绝恢复。\n\n### 场景3：SHA256 记录被删除绕过\n\n攻击者直接删除或置空 `.sha256` 文件，试图绕过完整性检查。\n\n**防御：** v0.3.0 修复此漏洞——SHA256 记录缺失或为空时，restore 默认阻止并报错，不再跳过完整性检查。\n\n### 场景4：路径遍历\n\n攻击者在目标路径中构造 `../../../dangerous/evil.exe`，试图逃逸到合法目录范围外。\n\n**防御：** `_is_path_safe()` 检测 `..` 成分，resolve 后路径不在合法范围则拒绝。\n\n### English\n\n### Scenario 1: Backup Replaced\n\nAn attacker first backs up a normal file, then replaces the file in the backup directory with a malicious one to induce recovery.\n\n**Defense:** Compute and store SHA256 during backup; verify hash during restore and reject if mismatched. If the attacker also deletes the `.sha256` file to bypass the check, restore is still blocked by default (unless `--force` is used, and path validation still applies).\n\n### Scenario 2: .path File Tampered\n\nAn attacker modifies the `.path` file content to point the restore target to a system directory (e.g., `C:\\Windows\\System32\\evil.exe`).\n\n**Defense:** v0.3.0 stores the original path in the `.sha256` file (in the `PATH:` line). On restore, the path from `.sha256` is cross-checked against the `.path` file — any mismatch is blocked.\n\n### Scenario 3: SHA256 Record Deleted to Bypass Check\n\nAn attacker deletes or empties the `.sha256` file to bypass integrity checks.\n\n**Defense:** v0.3.0 fixes this — missing or empty SHA256 record now blocks restore by default. The only escape hatch is `--force`, but path cross-validation still runs.\n\n### Scenario 4: Path Traversal\n\nAn attacker constructs `../../../dangerous/evil.exe` in the target path to escape outside the allowed directory.\n\n**Defense:** `_is_path_safe()` detects `..` components and rejects if the resolved path is outside the valid range.\n\n---\n\n## SHA256 文件格式（v0.3.0）/ SHA256 File Format (v0.3.0)\n\n### 中文\n\n`.sha256` 文件采用结构化格式，同时存储文件哈希和原始路径：\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**：格式版本号，用于未来兼容升级\n- **`FILE_HASH:`**：备份文件的 SHA256 哈希（64位十六进制）\n- **`PATH:`**：备份时的原始文件路径（与 `.path` 文件内容一致，用于交叉验证）\n\n### English\n\nThe `.sha256` file uses a structured format that stores both the file hash and original path:\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**: Format version marker for future compatibility\n- **`FILE_HASH:`**: SHA256 hash of the backup file (64 hex characters)\n- **`PATH:`**: Original file path at backup time (mirrors `.path` file; used for cross-validation)\n\n---\n\n## 文件结构 / File Structure\n\n### 中文\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill 定义\n├── README.md                          — 使用指南（本文）\n├── CLAWDHUB.md                        — ClawdHub 发布元数据\n├── log.txt                            — 操作日志（30天自动清理）\n├── delete_backup/                     — 备份存储（7天自动清理）\n│   ├── YYYYMMDDHHMM/                — 时间戳备份文件夹\n│   │   ├── C__Users__...            — 备份文件\n│   │   ├── C__Users__...path         — 原始路径记录\n│   │   ├── C__Users__...sha256       — SHA256 完整性 + PATH 交叉验证记录（v0.3.0）\n│   │   └── .restored                 — 已恢复文件清单\n│   └── temp_existing/                 — 恢复时暂存冲突文件\n└── scripts/\n    ├── delete_recovery.py            — 核心脚本（含安全验证）\n    └── safe_path.py                  — 路径安全验证模块（v0.3.0）\n```\n\n### English\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill definition\n├── README.md                          — User guide (this document)\n├── CLAWDHUB.md                        — ClawdHub publishing metadata\n├── log.txt                            — Operation logs (auto-cleaned after 30 days)\n├── delete_backup/                     — Backup storage (auto-cleaned after 7 days)\n│   ├── YYYYMMDDHHMM/                — Timestamped backup folder\n│   │   ├── C__Users__...            — Backup file\n│   │   ├── C__Users__...path         — Original path record\n│   │   ├── C__Users__...sha256       — SHA256 + PATH cross-validation record (v0.3.0)\n│   │   └── .restored                 — Restored files manifest\n│   └── temp_existing/                 — Conflict files staged during recovery\n└── scripts/\n    ├── delete_recovery.py            — Core script (with security checks)\n    └── safe_path.py                  — Path safety validation module (v0.3.0)\n```\n\n---\n\n## 工作流程 / Workflow\n\n### 中文\n\n```\n用户决定删除文件\n        │\n        ▼\n  ① backup 命令          ← 第一步必须做（v0.3.0 自动生成 SHA256 + PATH 记录）\n        │\n        ▼\n  ② 用户执行删除操作\n        │\n        ▼（后续如需恢复）\n  ③ restore 命令         ← v0.3.0：完整性 + PATH 交叉验证 + 遍历检测\n        │\n        ▼\n  备份自动删除            ←（除非使用了 --keep-backup）\n```\n\n### English\n\n```\nUser decides to delete file\n        │\n        ▼\n  ① backup command    ← Must do first (v0.3.0 auto-generates SHA256 + PATH record)\n        │\n        ▼\n  ② User performs deletion\n        │\n        ▼（If recovery needed later）\n  ③ restore command ← v0.3.0: integrity + PATH cross-validation + traversal detection\n        │\n        ▼\n  Backup auto-deleted  ←（Unless --keep-backup is used）\n```\n\n---\n\n## 依赖环境 / Dependencies\n\n### 中文\n\n- Python 3.6+\n- OpenClaw 1.0+（含 skill 支持）\n\n### English\n\n- Python 3.6+\n- OpenClaw 1.0+ (with skill support)\n\n---\n\n## 更新日志 / Changelog\n\n### 中文\n\n### v0.3.0（2026-03-27） — 当前版本\n\n**安全修复：**\n\n- 【最关键】SHA256 记录改为**强制要求** — 缺失或为空时 restore **默认阻止**，修复了\"删除 `.sha256` 文件即可绕过完整性检查\"的严重漏洞\n- 【安全增强】`.sha256` 文件新增 `PATH:` 行 — restore 时双向交叉验证 `.sha256` 中存储的路径与 `.path` 文件内容，彻底防止 `.path` 篡改攻击\n- 【Bug 修复】修复 `allowed_roots` 死代码 — `allowed_roots=[]`（空列表）现正确表示\"无路径限制\"（不再误判为禁止所有路径）\n- 【安全调整】`allowed_roots` 默认为空 — 安全防护主要依赖完整性 + 路径交叉验证，而非固定目录限制，更适合恢复工具的实际场景\n- 【接口变更】restore 新增 `--force` 参数 — 跳过 SHA256 存在性检查，用于强制恢复 v0.3.0 之前的旧备份（路径验证仍生效）\n- 【Bug 修复】`verify` 命令新增 PATH 交叉验证结果 — 同时报告 hash_match 和 path_match 两个检查的结果\n\n**完整变更：**\n- `safe_path.py`：完全重写 `verify_integrity_and_path()`，新增 `write_sha256_file()` / `read_sha256_file()`，格式改为 `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`：集成新版安全 API，`--force` 参数，`verify` 返回 path_match\n- 更新 SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0（2026-03-26）— 上一版本\n\n- 新增 `safe_path.py` 路径安全验证模块\n- backup 时自动计算并存储 SHA256 哈希（`.sha256` 文件）\n- restore 时验证备份完整性（SHA256 比对），完整性不符拒绝恢复\n- restore 时验证恢复路径（防止 `.path` 篡改 + 路径遍历）\n- 所有安全拦截事件记录为 `SECURITY` 级别日志\n- 新增 `verify` 命令：手动检查备份完整性（不执行恢复）\n- 新增 `safe_path.py` 独立工具：可单独调用 `compute <file_path>` 计算 SHA256\n\n### v0.1.0（2026-03-26）\n\n- 基础备份/恢复/清理功能\n- 7天自动清理备份，30天自动清理日志\n- 多文件批量恢复保护\n- 冲突保护恢复\n\n### English\n\n### v0.3.0 (2026-03-27) — Current Version\n\n**Security fixes:**\n\n- 【Critical】SHA256 record is now **STRICTLY REQUIRED** — missing or empty SHA256 blocks restore by default, fixing the critical bypass vulnerability where deleting `.sha256` disabled integrity checks\n- 【Security enhancement】`.sha256` file now stores `PATH:` line — restore performs cross-check between the path stored in `.sha256` and the `.path` file, fully preventing `.path` redirection attacks\n- 【Bug fix】Fixed `allowed_roots` dead code — `allowed_roots=[]` (empty list) now correctly means \"no restriction\" (previously falsely blocked all paths)\n- 【Security adjustment】`allowed_roots` defaults to empty — primary security comes from integrity + path cross-validation rather than fixed directory restrictions, which is more appropriate for a recovery tool\n- 【Interface change】restore command gains `--force` flag — bypasses SHA256 existence check to restore pre-v0.3.0 backups (path validation still applies)\n- 【Bug fix】`verify` command now reports PATH cross-validation result — returns both hash_match and path_match\n\n**Complete changes:**\n- `safe_path.py`: Fully rewritten `verify_integrity_and_path()`, new `write_sha256_file()` / `read_sha256_file()`, format changed to `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`: Integrated new security API, `--force` flag, `verify` returns path_match\n- Updated SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0 (2026-03-26) — Previous Version\n\n- Added `safe_path.py` path safety validation module\n- SHA256 hash computed and stored on backup (`.sha256` file)\n- Restore verifies SHA256 integrity — blocks restore if hash mismatch\n- Restore validates destination path — prevents `.path` tampering and path traversal\n- All security blocks logged at `SECURITY` level\n- Added `verify` command: manually check backup integrity without restoring\n- Added `safe_path.py` standalone tool: `python safe_path.py compute <file>`\n\n### v0.1.0 (2026-03-26)\n\n- Basic backup/restore/cleanup functionality\n- 7-day auto backup cleanup, 30-day auto log cleanup\n- Multi-file batch recovery protection\n- Conflict-protected recovery\n\n---\n\n### 中文\n\n*如有问题或建议，欢迎反馈！*\n\n### English\n\n*For questions or suggestions, feedback is welcome!*\n\nv0.3.1 | 2026-03-27T01:06:33.404Z | user\n\n# delete-recovery v0.3.0\n\n### 中文\n\n文件删除安全网——备份、恢复、SHA256完整性校验、路径交叉验证、全自动清理。\n\n### English\n\nA safety net for file deletion — backup, recovery, SHA256 integrity verification, path cross-validation, and fully automatic cleanup.\n\n---\n\n### 中文\n\n一款轻量的 OpenClaw skill，在删除文件前自动将其备份到带时间戳的文件夹。**v0.3.0 新增 SHA256 强制校验 + PATH 交叉验证**，修复了 v0.2.0 中 SHA256 可被绕过的安全漏洞，防止恶意文件注入攻击。误删后一键恢复，过期备份和日志全自动清理，无需人工干预。\n\n### English\n\nA lightweight OpenClaw skill that automatically backs up files to timestamped folders before deletion. **v0.3.0 adds mandatory SHA256 integrity checks and PATH cross-validation**, fixing a security bypass vulnerability in v0.2.0 and preventing malicious file injection attacks. Recover accidentally deleted files with one click, and expired backups and logs are automatically cleaned up without manual intervention.\n\n---\n\n## 功能特性 / Features\n\n### 中文\n\n- **删除前自动备份** — 删除任何文件前，自动备份到带时间戳的文件夹\n- **SHA256 强制校验（v0.3.0 修复）** — 备份时计算哈希，恢复时验证；SHA256 记录缺失或为空时 restore 默认阻止（无法再通过删除文件绕过）\n- **PATH 交叉验证（v0.3.0 新增）** — `.sha256` 文件中绑定原始路径，恢复时双向交叉验证，彻底防止 `.path` 文件被篡改定向到任意位置\n- **路径遍历防护** — 检测 `../` 逃逸序列，拒绝恢复目标超出合法范围\n- **一键恢复** — 将误删文件恢复到原始位置\n- **多文件安全处理** — 同一备份文件夹含多文件时，须全部恢复完毕才删除备份\n- **自动清理** — 备份7天后自动删除，日志30天后自动删除，完全自动化\n- **冲突保护恢复** — 恢复时若目标位置已有文件，自动移到 `temp_existing/` 暂存\n- **完整操作日志** — 每次备份、恢复、清理、安全拦截操作均有记录（含 SECURITY 级别）\n- **`--force` 恢复旧备份（v0.3.0 新增）** — 对 v0.3.0 之前创建的旧备份（无 SHA256 记录），可用 `--force` 强制恢复（路径验证仍生效）\n\n### English\n\n- **Automatic backup before deletion** — Automatically backs up any file to a timestamped folder before deletion\n- **Mandatory SHA256 integrity check (v0.3.0 fixed)** — Computes hash during backup and verifies during recovery; missing or empty SHA256 record now blocks restore by default (bypass attack eliminated)\n- **PATH cross-validation (NEW in v0.3.0)** — SHA256 file now stores FILE_HASH + PATH; restore performs cross-check between `.sha256` record and `.path` file, fully preventing `.path` redirection attacks\n- **Path traversal protection** — Detects `../` escape sequences and blocks restores outside the valid directory range\n- **One-click recovery** — Restores accidentally deleted files to their original location\n- **Multi-file safe handling** — When a backup folder contains multiple files, all must be restored before deleting the backup\n- **Automatic cleanup** — Backups are deleted after 7 days and logs after 30 days, fully automated\n- **Conflict-protected recovery** — If a file already exists at the restore destination, it is automatically moved to `temp_existing/` for staging\n- **Complete operation logs** — Every backup, restore, cleanup, and security interception operation is logged (including SECURITY level)\n- **`--force` for legacy backups (NEW in v0.3.0)** — Use `--force` to restore pre-v0.3.0 backups that lack SHA256 records (path validation still applies)\n\n---\n\n## 安装方式 / Installation\n\n### 中文\n\n### 通过 ClawdHub 安装（推荐）\n\n```bash\n# 安装最新版（v0.3.0）\nclawdhub install delete-recovery\n\n# 安装指定版本\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### 手动安装\n\n将 `delete-recovery-0.3.0` 文件夹复制到本地 Agent 的 OpenClaw workspace 的 `skills/` 目录下。\n\n### English\n\n### Install via ClawdHub (Recommended)\n\n```bash\n# Install latest version (v0.3.0)\nclawdhub install delete-recovery\n\n# Install specific version\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### Manual Installation\n\nCopy the `delete-recovery-0.3.0` folder to the `skills/` directory in your local Agent's OpenClaw workspace.\n\n---\n\n## 快速开始 / Quick Start\n\n### 中文\n\n### 1. 删除前备份\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# 示例\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. 恢复误删文件\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# 恢复 v0.3.0 之前的旧备份（无 SHA256 记录）\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. 验证备份完整性\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\n不执行恢复，仅检查备份文件是否被篡改（SHA256 完整性 + PATH 交叉验证）。\n\n### 4. 查看所有备份\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. 手动删除指定备份\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. 手动触发清理\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. 查看操作日志\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n### English\n\n### 1. Backup Before Deletion\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# Example\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. Restore Accidentally Deleted Files\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# Restore pre-v0.3.0 backup (no SHA256 record) using --force\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. Verify Backup Integrity\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\nDoes not perform recovery. Checks SHA256 integrity AND PATH cross-validation to detect any tampering.\n\n### 4. List All Backups\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. Manually Delete Specified Backup\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. Manually Trigger Cleanup\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. View Operation Logs\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n---\n\n## 安全机制详解（v0.3.0）/ Security Mechanisms Explained (v0.3.0)\n\n### 中文\n\n### 场景1：备份被替换\n\n攻击者先备份一个正常文件，然后用恶意文件替换备份目录中的文件，诱导恢复。\n\n**防御：** backup 时计算 SHA256 并存储；restore 时验证哈希，不匹配则拒绝恢复。即使攻击者删除了 `.sha256` 文件，restore 也会被阻止（除非使用 `--force`，且路径验证仍然生效）。\n\n### 场景2：.path 文件被篡改\n\n攻击者修改 `.path` 文件内容，将恢复目标指向系统目录（如 `C:\\Windows\\System32\\evil.exe`）。\n\n**防御：** v0.3.0 新增 `.sha256` 文件中的 PATH 字段。restore 时读取 `.sha256` 中存储的原始路径，与 `.path` 文件内容进行交叉验证，二者不一致则拒绝恢复。\n\n### 场景3：SHA256 记录被删除绕过\n\n攻击者直接删除或置空 `.sha256` 文件，试图绕过完整性检查。\n\n**防御：** v0.3.0 修复此漏洞——SHA256 记录缺失或为空时，restore 默认阻止并报错，不再跳过完整性检查。\n\n### 场景4：路径遍历\n\n攻击者在目标路径中构造 `../../../dangerous/evil.exe`，试图逃逸到合法目录范围外。\n\n**防御：** `_is_path_safe()` 检测 `..` 成分，resolve 后路径不在合法范围则拒绝。\n\n### English\n\n### Scenario 1: Backup Replaced\n\nAn attacker first backs up a normal file, then replaces the file in the backup directory with a malicious one to induce recovery.\n\n**Defense:** Compute and store SHA256 during backup; verify hash during restore and reject if mismatched. If the attacker also deletes the `.sha256` file to bypass the check, restore is still blocked by default (unless `--force` is used, and path validation still applies).\n\n### Scenario 2: .path File Tampered\n\nAn attacker modifies the `.path` file content to point the restore target to a system directory (e.g., `C:\\Windows\\System32\\evil.exe`).\n\n**Defense:** v0.3.0 stores the original path in the `.sha256` file (in the `PATH:` line). On restore, the path from `.sha256` is cross-checked against the `.path` file — any mismatch is blocked.\n\n### Scenario 3: SHA256 Record Deleted to Bypass Check\n\nAn attacker deletes or empties the `.sha256` file to bypass integrity checks.\n\n**Defense:** v0.3.0 fixes this — missing or empty SHA256 record now blocks restore by default. The only escape hatch is `--force`, but path cross-validation still runs.\n\n### Scenario 4: Path Traversal\n\nAn attacker constructs `../../../dangerous/evil.exe` in the target path to escape outside the allowed directory.\n\n**Defense:** `_is_path_safe()` detects `..` components and rejects if the resolved path is outside the valid range.\n\n---\n\n## SHA256 文件格式（v0.3.0）/ SHA256 File Format (v0.3.0)\n\n### 中文\n\n`.sha256` 文件采用结构化格式，同时存储文件哈希和原始路径：\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**：格式版本号，用于未来兼容升级\n- **`FILE_HASH:`**：备份文件的 SHA256 哈希（64位十六进制）\n- **`PATH:`**：备份时的原始文件路径（与 `.path` 文件内容一致，用于交叉验证）\n\n### English\n\nThe `.sha256` file uses a structured format that stores both the file hash and original path:\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**: Format version marker for future compatibility\n- **`FILE_HASH:`**: SHA256 hash of the backup file (64 hex characters)\n- **`PATH:`**: Original file path at backup time (mirrors `.path` file; used for cross-validation)\n\n---\n\n## 文件结构 / File Structure\n\n### 中文\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill 定义\n├── README.md                          — 使用指南（本文）\n├── CLAWDHUB.md                        — ClawdHub 发布元数据\n├── log.txt                            — 操作日志（30天自动清理）\n├── delete_backup/                     — 备份存储（7天自动清理）\n│   ├── YYYYMMDDHHMM/                — 时间戳备份文件夹\n│   │   ├── C__Users__...            — 备份文件\n│   │   ├── C__Users__...path         — 原始路径记录\n│   │   ├── C__Users__...sha256       — SHA256 完整性 + PATH 交叉验证记录（v0.3.0）\n│   │   └── .restored                 — 已恢复文件清单\n│   └── temp_existing/                 — 恢复时暂存冲突文件\n└── scripts/\n    ├── delete_recovery.py            — 核心脚本（含安全验证）\n    └── safe_path.py                  — 路径安全验证模块（v0.3.0）\n```\n\n### English\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill definition\n├── README.md                          — User guide (this document)\n├── CLAWDHUB.md                        — ClawdHub publishing metadata\n├── log.txt                            — Operation logs (auto-cleaned after 30 days)\n├── delete_backup/                     — Backup storage (auto-cleaned after 7 days)\n│   ├── YYYYMMDDHHMM/                — Timestamped backup folder\n│   │   ├── C__Users__...            — Backup file\n│   │   ├── C__Users__...path         — Original path record\n│   │   ├── C__Users__...sha256       — SHA256 + PATH cross-validation record (v0.3.0)\n│   │   └── .restored                 — Restored files manifest\n│   └── temp_existing/                 — Conflict files staged during recovery\n└── scripts/\n    ├── delete_recovery.py            — Core script (with security checks)\n    └── safe_path.py                  — Path safety validation module (v0.3.0)\n```\n\n---\n\n## 工作流程 / Workflow\n\n### 中文\n\n```\n用户决定删除文件\n        │\n        ▼\n  ① backup 命令          ← 第一步必须做（v0.3.0 自动生成 SHA256 + PATH 记录）\n        │\n        ▼\n  ② 用户执行删除操作\n        │\n        ▼（后续如需恢复）\n  ③ restore 命令         ← v0.3.0：完整性 + PATH 交叉验证 + 遍历检测\n        │\n        ▼\n  备份自动删除            ←（除非使用了 --keep-backup）\n```\n\n### English\n\n```\nUser decides to delete file\n        │\n        ▼\n  ① backup command    ← Must do first (v0.3.0 auto-generates SHA256 + PATH record)\n        │\n        ▼\n  ② User performs deletion\n        │\n        ▼（If recovery needed later）\n  ③ restore command ← v0.3.0: integrity + PATH cross-validation + traversal detection\n        │\n        ▼\n  Backup auto-deleted  ←（Unless --keep-backup is used）\n```\n\n---\n\n## 依赖环境 / Dependencies\n\n### 中文\n\n- Python 3.6+\n- OpenClaw 1.0+（含 skill 支持）\n\n### English\n\n- Python 3.6+\n- OpenClaw 1.0+ (with skill support)\n\n---\n\n## 更新日志 / Changelog\n\n### 中文\n\n### v0.3.0（2026-03-27） — 当前版本\n\n**安全修复：**\n\n- 【最关键】SHA256 记录改为**强制要求** — 缺失或为空时 restore **默认阻止**，修复了\"删除 `.sha256` 文件即可绕过完整性检查\"的严重漏洞\n- 【安全增强】`.sha256` 文件新增 `PATH:` 行 — restore 时双向交叉验证 `.sha256` 中存储的路径与 `.path` 文件内容，彻底防止 `.path` 篡改攻击\n- 【Bug 修复】修复 `allowed_roots` 死代码 — `allowed_roots=[]`（空列表）现正确表示\"无路径限制\"（不再误判为禁止所有路径）\n- 【安全调整】`allowed_roots` 默认为空 — 安全防护主要依赖完整性 + 路径交叉验证，而非固定目录限制，更适合恢复工具的实际场景\n- 【接口变更】restore 新增 `--force` 参数 — 跳过 SHA256 存在性检查，用于强制恢复 v0.3.0 之前的旧备份（路径验证仍生效）\n- 【Bug 修复】`verify` 命令新增 PATH 交叉验证结果 — 同时报告 hash_match 和 path_match 两个检查的结果\n\n**完整变更：**\n- `safe_path.py`：完全重写 `verify_integrity_and_path()`，新增 `write_sha256_file()` / `read_sha256_file()`，格式改为 `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`：集成新版安全 API，`--force` 参数，`verify` 返回 path_match\n- 更新 SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0（2026-03-26）— 上一版本\n\n- 新增 `safe_path.py` 路径安全验证模块\n- backup 时自动计算并存储 SHA256 哈希（`.sha256` 文件）\n- restore 时验证备份完整性（SHA256 比对），完整性不符拒绝恢复\n- restore 时验证恢复路径（防止 `.path` 篡改 + 路径遍历）\n- 所有安全拦截事件记录为 `SECURITY` 级别日志\n- 新增 `verify` 命令：手动检查备份完整性（不执行恢复）\n- 新增 `safe_path.py` 独立工具：可单独调用 `compute <file_path>` 计算 SHA256\n\n### v0.1.0（2026-03-26）\n\n- 基础备份/恢复/清理功能\n- 7天自动清理备份，30天自动清理日志\n- 多文件批量恢复保护\n- 冲突保护恢复\n\n### English\n\n### v0.3.0 (2026-03-27) — Current Version\n\n**Security fixes:**\n\n- 【Critical】SHA256 record is now **STRICTLY REQUIRED** — missing or empty SHA256 blocks restore by default, fixing the critical bypass vulnerability where deleting `.sha256` disabled integrity checks\n- 【Security enhancement】`.sha256` file now stores `PATH:` line — restore performs cross-check between the path stored in `.sha256` and the `.path` file, fully preventing `.path` redirection attacks\n- 【Bug fix】Fixed `allowed_roots` dead code — `allowed_roots=[]` (empty list) now correctly means \"no restriction\" (previously falsely blocked all paths)\n- 【Security adjustment】`allowed_roots` defaults to empty — primary security comes from integrity + path cross-validation rather than fixed directory restrictions, which is more appropriate for a recovery tool\n- 【Interface change】restore command gains `--force` flag — bypasses SHA256 existence check to restore pre-v0.3.0 backups (path validation still applies)\n- 【Bug fix】`verify` command now reports PATH cross-validation result — returns both hash_match and path_match\n\n**Complete changes:**\n- `safe_path.py`: Fully rewritten `verify_integrity_and_path()`, new `write_sha256_file()` / `read_sha256_file()`, format changed to `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`: Integrated new security API, `--force` flag, `verify` returns path_match\n- Updated SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0 (2026-03-26) — Previous Version\n\n- Added `safe_path.py` path safety validation module\n- SHA256 hash computed and stored on backup (`.sha256` file)\n- Restore verifies SHA256 integrity — blocks restore if hash mismatch\n- Restore validates destination path — prevents `.path` tampering and path traversal\n- All security blocks logged at `SECURITY` level\n- Added `verify` command: manually check backup integrity without restoring\n- Added `safe_path.py` standalone tool: `python safe_path.py compute <file>`\n\n### v0.1.0 (2026-03-26)\n\n- Basic backup/restore/cleanup functionality\n- 7-day auto backup cleanup, 30-day auto log cleanup\n- Multi-file batch recovery protection\n- Conflict-protected recovery\n\n---\n\n### 中文\n\n*如有问题或建议，欢迎反馈！*\n\n### English\n\n*For questions or suggestions, feedback is welcome!*\n\nv0.3.0 | 2026-03-27T00:45:41.479Z | user\n\n# delete-recovery v0.3.0\n\n### 中文\n\n文件删除安全网——备份、恢复、SHA256完整性校验、路径交叉验证、全自动清理。\n\n### English\n\nA safety net for file deletion — backup, recovery, SHA256 integrity verification, path cross-validation, and fully automatic cleanup.\n\n---\n\n### 中文\n\n一款轻量的 OpenClaw skill，在删除文件前自动将其备份到带时间戳的文件夹。**v0.3.0 新增 SHA256 强制校验 + PATH 交叉验证**，修复了 v0.2.0 中 SHA256 可被绕过的安全漏洞，防止恶意文件注入攻击。误删后一键恢复，过期备份和日志全自动清理，无需人工干预。\n\n### English\n\nA lightweight OpenClaw skill that automatically backs up files to timestamped folders before deletion. **v0.3.0 adds mandatory SHA256 integrity checks and PATH cross-validation**, fixing a security bypass vulnerability in v0.2.0 and preventing malicious file injection attacks. Recover accidentally deleted files with one click, and expired backups and logs are automatically cleaned up without manual intervention.\n\n---\n\n## 功能特性 / Features\n\n### 中文\n\n- **删除前自动备份** — 删除任何文件前，自动备份到带时间戳的文件夹\n- **SHA256 强制校验（v0.3.0 修复）** — 备份时计算哈希，恢复时验证；SHA256 记录缺失或为空时 restore 默认阻止（无法再通过删除文件绕过）\n- **PATH 交叉验证（v0.3.0 新增）** — `.sha256` 文件中绑定原始路径，恢复时双向交叉验证，彻底防止 `.path` 文件被篡改定向到任意位置\n- **路径遍历防护** — 检测 `../` 逃逸序列，拒绝恢复目标超出合法范围\n- **一键恢复** — 将误删文件恢复到原始位置\n- **多文件安全处理** — 同一备份文件夹含多文件时，须全部恢复完毕才删除备份\n- **自动清理** — 备份7天后自动删除，日志30天后自动删除，完全自动化\n- **冲突保护恢复** — 恢复时若目标位置已有文件，自动移到 `temp_existing/` 暂存\n- **完整操作日志** — 每次备份、恢复、清理、安全拦截操作均有记录（含 SECURITY 级别）\n- **`--force` 恢复旧备份（v0.3.0 新增）** — 对 v0.3.0 之前创建的旧备份（无 SHA256 记录），可用 `--force` 强制恢复（路径验证仍生效）\n\n### English\n\n- **Automatic backup before deletion** — Automatically backs up any file to a timestamped folder before deletion\n- **Mandatory SHA256 integrity check (v0.3.0 fixed)** — Computes hash during backup and verifies during recovery; missing or empty SHA256 record now blocks restore by default (bypass attack eliminated)\n- **PATH cross-validation (NEW in v0.3.0)** — SHA256 file now stores FILE_HASH + PATH; restore performs cross-check between `.sha256` record and `.path` file, fully preventing `.path` redirection attacks\n- **Path traversal protection** — Detects `../` escape sequences and blocks restores outside the valid directory range\n- **One-click recovery** — Restores accidentally deleted files to their original location\n- **Multi-file safe handling** — When a backup folder contains multiple files, all must be restored before deleting the backup\n- **Automatic cleanup** — Backups are deleted after 7 days and logs after 30 days, fully automated\n- **Conflict-protected recovery** — If a file already exists at the restore destination, it is automatically moved to `temp_existing/` for staging\n- **Complete operation logs** — Every backup, restore, cleanup, and security interception operation is logged (including SECURITY level)\n- **`--force` for legacy backups (NEW in v0.3.0)** — Use `--force` to restore pre-v0.3.0 backups that lack SHA256 records (path validation still applies)\n\n---\n\n## 安装方式 / Installation\n\n### 中文\n\n### 通过 ClawdHub 安装（推荐）\n\n```bash\n# 安装最新版（v0.3.0）\nclawdhub install delete-recovery\n\n# 安装指定版本\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### 手动安装\n\n将 `delete-recovery-0.3.0` 文件夹复制到本地 Agent 的 OpenClaw workspace 的 `skills/` 目录下。\n\n### English\n\n### Install via ClawdHub (Recommended)\n\n```bash\n# Install latest version (v0.3.0)\nclawdhub install delete-recovery\n\n# Install specific version\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### Manual Installation\n\nCopy the `delete-recovery-0.3.0` folder to the `skills/` directory in your local Agent's OpenClaw workspace.\n\n---\n\n## 快速开始 / Quick Start\n\n### 中文\n\n### 1. 删除前备份\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# 示例\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. 恢复误删文件\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# 恢复 v0.3.0 之前的旧备份（无 SHA256 记录）\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. 验证备份完整性\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\n不执行恢复，仅检查备份文件是否被篡改（SHA256 完整性 + PATH 交叉验证）。\n\n### 4. 查看所有备份\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. 手动删除指定备份\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. 手动触发清理\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. 查看操作日志\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n### English\n\n### 1. Backup Before Deletion\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# Example\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. Restore Accidentally Deleted Files\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# Restore pre-v0.3.0 backup (no SHA256 record) using --force\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. Verify Backup Integrity\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\nDoes not perform recovery. Checks SHA256 integrity AND PATH cross-validation to detect any tampering.\n\n### 4. List All Backups\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. Manually Delete Specified Backup\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. Manually Trigger Cleanup\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. View Operation Logs\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n---\n\n## 安全机制详解（v0.3.0）/ Security Mechanisms Explained (v0.3.0)\n\n### 中文\n\n### 场景1：备份被替换\n\n攻击者先备份一个正常文件，然后用恶意文件替换备份目录中的文件，诱导恢复。\n\n**防御：** backup 时计算 SHA256 并存储；restore 时验证哈希，不匹配则拒绝恢复。即使攻击者删除了 `.sha256` 文件，restore 也会被阻止（除非使用 `--force`，且路径验证仍然生效）。\n\n### 场景2：.path 文件被篡改\n\n攻击者修改 `.path` 文件内容，将恢复目标指向系统目录（如 `C:\\Windows\\System32\\evil.exe`）。\n\n**防御：** v0.3.0 新增 `.sha256` 文件中的 PATH 字段。restore 时读取 `.sha256` 中存储的原始路径，与 `.path` 文件内容进行交叉验证，二者不一致则拒绝恢复。\n\n### 场景3：SHA256 记录被删除绕过\n\n攻击者直接删除或置空 `.sha256` 文件，试图绕过完整性检查。\n\n**防御：** v0.3.0 修复此漏洞——SHA256 记录缺失或为空时，restore 默认阻止并报错，不再跳过完整性检查。\n\n### 场景4：路径遍历\n\n攻击者在目标路径中构造 `../../../dangerous/evil.exe`，试图逃逸到合法目录范围外。\n\n**防御：** `_is_path_safe()` 检测 `..` 成分，resolve 后路径不在合法范围则拒绝。\n\n### English\n\n### Scenario 1: Backup Replaced\n\nAn attacker first backs up a normal file, then replaces the file in the backup directory with a malicious one to induce recovery.\n\n**Defense:** Compute and store SHA256 during backup; verify hash during restore and reject if mismatched. If the attacker also deletes the `.sha256` file to bypass the check, restore is still blocked by default (unless `--force` is used, and path validation still applies).\n\n### Scenario 2: .path File Tampered\n\nAn attacker modifies the `.path` file content to point the restore target to a system directory (e.g., `C:\\Windows\\System32\\evil.exe`).\n\n**Defense:** v0.3.0 stores the original path in the `.sha256` file (in the `PATH:` line). On restore, the path from `.sha256` is cross-checked against the `.path` file — any mismatch is blocked.\n\n### Scenario 3: SHA256 Record Deleted to Bypass Check\n\nAn attacker deletes or empties the `.sha256` file to bypass integrity checks.\n\n**Defense:** v0.3.0 fixes this — missing or empty SHA256 record now blocks restore by default. The only escape hatch is `--force`, but path cross-validation still runs.\n\n### Scenario 4: Path Traversal\n\nAn attacker constructs `../../../dangerous/evil.exe` in the target path to escape outside the allowed directory.\n\n**Defense:** `_is_path_safe()` detects `..` components and rejects if the resolved path is outside the valid range.\n\n---\n\n## SHA256 文件格式（v0.3.0）/ SHA256 File Format (v0.3.0)\n\n### 中文\n\n`.sha256` 文件采用结构化格式，同时存储文件哈希和原始路径：\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**：格式版本号，用于未来兼容升级\n- **`FILE_HASH:`**：备份文件的 SHA256 哈希（64位十六进制）\n- **`PATH:`**：备份时的原始文件路径（与 `.path` 文件内容一致，用于交叉验证）\n\n### English\n\nThe `.sha256` file uses a structured format that stores both the file hash and original path:\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**: Format version marker for future compatibility\n- **`FILE_HASH:`**: SHA256 hash of the backup file (64 hex characters)\n- **`PATH:`**: Original file path at backup time (mirrors `.path` file; used for cross-validation)\n\n---\n\n## 文件结构 / File Structure\n\n### 中文\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill 定义\n├── README.md                          — 使用指南（本文）\n├── CLAWDHUB.md                        — ClawdHub 发布元数据\n├── log.txt                            — 操作日志（30天自动清理）\n├── delete_backup/                     — 备份存储（7天自动清理）\n│   ├── YYYYMMDDHHMM/                — 时间戳备份文件夹\n│   │   ├── C__Users__...            — 备份文件\n│   │   ├── C__Users__...path         — 原始路径记录\n│   │   ├── C__Users__...sha256       — SHA256 完整性 + PATH 交叉验证记录（v0.3.0）\n│   │   └── .restored                 — 已恢复文件清单\n│   └── temp_existing/                 — 恢复时暂存冲突文件\n└── scripts/\n    ├── delete_recovery.py            — 核心脚本（含安全验证）\n    └── safe_path.py                  — 路径安全验证模块（v0.3.0）\n```\n\n### English\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill definition\n├── README.md                          — User guide (this document)\n├── CLAWDHUB.md                        — ClawdHub publishing metadata\n├── log.txt                            — Operation logs (auto-cleaned after 30 days)\n├── delete_backup/                     — Backup storage (auto-cleaned after 7 days)\n│   ├── YYYYMMDDHHMM/                — Timestamped backup folder\n│   │   ├── C__Users__...            — Backup file\n│   │   ├── C__Users__...path         — Original path record\n│   │   ├── C__Users__...sha256       — SHA256 + PATH cross-validation record (v0.3.0)\n│   │   └── .restored                 — Restored files manifest\n│   └── temp_existing/                 — Conflict files staged during recovery\n└── scripts/\n    ├── delete_recovery.py            — Core script (with security checks)\n    └── safe_path.py                  — Path safety validation module (v0.3.0)\n```\n\n---\n\n## 工作流程 / Workflow\n\n### 中文\n\n```\n用户决定删除文件\n        │\n        ▼\n  ① backup 命令          ← 第一步必须做（v0.3.0 自动生成 SHA256 + PATH 记录）\n        │\n        ▼\n  ② 用户执行删除操作\n        │\n        ▼（后续如需恢复）\n  ③ restore 命令         ← v0.3.0：完整性 + PATH 交叉验证 + 遍历检测\n        │\n        ▼\n  备份自动删除            ←（除非使用了 --keep-backup）\n```\n\n### English\n\n```\nUser decides to delete file\n        │\n        ▼\n  ① backup command    ← Must do first (v0.3.0 auto-generates SHA256 + PATH record)\n        │\n        ▼\n  ② User performs deletion\n        │\n        ▼（If recovery needed later）\n  ③ restore command ← v0.3.0: integrity + PATH cross-validation + traversal detection\n        │\n        ▼\n  Backup auto-deleted  ←（Unless --keep-backup is used）\n```\n\n---\n\n## 依赖环境 / Dependencies\n\n### 中文\n\n- Python 3.6+\n- OpenClaw 1.0+（含 skill 支持）\n\n### English\n\n- Python 3.6+\n- OpenClaw 1.0+ (with skill support)\n\n---\n\n## 更新日志 / Changelog\n\n### 中文\n\n### v0.3.0（2026-03-27） — 当前版本\n\n**安全修复：**\n\n- 【最关键】SHA256 记录改为**强制要求** — 缺失或为空时 restore **默认阻止**，修复了\"删除 `.sha256` 文件即可绕过完整性检查\"的严重漏洞\n- 【安全增强】`.sha256` 文件新增 `PATH:` 行 — restore 时双向交叉验证 `.sha256` 中存储的路径与 `.path` 文件内容，彻底防止 `.path` 篡改攻击\n- 【Bug 修复】修复 `allowed_roots` 死代码 — `allowed_roots=[]`（空列表）现正确表示\"无路径限制\"（不再误判为禁止所有路径）\n- 【安全调整】`allowed_roots` 默认为空 — 安全防护主要依赖完整性 + 路径交叉验证，而非固定目录限制，更适合恢复工具的实际场景\n- 【接口变更】restore 新增 `--force` 参数 — 跳过 SHA256 存在性检查，用于强制恢复 v0.3.0 之前的旧备份（路径验证仍生效）\n- 【Bug 修复】`verify` 命令新增 PATH 交叉验证结果 — 同时报告 hash_match 和 path_match 两个检查的结果\n\n**完整变更：**\n- `safe_path.py`：完全重写 `verify_integrity_and_path()`，新增 `write_sha256_file()` / `read_sha256_file()`，格式改为 `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`：集成新版安全 API，`--force` 参数，`verify` 返回 path_match\n- 更新 SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0（2026-03-26）— 上一版本\n\n- 新增 `safe_path.py` 路径安全验证模块\n- backup 时自动计算并存储 SHA256 哈希（`.sha256` 文件）\n- restore 时验证备份完整性（SHA256 比对），完整性不符拒绝恢复\n- restore 时验证恢复路径（防止 `.path` 篡改 + 路径遍历）\n- 所有安全拦截事件记录为 `SECURITY` 级别日志\n- 新增 `verify` 命令：手动检查备份完整性（不执行恢复）\n- 新增 `safe_path.py` 独立工具：可单独调用 `compute <file_path>` 计算 SHA256\n\n### v0.1.0（2026-03-26）\n\n- 基础备份/恢复/清理功能\n- 7天自动清理备份，30天自动清理日志\n- 多文件批量恢复保护\n- 冲突保护恢复\n\n### English\n\n### v0.3.0 (2026-03-27) — Current Version\n\n**Security fixes:**\n\n- 【Critical】SHA256 record is now **STRICTLY REQUIRED** — missing or empty SHA256 blocks restore by default, fixing the critical bypass vulnerability where deleting `.sha256` disabled integrity checks\n- 【Security enhancement】`.sha256` file now stores `PATH:` line — restore performs cross-check between the path stored in `.sha256` and the `.path` file, fully preventing `.path` redirection attacks\n- 【Bug fix】Fixed `allowed_roots` dead code — `allowed_roots=[]` (empty list) now correctly means \"no restriction\" (previously falsely blocked all paths)\n- 【Security adjustment】`allowed_roots` defaults to empty — primary security comes from integrity + path cross-validation rather than fixed directory restrictions, which is more appropriate for a recovery tool\n- 【Interface change】restore command gains `--force` flag — bypasses SHA256 existence check to restore pre-v0.3.0 backups (path validation still applies)\n- 【Bug fix】`verify` command now reports PATH cross-validation result — returns both hash_match and path_match\n\n**Complete changes:**\n- `safe_path.py`: Fully rewritten `verify_integrity_and_path()`, new `write_sha256_file()` / `read_sha256_file()`, format changed to `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`: Integrated new security API, `--force` flag, `verify` returns path_match\n- Updated SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0 (2026-03-26) — Previous Version\n\n- Added `safe_path.py` path safety validation module\n- SHA256 hash computed and stored on backup (`.sha256` file)\n- Restore verifies SHA256 integrity — blocks restore if hash mismatch\n- Restore validates destination path — prevents `.path` tampering and path traversal\n- All security blocks logged at `SECURITY` level\n- Added `verify` command: manually check backup integrity without restoring\n- Added `safe_path.py` standalone tool: `python safe_path.py compute <file>`\n\n### v0.1.0 (2026-03-26)\n\n- Basic backup/restore/cleanup functionality\n- 7-day auto backup cleanup, 30-day auto log cleanup\n- Multi-file batch recovery protection\n- Conflict-protected recovery\n\n---\n\n### 中文\n\n*如有问题或建议，欢迎反馈！*\n\n### English\n\n*For questions or suggestions, feedback is welcome!*\n\nv0.2.1 | 2026-03-27T00:44:19.278Z | user\n\n# delete-recovery v0.3.0\n\n### 中文\n\n文件删除安全网——备份、恢复、SHA256完整性校验、路径交叉验证、全自动清理。\n\n### English\n\nA safety net for file deletion — backup, recovery, SHA256 integrity verification, path cross-validation, and fully automatic cleanup.\n\n---\n\n### 中文\n\n一款轻量的 OpenClaw skill，在删除文件前自动将其备份到带时间戳的文件夹。**v0.3.0 新增 SHA256 强制校验 + PATH 交叉验证**，修复了 v0.2.0 中 SHA256 可被绕过的安全漏洞，防止恶意文件注入攻击。误删后一键恢复，过期备份和日志全自动清理，无需人工干预。\n\n### English\n\nA lightweight OpenClaw skill that automatically backs up files to timestamped folders before deletion. **v0.3.0 adds mandatory SHA256 integrity checks and PATH cross-validation**, fixing a security bypass vulnerability in v0.2.0 and preventing malicious file injection attacks. Recover accidentally deleted files with one click, and expired backups and logs are automatically cleaned up without manual intervention.\n\n---\n\n## 功能特性 / Features\n\n### 中文\n\n- **删除前自动备份** — 删除任何文件前，自动备份到带时间戳的文件夹\n- **SHA256 强制校验（v0.3.0 修复）** — 备份时计算哈希，恢复时验证；SHA256 记录缺失或为空时 restore 默认阻止（无法再通过删除文件绕过）\n- **PATH 交叉验证（v0.3.0 新增）** — `.sha256` 文件中绑定原始路径，恢复时双向交叉验证，彻底防止 `.path` 文件被篡改定向到任意位置\n- **路径遍历防护** — 检测 `../` 逃逸序列，拒绝恢复目标超出合法范围\n- **一键恢复** — 将误删文件恢复到原始位置\n- **多文件安全处理** — 同一备份文件夹含多文件时，须全部恢复完毕才删除备份\n- **自动清理** — 备份7天后自动删除，日志30天后自动删除，完全自动化\n- **冲突保护恢复** — 恢复时若目标位置已有文件，自动移到 `temp_existing/` 暂存\n- **完整操作日志** — 每次备份、恢复、清理、安全拦截操作均有记录（含 SECURITY 级别）\n- **`--force` 恢复旧备份（v0.3.0 新增）** — 对 v0.3.0 之前创建的旧备份（无 SHA256 记录），可用 `--force` 强制恢复（路径验证仍生效）\n\n### English\n\n- **Automatic backup before deletion** — Automatically backs up any file to a timestamped folder before deletion\n- **Mandatory SHA256 integrity check (v0.3.0 fixed)** — Computes hash during backup and verifies during recovery; missing or empty SHA256 record now blocks restore by default (bypass attack eliminated)\n- **PATH cross-validation (NEW in v0.3.0)** — SHA256 file now stores FILE_HASH + PATH; restore performs cross-check between `.sha256` record and `.path` file, fully preventing `.path` redirection attacks\n- **Path traversal protection** — Detects `../` escape sequences and blocks restores outside the valid directory range\n- **One-click recovery** — Restores accidentally deleted files to their original location\n- **Multi-file safe handling** — When a backup folder contains multiple files, all must be restored before deleting the backup\n- **Automatic cleanup** — Backups are deleted after 7 days and logs after 30 days, fully automated\n- **Conflict-protected recovery** — If a file already exists at the restore destination, it is automatically moved to `temp_existing/` for staging\n- **Complete operation logs** — Every backup, restore, cleanup, and security interception operation is logged (including SECURITY level)\n- **`--force` for legacy backups (NEW in v0.3.0)** — Use `--force` to restore pre-v0.3.0 backups that lack SHA256 records (path validation still applies)\n\n---\n\n## 安装方式 / Installation\n\n### 中文\n\n### 通过 ClawdHub 安装（推荐）\n\n```bash\n# 安装最新版（v0.3.0）\nclawdhub install delete-recovery\n\n# 安装指定版本\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### 手动安装\n\n将 `delete-recovery-0.3.0` 文件夹复制到本地 Agent 的 OpenClaw workspace 的 `skills/` 目录下。\n\n### English\n\n### Install via ClawdHub (Recommended)\n\n```bash\n# Install latest version (v0.3.0)\nclawdhub install delete-recovery\n\n# Install specific version\nclawdhub install delete-recovery --version 0.3.0\n```\n\n### Manual Installation\n\nCopy the `delete-recovery-0.3.0` folder to the `skills/` directory in your local Agent's OpenClaw workspace.\n\n---\n\n## 快速开始 / Quick Start\n\n### 中文\n\n### 1. 删除前备份\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# 示例\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. 恢复误删文件\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# 恢复 v0.3.0 之前的旧备份（无 SHA256 记录）\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. 验证备份完整性\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\n不执行恢复，仅检查备份文件是否被篡改（SHA256 完整性 + PATH 交叉验证）。\n\n### 4. 查看所有备份\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. 手动删除指定备份\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. 手动触发清理\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. 查看操作日志\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n### English\n\n### 1. Backup Before Deletion\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# Example\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. Restore Accidentally Deleted Files\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# Restore pre-v0.3.0 backup (no SHA256 record) using --force\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force\n```\n\n### 3. Verify Backup Integrity\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\nDoes not perform recovery. Checks SHA256 integrity AND PATH cross-validation to detect any tampering.\n\n### 4. List All Backups\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. Manually Delete Specified Backup\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. Manually Trigger Cleanup\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. View Operation Logs\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n---\n\n## 安全机制详解（v0.3.0）/ Security Mechanisms Explained (v0.3.0)\n\n### 中文\n\n### 场景1：备份被替换\n\n攻击者先备份一个正常文件，然后用恶意文件替换备份目录中的文件，诱导恢复。\n\n**防御：** backup 时计算 SHA256 并存储；restore 时验证哈希，不匹配则拒绝恢复。即使攻击者删除了 `.sha256` 文件，restore 也会被阻止（除非使用 `--force`，且路径验证仍然生效）。\n\n### 场景2：.path 文件被篡改\n\n攻击者修改 `.path` 文件内容，将恢复目标指向系统目录（如 `C:\\Windows\\System32\\evil.exe`）。\n\n**防御：** v0.3.0 新增 `.sha256` 文件中的 PATH 字段。restore 时读取 `.sha256` 中存储的原始路径，与 `.path` 文件内容进行交叉验证，二者不一致则拒绝恢复。\n\n### 场景3：SHA256 记录被删除绕过\n\n攻击者直接删除或置空 `.sha256` 文件，试图绕过完整性检查。\n\n**防御：** v0.3.0 修复此漏洞——SHA256 记录缺失或为空时，restore 默认阻止并报错，不再跳过完整性检查。\n\n### 场景4：路径遍历\n\n攻击者在目标路径中构造 `../../../dangerous/evil.exe`，试图逃逸到合法目录范围外。\n\n**防御：** `_is_path_safe()` 检测 `..` 成分，resolve 后路径不在合法范围则拒绝。\n\n### English\n\n### Scenario 1: Backup Replaced\n\nAn attacker first backs up a normal file, then replaces the file in the backup directory with a malicious one to induce recovery.\n\n**Defense:** Compute and store SHA256 during backup; verify hash during restore and reject if mismatched. If the attacker also deletes the `.sha256` file to bypass the check, restore is still blocked by default (unless `--force` is used, and path validation still applies).\n\n### Scenario 2: .path File Tampered\n\nAn attacker modifies the `.path` file content to point the restore target to a system directory (e.g., `C:\\Windows\\System32\\evil.exe`).\n\n**Defense:** v0.3.0 stores the original path in the `.sha256` file (in the `PATH:` line). On restore, the path from `.sha256` is cross-checked against the `.path` file — any mismatch is blocked.\n\n### Scenario 3: SHA256 Record Deleted to Bypass Check\n\nAn attacker deletes or empties the `.sha256` file to bypass integrity checks.\n\n**Defense:** v0.3.0 fixes this — missing or empty SHA256 record now blocks restore by default. The only escape hatch is `--force`, but path cross-validation still runs.\n\n### Scenario 4: Path Traversal\n\nAn attacker constructs `../../../dangerous/evil.exe` in the target path to escape outside the allowed directory.\n\n**Defense:** `_is_path_safe()` detects `..` components and rejects if the resolved path is outside the valid range.\n\n---\n\n## SHA256 文件格式（v0.3.0）/ SHA256 File Format (v0.3.0)\n\n### 中文\n\n`.sha256` 文件采用结构化格式，同时存储文件哈希和原始路径：\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**：格式版本号，用于未来兼容升级\n- **`FILE_HASH:`**：备份文件的 SHA256 哈希（64位十六进制）\n- **`PATH:`**：备份时的原始文件路径（与 `.path` 文件内容一致，用于交叉验证）\n\n### English\n\nThe `.sha256` file uses a structured format that stores both the file hash and original path:\n\n```\n#v3\nFILE_HASH:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\nPATH:C:\\Users\\user\\Desktop\\report.docx\n```\n\n- **`#v3`**: Format version marker for future compatibility\n- **`FILE_HASH:`**: SHA256 hash of the backup file (64 hex characters)\n- **`PATH:`**: Original file path at backup time (mirrors `.path` file; used for cross-validation)\n\n---\n\n## 文件结构 / File Structure\n\n### 中文\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill 定义\n├── README.md                          — 使用指南（本文）\n├── CLAWDHUB.md                        — ClawdHub 发布元数据\n├── log.txt                            — 操作日志（30天自动清理）\n├── delete_backup/                     — 备份存储（7天自动清理）\n│   ├── YYYYMMDDHHMM/                — 时间戳备份文件夹\n│   │   ├── C__Users__...            — 备份文件\n│   │   ├── C__Users__...path         — 原始路径记录\n│   │   ├── C__Users__...sha256       — SHA256 完整性 + PATH 交叉验证记录（v0.3.0）\n│   │   └── .restored                 — 已恢复文件清单\n│   └── temp_existing/                 — 恢复时暂存冲突文件\n└── scripts/\n    ├── delete_recovery.py            — 核心脚本（含安全验证）\n    └── safe_path.py                  — 路径安全验证模块（v0.3.0）\n```\n\n### English\n\n```\ndelete-recovery-0.3.0/\n├── SKILL.md                          — Skill definition\n├── README.md                          — User guide (this document)\n├── CLAWDHUB.md                        — ClawdHub publishing metadata\n├── log.txt                            — Operation logs (auto-cleaned after 30 days)\n├── delete_backup/                     — Backup storage (auto-cleaned after 7 days)\n│   ├── YYYYMMDDHHMM/                — Timestamped backup folder\n│   │   ├── C__Users__...            — Backup file\n│   │   ├── C__Users__...path         — Original path record\n│   │   ├── C__Users__...sha256       — SHA256 + PATH cross-validation record (v0.3.0)\n│   │   └── .restored                 — Restored files manifest\n│   └── temp_existing/                 — Conflict files staged during recovery\n└── scripts/\n    ├── delete_recovery.py            — Core script (with security checks)\n    └── safe_path.py                  — Path safety validation module (v0.3.0)\n```\n\n---\n\n## 工作流程 / Workflow\n\n### 中文\n\n```\n用户决定删除文件\n        │\n        ▼\n  ① backup 命令          ← 第一步必须做（v0.3.0 自动生成 SHA256 + PATH 记录）\n        │\n        ▼\n  ② 用户执行删除操作\n        │\n        ▼（后续如需恢复）\n  ③ restore 命令         ← v0.3.0：完整性 + PATH 交叉验证 + 遍历检测\n        │\n        ▼\n  备份自动删除            ←（除非使用了 --keep-backup）\n```\n\n### English\n\n```\nUser decides to delete file\n        │\n        ▼\n  ① backup command    ← Must do first (v0.3.0 auto-generates SHA256 + PATH record)\n        │\n        ▼\n  ② User performs deletion\n        │\n        ▼（If recovery needed later）\n  ③ restore command ← v0.3.0: integrity + PATH cross-validation + traversal detection\n        │\n        ▼\n  Backup auto-deleted  ←（Unless --keep-backup is used）\n```\n\n---\n\n## 依赖环境 / Dependencies\n\n### 中文\n\n- Python 3.6+\n- OpenClaw 1.0+（含 skill 支持）\n\n### English\n\n- Python 3.6+\n- OpenClaw 1.0+ (with skill support)\n\n---\n\n## 更新日志 / Changelog\n\n### 中文\n\n### v0.3.0（2026-03-27） — 当前版本\n\n**安全修复：**\n\n- 【最关键】SHA256 记录改为**强制要求** — 缺失或为空时 restore **默认阻止**，修复了\"删除 `.sha256` 文件即可绕过完整性检查\"的严重漏洞\n- 【安全增强】`.sha256` 文件新增 `PATH:` 行 — restore 时双向交叉验证 `.sha256` 中存储的路径与 `.path` 文件内容，彻底防止 `.path` 篡改攻击\n- 【Bug 修复】修复 `allowed_roots` 死代码 — `allowed_roots=[]`（空列表）现正确表示\"无路径限制\"（不再误判为禁止所有路径）\n- 【安全调整】`allowed_roots` 默认为空 — 安全防护主要依赖完整性 + 路径交叉验证，而非固定目录限制，更适合恢复工具的实际场景\n- 【接口变更】restore 新增 `--force` 参数 — 跳过 SHA256 存在性检查，用于强制恢复 v0.3.0 之前的旧备份（路径验证仍生效）\n- 【Bug 修复】`verify` 命令新增 PATH 交叉验证结果 — 同时报告 hash_match 和 path_match 两个检查的结果\n\n**完整变更：**\n- `safe_path.py`：完全重写 `verify_integrity_and_path()`，新增 `write_sha256_file()` / `read_sha256_file()`，格式改为 `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`：集成新版安全 API，`--force` 参数，`verify` 返回 path_match\n- 更新 SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0（2026-03-26）— 上一版本\n\n- 新增 `safe_path.py` 路径安全验证模块\n- backup 时自动计算并存储 SHA256 哈希（`.sha256` 文件）\n- restore 时验证备份完整性（SHA256 比对），完整性不符拒绝恢复\n- restore 时验证恢复路径（防止 `.path` 篡改 + 路径遍历）\n- 所有安全拦截事件记录为 `SECURITY` 级别日志\n- 新增 `verify` 命令：手动检查备份完整性（不执行恢复）\n- 新增 `safe_path.py` 独立工具：可单独调用 `compute <file_path>` 计算 SHA256\n\n### v0.1.0（2026-03-26）\n\n- 基础备份/恢复/清理功能\n- 7天自动清理备份，30天自动清理日志\n- 多文件批量恢复保护\n- 冲突保护恢复\n\n### English\n\n### v0.3.0 (2026-03-27) — Current Version\n\n**Security fixes:**\n\n- 【Critical】SHA256 record is now **STRICTLY REQUIRED** — missing or empty SHA256 blocks restore by default, fixing the critical bypass vulnerability where deleting `.sha256` disabled integrity checks\n- 【Security enhancement】`.sha256` file now stores `PATH:` line — restore performs cross-check between the path stored in `.sha256` and the `.path` file, fully preventing `.path` redirection attacks\n- 【Bug fix】Fixed `allowed_roots` dead code — `allowed_roots=[]` (empty list) now correctly means \"no restriction\" (previously falsely blocked all paths)\n- 【Security adjustment】`allowed_roots` defaults to empty — primary security comes from integrity + path cross-validation rather than fixed directory restrictions, which is more appropriate for a recovery tool\n- 【Interface change】restore command gains `--force` flag — bypasses SHA256 existence check to restore pre-v0.3.0 backups (path validation still applies)\n- 【Bug fix】`verify` command now reports PATH cross-validation result — returns both hash_match and path_match\n\n**Complete changes:**\n- `safe_path.py`: Fully rewritten `verify_integrity_and_path()`, new `write_sha256_file()` / `read_sha256_file()`, format changed to `#v3 / FILE_HASH: / PATH:`\n- `delete_recovery.py`: Integrated new security API, `--force` flag, `verify` returns path_match\n- Updated SKILL.md / README.md / CLAWDHUB.md\n\n### v0.2.0 (2026-03-26) — Previous Version\n\n- Added `safe_path.py` path safety validation module\n- SHA256 hash computed and stored on backup (`.sha256` file)\n- Restore verifies SHA256 integrity — blocks restore if hash mismatch\n- Restore validates destination path — prevents `.path` tampering and path traversal\n- All security blocks logged at `SECURITY` level\n- Added `verify` command: manually check backup integrity without restoring\n- Added `safe_path.py` standalone tool: `python safe_path.py compute <file>`\n\n### v0.1.0 (2026-03-26)\n\n- Basic backup/restore/cleanup functionality\n- 7-day auto backup cleanup, 30-day auto log cleanup\n- Multi-file batch recovery protection\n- Conflict-protected recovery\n\n---\n\n### 中文\n\n*如有问题或建议，欢迎反馈！*\n\n### English\n\n*For questions or suggestions, feedback is welcome!*\n\nv0.2.0 | 2026-03-26T10:04:32.841Z | user\n\n# delete-recovery v0.2.0\n\n### 中文\n\n文件删除安全网——备份、恢复、完整性校验、全自动清理。\n\n### English\n\nA safety net for file deletion — backup, recovery, integrity verification, and fully automatic cleanup.\n\n### 中文\n\n一款轻量的 OpenClaw skill，在删除文件前自动将其备份到带时间戳的文件夹。**v0.2.0 新增 SHA256 完整性校验和路径安全验证**，防止恶意文件注入攻击。误删后一键恢复，过期备份和日志全自动清理，无需人工干预。\n\n### English\n\nThis is a lightweight OpenClaw skill that automatically backs up files to timestamped folders before deletion. **v0.2.0 adds SHA256 integrity verification and path safety validation** to prevent malicious file injection attacks. Recover accidentally deleted files with one click, and expired backups and logs are automatically cleaned up without manual intervention.\n\n## 功能特性 / Features\n\n### 中文\n\n- **删除前自动备份** — 删除任何文件前，自动备份到带时间戳的文件夹\n- **SHA256 完整性验证（v0.2.0 新增）** — 备份时计算哈希，恢复时验证，防止备份被替换/篡改\n- **路径安全验证（v0.2.0 新增）** — 防止 `.path` 文件被篡改、利用 `../` 遍历逃逸，恢复路径必须在合法范围内\n- **一键恢复** — 将误删文件恢复到原始位置\n- **多文件安全处理** — 同一备份文件夹含多文件时，须全部恢复完毕才删除备份\n- **自动清理** — 备份7天后自动删除，日志30天后自动删除，完全自动化\n- **冲突保护恢复** — 恢复时若目标位置已有文件，自动移到 `temp_existing/` 暂存\n- **完整操作日志** — 每次备份、恢复、清理、安全拦截操作均有记录（含 SECURITY 级别）\n\n### English\n\n- **Automatic backup before deletion** — Automatically backs up any file to a timestamped folder before deletion\n- **SHA256 integrity verification (NEW in v0.2.0)** — Computes hash during backup and verifies during recovery to prevent backup replacement or tampering\n- **Path safety verification (NEW in v0.2.0)** — Prevents `.path` file tampering and `../` traversal escape; restore paths must be within valid bounds\n- **One-click recovery** — Restores accidentally deleted files to their original location\n- **Multi-file safe handling** — When a backup folder contains multiple files, all must be restored before deleting the backup\n- **Automatic cleanup** — Backups are deleted after 7 days and logs after 30 days, fully automated\n- **Conflict-protected recovery** — If a file already exists at the restore destination, it is automatically moved to `temp_existing/` for staging\n- **Complete operation logs** — Every backup, restore, cleanup, and security interception operation is logged (including SECURITY level)\n\n## 安装方式 / Installation\n\n### 中文\n\n### 通过 ClawdHub 安装（推荐）\n\n```bash\n# 安装最新版（v0.2.0）\nclawdhub install delete-recovery\n\n# 安装指定版本\nclawdhub install delete-recovery --version 0.2.0\n```\n\n### 手动安装\n\n将 `delete-recovery-0.2.0` 文件夹复制到本地 Agent 的 OpenClaw workspace 的 `skills/` 目录下。\n\n### English\n\n### Install via ClawdHub (Recommended)\n\n```bash\n# Install latest version (v0.2.0)\nclawdhub install delete-recovery\n\n# Install specific version\nclawdhub install delete-recovery --version 0.2.0\n```\n\n### Manual Installation\n\nCopy the `delete-recovery-0.2.0` folder to the `skills/` directory in your local Agent's OpenClaw workspace.\n\n## 快速开始 / Quick Start\n\n### 中文\n\n### 1. 删除前备份\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# 示例\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. 恢复误删文件\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n```\n\n### 3. 验证备份完整性（v0.2.0 新增）\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\n不执行恢复，仅检查备份文件是否被篡改。\n\n### 4. 查看所有备份\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. 手动删除指定备份\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. 手动触发清理\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. 查看操作日志\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n### English\n\n### 1. Backup Before Deletion\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n```bash\n# Example\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n### 2. Restore Accidentally Deleted Files\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup]\n```\n\n```bash\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n```\n\n### 3. Verify Backup Integrity (NEW in v0.2.0)\n\n```bash\npython delete_recovery.py verify <backup_folder> <safe_name>\n```\n\nDoes not perform recovery, only checks if backup files have been tampered with.\n\n### 4. List All Backups\n\n```bash\npython delete_recovery.py list\n```\n\n### 5. Manually Delete Specified Backup\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 6. Manually Trigger Cleanup\n\n```bash\npython delete_recovery.py cleanup\n```\n\n### 7. View Operation Logs\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n## 安全机制详解（v0.2.0）/ Security Mechanisms Explained (v0.2.0)\n\n### 中文\n\n### 场景1：备份被替换\n\n攻击者先备份一个正常文件，然后用恶意文件替换备份目录中的文件，诱导恢复。\n\n**防御：** backup 时计算 SHA256 并存储；restore 时验证哈希，不匹配则拒绝恢复。\n\n### 场景2：.path 文件被篡改\n\n攻击者修改 `.path` 文件内容，将恢复目标指向系统目录（如 `C:\\Windows\\System32\\evil.exe`）。\n\n**防御：** restore 时对比 dest 路径与 `.path` 记录的 original_path，不一致则拒绝。\n\n### 场景3：路径遍历\n\n攻击者在目标路径中构造 `../../../dangerous/evil.exe`，试图逃逸到备份目录外。\n\n**防御：** `_is_path_safe()` 检测 `..` 成分，resolve 后路径不在合法范围则拒绝。\n\n### English\n\n### Scenario 1: Backup Replaced\n\nAn attacker first backs up a normal file, then replaces the file in the backup directory with a malicious one to induce recovery.\n\n**Defense:** Compute and store SHA256 during backup; verify hash during restore and reject if mismatched.\n\n### Scenario 2: .path File Tampered\n\nAn attacker modifies the `.path` file content to point the restore target to a system directory (e.g., `C:\\Windows\\System32\\evil.exe`).\n\n**Defense:** Compare dest path with original_path recorded in `.path` during restore and reject if inconsistent.\n\n### Scenario 3: Path Traversal\n\nAn attacker constructs `../../../dangerous/evil.exe` in the target path to escape outside the backup directory.\n\n**Defense:** `_is_path_safe()` detects `..` components and rejects if the resolved path is outside the valid range.\n\n## 文件结构 / File Structure\n\n### 中文\n\n```\ndelete-recovery-0.2.0/\n├── SKILL.md                          — Skill定义\n├── README.md                          — 使用指南（本文）\n├── CLAWDHUB.md                        — ClawdHub发布元数据\n├── log.txt                            — 操作日志（30天自动清理）\n├── delete_backup/                     — 备份存储（7天自动清理）\n│   ├── YYYYMMDDHHMM/                — 时间戳备份文件夹\n│   │   ├── C__Users__...            — 备份文件\n│   │   ├── C__Users__...path         — 原始路径记录\n│   │   ├── C__Users__...sha256       — SHA256完整性记录（v0.2.0新增）\n│   │   └── .restored                 — 已恢复文件清单\n│   └── temp_existing/                 — 恢复时暂存冲突文件\n└── scripts/\n    ├── delete_recovery.py            — 核心脚本\n    └── safe_path.py                  — 路径安全验证模块（v0.2.0新增）\n```\n\n### English\n\n```\ndelete-recovery-0.2.0/\n├── SKILL.md                          — Skill definition\n├── README.md                          — User guide (this document)\n├── CLAWDHUB.md                        — ClawdHub publishing metadata\n├── log.txt                            — Operation logs (auto-cleaned after 30 days)\n├── delete_backup/                     — Backup storage (auto-cleaned after 7 days)\n│   ├── YYYYMMDDHHMM/                — Timestamped backup folder\n│   │   ├── C__Users__...            — Backup file\n│   │   ├── C__Users__...path         — Original path record\n│   │   ├── C__Users__...sha256       — SHA256 integrity record (NEW in v0.2.0)\n│   │   └── .restored                 — Restored file list\n│   └── temp_existing/                 — Conflict files staged during recovery\n└── scripts/\n    ├── delete_recovery.py            — Core script\n    └── safe_path.py                  — Path safety verification module (NEW in v0.2.0)\n```\n\n## 工作流程 / Workflow\n\n### 中文\n\n```\n用户决定删除文件\n        │\n        ▼\n  ① backup 命令          ← 第一步必须做（v0.2.0 自动生成 SHA256）\n        │\n        ▼\n  ② 用户执行删除操作\n        │\n        ▼（后续如需恢复）\n  ③ restore 命令         ← v0.2.0：完整性+路径安全双重验证\n        │\n        ▼\n  备份自动删除            ←（除非使用了 --keep-backup）\n```\n\n### English\n\n```\nUser decides to delete file\n        │\n        ▼\n  ① backup command    ← Must do first (v0.2.0 auto-generates SHA256)\n        │\n        ▼\n  ② User performs deletion\n        │\n        ▼（If recovery needed later）\n  ③ restore command ← v0.2.0: integrity + path safety dual verification\n        │\n        ▼\n  Backup auto-deleted  ←（Unless --keep-backup is used）\n```\n\n## 依赖环境 / Dependencies\n\n### 中文\n\n- Python 3.6+\n- OpenClaw 1.0+（含 skill 支持）\n\n### English\n\n- Python 3.6+\n- OpenClaw 1.0+ (with skill support)\n\n## 更新日志 / Changelog\n\n### 中文\n\n### v0.2.0（当前版本）\n\n**安全升级：**\n- 新增 `safe_path.py` 路径安全验证模块\n- backup 时自动计算并存储 SHA256 哈希（`.sha256` 文件）\n- restore 时验证备份完整性（SHA256 比对），完整性不符拒绝恢复\n- restore 时验证恢复路径（防止 `.path` 篡改 + 路径遍历）\n- 所有安全拦截事件记录为 `SECURITY` 级别日志\n- 新增 `verify` 命令：手动检查备份完整性（不执行恢复）\n- 新增 `safe_path.py` 独立工具：可单独调用 `compute <file_path>` 计算 SHA256\n\n**完整变更：**\n- `delete_recovery.py`：集成 safe_path 验证，security_error JSON 字段标识安全错误\n- 新增 `.sha256` 文件格式\n- 更新 SKILL.md / README.md / CLAWDHUB.md\n\n### v0.1.0（上一版本）\n\n- 基础备份/恢复/清理功能\n- 7天自动清理备份，30天自动清理日志\n- 多文件批量恢复保护\n- 冲突保护恢复\n\n### English\n\n### v0.2.0（Current Version）\n\n**Security upgrades:**\n- Added `safe_path.py` path safety verification module\n- Auto-compute and store SHA256 hash during backup (`.sha256` file)\n- Verify backup integrity during restore (SHA256 comparison), reject if integrity fails\n- Verify restore path during restore (prevent `.path` tampering + path traversal)\n- All security interception events logged as `SECURITY` level\n- Added `verify` command: manually check backup integrity (no restore performed)\n- Added `safe_path.py` standalone tool: can independently call `compute <file_path>` to calculate SHA256\n\n**Complete changes:**\n- Integrated safe_path verification, `security_error` JSON field identifies security errors\n- Added `.sha256` file format\n- Updated SKILL.md / README.md / CLAWDHUB.md\n\n### v0.1.0（Previous Version）\n\n- Basic backup/restore/cleanup functionality\n- 7-day auto backup cleanup, 30-day auto log cleanup\n- Multi-file batch recovery protection\n- Conflict-protected recovery\n\n---\n\n### 中文\n\n*如有问题或建议，欢迎反馈！*\n\n### English\n\n*For questions or suggestions, feedback is welcome!*\n\nv0.1.0 | 2026-03-26T07:48:44.584Z | user\n\n# delete-recovery\n\n---\n\n###中文###\n\n## 概述\n\n是否经常因为OpenClaw使用时误删除文件而烦恼？delete-recovery这项技能可以帮你解决这个问题。\n\n文件删除安全网——备份、恢复、全自动清理。\n\n一款轻量的 OpenClaw skill，在删除文件前自动将其备份到带时间戳的文件夹，误删后一键恢复，过期备份和日志全自动清理，无需人工干预。\n\n## 功能特性\n\n- **删除前自动备份** — 删除任何文件前，自动备份到带时间戳的文件夹\n- **一键恢复** — 将误删文件恢复到原始位置\n- **多文件安全处理** — 同一备份文件夹含多文件时，须全部恢复完毕才删除备份，避免误删\n- **自动清理** — 备份7天后自动删除，日志30天后自动删除，完全自动化\n- **冲突保护恢复** — 恢复时若目标位置已有文件，自动移到 `temp_existing/` 暂存\n- **完整操作日志** — 每次备份、恢复、清理操作均有记录\n\n## 安装方式\n\n### 通过 ClawdHub 安装（推荐）\n\n```bash\n# 安装最新版\nclawdhub install delete-recovery\n\n# 安装指定版本\nclawdhub install delete-recovery --version 0.1.0\n```\n\n### 手动安装\n\n将 `delete-recovery-0.1.0` 文件夹复制到本地 Agent 的 OpenClaw workspace 的 `skills/` 目录下。\n\n## 使用方法\n\nSkill 通过 `scripts/delete_recovery.py` 提供6个命令：\n\n### 1. 删除前备份\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n将文件备份到 `delete_backup/YYYYMMDDHHMM/` 下的时间戳文件夹。\n\n- `file_path` — 要备份的文件的完整路径\n- `original_path` —（可选）原始路径，用于恢复定位，默认等于 `file_path`\n\n```bash\n# 示例\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n> ⚠️ **删除前必做！** 这是防止误删的关键第一步。\n\n### 2. 恢复误删文件\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup]\n```\n\n将文件从备份恢复到原始位置。\n\n- `backup_folder` — 备份文件夹名（如 `202603261130`）\n- `safe_name` — 备份文件名（路径分隔符 `/`、`\\`, `:` 已替换为 `__`）\n- `--keep-backup` — 可选，恢复成功后保留备份（默认恢复后自动删除）\n\n```bash\n# 示例\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n```\n\n### 3. 查看所有备份\n\n```bash\npython delete_recovery.py list\n```\n\n返回所有备份文件夹及其包含的文件和时间戳。\n\n```json\n{\n  \"backups\": [\n    {\n      \"folder\": \"202603261130\",\n      \"time\": \"202603261130\",\n      \"files\": [\"C__Users__user__Desktop__report.docx\"],\n      \"count\": 1\n    }\n  ]\n}\n```\n\n### 4. 手动删除指定备份\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 5. 手动触发清理\n\n```bash\npython delete_recovery.py cleanup\n```\n\n强制清理过期备份和日志（通常每次脚本调用时自动执行）。\n\n### 6. 查看操作日志\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n查看最近 N 行操作日志，默认50行。\n\n## 文件结构\n\n```\ndelete-recovery-0.1.0/\n├── SKILL.md                          — Skill定义（OpenClaw Agent使用）\n├── README.md                          — 使用指南（本文）\n├── CLAWDHUB.md                        — ClawdHub发布元数据\n├── log.txt                            — 操作日志（30天自动清理）\n├── delete_backup/                     — 备份存储（7天自动清理）\n│   ├── YYYYMMDDHHMM/                 — 时间戳备份文件夹\n│   │   ├── C__Users__...             — 备份文件（路径分隔符已编码）\n│   │   ├── C__Users__...path         — 原始路径记录\n│   │   └── .restored                 — 已恢复文件清单（全部恢复后文件夹自动删除）\n│   └── temp_existing/                 — 恢复时暂存冲突文件\n└── scripts/\n    └── delete_recovery.py            — 核心脚本（6个命令）\n```\n\n## 自动清理规则\n\n|    项目   | 保留时间 |       触发方式       |\n|-----------|----------|---------------------|\n| 备份文件夹 |    7天   | 每次脚本调用自动执行 |\n| 日志文件   |   30天   | 每次脚本调用自动执行 |\n\n## 工作流程\n\n```\n用户决定删除文件\n        │\n        ▼\n  ① backup 命令          ← 第一步必须做\n        │\n        ▼\n  ② 用户执行删除操作\n        │\n        ▼（后续如需恢复）\n  ③ restore 命令         ← 恢复到原始位置\n        │\n        ▼\n  备份自动删除            ←（除非使用了 --keep-backup）\n```\n\n## 依赖环境\n\n- Python 3.6+\n- OpenClaw（含 skill 支持）\n\n## 故障排除\n\n**恢复时报\"文件不存在\"**\n→ 该备份可能已过期（7天）或已被删除。请先用 `list` 命令查看可用备份。\n\n**恢复后备份文件夹未自动删除**\n→ 若同一备份文件夹含多个文件，须等全部文件都恢复后才删除整个文件夹，防止误删其他仍有用的备份。\n\n**恢复目标位置已有文件**\n→ 现有文件会自动移到 `delete_backup/temp_existing/` 再恢复，不会覆盖。\n\n## 更新日志\n\n详见 [CLAWDHUB.md](CLAWDHUB.md)。\n\n---\n\n###English###\n\n## Overview\n\n**Tired of accidentally deleting files while using OpenClaw?** The delete-recovery skill solves this problem for you.\n\nSafeguard your file deletions — automatic backup, restore, and auto-cleanup.\n\nA lightweight OpenClaw skill that backs up files before deletion, lets you recover accidentally deleted files, and automatically cleans up old backups and logs.\n\n## Features\n\n- **Automatic backup before deletion** — Before any file deletion, files are backed up to timestamped folders\n- **One-click restore** — Recover deleted files to their original location instantly\n- **Smart multi-file handling** — When the same backup folder contains multiple files, the folder is only deleted after ALL files are restored, preventing accidental deletion of backups you may still need\n- **Auto-cleanup** — Backups expire after 7 days, logs after 30 days — fully automatic\n- **Conflict-safe restore** — If a file already exists at the restore destination, it is automatically moved to `temp_existing/` for temporary storage before restoring\n- **Full operation logs** — Every backup, restore, and cleanup operation is logged\n\n## Installation\n\n### Via ClawdHub (recommended)\n\n```bash\n# Install latest version\nclawdhub install delete-recovery\n\n# Or install a specific version\nclawdhub install delete-recovery --version 0.1.0\n```\n\n### Manual Installation\n\nCopy the `delete-recovery-0.1.0` folder into your OpenClaw workspace's `skills/` directory.\n\n## Usage\n\nThe skill exposes 6 commands via `scripts/delete_recovery.py`:\n\n### 1. Backup Before Deleting\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\nBacks up a file to a timestamped folder inside `delete_backup/YYYYMMDDHHMM/`.\n\n- `file_path` — Full path of the file to back up\n- `original_path` — (Optional) Original path for restore targeting. Defaults to `file_path`.\n\n```bash\n# Example\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n> ⚠️ **Always back up before deleting.** This is the critical first step.\n\n### 2. Restore a Deleted File\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup]\n```\n\nRestores a file from a backup to its original location.\n\n- `backup_folder` — The timestamp folder name (e.g. `202603261130`)\n- `safe_name` — The backup filename (path separators `/`, `\\`, `:` are replaced with `__` for safe encoding)\n- `--keep-backup` — Optional flag to keep the backup after restore (default: delete after restore)\n\n```bash\n# Example\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n```\n\n### 3. List All Backups\n\n```bash\npython delete_recovery.py list\n```\n\nReturns all backup folders with their files and timestamps.\n\n```json\n{\n  \"backups\": [\n    {\n      \"folder\": \"202603261130\",\n      \"time\": \"202603261130\",\n      \"files\": [\"C__Users__user__Desktop__report.docx\"],\n      \"count\": 1\n    }\n  ]\n}\n```\n\n### 4. Delete a Specific Backup Manually\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 5. Manually Trigger Cleanup\n\n```bash\npython delete_recovery.py cleanup\n```\n\nForcibly cleans up expired backups and logs. Normally this runs automatically on every script call.\n\n### 6. View Operation Logs\n\n```bash\npython delete_recovery.py log [lines]\n```\n\nReads the last N lines of the operation log. Default: 50 lines.\n\n## File Structure\n\n```\ndelete-recovery-0.1.0/\n├── SKILL.md                          # Skill definition for OpenClaw agents\n├── README.md                          # This file\n├── CLAWDHUB.md                        # ClawdHub publish metadata & changelog\n├── log.txt                            # Operation logs (auto-cleaned after 30 days)\n├── delete_backup/                     # Backup storage (auto-cleaned after 7 days)\n│   ├── YYYYMMDDHHMM/                # Timestamped backup folder\n│   │   ├── C__Users__...            # Backup file (path separators encoded)\n│   │   ├── C__Users__...path         # Original path record (for restore targeting)\n│   │   └── .restored                 # Manifest of already-restored files (folder auto-deleted after all files are restored)\n│   └── temp_existing/                # Temporary storage for existing file conflicts\n└── scripts/\n    └── delete_recovery.py            # Core script (all 6 commands)\n```\n\n## Auto-Cleanup\n\n| Item | Retention | Trigger |\n|------|-----------|---------|\n| Backup folders | 7 days | Runs automatically on every script call |\n| Log files | 30 days | Runs automatically on every script call |\n\n## Recovery Workflow\n\n```\nUser decides to delete a file\n        │\n        ▼\n  ① backup command          ← Always do this FIRST\n        │\n        ▼\n  ② User deletes the file\n        │\n        ▼ (later, if needed)\n  ③ restore command         ← Recover to original location\n        │\n        ▼\n  Backup auto-deleted        ← (unless --keep-backup is used)\n```\n\n## Requirements\n\n- Python 3.6+\n- OpenClaw with skill support\n\n## Troubleshooting\n\n**\"File not found\" when restoring**\n→ The backup folder may have already expired (7 days) or been deleted. Use `list` to check available backups.\n\n**Backup folder not auto-deleted after restore**\n→ If multiple files were backed up together in the same folder, the folder is kept until ALL files are restored. This prevents accidentally deleting backups for files you may still want to keep.\n\n**Existing file at restore destination**\n→ The existing file is automatically moved to `delete_backup/temp_existing/` before restoring.\n\n## Changelog\n\nSee [CLAWDHUB.md](CLAWDHUB.md) for full version history.\n\nv1.0.0 | 2026-03-26T06:55:37.279Z | user\n\n# delete-recovery\n\n---\n\n###中文###\n\n## 概述\n\n是否经常因为OpenClaw使用时误删除文件而烦恼？delete-recovery这项技能可以帮你解决这个问题。\n\n文件删除安全网——备份、恢复、全自动清理。\n\n一款轻量的 OpenClaw skill，在删除文件前自动将其备份到带时间戳的文件夹，误删后一键恢复，过期备份和日志全自动清理，无需人工干预。\n\n## 功能特性\n\n- **删除前自动备份** — 删除任何文件前，自动备份到带时间戳的文件夹\n- **一键恢复** — 将误删文件恢复到原始位置\n- **多文件安全处理** — 同一备份文件夹含多文件时，须全部恢复完毕才删除备份，避免误删\n- **自动清理** — 备份7天后自动删除，日志30天后自动删除，完全自动化\n- **冲突保护恢复** — 恢复时若目标位置已有文件，自动移到 `temp_existing/` 暂存\n- **完整操作日志** — 每次备份、恢复、清理操作均有记录\n\n## 安装方式\n\n### 通过 ClawdHub 安装（推荐）\n\n```bash\n# 安装最新版\nclawdhub install delete-recovery\n\n# 安装指定版本\nclawdhub install delete-recovery --version 0.1.0\n```\n\n### 手动安装\n\n将 `delete-recovery-0.1.0` 文件夹复制到本地 Agent 的 OpenClaw workspace 的 `skills/` 目录下。\n\n## 使用方法\n\nSkill 通过 `scripts/delete_recovery.py` 提供6个命令：\n\n### 1. 删除前备份\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\n将文件备份到 `delete_backup/YYYYMMDDHHMM/` 下的时间戳文件夹。\n\n- `file_path` — 要备份的文件的完整路径\n- `original_path` —（可选）原始路径，用于恢复定位，默认等于 `file_path`\n\n```bash\n# 示例\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n> ⚠️ **删除前必做！** 这是防止误删的关键第一步。\n\n### 2. 恢复误删文件\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup]\n```\n\n将文件从备份恢复到原始位置。\n\n- `backup_folder` — 备份文件夹名（如 `202603261130`）\n- `safe_name` — 备份文件名（路径分隔符 `/`、`\\`, `:` 已替换为 `__`）\n- `--keep-backup` — 可选，恢复成功后保留备份（默认恢复后自动删除）\n\n```bash\n# 示例\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n```\n\n### 3. 查看所有备份\n\n```bash\npython delete_recovery.py list\n```\n\n返回所有备份文件夹及其包含的文件和时间戳。\n\n```json\n{\n  \"backups\": [\n    {\n      \"folder\": \"202603261130\",\n      \"time\": \"202603261130\",\n      \"files\": [\"C__Users__user__Desktop__report.docx\"],\n      \"count\": 1\n    }\n  ]\n}\n```\n\n### 4. 手动删除指定备份\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 5. 手动触发清理\n\n```bash\npython delete_recovery.py cleanup\n```\n\n强制清理过期备份和日志（通常每次脚本调用时自动执行）。\n\n### 6. 查看操作日志\n\n```bash\npython delete_recovery.py log [lines]\n```\n\n查看最近 N 行操作日志，默认50行。\n\n## 文件结构\n\n```\ndelete-recovery-0.1.0/\n├── SKILL.md                          — Skill定义（OpenClaw Agent使用）\n├── README.md                          — 使用指南（本文）\n├── CLAWDHUB.md                        — ClawdHub发布元数据\n├── log.txt                            — 操作日志（30天自动清理）\n├── delete_backup/                     — 备份存储（7天自动清理）\n│   ├── YYYYMMDDHHMM/                 — 时间戳备份文件夹\n│   │   ├── C__Users__...             — 备份文件（路径分隔符已编码）\n│   │   ├── C__Users__...path         — 原始路径记录\n│   │   └── .restored                 — 已恢复文件清单（全部恢复后文件夹自动删除）\n│   └── temp_existing/                 — 恢复时暂存冲突文件\n└── scripts/\n    └── delete_recovery.py            — 核心脚本（6个命令）\n```\n\n## 自动清理规则\n\n|    项目   | 保留时间 |       触发方式       |\n|-----------|----------|---------------------|\n| 备份文件夹 |    7天   | 每次脚本调用自动执行 |\n| 日志文件   |   30天   | 每次脚本调用自动执行 |\n\n## 工作流程\n\n```\n用户决定删除文件\n        │\n        ▼\n  ① backup 命令          ← 第一步必须做\n        │\n        ▼\n  ② 用户执行删除操作\n        │\n        ▼（后续如需恢复）\n  ③ restore 命令         ← 恢复到原始位置\n        │\n        ▼\n  备份自动删除            ←（除非使用了 --keep-backup）\n```\n\n## 依赖环境\n\n- Python 3.6+\n- OpenClaw（含 skill 支持）\n\n## 故障排除\n\n**恢复时报\"文件不存在\"**\n→ 该备份可能已过期（7天）或已被删除。请先用 `list` 命令查看可用备份。\n\n**恢复后备份文件夹未自动删除**\n→ 若同一备份文件夹含多个文件，须等全部文件都恢复后才删除整个文件夹，防止误删其他仍有用的备份。\n\n**恢复目标位置已有文件**\n→ 现有文件会自动移到 `delete_backup/temp_existing/` 再恢复，不会覆盖。\n\n## 更新日志\n\n详见 [CLAWDHUB.md](CLAWDHUB.md)。\n\n---\n\n###English###\n\n## Overview\n\n**Tired of accidentally deleting files while using OpenClaw?** The delete-recovery skill solves this problem for you.\n\nSafeguard your file deletions — automatic backup, restore, and auto-cleanup.\n\nA lightweight OpenClaw skill that backs up files before deletion, lets you recover accidentally deleted files, and automatically cleans up old backups and logs.\n\n## Features\n\n- **Automatic backup before deletion** — Before any file deletion, files are backed up to timestamped folders\n- **One-click restore** — Recover deleted files to their original location instantly\n- **Smart multi-file handling** — When the same backup folder contains multiple files, the folder is only deleted after ALL files are restored, preventing accidental deletion of backups you may still need\n- **Auto-cleanup** — Backups expire after 7 days, logs after 30 days — fully automatic\n- **Conflict-safe restore** — If a file already exists at the restore destination, it is automatically moved to `temp_existing/` for temporary storage before restoring\n- **Full operation logs** — Every backup, restore, and cleanup operation is logged\n\n## Installation\n\n### Via ClawdHub (recommended)\n\n```bash\n# Install latest version\nclawdhub install delete-recovery\n\n# Or install a specific version\nclawdhub install delete-recovery --version 0.1.0\n```\n\n### Manual Installation\n\nCopy the `delete-recovery-0.1.0` folder into your OpenClaw workspace's `skills/` directory.\n\n## Usage\n\nThe skill exposes 6 commands via `scripts/delete_recovery.py`:\n\n### 1. Backup Before Deleting\n\n```bash\npython delete_recovery.py backup <file_path> [original_path]\n```\n\nBacks up a file to a timestamped folder inside `delete_backup/YYYYMMDDHHMM/`.\n\n- `file_path` — Full path of the file to back up\n- `original_path` — (Optional) Original path for restore targeting. Defaults to `file_path`.\n\n```bash\n# Example\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}\n```\n\n> ⚠️ **Always back up before deleting.** This is the critical first step.\n\n### 2. Restore a Deleted File\n\n```bash\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup]\n```\n\nRestores a file from a backup to its original location.\n\n- `backup_folder` — The timestamp folder name (e.g. `202603261130`)\n- `safe_name` — The backup filename (path separators `/`, `\\`, `:` are replaced with `__` for safe encoding)\n- `--keep-backup` — Optional flag to keep the backup after restore (default: delete after restore)\n\n```bash\n# Example\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n```\n\n### 3. List All Backups\n\n```bash\npython delete_recovery.py list\n```\n\nReturns all backup folders with their files and timestamps.\n\n```json\n{\n  \"backups\": [\n    {\n      \"folder\": \"202603261130\",\n      \"time\": \"202603261130\",\n      \"files\": [\"C__Users__user__Desktop__report.docx\"],\n      \"count\": 1\n    }\n  ]\n}\n```\n\n### 4. Delete a Specific Backup Manually\n\n```bash\npython delete_recovery.py delete_backup <backup_folder>\n```\n\n### 5. Manually Trigger Cleanup\n\n```bash\npython delete_recovery.py cleanup\n```\n\nForcibly cleans up expired backups and logs. Normally this runs automatically on every script call.\n\n### 6. View Operation Logs\n\n```bash\npython delete_recovery.py log [lines]\n```\n\nReads the last N lines of the operation log. Default: 50 lines.\n\n## File Structure\n\n```\ndelete-recovery-0.1.0/\n├── SKILL.md                          # Skill definition for OpenClaw agents\n├── README.md                          # This file\n├── CLAWDHUB.md                        # ClawdHub publish metadata & changelog\n├── log.txt                            # Operation logs (auto-cleaned after 30 days)\n├── delete_backup/                     # Backup storage (auto-cleaned after 7 days)\n│   ├── YYYYMMDDHHMM/                # Timestamped backup folder\n│   │   ├── C__Users__...            # Backup file (path separators encoded)\n│   │   ├── C__Users__...path         # Original path record (for restore targeting)\n│   │   └── .restored                 # Manifest of already-restored files (folder auto-deleted after all files are restored)\n│   └── temp_existing/                # Temporary storage for existing file conflicts\n└── scripts/\n    └── delete_recovery.py            # Core script (all 6 commands)\n```\n\n## Auto-Cleanup\n\n| Item | Retention | Trigger |\n|------|-----------|---------|\n| Backup folders | 7 days | Runs automatically on every script call |\n| Log files | 30 days | Runs automatically on every script call |\n\n## Recovery Workflow\n\n```\nUser decides to delete a file\n        │\n        ▼\n  ① backup command          ← Always do this FIRST\n        │\n        ▼\n  ② User deletes the file\n        │\n        ▼ (later, if needed)\n  ③ restore command         ← Recover to original location\n        │\n        ▼\n  Backup auto-deleted        ← (unless --keep-backup is used)\n```\n\n## Requirements\n\n- Python 3.6+\n- OpenClaw with skill support\n\n## Troubleshooting\n\n**\"File not found\" when restoring**\n→ The backup folder may have already expired (7 days) or been deleted. Use `list` to check available backups.\n\n**Backup folder not auto-deleted after restore**\n→ If multiple files were backed up together in the same folder, the folder is kept until ALL files are restored. This prevents accidentally deleting backups for files you may still want to keep.\n\n**Existing file at restore destination**\n→ The existing file is automatically moved to `delete_backup/temp_existing/` before restoring.\n\n## Changelog\n\nSee [CLAWDHUB.md](CLAWDHUB.md) for full version history.\n\nArchive index:\n\nArchive v0.11.1: 6 files, 37551 bytes\n\nFiles: scripts/delete_recovery.py (37608b), scripts/safe_path.py (22832b), scripts/workspace_cleaner.py (37092b), skill-card.md (2360b), SKILL.md (31395b), _meta.json (135b)\n\nFile v0.11.1:SKILL.md\n\n---\r\nname: delete-recovery\r\ndescription: File deletion recovery skill v0.11.0. Back up files before deletion (to `delete_backup/YYYYMMDDHHMM/`), restore from backup, search via manifest. SHA256 integrity + path-traversal checks + workspace-root confinement. Auto-cleanup 7d/30d. **v0.11.0: new security audit fixes - path traversal detection, dir backup fallback, SHA256 integrity clarification.** **v0.9.0: dest_path validation, dry-run token gate, trigger disambiguation.** **v0.8.1: workspace_cleaner disabled-by-default; backup failures block deletion.** **v0.8.0: Added workspace_cleaner.** **v0.7.0: allowed_roots defaults to workspace root; manifest paths HMAC-encrypted.**\r\n\r\n**⚠️ Security trade-offs (know them before deploying):**\r\n- Backups are stored in `{workspace}/.delete_recovery/delete_backup/`, **outside** the skill directory - they survive skill deletion but are not protected by skill folder permissions.\r\n- `allowed_roots` defaults to workspace root (v0.7.0, fixed v0.11.0) - restores confined to `{workspace}` tree; pass `allowed_roots=[]` explicitly to remove confinement (legacy restores only).\r\n- Manifest paths are HMAC-SHA256 encrypted (v0.7.0) - original paths no longer readable in manifest.jsonl; filename/description still in plaintext. SHA256 records are integrity checks only (detect accidental modification); they are NOT cryptographically signed and do not protect against a local attacker who can modify both backup files and their metadata.\r\n- workspace_cleaner is **disabled by default** (v0.8.1) - must opt-in explicitly; first run requires dry-run + token confirm-first-run.\r\n- workspace_cleaner backup failures **block deletion** (v0.8.1) - files are NOT deleted if backup fails.\r\n- No install-time integrity verification - deploy only in trusted environments.\r\n- Agent is strictly forbidden from file tampering, path redirection, or bypassing security validations.\r\n\r\n**Use cases (triggers):**\r\n1. User wants to delete a file and needs a backup first\r\n2. User accidentally deleted a file and wants to recover it\r\n3. User wants to see available backups\r\n4. User wants to manually clean up a specific backup\r\n5. User wants to verify backup integrity without restoring\r\n6. User wants to search for a deleted file by name or keyword\r\n7. User wants to schedule automatic workspace cleanup (v0.8.1+: **opt-in only, token-gated**)\r\n\r\n**Triggers / keywords (v0.11.0: specific, unambiguous phrases only - broad housekeeping phrases removed):**\r\n- `delete file` / `删除文件` - backup before deletion\r\n- `recover deleted file` / `误删恢复` / `恢复文件` / `undelete` - restore from backup\r\n- `list backups` / `查看备份` - list available backups\r\n- `clean up backup` / `清理备份` - manually clean a specific backup\r\n- `verify backup` / `验证备份完整性` / `check backup integrity` - integrity check without restoring\r\n- `search deleted file` / `搜索已删除文件` / `检索删除记录` - search manifest\r\n- `workspace_cleaner` - explicitly invoke workspace cleaner (not \"clean workspace\" or \"定时清理\" alone)\r\n\r\n**⚠️ Agent Behavior Constraints (MANDATORY):**\r\n- Agent is ONLY permitted to: backup files, restore files, list backups, **search deleted files via manifest**, clean backups, undelete, verify backup integrity, manual cleanup, **manage workspace_cleaner whitelist/config, trigger workspace cleanup**\r\n- Agent is ABSOLUTELY FORBIDDEN from: file content tampering, path redirection, path traversal attacks, backup substitution, bypassing SHA256 integrity verification, bypassing PATH cross-validation, unauthorized deletion, log tampering\r\n- **Exception:** Using `--force` to bypass the SHA256 *existence* check is permitted **only** for pre-v0.3.0 legacy backups that lack SHA256 records. SHA256 correctness check, PATH cross-validation, traversal detection, and dest_path validation are **never** bypassable under any circumstances.\r\n- All restore operations MUST pass SHA256 + PATH cross-validation + traversal detection + dest_path validation\r\n\r\n---\r\n\r\n### 中文\r\n\r\n---\r\n\r\n## 概述\r\n\r\n文件误删恢复技能 v0.11.0。删除文件前先将文件备份到带时间戳的文件夹（`delete_backup/YYYYMMDDHHMM/`），备份时计算 SHA256 哈希并存储，恢复时验证完整性并检查路径安全（检测 `../` 等路径遍历序列）。恢复后自动删除备份（保留原始文件结构）。\r\n\r\n**v0.11.0 安全修复（针对 security audit 5项发现）：**\r\n- Finding 1：`--force` 语义统一文档化 - `--force` 仅跳过 SHA256 **存在性**检查；SHA256 正确性检查、PATH 跨验、遍历检测、dest_path 验证**始终强制执行**，不可绕过\r\n- Finding 2：`allowed_roots` 默认值修正 - 从 `[]`（无限制）改为 `[WORKSPACE_ROOT]`（限制为 workspace 树），与文档描述一致；传入 `allowed_roots=[]` 可恢复无限制行为（仅用于遗留恢复）\r\n- Finding 3：`full_restore_check()` 修复 - `dest_path` 参数不再被静默忽略，现通过 `verify_integrity_and_path()` 完整验证（遍历 + 与 original_path 一致性 + allowed_roots）\r\n- Finding 4：`confirm-first-run` token 机制 - 每次 `dry-run` 生成唯一 token，确认时必须提供有效未使用的 token，防止未预览就启用的绕过\r\n- Finding 5：触发词收窄 - 移除 \"clean workspace\"、\"定时清理\" 等宽泛触发词，仅保留 `workspace_cleaner` 等明确触发词\r\n\r\n**v0.8.1 安全修复（针对 ASI02 风险分析）：**\r\n- workspace_cleaner **默认禁用**（enabled=False），需显式 opt-in\r\n- 首次运行必须先 `dry-run` 预览并 `confirm-first-run <token>` 确认\r\n- **备份失败阻断删除**：任何备份失败（delete_recovery + manual fallback 均失败）时，对应文件不会被删除\r\n\r\n**v0.8.0 workspace_cleaner：**\r\n- 定时（默认24小时）扫描 workspace 下的临时文件和过期文件（默认7天），自动备份后清理\r\n- 支持白名单配置（文件扩展名/文件名/文件夹名），白名单内不清理\r\n- 核心文件（AGENTS.md、SOUL.md 等）和技能目录始终保护\r\n- 支持手动触发 `dry-run` 预览\r\n- 数据文件独立存放于 `{workspace}/.delete_recovery/workspace_cleaner/`，技能删除后配置仍保留\r\n\r\n**v0.7.0 安全加固：**\r\n- `allowed_roots` 默认为 workspace 根目录 - 恢复目标限制在 `{workspace}` 树内，防止恢复文件到任意路径\r\n- manifest 路径字段改为 HMAC-SHA256 加密存储 - 原始路径不再明文暴露在 `manifest.jsonl` 中\r\n\r\n⚠️ **版本说明：** v0.1.0～v0.6.0 已淘汰（`DEPRECATED`），功能说明保留仅供参考。请始终使用 **v0.7.0** 或更高版本。\r\n\r\n## 触发场景\r\n\r\n1. 用户要删除文件，希望先备份\r\n2. 用户误删了文件，想要恢复\r\n3. 用户想查看有哪些可用的备份\r\n4. 用户想手动清理某个备份\r\n5. 用户想验证备份是否被篡改（不执行恢复）\r\n6. 用户想通过文件名/功能/路径关键字检索已删除的文件\r\n7. 用户想自动清理 workspace 下的临时文件和过期文件\r\n\r\n**触发词：** 删除文件、误删恢复、恢复文件、查看备份、清理备份、验证备份完整性、搜索已删除文件、检索删除记录、workspace_cleaner\r\n\r\n### English\r\n\r\n## Overview\r\n\r\nFile deletion recovery skill v0.11.0. Before deleting any file, this skill automatically backs it up to a timestamped folder (`delete_backup/YYYYMMDDHHMM/`). Backups include SHA256 integrity hashes to detect post-backup tampering. Restore paths are validated to block path-traversal sequences. Backups auto-removed 7 days; logs auto-cleaned 30 days.\r\n\r\n**v0.11.0 security audit fixes:**\r\n- Finding 1: `--force` docs unified - `--force` bypasses SHA256 *existence* check only (for pre-v0.3.0 legacy backups). SHA256 correctness, PATH cross-validation, traversal detection, and dest_path validation are **never** bypassable.\r\n- Finding 2: `allowed_roots` default corrected - now defaults to `[WORKSPACE_ROOT]` (was `[]` meaning no restriction). Callers relying on documented defaults were unknowingly allowing restores to arbitrary paths. Pass `allowed_roots=[]` to restore no-confinement for legacy restores.\r\n- Finding 3: `full_restore_check()` fixed - `dest_path` parameter now passes through to `verify_integrity_and_path()` and is fully validated (traversal + equality with original_path + allowed_roots), closing the gap where the documented single entry point silently ignored the actual restore destination.\r\n- Finding 4: `confirm-first-run` token mechanism - each dry-run generates a cryptographically random token; confirm-first-run requires a valid un-used token, preventing the bypass where cleanup could be enabled without ever reviewing the dry-run preview.\r\n- Finding 5: trigger disambiguation - broad housekeeping phrases like \"clean workspace\" or \"定时清理\" removed; only specific, unambiguous triggers like `workspace_cleaner` activate deletion-oriented behaviour.\r\n\r\n**v0.8.1 workspace_cleaner security fix (addressing ASI02):** workspace_cleaner is **disabled by default** - explicit opt-in required; first run requires dry-run + token-based confirm-first-run; backup failure blocks deletion entirely.\r\n\r\n**v0.8.0 workspace_cleaner:** Scheduled (default 24-hour) scan of workspace for temp files and expired files (default 7 days), auto-backup then delete; whitelist support; core files always protected.\r\n\r\n⚠️ **Version note:** v0.1.0～v0.6.0 are deprecated (`DEPRECATED`). Always use **v0.7.0** or higher.\r\n\r\n## Trigger Scenarios\r\n\r\n1. User wants to delete a file and needs a backup first\r\n2. User accidentally deleted a file and wants to recover it\r\n3. User wants to see available backups\r\n4. User wants to manually clean up a specific backup\r\n5. User wants to verify backup integrity without restoring\r\n6. User wants to search for a deleted file by name or keyword\r\n7. User wants to schedule automatic workspace cleanup\r\n\r\n**Triggers:** delete file, recover deleted file, list backups, clean up backup, undelete, verify backup, check backup integrity, search deleted file, find deleted file, workspace_cleaner\r\n\r\n## 核心命令 / Core Commands\r\n\r\n### 中文\r\n\r\n### delete_recovery.py - 备份恢复核心\r\n\r\n```\r\n{workspace}/skills/delete-recovery/scripts/delete_recovery.py\r\n```\r\n\r\n| 命令 | 说明 | 备注 |\r\n|------|------|------|\r\n| `backup <file_path> [original_path] [description]` | 备份文件到带时间戳文件夹 | v0.7.0 |\r\n| `search <keyword>` | 按文件名/简介/路径关键字检索已删除文件 | v0.7.0 |\r\n| `restore <folder> <safe_name> [--keep-backup] [--force]` | 从备份恢复文件 | v0.7.0 |\r\n| `verify <folder> <safe_name>` | 验证备份完整性（SHA256 + PATH） | v0.7.0 |\r\n| `list` | 查看备份列表 | v0.7.0 |\r\n| `delete_backup <folder>` | 删除指定备份 | v0.7.0 |\r\n| `cleanup` | 手动触发过期备份+日志清理 | v0.7.0 |\r\n| `log [lines]` | 查看操作日志 | v0.7.0 |\r\n\r\n**`--force` 说明（v0.11.0 明确）：**\r\n- `--force` **仅**在备份文件无 SHA256 记录时（pre-v0.3.0 遗留备份）用于跳过 SHA256 **存在性**检查\r\n- SHA256 **正确性**检查（哈希匹配）、PATH 跨验、遍历检测、dest_path 验证**始终强制执行**，不可用 `--force` 绕过\r\n- 适用场景：恢复 v0.3.0 之前创建的备份（当时未记录 SHA256）\r\n\r\n### workspace_cleaner.py - workspace 定时清理（v0.11.0 强制安全修复）\r\n\r\n```\r\n{workspace}/skills/delete-recovery/scripts/workspace_cleaner.py\r\n```\r\n\r\n**v0.11.0 安全流程（首次启用必须按顺序执行）：**\r\n```\r\n1. python workspace_cleaner.py status           # 查看当前状态\r\n2. python workspace_cleaner.py enable          # 启用 workspace_cleaner（opt-in，默认 False）\r\n3. python workspace_cleaner.py dry-run          # 预览清理范围 + 生成一次性 token\r\n4. python workspace_cleaner.py confirm-first-run <token>   # 凭 token 确认，解锁实际清理\r\n5. python workspace_cleaner.py run              # 执行实际清理（满足时间间隔时）\r\n```\r\n\r\n| 命令 | 说明 |\r\n|------|------|\r\n| `python workspace_cleaner.py run` | 手动触发一次清理（enabled=True + first_run_confirmed=True + 满足时间间隔） |\r\n| `python workspace_cleaner.py dry-run` | 预览哪些文件将被清理（不实际删除，始终可用；生成一次性 token） |\r\n| `python workspace_cleaner.py status` | 查看定时器状态和配置（含 enabled / first_run_confirmed / token 状态） |\r\n| `python workspace_cleaner.py enable` | 启用 workspace_cleaner（opt-in，默认 False） |\r\n| `python workspace_cleaner.py disable` | 禁用 workspace_cleaner（opt-out） |\r\n| `python workspace_cleaner.py confirm-first-run <token>` | 凭 dry-run 生成的 token 确认首次运行，解锁实际清理 |\r\n| `python workspace_cleaner.py show-whitelist` | 查看当前白名单 |\r\n| `python workspace_cleaner.py add-whitelist <path> [--type file\\|folder\\|ext]` | 添加白名单项 |\r\n| `python workspace_cleaner.py remove-whitelist <path>` | 移除白名单项 |\r\n| `python workspace_cleaner.py set-interval <hours>` | 设置清理间隔（小时） |\r\n| `python workspace_cleaner.py set-expire-days <days>` | 设置文件过期天数 |\r\n\r\n**v0.11.0 `confirm-first-run` token 机制说明：**\r\n- 每次执行 `dry-run` 生成一个加密随机 token（32字节 hex），有效期 24 小时\r\n- `confirm-first-run <token>` 需要提供有效且未使用的 token\r\n- token 被使用后即失效，需重新 `dry-run` 获取新 token\r\n- 这样确保用户必须先看到 dry-run 预览结果才能启用清理\r\n\r\n### English\r\n\r\n### delete_recovery.py - Backup & Recovery Core\r\n\r\n```\r\n{workspace}/skills/delete-recovery/scripts/delete_recovery.py\r\n```\r\n\r\n| Command | Description | Notes |\r\n|---------|-------------|-------|\r\n| `backup <file_path> [original_path] [description]` | Backup file to timestamped folder | v0.7.0 |\r\n| `search <keyword>` | Search deleted files by name/description/path | v0.7.0 |\r\n| `restore <folder> <safe_name> [--keep-backup] [--force]` | Restore file from backup | v0.7.0 |\r\n| `verify <folder> <safe_name>` | Verify backup integrity (SHA256 + PATH) | v0.7.0 |\r\n| `list` | List all backups | v0.7.0 |\r\n| `delete_backup <folder>` | Delete specified backup | v0.7.0 |\r\n| `cleanup` | Manual trigger expired backup + log cleanup | v0.7.0 |\r\n| `log [lines]` | View operation logs | v0.7.0 |\r\n\r\n**`--force` behaviour (v0.11.0 clarified):**\r\n- `--force` bypasses the SHA256 *existence* check **only** (for pre-v0.3.0 legacy backups that lack SHA256 records).\r\n- SHA256 correctness check, PATH cross-validation, traversal detection, and dest_path validation are **always enforced**, even with `--force`. Never use `--force` unless you understand the backup predates v0.3.0.\r\n\r\n### workspace_cleaner.py - Workspace Scheduled Cleanup (v0.11.0)\r\n\r\n| Command | Description | \r\n|---------|-------------|\r\n| `python workspace_cleaner.py run` | Trigger cleanup (respects interval) \r\n| `python workspace_cleaner.py dry-run` | Preview files to clean (no actual deletion; generates one-time token) \r\n| `python workspace_cleaner.py status` | View timer status and config \r\n| `python workspace_cleaner.py confirm-first-run <token>` | Confirm dry-run results with token (v0.11.0: token required) \r\n| `python workspace_cleaner.py show-whitelist` | View current whitelist\r\n| `python workspace_cleaner.py add-whitelist <path> [--type file\\|folder\\|ext]` | Add whitelist entry \r\n| `python workspace_cleaner.py remove-whitelist <path>` | Remove whitelist entry \r\n| `python workspace_cleaner.py set-interval <hours>` | Set cleanup interval (hours)\r\n| `python workspace_cleaner.py set-expire-days <days>` | Set file expiration days\r\n\r\n### 中文\r\n\r\n## 安装\r\n\r\n### 前提条件\r\n- Python 3.8+\r\n- 已安装 ClawHub CLI：`npm i -g clawhub`\r\n- 已登录 ClawHub：`clawhub login`\r\n\r\n### 安装步骤\r\n```bash\r\n# 通过 ClawHub 安装技能\r\nclawhub install delete-recovery\r\n\r\n# 查看已安装的技能\r\nclawhub list\r\n```\r\n\r\n### English\r\n\r\n## Installation\r\n\r\n### Prerequisites\r\n- Python 3.8+\r\n- ClawHub CLI installed: `npm i -g clawhub`\r\n- ClawHub logged in: `clawhub login`\r\n\r\n### Installation Steps\r\n```bash\r\n# Install skill via ClawHub\r\nclawhub install delete-recovery\r\n\r\n# List installed skills\r\nclawhub list\r\n```\r\n\r\n---\r\n\r\n## delete_recovery.py 命令详解\r\n\r\n### 中文\r\n\r\n所有命令通过执行脚本实现，路径：\r\n```\r\n{workspace}/skills/delete-recovery/scripts/delete_recovery.py\r\n```\r\n\r\n### 1. 备份文件（删除前必做）\r\n\r\n```bash\r\npython delete_recovery.py backup <file_path> [original_path] [description]\r\n```\r\n\r\n- `file_path`：要备份的文件完整路径\r\n- `original_path`（可选）：原始文件路径，恢复时用于定位，默认为 `file_path`\r\n- `description`（可选）：功能简介，建议 ≤6 字，如\"飞书配置\"\"工作报告\"，默认为文件名\r\n\r\n备份时自动计算并存储 SHA256 哈希 + 原始路径到 `.sha256` 文件，防止备份文件被替换。备份后自动将（文件名、功能简介、路径）写入 `manifest.jsonl`，支持 `search` 检索。\r\n\r\n**返回示例：**\r\n```json\r\n{\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__test.txt\", \"description\": \"工作报告\"}\r\n```\r\n\r\n### 2. 搜索已删除文件\r\n\r\n```bash\r\npython delete_recovery.py search <keyword>\r\n```\r\n\r\n在 manifest.jsonl 中按文件名、功能简介或路径关键字模糊搜索，返回匹配的备份位置和恢复命令。\r\n\r\n- `keyword`：检索关键词（大小写不敏感， substring 匹配）\r\n\r\n**返回示例：**\r\n```json\r\n{\r\n  \"keyword\": \"报告\",\r\n  \"results\": [\r\n    {\r\n      \"ts\": \"202603281030\",\r\n      \"folder\": \"202603281030\",\r\n      \"safe_name\": \"C__Users__user__Desktop__report.docx\",\r\n      \"filename\": \"report.docx\",\r\n      \"description\": \"工作报告\",\r\n      \"path\": \"C:/Users/user/Desktop/report.docx\"\r\n    }\r\n  ],\r\n  \"count\": 1\r\n}\r\n```\r\n\r\n### 3. 恢复文件\r\n\r\n```bash\r\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\r\n```\r\n\r\n- `backup_folder`：备份文件夹名（如 `202603261130`）\r\n- `safe_name`：备份文件名（脚本自动将路径中的 `/`、`\\`、`:` 替换为 `__`）\r\n- `--keep-backup`：可选，恢复成功后**保留**该备份文件夹（默认自动删除）\r\n- `--force`：强制恢复无 SHA256 记录的旧备份（**仅**跳过 SHA256 存在性检查；SHA256 正确性、PATH 跨验、遍历检测、dest_path 验证始终强制执行）\r\n\r\n恢复前验证 SHA256 完整性 + PATH 交叉验证 + 路径遍历检测 + dest_path 验证（v0.11.0），任一验证失败均拒绝恢复。\r\n\r\n**返回示例：**\r\n```json\r\n{\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\test.txt\", \"backup_deleted\": true}\r\n```\r\n\r\n### 4. 验证备份完整性\r\n\r\n```bash\r\npython delete_recovery.py verify <backup_folder> <safe_name>\r\n```\r\n\r\n在不恢复的情况下验证备份完整性（SHA256 哈希匹配 + PATH 交叉验证）。\r\n\r\n### 5. 查看备份列表\r\n\r\n```bash\r\npython delete_recovery.py list\r\n```\r\n\r\n返回所有备份文件夹列表，最新在前。\r\n\r\n### 6. 手动清理备份\r\n\r\n```bash\r\npython delete_recovery.py delete_backup <folder>\r\n```\r\n\r\n删除指定的备份文件夹（同时清理 manifest 索引）。\r\n\r\n### 7. 手动触发清理\r\n\r\n```bash\r\npython delete_recovery.py cleanup\r\n```\r\n\r\n立即执行过期备份（7天）和日志（30天）全量清理，忽略时间触发限制。\r\n\r\n### 8. 查看日志\r\n\r\n```bash\r\npython delete_recovery.py log [lines]\r\n```\r\n\r\n查看最近 N 行操作日志（默认50行）。\r\n\r\n---\r\n\r\n## workspace_cleaner.py 命令详解\r\n\r\n### 中文\r\n\r\n**v0.11.0 首次启用流程（必须按顺序）：**\r\n\r\n```bash\r\n# Step 1: 查看状态\r\npython workspace_cleaner.py status\r\n\r\n# Step 2: 启用功能\r\npython workspace_cleaner.py enable\r\n\r\n# Step 3: 预览清理范围 + 获取 token\r\npython workspace_cleaner.py dry-run\r\n# → 返回 dry_run_token，记下这个 token\r\n\r\n# Step 4: 凭 token 确认\r\npython workspace_cleaner.py confirm-first-run <上一步返回的token>\r\n\r\n# Step 5: 执行实际清理\r\npython workspace_cleaner.py run\r\n```\r\n\r\n**定时清理设置（推荐通过 cron 定期触发 `run`）：**\r\n\r\n| 命令 | 说明 |\r\n|------|------|\r\n| `set-interval <hours>` | 设置清理间隔（小时），最小 1 小时 |\r\n| `set-expire-days <days>` | 设置文件过期天数（0 = 立即删除 temp 文件） |\r\n\r\n### English\r\n\r\n### 1. Check status\r\n\r\n```bash\r\npython workspace_cleaner.py status\r\n```\r\n\r\nShows: enabled flag, first-run confirmed flag, current token status, interval, expiry days.\r\n\r\n### 2. Enable + First-run flow (v0.11.0)\r\n\r\n```bash\r\n# Enable\r\npython workspace_cleaner.py enable\r\n\r\n# Preview + get token\r\npython workspace_cleaner.py dry-run\r\n# → returns \"dry_run_token\": \"<hex>\" - note it\r\n\r\n# Confirm with token\r\npython workspace_cleaner.py confirm-first-run <token>\r\n\r\n# Run\r\npython workspace_cleaner.py run\r\n```\r\n\r\n### 3. Whitelist management\r\n\r\n```bash\r\npython workspace_cleaner.py show-whitelist\r\npython workspace_cleaner.py add-whitelist <path> [--type file|folder|ext]\r\npython workspace_cleaner.py remove-whitelist <path>\r\n```\r\n\r\n### 4. Configure schedule\r\n\r\n```bash\r\npython workspace_cleaner.py set-interval 24   # every 24 hours\r\npython workspace_cleaner.py set-expire-days 7  # files older than 7 days\r\n```\r\n\r\n---\r\n\r\n## 注意事项 / Notes\r\n\r\n### 中文\r\n\r\n1. **删除前必备份**：所有删除操作前都应先调用 `backup`，防止误删\r\n2. **恢复时目标冲突**：如果原位置已有文件，会自动将旧文件暂存到 `temp_existing/` 目录\r\n3. **恢复后自动删备份**：默认情况下，恢复成功后会自动删除对应备份（多文件时等全部恢复完再清理）；使用 `--keep-backup` 可保留\r\n4. **路径编码**：备份文件名将 `\\`、`/`、`:` 替换为 `__`，恢复时需使用转换后的名称\r\n5. **时间触发清理**：7天备份清理和30天日志清理改为时间触发（默认24小时间隔），不再每次命令都执行全量扫描；`cleanup` 命令本身不受影响，仍立即执行全量清理\r\n6. **manifest 增量操作**：restore/delete_backup 时按需压缩 manifest（候选集≤100条时全量rewrite，>100条时追加墓碑标记）；list/search/log 时自动检查并触发增量压缩\r\n7. **安全验证**：restore 时自动进行 SHA256 完整性 + PATH 交叉验证 + 遍历检测 + dest_path 验证（v0.11.0），如验证失败会明确报错\r\n8. **旧备份恢复**：无 SHA256 记录的旧备份使用 `restore --force` 可强制恢复（仅跳过 SHA256 存在性检查；完整性、PATH、dest_path 验证不可绕过）\r\n9. **检索索引**：`backup` 自动追加索引，`restore` 成功后自动剔除；过期备份文件夹对应的索引随 `cleanup` 或脚本启动时自动清理\r\n10. **workspace 目录限制**（v0.7.0+v0.11.0）：恢复目标被限制在 workspace 根目录内，阻止恢复文件到任意系统路径；如需恢复 workspace 外的文件，需显式传入 `allowed_roots=[]`\r\n11. **manifest 路径加密**（v0.7.0）：manifest 中的原始路径字段已改为 HMAC-SHA256 加密，无法通过直接查看 manifest 获取原始路径；解密完全由 `.path` 文件负责\r\n12. **workspace_cleaner 默认禁用**（v0.8.1）：enabled 默认为 False，需 `enable` 命令显式启用；首次运行需先 dry-run + token confirm-first-run\r\n13. **workspace_cleaner 备份失败阻断删除**（v0.8.1）：delete_recovery.py 备份失败且 manual fallback 也失败时，对应文件不会被删除，记录到 `skipped_backup_failed`\r\n14. **workspace_cleaner 定时清理**（v0.8.0）：需通过 cron 或定期触发；默认24小时间隔，7天过期文件；核心文件和技能目录始终保护\r\n15. **workspace_cleaner 备份降级**（v0.8.0）：delete_recovery.py 备份失败时自动降级为手动备份；手动备份也失败则跳过该文件（不删除）\r\n16. **confirm-first-run token 机制**（v0.11.0）：dry-run 生成一次性 token（24小时有效），confirm-first-run 必须提供有效 token 才能解锁首次清理\r\n17. **触发词收窄**（v0.11.0）：\"clean workspace\"、\"定时清理\" 等宽泛短语不再激活 workspace_cleaner；仅 `workspace_cleaner` 等明确触发词有效\r\n\r\n### English\r\n\r\n1. **Always backup before deleting**: Call `backup` before any deletion\r\n2. **Restore target conflict**: Existing files moved to `temp_existing/` before restoring\r\n3. **Auto-delete backup after restore**: Default behaviour (multi-file: all restored → then delete); use `--keep-backup` to retain\r\n4. **Path encoding**: `\\`, `/`, `:` replaced with `__` in backup filenames\r\n5. **Time-triggered cleanup**: 7-day backup and 30-day log cleanup are time-triggered (default 24-hour interval), not run on every command; `cleanup` command itself still runs full cleanup immediately\r\n6. **Incremental manifest**: restore/delete_backup use on-demand manifest compaction; list/search/log auto-check and compact oversized manifests\r\n7. **Security checks**: Restore automatically fails with clear error if SHA256 integrity, PATH cross-validation, traversal, or dest_path validation (v0.11.0) fails\r\n8. **Legacy backup restore**: Backups without SHA256 records use `restore --force` to force restore (only bypasses SHA256 existence check; integrity, PATH, dest_path validation non-bypassable)\r\n9. **Manifest index**: `backup` auto-indexes; `restore` auto-removes index entry; stale entries pruned on `cleanup` or script startup\r\n10. **Workspace root confinement** (v0.7.0+v0.11.0): Restore destinations are confined to workspace root - files cannot be restored to arbitrary system paths; pass `allowed_roots=[]` to restore outside workspace (legacy restores only)\r\n11. **Manifest path encryption** (v0.7.0): Original paths in manifest.jsonl are HMAC-SHA256 encrypted - cannot be read by inspecting the manifest file; decryption always uses the `.path` file in the backup folder\r\n12. **workspace_cleaner opt-in** (v0.8.1): `enabled` defaults to False; must explicitly `enable`; first run requires dry-run + token confirm-first-run\r\n13. **workspace_cleaner backup failure blocks deletion** (v0.8.1): If both delete_recovery and manual fallback fail for a file, that file is NOT deleted - reported in `skipped_backup_failed`\r\n14. **workspace_cleaner scheduled cleanup** (v0.8.0): Requires cron or periodic triggering; default 24-hour interval, 7-day expiry; core files and skill directory always protected\r\n15. **workspace_cleaner backup fallback** (v0.8.0): Falls back to manual copy if delete_recovery.py backup fails; skips (does not delete) if even manual backup fails\r\n16. **confirm-first-run token mechanism** (v0.11.0): dry-run generates a one-time token (24h validity); confirm-first-run requires a valid un-used token to unlock first cleanup\r\n17. **Trigger disambiguation** (v0.11.0): broad housekeeping phrases like \"clean workspace\" or \"定时清理\" no longer activate workspace_cleaner; only specific triggers like `workspace_cleaner` are active\r\n\r\n---\r\n\r\n## Security Audit Findings Addressed (v0.11.0)\r\n\r\n| Finding | Description | Fix |\r\n|---------|-------------|-----|\r\n| Finding 1 (93%) | `--force` docs inconsistent - ambiguous whether integrity checks still run | SKILL.md and docstrings unified: `--force` bypasses SHA256 *existence* only; all other checks (SHA256 correctness, PATH cross-validation, traversal, dest_path) are **always enforced** |\r\n| Finding 2 (96%) | `allowed_roots` defaults to `[]` (no restriction) despite docs saying restore confined to workspace root | `safe_path.py` now defaults to `[WORKSPACE_ROOT]`; pass `allowed_roots=[]` explicitly for no-confinement legacy restores |\r\n| Finding 3 (93%) | `full_restore_check()` silently ignored `dest_path` parameter - callers using documented single entry point were not validating the actual restore destination | `verify_integrity_and_path()` now accepts and validates `dest_path` independently; `full_restore_check()` now passes it through |\r\n| Finding 4 (89%) | `confirm_first_run()` only checked `enabled` flag, did not verify a dry-run was actually performed | v0.11.0 adds `dry_run_token` mechanism: each dry-run generates a cryptographically random token; confirm-first-run requires a valid un-used token (24h expiry) |\r\n| Finding 5 (88%) | Trigger phrases like \"clean workspace\" or \"定时清理\" are overly broad and can activate deletion-oriented behaviour unintentionally | Broad trigger phrases removed; only specific, unambiguous triggers like `workspace_cleaner` remain active |\r\n| new-Finding (97%) | Non-temp files deleted just because old - users may lose valuable data | Only temp-pattern files (`_is_temp_file()` / `_is_temp_dir()`) are cleanup candidates; non-temp files explicitly skipped even if old |\r\n| new-Finding (96%) | '临时文件清理' and '自动清理' Chinese triggers still too broad | Both removed from trigger list; only `workspace_cleaner` remains active |\r\n| new-Finding (99%) | `_is_path_safe()` path traversal detection ineffective - `normalized=path.resolve()` always equals `resolved` | Traversal check now correctly uses parent-directory simulation to detect `..` escape; unsafe paths rejected |\r\n| new-Finding (97%) | Documentation claimed SHA256 records provide a \"signed hash\" / \"cryptographic signature\" binding - in reality records are plain integrity checks with no authenticity guarantee against a local attacker who can modify both backup and metadata | Documentation corrected; SHA256 records accurately described as integrity checks (detect accidental modification); \"signed hash\" / \"cryptographic signature\" / \"forge-resistant\" claims removed throughout |\r\n| new-Finding (91%) | `_manual_backup()` uses `shutil.copy2()` which fails silently for directories | Now handles both files (`copy2`+SHA256) and directories (`copytree`); failure returns False and blocks deletion |\r\n\r\n---\r\n\r\n## Changelog\r\n\r\n### v0.11.0 (2026-05-28)\r\n**New security audit fixes (round 2):**\r\n- new-Finding (97%): Cleanup scope narrowed - only temp-pattern files (`_is_temp_file()` / `_is_temp_dir()`) are deletion candidates; non-temp files are always skipped regardless of age\r\n- new-Finding (96%): Chinese triggers '临时文件清理' and '自动清理' removed; only `workspace_cleaner` activates workspace cleanup\r\n\r\n**Previous security audit fixes:**\r\n- Finding 1: `--force` semantics unified - SHA256 existence check bypass only\r\n- Finding 2: `allowed_roots` default corrected to `[WORKSPACE_ROOT]`\r\n- Finding 3: `full_restore_check()` now validates `dest_path` fully\r\n- Finding 4: `confirm-first-run` now requires valid dry-run token\r\n- Finding 5: Overly broad trigger phrases removed\r\n\r\n### v0.8.1 (2026-05-27)\r\n- workspace_cleaner disabled by default (enabled=False)\r\n- First run requires dry-run + confirm-first-run\r\n- Backup failure blocks deletion (skipped_backup_failed tracking)\r\n- New commands: enable, disable, confirm-first-run\r\n\r\n### v0.8.0\r\n- workspace_cleaner added: scheduled temp-file cleanup with auto-backup\r\n- 24-hour interval, 7-day expiry default\r\n- Whitelist support\r\n\r\n### v0.7.0\r\n- allowed_roots defaults to workspace root\r\n- Manifest paths HMAC-SHA256 encrypted\r\n\r\n### v0.3.0\r\n- SHA256 now strictly required on restore (--force for legacy)\r\n- PATH cross-check always enforced\r\n\r\n### v0.1.0 - v0.6.0\r\n**DEPRECATED** - do not use\n\nFile v0.11.1:_meta.json\n\n{\n  \"ownerId\": \"kn76zmreha127n33hcnaknnmd5834x16\",\n  \"slug\": \"delete-recovery\",\n  \"version\": \"0.11.1\",\n  \"publishedAt\": 1779958219341\n}\n\nFile v0.11.1:skill-card.md\n\n## Description:\n\nAutomatically backs up files before deletion, restores deleted files from timestamped backups, searches backup manifests, and cleans expired backups and logs.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[cloudcode-hans](https://clawhub.ai/user/cloudcode-hans)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and workspace users use this skill to back up files before deletion, recover accidentally deleted files, verify backup integrity, and manage opt-in cleanup of temporary workspace files.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Deletion and cleanup workflows can cause data loss or out-of-scope deletion if executed without careful review.\n\nMitigation: Review deletion paths before installation and use dry-run, explicit opt-in, and backup verification before allowing cleanup actions.\n\nRisk: Backup deletion can remove recovery data when backup folder names are not strictly validated.\n\nMitigation: Restrict delete_backup usage to validated backup folder names and review the selected backup target before removal.\n\nRisk: Workspace cleaner fallback backups may not be reliable enough for recovery in the current release.\n\nMitigation: Do not rely on workspace_cleaner fallback backups for recoverability until directory restore and metadata format handling are fixed.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/cloudcode-hans/skills/delete-recovery)\n- [ClawHub publisher profile](https://clawhub.ai/user/cloudcode-hans)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON command outputs.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces file-operation guidance for backup, restore, verification, manifest search, backup cleanup, and opt-in workspace cleanup workflows.]\n\n## Skill Version(s):\n\n0.11.1 (source: server release metadata; artifact content describes v0.11.0 behavior with no code changes in this release)\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 v0.11.0: 6 files, 37266 bytes\n\nFiles: scripts/delete_recovery.py (37608b), scripts/safe_path.py (24831b), scripts/workspace_cleaner.py (37092b), skill-card.md (2349b), SKILL.md (30769b), _meta.json (135b)\n\nFile v0.11.0:SKILL.md\n\n---\r\nname: delete-recovery\r\ndescription: File deletion recovery skill v0.11.0. Back up files before deletion (to `delete_backup/YYYYMMDDHHMM/`), restore from backup, search via manifest. SHA256 integrity + path-traversal checks + workspace-root confinement. Auto-cleanup 7d/30d. **v0.11.0: new security audit fixes — temp-only cleanup scope, broad trigger removal.** **v0.9.0: dest_path validation, dry-run token gate, trigger disambiguation.** **v0.8.1: workspace_cleaner disabled-by-default; backup failures block deletion.** **v0.8.0: Added workspace_cleaner.** **v0.7.0: allowed_roots defaults to workspace root; manifest paths HMAC-encrypted.**\r\n\r\n**⚠️ Security trade-offs (know them before deploying):**\r\n- Backups are stored in `{workspace}/.delete_recovery/delete_backup/`, **outside** the skill directory — they survive skill deletion but are not protected by skill folder permissions.\r\n- `allowed_roots` defaults to workspace root (v0.7.0, fixed v0.11.0) — restores confined to `{workspace}` tree; pass `allowed_roots=[]` explicitly to remove confinement (legacy restores only).\r\n- Manifest paths are HMAC-SHA256 encrypted (v0.7.0) — original paths no longer readable in manifest.jsonl; filename/description still in plaintext.\r\n- workspace_cleaner is **disabled by default** (v0.8.1) — must opt-in explicitly; first run requires dry-run + token confirm-first-run.\r\n- workspace_cleaner backup failures **block deletion** (v0.8.1) — files are NOT deleted if backup fails.\r\n- No install-time integrity verification — deploy only in trusted environments.\r\n- Agent is strictly forbidden from file tampering, path redirection, or bypassing security validations.\r\n\r\n**Use cases (triggers):**\r\n1. User wants to delete a file and needs a backup first\r\n2. User accidentally deleted a file and wants to recover it\r\n3. User wants to see available backups\r\n4. User wants to manually clean up a specific backup\r\n5. User wants to verify backup integrity without restoring\r\n6. User wants to search for a deleted file by name or keyword\r\n7. User wants to schedule automatic workspace cleanup (v0.8.1+: **opt-in only, token-gated**)\r\n\r\n**Triggers / keywords (v0.11.0: specific, unambiguous phrases only — broad housekeeping phrases removed):**\r\n- `delete file` / `删除文件` — backup before deletion\r\n- `recover deleted file` / `误删恢复` / `恢复文件` / `undelete` — restore from backup\r\n- `list backups` / `查看备份` — list available backups\r\n- `clean up backup` / `清理备份` — manually clean a specific backup\r\n- `verify backup` / `验证备份完整性` / `check backup integrity` — integrity check without restoring\r\n- `search deleted file` / `搜索已删除文件` / `检索删除记录` — search manifest\r\n- `workspace_cleaner` — explicitly invoke workspace cleaner (not \"clean workspace\" or \"定时清理\" alone)\r\n\r\n**⚠️ Agent Behavior Constraints (MANDATORY):**\r\n- Agent is ONLY permitted to: backup files, restore files, list backups, **search deleted files via manifest**, clean backups, undelete, verify backup integrity, manual cleanup, **manage workspace_cleaner whitelist/config, trigger workspace cleanup**\r\n- Agent is ABSOLUTELY FORBIDDEN from: file content tampering, path redirection, path traversal attacks, backup substitution, bypassing SHA256 integrity verification, bypassing PATH cross-validation, unauthorized deletion, log tampering\r\n- **Exception:** Using `--force` to bypass the SHA256 *existence* check is permitted **only** for pre-v0.3.0 legacy backups that lack SHA256 records. SHA256 correctness check, PATH cross-validation, traversal detection, and dest_path validation are **never** bypassable under any circumstances.\r\n- All restore operations MUST pass SHA256 + PATH cross-validation + traversal detection + dest_path validation\r\n\r\n---\r\n\r\n### 中文\r\n\r\n---\r\n\r\n## 概述\r\n\r\n文件误删恢复技能 v0.11.0。删除文件前先将文件备份到带时间戳的文件夹（`delete_backup/YYYYMMDDHHMM/`），备份时计算 SHA256 哈希并存储，恢复时验证完整性并检查路径安全（检测 `../` 等路径遍历序列）。恢复后自动删除备份（保留原始文件结构）。\r\n\r\n**v0.11.0 安全修复（针对 security audit 5项发现）：**\r\n- Finding 1：`--force` 语义统一文档化 — `--force` 仅跳过 SHA256 **存在性**检查；SHA256 正确性检查、PATH 跨验、遍历检测、dest_path 验证**始终强制执行**，不可绕过\r\n- Finding 2：`allowed_roots` 默认值修正 — 从 `[]`（无限制）改为 `[WORKSPACE_ROOT]`（限制为 workspace 树），与文档描述一致；传入 `allowed_roots=[]` 可恢复无限制行为（仅用于遗留恢复）\r\n- Finding 3：`full_restore_check()` 修复 — `dest_path` 参数不再被静默忽略，现通过 `verify_integrity_and_path()` 完整验证（遍历 + 与 original_path 一致性 + allowed_roots）\r\n- Finding 4：`confirm-first-run` token 机制 — 每次 `dry-run` 生成唯一 token，确认时必须提供有效未使用的 token，防止未预览就启用的绕过\r\n- Finding 5：触发词收窄 — 移除 \"clean workspace\"、\"定时清理\" 等宽泛触发词，仅保留 `workspace_cleaner` 等明确触发词\r\n\r\n**v0.8.1 安全修复（针对 ASI02 风险分析）：**\r\n- workspace_cleaner **默认禁用**（enabled=False），需显式 opt-in\r\n- 首次运行必须先 `dry-run` 预览并 `confirm-first-run <token>` 确认\r\n- **备份失败阻断删除**：任何备份失败（delete_recovery + manual fallback 均失败）时，对应文件不会被删除\r\n\r\n**v0.8.0 workspace_cleaner：**\r\n- 定时（默认24小时）扫描 workspace 下的临时文件和过期文件（默认7天），自动备份后清理\r\n- 支持白名单配置（文件扩展名/文件名/文件夹名），白名单内不清理\r\n- 核心文件（AGENTS.md、SOUL.md 等）和技能目录始终保护\r\n- 支持手动触发 `dry-run` 预览\r\n- 数据文件独立存放于 `{workspace}/.delete_recovery/workspace_cleaner/`，技能删除后配置仍保留\r\n\r\n**v0.7.0 安全加固：**\r\n- `allowed_roots` 默认为 workspace 根目录 — 恢复目标限制在 `{workspace}` 树内，防止恢复文件到任意路径\r\n- manifest 路径字段改为 HMAC-SHA256 加密存储 — 原始路径不再明文暴露在 `manifest.jsonl` 中\r\n\r\n⚠️ **版本说明：** v0.1.0～v0.6.0 已淘汰（`DEPRECATED`），功能说明保留仅供参考。请始终使用 **v0.7.0** 或更高版本。\r\n\r\n## 触发场景\r\n\r\n1. 用户要删除文件，希望先备份\r\n2. 用户误删了文件，想要恢复\r\n3. 用户想查看有哪些可用的备份\r\n4. 用户想手动清理某个备份\r\n5. 用户想验证备份是否被篡改（不执行恢复）\r\n6. 用户想通过文件名/功能/路径关键字检索已删除的文件\r\n7. 用户想自动清理 workspace 下的临时文件和过期文件\r\n\r\n**触发词：** 删除文件、误删恢复、恢复文件、查看备份、清理备份、验证备份完整性、搜索已删除文件、检索删除记录、workspace_cleaner\r\n\r\n### English\r\n\r\n## Overview\r\n\r\nFile deletion recovery skill v0.11.0. Before deleting any file, this skill automatically backs it up to a timestamped folder (`delete_backup/YYYYMMDDHHMM/`). Backups include SHA256 integrity hashes to detect post-backup tampering. Restore paths are validated to block path-traversal sequences. Backups auto-removed 7 days; logs auto-cleaned 30 days.\r\n\r\n**v0.11.0 security audit fixes:**\r\n- Finding 1: `--force` docs unified — `--force` bypasses SHA256 *existence* check only (for pre-v0.3.0 legacy backups). SHA256 correctness, PATH cross-validation, traversal detection, and dest_path validation are **never** bypassable.\r\n- Finding 2: `allowed_roots` default corrected — now defaults to `[WORKSPACE_ROOT]` (was `[]` meaning no restriction). Callers relying on documented defaults were unknowingly allowing restores to arbitrary paths. Pass `allowed_roots=[]` to restore no-confinement for legacy restores.\r\n- Finding 3: `full_restore_check()` fixed — `dest_path` parameter now passes through to `verify_integrity_and_path()` and is fully validated (traversal + equality with original_path + allowed_roots), closing the gap where the documented single entry point silently ignored the actual restore destination.\r\n- Finding 4: `confirm-first-run` token mechanism — each dry-run generates a cryptographically random token; confirm-first-run requires a valid un-used token, preventing the bypass where cleanup could be enabled without ever reviewing the dry-run preview.\r\n- Finding 5: trigger disambiguation — broad housekeeping phrases like \"clean workspace\" or \"定时清理\" removed; only specific, unambiguous triggers like `workspace_cleaner` activate deletion-oriented behaviour.\r\n\r\n**v0.8.1 workspace_cleaner security fix (addressing ASI02):** workspace_cleaner is **disabled by default** — explicit opt-in required; first run requires dry-run + token-based confirm-first-run; backup failure blocks deletion entirely.\r\n\r\n**v0.8.0 workspace_cleaner:** Scheduled (default 24-hour) scan of workspace for temp files and expired files (default 7 days), auto-backup then delete; whitelist support; core files always protected.\r\n\r\n⚠️ **Version note:** v0.1.0～v0.6.0 are deprecated (`DEPRECATED`). Always use **v0.7.0** or higher.\r\n\r\n## Trigger Scenarios\r\n\r\n1. User wants to delete a file and needs a backup first\r\n2. User accidentally deleted a file and wants to recover it\r\n3. User wants to see available backups\r\n4. User wants to manually clean up a specific backup\r\n5. User wants to verify backup integrity without restoring\r\n6. User wants to search for a deleted file by name or keyword\r\n7. User wants to schedule automatic workspace cleanup\r\n\r\n**Triggers:** delete file, recover deleted file, list backups, clean up backup, undelete, verify backup, check backup integrity, search deleted file, find deleted file, workspace_cleaner\r\n\r\n## 核心命令 / Core Commands\r\n\r\n### 中文\r\n\r\n### delete_recovery.py — 备份恢复核心\r\n\r\n```\r\n{workspace}/skills/delete-recovery/scripts/delete_recovery.py\r\n```\r\n\r\n| 命令 | 说明 | 备注 |\r\n|------|------|------|\r\n| `backup <file_path> [original_path] [description]` | 备份文件到带时间戳文件夹 | v0.7.0 |\r\n| `search <keyword>` | 按文件名/简介/路径关键字检索已删除文件 | v0.7.0 |\r\n| `restore <folder> <safe_name> [--keep-backup] [--force]` | 从备份恢复文件 | v0.7.0 |\r\n| `verify <folder> <safe_name>` | 验证备份完整性（SHA256 + PATH） | v0.7.0 |\r\n| `list` | 查看备份列表 | v0.7.0 |\r\n| `delete_backup <folder>` | 删除指定备份 | v0.7.0 |\r\n| `cleanup` | 手动触发过期备份+日志清理 | v0.7.0 |\r\n| `log [lines]` | 查看操作日志 | v0.7.0 |\r\n\r\n**`--force` 说明（v0.11.0 明确）：**\r\n- `--force` **仅**在备份文件无 SHA256 记录时（pre-v0.3.0 遗留备份）用于跳过 SHA256 **存在性**检查\r\n- SHA256 **正确性**检查（哈希匹配）、PATH 跨验、遍历检测、dest_path 验证**始终强制执行**，不可用 `--force` 绕过\r\n- 适用场景：恢复 v0.3.0 之前创建的备份（当时未记录 SHA256）\r\n\r\n### workspace_cleaner.py — workspace 定时清理（v0.11.0 强制安全修复）\r\n\r\n```\r\n{workspace}/skills/delete-recovery/scripts/workspace_cleaner.py\r\n```\r\n\r\n**v0.11.0 安全流程（首次启用必须按顺序执行）：**\r\n```\r\n1. python workspace_cleaner.py status           # 查看当前状态\r\n2. python workspace_cleaner.py enable          # 启用 workspace_cleaner（opt-in，默认 False）\r\n3. python workspace_cleaner.py dry-run          # 预览清理范围 + 生成一次性 token\r\n4. python workspace_cleaner.py confirm-first-run <token>   # 凭 token 确认，解锁实际清理\r\n5. python workspace_cleaner.py run              # 执行实际清理（满足时间间隔时）\r\n```\r\n\r\n| 命令 | 说明 |\r\n|------|------|\r\n| `python workspace_cleaner.py run` | 手动触发一次清理（enabled=True + first_run_confirmed=True + 满足时间间隔） |\r\n| `python workspace_cleaner.py dry-run` | 预览哪些文件将被清理（不实际删除，始终可用；生成一次性 token） |\r\n| `python workspace_cleaner.py status` | 查看定时器状态和配置（含 enabled / first_run_confirmed / token 状态） |\r\n| `python workspace_cleaner.py enable` | 启用 workspace_cleaner（opt-in，默认 False） |\r\n| `python workspace_cleaner.py disable` | 禁用 workspace_cleaner（opt-out） |\r\n| `python workspace_cleaner.py confirm-first-run <token>` | 凭 dry-run 生成的 token 确认首次运行，解锁实际清理 |\r\n| `python workspace_cleaner.py show-whitelist` | 查看当前白名单 |\r\n| `python workspace_cleaner.py add-whitelist <path> [--type file\\|folder\\|ext]` | 添加白名单项 |\r\n| `python workspace_cleaner.py remove-whitelist <path>` | 移除白名单项 |\r\n| `python workspace_cleaner.py set-interval <hours>` | 设置清理间隔（小时） |\r\n| `python workspace_cleaner.py set-expire-days <days>` | 设置文件过期天数 |\r\n\r\n**v0.11.0 `confirm-first-run` token 机制说明：**\r\n- 每次执行 `dry-run` 生成一个加密随机 token（32字节 hex），有效期 24 小时\r\n- `confirm-first-run <token>` 需要提供有效且未使用的 token\r\n- token 被使用后即失效，需重新 `dry-run` 获取新 token\r\n- 这样确保用户必须先看到 dry-run 预览结果才能启用清理\r\n\r\n### English\r\n\r\n### delete_recovery.py — Backup & Recovery Core\r\n\r\n```\r\n{workspace}/skills/delete-recovery/scripts/delete_recovery.py\r\n```\r\n\r\n| Command | Description | Notes |\r\n|---------|-------------|-------|\r\n| `backup <file_path> [original_path] [description]` | Backup file to timestamped folder | v0.7.0 |\r\n| `search <keyword>` | Search deleted files by name/description/path | v0.7.0 |\r\n| `restore <folder> <safe_name> [--keep-backup] [--force]` | Restore file from backup | v0.7.0 |\r\n| `verify <folder> <safe_name>` | Verify backup integrity (SHA256 + PATH) | v0.7.0 |\r\n| `list` | List all backups | v0.7.0 |\r\n| `delete_backup <folder>` | Delete specified backup | v0.7.0 |\r\n| `cleanup` | Manual trigger expired backup + log cleanup | v0.7.0 |\r\n| `log [lines]` | View operation logs | v0.7.0 |\r\n\r\n**`--force` behaviour (v0.11.0 clarified):**\r\n- `--force` bypasses the SHA256 *existence* check **only** (for pre-v0.3.0 legacy backups that lack SHA256 records).\r\n- SHA256 correctness check, PATH cross-validation, traversal detection, and dest_path validation are **always enforced**, even with `--force`. Never use `--force` unless you understand the backup predates v0.3.0.\r\n\r\n### workspace_cleaner.py — Workspace Scheduled Cleanup (v0.11.0)\r\n\r\n| Command | Description | \r\n|---------|-------------|\r\n| `python workspace_cleaner.py run` | Trigger cleanup (respects interval) \r\n| `python workspace_cleaner.py dry-run` | Preview files to clean (no actual deletion; generates one-time token) \r\n| `python workspace_cleaner.py status` | View timer status and config \r\n| `python workspace_cleaner.py confirm-first-run <token>` | Confirm dry-run results with token (v0.11.0: token required) \r\n| `python workspace_cleaner.py show-whitelist` | View current whitelist\r\n| `python workspace_cleaner.py add-whitelist <path> [--type file\\|folder\\|ext]` | Add whitelist entry \r\n| `python workspace_cleaner.py remove-whitelist <path>` | Remove whitelist entry \r\n| `python workspace_cleaner.py set-interval <hours>` | Set cleanup interval (hours)\r\n| `python workspace_cleaner.py set-expire-days <days>` | Set file expiration days\r\n\r\n### 中文\r\n\r\n## 安装\r\n\r\n### 前提条件\r\n- Python 3.8+\r\n- 已安装 ClawHub CLI：`npm i -g clawhub`\r\n- 已登录 ClawHub：`clawhub login`\r\n\r\n### 安装步骤\r\n```bash\r\n# 通过 ClawHub 安装技能\r\nclawhub install delete-recovery\r\n\r\n# 查看已安装的技能\r\nclawhub list\r\n```\r\n\r\n### English\r\n\r\n## Installation\r\n\r\n### Prerequisites\r\n- Python 3.8+\r\n- ClawHub CLI installed: `npm i -g clawhub`\r\n- ClawHub logged in: `clawhub login`\r\n\r\n### Installation Steps\r\n```bash\r\n# Install skill via ClawHub\r\nclawhub install delete-recovery\r\n\r\n# List installed skills\r\nclawhub list\r\n```\r\n\r\n---\r\n\r\n## delete_recovery.py 命令详解\r\n\r\n### 中文\r\n\r\n所有命令通过执行脚本实现，路径：\r\n```\r\n{workspace}/skills/delete-recovery/scripts/delete_recovery.py\r\n```\r\n\r\n### 1. 备份文件（删除前必做）\r\n\r\n```bash\r\npython delete_recovery.py backup <file_path> [original_path] [description]\r\n```\r\n\r\n- `file_path`：要备份的文件完整路径\r\n- `original_path`（可选）：原始文件路径，恢复时用于定位，默认为 `file_path`\r\n- `description`（可选）：功能简介，建议 ≤6 字，如\"飞书配置\"\"工作报告\"，默认为文件名\r\n\r\n备份时自动计算并存储 SHA256 哈希 + 原始路径到 `.sha256` 文件，防止备份文件被替换。备份后自动将（文件名、功能简介、路径）写入 `manifest.jsonl`，支持 `search` 检索。\r\n\r\n**返回示例：**\r\n```json\r\n{\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__test.txt\", \"description\": \"工作报告\"}\r\n```\r\n\r\n### 2. 搜索已删除文件\r\n\r\n```bash\r\npython delete_recovery.py search <keyword>\r\n```\r\n\r\n在 manifest.jsonl 中按文件名、功能简介或路径关键字模糊搜索，返回匹配的备份位置和恢复命令。\r\n\r\n- `keyword`：检索关键词（大小写不敏感， substring 匹配）\r\n\r\n**返回示例：**\r\n```json\r\n{\r\n  \"keyword\": \"报告\",\r\n  \"results\": [\r\n    {\r\n      \"ts\": \"202603281030\",\r\n      \"folder\": \"202603281030\",\r\n      \"safe_name\": \"C__Users__user__Desktop__report.docx\",\r\n      \"filename\": \"report.docx\",\r\n      \"description\": \"工作报告\",\r\n      \"path\": \"C:/Users/user/Desktop/report.docx\"\r\n    }\r\n  ],\r\n  \"count\": 1\r\n}\r\n```\r\n\r\n### 3. 恢复文件\r\n\r\n```bash\r\npython delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]\r\n```\r\n\r\n- `backup_folder`：备份文件夹名（如 `202603261130`）\r\n- `safe_name`：备份文件名（脚本自动将路径中的 `/`、`\\`、`:` 替换为 `__`）\r\n- `--keep-backup`：可选，恢复成功后**保留**该备份文件夹（默认自动删除）\r\n- `--force`：强制恢复无 SHA256 记录的旧备份（**仅**跳过 SHA256 存在性检查；SHA256 正确性、PATH 跨验、遍历检测、dest_path 验证始终强制执行）\r\n\r\n恢复前验证 SHA256 完整性 + PATH 交叉验证 + 路径遍历检测 + dest_path 验证（v0.11.0），任一验证失败均拒绝恢复。\r\n\r\n**返回示例：**\r\n```json\r\n{\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\test.txt\", \"backup_deleted\": true}\r\n```\r\n\r\n### 4. 验证备份完整性\r\n\r\n```bash\r\npython delete_recovery.py verify <backup_folder> <safe_name>\r\n```\r\n\r\n在不恢复的情况下验证备份完整性（SHA256 哈希匹配 + PATH 交叉验证）。\r\n\r\n### 5. 查看备份列表\r\n\r\n```bash\r\npython delete_recovery.py list\r\n```\r\n\r\n返回所有备份文件夹列表，最新在前。\r\n\r\n### 6. 手动清理备份\r\n\r\n```bash\r\npython delete_recovery.py delete_backup <folder>\r\n```\r\n\r\n删除指定的备份文件夹（同时清理 manifest 索引）。\r\n\r\n### 7. 手动触发清理\r\n\r\n```bash\r\npython delete_recovery.py cleanup\r\n```\r\n\r\n立即执行过期备份（7天）和日志（30天）全量清理，忽略时间触发限制。\r\n\r\n### 8. 查看日志\r\n\r\n```bash\r\npython delete_recovery.py log [lines]\r\n```\r\n\r\n查看最近 N 行操作日志（默认50行）。\r\n\r\n---\r\n\r\n## workspace_cleaner.py 命令详解\r\n\r\n### 中文\r\n\r\n**v0.11.0 首次启用流程（必须按顺序）：**\r\n\r\n```bash\r\n# Step 1: 查看状态\r\npython workspace_cleaner.py status\r\n\r\n# Step 2: 启用功能\r\npython workspace_cleaner.py enable\r\n\r\n# Step 3: 预览清理范围 + 获取 token\r\npython workspace_cleaner.py dry-run\r\n# → 返回 dry_run_token，记下这个 token\r\n\r\n# Step 4: 凭 token 确认\r\npython workspace_cleaner.py confirm-first-run <上一步返回的token>\r\n\r\n# Step 5: 执行实际清理\r\npython workspace_cleaner.py run\r\n```\r\n\r\n**定时清理设置（推荐通过 cron 定期触发 `run`）：**\r\n\r\n| 命令 | 说明 |\r\n|------|------|\r\n| `set-interval <hours>` | 设置清理间隔（小时），最小 1 小时 |\r\n| `set-expire-days <days>` | 设置文件过期天数（0 = 立即删除 temp 文件） |\r\n\r\n### English\r\n\r\n### 1. Check status\r\n\r\n```bash\r\npython workspace_cleaner.py status\r\n```\r\n\r\nShows: enabled flag, first-run confirmed flag, current token status, interval, expiry days.\r\n\r\n### 2. Enable + First-run flow (v0.11.0)\r\n\r\n```bash\r\n# Enable\r\npython workspace_cleaner.py enable\r\n\r\n# Preview + get token\r\npython workspace_cleaner.py dry-run\r\n# → returns \"dry_run_token\": \"<hex>\" — note it\r\n\r\n# Confirm with token\r\npython workspace_cleaner.py confirm-first-run <token>\r\n\r\n# Run\r\npython workspace_cleaner.py run\r\n```\r\n\r\n### 3. Whitelist management\r\n\r\n```bash\r\npython workspace_cleaner.py show-whitelist\r\npython workspace_cleaner.py add-whitelist <path> [--type file|folder|ext]\r\npython workspace_cleaner.py remove-whitelist <path>\r\n```\r\n\r\n### 4. Configure schedule\r\n\r\n```bash\r\npython workspace_cleaner.py set-interval 24   # every 24 hours\r\npython workspace_cleaner.py set-expire-days 7  # files older than 7 days\r\n```\r\n\r\n---\r\n\r\n## 注意事项 / Notes\r\n\r\n### 中文\r\n\r\n1. **删除前必备份**：所有删除操作前都应先调用 `backup`，防止误删\r\n2. **恢复时目标冲突**：如果原位置已有文件，会自动将旧文件暂存到 `temp_existing/` 目录\r\n3. **恢复后自动删备份**：默认情况下，恢复成功后会自动删除对应备份（多文件时等全部恢复完再清理）；使用 `--keep-backup` 可保留\r\n4. **路径编码**：备份文件名将 `\\`、`/`、`:` 替换为 `__`，恢复时需使用转换后的名称\r\n5. **时间触发清理**：7天备份清理和30天日志清理改为时间触发（默认24小时间隔），不再每次命令都执行全量扫描；`cleanup` 命令本身不受影响，仍立即执行全量清理\r\n6. **manifest 增量操作**：restore/delete_backup 时按需压缩 manifest（候选集≤100条时全量rewrite，>100条时追加墓碑标记）；list/search/log 时自动检查并触发增量压缩\r\n7. **安全验证**：restore 时自动进行 SHA256 完整性 + PATH 交叉验证 + 遍历检测 + dest_path 验证（v0.11.0），如验证失败会明确报错\r\n8. **旧备份恢复**：无 SHA256 记录的旧备份使用 `restore --force` 可强制恢复（仅跳过 SHA256 存在性检查；完整性、PATH、dest_path 验证不可绕过）\r\n9. **检索索引**：`backup` 自动追加索引，`restore` 成功后自动剔除；过期备份文件夹对应的索引随 `cleanup` 或脚本启动时自动清理\r\n10. **workspace 目录限制**（v0.7.0+v0.11.0）：恢复目标被限制在 workspace 根目录内，阻止恢复文件到任意系统路径；如需恢复 workspace 外的文件，需显式传入 `allowed_roots=[]`\r\n11. **manifest 路径加密**（v0.7.0）：manifest 中的原始路径字段已改为 HMAC-SHA256 加密，无法通过直接查看 manifest 获取原始路径；解密完全由 `.path` 文件负责\r\n12. **workspace_cleaner 默认禁用**（v0.8.1）：enabled 默认为 False，需 `enable` 命令显式启用；首次运行需先 dry-run + token confirm-first-run\r\n13. **workspace_cleaner 备份失败阻断删除**（v0.8.1）：delete_recovery.py 备份失败且 manual fallback 也失败时，对应文件不会被删除，记录到 `skipped_backup_failed`\r\n14. **workspace_cleaner 定时清理**（v0.8.0）：需通过 cron 或定期触发；默认24小时间隔，7天过期文件；核心文件和技能目录始终保护\r\n15. **workspace_cleaner 备份降级**（v0.8.0）：delete_recovery.py 备份失败时自动降级为手动备份；手动备份也失败则跳过该文件（不删除）\r\n16. **confirm-first-run token 机制**（v0.11.0）：dry-run 生成一次性 token（24小时有效），confirm-first-run 必须提供有效 token 才能解锁首次清理\r\n17. **触发词收窄**（v0.11.0）：\"clean workspace\"、\"定时清理\" 等宽泛短语不再激活 workspace_cleaner；仅 `workspace_cleaner` 等明确触发词有效\r\n\r\n### English\r\n\r\n1. **Always backup before deleting**: Call `backup` before any deletion\r\n2. **Restore target conflict**: Existing files moved to `temp_existing/` before restoring\r\n3. **Auto-delete backup after restore**: Default behaviour (multi-file: all restored → then delete); use `--keep-backup` to retain\r\n4. **Path encoding**: `\\`, `/`, `:` replaced with `__` in backup filenames\r\n5. **Time-triggered cleanup**: 7-day backup and 30-day log cleanup are time-triggered (default 24-hour interval), not run on every command; `cleanup` command itself still runs full cleanup immediately\r\n6. **Incremental manifest**: restore/delete_backup use on-demand manifest compaction; list/search/log auto-check and compact oversized manifests\r\n7. **Security checks**: Restore automatically fails with clear error if SHA256 integrity, PATH cross-validation, traversal, or dest_path validation (v0.11.0) fails\r\n8. **Legacy backup restore**: Backups without SHA256 records use `restore --force` to force restore (only bypasse...","readmeExcerpt":"Skill: delete-recovery Owner: cloudcode-hans Summary: Automatically backs up files before deletion to timestamped folders, allows restoring deleted files, lists backups, and cleans expired backups and logs. Tags: latest:0.11.1 Version history: v0.11.1 | 2026-05-28T08:50:19.341Z | user No code changes in this release. - No files were modified for version 0.11.1. - Behavior and features remain the same as v0.11.0. v0.1","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 安装最新版（v0.3.0）\nclawdhub install delete-recovery\n\n# 安装指定版本\nclawdhub install delete-recovery --version 0.3.0"},{"language":"bash","snippet":"# Install latest version (v0.3.0)\nclawdhub install delete-recovery\n\n# Install specific version\nclawdhub install delete-recovery --version 0.3.0"},{"language":"bash","snippet":"python delete_recovery.py backup <file_path> [original_path]"},{"language":"bash","snippet":"# 示例\npython delete_recovery.py backup \"C:\\Users\\user\\Desktop\\report.docx\"\n# → {\"ok\": true, \"folder\": \"202603261130\", \"file\": \"C__Users__user__Desktop__report.docx\"}"},{"language":"bash","snippet":"python delete_recovery.py restore <backup_folder> <safe_name> [--keep-backup] [--force]"},{"language":"bash","snippet":"python delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\"\n# → {\"ok\": true, \"restored_to\": \"C:\\\\Users\\\\user\\\\Desktop\\\\report.docx\", \"backup_deleted\": true}\n\n# 恢复 v0.3.0 之前的旧备份（无 SHA256 记录）\npython delete_recovery.py restore 202603261130 \"C__Users__user__Desktop__report.docx\" --force"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: delete-recovery\r\ndescription: File deletion recovery skill v0.11.0. Back up files before deletion (to `delete_backup/YYYYMMDDHHMM/`), restore from backup, search via manifest. SHA256 integrity + path-traversal checks + workspace-root confinement. Auto-cleanup 7d/30d. **v0.11.0: new security audit fixes - path traversal detection, dir backup fallback, SHA256 integrity clarification.** **v0.9.0: dest_path validation, dry-run token gate, trigger disambiguation.** **v0.8.1: workspace_cleaner disabled-by-default; backup failures block deletion.** **v0.8.0: Added workspace_cleaner.** **v0.7.0: allowed_roots defaults to workspace root; manifest paths HMAC-encrypted.**\r\n\r\n**⚠️ Security trade-offs (know them before deploying):**\r\n- Backups are stored in `{workspace}/.delete_recovery/delete_backup/`, **outside** the skill directory - they survive skill deletion but are not protected by skill folder permissions.\r\n- `allowed_roots` defaults to workspace root (v0.7.0, fixed v0.11.0) - restores confined to `{workspace}` tree; pass `allowed_roots=[]` explicitly to remove confinement (legacy restores only).\r\n- Manifest paths are HMAC-SHA256 encrypted (v0.7.0) - original paths no longer readable in manifest.jsonl; filename/description still in plaintext. SHA256 records are integrity checks only (detect accidental modification); they are NOT cryptographically signed and do not protect against a local attacker who can modify both backup files and their metadata.\r\n- workspace_cleaner is **disabled by default** (v0.8.1) - must opt-in explicitly; first run requires dry-run + token confirm-first-run.\r\n- workspace_cleaner backup failures **block deletion** (v0.8.1) - files are NOT deleted if backup fails.\r\n- No install-time integrity verification - deploy only in trusted environments.\r\n- Agent is strictly forbidden from file tampering, path redirection, or bypassing security validations.\r\n\r\n**Use cases (triggers):**\r\n1. User wants to delete a file and needs a backup first\r\n2. User accidentally deleted a file and wants to recover it\r\n3. User wants to see available backups\r\n4. User wants to manually clean up a specific backup\r\n5. User wants to verify backup integrity without restoring\r\n6. User wants to search for a deleted file by name or keyword\r\n7. User wants to schedule automatic workspace cleanup (v0.8.1+: **opt-in only, token-gated**)\r\n\r\n**Triggers / keywords (v0.11.0: specific, unambiguous phrases only - broad housekeeping phrases removed):**\r\n- `delete file` / `删除文件` - backup before deletion\r\n- `recover deleted file` / `误删恢复` / `恢复文件` / `undelete` - restore from backup\r\n- `list backups` / `查看备份` - list available backups\r\n- `clean up backup` / `清理备份` - manually clean a specific backup\r\n- `verify backup` / `验证备份完整性` / `check backup integrity` - integrity check without restoring\r\n- `search deleted file` / `搜索已删除文件` / `检索删除记录` - search manifest\r\n- `workspace_cleaner` - explicitly invoke workspace cleaner (not \"clean workspace\" or \"定时清理\" alone)\r\n\r\n**⚠️ Agent "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn76zmreha127n33hcnaknnmd5834x16\",\n  \"slug\": \"delete-recovery\",\n  \"version\": \"0.11.1\",\n  \"publishedAt\": 1779958219341\n}"},{"path":"skill-card.md","content":"## Description:\n\nAutomatically backs up files before deletion, restores deleted files from timestamped backups, searches backup manifests, and cleans expired backups and logs.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[cloudcode-hans](https://clawhub.ai/user/cloudcode-hans)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and workspace users use this skill to back up files before deletion, recover accidentally deleted files, verify backup integrity, and manage opt-in cleanup of temporary workspace files.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Deletion and cleanup workflows can cause data loss or out-of-scope deletion if executed without careful review.\n\nMitigation: Review deletion paths before installation and use dry-run, explicit opt-in, and backup verification before allowing cleanup actions.\n\nRisk: Backup deletion can remove recovery data when backup folder names are not strictly validated.\n\nMitigation: Restrict delete_backup usage to validated backup folder names and review the selected backup target before removal.\n\nRisk: Workspace cleaner fallback backups may not be reliable enough for recovery in the current release.\n\nMitigation: Do not rely on workspace_cleaner fallback backups for recoverability until directory restore and metadata format handling are fixed.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/cloudcode-hans/skills/delete-recovery)\n- [ClawHub publisher profile](https://clawhub.ai/user/cloudcode-hans)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON command outputs.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces file-operation guidance for backup, restore, verification, manifest search, backup cleanup, and opt-in workspace cleanup workflows.]\n\n## Skill Version(s):\n\n0.11.1 (source: server release metadata; artifact content describes v0.11.0 behavior with no code changes in this release)\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":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1413,"uniquenessScore":44,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T08:14:04.519Z","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-10T08:14:04.519Z","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:25.310Z","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"}]}}}